TESCS2 : Types de script

De Wiwiki
Aller à la navigation Aller à la recherche


Les scripts sont des listes d'instructions, de commandes ou de fonctions permettant d'effectuer automatiquement certaines actions dans le jeu, de modifier les comportements (AI), d'ajouter ou suppimer des objets, les déplacer, modifier ou altérer les caractéristiques d'acteur, lancer des animations…

Le présent article vous permettra de distinguer les diverses catégories de script.

Au préalable, il convient de vous familiariser avec les notions d'objet et de référence :

Lisez également le début de cet article :


Les scripts et les References

Scripts sans Reference

Les scripts sans Reference sont des scripts qui ne sont pas rattachés à une référence d'objet de base ou ne sont pas exécutés sur une Reference. Ils doivent expliciter la référence appelante d'une fonction pour toutes les fonctions de Reference utilisées.

  • Les scripts de quête
  • Les scripts de résultat d'étape de quête (Quest stage)
Les fonctions de Reference de ces scripts doivent avoir la référence appelante en préfixe de la fonction :
    pnj1Ref.Pickidle

===Scripts avec Reference=== ou encore "scripts de référence" Les scripts avec Reference sont des scripts rattachés à un objet de base et exécutés sur une Reference à la fois de cet objet de base. Ils ne doivent expliciter la référence appelante d'une fonction que si vous voulez que cette fonction s'exécute sur une autre Reference.

  • Les scripts d'objets (rattachés à un ou plusieurs objets de base, donc exécutés sur toutes leurs References)
  • Les scripts de résultat de dialogue (executés sur toutes les Reference de PNJ qui satisfont aux conditions)
Si pnj1Ref et pnj2Ref sont deux références rattachées au même script
    Pickidle   ; est équivalent à pnj1Ref.Pickidle lorsque le script s'exécute sur la référence pnj1Ref
    Pickidle   ; est équivalent à pnj2Ref.Pickidle lorsque le script s'exécute sur la référence pnj2Ref
    Activate   ; le pnj en cours d'exécution entre en dialogue (topics)
Si dans ce même script, on veut exécuter une fonction sur une autre référence :
    MonCoffreRef.Activate    ; ouvre le coffre référencé

Scripts de résultat (Result scripts)

Les scripts de résultat sont des fragments de script exécutés lors de certains événements liés aux Quêtes.

Ces scripts ne possèdent pas de nom et sont saisis directement dans un petit cadre situé dans les onglets suivants de la fenêtre de quête :

  • L'onglet Quest Stages, à raison d'un script de résultat possible par ligne du tableau Quest Stage Item
  • Les onglets de dialogue : Topic, Conversation, Combat, Persuasion, Detection, Service et Misc, à raison d'un script de résultat possible par ligne du tableau Info.

Il y a deux types de scripts de résultats :

  • Les résultats de dialogue sont exécutés lorsqu'un NPC donne l'information associée. Ces scripts sont considérés comme des scripts de Reference, parce que les fonctions sont exécutées sur la référence (le personnage qui parle), comme référence appelante de la fonction par défaut. Pour exécuter cette fonction sur une autre référence que le NPC qui parle, il faut indiquer la référence appelante (exemple : MonCoffreRef.Activate).
  • Les résultats de stage de quête (étape) sont exécutés lorsqu'un stage est appelé par la fonction SetStage, et que les conditions de l'élément de stage correspondant sont réunies (Quest stage Item). Attention : Ces scripts ne sont pas associés à une référence et les fonctions de référence qu'ils comportent nécessitent de préciser systématiquement la référence appelante (exemple : pnj1Ref.Pickidle).

Les scripts de résultat possèdent certaines limitations par rapport aux scripts nommés :

  • Ces scripts ne sont pas nommés (ne commencent pas par Scriptname ou Scn …)
  • Pas de déclarations de variables.
  • Ces scripts ne peuvent pas comporter de blocs (Begin… end)
  • Les scripts de résultat de dialogue ne peuvent pas utiliser la référence implicite pour accéder les variables du script de l'acteur.

Autrement, les scripts de résultat peuvent utiliser les commandes et fonctions de script normalement.


Un petit diagramme pour vous aider à situer les scripts de résultats (voir également plus loin les scripts de quête) : http://img402.imageshack.us/img402/8904/tescs2diagrammescriptsduw4.th.jpg

Les scripts nommés

Les scripts nommés sont créées dans la fenêtre d'édition des scripts, accessible par le menu Gameplay/Edit scripts, ou par le bouton "" dans le formulaire d'édition d'un objet de base. Les scripts nommés commencent par la commande Scriptname ou Scn, suivie par le nom du script, et finissent par la commande End. Ils peuvent comporter toutes les fonctions ou commandes de script, créer et utiliser des variables locales, ou utiliser des variables globales. Les variables locales d'autres scripts sont utilisables, à condition de faire précéder ces variables de la référence de l'objet invoqué. Ceci est valable également pour les variables de script de quête. Pour être exécutés, les scripts nommés doivent être rattachés à des objets de base, des quêtes ou à un effet magique. Lorsqu'un nouvel objet scripté est placé dans le monde, une Reference est créée, et cette référence posséde son propre jeu de variables de script. Ainsi un seul script peut être utilisé pour tester l'état de multiples références d'objet de base.

Les scripts nommés sont de trois types :

  • Object scripts (scripts d'objets)
  • Quest scripts (scripts de quête)
  • Magic effect scripts (scripts d'effet magique)

Scripts d'objets

Les scripts d'objet sont des script nommés, attachés à un objet de base. Cependant ils s'exécutent toutes les références de cet objet de base, l'une après l'autre. Les fonctions de reference utilisées dans un script d'objet ont donc, par défaut, pour objet appelant la Reference sur laquelle le script s'exécute. Il est bien sûr possible de désigner une autre référence appelante en faisant précéder la fonction par l'identifiant de cette autre référence (exemple : pnj1Ref.Pickidle).

CITATION tirée de l'article Fonctions de script :
La référence appelante est naturellement requise lorsque l'on veut faire une action 
ou tester un objet (ou acteur) qui n'est PAS la référence du script... 
Si je veux tuer Lulu dans le script qui tourne sur Jojo, il faudra écrire Lulu.Kill, 
sinon avec Kill, c'est Jojo qui meurt.

Les types d'objets suivants peuvent être porteurs de script : Tous les types d'acteurs, les types d'Items, sauf les flèches (ammo), les potions, les activateurs, les containers, les portes (Doors), la flore, le mobilier (Furniture) et l'éclairage (Light).

Les scripts d'objet peuvent utiliser toutes les fonctions, sauf les commandes spéciales d'effet de magie.

Lors de la création d'un script d'objet, il faut sélectionner "Object Script" dans le champ déroulant en haut à gauche de la fenêtre de script. C'est l'option par défaut. Les scripts d'objets doivent être attachés aux objets de base concernés. Choisir l'objet dans la fenêtre Objects. Dans le formulaire d'édition de l'objet, sélectionner le script dans le champ déroulant Script.

Pour la périodicité d'éxécution, voir plus loin #Périodicité d'exécution des scripts.


Un petit diagramme pour vous aider à vous y retrouver (Objets, références, scripts et blocs Begin) : http://img466.imageshack.us/img466/2598/tescs2diagrammescriptsooe0.th.jpg

Scripts de quête

Lors de la création d'un script de quête, il faut sélectionner "Quest Script" dans le champ déroulant en haut à gauche de la fenêtre de script. Sinon, ce script ne pourra pas fonctionner avec une quête. Les scripts de quête doivent être attachés à la quête concernée. Choisir la quête dans la fenêtre Quests (Menu Character/Quests…),. Sélectionner le script dans le champ déroulant Script.

ATTENTION : Les scripts de quête sont associés à une quête pas à un objet de base. Les scripts de quête ne sont donc pas des scripts de Reference, donc toutes les fonctions de Reference du script devront être préfixées par la référence appelante (exemple : pnj1Ref.Pickidle).

Règles de fonctionnement :

  • Les scripts de quête tournent seulement lorsque la quête est démarrée (A la console faire SQV nom_de_quete pour voir les variables de la quête). Une quête démarre et d'arrête avec les commandes StartQuest and StopQuest. Notez bien que cette notion est indépendante de celle de quête terminée ou non. Terminer (Complete) une quête signifie que la quête passe dans la fenêtre des quêtes terminées dui journal, mais cette quête continue à tourner jusqu'à l'exécution de la commande StopQuest.
  • Une quête démarre automatiquement lorsqu'une entrée est écrite dans la journal du joueur, donc lors de l'exécution de la commande SetStage. Elle démarre également automatiquement au début du jeu, si la case "Start Game Enabled" est cochée dans la fenêtre du menu Character/Quests.
  • En général, il vaut mieux stopper la quête lorsqu'elle est terminée, pour arrêter son script. Si pour quelque raison, il reste à faire quelques dialogues post-quête, il est préférable de démarrer une nouvelle quête, par exemple stopper "MaQuete" et démarrer "MaQueteFin"
  • Les variables de quête peuvent être accédées et modifiées lorsque la quête est stoppée. Lorsque la quête est stoppée, son script est arrêté (les commandes) mais les variables demeurent intactes.

Pour la périodicité d'éxécution, voir plus loin #Périodicité d'exécution des scripts.

Un petit diagramme pour vous aider à vous y retrouver (quêtes, dialogues et scripts) : http://img402.imageshack.us/img402/8904/tescs2diagrammescriptsduw4.th.jpg

Scripts d'effet magique

Ce sont des scripts spéciaux utilisés pour créer des effets magiques scriptés. Ils sont crées en sélectionnant "Magic Effect Script" dans le champ déroulant en haut à gauche de la fenêtre de script. Notez également que les effets de script ne marchent que lorsque l'on est en Game Mode, pas en menu mode.

Ces scripts n'utilisent pas les blocks begin/end normaux, et ne s'exécutent que pendant que l'effet du sort est actif sur sa cible. Ils utilisent trois types de blos spéciaux, et une fonction spéciale.

Types de blocs pour script d'effet magique :

  • ScriptEffectStart
  • ScriptEffectFinish
  • ScriptEffectUpdate

Les autres types de bloc sont invalides (la compilation fonctionne, mais le code ne s'exécute).

Fonction d'effet magique :

Cependant, les scripts d'effet magique fonctionnent comme des scripts de Reference et peuvent utiliser toutes les fonctions normales de script dans les blocs d'effet magique.

Un petit diagramme pour vous aider à vous y retrouver : http://img87.imageshack.us/img87/7123/tescs2diagrammescriptsefn0.th.jpg

Mise en œuvre d'un script de magie

Un script d'effet magique est associé à l'effet magique prédéfini Script Effect" (Identifiant SEFF). Comme tous les effets magiques prédéfinis, Script Effect peut être ajouté comme composant des objets à caractère magique que sont les ingrédients, les pierres de Sigil, les enchantements, les potions et les sorts. Pour plus de renseignements sur ces objets, voir l'article Types d'objets.

  • Les formulaires d'édition de ces objets permettent d'ajouter en particulier l'effet Script Effect" à la liste des effets (faire clic-droit et new) de l'objet que vous voulez créer ou modifier.
  • Cela permet d'accéder à une fenêtre Effect Item, ou le cadre Script effect info est protégé. Dans le champ déroulant Effect, choisir Script Effect". Le cadre Script effect info est alors déverrouillé.
  • Vous pouvez alors choisir les paramètres de l'effet et créer, ou choisir; un script d'effet magique.

Notes :

  • Les sorts scriptés s'exécutent également sur les cadavres, conteneurs, portes et mobilier, mais simplement en une unique fois, sans considérer la durée du sort. Les trois blocs ScriptEffectStart, ScriptEffectUpdate, et ScriptEffectFinish s'exécutent successivement.
  • Les sorts scriptés se comportent de façon imprévisible lorsqu'ils sont exécutés sur un acteur situé en dehors de la cellule actuellement chargée. Certaines conséquences sont les suivantes :
    • les variables du script restent non renseignées ;
    • Le bloc ScriptEffectFinish ne se lance pas ;
    • Pour les abilities scriptées , une nouvelle exécution apparaît à chaque fois que le joueur entre dans la cellule de l'acteur affecté.

D'autres résultats bizarres peuvent être évités par l'ajout d'un article scripté dans l'inventaire de l'acteur.

Périodicité d'exécution des scripts

Quelle est la périodicité d'exécution des scripts ?

Scripts de quête :

Si la quête est démarrée, un script de quête est exécuté toutes les 5 secondes par défaut. Pour chaque script, il est possible de fixer une autre périodicité. Pour cela définir la variable float fQuestDelayTime dans le script. Renseigner ce paramètre à une petite valeur pour une exécution à chaque frame (génération d'image), par exemple Set fQuestDelayTime to 0.01. Le délai est en secondes. Utilisez cette possibilité avec parcimonie… Fixer cette valeur à 0 revient à la valeur par défaut, soit 5 secondes.

Scripts d'acteurs :

(Creatures and NPCs) Les scripts d'acteurs sont exécutés à chaque fois que l'AI de l'acteur est exécutée. On distingue l'exécution de haut et de bas niveau. En processus haut, c'est à dire dans la zone chargée autour de l'acteur, les scripts d'acteurs sont exécutés à chaque frame (génération d'image) . La zone chargée est de 1 cellule intérieure, ou bien 5x5 cellules extérieures, soit 2 cellules de distance autour de la cellule où se trouve le joueur (ce qui représente une distance minimale de 8192 unités d'Oblivion soit environ 120 mètres de distance au joueur) . Quand l'acteur n'est pas en processus de haut niveau, le délai d'exécution augmente jusquà 15 minutes de temps du jeu. Ce sont les seuls scripts avec les scripts de quête qui sont exécutés lorsque le joueur n'est pas dans les alentours de l'objet scripté.

Scripts sur les references situées dans le monde :

Les scripts des références, autres que celles des acteurs, sont exécutés à chaque frame lorsque leur cellule est chargée. Ces scripts ne s'exécutent donc que lorsque le joueur est dans les environs, jamais au dela de la zone de 5x5 cellules. Ces scripts sont appropriés pour exécuter des scripts lourds, comme par exemple tester des distances. Les types d'objets interessés sont les Items (articles sauf les flèches (ammo)) et les potions placés dans le monde, les activateurs, les containers, la flore, le mobilier (furniture), et les éclairages (lights). Les portes ont un fonctionnement particulier.

Scripts sur les objets dans les inventaires ou containers :

(Items et potions, sauf flèches (ammo)) Ils sont exécutés en même temps que le script de leur contenant est exécuté – donc, les articles dans les inventaires d'acteur comme les processus de haut et de bas niveau d'acteur, et les articles des autres containers à chaque frame lorsque la cellule est chargée (haut niveau seul).

Scripts de porte :

Cas spécial, ces scripts sont exécutés comme les autres scripts de références (à chaque frame lorsque la cellule est chargée), mais aussi à chaque fois qu'un acteur active la porte.

Scripts globaux

Dans les TESCS2, les scripts globaux sont les scripts de quête, objets particuliers qui permettent le démarrage et l'arrêt des scripts, qui sans être attachés à une référence, permettent l'accès aux variables de quête en préfixant celles-ci par le nom de la quête.

Cependant dans la mesure du possible, il est préférable d'éviter les scripts globaux qui tournent en permanence, quel que soit l'endroit ou se trouve le joueur. Si votre projet de script global n'affecte en réalité qu'une zone réduite du monde, il est préférable de placer un activateur associé à un script d'objet (les activateurs sont des objets au sens large). Puis placer une reference de cet activateur dans toutes les cellules ou cela est nécessaire (un scénario pour les auberges par exemple). Cela est d'autant plus souhaitable lorsqu'il vous est nécessaire d'accroitre la fréquence d'exécution, à chaque frame, par exemple, au lieu des 5 secondes par défaut.

Une utilité des scripts globaux serait une modification du monde à une large échelle, et en des lieux non déterminés à l'avance. Il est alors important de gérer le temps d'exécution du script et d'en limiter la durée d'exécution en le stoppant lorsqu'il n'est plus nécessaire. Pour cela, il suffit de stopper la quête.

Voir également