Desmontando o Retromania – parte 2

E, conforme prometido, continuemos a série! No “episódio anterior” descrevi a primeira metade do jogo (as linhas de 100 a 140) e, quem leu, deve ter percebido que exceto pela linha 140 todas as outras encarregam-se apenas em definir variáveis e a montar o ambiente necessário para o jogo acontecer.

Esta parte acabará sendo menos descritiva e conterá um pouco mais de ação. Justamente é a partir da segunda metade do código que está toda a ação do jogo. Vamos lá!

 

Segunda parte

E lá vamos nós…

Linha 150

Retromania_150

Aqui eu desenho o tanque posicionando na linha 21 e coluna correspondente a TK menos 32 (lembram-se de que estou usando o código de escape do VT-52 e não o LOCATE, logo foi mais simples assumir de uma vez que há uma gordura de 32 no valor da variável TK). O cálculo para o reposicionamento é feito na base de operações lógicas ao invés de IF…THEN…ELSE. Funciona assim: sempre que a relação for verdadeira ela retornará -1 e sendo falsa 0, daí basta usar matemática básica (sinais iguais soma, sinais diferentes diminui etc). Por exemplo a clássica e humanamente legível:

IF A$=CHR$(29) AND X>0 THEN X=X-1 ELSE IF A$=CHR$(28) AND X<255
THEN X=X+1

Pode ser reescrita, de um jeito maquinalmente críptico, e ficar assim:

X=X+(A$=CHR$(29) AND X>0)-(A$=CHR$(29) AND X<255)

O IF…THEN na linha verifica se o tiro foi pressionado e liga o flag F, referente ao disparo mas que só ocorrerá se já não houver um disparo na tela. Como é possível perceber ele apenas diz que pode, o resto ficou na próxima linha…

As variáveis aqui…

  • FX — Fire X — Em que coluna sairá o disparo, a posição do tanque subtraído de 32 e acrescido de 2, ou seja… TK-32+2, ou TK-30.
  • FY — Fire Y — A linha onde está o disparo, neste caso o valor inicial, 20 (a linha de texto logo acima da linha onde está o tanque).

Linha 160

Retromania_160

Esta é a linha que cuida do disparo. Coloco o sprite na sua posição (via VPOKE), decremento o valor de FY (para que ele suba) e também verifico se alcançou o topo e saiu da tela, ou seja, não atingiu ninguém — para desligar a flag do tiro. Mas se atingir algo, ou seja, encontrar qualquer coisa que não seja um espaço em branco (ASCII 32) pelo caminho eu ligo a flag S, aumento o volume do canal A do PSG e apago a posição do retroinvasor atingido na tela com cinco espaços a partir de FX menos 2! Cinco espaços? Sim! Como eles são formados por três caracteres e sempre haverá 2 caracteres separando-os (variável S$, lembra?), não importa onde eu escrever 5 espaços que ele sempre será apagado e nem preciso verificar qual pedaço dele foi atingido.

As variáveis aqui…

  • TS — Toggle Score — A chave que habilita o incremento do score.

Linha 170

Retromania_170

Se foi detectado que um retroinvasor foi atingido, então é hora de pontuar! Zero a flag TS, incrementar o valor do score (SC), atualizar o valor na tela e, claro, zerar o volume do canal A do PSG (interrompendo o ruído). Cada retroinvasor atingido aumenta sua pontuação em 5, acrescido do que estiver em FY. Quanto mais próximo do solo o retroinvasor for atingido, mais pontos se obtém.

Sim, esta linha poderia ter ficado junto com a anterior mas foi o jeito mais fácil de deixar o som do retronivasor sendo atingido por uma quantidade determinada de tempo. Pois é, o jogo poderia ter nove, ou oito, linhas!

Linha 180

Retromania_180

A parte chata do jogo! Se sobre os cantos esquerdo ou direito do tanque eu encontrar um caractere que não seja um espaço, significa que eu esbarrei em algum retroinvasor! Hora do fim do jogo! Eu arranco o disparo da tela (não preciso mais dele) modifico os valores e o volume do segundo canal B do PSG, enquanto troco a cor da borda (o efeito explosivo). Depois repito a mesma coisa porém fazendo os retroinvasores caírem (e saírem da tela) e volto para a linha 120 que exibirá o menu principal.

Linha 190

Retromania_190

Esta é a parte mais simples e longa de descrever do jogo! Aqui verifico se a variável de temporização do interpretador BASIC é menor que 4, e fico verificando até que ultrapasse o valor e aí repito o laço principal do jogo voltando à linha 140. Na verdade esta linha só tem efeito em computadores da linha MSX com clock superior aos 3,54MHz padrão, nos modelos convencionais a TIME chega aqui com valores entre 8 e 9 (eu tentei ao máximo mas não consegui otimizar mais o código).

E no caso específico do turbo R é possível deixar o jogo bem mais emocionante reduzindo este valor de 4 para 2 e, aí na linha 130, o da variável NW para 20! Mas isto fica para experimentações.

E claro, há ainda os créditos do programa, a versão (esta é versão 1.1, tem algumas correções em relação à versão que participou da competição), o nome do autor (este que cá escreve), a forma de contato e, claro, o mais importante o… MSX Rulez!

Finalizando…

A versão descrita aqui, a 1.1, já é uma atualização daquela apresentada na competição do MRC e a deixarei disponível junto com este artigo em uma versão empacotada de uma imagem de disco. Ou você pode pegar a versão do MRC e adaptar, as mudanças foram poucas.

Agora no final eu me lembrei que deveria ter dito que I, J e K são minhas variáveis para uso geral, mas creio que todos tenham percebido. Certo?

Sobre Giovanni Nunes

Giovanni Nunes (anteriormente conhecido como “O Quinto Elemento”) é uma das mentes em baixa resolução que compõem o Governo de Retrópolis, responsável pela identidade visual de todas as facetas do nosso Império Midiático.

0 pensou em “Desmontando o Retromania – parte 2

  1. Achei muito legal, faz tempo que não mexo nada em basic.

  2. Giovanni, tem como colocar um vídeo do gameplay no Youtube? Seria bem bacana para ilustrar os artigos.

    1. Eu estou mexendo no jogo, infelizmente a forma como foi programado me impede de usar o XBASIC (o pré-interpretador dele não é tão permissível quando o original da Microsoft) sem reescrever vários trechos do programa, ou pelo menos desmembra-lo (ainda bem que não estou mais preso nas 10 linhas).

  3. Este humilde “escrivinhador” aqui agradece os agradecimentos desta e da outra parte do artigo! Aliás há dois bugs nesta versão, um fácil de consertar e outro que terá de ficar como feature… alguém consegue descobrir?