Oyez, oyez !

Les résultats du vote sur les meilleurs RPG de tous les temps sont désormais dévoilés dans ce message !

Merci à toutes et à tous pour votre participation !

N'hésitez pas à aller commenter, ajouter des jeux auxquels vous n'auriez pas pensé...

[BAM] Modifier automatiquement une icône d'inventaire de BG2 vers BG2EE

Regroupe tous les fichiers images : Portraits, Icônes et Interface (fichiers mos, chu)
Répondre
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne

[BAM] Modifier automatiquement une icône d'inventaire de BG2 vers BG2EE

.

Message par Freddy_Gwendo »

NOTE : Depuis, j'ai été contacté par l'auteur de BAM Batcher pour intégrer cette fonction à l'utilitaire. Elle a été améliorée pour être utilisée avec des fichiers BAM d'icône inventaire ne répondant pas forcément à la définition que j'ai utilisée. Vous trouverez la toute dernière version de BAM Batcher [post=436906]ici[/post]. La nouvelle fonction est détaillée [POST=436988]là[/POST].

Message initial :

Dans les versions Enhanced, les fichiers BAM des icônes d'inventaire ne sont pas faits comme ceux des versions classiques. Dans ces dernières, elles sont constituées de deux images : une petite (32x32 pixels) que l'on trouve dans les écrans d'inventaire et des boutiques, et une grande (64x64) qui s'affiche lorsqu'on déplace l'objet dans son écran d'inventaire.
Dans BG2EE, en général, les icônes sont constituées d'une seule image, souvent la grande reprise des icônes vanilla.

Quand on utilise dans BG2EE des fichiers bam créés pour un mod classique, le moteur affiche par défaut la grande icône. Ce qui peut devenir gênant lorsque la petite et le grande image sont différentes.
Comme j'ai plus d'un millier de bam concernés et que je ne n'avais pas envie de recréer de nouvelles icônes pour une installation sur BG2EE, j'ai écrit une petite routine WeiDU qui le fait toute seule.

Le but du jeu est d'ajouter la petite image de la seconde séquence du fichier BAM à la première.

En gros :

BG2 Classique : 1° séquence (grande image) - 2° séquence (petite image)
BG2EE : 1° séquence (grande image et petite image)

Code : Tout sélectionner

COPY_EXISTING ~monmod/mabam.bam~ ~override/mabam.bam~

// Lecture du fichier bam
// ----------------------

	READ_ASCII 0x0 sg (4)	// Signature
	READ_ASCII 0x0 sn (3)	// Short signature

// Décompression du fichier si nécessaire : obligatoire pour modifier les séquences
// --------------------------------------
	PATCH_IF (~%sg%~ STRING_EQUAL_CASE ~BAMC~ = 1) BEGIN

		READ_LONG 0x8 dl				// Uncompressed data length
		DECOMPRESS_REPLACE_FILE 0xc (SOURCE_SIZE - 0xc) dl

	END ELSE BEGIN

		dl = SOURCE_SIZE				// Uncompressed data length

	END

// Ajout de la frame 0 comme deuxième image du premier cycle.
// ----------------------------------------------------------
	PATCH_IF (~%sn%~ STRING_EQUAL_CASE ~BAM~ = 1) BEGIN

		READ_SHORT	0x08 fc				// Frame count
		READ_LONG	0x0c fn				// Frame entry offset
		READ_SBYTE	0x0a cc				// Count of cycles
		READ_LONG	0x14 lu				// Offset (from start of file) to frame lookup table
		READ_SHORT	(fc * 0xc + fn)	c_fnb0		// Count of frame indices in 1st cycle

[color="#FFFF00"]		WRITE_SHORT	(fc * 0xc + fn)	(c_fnb0	+ 1)	// Adds one frame in 1st cycle
[/color]
	END

// Recompression du fichier si nécessaire
// --------------------------------------
	PATCH_IF (~%sg%~ STRING_EQUAL_CASE ~BAMC~ = 1) BEGIN
		COMPRESS_REPLACE_FILE 0 dl 9
		INSERT_BYTES 0x0 0xc
		WRITE_ASCII 0x0 ~BAMCV1  ~
		WRITE_LONG 0x8 dl
	END

BUT_ONLY
Et voilou !
Vous pouvez utiliser cette routine à l'intérieur d'un

Code : Tout sélectionner

ACTION_BASH_FOR ~%MOD_FOLDER%/Bam~ ~^.+\.bam$~ BEGIN
Par exemple.

Note : le fichier bam créé conserve la seconde séquence, mais comme la supprimer demanderait une énergie que je n'ai pas et puisque le moteur ne la lit pas, inutile de perdre mon temps à travailler là-dessus. ;)
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

Cette fonction a été intégrée dans Bam Batcher après avoir été retravaillée pour correspondre à "presque tous les cas de figure". La voici :

Code : Tout sélectionner

DEFINE_PATCH_FUNCTION ~GW_CONVERT_INVENTORY_BAM_TO_EE~ BEGIN

// Lecture du fichier bam
// ----------------------
	READ_ASCII 0x0 sg (4)	// Signature
	READ_ASCII 0x0 sn (3)	// Short signature

// Décompression du fichier si nécessaire : obligatoire pour modifier les séquences
// --------------------------------------
	PATCH_IF (~%sg%~ STRING_EQUAL_CASE ~BAMC~ = 1) BEGIN

	    READ_LONG 0x8 dl				// Uncompressed data length
	    DECOMPRESS_REPLACE_FILE 0xc (SOURCE_SIZE - 0xc) dl contents

	END ELSE BEGIN

	    dl = SOURCE_SIZE				// Uncompressed data length
	    READ_ASCII 0 contents (dl)

	END
	SET proceed = 0

	INNER_PATCH_SAVE contents "%contents%" BEGIN

// Ajout de la petite image comme deuxième image du premier cycle.
// ---------------------------------------------------------------
	    PATCH_IF (~%sn%~ STRING_EQUAL_CASE ~BAM~ = 1) BEGIN

		READ_BYTE   0x0a cc				// Count of cycles
		READ_SHORT 0x08 fc				// Frame count
		READ_LONG   0x0c fn				// Frame entry offset
		READ_LONG   0x14 lu				// Offset (from start of file) to frame lookup table
		READ_SHORT (fn + (fc * 0xc))  c_fcc0		// Count of frame indices in 0th cycle

		PATCH_IF (cc = 2) AND (c_fcc0 = 1) BEGIN	// only 2 cycles = inventory bam (ground and description have 1 or 4 frames).  only 1 frame in 0th cycle = not already processed

		    READ_SHORT (fn + (fc * 0xc) + 0x2) c_fic0	// Index into frame lookup table of first frame index in 0th cycle
		    READ_SHORT (fn + (fc * 0xc) + 0x4) c_fcc1	// Count of frame indices in 1st cycle
		    READ_SHORT (fn + (fc * 0xc) + 0x6) c_fic1	// Index into frame lookup table of first frame index in 1st cycle

		    PATCH_IF (c_fcc1>=1) BEGIN			// 1st cycle mush have at least 1 frame in order to add a frame to 0th cycle
			READ_BYTE    (lu + c_fic0) FLT_0	// Get frame used by cycle 0
			READ_BYTE    (lu + c_fic1) FLT_1	// Get frame used by cycle 1
			SET proceed = 1
			WRITE_SHORT  (fn + (fc * 0xc)) 2	// Sets 0th cycle to have 2 frames
			WRITE_SHORT  (fn + (fc * 0xc) + 0x2) 0	// Sets 0th cycle to start at FLT index 0
			WRITE_BYTE   (lu) FLT_0			// Sets 0th FLT entry to the frame used by cycle 0
			WRITE_BYTE   (lu + 1) FLT_1		// Sets 1st FLT entry to the frame used by cycle 1
		    END
		END
	    END


// Recompression du fichier si nécessaire
// --------------------------------------
	    PATCH_IF (~%sg%~ STRING_EQUAL_CASE ~BAMC~ = 1) AND (proceed = 1) BEGIN
		COMPRESS_REPLACE_FILE 0 dl 9
		INSERT_BYTES 0x0 0xc
		WRITE_ASCII 0x0 ~BAMCV1  ~
		WRITE_LONG 0x8 dl
		dl += 0xc				// Compressed data length
	    END

	END
	PATCH_IF (proceed = 1) BEGIN
	    PATCH_IF (SOURCE_SIZE > dl) BEGIN
		DELETE_BYTES 0 (SOURCE_SIZE - dl)
	    END ELSE PATCH_IF (SOURCE_SIZE < dl) BEGIN
		INSERT_BYTES 0 (dl - SOURCE_SIZE)
	    END
	    WRITE_ASCIIE 0 "%contents%"
	END

END	// of DEFINE_PATCH_FUNCTION

Code : Tout sélectionner

ACTION_BASH_FOR ~%MOD_FOLDER%/Bam~ ~^.+\.bam$~ BEGIN
    LPF ~GW_CONVERT_INVENTORY_BAM_TO_EE~ END
END
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Répondre

Retourner vers « Fichiers images »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 0 invité