Affichage des résultats 1 à 2 sur 2

Discussion: [CRE] Valeur de l'offset 0x244 (Kit) écrites en "big endian style" ????

  1. #1
    Date d'inscription
    avril 2011
    Localisation
    Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
    Messages 
    5 453

    Fou [CRE] Valeur de l'offset 0x244 (Kit) écrites en "big endian style" ????

    Il semble qu'il y a un léger problème pour attribuer un kit à une créature à partir du tp2.


    D'abord je lance cette macro pour créer une liste des valeurs du fichier kit.ids par kit :
    Code:
    COPY_EXISTING - ~kit.ids~ ~override~
    	COUNT_2DA_COLS nb_cols
    	COUNT_2DA_ROWS %nb_cols% nb_lignes
    	FOR (ligne = 0; ligne < %nb_lignes%; ligne = ligne + 1) BEGIN
    		READ_2DA_ENTRY %ligne% 0 %nb_cols% code_ids
    		READ_2DA_ENTRY %ligne% 1 %nb_cols% kit
    		SET $GW_ids(~kit~ ~%kit%~) = ~%code_ids%~
    	END
    BUT_ONLY
    Je les ai vérifiées par "PATCH_PRINT", elles sont bien attribuées et exactes.

    Puis lors de la création de la créature, je lance cette fonction :
    Code:
    /*-------------------------------------------------------------------*
     * FONCTION GW_CRE_KIT_DEF : Définition du code du kit des créatures *
     *-------------------------------------------------------------------*/
    DEFINE_PATCH_FUNCTION ~GW_CRE_KIT_DEF~
    	STR_VAR GW_kit_lib = "no"	// Kit
    	RET	GW_nvkit
    BEGIN
    
    PATCH_MATCH ~%GW_kit_lib%~ WITH
    	"NO_KIT" BEGIN SET GW_nvkit = 0
    	PATCH_PRINT ~%DEST_RES% - CONTROLE GW_CRE_KIT_DEF : VALEUR CALCULEE du KIT = %GW_nvkit% - Kit = %GW_kit_lib% - Classe = %Classecre%.~	END
    	DEFAULT
    		PATCH_IF VARIABLE_IS_SET $GW_ids(~kit~ ~%GW_kit_lib%~) BEGIN
    			SET GW_nvkit = $GW_ids(~kit~ ~%GW_kit_lib%~)
    			PATCH_PRINT ~%DEST_RES% - CONTROLE GW_CRE_KIT_DEF : VALEUR CALCULEE du KIT = %GW_nvkit% - Kit = %GW_kit_lib% - Classe = %Classecre%~
    		END ELSE BEGIN
    			SET GW_nvkit = 0
    			PATCH_PRINT ~%DEST_RES% - CONTROLE GW_CRE_KIT_DEF : KIT non trouvé dans Kit.ids pour Kit = %GW_kit_lib% et Classe = %Classecre% --> NO_KIT = %GW_nvkit%.~	END
    	END
    
    END
    Là encore, les PATCH_PRINT m'indiquent les bonnes valeurs.

    Puis j'attribue la valeur GW_nvkit à l'offset 0x244.

    Problème : lorsque je vérifie les fichiers .cre dans DLTCEP ou NI, les valeurs affichées sont du grand n'importe quoi.

    Après avoir converti les valeurs du fichier IDS en décimal, même problème.

    Je pense que le problème vient de cette ligne de IESDP :

    NB.: The values of this offset are written in big endian style.
    Qu'est ce que ça signifie, sinon que manifestement un WRITE_LONG classique ne fonctionne pas ?
    Dernière modification par Freddy_Gwendo ; 11/08/2015 à 12h03.
    CARPE DIEM...
    Co-modérateur de La Forge et de La Chambre des Scribes
    Moddeur qui s'arrache les cheveux...

  2. #2
    Date d'inscription
    avril 2011
    Localisation
    Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
    Messages 
    5 453
    J'ai fini par trouver !

    Je vous passe les détails - d'ailleurs mes compétences info font que je n'ai certainement pas tout compris, en tout cas pas au point de faire un exposé clair -, mais si ça vous intéresse, faites une recherche "long big ended" ou "slow big ended".

    Ceci dit, j'ai compris le principe : il s'agit d'intervertir les valeurs.

    En l’occurrence, pour le fichier kit.ids, les valeurs du type 0xnnnn doivent être considérées comme si elles étaient 0x0000nnnn (0x4000 ==> 0x00004000)
    Pour celles qui sont de type 0xnnnnnnnn, on ne change rien.

    Puis il suffit d'intervertir les blocs de 4 valeurs dans chaque variable.

    Ce qui donne :

    Code:
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~TRUECLASS~) = 0x40000000 <== CODE ORIGINAL du FICHIER ids = 0x4000.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~BERSERKER~) = 0x40010000 <== CODE ORIGINAL du FICHIER ids = 0x4001.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~WIZARDSLAYER~) = 0x40020000 <== CODE ORIGINAL du FICHIER ids = 0x4002.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~KENSAI~) = 0x40030000 <== CODE ORIGINAL du FICHIER ids = 0x4003.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~CAVALIER~) = 0x40040000 <== CODE ORIGINAL du FICHIER ids = 0x4004.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~INQUISITOR~) = 0x40050000 <== CODE ORIGINAL du FICHIER ids = 0x4005.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~UNDEADHUNTER~) = 0x40060000 <== CODE ORIGINAL du FICHIER ids = 0x4006.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~MAGESCHOOL_ABJURER~) = 0x00400000 <== CODE ORIGINAL du FICHIER ids = 0x0040.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~MAGESCHOOL_CONJURER~) = 0x00800000 <== CODE ORIGINAL du FICHIER ids = 0x0080.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~MAGESCHOOL_DIVINER~) = 0x01000000 <== CODE ORIGINAL du FICHIER ids = 0x0100.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~MAGESCHOOL_ENCHANTER~) = 0x02000000 <== CODE ORIGINAL du FICHIER ids = 0x0200.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~MAGESCHOOL_ILLUSIONIST~) = 0x04000000 <== CODE ORIGINAL du FICHIER ids = 0x0400.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~MAGESCHOOL_INVOKER~) = 0x08000000 <== CODE ORIGINAL du FICHIER ids = 0x0800.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~MAGESCHOOL_NECROMANCER~) = 0x10000000 <== CODE ORIGINAL du FICHIER ids = 0x1000.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~MAGESCHOOL_TRANSMUTER~) = 0x20000000 <== CODE ORIGINAL du FICHIER ids = 0x2000.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~MAGESCHOOL_GENERALIST~) = 0x40000000 <== CODE ORIGINAL du FICHIER ids = 0x4000.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~FERALAN~) = 0x40070000 <== CODE ORIGINAL du FICHIER ids = 0x4007.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~STALKER~) = 0x40080000 <== CODE ORIGINAL du FICHIER ids = 0x4008.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~BEASTMASTER~) = 0x40090000 <== CODE ORIGINAL du FICHIER ids = 0x4009.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~ASSASIN~) = 0x400A0000 <== CODE ORIGINAL du FICHIER ids = 0x400A.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~BOUNTYHUNTER~) = 0x400B0000 <== CODE ORIGINAL du FICHIER ids = 0x400B.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~SWASHBUCKLER~) = 0x400C0000 <== CODE ORIGINAL du FICHIER ids = 0x400C.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~BLADE~) = 0x400D0000 <== CODE ORIGINAL du FICHIER ids = 0x400D.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~JESTER~) = 0x400E0000 <== CODE ORIGINAL du FICHIER ids = 0x400E.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~SKALD~) = 0x400F0000 <== CODE ORIGINAL du FICHIER ids = 0x400F.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~GODTALOS~) = 0x40130000 <== CODE ORIGINAL du FICHIER ids = 0x4013.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~GODHELM~) = 0x40140000 <== CODE ORIGINAL du FICHIER ids = 0x4014.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~GODLATHANDER~) = 0x40150000 <== CODE ORIGINAL du FICHIER ids = 0x4015.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~TOTEMIC~) = 0x40100000 <== CODE ORIGINAL du FICHIER ids = 0x4010.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~SHAPESHIFTER~) = 0x40110000 <== CODE ORIGINAL du FICHIER ids = 0x4011.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~BEASTFRIEND~) = 0x40120000 <== CODE ORIGINAL du FICHIER ids = 0x4012.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~BARBARIAN~) = 0x00004000 <== CODE ORIGINAL du FICHIER ids = 0x40000000.
    
    CONTROLE KIT TROUVE dans KIT.ids et MODIFIE : $GW_ids(~kit~ ~WILDMAGE~) = 0x00008000 <== CODE ORIGINAL du FICHIER ids = 0x80000000.
    A partir de ces nouvelles valeurs, le WRITE_LONG attribue bien le bon code au champ 0x244 (kit).


    Voici le code de la macro :

    Code:
    COPY_EXISTING - ~kit.ids~ ~override~
    
    	COUNT_2DA_COLS nb_cols			// On compte le nombre de colonnes du fichier
    	COUNT_2DA_ROWS %nb_cols% nb_lignes	// On compte le nombre de lignes du fichier
    
    	FOR (ligne = 0; ligne < %nb_lignes%; ligne = ligne + 1) BEGIN	// Pour chaque ligne
    		READ_2DA_ENTRY %ligne% 0 %nb_cols% code_ids		// On lit la valeur du code du kit (dans la première colonne, considérée comme 0).
    		READ_2DA_ENTRY %ligne% 1 %nb_cols% kit			// On lit la valeur du nom du kit (dans la seconde colonne, considérée comme 1).
    
    		PATCH_IF (STRING_LENGTH "%code_ids%" = 6) THEN BEGIN	// codes de type 0xnnnn, donc longueur de la chaîne = 6
    
    			SPRINT code_kit "%code_ids%0000"		// équivaut à intervertir les blocs : autant se faciliter la vie en rajoutant 4 zéro à la fin de la chaîne.
    
    		END ELSE BEGIN
    
    			INNER_PATCH ~%code_ids%~ BEGIN READ_ASCII 2 first (4)	END	// Lecture de la première chaîne de 4 caractères (après "0x").
    			INNER_PATCH ~%code_ids%~ BEGIN READ_ASCII 6 second (4)	END	// Lecture de la seconde chaîne de 4 caractères.
    
    			SPRINT code_kit "0x%second%%first%"				// Inversion des deux chaînes de caractères sans oublier de rajouter "0x" devant.
    		END
    		SPRINT $GW_ids(~kit~ ~%kit%~) ~%code_kit%~				// Définition de l'array qui sera utilisé pour attribuer la valeur idoine au kit choisi.
    	END
    BUT_ONLY
    Reste un petit détail : manifestement le moteur ne fait pas de différence entre TRUECLASS et MAGESCHOOL_GENERALIST. Mais ça n'a pas l'air de le déranger, notamment dans les fichiers vanilla.
    Dernière modification par Freddy_Gwendo ; 11/08/2015 à 16h10.
    CARPE DIEM...
    Co-modérateur de La Forge et de La Chambre des Scribes
    Moddeur qui s'arrache les cheveux...

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/04/2016, 21h45
  2. [BG1] Votre style de jeu préféré ?
    Par kenshin dans le forum La Taverne de Château-Suif (Baldur's Gate 1)
    Réponses: 50
    Dernier message: 27/03/2009, 20h55
  3. Réponses: 2
    Dernier message: 28/03/2007, 13h19
  4. Quel est votre style ?
    Par Death dans le forum Les Archives du Comptoir
    Réponses: 90
    Dernier message: 16/02/2006, 18h42

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250