Page 1 sur 1

Effet #122 : Création d'un objet à plusieurs charges

Posté : jeu. 28 mai 2015, 10:05
par Freddy_Gwendo
Je souhaite créer ce sort :
@7501004 = ~Création d'eau (Invocation)
Niveau : 1
Sphère : Création, Élémentaire (Eau)
Composantes : V, G
Portée : 6 mètres
Durée : instantanée
Temps d'incantation : 1 round
Zone d'effet : jusqu'à 8 litres d'eau par niveau
Jet de sauvegarde : aucun
Résistance à la magie : non

En lançant ce sort, le prêtre peut créer un maximum de huit litres d'eau par niveau. Cette eau est pure et potable, comme de l'eau de pluie. Elle apparaît dans n'importe quel récipient capable de la recevoir, ou au-dessus d'une zone trois fois plus large (ce qui permet de créer une fine pluie ou de remplir plusieurs récipients de taille moindre). L'eau pèse 1 kilo par litre.
Composante matérielle : une goutte d'eau.~
Comme tous mes sorts, il est géré par une routine tpa :

Code : Tout sélectionner

// Création d'eau
COPY ~Diamant_Eternel/Clones/GW.spl~	~override/GWCreWa.spl~	SAY NAME1 @7501003	SAY UNIDENTIFIED_DESC @7501004
	LPF GW_NEW_SPELL INT_VAR spelltype = 2 spelllevel = 1 graphics = 15 school1 = 6 school2 = 13 location = 2 target = 5 range = 1 speed = 9 ablevel = 1 STR_VAR icon1 = EVAL "%DEST_RES%C" icon2 = EVAL "%DEST_RES%B" GW_son = CAS_P08 END
	WRITE_LONG  0x18 (THIS BAND BNOT BIT14)	// supprime Non-magical ability
	WRITE_LONG  0x1e THIS | BIT9			// ajoute Enchanters exclusion
	LPF GW_ADD_HEADERS INT_VAR GW_Headers = 50 END
	SET power = 1
	SET resist_dispel = 2
	SET target = 1
	FOR (header=1;header<=50;++header) BEGIN
		LPF configure_spell_header INT_VAR f_Header = header END
		PATCH_IF (header < 10) BEGIN TEXT_SPRINT outres "0%header%" END ELSE BEGIN TEXT_SPRINT outres "%header%" END
		LPF ADD_SPELL_EFFECT INT_VAR insert_point = "-1" opcode = 177 target timing = 1 parameter2 = 2 power resist_dispel header STR_VAR resource = EVAL "GWCREW%outres%" END	// Item: Create Inventory Item [122]
		LPF ADD_SPELL_EFFECT INT_VAR insert_point = "-1" opcode = 215 target duration = 3 parameter2 = 1 power resist_dispel header STR_VAR resource = GWWINDC END
		LPF ADD_SPELL_EFFECT INT_VAR insert_point = "-1" opcode = 215 target timing = 3 duration = 3 parameter2 = 1 power resist_dispel header STR_VAR resource = GWCREWAT END
		LPF ADD_SPELL_EFFECT INT_VAR insert_point = "-1" opcode = 139 target timing = 4 duration = 4 parameter1 = RESOLVE_STR_REF (@7140032) power resist_dispel header END	// a créé de l'eau
	END
BUT_ONLY
// Outre d'eau
COPY ~Diamant_Eternel/Objets/Food/GWOutre.itm~ ~override/GWOutre.itm~	SAY NAME1 @8480005	SAY NAME2 @8480005	SAY DESC @8480006	SAY 0x19e @7000005 // Avale...
Puis création de l'effet :

Code : Tout sélectionner

ACTION_DEFINE_ASSOCIATIVE_ARRAY Effets_Nouveaux BEGIN
//	op	  Cible	  Timing  Durée		p1		p2			p3		p4	   pb1	pb2	   Dés Fac power ST bonus   MR	ressource	=>	effet
//- 0 ----- 1 ----- 2 ----- 3 ----- 4 ----- 5 --------- 6 ----- 7 ----- 8 -- 9 --- 10 -11-- 12 - 13 - 14 -- 15 ---- 16 ----------------------------------------------------------------
/* CHEVALIER DE DIAMANT */
// Sort Création d'eau
	122,	2,		9,		0,		1,		0,			8,		8,		0,	100,	0,	0,	0,	0,	0,		0,	GWOUTRE		=> GWCreW01	// Item: Create Inventory Item [122]
...
END

Patch de création de l'effet (je vous passe les détails)

END

// Sort Création d'eau
OUTER_FOR (i=2 ; i<51 ; i +=1) BEGIN
	ACTION_IF (i < 10) BEGIN OUTER_TEXT_SPRINT nb "0%i%" END ELSE BEGIN OUTER_TEXT_SPRINT nb "%i%" END
		COPY_EXISTING ~GWCreW01.eff~	~override/GWCreW%nb%.eff~
			WRITE_LONG 0x1c %i%	// paramètre 1
		BUT_ONLY
END
Bref, l'outre doit avoir 8 charges (chacune correspondant à la consommation d'un litre).


L'installation fonctionne, le fichier GWOutre.itm dispose bien de ses 8 charges, sauf que....

Quand je lance ce sort, quelque soit le niveau, l'outre ne dispose que d'une charge ! :(


Une idée ?

Note : J'ai indiqué la valeur 8 pour parametre3, parametre4 et paramètres 3 et 4 avec le même résultat.

Posté : jeu. 28 mai 2015, 10:56
par deratiseur
Désolé, je crée des sorts "normalement", je n'utilise pas de routine TPA pour cela. Pourquoi faire si compliqué quand on peut faire simple ?
Edite ton sort pour faire un onglet par niveau, et change la valeur dans chaque niveau à la main, ou utilise cette routine du dukp (simple!) :

Code : Tout sélectionner

COPY        ~Derats_kits/Warlord/Spells/pxw4boua.spl~        ~override~
READ_LONG 0x64 abilities_off
READ_SHORT 0x68 num_abilities
FOR (i = 0; i < num_abilities; i += 1) BEGIN            // pour chaque habileté
    WRITE_BYTE (abilities_off + 0x120*i + 0x234) 34+i*2    // indiquer la valeur du premier effet comme lvlx2 + 20
END

Posté : jeu. 28 mai 2015, 11:07
par Freddy_Gwendo
C'est ce que fait ma routine :

Code : Tout sélectionner

FOR (header=1;header<=50;++header) BEGIN
	LPF ADD_SPELL_EFFECT INT_VAR insert_point = "-1" opcode = 177 target timing = 1 parameter2 = 2 power resist_dispel header STR_VAR resource = EVAL "GWCREW%outres%" END	// Item: Create Inventory Item [122]
END
Et ça ne fonctionne : le problème, c'est que le fichier de l'outre a bien 8 charges, mais que le perso n'en a accès qu'à une une fois l'objet créé via le sort !

Quant à la routine tpa, une fois définie, elle me permet de gérer la création de tous les headers pas par pas et surtout il me suffit de modifier un paramètre (resist_dispel par exemple) et WeidU fait tout le boulot pour moi, quelque soit le sort !


EDIT : un modo de passage pourrait-il modifier le titre et changer 177 par 122 ? Merci d'avance.

Posté : jeu. 28 mai 2015, 22:35
par Isaya
A vrai dire je n'ai pas d'expérience pratique de cet effet. Mais quelque chose ne me semble pas correspondre à la description de l'effet.

La description de l'effet 122 indique que les charges sont le paramètre 1. La paramètre 4 correspond aux charges de la 3ème capacité.
#122 (0x122) Item: Create Inventory Item [122]
Parameter #1: Charges
Parameter #2: Irrelevant
Description:
Creates the item specified by the resource key. The number of items created is controlled by the 'Charges' field. The number of secondary charge is determined by P3. The number of tertiary charges is determined by P4 (external eff's). The item is created in the Inventory.
Du coup je ne comprends pas bien pourquoi tu indiques 8 pour le paramètre 4. Je me serai attendu à ce que ce soit le paramètre 1.

La question qui me vient ensuite est : dans quel extended header de l'objet as-tu mis la capacité qui permet de boire ? Est-ce bien cohérent du rang de la charge dans lequel tu as mis la charge initiale à la création de l'objet
Dans ton exemple, il me semble qu'il faudrait que ce soit le troisième extended header pour que la valeur 8 dans le paramètre 4 fasse l'effet escompté.

Je me demande, en voyant la description du sort et les valeurs mises pour p1 et p3 / p4, si tu considères p1 comme la valeur min et p3 ou p4 comme la valeur max.
Je n'ai pas le sentiment que l'effet 122 permette de générer l'aspect "jusqu'à 8 charges" du sort.

Posté : sam. 30 mai 2015, 07:02
par Freddy_Gwendo
Bon, comme d'hab, tu as vu juste ! ;)


Ce foutu effet ne me sert à rien. En tout cas pas à faire ce que je veux.
D'ailleurs après avoir cherché de partout, aucun opcode ne permet de créer un objet en gérant le nombre de charges du PREMIER header. Le paramètre 1 ne gère que le nombre d'objets créés.

J'ai trouvé la parade : convocation d'une créature invisible dont le script donne un objet [GiveItemCreate(S:ResRef,O:Object,I:Usage1,I:Usage2,I:Usage3)] avec Usage2 correspondant à la valeur d'une variable lancée par le sort avec l'opcode Modify Global Variable [265]

Mais je ne l'utiliserai pas car je me suis aperçu qu'en l'état ce sort foutait en l'air l'intérêt de mon composant nourriture : à niveau 20, le prêtre créée 20x8 litres d'eau ! :gign:

J'ai donc pris des libertés avec la définition officielle du sort pour ne pouvoir le lancer qu'une fois toutes les huit heures et ne créer qu'un litre d'eau tous les deux niveaux. Eau qui disparaît au bout de 4 heures... Donc pas de réserves. :whistle3:

Du coup, j'utilise le paramètre 1 pour gérer le nombre d'outres de 1 litre créées.

Et voilou ! :dance4:


Edit : et merci d'avoir changé le titre du fil !