Postagens populares

domingo, 28 de novembro de 2010

Experiência: Criando um adventure para o Sega Mega Drive/Genesis

 De volta ao hello world.

Muito tempo atrás fiz um post sobre o Basiegaxorz, um compilador basic que permite programar jogos/programas para o Sega Mega Drive/Genesis e seus complementos, como o Sega CD e o 32X. O post em si era bem simplificado mas mostrava os comandos básicos do dialeto basic para manipular frases, a paleta de cor e a posição da letras. Nada muito complicado. Na época frisei que iria postar mais algum tutorial sobre a liguagem, expandindo o que havia sido feito.

Mas quem acompanha o blog já deve saber que não sou lá muito bom de cumprir promessas. O tempo passou, muitas coisas aconteceram e terminei por deixar o tutorial de programação para o Mega Drive/Genesis esquecido. Agora muito tempo depois tento remediar, um pouco, a situação. Não, este aqui não é o tutorial prometido, mas uma pequena idéia que já tenho há algum tempo - junto com a vontade de tirar a ferrugem do Basiegaxorz.

A premissa seria a criação de um adventure para o Mega Drive. Nada muito extravagante e cheio de pirotecnia. Apenas um jogo baseado no "modo texto/linha de comando" que se consegue com a manipulação de frases, laços de execução, paletas de cores e uma estória minimamente interessante. O que acredito ser teoricamente possível com uns poucos comando de print, ink e goto no Basiegaxorz. A título de informação um adventure basicamente é um estória "guiada". O jogador assume o papel de protagonista em uma ficção interativa. Um exemplo de adventure, ou melhor de graphic adventure na plataforma seria o jogo Snatcher, para o Sega CD.


 O primeiro esqueleto de código. 30 minutos muito bem empregados..


As vantagens em se criar um jogo desta natureza seriam a simplicidade do código e o foco voltado na estória. Contudo, os aspectos negativos, tinha que existir alguma coisa em contrário ou não teria graça, seriam profundidade da estória elaborada, o gerenciamento de itens e a questão mais complicada de todas - a interface com o usuário. Abaixo segue  um código de teste escrito e desenvolvido em um espaço de uns 30 minutos com o Basiegaxorz versão 1.37. Para testar basta copiar, colar na IDE do compilador, dar F5 e usar um emulador para ver o resultado.

Atenção: exceto pelas labels todo o resto deve ter um espaço ou TAB de distância da margem esquerda da tela para funcionar corretamente. Isso é exigência do compilador.

    'teste de um adventure. teresina, 27 de novembro de 2010.
    
    dim loc as integer
    dim opt as integer
    dim opt2 as integer
   
    loc = 5
inicio:
    'isso define os locais onde o jogador está
    ink 1
    if loc = 1 then
    print " voce esta em frente ao cemiterio"
    endif
    if loc = 2 then
    print " voce esta em frente ao hospital"
    endif
    if loc = 3 then
    print " voce esta em frente a uma praca"
    endif
    if loc = 4 then
    print " voce esta em frente ao ferro-velho"
    endif
    if loc = 5 then
    print " voce esta em frente a prefeitura"
    endif
    if loc = 6 then
    print " voce esta em frente ao armazem"
    endif
    if loc = 7 then
    print " voce esta em frente a um shopping"
    endif
    if loc = 8 then
    print " voce esta em frente a banco"
    endif
    if loc = 9 then
    print " voce esta em frente ao lixao da cidade"
    endif

tela_de_opcoes:
    ' a tela geral do jogo
    ink 0
    print ""
    print " O que voce deseja fazer?"
    print " 1 - Observar o lugar?"
    print " 2 - vasculhar o lugar?"
    print " 3 - ir para outro lugar"
    input opt
   
    if opt = 1 then
    goto observar
    endif
    if opt = 2 then
    goto vasculhar
    endif
    if opt = 3 then
    goto ir
    endif
    if opt < 1 [or] opt > 3 then
    'goto inicio
    goto tela_de_opcoes
    endif
   
observar:
    ' isso define o que o jogador vê em cada lugar
    ink 1
    if loc = 1 then
    'cemitério
    print " Esta escuro e voce escuta sons de grito longe."
    goto tela_de_opcoes
    endif
    'hospital
    if loc = 2 then
    print " o hospital esta destruido."
    goto tela_de_opcoes
    endif
    'praça
    if loc = 3 then
    print " a praca esta deserta"
    goto tela_de_opcoes
    endif
    'ferro velho
    if loc = 4 then
    print " o lugar parece esta abandonado"
    goto tela_de_opcoes
    endif
    'prefeitura
    if loc = 5 then
    print " parece uma zona de guerra"
    goto tela_de_opcoes
    endif
    'armazém
    if loc = 6 then
    print " ninguem vem a este lugar faz tempo"
    goto tela_de_opcoes
    endif
    'shopping
    if loc = 7 then
    print " o shopping foi arrasado"
    goto tela_de_opcoes
    endif
    'banco
    if loc = 8 then
    print " o banco foi assaltado"
    goto tela_de_opcoes
    endif
    'lixão
    if loc = 9 then
    print " muito lixo por toda parte."
    goto tela_de_opcoes
    endif

vasculhar:

    ' isso define o que o jogador encontra em cada lugar
    ink 1
    if loc = 1 then
    'cemitério
    print " existem covas abertas recentemente."
    goto tela_de_opcoes
    endif
    'hospital
    if loc = 2 then
    print " tem sacos de corpos etiquetados por toda parte."
    goto tela_de_opcoes
    endif
    'praça
    if loc = 3 then
    print " barricadas improvisadas fecham os acessos a a outras ruas."
    goto tela_de_opcoes
    endif
    'ferro velho
    if loc = 4 then
    print " maquinario pesado e velho abandonado por toda parte"
    goto tela_de_opcoes
    endif
    'prefeitura
    if loc = 5 then
    print " tem um mural com varias mensagens escritas."
    goto tela_de_opcoes
    endif
    'armazém
    if loc = 6 then
    print " engradados e conteineres estao espalhados"
    goto tela_de_opcoes
    endif
    'shopping
    if loc = 7 then
    print " varias lojas foram saqueadas."
    goto tela_de_opcoes
    endif
    'banco
    if loc = 8 then
    print " o banco esta com as portas arrombadas."
    goto tela_de_opcoes
    endif
    'lixão
    if loc = 9 then
    print " sacos de corpos e fogueiras estao por toda parte."
    goto tela_de_opcoes
    endif

ir:

    ' tela onde o jogo define para onde vai.
'    cls
    ink 1
    print ""
    print " para onde voce deseja ir?"
    ink 0
    print " 1 - cemiterio?"
    print " 2 - hospital?"
    print " 3 - praca?"
    print " 4 - ferro-velho?"
    print " 5 - prefeitura?"
    print " 6 - armazem?"
    print " 7 - shopping?"
    print " 8 - lixao?"
    input opt2
   
    if opt2 = loc then
    ink 2
    print " voce ja esta neste lugar."
    goto ir
    endif
    'cemiterio
    if opt2 = 1 then
    loc = 1
    goto tela_de_opcoes
    endif
    'hospital
    if opt2 = 2 then
    loc = 2
    goto tela_de_opcoes
    endif
    'praca
    if opt2 = 3 then
    loc = 3
    goto tela_de_opcoes
    endif
    'ferro velho
    if opt2 = 4 then
    loc = 4
    goto tela_de_opcoes
    endif
    'prefeitura
    if opt2 = 5 then
    loc = 5
    goto tela_de_opcoes
    endif
    'armazém
    if opt2 = 6 then
    loc = 6
    goto tela_de_opcoes
    endif
    'shopping
    if opt2 = 7 then
    loc = 7
    goto tela_de_opcoes
    endif
    'banco
    if opt2 = 8 then
    loc = 8
    goto tela_de_opcoes
    endif
    'lixao
    if opt2 = 9 then
    loc = 9
    goto tela_de_opcoes
    endif

    if opt2 < 1 [or] opt2 > 9 then
    goto ir
    endif

Como é possível observar este esqueleto de código é funcional, mas apresenta o defeito em relação a interface que relatei acima. O uso do comando input engessa por demais o sistema e num jogo/programa mais longo simplesmente iria torrar a paciência do usuário. Obviamente isso tem de ser retrabalhado e como ainda estou em fase "pre-alpha" do código, posso me dar ao luxo de ficar com esta solução capenga por hora.

Bom não é exatamente um tutorial. Mas demonstra que não esqueci o Basiegaxorz. Também demonstra que que tenho interesse em criar algo para o Mega Drive, mas não espero ter algo pronto em pouco tempo. Ainda tenho de tirar a poeira e as teias de aranha dos comandos que aprendi. Caso alguém deseje se aventurar na criação de um adventure o site MSX Adventure é um uma boa pedida para começar.

Um comentário:

  1. Boa, gostei do código! Sempre quis portar o "AMAZÔNIA" de Renato Degiovani para outras máquinas e não tinha a mínima idéia de como fazer. Obrigado!

    PS: Snatcher nasceu no MSX :D

    ResponderExcluir