Page 1 sur 1

[CARTES] Ma carte fait planter le jeu

Posté : lun. 20 juin 2005, 17:55
par Shinook
Voilà, j'ai repris la zone AR1613, j'ai enlevé tout ce qui ne m'intéressait pas, et je l'ai laissée vierge pour la tester, cependant, lorsque je la charge dans BG2 grâce à la CLUAConsole, le jeu plante à la moitié du chargement.
J'ai déjà fait ce genre de manipulation avec les cartes, mais là je ne vois vraiment pas...
Je précise qu'il n'y a ni "ambiance", ni créatures, ni animation, ni containers, ni triggers, ni entrance, enfin que dalle quoi ( à l'origine j'avais rajouté un perso, des scripts, des dialogues, mais comme ça plantait, je les ai temporairement supprimés ).
En fait, j'ai simplement copié les fichiers suivants ( .are, .mos, .tis, .wed, les 3 .bmp ) dans le répertoire override, comme d'habitude en fait...

Qu'est-ce qui ne marche pas, sachant que les fichiers sont correctement copiés et ont tous le même nom ( que j'ai changé en NBG#Oril ) :snif: ...

Posté : lun. 20 juin 2005, 22:32
par Isaya
Je ne sais pas si c'est la cause du problème mais les fichiers TIS dans le répertoire Override ont besoin d'un en-tête spécial. Si tu n'as pas extrait le fichier TIS avec un outil créant cet en-tête, tu auras certainement des problèmes. Je ne suis pas certain des outils qui gèrent ça correctement. Néanmoins DLTCEP devrait fonctionner.
Si tu veux reprendre les graphismes d'une zone, tu n'as pas besoin de recopier le fichier TIS et tu peux pointer sur l'original.
Je t'invite à consulter le forum de DLTCEP, je me souviens qu'il y avait eu des discussions sur ce sujet, en particulier du fait de la présence d'une fonction d'importation depuis un autre jeu comme IWD2 dans BG2.

Posté : mar. 21 juin 2005, 07:38
par Shinook
Très bien, je vais regarder, mais je n'avais jamais fait ça avant, et ça marchait très bien :heu: . Par contre, j'ai remarqué pour le fichier .tis justement, qu'il n'était écrit qu'en minuscules lorsqu'on sauvegarde la carte, contrairement aux autres fichiers associés ( si jamais je décide de mettre des majuscules ).

Voici ce que ça donne pour mes fichiers :
NBG#Oril.are
NBG#Oril.wed
NBG#Oril.mos
nbg#oril.tis
NBG#OrilHT.bmp
NBG#OrilLM.bmp
NBG#OrilSR.bmp

Mais j'ai essayé de changer le .tis en mettant les majuscules comme pour les autres, et ça ne change rien... en tout cas, c'est bien un fichier de la carte qui fait planter.

Edit : Ca y est, c'est bon. J'ai d'abord utiliser "Delete everything in this area", j'ai refais quelques"walls", les containers, etc... et j'ai renommé mes fichiers en ARoril. Conclusion, ça marche. Donc je pense que ça pouvait venir du nom, c'est peut-être le caractère "#" qui ne fonctionnait pas...

Posté : mar. 21 juin 2005, 10:48
par Shinook
( Désolé pour le double post )

Bon ça c'est réglé, maintenant j'ai un autre problème, au niveau d'un script pour enclencher une cutscene. Celle-ci ne veut pas se déclencher.
Voici le premier script "orilfirs.bcs" : ( associé à la carte créé précédemment )

Code : Tout sélectionner

IF
  PartyHasItem("pommDS")
  !Dead("Orilian")
  See([PC])
THEN 
  RESPONSE #100
    ClearAllActions()
    StartCutSceneMode()
    StartCutScene("orilians")
END
La condition principale était que le groupe ait en sa possession l'objet "pommDS.itm" ( c'était la seule condition à l'origine, mais commme ça ne marchait pas, j'en ai rajouté ). Cet objet se trouve dans un container, et le script doit donc s'enclencher dès que l'objet a été pris, alors que le personnage regarde encore l'inventaire du container.
Dans IETME, lorsque j'ai créé ma carte, j'ai spécifié dans l'espace "Associated script" le nom "orilfirs" ( sans les guillemets ni l'extension du fichier ).

Voici maintenant le second script pour les actions, "orilians.bcs" :

Code : Tout sélectionner

IF 
  True()
THEN 
  RESPONSE #100
    CutSceneId(Player1)
    ActionOverride("Orilian",MoveToPoint([480.336])
    ActionOverride("Orilian",FaceObject([PC]))
    Wait(2)
    StartDialog("orilian1",[PC])
    Wait(1)
    CreateVisualEffectObject("SPSTRENH",Orilian)
    Wait(1)
    ActionOverride("Orilian",DestroySelf())
    CreateCreature("Orilian1",[480.336],[PC])
    StartDialog("orilian2",[PC])
    ActionOverride("Orilian1",Ennemy())
    EndCutSceneMode()
END
J'ai bien vérifié que les noms de fichier étaient corrects. Les dialogues sont basiques ( 2 mots par dialogue, pour tester ^^ ), ce n'est donc pas là que ça cloche...
En gros, le personnage Orilian.cre qui a l'apparence d'un chat doit, dès que l'équipe a pris l'objet pommDS.itm, se placer sur un point de la carte, parler une première fois au PJ, puis se changer en humain ( Orilian1.cre ), parler une deuxième fois et ensuite devenir un ennemi. Là se finit la cutscene.

Qu'est-ce qui ne va pas ? :heu:

Posté : mar. 21 juin 2005, 22:17
par Isaya
c'était la seule condition à l'origine, mais commme ça ne marchait pas, j'en ai rajouté
Quand tu ajoutes des conditions, tu augmentes encore la probabilité que le cas ne se présente pas. Il faut que toutes les conditions soient vérifiées pour passer au corps du IF, donc c'est encore moins probable quand tu mets davantage de conditions.

Par rapport à ton problème, peux-tu préciser si tu as utilisé le premier script comme script de zone ou plutôt comme script de trigger de proximité ? Dans le premier cas, la fonction See([PC]) ne doit pas pouvoir fonctionner. Il faudrait qu'elle soit associé à un script de trigger de proximité (genre porte ou piège) pour que ça ait des chances de marcher. Sinon, il n'y a personne (ou ici, rien, c'est à dire pas d'objet) pour voir.
Pourrais-tu préciser ce qui se passe également ? Tu dis que ça ne se déclenche pas, mais qu'est ce qui te fait dire ça ? Fais un deuxième script on ne peut plus basique (un perso qui bouge, qui dit quelque chose sans dialogue, qui s'affiche au dessus du personnage, par exemple). Vois si ça marche.

Cela dit, puisque tu dis que la scène ne se déclenche pas, ça n'a probablement rien à voir avec le second script.
Par rapport à celui-ci, es-tu sûr que tu puisses considérer que le dialogue va bloquer la suite du script. Il me semble au contraire que ça ne marche pas. Néanmoins, ce n'est pas ce qui empêche le script de démarrer au moins jusqu'au premier dialogue.
Le StartDialog() avec [PC] est surprenant, étant donné que c'est déjà Player1 qui est en action du script (via CutSceneID(Player1)). J'aurais plutôt vu "Orilian" comme objet du dialogue dans ce cas (je ne suis pas sûr de ça néanmoins).

Posté : mer. 22 juin 2005, 07:17
par Shinook
En fait, pour l'action StartDialog(), j'étais pas sûr du nom à mettre, et au début j'avais mis "Orilian" justement.
Je vais essayer quelque chose simple, comme tu le dis. En fait, le premier script est un script de zone ( normalement ). Qu'est-ce que tu appelles un script de trigger de proximité ? :heu:
Pour les conditions, il me semblait bien que tout ça servait à rien :mad: . Donc je vais essayer ton idée, et je verrai.
Quand je dis que ça ne s'enclenche pas, ben c'est que je peux toujours cliquer sur l'écran, le ClearAllActions() ne marche pas non plus, etc...

Edit : J'ai essayé en mettant seulement une condition ( avoir l'objet ), et j'ai mis 2 actions : DisplayStringHead('texte') et ActionOverride("Orilian",DestroySelf()), marche toujours pas :snif: ( rien ne se passe, le jeu continue normalement ).

Posté : mer. 22 juin 2005, 21:22
par Isaya
Exemple de trigger de proximité : sous la Couronne de Cuivre, les tuyaux qu'il sélectionner dans le bon ordre pour obtenir Lilacor. Dans Near Infinity, charge la zone AR0404 et va voir dans ce qu'il appelle "Points of interest". Tu peux associer un script : c'est ce qui permet au jeu de gérer les contrôles sur l'ordre d'utilisation et envoyer un éclair en cas d'erreur.
C'est vrai que dans ton cas, tu peux utiliser le script de zone.
Ton premier script a un gros problème : si tu ne mets comme condition que le fait d'avoir l'objet, ton bout de script va s'exécuter en boucle. Pour éviter ça, il te faudrait une autre condition, une variable par exemple, que tu modifierais dès que tu arrives dans le corps du IF (la partie THEN) pour éviter que la condition soit encore vrai après que tu aies exécuté ce que tu veux faire. Ou alors, il te faut reprendre rapidement l'objet pour éviter que la condition soit encore vrai la fois suivante (le rafraîchissement d'IA indiqué dans les options, par défaut 30, indique le nombre de fois par seconde où le script est réévalué).

Exemple:

Code : Tout sélectionner

IF
  PartyHasItem(...)
  GLOBAL("DejaTeste", "ARxxxx", 0)
THEN
  RESPONSE #100
    SetGlobal("DejaTeste", "ARxxxx", 1)
    ...
END
L'absence de ce genre de contrôle pourrait provoquer un problème dans le jeu car il essaierait de lancer en permanence la cutscene.

Posté : mer. 22 juin 2005, 21:35
par Shinook
J'y ai déjà pensé, et j'ai fait exactement comme ça, mais ça n'avait pas marché. Je peux toujours retenter, et on verra...

Edit : Toujours pas :snif: , j'ai même changé la condition en mettant InParty("Nalia") ( j'ai vérifié que je l'avait adns le groupe quand même ^^ ). La cutscene ne s'enclenche pas même avec la variable.

Edit 2 : Et si je faisait tout en un seul script, ça marcherait ?

Posté : jeu. 23 juin 2005, 22:43
par Isaya
Ajouter des conditions, même si tu es sûr qu'elles sont vérifiées, ne changera rien. Je rappelle que les conditions "s'ajoutent" et que si le problème vient du fait qu'une n'est pas vérifiée, ces ajouts ne changeront rien au problème.

On pourrait penser que ton premier script n'est pas accepté comme script de zone. Essaie ce simple script :

Code : Tout sélectionner

IF
  Global("Essai", "ARxxxx", 0)
THEN
  RESPONSE #100
    SetGlobal("Essai", "ARxxxx", 1)
END
Remplace "ARxxxx" par ton nom de zone, ou encore pas "GLOBAL", au pire.
Lance le jeu, va dans la zone. Ouvre la console et va lire la valeur de la variable "Essai". Si elle n'est pas à 1, c'est que ton script n'est pas pris en compte comme script de zone. Commence par régler ce problème là avant d'aller plus loin.

Pour répondre à ta deuxième question, je pense qu'il vaut mieux éviter de scripter des scènes au milieu d'un script de zone. J'ai un peu galéré avec les scripts de téléportation d'Epic Endeavours parce qu'ils faisaient justement ça.

Posté : ven. 24 juin 2005, 08:08
par Shinook
Comment je fais pour voir la variable dans la console ? J'ai essayé GetGlobal("Essai") mais je ne sais pas ce que je dois mettre comme 2ème argument...

Par contre, je peux aussi essayer de forcer la variable à passer à 1 et voir si la cutscene marche grâce à la console ?

Posté : ven. 24 juin 2005, 22:01
par Isaya
Va voir la documentation sur la console sur le site "Le monde de Baldur's Gate" (lien en haut à gauche) ou sur IESDP. Le deuxième paramètre est comme dans les scripts, il me semble, à savoir "GLOBAL", "ARxxxx", "LOCAL". Donc utilise celui que tu as mis dans ton script.

La modification de variable à la main depuis la console a effet direct dans le jeu. Donc ça pourrait déclencher quelque chose selon le script de la zone.

Un dernier truc qui me vient à l'esprit pour ton problème. La précédence des scripts entre les "master areas" et les autres peut aussi poser des problèmes. Si le test simple que je te proposais ne donne rien, jette un coup sur ce problème. Le tutorial de SimDingo sur les scripts (site PPG) en parle, il me semble.

Posté : sam. 25 juin 2005, 12:19
par Shinook
Pour le <string2> j'ai déjà essay" de mettre le nom de ma carte et même GLOBAL, mais ça ne marche pas... peut être qu'il ne trouve pas la variable, ou alors c'est que ce que je dois mettre dans ce <string2> c'est autre chose...

Posté : dim. 26 juin 2005, 12:23
par Isaya
As-tu bien consulté la documentation du site IESDP ? Utilises-tu la bonne syntaxe de commande (précédé par CLUAConsole:, variable et GLOBAL ou ARxxxx entre guillemets, virgules de séparation) ? Je peux confirmer que la commande fonctionne parfaitement également pour des variables dites locales (associées à un personnage) comme les variables de romance, pour peu que le personnage en question soit sélectionné ou pointé par le curseur de la souris.
Si tu as un message d'erreur, c'est un défaut d'écriture de la commande. Une variable qui n'existe pas donnera la valeur 0.

Posté : mer. 29 juin 2005, 09:04
par Shinook
La syntaxe est bonne maintenant, j'avais du faire une erreur. Par contre, quand j'entre la commance il me dit que cette variable n'existe pas...
CLUAConsole:GetGlobal("Essai","ARoril")
ESSAI ARORILDoes not exist
C'est quelque chose comme ça.

Posté : mer. 29 juin 2005, 22:30
par Isaya
Pour arriver à lire une variable d'une zone, il me semble qu'il faut que tu sois présentement sur la carte en question. Peut-être est-ce pour ça qu'il te dit qu'il ne trouve pas la variable.
Essaie avec une variable globale pour comparer (une existante et une fausse).

Posté : jeu. 30 juin 2005, 06:51
par Shinook
D'accord je vais essayer mais j'étais bien sur la carte en question pour tester la variable... là je ne comprend vraiment plus rien.