Ferramentas do usuário

Ferramentas do site


jogos:ps1:desconstruindo_ps1

Desconstruindo Phantasy Star I

Nota do Orakio: Há alguns anos, o amigo René “Killgama” Daré anunciou na 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:

  1. Pega o valor do ATK do personagem que está atacando;
  2. 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;
  3. Pega o valor de DEF do inimigo que está recebendo o ataque;
  4. 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;
  5. Utilizando-se os valores ajustados, faz a conta DEF-ATK;
  6. Se ATK > DEF, subtrai a diferença do HP do inimigo;
  7. 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;
  8. 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;
  9. 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.

jogos/ps1/desconstruindo_ps1.txt · Última modificação: 2014/09/01 11:28 por kilgamma