Page 1 sur 1
[CARTES] Message d'échec suite à un forçage
Posté : jeu. 09 mars 2017, 20:59
par Cocrane
Il est possible d'afficher un message lorsqu'un personnage ne parvient pas à ouvrir un container par la force.
Le problème est je n'ai pas pu coder ce point.
Voici lecode que j'ai placé dans le fichier .baf de la carte.
Code : Tout sélectionner
IF
PickLockFailed("S2cercueil1")
THEN
RESPONSE #100
DisplayStringHead(LastTrigger,@6)
END
J'ai juste le droit au message classique: vous n'avez pas réussi à forcer la serrure.
Cocrane
Posté : ven. 10 mars 2017, 11:44
par Freddy_Gwendo
Normal, car LastTrigger ne marche pas puisqu'il est considéré comme celui de la carte, non comme celui du conteneur.
En fait, l'offset qui contient cette information est 0x0084 (Lockpick string) du bloc de ton conteneur. Pour que ça fonctionne, il faut que tu le renseignes avec @6 dans ton fichier ARE.
Petite astuce WeiDU pour le faire directement lorsque tu installes ta carte :
Code : Tout sélectionner
COPY ~TonMod/Tacarte.are~ ~override/Tacarte.are~
SET Mon_Message = RESOLVE_STR_REF (@6)
READ_LONG 0x70 "cont_off" // Offset to containers
READ_SHORT 0x74 "cont_num" // Count of containers
FOR (k = 0 ; k < cont_num ; ++k) BEGIN // Pour chaque conteneur
READ_ASCII ("%cont_off%" + (0xC0 * k)) "contain" (32) NULL
PATCH_MATCH ~%contain%~ WITH
S2cercueil1 BEGIN WRITE_LONG ("%cont_off%" + 0x84 + (0xC0 * k)) Mon_Message END
DEFAULT
END
END
NOTES :
- Tu peux zapper la déclaration de variable Mon_Message en écrivant simplement WRITE_LONG ("%cont_off%" + 0x84 + (0xC0 * k)) RESOLVE_STR_REF (@6) END, mais je l'utilise car j’emploie souvent les mêmes messages.
- Tu peux faire la même chose avec les portes et les régions (cf. suite du message).
Code : Tout sélectionner
READ_SHORT 0x5a "region_num" // Count of regions
READ_LONG 0x5c "region_off" // Offset to regions
READ_LONG 0xa4 "door_num" // Count of doors
READ_LONG 0xa8 "door_off" // Offset to doors
FOR (i = 0 ; i < region_num ; ++i) BEGIN // Pour chaque région
READ_ASCII ("%region_off%" + ("%GW_reg_size%" * i)) "name" (32) NULL
PATCH_MATCH ~%name%~ WITH
Bibliotheque1 BEGIN WRITE_LONG ("%region_off%" + 0x64 + ("%GW_reg_size%" * i)) GW_Mes_Biblio1 END
Bibliotheque2 BEGIN WRITE_LONG ("%region_off%" + 0x64 + ("%GW_reg_size%" * i)) GW_Mes_Biblio2 END
Bibliotheque3 BEGIN WRITE_LONG ("%region_off%" + 0x64 + ("%GW_reg_size%" * i)) GW_Mes_Biblio3 END
DEFAULT
END
END
FOR (j = 0 ; j < door_num ; ++j) BEGIN // Pour chaque porte
READ_ASCII ("%door_off%" + (0xC8 * j)) "nom" (32) NULL
PATCH_MATCH ~%nom%~ WITH
Coffre BEGIN WRITE_LONG ("%door_off%" + 0x98 + (0xC8 * j)) GW_Mes_Coffre END
DEFAULT
END
END
Ça t'évite d'aller chercher dans NI la valeur de l'offset pour chaque trigger-door-container que tu veux modifier, surtout si tu en ajoutes de nouveau en cours de route.
Je me suis d'ailleurs créé une macro pour ça :
► Afficher le texte
Code : Tout sélectionner
LAM ~GW_DEF_AREA_OFFSETS~ // DÉFINITION des offsets généraux des fichiers ARE.
COPY ~Diamant_Eternel/Cartes/Chap1/GW0000.are~ ~override/GW0000.are~
SET GW_Mes_Portail = RESOLVE_STR_REF (@1000001) // Le portail est désactivé.
SET GW_Mes_Epave = RESOLVE_STR_REF (@1000002) // Ce navire arrimé à la plateforme a été passé par le fond.
SET GW_Mes_Statue1 = RESOLVE_STR_REF (@1000003) // Autrefois superbe, cette statue brisée semble représenter un guerrier monumental.
SET GW_Mes_Statue2 = RESOLVE_STR_REF (@1000004) // Ce guerrier brandissant une énorme épée émerge de l'eau. Il devait être relié au socle brisé.
SET GW_Mes_PotoJG4 = RESOLVE_STR_REF (@1000005) // Le sol est couvert de croûtes de sang séché et de lambeaux de chair. Des piles de restes humains gisent dans les environs. Il semble qu'on a empalé les habitants sur ces pieux pointus pour les y laisser saigner à mort. Quelqu'un a été massacré ici.
SET GW_Mes_Autel = RESOLVE_STR_REF (@1000006) // Cet autel calciné est submergé par une intolérable odeur de pourriture. Malgré les outrages qu'il a reçus, une impression de bien-être s'en dégage.
SET GW_Mes_StatueFondue = RESOLVE_STR_REF (@1000007) // Le placage en or de cette statue a été pillé.
SET GW_Mes_StatueBroken = RESOLVE_STR_REF (@1000008) // Autrefois superbe, cette statue a été brisée et son corps doré a été volé.
SET GW_Mes_ArbreAcide = RESOLVE_STR_REF (@1000009) // Vous sentez l'odeur rance et acide des vapeurs toxiques qui ont manifestement détruit cet arbre.
SET GW_Mes_ArbreBrule = RESOLVE_STR_REF (@1000010) // Tout ce qui reste d'un arbre qui a été calciné par un feu intense.
SET GW_Mes_Maison = RESOLVE_STR_REF (@1000011) // Cette maison a été abandonnée précipitamment.
PATCH_IF (SOURCE_SIZE > GW_area_min_size) THEN BEGIN
LPF ~GW_READ_AREA_STRUCTURE~ RET GW_region_num GW_region_off END
FOR (i = 0 ; i < GW_region_num ; ++i) BEGIN // Pour chaque région
READ_ASCII ("%GW_region_off%" + ("%GW_reg_size%" * i)) "name" (32) NULL
SET GW_region_text = "%GW_region_off%" + "%GW_reg_text_of%" + ("%GW_reg_size%" * i)
PATCH_MATCH ~%name%~ WITH
Portail BEGIN WRITE_LONG GW_region_text GW_Mes_Portail END
Epave1 Epave2 BEGIN WRITE_LONG GW_region_text GW_Mes_Epave END
Statue1 BEGIN WRITE_LONG GW_region_text GW_Mes_Statue1 END
Statue2 BEGIN WRITE_LONG GW_region_text GW_Mes_Statue2 END
PotoJG4 BEGIN WRITE_LONG GW_region_text GW_Mes_PotoJG4 END
Autel BEGIN WRITE_LONG GW_region_text GW_Mes_Autel END
StatueFondue1 StatueFondue2 StatueFondue3 StatueFondue4 StatueFondue5 StatueFondue6 BEGIN WRITE_LONG GW_region_text GW_Mes_StatueFondue END
StatueBroken1 StatueBroken2 StatueBroken3 StatueBroken4 BEGIN WRITE_LONG GW_region_text GW_Mes_StatueBroken END
ArbreAcide BEGIN WRITE_LONG GW_region_text GW_Mes_ArbreAcide END
ArbreBrule BEGIN WRITE_LONG GW_region_text GW_Mes_ArbreBrule END
Maison BEGIN WRITE_LONG GW_region_text GW_Mes_Maison END
DEFAULT
END // of PATCH_MATCH ~%name%~ WITH
END // of FOR (i = 0 ; i < GW_region_num ; ++i)
END // of PATCH_IF (SOURCE_SIZE > GW_area_min_size)
BUT_ONLY
Note spéciale : si tu pouvais utiliser les balises <CODE> dans tes messages de scripts, ça en simplifierait la lecture, et puis ça m'éviterait de les mettre en page. Je sais, je suis un gros fainéant.
Posté : ven. 10 mars 2017, 20:40
par Cocrane
Je vois que tu maîtrises bien cette partie.
J'ai utilisé ton code dans le TP2 avec un LOADTRA en amont pour signaler où se trouve le texte.
La mise à jour se fait sans erreur.
Dans DLTCEP, le container contient bien le nouveau teste dans openfail.
Par contre, dans le jeu, suite à un échec de forçage ou de crochetage, le message n'apparait pas.
Cocrane
Posté : ven. 10 mars 2017, 22:50
par Isaya
Quand tu modifies une zone, lorsque tu veux tester dans le jeu, assure-toi que tu repars bien d'une sauvegarde dans laquelle tu n'as pas déjà visité la zone que tu veux patcher. Si tu ne respectes pas cette règle, tu verras systématiquement l'état de la zone enregistré dans ta sauvegarde (mémorisé dans le fichier SAV) et par conséquent, aucune de tes modifications, bien qu'elles soient passé dans le fichier ARE de l'override.
Posté : ven. 10 mars 2017, 23:45
par Cocrane
C'est noté mais ce n'est pas lié à mon cas.
Ma save est sur l'AR0015 et ensuite les PNJ sont déplacés sur la carte en question.
Cocrane
Posté : sam. 11 mars 2017, 08:11
par Freddy_Gwendo
Certes, mais est-ce la première fois que tu te rends dans cette carte ? Si non, c'est normal que les modifs ne soient pas prises en compte comme le signale Isaya. En revanche, si oui, c'est plus qu'étrange. Dans ce cas, envoie-moi ton fichier .are pour que j'y jette un œil dans NI. Il y a peut-être un flag non coché dans ton conteneur.
Posté : sam. 11 mars 2017, 09:25
par Cocrane
Posté : sam. 11 mars 2017, 11:01
par Freddy_Gwendo
Bizarre, vous avez dit bizarre ? Comme c'est ...
Plus sérieusement, je ne vois rien qui cloche dans ton fichier.
Ceci dit, pour être bien sûr :
1. Es-tu certain que le message ne s'affiche pas dans la boîte de dialogue ? Car il ne s'affiche pas au-dessus du perso dans l'écran de jeu.
2. As-tu essayé de faire crocheter le conteneur par un voleur ou as-tu seulement essayé de le forcer ? Teste avec un voleur.
Posté : sam. 11 mars 2017, 11:11
par Cocrane
Dans la boite dialogue, le message n'apparait pas. Juste le message classique.
J'ai essayé de crocheter et de forcer la serrure.
A noter, j'ai enlevé le script qui était dans mon COM021.BAF
Code : Tout sélectionner
IF
PickLockFailed("S2cercueil1")
THEN
RESPONSE #100
DisplayStringHead(LastTrigger,@6)
END
Il me semble que la config du .ARE est autonome.
Cocrane