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

[KIT] Comment coder la variable "Autorisation d'objets" d'un nouveau kit ?

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

[KIT] Comment coder la variable "Autorisation d'objets" d'un nouveau kit ?

.

Message par Freddy_Gwendo »

Je suis en train de finaliser deux kits pour mon mod ; le Chevalier de Diamant et la Chevaucheuse de Licorne.

Il me reste deux trois sorts à terminer, les fichiers 2da sont terminés, mais je bute sur la définition de cette variable à inclure au fichier KITLIST.2DA.

Je me suis amusé à vérifier à quoi elle correspondait et c'est un peu le souk !
Par exemple, celle du cavalier renvoie le code Neutre !

Bref, pour mes deux kits de paladins, quelle valeur dois-je utiliser ?

Je suppose que c'est lié aux objets qu'ils peuvent utiliser, mais je ne pige pas le truc. :$
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 »

En réalité la valeur de KitList.2da indique plutôt les interdictions d'utilisation et ne correspond absolument pas aux bits que l'on met dans les objets pour indiquer qui a le droit de s'en servir (qui couvre classes et alignements, notamment). Chaque bit est associé à une classe ou un kit (pas d'alignement) et renvoie à une liste d'interdits qui découle sans doute du contenu de WEAPROF.2DA. Cela joue aussi sur le choix de compétence offert à la montée de niveau.

Comme indiqué dans le tutoriel de création de kit, cette colonne permet de définir ce qui est interdit au kit. Chaque bit de la valeur correspond à une classe ou à un kit disponible dans BG II. Il y a une valeur particulière qui permet de reprendre à l'identique les interdits de la classe mère du kit. La seule alternative est d'adopter les interdits d'une classe ou d'un kit existant. Pour les masochistes, on peut aussi cumuler les interdits de plusieurs classes/kits.
:!: 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
deratiseur
Golem de fer
Messages : 3697
Enregistré le : mer. 05 déc. 2007, 18:35
Localisation : Gap, Hautes alpes
Statut : Hors ligne
.

Message par deratiseur »

Freddy, dis moi ce que tu voudrais précisément comme interdiction d'équipement et je te dirais si c'est possible et/ou comment le faire/le contourner.
Le standard téléphonique est en rade : l'atelier du Deratiseur ne répondra plus à aucune demande personnalisée.
Bosse sur : Interplan v9, Derat's Kri'Binn, Todd : KOPP2.

Mes mods sont tous sur Mediafire et Github
Et leurs descriptions sont ici.
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 »

J'ai fini par déchiffrer les codes hex donnés dans la kittable : ils correspondent à la seconde série des usability codes des fichiers itm.

Mon problème consiste à en définir de nouveaux pour mes 2 kits.

Exemple pour le Chevalier de Diamant :

- Il ne peut porter que des armures de plates et des écus.
- Il considère comme contraire à l'honneur de se battre à distance et refuse d'utiliser des armes de trait, excepté les haches et les marteaux de jet.
- Il ne peut pas combattre dans le style de combat à deux armes.

Code : Tout sélectionner

ADD_KIT ~GW_DIAMNOND_KNIGHT~

// pas d'épée courte, pas d'arc, pas de dagues

~GW_DIAMOND_KNIGHT       0           1           1           1           0           1           1           1~	// Types d'armes autorisés - CLASWEAP

~GW_DIAMOND_KNIGHT       5 0 0 5 5 5 5 0 5 5 0 5 5 5 2 0 5 0 5 0 0 0 0 0 0 0 0 0 2 2 2 0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5~	// Compétences autorisées - WEAPPROF.2da

// LARGE_SWORD 5	SMALL_SWORD	0	BOW	0	SPEAR 5	BLUNT 5	SPIKED 5	AXE 5 	MISSILE 0	
// BASTARDSWORD 5	LONGSWORD 5			SHORTSWORD 0	AXE 5			TWOHANDEDSWORD 5	KATANA 5	SCIMITARWAKISASHININJATO 2	DAGGER 0	WARHAMMER 5	CLUB 0	SPEAR 5
// HALBERD 0		FLAILMORNINGSTAR 0	MACE 0	QUARTERSTAFF 0	CROSSBOW 0	LONGBOW 0	SHORTBOW 0	DART 0	SLING 0
// 2HANDED 2		SWORDANDSHIELD 2	SINGLEWEAPON 2	 2WEAPON 0

Quand à la chevaucheuse, en gros, comme elle est sensée monter une licorne, elle ne peut pas porter d'armures plus lourdes que la cotte de mailles et possède à peu près les mêmes restrictions que les cavaliers, mais peut utiliser l'arc.
Désolé pour ses caractéristiques exactes, mais je ne les ai pas sur moi en ce moment.
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
deratiseur
Golem de fer
Messages : 3697
Enregistré le : mer. 05 déc. 2007, 18:35
Localisation : Gap, Hautes alpes
Statut : Hors ligne
.

Message par deratiseur »

Alors :
- Il ne peut porter que des armures de plates et des écus.
Il n'y a aucun code qui permette ça, mais tu peux tricher : tu peux par exemple patcher toutes les armures "de plates" (il faudra les patcher en fonction de l'animation, voir le code pour patcher "tous les katanas" dans le TP2 du chantelame v6)
pour qu'elle puisse être utlisée par le métamophe, et tu donnes le code du métamorphe en plus de tous les autres à ton chevalier. Astuce : toutes les armures sont interdites au métamophes ET les armures de plates sont interdites au druide. En faisant comme indiqué il ne pourra porter aucune armure (parce que codé métamorphe) sauf les plates parce qu'elles sont patchée pour. Et l'armure de plate ne pourra de toute façon par être utilisée par le métamorphe parce qu'elle reste interdite aux druides.(et ton chevalier reste un guerrier ou paladin)
Même méthode pour les bouclier : rendre interdit au métamorphe tout ce qui est petit bouclier, rondache, targe, etc.... (par défaut il sont autorisés), en les patchant. Comme ton chevalier à aussi le code du métamorphe, il lui restra l'acés à tout ce que tu n’auras pas patcher.
Astuce de compatibilité : le chantelame v6 utilise lui même le code du métamorphe. En faisant cela tu lui autorisera les armures de plates, et je ne vois pas comment faire autrement (le métamophe et le kensai sont les seul kits interdisant les armures légères, si on excepte les mage spécialisés (mais ceux là on ne peut pas les utiliser car on ne peut rien interdire à un mage spécialisé qui peut se jumeler ou multiclasser en voleur/guerrier/prêtre).

- Il considère comme contraire à l'honneur de se battre à distance et refuse d'utiliser des armes de trait, excepté les haches et les marteaux de jet.
Ça c'est plus compliqué. Pas faisable par code non plus, mais en cherchant bien on se rend compte que le cavalier n'a à en théorie accès à aucune arme de jet sauf qu'il peut utiliser les haches de jet et les dagues de jet. Si tu veux bien que ton chevalier puisse utiliser les dagues de jets, code du cavalier et s'est fini. Sinon, même technique : code du cavalier+code du prêtre de Helm et patchage de toutes les dagues de jet (méthode empirique à adapter avec tous les mods rajoutant des dagues) pour être inutilisable par les prêtres de helm (elle ne le sont pas par défaut mais elle restent interdites au prêtre )

- Il ne peut pas combattre dans le style de combat à deux armes.
Trés facile, et tu l'as déjà fait, c'est effectivement le 0 après les trois 2 et avant la série de 5 dans la ligne correspondant au WEAPPROF.2da. Il peut utiliser deux armes, mais il aura un tel malus que ça ne vaut franchement pas le coup.
[/QUOTE]
Le standard téléphonique est en rade : l'atelier du Deratiseur ne répondra plus à aucune demande personnalisée.
Bosse sur : Interplan v9, Derat's Kri'Binn, Todd : KOPP2.

Mes mods sont tous sur Mediafire et Github
Et leurs descriptions sont ici.
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 »

Merci pour ce retour.

Donc si j'ai bien compris, le but du jeu est d'additionner deux codes de kits déjà existants en choisissant ceux qui se rapportent aux interdictions que j'ai définies, puis de patcher les objets concernés.
Ça va donc m'imposer de coder l'installation en deux parties : le mod proprement dit, puis les kits à installer en dernier en cas de Big Install pour prendre en compte les objets des autres mods.
Comme j'ai prévu des scripts particuliers pour certains créatures, j'avais déjà imaginé une installation similaire pour ceux qui veulent installer SCS ou BP. Comme ça, mes scripts ne seraient pas concernés par l'IA général. Il me suffira de rajouter les kits à ce moment.


Je travaillerai les codes d'interdiction ce week-end et te tiendrai informé.
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 »

Voici ce que ça donne :

Modification des objets à installer APRES les autres mods :

Code : Tout sélectionner

COPY_EXISTING_REGEXP GLOB ~^.+\.itm$~ ~override~
	PATCH_IF (SOURCE_SIZE > 0x71) BEGIN
		READ_ASCII 0x22 animation (2)

		[color="#FFFF00"]PATCH_IF ("%animation%" STRING_EQUAL_CASE "4A") BEGIN	// Plates[/color]
			WRITE_BYTE 0x29 THIS BAND 0b11101111		// [color="#FFFF00"]ajoute Métamorphe[/color]
		END

		[color="#FFFF00"]PATCH_IF (SHORT_AT 0x1c == 0x0C) BEGIN	// Boucliers[/color]

			PATCH_IF ("%animation%" STRING_COMPARE_CASE "D3") AND ("%animation%" STRING_COMPARE_CASE "C1") AND ("%animation%" STRING_COMPARE_CASE "C3") 
					AND ("%animation%" STRING_COMPARE_CASE "C5") AND ("%animation%" STRING_COMPARE_CASE "C7") BEGIN
//	D3-Shield (Medium) - C3-Shield 2 (Medium) - C1-Shield 2 (Large) - C5-Shield 3 (Small) - C7-Scale Shield
//	D2-Shield (Small)	C0-Shield 2 (Small)	D1-Buckler	C4-Shield 2 (Buckler)	D4-Shield (Large)	C2-Shield 3 (Large)	C6-Shield 4 (Large)
				WRITE_BYTE 0x29 THIS | BIT4		// [color="#FFFF00"]enlève Métamorphe[/color]
			END

		END

		[color="#FFFF00"]PATCH_IF (SHORT_AT 0x1c == 0x10) BEGIN	// Dagues[/color]
			READ_LONG   0x64 "abil_off"
			READ_SHORT  0x68 "abil_num"
			FOR (i = 0 ; i < abil_num ; i = i + 1) BEGIN
				READ_BYTE  ("%abil_off%" + (0x38 * i)) "type"
				PATCH_IF (type = 2) BEGIN
				WRITE_BYTE 0x29 THIS | BIT1		// [color="#FFFF00"]enlève Prêtre de Helm[/color]
				
				END
			END
		END
	END // Source
BUT_ONLY
Ce qui donne la ligne :

Code : Tout sélectionner

~0x12000008     6~	// Autorisation d'objets - KITLIST.2DA	[color="#FFFF00"]0x12000008 = Cavalier + Shapshifter + Prêtre de Helm[/color]
Ne restera plus qu'à tester quand les autres divers problèmes auront été résolus ! ;)
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 »

J'exhume ce fil pour confirmer que tout fonctionne parfaitement bien. J'ai même réussi à autoriser ma chevaucheuse à utiliser les arcs SAUF les arcs composites et à porter des cottes de mailles elfiques MAIS PAS de cottes de mailles classiques.

Mais plus fort et plus facile : pour tous ceux qui voudraient moder avec les versions EE, c'est beaucoup plus simple et on n'est plus obligé de bidouiller les codes d'interdiction. Il suffit de patcher les objets concernés avec le nouvel effet #319 en utilisant la valeur du kit pour le paramètre 1 et 9 pour le paramètre 2.
#319 (0x13F) Usability: Item Usability
Parameter #1: IDS Entry
Parameter #2: IDS File
Special: Description note
Description:
This effect restricts the item to creature(s) matching the object identifiers. The string to display when an invalid creature attempts to use the item is held in 0x2c.
Known values for 'IDS File' are:
2 EA.ids
3 General.ids
4 Race.ids
5 Class.ids
6 Specific.ids
7 Gender.ids
8 Align.ids
9 Kit.ids
10 Actor's name
11 Actor's scripting name (8 maximum in resource field)
If 'IDS File' is set to 10, the item is restricted to characters with the name specified by the strref held in parameter1.
If 'IDS File' is set to 11, the item is restricted to characters with the death variable specified by the resource field.

The message defined in 'Description note' will be displayed whenever this effect is triggered.
Ce qui donne pour les armures légères :

Code : Tout sélectionner

COPY_EXISTING_REGEXP GLOB ~^.+\.itm$~ ~override~
   PATCH_IF (SOURCE_SIZE > 0x71) BEGIN
      READ_BYTE 0x18 flags1
      PATCH_IF ((flags1 & BIT3) = BIT3) BEGIN					// Movable, otherwise useless.
	   READ_BYTE	0x29 kit_usability1
	   READ_BYTE	0x2b kit_usability2
	   READ_ASCII	0x22 animation (2)
	   READ_BYTE	0x31 item_prof						// Weapon Proficiency

// Armure de cuir, Besantine et Cuirasse (Leather, Studded, Hide) : Chevalier de Diamant can't wear them.
// ------------------------------------------------------------------------------------------------------
	   [color="#FFFF00"]PATCH_IF ("%animation%" STRING_EQUAL_CASE "2A") BEGIN		// 2A = Animations des armures de cuir[/color]

		PATCH_IF GW_EE BEGIN						// GW_EE = variable définie auparavant indiquant que le jeu est EE

		   LPF ~GW_ITEM_RESTRICT_USABILITY_BGEE~ STR_VAR GW_restrict = "GW_DIAMOND_KNIGHT" GW_kind = "KIT" GW_mess319 = 7700002 END // @7700002 = ~Chevalier de Diamant~

		END ELSE BEGIN							// Sinon, ce n'est pas une version EE

		   PATCH_IF ((kit_usability1 & BIT4) = 0) BEGIN			// CD : if usable by shapeshifters

		      WRITE_BYTE 0x29 THIS | BIT4					// remove shapeshifters flag

		   END
		END
	   END
...
avec la fonction GW_ITEM_RESTRICT_USABILITY_BGEE définie avant de lancer la procédure pour éviter d'aller chercher la valeur du kit.

Code : Tout sélectionner

/* =============================================================================================================== *
 * FONCTION GW_ITEM_RESTRICT_USABILITY_BGEE : INTERDIT l'UTILISATION d'UN OBJET à un type de créature dans BG2EE.  *
 * --------------------------------------------------------------------------------------------------------------- *
 * #319 Usability: Item Usability : This effect restricts the item to creature(s) matching the object identifiers. *
 * The string to display in the description note is held in 0x2c.                                                  *
 * =============================================================================================================== */

DEFINE_PATCH_FUNCTION ~GW_ITEM_RESTRICT_USABILITY_BGEE~ 
	STR_VAR GW_restrict = ""	// HUMAN, MALE, CAVALIER... Or string defining Actor's name, or scripting name (8 maximum length).
		GW_kind		= ""	// IDS file : EA, General, Race, class, Specific, Gender, Align, Kit. OR Name (Actor's name), script_name (Actor's scripting name).
		GW_mess319	= 0	// Description note (special field)
BEGIN

	PATCH_IF (ENGINE_IS ~bgee bg2ee eet~) OR GAME_INCLUDES ~sod~ BEGIN

		SET GW_param2 = 0
		SET GW_special319 = 0
		SPRINT GW_resource319 ""

		PATCH_IF ("%GW_restrict%" STR_CMP ~~) AND ("%GW_kind%" STR_CMP ~~) BEGIN 

		// IDS files case : EA, General, Race, class, Specific, Gender, Align, Kit.
		// --------------

			PATCH_IF ("%GW_kind%" STRING_COMPARE_CASE ~NAME~) AND ("%GW_kind%" STRING_COMPARE_CASE ~SCRIPT_NAME~) BEGIN 

				PATCH_IF FILE_EXISTS_IN_GAME ~%GW_kind%.ids~ BEGIN

					SET GW_param1 = IDS_OF_SYMBOL (~%GW_kind%~ ~%GW_restrict%~)

					PATCH_IF (GW_param1 != "-1") BEGIN		// IDS_OF_SYMBOL returns -1 if GW_restrict is not associated in GW_kind.ids.

						PATCH_MATCH ~%GW_kind%~ WITH
							EA		 BEGIN	SET GW_param2 = 2 END
							GENERAL	 BEGIN	SET GW_param2 = 3 END
							RACE	 BEGIN	SET GW_param2 = 4 END
							CLASS	 BEGIN	SET GW_param2 = 5 END
							SPECIFIC BEGIN	SET GW_param2 = 6 END
							GENDER	 BEGIN	SET GW_param2 = 7 END
							ALIGN	 BEGIN	SET GW_param2 = 8 END
							KIT		 BEGIN	SET GW_param2 = 9 END
							DEFAULT
						END	// of PATCH_MATCH ~%GW_kind%~ WITH
					END		// of PATCH_IF (GW_param1 != "-1")
				END			// of PATCH_IF FILE_EXISTS_IN_GAME ~%GW_kind%.ids~
			END				// of PATCH_IF ("%GW_kind%" STRING_COMPARE_CASE ~NAME~) AND ("%GW_kind%" STRING_COMPARE_CASE ~SCRIPT_NAME~)

		// Actor's name case : If 'IDS File' is set to 10, the item is restricted to characters with the name specified by the strref held in parameter1.
		// -----------------

			PATCH_IF ("%GW_kind%" STRING_COMPARE_CASE ~NAME~ = 0) BEGIN
				SET GW_param2 = 10
				PATCH_IF (STRING_LENGTH "%GW_restrict%" > 6) BEGIN	// La première donnée du fichier tra est @8000001
					SET GW_param1 = RESOLVE_STR_REF ((AT %GW_restrict%))
				END ELSE BEGIN						// Sinon, on va chercher la référence dans le fichier dialog.tlk
					SET GW_param1 = EVAL "%GW_restrict%"
				END
			END	// of PATCH_IF ("%GW_kind%" STRING_COMPARE_CASE ~NAME~ = 0)

		// Actor's scripting name case : If 'IDS File' is set to 11, the item is restricted to characters with the death variable specified by the resource field. 
		// ---------------------------

			PATCH_IF ("%GW_kind%" STRING_COMPARE_CASE ~SCRIPT_NAME~ = 0) BEGIN
				SET GW_param1 = 0
				PATCH_IF (STRING_LENGTH "%GW_restrict%" < 9) BEGIN	// 8 caracters maximum in resource field
					SPRINT GW_resource319 EVAL "%GW_restrict%"
					SET GW_param2 = 11
				END
			END	// of PATCH_IF ("%GW_kind%" STRING_COMPARE_CASE ~SCRIPT_NAME~ = 0)

			// Description note.
			// -----------------

			PATCH_IF (STRING_LENGTH "%GW_mess319%" > 6) BEGIN		// La première donnée du fichier tra est @8000001
				SET GW_special319 = RESOLVE_STR_REF ((AT %GW_mess319%))
			END ELSE BEGIN							// Sinon, on va chercher la référence dans le fichier dialog.tlk
				SET GW_special319 = EVAL "%GW_mess319%"
			END

			// Adds Effect #319 Usability: Item Usability if needed.
			// -----------------------------------------------------

			PATCH_IF (GW_param2 > 0) BEGIN

				LPF ~ADD_ITEM_EQEFFECT~ INT_VAR opcode = 319 target = 1 timing = 2 parameter1 = EVAL "%GW_param1%" parameter2 = EVAL "%GW_param2%" special = EVAL "%GW_special319%" STR_VAR resource = EVAL "%GW_resource319%" END

			END	// of PATCH_IF (GW_param2 > 0)

		END		// of PATCH_IF ("%GW_restrict%" STR_CMP ~~) AND ("%GW_kind%" STR_CMP ~~)
	END	 		// of PATCH_IF (ENGINE_IS ~bgee bg2ee eet~) OR GAME_INCLUDES ~sod~
END 				// of DEFINE_PATCH_FUNCTION

Sans cette fonction, il suffit de remplacer dans le premier code

Code : Tout sélectionner

LPF ~GW_ITEM_RESTRICT_USABILITY_BGEE~ STR_VAR GW_restrict = "GW_DIAMOND_KNIGHT" GW_kind = "KIT" GW_mess319 = 7700002 END
par

Code : Tout sélectionner

LPF ~ADD_ITEM_EQEFFECT~ INT_VAR opcode = 319 target = 1 timing = 2 parameter1 = IDS_OF_SYMBOL (~kit~ ~GW_DIAMOND_KNIGHT~) parameter2 = 9 special = RESOLVE_STR_REF (@7700002) STR_VAR resource = EVAL "%DEST_RES%" END
Je l'ai définie car je l'utilise pour d'autres manips.
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Répondre

Retourner vers « Kits »

Qui est en ligne

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