Este repositório contém uma lista de entradas que irão vencer o Pokémon Platinum. Usando uma combinação de técnicas e simulações, o progresso no jogo é garantido. Não há manipulação de RNG envolvida, não são necessárias entradas de quadro perfeito e a sequência de entradas é estática e imutável, independentemente das ocorrências no jogo.
Você pode encontrar o código do simulador aqui
As entradas podem ser encontradas no diretório commands
. Cada arquivo corresponde a uma parte diferente do jogo, e cada um deles flui entre si de 1 a 9. Há também um arquivo auxiliar para alterar a memória do jogo para teste e um arquivo para registrar entradas durante o jogo.
Cada arquivo de comando contém uma lista de comandos com o formato [
, onde o primeiro valor é qual comando executar e o segundo é quantos quadros manter esse comando. Nos casos em que o comando é um conjunto de pressionamentos de botão,
indica quantas repetições daquele comando devem ser feitas.
Os comandos básicos são os seguintes:
Comando | Descrição |
---|---|
um | UM |
b | B |
uf | Acima |
df | Abaixo |
Se | Esquerda |
RF | Certo |
st | Começar |
x | X |
sim | S |
você | Acima + B |
banco de dados | Baixo + B |
Libra | Esquerda + B |
rb | Direita + B |
c | Espere |
Outros botões, como select, L e R, não são utilizados.
Nos arquivos de comando, comandos adicionais são usados para representar um conjunto desses pressionamentos de botão básicos. Por exemplo, para pressionar A 10 vezes, {'press_a', 10}
é usado como abreviação, em vez de 10 comandos seguidos para segurar o botão A por 60 quadros.
Cada arquivo também define até 12 comandos personalizados que realizam várias rotinas, como lidar com mensagens de memória, realizar ações de batalha padrão ou navegar em seções do jogo que devem ser repetidas.
Observe que os comandos l
, r
, u
e d
são abreviações para dar um passo em uma direção, e lf
, rf
, uf
e df
são os comandos para segurar um botão direcional por um certo número de quadros.
Em vez de escrever comandos manualmente, se quiser modificar a sequência ou criar uma nova, você pode usar o arquivo recordInputs
em conjunto com o emulador bizhawk para registrar as entradas feitas e depois produzi-las em um formato que pode ser usado em os roteiros.
Para gravar suas entradas, primeiro você deve limpar as teclas de atalho do controlador, ou seja, evitar que o emulador use suas entradas diretamente como comandos. Você pode fazer isso através de Config -> Controllers -> Misc -> Clear
. Você pode carregar novamente as teclas de atalho posteriormente com Misc -> Load Defaults
no mesmo menu.
Então você deve abrir o console lua através Tools -> Lua Console -> Script -> Open Script
, onde então você abre o script recordInputs.lua
. Assim que o script começar a ser executado, ele registrará suas entradas.
As teclas de atalho do botão estão listadas no arquivo recordInputs.lua
, mas as duas mais importantes são lshift
, que exibe a lista de comandos formatados quando você termina a gravação, e rshift
, que adiciona um comando de tempo de espera de 60 quadros. O gravador de entrada NÃO registra o tempo ocioso, o que significa que se você não adicionar os tempos de espera com rshift
, ele apenas executará os comandos rapidamente, um após o outro, sem interrupções.
Isso faz com que a lista de entradas de saída e o que você realmente fez ao tocar sejam diferentes. Pode ser fácil esquecer de adicionar os tempos de espera, o que causará problemas durante a reprodução. Mas como benefício, não há pressão para registrar as entradas em um cronômetro.
Outras teclas correspondem ao padrão do emulador, as teclas de seta para movimento, x
, z
, s
, a
para A
, B
, X
, Y
, e enter
para iniciar.
Pode haver alguma volatilidade com o controle de toque, que é uma entrada obrigatória logo no início do jogo. Para avançar, você deve tocar no meio da tela, acertando o centro de uma pokébola. Esta é uma entrada analógica não padrão e é indicada no código como touch_middle
. Isso ocorre apenas uma vez.
Há também uma chance de que as entradas não considerem algo que simplesmente não tenho conhecimento ou que não pensei em verificar. Esse erro humano está sempre presente, independentemente de quantas vezes eu verifiquei e verifiquei novamente a sequência em busca de problemas e bugs.
Pokémon usa um Gerador de Números Aleatórios Congruentes Lineares (LCRNG) para produzir a maioria de seus números aleatórios. Isso funciona criando uma sequência de números que parece aleatória o suficiente e, em seguida, percorrendo a sequência, um de cada vez, para produzir números "aleatórios".
Os jogos Pokémon da geração 4 são diferentes de seus antecessores porque não alternam entre números aleatórios, eles só usam um número aleatório quando necessário.
Por exemplo, em Ruby/Sapphire/Emerald, o jogo percorrerá a sequência de números aleatórios a cada dois quadros, mesmo que nada esteja acontecendo no jogo, e produzirá qualquer número que esteja atualmente quando o jogo solicitar um.
Em Diamond/Pearl/Platinum, o gerador de números aleatórios permanece estático até que o jogo solicite um valor. Ou seja, se você estiver em uma área vazia do jogo, o gerador de números aleatórios não fará nada.
Se você simular todos os resultados possíveis do gerador de números aleatórios para uma determinada ação, digamos, jogar uma moeda, nos jogos da Geração 4 esse resultado é determinístico (supondo que você esteja em uma área vazia ou "tranquila"), independentemente do seu tempo.
Nos jogos da Geração 3, esse resultado não é determinístico, depende do seu tempo. Ou seja, se você jogar a moeda agora, o resultado poderá ser diferente do que se você a jogasse 2 segundos depois.
Para nossos propósitos, esta qualidade dos jogos da Geração 4 faz com que mesmo que um jogador humano use esta lista de entradas para jogar, ela ainda funcionará corretamente, uma vez que um jogador humano não faria as entradas nos momentos exatos, e pressione os botões um pouco mais cedo ou um pouco mais tarde. Contanto que os botões não sejam pressionados muito cedo, você pode atrasá-los por um período de tempo indefinido, sem nenhum efeito no resultado do jogo (supondo que você, eventualmente, pressione os botões).
Usando este princípio, simular todas as 4 bilhões de sementes possíveis, ou posições iniciais, na sequência de números aleatórios do Pokémon Platinum nos permite prever o que acontecerá em todos os jogos possíveis. Por exemplo, jogar uma moeda 100 vezes tem um número determinístico de resultados. Ao verificar todos eles, podemos descobrir o pior/melhor cenário, que neste caso é uma divisão 80/20.
Para lançamento de moeda, esse processo se assemelha muito ao uso da matemática para determinar apenas nosso valor esperado usando estatísticas simples. Para coisas mais complicadas, como batalhas de Pokémon, torna-se muito mais difícil usar a matemática para determinar o resultado. É mais fácil simular todos os 4 bilhões de possibilidades do que calcular a probabilidade dada a chance de crítico, erro, jogadas de dano, AI rng, chances de efeitos secundários, etc.
Fazer isso nos dá uma ideia de quais estratégias vencem em todos os jogos possíveis e me permite derrotar diferentes treinadores com 100% de certeza, mesmo que matematicamente haja uma chance de falhar ou perder.
O resultado final é essa sequência de entradas, que deve vencer todos os jogos de platina do início ao fim sem nenhuma chance de falha, exceto entradas incorretas ou bugs.