Je m'attendais à ce que ça marche du 1er coup
- Mortal, en train de bricoler la console de mixage
Dojodirect
Des jeux de merde joués par des connards en direct !
L’historique du speed-run de The Legend of Zelda: Ocarina of Time (partie 5)
Où l’on va encore plus jouer avec des bits… C’est vraiment sale…
Reprenons notre Reverse Bottle Adventure où nous l’avions laissé… Nous avons vu la dernière fois que les items équipables sur les boutons C avaient une valeur et un emplacement bien précis dans la mémoire. Nous avons également vu que les autres objets du jeu (mélodies, épées, boucliers, etc) étaient souvent groupés par octet dans des adresses contigues.
Nous allons maintenant voir comment fonctionne les boutons qui sont affichés à l’écran et donner quelques exemples de fonctionnement.
Les boutons B, C-Gauche, C-Bas et C-Droite sur l’écran correspondent également àdes zones mémoires dans la console. En fait, il y a deux zones mémoires : une zone pour les items équipés (dans lesquels on retrouve les fameuses valeurs vues la dernière fois) que nous appellerons Item Memory Zone et une zone un peu particulière qui gère les décalages mémoire (offset) pour chaque objet équipé sur les boutons C par rapport à l’inventaire ; nous l’appellerons Offset Memory zone. Ça va ressembler à ça (le 80 en début d’adresses a été supprimé pour plus de lisibilité):
Pourquoi une Offset Memory Zone ? Elle permet de dessiner sur l’écran des objets un cadre autour des objets équipés et elle permet également de gérer le compteur de munitions des armes. Comment ? Nous allons donner un exemple pour bien comprendre comment elle fonctionne.
Imaginons que le joueur lance une noix mojo qui est assignée sur le bouton C-Bas.
Quand on appuie sur le bouton C-Bas, la console récupère l’adresse de l’item (en l’occurence 8011A63A) et en regardant la valeur en déduit qu’il faut lancer l’animation de la noix mojo :
Puis, elle va chercher l’emplacement dans l’inventaire de la noix mojo, en allant chercher la valeur dans 8011A63A+3 (=8011A63D) dans l’Offset Memory Zone. La façon dont la zone est organisée fait que c’est systématiquement l’adresse dans l’Item Memory Zone + 3 :
Elle tombe alors sur la case dans l’inventaire correspondant à la noix mojo. Il suffit alors d’aller calculer l’emplacement des munitions de la noix mojo dans l’inventaire en allant chercher la première adresse de l’inventaire (qui est connue) et en additionnant la valeur C-Bas dans la Offset Memory Zone (ici 1) pour obtenir l’emplacement, puis en additionnant 24 pour aller dans la zone mémoire qui gère les munitions. Ainsi, dans notre exemple, le jeu va soustraire 1 au nombre contenu dans l’adresse 8011A644+24+1=8011A65D. Au cas où tu te poserais la question, la raison pour laquelle on stocke un offset (décalage de mémoire) plutôt que l’adresse de l’objet directement est très simple : c’est encore une question d’optimisation. Stocker une adresse nécessite 4 octets, il aurait donc fallu 12 octets pour stocker l’adresse de chaque item sur les boutons C. Stocker un offset ne prend qu’un octet, cela permet donc d’économiser 9 octets.
C’est ce que l’on appelle dans le jargon, jouer avec des pointeurs… Et tout informaticien digne de ce nom vous dira que ça peut rapidement tourner très mal :)
Tu te rends bien compte que cette mécanique va être un peu différente pour les bouteilles. En effet, les bouteilles n’ont pas de munition, elles passent simplement d’un état à un autre. La routine qui gère les bouteilles est donc légèrement différente. Admettons que le joueur vide la première bouteille de l’inventaire (emplacement 18), l’état de la mémoire avant l’action est comme suit (le 80 au début des adresses a été supprimés pour plus de lisibilité) :
En vidant la fée de la bouteille, la routine va procéder aux actions suivantes :
Tant que tous les items se trouvent sur les boutons-C, tout va pour le mieux. Mais il existe un bogue amusant (le B Bottle Bug) qui permet d’équiper une bouteille sur le bouton B, à la place de l’épée ! La manipulation est assez complexe à réaliser, je ne la détaillerai donc pas ici.
Maintenant si l’on refait tourner notre petite routine, on se rend compte en réalité que l’on ne va pas écrire une bouteille (vide, avec une fée, du lait, etc) au bon endroit dans l’inventaire mais que l’on va l’écrire à l’endroit qui correspond à la valeur de l’item sur le bouton C-Droit !
Pour les items de base, ayant une valeur très basse (inférieur à 40), ce n’est pas très intéressant : ça ne fait que remplacer des items de l’inventaire par des bouteilles ou changer la quantité de munitions. Par contre, pour les items ayant une grande valeur numérique, cela commence à devenir beaucoup plus marrant car on peut aller « écrire une bouteille » dans une zone mémoire qui n’est absolument pas prévu pour ça !
C’est ainsi qu’en utilisant l’épée cassée de la quête de l’épée Biggoron (0x33, 51 en décimal) et en la plaçant sur le bouton C-Droit, on peut aller écrire l’octet suivant 00011101 (bouteille avec insecte) dans la case mémoire 11A677 qui correspond… aux médaillons ! Or il se trouve que le quatrième et cinquième bit correspondent exactement au médaillon de l’esprit et de l’ombre.
Le speed-run d’Ocarina of Time, version 2011 a donc consisté à faire le plus rapidement possible la quête de l’épée Biggoron pour « forger » véritablement les deux médaillons nécessaires à finir le jeu. Cela nous a donc mené vers un temps de jeu d’environ 50 minutes. Mais bien sûr, ce n’est toujours pas assez !
Par Mortal
Le 24 septembre 2012 | Catégories : Editos
Je le couperai au montage…Voir les articles de Mortal
A voir également
Les trucs qu'on a rédigés avec nos petits doigts potelés
Dojodirect
Des jeux de merde joués par des connards en direct !