A GAZETA DE ALGOL

"O morto do necrotério Guaron ressuscitou! Que medo!"

Ferramentas do usuário

Ferramentas do site


jogos:ps1:desconstruindo_ps1

Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.

Link para esta página de comparações

Próxima revisão
Revisão anterior
Próxima revisãoAmbos lados da revisão seguinte
jogos:ps1:desconstruindo_ps1 [2014/03/13 19:36] – criada orakiojogos:ps1:desconstruindo_ps1 [2014/09/01 07:19] kilgamma
Linha 1: Linha 1:
 ====== Desconstruindo Phantasy Star I ====== ====== Desconstruindo Phantasy Star I ======
  
-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.+// 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 tinha a ideia de compilar tudo de maneira organizada para publicarMas o tempo foi passando e gente é preguiçoso demaisrs... 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 todo aquele conhecimento foi sendo adiada, até que finalmente o René teve a paciência de organizar tudo de uma forma que todos pudessem entenderCom palavranosso amigo René! //
  
-===== 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 turnosuma 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 de fazer alguns testesachei algumas coisas que não estavam +Durante os ataques de um dos personagens do timeos valores são processados assim:
-claras no meu post anterior sobre o algoritmo de calculo dos danos nas +
-lutas. Vou detalhar melhor.+
  
-* A luta funciona no mecanismo de turnosQuando você encontra um +  - Pega o valor do ATK do personagem que está atacando; 
-inimigo, parte do código de inicialização cuida de desativar coisas da +  - 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 originalSupondo 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 180recalculado aleatoriamente cada vez que o personagem ataca; 
-luta anterior (parede mágica), força extra nos personagens e inimigos +  - Pega o valor de DEF do inimigo que está recebendo o ataque; 
-outras coisasAlé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 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; 
-numeradas de 00 11que 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< 16o jogo gera outro numero aleatorio para o ATK ajustado. Esse valor gerado vai ter no máximo o valor do nivel do personagem no mínimo zeroEntão o novo valor é subtraido do HP do inimigo; 
 +  - Se (DEF-ATK) >= 16, o jogo verifica se 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.
  
-* Quando o turno começa, uma das primeiras coisas que o jogo faz é +A lógica é a mesma quando o inimigo está atacandoe em caso de defesa maior que ataque (passos 7 e 8) é utilizado nível do personagem para calcular o dano do inimigo, já que os inimigos não possuem níveis.
-mudar sequencia nesse vetorembaralhando tudo. Assim pode ser que o +
-inimigo comece primeiro ou que um personagem comece primeiro.+
  
-* Regra de calculo quando um PERSONAGEM ataca:+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.
  
-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. 
  
-2Ajusta o ATK utilizando um valor gerado aleatoriamenteEsse ajuste +A regra de verificar se a diferença (DEF-ATKé par ou ímpar apenas faz com que 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 valor final de ATK e DEF é ajustado por um gerador de números aleatórios, aplicado aos valores base do personagem ou inimigo.
-é feito de forma a garantir que o ATK ajustado permaneça pelo menos +
-1/4 do ATK original.+
  
-3) Pega DEF do inimigo+Indo um pouco mais a fundo, um bom gerador precisa ter uma boa distribuição dos números gerados. 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 mesmo número de 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%.
  
-4) Ajusta o DEF utilizando um valor gerado aleatoriamenteEsse ajuste +Para exemplificar tudo isso, considere esta batalha do grupo contra um WT.DRAGON.
-é feito de forma a garantir que o DEF ajustado permaneça pelo menos +
-1/4 do DEF original.+
  
-(daqui pra frente, utilizam-se apenas os valores AJUSTADOS)+^ 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 |
  
-5) Faz a conta DEF-ATK.+Alguns pontos importantes:
  
-6) Se ATK DEF, o jogo pega a diferença e subtrai do HP do inimigo.+  * O ATK DEF efetivo é recalculado em cada ataquenunca sendo inferior a 3/4 do original; 
 +  * Um valor positivo de diferença entre ATK e DEF significa que valor efetivo de DEF é maior que o ATK, ativando 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 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.
  
-7) Se (DEF-ATK< 16, o jogo gera outro numero aleatorio para o ATK +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 semelhantequando a mágica TERR (MYAUé utilizada, inimigo passa a ter um valor de ATK efetivo cerca de 25% inferior ao valor base
-ajustado. Esse numero gerado vai ter no máximo o valor do nivel do +
-personagem, nunca sendo maior que issomas podendo ser menor (até +
-zero). Então jogo pega esse novo valor e subtrai do HP do inimigo.+
  
-8) Se (DEF-ATK) >= 16o jogo verifica se a diferença é par ou impar. +O WERE BAT quando está com muita raiva também fica com seu ATK elevado em cerca de 50% do valor basecomo se ele tivesse utilizado mágica HELP nele mesmo.
-Se for ímpar, o jogo faz igual o passo 7. Se for par, o monstro +
-defende.+
  
-9) Se HP do inimigo ficar zerado, o monstro morre.+Veja exemplo de parte da batalha contra o DARKFALZonde Myau usou a mágica HELP em ALIS, fazendo seu valor de ATK efetivo ficar mais elevado que 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:
  
-Regra de calculo quando um INIMIGO ataca:+  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.
  
-1) Pega o ATK do inimigo +Por fim, essa lógica de recálculo do dano efetivo explica porque de inimigos muito fracos tipo SWORM e SCORPION conseguirem causar um dano significativo quando os personagens estão em níveis muito altos com armas muito fortesNestes casoscomo o valor de ataque desses inimigos é muito menor que o valor de defesa dos personagens, o jogo recalcula dano efetivo do inimigo utilizando nível dos personagensfrequentemente causando danos acima de 10 pontos.
- +
-2) Ajusta ATK utilizando um valor gerado aleatoriamente. Esse ajuste +
-é 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 um valor gerado aleatoriamente. Esse ajuste +
-é feito de forma a garantir que o DEF ajustado permaneça pelo menos +
-1/4 do DEF original. +
- +
-(daqui pra frente, utilizam-se apenas os valores AJUSTADOS) +
- +
-5) Faz a conta DEF-ATK. +
- +
-6) Se ATK > DEF, o jogo pega a diferença subtrai do HP do personagem. +
- +
-7) Se (DEF-ATK) < 16o jogo gera outro numero aleatorio para o ATK +
-ajustado. Esse numero gerado vai ter no máximo o valor do nivel do +
-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 de Lacônia, Armadura de Diamante, Escudo de Lacônia. Se você consultar os status, será: +
-  +
-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 de 0 a 255 (no caso0% a 100%) +
-6) Inicializa output com zero +
-7) Soma valor 1/4 ORIG +
-8) Soma valor 1/2 ORIG (já temos 3/4 somados) +
-9) Soma o valor 1/4 ORIGmultiplicado 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.+
jogos/ps1/desconstruindo_ps1.txt · Última modificação: 2014/09/01 07:28 por kilgamma