|
FONTE: Revista MICRO SISTEMAS No. 83,
páginas 39, 40, 41 e 42 (
Outubro de 1988 )
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?
|