[WeiDU] Comment insérer intelligemment de nouvelles entrées dans les fichiers ids ?
Posté : mer. 03 juin 2015, 00:07
Pour gérer de nouveaux sorts et de nouvelles capacités, j'ai besoin de créer de nouvelles races, classes et valeurs spécifiques.
J'ai trouvé une solution pour les races, empruntée à DS :
D'abord on réécrit le fichier race.ids en l'ordonnant :
Puis on insère les nouvelles races :
Comme ça, mes nouvelles races ne risquent pas de se télescoper avec d'autres mods.
Mais j'ai un problème avec le fichier specific.ids.
A première vue, il est quasiment vide (deux entrées). Mais certains mods le complètent. Et surtout de nombreuses créatures vanilla utilisent une valeur specific non référencée dans le fichier ids.
Résultat, mon code initial ne fonctionne plus :
En effectuant une vérification rapide, je me suis aperçu que certaines créatures non modifiées par des mods étaient dotées de codes correspondant à mes dragons.
J'ai lancé une procédure commençant par
pour lister toutes les créatures dotées d'un code specific et il y en un bon paquet !
Bref, j'aimerai construire un code simple qui lise la valeur de l'offset 0x274, puis qui la stocke dans une variable max_spec (définie à 1 au départ) si elle est supérieure à cette dernière. Bref, le but du jeu est de traquer la variable specific la plus élevée utilisée par les créatures installées.
Une fois trouvée, il me suffirait de décliner la procédure d'insertion définie pour le fichier race pour ajouter les codes de mes dragons en étant certain qu'ils n'impacteront pas des créatures existantes.
Toutes mes tentatives se sont soldées par un bide total et mes neurones fondent à vue d’œil...
Un coup de main me serait très utile.
J'ai trouvé une solution pour les races, empruntée à DS :
D'abord on réécrit le fichier race.ids en l'ordonnant :
Code : Tout sélectionner
DEFINE_ACTION_MACRO reorder_race_ids BEGIN
COPY_EXISTING - race.ids ~override~
max=1
READ_2DA_ENTRIES_NOW races 2
FOR (i=0;i<races;i+=1) BEGIN
READ_2DA_ENTRY_FORMER races i 0 index
READ_2DA_ENTRY_FORMER races i 1 str
max = (index>max) ? index : max
SET $arr1("%index%") = 1
SPRINT $arr2("%index%") ~%str%~
END
PHP_EACH arr1 AS i1 => r1 BEGIN
min=max
PHP_EACH arr2 AS i2 => r2 BEGIN
PATCH_IF (i2<min) && (~%r2%~ STR_CMP ~~) BEGIN
min = (i2<min) ? i2 : min
END
END
SPRINT $race("%min%") $arr2("%min%")
SPRINT $arr2("%min%") ~~
END
<<<<<<<<.../inline/blank
> >> >> >> >
COPY ~.../inline/blank~ ~override/race.ids~
ACTION_PHP_EACH race AS ind => res BEGIN
APPEND race.ids ~%ind% %res%~
END
END
Code : Tout sélectionner
LAM reorder_race_ids
ACTION_FOR_EACH newrace IN ABOLETH DRIDER PLANT TARASQUE BEGIN
COPY_EXISTING ~RACE.IDS~ ~override~
READ_2DA_ENTRIES_NOW races 2
FOR (i=0;i<races;i+=1) BEGIN
READ_2DA_ENTRY_FORMER races i 0 index
END
max = index+1
APPEND ~RACE.IDS~ ~%max% %newrace%~ UNLESS ~%newrace%~
BUT_ONLY
END
Mais j'ai un problème avec le fichier specific.ids.
A première vue, il est quasiment vide (deux entrées). Mais certains mods le complètent. Et surtout de nombreuses créatures vanilla utilisent une valeur specific non référencée dans le fichier ids.
Résultat, mon code initial ne fonctionne plus :
Code : Tout sélectionner
APPEND ~SPECIFIC.IDS~ ~151 BLACK_DRAGON~ UNLESS ~BLACK_DRAGON~
APPEND ~SPECIFIC.IDS~ ~152 BLUE_DRAGON~ UNLESS ~BLUE_DRAGON~
APPEND ~SPECIFIC.IDS~ ~153 GREEN_DRAGON~ UNLESS ~GREEN_DRAGON~
APPEND ~SPECIFIC.IDS~ ~154 RED_DRAGON~ UNLESS ~RED_DRAGON~
APPEND ~SPECIFIC.IDS~ ~155 WHITE_DRAGON~ UNLESS ~WHITE_DRAGON~
APPEND ~SPECIFIC.IDS~ ~156 BRASS_DRAGON~ UNLESS ~BRASS_DRAGON~
APPEND ~SPECIFIC.IDS~ ~157 BRONZE_DRAGON~ UNLESS ~BRONZE_DRAGON~
APPEND ~SPECIFIC.IDS~ ~158 COPPER_DRAGON~ UNLESS ~COPPER_DRAGON~
APPEND ~SPECIFIC.IDS~ ~159 GOLD_DRAGON~ UNLESS ~GOLD_DRAGON~
APPEND ~SPECIFIC.IDS~ ~160 SILVER_DRAGON~ UNLESS ~SILVER_DRAGON~
APPEND ~SPECIFIC.IDS~ ~161 AMETHYST_DRAGON~ UNLESS ~AMETHYST_DRAGON~
APPEND ~SPECIFIC.IDS~ ~162 CRYSTAL_DRAGON~ UNLESS ~CRYSTAL_DRAGON~
APPEND ~SPECIFIC.IDS~ ~163 EMERALD_DRAGON~ UNLESS ~EMERALD_DRAGON~
APPEND ~SPECIFIC.IDS~ ~164 SAPPHIRE_DRAGON~ UNLESS ~SAPPHIRE_DRAGON~
APPEND ~SPECIFIC.IDS~ ~165 TOPAZE_DRAGON~ UNLESS ~TOPAZE_DRAGON~
APPEND ~SPECIFIC.IDS~ ~171 BROWN_DRAGON~ UNLESS ~BROWN_DRAGON~
APPEND ~SPECIFIC.IDS~ ~172 DEEP_DRAGON~ UNLESS ~DEEP_DRAGON~
APPEND ~SPECIFIC.IDS~ ~173 PRISMATIC_DRAGON~ UNLESS ~PRISMATIC_DRAGON~
APPEND ~SPECIFIC.IDS~ ~174 PURPLE_DRAGON~ UNLESS ~PURPLE_DRAGON~
APPEND ~SPECIFIC.IDS~ ~175 RATTELYR_DRAGON~ UNLESS ~RATTELYR_DRAGON~
APPEND ~SPECIFIC.IDS~ ~176 SHADOW_DRAGON~ UNLESS ~SHADOW_DRAGON~
APPEND ~SPECIFIC.IDS~ ~177 YELLOW_DRAGON~ UNLESS ~YELLOW_DRAGON~
APPEND ~SPECIFIC.IDS~ ~178 DEVOUR_BRAIN_DRAGON~ UNLESS ~DEVOUR_BRAIN_DRAGON~
APPEND ~SPECIFIC.IDS~ ~179 SORCELLERIE_DRAGON~ UNLESS ~SORCELLERIE_DRAGON~
APPEND ~SPECIFIC.IDS~ ~180 CHANT_DRAGON~ UNLESS ~CHANT_DRAGON~
APPEND ~SPECIFIC.IDS~ ~181 FANG_DRAGON~ UNLESS ~FANG_DRAGON~
APPEND ~SPECIFIC.IDS~ ~182 MERCURY_DRAGON~ UNLESS ~MERCURY_DRAGON~
APPEND ~SPECIFIC.IDS~ ~183 MIST_DRAGON~ UNLESS ~MIST_DRAGON~
APPEND ~SPECIFIC.IDS~ ~184 STEEL_DRAGON~ UNLESS ~STEEL_DRAGON~
APPEND ~SPECIFIC.IDS~ ~191 CHAOS_DRAGON~ UNLESS ~CHAOS_DRAGON~
APPEND ~SPECIFIC.IDS~ ~192 HOWLING_DRAGON~ UNLESS ~HOWLING_DRAGON~
APPEND ~SPECIFIC.IDS~ ~193 PYROCLASTIC_DRAGON~ UNLESS ~PYROCLASTIC_DRAGON~
APPEND ~SPECIFIC.IDS~ ~194 RUST_DRAGON~ UNLESS ~RUST_DRAGON~
APPEND ~SPECIFIC.IDS~ ~195 ARBOREAL_DRAGON~ UNLESS ~ARBOREAL_DRAGON~
APPEND ~SPECIFIC.IDS~ ~196 AXIAL_DRAGON~ UNLESS ~AXIAL_DRAGON~
APPEND ~SPECIFIC.IDS~ ~197 BATTLE_DRAGON~ UNLESS ~BATTLE_DRAGON~
APPEND ~SPECIFIC.IDS~ ~198 OCEANUS_DRAGON~ UNLESS ~OCEANUS_DRAGON~
APPEND ~SPECIFIC.IDS~ ~199 RADIANT_DRAGON~ UNLESS ~RADIANT_DRAGON~
APPEND ~SPECIFIC.IDS~ ~200 ADAMANTITE_DRAGON~ UNLESS ~ADAMANTITE_DRAGON~
APPEND ~SPECIFIC.IDS~ ~211 VAMPIRIC_DRAGON~ UNLESS ~VAMPIRIC_DRAGON~
APPEND ~SPECIFIC.IDS~ ~212 ZOMBIE_DRAGON~ UNLESS ~ZOMBIE_DRAGON~
APPEND ~SPECIFIC.IDS~ ~213 DRACOLICH~ UNLESS ~DRACOLICH~
APPEND ~SPECIFIC.IDS~ ~218 REVENANT~ UNLESS ~REVENANT~
APPEND ~SPECIFIC.IDS~ ~219 MUMMY~ UNLESS ~MUMMY~
APPEND ~SPECIFIC.IDS~ ~220 FIRE_CREATURE~ UNLESS ~FIRE_CREATURE~
APPEND ~SPECIFIC.IDS~ ~221 FLYING_CREATURE~ UNLESS ~FLYING_CREATURE~
APPEND ~SPECIFIC.IDS~ ~222 FLYING_SUMMONED~ UNLESS ~FLYING_SUMMONED~
J'ai lancé une procédure commençant par
Code : Tout sélectionner
COPY_EXISTING_REGEXP GLOB ~^.+\.cre$~ ~override~
PATCH_IF (SOURCE_SIZE > 0x2d3) BEGIN
READ_BYTE 0x274 "spec" ELSE 0
....
Bref, j'aimerai construire un code simple qui lise la valeur de l'offset 0x274, puis qui la stocke dans une variable max_spec (définie à 1 au départ) si elle est supérieure à cette dernière. Bref, le but du jeu est de traquer la variable specific la plus élevée utilisée par les créatures installées.
Une fois trouvée, il me suffirait de décliner la procédure d'insertion définie pour le fichier race pour ajouter les codes de mes dragons en étant certain qu'ils n'impacteront pas des créatures existantes.
Toutes mes tentatives se sont soldées par un bide total et mes neurones fondent à vue d’œil...
Un coup de main me serait très utile.