15 de Março de 2007 | Autor: Luiz Fernandes de Moraes (autor de “A Lenda da Gávea”)


FONTE: Revista MICRO SISTEMAS No. 83, páginas 39, 40, 41 e 42 ( Outubro de 1988 )

 

Capa do cassete original

 

Tela de abertura do programa

Garregamento do jogo A Lenda da Gávea

Tela do jogo A Lenda da Gávea


Uma das coisas que eu nunca consegui entender bem foi o descaso dos programadores do ZX Spectrum com relação a alguns programas incríveis que essa máquina e os seus compatíveis nacionais possuem. Não estou falando de jogos. Estou falando de alguns utilitários realmente surpreendentes, largamente difundidos no mercado, e que possibilitam a criação de programas de excelente nível.

 

Dentre esses utilitários, um dos melhores e o GAC, The Graphic Adventure Creator, da empresa inglesa Incentive Software Ltd. Como explicar que após dois anos no mercado, somente um adventure nacional foi criado com o auxílio deste poderoso editor?

 

Lembro-me que quando escrevi a Lenda da Gávea, eu acreditava que seria apenas o primeiro autor nacional a me utilizar do GAC. No meu modo de ver as coisas, achava que, em seguida viriam dezenas de adventures feitos por outros autores.

 

Infelizmente eu estava enganado e, a despeito da ótima vendagem da "Lenda", comecei a pensar que os nossos programadores não estavam interessados em adventures. Mas eu estava novamente enganado (será que não dou uma dentro?). O número de pessoas que escreve para MS comprova o grande interesse e mostra que a principal lacuna e a falta de informações sobre o GAC.

 

Mas não ha de ser nada! Talvez ainda haja tempo para contornar o problema.

 

 

A FILOSOPIA DE TRABALHO DO GAC

 

Uma das melhores coisas do GAC e a filosofia adotada na sua concepção, que permite criar adventures ilustrados com um mínimo de metodologia. Não existe uma ordem preestabelecida para trabalhar. Você pode fazer uma ilustração, criar um novo local, criar novos objetos, testar o jogo, criar um novo verbo, testar novamente. etc.

 

A parte do programa que edita o jogo e a parte que o executa convivem perfeitamente na memória. O único inconveniente e que isso acarreta uma certa perda de espaço para o desenvolvimento de jogos muito extensos. Mas esse inconveniente resulta num fato primordial: em qualquer momento podemos testar o nosso adventure. Com o teste on-line, podemos ir aperfeiçoando o jogo e eliminando os bugs que possam ter permanecido.

 

Isso e muito importante para testarmos se não houve erro de lógica em alguma das instruções do jogo. Esse tipo de erro e mais frequente quando o programador ainda não entendeu perfeitamente a forma como o GAC lida com cada tipo de evento do jogo.

 

Outro dado importante e que o editor de telas do GAC e ao mesmo tempo simples e eficiente. Ele possui a função UNDO e o recurso de ELASTIC, que permite traçarmos retas ou círculos acompanhando a formação do traço que esta sendo feito na tela.

 

Cada tela do GAC e armazenada como sequência de comandos cm um buffer próprio. Esse buffer não e fixo e permite ate 400 bytes por tela, isto e, uma media de 150 comandos gráficos do tipo DRAW, CIRCLE, INK. PAPER, BORDER, FILL, etc. Isso e suficiente para criarmos uma tela bastante detalhada, mas pode resultar em um jogo com poucas telas, )a que quanto mais detalhes, maior o espaço ocupado.

 

Fazer desenhos cheios de pormenores requer um planejamento bem estruturado, para que possamos montar uma tela através de varias outras telas (ou cenas). Isso e relativamente fácil de conseguir, pois o GAC permite o "merge" de telas. Você pode definir a tela 10 como sendo a tela 1 + tela 3 + tela 5 + tela 200.

 

Como exemplo, o adventure A Lenda da Gávea possui 56 telas diferentes, sendo todas bastante detalhadas. Isso foi possível criando-se trinta pequenas telas que continham cenários, detalhes de arvores, detalhes de trilhas na floresta e varias mascaras de montagem. Cada tela era formada por, no mínimo, duas outras telas básicas com partes do cenário, acrescida dos detalhes individuais de cada cenário. Em suma, só foi gasto o espaço de 38 telas, mas o jogador pode visualizar 56.

 


O TRATAMENTO DE EVENTOS DO GAC

 

O GAC trabalha com três níveis de condições: as condições primárias (high priority conditions), as condições secundárias (low priority conditions) e as condições locais. E fundamental entender o que isto significa a nível de processamento para que possamos construir um adventure. As condições primárias são testadas ANTES de ser liberado o cursor para um input do jogador.

 

As condições secundárias e locais são testadas DEPOIS do jogador digitar um novo comando. Para entender melhor, imaginemos que você está jogando a "Lenda" e se encontra no primeiro local. Você digita SUL e se movimenta para outro local. Antes de se formar a nova tela e ANTES de surgir o cursor com a frase O QUE VOCÊ PRETENDE FAZER, são testadas as condições primárias.

 

Se você estivesse carregando uma cobra, seria picado por ela e, ao invés da tela do local, surgiria a tela da "morte". A sua pontuação seria mostrada e, em seguida o jogo recomeçaria.

 

É para isso que serve a condição primária: ela e testada no momento em que entramos em uma nova área e não interage com o jogador. Todas as funções automáticas, transparentes ao jogador (atualização de ponteiros, inicialização da partida, etc.) devem ser tratadas como condições primárias.

 

Mas digamos que não exista uma cobra. Você chega ao novo local e digita BEBA ÁGUA. Como não existe uma condição local (façamos de conta que não), a tabela de condições secundárias é testada. Se você tiver um cantil com água você poderá beber. Caso contrário você recebera a resposta AQUI NÃO TEM NADA DISSO.

 

Beber água e uma condição secundária porque o ato de beber resulta de uma ordem expressa do jogador e a ação deve ser executável em QUALQUER LOCAL, desde que existam condições para isso (um cantil cheio, por exemplo).

 

Mas existem ações que só podem ser realizadas em um determinado local. Suponhamos que você esteja na frente do casebre e diga ENTRE NO CASEBRE. Esta ação não pode ser feita em nenhum outro lugar. Sendo assim ela deve ser considerada como condição local.

 

O processamento do GAC ocorre da seguinte forma: ao chegar a um novo local ele testa as condições primárias, libera o cursor para uma ordem do jogador e, após a ordem, testa se existe uma condição local para aquela área do jogo. Caso não haja, testa a tabela de condições secundárias ate encontrar uma condição válida ou ate chegar ao fim da tabela.

 

É possível escrever um adventure usando apenas as tabelas de condições primárias e condições secundárias. Só que isso resultaria numa perda de tempo de processamento após a ordem do jogador, pois a tabela de condições secundárias ficaria muito extensa. Ficou claro?

 


VERBOS, ADVÉRBIOS, SUBSTANTIVOS E OBJETOS

 

As tabelas de verbos (verbs), advérbios (adverbs), substantivos (nouns) e objetos (objects) são construídas a partir de um índice numérico.

 

O verbo deve ser interpretado como item principal de uma frase-comando do jogador. Nesse caso as palavras NORTE, SUL, LESTE e OESTE, devem ser consideradas como verbos (se meu professor de português visse isso... benza Deus!).

 

Os verbos podem ter sinônimos. O sistema reconhece como sinônimos os verbos que possuem o mesmo índice numérico, exemplo:  1-ANDE,   1-CAMINHE, 1-PERCORRA.

 

Como todos possuem o mesmo índice (1), não existe diferença entre digitar ANDE e CAMINHE. Além disso você pode digitar palavras abreviadas. Nesse caso, e bom tomar cuidado com a ordem das palavras na tabela. Digitar PE pode significar PEGUE ou PERCORRA, dependendo apenas de qual verbo foi definido primeiro.

Os advérbios atuam da mesma maneira, sendo que normalmente são pouco utilizados em um adventure. Exemplo: se você digitar PEGUE A NITROGLICERINA, você poderia explodir. Se você digitasse PEGUE GENTILMENTE A NITROGLICERINA, você pegaria e continuaria vivo para contar a história. O GAG permite isso.

Já substantives e objetos são coisas intimamente relacionadas. Para cada objeto deve existir um substantivo de mesmo índice, exemplo: objeto 1 — uma faca; substantivo                 1 - faca. Substantivos são palavras que o jogo pode reconhecer e geralmente são em maior número que os objetos (um objeto precisa de um substantivo, mas um substantivo não precisa de um objeto).

 

Para usarmos no jogo a frase ABRA A PORTA. não devemos criar o objeto PORTA. Basta criar o substantivo PORTA e testar a frase na tabela de condições locais (só se pode abrir portas onde existirem portas para serem abertas). Se for criado o objeto PORTA você terá nas mãos um grave problema: alguém digitará PEGUE A PORTA e o adventure não só aceitará, como sairá carregando a porta por aí.

 

Não esqueça de que objetos são coisas passíveis de serem pegas, largadas, comidas, bebidas, cheiradas, etc. Fica a seu critério considerar como objeto coisas como ÁGUA ou ÁRVORE (particularmente, acho isso arriscado).

 

Cada objeto deve ter definido o seu peso e o local onde ele se encontra no início do jogo. A questão do peso é importante, pois e aqui que podemos limitar o jogador, impedindo que ele possa pegar tudo o que vê. Já a questão do local pode ser burlada para fazer aparecer os objetos durante o jogo. Basta iniciar todos eles no local 0 (zero) e fazer um SWAP (troca) de locais mediante a satisfação de uma ou mais condições.

 

Como exemplo, você poderia iniciar o jogo com uma garrafa no local 1 e cacos de garrafa no local 0. Se o jogador pegar a garrafa e quebrá-la, um SWAP colocará a garrafa no local 0 (sumirá com ela) e colocará os cacos de garrafa no local 1. O local 0 existe para arquivar objetos que serão futuramente transportados para o jogo.

 

 


AS MENSAGENS

 

O GAC permite até 255 mensagens de 255 caracteres cada uma (o número de verbos, advérbios, substantivos e objetos também é 255, sendo que o máximo de caracteres permitido e 35). Isso faz com que o adventure tenha uma incrível capacidade de conversação com o jogador.

O sistema utiliza as mensagens de 240 a 255 em seu processamento. Quando fizer um adventure não esqueça de incluí-las, mesmo que você só tenha mensagens de l a 50. Esses índices (240 em diante) são respostas automáticas do processamento. Como exemplo, sempre que o jogador digita uma frase não prevista (não existe verbo ou substantivo), o sistema imprime a mensagem 242. A mensagem 242 deve ser definida então como: DESCULPE, EU NÃO ENTENDI.

 

Se o jogador digitar BEBA ÁGUA e não houver água, a nível de processamento o sistema reconhece o comando mas, como ele não satisfaz nenhuma condição (secundária ou local), será impressa a mensagem 241. Sua definição correta seria algo como: LAMENTO... ISSO NÃO É POSSÍVEL.

 

Essas mensagens deverá ser criadas juntamente com o jogo e a correlação com os índices é a seguinte:

240 - O que você pretende fazer?

241 - Isso não e possível!

242 - Não entendi o que você disse!

243 - Digite qualquer tecia para reiniciar.

244 - Tem certeza? (S/N).

245 - Nós já temos isso.

246 - Nós não temos isso.

247 - Eu não vejo nada disso.

248 - Não dá para pegar mais nada.

249 - Você marcou

250 - pontos em

251 - Está escuro. Não consigo ver nada.

252 - Não encontrei o que você quer.

253 - Eu também posso ver.

254 - OK.

255 - Jogadas.

 

Estas freses são apenas sugestões e podem ser modificadas desde que mantenham o mesmo sentido. É bom tomar um cuidado especial com as mensagens 249, 250 e 255. Essas três mensagens resultam em uma quarta que dá a pontuação do jogador. A mensagem seria algo como: VOCÊ MARCOU + (contador) + PONTOS EM + (contador) + JOGADAS.

Com relação às outras mensagens, vale a pena reservar as primeiras para a descrição de objetos. Isso e bom, pois exige um pequeno truque de programação que permite subordinar todas as descrições a uma única condição. Esse mesmo truque é utilizado para pegar ou largar qualquer objeto, testando apenas uma condição para PEGAR e uma para LARGAR. Nós veremos isso adiante quando estivermos falando da programação.

 


CONTADORES E MARCADORES

 

O GAG possui 128 contadores (counters) e 255 marcadores (markers). Os contadores servem para armazenar valores numéricos (1 ou 2 bytes), e podem ser incrementados, decrementados, somados, etc. Já os marcadores podem ter apenas dois estados: 0 ou 1. Um marcador setado representa o estado de uma determinada coisa (objeto ou condição).

 

Exemplificando, você poderia definir o contador 10 como o contador da sede. A cada movimento do jogador ele seria incrementado em uma unidade (condição secundária) e caso estivéssemos no deserto ele seria duplicado (condição local). Quando chegasse a um número predeterminado (condição primária), o marcador 10 seria testado. Se estivesse ressetado, significaria que o jogador estaria sendo avisado pela primeira vez. O marcador 10 seria então setado, a mensagem: ESTOU COM SEDE, seria impressa e o contador 10 seria zerado.

 

Se o jogador pudesse beber água, o marcador 10 seria ressetado para reiniciar o cicio (condição secundária). Quando o contador 10 chegasse novamente ao limite, estando o marcador 10 setado, saberemos que o jogador já havia sido avisado da sede e ainda não tinha bebido água. Este seria o momento de matá-lo (condição primária).

 

Como você pode ver, contadores e marcadores são coisas muito importantes para um adventure. Com eles podemos saber o número de pontos do jogador, a quantidade de movimentos no jogo, se uma porta foi aberta ou fechada, se o Drácula está dentro ou fora do caixão, ou qualquer outra loucura que lhe der na veneta.

 

Mas é bom saber que o sistema utiliza três contadores e quatro marcadores. O contador 0 acumula os pontos do jogador e os contadores 126 e 127 atuam como um contador de 2 bytes, que serve para ir guardando o número de jogadas. O marcador 0 é setado após um comando de descrição de local. Se você não mudar de local, pode imprimir uma descrição diferente mediante o teste deste marcador.

 

Digamos que você chegou num local e recebeu a seguinte descrição: ESTAMOS NO BATEAU MOUCHE. Se você pedir uma nova descrição e testar o marcador 0, a condição de "marcador setado" poderia indicar uma nova descrição que, como o adventure é nacional, infelizmente seria: GLUB! GLUB! GLUB...

 

O marcador 1 indica a iluminação do local. Se estiver setado o local e iluminado. O marcador 2 indica que o jogador possui uma fonte de luz (lâmpada, vela, etc.). Basta estar setado. Se ambos os marcadores estiverem ressetados, o sistema não descrevera os locais e imprimirá sempre a mensagem 251 (a da escuridão).

 

O último marcador usado pelo sistema é o de número 3. Se esse marcador for setado, não será impressa a pontuação quando se encerrar a partida. Isso permite criar um novo sistema de contagem de pontos.

 

 


AS INSTRUÇÕES DO GAC

 

            As condições são construídas usando-se as instruções de programação. Sendo assim, aqui vai a descrição de cada uma delas:

 

VERB x 

NOUN n

ADVE z

HERE x

CARR n

AVAI n

 

n IN z

WEIG n

SET? x

RES? x

CTR c

x QUE? c

TURN

ROOM

AT z

AND

 

 

 

OR

XOR

NOT

x<y

x>y

x=y

RAND y

VBNO

NO1

NO2

LOOK

DESC z

PICT

TEXT

GET y

DROP y

x SWAP y

OBJ z

LIST r

LIST WITH

c TO r

SET m

RESE m

x CSET y

INCR y

DECR y

GOTO z

STREx

FINDy

 

SAVE

LOAD

 

WAIT

OKAY

EXIT

QUIT

 

MESS z

PRIN x

LF

HOLD c

x+y

x-y

 - O verbo “x” foi digitado?

 - O substantivo “n” foi digitado?

 - O advérbio “z” foi digitado?

 - O objeto “x” está no mesmo local que o jogador?

 - O jogador está com o objeto “n”?

 - O objeto “n” está disponível para uso (isto é, está aqui ou está com

   o jogador?)

 - O objeto “n” está no local “z”?

 - Informa o peso do objeto “n”.

 - O marcador “x” está setado?

 - O marcador “x” está ressetado?

 - Informa o valor do contador “c”.

 - O valor do contador “c” é igual a “x”?

 - Informa o número de jogadas.

 - Informa o número do local corrente.

 - Estamos no local “z”?

 - Verdadeiro se todas as palavras foram digitadas.

   Ex: VERB 1 AND NOUN 1

   A condição é satisfeita se ambas as palavras forem digitadas pelo

   jogador.

 - Verdadeiro se uma das palavras foi digitada.

 - Verdadeiro se uma palavra foi digitada e a outra não.

 - Verdadeiro se nenhuma das palavras foi digitada.

 - X é menor que Y?

 - X é maior que Y?

 - X é igual a Y?

 - Gera um número randômico entre 0 e Z-1.

 - Informa o número do verbo em um comando.

 - Informa o número do primeiro substantivo do comando.

 - Informa o número do segundo substantivo do comando.

 - Descreve o local corrente.

 - Descreve o local de número “z”.

 - Ativa a tela de ilustração (modo normal).

 - Desativa a tela (para adventures só de texto).

 - Pega o objeto número “y” (se ele estiver no local).

 - Solta o objeto número “y” (se ele estiver com o jogador).

 - Troca o objeto número “z”.

 - Descreve o objeto número “z”.

 - Lista todos os objetos do local “r”.

 - Lista todos os objetos em poder do jogador.

  - Move o objeto “c” para o local “r”.

 - Seta o marcador “m”.

 - Resseta o marcador “m”.

 - Armazena o valor “x” no contador número “y”.

 - Incrementa o contador "y" em uma unidade.

 - Decrementa o contador "y" em uma unidade.

 - Vai para o local "z" e faz sua descrição.

 - Determina "x" como o peso máximo para carregar.

 - Procura o objeto número "y" e move o jogador para o local onde o

  objeto está. Cria o efeito de mágica no adventure.

 - Salva o jogo em fita ou disco.

 - Carrega o jogo em fita ou disco (uma partida  pode  ser 

   interrompida.  gravada e continuada em outro dia).

 - Espera um novo comando do jogador.

 - Imprime a mensagem 254 e aguarda um novo comando.

 - Encerra o jogo sem perguntar nada ao jogador.

 - Imprime a mensagem 244 e se a resposta do jogador for afirmativa,

   imprime os pontos e encerra o jogo.

 - Imprime a mensagem número "z

 - Imprime o número "x"

 - Imprime um line feed.

 - Delay. Para interromper por 10 segundos, use HOLD 500.

 - Retorna o valor da soma de dois números.

 - Retorna o valor da subtração de x-y.

 

Cada comando inicia sempre com um IF e a sintaxe é bastante simples. Os testes ou comparações devem ficar sempre entre parênteses e a linha deve sempre encerrar com um END. Vejamos os seguintes exemplos de condições secundárias:

 

IF (VERB 7 AND NOUN 5) MESS 14 HOLD 200 EXIT END

 

Se o jogador digitar uma frase com B verbo 7 e o substantivo 5, o sistema imprime a mensagem 14, dá um tempo para o jogador ler a mensagem e encerra o jogo. Digamos que o verbo 7 seja BEIJE e o substantivo 5 seja OGRO. Se digitarmos BEIJE O OGRO, seria impressa uma mensagem do tipo: OGRO NÃO É CHEGADO! ELE TE DEU UMA PORRETADA E VOCÊ MORREU. HOLD 200 daria tempo suficiente

para a leitura e o jogo encerraria.

 

         IF (VERB 8 AND NOUN 7 AND CARR 7) DROP 7 TO O MESS 17 WAIT END

 

Se o jogador digitar o verbo 8 e o substantivo 7, e estiver com o objeto 7, o sistema solta o objeto, transfere-o para o local 0 (destrói o objeto), imprime a mensagem 17 e aguarda um novo comando. Digamos que o verbo 8 seja COMA, o substantivo 7 seja RATO e o objeto 7 seja UM RATO. Se digitarmos COMA O RATO, o rato sumiria e imprimiríamos uma mensagem especifica (CHOMP! HUUM... OUE RATINHO ZZZENZAZIONAL!). Em seguida tornaria a aparecer o cursor, aguardando uma nova frase-comando do jogador.

 

Os dois exemplos são bastante simples, mas ilustram perfeitamente uma linha de comando. A estrutura é a mesma para qualquer uma das três tabelas de condições (primária, secundária e local), com a vantagem do GAC fazer um ajuste automático para a sintaxe correta no caso de erro do programador.

 

Falta falarmos do truque que permite pegar, soltar ou descrever qualquer objeto.

 

Para isso usamos a função NO1 que fornece o número do primeiro substantivo da frase. Supondo que o verbo 7 fosse PEGAR, o comando seria:

 

IF (NO1 < 10 AND VERB 7) GET NO1 OKAY END

 

Com essa estrutura poderíamos pegar qualquer objeto de número menor que 10. Esse limite é dado pelo programador. Se o número de objetos for 20, ao invés de 10 coloque 21. Ou então coloque 16 e considere os 5 últimos objetos como "impossíveis" de pegar sem algum tipo de auxílio (objeto pesado demais ou grande demais).

 

Para soltar ou descrever objetos, suponhamos que os respectivos verbos possuam os números 8 e 9. As instruções seriam:

 

         IF (NO1 < 10 AND VERB 8) DROP NO1 OKAY END

           IF (NO1 < 10 AND VERB 9) MESS NO1 OKAY END

 

Fácil, não? Tenha apenas o cuidado de escrever suas instruções com um espaço entre cada palavra. Isso é axiomático.

 

 

EDITANDO AS TELAS

 

O editor de telas é bastante simples de operar. Anote as teclas de comando e faça várias experiências antes de desenhar para valer. As teclas são as seguintes:

 

SETAS

SETAS + CAPS

L

 

 

E

R

D

I

P

V

B

T

G

F

A

S

M

C

SETAS+ SYMB

 

Z

DELETE

CAPS + 9

 - Movam o cursor.

 - Movem o cursor de 8 em 8 pixels.

 - Posiciona a caneta para traçar uma linha. Uma segunda pressão em

   "L" levanta a caneta e encerra o traço (todas as funções de "riscar"

   são desativadas com uma segunda pressão).

 - Elipse ou círculo.

 - Retângulo.

 - Desenha' um ponto (acende um pixel).

 - Define o INK.

 - Define o PAPER.

 - FLASH.

 - BRIGHT.

 - Cor do BORDER e da área de texto.

 - GRID (quadriculado).

 - FILL de INK.

 - FILL de PAPER.

 - FILL sombreado (SHADOW).

 - Merge de telas.

 - Pisca o ponto onde se situa o cursor.

 - Avança ou retrocede entre os passos de confecção da tela (buffer de

   comandos).

 - Salta para o início da tala.

 - Deleta o último comando.

 - Deleta da posição corrente até o final do buffer de comandos de

   formação da tela.

 

As teclas CAPS + ESPACE (BREAK) funcionam como uma espécie de "chave-geral" para o editor. Teclar BREAK interrompe o que quer que esteja sendo feito em qualquer etapa da confecção do adventure. Este será o seu PANIC-BUTTON. Insista no BREAK até recuperar o controle (seu e do jogo).

 

Está tudo aí, não faltou nada. Treine bastante! Se o seu entusiasmo coroar o meu esforço, e você resolver escrever um adventure com o GAC, aqui vão alguns conselhos: faça o mapa do jogo defina a solução da aventura e escreva tudo no papel. Defina todas as condições necessárias (também no papel) e comece o trabalho de criação das ilustrações.

 

Procure fazer com que após a confecção de todas as telas você ainda tenha uns 8 Kb para a programação. As rotinas de compactação do GAC permitem criar adventures gigantescos em apenas 8 Kb. Ao fim de tudo, selecione o BEGIN HERE através do menu principal, e informe em que local o adventure

se inicia. Tire uma cópia do jogo (runnable) e envie de forma singela para este seu criado: afinal eu também gosto de adventures, certo?   



Ficha Técnica:

Programa:
Graphic Adventure Creator
Lançamento: 1986
Empresa: Incentive Software Ltd (UK)
Autores: Sean Ellis, Brendan Kelly
Preço: £22.95
Download do jogo:

a_lenda_da_gavea.zip

 

Download do G.A.C.:

GraphicAdventureCreator.tzx.zip

(programa)

Download do manual:


GraphicAdventureCreator.pdf

(manual em Inglês)