teenage caveman Posted June 30, 2009 Share Posted June 30, 2009 Posez vos interrogations quant au scriptage ici. Quote Link to comment Share on other sites More sharing options...
Guest Posted July 1, 2009 Share Posted July 1, 2009 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 ! Quote Link to comment Share on other sites More sharing options...
teenage caveman Posted July 1, 2009 Author Share Posted July 1, 2009 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 Quote Link to comment Share on other sites More sharing options...
Guest Posted July 1, 2009 Share Posted July 1, 2009 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 Quote Link to comment Share on other sites More sharing options...
teenage caveman Posted July 1, 2009 Author Share Posted July 1, 2009 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);endNormalement cela devrait marcher. Quote Link to comment Share on other sites More sharing options...
soifran Posted July 1, 2009 Share Posted July 1, 2009 procedure node002 beginReply (108);give_exp_points(3000);set_local_var(LVAR_Herebefore,1);giq_option(1,NAME,111,node999,50);endNormalement 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 Quote Ok...ca c'est fait...suivant...FOMM à jour Link to comment Share on other sites More sharing options...
Guest Posted July 1, 2009 Share Posted July 1, 2009 Merci pour tous ces conseils. Ca m'a l'air plus logique à votre manière effectivement.Je teste ça dès que j'ai le temps et je vous tiens au courant. Quote Link to comment Share on other sites More sharing options...
Guest Posted July 2, 2009 Share Posted July 2, 2009 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) Quote Link to comment Share on other sites More sharing options...
soifran Posted July 3, 2009 Share Posted July 3, 2009 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 Quote Ok...ca c'est fait...suivant...FOMM à jour Link to comment Share on other sites More sharing options...
Guest Posted July 3, 2009 Share Posted July 3, 2009 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. Quote Link to comment Share on other sites More sharing options...
soifran Posted July 3, 2009 Share Posted July 3, 2009 heu oui?Mais tu veux faire quoi en fait?ça aiderait ma réponse ;) Quote Ok...ca c'est fait...suivant...FOMM à jour Link to comment Share on other sites More sharing options...
Guest Posted July 3, 2009 Share Posted July 3, 2009 Par exemple, est-ce correct de mettre :procedure trucbeginif has_trait(TRAIT_TRAIT,dude_obj,TRAIT_skilled) then begincall nodemachin;endif else then begin call nodechose;endend Quote Link to comment Share on other sites More sharing options...
soifran Posted July 3, 2009 Share Posted July 3, 2009 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;endDans 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; endTu 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 Quote Ok...ca c'est fait...suivant...FOMM à jour Link to comment Share on other sites More sharing options...
Guest Posted July 4, 2009 Share Posted July 4, 2009 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) Quote Link to comment Share on other sites More sharing options...
teenage caveman Posted July 4, 2009 Author Share Posted July 4, 2009 vite fait : 1) tu peux en créer une bidon style procedure carambar (mais faut la définir au préalable) après tout dépends ce que tu veux faire exactement.2) Je ne crois pas que cela soit obligatoire mais cela marche mieux dans le talk_p_proc. Quote Link to comment Share on other sites More sharing options...
soifran Posted July 4, 2009 Share Posted July 4, 2009 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 Quote Ok...ca c'est fait...suivant...FOMM à jour Link to comment Share on other sites More sharing options...
teenage caveman Posted July 4, 2009 Author Share Posted July 4, 2009 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...) Quote Link to comment Share on other sites More sharing options...
Guest Posted July 5, 2009 Share Posted July 5, 2009 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. Quote Link to comment Share on other sites More sharing options...
soifran Posted July 6, 2009 Share Posted July 6, 2009 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 Quote Ok...ca c'est fait...suivant...FOMM à jour Link to comment Share on other sites More sharing options...
Guest Posted July 6, 2009 Share Posted July 6, 2009 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;endEDIT :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 ? Quote Link to comment Share on other sites More sharing options...
teenage caveman Posted July 6, 2009 Author Share Posted July 6, 2009 faut que tu définisses ton trait (très certainement un fichier .h à inclure dans le script. Sinon #define trait_skilled)en dessous de #define NAMEécris: #define TRAIT_skilled (et si cela ne marche pas essaye : #define TRAIT_TRAIT TRAIT_skilled Quote Link to comment Share on other sites More sharing options...
soifran Posted July 6, 2009 Share Posted July 6, 2009 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;endtoujours à 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+*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. Quote Ok...ca c'est fait...suivant...FOMM à jour Link to comment Share on other sites More sharing options...
teenage caveman Posted July 6, 2009 Author Share Posted July 6, 2009 Ouais peut-être soifran MAIS le problème de jack.fr est LA NON DÉFINITION du TRAIT en question. Il doit juste le définir (cf l'edit de mon post ci-dessus). Quote Link to comment Share on other sites More sharing options...
Guest Posted July 6, 2009 Share Posted July 6, 2009 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;endEt 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. Quote Link to comment Share on other sites More sharing options...
soifran Posted July 7, 2009 Share Posted July 7, 2009 Question con, tu le sors d'où TRAIT_TRAIT ?jamais fais gaffe auparavant?Car s'il n'est pas dans le define.H, ce n'est pas étonnant ? Quote Ok...ca c'est fait...suivant...FOMM à jour Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.