Ce référentiel contient une liste d'entrées qui battront Pokemon Platinum. Grâce à une combinaison de techniques et de simulations, la progression dans le jeu est garantie. Aucune manipulation RNG n'est impliquée, aucune entrée parfaite n'est requise et la séquence d'entrées est statique et inchangée quelles que soient les occurrences du jeu.
Vous pouvez trouver le code du simulateur ici
Les entrées se trouvent dans le répertoire commands
. Chaque fichier correspond à une partie différente du jeu, et ils s'enchaînent les uns dans les autres de 1 à 9. Il existe également un fichier d'aide pour modifier la mémoire du jeu à des fins de test, et un fichier pour enregistrer les entrées pendant la lecture.
Chaque fichier de commandes contient une liste de commandes au format [
, où la première valeur est la commande à exécuter et la seconde est le nombre d'images pour lesquelles conserver cette commande. Dans les cas où la commande est un ensemble de pressions sur des boutons,
indique le nombre de répétitions de cette commande à effectuer.
Les commandes de base sont les suivantes :
Commande | Description |
---|---|
un | UN |
b | B |
ouf | En haut |
df | Vers le bas |
si | Gauche |
RF | Droite |
St | Commencer |
x | X |
oui | Oui |
ub | Haut + B |
base de données | Bas + B |
kg | Gauche + B |
rb | Droite + B |
w | Attendez |
D'autres boutons, comme Select, L et R, sont inutilisés.
Dans les fichiers de commandes, des commandes supplémentaires sont utilisées pour représenter un ensemble de ces pressions de boutons de base. Par exemple, pour appuyer 10 fois sur A, {'press_a', 10}
est utilisé comme raccourci, plutôt que 10 commandes consécutives pour maintenir le bouton A enfoncé pendant 60 images.
Chaque fichier définit également jusqu'à 12 commandes personnalisées qui effectuent diverses routines telles que gérer le courrier mémoire, effectuer des actions de combat standard ou parcourir les sections du jeu qui doivent être répétées.
Notez que les commandes l
, r
, u
et d
sont des raccourcis pour faire un pas dans une direction, et lf
, rf
, uf
et df
sont les commandes permettant de maintenir un bouton directionnel pendant un certain nombre d'images.
Plutôt que d'écrire des commandes à la main, si vous souhaitez modifier la séquence ou en créer une nouvelle, vous pouvez utiliser le fichier recordInputs
en conjonction avec l'émulateur bizhawk pour enregistrer les entrées que vous effectuez, puis les sortir dans un format qui peut être utilisé dans les scripts.
Pour enregistrer vos entrées, vous devez d'abord effacer les raccourcis clavier du contrôleur, c'est-à-dire empêcher l'émulateur d'utiliser directement vos entrées comme commandes. Vous pouvez le faire via Config -> Controllers -> Misc -> Clear
. Vous pouvez recharger les raccourcis clavier plus tard avec Misc -> Load Defaults
dans le même menu.
Ensuite, vous devez ouvrir la console Lua via Tools -> Lua Console -> Script -> Open Script
, où vous ouvrez ensuite le script recordInputs.lua
. Une fois le script lancé, il enregistrera vos entrées.
Les raccourcis clavier sont répertoriés dans le fichier recordInputs.lua
, mais les deux plus importants sont le lshift
, qui affiche la liste des commandes formatées lorsque vous avez terminé l'enregistrement, et rshift
, qui ajoute une commande de temps d'attente de 60 images. L'enregistreur d'entrée n'enregistre PAS le temps d'inactivité, ce qui signifie que si vous n'ajoutez pas les temps d'attente avec rshift
, il exécutera simplement les commandes rapidement les unes après les autres, sans interruption.
Cela fait que la liste de sortie des entrées et ce que vous avez réellement fait pendant la lecture sont différents. Il peut être facile d’oublier d’ajouter les temps d’attente, ce qui entraînera des problèmes lors de la lecture. Mais l’avantage est qu’il n’y a aucune pression pour enregistrer les entrées sur une minuterie.
Les autres touches correspondent à celles par défaut de l'émulateur, les touches fléchées pour le mouvement, x
, z
, s
, a
pour A
, B
, X
, Y
et enter
pour démarrer.
Il peut y avoir une certaine volatilité avec le contrôle tactile, qui est une entrée obligatoire au tout début du jeu. Pour avancer, vous devez appuyer sur le milieu de l'écran, en frappant le centre d'une pokeball. Il s'agit d'une entrée analogique non standard et elle est indiquée dans le code par touch_middle
. Cela ne se produit qu'une seule fois.
Il est également possible que les entrées ne tiennent pas compte de quelque chose que j'ignore tout simplement ou que je n'ai pas pensé à vérifier. Cette erreur humaine est toujours présente, quel que soit le nombre de fois où j'ai vérifié et revérifié la séquence pour détecter les problèmes et les bugs.
Pokémon utilise un générateur de nombres aléatoires congruents linéaires (LCRNG) pour produire la plupart de ses nombres aléatoires. Cela fonctionne en créant une séquence de nombres qui semble suffisamment aléatoire, puis en parcourant la séquence un par un pour produire des nombres « aléatoires ».
Les jeux Pokémon de génération 4 sont différents de leurs prédécesseurs dans le sens où ils ne parcourent pas de nombres aléatoires, ils n'utilisent un nombre aléatoire que lorsque cela est nécessaire.
Par exemple, dans Ruby/Sapphire/Emerald, le jeu parcourra la séquence de nombres aléatoires toutes les deux images, même si rien ne se passe dans le jeu, et produira le nombre actuellement affiché lorsque le jeu en demandera un.
Dans Diamond/Pearl/Platinum, le générateur de nombres aléatoires reste statique jusqu'à ce que le jeu demande une valeur. Cela signifie que si vous vous trouvez dans une zone vide du jeu, le générateur de nombres aléatoires ne fera rien.
Si vous simulez tous les résultats possibles du générateur de nombres aléatoires pour une action donnée, par exemple lancer une pièce de monnaie, dans les jeux Gen 4, ce résultat est déterministe (en supposant que vous soyez dans une zone vide ou « calme »), quel que soit votre timing.
Dans les jeux Gen 3, ce résultat n'est pas déterministe, cela dépend de votre timing. Cela signifie que si vous lancez la pièce maintenant, le résultat pourrait être différent de celui si vous la jetiez 2 secondes plus tard.
Pour nos besoins, cette qualité des jeux Gen 4 fait que même si un joueur humain utilise cette liste d'entrées pour jouer au jeu, celui-ci fonctionnera toujours correctement, puisqu'un joueur humain ne ferait pas les entrées à des moments précis, et soit appuyer sur les boutons un peu plus tôt, soit un peu tard. Tant que les boutons ne sont pas enfoncés trop tôt, vous pouvez les retarder pendant une durée indéfinie, sans aucun effet sur le résultat du jeu (en supposant que vous finissiez par appuyer sur les boutons).
En utilisant ce principe, simuler les 4 milliards de graines possibles, ou positions de départ, sur la séquence de nombres aléatoires de Pokémon Platine nous permet de prédire ce qui se passera dans tous les jeux possibles. Par exemple, lancer une pièce 100 fois entraîne un nombre déterministe de résultats. En les vérifiant tous, nous pouvons découvrir le pire/meilleur scénario, qui dans ce cas est une répartition 80/20.
Pour le tirage au sort, ce processus ressemble beaucoup à l'utilisation des mathématiques pour simplement déterminer notre valeur attendue à l'aide de statistiques simples. Pour des choses plus compliquées, comme les batailles Pokémon, il devient beaucoup plus difficile d'utiliser les mathématiques pour déterminer le résultat. Il est plus facile de simuler les 4 milliards de possibilités que de calculer la probabilité étant donné la chance de critiquer, de rater, les jets de dégâts, l'IA rng, les chances d'effet secondaire, etc.
Cela nous donne un aperçu des stratégies gagnantes dans chaque jeu possible et me permet de vaincre différents entraîneurs avec 100 % de certitude, même si mathématiquement, il y aurait une chance d'échouer ou de perdre.
Le résultat final est cette séquence de saisies, qui devrait battre chaque jeu de platine du début à la fin sans aucun risque d'échec, sauf erreurs de saisie ou bugs.