[TUTORIEL] Le bâton du moddeur - cas pratique n°2 : Patcher un cre, la pratique
Posté : jeu. 04 oct. 2012, 14:47
CAS PRATIQUE N°2 : Patcher un cre, on attaque la pratique
Introduction
Alors on va passer à la partie la plus fun, on va aller chercher un cre du jeux original, le recopier dans l’override sous un autre nom, puis le « réécrire » à notre sauce.
La technique consiste à récupérer un cre qui ressemble à ce qu’on veut (et qui a surtout la bonne animation, vu que c’est hard-coded) et on va changer ce qui ne nous plait pas pour coller à l’idée qu’on a en tête. Bien sur, ce genre de manipulation est à réserver aux personnages plutôt secondaires ou tout du moins aux personnages qui ne nécessitent pas de grosses modifications pour coller à ce que vous voulez. Sinon effectivement DLTCEP est quand même un peu plus rapide…
Bon trêve de bavardage on s’y met :
UN "PETIT" EXEMPLE
Code : Tout sélectionner
[color=#ff8c00]COPY_EXISTING ~beast.cre~ ~override/#vSteph.cre~[/color]
[color=#ffa500]SAY NAME1 @68
SAY NAME2 @68
WRITE_ASCII DEATHVAR ~#vBrym~
WRITE_ASCII DIALOG ~#vBrym~
WRITE_ASCII SCRIPT_OVERRIDE ~#vBrym~[/color]
[color=#92d050] WRITE_ ASCII 0x34 ~#vBrym~ // Small portrait[/color]
[color=#92d050] WRITE_ ASCII 0x3c ~#vBrym~ // Large portrait[/color]
[color=#ff8c00]WRITE_SHORT 0x46 8 // Armor class (natural)
WRITE_SHORT 0x4a "-2" // Armor class (crushing attack modifier)[/color]
[color=blue] WRITE_BYTE 0x52 26 // THACO
WRITE_BYTE 0x54 26 // Save versus death
WRITE_BYTE 0x56 26 // Save versus polymorph
WRITE_BYTE 0x58 26 // Save versus spell[/color]
EXPLICATION DÉTAILLÉE
1. Mise en place générale
Avant de passer aux infos en rapport avec la partie files actions où on va allez chercher les informations qu’on veut réécrire, j’ai préféré commencer par quelques commandes élémentaires (en gris) qui vont nous permettre de fabriquer les informations essentielles pour votre cre.
Code : Tout sélectionner
[color=#ffa500]COPY_EXISTING ~beast.cre~ ~override/#vSteph.cre~
SAY NAME1 @68
SAY NAME2 @68[/color]
Code : Tout sélectionner
[color=#ffa500] WRITE_ASCII DEATHVAR ~#vBrym~
WRITE_ASCII DIALOG ~#vBrym~
WRITE_ASCII SCRIPT_OVERRIDE ~#vBrym~[/color]
DEATHVAR
DIALOG
SCRIPT_OVERRIDE
Donc qui sont beaucoup plus intuitifs et qui sont des commandes classiques que vous pourrez trouver dans nombre de TP2 (je ne parle évidemment pas des mods old-school tel ceux de kalmachin et consort…). Vous pourrez retrouvez ce genre de mots clefs soit dans les tp2 des autres comme je l’ai dit, dans des extraits du readme de WeiDU, mais surtout (et c’est comme ça que je m’y suis pris) en ouvrant le fichier « ini » lié à vos highlighters : toutes les commandes y sont regroupés et on retrouve entre autre ce genre de chose. Alors mon conseil c’est d’explorer ce fichier et éventuellement d’essayer des combinaisons, par ailleurs c’est un excellent moyen de découvrir de nouvelles commandes et de se familiariser avec la logique d’un tp2. Alors farfouillez mes amis ! FARFOUILLEZ !
2. WRITE_ASCII
Maintenant on va passer à la suite, c’est la où on va commencer à se marrer… On a attribué un nouveau nom de fichier à notre cre, un nom in game et on lui a attribué nos propres fichiers dialogue, script, etc… On va donc commencer à attaquer les offsets en modifiant des données permettant d’afficher le portrait du PNJ :
Code : Tout sélectionner
[color=#92d050] WRITE_ASCII 0x34 ~#vBrymS~ // Small portrait
WRITE_ASCII 0x3c ~#vBrymM~ // Large portrait[/color]
Comme on le voit dans l’exemple, j’utilise le WRITE correspondant à la taille de l’offset et j’écris la valeur de l’offset (entre ~~ ici car c’est une valeur écrite). A noter également que je ne me suis pas servi des deux premiers 0 après le x (0x34 au lieu de 0x0034 comme on peut le voir dans le tableau du file action). En fait les deux syntaxes sont possibles mais la norme est plutôt de ne pas les utiliser mais si vous préférez avec les zéros après tout…
3. WRITE_SHORT] & WRITE_BYTE
Bon, on continue la manipulation avec un WRITE_SHORT si vous avez compris jusque la ça va aller assez vite maintenant la manip étant toujours la même :
Code : Tout sélectionner
[color=#ff8c00] WRITE_SHORT 0x46 8 // Armor class (natural)
WRITE_SHORT 0x4a "-2" // Armor class (crushing attack modifier)[/color]
Code : Tout sélectionner
[color=blue] WRITE_BYTE 0x52 26 // THACO
WRITE_BYTE 0x54 26 // Save versus death
WRITE_BYTE 0x56 26 // Save versus polymorph
WRITE_BYTE 0x58 26 // Save versus spell[/color]
4. Quelques nouveautés à signaler : commandes WeiDU clef en main
En matière d’édition de fichier cre, les dernières maj de WeiDU nous font profiter de pas mal de nouvelles commandes toutes faites qui nous évitent nombre de manipulations compliquées. Celles ci sont trouvables sous le chapitre macro listing, nous pouvons ici en relever quelques unes assez pertinentes :
ADD_CRE_EFFECT (pour ajouter des effets à des créatures (changements de couleurs, invisibilité, boostage de carac/de CA, protections diverses, immunités...)
DELETE_CRE_EFFECT (pour effacer un ou plusieurs effets sur une créature)
DELETE_CRE_ITEM (pour effacer un ou plusieurs objets de l’inventaire ou de l’équipement de la créature.)[/color]
Voici pour les plus courants et les plus usités. Voir ce tuto pour l'utilisation d'une macro, ça obéit globalement à la même structure peu importe la macro.
Maintenant ça sera à vous de faire un tout cohérent. Bien souvent il suffit de modifier juste quelques éléments pour avoir un cre qui soit utilisable. Personnellement dans la plupart des cas, la création de cre par tp2 est la méthode que je vais utiliser systématiquement car c’est la plus souple la plus rapide, et la plus « propre » j’ai envie de dire.
5. Une option supplémentaire pour éviter certains bugs
La commande WRITE_ASCII comme on l'a déjà vu s’écrit sur 8 octets et si votre valeur "écrite" atteint les 8 lettres vous n'aurez aucun souci mais si ce n'est pas le cas alors vous aurez une partie de l'ancienne valeur qui subsistera. Si on reprend notre exemple de tout à l'heure :
Code : Tout sélectionner
[color=#FFA500]WRITE_ASCII DEATHVAR ~#vBrym~
WRITE_ASCII DIALOG ~#vBrym~
WRITE_ASCII SCRIPT_OVERRIDE ~#vBrym~[/color]
Death variable = #vBrymul
Dialog file = #vBrymul
Override script = #vBrymul
Nous devons donc préciser sur quel espace, sur quelle zone, nous écrivons pour que la valeur que nous indiquons remplace complètement l'ancienne. En l’occurrence, la zone entière de 8 octet :
Code : Tout sélectionner
[color=#FFA500]WRITE_ASCII DEATHVAR ~#vBrym~ #8
WRITE_ASCII DIALOG ~#vBrym~ #8
WRITE_ASCII SCRIPT_OVERRIDE ~#vBrym~ #8[/color]
Et voilà. En recourant à cette manip, vous vous éviterez bien des problèmes. En précisant le nombre de caractères vous avez également la garantie de ne pas "déborder" sur les autres adresses ; ce qui a de bonnes chances de rendre invalides les scripts suivants par exemple. A savoir que comme vous l'aurez peut être deviné pour toute commande de type WRITE, la valeur "#chiffre" vous permettra d’écrire sur l'espace que vous avez précisez (1 octet, 2 octets, etc...).