conversation

Répondre
Partager Rechercher
Je voudrais savoir si lors d'une fin de conversation avec plusieurs choix (A,B,C par exemple) lorsqu'on termine avec disons le choix B est-ce que lorsque le PJ revient parler au PNJ ce dernier peut lui tenir une nouvelle conversation qui corresponde à son choix B (et donc qui serait différente de celle des choix A et C) ?

Si je ne suis pas très clair dite le moi
On peut le faire par le journal de quête ou par une variable locale, la première méthode est à privilégier si l'on veut donner une trace au joueur.

Exemple PNJ : Oh mon Dieu mon épée est tombé dans les égouts, peux tu me la chercher?

Choix du PJ :
A) Oui bien sûr.
B) Pas le temps, je vais chercher une pizza. Je peux t'en ramener une si tu veux.
C) Vas y toi même.

Méthode du journal, créer une catégorie "Un épée dans les égouts", tag quete_pnj. Créer les entrée 10 Vous avez accepté ... 20 Vous avez proposé une pizza à la place", 30 Vous avez refusé..", 40 Tout content de revoir son épée..", 50 La pizza était si bonne que .. en a oublié son épée."
Les entrées 30 à 50 ferment la quête.

Ensuite conditionner la demande (pour que le PNJ ne redemande pas en boucle):
"Oh mon Dieu..." .....................gc_journal "quete_pnj" <10
Positionner le journal selon les choix du joueur avec ga_journal ou plus simplement en affectant la propriété Quête de l'onglet Noeud.
A -> 10, B-> 20, C->30
Le PNJ peut alors avoir différentes réponses quand le PJ revient :
Des nouvelles de mon épée? ... gc_journal quete_pnj 10
Et alors cette pizza? ................ gc_journal quete_pnj 20
Je ne vous parle plus ................ gc_journal quete_pnj 30

Avec la variable locale c'est le même principe, seule différence cela ne figure pas dans le journal de quête.
Créer une variable locale "Choix" type int attachée au PNJ, initialisée à 0 avec par convention :
0 demande pas encore faite,
1 choix A
2 choix B
3 choix C

il suffit de tester par gc_local_int tag_pnj "Choix" (à la place de gc_journal)
et d'affecter par ga_local_int tag_pnj "Choix" valeur (à la place de ga_journal ou de la propriété Quête).
Pour ce qui est du journal, je sais le faire et justement je ne veux pas que ça apparaisse dedans. C'est juste un dialogue "basique".

Tu peux développer un peu sur la façon d'utiliser la variable s'il te plait ?
C'est le même principe, mais caché au joueur.

Pour attacher une variable à un PNJ, cliques dans la propriété Variable. Une fenêtre apparaît, cliques sur Add. Donnes un nom par exemple "decision", définis le type en integer et initialises la à 0.

Elle peut être testée ensuite par le script standard gc_local_int et modifiée par le script standard ga_local_int.

En reprenant l'exemple précédent :
Ligne conversation ..............Action.........Condition
Oh mon Dieu........................................... gc_local_int "decision" "<1" "tag_pnj"
A) Oui bien sûr. ................... ga_local_int "decision", "1" "tag_pnj"
B) Pizza................................ ga_local_int "decision", "2" "tag_pnj"
C) Vas y toi.......................... ga_local_int "decision", "3" "tag_pnj"

Et quand le PJ revient :
Des nouvelles de l'épée?........................ gc_local_int "decision" "1" "tag_pnj"
Et cette pizza?........................................ gc_local_int "decision" "2" "tag_pnj"
Je ne vous parle plus.............................. gc_local_int "decision" "3" "tag_pnj"
Double post pour dire que ça fonctionne à merveille et pour poser d'autres questions sur les conversations:

- comment puis je faire pour que le PJ suive un PNJ ???
- y a t il moyen de scénariser un combat via une conv (d'abord une flèche acide, ensuite un éclair etc par exemple) ?

Merci d'avance
Post
Citation :
- comment puis je faire pour que le PJ suive un PNJ ???
Méthode brutale : PNJ : "suis moi", suivi d'une téléportation
Méthode sophistiquée (que je n'ai pas encore mise en œuvre mais compte essayer pour ma nouvelle campagne) :

- prévoir une série de waypoint pour le PNJ avec le même tag "WP_pnj", mais attention les positionner dans l'ordre du parcours.
- positionner un script dans le onHeartbeat du PNJ (récurrent)
- attacher quatre variables IsWaiting (à 1), IsMoving (à 0), EndMove (à 0) et WaypointNo (à 0)

Dans le script (juste une description, pas du code réel):

Si EndMove est à 1 : sortie, on est arrivé.

Si PNJ attend (IsWaiting à 1) et que le PJ est à moins de deux mètres (GetDistanceBetween) :
alors si WaypointNO > Waypoint Max alors Endmove à 1, les 2 sont arrivés
Sinon donner l'ordre au PNJ d'aller au point suivant ActionMoveToObject(GetObjetByTag("WP_pnj", WaypointNo), mettre IsMoving à 1 et isWaiting à 0.

S'il attend et que PJ est loin ne rien faire, il continue à attendre.

Si le PNJ est en mouvement (IsMoving à 1) tester s'il est près du Waypoint suivant par GetDistanceToObject.
Si est est suffisamment près, mettre isWaiting à 1, IsMoving à 0 et incrémenter WaypointNo de 1, sinon ne rien faire (il continue le mouvement).

Citation :
y a t il moyen de scénariser un combat via une conv (d'abord une flèche acide, ensuite un éclair etc par exemple) ?
Oui, prévoir un script avec un paramètre qui donne l'action à faire, le script est appelé depuis les lignes de conversations correspondantes.

voilà un exemple tiré d'un célèbre campagne :

étape 10, le PNJ tire son arme.
étape 20, le PNJ attaque sa victime.

Le script 1 réalise les 2 étapes et met la conversation en pause (les tags sont caviardés pour ne pas spoiler la campagne). Le script est appelé depuis les 2 lignes de conversations correspondantes.

Code PHP:

 void main(int nParam)
{
    
object oS GetObjectByTag("ss");
    switch (
nParam)
    {
        case 
10 :                                // draw weapon
        
{
            
ActionDoCommand(ActionEquipMostDamagingMelee());
            break;
        }
        case 
20 :                                // attack cc
        
{
            
AssignCommand(GetFirstPC(), ActionPauseConversation());
            
ChangeToStandardFaction(oSSTANDARD_FACTION_HOSTILE);
            
AssignCommand(oSActionAttack(GetObjectByTag("cc")));
            break;
        }
    }

Le script 2 met fin aux jours de la victime et redémarre la conversation (dans le OnDamage de la victime)

Code PHP:

void main()
{
    
    
effect eDeath EffectDeath(TRUE);
    
ApplyEffectToObject(DURATION_TYPE_INSTANTeDeathOBJECT_SELF);
    
object oS GetObjectByTag("ss");
    
AssignCommand(oSClearAllActions(TRUE));
    
ChangeToStandardFaction(oSSTANDARD_FACTION_DEFENDER);
    
AssignCommand(GetFirstPC(), ActionResumeConversation());

Ce qui permet d'être sûr que si le PNJ rate sa première frappe, la conversation attend bien le coup fatal pour repartir.
Pour le PJ suivant le PNJ, je voudrais que ce soit à la fin d'une conversation pour clore un acte. Ce que tu me conseilles est hors conversation non ?

Pour ce qui est du combat, c'est exactement ça, mais je risque d'avoir besoin d'aide pour le script vu mes compétences en la matière . Je vais quand même faire des tests pour voir comment je m'en sors . Ah oui, petite question, ça initie le combat ou faut-il que je scripte comme cela tout le combat ?
PJ suivant PNJ : Tu initialises la variable EndMove à 1, dans ce cas il se passera rien jusqu'à la fin de la conversation où tu la passes à 1, ainsi que IsWaiting.

Dès que le script récurrent sera appelé de nouveau, comme le PJ sera proche, ça déclenchera le mouvement du PNJ vers le premier waypoint (numéro 0).

Combat : Oui dans l'exemple, ça initie le combat puisque le PNJ passe en faction hostile dans l'évènement 20 (ChangeStandardFaction)
J'ai de nouveau une petite question liée aux conversations. Je souhaite qu'à la fin d'une conversation, le pnj attaque le pj mais sans que ça faction ne passe à hostile, comment puis je faire pour que ça faction change pour une que j'ai créé ? Je n'ai rien trouvé dans les scripts fournis.
Eh bien, en fait, le combat démarre à la fin de la conversation et s'arrête à la mort du (ou des) pnj(s) en question.

Mon souci majeur, c'est que juste à côté j'ai un "futur" compagnon et je ne peux donc pas modifier sa faction pour éviter qu'il attaque. De plus, si je fait conserver sa faction au pnj qui attaque et bien il ne frappe qu'une seule fois, ensuite il se fait tabasser sans réagir.
Dans ce cas, un des scripts de Claudius33 devrait te permettre de faire ce que tu veux. La petite différence, c'est qu'il faudra utiliser autre chose que "ActionAttack(...)", car cette fonction ne permet pas au PNJ d'engager un combat complet. Il faudra rajouter une bibliothèque de fonctions qui te permettra d'utiliser "DetermineCombatRounds(...)".

Si le PNJ est sensé mourir à la fin du combat, ou encore que ça se termine sur un "Game over" pour le joueur, mieux vaut faire passer le PNJ dans la faction "Hostile". C'est ce qui est le plus simple et le plus adapté à ce que tu veux.

Pour l'instant, je te propose qu'on avance pas à pas, le strict nécessaire ressemblant déjà à ça :
Code PHP:

#include "nw_i0_generic"

void main()
{
    
ChangeToStandardFaction(OBJECT_SELF,STANDARD_FACTION_HOSTILE);
    
DetermineCombatRound(GetFirstPC());

Une autre question : Est-ce que d'autres PNJs sont impliqués dans ce combat ? Si c'est le cas, sont-ils déjà présents ou dois-tu les faire apparaître ?
En fait je suis bloqué par mon futur compagnon, le combat se déroule entre un pnj présent sur la zone et le groupe du pj sans que les autres personnes n'interfèrent, ce qui exclu le passage en "hostile".
Si je n'avais pas ce futur compagnon, j'aurais juste changé la faction des badauds autour et le tour était joué.

J'avais essayé de faire baisser temporairement la réputation du PJ vis à vis du pnj (ga_faction_rep) mais ça ne s'applique qu'aux factions de base me semble-t-il ou alors je n'ai pas su l'utiliser.
Dans ce cas essaye comme ça :
Code PHP:

#include "nw_i0_generic"

void main()
{
    
object oPC GetFirstPC();

    
SetIsTemporaryEnemy(oPC);
    
DetermineCombatRound(oPC);

Si tu es en mode campagne, il faudra que tu mettes le paramètre "UsesPersonnalReputations" de ta campagne à "True".
En gros, oui.

L'idéal pour laisser le temps au joueur de se préparer mentalement au fait qu'il va subir un combat, c'est de rajouter un noeud de discussion pour le joueur, qui va clore la conversation.

Un noeud de type "Fin du dialogue", auquel tu attribueras le script dans la partie Action.
Je viens de tester, ça marche un peu trop bien semble-t-il, en effet le pnj commence à m'attaquer dans l'indifférence générale (il incante un sort) ce qui m'arrange, mais lorsque je lui porte un coup tous les autre pnj m'attaquent !!!
Est-ce que ça peut venir du fait qu'il cherche à lancer un sort et que donc je l'agresse avant qu'il ne m'attaque ?
Non, ça viendrait plutôt du fait que sa réputation personnelle l'amène à être hostile envers toi, mais il est toujours amical envers les membres de sa propre faction.

Donc quand il t'attaque, les autres s'en moquent vu que tu es probablement neutre avec cette faction. Mais si tu réponds, ils défendent leur ami.

L'idéal serait donc de faire une faction neutre avec tout le monde pour ce genre d'occasions, et de l'y inclure. Le script ne devrait pas avoir à être modifié en conséquence.
Je corrige ma pensée : L'idéal serait de créer une faction envers laquelle tout le monde est neutre. (peu importe si la faction en question est neutre ou amicale envers les autres factions).
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés