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é...

[WeiDU] Comment insérer intelligemment de nouvelles entrées dans les fichiers ids ?

Regroupe tous les sujets sur les commandes, les fonctions, les routines, les modifications des fichiers systèmes (ids, 2da...)...
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

[WeiDU] Comment insérer intelligemment de nouvelles entrées dans les fichiers ids ?

.

Message par Freddy_Gwendo »

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 :

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
Puis on insère les nouvelles races :

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
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 :

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~
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

Code : Tout sélectionner

COPY_EXISTING_REGEXP GLOB ~^.+\.cre$~ ~override~
	PATCH_IF (SOURCE_SIZE > 0x2d3) BEGIN
		READ_BYTE  0x274 "spec"  ELSE 0
....
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... :gign:

Un coup de main me serait très utile.
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Isaya
Adepte de Grondemarteau
Planaire
Messages : 6990
Enregistré le : mar. 22 juil. 2003, 21:03
Localisation : Plaisir
Contact :
Statut : Hors ligne
.

Message par Isaya »

Salut Freddy,

j'ai fait quelques essais de mon côté, qui m'ont permis d'aboutir à lire ces informations et de déterminer la valeur maximale utilisée. Malheureusement, c'est 255 ! Du coup j'ai effectué un relevé des valeurs effectivement employées, et ça laisse tout de même des marges de manoeuvre.
Sans tarder voici le code que j'ai employé :

Code : Tout sélectionner

BACKUP ~specific/backup~
AUTHOR ~Isaya~

BEGIN ~Lecture des valeurs specific des creataures~

NO_LOG_RECORD

OUTER_INNER_PATCH ~12~ BEGIN
 WRITE_BYTE 1 0x0a
 READ_ASCII 1 lnl(1)
 WRITE_BYTE 0 0x0d
 READ_ASCII 0 mnl(1)
 READ_ASCII 0 nl(2)
END

OUTER_SET ~max~ = 0
OUTER_SPRINT ~codeCreMax~ ~~
OUTER_SPRINT ~listecreature~ ~~
<<<<<<<< .../specific-inlined/t-creaturetmp.txt
Creature(nom);Valeur de specific
> >> >> >> >
COPY ~.../specific-inlined/t-creaturetmp.txt~ ~override/creaturespecific.csv~

COPY_EXISTING_REGEXP GLOB ~^.+\.cre$~ ~override~
	PATCH_IF (SOURCE_SIZE > 0x2d3) BEGIN
		SPRINT ~codeCre~ ~%SOURCE_RES%~
		READ_STRREF 0x8 name
		INNER_ACTION BEGIN
			OUTER_INNER_PATCH_SAVE ~nomCre~ ~%name%~ BEGIN
				// Elimination de retour à la ligne
				REPLACE_TEXTUALLY EVALUATE_REGEXP ~[%WNL%%LNL%%MNL%]~ ~~
			END
		END
		READ_BYTE  0x274 spec
		PATCH_IF ~%spec%~ > ~%max%~ BEGIN
			SET ~max~ = ~%spec%~
			SPRINT ~codeCreMax~ ~%SOURCE_RES%~
		END
        SPRINT listecreature ~%listecreature%%codeCre% (%nomCre%);%spec%%nl%~
	END
	BUT_ONLY

PRINT ~Valeur max de specific : %max%, creature %codeCreMax%~
// Ecritures des fichiers
APPEND ~creaturespecific.csv~ ~%listecreature%~
Je soupçonne que tu avais déjà obtenu plus ou moins la même chose. Le fichier creaturespecific.csv recense toutes les créatures et les valeurs utilisées. Avec Excel, et un filtre sur la colonne, je constate qu'environ la moitié des valeurs est utilisée.

Je me suis dit, qu'à cela ne tienne, je vais recenser dans un tableau les valeurs utilisées, comme ça il ne restera qu'à utiliser les restantes. Et c'est là que des limitations de WeiDU apparaissent : il n'y a pas vraiment de tableau. En tout cas aucun qui soit simple à remplir dynamiquement.
L'exemple 10.20 de la documentation me laisse plus que perplexe, de même que les autres commandes qui semblent manipuler des tableaux. Cela me donne l'impression qu'on ne peut jamais écrire dedans.
J'ai beaucoup réfléchir, à part créer 256 variables, les recenser dans un tableau préinitialiser, puis le parcourir autant de fois que la valeur de specific pour savoir le nombre de la variable dans laquelle écrire, je n'ai pas trouvé de solution qui semble accessible (et encore je ne suis pas certain de celle-ci non plus).

Du coup, le seul truc qui me vient à l'esprit est une infâme bidouille : utiliser un fichier bidon, d'au moins 256 caractères, comme tableau. Tu le remplis de 0 au départ. Puis tu parcours tous les fichiers CRE et à chaque fois que tu lis une valeur specific, tu fais un WRITE_BYTE de la valeur 1 dans le fichier bidon à l'adresse correspondant à la valeur de specific.
Une fois que tu as lu toutes les créatures, il te faudrait parcourir le fichier bidon octet par octet pour trouver une adresse toujours à 0, ce qui te donne une valeur de specific utilisable pour une de tes créatures. Tu la stockes dans une variable que tu utiliseras par la suite pour changer la valeur de specific quand tu copies tes créatures. Et ainsi de suite pour le nombre de valeurs dont tu as besoin.

On n'a pas idée de vouloir faire des choses pareilles... :p
:!: Peu disponible
Guide d'installation (et FAQ) de Baldur's Gate, Baldur's Gate II, Baldur's Gate Trilogy (BGT), BG1Tutu, Widescreen, BGEE
Pensez à utiliser à la fonction Recherche pour trouver une réponse à votre question !
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 »

Juste une petite question qui me turlupine : Les fichiers ids (race, class, specific...) sont-ils vraiment limités à 256 entrées (0 à 255) ?

IESDP n'en fait aucune mention.

Édit : si ce n'était pas le cas, ça m’ôterait une sacrée épine du pied ! ;)
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Isaya
Adepte de Grondemarteau
Planaire
Messages : 6990
Enregistré le : mar. 22 juil. 2003, 21:03
Localisation : Plaisir
Contact :
Statut : Hors ligne
.

Message par Isaya »

Je ne pense pas qu'il y ait une contrainte particulière sur les fichiers IDS. Par contre, lorsqu'ils constituent une liste de valeurs possibles pour des champs des structures de fichier, ces valeurs sont nécessairement contraintes par la taille des champs de structure. Par conséquent, pour classe, specific et autres champs du fichier CRE limités à 1 octet, la limite est inévitablement à 255.
On trouve d'ailleurs des fichiers IDS où les valeurs dépassent 255, y compris pour des champs de structures.
:!: Peu disponible
Guide d'installation (et FAQ) de Baldur's Gate, Baldur's Gate II, Baldur's Gate Trilogy (BGT), BG1Tutu, Widescreen, BGEE
Pensez à utiliser à la fonction Recherche pour trouver une réponse à votre question !
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 »

Isaya a écrit : On n'a pas idée de vouloir faire des choses pareilles... :p
Ben ouais !
C'est vrai que les choses sont beaucoup plus simples quand on mode dans son coin, en solo, juste pour son plaisir : on se fout des incompatibilités ! ;)

Mais quand on décide d'en faire profiter d'autres, les choses se compliquent un tantinet...

D'ailleurs tu auras sans doute remarqué que lorsque je poste, c'est généralement pour du lourd. Des trucs pas courants ou pas encore faits, voire souvent infaisables... Après m'être échiné dessus pendant des semaines...

Bref, voilà où j'en suis : j'ai reconstruit un fichier specific avec ma config minimale (bg2 Fixpack, TobEx, aTweaks et BG2 Tweaks, plus deux trois autres mods cosmétiques comme 1PP et IA) :
► Afficher le texte
J'ai renommé "UNKNOWN_VANILLA_nnn" les valeurs specific trouvées dans les créatures. C'est juste un confort perso pendant le développement.
Voici le code utilisé pour y parvenir :
► Afficher le texte

Comme je me doutais un peu de la réponse à la question à laquelle tu as répondu hier soir (255 = valeur max), j'ai voulu partir de la fin du fichier et ajouter mes codes.
Ça fonctionne jusqu'au code 235 : à partir de 234, il n'écrit plus rien.

J'ai essayé de partir du début : lire les premières valeurs et ajouter un code quand il y a un vide. Ça ne fonctionne pas non plus !

Voici l'état de mon dernier code qui ne fonctionne pas :
► Afficher le texte

Du coup, je crains de devoir me rabattre sur ta proposition :
Isaye a écrit : Je me suis dit, qu'à cela ne tienne, je vais recenser dans un tableau les valeurs utilisées, comme ça il ne restera qu'à utiliser les restantes. Et c'est là que des limitations de WeiDU apparaissent : il n'y a pas vraiment de tableau. En tout cas aucun qui soit simple à remplir dynamiquement.
L'exemple 10.20 de la documentation me laisse plus que perplexe, de même que les autres commandes qui semblent manipuler des tableaux. Cela me donne l'impression qu'on ne peut jamais écrire dedans.
J'ai beaucoup réfléchi, à part créer 256 variables, les recenser dans un tableau préinitialisé, puis le parcourir autant de fois que la valeur de specific pour savoir le nombre de la variable dans laquelle écrire, je n'ai pas trouvé de solution qui semble accessible (et encore je ne suis pas certain de celle-ci non plus).

Du coup, le seul truc qui me vient à l'esprit est une infâme bidouille : utiliser un fichier bidon, d'au moins 256 caractères, comme tableau. Tu le remplis de 0 au départ. Puis tu parcours tous les fichiers CRE et à chaque fois que tu lis une valeur specific, tu fais un WRITE_BYTE de la valeur 1 dans le fichier bidon à l'adresse correspondant à la valeur de specific.
Une fois que tu as lu toutes les créatures, il te faudrait parcourir le fichier bidon octet par octet pour trouver une adresse toujours à 0, ce qui te donne une valeur de specific utilisable pour une de tes créatures. Tu la stockes dans une variable que tu utiliseras par la suite pour changer la valeur de specific quand tu copies tes créatures. Et ainsi de suite pour le nombre de valeurs dont tu as besoin.

On n'a pas idée de vouloir faire des choses pareilles...
Il faudrait donc que, lors de la reconstruction du fichier specific, je parte d'un fichier à 256 valeurs, plutôt que d'un fichier vierge, ce qui donnerait à peu près ceci (en théorie) :

Code : Tout sélectionner

0 UNKNOWN_VANILLA_000
1 NORMAL
2 UNKNOWN_VANILLA_002
3 UNKNOWN_VANILLA_003
4 UNKNOWN_VANILLA_004
5 UNKNOWN_VANILLA_005
6 UNKNOWN_VANILLA_006
7 UNKNOWN_VANILLA_007
8 UNKNOWN_VANILLA_008
[color="#FFFF00"]9 0[/color]
10 UNKNOWN_VANILLA_010
Puis que je remplace la ligne 9 0 par 9 "Valeur 1 specific Freddy" par exemple.

C'est pas gagné ! :$
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 »

Ça m'a pris un peu de temps, mais j'y suis arrivé. :dance4:

Pour ceux que ça intéresse, voici le détail de la bête :

Code : Tout sélectionner

BACKUP ~specific/backup~
AUTHOR ~Freddy_Gwendo~


BEGIN ~Ajout de nouvelles valeurs specific des creatures apres actualisation, tri et reecriture du fichier specific.ids~

NO_LOG_RECORD // A enlever quand on passe le code dans un tp2 de mod.

/* ----------------------------------------------------------------------------------------------------------------------------- *
 * GW_VERIF_SPECIFIC : FONCTION vérifiant que toutes les valeurs specific des créatures sont bien contenues dans le fichier .ids *
 * ----------------------------------------------------------------------------------------------------------------------------- */

DEFINE_PATCH_FUNCTION GW_VERIF_SPECIFIC
	INT_VAR cre_specific = 0
BEGIN

INNER_ACTION BEGIN
	COPY_EXISTING - ~specific.ids~ ~override~
	READ_2DA_ENTRIES_NOW gw_verif_specifics 2
	SET noajout = 0
	FOR (i=0;i<gw_verif_specifics;i+=1) BEGIN
		READ_2DA_ENTRY_FORMER gw_verif_specifics i 0 index
		READ_2DA_ENTRY_FORMER gw_verif_specifics i 1 str
		PATCH_IF (%cre_specific% != %index%) BEGIN
			SET nv_index = %cre_specific%
		END ELSE BEGIN SET noajout = 1
		END
	END
	PATCH_IF (%noajout% != 1) BEGIN
		PATCH_IF (("%nv_index%" < 10) AND ("%nv_index%" != 1)) BEGIN SPRINT nv_texte "UNKNOWN_VANILLA_00%nv_index%" END
		PATCH_IF (("%nv_index%" > 9) AND ("%nv_index%" < 100)) BEGIN SPRINT nv_texte "UNKNOWN_VANILLA_0%nv_index%" END
		PATCH_IF (("%nv_index%" > 99) AND ("%nv_index%" != 101) AND ("%nv_index%" != 102)) BEGIN SPRINT nv_texte "UNKNOWN_VANILLA_%nv_index%" END
		INNER_ACTION BEGIN APPEND ~SPECIFIC.IDS~ ~%nv_index% %nv_texte%~	UNLESS ~%nv_texte%~	END
	END
END
END



SILENT		// Pour reposer les yeux car on vérifie toutes les créatures ! 
COPY_EXISTING_REGEXP GLOB ~^.+\.cre$~ ~override~
	PATCH_IF (SOURCE_SIZE > 0x2d3) BEGIN
		READ_BYTE  0x274 spec
		LPF GW_VERIF_SPECIFIC INT_VAR cre_specific = EVAL "%spec%" END
	END
BUT_ONLY
VERBOSE



/* ---------------------------------------------------------------- *
 * reorder_specific_ids : MACRO réordonnant le fichier specific.ids *
 * ---------------------------------------------------------------- */

DEFINE_ACTION_MACRO reorder_specific_ids BEGIN

COPY_EXISTING - specific.ids ~override~
	max=1
	READ_2DA_ENTRIES_NOW gw_reorder_specific 2
	FOR (i=0;i<gw_reorder_specific;i+=1) BEGIN
		READ_2DA_ENTRY_FORMER gw_reorder_specific i 0 index
		READ_2DA_ENTRY_FORMER gw_reorder_specific 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 $specific("%min%") $arr2("%min%")
		SPRINT $arr2("%min%") ~~
	END

<<<<<<<<.../inline/blank
> >> >> >> >
COPY ~.../inline/blank~ ~override/specific.ids~
	ACTION_PHP_EACH specific AS ind => res BEGIN
		APPEND specific.ids ~%ind% %res%~
	END

ACTION_CLEAR_ARRAY specific		// INDISPENSABLE : sans la réinitialisation des tableaux (arrays), la macro ne prend pas en compte les nouvelles valeurs du fichier
ACTION_CLEAR_ARRAY arr1			// Il faut donc impérativement les "vider" après chaque tri et réécriture du fichier.
ACTION_CLEAR_ARRAY arr2
END

LAM reorder_specific_ids	// On la lance pour trier le nouveau fichier specific.



/* -------------------------------------------------------------------------------------------------------------------------------- *
 * GW_add_specific_ids : FONCTION insérant les nouvelles valeurs specific dans les emplacements (slots) disponibles du specific.ids *
 * -------------------------------------------------------------------------------------------------------------------------------- */

DEFINE_ACTION_FUNCTION GW_add_specific_ids STR_VAR nv_valeur = "same" BEGIN

	COPY_EXISTING ~specific.ids~ ~override~
		ajout = 0
		FOR (new=compteur;new<256;new = new + 1) BEGIN
			PATCH_IF (ajout = 0) BEGIN
				READ_2DA_ENTRIES_NOW gw_add_specifics 2
				FOR (i=0;i<gw_add_specifics;i+=1) BEGIN
					PATCH_IF (i>=new) BEGIN
						READ_2DA_ENTRY_FORMER gw_add_specifics i 0 indexsp
						PATCH_IF (ajout = 0) BEGIN
							PATCH_IF (new = indexsp) BEGIN 	SET new = new + 1 
							END ELSE BEGIN	SET ajout = 1 
									SET nvindex = new 
									SET compteur = new + 1
								SPRINT $nvspecific("%nvindex%") ~%nv_valeur%~
							END
						END
					END
				END
			END
		END
		ACTION_PHP_EACH nvspecific AS ind => res BEGIN
			APPEND specific.ids ~%ind% %res%~
		END
LAM reorder_specific_ids	// Tri du fichier une fois la valeur saisie

END




OUTER_SET compteur = 0	// Variable permettant de diminuer le temps de traitement pour chaque nouvelle valeur : une fois un emplacement déterminé, le traitement suivant saute les premières valeurs du fichier ids déjà traitées.
ACTION_FOR_EACH newspecific IN ~BLACK_DRAGON~ ~BLUE_DRAGON~ ~GREEN_DRAGON~ ~RED_DRAGON~ ~WHITE_DRAGON~ ~BRASS_DRAGON~ ~BRONZE_DRAGON~ ~COPPER_DRAGON~ ~GOLD_DRAGON~ ~SILVER_DRAGON~
	~AMETHYST_DRAGON~ ~CRYSTAL_DRAGON~ ~EMERALD_DRAGON~ ~SAPPHIRE_DRAGON~ ~TOPAZE_DRAGON~ ~BROWN_DRAGON~ ~DEEP_DRAGON~ ~PRISMATIC_DRAGON~ ~PURPLE_DRAGON~ ~RATTELYR_DRAGON~ ~SHADOW_DRAGON~ 
	~YELLOW_DRAGON~ ~CHANT_DRAGON~ ~FANG_DRAGON~ ~MERCURY_DRAGON~ ~MIST_DRAGON~ ~STEEL_DRAGON~ ~CHAOS_DRAGON~ ~HOWLING_DRAGON~ ~PYROCLASTIC_DRAGON~ ~RUST_DRAGON~ ~ARBOREAL_DRAGON~ 
	~AXIAL_DRAGON~ ~BATTLE_DRAGON~ ~OCEANUS_DRAGON~ ~RADIANT_DRAGON~ ~ADAMANTITE_DRAGON~ ~DEVOUR_BRAIN_DRAGON~ ~SORCELLERIE_DRAGON~ ~ZOMBIE_DRAGON~ ~VAMPIRIC_DRAGON~ ~DRACOLICH~ 
	~FLYING_SUMMONED~ ~FLYING_CREATURE~ ~FIRE_CREATURE~ ~MUMMY~ ~REVENANT~ BEGIN
	LAF GW_add_specific_ids STR_VAR nv_valeur = EVAL "%newspecific%" END
END
Testé pour les fichiers specific, race et class.ids : Ça fonctionne.

Il y a surement des trucs à rendre plus performants, mais je m'en contenterai pour l'instant.

Me reste à définir les variables pour créer une fonction globale qui chargera automatiquement le bon fichier ids. Comme ça je n'aurai qu'une procédure pour mes trois fichiers.

La suite au prochain épisode. ;)
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 »

Comme promis, vous trouverez en pièce jointe un mini mod qui permet de rajouter de nouvelles valeurs class, race et specific en parfait accord avec les variables existantes dans les fichiers .cre mais non définies dans les fichiers ids associés.

Fini les roturiers codés en dragons vampiriques ! ;)

J'ai automatisé les procédures pour qu'elles soient applicables à tous les fichiers ids. ^^


Deux choses importantes :
  1. Cette procédure a été conçue pour coder de nouvelles créatures en phase de développement. Si vous souhaitez l'utiliser dans un mod "normal", supprimez la ligne NO_LOG_RECORD, sinon vous ne pourrez pas la désinstaller.
  2. Entrez vos propres valeurs dans le dernier bloc. Comme dans celui-ci :
    ACTION_FOR_EACH newspecific IN ~BLACK_DRAGON~ ~BLUE_DRAGON~ ~GREEN_DRAGON~ ~RED_DRAGON~ ~WHITE_DRAGON~ ~BRASS_DRAGON~ ~BRONZE_DRAGON~ BEGIN

N'hésitez pas à utiliser le code d'Isaya pour lister les valeurs "cachées" des autres fichiers ids. Je le ferai à l'occasion quand j'aurai besoin de patcher un autre fichier. Mais pour l'instant, j'ai d'autres lignes de code à fouetter. :whistle3:


:!: Enfin, il me semble avoir lu quelque part il y a bien longtemps que les 10 premières valeurs du fichier race.ids étaient hardcodées (notamment pour la gestion des bonus-malus liés). Mais comme je n'ai pas retrouvé trace de cette discussion, il est pour l'instant possible d'ajouter des valeurs race inférieures à 10. Si quelqu'un me confirme cette impossibilité, je modifierai le code.
Fichiers joints
GWAjout_ids Alpha 0.7z
(846.91 Kio) Téléchargé 111 fois
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 »

Freddy_Gwendo a écrit : :!: Enfin, il me semble avoir lu quelque part il y a bien longtemps que les 10 premières valeurs du fichier race.ids étaient hardcodées (notamment pour la gestion des bonus-malus liés). Mais comme je n'ai pas retrouvé trace de cette discussion, il est pour l'instant possible d'ajouter des valeurs race inférieures à 10. Si quelqu'un me confirme cette impossibilité, je modifierai le code.
Ça ne vous dit vraiment rien ? :$ ;) :$
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Isaya
Adepte de Grondemarteau
Planaire
Messages : 6990
Enregistré le : mar. 22 juil. 2003, 21:03
Localisation : Plaisir
Contact :
Statut : Hors ligne
.

Message par Isaya »

Cela ne me dit rien mais ce n'est pas non plus le genre d'information qui m'intéressait.

Tu peux poser la question sur le forum de Beamdog, tu auras peut-être la chance d'avoir une réponse d'un programmeur. Dernièrement Sam a eu des réponses à propos des animations (mais c'était pour des nouveautés des Enhanced Edition).
:!: Peu disponible
Guide d'installation (et FAQ) de Baldur's Gate, Baldur's Gate II, Baldur's Gate Trilogy (BGT), BG1Tutu, Widescreen, BGEE
Pensez à utiliser à la fonction Recherche pour trouver une réponse à votre question !
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 »

Il me semble que j'avais lu ça sur G3. Je ferai une dernière recherche ce soir et si ça ne donne rien, je tenterai le coup sur Beamdog, sans grand espoir...
J'attends toujours des réponses au sujet des formats d'animations qui n'affichent pas ce qu'ils devraient... :gign:
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Répondre

Retourner vers « Programmation WeiDU »

Qui est en ligne

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