Jump to content

Questions diverses relatives aux scripts sous fse


teenage caveman

Recommended Posts

J'en ai une :Existe-t-il un guide pour la syntaxe pour FSE ?Parce qu'en scriptant, ce qui me fait le plus galérer c'est la syntaxe, je vois très bien ce que je veux demander au jeu, je vois quelles commandes associer à ça mais à chaque fois que je compile, ça merde au sujet de la syntaxe alors j'essaie de la modifier mais je trouve pas la bonne configuration, en même temps je m'attaque peut être à un truc un peu dur après 2 jours d'expérience. Mais je serais bien intéressé de comprendre le fonctionnement de la syntaxe de FSE.Merci d'avance pour vos réponses !

Link to comment
Share on other sites

Je ne suis pas totalement sûr d'avoir tout pigé mais bon...

1) regarde les commandes de script dans le manuel du mapper (que tu peux trouver en français dans la partie download du site).
2) il y a des trucs dans les différents fichiers .h dans mapper/script/headers (la plupart du temps pour s'en servir faut l'inclure dans le script : peut-être un tuto un de ces quatre).
3) Le TRUC : inspire-toi des scripts déjà fait pour le jeu (ouvre les .ssl correspond dans le mapper et essaye de comprendre) : tu veux faire un truc genre un robot qui s'autodétruit, cherche un robot qui s'autodétruit dans le jeu (celui de la rnc), cherche son script, ouvre -le et cherche le bout de script qui concerne cette auto destruction.
4) quelques trucs (bouts de script prêts à l'emploi) sont déjà dans la partie modding fallout 1 & 2 (et d'autres sont en préparation par soifran et moi).

tu peux aussi poser ton problème de syntaxe ici aussi si tu veux

Link to comment
Share on other sites

J'ai déjà pensé à m'inspirer des scripts existants, le problème étant qu'il n'existe aucun pnj te donnant une quantité d'xp donné selon que c'est la n ième fois où tu lui dis telle phrase.Et ce que je voulais dire par syntaxe, c'est l'emploi correct (c'est à dire compilable) des termes if, then, and, else, etc etc.Parce que si j'essaie de compiler ceci dans mon script, il ne veut pas :

procedure node002beginif (local_var(LVAR_Herebefore)<<8) then Reply(108);else Reply (112);set_local_var(LVAR_Herebefore,0);if (local_var(LVAR_Herebefore)==0) then give_exp_points(3000);set_local_var(LVAR_Herebefore,1);if (local_var(LVAR_Herebefore)==1) then give_exp_points(12000);set_local_var(LVAR_Herebefore,2);if (local_var(LVAR_Herebefore)==2) then give_exp_points(21000);set_local_var(LVAR_Herebefore,3);if (local_var(LVAR_Herebefore)==3) then give_exp_points(30000);set_local_var(LVAR_Herebefore,4);if (local_var(LVAR_Herebefore)==4) then give_exp_points(39000);set_local_var(LVAR_Herebefore,5);if (local_var(LVAR_Herebefore)==5) then give_exp_points(48000);set_local_var(LVAR_Herebefore,6);if (local_var(LVAR_Herebefore)==6) then give_exp_points(57000);set_local_var(LVAR_Herebefore,7);if (local_var(LVAR_Herebefore)==7) then give_exp_points(120000);set_local_var(LVAR_Herebefore,8);giq_option(1,NAME,111,node999,50); end

Link to comment
Share on other sites

Ben il est un peu foireux ton script... Là tu lui demandes de mettre la même variable à des niveaux différents en même temps... Le plus simple serait de faire plusieurs nœuds (1 par variable) et de passer les conditions dans le talk_n_proc comme ceci :

procedure talk_p_proc beginif (local_var(LVAR_Herebefore) == 1) then begin       call node003;   end else if (local_var(LVAR_Herebefore) == 2) then begin       call node004;   end else if (local_var(LVAR_Herebefore) == 3) then begin       call node005;   end else if (local_var(LVAR_Herebefore) == 4) then begin       call node006;   end else if (local_var(LVAR_Herebefore) == 5) then begin       call node007;   end else if (local_var(LVAR_Herebefore) == 6) then begin       call node008;   end else if ((get_critter_stat(Dude_obj, STAT_iq)>3) and (local_var(LVAR_Herebefore) == 0)) then begin   start_gdialog(NAME, self_obj, 4, -1, -1);      gsay_start;      call node001;      gsay_end;   end_dialogue;   endend

mets autant de if (local_var(LVAR_Herebefore == *) [...] end else if que tu as de niveaux de variable pour herebefore.puis fais tes nœuds comme cela :

procedure node003 beginReply(108);set_local_var(LVAR_Herebefore,2);give_exp_points(12000);giq_option(1,NAME,111,node999,50);end

Bien sûr le nœud 002 pour la LVAR=0 tu fais :

procedure node002 beginReply (108);give_exp_points(3000);set_local_var(LVAR_Herebefore,1);giq_option(1,NAME,111,node999,50);end
Normalement cela devrait marcher.
Link to comment
Share on other sites

procedure node002 beginReply (108);give_exp_points(3000);set_local_var(LVAR_Herebefore,1);giq_option(1,NAME,111,node999,50);end
Normalement cela devrait marcher.
mauvais copié collé ;)je pense qu'il vaut mieu passer la variable à 3 :)de plus, je creerai personnellement une autre variable appelé par exemple#define LVAR_givexp (X)ou X est le numéro disponible dans la liste de tes variables.Ne pas oublié par la même d'incrementer la valeur dans le scripts.lst.Pourquoi ,car il vaut mieux utiliser des variables locales en relation direct avec leur utilité.En effet, lpus tard tu pourras faire evoluer ton script et decider de dire que si le type à deja été ici, il se passe autre chose.Mais bon, c'est pas non plus handicapant.Pour le coté technique.Perso ce que je fait c'est comme l'a dit teenage, je m'inspire d'un script existant s'approchant de ce que je veux faire pour comprendre comment les gars on fait.De plus, au début, je fait mes conditions une par une.C'est à dire que par exemple, je ne fait qu'un truc du genre:If variable truc = machinn then faire bidule.j'enregistre et je compile, et cs'il y a une erreur, je tache de la corriger.Ensuite je rajoute un truc.IF variable truc = machin and bidule_is_bordelising_by_neuneu(dude_obj,PID_zinzin) then faire bidule.Au débutn en procédant par étape, tu localiseras normalement plus facilement les erreurs.Souvent, quand il te dit qu'il manque des ; ou des end apres begin etc,etc, ça vient du fait que tu a oublié une parenthèse.Donc rappelle des script originaux et reproduit leur syntaxe.++Soifran
Link to comment
Share on other sites

Je n'ai pas encore réglé le problème de la compilation, car j'essaie de bien mettre en forme les scripts de mon pnj.Pour cela, j'essaie de bien séparer chaque chose pour que ça marche bien et que les erreurs soient facilement repérable en utilisant le système de node car je pense l'avoir bien compris.Cependant est-ce que ce n'est pas extravagant d'avoir 41 nodes sur un script ?Et sachant qu'il s'agit d'un système où le pnj donne toujours des quatités d'xp différentes et avec une condition pour le trait "skilled" (qui sera bien en vue sur fonline par ailleurs).EDIT:Finalement, j'ai optimisé pour 35 nodes (et il contient trois séries répétitives de 8, 8 et 13 nodes)

Link to comment
Share on other sites

salut,Bah pour l'instant on s'en fout du nombre de node (même après ;) ) .Ce qui compte c'est que ça fonctionne et que tu comprennes peu à peu l'esprit du scriptage.Une fois que ton script sera compilé et fonctionnera on regardera ce qu'onpeut optimiser.Autre chose.Une regle d'or.Si tu es arrivé a faire un truc sous FSE, prends bien soin d'en faire une copie.Car bien souvent en rajoutant une focntion pour améliorer, la compile ne marche plus, soit un problème de syntaxe, de variable mal déclarée, etc.En aprés, tu galère pour revenir çà l'état qui marchait .Et crois moi je sais de quoi je parle :)++Soifran

Link to comment
Share on other sites

Je vois aussi de quoi tu parles ^^, je tâcherai d'y penser.Et as-tu une idée de la bonne utilisation de la commande has_trait ? parce que je crois que j'ai un problème avec.

Link to comment
Share on other sites

Par exemple, est-ce correct de mettre :

procedure truc
begin

if has_trait(TRAIT_TRAIT,dude_obj,TRAIT_skilled) then begin
call nodemachin;
end
if else then begin
call nodechose;
end

end
Link to comment
Share on other sites

oui et non.Déjà si tu fais appelles à un node, ton procédure truc sera procedure_talk_p_procensuite, tu écris ta phrase comme tu la penses.Je m'explique.Si tu veux que ton robot réagisse spécifiquement si le PNJ à un skill particulier, alors tu dois ecrire en C++:Si le jouer a la spécialité main d'or (c'est un exemple) alors activer le noeud 22.sinon activer le noeud 15.Tu remarqueras qu'il n'y a qu'une condition.En C++ ça se traduit par:

if has_trait(TRAIT_TRAIT,dude_obj,TRAIT_skilled) then call nodemachin;elsecall nodetruc;end
Dans ta phrase si tu regarde bien tu réponds après else (ou) par une autre condition (if).Or ce n'est apparement pas dans ton intention.Donc si tu n'as que 2 possibilité pour une condition tu ne dois pas mettre deux fois if.ça c'est pour le non.Pour le oui :)Tu peux tout à fait créer plusieurs conditions successivement.Dans ce cas, tu fais comme tu as ecrit.Par exemple:Si le personnage à la main d'or, alors activer le noeud 22.Si le personnage a la spé beau parleur, activer le noeud 15.fin.Dans ce cas la, les 2 conditions sont indépendantes.tu peux avoir l'une ou l'autre.tu ecriras donc:
if has_trait(TRAIT_TRAIT,dude_obj,TRAIT_main d'or) then     call nodemachin;elsecall node trucmuche    end    if else if has_trait(TRAIT_TRAIT,dude_obj,TRAIT_beau parleur) then    call nodechose;else call trucmuche;    end
Tu as peut etre remarqué que si la condition "IF" n'était pas remplie, je mettais d'aller vers le node trucmuche.A chaque fois ou l'une des condition n'est pas remplie.En fait cela permet de lancer un dialogue de base si le perso n'est doué d'aucune capacité particulière.comme ça tu donnes quand même la possibilité au joueur de dialoguer, mais sans rentrer dans les d&tails.Un peu comme a NRC, quand tu empeches le type de se faire peter avec la bombe.Si tu n'as pas plus de 80 en discours, tu n'as pas l'option de la succession de dialogues qui permettent de lui rendre sa raison.Et donc il pète.La c'est le else call trucmuche.Regarde les scripts du jeu.Il ne mettent pas de begin avant call.Je n'ai pas encore tout à fait compris pourquoi, mais ce que je peut te dire , c'est qu'il faut t'inspirer le plus possible de l'existant pour faire du neuf.Nous ne sommes pas informaticiens.Mais Français.Donc on se demerde avec ce qu'on a ;) .Notre tête (et notre grande gueule).SchussSoifran
Link to comment
Share on other sites

Merci pour tous ces conseils.Cependant j'ai encore des questions :- Ma procédure est-elle nécessairement le talk_p_proc dans notre exemple ou est-ce que cela peut être un node que j'aurais raccroché au talk_p_proc ?- Et pourquoi teenage utilise-t-il alors begin et end pour appeler les nodes après un then ? (voir page précédente)

Link to comment
Share on other sites

bonne question.Je t'avoue ne pas avoir trop pigé la subtilité.Cependant, j'ai l'impression qu'un begin est employé quandil y a une succession d'ordre à exécuter pour un même action.genre, envoyer le dialogue (Gsay_start...) puis appeler le noeud.Par exemple tu remarqueras que souvent (tout le temps même) la commande float_msg(self_obj,mstr(102),FLOAT_MSG_GREEN); par exemple s'emploie souvent sans begin.Elle est une action...finale et seule, correspondant souvent à un personnage qui n'a plus rien à te dire, donc s'emploie sans begin.Mais je peux me tromper.Encore une fois, inspire toi de scritp existant.Bon courage.Soifran

Link to comment
Share on other sites

Je crois simplement que la mise à l'écart parfois du couple begin end est due à une question de fluidité (moins de trucs à calculer).Par contre avec des conditions en cascade cela risque de bugguer si on ne les mets ; cela permets de bien séparer des sous blocs.A moins avis, si tu fais

procedure machin beginIf Has_trait(trait_trait,dude_obj,trait_skilled) thencall node**elsecall node***
les begin ne sont pas nécessaire (car une seule condition) mais si plusieures conditions lié à des traits différents alors oui vaut mieux les mettre (au cas où)Mais comme le dit soifran, vaut mieux s'inspirer des scripts existant (quoique parfois ils sont buggués...)
Link to comment
Share on other sites

Je crois que je me suis un peu dégoûté avec ce script. Ca reste un peu confu dans ma tête.Je vais attendre un peu avant de m'y remettre.Mais ce qui m'a dégoûté, en gros :-Le fait de rajouter 2 nouvelles variables (pas l'habitude)-La compréhension difficile de la syntaxe de scriptage-Trop de noeuds ! (35, j'ai optimisé)-Des commandes que je trouve bizarre et dont je n'ai pas encore l'habitude (has_trait)Enfin voilà, je fais une pause pour jouer un peu (bah ouais j'étais en train de me faire un perso full crtitic dans fo2 et je l'ai lâchement abandonné) puis je m'y remettrais après.

Link to comment
Share on other sites

C'est normal JAck.C'est comme apprendre une langue etrangère sur le tas.La syntaxe, se resume en fait en gros a placer au bonne endroite les parenthèses, les point virgules et ne pas oublier les end apres les serie de begin ;)Faut un peu de temps, mais aprés ça rentre.A bientôt.Soifran

Link to comment
Share on other sites

J'aurais pas fait une pause longtemps mais je m'y remets tranquillement parce que j'ai un peu de temps.Là j'aimerais régler un nouveau problème, quand je compile j'obtiens le message d'erreur suivant :

TEMP.I(9396): Error! Undefined symbol TRAIT_SkilledFSE info --> Compiler reports unknown command or character."Please check whenever you have mistyped function or procedure name or not declared all variables."

Et quand j'enlève le node contenant ma fonction has_trait ça compile (évidemment...).Je vous donne copie de mon node et dites moi ce qu'il vous inspire s'il vous plaît :
procedure node002begin if has_trait(TRAIT_TRAIT,dude_obj,TRAIT_Skilled) and (dude_iq < 8) then call node005; if has_trait(TRAIT_TRAIT,dude_obj,TRAIT_Skilled) and (dude_iq > 7) then call node006; else call node007;end
EDIT :Je crois que je vais un peu fouiner dans les headers, il y a plein de trucs dedans.EDIT2:Y aurait-t-il une quelconque variable à définir pour le trait "skilled" au début de mon script ?
Link to comment
Share on other sites

salut Jack.Essaye ça:

procedure node002begin if ((has_trait(TRAIT_TRAIT,dude_obj,TRAIT_Skilled)) and (dude_iq <= 7)) then call node005; else call node006;end
toujours à mon avis une question de syntaxe.Personnellement quand j'ai au moins 2 conditions pour declencher un evenement (call node005 ic) , je les "encapsule".La même fonction que les parenthèse en math:(a+B)*c different de a+b*c (sauf si a=0 ;) )regarde pour exemple le script de jordan:ACjordan dans arroyo.
if ((dude_iq < 4) or (local_var(LVAR_Taught_Player) == 1) or       (has_skill(dude_obj,SKILL_MELEE) < 36)) then begin       call Node001;
ils enmaillotent chacune des conditions et les mettent a l'interieure d'un grande parenthèse.Donc en resumer, quand j'ai 2 conditions, je les sertie de parenthese chacune, et j'englobe les 2 dans une autre parenthèse globale.
Link to comment
Share on other sites

Alors, d'une part, j'ai rajouté les parenthèses, ce qui n'a rien changé, mais au moins je connaitrais cela.Voilà la copie du passage :

procedure node002begin if (has_trait(TRAIT_TRAIT,dude_obj,TRAIT_Skilled)) and (dude_iq < 8) then call node005; if (has_trait(TRAIT_TRAIT,dude_obj,TRAIT_Skilled)) and (dude_iq > 7) then call node006; else call node007;end

Et quant au "#define TRAIT_TRAIT TRAIT_skilled", je l'ai rajouté mais pas de changement au moment de la compilation là encore. Voilà une nouvelle copie :

#include "..\headers\define.h"#define NAME SCRIPT_ZNET#define TRAIT_TRAIT TRAIT_skilled #include "..\headers\command.h"

J'ai aussi essayé de faire cette modification en ne mettant que "#define TRAIT_skilled". Rien de nouveau non plus.Cependant teenage, tu parlais d'inclure un .h, je ne sais pas trop comment ils marchent.Est ce que tu pourrais m'expliquer leur utilité et les raisons de les inclure dans le script ?Aussi j'aimerais vous demander si vous connaissez un PNJ de fallout qui impose une condition de trait. J'y ai réfléchi mais je ne trouve pas. Je ne pense pas qu'il y en ait d'ailleurs.
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...