L’été dernier, j’avais voulu écrire un truc sur Crash Bandicoot, mais c’était tellement creux et vide que j’ai pas réussi.

- Mortal, pas nostalgique

Dojobar
L'émission de radio déjantée qui revient toutes les deux semaines !

Émission s24e02 − Echos of Wisdom
Le 22 octobre 2024, par Mortal







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.

B-Movie

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

C

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.

Pan ! Dans les noix mojo !

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 :

C

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 :

C

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

Ils ont un peu abusé sur la bouteille…

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

C

En vidant la fée de la bouteille, la routine va procéder aux actions suivantes :

  • récupérer la zone mémoire correspondant au bouton appuyé (11A639) et y inscrire une bouteille vide (item 20, 0x14 en hexa) ;
  • récupérer la case de la bouteille dans l’inventaire. Pour cela, il suffit de décaler la zone mémoire de 3 (11A639 + 3 = 11A63C) et de récupérer la valeur (0x12 = 18) ;
  • récupérer l’adresse du début de l’inventaire 11A644, y ajouter la valeur précédente (18) et donc aller écrire une bouteille vide (toujours 0x14) dans l’emplacement mémoire 11A656.

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

Dojo Hebdo 588 : du 1er au 7 juillet 2024
Le 7 juillet 2024, par Gueseuch

Dojo Hebdo 587 : du 24 au 30 juin 2024
Le 30 juin 2024, par Gueseuch

Dojo Hebdo 586 : du 17 au 23 juin 2024
Le 23 juin 2024, par Gueseuch

Dojo Hebdo 585 : du 10 au 16 juin 2024
Le 16 juin 2024, par Gueseuch

Dojo Hebdo 584 : du 3 au 9 juin 2024
Le 9 juin 2024, par Gueseuch


Dojo Hebdo 583 : du 27 mai au 2 juin 2024
Le 1 juin 2024, par Gueseuch


Dojo Hebdo 582 : du 20 au 26 mai 2024
Le 26 mai 2024, par Gueseuch

Dojo Hebdo 581 : du 13 au 19 mai 2024
Le 19 mai 2024, par Gueseuch


Dojobar
L'émission de radio déjantée qui revient toutes les deux semaines !

Émission s24e02 − Echos of Wisdom
Le 22 octobre 2024, par Mortal