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
jogos:ps1:desconstruindo_ps1 [2014/03/13 19:36] – criada orakiojogos:ps1:desconstruindo_ps1 [2014/09/01 07:28] (atual) 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 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 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.
  
-4) Ajusta o DEF utilizando um valor gerado aleatoriamente. Esse ajuste +Metade dos números dessa faixa são pares e 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 gerador apresentar uma tendência de produzir mais números pares do que ímpares por exemplo, esse percentual não será 50%.
-é feito de forma garantir que o DEF ajustado permaneça pelo menos +
-1/4 do DEF original.+
  
-(daqui pra frenteutilizam-se apenas os valores AJUSTADOS)+Para exemplificar tudo issoconsidere 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 ataquenunca sendo inferior a 3/4 do original; 
-ajustado. Esse numero gerado vai ter no máximo valor do nivel do +  * Um valor positivo de diferença entre ATK e DEF significa que valor efetivo de DEF é maior que o ATK, ativando a função que recalcula dano em função do nível do personagem
-personagem, nunca sendo maior que isso, mas podendo ser menor (até +  * A ordem de ataque é aleatóriaconforme já explicado; 
-zero)Então jogo pega esse novo valor subtrai do HP do inimigo.+  * 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 personagemNessa batalha nível de todos os personagems é o máximo (30); 
 +  * Valores negativos de diferença entre ATK DEF resultam em um dano efetivo direto igual ao valor da diferença, sendo subtraído do HP do personagem ou inimigo.
  
-8) Se (DEF-ATK>= 16, o jogo verifica se diferença é par ou impar. +Quando a mágica HELP (MYAUé utilizada, o valor efetivo de ATK do personagem que recebeu magia é cerca de 50% mais elevado que valor baseDe 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
-Se for ímpar, jogo faz igual o passo 7Se for par, o monstro +
-defende.+
  
-9) Se o HP do inimigo ficar zeradoo monstro morre.+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 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:
  
-1Pega 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)jogo recalculou o dano baseado no nível do NOAH e gerou um novo dano efetivo com o valor 23 em vez de zero.
  
-2) Ajusta o ATK utilizando um valor gerado aleatoriamente. Esse ajuste +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.
-é feito de forma a garantir que o ATK ajustado permaneça pelo menos +
-1/4 do ATK original. +
- +
-3) Pega 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.1394764578.txt.gz · Última modificação: 2014/03/13 19:36 por orakio