Page 1 sur 1

TP2 : patcher x effets dans chaque habilité, svp aidez moi

Posté : jeu. 14 mai 2020, 20:43
par deratiseur
Je n'arrive pas à complèter ce script :

Code : Tout sélectionner

ADD_SPELL ~Derats_Magasin_2/Sorts/pxl2aur2.spl~ 2 4 WIZARD_PX_RESISTANCE_AURA    SPRINT current_spell_res "%DEST_RES%"
READ_LONG 0x64 abilities_off
READ_SHORT 0x68 num_abilities
READ_LONG 0x6a effects_off
READ_SHORT 0x90 num_effects
FOR (i=1; i<num_abilities; i+=1) BEGIN            // pour chaque habileté
    FOR (a=1 ; a<8 ; a+=1) BEGIN         //pour chaque effet du 2ème au 8eme
        WRITE_SHORT 0x2a6+a*0x30 5+i    //indiquer le chiffre de 5+niveau du lanceur
    END
END
En fait il n'y a que l'habilité 1 qui est patchée (tous les effets 2 à 8 gagnent 13 en paramètre 1 (lors que je voudrais qu'ils aient 12; bon, pas grave, je peux commencer avec i=2), et aucune autre habilité n'est changée. Pourquoi ? il y a pourtant bien une sous couche applicable "à chaque habilité" ....

Posté : jeu. 14 mai 2020, 22:07
par Freddy_Gwendo
Il y a longtemps que je n'utilise plus cette façon de coder, mais avant de te répondre, deux questions :

1) pxl2aur2.spl contient bien tous les headers et tous les effets ?
2) les niveaux minimum sont bien incrémentés de 1 ?

Posté : ven. 15 mai 2020, 17:31
par deratiseur
En théorie, oui. En théorie parce que j'utilise un ancien code éprouvé , qui transforme un sort avec 1 habilité en sort avec x habilités, en incrémentant les habilités pendant le patchage avec au choix la différence de niveau entre habilités, le niveau max des habilités ou la durée par niveau.
Ce code a toujours fonctionné, et transforme bien un fichier à 1 habilité à la base en fichier à 13 habilités au final. Et il est lancé avant la routine de patchage qui bug.

Posté : ven. 15 mai 2020, 20:48
par Freddy_Gwendo
À mon avis, ça vient de ton double process. Manifestement, ton code fonctionne sur le fichier de base sans tous les headers. Tu peux poster l'ensemble du code qui installe le fichier (avec les deux patches dans l'ordre) ?

Posté : sam. 16 mai 2020, 11:05
par deratiseur
Voici le code qui dérive un sort à 1 habilité en sorts à plusieurs habilités :

Code : Tout sélectionner

//Dérive un sort composé d'une seul niveau en plusieurs niveaux. (fourni par le génialissime Zranoff de Legends)
DEFINE_PATCH_FUNCTION MULTI_LEVELS
BEGIN
    READ_LONG 0x64 ZF_abilities_off
    READ_SHORT 0x68 ZF_num_abilities
    READ_SHORT 0x82 ZF_niv_min
    READ_SHORT 0x90 ZF_nb_feat
    SET ZF_c=0
    FOR (ZF_i = ZF_niv_min+ZF_inc_level; ZF_i < ZF_max_level+1; ZF_i += ZF_inc_level) BEGIN
        SET ZF_c=ZF_c+1
        READ_ASCII 0x72 ZF_ability (0x28)
        INSERT_BYTES (0x72+ZF_c*0x28) 0x28
        WRITE_ASCIIE (0x72+ZF_c*0x28) ~%ZF_ability%~
        WRITE_SHORT (0x72+ZF_c*0x28+0x10) ZF_i
    END
    WRITE_SHORT 0x68 ZF_num_abilities+ZF_c
    WRITE_LONG 0x6a 0x72+(ZF_c+1)*0x28
    SET ZF_d=0
    SET ZF_h=ZF_nb_feat*0x30
    FOR (ZF_i = ZF_niv_min+ZF_inc_level; ZF_i < ZF_max_level+1; ZF_i += ZF_inc_level) BEGIN
        SET ZF_d=ZF_d+1
        READ_ASCII 0x72+(ZF_c+1)*0x28+(ZF_d - 1)*ZF_h ZF_features (ZF_h)
        INSERT_BYTES (0x72+(ZF_c+1)*0x28+ZF_d*ZF_h) ZF_h
        WRITE_ASCIIE (0x72+(ZF_c+1)*0x28+ZF_d*ZF_h) ~%ZF_features%~
        FOR (ZF_z=0;ZF_z<ZF_nb_feat;ZF_z=ZF_z+1)BEGIN
            READ_LONG (0x72+(ZF_c+1)*0x28+(ZF_d - 1)*ZF_h+0x30*ZF_z+0x0e) ZF_duree_min
            PATCH_IF (ZF_duree_min>4)THEN BEGIN
                WRITE_LONG (0x72+(ZF_c+1)*0x28+ZF_d*ZF_h+0x30*ZF_z+0x0e) ZF_duree_min+ZF_inc_duree
            END
        END
        WRITE_SHORT (0x72+ZF_d*0x28+0x20) ZF_d*ZF_nb_feat
    END
    WRITE_BYTE 0x82 1
END
Pour utiliser ce code, je crée un sort avec 1 seule habilité, en mettant le niveau de l'habilité au niveau du mage au moment ou il peut l'utiliser (par exmple niveau 7 pour un sort lvl 4). Ensuite le code me crée tous les niveaux de 8 à 20 (suivant les paramètres) en changeant les durées suivant le paramètres (en secondes). A la fin, il indique "niveau 1" à la première habilité. (Oui, j'ai compris, je devrais dire "Header")

Et voilà comment je l'appele pour mon sort :

Code : Tout sélectionner

ADD_SPELL ~Derats_Magasin_2/Sorts/pxl2aur2.spl~ 2 4 WIZARD_PX_RESISTANCE_AURA    SPRINT current_spell_res "%DEST_RES%"    SET ZF_max_level = 20    SET ZF_inc_level = 1    SET ZF_inc_duree = 6    LPF MULTI_LEVELS END
READ_LONG 0x64 abilities_off
READ_SHORT 0x68 num_abilities
READ_LONG 0x6a effects_off
READ_SHORT 0x90 num_effects
FOR (i=1; i<num_abilities; i+=1) BEGIN            // pour chaque habileté
    FOR (a=1 ; a<8 ; a+=1) BEGIN         //pour chaque effet du 2ème au 8eme
        WRITE_SHORT 0x2a6+a*0x30 5+i    //indiquer le chiffre de 5+niveau du lanceur
    END
END

pour le dukp ça marche très bien, après application du LPF MULTI_LEVELS END j'ai souvent utilisé la routine pour patcher chaque habilité. Mais je n'ai jamais combiné "patcher chaque effet dans chaque habilité". Et ça coince.

Posté : sam. 16 mai 2020, 12:23
par Freddy_Gwendo
Alors, habituellement j'utilise ceci :

Code : Tout sélectionner

READ_LONG  0x64 "abil_off"
READ_SHORT 0x68 "abil_num"
READ_LONG  0x6a "fx_off"
FOR (i = 1 ; i < abil_num ; ++i) BEGIN							// pour chaque header
	READ_SHORT ("%abil_off%" + 0x1e + 0x28*i) "abil_fx_num"
	READ_SHORT ("%abil_off%" + 0x20 + 0x28*i) "abil_fx_idx"
	FOR (j = 0 ; j < abil_fx_num ; ++j) BEGIN					// pour chaque effet
		WRITE_LONG (fx_off + 0x24 + (0x30 * (j + abil_fx_idx))) THIS | BIT24	// ajoute Bypass mirror image
	END
END
Dans ton cas, ça devrait donner ceci (pas testé) :

Code : Tout sélectionner

READ_LONG  0x64 "abil_off"
READ_SHORT 0x68 "abil_num"
READ_LONG  0x6a "fx_off"
FOR (i = 1 ; i < abil_num ; ++i) BEGIN						// pour chaque header
	READ_SHORT ("%abil_off%" + 0x1e + 0x28*i) "abil_fx_num"
	READ_SHORT ("%abil_off%" + 0x20 + 0x28*i) "abil_fx_idx"
	FOR (j = 1 ; j < 8 ; ++j) BEGIN						// pour chaque effet
		WRITE_LONG (fx_off + 0x04 + (0x30 * (j + abil_fx_idx))) 5+i
	END
END
Note : parameter1 est une variable DWORD (donc WRITE_LONG) ;)

Posté : dim. 17 mai 2020, 10:08
par deratiseur
C'est cool, ça fonctionne. Merci :) . Dans mes multiples essais j'avais déjà essayé la derrière ligne dans ce genre, ais je n'avais pas mis de parenthèses. Comme quoi ça tient à pas grand chose.

Posté : dim. 17 mai 2020, 15:35
par Freddy_Gwendo
Parfait.

Pour m'éviter ce genre de calculs et d'écriture de code assez pénible, j'ai créé une macro qui lit tous les offsets nécessaires au patch selon le type de fichiers et je la lance avant de patcher. Du coup, je n'ai plus qu'à écrire la ligne de modification du (ou des) paramètre(s) concerné(s). Ça fait gagner un temps fou en codage.

Posté : lun. 18 mai 2020, 10:41
par deratiseur
J'ai pas le niveau.

D’ailleurs ce fameux code dont je me sert depuis des années, il n'est pas de moi, bien sur.