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