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.

sexta-feira, 26 de novembro de 2010

Som da Sexta: Black Label Society - Demise Of Sanity

Tentativa de ser pontual esta semana. Mantenham as foices e tochas longe da minha pessoa...



sábado, 20 de novembro de 2010

Som da sexta (atrasado): Black Label Society - Stoned and Drunk

Ok, ok, eu disse que tentaria mudar este hábito e colocar tudo em dia, mas infelizmente não será hoje... Antes de pegarem as foices e as tochas aproveitem o som do Black Label Society - Stoned and Drunk.


domingo, 14 de novembro de 2010

Problemas técnicos e mais desculpas

O blog está praticamente abandonado nestas duas semanas. Contudo tenho alguns fatos, ou desculpas se preferirem, em meu favor: Problemas com a placa de vídeo. Aqui vai a história: Alguns dias atrás ao ligar meu computador percebi um "zumbido" estranho no gabinete. Não sou o especialista em hardware da casa. Este posto deixo tranquilamente nas mãos do meu irmão que é fanático por peças de computador. Mas quanto ao barulho já espera que a coisa fosse de algum modo grave. Mal deu o boot, desliguei tudo e deixei pra resolver depois.

No dia seguinte meu irmão desmontou o computador e verificou que o cooler da placa de vídeo estava travando. Poeira, o desgaste com o uso, ou as duas hipóteses juntas são as causas prováveis do "zumbido". A placa foi removida e o computador agora está funcionando na base do chipset Intel onboard. Ou seja, uma droga. Deixando isso de lado as soluções possíveis para a questão: 1 - comprar uma placa de vídeo nova. 2 - comprar um cooler pra a placa de vídeo velha. A primeira opção é cara, mas me manteria com capacidade de rodar tudo - depois que fiz uma conta no Steam isso é requisito praticamente indispensável.

Aliás este imbróglio com a placa de vídeo veio em péssima hora. Comprei o Aliens Vs Predador por um preço camarada em uma das promoções de Halloween  do Steam, já havia passado uma semana praticamente direto pra carregar o troço e agora não posso rodar o jogo. Durante um tempão fiquei na expectativa do jogo enquanto fazia o download e a agora a única coisa que posso fazer é olhar o ícone do programa no desktop. Pior é que masoquisticamente  tentei rodar o maldito jogo, obviamente desligando tudo quanto é de efeito/pirotecnia/firula e em meros 800x600. A p@##4 dos vídeos de abertura rodam perfeitamente, o que aumentou minhas esperanças, mas quando entra o jogo em si o chipset onboard da intel pede água: Parece que se está assistindo a um vídeo stop motion. A ironia me persegue sem descanso ou trégua.

Por outro lado, a segunda opção, comprar um cooler pra placa, é mais barata. Afinal a placa, tirando o cooler, está funcionando perfeitamente. Mesmo estando algumas "gerações" - considerando a vida útil de uma placa de vídeo - defasada, minha Ati Radeon HD 3650, ainda tem potência pra queimar. Não que ela rode tudo no "Full", qualquer coisa usando a engine Unreal 3, faz a coitada engasgar, mas eu sobrevivi a uma época onde a resolução padrão era 320X240 em modo software.

800x600 e alguns efeitos desligados não fazem mal a ninguém - esporadicamente, em doses homeopáticas.

Por hora estou fazendo o possível pra não rodar nada que use 3D em meu PC. Mesmo fazendo algumas experiências, o resultado é menos do que satisfatório. Até o Darkplaces, minha engine padrão para o Quake, tem mostrado comportamento estranho com o vídeo granulado e botões e portas sumindo. Neste tipo de situação do DirectQ mostra sua força e roda sem problemas - mas sem abusar dos efeitos.

Resumindo tudo. Tenho de optar por uma das opções descritas acima. Tenho de fazer uns cálculos pesar esta despesa inesperada no orçamento. Quanto ao blog , ele continua, aos trancos e barrancos, mas continua.