Page 1 sur 1

[TUTORIEL] Ecriture d'une Romance

Posté : dim. 22 août 2004, 16:32
par Mathrim Cauthon
Ce tutorial a été écrit par Rastor, administrateur de RPG Dungeon. Il est destiné aux personnes ayant déjà une certaine connaissance de la conception de PNJ. Connaître les différents fichiers de dialogue des PNJ, le fonctionnement des fichiers D et l'écriture de dialogue avec WeiDU est nécessaire pour assimiler ce qui suit.
Merci à Isaya pour sa relecture attentive.

Tutorial de Romance
Par Rastor
Traduction de Mathrim Cauthon

On m'a récemment fait remarquer que beaucoup de gens avaient des idées de PNJ romançable mais qu'ils ne savaient pas par où commencer. Ils essaient de regarder les mods existants et sont submergés par le nombre de variables et de fichiers de dialogue, et ne parviennent pas à se faire une bonne idée de leur fonctionnement. La nécessité d'ajouter des flirts dans les mods d'aujourd'hui ne fait que rendre ceci encore plus complexe. Si vous vous sentez concerné(e), lisez-donc ceci !

Variables globales

Les romances de Bioware sont régies par un certain nombre de variables globales. Voici les plus basiques :

"XXXXXXMatch", "GLOBAL" : Cette variable vaut 1 si le PNJ peut romancer le joueur et 0 si ce n'est pas le cas (pour des raisons de race, de sexe, ou autre)

"XXXXXXRomanceActive", "GLOBAL" : Cette variable vaut 0 si la romance n'a pas commencé, 1 si le PNJ parle avec le joueur mais n'est pas encore amoureux(se) de lui ou d'elle, 2 si le PNJ et le joueur sont en phase de romance, et 3 si la romance s'est interrompue pour une raison ou pour une autre.

"XXXXXXRomance", "GLOBAL" : C'est un compteur de temps qui contrôle le moment où le PNJ parlera la prochaine fois au joueur. Quand il atteint 0, le jeu cherche les prérequis pour un dialogue et le PNJ commence à parler si cela lui est possible.

"Lovetalk", "LOCALS" : Ceci contrôle simplement le dialogue que le PNJ entamera la prochaine fois qu'il parlera au PJ

Il y a également un certain nombre de variables spécifiques au PNJ dans chaque romance, mais elles contrôlent plutôt des choses telles que la progression des quêtes, le fait de savoir si le PJ et le PNJ auront ou non des relations sexuelles, etc... Elles ne sont pas couvertes explicitement par ce tutorial. Si vous écrivez vos propres scripts pour vos PNJ, vous pourrez implémenter ces choses si vous le désirez.

Les Flirt Packs utilisent en général des variables similaires mais nommées différemment. Ce n'est cependant pas obligatoire.

Ecrire les dialogues

WeiDU est de loin le meilleur outil pour écrire des dialogues. Il permet entre autre d'assurer la compatibilité avec les autres mods. Maintenant, vous pouvez vous demander comment coder vos dialogues de romance. Et bien, tout d'abord, je vous recommande fortement d'écrire sur le papier votre arbre de dialogue entier (les phrases du PNJ et les répliques du PJ correspondantes). Ceci vous facilitera la vie.

Faire commencer un dialogue de romance à votre PNJ est assez semblable à n'importe quel autre dialogue. Vous devez introduire un bloc dans le script override de votre PNJ qui ressemblera à ceci :

Code : Tout sélectionner

IF

 Global("MonPNJMatch","GLOBAL",1)

 Global("MonPNJRomanceActive","GLOBAL",1)

 Global("Lovetalk","LOCALS",1)

 GlobalTimerExpired("MonPNJRomance","GLOBAL")

 !AreaType(DUNGEON) *// Aucun des PNJ de Bioware ne commence à parler dans des donjons, et je suggère que les moddeurs perpétuent cette tradition
 
 !StateCheck(Player1,STATE_SLEEPING) *// Comment le PJ pourrait-il parler s'il ne peut rien faire ?

 InParty(Myself) *// Jaheira commence certains de ses dialogues de romance quand elle est hors du groupe. Vous ne voudriez pas que votre PNJ fasse ça, n'est-ce pas ?
 
 See(Player1)

THEN

 RESPONSE #100

   IncrementGlobal("Lovetalk","LOCALS",1)

   Interact(Player1)

END
Puis, dans le fichier B de votre PNJ (vous pouvez aussi utiliser le J, mais c'est peu conventionnel), vous rajouterez le dialogue du PNJ:

Code : Tout sélectionner

IF ~Global("MonPNJRomanceActive","GLOBAL",1) Global("Lovetalk","LOCALS",2) Global("MonPNJMatch","GLOBAL",1) GlobalTimerExpired("MonPNJRomance","GLOBAL")~ THEN BEGIN RomanceTalk1

  SAY ~blah blah blah~ // Vous écrirez ici les premiers mots du PNJ dans le dialogue

  IF ~~ THEN REPLY ~blah~ DO ~RealSetGlobalTimer("MonPNJRomance","GLOBAL",30)~ /* Vous pouvez donner la valeur que vous voulez au compteur. */ THEN GOTO LigneSuivante

  IF ~~ THEN REPLY ~blah2~ DO ~RealSetGlobalTimer("MonPNJRomance","GLOBAL",30)~ THEN GOTO LigneSuivante2

END
C'est le schéma basique pour les dialogues de romance. Tout ce qui n'appartient pas au texte de haut-niveau (c'est à dire tout ce qui ne correspond pas au début d'un dialogue) est fait en utilisant les techniques de base de WeiDU. Changez simplement le nom des variables pour votre propre romance.

Flirtpacks

Bien que les flirtpacks ne soient absolument pas nécessaires pour un PNJ romançable, beaucoup de moddeurs décident d'en inclure car la plupart des PNJ récents en possèdent. Donc, comment pouvez-vous les coder ? En fait, ce n'est pas très différent des romances.

Dans le script override du PNJ:

Code : Tout sélectionner

IF

 Global("MonPNJRomanceActive","GLOBAL",1)

 GlobalTimerExpired("Flirt","LOCALS") // Cette variable peut être locale ou globale. Cela ne change pas grand chose.

 See(Player1)

 InParty(Myself)

 !StateCheck(Player1,STATE_SLEEPING)

THEN

 RESPONSE #100

  StartDialogue(Player1)

END
Beaucoup de moddeurs utilisent un compteur pour mesurer le nombre de fois où un joueur flirte avec le PNJ. Même si vous êtes certainement capable de faire ça, ce n'est pas particulièrement nécessaire. Vous pouvez cependant en avoir envie pour mesurer à quel point le PJ se montre affectueux avec le PNJ. Ce peut être utile si vous désirez d'inclure des dialogues spéciaux pour les joueurs les plus affectueux.

Vous utiliserez la même technique pour coder les lignes du PNJ que dans le dialogue de romance, mais vous les placerez cette fois-ci dans le fichier J. Les dialogues de romance et de flirt doivent aller dans des fichiers différents.

Pour les flirts initiés par le PJ, tout ce que vous avez à mettre dans le fichier J du PNJ est un bloc de dialogue qui commence par:

Code : Tout sélectionner

IF ~IsGabber(Player1)~ THEN BEGIN FlirtSelection.
Possibilités Avancées

Vous avez pu vous rendre compte que vous ne savez faire qu'une partie de ce qui peut être (et est souvent) créé dans une romance de PNJ. Les flirts peuvent avoir des options aléatoires, certains dialogues peuvent n'avoir lieu qu'au moment où le PJ se repose, des rencontres ou des combats peuvent se déclencher à un certain stade de la romance, etc... Ceci implique des scripts plus complexes, et je vous déconseille ce genre de chose si vous n'avez aucune connaissance sur les scripts.

Scripts de Repos

Tous les PNJ ont des scripts que le jeu vérifie lorsque le groupe se repose. Leur nom est indiqué dans le fichier pdialog.2da, mais ils sont généralement de la forme XXXXXD.BCS, où XXXXX est le nom abrégé du PNJ. Afin de déclencher un script au moment du repos, il vous suffit d'écrire dans ce fichier le code nécessaire au lancement d'un dialogue de romance. Utilisez le script que j'ai fourni plus tôt comme exemple, en changeant les variables si nécessaire.

Pour des dialogues ayant lieu le matin suivant, ajoutez " PartyRested() " dans le bloc approprié du script override.

Par exemple:

(matin suivant)

Code : Tout sélectionner

IF

 Global("MonPNJRomanceActive","GLOBAL",2)

 Global("Lovetalk","LOCALS",19)

 GlobalTimerExpired("MonPNJRomance","GLOBAL)

 PartyRested()

 InParty(Myself)

 See(Player1)

THEN

 RESPONSE #100

  IncrementGlobal("Lovetalk","LOCALS",1)

  Interact(Player1)

END
Avant de s'endormir, à ajouter dans XXXXXD.BCS :

Code : Tout sélectionner

IF

 Global("MonPNJRomanceActive","GLOBAL",2)

 Global("Lovetalk","LOCALS",17)

 InParty(Myself)

 See(Player1)

THEN

 RESPONSE #100

  IncrementGlobal("Lovetalk","LOCALS",1)

  Interact(Player1)

END
Flirts Aléatoires

Pour faire ceci, vous aurez besoin d'utiliser le déclencheur de script RandomNum(x,y). Reportez-vous à l'<a href=\'http://iesdp.gibberlings3.net/\' target=\'_blank\'>IESDP</a> pour plus d'information sur ce déclencheur. Vous l'ajouterez dans les lignes REPLY des flirts initiés par le joueur, ou dans les sections GOTO des flirts initiés par le PNJ.

Un exemple provenant de Cailean, gracieusement fourni par Kismet:

Code : Tout sélectionner

APPEND FWCailej
 
 // Cailean commence le flirt
 IF ~Global("FWCaiDisableFlirts","GLOBAL",0)
 See(Player1)
 !StateCheck(Player1,STATE_SLEEPING)
 CombatCounter(0)
 Global("FWCaileanRomanceActive","GLOBAL",1)
 Global("FWCaileanStartFlirt","GLOBAL",1)~ THEN BEGIN CaileanInitFlirts
 SAY ~Maintenant je vais commencer un nouveau flirt.~
 IF ~~ THEN DO ~IncrementGlobal("FWCaileanRandFlirt","LOCALS",1)~ GOTO CaileanInitHand
 IF ~RandomNum(2,1)~ THEN DO ~IncrementGlobal("FWCaileanRandFlirt","LOCALS",1)~ GOTO CaileanInitKiss
 IF ~RandomNum(2,2)~ THEN DO ~IncrementGlobal("FWCaileanRandFlirt","LOCALS",1)~ GOTO CaileanInitTickle
 END
 
 IF ~~ THEN BEGIN CaileanInitHand
 SAY ~(Cailean prend une de vos mains entre les siennes.)~ 
 IF ~~ THEN EXIT
 END
 
 IF ~~ THEN BEGIN CaileanInitKiss
 SAY ~(Cailean vous donne un bisou sur la joue.)~
 IF ~~ THEN EXIT
 END
 
 IF ~~ THEN BEGIN CaileanInitTickle
 SAY ~(Cailean vous chatouille les hanches.)~
 IF ~~ THEN EXIT
 END
 
 // Flirts initiés par le PJ
 IF ~IsGabber(Player1)
 CombatCounter(0)
 GlobalGT("FWCaiInitLoveTalk","GLOBAL",6)
 Global("FWCaileanQuestCompleted","GLOBAL",1)
 Global("FWCaileanRomanceActive","GLOBAL",1)~ THEN BEGIN CaiFlirtBaseEarly
 SAY ~(Cailean se rend compte de votre approche.)~
 + ~RandomNum(4,1)~ + ~(Tenir la main de Cailean.)~ DO ~IncrementGlobal("FWCaileanFlirtCount","LOCALS",1)~ + HandHold1
 + ~RandomNum(4,2)~ + ~(Tenir la main de Cailean.)~ DO ~IncrementGlobal("FWCaileanFlirtCount","LOCALS",1)~ + HandHold2
 + ~RandomNum(4,3)~ + ~(Tenir la main de Cailean.)~ DO ~IncrementGlobal("FWCaileanFlirtCount","LOCALS",1)~ + HandHold3
 + ~RandomNum(4,4)~ + ~(Tenir la main de Cailean.)~ DO ~IncrementGlobal("FWCaileanFlirtCount","LOCALS",1)~ + HandHold1
 
 + ~RandomNum(4,1)~ + ~(Embrasser Cailean.)~ DO ~IncrementGlobal("FWCaileanFlirtCount","LOCALS",1)~ + Kiss1
 + ~RandomNum(4,2)~ + ~(Embrasser Cailean.)~ DO ~IncrementGlobal("FWCaileanFlirtCount","LOCALS",1)~ + Kiss2
 + ~RandomNum(4,3)~ + ~(Embrasser Cailean.)~ DO ~IncrementGlobal("FWCaileanFlirtCount","LOCALS",1)~ + Kiss3
 + ~RandomNum(4,4)~ + ~(Embrasser Cailean.)~ DO ~IncrementGlobal("FWCaileanFlirtCount","LOCALS",1)~ + Kiss4
 ++ ~Cailean, je t'aime beaucoup, mais cesse de flirter avec moi s'il te plaît.~ DO ~SetGlobal("FWCaiDisableFlirts","GLOBAL",1)~ EXIT
 ++ ~(Ne rien dire.)~ EXIT
 END
 
 IF ~~ THEN BEGIN HandHold1
 SAY ~Cailean prend votre main 1.~
 IF ~~ THEN EXIT
 END
 
 IF ~~ THEN BEGIN HandHold2
 SAY ~Cailean prend votre main 2.~
 IF ~~ THEN EXIT
 END
 
 IF ~~ THEN BEGIN HandHold3
 SAY ~Cailean prend votre main 3.~
 IF ~~ THEN EXIT
 END
 
 IF ~~ THEN BEGIN Kiss1
 SAY ~Cailean vous embrasse 1.~
 = ~C'est vraiment un long baiser.~
 IF ~~ THEN EXIT
 END
 
 IF ~~ THEN BEGIN Kiss2
 SAY ~Cailean vous embrasse 2.~
 IF ~~ THEN EXIT
 END
 
 IF ~~ THEN BEGIN Kiss3
 SAY ~Cailean vous demande pourquoi vous l'embrassez.~
 ++ ~Réponse 1.~ + Kiss3_1
 ++ ~Réponse 2.~ + Kiss3_2
 ++ ~Réponse 3.~ + Kiss3_3
 END
 
 IF ~~ THEN BEGIN Kiss3_1
 SAY ~Cailean vous embrasse 3_1~
 IF ~~ THEN EXIT
 END
 
 IF ~~ THEN BEGIN Kiss3_2
 SAY ~Cailean vous embrasse 3_2~
 IF ~~ THEN EXIT
 END
 
 IF ~~ THEN BEGIN Kiss3_3
 SAY ~Cailean vous embrasse 3_3.~
 IF ~~ THEN EXIT
 END
 
 IF ~~ THEN BEGIN Kiss4
 SAY ~(Cailean vous embrasse 4.)~
 IF ~~ THEN EXIT
 END
 END
Quêtes, Combats et Autres

Ce guide ne parle que de l'écriture de romance. Pour les quêtes et les combats, écrivez-les dans le script override de votre PNJ, mais ce sera pour une autre fois.

Posté : mer. 01 sept. 2004, 12:21
par Prince Arthas
*Une larme d'émerveillement coule sur la joue décharnée du chevalier de la mort* :snif: :snif:

Eh ben là ! Je ne sais pas quoi dire ! Pile ce qu'il me fallait et en français en plus !!!
Ahh cher Mathrim mon cher Mathrim !!! :k:

Je demanderais à mes goules et abominations de chanter une louange en ton honneur !!! :happy:

Posté : mer. 01 sept. 2004, 18:52
par Mathrim Cauthon
Attention, il va quand même falloir mettre ça en pratique :p

Posté : jeu. 02 sept. 2004, 17:26
par Prince Arthas
Hum ! Sympa de casser ma joie et mon allégresse bon enfant !!! :p

Je me vengerai !!! Sois maudit jusqu'à la 12ème génération ! :diable: