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.
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.
Comentários
Postar um comentário
Como fiquei sabendo que um pobre blogueiro foi processado por um comentário anonimo esses dias, so me resta me precaver contra a ineficácia da legislação em tratar o meio online. Mas eu prometo que libero rapido ^_~