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

[5]     Conception d'une quête        

+ bref récapitulatif des instructions liées aux dialogues

          + les scripts et les erreurs (par gilbertus)

[6]     Gestion des Plug-in

          + 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 ---

 

==========================================

[2]              Chapitre OBJET

==========================================

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 ---

 

===============================================

[3]             Scripts Avancés

===============================================

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 ---

===============================================

[5]              Conception d'une Quête

===============================================

 

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

         

 

 

 

 

  Faire

à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)

 

 

 

 

 

  Faire

à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)

 

 

 

 

 

 

 

 

 

 

  Faire

à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 ---

 

===============================================

[6]              Gestion des plugs

===============================================

 

// ====  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

Stats              Console                       

 

Script Functions

 

AI

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

 

                                                                                                                      --- retour Menu Fonctions ---

Animation

PlayGroup, GroupName, [Flags]

LoopGroup, GroupName, Number, [Flags]

SkipAnim

 

                                                                                                                      --- retour Menu Fonctions ---              

Combat

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.

 

                                                                                                                      --- retour Menu Fonctions ---  

Dialogue

 

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.

 

                                                                                                                      --- retour Menu Fonctions ---  

Faction

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

 

                                                                                                                      --- retour Menu Fonctions ---  

Item/Object

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

 

                                                                                                                      --- retour Menu Fonctions ---  

Magic

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

 

                                                                                                                      --- retour Menu Fonctions ---  

Miscellaneous

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

 

                                                                                                                      --- retour Menu Fonctions ---  

MenuMode

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

 

                                                                                                                      --- retour Menu Fonctions ---  

Movement

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.

 

CellUpdate

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

 

                                                                                                                      --- retour Menu Fonctions ---  

Player Controls

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

 

                                                                                                                      --- retour Menu Fonctions ---  

Time

GetSecondsPassed

 

                                                                                                                      --- retour Menu Fonctions ---  

Script

ScriptRunning, ScriptName

StartScript, ScriptName

StopScript, ScriptName

 

                                                                                                                      --- retour Menu Fonctions ---  

Sound

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.

 

                                                                                                                      --- retour Menu Fonctions ---  

Stats

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

 

                                                                                                                      --- retour Menu Fonctions ---  

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 Menu Fonctions ---  

 

 

 

 

                                                                                                                                                          --- 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 :

daederius@tiscali.fr

daederius@caramail.com

 

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 !

 

 

 

 

 

                                                                                                                                                          Retour SOMMAIRE

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

===============================================

[-]        Qui est Duke Nukem ?

===============================================

 

 

 

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 !

daederius@caramail.com