TESCS Tuto Script et Quêtes [Version 3.1] Final Version conçue par daederius
daederius est un Vampire Sorcier Il sévit
dans les cimetières ou il essait d’enroler des créatures pour créer une
armée des tenêbres capable de conquérir le monde ! Pour nous les morts, le temps n’existe pas, ce
n’est pas une contrainte au contraire c’est notre allié .. il vous tue
à feu doux ……
Suilad,
Vous êtes un gros nul à chier en script et vous voulez devenir un Dieu comme moi alors v'là
un p'tit tuto histoire de
vous
montrer les bases pour pouvoir vous lancer dans la conception de mods.
C'est
vrai qu'on peut apprendre tout seul sur ce p..... de TESCS mal foutu mais pour
ça faut y consacrer beaucoup de temps pour
chercher alors voilà pourquoi j'ai fais ce tuto, pour vous faire gagner
du temps.
Durant
la conception, j'ai été un peu aidé par de braves chevaliers :
Je
remets donc une médaille à Arcanthias,
Gilbertus, Lord Mortim et Tiere.
Ainsi
qu’à Mister wiwi qui heberge mon
tuto !
==================================
SOMMAIRE =============================================================
[-] daederius
[1]
Un bref récapitulatif du langage Script
+ 2 exemples de scripts simples.
[2] Chapitre Objet
(Qu'est ce que le langage objet? et le rapport avec le TESCS?)
[3] Exemples de Scripts Avancés
[4] Exemple de Mod orienté script
+ bref récapitulatif des instructions liées aux
dialogues
+ les scripts et les erreurs (par
gilbertus)
+ Comment charger et sauvegarder des
Plug-in avec le TESCS.
+ Comment activer des plug-in dans le jeu.
+ Comment créer un plug-in.
[7] Toutes les fonctions du TESCS
[8] Quelques Adresses Web de Tuto
[-] The End
+ me contacter
[-] Et Duke Nukem qui
c’est celui là ?
+
Mega mega new exclusif
============================================================================================================================================
=============================================
[1] LE LANGUAGE SCRIPT DU TESCS
=============================================
Essayez de bien comprendre chaque instruction et de les mémoriser.
// Structure
d'un script
begin NomScript
...
....
end NomScript
// ligne de
commentaires
;
commentaires
// Déclaration
de variables
short varNameShort ; un entier
long varNameLong ; un entier long (gros nombre)
float varNameFloat ; un nombre à virgule
// Affectation
et Saisie
set varName to 5 ; varName=5
get varName ;
// Boucle TANT
QUE
while ( varName <= 3 ) ;
TantQue (varName<=3)
... ...
; faire ce qu'il y a dans la boucle
... ... ;
endwhile ;
fin boucle
// Test de
Condition
if (varName==1) ; 1 condition simple
.... ;
.... ;
endif
if ( varName > 100 ) ;
SI (varName>100)
... ...
elseif ( varName < 20 ) ;
SINON SI (varName<20)
... ...
else
SINON
... ...
endif ; fin
condition SI
if ( varName == x ) ;
égalité
if ( varName != x ) ;
différent
if ( varName >= x ) ;
supérieur ou égal
if ( varName <= x ) ;
inférieur ou égal
// Affectation
d'une variable d'un objectID
set objectID.varName to 100 ; affecter 100 dans la variable
varName de l'objectID
// Affectation
d'une variable à un entier déclaré dans un script
short valeur
set valeur to 15
// Appel d'une
fonction avec des paramètres sur un objectID
objectID
->rotate, z, 45 ;
effectuer une rotation de 45 sur l'axe Z de l'objectID
On peut aussi l'écrire de cet
manière :
objectID
->rotate z 45 ; (sans les virgules )
// ------
exemples de scripts simples -------------------
//
-------------- exemple 1 ---------------------------------------
;
Quand on déclare des variables dans un script
;
celles-ci sont appelées variable Locale
begin exemple_1
short valeur_1 ; le fait de déclarer
une variable l'initialise à zéro
short valeur_2 ; donc --> valeur_1=0 et valeur_2=0
set valeur_2 to 3
while ( valeur_1 < valeur_2
) ; boucle TANT QUE
(valeur_1<valeur_2)
set
valeur_1 to (valeur_1 + 1) ; faire ...... ajoute 1 à valeur_1
endwhile ;
fin boucle TANT QUE
end
;
combien vaut valeur_1?
;
ouep 3 donc cette boucle tourne 3 fois
sur elle même !
;
ou elle exécute 3 fois ce qu'il y a à l'intérieur de la boucle
//
------------- exemple 2 ------------------------------------------
begin exemple_1
short val_1
short val_2
short val_3
set val_2 to 3
set val_3 to (val_2+2)
if (val_3==5)
set val_1 to 1
else
set val_1 to 0
endif
end exemple_1
: combien vaut val_1 ?
; ouep 1
(val_3=val_2+2=3+2=5) donc dans la condition (val_3==5) il met val_1=1)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
à propos des variables :
à Précision de Gilbertus :
Les variables
locales au demarrage du script sont toutes à zéro et le script est toujours
actif tant que l'on ne quitte pas la CELL
dans laquelle le script agit. Toujours actif ne signifie pas
réinitialiser chaque variable en permanence mais signifie execution
en boucle des instructions. Les
definitions de variables ne sont pas du coding proprement dit et ne font pas
partie de la partie
executée en boucle.
Par contre si tu fais un stopscript et
un startscript à ce moment là tes variables sont réinitialisées
---
Retour SOMMAIRE ---
==========================================
==========================================
Ce
chapitre est là juste pour vous donenr une idée dans quoi vous mettez les
pieds !
Dans
le TESC, le script est une sorte de
C++, ni plus ni moins que de la
programmation orientée objet..
On
peut définir "Objet" dans le sens de "module".
Un
objet est construit de la façon suivante :
NOM_DE_L'OBJET
ID ID_Name ;
variable ID qui identifie l'unicité de l'objet
... ;> ICI
... ;> La déclaration
... ;> de toutes les variables
... ;> ICI
... ;> La déclaration
... ;> de toutes les fonctions
FIN
petit exemple : l'objet ARME
Objet_ARME
ID IDnameArme ; ID unique
String varNomArme ; déclaration des variables
short varPoid
short varDegats
image varImageArme
...
fonction_Attaque() ; déclaration des fonctions
fonction_Esquive()
fonction_ReparerArme()
fonction_Usure()
fonction_setUsure(int valeur);
int
fonction_getUsure();
FIN Objet_ARME
Cet
objet Arme est une sorte de squelette.
On
peut créer n'importe quel arme à partir de ce squelette et autant qu'on en
veut.
(mais
il faut que chaque IDnameArme soit différent pour pouvoir les différencier les
uns des autres)
Je
vous rassure, la structure objet que je vous montre est transparente dans le
TESCS,
en
fait dans celui-ci elle apparaît sous forme de tableau ( en complétant chaque
case!)
En
effet, vous créez une arme en renseignant chaque case du tableau et donc chaque
variable de l'objet.
Une fois le tableau rempli et donc le squelette
de l'objet rempli, vous pouvez créer une autre arme en
remplissant
un autre tableau et donc en remplissant
un autre squelette vide.
Ensuite
vous avez remarqué que la 2ème partie de l'objet est consacrée aux fonctions !
bé
oui, une fois que vous avez créé des
armes faut bien leur attribuer des actions !
Qu'est
ce qu'on peut faire avec? (attaquer,
esquiver, couper une tranche de pain ..)
On
peut aussi obtenir des renseignements sur cette arme (en bon état ? est-elle
enchantée ?....)
toujours
en utilisant des fonctions (et oui obtenir c'est une action? donc une fonction)
Donc
une action est une fonction.
Et
justement, ces fonctions on peut les
utiliser à l'aide des scripts.
Et
c'est ça qui est très intéressant !
par
exemple :
Player->AddItem Gold_001 75
Il
va utiliser la fonction AddItem qui
se trouve dans l'objet Player.
Il
y a 2 paramètres: Gold_001 et 75.
La
fonction sait que le 1er paramètre doit être un IDobjet et le second doit être
un nombre.
Revenons
à nos moutons, donc à l'aide du script et en utilisant des fonctions, on peut
élaborer des comportements,
inventer
de nouvelles quêtes + spécifiques
etc.....
La
aussi, je vous rassure vous n'aurez pas à créer des fonctions mais faut juste
savoir les utiliser.
Ce
qui est une bonne chose mais malheureusement Bethesda à volontairement limité
l'accès à toutes les fonctions.
(
pas grave les fonctions les plus
importantes sont là)
Autre
restriction, Bethesda n'a pas donné la
possibilité de créer des fonctions et de les insérer dans les objets
(peut-être
par crainte d'avoir trop de bug car c'est un domaine où seuls les pros du
codage peuvent s'aventurer sans risque et encore...)
Par
exemple si vous voulez que le joueur puisse casser un objet volontairement, on
aurait pu créer une fonction Break qu'on aurait pu insérer
dans
l'objet Player et ainsi écrire :
Player->Break IDvase
mais
c'est pas possible donc je parle pour rien.
résumé:
dans les
scripts vous pouvez utiliser certaines fonctions pour :
-
Effectuer des actions uniquement en utilisant des fonctions
existantes.
objectID->fonction_Name
-
Connaitre la valeur d'1 variable en
utilisant 1 fonction ou en "direct "
short
varName
set
varName to
objectID->get_varName [en utilisant une fonction]
ou
set
varName to objectID.varName [direct
sans utiliser de fonction]
- Affecter
une valeur à 1 variable en utilisant 1 fonction ou en "direct"
objectID->set_varName 100 [en utilisant une fonction]
ou
set objectID.varName to 100 [direct
sans utiliser de fonction]
Remarque :
Si
vous devez accéder aux données des variables de l'objet (en lecture ou pour le
modifier)
mieux
vaut utiliser des fonctions pour ça (si elle existe bien sûr),
ces fonctions sont :
-
les fonctions Get ... pour lire une
variable varName
-
les fonctions Set ... pour écrire dans une variable varName (en
écrasant l'ancienne valeur).
-
les fonctions Mod... pour ajouter une
valeur à la variable.
Remarque 2 :
Pour
accéder à 1 variable c'est un POINT (.)
qui sépare l'objectID de la variable :
objectID.varName
Pour
accéder à 1 fonction c'est une flèche composée d'un tirait et d'un supérieur (->) qui sépare l'objectID de la
fonction :
objectID->fonction_Name
_______
CONCLUSION Chapitre OBJET
_____________
On peut considérer un objet comme une sorte de
module !
Dans
Morrowind il y a des milliers d'objets en tout genre (armes, vêtements,
potions, batiments, sorts, NPC, etc...)
Chaque
groupe d'objet est conçu suivant un squelette.
Dans
un groupe, pour différencier un objet d'un autre, il faut donner un ID unique.
Par
contre vous pouvez parfaitement avoir un même IDObjet dans un groupe et le
retrouver dans un autre groupe,
ça
ne pose aucun problème.
par exemple :
Journal
clef 10 ; un objet
Journal avec un IDJournal=clef
IDpnj->AddItem
clef 1 ; un objet PNJ avec un
IDitem=clef
Comme
ce sont 2 objets différents le programme sait très bien faire la différence
entre l'IDJournal et IDitem qui sont pourtant tous les 2 égal à
"clef"
Dans
Morrowind, comme tout programme évolué,
tout est sous forme d'objet (ou de module) que ce soit les PNJ, le sac à
dos, les sorts,
les
personnages 3D, les décors, le journal
etc....
Ainsi,
on peut "facilement" composer un monde en emboîtant tous ces objets !
Voilà,
bien que transparent, je pense que c'est bien de connaître la notion d'objet
qui est la structure de base de
Morrowind .
Les objets et le TESCS, quel
rapport ? : ou une
2ème couche!
Le
TESC qui est sous la forme de tableau n'est que le simple reflet de tous les
objets.
Donc
quand vous allez créer de nouvelles quêtes ou modifier certaines choses, en
fait vous allez :
-
Soit créer des nouveaux objets à partir de squelette pour rajouter de nouveaux
éléments au monde.
-
Soit vous allez modifier le contenu des objets déjà créés pour obtenir des
comportements différents.
---
Retour SOMMAIRE ---
===============================================
===============================================
On
peut attacher un script dans plusieurs parties du TESC:
-
On peut lier un script à un objet (le script sera activé quand l'objet sera
activé)
-
Ou encore l'insérer dans le Main (programme principal) il sera donc toujours
actif.
Toutefois,
sauf expert faut plutôt éviter de le mettre dans le Main
-
Ou encore dans les dialogues (zone Results)
Le
déroulement ou l'exécution d'un script est un peu spécial.
Le script d'un objet s'exécute :
- une fois que vous êtes dans la zone où
l'objet se trouve.
- ou une fois que vous êtes en sa
possession (activé ou pas selon l'objet)
Par ce constat, il faut programmer les
scripts d'une façon particulière.
Donc étant donné que les scripts une
fois activés s'exécutent continuellement il faut mettre des conditions :
- pour que les actions du script se
fassent un certain nombre de fois (1 à X fois)
- pour que les actions du script se fassent
ou pas selon certaines circonstances.
- pour que les actions du script se
fassent en fonction d'un rythme calculé sur la base de temps.(Timer)
Notion du nombre de fois !
Comme
le script s'exécute continuellement une fois activé, le jeu va exécuter les actions du script continuellement.
Hors
si on veut qu'il s'exécute qu'une seule fois il faut adapter le script avec des
conditions.
Par
exemple quand vous arrivez dans une pièce, vous voulez qu'un objet se téléporte d'un point X à un point Y mais
1 seule fois.
N'oubliez
pas vous êtes dans une pièce
(donc
une zone alors le script va s'exécuter continuellement)
begin exemple
teleporter obj,x,y
end exemple
;
problème: dans cet exemple, sans condition, tant que vous restez dans la pièce
l'objet va continuellement se téléporter de X à Y
puisque
le script s'exécute continuellement.
Par
contre en insérant une condition:
begin exemple
short d
if (d==0)
teleporter obj,x,y
set d to 1
endif
end exemple
//
le programme sera toujours exécuté continuellement
//
Mais puisqu'une fois que l'objet
sera téléporté en Y, d vaudra 1 (d=1)
//
donc la prochaine fois que le programme sera exécuté la condition ne sera plus
remplie (d=1 et non plus 0) alors il ne fera plus
ce
qu'il y a dans la boucle (téléporter l'objet).
Notion de temps
Après
la notion de "nombre de fois" on peut gérer la notion de
"temps".
Nous
voulons déplacer un objet (et non téléporté) entre un point X vers Y.
Ce
déplacement doit durer 10 secondes
La
distance entre les 2 points est de 100 unités
donc
le pas de déplacement est de 10 unités /seconde.
ici,
vous remarquez qu'il faut exécuter un certain nombre de fois un groupe
d'actions
(effet
de déplacement toutes les secondes) et le tout faut le faire qu'une fois c.a.d.
déplacer l'objet de X vers Y qu'une seule fois.
begin deplacer_objet
float
timer
short
start
short
do
if ( do == 0 ) ; si l'ensemble du
déplacement (X vers Y) n'a jamais été fait (donc do=0)
set start to 1 ;
start=1 autorise d'exécuter les actions
endif
if (start==1) ; si autoriser à
exécuter les actions
if ( timer < 9 ) ; les 10 premières secondes
deplacer objet,X,Y,10 ; on déplace par pas de 10 unités de X vers
Y
;
pour avoir un total de 100 unités.
endif
if ( timer >= 9 ) ; si 10 secondes se sont
écoulées (0 à 9)
;
cela veut dire que l'objet est arrivé en Y
set start to 0
set timer to 0 ; on
remet start et timer à 0
set
do to 1 ; l'ensemble du déplacement a été effectué donc
on met do=1
endif
set
timer to (timer+GetSecondsPassed) ;on calcule le timer en fonction des sec.
écoulées
endif
end deplacer_objet
Resumé:
On ne peut pas
coder un script sans prendre en considération que les scripts s'exécutent en
boucle
et que la
notion de temps est un peu spéciale à gérer.
Petite
Précision:
----->
Par Lord Mortim
Les
scripts actifs (ceux qui sont dans la même cell que le joueur) sont exécutés
une fois par frame. La durée d'une frame est la durée
que
met le moteur à exécuter tous les scripts, faire les tests, animer les
personnages, etc...
La durée d'une frame est donc variable. La fonction GetSecondsPassed te
retourne le temps écoulé depuis la dernière frame.
Et
comme en une seconde, il y a plusieurs frames (heureusement d'ailleurs !), les
scripts sont exécutés plusieurs fois par seconde.
Mais pour ce qui est des méthodes (rotate,deplacer, teleporter,...) tu n'as pas à te soucier de cela. Cette
méthode prend en paramètre
l'angle
que doit parcourir la rotation en une seconde, et calcule toute seule les
rotations correspondantes à chaque frame, en fonction de la
vitesse du moteur.
En d'autres termes, la fonction Rotate Z 10 fera tourner l'objet de 10 degrés
par seconde sur l'axe Z et ce quelque soit le nombre d'itérations
réalisé
par seconde.
// =========
EXEMPLE DE SCRIPT
===============
//-------- OUVERTURE D'UNE PORTE
SPECIALE -----------------
On
va gérer l'ouverture d'une porte par le joueur et sa fermeture automatique au
bout de 11 secondes.
Le
joueur arrive devant cette porte spéciale :
-
il active la porte (barre espace ou entrer) pour l'ouvrir :
* de 0 à 9 secondes : la porte s'ouvre
(la
porte pivote de 0° à 100° par pas de 10°)
* de 9 à 20 secondes rien ne se passe (la
porte reste ouverte)
// il n'y a pas de code à taper pour ça , cool!
* de 20 à 29 secondes: la porte se ferme
automatiquement
(en
pivotant de 100° à 0° par pas de -10°)
* à plus de 29 secondes: la porte est donc
fermée.
begin porte_special
float
timer
short
start
if
( MenuMode == 1 ) ; Si le Menu
du jeu est activé ne pas exécuter la suite
return ;
Retourner à ce qu'il faisait (donc au menu)
endif
if
( OnActivate == 1) ; si le
joueur active la porte pour l'ouvrir (barre espace ou enter)
if ( start == 0 )
set start to 1 ; activer le processus d'ouverture de la
porte
endif
return ;
pas nécessaire mais il permet de rafraîchir l'écran (frame)
endif
if
( start == 0 ) ; Si
le processus d'ouverture de porte n'est pas enclenché on est pas autorisé à
exécuter la suite
return ;
On retourne au jeu sans exécuter la suite du code
endif ;
SINON(donc start=1) on exécute le reste du code en bas
;
-------------- de 0 à 9 secondes --------------
if
( timer < 9 ) ;
Dans un premier temps,
;
Pendant les 10 premières secondes
Rotate X 20
"akula door A"->Rotate Z
10 ; La porte pivote avec un pas de 10°
endif
;
------------ de 9 à 20 secondes ---------
;------------- rien ne se passe --------
;-------------- la porte reste ouverte pendant 11 secondes
(20-9)
;--------------
de 20 à 29 secondes ----------------
if
( timer > 20 ) ;
Pendant ces 10 secondes, il faut fermer la porte
"akula door A"->Rotate Z
-10 ; La porte pivote avec un
pas de -10°
endif
;
------------ de 29 secondes ou supérieures -----------------------
if
( timer > 29 ) ;
Une fois la porte (supposée) fermée
set start to 0 ; On autorise plus
l'exécution du processus start=0
set timer to 0 ; On remet le timer=0
;
si on doit ouvrir la porte une autre fois
"akula door A"->SetAngle
Z 0 ; On force la porte à la
position 0
; (normalement déjà à 0 en cas de problème)
endif ;
set
timer to ( timer + GetSecondsPassed ) ;Calcule
le timer en fonction du temps écoulé
;
normalement toutes les secondes
end porte_special
---
Retour SOMMAIRE ---
===============================================
[4] Exemple
de Mod orienté script
===============================================
Comme exemple, on va créer une armure
spéciale.
Cette armure devra afficher un message
toutes les 5 secondes.
Donc
on va lier un script sur une armure comme ça quand le joueur sera en possession
de cette armure le script sera exécuté.
1°)
pour commencer on va créer une armure pour ça on va juste dupliquer une armure.
pour
dupliquer une armure faut juste changer son IDname.
-
Onglet->
Armor
-
On sélectionne et on ouvre la 1ère
armure ->
azura's
servant
-
Modifier l'ID de l'armure
a_tempo
-
faire [SAVE]
répondre OUI
Voilà
votre new armure apparaît dans la liste
-
sélectionner l'armure ->
a_tempo
-
sélectionner [...] (à droite de SCRIPT)
une
fenêtre d'affichage de script s'affiche
-
faire Script->
new
une
page blanche s'affiche et c'est la qu'on va écrire notre programme
-
tapez ces lignes :
----------------------------------------------------------------
begin afficheur_tempo
float timer
short compteur
short do
if ( timer>=4)
set do to 1
endif
if ( do==1 )
messagebox " compteur=%2d
" compteur
set compteur to ( compteur +1 )
set do to 0
set timer to 0
endif
set timer to ( timer + GetSecondsPassed )
end afficheur_tempo
-------------------------------------------------------------------------------------
-
Script->
save
quand
vous faite [SAVE] dans cette fenêtre, il va sauvegarder le script dans un
fichier avec pour nom le nom
qui
se trouve après le begin et le end de votre script.
donc
ici le fichier où sera sauvegardé votre script va s'appeler afficheur_tempo
-
fermer la fenêtre de Script
choisir 'afficheur_tempo' dans la liste de Script
-
Script ->
afficheur_tempo
-
[SAVE]
=========================================
voilà
votre armure spéciale a été créée et vous pouvez enregistrer votre modif avec
file->
combine
loaded plug-in
(pour
+ de détail voir chapitre sauvegarde en bas)
-
Lancer le jeu (sans oublier de sélectionner votre plug-in)
dans
le jeu, vous n'avez pas encore l'armure donc pour l'obtenir faites appel à la
console et tapez cette ligne :
player->additem
"a_tempo" 1 ;
"a_tempo" est l'ID de l'armure
voilà,
le fait d'être en possession de l'armure active le script qui lui est lié et
vous
pouvez
voir le résultat à l'écran.
---
Retour SOMMAIRE ---
===============================================
===============================================
DESCRIPTION
RAPIDE DU TESC :
Puisque les quêtes se déclenchent et se
terminent quand vous dialoguez avec les PNJ Bethesda a choisi de gérer
les quêtes dans le module
DIALOGUE(Character-Dialogue)
La création des quêtes est assez logique
mais l'éditeur TESCS est tortueux et mal foutu.
Le module DIALOGUE est composé
de 3 grandes parties :
-
à gauche c'est une sorte de Multi-Menu de navigation.
-
la moitié Haut [info/reponse]
correspond à une sorte de grille servant à contenir des phrases.
-
la moitié du bas [Speaker Condition] correspond aux conditions d'affichage
des phrases
-
tout en bas, il y a une boite [Results]
pour y mettre du script (pour exécuter un script suivant la phrase)
- suivant ce qu'on choisit dans le
multi-menu, la moitié Haut [info/reponse] est mise à jour.
- suivant ce qu'on choisit dans la
moitié Haut [info/reponse] , la moitié du bas [Speaker Condition] et [Results]
seront mis à jour.
- Dans le multi-menu il y a 5 onglets :
Topic ;
contient tous les mots clefs (si le
[filter for] en bas est vide)
Voice ; contient
tous les sons
Greeting ;
contient toutes les phrases (si le [filter for] en bas est vide)
Greeting
0: Alarmed
Greeting 1: Quests
Greeting 2: Vampires, Nudity
Greeting 4: Crime and Disease
Greeting 5: Quests
Greeting 6: Factions
Greeting 7: Classes, Endgame,
Slaves
Greeting 8: Clothing
Greeting 9: Locations
Persuasion ; contient toutes les phrases en rapport
avec persuasion
Journal ;
contient tous les IDjournal
- Le filtre [filter for] permet de
selectionner un IDpersonnage et suivant celui-ci toutes les parties du module
DIALOGUE seront mises à jour.
Si le Filtre est vide (case blanche) ce
sont tous les topic en haut et toutes
les phrases du jeu qui seront visible dans le module DIALOGUE.
Pour créer notre exemple de quête nous
allons agir sur les onglets Journal,
Greeting et Topic
Voilà le
principe:
[1]
Greeting sur un PNJ
selectionné.
Dans
le Greeting vous mettez toutes les phrases de discussion avec le PNJ.
proposition
de mission...
remerciement
pour une mission effectuée ...
etc....
remarque 1:
Le programme scan les Greetings de 1 à 9
successivement et s'arrête jusqu'a ce qu'il trouve une condition vraie dans un
des Greetings.
Le programme scan toutes les phrases du
Greeting de haut en bas et s'arrête jusqu'à ce qu'une phrase possède toutes les
conditions
du [Speaker Condition] à vrai.
remarque 2:
Quand un PNJ vous propose une mission il
y a toujours un mot en bleu qui représente
le mot clef de la phrase ici dans le TESCS
cela s'appelle un Topic.
[2] Topic
Une
fois que vous avez choisi le mot clef de la phrase qui représente au mieux la
mission il faut en faire un Topic.
Ce
topic va juste permettre au joueur d'en savoir + quand il va cliquer sur ce mot
clef (en bleu) et éventuellement vous demander
si
vous acceptez ou pas la mission.
Donc
c'est dans le Topic qu'il faudra demander au joueur s'il accepte ou pas la
mission.
Pour créer un Topic faut juste reprendre
1 mot ou une partie de la phrase.
Ainsi à chaque
fois que le TESCS affiche une phrase il compare tous les Topics avec la phrase et si il trouve qu’un Topic
fait partie de
la phrase il le met en bleu et donc quand on clique sur celui çi il continue le
programme dans le Topic correspondant.
Exemple :
Dans un greeting on met cette phrase « j’aime le
camembert »
On crée un Topic « camembert » qui affiche
une autre phrase « et oui c’est bon »
A
l’execution du programme il arrive dans le greeting et avant d’afficher la
phrase il va voire dans tous les topics
si il y a 1 ou plusieurs
Topic qui est
inclus dans la phrase, en effet il trouve un topic « Camembert ».
Donc il
affiche la phrase « j’aime le camembert » avec camembert en
bleu.
Et quand le
joueur va cliquer sur camembert
Il
va executer ce qui se trouve dans le Topic »camembert » et donc il va afficher cette phrase
« et oui c’est bon »
Remarque :
Avec
cet exemple, vous avez peut être deviné qu’il ne pouvait y avoir 2 topic pareil
et que quand vous créez vos phrases il faut faire attention
que
les mots que vous écrivez ne correspond pas déjà à un topic déjà créé
auparavant.
[3] Journal
Quand
le joueur accepte la mission on met à jour le journal.
Quand
le joueur a exécuté avec succès la mission on met aussi à jour le journal.
EXEMPLE DE MISSION:
-
aller voir Ra'virr à balmora
-
il vous propose une mission, il faut aller lui trouver une clef nommée assi
(peu importe ça provenance)
-
il faut lui en ramener une.
-
il vous donne 75 gold de récompense
Trucs & Astuces
Avant de vous lancer, je vous conseil de faire votre projet sur
papier.
Voici un exemple sous forme de
tableau :
Dans cet
exemple, j’utilise le minimum de phrase necessaire pour gerer les dialogues
c’est une version la plus courte possible.
GREETING 5 à ra’virr
à à à à à
|
1er
Emplacement |
2è
Emplacement |
3è
Emplacement |
4è
Emplacement |
But
De
la phrase |
Evoquer la Mission |
Mission pas encore reussie |
Mission Reussie |
Plus de mission à proposer
|
Phrase
|
J’ai
besoin d’une Clef Assi
|
Alors ? partez
en mission |
Bravo ! … |
J’ai
plus rien à
vous dire ! |
Topic
|
Clef Assi |
|
|
|
CONDITIONS
ID
Journal Index |
0 |
10 |
10 |
|
Item clef
Assi
|
|
0 |
1 |
|
àResults |
|
|
· ID Journal Index=50 · PNJ à Joueur 75 pieces · Joueur
à
PNJ Clef Assi |
|
TOPIC àClef Assi
à à à à
|
1er
Emplacement |
2è
Emplacement |
3è
Emplacement |
But
De
la phrase |
Si « oui » Reaction positive |
Si « non » Réaction Negative |
Proposer la Mission |
Phrase
|
Super à bientôt !
|
Dommage !
|
Vous
voulez faire
la
mission ? |
CONDITIONS
ID
Journal Index |
|
|
0 |
Choice
|
1 ( oui) |
2 ( non) |
|
àResults |
ID
Journal Index=10 |
|
Choice
« oui » 1 « non »
2 |
CHARACTER->DIALOGUE
============ JOURNAL
==========================
On va commencer par le journal parce qu'
après on a besoin de IDJournal.
-
Onglet JOURNAL
-
FILTER FOR->
blanc
-
Journal-> new n'importe où
j_key_assi
-
INFO-> new sur le 1er emplacement
j'ai
accepté d'aller lui chercher la clef assi
-
INDEX ->
10
-
INFO-> new sur le 2ème
emplacement
j'ai
apporté la clef assi à ra'virr, mission Terminée !
-
INDEX ->
50
remarque:
IDJournal(j_key_assi)
a un INDEX de 10 quand il s'agit du
texte de la mission.
IDJournal(j_key_assi)
a un INDEX de 50 quand il s'agit du
texte de fin de mission.
Donc
sur un IDJournal on peut affecter plusieurs textes à condition de leur donner
différents INDEX pour pouvoir les gérer.
============ GREETING
=======================================
-
Onglet GREETING->
GREETING
5
-
FILTER ON ->
ra'vir
-------------------------------------------------------------------------------------------------
-
INFO-> new sur le 1er emplacement
j'ai besoin
d’une clef assi !
-
ID->
ra'vir
-
FUNCTION/VARIABLE->
[Journal] [j_key_assi] [=] [0] ; si la mission n'a pas encore été
donnée au joueur
remarque:
juste en bas on va créer un topic clef
assi donc dans le jeu clef assi dans la phrase ci-dessus sera en bleu et
quand le joueur
cliquera sur ce topic le programme va
poursuivre dans topic en bas.
-----------------------------------------------------------------------------------------------
-
INFO-> new sur le 2ème emplacement
Alors? …
Partez en mission !
-
ID->
ra'vir
-
FUNCTION/VARIABLE->
[Journal]
[j_key_assi] [=] [10] ;Si la
mission a été acceptée par le joueur
[item] [key_assi]
[=] [0] ;Si le joueur ne possède pas la clef assi
--------------------------------------------------------------------------------------------
-
INFO-> new sur le 3ème
emplacement
Bravo! Vous avez réussi la mission, vous avez une clef assi! merci
-
ID->
ra'vir
-
FUNCTION/VARIABLE->
[Journal]
[j_key_assi] [=] [10] ; Si la
mission a été donnée au joueur donc INDEX=10
[item] [key_assi]
[=] [1] ; Si le joueur possède la clef assi
-
RESULTS ->
player->removeitem
"key_assi" 1 ;enlève la
clef assi du sac à dos du joueur
AddItem
key_assi 1 ;ajoute
la clef assi au PNJ
Player->AddItem
Gold_001 75 ;ajoute 75 pièces au
joueur
Journal
"j_key_assi" 50 ;met
INDEX du journal à 50 (mission effectuée et finie)
-----------------------------------------------------------------------------------------------
-
INFO-> new sur le 4ème
emplacement
j'ai plus rien
à vous dire!
-
ID->
ra'vir
============ TOPIC =============================================
-
Onglet TOPIC->
-
FILTER FOR->
sur
le Blanc
-
TOPIC-> new
clef
assi
-----------------------------------------------------------------------------------------------
-
INFO-> new sur le 1er
emplacement
Super! A
bientôt
-
ID->
ra'vir
-
FUNCTION/VARIABLE->
[function] [choice]
[=] [1] ; si le choice=1 donc la réponse oui
-
RESULTS ->
Journal
"j_key_assi" 10 ;
on met à jour le journal pour mission acceptée et en cours
;
avec un INDEX=10
-----------------------------------------------------------------------------------------------
-
INFO-> new sur le 2ème
emplacement
Dommage !
-
ID->
ra'vir
-
FUNCTION/VARIABLE->
[function] [choice]
[=] [2] ; si le choice=2 donc la réponse non
-----------------------------------------------------------------------------------------------
-
INFO-> new sur le 3ème
emplacement
Vous voulez
faire la mission ?
-
ID->
ra'vir
-
FUNCTION/VARIABLE->
[Journal] [j_key_assi] [=] [0] ;si la mission n'a pas encore été
donnée au joueur
-
RESULTS->
choice
"oui" 1 "non" 2 ;propose
au joueur de répondre oui ou non
;et
choice vaudra soit 1 soit 2
remarque:
Il
est important de respecter l'ordre des phrases, il faut savoir que le choice est une fonction un peu
spéciale.
Vous vous rappelez que les phrases sont
scannées de haut en bas et exécutent la 1ère phrase dont les conditions sont
vérifiées.
Le
problème c'est que quand on utilise choice,
le programme ne continue pas à tester les phrases en bas de celui-ci, en fait
il rescan tout depuis le début.
C'est
pourquoi il faut mettre en 1er les phrases "réponse au choice: oui et non" et à la fin il faut mettre la
phrase avec le choice, comme ça
quand il
rescan
il tombe sur les réponses oui, non.
Précision sur
les Topics
---------à par Tiissa
Les topics que tu peux aborder avec un npc sont ceux qui
sont deja apparus dans un sujet precedent.
Donc si ton sujet c'est "skouma-factory" (par exemple), il faut
qu'un NPC ait deja prononce "skouma-factory" dans une autre phrase
pour en discuter avec lui (ou un autre).
Pour ca, tu peux le mettre dans les greetings ou les dernieres rumeurs (ou
ce qui va bien pour aborder le sujet).
Gaffe aussi aux conditions que tu definis pour tes phrases (et a l'ordre)
============ FIN/TEST ==========================
Une fois que vous aurez terminé cette
manip, testons-la, et pour ça :
-
allez voir ra'virr à balmora
* pour aller plus vite à balmora (si
vous n'y êtes pas bien sur!),
faites appel à la console de commande et tapez :
coc balmora
une fois sur place, trouver ra'virr le
marchand.
-
Activez la discussion,
-
Testez et acceptez la mission
-
Au revoir !
* disons que vous partez à la recherche
de la clef et que vous l'avez trouvée, hop
un petit raccourci en faisant appel à la
console, tapez :
player->additem "key_assi"
1
-
voilà vous êtes en possession de la clef assi
-
Réactivez le dialogue avec ra'virr
-
et testez !
Remarque 1:
Comme exercice, vous pouvez définir un
autre personnage qui possède la clef assi et ainsi vous pourrez la lui demander
pour la rapporter à ra'virr.
Remarque 2 :
Avant de vous lancer dans la création de
quêtes, mettez tout sur papier et réfléchissez sur papier.
-----------------------------------------------------------------------------------------------
Astuces :
Choisir
l'ID de Ra'virr ou un topic dans Filter For c'est hyper chiant, on perd un
temps fou à chaque fois, voici qqs astuces :
1ère
astuce :
-
Si c’est pour Filter For, choisissez l’onglet Greeting
- Cliquez dans la liste(ID) ou Filter For et appuyer
successivement sur les touches [R] [A] [‘]
2ème
astuce :
-
Cliquez dans la liste(ID) et appuyer sur la touche [R] du clavier
-
Ensuite appuyez 7 fois sur la touche [DOWN Rapide] (à droite de la touche [Fin])
Et
voilà ra'virr apparaît dans la liste, z'avez qu'a le sélectionner.
3ème astuce :
-
La 1ère phrase vous êtes obligé de sélectionner ID de ra'virr manuellement
-
pour créer les phrases suivantes dans INFO faut copier au lieu de faire new.
comme
ça vous avez la copie et vous pouvez modifier les changements correspondants.
Astuces
2 : à info de Gilbertus et Resdulac
Comment
changer l’ordre des infos ?
Il
faut rien avoir dans le filtre en bas à gauche
Filter
For ->
Case Blanc ou Vide
et
utiliser les touches fleche gauche et fleche droite pour remonter ou
redescendre l'info sélectionnée.
Autre Version --------------------------------------------------------------------------------------------------------
Voici une autre version mais en plus
élaborée, c’est ma version préférée.
Essayez de comprendre le déroulement et
essayez de le transcrire dans le TESCS.
GREETING 5 à ra’virr
à à à
|
1er
Emplacement |
2è
Emplacement |
But
De
la phrase |
Evoquer la Mission |
Plus de mission à proposer |
Phrase
|
J’ai besoin d’une Clef Assi
|
J’ai plus rien à vous dire ! |
Topic
|
Clef Assi |
|
CONDITIONS
ID
Journal Index |
<= 10 |
|
TOPIC àClef Assi
à à à à
|
1er
Emplacement |
2è
Emplacement |
3è
Emplacement |
4è
Emplacement |
5è
Emplacement |
But De la phrase |
Si « oui » Reaction positive |
Si « non » Réaction Negative |
Proposer la Mission |
Mission pas encore reussie |
Mission Reussie |
Phrase
|
Super à bientôt !
|
Dommage !
|
Vous
voulez faire
la
mission ? |
Vous
pouvez partir
en mission !
|
Bravo !
|
CONDITIONS
ID
Journal Index |
= 0 |
= 0 |
= 0 |
= 10 |
= 10 |
Item |
|
|
|
= 0 |
= 1 |
Choice |
= 1
( oui) |
= 2 ( non) |
|
|
|
àResults |
· ID Journal Index=10 · Goodbye |
|
Choice
« oui » 1 « non » 2 |
|
· ID Journal Index=50 · PNJ à Joueur 75 pieces · Joueur à
PNJ Clef Assi |
// ----- Bref Récapitulatif des instructions ----------------
Dans
les dialogues, pour chaque phrase de INFO on peut insérer des lignes de code
dans le tableau [Results].
C'est
pour faire réagir les personnages de différentes manières suivant la discussion
engagée.
par
exemple si vous l'insultez, vous pouvez le faire attaquer:
"Kashtes
Ilabael"->StartCombat Player
Voici
les instructions les plus utilisées dans les Dialogues-->[Results]
_________DIALOGUE_________________________________________
Choice, "Excusez-moi, j’ai à faire.", 1, "Non.", 2
ici,
la boite de dialogue offre au joueur 2 choix:
-
soit il répond : "Excusez-moi, j’ai à faire."
et donc la fonction choice vaudra 1
-
soit il répond "NON"
et donc la fonction choice vaudra 2
Goodbye
;
force le joueur à prendre fin à la discussion
%PCName
;Correspond
au nom du joueur dans le jeu
______________________DIVERS
______________________
ShowMap "Ald Daedroth"
; le showmap permet de montrer l'endroit "Ald Daedroth" sur la carte
du monde du joueur.
Remarque:
- si la ville est composée de 2 mots il faut
la mettre sous guillemet
ShowMap "Ald Daedroth"
- si la ville est composée que d'un seul mot
vous pouvez enlever les guillemets
ShowMap Balmora
activate
disable
;active
ou désactive le script d'un objet.
"Daren
Adryn"->enable
;
Le personnage apparaît désormais dans le jeu.
"J'Dhannar"->disable
; Le personnage disparaît
(il est toujours au même endroit mais il est
invisible et ne peut plus être affecté par rien)
addtopic "soigner la dépendance au skouma"
;rajoute une option de dialogue dont le titre est donné.
Set ThreadsWebspinner to
ThreadsWebspinner + 1
;on
peut déclarer une variable et lui affecter une valeur pour pouvoir l'utiliser
dans
la boite Dialogue [speaker condition] ou dans le script.
random 100
;
valeur tirée au hasard (dans ce cas entre 0 et 100).
ModFlee 100
;Le
Flee c'est la tendance à fuir
Les
creatures avec une 'AI Flee' de 60 ou + fuient systematiquement le combat.
Les creatures avec une 'AI Flee' de 50 fuient des que leur HP est en dessous de
70-80%.
Les creatures avec une 'AI Flee' de 40 fuient des que leur HP est en dessous de
50%.
Les creatures avec une 'AI Flee' de 30 fuient des que leur HP est en dessous de
30-25%.
Les creatures avec une 'AI Flee' de 20 fuient des que leur HP est en dessous de
10%.
Les creatures avec une 'AI Flee' de 10 ou - ne fuient jamais.
______________REPUTATION
___________________________
ModPCFacRep 10 "Fighters Guild"
;
augmente de 10 votre niveau de hiérarchie par rapport à la "Fighters
Guild"
modFactionReaction Hlaalu Nerevarine 2
;modifie la réputation du joueur auprès des Hlaalu, peut une fois qu'il est
Nevenarine seulement!
??????
PCRaiseRank Temple
;fait augmenter le rang du joueur au sein de la faction temple.
Permet
de gérer la progression au sein des factions
ModDisposition -10
;La disposition étant la barre sur 100 présente dans les dialogues.
Ceci
marche donc pour le personnage qui utilise ce dialogue ou qui porte le script
appelant cette ligne de script
SetPCCrimeLevel 0
;remet le compteur de crime
(le
niveau de crime, la bounty sur ta tête en bref) à 0
player->modReputation 5
;augmente la réputation de +5 pour le joueur
________COMBAT____________________________________________________
SetFight 100
;positionne
Fight à 100 à IDdupersonnage avec qui vous dialoguez.
StartCombat Player
;IDdupersonnage
avec qui vous dialoguez commence le combat avec le joueur.
"Kashtes
Ilabael"->StartCombat Player
;IDpersonnage("Kashtes
Ilabael") commence le combat avec le joueur.
"Favel
Gobor"->ModFight 40
;Modifie
le Fight d'un IDpersonnage("Favel Gobor")
________OBJET/ITEM______________________________________________
remove=enlever
additem=ajouter un item
IDperso
-> Action IDobjet Quantité
Brallion->removeitem
"exquisite_ring_brallion" 1
;
enlève 1 IDobjet de l'IDdupersonnage
Player->RemoveItem "amulet
of ashamanu (unique)" 3
;
enlève 3 IDobjet du joueur
RemoveItem "shield of the undaunted" 7
;
enlève 7 IDobjet de l'IDdupersonnage avec qui vous discutez.
brallion->additem "gold_001" 200
Player->AddItem Gold_001 150
AddItem Gold_001 200
________VARIABLE/FONCTION_______________________
SetVariableName ;affecte une
valeur à la Variable
ModvariableName ; modifie la
valeur donnée (+ ou -)
exemple:
ModFlee
100 ; ajoute 100 à Flee
SetFlee
50 ; Flee=50
StartScript NameScript
;
lance le script NameScript
______DEPLACEMENT/POSITION/SUIVRE/ETC...
_________________
"Minabibi
Assardarainat"->PositionCell
217 846 74 190 "Sadrith Mora, Complexe du Serval, guilde des Mages"
;"Minabibi Assardarainat" va apparaître instantanément dans la
cellule 217 846 ... nommée
"Sadrith Mora, Complexe du Serval, guilde des Mages"
les chiffres représentant X, Y Z et R (R étant l'angle d'orientation du
personnage ou objet)
Attention à la différence entre PositionCell qui devrait être utilisé que pour
les cellules intérieures et Position tout court que pour les extérieurs
AiWander 0 0 0 40 30 20 0 0 0 0 0 0
wander veut dire "errer" . Ce qui veut dire que le personnage va
commencer à se déplacer un peu au hasard. Les chiffres sont (dans le désordre)
le
temps que doit durer le wander, la distance maximum qu'il peut parcourir et les
différents idle (différentes positions d'attente, avec le pourcentage
de
chance que chacun apparaisse par rapport aux autres)
AiFollow Player 0 0 0 0 0
tous ces 0 ça veut dire que le personnage devra suivre le joueur partout. Le
premier chiffre (le premier zéro donc) étant le temps pendant lequel
il
doit suivre le joueur.
AiFollow Player 0,35350,-37899,-673,0
; ici le PNJ doit suivre le joueur jusqu'a ces coordonnées
AiFollowCell Player "Camp des Zaïnabs, yourte du khan des
cendres" 0 -33 366 -252 0
;Le
PNJ suit le joueur jusque dans une cellule (ou pièce)
"Rabinna"->AiFollowCell Player "Coeurébène, délégation argonienne" 0 22 19
5 0
;"Rabinna"
suit le joueur jusqu'a la cellule indiquée.
"Fonus
Rathryon"->AiFollow, Player, 0 0 0 0 0 0
;"Fonus Rathryon" suit
le joueur tout le temps.
// ----- Les Scripts et les erreurs ----------------
------> Par Gilbertus
Bon
j'ouvre ce sujet pour recenser les erreurs de fonctionnement que vous avez pu
rencontrer dans le TESC, personnellement j'ai eu les suivantes:
- Si dans un même script plus de 32 variables short, la 33ème à l'exécution du
script sort une erreur qui n'a rien à voir parlant de infix et postfix
variable.
- Limitation des if imbriqués à 10.
- Dans une suite d'instruction if ... elseif ... elseif ENDIF elseif .... endif
pas d'erreur signalée mais fait n'importe quoi à l'exécution.
- Si dans une boucle whille ... endwhile, il y a trop d'instructions à exécuter
(vu sous windows XP =faut voir sur un autre système) le système fait des
interruptions
systèmes et la variable qui gère while ... endwhile perd son compte (au lieu de
21 fait 179 par exemple ). La solution est de scinder en
plusieurs
while .... endwhile
- Des fonctions utilisées avec des variables ne sortent pas en erreur dans le
TESC mais ne sont pas exécutées.
ex:
Set x to 32879
set y to -99093
set z to 1168
set Rot to 0
Position, x ,y,z, Rot ne fonctionne pas à l'exécution
Position, 32879, -99093, 1168, 0 fonctionne bien.
Si vous avez rencontré d'autres problèmes il convient de les signaler dans ce
sujet
---
Retour SOMMAIRE ---
===============================================
===============================================
// ====
charger et Sauvegarder dans le TESCS
=====
remarque:
Tous
les plugs doivent être mis dans le dossier: ...\Data Files du
répertoire du jeu.
// ----------------------- CHARGER
-------------------------------------
Pour charger
que Morrowind(sans plug) :
- FILE
-> DATA FILES
- cocher Morrowind.esm
- [OK]
Pour charger
Morrowind + un plug-in :
- FILE
-> DATA FILES
- cocher Morrowind.esm
- cocher plug_Name.esp + [Set as
Active File]
- [OK]
remarque:
Vous devez faire en sorte de
charger 1 seul plug-in à la fois car quand je sauvegarde je fais en sorte de
sauvegarder toutes les modifs à la fois.
// ----------------------- SAUVEGARDER
------------------------------
Si
vous sauvegardez, c'est forcément que vous avez modifié un truc ou ajouter un
truc dans le TESCS.
Faut
savoir que tout changement ou tout ajout n'est pas directement sauvegardé dans
le Morrowind.esm
mais
ces modifications sont insérées obligatoirement dans un plug-in (.esp)
Donc
pour sauvegarder tous vos modifs dans un plug-in , faut faire:
- FILE -> Combine Loaded Plugins
- répondre [OUI] ;
normalement il y a un message
- donner un nom de plug-in jamais utilisé
-
Fermer le TESCS et répondre [OUI]
remarque:
Si je modifie pleins de fois mon plug il
faut que je donne à chaque fois un nom différent, moi je les numérote au fur et
à mesure
que je les modifie.
plugName_1
plugName_2
// -------- COMMENT ACTIVER UN PLUG-IN DANS LE JEU
-----------
-
Il faut lancer le Morrowind
launcher (attention! pas le
morrowind.exe)
-
Sélectionner le Menu Fichier Données
-
Cocher les plugName.esp que vous
voulez utiliser.
-
[OK]
-
Sélectionner le menu Lancer
// -------- Comment CREER UN PLUG
-----------------------------------
Un
petit exemple pour créer un p'tit plug bien sympa.
Modifions
les caractéristiques des bottes de rapidité, ce qui me gène c'est la cécité qui
affecte le porteur des bottes.
Je
trouve que la fonction "cécité" est complètement débile est vraiment
dommage pour un jeu comme Morrowind.
Je
m'explique, en possession des bottes de rapidité ma vue a donc diminué alors
pour contrer ce truc j'augmente le contraste et la luminosité de l'écran.
A
un moment, j'en ai eu assez de me bousiller les yeux avec ce truc de plus je
trouve que ça gâche les super- graphismes de ce jeu.
-
Chargez le TESCS
- FILE
-> DATA FILES
- cocher Morrowind.esm
-
[OK]
Allons
voir les bottes de vitesse et comment elles ont été conçues, pour ça :
-
fenêtre Object Windows ->
choisir
l'onglet Armor
-
sélectionner boots of blinding speed
*
Vous remarquez que l'enchantement qui le lie aux bottes c'est le Blinding speed
(en
bas à gauche)
Donc
allons voir cet enchantement :
-
fenêtre Object Windows ->
choisir
l'onglet Enchanting
-
sélectionner Blinding speed
*
Vous remarquez 2 paramètres :
cécité
et Caractéristique fortifiée.
Donc
va falloir virer la cécité :
pour
ça, sélectionner la petite flèche de cécité et sélectionner le BLANC (ou vide)
-
SAVE
-
Maintenant enregistrer le plug (voir en haut SAUVEGARDER)
-
Et activer le plug dans le jeu (voir + haut, Activer un plug dans le jeu)
TESTEZ
!
REMARQUE:
ATTENTION:!
Si
vous activez le plug botte et ensuite que vous chargez une partie (qui utilise
les bottes), il peut y avoir des erreurs.
Donc
mettez vos bottes dans le sac à dos, sauvegardez votre partie.
-
Activez le Plug dans le jeu
-
Chargez la partie et remettez vos bottes
voilà
le tour est joué.
Pour info :
Le
problème vient du fait que la sauvegarde garde en mémoire les scripts spéciaux
en cours d'exécution,
ici donc le script blinding speed est inclus
en quelque sorte dans la sauvegarde.
Si
vous activez un plug qui modifie le script (cécité enlevée)
Vous
chargez la partie et là problème!
Le
script sauvegardé (avec cécité) est différent du script réel du jeu (sans
cécité).
Donc
c'est pour ça qu'il faut d'abord désactiver le script (en mettant les bottes
dans le sac à dos) comme ça
vous
pouvez modifier comme vous voulez les caractéristiques de la botte.
---
Retour SOMMAIRE ---
===============================================
[7] Toutes les fonctions du TESCS
===============================================
J'ai
repris les fonctions de l'aide du TESCS et j'ai essayé de vous donner une
petite explication.
AI Animation Combat Dialogue Faction
Item/Objet Magic Miscellaneous Menu Mode Movement
Player Controls Time Script Sound
Script
Functions
AiActivate , ObjectID, [reset]
;
le perso active un ObjectID
;
par exemple si ObjectID est une porte, le perso va ouvrir la porte.
AiEscort, ActorID, duration, x, y, z,
[reset]
;
le Perso doit suivre et protéger un ActorID jusqu'aux coordonnées (x,y,z) en
extérieure.
AiEscortCell, ActorID, CellID, duration,
x, y, z, [reset]
;
le Perso doit suivre et protéger un ActorID jusqu'aux coordonnées (x,y,z) d'une
cellule CellID.
AiFollow, ActorID, duration, x, y, z,
[reset]
;
le Perso doit suivre un ActorID jusqu'aux coordonnées (x,y,z) en extérieure.
AiFollowCell, ActorID, CellID, duration,
x, y, z, [reset]
;
le Perso doit suivre un ActorID jusqu'aux coordonnées (x,y,z) d'une cellule
CellID.
AiTravel, x, y, z, [reset]
;
le perso va voyager jusqu’au coordonnée x y z
AiWander, range, duration, time,
[idle2], [idle3], …[idle9], [reset]
wander
veut dire "errer" .
Ce
qui veut dire que le personnage va commencer à se déplacer un peu au hasard.
Les
chiffres sont (dans le désordre) le temps que doit durer le wander, la distance
maximum qu'il peut parcourrir et les différents idle
(différentes
positions d'attente, avec le pourcentage de chance que chacun aparaisse par
rapport aux autres)
Idle2: Looking around ;regarder autours de
soi
Idle3: Looking behind ;regarder
derirère soi
Idle4: Scratching head ;se grater les couilles ....heuuu ?? .. la
tête !
Idle5: Shifting clothing or armor on shoulder ;epousseter son
armure
Idle6: Rubbing hands together and showing wares ;se frotter les doigts
Idle7: Looking at fingers and looking around furtively ;regarder ses mains et regarder furtivement
derrière soi
Idle8: Deep thought ;?
Idle9: Reaching for weapon ;faire semblant de prendre son arme
GetCurrentAIPackage
;returns
the current package the NPC is doing (0 through 4)
None = -1
Wander = 0
Travel = 1
Escort = 2
Follow = 3
Activate = 4
Pursue = 5
GetAIPackageDone
;returns
true if current package has finished.
GetDetected, ActorID
;Returns
true if object can detect ActorID. Slow function, do not call a lot.
;
retourne Vrai si l'objet peut détecter un ActorID. Eviter de l'utiliser!
ForceSneak
;Make
the npc sneak if he wanted to run he will only walk
;
sneak=marche pas à pas ou discret
ClearForceSneak ;Terminate sneak mode
GetForceSneak ;returns one if in force sneak mode
PlayGroup, GroupName, [Flags]
LoopGroup, GroupName, Number, [Flags]
SkipAnim
GetAttacked
;return 0 if the actor has never been
attacked and 1 if he has ever been attacked
;retourne
0 si le joueur n'est pas attaqué sinon 1
GetTarget, ActorID
;returns 1 if object’s combat target is
ActorID
;
retourne 1 si l'objet a pour cible ActorID
HitAttemptOnMe, ObjectID
;returns true if a hit on the
calling Actor is attempted by objectID in melee (such as hammer01)
;retourne
"true" (c'est à dire condition vraie) si l'objet ObjectID a tenté de
frapper l'acteur (ou objet?) dans le cas
IDactor->HitAttemptOnMe,
ObjectID
HitOnMe, ObjectID
;returns true if calling Actor is hit by
objectID in melee (such as hammer01)
;C'est
le fait qu'un objectID a touché le demandeur de la fonction touché,
généralement l'objectID est une arme.
ex:
if ( HitOnMe, "steel dagger" == 1 )
messageBox, "Ouille!"
endif
if ( "NPC"->HitOnMe, "steel dagger" == 1 )
messageBox, "Ouille!"
endif
OnDeath
;Returns true for one frame when Actor
is killed.
;
Retourne Vrai si l'objet Acteur a été tué.
OnKockout
;Returns true for one frame when Actor
is knocked out.
;Retourne
Vrai si dans les vaps.
OnMurder
;Returns true for one frame when Actor
is murdered.
;
Retourne Vrai si l'objet Acteur a été assassiné.
OnPCHitMe
;NOT A FUNCTION!, but used as a short var
that gets set when object is hit.
Ce
n'est pas une fonction
En gros cela signifie que l'objet (NPC, créature, coffre) a été touché (par une
arme) de l'emetteur de la fonction
if ("NPC".OnPCHitMe == 1)
...
endif
if ("coffre".OnPCHitMe == 1)
...éclater le coffre
endif
StartCombat, ActorID
;
l'objet Acteur commence le combat avec ActorID
StopCombat
;
L'objet Acteur arrête le combat.
GetDeadCount IDActor
;
Je pense qu'il retourne le nombre de victimes IDActor tué par le joueur.
AddTopic, TopicID
;Adds TopicID to PC’s list of known
topics
;ajoute
le TopicID dans la liste du PC
ClearInfoActor
;Makes this info NOT appear in the
journal.
ForceGreeting
;makes the NPC start dialogue with the
PC. Does NOT matter where the NPC is.
GetJournalIndex, JournalID
;prend
la valeur de l'index actuel de l’objet JournalID
Goodbye
;Ends
current dialogue, PC can only press “Bye”
Journal, ID, Index
;Adds the index entry into the journal
for the journal ID
;Met
à jour l'Index(valeur?) du Journal ID
Choice, “Button1”, …[“Button5”]
;similar to "messagebox", but
for dialogue choices.
GetPCRank, [FactionID]
;Returns PC’s rank in faction.
This will default to the actor’s faction if FactionID is not defined.
;Returns
0-9 and -1 if not a member.
GetPCFacRep, [FactionID]
GetRace, “RaceID”
;Returns 1 if the object is of RaceID
LowerRank
;Lowers the object’s rank in its current
faction.
ModPCFacRep, var, [FactionID]
;Augmente
d'une certaine valeur var votre
niveau de hierarchie par rapport à la FactionID
ModFactionReaction, factionID1,
factionID2, var
;modifie
la réputation du joueur d'une valeur var
auprès de factionID1, peut une
fois qu'il est
FactionID2 seulement!
PCClearExpelled
;Clears currently expelled flag.
PCExpell [FactionID]
;Expells PC from NPCs faction.
PCExpelled [factionID]
;Returns 1 if PC has been expelled once
from calling object (NPC) Faction, or a faction can be defined to get a
specific one.
PCJoinFaction [FactionID]
;FactionID is optional if it is not
added it will use the faction of the npc who called the function
PCLowerRank
PCRaiseRank
;Raises the PC 1 rank in the NPCs
faction. If pc is not part of the faction, makes rank 1
;fait
augmenter de 1 le rang du joueur au sein d'une faction
;Permet
de gérer la progression au sein des factions
RaiseRank
;Raises the object’s rank in its current
faction.
SameFaction
;Returns 1 if PC is in the faction of
the calling object (NPC).
SetPCFacRep, var, [FactionID]
SetFactionReaction, factionID1,
factionID2, var
AddItem, ObjectID, count ;adds
item to calling objects inventory
Activate ;activates
the item (uses it’s default activation)
Drop, ObjectID, count ;calling Actor drops item into world
at his feet.
Equip, ObjectID ;equips
the calling item on its owner
GetItemCount, ObjectID ;returns the count on the objectID
in the calling object
OnActivate ;returns true if calling object
is activated
OnRepair ;returns
true if calling object is repaired at all
RemoveItem, objectID, count
;removes the item from the calling
object. Does NOT drop it.
RepairedOnMe, objectID ;returns true if calling object is
repaired by objected
UsedOnMe, objectID ;returns
true if objectID is used on calling object
See
also:
Inventory
Scripts
if
( player->hasitem
"IDObjet" ) ;hasitem
return True or false
...
endif
AddSoulgem, CreatureID, SoulgemID
AddSpell, SpellID ;adds
spell item to calling object
Cast, SpellID, TargetID ;calling object casts spell onto
target, spells only.
DropSoulgem, CreatureID
DisableTeleporting
EnableTeleporting
GetBlightDisease ;Returns 1 if has BlightDisease
GetCommonDisease ;Returns
1 if has CommonDisease
GetEffect, Effect ;Returns
1 if Actor is being effected by effect
GetSpell, SpellID ;Returns true if object
has SpellID in inventory
GetSpellEffects, SpellID
;Returns
true if calling object is being effected by spellID
HasSoulgem, CreatureID
RemoveSoulgem, CreatureID
RemoveSpell, SpellID ;remove spell item from calling
objects inventory
RemoveSpellEffects, SpellID
;remove spell effects of SpellID from
effecting the calling object
RemoveEffects, Effect
;removes all spells with the EffectEnum
from effecting the calling object
Enable ;Makes
the object visible and processed.
DontSaveObject ;Call
when you do not want object change in save game.
Disable ;Makes
the object invisible and it will not be processed.
FadeIn time ;time is > 0 and <= 10.0
Il
y a 2 script dans le jeu utilisant FadeIn time
script RaceCheck
script MaestriusScript
FadeOut time ;same as fade in
FadeTo alpha speed
;FadeTo 50 2.0 (Fades screen to 50% in 2
seconds). 0 is full transparency. 100 is black.
GetButtonPressed
GetDisabled ;Returns
true if object is disabled.
GetLocked ;returns 1 or 0
GetPCCell, Cell ID
;Returns true if PC is in CellID named.
Works like dialogue in that “Vivec” returns true for both “Vivec” and “Vivec,
Fred’s House”.
GotoJail ;Sends
PC to Prison.
GetMasserPhase
GetSecundusPhase
GetStandingPC ;Object returns true if
PC is standing on it.
GetStandingActor
;Object returns true if ANY actor
(including PC) is standing on it.
HurtStandingActor, float
;value is per second and should be
negative to hurt him
;float
est exprimé en seconde et doit être négatif pour blesser l'acteur.
comprenne qui pourra ?
Lock, Var ;sets the
door or container to the specified lock level.
GetInterior
MessageBox, “Message”, [var1], [var2],
[“button1”], [“button2”]
PayFine ;call after paying a crime fee to clean AI
PlayBink “filename” flag ;Pauses game and plays video. Set Flag to
true if player can escape movie.
Random, Value
ShowMap cellID ;show all the cells that start with this
string on the world map
Unlock ;makes object unlocked, doors and containers
only
Xbox ;returns true if running Xbox version, used
for button messages
CellChanged
;returns 1 for one frame when player
changes cells
;Retourne
1 à chaque image (nombre d'images par seconde marqué en bas a droite de l'écran
(fps)).
Il
faut savoir que les scripts font en général une exécution par frame.
GetPos, axis
GetAngle , axis
GetLOS, ObjectID
;returns true if object has a line of
sight to other object(ObjectID)
if
("NPC"->GetLOS, "steel dagger") == 1 )
.messageBox, "Je vois une dague"
endif
;ligne de vue sur OBJECTID
GetDistance, ObjectID ;returns the distance the object has
to ObjectID.
GetStartingPos , axis
GetStartingAngle , axis
Move, axis, units/sec
MoveWorld, axis, units/sec
PlaceAtPC, ObjectID, count, distance,
direction
;Placer
un objet ou acteur ObjetID en nombre (count) avec comme référence de
positionnement le joueur.
;Distance,
la distance par rapport au joueur, direction la direction avec 0 devant, 1
derrière, 2 et 3 de coté...
Rotate , axis, angle/sec
RotateWorld, axis, angle/sec
Position, x, y, z, zRot
Zrot
->
;In
my experience this parameter is expressed in minutes ( 60 per degree)
;So
90 degrees = 5400 minutes
;180
degrees = 10800 minutes etc.
PositionCell, x, y, z, zRot, “cellID”
SetAtStart
SetAngle, axis, angle
;Change
la rotation de l'objet ou acteur de l'angle "angle" selon l'axe axis
(X, Y ou Z)
SetPos, axis, pos
;Idem
mais change la position au lieu de l'angle... à tester je pense
DisablePlayerControls
;Can only look around with mouse or use
options menu, nothing else and menus disappear.
DisablePlayerFighting
DisablePlayerJumping
DisablePlayerLooking
DisablePlayerMagic
DisablePlayerViewSwitch
DisableVanityMode
EnableLevelUpMenu
EnablePlayerControls Enables the controls and menus.
EnablePlayerJumping
EnablePlayerFighting
EnablePlayerLooking
EnablePlayerMagic
EnablePlayerViewSwitch
EnableRest
EnableVanityMode
GetPlayerControlsDisabled
GetPlayerFightingDisabled
GetPlayerJumpingDisabled
GetPlayerMagicDisabled
GetPlayerLookingDisabled
GetPlayerViewSwitch
GetVanityModeDisabled
PCGet3rdPerson returns 1 if in 3rd
person mode
PCForce3rdPerson
;queue the change to 3rd person mode
(this may have to wait for the animation to finish)
PCForce1stPerson same
as above but 1st person mode
Player Sleeping
GetPCSleep Returns true if pc is sleeping.
ShowRestMenu Brings
up rest menu, for beds in illegal cels
WakeUpPC Wakes
up PC
GetSecondsPassed
ScriptRunning, ScriptName
StartScript, ScriptName
StopScript, ScriptName
GetSoundPlaying soundID
PlayLoopSound3D, “soundID”
PlayLoopSound3DVP, “soundID”, volume,
pitch
PlaySound, “soundID”
PlaySoundVP,“soundID”, volume, pitch
PlaySound3D, “soundID”
PlaySound3DVP, “soundID”, volume, pitch
Say, “file name”, “text” make subject say wav file, only works on animating
objects
SayDone returns
true if the object is not saying anything.
StreamMusic, “filename.ext”
StopSound, SoundID stops
the soundID if it is currently playing in the object.
GetDeadCount, ObjectID ;returns
how many of this objID have been killed
GetStat
SetStat, NewValue
ModStat, Mod
Resurrect ;Brings
Actor back to life
Weather
ChangeWeather, RegionID, TypeEnum
GetCurrentWeather
ModRegion, RegionID, clear_var,
cloudy_var, foggy_var, overcast_var, rain_var, thunder_var, ash_var, blight_var
Console (in game only commands)
CenterOnCell
(coc), CellID Places
the PC in the named cell.
CenterOnExterior
(coe), X, Y Places
the PC in the exterior cell grid.
CreateMaps
"Filename.esp" Creates
map image file for Xbox
FillJournal add
all entries to journal, takes a long time
FillMap show all the towns on the full map
FixMe Jump
128 units away from where I am now.
GetFactionReaction
factionID factionID The faction
ids are not optional, works in Console window only
Help
Shows
shorthand for most commands
Show
ShowVars
(sv)
StopCellTest
(sct)
TestCells
(tc)
TestInteriorCells
(tic)
TestModels
( t3d)
ToggleAI
(ta)
ToggleBorders(tb)
ToggleCombatStats
(tcs)
ToggleCollision(tcl)
ToggleCollisionBoxes(tcb)
ToggleCollisionGrid
(tcg)
ToggleDebugText
(tdt)
ToggleDialogueStats
(tds)
ToggleFogOfWar
(tfow)
ToggleFullHelp
(tfh) show
you ownership and script
name
ToggleGodMode
(tgm)
ToggleGrid
(tg)
ToggleKillStats
(tks)
ToggleLoadFade
ToggleMagicStats
(tms)
ToggleMenus
(tm)
ToggleScripts
ToggleStats
(tst)
ToggleSky(ts)
ToggleTextureString
(tts)
ToggleWorld
(tw)
ToggleWireframe(twf)
TPG
Toggle
path grid display
SG
Show
selected actor's group members
ST
Show
selected actor's target group members.
ShowScenegraph
(ssg)
---
Retour SOMMAIRE ---
===============================================
[8] Quelques
Adresses Web de tuto
===============================================
-
Un bon petit site sur le script en Français en +, le site de Bart :
http://www.euro-morrowind.com/tescs/guide/bart.htm
-
aye ! un sérieux concurrent à mon
tuto, « heureusement » pour moi il est in english
Morrowind_Scripting_for_Dummies2.0
http://www.rpgplanet.com/morrowind/chalice/files/Morrowind_Scripting_for_Dummies2.0.zip
---
Retour SOMMAIRE ---
=============================================
================ THE END ================
=============================================
J'espère
que ce tuto va vous aider à vous lancer dans le TESCS parce que moi je me suis
fait grave chier pour le faire.
Ce
tuto n'est pas complet mais c'est déjà pas mal pour avoir de bonnes bases.
Normalement
il sera continuellement modifié et mis à jour dans le temps.
Si vous voulez m'envoyer un chèque, voilà mon adresse mail :
Sinon contactez moi :
-
Si vous avez detecté la moindre erreur.
-
Pour me donner votre avis(en bien ou en mal)
(Tout avis me fera progresser ! Aucun ... je
n'aurais que des doutes !)
-
Si vous voulez insérer un cours ou que vous voulez completer mon tuto.
(Toute âme de bonne volonté sera la
bienvenue)
DERNIERS
CONSEILS :
-
Pour apprendre les bases :
à
rien de tel que de copier !
- Pour
s’ameliorer :
à
rien de tel que de fouiner et de chercher dans le
TESCS
(en essayant de comprendre par soi-même)
-
Pour la conception de vos mods:
à SOYEZ LOGIQUE & ORIGINAL
!
-
Si vous avez des questions, les forums TESCS sont là pour ça.
daederius
________________________________________________
La
vie n'est qu'éphémère, la mort ... Eternelle !
===============================================
===============================================
Duke Nukem
est LE Heros du siècle LE sauveur de
l’humanité ! Le seul
, l’unique …. C’est un Dieu ! Son arme
favori est le RPG, il destroy tout avec ça, aucun alien
ne lui résiste ! en attendant
la suite .. Duke Nukem Forever
EXCLUSIVITE MONDIAL
Juste
pour vous, voiçi une méga new exclusif que vous ne verrez nul part ailleurs.
Voici
une des rares photo de Duke Nukem en très charmante compagnie pris par un
paparazzi très chanceux (il aurait pu perdre la vie…)
Vous
pouvez remarquer qu’il se separe jamais de son arme favori, RPG en main….
Prét
à exploser le paparazzi en cas de mauvais geste de celui-çi !
Et
oui faut toujours rester sur ces gardes si on veut vivre longtemps ….
OOOhh
la la la la quel chanceux ce Duke
Nukem, cette charmante Dame à coté de lui me fais frémir de bonheur ….
OOOhh
.. ces jolies petite fesse bien ronde !
bbrrrrrrr
Quel
veinard !!!
Et
oui il le merite, c’est un Heros !
ps :
Si
un jour vous croisez la route de Duke Nukem, faites attention, un regard de
travers et Duke Nukem pourrez faire l’usage de son arme contre vous !
ps 2 :
Si
par hasard, il y a une fille qui est en train de lire ce tuto et qui ressemble
à la Miss sur la photo(avec p’tite fesse bien ronde !), qu’elle me
contacte
je veux me marrier de suite avec toi !