Situações especiais


Um adventure completo é construido com os scripts que descrevem as posições, objetos, funções especiais (como terminar ou selecionar alguma opção) e soluções especiais, que determinam o andamento da partida. A primeira que vamos elaborar é a questão da lua.

O jogo se passa em 10 dias, podendo o jogador efetuar 10 ações por dia. Portanto, sempre que ele olhar para a lua, pra ver o quanto falta para terminar o tempo, estará recebendo a mesma mensagem, definida no script lua.scp. Vamos mudar isso.

//=== Situação atual da lua ======================
  setmode= 4,900,420
  cleartela
  cleartxt
  ifobj# pergaminho,jog,Cont
  setshpobj= pergaminho,perga2.png
:Cont
  gosub comum
  shape= lua0.png,100,0,700,220
  //montar o nome do arquivo que mostra a lua
  reg= 1,5
  reg= 0,lua
  reg$ 0,#1
  reg$ 0,.png
  shape= #0,190,30,130,130
  reg= 0,1
  reg? 0,10
  if= 0,1,reg=,4,O dia fatídico está chegando...
  if= 0,2,reg=,4,A luz da lua queima minha visão...
  if= 0,3,reg=,4,Que luão^ heim?
  if= 0,4,reg=,4,Mais cedo ou mais tarde teremos lua cheia...
  if= 0,5,reg=,4,Aaauuuuuuuuuuuuuuuuuuuuuu...
  if= 0,6,reg=,4,O tempo está passando...
  if= 0,7,reg=,4,Essa lua me chama...
  if= 0,8,reg=,4,Sentimento selvagem ao olhar essa lua...
  if= 0,9,reg=,4,Em breve ela estará manchada de sangue!
  if= 0,10,reg=,4,A lua de sangue se aproxima...
  printx #4,100,230,700,190
  shape= tic.gif,100,390,20,30
  shape= ret.gif,130,390,140,30,xvlt

Note o esquema de preparar o registrador zero para receber um valor aleatório entre 0 e 10, via instrução reg?. Em seguida sorteamos que frase mostrar ao jogador, para que o jogo não fique repetitivo. Ela será colocada no registrador 4 e então mostrada via instrução printx.

Outra questão importante: quando o jogo é executado pela primeira vez, os objetos recebem os valores constantes na definição de situação inicial mas ao ser reiniciado, executando novamente o script start.scp, será preciso informar ao sistema, via instrução reset, para repor esse valores iniciais.

//=== Script inicial ========================
  setmode= 4,900,420
  reset objs
  //- Indica o dia atual da partida

O primeiro parâmetro (objs) indica que o reset se dará com os objetos e se não houver um segundo parâmetro, todos os objetos serão resetados. Se houver um segundo parâmetro e ele for o nome de um objeto, então apenas esse objeto será resetado.

Agora precisamos definir o que acontece quando o décimo dia termina, sem que a maldição tenha sido quebrada, ou seja, o jogador vira lobisomem. Usamos o script saida.scp para deixar o jogador decidir se joga novamente ou não. Com um pequeno truque, usando o registrador 5 como buffer de mensagem, podemos fazer esse script dar ao jogador uma mensagem específica.

//=== Procedimentos de finalização do jogo ========
  setmode= 4,900,420
  clearscreen
  cleartxt
  shape= aber.png,100,0,700,326
  reg$ 5,Quer jogar novamente?
  printx #5,100,350,700,30
  reg= 5,
  shape= tic.gif,100,390,20,30
  shape= sim.gif,130,390,60,30,start
  shape= nao.gif,200,390,60,30,final

Desta forma, no script comum.scp, onde acontece a contagem de tempo, colocamos o desvio final.

//=== Procedimentos comuns a posições ==============
  shape= menu.gif,840,0,45,69,menu
  shape= sair.png,840,350,45,69,final
  dispobj= jog,,10,10,80,400,1
  dispobj= loc,,810,90,80,240,1
  reg- 2,1
  ifreg= 2,0,FimDoDia
  return

:FimDoDia
  reg= 2,10
  reg+ 1,1
  ifreg= 1,11,VirouLobo
  script dormir

:VirouLobo
  reg= 5,Não foi possível quebrar a maldição.~
  script saida

Agora faremos a segunda alternativa, ou seja, o jogador quebra a maldição. Em primeiro lugar ele precisa da estatueta do lobo e na inicialização ela está no limbo dos objetos, Desta forma, o objeto não está no jogo e só estará disponível no oitavo dia.

Esta questão pode ser resolvida no script intro.scp, que colocará a estatueta dentro do buraco, perto da árvore.

//=== Introdução e apresentação do jogo ===========
  setmode= 4,900,420
  retscp= intro
  clearscreen
  cleartxt
  ifreg= 1,1,Dia1
  ifreg= 1,2,Dia2
  ifreg= 1,3,Dia3
  ifreg= 1,4,Dia4
  ifreg= 1,5,Dia5
  ifreg= 1,6,Dia6
  ifreg= 1,7,Dia7
  ifreg= 1,8,Dia8
  ifreg= 1,9,Dia9
  ifreg= 1,10,Dia10

:Dia8
  shape= aga.gif,100,6,18,19
  '~~oje é o dia 8.'
  poeobj= lobo,dentrobur
  goto Saida

Para piorar a situação, ela só poderá ser quebrada diante da árvore maldita. ou seja, em nenhuma outra posição isso terá o efeito desejado. Desta forma, o script lobo.scp conterá a solução para a finalização "boa" do jogo.

//=== Objeto: lobo =================
  setmode= 4,900,420
  cortxt= FF0000
  cleartela
  cleartxt
  gosub comum
  shape= lobo.png,100,0,358,358,

  'O Lobo na Floresta
  §§Estatueta de um lobo uivando, esculpida em
  madeira. Segundo algumas tradições antigas essas
  peças possuem um poder místico e geralmente são
  atribuidas a elas toda sorte de maldições.'

  reg= 3,lobo
  temos? lobo,VoceTem
  ' §§Você pode @pegar|pegar| a estatueta.'
  goto Cont1

:VoceTem
  ' §§Você pode @soltar|soltar| a estatueta.'
  ifloc# arvore,Cont1
  ' §§Ou @quebrá-la|quebrar|, para desfazer a
  maldição.'

:Cont1
  printx $,460,10,240,400
  shape= tic.gif,100,390,20,30
  shape= ret.gif,130,390,140,30,xvlt
  fim

Note que ao "ter" o objeto e logo após dar a opção de soltá-lo, o sistema verifica se o jogador não está na posição da árvore. Se estiver, então ele libera o script quebrar.scp para ser executado.

//=== Quebrar a estatua do lobo ==================
  reg= 5,Parabéns^ a maldição foi quebrada.~
  script saida

Estamos usando o registrador 5 para complementar a frase "Quer jogar novamente?" e neste caso a frase de parabenização tem uma vírgula. Porém, nas instruções a vírgula é usada como delimitador de campo e portanto teremos que usar o caracter "^" no seu lugar.

Agora só falta o pergaminho ser colocado no jogo e faremos isso no quinto dia, dando uma dica de que ele contém instruções do que fazer, para quebrar a maldição.