Différences entre les versions de « Creation Kit : Scripter »

De Wiwiki
Aller à la navigation Aller à la recherche
(Création de la page)
 
 
(4 versions intermédiaires par 2 utilisateurs non affichées)
Ligne 2 : Ligne 2 :
[[Catégorie:Creation Kit : Tutoriels de quêtes|Scripter]]
[[Catégorie:Creation Kit : Tutoriels de quêtes|Scripter]]
[[Catégorie:Creation Kit : Quêtes|Scripter]]
[[Catégorie:Creation Kit : Quêtes|Scripter]]
{{Modèle:Travaux intenses|utilisateur=Jupotter|date=13/02/2012}}


{{Lien retour | page=[[Creation Kit : Tutoriels | Tutoriels]]}}
{{Lien retour | page=[[Creation Kit : Tutoriels | Tutoriels]]}}
Ligne 9 : Ligne 8 :


=Résumé=
=Résumé=
Ce tutoriel va vous montrer comment utiliser les scripts pour faire avancer la quête suivant les actions du joueur. On a déjà vu comment scripter un dialogue, mais ici, nous allons voir comment attacher n'importe quel script a un acteur ou a un objet.
Ce tutoriel va vous montrer comment utiliser les scripts pour faire avancer la quête suivant les actions du joueur. On a déjà vu comment scripter un dialogue, mais ici, nous allons voir comment attacher n'importe quel script à un acteur ou à un objet.
<br><br>Vous allez apprendre:
<br><br>Vous allez apprendre:
* Les généralités sur le fonctionnement des scripts et comment ils s'attachent aux objets dans le Creation Engine.
* Les généralités sur le fonctionnement des scripts et comment ils s'attachent aux objets dans le Creation Engine.
* Comment répondre a un évènement dans le nouveau langage de scripts.
* Comment répondre à un évènement dans le nouveau langage de scripts.


<!--(Pour une introduction encore plus simple aux scripts, voir le tutoriel Hello World-->
<!--(Pour une introduction encore plus simple aux scripts, voir le tutoriel Hello World-->


=Papyrus=
=Papyrus=
Le langage de scripts utilisé par le Creation Kit est appelé Papyrus (d'après ce qui compose les parchemins). Les scripts Papyrus sont de simple fichier texte qui sont compilés en bytecode que le jeu exécute au runtime.
Le langage de scripts utilisé par le Creation Kit est appelé Papyrus (d'après ce qui compose les parchemins). Les scripts Papyrus sont de simples fichiers textes qui sont compilés en bytecode que le jeu exécute au runtime.


::{|style="border-collapse: separate; border-spacing: 0; border-width: 1px; border-style: solid; border-color: #000; padding: 0"
::{|style="border-collapse: separate; border-spacing: 0; border-width: 1px; border-style: solid; border-color: #000; padding: 0"
|-
|-
|style="border-style: solid; border-width: 0"|[[Image:CKNewFeature.jpg|48px]]
|style="border-style: solid; border-width: 0"|[[Image:CKNewFeature.jpg|48px]]
|style="border-style: solid; border-width: 0"|Le nouveau système est similaire au TESScript, mais requière une manière de penser légèrement différente. Vous ne pouvez plus directement manipuler les objets dans le mode; il y a maintenant des thread, votre script peut alors être interrompus en fonctionnement; il est beaucoup plus script en ce qui concerne la syntaxe (e.g. parenthèses). Pour faire court, il est beaucoup plus proche de "vrais" langages de programmation comme le [http://lua.org Lua] ou [http://python.org Python]. Si vous êtes familier avec le TESScript, vous devriez jeter un œil a notre [[Construction Kit : Différences avec le TESScript| guide de transition]].
|style="border-style: solid; border-width: 0"|Le nouveau système est similaire au TESScript, mais requière une manière de penser légèrement différente. Vous ne pouvez plus directement manipuler les objets dans le mode; il y a maintenant des thread, votre script peut alors être interrompu en fonctionnement; il est beaucoup plus script en ce qui concerne la syntaxe (e.g. parenthèses). Pour faire court, il est beaucoup plus proche de "vrais" langages de programmation comme le [http://lua.org Lua] ou [http://python.org Python]. Si vous êtes familier avec le TESScript, vous devriez jeter un œil a notre [[Construction Kit : Différences avec le TESScript| guide de transition]].
|}
|}


<!--
La première chose que nous allons faire est ajouter un script sur notre voleur afin que lorsqu'il est tué, la quête progresse.


=Overview=
=Ajouter des Scripts=
This tutorial will show how to use scripting to advance the questline based on player actions. We previously showed how to script dialogue, but this will show how to attach arbitrary scripts to actors and game objects as well.  
Ouvrez l'acteur GSQThief que nous avons créé. Nous allons nous intéresser à la section "Papyrus Scripts" de la fenêtre.
<br><br>The reader will learn:
* The basic framework of how scripts work and attach to objects in the Creation Engine
* How to respond to events in the new scripting language


(For an even simpler introduction to scripting, see the [[Bethesda_Tutorial_Papyrus_Hello_World|"Hello, World" tutorial]].)
[[Image:CKActorWindowScriptsArea.png|600px]]


=Papyrus=
Cliquez sur le bouton "Add". Cela va ouvrir une liste de scripts que nous pouvons potentiellement ajouter à cet acteur. Mais nous sommes en train d'en créer un nouveau, double-cliquez donc sur "[New Script]" en haut de la liste.
The scripting language used by the Creation Kit is called Papyrus (after the material on which scrolls are printed). Papyrus scripts are normal text files that get turned into a bytecode that the game executes at runtime.
 
::{|style="border-collapse: separate; border-spacing: 0; border-width: 1px; border-style: solid; border-color: #000; padding: 0"
|-
|style="border-style: solid; border-width: 0"|[[Image:NewFeature.jpg|48px]]
|style="border-style: solid; border-width: 0"|The new system is similar to the old TESScript, but requires a slightly different way of thinking. You can no longer directly manipulate objects in the world; it's now threaded so your script might be interrupted mid-run; it's more of a stickler for things like parentheses. In short, it's much more similar to "real" programming languages like [http://lua.org Lua] or [http://python.org Python]. If you're familiar with TESScript, you'll want to look at our [[Differences_from_Previous_Scripting|transition guide]].
|}


The first thing we're going to do is add a script to the thief so that when it's killed, the quest updates appropriately.  
[[Image:CKAddScriptWindow.png]]


=Adding Scripts=
Cela ouvrira encore une fenêtre, où nous pouvons nommer notre script. Mettez donc "GSQThiefScript" puis appuyez sur OK.
Open up the GSQThief actor that we've been creating so far. We'll be looking at the "Papyrus Scripts" section of the window.  


[[Image:ActorWindowScriptsArea.png|600px]]
[[Image:CKAddNewScriptWindow.png]]


Click the "Add" button. This brings up a list of scripts we could potentially add to this actor. We're making a new one, though, so double-click on "[New Script]" at the top of the list.  
Votre script est maintenant ajouté à l'acteur. Mais, comme on peut s'y attendre, il ne fait encore rien.


[[Image:AddScriptWindow.png]]
[[Image:CKScriptAdded.png]]


This will pop up yet another window, where you can name your script. Set its name to be "GSQThiefScript" and hit OK.  
=Propriétés=
Double-cliquez sur le script pour ouvrir la fenêtre des propriétés de ce script. De base, les scripts ne savent rien à propos des objets du jeu autre que celui auquel ils sont attachés. Nous utilisons les propriétés afin d'attacher des objets ensemble pour qu'ils puissent s'affecter les uns les autres. Dans notre exemple, nous voulons passer GSQ01 à l'étape 20 lorsque le voleur est tué, il faut donc que le script sache quelle quête nous intéresse.


[[Image:AddNewScriptWindow.png]]
[[File:CKEmptyPropertiesWindow.png]]


Now your script is added to the actor. But, as you might expect, it's not actually doing anything just yet.  
Appuyez sur "Add Property" en bas à gauche de la fenêtre. C'est ici que nous allons créer la propriété. Dans le champ Type, soit choisissez "Quest" dans le menu, soit tapez le mot "Quest". Mettez "TutorialQuest" dans le champ Name, et laissez le reste vide.


[[Image:ScriptAdded.png]]
[[File:CKAddScriptPropertyWindow.png]]


=Properties=
Nous avons maintenant dit au script qu'il doit utiliser quelque chose qui s’appelle "TutorialQuest", mais il ne sait pas de quelle quête il s'agit. Cliquez sur la propriété que nous venons de créer dans la liste, et cliquez sur "Edit Value" à droite de la fenêtre. Un nouveau menu va apparaitre, listant toutes les quêtes du jeu. Choisissez "GSQ01" dans le menu, et appuyez sur OK.
Double-click on the script name to bring up the Properties Window for this script. On their own, scripts don't know about any objects in the game other than the one to which they're attached. We use properties to hook objects together so they can affect each other. In our example, we want to set GSQ01 to stage 20 when the thief is killed, so we need to tell the script which quest we care about.  


[[File:EmptyPropertiesWindow.png]]
[[File:CKPropertyWindowFilled.png]]


Press the "Add Property" button at the bottom left of this window. This is where we create the property. In the Type field, either choose "Quest" from the pulldown, or type in the word "Quest". Put "TutorialQuest" in the Name field, and leave everything else blank.  
=Écrire le script=
Maintenant que nous avons ajouté cette propriété, nous devons ajouter le script en lui même pour en faire quelque chose!, Faites un clic droit sur le nom du script et sélectionnez "Edit source" pour ouvrir l'éditeur de script.


[[File:AddScriptPropertyWindow.png]]
[[File:CKScriptWindowWithPropertyAdded.png]]


We've now told the script that it should care about something called "TutorialQuest," but it doesn't know which quest that is. Click on the property we just made in the list, and click "Edit Value" on the right side of the window. A new pulldown menu will appear, listing all the quests in the game. Choose "GSQ01" from this menu, and hit OK.  
La première ligne (<code>Scriptname GSQThiefScript extends ObjectReference</code>) est la base que l'éditeur a fait pour nous quand nous avons créés le script. Quelques lignes en dessous se trouve la version textuelle de la propriété que nous avons fait.


[[File:PropertyWindowFilled.png]]
À la fin du texte, copiez et collez ce morceau de code:


=Writing the Script=
<nowiki>
Now that we've added this property, we should add some actual script to do something with it! Right-click on the script name and select "Edit Source" to bring up the script editor.
 
[[File:ScriptWindowWithPropertyAdded.png]]
 
The top line (<code>Scriptname GSQThiefScript extends ObjectReference</code>) is boilerplate that the editor made for us when we created the script. A few lines below that is the textual version of the property we made.
 
At the bottom of the text, copy and paste the following snippet of code.
 
<source lang="papyrus">
Event OnDeath(Actor killer)
Event OnDeath(Actor killer)
TutorialQuest.SetStage(20)
TutorialQuest.SetStage(20)
EndEvent
EndEvent</nowiki>
</source>


If you're familiar enough with programming or scripting that what you just pasted made sense to you, feel free to skip ahead to the "Scripting the Amulet" section. For everyone else, we'll go through line by line.  
SI vous êtes suffisamment connaisseur en programmation ou en scripting pour comprendre ce que vous venez de coller, vous pouvez directement aller à la section "Scripter l'Amulette". Pour tous les autres, nous allons voir ça ligne par ligne.


* <code>Event OnDeath(Actor killer)</code>
* <code>Event OnDeath(Actor killer)</code>
** This line declares that the script will respond to the actor dying. When the actor dies, the game will start executing the code from this point. The game will put whoever killed the actor into the "killer" variable, but that part doesn't matter to us.  
** Cette ligne déclare que le script va répondre à la mort de l'acteur. Quand l'acteur meurt, le jeu va commencer à exécuter le code à partir de ce point. Le jeu va placer celui qui a tué l'acteur dans la variable "killer", mais nous n'en avons pas besoin ici.
* <code> TutorialQuest.SetStage(20)</code>
* <code> TutorialQuest.SetStage(20)</code>
** Just like when we called <code>SetStage</code> on the owning quest in the dialogue tutorial, this will set stage 20 on the quest that we set with the TutorialQuest property.  
** Tout comme nous avons appelé <code>SetStage</code> sur la quête possédant le dialogue auparavant, nous mettons ici la quête que nous avons mis dans la propriété TutoriaQuest à l'étape 20.
** We indent it for readability.  
** Nous indentons pour une question de lisibilité.
* <code>EndEvent</code>
* <code>EndEvent</code>
** This signifies the end of our handling of the death event.  
** Cela marque la fin de notre réaction à l’événement de mort.


Select "Save" from the file menu (or press Ctrl-S) and the editor will attempt to compile your script. An output window will pop up -- if your script is syntactically correct, it will look like this:  
Sélectionnez "Save" dans le menu "File" (ou faites Ctrl-S) et l'éditeur va tenter de compiler votre script. Une fenêtre de sortie va apparaitre -- si votre script est syntaxiquement correct, elle ressemblera à ça:


[[File:CompilerOutputGood.png]]
[[File:CKCompilerOutputGood.png]]


If you see anything else in there, you typed something wrong. Try again!  
Si vous voyez autre chose, vous avez fait une erreur en copiant. Réessayez!


Once you're done, close the script windows and the actor window, and save your plugin. Now it's time to script the amulet itself.  
Une fois fini, fermez la fenêtre de script et la fenêtre d'acteur, et sauvegardez votre plugin. Maintenant, nous allons scripter l'amulette elle même.


=Scripting the Amulet=
==Scripter l'Amulette==
Open up the GSQAmulet item we created in [[Bethesda_Tutorial_Creating_an_Item|the last tutorial]]. In the armor window, the scripts area is on the far right.  
Ouvrez l'objet GSQAmulet que nous avons créés dans le tutoriel précédent. Dans la fenêtre d'armure, la zone de script est toute à droite.


[[Image:ArmorWindowScriptArea.png|600px]]
[[Image:CKArmorWindowScriptArea.png|600px]]


Create a new script just like we did before, and call it GSQAmuletScript. Add a Quest property to it, but to see a nifty trick, call it "GSQ01" instead of "TutorialQuest" this time.  
Créez un nouveau script comme nous l'avons fait auparavant, et appelez-le GSQAmuletScript. Ajoutez-lui une propriété de Quête. Pour simplifier les choses, appelez-la directement "GSQ01" au lieu de TutorialQuest.


[[File:AutofilledProperty.png]]
[[File:CKAutofilledProperty.png]]


It automatically set the value of the property for you, since you gave the property a name that matches an existing ID. If you're declaring a lot of properties, this can save you a bunch of time.  
Il va remplir automatiquement la propriété pour vous, puisque la propriété a un nom qui correspond à un ID existant. Si vous utilisez beaucoup de propriétés, cela permet de gagner du temps.


Open up the script, and we're going to add an event to it. The amulet can't die (obviously), but we do want to know when the player picks it up. Our event script will look like this:  
Ouvrez le script, nous allons y ajouter quelques évènements. L'amulette ne peut évidemment pas mourir, mais nous voulons savoir quand est-ce que le joueur la prend. Notre évènement devrait ressembler à ceci :


<source lang="papyrus">
<nowiki>
Event OnContainerChanged(ObjectReference newContainer, ObjectReference oldContainer)
Event OnContainerChanged(ObjectReference newContainer, ObjectReference oldContainer)
if (newContainer == Game.GetPlayer())
if (newContainer == Game.GetPlayer())
GSQ01.SetStage(30)
GSQ01.SetStage(30)
endif
endif
EndEvent
EndEvent</nowiki>
</source>


There a few things to note in this script:
Il y a certaines choses à noter dans ce script:
* The parameters in the declaration (<code>newContainer</code> and <code>oldContainer</code>) will get filled in by the game when it tells this script to handle the event.  
* Les paramètres dans la déclaration (<code>newContainer</code> and <code>oldContainer</code>) seront automatiquement remplis par le jeu quand il demandera au script de gérer l'évènement.
* Because the OnContainerChanged event will fire whenever this object changes hands, we need to make sure we only set the stage when it's the player taking it, hence the <code>if</code>/<code>endif</code> block.  
* Comme l'évènement OnContainerChanged est lancé à chaque fois que l'objet change de main, nous devons être sûr de ne changer le stage que quand le joueur le prend, d'où le block <code>if</code>/<code>endif</code>.
* <code>Game.GetPlayer()</code> is a convenient way to get a reference to the player without needing to set a property, and <code>newContainer</code> was filled by the engine when this event fired, so we can do a comparison in the second line to make sure the item is moving into the player.  
* <code>Game.GetPlayer()</code> est un moyen simple d'avoir la référence du joueur sans avoir besoin de créer une propriété, et <code>newContainer</code> est rempli par le moteur lorsque l'évènement est lancé. On peut donc facilement comparer pour voir si l'objet est bien pris par le joueur.
* The way this script is written, SetStage will be called every time the player picks up the amulet. This doesn't matter because each quest stage can only happen once - calling SetStage(30) has no effect after the first time.
* Comme le script est actuellement, SetStage est appelé à chaque fois que le joueur prend l'amulette. Ce n'est pas un problème, car chaque étape de quête ne peut se passer qu'une seule fois --- Appeler SetStage(30) n'a aucun effet après la première fois.


This script is also good to go, then. Close the script and armor windows, and save your plugin.  
Le script est maintenant prêt. Fermez le script et la fenêtre de l'amulette, et sauvegardez votre plugin.


You can now play through the quest from start to finish, checking the console with [[ShowQuestVars|SQV]] to see its stage changing.  
Vous pouvez maintenant tester votre quête du début à la fin, en utilisant la console et SQV (<code>SQV GSQ001</code>) pour voir l'étape changer.


Players can't use the console, though, so we'll learn how to give them better feedback about the quest in the next chapter.  
Mais les joueurs ne vont pas utiliser la console, nous allons donc apprendre à leur donner de meilleures indications de leurs progrès dans le prochain chapitre.


::{|style="border-collapse: separate; border-spacing: 0; border-width: 1px; border-style: solid; border-color: #000; padding: 0"
::{|style="border-collapse: separate; border-spacing: 0; border-width: 1px; border-style: solid; border-color: #000; padding: 0"
|-
|-
|style="border-style: solid; border-width: 0"|[[Image:Protip.jpg|48px]]
|style="border-style: solid; border-width: 0"|[[Image:CKProtip.jpg|48px]]
|style="border-style: solid; border-width: 0"|The scripts for Skyrim are just text files that live in your data directory before they get compiled into bytecode. This means that if you've got a favorite text editor, you can use it to work on scripts. We've included setups for both [[Sublime Text Setup|Sublime Text]] and [[Notepad++ Setup|Notepad++]] that provide syntax highlighting, some basic autocompletion, and compilation shortcuts. If you're going to get heavily into scripting, these tools can make your life a lot easier.  
|style="border-style: solid; border-width: 0"|Les scripts dans Skyrim sont de simples fichiers textes dans votre dossier Data avant d'être compilés en bytecode. Cela signifie que si vous avez un éditeur de texte favori, vous pouvez l'utiliser pour scripter. Le wiki officiel possède quelques exemples de configuration qui permettent la coloration syntaxique, une autocomplétion basique et des raccourcis de compilation. Si vous allez scripter intensément, ces outils peuvent vraiment vous simplifier la vie.
|}
|}


 
{{Navigation|tag=Creation Kit|parent=Tutoriels|actuel=Scripter|précédent=Créer un objet|suivant=Objectifs}}
-->
 
{{Navigation|tag=Creation Kit|parent=Tutoriels|actuel=Scripter|précédent=Créer un objet|suivant=Scripter }}

Version actuelle datée du 2 août 2013 à 11:38



Tutoriel traduit du wiki officiel: Original

Résumé

Ce tutoriel va vous montrer comment utiliser les scripts pour faire avancer la quête suivant les actions du joueur. On a déjà vu comment scripter un dialogue, mais ici, nous allons voir comment attacher n'importe quel script à un acteur ou à un objet.

Vous allez apprendre:

  • Les généralités sur le fonctionnement des scripts et comment ils s'attachent aux objets dans le Creation Engine.
  • Comment répondre à un évènement dans le nouveau langage de scripts.


Papyrus

Le langage de scripts utilisé par le Creation Kit est appelé Papyrus (d'après ce qui compose les parchemins). Les scripts Papyrus sont de simples fichiers textes qui sont compilés en bytecode que le jeu exécute au runtime.

CKNewFeature.jpg Le nouveau système est similaire au TESScript, mais requière une manière de penser légèrement différente. Vous ne pouvez plus directement manipuler les objets dans le mode; il y a maintenant des thread, votre script peut alors être interrompu en fonctionnement; il est beaucoup plus script en ce qui concerne la syntaxe (e.g. parenthèses). Pour faire court, il est beaucoup plus proche de "vrais" langages de programmation comme le Lua ou Python. Si vous êtes familier avec le TESScript, vous devriez jeter un œil a notre guide de transition.

La première chose que nous allons faire est ajouter un script sur notre voleur afin que lorsqu'il est tué, la quête progresse.

Ajouter des Scripts

Ouvrez l'acteur GSQThief que nous avons créé. Nous allons nous intéresser à la section "Papyrus Scripts" de la fenêtre.

CKActorWindowScriptsArea.png

Cliquez sur le bouton "Add". Cela va ouvrir une liste de scripts que nous pouvons potentiellement ajouter à cet acteur. Mais nous sommes en train d'en créer un nouveau, double-cliquez donc sur "[New Script]" en haut de la liste.

CKAddScriptWindow.png

Cela ouvrira encore une fenêtre, où nous pouvons nommer notre script. Mettez donc "GSQThiefScript" puis appuyez sur OK.

CKAddNewScriptWindow.png

Votre script est maintenant ajouté à l'acteur. Mais, comme on peut s'y attendre, il ne fait encore rien.

CKScriptAdded.png

Propriétés

Double-cliquez sur le script pour ouvrir la fenêtre des propriétés de ce script. De base, les scripts ne savent rien à propos des objets du jeu autre que celui auquel ils sont attachés. Nous utilisons les propriétés afin d'attacher des objets ensemble pour qu'ils puissent s'affecter les uns les autres. Dans notre exemple, nous voulons passer GSQ01 à l'étape 20 lorsque le voleur est tué, il faut donc que le script sache quelle quête nous intéresse.

CKEmptyPropertiesWindow.png

Appuyez sur "Add Property" en bas à gauche de la fenêtre. C'est ici que nous allons créer la propriété. Dans le champ Type, soit choisissez "Quest" dans le menu, soit tapez le mot "Quest". Mettez "TutorialQuest" dans le champ Name, et laissez le reste vide.

CKAddScriptPropertyWindow.png

Nous avons maintenant dit au script qu'il doit utiliser quelque chose qui s’appelle "TutorialQuest", mais il ne sait pas de quelle quête il s'agit. Cliquez sur la propriété que nous venons de créer dans la liste, et cliquez sur "Edit Value" à droite de la fenêtre. Un nouveau menu va apparaitre, listant toutes les quêtes du jeu. Choisissez "GSQ01" dans le menu, et appuyez sur OK.

CKPropertyWindowFilled.png

Écrire le script

Maintenant que nous avons ajouté cette propriété, nous devons ajouter le script en lui même pour en faire quelque chose!, Faites un clic droit sur le nom du script et sélectionnez "Edit source" pour ouvrir l'éditeur de script.

CKScriptWindowWithPropertyAdded.png

La première ligne (Scriptname GSQThiefScript extends ObjectReference) est la base que l'éditeur a fait pour nous quand nous avons créés le script. Quelques lignes en dessous se trouve la version textuelle de la propriété que nous avons fait.

À la fin du texte, copiez et collez ce morceau de code:

Event OnDeath(Actor killer)
	TutorialQuest.SetStage(20)
EndEvent

SI vous êtes suffisamment connaisseur en programmation ou en scripting pour comprendre ce que vous venez de coller, vous pouvez directement aller à la section "Scripter l'Amulette". Pour tous les autres, nous allons voir ça ligne par ligne.

  • Event OnDeath(Actor killer)
    • Cette ligne déclare que le script va répondre à la mort de l'acteur. Quand l'acteur meurt, le jeu va commencer à exécuter le code à partir de ce point. Le jeu va placer celui qui a tué l'acteur dans la variable "killer", mais nous n'en avons pas besoin ici.
  • TutorialQuest.SetStage(20)
    • Tout comme nous avons appelé SetStage sur la quête possédant le dialogue auparavant, nous mettons ici la quête que nous avons mis dans la propriété TutoriaQuest à l'étape 20.
    • Nous indentons pour une question de lisibilité.
  • EndEvent
    • Cela marque la fin de notre réaction à l’événement de mort.

Sélectionnez "Save" dans le menu "File" (ou faites Ctrl-S) et l'éditeur va tenter de compiler votre script. Une fenêtre de sortie va apparaitre -- si votre script est syntaxiquement correct, elle ressemblera à ça:

CKCompilerOutputGood.png

Si vous voyez autre chose, vous avez fait une erreur en copiant. Réessayez!

Une fois fini, fermez la fenêtre de script et la fenêtre d'acteur, et sauvegardez votre plugin. Maintenant, nous allons scripter l'amulette elle même.

Scripter l'Amulette

Ouvrez l'objet GSQAmulet que nous avons créés dans le tutoriel précédent. Dans la fenêtre d'armure, la zone de script est toute à droite.

CKArmorWindowScriptArea.png

Créez un nouveau script comme nous l'avons fait auparavant, et appelez-le GSQAmuletScript. Ajoutez-lui une propriété de Quête. Pour simplifier les choses, appelez-la directement "GSQ01" au lieu de TutorialQuest.

CKAutofilledProperty.png

Il va remplir automatiquement la propriété pour vous, puisque la propriété a un nom qui correspond à un ID existant. Si vous utilisez beaucoup de propriétés, cela permet de gagner du temps.

Ouvrez le script, nous allons y ajouter quelques évènements. L'amulette ne peut évidemment pas mourir, mais nous voulons savoir quand est-ce que le joueur la prend. Notre évènement devrait ressembler à ceci :

Event OnContainerChanged(ObjectReference newContainer, ObjectReference oldContainer)
	if (newContainer == Game.GetPlayer())
		GSQ01.SetStage(30)
	endif
EndEvent

Il y a certaines choses à noter dans ce script:

  • Les paramètres dans la déclaration (newContainer and oldContainer) seront automatiquement remplis par le jeu quand il demandera au script de gérer l'évènement.
  • Comme l'évènement OnContainerChanged est lancé à chaque fois que l'objet change de main, nous devons être sûr de ne changer le stage que quand le joueur le prend, d'où le block if/endif.
  • Game.GetPlayer() est un moyen simple d'avoir la référence du joueur sans avoir besoin de créer une propriété, et newContainer est rempli par le moteur lorsque l'évènement est lancé. On peut donc facilement comparer pour voir si l'objet est bien pris par le joueur.
  • Comme le script est actuellement, SetStage est appelé à chaque fois que le joueur prend l'amulette. Ce n'est pas un problème, car chaque étape de quête ne peut se passer qu'une seule fois --- Appeler SetStage(30) n'a aucun effet après la première fois.

Le script est maintenant prêt. Fermez le script et la fenêtre de l'amulette, et sauvegardez votre plugin.

Vous pouvez maintenant tester votre quête du début à la fin, en utilisant la console et SQV (SQV GSQ001) pour voir l'étape changer.

Mais les joueurs ne vont pas utiliser la console, nous allons donc apprendre à leur donner de meilleures indications de leurs progrès dans le prochain chapitre.

CKProtip.jpg Les scripts dans Skyrim sont de simples fichiers textes dans votre dossier Data avant d'être compilés en bytecode. Cela signifie que si vous avez un éditeur de texte favori, vous pouvez l'utiliser pour scripter. Le wiki officiel possède quelques exemples de configuration qui permettent la coloration syntaxique, une autocomplétion basique et des raccourcis de compilation. Si vous allez scripter intensément, ces outils peuvent vraiment vous simplifier la vie.