Wild Witch Project - Um game que você nunca viu

Neste jogo você precisa ajudar uma bruxa adolescente a salvar seu mundo da Mortífera Bunda Assassina do Espaço Sideral

Pensando em RPG de novo

Já perdi a conta de quantas vezes falei de lógica de RPG aqui, e acho que ainda tem “pano pra manga”, quanto mais eu analiso mais eu vejo que um RPG, mesmo o mais simples, é composto de minúsculas regras que se amontoam para interagir.
Minha técnica é fazer um simulado mental de uma ação e tentar juntar os recursos que preciso, em vários momentos isso se mostrou monstruoso, dado que vários fatores interferem juntos no resultado.

“No começo do jogo Cibele ganha do mega-arqui-mago-fodão o Anel do Senhor da Guerra que lhe permite empunhar qualquer arma do jogo”

Um simples paragrafo muito comum que vai ajudar o herói de uma campanha épica, mas que implica em ser transformado em realidade, oque me faz pensar que o anel possui uma função que interfere nos testes quando Cibele tenta carregar qualquer arma só pra dizer: -sim ela pode carregar.
Como eu faço isso? Digo pra sistema que o “não pode” deve mudar para “sim”? Ou na hora do teste digo que a força dela é “infinita”, se digo isso quando devo dizer?
Me veio uma solução na cabeça, de atribuir propriedades à um elemento dessa forma um teste caça nelas a que lhe convém.

Proposta:
Atos
+ e - = Transação
< e > = Ação

ato( Cibele > Cobra )  =  Ataque normal
ato( Cibele.magias.fireball  > cobra ) = Ataque mágico, a função ato() recebe nulo se ela não puder usar a magia.
ato( Cibele < veneno )
ato( Cibele < Cobra )
ato( Cibele < Cobra.veneno )

Os atos operam entre atributos e modificadores.
De um modo geral quando dois personagens interagem é um ataque.
Cibele > cobra = chama a rotina de ataque. A rotina padrão faz com que a cobra receba os dados de dano. O dano nada mais é que um modificador de efeito imediato ou não.
Exemplo: se Cibele ataca normalmente o dano é físico (atributo força da personagem + força da arma de mão) cria-se um Modificador chamado dano e passa-se ele para cobra que faz os testes em sua função de receber dano. assim: cobra.recebeDano( dano )
Como dano é um modificador, ele pode alterar os atributos, geralmente “vida” diminuindo-a.
Aqui começa o problema do RPG, diminuir a vida implica em fazer um teste se você pode diminuir esse atributo.

Um cenário tipico:
Cibele.modificadores + ResistenciaAVeneno(+5)
Cibele.equipamento + CotaDeMeiasVivarina
Cibele.equipamento + AnelAntiCobra
Cobra > Cibele -- ou Cibele < Cobra

Na primeira linha Cibele recebe direto um modificador na sua tabela de modificadores. Assim dizemos ao sistema que ela é naturalmente resistente ao veneno (+5).
Na segunda linha ela recebe uma Cota de Meias Vivarina, que suportam perfuração de faca, flecha e bala (exceto as facas Guinsu). (armadura/resistência +20)
Na terceira ela ganha um Anel Anti Cobra, que dá 30 de dano no ofidio que tocar na pele dela.
A ultima linha a cobra ataca Cibele >. Essa função > desencadeia o mecanismo de teste do de ataque do personagem.
A função de ação passa primeiro pelos testes básicos como esquiva e defesa que diminuem um pouco ou todo o dando.
Depois pelos modificadores da personagem, depois pelo equipamento em uso e executa suas funções de comparação. Se o modificador ResistenciaAVeneno achar o valor “veneno” nas informações de ataque ele tira os 5 do valor que foi infligido.
Por ultimo o equipamento MeiasVivarina fazerem um teste e verem que o valor “perfuracao” deve ser ignorado e que o objeto também tem um “cobra” no meio e aplicam a função AnelAntiCobra > Cobra.

Note que a primeira parte do teste usa-se os valores constituintes dos próprios personagens e depois os testes secundários com os modificadores.
O grande problema é que um modificador também interfere em um atributo! Em outras palavras o atributo também é uma classe que faz testes e seus objetos precisão conhecer o seu contéiner.

E ainda tenho que optimizar isto para que não ocorra um teste desnecessário a cada frame (uma placa hi-end ultimamente dá em torno de 500 a 1000 frames por segundo), seria um esforço inútil calcular toda a lógica para isso, por isso as classes contém um mecanismo de cache.

Por ultimo uma modificação a informar no framework descrito acima é a substituição da biblioteca de classes que não estava mais sendo atualizada pelo autor.
Agora estou usando a LOOP. Muito prática.

Postagens relacionadas
Incorporando banco de dados
Progeto de I.A.