La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 23/11/2024 11:55:59


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Djezebel
Héros
Inscrit le: 29 Sep 2005
Messages: 252
Répondre en citant
Posté le : 16/07/2006 11:27:48 Sujet du message : [Résolu] Quête d'escorte (peaufinage)

Bonjour à tous,

Aujourd'hui, je vous proposer d'étudier une quête d'escorte.


Effet désiré :

Un mendiant vous demande aimablement de l'escorter jusqu'à chez lui sans qu'il se fasse tuer.


Voici ce que j'ai utilisé :

- Un PNJ ("NW_BEGGMALE")
- Deux waypoints ("wp_final1" et "wp_final")
- Un trigger autour du wp_final1
- Un autre trigger autour du wp_final



Sur le PNJ

Le dialogue (version simplifiée) :


Citation :

- Vous ne servez à rien ! j'aurais pu m'en sortir tout seul !
- Bravo ! Merci, vous m'avez sauvé la vie !
- Voulez-vous m'accompagner ?
-- Ok
Sur le Condition de "Vous ne servez à rien !" :

NWScript :

int StartingConditional()
{
int iVie = GetCurrentHitPoints(OBJECT_SELF);
int iMaxVie = GetMaxHitPoints(OBJECT_SELF);

if ((iVie <= (iMaxVie / 2)) && (GetLocalInt(OBJECT_SELF,"escorte") == 2))
//s'il arrive avec moins de 10% de ses vies
  {
    return TRUE;
  }
  else return FALSE;
}


Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Sur le Condition de "Bravo !" :

NWScript :
//Condition "Bravo!" par kiky.le.magnifique
int StartingConditional()
{
int iVie = GetCurrentHitPoints(OBJECT_SELF);
int iMaxVie = GetMaxHitPoints(OBJECT_SELF);

  if (GetLocalInt(OBJECT_SELF, "escorte") == 2)
  {
  return TRUE;
  }
  else return FALSE;
}

Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.



Sur le ActionConséquente de "Ok" :

NWScript :


void main()
{
object oWP = GetWaypointByTag("wp_final1");
ActionForceMoveToObject(oWP, FALSE, 10000.0, 10000.0);
SetLocalInt(OBJECT_SELF, "escorte", 1);

SetLocalString(OBJECT_SELF, "escorte", "wp_final1");
//On lie sur le PNJ le WP sur lequel il doit aller
SetLocalObject(oPJ, "GDC", OBJECT_SELF);

}

Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Dans le OnConversation du PNJ j'ai rajouté ceci :

NWScript :

if (GetLocalInt(OBJECT_SELF, "escorte") == 1)
    {
        SpeakString("Continuons je vous prie");
        string sWP = GetLocalString(OBJECT_SELF, "escorte");
        ActionForceMoveToObject(GetNearestObjectByTag(sWP), FALSE, 10000.0, 10000.0);
    }

else if
{
// Le texte de base du OnConversation de nwn
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.



Dans le OnPerception j'ai rajouté dans la partie "si c'est un ennemi qu'il perçoit" :


NWScript :Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.



Dans le OnCombatRoundEnd, il y a ceci :

NWScript :
#include "NW_I0_GENERIC"
void main()
{
    if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL))
    {
        location lSelf = GetLocalLocation(OBJECT_SELF, "disturb");
        ActionForceMoveToLocation(lSelf, FALSE);
        string sWP = GetLocalString(OBJECT_SELF, "escorte");
        DelayCommand(5.0, ActionForceMoveToObject(GetNearestObjectByTag(sWP), FALSE, 10000.0));
        DetermineSpecialBehavior();
    }
    else if(!GetSpawnInCondition(NW_FLAG_SET_WARNINGS))
    {
      DetermineCombatRound();
    }
    if(GetSpawnInCondition(NW_FLAG_END_COMBAT_ROUND_EVENT))
    {
        SignalEvent(OBJECT_SELF, EventUserDefined(1003));
    }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.




Enfin, sur le OnEnter du trigger qui se trouve autour du WP "wp_final1" :

NWScript :


void main()
{
object oNPC = GetEnteringObject();
object oWP = GetWaypointByTag("wp_final");

    if (oNPC == GetObjectByTag("NW_BEGGMALE"))
    {
        AssignCommand(oNPC, ClearAllActions());
        AssignCommand(oNPC, ActionForceMoveToObject(oWP, FALSE, 10000.0, 10000.0));
        SetLocalString(oNPC, "escorte", "wp_final");
    }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.



Enfin, dans le OnEnter du trigger autour du WP_final :

NWScript :

void main()
{
object oNPC = GetEnteringObject();
object oWP1 = GetWaypointByTag("wp_attack1");
object oWP2 = GetWaypointByTag("wp_attack2");

    if (oNPC == GetObjectByTag("NW_BEGGMALE"))
    {
      SetLocalInt(oNPC, "escorte", 2);
    }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.



Problèmes :

Plus aucun de très handicapant : une boucle est faite pour le texte pour qu'il ne le dise qu'une fois.


Merci par avance. Smile
Dernière édition par Djezebel le 17/07/2006 11:10:57; édité 4 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
kiky.le.magnifique
Homme très gay
Inscrit le: 19 Sep 2003
Messages: 907
Localisation: Camping de la nation martienne...
Répondre en citant
Posté le : 16/07/2006 14:26:28 Sujet du message : Re: [Problème] Quête d'escorte

J'ai pas bien compris à quoi sert le wp_final1, puisque arrivé là il repart vers le 2, pourquoi ne pas l' avoir envoyé vers le 2 directement???

Enfin peu importe, en ce qui concerne ta demande :
1- reset en cas d'attaque -> Le plus judicieux me semble de lui dire d'aller vers son WP dans son script OnCombatRoundEnd.
2- conversation 1 seule fois -> il te faudra utiliser les variables locales.
3- pas d'accord Razz A partir du moment où il est sain et sauf, le contrat est accomplit.
Par contre, si le PNJ arrive blessé, il pourrait considéré qu'il n'a pas été bien protégé Wink
Qu'est ce que t'en pense Very Happy


Par exemple :

NWScript :

void main()
{
object oWP = GetWaypointByTag("wp_final1");
object oPJ = GetPCSpeaker();

SetLocalInt(OBJECT_SELF, "versWP", 1);


SetLocalObject(oPJ, "GDC", OBJECT_SELF);


ActionForceMoveToObject(oWP, FALSE, 10000.0, 10000.0);
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


NWScript :
//OnEnter WP1
void main()
{
object oNPC = GetEnteringObject();
object oWP = GetWaypointByTag("wp_final2");

    if (oNPC == GetObjectByTag("NW_BEGGMALE")) //Tag du PNJ
    {
        SetLocalInt(oNPC, "versWP", 2);
        AssignCommand(oNPC, ClearAllActions());
        AssignCommand(oNPC, ActionForceMoveToObject(oWP, FALSE, 10000.0, 10000.0));
    }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


NWScript :
//OnEnter WP2
void main()
{
object oNPC = GetEnteringObject();

    if (oNPC == GetObjectByTag("NW_BEGGMALE")) //Tag du PNJ
    {
        object oPJ = GetLocalObject(oNPC, "GDC);
SetLocalInt(oNPC, "
versWP", 3);
        AssignCommand(oNPC, ActionStartConversation(oPJ));
    }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


N'oublions pas le cas des attaques, dans le OnCombatRoundEnd :
(j'ai repris le début du script d'origine d'un HenchMan)
NWScript :
//OnCombatRoundEnd
#include "X0_INC_HENAI"
#include "X2_inc_spellhook"
void main()
{
    if(GetSpawnInCondition(NW_FLAG_END_COMBAT_ROUND_EVENT))
    {
        SignalEvent(OBJECT_SELF, EventUserDefined(1003));
    }

    // Check if concentration is required to maintain this creature
    X2DoBreakConcentrationCheck();


object oWP1 = GetWaypointByTag("wp_final1");
object oWP2 = GetWaypointByTag("wp_final2");
int iWP = GetLocalInt(OBJECT_SELF, "versWP");

if (iWP == 1) {ActionForceMoveToObject(oWP1, FALSE, 10000.0, 10000.0);}
if (iWP == 2) {ActionForceMoveToObject(oWP2, FALSE, 10000.0, 10000.0);}
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.



Après, il nous faudra modifier ton dialogue pour prendre en compte la récompense :

Citation :

-PersNJ : Je saaiiigne! Je vais mourir! Z'êtes nuuul! Dégagez!
-PersNJ : Bravo! Vous m'avez sauvez!
-PersNJ : Voulez-vous m'accompagner ?
----Joueur : Ok
en Condition d'execution du "Je Saaiiigne!" :
NWScript :

//Condition "Je Saaiiigne!"
int StartingConditional()
{
int iVie = GetCurrentHitPoints(OBJECT_SELF);
int iMaxVie = GetMaxHitPoints(OBJECT_SELF);

  if ((iVie <= (iMaxVie/10))&& (SetLocalInt(oNPC, "versWP") == 3))
//s'il arrive avec moins de 10% de ses vies
  { return TRUE; }
  else return FALSE;
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


En condition du "Bravo" :
NWScript :

//Condition "Bravo!"
int StartingConditional()
{
int iVie = GetCurrentHitPoints(OBJECT_SELF);
int iMaxVie = GetMaxHitPoints(OBJECT_SELF);

  if (SetLocalInt(oNPC, "versWP") == 3)
  { return TRUE; }
  else return FALSE;
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Libre à toi de donner ce que tu veux en action conséquente du "Bravo!".

Bon, je ne sais pas si ça fonctionne, je n'ai pas testé, mais ça te donne au moins une bonne base Razz
_________________
http://perso.wanadoo.fr/kikitor | Deviant Art | www.VistaEntraide.com | CCLLSELFV! | D-lire_K | Viendez rêver au Pays des fées... | Ne taquinez pas l'admin!
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Djezebel
Héros
Inscrit le: 29 Sep 2005
Messages: 252
Répondre en citant
Posté le : 16/07/2006 14:42:43 Sujet du message :

Merci beaucoup, je vais tester tout ça !

Pour te réponse :

1 - J'ai édité mon post vu que j'ai continué à travailler dessus, donc c'est effectivement ce que j'ai fais. ^^ (il pose un WP quand il part au combat, et revient dessus quand il a terminé)

2 - Si j'utilise le onCOnversation une seule fois, est-ce qu'il ne me dira pas qu'une seule fois "continuons" au lieu de le répêter à chaque fois que le joueur clique sur lui ?

3 - Il faudrait qu'il détecte si le joueur a fais quelque chose ou que dalle. ^^ Mais merci pour ton idée, je vais tester ça (je n'avais pas encore bien travaillé la fin).

Et pourquoi mettre plusieurs WP et non pas un seul : l'endroit à escorter est en coude. Ce qui fait que si je ne mets qu'un seul WP, il avance "dans le mur" jusqu'à trouver son passage, voire s'arrête, donc autant le faire marcher comme un PJ : avec raison. Razz .

Smile

Merci encore, je teste ça. Smile


Edit 15 minutes plus tard : Ca marche très bien, je poste l'ajout dans le topic de base.
Merci encore !

Edit encore : Y aurait-il la possibilité que le PNJ donne aléatoirement une phrase dans le genre :

Lorsqu'il marche :
- Ah, ça fait du bien de se promener un peu.
- Je préfère aller droit au but : je n'aime pas parler.
- Je ne suis pas bavard pendant le voyage.
- C'est fini oui, je ne veux pas parler !


Lorsqu'une créature meurt :
- Crève ! pourriture !
(ce genre de choses)
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Montrer les messages depuis :
Page 1 sur 1 ¤


Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Sauter vers:
FAQ | Rechercher | Liste des Membres | Groupes d'utilisateurs | S'enregistrer | Profil | Se connecter pour vérifier ses messages privés | Connexion
Powered by phpBB 2.* [m] © 2001, 2002 phpBB Group
Theme rewritten in beautiful XHTML code by Baldurien.
Thème "La Bibliothèque de Neverwinter" crée par Kruger
Traduction par : phpBB-fr.com
Page generated in 190.402ms