A GAZETA DE ALGOL

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

Ferramentas do usuário

Ferramentas do site


jogos:ps1:desconstruindo_ps1

Essa é uma revisão anterior do documento!


Desconstruindo Phantasy Star I

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 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:

E-mail 1

Galera,

Depois de fazer alguns testes, achei algumas coisas que não estavam
claras no meu post anterior sobre o algoritmo de calculo dos danos nas
lutas. Vou detalhar melhor.

* A luta funciona no mecanismo de turnos. Quando você encontra um
inimigo, parte do código de inicialização cuida de desativar coisas da
luta anterior (parede mágica), força extra nos personagens e inimigos
e outras coisas. Além disso, o jogo gera um vetor de 12 entradas,
numeradas de 00 a 11, que servem para controlar a ordem de ataque.

* Quando o turno começa, uma das primeiras coisas que o jogo faz é
mudar a sequencia nesse vetor, embaralhando tudo. Assim pode ser que o
inimigo comece primeiro ou que um personagem comece primeiro.

* Regra de calculo quando um PERSONAGEM ataca:

1) Pega o ATK do personagem

2) Ajusta o 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 inimigo

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 e subtrai do HP do inimigo.

7) Se (DEF-ATK) < 16, o 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 inimigo.

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 monstro
defende.

9) Se o HP do inimigo ficar zerado, o monstro morre.

* Regra de calculo quando um INIMIGO ataca:

1) Pega o ATK do inimigo

2) Ajusta o 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 e subtrai do HP do personagem.

7) Se (DEF-ATK) < 16, o 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 caso, 0% a 100%)
6) Inicializa o output com zero
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.

jogos/ps1/desconstruindo_ps1.1394764578.txt.gz · Última modificação: 2014/03/13 19:36 por orakio

Ferramentas da página