Creation Kit : Finitions

De Wiwiki
Aller à la navigation Aller à la recherche


Résumé

Ce tutoriel va s'attarder sur les finitions à apporter pour l'histoire de Bendu Olo et son amulette perdue.

Ce dernier tutoriel va être moins détaillé et suppose que vous avez lu les précédent tutoriels de cette série. Si vous avez besoin, n'hésitez pas à relire les chapitres précédents.

Vous allez apprendre :

  • Ce qui a été mal fait
  • Comment le réparer


Problèmes

Il subsiste plusieurs problèmes dans la quête comme nous l'avons créer.

  1. Bendu peut être tuer après que le joueur a accepté la quête, cela rendrait impossible de la compléter.
  2. Nous n'avons pas ajouté de marqueurs de carte quand Bendu dit au joueur où aller.
  3. Il est possible pour le joueur de voler l'amulette sans tuer le voleur. Cela avancerai la quête mais laisserai des objectifs non-complétés
  4. Le joueur pourrait trouver et tuer le voleur avant d'avoir rencontrer Bendu, cela ferait avancer la quête sans l'avoir acceptée avant
  5. Bendu ne prend pas l'amulette du joueur à la fin de la quête
  6. Le joueur peut lâcher l'amulette et la perdre. Bien que de sa faute, il faudrait remédier à cela.
  7. Si le joueur choisit de ne pas aider Bendu, il ne se souviendra pas d'avoir rencontrer le joueur avant, un peu étrange non ?
  8. Bendu n'a que des "bonjour" et "au revoir" génériques plutôt que d'en avoir liés à son histoire.

Nous allons passer en revue ces problèmes un à un, certains ayant plusieurs solutions avec leurs avantages et inconvénients.


Tuer Bendu

Il y a deux options pour gérer la possible mort de Bendu : soit on stop la quête pour qu'elle ne gène plus le joueur, soit nous faisons en sorte que Bendu ne puisse pas mourir. Les deux options ont leurs avantages et inconvénients (si Bendu est un personnage que nous voulons utiliser plus tard, il serait plus facile de le rendre invincible par exemple).


Gérer la mort

Nous avons déjà montrer comment compléter un quête à une certaine étape (avec la box "Complete Quest"). Quand cette étape est atteinte, la quête se déplace dans la partie inactive du journal de quête et le message "Complétée : <nom de la quête>" va s'afficher. Échouer dans la quête aura un effet similaire mais le joueur verra "Echec" à la place.

Créez une nouvelle étape et numérotez la 200. Créez une entrée ("log entry") avec comme texte :

"J'ai échoué à rendre l'amulette à Bendu Olo".

Cochez la case "Fail Quest" en dessous.

Deuxièmement, nous avons besoin de faire avancer la quête à ce stage lorsque Bendu meurt. Attachez lui un script (comme nous l'avons fait pour le voleur) et appelez le GSQBenduOloScript. Maintenant le code du script, après la première ligne "Scriptname" :

Quest Property GSQ01 auto

Event OnDeath(Actor akKiller)
	if (!GSQ01.IsCompleted())
		GSQ01.SetStage(200)
	endif
EndEvent

Note: il faut tester si la quête a déjà été complétée car il ne faudrait pas que le joueur échoue alors qu'il l'a déjà terminée.

Vous pouvez "auto-fill" les propriétés de votre quête GSQ01.


Bendu l'immortel

L'autre possibilité est de rendre Bendu immortel (si le joueur l'attaque, il va juste tomber au sol puis se relever quand le combat est terminé).

Ceci est très facile à faire. Ouvrez la fenêtre d'acteur pour GSQBenduOlo et cliquez sur "Essential" en dessous du nom ("Protected" est un état similaire mais autorise le joueur et seulement lui, à tuer le personnage).


Map Marker

En général, lorsqu'un personnage demande au joueur d'aller à un endroit dans le jeu, on ajoute un marqueur sur la carte pour rendre le trajet plus facile à suivre. Naviguez dans la cellule nommée "ReachwindEyrieExterior01" dans la catégorie "Tamriel" (vous pouvez vous y rendre facilement en double-cliquant sur le marqueur de porte jaune dans ReachwindEyrie01).

Vous allez voir un rectangle bleu-vert avec un grand M dessus, juste à côté du marqueur de porte.

600px-ReachwindMapMarker.png

Ouvrez votre quête GSQ01 et cliquez sur l'onglet de script. Cliquez sur le script déjà présent et cliquez sur "Add property". Dans la case Type, sélectionnez "ObjectReference" et nommez le "DungeonMarker". Cliquez sur OK puis cliquez sur "Edit Value". Cliquez sur "Pick reference in Render window" et selectionez le marqueur de carte dans la fenêtre de rendu comme cible de la propriété.


Maintenant éditez le script de l'étape 10 comme suit :

SetObjectiveDisplayed(10)

DungeonMarker.AddToMap()

Le pickpocket

Rappelez-vous le script que l'on a attaché à l'amulette pour faire avancer la quête quand le joueur la prend :

Quest Property GSQ01  Auto  

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

Cela fait en sorte que lorsque le joueur récupère l'amulette, la quête avance à l'étape 30. Si cela arrive sans que le voleur ne soit tuer, l'étape 20 n'aura jamais été complétée et l'objectif "Rendre l'amulette à Bendu" s'affichera sans que le joueur n'est complété l'étape précédente.

Le meilleur moyen de gérer cela est d'ajouter dans le script de l'étape 30 un élément pour vérifier que l'étape 20 a été complétée et gérer les objectifs proprement. L'ancien script ressemble à ceci :

SetObjectiveCompleted(20)
SetObjectiveDisplayed(30)

Nous allons le changer pour qu'il ressemble à cela :

if (!GetStageDone(20))
	SetObjectiveDisplayed(10, False)
endif

SetObjectiveCompleted(20)
SetObjectiveDisplayed(30)

La seconde ligne du code permet à l'objectif de ne pas s'afficher, il va donc juste disparaitre du journal de quête.

Bien sûr, on pourrait aussi simplement ne pas avoir l'objectif "Tuer le voleur" et juste demander au joueur de retrouver l'amulette. C'est certainement une meilleure solution puisqu'il permet au joueur de jouer comme il l'entend.

Si le joueur tue le voleur après lui avoir volé l'amulette, il va recevoir un nouvel objectif, celui de retrouver l'amulette qu'il possède déjà, laissant deux objectifs actifs.

Pour résoudre ce problème, il faut éditer le script que l'on a donné au [[1]] :

Event OnDeath(Actor killer)
	if (TutorialQuest.GetStage() < 30)
		TutorialQuest.SetStage(20)
	endif
EndEvent

Cela va vérifier si l'étape de la quête est en dessous de 30 avant de mettre l'étape à 20. Si le joueur a déjà voler l'amulette, mettant la quête à 30, alors tuer le voleur ne la remettra pas à 20.

Hors de propos

Un plus gros problème survient sur le joueur s'aventure à Reachwind Eyrie sans avoir rencontré notre ami Bendu. Cela compléterai l'objectif 20 (qui n'apparait pas dans le journal) et afficherai l'objectif 30, soit ramener l'amulette à Bendu Olo. Le joueur pourrait alors se demander "Hein ? Qui ? Quoi ? Je n'ai jamais rencontré ce type!" Et aucune entrée de journal n'apparaitra jusqu'à ce que la quête soit terminée.

Encore une fois, plusieurs options s'offre à nous :

  1. Ne pas placer l'amulette dans l'inventaire du voleur mais la placer ailleurs dans le monde (comme un coffre inaccessible). Puis, quand le joueur accepte la quête, faire revivre le voleur et lui donner l'amulette.
  2. Mettre l'amulette comme un "Death item", un objet qui n'apparaitra que lorsque le voleur sera mort (et la bonne étape de la quête atteinte), ne pouvant donc pas être volé. Puis faire réapparaitre le voleur si nécessaire une fois la quête acceptée.
  3. Autoriser le joueur à tuer le voleur plus tôt, mais remplacer la phrase pour aider Bendu par "Vous voulez dire... CETTE amulette ?!" et terminer la quête ici.
  4. Laisser tout comme il est mais ne faire apparaitre le voleur que lorsque la quête est commencée. Le joueur n'aura donc pas la possibilité de le tuer et de prendre l'amulette avant.

Pour notre scénario, la dernière option est de loin la plus simple et la plus pratique mais les autres sont données pour illustrer les différentes logiques qui peuvent être appliquées et utilisées dans certains cas.

Pour faire disparaitre le voleur, double-cliquez sur la référence que nous avons placée dans ReachwindEyrie01. Cela va faire apparaitre la "Reference Window".

300px-ReferenceWindow.png

Cliquez ensuite sur "Initially Disabled" et puis cliquez sur OK. Le voleur ne sera alors pas dans le donjon lorsque l'on commence le jeu.

Avant d'aller plus loin, ouvrez l'alias du voleur. Cliquez sur "Allow Disabled" en haut à droite. Cela va autoriser l'alias a être lié à une référence absente.

AllowDisabled.png

Techniquement, pour une "Specific Reference" comme les alias, on pourrait s'en sortir sans cocher cette case, mais c'est une bonne habitude à prendre pour le futur !

Maintenant nous avons besoin de faire apparaitre le voleur lorsque nous avons besoin de lui. Nous allons le faire dans le script de l'étape 10. Changez le comme suit :

SetObjectiveDisplayed(10)

Alias_Thief.GetReference().Enable()

La première ligne était déjà là, mais la seconde demande quelques explications.


  • Alias_Thief : C'est la propriété l'éditeur a créé et completé pour nous. Chaque fois que l'on crée un alias, le jeu va créer une propriété dans le script de la quête nommé "Alias <nom de l'alias>". Très pratique.
  • GetReference() : C'est ici que les choses se compliquent, mais il faut retenir que l'alias n'est PAS la cible vers laquelle cela pointe. L'alias lui-même est simplement un rôle pour la quête mais la celle-ci ne sait pas si l'alias renvoit à un personnage, un mur, un coffre, etc. Pour y avoir accès, on appelle cette fonction. Si vous ne comprenez pas bien, n'ayez crainte, nous explorerons plus en profondeur les alias un peu plus tard. Pour l'instant copiez-collez le code et continuez sans crainte.
  • Enable() : Fait apparaitre la référence.

Maintenant, lorsque nous jouerons, le voleur n'apparaitra pas tant que le joueur n'aura pas accepté la quête.

Rendre l'amulette à Bendu

Jusqu'à présent, le joueur n'a ni rendu l'amulette à Bendu, ni reçu la récompense promise. Ces deux points sont facilement réparable.

Ouvrez l'onglet des "Stages" et cliquez sur l'étape 40. Pour l'instant le script ne contient que : SetObjectiveCompleted(30). Nous allons ajoutez un peu de logique.

La première ligne à mettre est :

Alias_Bendu.GetReference().AddItem(Alias_Amulet.GetReference())

Notez qu'avec AddItem, vous pouvez ajoutez un objet de base (base object), dans ce cas une nouvelle référence sortie de nulle part va se créer dans l'inventaire du personnage, ou ajoutez une référence. Dans ce dernier cas, la référence va bouger de l'endroit où elle se trouve jusqu'à l'inventaire du personnage. Cette ligne va donc prendre l'amulette de l'inventaire du joueur pour la donner Bendu.

Maintenant reste le problème de l'or. On ajoute de l'or de la même façon qu'un autre objet, mais cela veut dire que l'on va devoir créer une propriété dans le script de la quête pour cibler cet or.

Cliquez sur le bouton "Properties" de l'onglet script et vous allez voir un alias nouvellement crée dans la liste. Ajoutez une nouvelle propriété du type "MiscObject" et nommez le "Gold001", vous pouvez utiliser le bouton "Auto-fill" et ça devrait être bon.

Maintenant que nous avons cette propriété, vous pouvez ajouter la ligne :

Game.GetPlayer().AddItem(Gold001, 500)

(Notez que si vous ne donnez pas à AddItem un chiffre, il va supposer que l'on ne veut ajouter qu'une pièce).

Bendu a promis au joueur le double de ce que vaut l'amulette, donc nous donnons 500 pièces d'or. Mais, si jamais nous changeons la valeur de l'amulette pour n'importe quelle raison, il ne faudra pas oublier de revenir changer la somme donnée par Bendu. Mais nous pouvons être plus malin :

Game.GetPlayer().AddItem(Gold001, Alias_Amulet.GetReference().GetGoldValue() * 2)

Avec ça, le script va automatiquement multiplier par deux la valeur de l'amulette et donnez la somme au joueur.

Notez que l'on fait apparaitre cet or de nulle part plutôt que de le prendre de l'inventaire de Bendu. C'est une légère entorse au réalisme qui est utilisée pour les récompenses de quête, empêchant les joueurs de les prendre trop facilement par vol ou meurtre par exemple.

Lâcher l'amulette

Les joueurs des Elder Scrolls ont tendance à être des entasseurs. Ils prennent tout ce qu'ils trouvent jusqu'à être trop encombrés puis lâche dans la nature ce qui leur apparait peu important. Peut-être certains voudront-ils utiliser l'amulette pour décorer leur maison ou vont juste la lâcher derrière eux, espérant que ça divertira le géant qui les poursuit. (Spoiler : ça ne marchera pas.).

Il y a des tonnes de raison pour qu'un joueur lâche un objet, mais cela peut mener à quelques problèmes si il retourne voir Bendu et ne se rappelle plus où ils ont lâché l'amulette !

On pourrait faire beaucoup de choses pour gérer ce cas (changer l'objectif pour retrouver l'amulette où elle a été perdue, insérer un "radiant" pour que quelqu'un la ramène au joueur, etc.). Vous pouvez normalement faire au moins la première solution désormais !

Mais le plus simple et le plus sûr est de faire de l'amulette un objet de quête. Cela empêche le joueur de sortir l'objet de l'inventaire en le lâchant ou vendant. Comme ça, l'amulette restera à jamais dans son inventaire jusqu'à ce qu'il la ramène à Bendu.

Il suffit pour cela de cocher la case "Quest Object" dans les propriétés de l'alias "Amulette".

QuestObjectFlag.png


Revenir plus tard

Il reste ensuite le problème du joueur revenant plus tard vers Bendu et celui-ci n'ayant pas souvenir d'avoir rencontré le joueur précédemment, va ressortir son histoire en entier. Dans notre exemple, ce n'est qu'une simple ligne donc pas trop grave mais si on avait un discours plus fourni de questions-réponses menant à la quête, le joueur aimerait pouvoir passer tout le blabla de nouveau. On va donc ajouter un option pour gérer le refus du joueur pour qu'il puisse revenir plus tard.

La première chose à faire est d'ajouter une nouvelle étape à la quête, l'étape 5. On n'a pas a ajouté de nouvelle entrée au journal, ce n'est que pour un usage "interne".

Si le joueur refuse la quête, ajoutez une ligne pour mettre la quête à l'étape 5 (regardez dans le topic "oui" pour retrouver comment faire).

Maintenant la partie amusante. Ouvrez le topic initial, pas l'info, GSQ01MeetingBenduBranchTopic. Vous devriez avoir cette fenêtre :

500px-TopicWindowRedux2.png

Cliquez avec le bouton droit sur l'info surlignée en bleu et sélectionnez "copy". Cela va créer un double de l'info et, si elle a un script, la nouvelle info aura son propre script (on peut donc changer son script sans affecter l'autre info). Si la première avait des connections, la seconde aura les même, etc.

Quand le système de dialogue arrive à un topic (par exemple, quand le joueur choisi : "Vous avez besoin d'aide?"), il commence par le premier de la liste des info et continue en descendant pour choisir celui qui a les bonnes conditions. C'est comme ça qu'on peut avoir plusieurs personnages répondant au même sujet de façon différentes (en utilisant différentes conditions avec GetIsID), ou, dans notre cas, faire dire des choses différentes à notre personnages selon les étapes de la quête.

Ouvrez la première info et changez son GetStage de "< 10" à "== 5". Maintenant la première fois que le joueur choisira ce sujet, le jeu va regarder la première info, voir que la condition est invalide (puisque l'étape de la quête est à 0), et passer à la suivante qui elle est valide.

Changez le texte de la réponse par quelque chose qui convient pour un joueur prenant son temps pour aider, comme par exemple : "Je vous ai déjà parlé de mon amulette. Allez vous m'aidez ou non?".

On peut aussi remplir la case "Prompt" en haut de la fenêtre. Si cette case est remplie, le texte qui est passera avant le texte du sujet. Avec ça on peut avoir un rendu plus cohérent.

Essayez en remplissant la case "Prompt" avec : "N'aviez pas besoin d'aide ?"

Un dernier ajustement : dans Skyrim a été introduit la possibilité pour un joueur de quitter la conversation d'eux-même à n'importe quel moment, sans avoir besoin de choisir une option de dialogue. Dans certains dialogue cependant, s'en aller est un choix et le personnage devrait répondre à cela (c'est très important quand un garde essaie d'arrêter le joueur par exemple).

Dans notre cas, on veut que Bendu traite le joueur qui s'en va de la même façon qu'il le fait si le joueur choisi l'option "Non".

Ouvrez l'autre info, celle sans "Prompt". En haut à droite, vous allez voir une liste d'autres sujets avec lesquels celui-ci est lié.

In our case, we'd want Bendu to treat the player walking away the same as he would if the player actively said "No."

600px-TopicInfoLinkHighlight.png

Quand on lie quelque chose dans la fenêtre de dialogue, cela s'affiche ici. En dessous, cochez la case "Walk Away" et sélectionnez le lien GSQ01MeetingBenduNo.

Si le joueur quitte la conversation quand Bendu parle, il va réagir comme si le joueur avait choisi : "Non désolé pas maintenant".


Hellos/Goodbyes

Pour l'instant, si le joueur interagit avec Bendu, il va commencer par des phrases génériques Right now when you interact with Bendu, he'll start with one of:

Ce sont les lignes écrites pour la voix type MaleDarkElf, et sert pour toutes conversations. Mais elles sont un peu répétitives et ennuyeuses. Et puis, si vous voulez enregistrez une voix pour votre mod, le personnage aura deux voix différentes (sauf si vous pensez prendre Keith Szarabajka pour enregistrer pour vous !).

On voudrait donc écrire nos propres lignes pour que Bendu fasse référence à ce qu'on a fait jusque là pour sa quête.

Ouvrez le fenêtre de notre quête et allez dans l'onglet "Misc".

600px

Cliquez droit dans le tableau Topics au centre et sélectionnez "New". Cela va ouvrir une liste de cases spéciales de sujet que le jeu utilise dans certaines conditions. Double cliquez sur "Hello" pour faire un nouveau sujet de ce type. Nommez le "GSQ01Hellos".

Cela va activer la table sur la droite, qui est presque identique à la liste des info que nous avons utilisée pour faire les dialogues. Seulement ici, toutes les infos vont être dites par le personnage quand le joueur interagit avec (mais pas en même temps bien sûr !). Comme pour les autres infos, de mauvaises conditions pourront faire que tous les personnages de Skyrim pourront dire les lignes, donc soyez prudent.

Cliquez droit et créez une nouvelle info. Quelque chose comme "Oh, êtes-vous ici pour m'aidez ?" et mettez comme conditions :

  • GetIsID GSQBenduOlo == 1
  • GetStage GSQ01 < 10

(On pourrait aussi créer un nouveau topic "hello" pour l'étape 5).

Créez deux nouveau :

  • "Avez-vous mon amulette ?"
    • GetIsID GSQBenduOlo == 1
    • GetStage GSQ01 >= 10
    • GetStage GSQ01 < 40
  • "Je ne vous remercierais jamais assez de m'avoir aidé !"
    • GetIsID GSQBenduOlo == 1
    • GetQuestCompleted GSQ01 == 1

Vous pouvez aussi faire des sujet "Goodbye", qui seront dits lorsque le joueur quitte la conversation.

Les "hellos" et "goodbyes" que nous venons d'écrire vous écraser les génériques et serons les seuls que Bendu utilisera.