====== Desconstruindo Phantasy Star I ====== // Nota do Orakio: Há alguns anos, o amigo René "Killgama" Daré anunciou na [[https://br.groups.yahoo.com/neo/groups/listadealgol/info|Lista de Algol]] um ambicioso projeto de desconstrução do primeiro Phantasy Star. Seu intuito era o de descobrir como o jogo funcionava através da análise detalhada do código. // // O René foi postando suas descobertas na lista, e a gente foi ficando cada vez mais maravilhado. A ideia de compilar todo aquele conhecimento foi sendo adiada, até que finalmente o René teve a paciência de organizar tudo de uma forma que todos pudessem entender. Com a palavra, nosso amigo René! // Toda batalha no Phantasy Star funciona através de ataques e defesas sorteadas a cada turno da batalha. Quando aparece um inimigo, parte do código de inicialização cuida de desativar coisas da luta anterior (ex: parede mágica, força extra nos personagens e inimigo) e outras coisas. Nesse momento, o código de inicialização jogo calcula a ordem de ataque, tanto de inimigos quanto de personagens. Lembrando que são 4 personagens (Alis, Myau, Odin e Lutz) e no máximo 8 HPs inimigos, como algumas aparições do SWORM. Em todos os turnos, uma das primeiras coisas que o jogo faz é definir (de forma totalmente aleatória) a sequencia de ataque de inimigos e personagens do time. Assim pode ser que o inimigo comece primeiro ou que um personagem comece primeiro. Durante os ataques de um dos personagens do time, os valores são processados assim: - Pega o valor do ATK do personagem que está atacando; - Ajusta o valor de ATK utilizando um valor gerado aleatoriamente. Esse ajuste é feito com o objetivo de reduzir o valor de ATK aleatoriamente, de modo que permaneça pelo menos 3/4 do valor original. Supondo um ATK de 180, 3/4 desse valor é 135, então o valor de ATK a ser utilizado para calcular o dano no inimigo vai ser algo entre 135 e 180, recalculado aleatoriamente cada vez que o personagem ataca; - Pega o valor de DEF do inimigo que está recebendo o ataque; - Ajusta o valor de DEF utilizando um valor gerado aleatoriamente. Esse ajuste é feito com o objetivo de reduzir o valor de DEF aleatoriamente, de modo que permaneça pelo menos 3/4 do valor original. A regra é idêntica a utilizada para calcular o ATK do personagem; - Utilizando-se os valores ajustados, faz a conta DEF-ATK; - Se ATK > DEF, subtrai a diferença do HP do inimigo; - Se (DEF-ATK) < 16, o jogo gera outro numero aleatorio para o ATK ajustado. Esse valor gerado vai ter no máximo o valor do nivel do personagem e no mínimo zero. Então o novo valor é subtraido do HP do inimigo; - Se (DEF-ATK) >= 16, o jogo verifica se a diferença é par ou impar. Se for ímpar, é realizado o mesmo processo de recalcular o ATK com valores entre zero e o nível do personagem. Se o resultado for um número par, o monstro defende o ataque; - Se o HP do inimigo ficar zerado, o inimigo morre. A lógica é a mesma quando o inimigo está atacando, e em caso de defesa maior que ataque (passos 7 e 8) é utilizado o nível do personagem para calcular o dano do inimigo, já que os inimigos não possuem níveis. Essa redução aleatória nos valores de ataque e defesa provavelmente foram colocados pelo programador do jogo para dar um efeito mais realista. Algumas vezes o ataque não vai ser tão bom quanto outras e a defesa também pode vacilar deixando o oponente aplicar um golpe mais certeiro. Você deve estar pensando porque alguém criaria uma regra pra verificar se a diferença entre ataque ou defesa é par ou ímpar. Realmente a descrição que fiz está muito técnica, então vou explicar melhor. A regra de verificar se a diferença (DEF-ATK) é par ou ímpar apenas faz com que o jogo não permita que defesas sejam 100% garantidas em caso de DEF maior que ATK. Na prática isso significa que teoricamente as defesas falham em 50% das vezes. Isso acontece porque o valor final de ATK e DEF é ajustado por um gerador de números aleatórios, aplicado aos valores base do personagem ou inimigo. Indo um pouco mais a fundo, um bom gerador de números aleatórios precisa ter uma boa distribuição dos números produzidos. Imagine uma faixa de 1 a 254 para a geração dos números, um bom gerador precisa produzir todos os números dessa faixa, aproximadamente o mesmo número de vezes. Por exemplo, em cerca de 1.000.000 de rodadas, esse gerador precisa produzir todos os números dessa faixa aproximadamente 3.937 vezes. Metade dos números dessa faixa são pares e a outra metade são ímpares, então se eles são gerados com uma boa distribuição, podemos dizer que aproximadamente 50% dos números gerados serão pares e os outros 50% ímpares. Se o gerador apresentar uma tendência de produzir mais números pares do que ímpares por exemplo, esse percentual não será 50%. Para exemplificar tudo isso, considere esta batalha do grupo contra um WT.DRAGON. ^ Ataque ^ Quem Ataca ^ ATK Base ^ ATK Efetivo ^ DEF Base ^ DEF Efetivo ^ Diferença ^ Dano Efetivo ^ | 1 | WT.DRAGN | 180 | 155 | 193 | 189 | 34 | 0 | | 2 | NOAH | 85 | 75 | 104 | 92 | 17 | -22 | | 3 | ODIN | 93 | 81 | 104 | 92 | 11 | -17 | | 4 | ALIS | 116 | 106 | 104 | 103 | -3 | -3 | | 5 | MYAU | 116 | 115 | 104 | 81 | -34 | -34 | | 6 | WT.DRAGN | 180 | 139 | 188 | 171 | 32 | 0 | | 7 | ALIS | 116 | 114 | 104 | 102 | -12 | -12 | | 8 | NOAH | 85 | 77 | 104 | 95 | 18 | 0 | | 9 | WT.DRAGN | 180 | 143 | 188 | 184 | 41 | -1 | | 10 | MYAU | 116 | 90 | 104 | 90 | 0 | -18 | | 11 | ODIN | 93 | 74 | 104 | 89 | 15 | -18 | | 12 | ALIS | 116 | 87 | 104 | 96 | 9 | -22 | | 13 | NOAH | 85 | 66 | 104 | 82 | 16 | 0 | | 14 | MYAU | 116 | 106 | 104 | 92 | -14 | -14 | | 15 | ODIN | 93 | 90 | 104 | 101 | 11 | -9 | | 16 | WT.DRAGN | 180 | 144 | 188 | 183 | 39 | -4 | | 17 | ALIS | 116 | 89 | 104 | 84 | -5 | -5 | | 18 | ODIN | 93 | 69 | 104 | 95 | 26 | 0 | | 19 | MYAU | 116 | 105 | 104 | 82 | -23 | -23 | | 20 | WT.DRAGN | 180 | 157 | 188 | 173 | 16 | 0 | | 21 | NOAH | 85 | 74 | 104 | 99 | 25 | -10 | Alguns pontos importantes: * O ATK e DEF efetivo é recalculado em cada ataque, nunca sendo inferior a 3/4 do original; * Um valor positivo de diferença entre ATK e DEF significa que o valor efetivo de DEF é maior que o ATK, ativando a função que recalcula o dano em função do nível do personagem; * A ordem de ataque é aleatória, conforme já explicado; * Valores positivos e pares de diferença entre ATK e DEF resultam em um dano efetivo igual a zero, o que na prática significa que o inimigo ou o personagem se defende do ataque; * Valores positivos e ímpares de diferença entre ATK e DEF resultam no recálculo do dano com base no nível do personagem. Nessa batalha o nível de todos os personagems é o máximo (30); * Valores negativos de diferença entre ATK e DEF resultam em um dano efetivo direto igual ao valor da diferença, sendo subtraído do HP do personagem ou inimigo. Quando a mágica HELP (MYAU) é utilizada, o valor efetivo de ATK do personagem que recebeu a magia é cerca de 50% mais elevado que o valor base. De maneira semelhante, quando a mágica TERR (MYAU) é utilizada, o inimigo passa a ter um valor de ATK efetivo cerca de 25% inferior ao valor base. O WERE BAT quando está com muita raiva também fica com seu ATK elevado em cerca de 50% do valor base, como se ele tivesse utilizado a mágica HELP nele mesmo. Veja o exemplo de parte da batalha contra o DARKFALZ, onde Myau usou a mágica HELP em ALIS, fazendo seu valor de ATK efetivo ficar mais elevado que o valor base. A mágica só foi utilizada a patrir do ataque número 15, cujos valores estão marcados em negrito. ^ Número ^ Quem Ataca ^ ATK Base ^ ATK Efetivo ^ DEF Base ^ DEF Efetivo ^ Diferença ^ Dano Efetivo ^ | 1 | DARKFALZ | 255 | 197 | 188 | 157 | -40 | -40 | | 2 | NOAH | 85 | 79 | 150 | 138 | 59 | -29 | | 3 | DARKFALZ | 255 | 226 | 230 | 205 | -21 | -21 | | 4 | MYAU | 116 | 108 | 150 | 143 | 35 | -13 | | 5 | ALIS | 116 | 102 | 150 | 144 | 42 | 0 | | 6 | DARKFALZ | 255 | 226 | 188 | 161 | -65 | -65 | | 7 | NOAH | 85 | 65 | 150 | 121 | 56 | 0 | | 8 | ALIS | 116 | 105 | 150 | 118 | 13 | -8 | | 9 | DARKFALZ | 255 | 204 | 193 | 173 | -31 | -31 | | 10 | ALIS | 116 | 94 | 150 | 126 | 32 | 0 | | 11 | DARKFALZ | 255 | 214 | 188 | 169 | -45 | -45 | | 12 | DARKFALZ | 255 | 213 | 193 | 173 | -40 | -40 | | 13 | NOAH | 85 | 68 | 150 | 127 | 59 | -23 | | 14 | DARKFALZ | 255 | 247 | 230 | 223 | -24 | -24 | | **15** | **ALIS** | **116** | **147** | **150** | **148** | **1** | **-17** | | 16 | DARKFALZ | 255 | 244 | 194 | 152 | -92 | -92 | | 17 | NOAH | 85 | 67 | 150 | 147 | 80 | 0 | | 18 | MYAU | 116 | 97 | 150 | 122 | 25 | -28 | | 19 | DARKFALZ | 255 | 237 | 194 | 175 | -62 | -62 | | 20 | ALIS | 116 | 145 | 150 | 112 | -33 | -33 | | 21 | DARKFALZ | 255 | 221 | 193 | 144 | -77 | -77 | Alguns pontos importantes: * O DARKFALZ realmente é um inimigo muito forte. No ataque número 16, ele aplicou um dano de 92 pontos ao ODIN; * O NOAH mesmo com um ATK base baixo consegue aplicar danos devido ao mecanismo de recálculo do ATK efetivo quando a diferença entre ATK e DEF é positiva e impar, conforme o ataque de número 13. Mesmo com uma diferença positiva de 59 (defesa do DARKFALZ bem maior que o ataque do NOAH), o jogo recalculou o dano baseado no nível do NOAH e gerou um novo dano efetivo com o valor 23 em vez de zero. Por fim, essa lógica de recálculo do dano efetivo explica o porque de inimigos muito fracos tipo SWORM e SCORPION conseguirem causar um dano significativo quando os personagens estão em níveis muito altos e com armas muito fortes. Nestes casos, como o valor de ataque desses inimigos é muito menor que o valor de defesa dos personagens, o jogo recalcula o dano efetivo do inimigo utilizando o nível dos personagens, frequentemente causando danos acima de 10 pontos.