Cours de Scripts pour les Quiches. Leçon Cinq.

Introduction
Le but de cette série de leçons, est d'apprendre a se servir des scripts a n'importe qui.

Maintenant vous commencez a en connaître un rayon sur les scripts, je pense que tous ceux qui ont suivi mes leçons jusqu’ici et qui arrivent a les mettre en pratique ne sont plus des quiches en programmation
Il y a bien sur encore beaucoup de choses qui peuvent être dites, mais avec ce que vous avez appris jusqu'à présent vous êtes d’hors et déjà capables de faire de chouettes scripts.

Voici un exemple de script un peu plus compliqué. Il requiert un peu de travail et introduit de nouvelles commandes, mais je pense que le jeu en vaut la chandelle.

- Ouvrez le module de Test.
- Reprenez votre première « Area », on a assez travaillé avec ce garde.
- Virez moi ce chanteur.
- Mettez un « start point » a votre module.
- A l’autre bout de la zone, placez un npc, un « commoner » par exemple, en fait cela n’a que peu d’importance, on va changer pas mal de choses.
- Dans l’onglet « Basic » changez son nom en « Cible », son tag en « CIBLE », sa race en « Construct », son apparence en « Archery Target », son genre en « None » et son portrait en po_PLC_F01_ .
- Dans l’onglet « Advanced » cochez la case « Plot ».
- Allez dans l’éditeur de faction. Créez une nouvelle faction « Cible », dont la faction parente est « Hostile ». Mettez les Cible - Commoner et la Commoner - Cible a 50
- Changez la faction de notre cible en « Cible ».
- Dans l’onglet « Scripts », supprimez tous les scripts. Dans notre cas, nous ne voulons pas que notre cible se retourne contre son agresseur et l’attaque
- Mettez le script suivant dans le « OnDamaged ».


// Script de « OnDamaged » : tm_cible_dm
// Script de Cible.
// Produit un "thunk" lorsqu’elle est touchée //
void main()
{
    if (
GetWeaponRanged(GetLastWeaponUsed(GetLastAttacker())))
    {
    
SpeakString("**Thunk**");
    }
}

- Vous pouvez d’hors et déjà tester votre cible, mais ce n’est pas le plus intéressant.
- Placez un « Waypoint » a environ un carré de votre cible.
- Donnez lui le tag « CibleWp001 ».
- Placez un autre npc commoner près de votre Waypoint.
- Changez son tag en « Tireur ».
- Laissez le soin au programme de choisir son nom au hasard.
- Dans l’onglet « Feats » ajoutez lui « Weapon Proficiency (simple) ».
- Dans l’onglet « Inventory », choisissez lui des « Darts ».
- Click droit sur les fléchettes que vous venez de lui ajoutez, changez la « Stack Size » a 3.
- Cliquez sur Ok et équipez le npc avec.
- Sortez de l’inventaire en validant.
- Ouvrez l’onglet « Scripts ».
- Editez le script du « OnSpawn » et enlevez le commentaire devant le « OnHeartbeat ».
Il y a une autre ligne que nous allons décommenter, le :


SetSpawnInCondition (NW_FLAG_SET_WARNINGS);

- Ajoutez egalement une ligne au début :


SetLocalInt
(OBJECT_SELF"ETATCIBLE"1);

- Allez dans le « UserDefined » et ajoutez le script suivant.

// Script « OnUserDefined »

// tm_flechette_ud
// Jeu de flechette
// Appelé par le OnHeartBeat script.
//
// Le joueur de fléchettes lance les dards de son inventaire ( 3 au départ )
// Va jusqu'à la cible. Récupère ses dards, revient et recommence.
//
void main()
{
    
int nAppelePar GetUserDefinedEventNumber();
    
object oCible GetNearestObjectByTag("CIBLE");
    
int nCiblePrete GetLocalInt(OBJECT_SELF"ETATCIBLE");
//
    
switch(nAppelePar)
    {
     case 
1001:  // Appelé par OnHeartbeat
       //
       // nCiblePrete est a 1 si la cible est prête.
       //
       
if ((GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND)))
            && (
nCiblePrete == 1))
          {
             
// Si on a des dards dans la main droite et qu’on est prêt a les lancer, alors faisons le.
             
ClearAllActions();
             
ActionAttack(oCibleTRUE);
           }
       else
          {
             
// Sinon, soit nous n’avons plus de dards, soit nous sommes déjà en train d’aller les chercher.
if (nCiblePrete == 1)
              {
                
SetLocalInt(OBJECT_SELF"ETATCIBLE"2);
                
ActionMoveToObject(oCible);
                
ActionWait(0.5);
                
ActionPlayAnimation(ANIMATION_LOOPING_GET_MID1.01.0);
                
ActionWait(0.5);
                
ActionPlayAnimation(ANIMATION_LOOPING_GET_MID1.01.0);
                
ActionWait(0.5);
                
ActionPlayAnimation(ANIMATION_LOOPING_GET_MID1.01.0);
                
object oDestination=GetNearestObjectByTag("CIBLEWP001");
                
ActionMoveToObject(oDestination);
                
CreateItemOnObject("nw_wthdt001"OBJECT_SELF3);
                
ActionEquipMostDamagingRanged();
                
ActionDoCommand(SetLocalInt(OBJECT_SELF"ETATCIBLE"1));
              }
            }
       break;
    }


Voilà un script un petit peu plus compliqué…
Je ne vais pas le détailler, vous avez maintenant suffisamment d’expérience pour pouvoir comprendre par vous même, je vais quand même expliquer deux ou trois petites choses.

J’utilise la variable « ETATCIBLE » pour être sur que nous n’attaquons pas avant d’être prêt. Et que nous ne demandons pas plusieurs fois d’aller chercher les dards.

La commande ActionDoCommand est merveilleuse. Elle prend une commande et la place dans la file d’action. Normalement, dès que le script voir une commande SetLocalInt, il initialise la variable, dans ce cas, cela le force a attendre d’avoir fini tout ce qu’on lui a déjà demandé de faire.

La commande CreateItemOnObject est utilisée pour créer de nouvelles fléchettes. "nw_wthdt001" est le blueprint pour un dard, et le 3 est la taille du stack.

Voilà, je pense que vous pouvez comprendre le reste par vous même. Sinon, ne vous génez pas pour poser des questions…

Et… un petit exercice pour vous maintenant…

J’aimerai qu’un troisième npc annonce les scores

A vous de bosser un peu…

__________________
Amaranthe.
Thoerel, un monde semi-persistant pour Neverwinter Nights.