Aqui você vê as diferenças entre duas revisões dessa página.
Próxima revisão | Revisão anterior | ||
jogos:ps1:desconstruindo_ps1 [2014/03/13 23:36] – criada orakio | jogos:ps1:desconstruindo_ps1 [2014/09/01 11:28] (atual) – kilgamma | ||
---|---|---|---|
Linha 1: | Linha 1: | ||
====== Desconstruindo Phantasy Star I ====== | ====== Desconstruindo Phantasy Star I ====== | ||
- | Há alguns anos, o amigo René " | + | // Nota do Orakio: |
- | O René foi postando suas descobertas na lista, e a gente tinha a ideia de compilar tudo de maneira organizada para publicar. Mas o tempo foi passando e a gente é preguiçoso demais, rs... como seria um pecado deixar esse conhecimento se perder, aí vão os emails que o René enviou para a lista: | + | // O René foi postando suas descobertas na lista, e a gente foi ficando cada vez mais maravilhado. A ideia de compilar |
- | ===== E-mail 1 ===== | + | 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. |
- | Galera, | + | 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. |
- | Depois | + | Durante os ataques |
- | claras no meu post anterior sobre o algoritmo de calculo dos danos nas | + | |
- | lutas. Vou detalhar melhor. | + | |
- | * A luta funciona no mecanismo | + | - Pega o valor do ATK do personagem que está atacando; |
- | inimigo, | + | - Ajusta o valor de ATK utilizando um valor gerado aleatoriamente. Esse ajuste é feito com o objetivo de reduzir o valor de ATK aleatoriamente, |
- | luta anterior | + | - Pega o valor de DEF do inimigo que está recebendo o ataque; |
- | e outras coisas. Além disso, o jogo gera um vetor de 12 entradas, | + | - Ajusta o valor de DEF utilizando um valor gerado aleatoriamente. Esse ajuste é feito com o objetivo |
- | numeradas de 00 a 11, que servem para controlar a ordem de ataque. | + | - 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 | ||
+ | - Se (DEF-ATK) >= 16, o jogo verifica se a diferença é par ou impar. Se for ímpar, é realizado o mesmo processo | ||
+ | - Se o HP do inimigo ficar zerado, o inimigo morre. | ||
- | * Quando o turno começa, uma das primeiras coisas que o jogo faz é | + | A lógica |
- | mudar a sequencia nesse vetor, embaralhando tudo. Assim pode ser que o | + | |
- | inimigo | + | |
- | * Regra de calculo quando | + | Essa redução aleatória nos valores |
- | 1) Pega o ATK do personagem | + | 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. |
- | 2) Ajusta | + | 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 |
- | é feito de forma a garantir | + | |
- | 1/4 do ATK original. | + | |
- | 3) Pega o DEF do 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 |
- | 4) Ajusta o DEF utilizando um valor gerado aleatoriamente. Esse ajuste | + | 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, |
- | é feito de forma a garantir | + | |
- | 1/4 do DEF original. | + | |
- | (daqui pra frente, utilizam-se apenas os valores AJUSTADOS) | + | Para exemplificar tudo isso, considere esta batalha do grupo contra um WT.DRAGON. |
- | 5) Faz a conta DEF-ATK. | + | ^ 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 | | ||
- | 6) Se ATK > DEF, o jogo pega a diferença e subtrai do HP do inimigo. | + | Alguns pontos importantes: |
- | 7) Se (DEF-ATK) < 16, o jogo gera outro numero aleatorio para o ATK | + | * O ATK e DEF efetivo é recalculado em cada ataque, nunca sendo inferior a 3/4 do original; |
- | ajustado. Esse numero gerado vai ter no máximo | + | * 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 |
- | personagem, | + | * A ordem de ataque é aleatória, conforme já explicado; |
- | zero). Então | + | * 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 | ||
+ | * Valores negativos de diferença entre ATK e DEF resultam em um dano efetivo direto igual ao valor da diferença, sendo subtraído | ||
- | 8) Se (DEF-ATK) >= 16, o jogo verifica se a diferença | + | Quando a mágica HELP (MYAU) é utilizada, o valor efetivo de ATK do personagem que recebeu |
- | Se for ímpar, | + | |
- | defende. | + | |
- | 9) Se o HP do inimigo ficar zerado, o monstro morre. | + | 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 | | ||
- | * Regra de calculo quando um INIMIGO ataca: | + | Alguns pontos importantes: |
- | 1) Pega o ATK do inimigo | + | * 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 | ||
- | 2) Ajusta o ATK utilizando um valor gerado aleatoriamente. Esse ajuste | + | Por fim, essa lógica |
- | é feito de forma a garantir que o ATK ajustado permaneça pelo menos | + | |
- | 1/4 do ATK original. | + | |
- | + | ||
- | 3) Pega o DEF do personagem | + | |
- | + | ||
- | 4) Ajusta o DEF utilizando | + | |
- | é feito de forma a garantir que o DEF ajustado permaneça pelo menos | + | |
- | 1/4 do DEF original. | + | |
- | + | ||
- | (daqui pra frente, utilizam-se apenas | + | |
- | + | ||
- | 5) Faz a conta DEF-ATK. | + | |
- | + | ||
- | 6) Se ATK > DEF, o jogo pega a diferença | + | |
- | + | ||
- | 7) Se (DEF-ATK) < 16, o jogo gera outro numero aleatorio para o ATK | + | |
- | ajustado. Esse numero gerado vai ter no máximo | + | |
- | PERSONAGEM, nunca sendo maior que isso, mas podendo ser menor (até | + | |
- | zero). Então o jogo pega esse novo valor e subtrai do HP do | + | |
- | PERSONAGEM. | + | |
- | + | ||
- | 8) Se (DEF-ATK) >= 16, o jogo verifica se a diferença é par ou impar. | + | |
- | Se for ímpar, o jogo faz igual o passo 7. Se for par, o PERSONAGEM | + | |
- | defende. | + | |
- | + | ||
- | 9) Se o HP do PERSONAGEM ficar zerado, o PERSONAGEM morre. | + | |
- | + | ||
- | + | ||
- | ===== E-mail 2 ===== | + | |
- | + | ||
- | E como minha explicacao ficou ruim no lance do 1/4, segue a explicacao da explicacao! eheheh | + | |
- | + | ||
- | O valor é no mínimo 1/4 do ATK até o seu máximo. | + | |
- | + | ||
- | Exemplo: Alis no último nível com Espada | + | |
- | + | ||
- | Ataque: 116 | + | |
- | Defesa: 230 | + | |
- | + | ||
- | Logo, durante o ataque, o valor aleatório para ambos serão: | + | |
- | + | ||
- | ATK de 29 até 116. | + | |
- | DEF de 57 até 230. | + | |
- | + | ||
- | + | ||
- | ===== E-mail 3 ===== | + | |
- | + | ||
- | Mais uma correção: | + | |
- | + | ||
- | Ae Albert!! | + | |
- | + | ||
- | Cara, fora esses problemas que o pessoal encontrou, tem mais uma coisa que eu quero retificar. A funcao de ajuste na verdade nao deixa que o valor ajustado seja menor que 3/4 do original e não 1/4 como eu havia dito. Estou vendo agora se existe possibilidade dela retornar um numero maior que o ATK/DEF original, embora eu não acredito que seja possível. | + | |
- | + | ||
- | ===== E-mail 4 ===== | + | |
- | + | ||
- | E pra fechar: | + | |
- | + | ||
- | Confirmo 100% o comportamento da funcao de ajuste. | + | |
- | + | ||
- | Os passos sao estes: | + | |
- | + | ||
- | 1) Pega o valor original e divide por 2 | + | |
- | 2) Armazena este valor (1/2 ORIG) | + | |
- | 3) Divide novamente por 2 | + | |
- | 4) Armazena este valor (1/4 ORIG) | + | |
- | 5) Calcula um numero aleatorio | + | |
- | 6) Inicializa | + | |
- | 7) Soma o valor 1/4 ORIG | + | |
- | 8) Soma o valor 1/2 ORIG (já temos 3/4 somados) | + | |
- | 9) Soma o valor 1/4 ORIG, multiplicado pelo 0 a 100% que foi gerado antes | + | |
- | + | ||
- | Desse modo, a ultima parcela da soma (que adiciona os ultimos 1/4) vai adicionar na verdade um valor entre 0 a 100% de 1/4. Deste modo, nunca o valor ajustado será menor que 3/4 do original, porque no pior caso ele nao soma os ultimos 1/4. | + |