Page 1 sur 1

[SCRIPT] Comment remplacer une créature d'une carte par une autre ?

Posté : ven. 28 nov. 2003, 13:09
par Nysi
:) Bon je suis de retour et j'ai un petit probleme.

Le fichier .cre du madulf d'origine dans l'override s'appelle UHOGRE1

Mon fichier .tp2 fait:

COPY ~Override\UHOGRE1.cre~ ~Madulf\Backup\UHOGRE1.cre~
COPY ~Madulf\Madulf.cre~ ~Override\UHOGRE1.cre

Madulf.cre est le perso qui doit être recruté.

Pourtant apres avoir utilisé le setup (pas d'erreur) je retrouve le Madulf d'origine dans les collines d'Umar.

Quelqu'un pourrait m'expliquer mon erreur?

Posté : ven. 28 nov. 2003, 23:35
par Isaya
Les personnages qui ne sont pas créés par un script mais qui sont directement présents dans le fichier ARE (c'est probablement le cas de Madulf car il est présent dès le début des quêtes à Umar) sont mémorisés dans ton fichier de sauvegarde. Assure-toi donc de reprendre une partie dans laquelle tu n'es jamais allé dans les collines d'Umar. Sinon c'est trop tard.

Posté : ven. 28 nov. 2003, 23:36
par Silk
Et ce sera trop tard dans le mod aussi, je présume :)

Posté : sam. 29 nov. 2003, 01:31
par Nysi
Ok merci j'ai compri donc la seule solution est de faire comme weimer avec Solaufein: créer un nouveau madulf et supprimé l'ancien de la zone des collines d'Umar.
Comme Madulf rejoint apres avoir conclu le pacte avec le village, le supprimé ne pose pas de probleme mais par contre je ne sais pas comment on fait.

Posté : sam. 29 nov. 2003, 09:02
par Isaya
Originally posted by Nysi@samedi 29 novembre 2003, 01:33
Ok merci j'ai compri donc la seule solution est de faire comme weimer avec Solaufein: créer un nouveau madulf et supprimé l'ancien de la zone des collines d'Umar.
Peut-être trouveras-tu une solution en regardant comment Weimer a fait, tout simplement ?

Posté : sam. 29 nov. 2003, 10:32
par Grenouillebleue
J'avais eu le même problème avec la prêtresse d'Umberlee à Brynnlaw.

Ma solution, qui vaut ce qu'elle vaut, c'est:

1. Tu crées un fichier script que tu nommes madulfswap:

Code : Tout sélectionner

IF
  G("MADULFSWAP",0)
THEN
  RESPONSE #100
    DestroySelf()
    SG("MADULFSWAP",1)
END
2. Tu crées un fichier script que tu nommes madulfswaparea:

Code : Tout sélectionner

IF
  G("MADULFSWAP",1)
THEN
  RESPONSE #100
    CreateCreature("Madulf2",X,Y,Z)
    SG("MADULFSWAP",2)
END
3. Dans ton TP2, tu rajoutes:

Code : Tout sélectionner

EXTEND_TOP ~MADULF.bcs~ ~TONNPC\MADULFSWAP.bcs~

EXTEND_BOTTOM ~(chiffre de la zone).bcs~ ~TONNPC\MADULFSWAPAREA.bcs~

Posté : sam. 29 nov. 2003, 18:19
par Nysi
Merci grenouille :)
Si tu pourrait preciser quelque detail s'il te plait ça m'aiderai beaucoup.

dans le Madulfswaparea.bcs, doit je mettre les coordonnées de Madulf a la place des X,Y,Z (j'ai le X et le Y mais alors Z dans un jeu en 2D je pige pas ...)

Une fois que mes script sont fait, que doit je en faire? comment faire pour les declencher?

Et pourrait tu m'expliquer a quoi serve les "response #100" et la variable "Madulfswap"

merci d'avance.

Posté : dim. 30 nov. 2003, 00:54
par Isaya
Dans CreateCreature(), le Z indique l'orientation du personnage. La valeur va de 1 à 8 il me semble.

Ce qu'a écrit Grenouille à propos du "TP2" concerne l'installation d'un mod avec WeiDU. Les lignes qu'il a indiquées provoquent l'ajout des bouts de scripts que tu as créés dans ceux du jeu (MADULF.BCS et ARxxxx.BCS, ARxxxx représentant la zone d'Umar). Tant que tu es en phase de création, le plus simple est peut-être de prendre un éditeur de script et d'ajouter les morceaux de scripts directement.

"RESPONSE 100" est un codage indiquant le poids relatif des différentes possibilités quant tu en indiques plusieurs. La valeur indique le poids. Par exemple :

Code : Tout sélectionner

IF
  CONDITION
THEN
  RESPONSE #70
    Action1()
  RESPONSE #30
    Action2()
END
signifie qu'il y a 70% de chances que l'action 1 soit effectuée et 30% que ce soit la 2. La somme des valeurs n'est pas nécessairement également à 100. Le poids effectif de chaque branche est déterminé de façon relative.
En général, RESPONSE 100 est utilisé quand il n'y a qu'une seule possibilité auquel cas, elle a 100% de chances.

La variable SWAP est utile pour s'assurer que la création ne s'effectue qu'une seule fois. Les 3 états sont nécessaires car les actions de destruction et de création s'effectuent dans des scripts différents.

Posté : dim. 30 nov. 2003, 21:23
par Grenouillebleue
En fait, je viens de réfléchir, et il y a beaucoup plus simple.
Oublie complètement mon histoire d'area, tu n'auras à modifier qu'un seul script, celui de madulf (MADULF.BCS).

Code : Tout sélectionner

IF
  G("MADULFSWAP",0)
THEN
  RESPONSE #100
    CreateCreature("Madulf2",[-1.-1],0)
    SG("MADULFSWAP",1)
    DestroySelf()
END

Pour expliquer clairement ce script, morceau par morceau :

Code : Tout sélectionner

IF
  G("MADULFSWAP",0)
Si la variable Madulfswap est égale à 0...

Code : Tout sélectionner

THEN
  RESPONSE #100
...alors, il y a 100% de chances qu'il se passe les choses suivantes:

Code : Tout sélectionner

    CreateCreature("Madulf2",[-1.-1],0)
1. La créature nommée Madulf2 sera créée juste à côté du Madulf original (lorsque tu mets [-1.-1] comme paramètre, ça crée la créature à côté du personnage qui joue le script).

Code : Tout sélectionner

    SG("MADULFSWAP",1)
2. La variable MADULFSWAP devient égale à 1, pour éviter que le script soit ré effectué par erreur.

Code : Tout sélectionner

    DestroySelf()
3. Le madulf originel disparaît, ce qui laisse donc Madulf2 tout seul

Et voilà !

Posté : lun. 01 déc. 2003, 16:16
par Nysi
Merci a vous deux :oops: , le script fonctionne mais j'ai un nouveau probleme, le nouveau pnj ne parle pas (Le jeu indique qu'il n'a rien a me dire).

J'ai pourtant créer un fichier .D et je lui est assigné avec creaturemaker.

Est ce qu'il faut aussi assigné d'autre script a mon pnj pour qu'il puisse repondre?

Avec le script des persos créer en multi ça fonctionne mais Madulf vient direct sur le Pj pour rejoindre le groupe.

Posté : lun. 01 déc. 2003, 18:37
par Isaya
Un dialogue se construit en précisant la condition (ça peut être un ensemble de conditions) dans laquelle le bout de dialogue apparaîtra. Lorsque tu veux parler à quelqu'un, le jeu cherche la première condition vérifié et utilise ce dialogue. Si ton personnage n'a rien à dire, c'est qu'aucune condition n'est vérifiée.
Pour un premier dialogue, un classique de condition est : NumTimesTalkedTo() = 0 (à vérifier, je ne suis plus sûr de l'écriture exacte).
Vérifie parmi les questions posées il y a environ 2 mois par Grenouille, il a été confronté au même problème si ma mémoire est bonne.

Posté : mar. 09 déc. 2003, 16:48
par Nysi
Ok merci Iasya ça marche maintenant.

Posté : lun. 22 mars 2004, 17:40
par Walar
Comment effacer un personnage qui a un script général ou n'en a pas...

Pour compléter un peu le sujet de comment effacer un personnage, je voulais récemment enlever deux roturiers dans une maison du district du pont. Le problème est que l'on ne peut pas simplement faire un nouveau script et le rajouter à celui qu'ils ont actuellement car tous les roturiers ont le même (en fait ils en ont même 3 de scripts... :..: )...

Donc si je mettais "DestroySelf()", tous les roturiers du jeu y seraient passés... :omg:

Alors, j'ai tout d'abord créé un nouveau script, que je nommerais V#BRAT1 par exemple (c'est un fichier .baf contenant) : (petite précision le PNJ que je voulais éliminer se nommait "BRAT1").

Code : Tout sélectionner

IF
  Global("V#BRAT1","GLOBAL",0)
  !Dead("BRAT1")
THEN
  RESPONSE #100
    SetGlobal("V#BRAT1","GLOBAL",1)
    DestroySelf()
END
Jusque ici c'est relativement simple. Ensuite pour allouer le script au PNJ il faut utiliser la commande WeiDU : WRITE_ASCII

Voilà ce que donne ce passage dans mon fichier .tp2 :

Code : Tout sélectionner

COMPILE ~WALAANPC\V#BRAT1.baf~
COPY_EXISTING ~BRAT1.cre~ ~override\BRAT1.cre~
  WRITE_ASCII ~0x250~ ~V#BRAT1~
  WRITE_BYTE 0x257 0x00
(Ça peut sembler barbare au premier abord mais je vais tâcher d'expliquer)

Code : Tout sélectionner

COMPILE ~WALAANPC\V#BRAT1.baf~
Pas trop de problème sur ce point la, cela sert juste à compiler le script dans le jeu.

Code : Tout sélectionner

COPY_EXISTING ~BRAT1.cre~ ~override\BRAT1.cre~
Pour pouvoir effectuer la modification sur le fichier, il faut que l'original soit dans le dossier override. Cette commande relativement facile à comprendre le permet.

Code : Tout sélectionner

  WRITE_ASCII ~0x250~ ~V#BRAT1~
Là ça se complique un petit peu. WRITE_ASCII va permettre de modifier certaines données du fichier .cre dans ce cas. le 0x250 indique l'endroit du fichier où je veux que la modification soit effectuée. Et ensuite vous reconnaissez le nom du nouveau script à ajouter.

Code : Tout sélectionner

  WRITE_BYTE 0x257 0x00
On pourrait penser que la procédure s'arrête à la phase précédente mais un méchant problème fait que WeiDU rajoute un "caractère" à la fin de la ligne de script modifiée dans le fichier .cre Donc pour éviter cela il faut soit :
1) Utiliser un éditeur hexadécimal pour rajouter un 0 à la fin de V#BRAT1 (directement)
2) Soit utiliser cette commande qui le rajoute par l'intermédiaire de WeiDU et donc élimine le caractère parasite.
Le 0x257 est l'endroit où cela doit être ajouté (à la fin de V#BRAT1) qui fait 7 lettres.

Et voilà, lorsque vous entrez dans la map concernée, le bonhomme disparait.

Ayant débuter relativement récemment l'editing (2-3 semaines), il y a peut-être une méthode plus simple et c'est peut-être confus. Enfin ça marche. N'hésitez pas à poster en cas de besoin de précisions supplémentaires.

Posté : sam. 02 avr. 2016, 22:06
par Freddy_Gwendo
Walar a écrit :

Code : Tout sélectionner

  WRITE_ASCII ~0x250~ ~V#BRAT1~
Là ça se complique un petit peu. WRITE_ASCII va permettre de modifier certaines données du fichier .cre dans ce cas. le 0x250 indique l'endroit du fichier où je veux que la modification soit effectuée. Et ensuite vous reconnaissez le nom du nouveau script à ajouter.

Code : Tout sélectionner

  WRITE_BYTE 0x257 0x00
On pourrait penser que la procédure s'arrête à la phase précédente mais un méchant problème fait que WeiDU rajoute un "caractère" à la fin de la ligne de script modifiée dans le fichier .cre Donc pour éviter cela il faut soit :
1) Utiliser un éditeur hexadécimal pour rajouter un 0 à la fin de V#BRAT1 (directement)
2) Soit utiliser cette commande qui le rajoute par l'intermédiaire de WeiDU et donc élimine le caractère parasite.
Le 0x257 est l'endroit où cela doit être ajouté (à la fin de V#BRAT1) qui fait 7 lettres.
Inutile, WeiDU fait tout ceci tout seul, comme un grand :

Code : Tout sélectionner

  WRITE_ASCII ~0x250~ ~V#BRAT1~ [color=yellow]#8[/color]
#8 permet à WeiDU de savoir qu'il écrit une chaîne devant comporter au maximum 8 caractères. Il comble donc les "blancs" si la variable fait moins de 8 caractères.

Sinon, la fonction Weidu ALTER_AREA_ACTOR le fait très bien ! ;)