Oyez, oyez !

Les résultats du vote sur les meilleurs RPG de tous les temps sont désormais dévoilés dans ce message !

Merci à toutes et à tous pour votre participation !

N'hésitez pas à aller commenter, ajouter des jeux auxquels vous n'auriez pas pensé...

[MOD] Mod Sheratan: pot-pourri de problèmes techniques

Rimbaud
Statut : Hors ligne

[MOD] Mod Sheratan: pot-pourri de problèmes techniques

.

Message par Rimbaud »

Bon. Toujours dans ma quête de l'infinie clarté, je crée un topic spécialement pour tous les problèmes techniques que je vais rencontrer pour mon mod, histoire de ne pas vous inonder avec une foule de topics inutiles.

Grâce à Pocket Plane Group, j'ai déjà plus de facilités pour créer mon mod. Cependant, je me pose encore la question de base qui me semble capitale: comment créer mon mod pour SoA et ToB en même temps? Exemple: j'ai crée un fichier .2da pour les capacités spéciales. Les levels vont jusqu'au 40 mais est-ce que pour autant, cela signifie que mon mod va aussi sur ToB? Quelles sont les options à cocher et dans quel logiciel dois-je aller pour installer le mod à la fois sur SoA et sur ToB? Merci d'avance
Avatar du membre
Akadis
Adepte de Grondemarteau
Araignée éclipsante
Messages : 1224
Enregistré le : lun. 28 avr. 2003, 10:58
Localisation : Bordeaux
Contact :
Statut : Hors ligne
.

Message par Akadis »

Il semblerait que le mod que tu veux faire est un mod de Kit.

Je ne suis pas un spécialiste mais il me semble que pour que le kit soit compatible, ToB il faut 2 choses :
  • comme tu l'as dit, les niveaux jusqu'à 40 dans le fichier CLAB
  • Rajouter un ligne tout à la fin de du ADD_KIT dans ton setup. Cette ligne donne la liste de l'équipement du PJ au début de ToB. (Elle sera ajoutée au 25STWEAP.2da)
Développeur du mod Akadis version disponible Beta 3.1b : envoyez moi un M. P
Responsable de la maintenance du mod
Kim
Rimbaud
Statut : Hors ligne
.

Message par Rimbaud »

Merci pour ta réponse, Deecy. Pour ToB, ça m'a l'air d'être ça en effet. Par contre non ce n'est pas un kit de classe, les capacités spéciales sont des innate abilities, qui dépendent de la race, et j'aimerais justement qu'elles augmentent avec les niveaux. Alors autant je sais faire ça ds le cadre d'un kit de classe, autant je sais créer des innate abilities, autant les faire augmenter avec les niveaux non ça je ne vois pas comment..Sinon tant pis, je me contenterai d'innate abilities fixes.

En fait, je crois que je vais faire comme deratiseur m'a dit: un kit de classe d'abord que j'incluerai dans le chara. Parce que en fait, j'aurais besoin que sa classe de rôdeur puisse utiliser les armes de guerrier avec le max de ***. Vu que c'est codé en dur, je me demande justement si c'est possible.
Avatar du membre
Vel Cheran
Aventurier
Momie majeure
Messages : 3218
Enregistré le : sam. 08 déc. 2007, 18:14
Statut : Hors ligne
.

Message par Vel Cheran »

Le moyen le plus simple serait peut-être de faire un kit de classe de guerrier avec les caractéristiques du rôdeur+celles que tu veux mettre à ton kit. Comme ça, aucune restriction de départ, tu peux faire ce que tu veux ;)
En RP, je joue Séraphine Pierrejoyeuse, dont la couleur est : #D0C07A ainsi que Frère Jordin : #FF9966
Et, il y a longtemps, j'incarnais Vel'Cheran.
Venez lire nos aventures dans l'univers d'Ambre ! :dance4:
Rimbaud
Statut : Hors ligne
.

Message par Rimbaud »

J'y ai réfléchi t'inquiète, mais il semblerait qu'un kit de guerrier exclut totalement l'icone de camouflage dans les ombres. C'est du coddage en dur, pas moyen de changer ça. :s
Avatar du membre
deratiseur
Golem de fer
Messages : 3697
Enregistré le : mer. 05 déc. 2007, 18:35
Localisation : Gap, Hautes alpes
Statut : Hors ligne
.

Message par deratiseur »

Tu peux très bien faire un kit de rôdeur et l'autoriser à monter à 5 dans les compétence d'arme. Mais ça reste quand même bien trop bourrin. (vu qu'il a des sorts de druide et des compétences qu'un guerrier n'a pas)

Pour les compétences qui augmentent à chaque lvl c'est très facile, c'est la même chose que d'augmenter la resistance au dégâts. Dans les effets de sort tu as "modifier la compétence ..."

Par exemple tu fais un sort qui augmente le camouflage de 5 et tu fait appliquer ce sort tous les 2 lvls dans ton clad.2da.

Si tu veux qu'il invoque des ombres de plus en plus puissante suivant son lvl, tu vas devoir créer chaque ombre séparément (une par lvl), et à chaque lvl tu appliques un sort innée qui :
1. enlève l'ancienne compétence d'appel d'ombre lvl x
2. ajoute la nouvelle compétence d'appel d'ombre "x+1"

Si ce n'est pas de genre de chose que tu veux faire, contacte moi sur msn, j'essaierais de t'aider.
Avatar du membre
Magnus
Araignée colossale
Messages : 517
Enregistré le : dim. 30 déc. 2007, 13:09
Statut : Hors ligne
.

Message par Magnus »

Ton message signifie-t'il que tu es en panne d'inspiration où que la romance ne s'enclenche pas?
Avatar du membre
Elzen
Grand Gourou
Nabassu
Messages : 4925
Enregistré le : mer. 22 oct. 2003, 22:22
Localisation : Pas loin...
Contact :
Statut : En ligne
.

Message par Elzen »

A mon avis, son message signifie qu'elle a envoyé trop tôt et qu'elle est en train d'éditer pour finir sa phrase :p
Elzen (mon blog, le Livre d'Argent). Statut : Plus ou moins dispo.
RP : Angus Mivert, barde bricoleur (#3CB371ma fiche).
Auteur de la Gigue des Ombres ; initiateur de feu le Projet nBg.
Supercalifragilisticexpialidocious, Kupo !!
Rimbaud
Statut : Hors ligne
.

Message par Rimbaud »

Arf, je pensais pas avoir à le remonter avant un moment, ce topic.

Voilà le problème: j'ai commencé à programmer la romance, et j'ai donc écrit un premier script ainsi que le .d correspondant.
Les voici:

#Sher.baf (extrait)

// ROMANCE / AMITIE
// Dialogue 1

IF
Global("#SherQuest1","GLOBAL",-1)
THEN
RESPONSE #100
SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
END

IF
GlobalTimerExpired("#SherTimer","LOCALS",ONE_DAY)
InParty("#Sheratan")
!StateCheck(Player1,STATE_SLEEPING)
!Detect([ENEMY])
THEN
RESPONSE #100
IncrementGlobal("#SherMatch","GLOBAL",1)
IncrementGlobal("#SherRomanceActive","GLOBAL",1)
IncrementGlobal("#SherLoveTlk","LOCALS",1)
StartDialogNoSet("#SherJ",Player1)
END


#Sher.d (extrait, l'important est en orange)

// Blocs communs
IF ~~ THEN BEGIN SyvaneBenisse
SAY @78
IF ~~ THEN DO ~SetGlobal("#SherQuest1","GLOBAL",-1)
LeaveParty()
EscapeArea()~ EXIT // Sheratan quitte la party et la zone.
END
IF ~~ THEN BEGIN Projet
SAY @79
IF ~~ THEN REPLY @80 GOTO MauvaiseIdee
IF ~~ THEN REPLY @81 GOTO Ami
END
IF ~~ THEN BEGIN MauvaiseIdee
SAY @82 = @84
IF ~~ THEN DO ~SetGlobal("#SherQuest1","GLOBAL",-1)~ EXIT
END
IF ~~ THEN BEGIN Ami
SAY @83 = @84
IF ~~ THEN DO ~SetGlobal("#SherQuest1","GLOBAL",-1)~ EXIT
END

// ROMANCE/AMITIE
// DIALOGUE 1
IF ~Global("#SherMatch","GLOBAL",1)
Global("#SherRomanceActive","GLOBAL",1)
Global("#SherLoveTlk","LOCALS",1)
GlobalTimerExpired("#SherTimer","LOCALS",ONE_DAY)~ THEN BEGIN RomanceTalk1
SAY @120
IF ~~ THEN REPLY @121 GOTO Compagnons
IF ~~ THEN REPLY @123 GOTO Compagnons
IF ~~ THEN REPLY @122 GOTO Etroit
END

Avec ceci installé, Sheratan, une fois la quête accomplie (#SherQuest1","GLOBAL",-1), a du mal à avancer, c'est le seul effet que j'ai constaté.
Je précise également que j'ai vérifié la variable avec la CLUA, et elle est bien à -1.
Et j'ajoute pour finir que j'ai regardé dans le tutorial romance de Rasthor en plus des conseils de Deecy.
Etant donné que je travaille dessus depuis hier avec 8 heures au compteur, sur ce seul premier dialogue, j'ai plus vraiment le choix que de demander de l'aide ici. Enfin tout ceci a eu le mérite de me faire assimiler le système de variables, c'est déjà ça de pris.
Avec ce modèle, ça devrait aller pour la suite.

Qu'est-ce qui cloche?

Merci de votre aide ^^

EDIT: ma souris est morte, elle fait n'importe quoi. %@*! :suicide2: :dash2:
Avatar du membre
Isaya
Adepte de Grondemarteau
Planaire
Messages : 6990
Enregistré le : mar. 22 juil. 2003, 21:03
Localisation : Plaisir
Contact :
Statut : Hors ligne
.

Message par Isaya »

Si ton personnage a du mal à avancer, c'est probablement parce que son script n'arrête pas de déclencher quelque chose en boucle.
J'ai un suspect dans ce que tu as montré, et d'ailleurs tu ne l'avais pas mis en orange. :oui: Je serais même prêt à parier dessus.

Tu dis que la quête a déclenché la mise à -1 de la variable de quête. Dans ton script, lorsque la variable #SherQuest1 est à -1, tu fais quelque chose, mais tu ne modifies pas la variable. Du coup, ton script va répéter sans arrêt l'action en question, la mise à jour du timer. Deux conséquences :
  1. Comme ton script n'arrête pas de répéter ça, ton personnage est fortement gêné dans ses actions (le fameux "stutter bug" en anglais)
  2. L'expiration de ton timer est sans cesse repoussée puisque le script n'arrête pas de réévaluer la variable de fin donc, à supposer que tu aies la patience d'attendre un jour avec un personnage qui réagit mal, tu ne seras pas récompensée puisqu'à chaque instant ton script repousse l'expiration d'un jour :oui:
Solution simple : dans le premier bloc, mets la variable à autre chose que -1 une fois que tu as programmé le timer.

Et un pas de plus de franchi dans la compréhension des variables ! ;)

Une autre petite chose (dans le dialogue et dans le script) :

GlobalTimerExpired s'utilise avec deux paramètres seulement. GlobalTimerExpired("#SherTimer","LOCALS") suffit puisque tu as précisé sa durée lors de la création. Dans l'autre cas, il y aurait un risque de ne pas mettre la même valeur des deux côtés et bonjour les incohérences.
Rimbaud
Statut : Hors ligne
.

Message par Rimbaud »

Merci Isaya! Je n'y serai pas arrivée seule là, impossible de savoir ce qui clochait (en même temps, je suis toujours au modeste grade d'apprentie ^^ ).

Donc, si j'ai bien suivi, ça donne ça (en rouge) ?

#Sher.baf (extrait)

// ROMANCE / AMITIE
// Dialogue 1

IF
Global("#SherQuest1","GLOBAL",-1)
THEN
RESPONSE #100
SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
SetGlobal("#SherQuest1","GLOBAL", 20)
END

IF
GlobalTimerExpired("#SherTimer","LOCALS")
Global("#SherQuest1","GLOBAL",20)
InParty("#Sheratan")
!StateCheck(Player1,STATE_SLEEPING)
!Detect([ENEMY])
THEN
RESPONSE #100
IncrementGlobal("#SherMatch","GLOBAL",1)
IncrementGlobal("#SherRomanceActive","GLOBAL",1)
IncrementGlobal("#SherLoveTlk","LOCALS",1)
StartDialogNoSet("#SherJ",Player1)
END


#Sher.d (extrait, l'important est en orange)

// Blocs communs
IF ~~ THEN BEGIN SyvaneBenisse
SAY @78
IF ~~ THEN DO ~SetGlobal("#SherQuest1","GLOBAL",-1)
LeaveParty()
EscapeArea()~ EXIT // Sheratan quitte la party et la zone.
END
IF ~~ THEN BEGIN Projet
SAY @79
IF ~~ THEN REPLY @80 GOTO MauvaiseIdee
IF ~~ THEN REPLY @81 GOTO Ami
END
IF ~~ THEN BEGIN MauvaiseIdee
SAY @82 = @84
IF ~~ THEN DO ~SetGlobal("#SherQuest1","GLOBAL",-1)~ EXIT
END
IF ~~ THEN BEGIN Ami
SAY @83 = @84
IF ~~ THEN DO ~SetGlobal("#SherQuest1","GLOBAL",-1)~ EXIT
END

// ROMANCE/AMITIE
// DIALOGUE 1
IF ~Global("#SherMatch","GLOBAL",1)
Global("#SherRomanceActive","GLOBAL",1)
Global("#SherLoveTlk","LOCALS",1)
GlobalTimerExpired("#SherTimer","LOCALS")~ THEN BEGIN RomanceTalk1
SAY @120
IF ~~ THEN REPLY @121 GOTO Compagnons
IF ~~ THEN REPLY @123 GOTO Compagnons
IF ~~ THEN REPLY @122 GOTO Etroit
END
Rimbaud
Statut : Hors ligne
.

Message par Rimbaud »

Un double-post pour rendre tout cela plus clair.

Donc le timer marche à la perfection: Sheratan se met bien à parler après un jour comme le stipule le 'ONE_DAY'.

Cependant, il semblerait qu'il y ait un conflit avec un autre timer, voici le bloc concerné:

#Sher.d:

// Chapitre I - Rappel de la traque de Mekhren
IF ~Global("#SMekhrenRemind","LOCALS",1)~ THEN BEGIN Rappel
SAY @100
IF ~~ THEN DO ~SetGlobalTimer("#SMekhrenTimer","LOCALS",ONE_DAY)~ EXIT
END
// Chapitre I - Rappel ignoré + 24h Sheraratan s'en va
IF ~Global("#SMekhrenRemind","LOCALS",2)~THEN BEGIN PasArmure
SAY @101
IF ~~ THEN DO ~SetGlobal("#SherQuest1","GLOBAL",-1)
LeaveParty()
EscapeArea()~ EXIT // Sheratan quitte la party et la zone.
END


#Sher.baf

IF
Global("#SherJoined","GLOBAL",2) // Premier engagement de Sheratan
THEN
RESPONSE #100
SetGlobal("#SCimetiere", "GLOBAL", -1)
SetGlobalTimer("#SMekhrenTimer","LOCALS",ONE_DAY)
SetGlobal("#SherQuest1","GLOBAL",1)
ActionOverride("#SBlaidd", StartDialog("#SKikOut","#Sheratan")
SetGlobal("#SherJoined","GLOBAL",1)
END
IF
GlobalTimerExpired("#SMekhrenTimer","LOCALS")
!Global("#SherQuest1","GLOBAL",-1)
THEN
RESPONSE #100
IncrementGlobal("#SMekhrenRemind","LOCALS",1)
StartDialogNoSet(Player1)
END


Je suis en train de me demander s'il faudrait pas remettre le compteur à zéro, ou quelque chose du même genre...En fait concrètement, au bout d'un jour après la Quête ("#SherQuest1"), Sheratan se met bien à parler mais c'est ce script qui se lance, avec la réplique @100 qui tourne en boucle. Or, ce script n'est qu'un rappel de Sheratan si la Quête n'a pas été faite (donc le "#SherQuest1"), en aucun cas il ne doit se reproduire après la réalisation de la Quête mais c'est bien la romance qui doit débuter.

Merci d'avance, Isaya.
Avatar du membre
Shinook
Ours des cavernes
Messages : 1102
Enregistré le : mar. 18 mai 2004, 17:12
Localisation : Angers
Contact :
Statut : Hors ligne
.

Message par Shinook »

Zut, ce sont des choses que j'aurais dû remarquer pourtant ! Désolé Rip' :gign:

*Un peu rouillé du modage*

Pour tes derniers messages, je dirais que le timer doit se déclencher à un moment, en raison d'une variable que tu enclenches (volontairement ou involotairement).

Or, tu as deux scripts avec des timers terminés et des variables identiques (si je ne me plante pas), et comme tu utilises la fonction StartDialogNoSet (d'ailleurs y a qu'une seule information à stipuler je crois, le "player1"), le jeu va chercher le permier dialogue qui remplit les conditions, donc pas forcément celui que tu veux.

Peut-être qu'en rajoutant ou modifiant une variable ? Mais je laisse Isaya faire avant de dire encore des bêtises... :gign:

Rimbaud
Statut : Hors ligne
.

Message par Rimbaud »

Je viens d'éditer le message précédent, vous trouverez l'edit en mauve.

En fait, il faudrait que j'installe une variable à cet endroit comme ceci? (en vert)

#Sher.baf (extrait)

// ROMANCE / AMITIE
// Dialogue 1

IF
Global("#SherRomanceActive","GLOBAL",1)
THEN
RESPONSE #100
SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
END

IF
GlobalTimerExpired("#SherTimer","LOCALS")
Global("#SherRomanceActive","GLOBAL",1)
InParty("#Sheratan")
!StateCheck(Player1,STATE_SLEEPING)
!Detect([ENEMY])
THEN
RESPONSE #100
StartDialogNoSet("#SherJ",Player1)
END


#Sher.d (extrait, l'important est en orange)

// Blocs communs
IF ~~ THEN BEGIN SyvaneBenisse
SAY @78
IF ~~ THEN DO ~SetGlobal("#SherQuest1","GLOBAL",-1)
LeaveParty()
EscapeArea()~ EXIT // Sheratan quitte la party et la zone.
END
IF ~~ THEN BEGIN Projet
SAY @79
IF ~~ THEN REPLY @80 GOTO MauvaiseIdee
IF ~~ THEN REPLY @81 GOTO Ami
END
IF ~~ THEN BEGIN MauvaiseIdee
SAY @82 = @84
IF ~~ THEN DO ~SetGlobal("#SherQuest1","GLOBAL",-1)~ EXIT
IF ~~ THEN DO ~SetGlobal("#SherRomanceActive","GLOBAL",1)~ EXIT
END
IF ~~ THEN BEGIN Ami
SAY @83 = @84
IF ~~ THEN DO ~SetGlobal("#SherQuest1","GLOBAL",-1)~ EXIT
IF ~~ THEN DO ~SetGlobal("#SherRomanceActive","GLOBAL",1)~EXIT
END

// ROMANCE/AMITIE
// DIALOGUE 1
IF ~Global("#SherRomanceActive","GLOBAL",1)
GlobalTimerExpired("#SherTimer","LOCALS")~ THEN BEGIN RomanceTalk1
SAY @120
IF ~~ THEN REPLY @121 GOTO Compagnons
IF ~~ THEN REPLY @123 GOTO Compagnons
IF ~~ THEN REPLY @122 GOTO Etroit
END
EDIT: je viens de tester, ça ne marche pas du tout, on tombe toujours sur le @100 après une journée, et il y a également conflit avec ce bloc:

#S5Flago.baf

IF
IsOverMe("#Sheratan")
Global("#SFiveFlagon","AR0500",0)
THEN
RESPONSE #100
ActionOverride("#Sheratan",StartDialogueNoSet(Player1))
SetGlobal("#SFiveFlagon","AR0500",1)
END

IF
IsOverMe("#Sheratan")
InParty("#Sheratan")
IsValidForPartyDialog("#Sheratan")
!StateCheck("#Sheratan",STATE_SLEEPING)
Global("#SFiveFlagon","AR0500",0)
THEN
RESPONSE #100
SetGlobal("#SFiveFlagon","AR0500",1)
ActionOverride("#Sheratan",StartDialogueNoSet(Player1))
END
IF
IsOverMe("#Sheratan")
InParty("#Sheratan")
IsValidForPartyDialog("#Sheratan")
!StateCheck("#Sheratan",STATE_SLEEPING)
Global("#SherQuest1","GLOBAL",100)
THEN
RESPONSE #100
ActionOverride("#Sheratan",StartDialogueNoSet(Player1))
END

#SherJ.d

// A la sortie de l'auberge
// Si Mekhren et Isabel sont morts
IF ~Global("#SherQuest1","GLOBAL",100)
Dead("#SMekhr")~ THEN BEGIN Succes
SAY @75
IF ~~ THEN REPLY @76 GOTO Projet
IF ~~ THEN REPLY @77 GOTO SyvaneBenisse
END

// A la sortie de l'auberge
// Si Mekhren et Isabel sont toujours vivants
IF ~Global("#SherQuest1","GLOBAL",100)
!Dead("#SMekhr")~ THEN BEGIN Succes
SAY @85
IF ~~ THEN REPLY @76 GOTO Projet
IF ~~ THEN REPLY @86 GOTO SyvaneBenisse
END

// Blocs communs
IF ~~ THEN BEGIN SyvaneBenisse
SAY @78
IF ~~ THEN DO ~SetGlobal("#SherQuest1","GLOBAL",-1)
LeaveParty()
EscapeArea()~ EXIT // Sheratan quitte la party et la zone.
END
IF ~~ THEN BEGIN Projet
SAY @79
IF ~~ THEN REPLY @80 GOTO MauvaiseIdee
IF ~~ THEN REPLY @81 GOTO Ami
END
IF ~~ THEN BEGIN MauvaiseIdee
SAY @82 = @84
IF ~~ THEN DO ~SetGlobal("#SherQuest1","GLOBAL",-1)~ EXIT
IF ~~ THEN DO ~SetGlobal("#SherRomanceActive","GLOBAL",1)~ EXIT
END
IF ~~ THEN BEGIN Ami
SAY @83 = @84
IF ~~ THEN DO ~SetGlobal("#SherQuest1","GLOBAL",-1)~ EXIT
IF ~~ THEN DO ~SetGlobal("#SherRomanceActive","GLOBAL",1)~EXIT
END

Ce bloc se déclenche en boucle à la sortie de l'auberge. J'ai réussi à retourner dans l'auberge et après une nuit, c'est le fameux @100 qui est apparu aussi.
Honnêtement, je n'ai plus de solution là.
Avatar du membre
Isaya
Adepte de Grondemarteau
Planaire
Messages : 6990
Enregistré le : mar. 22 juil. 2003, 21:03
Localisation : Plaisir
Contact :
Statut : Hors ligne
.

Message par Isaya »

J'ai l'impression qu'au moins une partie du problème provient du même phénomène que j'évoquais, même s'il y a peut-être une petite différence.

Code : Tout sélectionner

IF ~Global("#SMekhrenRemind","LOCALS",1)~ THEN BEGIN Rappel
SAY @100
IF ~~ THEN DO ~SetGlobalTimer("#SMekhrenTimer","LOCALS",ONE_DAY)~ EXIT
END
Dans ce bloc tu lances un timer sur la base d'une valeur de variable mais tu ne modifies pas la variable. Dès lors, quand tu réactives le dialogue, même si tu l'as fait à partir du script pour un autre raison, cette condition sur la variable #SMekhrenRemind est toujours vraie et tu risques donc de déclencher à nouveau cette réplique.

Parenthèse pour explication :

Le jeu parcourt les scripts du début jusqu'à la fin et s'arrête dès qu'une condition est vérifiée. Lorsque tu as une condition qui déclenche un événement qui doit ne doit pas se répéter, il faut t'assurer de rendre fausse définitivement, sinon tu risques soit de boucler soit de revenir dessus à un moment ou à un autre (dans le cas de combinaison avec un timer par exemple).
Tu peux consulter ce tutorial pour bien plus de détails. Il y a beaucoup de choses sur les scripts de combat qui ne t'intéresseront pas mais il y a avant tout des explications sur la façon dont le jeu les exploite.

Pour les dialogues, c'est un peu plus compliqué. En première approche, on peut considérer que le jeu opère de la même façon que pour les scripts en évaluant les conditions de déclenchement. Il faut donc faire attention à ce que les conditions de tes répliques soient mutuellement exclusives sinon tu risques d'avoir une réplique qui se répète et les autres ayant les mêmes conditions ne seront jamais exploitées.

La complication, c'est une notion de "Weight" qui peut modifier l'ordre d'évaluation des conditions. Mais c'est heureusement peu utilisé et tu n'as généralement pas besoin de t'en préoccuper pour un dialogue que tu crées de A à Z. Une autre particularité, pour un PNJ recrutable, est que certains numéros d'état (c'est ainsi qu'on appelle la valeur que WeiDU affectera automatiquement à la "variable" après le IF ~~ THEN BEGIN VariableEtat) ont un usage particulier, notamment pour l'intervention des personnages à l'arbre de vie à Suldanesalar.

Fin de la parenthèse

Pour revenir à tes soucis, j'aimerais que tu clarifies un point. Tu as plusieurs fichiers .d mais correspondent-ils chacun à un DLG différent (BEGIN ~#Sxxx~ en début de fichier .d) ?
Si tu as bien un fichier DLG par .d alors tu peux t'autoriser à avoir des conditions de déclenchement identiques d'un fichier à l'autre, puisque tu feras explicitement référence à un des fichiers DLG par la commande que tu utilises dans le script (StartDialogNotSet, Interact, ...). Sinon tu dois veiller à avoir des conditions bien différentes pour chaque réplique ("état").
A ce niveau, j'ai remarqué une utilisation risqué de la variable #SherQuest1 dans un bloc de #Sher.baf

Code : Tout sélectionner

IF
GlobalTimerExpired("#SMekhrenTimer","LOCALS")
!Global("#SherQuest1","GLOBAL",-1)
THEN
RESPONSE #100
IncrementGlobal("#SMekhrenRemind","LOCALS",1)
StartDialogNoSet(Player1)
END
Auparavant (avant la modification à 20 de la variable au déclenchement du timer), ta variable #SherQuest1 avait deux valeurs : 0 (tant que tu ne l'avais pas affectée) puis -1. Du coup, tu pouvais écrire : si elle ne vaut pas -1, je déclenche le rappel. Maintenant que tu as aussi la valeur 20, ton test sur le fait qu'elle ne vaut pas -1 devient vrai aussi après l'accomplissement de l'action qui l'a mise à 20. Comme le test sur l'expiration du timer #SMekhrenTimer reste indéfiniment vrai une fois qu'il a expiré, tu retrouves alors les conditions pour déclencher le cas #SMekhrenRemind. Du coup, quand ça provoque le dialogue, c'est à nouveau le dialogue de rappel qui apparaît (ça suppose que "l'état" de ce rappel soit avant celui des autres réplique).

Pour contourner le problème, il te suffirait de remplacer le test de différence de valeur par un test d'égalité sur la bonne valeur de #SherQuest1, à savoir 0 :
Global("#SherQuest1","GLOBAL",0)

Tu pourrais évidemment rajouter une autre variable passant à 1 pour dire "déjà fait" et que tu testerais à 0 comme condition pour déclencher ce bloc. Mais il vaut mieux éviter de multiplier les variables et exploiter plus de deux valeurs par variables :
0 avant toute opération
1 une fois que la condition est déclenché
2 une fois que tu as traité le déclenchement
Evidemment tu ne mettras jamais de test sur la valeur 2 puisqu'elle est là pour dire que tout est fini sur ce point. Si tu veux faire un traitement sur le "après" (donc la valeur 2) pour une autre réplique, il te faudra passer la variable à 3, par exemple pour éviter que ton personnage répète inlassablement "Alors heureuse ?" à CHARNAME après avoir conclu. ;)

Une dernière chose, sans importance : tu utilises la valeur -1 et c'est probablement la première fois que je vois ça. Il n'y probablement aucun problème avec ça mais c'est une valeur que tu risques de ne pas retrouver si tu consultes les variables dans une sauvegarde avec Near Infinity ou Shadow Keeper. Ils risquent de la faire apparaître comme une valeur positive supérieure à 4 milliard. C'est dû à la façon dont les valeurs négatives sont codées informatiquement.
Tu aurais donc intérêt à te restreindre aux valeurs 0, 1, 2, ... Tu y gagnerais aussi sur le fait que la progression de la valeur serait plus représentative de l'avancement que la séquence 0, -1, 20.

J'espère que cette fois-ci le problème est bien cerné.

Bon courage pour la suite.
Rimbaud
Statut : Hors ligne
.

Message par Rimbaud »

Merci Isaya, je n'ai pas le temps aujourd'hui de creuser ce script et je pars en vacances demain, donc je donnerai des nouvelles à ce sujet après le 15 mars.

Bonne soirée
Avatar du membre
Akadis
Adepte de Grondemarteau
Araignée éclipsante
Messages : 1224
Enregistré le : lun. 28 avr. 2003, 10:58
Localisation : Bordeaux
Contact :
Statut : Hors ligne
.

Message par Akadis »

Isaya a écrit : Pour contourner le problème, il te suffirait de remplacer le test de différence de valeur par un test d'égalité sur la bonne valeur de #SherQuest1, à savoir 0 :
Ce n'est pas visible dans les extraits de code qu'à donné Ripper mais cette variable sert aussi à gérer l'évolution de la quête au cours de la quelle elle reçoit les valeurs 1, 2, 3, 4, 5, 6, 11, 12, 13, 14 et 100.
Isaya a écrit : Une dernière chose, sans importance : tu utilises la valeur -1 et c'est probablement la première fois que je vois ça. Il n'y probablement aucun problème avec ça mais c'est une valeur que tu risques de ne pas retrouver si tu consultes les variables dans une sauvegarde avec Near Infinity ou Shadow Keeper. Ils risquent de la faire apparaître comme une valeur positive supérieure à 4 milliard. C'est dû à la façon dont les valeurs négatives sont codées informatiquement.
En réalité c'est moi qui utilise cette valeur -1. Je suis conscient qu'elle peut apparaitre dans un éditeur de variable 2^32 - 1 (le ^ signifie puissance) comme ça je suis sûr que je n'aurais pas des conflit avec d'autres valeurs possibles. Je utilise cette valeur à chaque fois une fois que je n'ai plus jamais besoin d'une variable.


EDIT
Isaya a écrit : Tu as plusieurs fichiers .d mais correspondent-ils chacun à un DLG différent (BEGIN ~#Sxxx~ en début de fichier .d) ?
Non il y a qu'un seul fichier dlg pour la romance, l'amitié et les quêtes.

Après vérification NI, DLTCEP, SK et la console connaissent les valeurs signées. Donc -1 y est affiché sous cette forme. Mais il existe sans doute d'autres éditeurs qui ne comportent pas forcément de la même manière. Cependant je ai utilisé la valeur -1 dans au moins 2 de mes 3 mods et je n'ai jamais eu de problèmes donc j'en déduis que le moteur du jeu gère aussi les valeurs signées.

Un des façons de résoudre le problème serait finalement de faire 3 choses
Premièrement remplacer les 5 occurrences de SetGlobal("#SherQuest1","GLOBAL",-1) par SetGlobal("#SherQuest1","GLOBAL",101)
puis de remplacer le !Global("#SherQuest1","GLOBAL",-1) par GlobalLT("#SherQuest1","GLOBAL",101)
car dans ce cas précis la solution avec le SetGlobal("#SherQuest1","GLOBAL", 20) ne fonctionne pas

Deuxièmement pour la lancer le premier Timer de romance,
dans le bloc #Sher.baf remplacer le bloc
IF
Global("#SherRomanceActive","GLOBAL",1)THEN
RESPONSE #100
SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
END
par le bloc suivant :
IF
**Global("#SherQuest1","GLOBAL",101)
**Global("#SherRomanceActive","GLOBAL",0)
THEN
**RESPONSE #100
****SetGlobal("#SherRomanceActive","GLOBAL",1)
****SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
END
En remplaçant les étoiles par des espaces.

Troisièmement
Dans le #SherJ.d
Isaya a raison pour ce bloc
// Chapitre I - Rappel de la traque de Mekhren
IF ~Global("#SMekhrenRemind","LOCALS",1)~ THEN BEGIN Rappel
SAY @100
IF ~~ THEN DO ~SetGlobalTimer("#SMekhrenTimer","LOCALS",ONE_DAY)~ EXIT
END
Il faut le modifier le fichier comme ceci :
// Chapitre I - Rappel de la traque de Mekhren
IF ~Global("#SMekhrenRemind","LOCALS",1)~ THEN BEGIN Rappel
SAY @100
IF ~~ THEN DO ~SetGlobalTimer("#SMekhrenTimer","LOCALS",ONE_DAY)
SetGlobal("#SMekhrenRemind","LOCALS",2)
~ EXIT
END

// Chapitre I - Rappel ignoré + 24h Sheraratan s'en va
IF ~Global("#SMekhrenRemind","LOCALS",3)~THEN BEGIN PasArmure
SAY @101
IF ~~ THEN DO ~SetGlobal("#SherQuest1","GLOBAL",-1)
LeaveParty()
EscapeArea()~ EXIT // Sheratan quitte la party et la zone.
END
et toujours dans le #SherJ.d, effacer les instructions
IF ~~ THEN DO SetGlobal("#SherRomanceActive","GLOBAL",1)~ EXIT
qui de toutes façons ne sont jamais exécuter.

@Ripper : il me semble qu'on avait déjà parler de ce problème, il faudra qu'on revoit ce point ^^ . Pour la durée et le type (Real ou non) de Timer je t'encourage à utiliser le fichier d'exemple que je t'ai envoyé.


EDIT2
Dans le cas présent je ne vois pas l'utilité de la variable #SherMatch, je pense qu'on peux s'en passer.
Développeur du mod Akadis version disponible Beta 3.1b : envoyez moi un M. P
Responsable de la maintenance du mod
Kim
Rimbaud
Statut : Hors ligne
.

Message par Rimbaud »

Hello, de retour parmi vous, j'ai donc appliqué la solution née de vos efforts conjugués. Messieurs, je vous confirme qu'elle marche! *fait tourner le champagne*

Reste cependant que le dialogue de romance tourne en boucle (je précise que je n'ai mis aucune variable à la fin du bloc dans le #SherJ.d qui se présente actuellement comme ceci:


// ROMANCE/AMITIE
// DIALOGUE 1
IF ~GlobalTimerExpired("#SherTimer","LOCALS")
Global("#SherRomanceActive","GLOBAL",1)~ THEN BEGIN RomanceTalk1
SAY @120
IF ~~ THEN REPLY @121 GOTO Compagnons
IF ~~ THEN REPLY @123 GOTO Compagnons
IF ~~ THEN REPLY @122 GOTO Etroit
END
IF ~~ THEN BEGIN Etroit
SAY @129
IF ~~ THEN EXIT
END
IF ~~ THEN BEGIN Compagnons
SAY @124
IF ~~ THEN REPLY @125 GOTO Mouton
IF ~~ THEN REPLY @127 GOTO Mouton
IF ~~ THEN REPLY @126 GOTO Etroit
END
IF ~~ THEN BEGIN Mouton
SAY @128 = @130
IF ~~ THEN REPLY @132 GOTO Expression
IF ~~ THEN REPLY @131 GOTO Plaisanterie
IF ~~ THEN REPLY @133 GOTO Expression
IF ~~ THEN REPLY @134 GOTO Etroit
END
IF ~~ THEN BEGIN Plaisanterie
SAY @137
IF ~~ THEN EXIT
END
IF ~~ THEN BEGIN Expression
SAY @135
IF ~~ THEN REPLY @136 GOTO Illumine
IF ~~ THEN REPLY @138 GOTO Ineptie
IF ~~ THEN REPLY @139 GOTO Songeur
END
IF ~~ THEN BEGIN Illumine
SAY @140
IF ~~ THEN REPLY @142 GOTO Ineptie
END
IF ~~ THEN BEGIN Ineptie
SAY @143
IF ~~ THEN EXIT
END
IF ~~ THEN BEGIN Songeur
SAY @141
IF ~~ THEN EXIT
END

>> Pour empêcher que cela tourne en boucle, la solution est-elle d'inclure des variables ici?

>> Deuxième question: j'ai deux soundtracks à rajouter sur ce dialogue, une musique si Charname est un homme, et une autre musique si Charname est une femme (les conditions de race, connaissant la personnalité de Sheratan, ont été abolies dans le cadre d'une romance). Il est probablement possible de changer la musique selon le sexe de Charname, non?

>> Et enfin, dernière question: j'aimerais remplacer le ONE_DAY dans le .baf par une durée moins longue. Est-ce possible, par exemple TWO_HOURS? Ou HALF_DAY? (temps du jeu).

Merci encore ^^
Avatar du membre
Isaya
Adepte de Grondemarteau
Planaire
Messages : 6990
Enregistré le : mar. 22 juil. 2003, 21:03
Localisation : Plaisir
Contact :
Statut : Hors ligne
.

Message par Isaya »

Damned, Ripper est déjà rentrée de vacances (elle avait pourtant dis 2 semaines, bon sang) et a repris ses questions. Finies les vacances pour nous aussi ! ;) J'espère que tu as bien profité.

Pour ton problème de boucle : il faut impérativement que tu ajoutes une variable de romance, en général "LoveTalk" gérée en "LOCALS" donc stockée dans le personnage et non en "GLOBAL", qui te permette de marquer la progression des dialogues. Tu dois tester les différentes valeurs de cette variable, en plus du timer et de #SherRomanceActive (à 1 ou 2 selon le degré d'avancement, 1 servant aux tous premiers échanges et passant à 2 une fois que l'intérêt est avéré). Il me semble que les autres romances testent la valeur de 2 en 2. La valeur impaire est utilisée dans le script pour déterminer ce qu'il faut faire en fonction de l'avancement (par exemple, les bandits qui menancent Jaheira, ...).

Code : Tout sélectionner

IF
	RealGlobalTimerExpired("JaheiraRomance","GLOBAL")
	!Global("JaheiraRomanceActive","GLOBAL",0)
	!Global("JaheiraRomanceActive","GLOBAL",3)
	Global("JaheiraMatch","GLOBAL",1)
	!AreaType(DUNGEON)
	See(Player1)
	CombatCounter(0)
	!See([ENEMY])
	!Range([NEUTRAL],10)
	OR(26)
		Global("LoveTalk","LOCALS",1)
		...
		Global("LoveTalk","LOCALS",65)
THEN
	RESPONSE #100
		IncrementGlobal("LoveTalk","LOCALS",1)
		PlaySong(36)
		Interact(Player1)
END
Ici le script teste différentes valeurs impaires de LoveTalk (mais pas toutes car il y a des actions particulières dans certains cas), que j'ai en partie cachées par ... pour raccourcir, et vérifie que le timer a expiré depuis le précédent dialogue. Il incrémente la variable (pour que le dialogue passe à l'étape suivante), lance la musique puis le dialogue.
Remarque : ça répond à ta question sur la musique. Il te suffit d'ajouter de dupliquer ce bloc en ajoutant un test sur le sexe de CHARNAME pour avoir la possibilité d'utiliser deux musiques différentes.

Suite au dialogue, il y a un autre bloc de script qui s'enclenche :

Code : Tout sélectionner

IF
	RealGlobalTimerExpired("JaheiraRomance","GLOBAL")
	Global("JaheiraMatch","GLOBAL",1)
	OR(30)
		Global("LoveTalk","LOCALS",2)
		...
		Global("LoveTalk","LOCALS",68)
THEN
	RESPONSE #100
		RealSetGlobalTimer("JaheiraRomance","GLOBAL",1800)
		IncrementGlobal("LoveTalk","LOCALS",1)
END
Après le dialogue, la variable est paire (puisqu'on l'a incrémentée avant le dialogue) donc on incrémente tout de suite pour éviter de repartir sur la même réplique. On relance donc un timer pour que le prochain dialogue mette un peu de temps à apparaître.

Pour les timers, il n'y a pas de valeurs inférieures à un jour qui existe sous la forme HALF_DAY ou autre. Le fichier GTIMES.IDS qui indique une correspondance entre un intitulé et une valeur en unité de temps du jeu ne descend pas en dessous de la journée. Néanmoins, tu peux indiquer un nombre qui correspond à ce que tu veux. Sachant que ONE_DAY correspond à 7200, il te suffit de calculer la valeur pour une demi-journée (3600) ou moins (300 par heure) et la valeur utilisée dans le script de Jaheira correspond donc à 1/4 jour. Mais comme il y a souvent des conditions pour déclencher les dialogues (attendre de se coucher, qu'on soit hors de souterrain, pas en combat, ...), ça prend généralement bien plus de temps.

Remarque : ces valeurs correspondent à des secondes passées dans le jeu. Deux heures (7200 s) correspondent à un jour.

Je t'invite à consulter d'autres mods de romances, en particulier des mods récents comme la romance de Nalia, pour voir comment les moddeurs s'y prennent de nos jours. Les exemples d'origine Bioware sont toujours valables en tant qu'exemple (ils présentent l'avantage qu'on connaît le déroulement et qu'on peut voir comment les auteurs s'y sont pris pour obtenir le résultat), mais il y a peut-être, notamment dans les conditions utilisées dans les scripts ou les dialogues, des évolutions. Je pense en particulier à des choses pour simplifier le test "est disponible pour parler".

Bonne continuation.
Rimbaud
Statut : Hors ligne
.

Message par Rimbaud »

Merci biench mes bons!

Eh oui j'avais dit deux semaines, mais c'était en fait 10 jours, trois fois hélas pour moi aussi!

Avec tout ça, voilà donc le .baf actuel:

// ROMANCE / AMITIE
// ETAPE 1
IF
Global("#SherQuest1","GLOBAL",101)
Global("#SherRomanceActive","GLOBAL",0)
THEN
RESPONSE #100
SetGlobal("#SherRomanceActive","GLOBAL",1)
SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
SetGlobal("#SherLoveTlk","LOCALS",1)
END
IF
GlobalTimerExpired("#SherTimer","LOCALS")
Global("#SherRomanceActive","GLOBAL",1)
InParty("#Sheratan")
!StateCheck(Player1,STATE_SLEEPING)
!Detect([ENEMY])
Global("#SherLoveTlk","LOCALS",1)
THEN
RESPONSE #100
IncrementGlobal("#SherLoveTlk","LOCALS",1)
StartDialogNoSet(Player1)
END

// ROMANCE / AMITIE
// ETAPE 2

IF
GlobalTimerExpired("#SherTimer","LOCALS")
Global("#SherRomanceActive","GLOBAL",1)
Global("SherLoveTlk","LOCALS",2)
THEN
RESPONSE #100
SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
IncrementGlobal("LoveTalk","LOCALS",1)
END

IF
InParty("#Sheratan")
Detect(Player1)
!StateCheck(Player1,STATE_SLEEPING)
!Detect([ENEMY])
GlobalTimerExpired("#SherLoveTimer","LOCALS")
Global("#SherRomanceActive","GLOBAL",1)
Global("#SherLoveTlk","LOCALS",3)
THEN
RESPONSE #100
IncrementGlobal("#SherLoveTlk","LOCALS",1)
StartDialogNoSet(Player1)
END


Je précise que le dialogue 1 fonctionne parfaitement, reste à faire une jonction correcte avec le dialogue 2 (et là je pense que, notamment le #SherLoveTlk n'est pas au point.)

Le .d est comme suit:

/ ROMANCE/AMITIE
// ETAPE 1

IF ~Global("#SherLoveTlk","LOCALS",2)~ THEN BEGIN RomanceAmitie1
SAY @120
IF ~~ THEN REPLY @121 GOTO Compagnons
IF ~~ THEN REPLY @123 GOTO Compagnons
IF ~~ THEN REPLY @122 GOTO Etroit
END
IF ~~ THEN BEGIN Etroit
SAY @129
IF ~~ THEN EXIT
END
IF ~~ THEN BEGIN Compagnons
SAY @124
.....Ect

// ROMANCE / AMITIE
// ETAPE 2

IF ~Global("#SherLoveTlk","LOCALS",4)~ THEN BEGIN RomanceAmitie2
SAY @144
IF ~~ THEN REPLY @145 GOTO Intrigue
IF ~~ THEN REPLY @146 EXIT
END
IF ~~ THEN BEGIN Intrigue
SAY @147
IF ~~ THEN REPLY @148 GOTO PointDeVue
...Ect
Avatar du membre
Akadis
Adepte de Grondemarteau
Araignée éclipsante
Messages : 1224
Enregistré le : lun. 28 avr. 2003, 10:58
Localisation : Bordeaux
Contact :
Statut : Hors ligne
.

Message par Akadis »

Il y a d'abord un bloc d'initialisation que tu as donné ci dessus :
Global("#SherQuest1","GLOBAL",101)
Global("#SherRomanceActive","GLOBAL",0)
THEN
RESPONSE #100
SetGlobal("#SherRomanceActive","GLOBAL",1)
SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
SetGlobal("#SherLoveTlk","LOCALS",1)
END
Puis tous le dialogues de romance, qu'il y en ai 2 ou 40, sont gérés par 2 blocs du même script dont e t'ai donné le code.
En tous cas, il n'y a pas un bloc par dialogue comme tu l'as fait.

Il peut en avoir quelques variantes selon la durée des timers et les conditions de déclenchements mais la majeure partie sont gérés par ces 2 blocs c'est à dire un tous les ONE_DAY et sans triggers suppémentaires.
Développeur du mod Akadis version disponible Beta 3.1b : envoyez moi un M. P
Responsable de la maintenance du mod
Kim
Rimbaud
Statut : Hors ligne
.

Message par Rimbaud »

Attention Spoil

► Afficher le texte
Avatar du membre
Isaya
Adepte de Grondemarteau
Planaire
Messages : 6990
Enregistré le : mar. 22 juil. 2003, 21:03
Localisation : Plaisir
Contact :
Statut : Hors ligne
.

Message par Isaya »

Soit tu nous as donné une version simplifiée de ton script, soit il y a un gros souci là :

Code : Tout sélectionner

IF
GlobalTimerExpired("#SherTimer","LOCALS")
Global("#SherRomanceActive","GLOBAL",1)
Global("SherLoveTlk","LOCALS",2)
THEN
RESPONSE #100
SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
IncrementGlobal("LoveTalk","LOCALS",1)
END
Tu testes "SherLoveTlk" alors que tu avais un "#" au début du nom dans les blocs précédents. Et dans les actions, tu incrémentes "LoveTalk". Autant dire que ton état suivant, à 3, de "#SherLoveTlk" ne sera jamais atteint et que ton héros va rester longtemps silencieux ! ;)
Rimbaud
Statut : Hors ligne
.

Message par Rimbaud »

Tu peux oublier cette version, écrite à 1h du matin avec un décalage horaire traînant, en plus.
ça marchait très bien avec la dernière version, mais j'ai décidé de bien distinguer la romance de l'amitié. ça donne ce script:


// DEBUT DE LA ROMANCE (SI CHARNAME EST DE SEXE FEMININ)
// BLOC DE LANCEMENT

IF
Global("#SherQuest1","GLOBAL",101)
Global("#SherRomanceActive","GLOBAL",0)
Gender(Protagonist,Female)
THEN
RESPONSE #100
SetGlobal("#SherRomanceActive","GLOBAL",1)
SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
SetGlobal("#SherLoveTlk","LOCALS",1)
END

// ROMANCE (SI CHARNAME EST DE SEXE FEMININ)
IF
InParty("#Sheratan")
Detect(Player1)
!StateCheck(Player1,STATE_SLEEPING)
!Detect([ENEMY])
Gender(Protagonist,Female)
GlobalTimerExpired("#SherTimer","LOCALS")
OR(2)
Global("#SherRomanceActive","GLOBAL",1)
Global("#SherRomanceActive","GLOBAL",2)
OR(20)
Global("#SherLoveTlk","LOCALS",1)
Global("#SherLoveTlk","LOCALS",3)
Global("#SherLoveTlk","LOCALS",5)
Global("#SherLoveTlk","LOCALS",7)
Global("#SherLoveTlk","LOCALS",9)
Global("#SherLoveTlk","LOCALS",11)
Global("#SherLoveTlk","LOCALS",13)
Global("#SherLoveTlk","LOCALS",15)
Global("#SherLoveTlk","LOCALS",17)
Global("#SherLoveTlk","LOCALS",19)
Global("#SherLoveTlk","LOCALS",21)
Global("#SherLoveTlk","LOCALS",23)
Global("#SherLoveTlk","LOCALS",25)
Global("#SherLoveTlk","LOCALS",27)
Global("#SherLoveTlk","LOCALS",29)
Global("#SherLoveTlk","LOCALS",31)
Global("#SherLoveTlk","LOCALS",33)
Global("#SherLoveTlk","LOCALS",35)
Global("#SherLoveTlk","LOCALS",37)
Global("#SherLoveTlk","LOCALS",39)
THEN
RESPONSE #100
IncrementGlobal("#SherLoveTlk","LOCALS",1)
SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
StartDialogueNoSet(Player1)
END

IF
InParty("#Sheratan")
Detect(Player1)
!StateCheck(Player1,STATE_SLEEPING)
!Detect([ENEMY])
Gender(Protagonist,Female)
GlobalTimerExpired("#SherTimer","LOCALS")
OR(2)
Global("#SherRomanceActive","GLOBAL",1)
Global("#SherRomanceActive","GLOBAL",2)
OR(20)
Global("#SherLoveTlk","LOCALS",2)
Global("#SherLoveTlk","LOCALS",4)
Global("#SherLoveTlk","LOCALS",6)
Global("#SherLoveTlk","LOCALS",8)
Global("#SherLoveTlk","LOCALS",10)
Global("#SherLoveTlk","LOCALS",12)
Global("#SherLoveTlk","LOCALS",14)
Global("#SherLoveTlk","LOCALS",16)
Global("#SherLoveTlk","LOCALS",18)
Global("#SherLoveTlk","LOCALS",20)
Global("#SherLoveTlk","LOCALS",22)
Global("#SherLoveTlk","LOCALS",24)
Global("#SherLoveTlk","LOCALS",26)
Global("#SherLoveTlk","LOCALS",28)
Global("#SherLoveTlk","LOCALS",30)
Global("#SherLoveTlk","LOCALS",32)
Global("#SherLoveTlk","LOCALS",34)
Global("#SherLoveTlk","LOCALS",36)
Global("#SherLoveTlk","LOCALS",38)
Global("#SherLoveTlk","LOCALS",40)
THEN
RESPONSE #100
IncrementGlobal("#SherLoveTlk","LOCALS",1)
SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
END

// AMITIE (SI CHARNAME EST DE SEXE MASCULIN)
// BLOC DE LANCEMENT

IF
Global("#SherQuest1","GLOBAL",101)
Global("#SherRomanceActive","GLOBAL",0)
Gender(Protagonist,Male)
THEN
RESPONSE #100
SetGlobal("#SherRomanceActive","GLOBAL",1)
SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
SetGlobal("#SherLoveTlk","LOCALS",51)
END

// AMITIE (SI CHARNAME EST DE SEXE MASCULIN)

IF
InParty("#Sheratan")
Detect(Player1)
!StateCheck(Player1,STATE_SLEEPING)
!Detect([ENEMY])
Gender(Protagonist,Male)
GlobalTimerExpired("#SherTimer","LOCALS")
OR(2)
Global("#SherRomanceActive","GLOBAL",1)
Global("#SherRomanceActive","GLOBAL",2)
OR(10)
Global("#SherLoveTlk","LOCALS",51)
Global("#SherLoveTlk","LOCALS",53)
Global("#SherLoveTlk","LOCALS",55)
Global("#SherLoveTlk","LOCALS",57)
Global("#SherLoveTlk","LOCALS",59)
Global("#SherLoveTlk","LOCALS",61)
Global("#SherLoveTlk","LOCALS",63)
Global("#SherLoveTlk","LOCALS",65)
Global("#SherLoveTlk","LOCALS",67)
Global("#SherLoveTlk","LOCALS",69)
THEN
RESPONSE #100
IncrementGlobal("#SherLoveTlk","LOCALS",1)
SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
StartDialogueNoSet(Player1)
END

IF
InParty("#Sheratan")
Detect(Player1)
!StateCheck(Player1,STATE_SLEEPING)
!Detect([ENEMY])
Gender(Protagonist,Male)
GlobalTimerExpired("#SherTimer","LOCALS")
OR(2)
Global("#SherRomanceActive","GLOBAL",1)
Global("#SherRomanceActive","GLOBAL",2)
OR(10)
Global("#SherLoveTlk","LOCALS",52)
Global("#SherLoveTlk","LOCALS",54)
Global("#SherLoveTlk","LOCALS",56)
Global("#SherLoveTlk","LOCALS",58)
Global("#SherLoveTlk","LOCALS",60)
Global("#SherLoveTlk","LOCALS",62)
Global("#SherLoveTlk","LOCALS",64)
Global("#SherLoveTlk","LOCALS",66)
Global("#SherLoveTlk","LOCALS",68)
Global("#SherLoveTlk","LOCALS",70)
THEN
RESPONSE #100
IncrementGlobal("#SherLoveTlk","LOCALS",1)
SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
END


Le .d

/ ROMANCE (SI CHARNAME EST DE SEXE FEMININ)
// ETAPE 1
IF ~Global("#SherLoveTlk","LOCALS",2)~ THEN BEGIN Romance1
SAY @120
IF ~~ THEN REPLY @121 GOTO Compagnons
IF ~~ THEN REPLY @123 GOTO Compagnons
IF ~~ THEN REPLY @122 GOTO Etroit
END
Ect...

// ROMANCE (SI CHARNAME EST DE SEXE FEMININ)
// ETAPE 2
IF ~Global("#SherLoveTlk","LOCALS",4)~ THEN BEGIN Romance2
SAY @144
IF ~~ THEN REPLY @145 GOTO Intrigue
IF ~~ THEN REPLY @146 EXIT
END
Ect...

// AMITIE (SI CHARNAME EST DE SEXE MASCULIN)
IF ~Global("#SherLoveTlk","LOCALS",52)~ THEN BEGIN Amitie
SAY @171
IF ~~ THEN EXIT
END
Ect...

// AMITIE 2
IF ~Global("#SherLoveTlk","LOCALS",54)~ THEN BEGIN Amitie2
SAY @172
IF ~~ THEN EXIT
END
Ect...



Naturellement, ça ne marche plus maintenant avec l'ajout de la variable de genre. A mon avis, je l'ai mal placé?
Normalement, si ce problème est résolu, je devrais plus avoir à vous enquiquiner. :(
Rimbaud
Statut : Hors ligne
.

Message par Rimbaud »

Double-post:

Je viens de remarquer une boulette dans ce que j'ai marqué. Je vais corriger et tester, et voir si ça marche.

>> J'ai noté la mise à jour de ma boulette en orange.
EDIT: après test avec Charname au féminin, on en revient au rappel de Sheratan qui s'impatiente car soit disant la précédente quête n'a pas été faite, alors que c'est pourtant le cas (problème de timer donc, encore). Finalement, je ne sais même pas si c'est le genre et le timer, ou juste le timer qui n'est pas bon.
Avatar du membre
Isaya
Adepte de Grondemarteau
Planaire
Messages : 6990
Enregistré le : mar. 22 juil. 2003, 21:03
Localisation : Plaisir
Contact :
Statut : Hors ligne
.

Message par Isaya »

On croirait une débutante du forum. Tu arrives et tu dis "ça marche pas", sans penser à préciser ce qui se passe et ce que tu attends. Ah la la... *soupir* ;)

Je vois surtout un risque dans ton dialogue car tu n'utilises pas des préfixes ou suffixes pour les noms des blocs IF THEN BEGIN selon qu'il s'agit du cas homme ou femme. Amitie et Amitie2 pourraient aussi apparaître dans les répliques pour perso féminin et alors je ne sais pas comment WeiDU va faire le lien.

En attendant des précisions, j'ai une remarque. Tu utilises des valeurs complètement différentes de #SherLoveTlk pour distinguer la romance masculine ou féminine. Dès lors, tu n'as besoin de la vérification du sexe que pour fixer la variable la toute première fois. Ensuite, les tests de valeurs suffiront donc tu pourrais te passer du test sur le sexe dans les tests qui impliquant la variable #SherLoveTlk.

Tu pourrais aussi procéder différemment pour la gestion du sexe. Si tu prévois le même nombre de dialogues et des événements identiques (qui ne nécessite pas une gestion spécifique dans le script), tu pourrais te passer de plages de valeurs différentes de #SherLoveTlk. Il te suffirait d'ajouter le test du sexe en plus du test de la variable #SherLoveTlk dans les conditions de déclenchement des répliques dans le dialogue.
Sinon tu aurais peut-être intérêt à utiliser une séparation plus élevée que 51 pour les plages de valeurs. Beaucoup de romances vont au delà de ce chiffre. Si tu veux ajouter quelque chose par la suite tu seras gênée. Tu pourrais par exemple utiliser le préfixe du numéro INSEE, 1 ou 2, en indicateur de centaine, donc 101-199 et 201-299.

>>
Ajout :
Je viens de voir tes modifications successives. C'était donc le nombre de cas dans les OR(xx).

En ce qui concerne le retour de la réplique de rappel, il y a de fortes chances que le problème vienne du fichier dialogue. Si le script découvre des conditions justifiant un dialogue mais que, dans le dialogue, tu as des conditions différentes pour faire intervenir les répliques, tu risques des problèmes. Quand je parle de conditions différentes, je fais référence aux tests de variables dans le IF THEN BEGIN du dialogue. Si aucune condition n'est vérifié pour les répliques de romance mais que par contre celles de la réplique de rappel le sont, ou encore si la réplique de rappel est testée avant les autres et que ses conditions sont vérifiées, tu auras la réplique de rappel.
Peux-tu poster le bloc du dialogue qui déclenche la réplique que tu obtiens, s'il te plait ?
Rimbaud
Statut : Hors ligne
.

Message par Rimbaud »

J'avoue, pas terrible comme post, l'agacement fait que je suis plutôt expéditive.

Pour les labels du .d je vais changer cela, je suis d'accord qu'il peut y avoir mélange. Si j'ai bien compris, le script donne cela maintenant, après application de tes conseils:

// DEBUT DE LA ROMANCE (SI CHARNAME EST DE SEXE FEMININ)
// BLOC DE LANCEMENT

IF
Global("#SherQuest1","GLOBAL",101)
Global("#SherRomanceActive","GLOBAL",0)
Gender(Protagonist,Female)
THEN
RESPONSE #100
SetGlobal("#SherRomanceActive","GLOBAL",1)
SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
SetGlobal("#SherLoveTlk","LOCALS",101)
END

// ROMANCE (SI CHARNAME EST DE SEXE FEMININ)

IF
InParty("#Sheratan")
Detect(Player1)
!StateCheck(Player1,STATE_SLEEPING)
!Detect([ENEMY])
GlobalTimerExpired("#SherTimer","LOCALS")
OR(2)
Global("#SherRomanceActive","GLOBAL",1)
Global("#SherRomanceActive","GLOBAL",2)
OR(20)
Global("#SherLoveTlk","LOCALS",101)
Global("#SherLoveTlk","LOCALS",103)
Global("#SherLoveTlk","LOCALS",105)
Global("#SherLoveTlk","LOCALS",107)
Global("#SherLoveTlk","LOCALS",109)
Global("#SherLoveTlk","LOCALS",111)
Global("#SherLoveTlk","LOCALS",113)
Global("#SherLoveTlk","LOCALS",115)
Global("#SherLoveTlk","LOCALS",117)
Global("#SherLoveTlk","LOCALS",119)
Global("#SherLoveTlk","LOCALS",121)
Global("#SherLoveTlk","LOCALS",123)
Global("#SherLoveTlk","LOCALS",125)
Global("#SherLoveTlk","LOCALS",127)
Global("#SherLoveTlk","LOCALS",129)
Global("#SherLoveTlk","LOCALS",131)
Global("#SherLoveTlk","LOCALS",133)
Global("#SherLoveTlk","LOCALS",135)
Global("#SherLoveTlk","LOCALS",137)
Global("#SherLoveTlk","LOCALS",139)
THEN
RESPONSE #100
IncrementGlobal("#SherLoveTlk","LOCALS",1)
SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
StartDialogueNoSet(Player1)
END

IF
InParty("#Sheratan")
Detect(Player1)
!StateCheck(Player1,STATE_SLEEPING)
!Detect([ENEMY])
GlobalTimerExpired("#SherTimer","LOCALS")
OR(2)
Global("#SherRomanceActive","GLOBAL",1)
Global("#SherRomanceActive","GLOBAL",2)
OR(20)
Global("#SherLoveTlk","LOCALS",102)
Global("#SherLoveTlk","LOCALS",104)
Global("#SherLoveTlk","LOCALS",106)
Global("#SherLoveTlk","LOCALS",108)
Global("#SherLoveTlk","LOCALS",110)
Global("#SherLoveTlk","LOCALS",112)
Global("#SherLoveTlk","LOCALS",114)
Global("#SherLoveTlk","LOCALS",116)
Global("#SherLoveTlk","LOCALS",118)
Global("#SherLoveTlk","LOCALS",120)
Global("#SherLoveTlk","LOCALS",122)
Global("#SherLoveTlk","LOCALS",124)
Global("#SherLoveTlk","LOCALS",126)
Global("#SherLoveTlk","LOCALS",128)
Global("#SherLoveTlk","LOCALS",130)
Global("#SherLoveTlk","LOCALS",132)
Global("#SherLoveTlk","LOCALS",134)
Global("#SherLoveTlk","LOCALS",136)
Global("#SherLoveTlk","LOCALS",138)
Global("#SherLoveTlk","LOCALS",140)
THEN
RESPONSE #100
IncrementGlobal("#SherLoveTlk","LOCALS",1)
SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
END

// AMITIE (SI CHARNAME EST DE SEXE MASCULIN)
// BLOC DE LANCEMENT

IF
Global("#SherQuest1","GLOBAL",101)
Global("#SherRomanceActive","GLOBAL",0)
Gender(Protagonist,Male)
THEN
RESPONSE #100
SetGlobal("#SherRomanceActive","GLOBAL",1)
SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
SetGlobal("#SherLoveTlk","LOCALS",201)
END

// AMITIE (SI CHARNAME EST DE SEXE MASCULIN)

IF
InParty("#Sheratan")
Detect(Player1)
!StateCheck(Player1,STATE_SLEEPING)
!Detect([ENEMY])
GlobalTimerExpired("#SherTimer","LOCALS")
OR(2)
Global("#SherRomanceActive","GLOBAL",1)
Global("#SherRomanceActive","GLOBAL",2)
OR(10)
Global("#SherLoveTlk","LOCALS",201)
Global("#SherLoveTlk","LOCALS",203)
Global("#SherLoveTlk","LOCALS",205)
Global("#SherLoveTlk","LOCALS",207)
Global("#SherLoveTlk","LOCALS",209)
Global("#SherLoveTlk","LOCALS",211)
Global("#SherLoveTlk","LOCALS",213)
Global("#SherLoveTlk","LOCALS",215)
Global("#SherLoveTlk","LOCALS",217)
Global("#SherLoveTlk","LOCALS",219)
THEN
RESPONSE #100
IncrementGlobal("#SherLoveTlk","LOCALS",1)
SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
StartDialogueNoSet(Player1)
END

IF
InParty("#Sheratan")
Detect(Player1)
!StateCheck(Player1,STATE_SLEEPING)
!Detect([ENEMY])
GlobalTimerExpired("#SherTimer","LOCALS")
OR(2)
Global("#SherRomanceActive","GLOBAL",1)
Global("#SherRomanceActive","GLOBAL",2)
OR(10)
Global("#SherLoveTlk","LOCALS",202)
Global("#SherLoveTlk","LOCALS",204)
Global("#SherLoveTlk","LOCALS",206)
Global("#SherLoveTlk","LOCALS",208)
Global("#SherLoveTlk","LOCALS",210)
Global("#SherLoveTlk","LOCALS",212)
Global("#SherLoveTlk","LOCALS",214)
Global("#SherLoveTlk","LOCALS",216)
Global("#SherLoveTlk","LOCALS",218)
Global("#SherLoveTlk","LOCALS",220)
THEN
RESPONSE #100
IncrementGlobal("#SherLoveTlk","LOCALS",1)
SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
END

Pour le .d, il est modifié en conséquence:

/ ROMANCE (SI CHARNAME EST DE SEXE FEMININ)
// ETAPE 1

IF ~Global("#SherLoveTlk","LOCALS",102)~ THEN BEGIN Romance1
SAY @120
IF ~~ THEN REPLY @121 GOTO Compagnons
IF ~~ THEN REPLY @123 GOTO Compagnons
IF ~~ THEN REPLY @122 GOTO Etroit
END
Ect...

// ROMANCE (SI CHARNAME EST DE SEXE FEMININ)
// ETAPE 2

IF ~Global("#SherLoveTlk","LOCALS",104)~ THEN BEGIN Romance2
SAY @144
IF ~~ THEN REPLY @145 GOTO Intrigue
IF ~~ THEN REPLY @146 EXIT
END

Ect pareil pour Charname version masculine. On admet que les labels ont été modifiés.

----------------------------

Pour l'autre solution que tu évoques, c'est cela que je comptais faire au début, sauf qu'il n'y a que 10 dialogues d'amitié, pour environ 20 dialogues de romance, et qu'ils seront franchement radicalement différents sauf au début. Je cherche en fait simplement à me faciliter à l'extrême la tâche, car écrire des dialogues avec toutes les subtilités qu'implique un flirt comparé à de l'amitié, ça me semble franchement lourd. Ce n'est pas spécialement de la paresse, j'essaye juste d'alléger le travail et de m'organiser au mieux. J'ai vraiment besoin de séparer radicalement les dialogues d'amitié et de romance.

Donc, j'ai testé avec Charname au féminin, comme écrit dans le double-post précédent, et ça renvoie à l'impatience de Sheratan qui se produit si on ne fait pas la quête précédente.
Avatar du membre
Isaya
Adepte de Grondemarteau
Planaire
Messages : 6990
Enregistré le : mar. 22 juil. 2003, 21:03
Localisation : Plaisir
Contact :
Statut : Hors ligne
.

Message par Isaya »

Par rapport à ma suggestion (et non conseil, je suis pointilleux), tu as inversé les chiffres. La dernière fois que j'ai vérifié, mon numéro INSEE (aussi appelée sécurité sociale) commençait pas un 1 et je suis un homme ! :whistle3:

Tu n'as pas posté le bloc du dialogue qui déclenche la réplique de rappel de la quête... un effet de l'agacement, peut-être ? ;) Je soupçonne que ton problème vient des conditions permettant de choisir les répliques dans le dialogue, même si le problème peut aussi provenir du script. Mais puisque tu testes #SherQuest1 pour activer la romance dans le script et que ça doit correspondre à la fin de la quête (j'ai la flemme de vérifier les anciens messages pour vérifier), le dialogue paraît plus probable.

Je ne sais pas ce que tu entends par la séparation amitié-romance. Tu peux réduire la taille des fichiers .D en mettant les dialogues d'amitié dans un et ceux de romance dans un autre. La contrainte est alors de commencer un par "BEGIN B#SHER" et l'autre par "APPEND B#SHER", où B#SHER est le nom du fichier DLG que crée ou complète WeiDU. Il te faut alors veiller dans ton fichier TP2 à compiler en premier celui qui contient "BEGIN B#SHER". De même tu peux séparer dans deux fichiers .D les répliques pour les versions féminines et masculines.
Attention à l'ordre de compilation des fichiers D dans ce cas, car il conditionne l'ordre d'évaluation des conditions des répliques dans le jeu. Le plus simple est de conserver l'ordre existant au moment où tu fais le découpage.
Je ne sais pas si ça répond à ton objectif.
Avatar du membre
Magnus
Araignée colossale
Messages : 517
Enregistré le : dim. 30 déc. 2007, 13:09
Statut : Hors ligne
.

Message par Magnus »

Préviens-nous quand la version beta sera prête;j'ai hâte de l'essayer.
Rimbaud
Statut : Hors ligne
.

Message par Rimbaud »

Je serai vraiment très brève, car je m'absente a priori tout ce week end, dans une petite demi-heure, donc désolée Isaya, j'ai vraiment survolé ce que tu m'as dit :(

Isaya, Deecy et moi et moi on a décidé de creer une nouvelle variable pour l'amitié, #SherFriend, tout simplement. Ce sera donc indépendant de la romance donc j'ai repris le script pour la romance, je n'aurais qu'à y ajouter le GENDER(Protagonist,Female). Cependant, impossible de remettre la main sur le bon script, qui marchait (à savoir, le dialogue 1 et 2 qui s'enchaînent sans aucun problème), que j'ai pu faire grâce aux corrections de Deecy sur le topic (voir page 1).

// DEBUT DE LA ROMANCE
IF
Global("#SherQuest1","GLOBAL",101)
Global("#SherRomanceActive","GLOBAL",0)
THEN
RESPONSE #100
SetGlobal("#SherRomanceActive","GLOBAL",1)
SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
SetGlobal("#SherLoveTlk","LOCALS",1)
END

IF
InParty("#Sheratan")
!StateCheck(Player1,STATE_SLEEPING)
!Detect([ENEMY])
GlobalTimerExpired("#SherTimer","LOCALS")
OR(2)
Global("#SherRomanceActive","GLOBAL",1)
Global("#SherRomanceActive","GLOBAL",2)
OR(14)
Global("#SherLoveTlk","LOCALS",1)
Global("#SherLoveTlk","LOCALS",3)
Global("#SherLoveTlk","LOCALS",5)
Global("#SherLoveTlk","LOCALS",7)
Global("#SherLoveTlk","LOCALS",9)
Global("#SherLoveTlk","LOCALS",11)
Global("#SherLoveTlk","LOCALS",13)
Global("#SherLoveTlk","LOCALS",15)
Global("#SherLoveTlk","LOCALS",17)
Global("#SherLoveTlk","LOCALS",19)
Global("#SherLoveTlk","LOCALS",21)
Global("#SherLoveTlk","LOCALS",23)
Global("#SherLoveTlk","LOCALS",25)
Global("#SherLoveTlk","LOCALS",27)
THEN
RESPONSE #100
IncrementGlobal("#SherLoveTlk","LOCALS",1)
SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
StartDialogueNoSet(Player1)
END

IF
InParty("#Sheratan")
Detect(Player1)
!StateCheck(Player1,STATE_SLEEPING)
!Detect([ENEMY])
GlobalTimerExpired("#SherTimer","LOCALS")
OR(2)
Global("#SherRomanceActive","GLOBAL",1)
Global("#SherRomanceActive","GLOBAL",2)
OR(14)
Global("#SherLoveTlk","LOCALS",2)
Global("#SherLoveTlk","LOCALS",4)
Global("#SherLoveTlk","LOCALS",5)
Global("#SherLoveTlk","LOCALS",6)
Global("#SherLoveTlk","LOCALS",8)
Global("#SherLoveTlk","LOCALS",10)
Global("#SherLoveTlk","LOCALS",12)
Global("#SherLoveTlk","LOCALS",14)
Global("#SherLoveTlk","LOCALS",16)
Global("#SherLoveTlk","LOCALS",18)
Global("#SherLoveTlk","LOCALS",20)
Global("#SherLoveTlk","LOCALS",22)
Global("#SherLoveTlk","LOCALS",24)
Global("#SherLoveTlk","LOCALS",26)
THEN
RESPONSE #100
IncrementGlobal("#SherLoveTlk","LOCALS",1)
SetGlobalTimer("#SherTimer","LOCALS",ONE_DAY)
END


ça fait deux bonnes heures que je m'escrime à chercher la solution, en procédant par éliminations, ect et impossible...Et là je n'ai plus le temps d'y travailler, en plus d'être saturée. Je pense que vous n'aurez pas de problème à dénicher la boulette qui s'y cache, et je rappelle que non seulement je n'ai pas encore inclu le test de genre, mais que donc l'amitié sera complètement indépendante de ce script.
En fait, tout ce que j'aimerais ds ce script, c'est que le second dialogue de romance s'enclenche après un jour, ce qui n'est pas le cas actuellement. Seul le dialogue 1 se lance comme prévu.

Voilà, je file et à lundi ^^
Merci d'avance

P.S: Magnus, ça dépend de quelle bêta tu parles...En ce moment, c'est la 1.5, c'est à dire le Chapitre 1 de Sheratan qui est en cours, bêta réservée aux inscrits par ailleurs. Consulte le forum dans la Forge, tu y trouveras tous les renseignements nécessaires.
Répondre

Retourner vers « Kits »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité