Faire danser un PC avec un NPC, les bras dans les bras

Répondre
Partager Rechercher
Bonjour à tout le monde !

Je pose donc ma problématique.
Quelqu'un a t-il une idée de comment, après un dialogue, faire danser, bras dans les bras un PC avec un NPC ?

J'aimerais agrémenter une soirée mondaine chez les "de Rorichards" par quelques pas de deux.

Merci de votre aide !

Je chercherais aussi de mon coté.
Je pense que cela doit être faisable, en bidouillant un peu . Mais personnellement, je pense surtout que cela doit être assez chaud à scripter.
Car il faut bien synchroniser les deux npc en même temps.
Mais c'est faisable
Peut-être en utilisant un peu le principe de la mule.
Chaque fois que le PC bouge, le NPC se remet en face de manière élégante ?
En mettant au sol un déclencheur qui interompt la liaison entre le NPC et le PC, lorsque le personnage sort de la zone.
heu, il faut qu'il y ai des animations où les personnages tendent les bras non ?
je ne vois pas d'animation qui pourrait ressembler à une dance...
On peut utiliser certain stéréotype d'action comme le salut, le rire arrière ou les autres naimation qui donnerais un semblant de quelque chose.

A un moment, il avait éé réfléchis sur ce forum (il y a presqu'un an) sur la simulation de l'acte amoureux. Je n'ai pas suivis à l'époque et quand je susi revenu sur NWN je n'en ai plus trouvé de trace, et je ne sais pas ce que c'est devenu. Mais il faudrait que je retrouve cela aussi.
Talking
Suffit de demander
En fait, ça fait un moment que je me disais que je devais faire un truc du genre. Et là, ça m'y a fait repenser alors, je m'y suis mis. Voilà le résultat. C'est presque du Béjart !

A vous de me dire si ça convient.
La musique est comprise dans la prestation ( ), sauf pour le retour à la normale qu'il faut faire ailleurs que dans ce script sinon, elle est remise dans l'état avant que la danse ne soit finie. Même avant qu'elle ne commence d'ailleurs. On ne peut pas tout avoir, hein


Utilisation:
A mettre dans le dialogue du PNJ qu'on veut faire danser dans "Ficher Actuel" (et dans les deux petites fenêtres) le script ici présent de façon qu'à la fin du dialogue la danse s'enchaîne de toute manière. (ou de la façon dont vous voulez)

Code PHP:


//::///////////////////////////////////////////////
//:: FileName az_danse
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Created By: Azmathiel
//:: Created On: 02/09/2003 16:46:18
//:://////////////////////////////////////////////
void main()
{
    
// Danse a deux
    // Pb: le PC va bouger plus vite que le NPC dans des danses tournantes
    // a cause de la vitesse angulaire.
    // coder un pseudo menuet est plus simple que de coder une valse
    // ..............................................................
    // On va coder une danse pas classique du tout alors. Juste pour voir

    
object oPC GetPCSpeaker();
    
object oNPC OBJECT_SELF;
    
object oArea GetArea(oPC);

    
int iSaluer ANIMATION_FIREFORGET_SALUTE;
    
int iCourber ANIMATION_FIREFORGET_BOW;
    
int iTourneTG ANIMATION_FIREFORGET_HEAD_TURN_LEFT;
    
int iTourneTD ANIMATION_FIREFORGET_HEAD_TURN_RIGHT;
    
int iLeverBras1 ANIMATION_LOOPING_CONJURE1;
    
int iLeverBras2 ANIMATION_LOOPING_CONJURE2;
    
int iPencher ANIMATION_LOOPING_GET_MID;
    
int iJerk ANIMATION_FIREFORGET_DODGE_SIDE;

    
int iMusic TRACK_BATTLE_ARIBETH;


    
int iPas;

    
float fSpeedN 1.0;
    
float fSpeedF 2.0;
    
float fSpeedS 0.5;

    
SetLocalInt(oPC"danse"TRUE);

    
int iOldMusicD MusicBackgroundGetDayTrack(oArea);
    
int iOldMusicN MusicBackgroundGetNightTrack(oArea);

    
MusicBackgroundStop(oArea);
    
MusicBackgroundChangeDay(oAreaiMusic);
    
MusicBackgroundChangeNight(oAreaiMusic);
    
MusicBackgroundSetDelay(oArea0);
    
MusicBackgroundPlay(oArea);

    while (
GetLocalInt(oPC"danse") == TRUE)
    {
        
iPas++;
        
ActionDoCommand(AssignCommand(oNPCActionPlayAnimation(iSaluerfSpeedS3.0)));
        
ActionDoCommand(AssignCommand(oPCActionPlayAnimation(iSaluerfSpeedS3.0)));

        
ActionDoCommand(AssignCommand(oNPCActionPlayAnimation(iCourberfSpeedS3.0)));
        
ActionDoCommand(AssignCommand(oPCActionPlayAnimation(iCourberfSpeedS3.0)));


        
// A faire plus tard avec un recalcul de positions deportees
        // de l'un par rapport a l'autre
        //ActionDoCommand(AssignCommand(oNPC,ActionMoveToLocation(GetLocation(oPC), FALSE)));
        //ActionDoCommand(AssignCommand(oPC,ActionMoveToLocation(GetLocation(oNPC), FALSE)));

        
ActionDoCommand(AssignCommand(oNPCActionPlayAnimation(iLeverBras1fSpeedN3.0)));
        
ActionDoCommand(AssignCommand(oPCActionPlayAnimation(iLeverBras1fSpeedN3.0)));

        
ActionDoCommand(AssignCommand(oNPCActionPlayAnimation(iLeverBras2fSpeedN3.0)));
        
ActionDoCommand(AssignCommand(oPCActionPlayAnimation(iLeverBras2fSpeedN3.0)));

        
ActionDoCommand(AssignCommand(oNPCActionPlayAnimation(iLeverBras1fSpeedN3.0)));
        
ActionDoCommand(AssignCommand(oPCActionPlayAnimation(iLeverBras1fSpeedN3.0)));

        
ActionDoCommand(AssignCommand(oNPCActionPlayAnimation(iTourneTDfSpeedN1.0)));
        
ActionDoCommand(AssignCommand(oPCActionPlayAnimation(iTourneTDfSpeedN1.0)));

        
ActionDoCommand(AssignCommand(oNPCActionPlayAnimation(iTourneTGfSpeedN1.0)));
        
ActionDoCommand(AssignCommand(oPCActionPlayAnimation(iTourneTGfSpeedN1.0)));

        
//ActionDoCommand(AssignCommand(oNPC, ActionPlayAnimation(iPencher, fSpeedN, 3.0)));
        //ActionDoCommand(AssignCommand(oPC, ActionPlayAnimation(iPencher, fSpeedN, 3.0)));
// ça gâche, je trouve

        
ActionDoCommand(AssignCommand(oNPCActionPlayAnimation(iJerkfSpeedN2.0)));
        
ActionDoCommand(AssignCommand(oPCActionPlayAnimation(iJerkfSpeedN2.0)));

        
ActionDoCommand(AssignCommand(oNPCSetFacing(GetFacing(oPC)+180.0)));


        if (
iPas 10SetLocalInt(oPC"danse"FALSE);
    }
    
ActionDoCommand(AssignCommand(oNPCActionPlayAnimation(iSaluerfSpeedS3.0)));
    
ActionDoCommand(AssignCommand(oPCActionPlayAnimation(iSaluerfSpeedS3.0)));

    
ActionDoCommand(AssignCommand(oNPCActionPlayAnimation(iCourberfSpeedS3.0)));
    
ActionDoCommand(AssignCommand(oPCActionPlayAnimation(iCourberfSpeedS3.0)));
    
// ATTENTION, si on remet la musique en l'etat ici, 
    //on ne remarquera meme pas qu'elle a change
    // A faire ailleurs donc.
    //Mais elle est conservée dans les variables iOldMusicD et iOldMusicN.

// END MAIN 
En jouant sur les fSpeed et les durées, vous pouvez varier la danse à votre gré.
Enjoy
Une dernière version plus optimisée, plus synchronisée et plus esthétique, je trouve. Enfin, moi, elle me convient telle quelle. Si un jour, je trouvais le temps, peut-être me pencherais-je sur les déplacements, mais ça m'a l'air quasi impossible à faire car les "SetFacing" se font instantanément malgré les "ActionDoCommand" contrairement à ce qu'on pourrait supposer (du moins, c'est ce que j'ai constaté pour ma part).
Il subsiste un tout petit problème... La charmante danseuse PNJ perd la tête à la fin de la danse. Elle continue à la tourner sans cesse... rien n'y fait. Si quelqu'un a une idée moins barbare que la mienne qui consiste à lui reparler pour la calmer... (Dans ce cas, prévoir un autre dialogue se déclenchant après la danse).

Voici la version finale de la "Barbarian Az-Dance"

Code PHP:


//::///////////////////////////////////////////////
//:: FileName az_danse
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Created By: Azmathiel
//:: Created On: 02/09/2003 16:46:18
//:: rev. 2 & final   
//:: Created On: 02/09/2003 23:52:18
//:://////////////////////////////////////////////
void main()
{
    
// Danse a deux
    // Pb: le PC va bouger plus vite que le NPC dans des danses tournantes
    // a cause de la vitesse angulaire.
    // coder un pseudo menuet est plus simple que de coder une valse
    // ..............................................................
    // On va coder une danse pas classique du tout alors. Juste pour voir

    
object oPC GetPCSpeaker();
    
object oNPC OBJECT_SELF;
    
object oArea GetArea(oPC);

    
int iSaluer ANIMATION_FIREFORGET_SALUTE;
    
int iCourber ANIMATION_FIREFORGET_BOW;
    
int iTourneTG ANIMATION_FIREFORGET_HEAD_TURN_LEFT;
    
int iTourneTD ANIMATION_FIREFORGET_HEAD_TURN_RIGHT;
    
int iLeverBras1 ANIMATION_LOOPING_CONJURE1;
    
int iLeverBras2 ANIMATION_LOOPING_CONJURE2;
    
int iPencher ANIMATION_LOOPING_GET_MID;
    
int iJerk ANIMATION_FIREFORGET_DODGE_DUCK;
    
int i2Bras =ANIMATION_FIREFORGET_VICTORY1;
    
int iBrasD ANIMATION_FIREFORGET_VICTORY2;
    
int iBras2 ANIMATION_FIREFORGET_VICTORY3;

    
int iMusic TRACK_BATTLE_ARIBETH;


    
int iPas;
    
int iMaxDuree 2// regler ici le nombre de boucles a faire faire aux danseurs

    
float fSpeedN 1.0;
    
float fSpeedF 2.0;
    
float fSpeedS 0.5;

    
SetLocalInt(oPC"danse"TRUE);

    
int iOldMusicD MusicBackgroundGetDayTrack(oArea);
    
int iOldMusicN MusicBackgroundGetNightTrack(oArea);

    
MusicBackgroundStop(oArea);
    
MusicBackgroundChangeDay(oAreaiMusic);
    
MusicBackgroundChangeNight(oAreaiMusic);
    
MusicBackgroundSetDelay(oArea0);
    
MusicBackgroundPlay(oArea);

    
ActionDoCommand(AssignCommand(oPCSetFacing(GetFacing(oNPC)+180.0)));

    
ActionDoCommand(AssignCommand(oNPCActionPlayAnimation(iCourberfSpeedS0.0)));
    
ActionDoCommand(AssignCommand(oPCActionPlayAnimation(iCourberfSpeedS0.0)));

    
ActionDoCommand(AssignCommand(oNPCActionWait1.0)));
    
ActionDoCommand(AssignCommand(oPC,ActionMoveToLocation(GetLocation(oNPC), FALSE)));


    while (
GetLocalInt(oPC"danse") == TRUE)
    {
        
iPas++;
        
ActionDoCommand(AssignCommand(oNPCActionPlayAnimation(iSaluerfSpeedS0.0)));
        
ActionDoCommand(AssignCommand(oPCActionPlayAnimation(iSaluerfSpeedS0.0)));

        
ActionDoCommand(AssignCommand(oNPCActionWait1.0)));
        
ActionDoCommand(AssignCommand(oPCActionWait1.0)));



        
// A faire plus tard avec un recalcul de positions deportees
        // de l'un par rapport a l'autre
        //ActionDoCommand(AssignCommand(oNPC,ActionMoveToLocation(GetLocation(oPC), FALSE)));
        //ActionDoCommand(AssignCommand(oPC,ActionMoveToLocation(GetLocation(oNPC), FALSE)));

        
ActionDoCommand(AssignCommand(oNPCActionPlayAnimation(iLeverBras1fSpeedN3.0)));
        
ActionDoCommand(AssignCommand(oPCActionPlayAnimation(iLeverBras1fSpeedN3.0)));

        
ActionDoCommand(AssignCommand(oNPCActionPlayAnimation(iLeverBras2fSpeedN3.0)));
        
ActionDoCommand(AssignCommand(oPCActionPlayAnimation(iLeverBras2fSpeedN3.0)));

        
ActionDoCommand(AssignCommand(oNPCActionPlayAnimation(iLeverBras1fSpeedN3.0)));
        
ActionDoCommand(AssignCommand(oPCActionPlayAnimation(iLeverBras1fSpeedN3.0)));

        
ActionDoCommand(AssignCommand(oNPCActionPlayAnimation(iTourneTDfSpeedN1.0)));
        
ActionDoCommand(AssignCommand(oPCActionPlayAnimation(iTourneTDfSpeedN1.0)));

        
ActionDoCommand(AssignCommand(oNPCActionWait1.0)));
        
ActionDoCommand(AssignCommand(oPCActionWait1.0)));

        
ActionDoCommand(AssignCommand(oNPCActionPlayAnimation(iTourneTGfSpeedN1.0)));
        
ActionDoCommand(AssignCommand(oPCActionPlayAnimation(iTourneTGfSpeedN1.0)));

        
ActionDoCommand(AssignCommand(oNPCActionWait1.0)));
        
ActionDoCommand(AssignCommand(oPCActionWait1.0)));

        
ActionDoCommand(AssignCommand(oNPCActionPlayAnimation(iLeverBras1fSpeedN3.0)));
        
ActionDoCommand(AssignCommand(oPCActionPlayAnimation(iLeverBras1fSpeedN3.0)));

        
ActionDoCommand(AssignCommand(oNPCActionPlayAnimation(i2BrasfSpeedN3.0)));
        
ActionDoCommand(AssignCommand(oPCActionPlayAnimation(i2BrasfSpeedN3.0)));

        
ActionDoCommand(AssignCommand(oNPCActionPlayAnimation(iLeverBras1fSpeedN3.0)));
        
ActionDoCommand(AssignCommand(oPCActionPlayAnimation(iLeverBras1fSpeedN3.0)));

        
ActionDoCommand(AssignCommand(oNPCActionPlayAnimation(iBrasDfSpeedN3.0)));
        
ActionDoCommand(AssignCommand(oPCActionPlayAnimation(iBrasDfSpeedN3.0)));

        if (
iPas iMaxDureeSetLocalInt(oPC"danse"FALSE);
    }
    
ActionDoCommand(AssignCommand(oNPCActionPlayAnimation(iSaluerfSpeedS0.0)));
    
ActionDoCommand(AssignCommand(oPCActionPlayAnimation(iSaluerfSpeedS0.0)));

    
ActionDoCommand(AssignCommand(oNPCActionPlayAnimation(iCourberfSpeedS0.0)));
    
ActionDoCommand(AssignCommand(oPCActionPlayAnimation(iCourberfSpeedS0.0)));
   
    
// ATTENTION, si on remet la musique en l'etat ici, on ne remarquera meme pas qu'elle a change
    // A faire ailleurs donc.

// END MAIN 
Jolie Azmathiel. Bravo

Une petite danse avec moi pour fêter ton zolie script ??

Bon je sors ok


Edit : ANIMATION_LOOPING_CONJURE1; et 2 , c'est que dans la version 1.30 ça non ?
Merci merci Damonya !

C'est fort possible ce que tu dis parce que je ne trouve pas ces constantes dans le Lexicon. Par contre, dans l'éditeur, elles existent. Et comme vous l'aurez deviné, il s'agit des animations que font les lanceurs de sort au moment d'incanter. Je pense donc qu'elles sont existantes mais peut-être pas déclarées comme constantes.

A tout hasard voici leurs valeurs respectives:

ANIMATION_LOOPING_CONJURE1 = 18
ANIMATION_LOOPING_CONJURE2 = 19

Avec ça, ça devrait fonctionner si ça ne fonctionnait pas avant.
Bravo les gars !

Je n'ai même pas eu le temps de me pencher sur le sujet que déjà vous l'avez produit. Mais avec les enfants, mon amie avec qui je prend plaisir à parler et le kendo, il ne me reste que le jeudi et le samedi soir pour coder des scripts.

En tout cas merci à vous.

Répondre

Connectés sur ce fil

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