[TUTO] [GBA] Les overworlds et les palettes en hexadécimal, tout est dévoilé !

Pages: [1]

Mickey`

  • Membre
  • 2746 posts
22 mai 2012, 18:46
Vous êtes prêts ? Alors là on va s'attaquer à du gros, si vous débutez, je vous conseille de passer votre chemin ;) (Bien que je vais expliquer au maximum pour que vous compreniez ce que vous faites, et pour que ça ne vous paraisse pas trop compliqué, voire pas du tout !)

On va donc apprendre à manier les Overwolrds via l'hexadécimal !
Vous connaissez sûrement OW Editor ou bien NSE... L'hexadécimal permet de faire des choses beaucoup plus puissantes, comme par exemple agrandir des OW (ce qui n'est pas possible via ces éditeurs d'OW), ou même, ce que beaucoup de personnes cherchent, d'ajouter des OW et des palettes pour OW à l'infinie !

Maintenant, tout ça peut être très simple une fois qu'on a compris le principe... mais au départ c'est pas simple... On va y aller pas à pas, à travers un loooooong programme, en voici le sommaire...



Sommaire

I. Etude préalable des OWs
     Etude de la composition d'un sprite
     Qu'est-ce qu'un pointeur ?
     Qu'est-ce que le sprite pointeur ?
     La taille d'un sprite
     Qu'est-ce qu'une palette ?
     Fonctionnement de tous les pointeurs d'un sprite

II. Premières modifications : agrandir un sprite
     Etude sur l'agrandissement
     Modifier la composition du sprite
     Faire le dessin du nouveau sprite
     Modifier le pointeur vers l'image

III. Pousser bien plus loin : ajouter des OWs !
     Déplacement de la table des pointeurs
     Repointer la table des pointeurs
     Composer son nouveau sprite
     Créer une suite de la SpriteBank
     Ajouter un pointeur vers la suite de la SpriteBank
     Créer le sprite pointer
     Repointer une donnée importante

IV. Editer un OW ajouté
     Utilisation du logiciel NSE

V. Créons maintenant de nouvelles palettes
     Repointer la table des palettes
     Créer une nouvelle palette l'ajouter à la table des palettes
     Utiliser la palette créée dans un sprite

VI. Annexes
     Rappel du vocabulaire
     Rappel des offsets : Rouge Feu FR


Je pense que quand nous aurons vu tout ça, vous aurez mal à la tête compris le fonctionnement des OWs dans les versions GBA, et comment les exploiter au maximum ;)

Attention, je vais utiliser la version Rouge Feu FR pour le tuto, les offsets seront totalement différents selon la version !
Les offsets listés tout au long du tuto ne seront donc valables que pour Rouge Feu FR.


Allons-y... !



Matériel nécessaire

Vous aurez besoin :
     - Bloc-notes
     - Overwolrd Editor
     - Hex Editor (ou un autre éditeur hexadécimal)
     - NSE



I. Etude préalable des OWs

Etude de la composition d'un sprite

Pour manier un OW, faut savoir quoi manier. On va le découvrir ensemble !

Bien, après avoir téléchargé Overworld Editor, ouvrez le dossier dans lequel vous l'avez placé, et ouvrez le fichier "Sprites.ini" (avec le Bloc-notes).

Vous voyez différents offsets pour chaque version.
Je m'intéressse à ma version, BPRF, et voici sa partie correspondante :

[BPRF]
Name                 = Pokémon Rouge Feu (Français)
SpriteBank           = &H39DFA0
SpritePaletteHeaders = &H39F548
SpriteCount          = 153

Les deux lignes qui vont nous intéresser dans ce tuto sont "SpriteBank" et "SpritePaletteHeaders".

Pour le moment, occupons-nous du SpriteBank.

Ouvrez votre ROM avec Hex Editor, et allez à cet offset du SpriteBank : 39DFA0

:o :o :o

Oui, ça fait peur au premier reegard... mais en réalité, pas tellement !

Bien, vous avez là la composition de tous les sprites existants dans le jeu.

Un sprite fait 36 octets. On va donc sélectionner 36 octets à partir de cet offset. Voici ce que nous optenons :

FFFF001102110002100020001001000000DB39088CDB390860D8390890A4390808C12208
Vous avez ici un sprite, le premier : celui du joueur.

Nous allons le décomposer :

FFFF -------- Starter Bytes
00 ---------- Numéro de la palette
11 02 11     
0002
10 ---------- Width
00
20 ---------- Height
00
10 01 0000
00DB3908 ---- Pointer 1
8CDB3908 ---- Pointer 2
60D83908 ---- Pointer 3
90A43908 ---- Sprite pointer
08C12208 ---- Pointer 4

Pour le moment, on va s'intéresser seulement à ce que j'ai défini.

FFFF : Starter Bytes ; Vous trouvez ces deux octets ("FF", "FF") au début de chaque sprite. Quand vous remarquez ceci, c'est que débute un nouveau sprite.

00 : Numéro de la palette ; Pas trop difficile, c'est le numéro de la palette utilisée par le sprite. Je pense que vous savez ce qu'est une palette, si ce n'est pas le cas je l'explique un peu plus tard dans le tuto, vous comprendrez, c'est très simple ;)

10 : Widht ; Que je vais appeler "Largeur". C'est la largeur de votre sprite.
20 : Height ; Que j'appellerai "Hauteur". C'est la hauteur de votre sprite.
   ~~> Ici, votre sprite fait $10*$20 (hexa) ce qui donne 16px*32px.

00DB3908 : Pointer 1 ; On ne va pas y toucher dans ce tuto, notez seulement que les 4 sont des pointeurs. Qu'est-ce qu'un pointeur ? Si vous ne savez pas, c'est expliqué juste après ! ;)

90A43908 : Sprite pointer : Ce pointeur là, lui, est très important. Il pointe vers le sprite pointeur, j'expliquerai plus en détail tout à l'heure.

Bien, nous avons fini d'étudier la composition d'un sprite. À noter que chaque sprite possède sa propre composition, avec des données différentes très souvent. (mais pas toujours ! ;))


Qu'est-ce qu'un pointeur ?

Petite parenthèse, ça ne touche pas forcément aux OWs, mais c'est très important en hexadécimal.

Un pointeur, comme son nom l'indique, pointe, envoie vers un offset précis.

Un pointeur se présente toujours sous cette forme :
    ZZ YY XX 08
ZZ YY XX est l'offset, renversé. On y ajoute ensuite "08".

Comment renverser un offset ? C'est simple :
XX YY ZZ devient ZZYYXX ~~> Il faut simplement échanger le premier et le troisième octet.

Un exemple : Le pointeur vers l'offset 78D6FC serait :

78D6FC -> 78 D6 FC -> FC D6 78 -> FCD678 -> FCD67808


Qu'est-ce que le sprite pointer ?

Petit rappel, c'est l'avant-dernier pointeur dans la composition de notre sprite.

Il pointe vers offset (car c'est un pointeur ;)), appelé l'offset du sprite.

À cet offset se trouve un autre pointeur, ainsi que d'autres données.
Le pointeur pointe cette fois-ci (ouf, c'est le dernier pointeur de la liste !) vers l'image du sprite, ce que vous voyez InGame quoi.

Bien, je prends mon sprite pointer : 90A43908 -> 90 A4 39 -> 39A490
On va donc à l'offset 39A490, et on a ceci :

585F350800010000 5860350800010000
5861350800010000 5862350800010000
5863350800010000 5864350800010000
5865350800010000 5866350800010000
5867350800010000 586B350800010000
586C350800010000 586D350800010000
586E350800010000 586F350800010000
5870350800010000 5871350800010000
5872350800010000 5873350800010000
5874350800010000 5875350800010000
98C3350800020000 98C5350800020000
98C7350800020000 98C9350800020000
98CB350800020000 98CD350800020000
98CF350800020000 98D1350800020000
98D3350800020000 5876350800010000
5877350800010000 5878350800010000
5879350800010000 587A350800010000
587B350800010000 587C350800010000
587D350800010000 587E350800010000
5882350800010000 5883350800010000

(Il y en a bien plus, bien sûr)
Bien, joli, mais c'est quoi ? C'est tous les pointeurs vers toutes les images des srites. Je n'en ai pris qu'un extrait. Chaque groupe d'octets pointe vers une image de sprite.

Etudions-en un de plus prêt : 585F350800010000

Si on décortique encore, on peut observer ceci :

585F3508 0001 0000

585F3508 : Pointeur vers l'image (si on retourne l'offset, l'image se trouve donc à l'offset 355F58)
0001 : Des données sur la taille
0000 : On n'y touche pas

Pour les données sur la taille, il faut faire un petit calcul pour le trouver :

Largeur x Hauteur / 2 ; Puis on inverse (en hexadécimal, si on veut dire XXYY, il faut en réalité écrire YYXX)

Dans mon cas :
16 x 32 = 512
512 = $200
$200 / 2 = $100 = $0100
$0100 ~~> $0001, d'où le "0001" présent dans le sprite pointer.

Si on regarde, notre sprite pointeur ici nous amène à l'offset 355F58, voici en exclu l'image de votre joueur :

00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
0000464600F09999009F9999F09F99B1
4F9FB91CF0AF11CB4FAFCB1B4FAF1A99
4646000099990F009999F90FC199F9F4
CC91F90F43CCFAF4CC14FAF499ACFA88
4FAF9A99F084A899804FF3888F442326
F04F342800F0443300004F6800F0C184
99A9F2F8998A4F0F8638F4F4F2324FFF
4233F40033F40F0086F40000C8B40F00
00644B1CF032F6C1F0227FA800FF6F07
00007FF000F0090F00F01E0F0000FF00
411446001C4F230F6FF8220F07F0FF00
0FF60000F0970F00F0E10F0000FF0000

Aller, on est contents ! Vous inquiétez pas, on n'aura pas besoin de faire notre image via l'hexadécimal.
Bien que ce ne soit pas difficile (chaque octet correspond à un numéro sur la palette, autrement dit pour chaque pixel on donne une couleur, les 256 octets mis à la suite donnent l'image finale), ce serait très long, donc on fera ça avec des logiciels ;)


La taille d'un sprite

Je vais passer assez vite sur cette partie, car il n'y a pas grand chose à dire, et j'y reviendrai plus tard.

On notera deux endroits où l'on s'occupe de la taille ; rappelez-vous, on les a déjà vus !

Oui, on a déjà parlé de la taille dans la composition du sprite, et dans le sprite pointer.

Je ne vais pas me répéter, je vous avertis simplement de ne pas y toucher, car en modifiant seulement la taille, vos sprites seraient... bizarres !

Nous verrons ça tout à l'heure dans l'exercice "Agrandissement d'un OW", on fera tout ça ensemble.


Qu'est-ce qu'une palette ?

C'est presque aussi important que l'OW lui-même, en fait, c'est quelque chose qui permet de lui donner des couleurs. Comme une palette de peinture par exemple, c'est exactement le même principe.

Une palette peut contenir 16 ou 256 couleurs. Malheureusement, les palettes d'OWs ne contiennent que 16 couleurs.

16 couleurs, mais une est réservée pour la transparence du sprite (la 1ère sur votre palette), donc on ne peut utiliser en réalité que 15 couleurs par OW.

Retournons dans la composition de notre sprite :

FFFF001102110002100020001001000000DB39088CDB390860D8390890A4390808C12208

Le "00" mis en évidence est le numéro de la palette utilisé par le sprite. Donc, on en déduit que le sprite du joueur (celui que j'ai utilisé pour l'exemple) utilise la palette numéro 0 du jeu.

Mais où sont les palettes dans le jeu ?

Rouvrons notre fichier ini :

[BPRF]
Name                 = Pokémon Rouge Feu (Français)
SpriteBank           = &H39DFA0
SpritePaletteHeaders = &H39F548
SpriteCount          = 153

SpritePaletteHeaders = &H39F548

Allons à cet offset, nous allons sélectionner la table des palettes.

Une palette se compose ainsi :

XX XX XX 08 YY 11 00 00
XX XX XX est l'offset renversé, accompagné du 08, c'est... oui, un pointeur ! (cf. partie "Pointeurs").
YY, c'est le numéro de la palette vers laquelle le pointeur amène.
Il y a toujours 11 00 00 derrière.

À noter que la table se termine par 00 00 00 00 00 00 00 00.

Les pointeurs vers les palettes elles-même font donc 8 octets.
Il y existe dans ce jeu 18 palettes, plus la palette "vide", "00 00 00 00 00 00 00 00".

   18*8 + 8
= 144 + 8
= 152

Nous allons donc sélectionner 152 à partie de l'offset 39F548.

187C360803110000 387C360804110000
587C360805110000 787C360806110000
987C360807110000 B87C360808110000
D87C360809110000 F87C36080A110000
585D350800110000 588D350801110000
788D350802110000 F82339080B110000
182439080C110000 585D350810110000
588D350811110000 98F2380813110000
D8FE380815110000 B8F6380814110000
0000000000000000

Voilà, nous avons extrait la table des pointeurs vers la palettes ! On s'en servira pour créer de nouvelles palettes plus tard.

Prenons le premier pointeur : 187C360803110000

187C3608 -> 18 7C 36 -> 367C18
Allons à cet offset.

Dans une palette, il faut deux octets par couleur, et il y a 16 couleurs dans une palette.
16*2 = 32, nous sélectionnons donc 32 octets.

0E53 5F5B FE4A 5B3A 0F21 7F27 BA12 9001
3476 4D5D E830 DD21 151D C918 FF7F 0000

Voici notre palette. Si nous regardons la palette 3 (celle que nous avons sélectionnée) dans NSE, voici ce que nous obtenons :



Ca correspond avec le code que nous avons sélectionné !

Vous pouvez éditer les palettes via l'hexadécimal comme ceci.


Fonctionnement de tous les pointeurs d'un sprite

Partie également très courte. Je tiens juste à vous dire de ne pas toucher aux 4 Pointeurs autres que le sprite pointer dans la composition d'un sprite. Ils changent en fonction de la taille, donc pour le moment on n'y touche pas.


Voilà, j'ai fait une assez grosse partie d'étude seulement, sans indiquer comment faire de changements, pour pouvoir dégrossir la chose.

Si vous avez tout suivi et compris tout ça, le reste sera beaucoup plus simple. Passons maintenant aux choses sérieuses ! :D



II. Premières modifications : agrandir un sprite


Etude sur l'agrandissement

Pour faire ces recherches, il m'a d'abord fallu réfléchir ; vous allez en faire de même, il faut comprendre ce que vous faites.
Sachez que si l'on réfléchit avant d'agir, l'hexa n'est qu'une suite logique.

Maintenant, vous connaissez les bases grâce à notre étude sur les Ows. Nous allons donc réfléchir à partir de là !

De quoi ai-je besoin ?
"Je dois agrandir mon sprite"
"Pour ça, je dois modifier ses données de taille"
"Je dois faire des dessins plus grands"
"Je dois donc repointer les nouveaux dessins de mon sprite"

Et bien voilà, on réfléchie un peu, et on a nos étapes !
     Modifier la composition du sprite
     Modifier le pointeur vers l'image
     Faire le dessin du nouveau sprite

Le plus simple est à faire ! ;)


Modifier la composition du sprite

La composition, mais qu'est-ce que c'est ? Beh si vous savez pas, relisez le grand I ! :D

Je veux par exemple modifier la taille de mon sprite n°20.
Je vais à l'offset de sa composition : 39E1E0 (cet offset peut être trouvé via NSE ou OW Editor, il correspond au "Sprite Offset")

Je sélectionne les 36 octets de sa composition :

FFFF0511FF110001100020001401000000DB39088CDB390858D7390860AB390808C12208

Si vous vous rappelez bien, ce que j'ai mis en gras, c'est la taille de mon sprite.
Maintenant, je veux que ce sprite ne fasse plus 16*32px, mais qu'il soit un carré de 32*32px.

Je vais remplacer le "1000" par "2000". Ce qui me donne :

FFFF0511FF110001200020001401000000DB39088CDB390858D7390860AB390808C12208

Je colle ceci au bon emplacement dans Hex Editor, puis je regarde mon sprite avec NSE...



Vous pouvez le voir, deux frames sont mélangées ! Cela vient du fait que la taille dans la composition ne correspond pas au dessin. Un petit schéma pour expliquer le problème :



La partie rouge représente la première frame, la bleu la deuxième.
La partie verte montre l'agrandissement de la première frame, qui déborde donc sur la deuxième, ce qui explique que les deux se retrouvent mélangées.

On va corriger ça.

Prenez la composition de votre sprite, et recherchez le sprite pointeur :

FFFF0511FF110001200020001401000000DB39088CDB390858D7390860AB390808C12208

Je le renverse : 60AB3908 -> 60 AB 39 -> 39AB60
Je vais donc à l'offset 39AB60.

Je me retrouve au milieu de tous les pointeurs vers les images des sprites !

Petit rappel, un pointeur vers le dessin d'un sprite est composé du pointeur lui-même, mais aussi de données sur la taille ainsi que 4 zéros.

Un autre petit rappel :

Citer
Largeur x Hauteur / 2 ; Puis on inverse (en hexadécimal, si on veut dire XXYY, il faut en réalité écrire YYXX)

Dans mon nouveau cas :
32 x 32 = 1024
1024 = $400
$400 / 2 = $200 = $0200
$0200 ~~> $0002

Je vais donc remplacer les données sur la taille (auparavant "0001") par "0002".

Maintenant, il me faut aussi repointer le pointeur vers le dessin de la frame, car il est plus grand et nécessite plus de place ! Vous pouvez calculer la place nécessaire pour votre sprite entier comme ceci :

(Largeur x Hauteur) / 2 x Nombre de frames

Je vais modifier pour l'exemple trois frames.

(32 x 32) / 2 x 3 = 1536

J'ai besoin de 1536 octets. Je cherche avec FSF ou directement via Hex Editor, je vais prendre un offset simple : C00000.
Maintenant que j'ai mon nouvel offset, je le mets sous forme de pointeur :
C00000 -> C0 00 00 -> 0000C008

Je remplace mon pointeur dans le pointeur vers le dessin.

À savoir : Chaque frame est mise à la suite. Ainsi, le premier pointeur pointe vers la première frame. Si je n'ai qu'un pointeur, le sprite n'aura qu'un seul frame. Si j'en ai deux, il possédera deux frames, et ainsi de suite.
J'ai dit que je voulais modifier 3 frames, je répète donc ces deux étapes pour chaque frame à remplacer.

Une fois que j'ai modifié les trois pointeurs, j'obtiens ceci :



Enfin, revenez à votre composition de sprite. Vous vous souvenez les trois pointeurs non définis exprimés dans la partie I, concernant la taille des sprites ? Beh on va s'en servir maintenant.

Je n'ai pas d'informations précises à vous donner !
Il faut que vous preniez la composition d'un sprite faisant la même taille que celle désirée. Ensuite, recopiez les trois pointeurs au bon emplacement dans la composition du sprite modifié. (Je ne donne pas de précision, car je n'en sais pas plus d'après mes recherches)

Faire le dessin du nouveau sprite

Maintenant, rouvrez NSE et votre ROM. Allez au sprite que vous avez agrandi, et pour les trois premières frames (dans mon cas), vous aurez ceci :



Vous n'avez plus qu'à dessiner ou importer votre sprite, il pourra être à la taille 32*32 px ! :D

Résultat InGame dans mon exemple :



À noter aussi (du moins d'après ce que j'ai remarqué, je n'en suis pas sûr), il faut modifier les pointeurs de toutes les frames, sinon l'image de sprite InGame bug par moment !



III. Pousser bien plus loin : ajouter des OWs !

C'est ce que sûrement la plupart d'entre vous attend ! :D

Ca ne diffère pas tellement de la partie "Agrandir un Ow", seulement il y a plus d'étapes, mais le principe est le même.


Déplacement de la table des pointeurs

Je vous évite la partie Réflexion, on passe directement à la pratique ! (Même s'il m'a fallu beeeeeaaaauuucoup réfléchir dans cette partie avant d'y arriver !)

Allez à cet offset : 39A1A0
C'est l'offset de la table contenant les pointeurs vers tous les sprites. Cet offset est pour Rouge Feu ! Pour les autres versions, je n'ai pas cherché, va falloir chercher par vous-même...

Rappel, un pointeur est sous la forme : XXXXXX08, soit 4 octets.
Pokémon Version Rouge Feu possède 152 sprites.
4*152 = 608 octets
La table des pointeurs fait donc 608 octets.

Faites Edition ~~> Marquer : De 39A1A0 à 39A400 (39A1A0 + 608)
Vous venez de sélectionner toute la table. Copiez-la, puis collez-là à un autre endroit dans la ROM. Je ne m'embête pas, je la colle à l'offset B20000.


Repointer la table des pointeurs

Bien, maintenant, vous avez déplacé votre table, et alors ? Il faudrait peut-être dire au jeu de venir chercher les données au nouvel offset, non ?

L'ancien offset était 39A1A0, donc son pointeur : A0A13908
Recherchez ça dans Hex Editor, vous allez arriver à cet offset : 5F3B4

Le nouvel offset est B20000, donc son pointeur : 0000B208
Remplacez l'ancien pointeur par le nouveau.




Composer son nouveau sprite

On va faire la composition de notre sprite ! Je vous conseille de prendre une base, un sprite de la même taille que le votre.
Je vais faire un sprite 16*32, comme le joueur. Je prends donc comme exemple la composition de mon premier sprite.

FFFF001102110002100020001001000000DB39088CDB390860D8390890A4390808C12208
Comme toutes les données sur la taille sont déjà réglées, nous n'avons plus énormément de choses à faire.

Nous allons choisir le numéro de palette qu'aura notre sprite. Je décide qu'il aura la palette 6.

Je modifie donc les données de la palette. Nous allons aussi modifier le sprite pointeur. Choisissez votre offset, pour moi, ce sera 850000, renversé : 00008508 !

Maintenant, ouvrez NSE, et allez sur un sprite ayant la palette 6. Regardez le "Pal Registers". Vous devez placer les mêmes données dans les 4 octets précédant les pointeurs.



Une fois modifié, j'obtiens ceci :

FFFF061102110002100020001501000000DB39088CDB390860D839080000850808C12208


Créer une suite de la SpriteBank

Pour rappel, la SpriteBank, c'est la bank avec toutes les compositions des sprites.

Chaque pointeur de la table de tous les pointeurs que nous avons repointée tout à l'heure correspond à l'offset d'une composition.
Pour créer une suite à cette bank de sprites, nous allons tout simplement écrire la composition de notre nouveau sprite, plus le pointer dans la table des pointeurs. Vous me suivez ? ;)

Choisissez donc l'offset de votre nouvelle composition, pour moi ce sera : 900000, renversé : 00009008.

Allez à cet offset, et collez votre composition.




Ajouter un pointeur vers la suite de la SpriteBank

Maintenant, revenez à votre table avec tous les pointeurs. Vous voulez rajouter le pointeur vers votre nouvelle composition, eh bien, faites-le !

On rajoute notre pointeur à la fin, à la suite des autres, comme ceci :



C'était pas plus difficile que ça ;)


Créer le sprite pointer

Allez à l'offset que vous aviez choisi dans votre composition de sprite pour le sprite pointer, dans mon cas : 850000.

Le sprite pointeur est composé de cette manière :

XXXXXX08YYYY0000.
XXXXXX08, on y met le pointeur vers le dessin de l'image. Choisissez-le, pour ma part B00000, renversé : 0000B008.
YYYY, des données sur la taille, vu précédemment, je ne ré-explique pas, je mets 0001.
0000, on n'y touche pas !

0000B00800010000

Voilà le pointeur vers le dessin de ma première frame !

Pour l'exemple, je vais créer un sprite avec 3 frames. Je répète donc cette opération en changeant le pointeur vers le dessin deux fois.




Repointer une donnée importante

Maintenant, il faut repointer une donnée, celle qui indique le nombre de sprite autorisé dans le jeu.

Allez à l'offset 5F3A0, et remplacez "9729" par "EF29". Vous êtes larges.


Nous avons fini ! Votre sprite est totalement créé ! Il ne reste plus qu'à l'éditer, nous allons voir comment faire.



IV. Editer un OW ajouté

Bien, pour ce faire, ouvrez NSE !

Nous allons utiliser les Bookmarks. Dans NSE, faites Options ~~> Bookmarks ~~> View BookMarks.

Allez sur l'onglet "Edit Bookmarks". Nous allons créer un nouveau dossier pour notre sprite.

Dans "New", sélectionnez "Folder", puis cliquez sur Create. Renommez-le comme bon vous semble. Cliquez sur Save.
Maintenant, dans "New", sélectionnez "In-Bookmark", puis cliquez sur Create.
Déroulez votre dossier, un "New Bookmark" va apparaître.



Chaque bookmark correspond à une frame.

L'image ne correspond à rien, car aucun offset n'est sélectionné.
Revenez dans "Edit Bookmarks".
De même, renommez-le. Entrez la taille, puis l'offset que vous aviez choisi pour stocker le dessin de l'image, ainsi que l'offset de la palette (pour le connaître, c'est expliqué un peu plus tard dans le tuto, vous pouvez toujours regarder à partir d'un sprite ayant déjà cette palette).
Cliquez sur "Save".



À partir de là, pour le mofidier, cliquez sur "Open" : vous verrez alors apparaître votre sprite dans la fenêtre principale de NSE ! Vous n'avez plus qu'à modifier votre sprite comme si vous modifiiez un sprite déjà existant.

Refaites cette étape pour chaque frame, donc moi je la ferai 3 fois en tout.

Une fois fini, sauvez, puis ouvrez A-Map.

Allez au dernier sprite (151 pour moi, n'oubliez pas le sprite 0 existe !), puis augmentez ce nombre, soit 152... Oh, votre nouveau sprite, sprite n°153 apparaît ! :D

Résultat InGame :



Petit Spoink existe ! :P



V. Créons maintenant de nouvelles palettes

Après ce que vous avez fait, créer de nouvelles palettes va vous sembler petit ! :)


Repointer la table des palettes

[BPRF]
Name                 = Pokémon Rouge Feu (Français)
SpriteBank           = &H39DFA0
SpritePaletteHeaders = &H39F548
SpriteCount          = 153

Maintenant, nous nous intéressons au SpritePaletteHeaders : 39F548. C'est l'offset de la table des palettes.

Allez à cet offset, et sélectionnez toutes les palettes (la fin de la table se reconnait grâce au "0000000000000000".

Voici la table :

187C360803110000387C360804110000587C360805110000787C360806110000987C360807110000B87C360808110000D87C360809110000F87C36080A110000585D350800110000588D350801110000788D350802110000F82339080B110000182439080C110000585D350810110000588D35081111000098F2380813110000D8FE380815110000B8F63808141100000000000000000000
Choisissez un nouvel offset, et collez-y la table. Je choisis B40000 (renversé : 0000B408)

De même que pour la table des pointeurs de sprites, il faut repointer la table des palettes.

Il faut la repointer à trois endroits : 5F598, 5F630, 5F688 (varie aussi selon la version)

Vous avez correctement repointé la table des palettes, on peut maintenant en ajouter !


Créer une nouvelle palette l'ajouter à la table des palettes

Pour créer une nouvelle palette, vous avez besoin de deux choses :
- L'offset de la nouvelle palette
- Son numéro

Comment les trouver ? Pas besoin de chercher, vous les inventez ! :D

Je vais faire ma nouvelle palette à l'offset B30000 (renversé : 0000B308) et lui donner le numéro 1E.

Rappel :
Une palette fait 16 couleurs, 2 octets par couleur, donc une palette fait 32 octets.

Composition d'un pointeur de palette :
XXXXXX08YY110000

XXXXXX08 : le pointeur vers la nouvelle palette, pour moi : 0000B308
YY : le numéro de palette, pour moi : 1E
110000 : Ca ne change pas !

Voici la composition de mon nouveau pointeur : 0000B3081E110000

Je colle donc ceci à la suite de la table des palettes. N'oubliez pas, la table doit se terminer par "0000000000000000".


Utiliser la palette créée dans un sprite

Rien de plus simple ! Quoique, si, il y a un problème.

Dans votre composition de sprite, à l'emplacement du numéro de palette (soit le troisième octet), inscrivez le numéro de votre palette ; j'y mettrai donc 1E.

Ca, c'était la partie facile. Seulement, il y a un problème.

Vous vous souvenez des Pal Registers ? C'est de là que vient le problème.

En fait, si vous utilisez le Pal Registers d'un sprite ayant une autre palette, ce sprite là prendra la même palette que celle du sprite créé. (Pas si dur à comprendre, relisez la phrase x))

Malgré tout, j'ai cherché à contourner ce problème, je vous conseille d'utiliser comme données de Pal Registers "1A010000" : C'est celle du bateau, étant donné que logiquement il n'apparaît pas sur la map, ça ne provoquera pas de bug, seulement si vous placez à proximité deux sprites utilisant deux palettes différentes mais avec le même Pal Registers.

Pour contourner entièrement ce problème, il faudrait changer quelque chose en interne. Mais là, c'est beaucoup plus difficile, et on ne va pas le voir.

Entrez donc ce Pal Registers dans la composition de votre sprite.


Pour ensuite éditer la palette créée, vous pourrez le faire en chargeant un sprite avec NSE ; il suffit juste auparavant, à l'aide des Bookmarks (cf. partie précédente), de désigner l'offset de la nouvelle palette (ici, B30000). Ou alors, vous pouvez toujours l'éditer via l'hexadécimal :D



VI. Annexes


Rappel du vocabulaire

Quelques petits rappels de vocabulaire :
- Un sprite, aussi appelé  Overworld (OW), est un event qui se déplace sur la map (Personnage, Pokémon, arbre...)
- Chaque sprite possède une ou plusieurs frames : ce sont les différents dessins qui composent le sprite
- Une composition de sprite est une suite de 36 octets et comportant toutes les informations sur le sprite (taille, palette...)
- La table où sont présentes toutes les compositions est appelée "Spritebank"
- Les compositions de sprite possèdent un pointeur particulier : le sprite pointeur. Ce sprite pointeur amène à un offset :
- Le pointeur vers le dessin. Il indique à quel offset se situe le dessin du sprite, ainsi que la quantité d'octets à lire (en fonction de la taille). Chaque pointeur à la suite représente une frame du sprite.
- Une palette est une suite de 16 couleurs (dont une pour la transparence), donnant la couleur au sprite
- ... (à venir si j'y pense)


Rappel des offsets : Rouge Feu FR

Je n'ai recherché que pour Rouge Feu FR, voici donc les offsets (je suis ouvert si quelqu'un d'autre les a pour d'autres versions).

- Spritebank : 39DFA0
- des palettes : 39F548
- Table des pointeurs vers les compositions : 39A1A0

- Offset où repointer la table des pointeurs vers les compositions : 5F3B4
- Offsets où repointer la table des palettes : 5F598, 5F630, 5F688

(De même, peut-être incomplète !)



Voilà, on en a fini pour ce tuto ! :D

J'espère que la longueur ne vous a pas empêché de lire et d'aimer ce tuto ^^

J'ai fait mes recherches moi-même à partir de presque rien, je vous demande donc de respecter mon travail (qui m'a pris deux dizaines d'heures facilement, sans compter le temps de faire ce tuto !) et de ne rien copier ! MERCI.

Voilà, n'hésitez pas à commentez et à répondre au sondage, histoire que je sache si ce que j'ai fait est bon ^^

À vous les OWs ! :D

Nestorostain

  • Membre
  • 2216 posts
22 mai 2012, 19:24
Je n'ai pas tout lu mais d'après ce que j'ai vu, ce tuto a l'air très complet GG :)

Myst

  • Membre
  • 1870 posts
22 mai 2012, 23:23
Merci 1000 fois Mikey, ca gère.

monsieur07

  • Membre
  • 363 posts
23 mai 2012, 19:12
Gg, le tuto est génial.  :winner:

Arnik

  • Membre
  • 1812 posts
23 mai 2012, 21:05
Mickey, tu as bossé!

Merci

yago58

  • Invité
24 mai 2012, 17:12
Sondage sans aucun intérêt Mickey'  :-\

En dehors de ça gg pour le tuto.

-S@M-

  • Membre
  • 5367 posts
30 mai 2012, 20:12
Wait depuis quand on a quelqu'un qui gère autant l'édition via hexa ici? Tu gères, gg.

Flower//

  • Invité
30 mai 2012, 20:23
Mickey, t'es un dieu mec !  :roubaix:
Excellent tout ça ! Je vais vite jeter un coup d'oeil !
En tout cas félicitations, tes recherches ne t'ont pas servies à rien, et merci beaucoup de partager !

Mickey`

  • Membre
  • 2746 posts
30 mai 2012, 20:50
@Flow : Ne me sous-estime pas. Maintenant, laisse moi crever. :imbecile:

Non plus sérieusement, merci, ça fait plaisir de voir que le travail ne sert pas à rien :)

J'en ferai d'autres si je trouve les thèmes.

Kuro

  • Membre
  • 246 posts
04 mars 2013, 19:30
Tuto lu en entier, testé (sur Rouge Feu aussi), et c'est fonctionnel, j'ai pu augmenter le nombre d'OW grâce à toi! Merci.

Mickey`

  • Membre
  • 2746 posts
04 mars 2013, 19:51
Ca fait plaisir de savoir que je me suis pas tapé tout ça pour totalement rien :)

Tuturosso

  • Membre
  • 773 posts
04 mars 2013, 19:55
Étant inculte dans le milieu de la hack rom,je voudrais juste savoir ce que sont des overwolds?
Merci.

Kuro

  • Membre
  • 246 posts
04 mars 2013, 20:02
C'est tout ce qui est par-dessus les blocks de ta map: les persos, les pokémon visibles sur la map (comme les légendaires par exemple), et certains objets de quête (le rubis et le saphir dans RF et VF).

Ca fait plaisir de savoir que je me suis pas tapé tout ça pour totalement rien :)
Vous faites pas les tutos pour rien, même les plus vicieux y'a des gens pour les lire et les tester, et les derniers tutos donnent vraiment de la profondeur au R-H GBA (je pense notamment aux level scripts et à ce tuto), ça ouvre énormément de possibilités, donc un grand MERCI à Mickey, Sainior, Flow' et tous les autres pour ça ;)
« Modifié: 04 mars 2013, 22:02 par darklives »

Mickey`

  • Membre
  • 2746 posts
04 mars 2013, 22:07
Personnellement, c'est le manque de retours et "l'inutilité" apparemment visible qui me retient de faire des tutos. Sinon, je pourrais en faire, mais cette section est de plus en plus délaissée...

On continue par MP si tu as besoin, sauf si c'est en rapport avec le sujet du topic, pas besoin de flooder :)

yushi56

  • Membre
  • 298 posts
05 mars 2013, 15:56
merci c'est tres complet ;)
et surtout tres utile
GG!!

Pages: [1]    En haut ↑