Bref bonjour à tous !
Aujourd'hui on va voir la void et ses spécificités, comment elle fonctionne, où on peut sauvegarder etc.
Tenez vous prêts, c'est parti.
Alors vous savez peut-être que la void, en plus d'afficher des localisations "aléatoires", génère un décalage par rapport à la localisation normale. Je m'explique :
On sait que les maps sont découpées en morceaux de 32x32.
Chacune de ces maps peuvent être assemblées à d'autre pour former une plus grande map.
L'exemple de Pokémontre S.A. :
Dans Pokémontre, la map est constituée d'un seul morceau de 32x32, cela représente une map.
Vous savez sans doute que la map se répète de façon oblique, comme c'est le cas pour Pokémontre :
Mais ce que vous ne savez pas, c'est que le décalage est en fait la map qui se répète vers la droite avec un bloc de décalage vers le haut à chaque répétition vers la droite.
Si vous avez bien suivi, vous avez deviné ce que ça donne pour une map de 2x2 :
La téléportation :
Maintenant que vous connaissez la base, il faut que je vous explique la téléportation trouvée par Effray :
Tout d'abord, la téléportation consiste à monter dans la void, sauvegarder à une localisation, reset, et redescendre.
Mais comment ça marche ?
Lorsque vous entrez dans la void, vous avez forcément une localisation de chargée : c'est ce qu'on appelle la centerpiece.
Cette centerpiece définit entre autres ce que vous allez trouver dans la void, et on peut toujours y revenir car c'est une localisation qui restera fixe.
Lorsque vous sauvegardez et resetez dans une localisation, le jeu charge la localisation dans laquelle vous avez sauvegardée en tant que centerpiece.
Ainsi, lorsque vous retournerez à l'endroit d'où vous êtes partis (le point d'entrée dans la void), vous trouverez la localisation dans laquelle vous avez sauvegardée.
Le risque de perte de sauvegarde
Par contre comme vous le savez, il existe dans la void des localisations qui ne fonctionnent pas, et qui peuvent faire crasher le jeu au rechargement de la partie et ainsi niquer votre sauvegarde.
Pour éviter cela, Effray a trouvé une technique : il suffit d'aller dans le pokédex et en ressortir, avant de sauvegarder.
Si le jeu a planté, vous avez évité une perte de sauvegarde. Sinon, vous pouvez sauvegarder, c'est safe !
Les maps/localisations
Maintenant on va rentrer dans un aspect plus technique du jeu, les maps.
On va prendre l'exemple de Sinnoh, qui est la plus grande map du jeu.
Cette map a un certain ID, attaché à une matrice de localisations et à une matrice de fragments de map de 32x32.
Les matrices de localisations et de map sont chargées entièrement dans la RAM de la DS.
La matrice à laquelle nous allons nous intéresser plus particulièrement est la matrice des localisations.
Je l'ai découverte tout à l'heure en direct dans une convo avec BUGLITCH et ImFrozz, mais elle "bouge" dans la RAM à chaque redémarrage du jeu.
La première fois que je l'ai trouvée, elle était à l'adresse 0x22900d2, mais elle tourne toujours par là.
Elle est assez simple à retrouver, du moins sur émulateur :
Allez dans n'importe quel bâtiment qui tient en une seule map de 32x32 (Pokémontre S.A. par exemple), faites une recherche pour la valeur 257 dans la RAM (2 octets / 16 bits)
Sortez et cherchez maintenant 7710, et la valeur que vous trouverez sera un des descripteurs de la matrice : la largeur et la hauteur de la map.
Vous n'avez qu'à multiplier ces deux valeurs entre elles pour savoir le nombre d'octets après ces deux valeurs qui correspondent à une localisation.
Le début de la matrice se trouve après les deux valeurs.
Il y a quand même quelque chose d'amusant dans tout ça !
Vous avez sans doute deviné qu'on peut calculer l'offset de la localisation actuelle en appliquant cette formule :
Localisation = offset_matrice + (largeur_matrice * map_y) + map_x
Où offset_matrice vaut le début de la matrice (après le descripteur largeur/hauteur), largeur_matrice la largeur de la map en sections de 32x32, map_x et map_y valent les coordonnées x et y de la section de map actuelle.
Si vous voulez une représentation plus parlante des descripteurs que j'ai trouvés, voici une structure en C :
Code : Tout sélectionner
struct map {
unsigned char map_width; // Largeur de la map
unsigned char map_height; // Hauteur de la map
unsigned short map_matrix_number; // ID de la matrice de map à charger (inutile en soi puisqu'elle est
// chargée plus loin)
unsigned char map_width2; // = map_width
unsigned char map_height2; // = map_height
unsigned short locations_matrix[map_width][map_height]; // Contient les IDs des localisations
unsigned char padding[]; // PADDING (environ 2700 - 6 - map_width * map_height (peut varier))
unsigned short map_matrix[map_width][map_height]; // Contient les IDs des maps affichées
};
0008 0101 8d00 0101 0000
Ce qui correspond à... tenez-vous bien... La suite de localisations que l'on obtient en montant dans Pokémontre S.A., c'est à dire :
Pokémontre S.A.
Pré Floraville
C. Com. Voilaroc
Pré Floraville
Zone mystère
/!\ SI VOUS TROUVEZ DES VALEURS COMME 0800 0101 008d 0101 0000, c'est que votre éditeur hexadécimal est réglé sur Little-Endian. Sur DesMuME, il est possible de régler l'observateur de RAM sur Big-Endian.
Mais souvenez-vous, cela paraît plutôt logique non ?
Car lorsqu'on monte, la coordonnée y diminue (c'est l'inverse de la normale, mais en informatique tout est géré comme ça, même votre écran !)
Ainsi il est possible de prévoir toutes les localisations que vous croiserez en montant dans Pokémontre S.A. !
Il suffit de regarder les valeurs à reculons !
En fait, lorsque vous montez dans Pokémontre SA, vous croisez des localisations en rapport avec des données présentes dans la RAM, par exemple si vous croisez une donnée du genre 01fe, vous aurez la Salle Originelle ! CECI N'ETAIT QU'UN EXEMPLE.
Si vous n'êtes pas trop bêtes, vous pourrez en déduire par exemple pourquoi Fake-Black-Sinnoh existe !
La sweet du topic
Si des idées de trucs à expliquer me viennent à l'esprit, j'éditerai le topic, n'hésitez pas à me poser des questions en réponse, j'y répondrai ou alors je complèterai le topic en fonction