Jump to content

creer un script ou un PNJ ameliore une compétence.


soifran

Recommended Posts

Bon j'ai merdé avec le PNO alors je fais ça, tant pis. La première version sera archaïque ;]
J'ai voulu te donner un bout de script où une skill est améliorée, comme à Arroyo Jordan le fait, mais en fait je n'avais qu'un charabia de script sans queue ni tête, basé uniquement sur les réactions et le karma semble-t-il... Je n'ai pas pu accéder aux dialogues en eux-même.

Un cas concret :)

Ouvrir FSE et ouvrir le script d'acjordan, présent dans le dossier mapper/scripts/arroyo

a la procédure:
procedure talk_p_proc begin   Evil_Critter:=0;   Slavery_Tolerant:=SLAVE_TOLERANT;   Karma_Perception:=KARMA_PERCEPTION1;   CheckKarma;   GetReaction;   if ((dude_iq < 4) or (local_var(LVAR_Taught_Player) == 1) or       (has_skill(dude_obj,SKILL_MELEE) < 36)) then begin       call Node001;   end   else begin       start_gdialog(NAME,self_obj,4,-1,-1);       gSay_Start;           call Node002;       gSay_End;       end_dialogue;   endend
On peut lire effectivement que le script test le karma du joueur.
En fait si le joueur ne reponds pas a un de ces critères (pas critters ;) ) le up de skill qui suis ne se fera pas.
En gros,
Evil_Critter:=0; si le heros n'est pas maléfique
Slavery_Tolerant:=SLAVE_TOLERANT; si le heros ferme les yeux sur l'esclavage, mais n'est pas lui même esclavagiste

Karma perception :je ne sais pas trop de quoi il retourne pour l'instant, pas creusé.

Check karma est une macro qui lance justement l'analyse du karma du heros.

Get reaction est la derniere partie de la procedure qui est en fait une macro qui compile toutes ces infos et en ressort un résultat.

En fait ca sert a faire en sorte que si le heros est esclavagiste par exemple, il va avoir du mal a causer a la gonzesse des commandos a NRC.
et vice versa.
Ici, c'est s'il est mauvais, les gens d'arrroyo ne voudront pas l'aider.
Mais on peut imaginer un membre du village mauvais qui lui n'apprendrait un truc qu'a un heros du même alignement que lui (Oui j'ai beaucoup joué a donjon dragon ;) )

on continue.

la partie donc up de skill proprement dites:

if ((dude_iq < 4) or (local_var(LVAR_Taught_Player) == 1) or       (has_skill(dude_obj,SKILL_MELEE) < 36)) then begin       call Node001;   end   else begin       start_gdialog(NAME,self_obj,4,-1,-1);       gSay_Start;           call Node002;       gSay_End;       end_dialogue;   endend
if ((dude_iq < 4) or (local_var(LVAR_Taught_Player) == 1) or
(has_skill(dude_obj,SKILL_MELEE) < 36)) then begin
call Node001;
se traduit par:

Si le heros a une intelligence inférieure à 4 ou si la variable locale taught_player est égale a 1 (je ne sais pas ce que c'est faut que je regarde) ou si le skill du heros en arme de melée est inferieure a 36, alors lancer le noeud 1.

C'est en fait une serie de test préalable au lancement ou pas de l'upgrade du skill.
Si le heros rempli au moins un de ces 3 critères, alors on lance le node001.
Ici, si vous allez voir le node un vous verrez que c'est le node ou jordan ne veux plus vous apprendre le skill.
Soit parce que vous etes trop con (intelligence <4 ;) )
soit parce que vous avez déja fait appela jordan (taught player=1)
soit parce que vous êtes vraiment une merde a la lance et que vous partez vraiment de trop loin ;) (has_skill(dude_obj,SKILL_MELEE) < 36)

comme on a une command "if" on peut avoir une condition alternative.
Si le personnage a une intelligence >4 ET si la variable locale taught_player=0 (pas encore demandé a jordan de vous enseigner) ET si le skill est superieure a 36, alors on lance le NOde002 qui correspond au début du dialogue ou jordan vous propose la 1ere fois de vous aider.

else begin       start_gdialog(NAME,self_obj,4,-1,-1);       gSay_Start;           call Node002;       gSay_End;       end_dialogue;   end
Allons donc voir le node001.
sur la droite de FSE se trouve les liens vers les nodes justement.
Cliquez sur le node001 et vous serez amené a la ligne correspondante.
ici jordan vous affiche un FLOAT_MSG, un message flottant, celui ou il vous dit qu'il vous a déjà tout enseigné.

Petite parenthése.
Cliquez sous FSE sur l'icône de casier jauen comme indiqué sur la photo.
selectionner MSG.files comme indiqué sur la photo.
puis sur ACJORDAN.
Cela aura pour effet d'ouvrir directement le dialogues de jordan et ainsi de voir a quoi correspondent les nodes.
Attention, je rappelle que Jargo a fait ce logiciel pour une version US, donc vous n'aurez que les dialogues en anglais.
Mais bon, je ne pense pas que ça soit un réelle soucis pour vous.

Image IPB

cela vous permettra de voir a quoi correpondent les nodes.

Dessous vous avez donc le node002, qui initie le dialogue la première fois.

le node 002

procedure Node002 begin   Reply(103);   NOption(104,Node003,004);   NOption(105,Node999,004);end
Vous n'avais donc ni une intelligence <4, ni encore parlé a jordan (taugh_player=0) ni un skill pourrave <36 a la lance
donc jordan vous dit:
Reply(103);
"Chosen One, the way you use a spear, you'll be meat for the geckos
in no time. I can show you a few tricks."
en gros il vous propose de vous apprendre a etre moins un blaireau a la lance (donc skill arme de mélée)
vous avez 2 option de réponse:
NOption(104,Node003,004);   NOption(105,Node999,004);
qui correspondent donc a 104
{Sure.}
ou 105
{105}{}{No, thanks.}

Si vous repondez 104, alors le script va lancer le noeud 003.
NOption(104,Node003,004)
sinon il lancera le noeud 999 qui est le noeud correspondant a la fin de dialogue.
NOption(105,Node999,004)

Rassurez vous.
Lors de la création d'un dialogue, sous FSE vous n'aurez pas a vous taper tout ça, le logiciel le fera pour vous.
Je vous renvoie a mon tutoriel la dessus:
générer un dialogue sous FSE partie 2

donc continuons, allons voir le node003:

procedure Node003 begin   NMessage(106);   gfade_out(600);   gfade_in(600);   game_time_advance(8*ONE_GAME_HOUR);   critter_mod_skill(dude_obj,SKILL_MELEE,10);   set_local_var(LVAR_Taught_Player,1);   Reply(107);   NOption(108,Node999,004);end
traduction:
NMessage(106);
il vous reponds que ca va prenddre un peu de temps:
{This will take a little while.}

ensuite vous avez:
gfade_out(600);
gfade_in(600);

Souvenez vous. lors de l'apprentissage, vous avez un ecran noir qui s'affiche puis le jeu revient a la normal.
cela simule le temps qui s'ecoule sous fallout.

gfade_out(600);
gfade_in(600);

est la procedure pour simuler ceci.
la valeur 600 correspond je crois au nombre de ticks qui est l'unité de temps de fallout ou l'ecran noir apparait et disparait.
Enfin j'en suis pas sur, , à verifier plus tard.

ensuite vous avez:
game_time_advance(8*ONE_GAME_HOUR);   critter_mod_skill(dude_obj,SKILL_MELEE,10);   set_local_var(LVAR_Taught_Player,1);
tout con:
game_time_advance(8*ONE_GAME_HOUR); fait avancer le jeu de 8 heures (en gros ca prends 8 heures à votre perso pour apprendre a upper sa competence)
critter_mod_skill(dude_obj,SKILL_MELEE,10); ici on modifie le skil du critter

la commande est critter_mod_skill.
Si vous la tapez manuellement sous FSE, vous verrez qu'elle attends 3 renseignements:
qui ? (dude_obj renvoie au héros, mais ca peut etre un membre de l'équipe)
Quelle competence?
SKILL_MELEE, (je ne vous traduit pas ;) )
de combien.
10

voila Izual.

Si tu veux modifier un de ces parametres c'est ici qu'il faut le faire.

Par exemple:
si tu veux que jordan t'apprenne plutot a te servir de tes poings, alors ouvre le fichier define.H situé dans le mapper/scripts/headers/

Ouais je sais, au début ca fait peur ;) mais on s'y fait vite.
Comme dans matrix, à la fin on voit directement les image en regardant les 0 et les 1 ;)
C'est ici que sont stockées les commandes se rapportant a telles ou telles compètences ( entre autre)
donc si tu veux plutot main nue, descend l'ascenceur jusqu'à trouvé les skills et notament
#define SKILL_UNARMED_COMBAT (3)

En fait tu sauras du coup comment ecrire la commande pour que ce soit la competence main nue qui soit augmentée plutot que melée.

critter_mod_skill(dude_obj,SKILL_UNARMED_COMBAT,10);

ensuite si tu veux que celle ci soit augmentée de 12...
je ne vais pas te faire l'affront de l'ecrire, je pense que tu as compris.

parcontre pour rester logique, n'oublie pas de remplacer partout SKILL_MELEE par SKILL_UNARMED_COMBAT.

Je crois d'ailleur que tu as un outil dans FSE pour ca.
Les petites jumelles en haut avec A et B dessous.
Elles te permettent de remplacer un nom par un autre.

Pour plus de coherence , pense également a corriger et enregistrer le dialogue à l'endroit correspondant. (ici le 103)

Sauve le dialogue, il sera stockée je le repete dans data/text/english/dialog/acjordan.
donc pense a le copier dans son homologue français si ton mapper ou ton jeu sont en français.
Sinon tu ne verras pas la difference.

les derneires lignes de code comme :
set_local_var(LVAR_Taught_Player,1);
on pour effet de passer la variable locale Taught_player (je soupçonne que ca doit vouloir dire un truc du genree joueur instruit, c'est à dire le joueur à t'il d"ja reçut la formation) de 0 (competence pas augmentée) à 1.
Ainsi on evite d'apprendre au joueur à l'infini de monter sa compétence.
souvenez vous la ligne test du node001

if ((dude_iq < 4) or (local_var(LVAR_Taught_Player) == 1) or       (has_skill(dude_obj,SKILL_MELEE) < 36)) then begin       call Node001;   end   else begin       start_gdialog(NAME,self_obj,4,-1,-1);       gSay_Start;           call Node002;       gSay_End;       end_dialogue;   endend
c'était l'une des conditions pour laquelle jordan ne faisait plus que vous afficher un message flottant.

Voila.
J'espere que vous avez suivit.
C'est une habitude à prendre.
Et des gens comme vous qui connaissez à fond le jeu avez savent quel script ouvrir pour comprendre comment faire tel ou tel chose.
Faut tenter, et assimiler les bases.
A +

Soifran

(faut que j'aille dépouiller les bulletins ;)
Link to comment
Share on other sites

Merci beaucoup Soifran, excellent tutorial (j'ai tout compris =)) ).

Mon cas est un peu différent, alors il faut que j'extrapole un peu plus. En effet je rappelle ici que je veux que le joueur ait, d'entrée de jeu, un malus de -50 en troc (Et -20 en steal, mais bon si j'arrive à le faire pour le troc le steal ça devrait aller).
Je suppose qu'au lieu d'avoir :

critter_mod_skill(dude_obj,SKILL_MELEE,10);

Je devrai plutôt écrire :

critter_mod_skill(dude_obj,SKILL_BARTER,-70);

(Oui, -70 ou -80 car un personnage créé d'entrée de jeu n'a pas 0 en barter mais 20 ou 30 en moyenne. Il faudra que je teste.) Bon ça c'était la partie facile. Maintenant si je veux que directement en entrant dans le jeu le script s'exécute, que dois-je écrire dans un nouveau script ?
J'ai pensé à exécuter ce script sur la map d'Arroyo (Avant le temple des épreuves, premier écran du jeu).

procedure map_enterbegin  if local_var(LVAR_Taught_Player) == 0)  critter_mod_skill(dude_obj,SKILL_BARTER,-70);.  critter_mod_skill(dude_obj,SKILL_STEAL,-40);  set_local_var(LVAR_Taught_Player,1);end
Bon, je suis nul en script hein. Donc j'ai juste déduit. La procédure map_enter_p_proc existe mais j'ai mis simplement map_enter. C'est peut-être une erreur ? Après pour la variable je pense qu'on s'en fout de comment on l'appelle, donc j'ai repris le Taught Player.

Bon après j'ai une autre erreur, mais je pense que c'est dû à mon installation batarde de Fallout 2 (J'ai besoin d'un crack et tout, car je ne récupère mon CD originel que Lundi). Quand j'appuie sur "Open file from DAT" j'ai I/O Error 103. Mouerf, on verra si quand j'aurai réinstallé le jeu ça le fera toujours.
Peux-tu corriger mon embryon de script ? Car je doute qu'il soit bon =D

Merci pour le tuto !
Link to comment
Share on other sites

oui c'est des fautes de syntaxe;
Chacune de tes phrases doit se finir par ;
et pas de . bizarre.

essaye plutôt

procedure map_enter
begin
if local_var(LVAR_Taught_Player) == 0);
then begin critter_mod_skill(dude_obj,SKILL_BARTER,-70);
critter_mod_skill(dude_obj,SKILL_STEAL,-40);
set_local_var(LVAR_Taught_Player,1);
end
end

la c'est du language pur.
si tu fais 2 action aprés in if, il faut integrer un then begin, et toujours le finir par un end (d'ou parfois plusieurs end).
S'il n'y a qu'un action, un then seul suffit en général.

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...