Oyez, oyez !

Les résultats du vote sur les meilleurs RPG de tous les temps sont désormais dévoilés dans ce message !

Merci à toutes et à tous pour votre participation !

N'hésitez pas à aller commenter, ajouter des jeux auxquels vous n'auriez pas pensé...

[TUTORIEL] LE KIT DE SURVIE - CHAPITRE 6 : Savoir manipuler un script

Répondre
Avatar du membre
Armand
Adepte de Grondemarteau
Ours des cavernes
Messages : 1141
Enregistré le : lun. 03 déc. 2007, 22:04
Localisation : Dordogne
Statut : Hors ligne

[TUTORIEL] LE KIT DE SURVIE - CHAPITRE 6 : Savoir manipuler un script

.

Message par Armand »


LE KIT DE SURVIE DU MODDER DEBUTANT
Ou comment survivre dans la jungle quand on est un puceau du tp2



Chapitre 6 : Savoir manipuler un script



Avant propos


Et oui déjà au chapitre 6 !
Certains d'entre vous pourront me faire remarquer que je m'étais arrêté au chapitre 4 la dernière fois, mais je me réserve ce chapitre 5 dédié à l'ajout de nouvelles répliques dans les dialogues existants pour plus tard. D'une part parce que je commence à me lasser de tutorialiser sur les dialogues mais aussi et surtout parce que je pense qu'aborder le problème des scripts est beaucoup plus urgent dans l'immédiat.
Les scripts couvrent des domaines vraiment très larges et on a beau être limité par certaines contraintes du moteur du jeu, on peut vraiment envisager beaucoup de choses en termes de réalisation grâce à cet outil. Faire un tutoriel très exhaustif qui couvre tous les cas de figures relèverait de l'utopie mais nous allons essayer de vous donner les armes pour parvenir à comprendre comment tout ça marche et quels types de manipulations on peut envisager.



Préparation


On ne change pas une équipe qui gagne. Vous allez avoir encore une fois besoin de votre éditeur de texte favori et bien sur d’IESDP plus que jamais avec de préférence un onglet pour les triggers et un autre pour les actions. Vos aller-retour sur ces différents onglets risquent d’être extrêmement fréquents. En bonus je vous suggère d’ouvrir Near Infinity, pour explorer les scripts y’a pas mieux et qui plus est je vais m’en servir dans ce tutoriel donc autant être armé. Enfin j'ai une fois de plus mis à jour mon mod moine (le mod que vous avez pu découvrir lors de mon tuto sur les dialogues), en étoffant un peu la partie script : cette v3 est disponible ici.



Étape 1 : Écrire un script, les bases

a) Les différents types de scripts

Alors avant de démarrer on va aborder les différents types de scripts que vous pourrez rencontrer.

Scripts de personnages :

Image
Image


Ce sont les scripts qui s’appliquent lorsque le personnage ayant le script dédié est en jeu. Il peut s’agir d’un PNJ, d’un PNJ recrutable, d’une créature invoquée ou même d’une créature invisible, voire d’un cadavre. C’est le script que vous utiliserez le plus souvent vu que c’est le plus léger et le plus modulable.


Scripts de zones :

Image
Image

Même principe pour les cartes, tant qu’un personnage joueur se trouve dans cette zone alors le script s’exécute. A manipuler avec prudence car c’est un script qui va tourner en permanence et que beaucoup de moddeurs (bien souvent amateurs ou sur des vieux mods) auront tendance à utiliser, voire à sur-utiliser. Pourquoi ? Parce que c’est plus simple. Ce script ne nécessitant pas de création de créatures, d’objets, de sorts ou de région particulière qui détermine un piège ou une partie du décor susceptible d’implanter un événement sous certaines conditions.


Script de region trigger :

Image
Image

Si vous avez consulté mon tuto sur la création de travel triggers vous devez déjà savoir ce que c’est : ce sont des zones créées sur une carte qui permettent de déclencher des évènements lorsque l’on clique/passe dessus (piège, affichage de texte, génération de créatures ou autre). Il est donc possible de leur assigner des scripts, et c’est ce que font d’ailleurs systématiquement les pièges. Je vous invite à vous balader dans l’onglet trigger d’Infinity Explorer, lorsque vous ouvrez une zone avec ce logiciel, cela peut être très riche en information.
Puisqu’on peut cibler un endroit en particulier et que le script ne se déclenchera que si on s’approche ou si on clique sur ce point (quand cela nous est proposé) le script par region trigger reste très intéressant. Seul bémol : il faut bien sûr s’assurer que notre région ne chevauche pas une autre région existante, ce qui pourrait être la source de conflit.


Script universel :

Image
Image
L’infini te happe, l’infini te suit comme dirait l’autre...

Comme son nom l’indique, il s’agit d’un script qui s’appliquera en permanence. A priori on pourrait penser que c’est la solution idéale mais comme je l’ai dit plus haut, il faut dans la mesure du possible s’assurer qu’un script soit effectif le moins longtemps possible. Ça évite les conflits comme les ralentissements. De plus, tout mettre dans un script universel ralentit le jeu de manière presque automatique. Le script universel n’est à utiliser que lorsqu’aucun des autres types de scripts ne peut parvenir à réaliser ce que vous voulez faire.


Question du noob : tout ça c’est bien beau mais comment on écrit un script ? Quel fichier utiliser ?

Il suffit de créer un fichier .txt et de le renommer en .baf. Vous pouvez aussi réutiliser l’un de vos fichiers .d en le copiant et en le renommant vu que ce sont tous deux des fichiers textes non cryptés. Les fichiers .baf sont une version lisible (non compilée) des fichiers .bcs (script) qu’utilise le jeu, comme les fichiers .d sont une version lisible des fichiers .dlg (dialogue).




b) Quelques mécanismes simples à connaitre

Écrire des scripts peut être assez simple lorsqu’on se cantonne à un usage « courant » mais peut être également assez compliqué quand on cherche à réaliser quelque chose de plus inhabituel. Mais quel que soit le degré de complexité du script, on peut résumer son fonctionnement ainsi :
SI
Certaines conditions sont vérifiées
ALORS
Certains évènements se produiront

Comme je vous en ai déjà parlé à plusieurs reprises au fil de mes tutoriels, les scripts sont écrits à partir des conditions et des actions qui peuvent exister et qui sont référencées dans IESDP ici et ici. Les conditions vérifiant les évènements et les actions permettant d’en produire, nous allons en voir quelques exemples courants afin que vous puissiez vous faire une idée de comment procéder.
http://toutlemondesontrolistes.blogspot ... ation.html
Ancien moddeur pour bg2, critique sur la sphère roliste et gamedesigner en herbe
Avatar du membre
Armand
Adepte de Grondemarteau
Ours des cavernes
Messages : 1141
Enregistré le : lun. 03 déc. 2007, 22:04
Localisation : Dordogne
Statut : Hors ligne
.

Message par Armand »

Étape 2 : Écrire un script, comment ça se passe


1) Script d’implantation de créature :

Qu’il s’agisse d’un mod PNJ, d’un mod améliorant la difficulté, d’un mod de quête, d’un mod marchand ou même pourquoi pas d’un mod de kits, le script d’implantation de créature est plus ou moins incontournable. De plus, cela constituera un bon exemple pour débuter, mais voyons plutôt :

Image
Image

Ici, je prends pour exemple un script que vous avez déjà peut être exploré, c’est le script de la zone AR0700 (Promenade de Waukyne) précédente version du mod moine. En explorant un peu le tp2 du mod, vous pourrez remarquer que ce script va éditer le script original de AR0700 et y rajouter du contenu. Le dit contenu est déjà assez bien annoté mais nous allons essayer d’aller un peu plus loin dans la compréhension de ce type de script.

IF

Littéralement « si », tout ce qui va suivre indiquera quelles conditions doivent être remplies pour que le bloc suivant s’exécute. Si ne serait-ce qu’une condition n’est pas remplie alors le bloc bloquera, ah ah ah... (oui je sais ce n’est pas digne de moi mais lors de la rédaction de ce tuto il était tard...)


Global("#VMonksAppears","GLOBAL",0)

Le trigger Global est l’un des grands incontournables, il est même probable que ce soit le trigger que vous utiliserez le plus souvent. Le principe de ce trigger est simple : on implante une variable lorsqu’un évènement se produit afin de pouvoir vérifier par la suite qu’il s’est produit.
Ici la fonction Global vérifie la valeur du premier argument entre guillemets : c’est le nom de la variable. Puis il vérifie le deuxième argument, le type « GLOBAL » s’appliquant n’importe où, le type « AREA » (par exemple « AR0700 ») ne s’appliquera que sur la Promenade de Waukyne et enfin le type « LOCALS » ne s’appliquant que pour des évènements ne concernant que le groupe ou la créature à laquelle il s‘applique (romance, friendship, flirtpack).
Enfin, le troisième argument vérifie la valeur de la variable; où on en est au niveau des évènements.
Prenons ici l’exemple de la variable « #VMonkAppears » :

· A zéro la variable n’existe pas encore.
· A un les moines apparaissent.
· A deux les moines disparaissent.

Dans l’idéal mieux vaut créer une variable par évènement afin d’éviter les confusions mais après tout c’est vous qui allez coder là dessus. Tant que vous restez cohérent et que vous y retrouvez, libre à vous.

THEN
RESPONSE #100


Littéralement « alors », tout ce qui va suivre indiquera quelles actions doivent être remplis pour que le bloc s’exécute. Les actions s’exécutent et continueront à s‘exécuter tant que les conditions sont vraies.

SetGlobal("#VMonksAppears","GLOBAL",1)

C’est le pendant « actions » de la fonction Global de tout à l’heure. Si le trigger Global vérifiait la valeur de la variable, ici on affecte une valeur à cette variable. Attention pas de confusion ici ,ce n’est pas une addition, on ne rajoute pas 1 à cette variable. Non, on décide arbitrairement de la valeur numérique de la variable (j’ai mis 1 mais j’aurais pu mettre 4, 12, 36...).
On peut noter sur cette action que j’ai mis 1 sur une variable qui était à 0, toute variable étant à 0 par défaut. En la mettant à 1 j’évite que le script ne tourne en boucle et génère des créatures à l’infini. De plus j’ai implanté cette variable avant de générer les actions, ce qui évite que les actions se génèrent deux fois parce que la variable n’aura pas eu le temps d’être initialisée.


SetGlobal("#VDebatEnrichissant","GLOBAL",1)

De même, on implante une autre variable pour les dialogues ; à une certaine valeur, un dialogue s’initiera, à une autre il cessera, à encore une autre peut être un autre dialogue pourra être lancé.


CreateCreature("#VMonk86",[1178.731],2)

Encore une action extrêmement utilisée, c’est celle que vous avez le plus de chances de retrouver dans les scripts. On implante la créature en indiquant entre guillemets la référence du fichier créature, puis on indique entre crochets sa position sur la carte sur un axe x/y (abscisse/ordonnée, ou plus vulgairement horizontal/vertical).
Pour obtenir ces coordonnées, vous pouvez soit appuyer sur x dans le jeu sur l’un de vos persos, sur la carte dédiée pour obtenir cette valeur dans la fenêtre de dialogue, soit recourir à une méthode plus propre comme indiqué dans ce tuto.
Enfin en tout dernier vous déterminez le « facing », c’est à dire dans quelle position le personnage sera tourné. Voici une liste détaillée pour mieux vous repérer :

0 Sud
1 Sud/Sud-ouest
2 Sud-ouest
3 Ouest/Sud-ouest
4 Ouest
5 Ouest/Nord-Ouest
6 Nord-Ouest
7 Nord/Nord-ouest
8 Nord
9 Nord/Nord-Est
10 Nord-Est
11 Est/ Nord-Est
12 Est
13 Est/Sud-Est
14 Sud-Est
15 Sud/Sud-Est



2) Script de créature :

Tout à l’heure nous avons généré des créatures par le script de zone, maintenant nous allons les faire disparaître purement et simplement une fois le dialogue terminé. Mais ici nous n’allons pas utiliser un script de zone qui comme je l’ai indiqué plus haut est à utiliser avec précaution. Non, nous allons utiliser un script de créature beaucoup plus souple et adaptable même s’il comporte quelques inconvénients.

Image
Image
Avant de voir ce qui nous intéresse, attardons nous cinq minutes sur ce bloc préliminaire : c’est le bloc qui va permettre de déclencher le dialogue. En effet, si une simple variable judicieusement placée dans le fichier .d suffit à assurer que le dialogue se produise si CHARNAME l’initie, cela nécessite des manipulations plus poussées si l’on veut que le dialogue se déclenche tout seul (quand CHARNAME surprend une conversation ou qu’un PNJ l’aborde par exemple). Je fais l’impasse sur les actions/conditions que nous avons déjà vues pour plutôt me concentrer sur ce qu’il y a de neuf.


ActionOverride("#VMonk86",StartDialogueNoSet(Player1))

La commande ActionOverride va nous permettre de « cibler » quelque chose sur une action. Ici donc, le premier argument va cibler une créature (#Vmonk86) et va lui dire d’initier le dialogue avec un autre personnage. Ici, il s’agit de player1 donc de CHARNAME.


Image
Image

Wait(1)

Pour chaque bloc, le script est lu de haut en bas, les actions s’exécuteront donc l’une après l’autre. Mais pour des soucis de rythme, de synchronisation, voire de mise en scène, il peut être nécessaire de laisser un petit temps d’attente entre certaines actions ou suites d’actions. Le wait va déterminer via la valeur entre parenthèses, le nombre de secondes ou le script va se « suspendre » temporairement.

ActionOverride("#VMonk86",DestroySelf())

Même système que précédemment : la commande ActionOverride va nous permettre de « cibler » quelque chose sur une action. Ici donc le premier argument va cibler une créature (#Vmonk86) et va lui dire de se « détruire », autrement dit de disparaitre.
Pour l’exemple, un simple DestroySelf()) détruirait #VMonk86, on pourrait d’ailleurs s’en contenter puisque nous sommes dans le fichier .baf du fichier .cre #VMonk86, le ActionOverride n’a été placé ici qu’à titre d’illustration. En revanche, il est nécessaire pour les autres créatures.



Conclusion

Je n’ai bien sûr pas tout abordé, mais je pense vous avoir fourni les bases pour commencer à construire des scripts. Le mieux maintenant pour vous sera d’explorer les fichiers .bcs du jeu avec Near Infinity ou Infinity Explorer par exemple pour voir comment les créateurs du jeu ont pu s’y prendre en fonction des situations.

Pour vous perfectionner, je ne saurais que trop vous recommander le complete scripting guide, c’est en anglais mais c’est la référence en la matière et ça vaut vraiment le coup d’y jeter ne serait qu’un coup d’œil. Je vous souhaite bon courage (vous en aurez besoin) et je vous invite à poster à la suite de ce topic si jamais vous avez des questions, parfois la solution est toute proche...
http://toutlemondesontrolistes.blogspot ... ation.html
Ancien moddeur pour bg2, critique sur la sphère roliste et gamedesigner en herbe
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

Pour les ceusses qui se désolaient, j'ai actualisé les liens des images. ^^

Bonne lecture. ;)
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Hayabusa
Chien de guerre
Messages : 54
Enregistré le : mer. 15 avr. 2020, 20:58
Statut : Hors ligne
.

Message par Hayabusa »

Bonjour, c'est le dernier chapitre ?
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

Ouaip.

Comme je l'ai indiqué dans un précédent message, cette série de tutos est très vieille (elle a plus de 10-15 ans). Les techniques et les outils de modding ont considérablement évolué depuis et cetains points évoqués dans le kit de survie sont devenus obsolètes. Tu trouveras la liste complète des tutos en français ici.

Sinon, n'héiste pas à poser des questions dans les sections idoines, tu obtiendras certainement des réponses. ;)
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Hayabusa
Chien de guerre
Messages : 54
Enregistré le : mer. 15 avr. 2020, 20:58
Statut : Hors ligne
.

Message par Hayabusa »

Rebonjour, j'ai essayé de lancer mon mod mais j'ai un message d'erreur lors de l'installation. Pensant avoir fait une erreur, j'ai essayé d'installer le mod MOINE fournie dans le tuto, et j'ai exactement la même erreur !!! Quelqu'un peux m'aider à comprendre se qu'il peux me manquer ??

l'erreur :

Code : Tout sélectionner

ERROR: No translation provided for @0
Continuing despite error.

Install Component [UNDEFINED STRING:   @0]?
[I]nstall, or [N]ot Install or [Q]uit? 
Installing [UNDEFINED STRING:   @0]
J'ai remarque que dans le TP2 on commance avec un BEGIN @0 et que la seul référence avec un @0 est dans le fichier Moine/Translations/French/Setup.tra
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

@0 est le nom du composant du mod à installer. Manifestement, WeiDU ne le trouve pas dans le fichier setup.tra.

Édit : Je viens d'installer le mod Moine02.rar sans aucun souci. Qu'as-tu fait exactement ? Il faut :

1. Décompresser le mod dans ton répertoire de jeu (le répertoire Moine et le fichier Setup-Moine.exe).
2. Lancer Setup-Moine.exe.
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Hayabusa
Chien de guerre
Messages : 54
Enregistré le : mer. 15 avr. 2020, 20:58
Statut : Hors ligne
.

Message par Hayabusa »

J'ai réitéré la manip sur un dossier du jeu neuf et l'installation est passer. Je pense que j'ai du modifier une donnée dans les fichiers sans faire exprès pendant que je créais mon propre mod.

Merci de ta réponse je me remets au travail ^^
Avatar du membre
Hayabusa
Chien de guerre
Messages : 54
Enregistré le : mer. 15 avr. 2020, 20:58
Statut : Hors ligne
.

Message par Hayabusa »

Je viens de tester le mod et le jeu plante lorsque j'arrive dans la zone ... Je ne comprend pas d'où ça peux venir

Code : Tout sélectionner

IF
  Global("#VMonksAppears","GLOBAL",0)  // Par default toute les variables sont à 0 donc ce script s'executera automatiquement à l'arrivée sur la map
THEN
  RESPONSE #100 
  SetGlobal("#VMonksAppears","GLOBAL",1) // On reinitialise la variable pour eviter que le bloc tourne en boucle
  SetGlobal("#VDebatEnrichissant","GLOBAL",1)  // Variable de dialogue
  CreateCreature("#VMonk86",[1178.731],2)
  CreateCreature("#VMonk85",[1180.733],2)
  CreateCreature("#VMonk84",[1182.735],2)
  CreateCreature("#VMonk83",[1184.737],2)
END

Répondre

Retourner vers « Tutoriels »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité