Page 1 sur 1
Ajouter une structure (trigger) sur une carte, j'ai rien compris
Posté : dim. 03 juil. 2022, 15:08
par deratiseur
Je voudrais ajouter un trigger sur une carte, mais je coince au niveau des vertex.
Mon code (piqué de Affaq)
Code : Tout sélectionner
COPY_EXISTING ~AR0700.are~ ~override~
PATCH_IF (SOURCE_SIZE > 0x11b) BEGIN
LPF fj_are_structure
INT_VAR
fj_type = 0 // proximiy trigger
fj_box_left = 3428
fj_box_top = 3441
fj_box_right = 3439
fj_box_bottom = 3430
fj_cursor_idx = 8 // activator cursor
fj_vertex_0 = 3428 + (1883 << 16)
fj_vertex_1 = 3441 + (1886 << 16)
fj_vertex_2 = 3439 + (1874 << 16)
fj_vertex_0 = 3430 + (1878 << 16)
STR_VAR
fj_structure_type = region
fj_name = 0700secr
fj_reg_script = secr0700
END
END
s'installe mais ne crée par la zone avec le curseur. Je suis sur que ça vient des vertex. Ce que je ne comprend pas c'est que j'ai délimité une "patate" à 4 cotés avec 4 coordonnées x/y, ce qui devrait faire 8 coordonnées, donc pourquoi n'ai je que 4 fj_box ?
Posté : dim. 03 juil. 2022, 16:29
par Akadis
Un trigger n'est pas une structure.
Tu devais pas plutôt utiliser
ADD_AREA_REGION_TRIGGER
?
Posté : dim. 03 juil. 2022, 17:04
par Freddy_Gwendo
deratiseur a écrit :Je voudrais ajouter un trigger sur une carte, mais je coince au niveau des vertex.
Mon code (piqué de Affaq)
Code : Tout sélectionner
COPY_EXISTING ~AR0700.are~ ~override~
PATCH_IF (SOURCE_SIZE > 0x11b) BEGIN
LPF fj_are_structure
INT_VAR
fj_type = 0 // proximiy trigger
fj_box_left = 3428
fj_box_top = 3441
fj_box_right = 3439
fj_box_bottom = 3430
fj_cursor_idx = 8 // activator cursor
fj_vertex_0 = 3428 + (1883 << 16)
fj_vertex_1 = 3441 + (1886 << 16)
fj_vertex_2 = 3439 + (1874 << 16)
fj_vertex_0 = 3430 + (1878 << 16)
STR_VAR
fj_structure_type = region
fj_name = 0700secr
fj_reg_script = secr0700
END
END
s'installe mais ne crée par la zone avec le curseur. Je suis sur que ça vient des vertex. Ce que je ne comprend pas c'est que j'ai délimité une "patate" à 4 cotés avec 4 coordonnées x/y, ce qui devrait faire 8 coordonnées, donc pourquoi n'ai je que 4 fj_box ?
Tu n'as pas donné les bonnes valeurs verticales de la bounding box :
Sinon, Akadis a raison : la fonction ADD_AREA_REGION_TRIGGER a supplanté depuis un moment l'ancienne fonction fj_are_structure, même si cette dernière fonctionne toujours.
Posté : dim. 03 juil. 2022, 17:09
par Akadis
Il y a 2 fj_vertex_0 et pas de fj_vertex_3
C'est pas une faute de frappe ?
Posté : dim. 03 juil. 2022, 17:15
par Freddy_Gwendo
Argh ! Grillé...
J'allais tester le code et le typo m'a sauté aux yeux avec les highlighters WeiDU dans Notepad. Avec ces deux corrections, ton code devrait fonctionner.
Posté : dim. 03 juil. 2022, 20:41
par deratiseur
J'ai cherché "LPF fj_are_structure" dans tous les fichiers de mon répertoire de modules avec notepad++ et il m'a trouvé un paquet de module l'utilisant : une bonne vingtaine. mais o je vais vous écouter et demain chercher avec ADD_AREA_REGION_TRIGGER.
Bon, sinon j'ai changé le code Freddy l'a préconisé, soit :
Code : Tout sélectionner
COPY_EXISTING ~AR0700.are~ ~override~
PATCH_IF (SOURCE_SIZE > 0x11b) BEGIN
LPF fj_are_structure
INT_VAR
fj_type = 0 // proximity trigger
fj_box_left = 3428
fj_box_top = 1874
fj_box_right = 3439
fj_box_bottom = 1886
fj_cursor_idx = 8 // activator cursor
fj_vertex_0 = 3428 + (1883 << 16)
fj_vertex_1 = 3441 + (1886 << 16)
fj_vertex_2 = 3439 + (1874 << 16)
fj_vertex_3 = 3430 + (1878 << 16)
STR_VAR
fj_structure_type = region
fj_name = 0700secr
fj_reg_script = secr0700
END
END
Et toujours rien.
Je précise :
1. que mettre ADD_AREA_REGION_TRIGGER à la place de LPF fj_are_structure ou juste fj_are_structure refuse de s'installer, ça me fait une erreur de INT_VAR. on, j'imagine que ça ne se codifie pas pareillement, mais là je n'ai plus le temps de regarder ça.
2. Que je veille à toujours essayer l'ajout sur une zone où je ne suis pas encore entrée.J'ai une sauvegarde à la sortie du donjon d'Irenicus (et je me tape la cinématique à chaque test
).
3. Que la zone où je veux mettre le curseur est à la limite de la zone "praticable", c'est peut être ça qui foire (la zone représente le premier paquet de sable qui stabilise le petit bateau volant sur la Promenade de Waukyne, on peut marcher juste à coté mais pas à l'emplacement du sac (normal
))
Posté : lun. 04 juil. 2022, 18:54
par Freddy_Gwendo
La borne droite est mauvaise. La bonne est 3441. Ceci dit, je vais essayer de créer ce trigger sur une de mes cartes. Sinon, as-tu vérifié avec NI que ton trigger n'en chevauche pas un autre ?
Posté : mer. 06 juil. 2022, 16:16
par deratiseur
J'ai essayé avec 3441, pas mieux.
J'ai cherché ADD_AREA_REGION_TRIGGER dans tous les modules que je stocke, uniquement une référence d'utilisation.
J'ai épluché tout les LPF fj_are_structure que j'ai trouvé. J'ai passé 4 heures à tester, en changeant des top, des bottom, des vertex 0, etc, je n'ai toujours pas eu de résultat qui fonctionne. Je ne comprend toujours pas comment avec left, bottom, right et bottom on est censé représenter les 4 coins d'un espace à 4 coté (ça doit faire 4 coordonnées X et 4 coordonnées Y, total 8 coordonnées.). Plus je modde et plus je me trouve crétin. Et je suis censé en faire 25 comme ça.
En finalité j'ai suivi
ce message , et j'ai réécris une dernière fois mon code (tant pis si ça ne fait pas une patate mais que ça fait un carré, mais qu'au moins ça fasse quelque chose !) :
Code : Tout sélectionner
COPY_EXISTING ~AR0700.are~ ~override~
PATCH_IF (SOURCE_SIZE > 0x11b) BEGIN
LPF fj_are_structure
INT_VAR
fj_type = 0 // proximity trigger
fj_box_left = 3427
fj_box_top = 1871
fj_box_right = 3444
fj_box_bottom = 1889
fj_cursor_idx = 8 // activator cursor
fj_trap_active = 1
fj_vertex_0 = 3427 + (1871 << 16)
fj_vertex_1 = 3444 + (1871 << 16)
fj_vertex_2 = 3444 + (1889 << 16)
fj_vertex_3 = 3427 + (1889 << 16)
STR_VAR
fj_structure_type = region
fj_name = 0700secr
fj_reg_script = secr0700
END
END
et toujours rien....
Est ce que c'est parce que je n'ai pas de script associé ? (non, j'ai compilé un script secr700, toujours pas)
Est-ce que c'est parce que j'essaie de crée la zone dans un zone où on ne peut pas marcher ? (non, j'ai essayé avec toutes les coordonnées en X-400, ça tombe en plein milieu de la zone de marche mais toujours pas)
Est-ce que c'est parce que j'ai raté un paramètre "set visible" ?
Je craque.
Posté : mer. 06 juil. 2022, 17:55
par Freddy_Gwendo
Tous mes triggers ont des flags :
Je ne les vois pas dans ta fonction.
Ce soir, je vais essayer de créer ton trigger et voir ce que tu as loupé.
Édit
Question subsidiaire : ton script fait quoi exactement ?
Posté : mer. 06 juil. 2022, 19:31
par Freddy_Gwendo
Testés sur BG2:EE, ces deux codes fonctionnent parfaitement :
Code : Tout sélectionner
COPY_EXISTING ~AR0700.are~ ~override~
PATCH_IF (SOURCE_SIZE > 0x11b) BEGIN
LPF fj_are_structure
INT_VAR
fj_type = 1
fj_box_left = 3428
fj_box_top = 1874
fj_box_right = 3441
fj_box_bottom = 1886
fj_cursor_idx = 8 // activator cursor
fj_vertex_0 = 3428 + (1883 << 16)
fj_vertex_1 = 3441 + (1886 << 16)
fj_vertex_2 = 3439 + (1874 << 16)
fj_vertex_3 = 3430 + (1878 << 16)
fj_trap_active = 1
fj_loc_x = 3434
fj_loc_y = 1880
STR_VAR
fj_structure_type = region
fj_name = 0700secr
fj_reg_script = blpool
END
LPF ADD_AREA_REGION_TRIGGER
INT_VAR
ab_RT_Type = 1
ab_RT_BbLX = 3428
ab_RT_BbLY = 1874
ab_RT_BbHX = 3441
ab_RT_BbHY = 1886
ab_RT_VxPr = 4
ab_RT_CuId = 8
ab_RT_TSet = 1
ab_RT_LPoX = 3434
ab_RT_LPoY = 1880
ab_RT_Vx_X_0 = 3428
ab_RT_Vx_Y_0 = 1883
ab_RT_Vx_X_1 = 3441
ab_RT_Vx_Y_1 = 1886
ab_RT_Vx_X_2 = 3439
ab_RT_Vx_Y_2 = 1874
ab_RT_Vx_X_3 = 3430
ab_RT_Vx_Y_3 = 1878
STR_VAR
ab_RT_Name = 700secr
ab_RT_Rbcs = blpool
END
END
Posté : mer. 06 juil. 2022, 20:18
par deratiseur
Ok, j'ai essayé ton LPF fj_are_structure, effectivement il fonctionne. Les seuls différences sont fj_type = 1 et les fj_loc. Maintenant il va falloir que je comprenne les fj_loc
Merci, ça me fait déjà un moins un truc qui marche
L'interplan ne serait rien sans toi, merci beaucoup.
Mon script n'est pas encore écrit. Comprendre comment créer les zones secrètes était la première étape, que je ne validerait que quand j'aurais compris comment faire les 24 autres moi même.
Ensuite je passerais à la deuxième étape : pas d’icône lors de la création des zones, et désactivé. c'est un secret, rien de visible. Et deux scripts :
Le Script de la map est inspiré de celui de la grotte des trolls de SOD, et il fonctionnera comme ceci : Si le joueur connait l'emplacement du secret sur cette map, alors activer le trigger de la zone secrète.
Et le script de la zone secrète fait ça : si la zone est activée, changer le curseur "invisible" en curseur "utilisable". Et quand zone utilisée, afficher texte x et donner objet y, puis changer curseur en "rien" et rendre zone inutilisable.
Et un truc auquel j'ai pensé, il faut déjà que je vérifie avant si je peux mettre une valeur globale à jour quand le joueur lit une carte (un "livre"). Si non, c'est tout le projet qui tombe à l'eau, pas besoin d'aller plus loin
Posté : mer. 06 juil. 2022, 20:30
par Akadis
Tu peux aussi faire comme ça :
Code : Tout sélectionner
COPY_EXISTING ~AR0700.are~ ~override~
LAUNCH_PATCH_FUNCTION ADD_AREA_REGION_TRIGGER
INT_VAR
ab_RT_Type = 0 // Type of trigger -- 0=proximity ; 1=info ; 2=travel
ab_RT_BbLX = 3427 // Bounding Box - low x value - LEFT
ab_RT_BbLY = 1849 // Bounding Box - low y value - TOP
ab_RT_BbHX = 3444 // Bounding Box - High x value - RIGHT
ab_RT_BbHY = 1871 // Bounding Box - High y value - BOTTOM
ab_RT_VxPr = 4 // Number of Vertex
ab_RT_Vx_X_0 =3427
ab_RT_Vx_Y_0 =1871
ab_RT_Vx_X_1 =3444
ab_RT_Vx_Y_1 =1871
ab_RT_Vx_X_2 =3444
ab_RT_Vx_Y_2 =1849
ab_RT_Vx_X_3 =3427
ab_RT_Vx_Y_3 =1849
STR_VAR
ab_RT_Name = ~0700secr~ // Name of trigger
ab_RT_Rbcs =~secr0700~ // Script file
END
secr0700.baf :
Code : Tout sélectionner
IF
Global("Secret0700","GLOBAL",0)
Range([PC],15)
THEN
RESPONSE #100
SetGlobal("Secret0700","GLOBAL",1)
DisplayString([PC],21906)
END
Testé sous BG2TOB + bg2fixpack
EDIT
LE Range du script est très important sinon le trigger va s’activer dès que entre dans la zone, même si tu es 500 mètres.
Autre chose, si tu développes sous BG2EE tu peux passer les cutscenes en appuyant sur Echap. C'est bien pratique pour gagner 2 minutes à la sortie du donjon d'Irenicus.
Posté : mer. 06 juil. 2022, 20:46
par deratiseur
Akadis a écrit :
secr0700.baf :
Code : Tout sélectionner
IF
Global("Secret0700","GLOBAL",0)
Range([PC],15)
THEN
RESPONSE #100
SetGlobal("Secret0700","GLOBAL",1)
DisplayString([PC],21906)
END
Testé sous BG2TOB + bg2fixpack
Merci Akadis pour ce petit bout de code, mais ce n'est pas ce dont j'ai besoin. Ce que je vais faire est plutot du genre :
AR0700 :
Code : Tout sélectionner
IF
Global("secr0700","GLOBAL",1)
AreaCheck("AR0700")
THEN
RESPONSE #100
TriggerActivation("0700secr",TRUE)
END
Et 0700secr :
Code : Tout sélectionner
IF
Global("Secr0700done","MYAREA",0)
Clicked([ANYONE])
THEN
RESPONSE #100
SetInterrupt(FALSE)
SetGlobal("Secr0700done","MYAREA",1)
SetGlobal("Secr0700","GLOBAL",1)
GiveItem("potn52",LastTrigger())
DisplayStringNoNameHead(Myself,69514)
TriggerActivation("0700secr",FALSE)
SetInterrupt(TRUE)
END
Ce qu'il me manque, c'est le changement d’icône quand le trigger est activé. Enfin, ceci est pour l'instant théorique, d'abord le livre et la variable globale ("secr0700","GLOBAL",1), puis le test
Posté : mer. 06 juil. 2022, 20:54
par deratiseur
Bon, j'ai fini de tester, la seule "lecture" d'un livre (clic droit pour lire le texte) ne suffit pas à mettre à jour une variable globale, que l'effet soit dans l'onglet "equipping effect" ou dans "extended effect". Il va falloir que je trouve autre chose.
Posté : jeu. 07 juil. 2022, 21:21
par Freddy_Gwendo
Il n'existe aucune variable dans le moteur du jeu permettant de vérifier que l'on a bien lu la description d'un objet.
Quant aux effets, ils ne fonctionnent que si
1) ils sont intégrés à un extended header (comme un livre de sorts infinis : tu le places dans les objets rapides et tu cliques dessus). Dans ton cas, ça suppose de donner un livre proposant de l'étudier : tu cliques et il crée un nouveau livre. Mas c'est un peu pénible.
2) Ce sont des global effects intégrés à un objet dont on peut s'équiper (arme, armure, anneau...).
La seule solution viable qui me vient à l'esprit consiste à rendre ton livre identifiable. Tant qu'il n'est pas identifié, ta valeur égale 0. Quand il est identifié, elle passe à 1. C'est très facile à gérer via baldur.bcs ou les scripts généraux des persos.
Posté : mar. 06 sept. 2022, 14:55
par deratiseur
Bon :
Étape 1, créer une zone cachée : presque fait (test sur la promenade de Waukine, la zone est crée mais elle n'est pas cachée, elle affiche une icône "utilisable")
Étape 2, créer l'objet à lire pour valider la connaissance du secret : fait (la maitresse des secret propose de révéler le secret par dialogue)
Étape 3 : le script de la promenade de Waukine révèle la zone (affiche l’icône "utiliser" sur la zone secrète si le secret est connu) : pas fait. Je dois pouvoir le faire seul, c'est un Append, je sais faire.
Étape 4 : cliquer sur la zone secrète donne le contenu caché et enlève l’icône "utiliser" : pas fait. Là il faut rajouter un trigger par weidu, et je cale.
Posté : jeu. 08 sept. 2022, 17:21
par deratiseur
Ok, pigé : quand on crée une structure, il y a toujours une icône. Si elle n'est pas paramétrée, c'est le gant par défaut. Impossible donc de créer une structure "invisible", c'est tout le projet qui tombe à l'eau. La maitresse des secrets ne sera pas.
Posté : jeu. 08 sept. 2022, 20:14
par JohnBob
La maitresse des secrets ne sera pas.
C'est dommage, ton idée avait l'air bien sympa !
Tu es sûr que c'est si important cette histoire de curseur... Peut-être choisir une icône ultra discrète ou dans le même ton que le fond de carte...