Page 1 sur 1

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

Posté : mar. 11 août 2015, 11:59
par Freddy_Gwendo
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 : Tout sélectionner

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 : Tout sélectionner


/*-------------------------------------------------------------------*
 * 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 ?

Posté : mar. 11 août 2015, 16:01
par Freddy_Gwendo
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 : Tout sélectionner

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 : Tout sélectionner

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	// [color="#FFFF00"]codes de type 0xnnnn[/color], donc longueur de la chaîne = 6

			SPRINT code_kit "%code_ids%0000"		// [color="#FFFF00"]équivaut à intervertir les blocs[/color] : 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	// [color="#FFFF00"]Lecture de la première chaîne de 4 caractères[/color] (après "0x").
			INNER_PATCH ~%code_ids%~ BEGIN READ_ASCII 6 second (4)	END	// [color="#FFFF00"]Lecture de la seconde chaîne de 4 caractères.[/color]

			SPRINT code_kit "0x%second%%first%"				// [color="#FFFF00"]Inversion des deux chaînes de caractères sans oublier de rajouter "0x" devant.[/color]
		END
		SPRINT $GW_ids(~kit~ ~%kit%~) ~%code_kit%~				// [color="#FFFF00"]Définition de l'array qui sera utilisé pour attribuer la valeur idoine au kit choisi.[/color]
	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.