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

[SCRIPT] Comment supprimer toutes les créatures ennemies d'une carte ?

Répondre
Sous Nain
Statut : Hors ligne

[SCRIPT] Comment supprimer toutes les créatures ennemies d'une carte ?

.

Message par Sous Nain »

Bon, je sais que le problème a déjà été évoqué, mais j'ai déjà lu les thread correspondants et ça ne résoud pas mon problème pour autant. Donc en un mot comme en cent : help !

Voici le code que je rajoute au script de l'area (et ce n'est pas une question d'extend_bottom foireux, je rajoute aussi des CreateCreature qui fonctionnent très bien) :

Code : Tout sélectionner

IF
  G("deja_fait", 0)
  Exist([ENEMY])
THEN
  RESPONSE #100
    ActionOverride([ENEMY], DestroySelf())
END

IF
  G("deja_fait", 0)
THEN
  RESPONSE #100
    SG("deja_fait", 1)
END
Donc pour résumer, le but est de supprimer toutes les créatures ennemies présentes dans l'area la première fois qu'on y rentre.
Et le script ci-dessus ne fait rien du tout. J'ai essayé sans la condition Exist en demandant la destruction de 4 ou 5 enemy puis le SG("deja_fait", 1), ça ne marche pas mieux. J'ai aussi essayé avec des Kill([ENEMY]), nada.
A croire que je n'arrive pas à accéder aux ennemis par [ENEMY]. Je pensais utilise le nom de death variable, mais malheureusement, les créatures que je souhaite supprimer n'en ont pas (semble-t-il, après vérification avec NI).

Donc je me demande ce qui foire et pourquoi... ?
Avatar du membre
Walar
Blême
Messages : 979
Enregistré le : jeu. 24 avr. 2003, 20:39
Contact :
Statut : Hors ligne
.

Message par Walar »

Tu pourrais juste expliquer plus précisément la situation, avec quels ennemis et où si possible ?

Je ne suis plus trop dans le bain, il faut que je m'y remette sérieusement. Cependant j'avais eu un problème similaire, et j'ai ramé pour trouver une solution, mais ça a marché. Je ne crois pas que ce soit la technique la plus simple, en plus j'avais des problèmes car la zone n'avait pas de script propre.

Cependant si tes ennemis ont un script unique tu peux faire beaucoup plus simple en leur allouant mon tout premier point (ci-dessous).

Je te cite mon message : (copier-coller)

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 nommais "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
(Ca 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~
La ç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 à ajoutter.

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.


Donc, j'espère que ça peut t'aider.
Sous Nain
Statut : Hors ligne
.

Message par Sous Nain »

Si j'ai bien suivi sur IESDP, Dead() attends un nom de death variable, non ?
Car justement les créatures que je veux supprimer ont pour death variable : NONE... ce qui n'est pas très classe, si ?
Bon en tout cas, je suppose que je peux supprimer toutes les créature de ce type du jeu car en effet, on en trouve pas beaucoup.

Bon, pour donner plus d'infos :

SPOILER :
La zone que j'essaye de "nettoyer" est le pocket plane d'Irenicus. D'ailleurs j'aurais aussi à nettoyer les donjon complet met je verrais ça plus tard, je suppose que c'est du même tonneau.
Ensuite, les seuls créatures présentes sont des méphites. J'ai essayé d'ailleurs mon script avec des [0.0.MEPHIT] mais sans plus de résultats.
Sinon je veux bien essayer ta méthode mais j'avoue ne pas comprendre, en fait je ne sais pas trop ce que tu appele "nom" (le BRAT1), est-ce une death variable ? Le nom du .cre ?
Avatar du membre
Walar
Blême
Messages : 979
Enregistré le : jeu. 24 avr. 2003, 20:39
Contact :
Statut : Hors ligne
.

Message par Walar »

Mais ces créatures possèdent un script qui leur est propre ou non ? Je parle d'un script de combat, qui va dicter leurs actions etc. Le gros problème que j'ai eu est que le script était commun à tous les roturiers du jeu (attention, j'ai l'impression que tu confonds script et death variable). Et donc j'ai dû créé de nouveaux scripts spécialement pour eux et les allouer aux personnages. Si tu n'as pas ce problème tu n'auras pas besoin de te compliquer la vie comme moi.

Si c'est le cas, il te suffit d'ajouter ceci au script :

Code : Tout sélectionner

IF
  Global("xxx","GLOBAL",0)
  !Dead("NomDeLaCréature")
THEN
  RESPONSE #100
    SetGlobal("xxx","GLOBAL",1)
    DestroySelf()
END
Et il s'autodétruit.
Car justement les créatures que je veux supprimer ont pour death variable : NONE
Je t'avoue que ça me surprend un peu mais bon, c'est étrange, j'avais compris que chaque créature devait avoir une death variable unique, enfin dans la méthode que je te propose ça n'a pas d'influence.

Sinon je veux bien essayer ta méthode mais j'avoue ne pas comprendre, en fait je ne sais pas trop ce que tu appele "nom" (le BRAT1), est-ce une death variable ? Le nom du .cre ?
Comme je l'ai dit :
Originally posted by Walar
(petite précision le PNJ que je voulais éliminer se nommait "BRAT1").
Cependant ce n'est pas assez précis en effet, c'est le nom de fichier de la créature (le nom du .cre si tu préfères). En fait il s'agissait d'un petit garçon.


Sinon, si je me souviens bien, il me semble qu'avec l'éditeur de zone (je me rappelle plus le nom du programme) on peut "vider" les cartes, mais moi je ne connais pas du tout ça.
Sous Nain
Statut : Hors ligne
.

Message par Sous Nain »

En fait oui, il y a bien un script qui leur est propre, de ce coté là pas de problème (du coup il doit même pas y avoir besoin de changer de script, si ?)
Je vais essayer en tout cas, et j'espere que ça ne m'en éliminera pas trop...
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 »

[ENEMY] ou [0.0.MEPHIT] ne servent à ma connaissance que comme "object" dans des triggers comme See([ENEMY]). Je ne pense pas que tu puisses les utiliser avec ActionOverride(). Je pense qu'il te faut effectivement utiliser une "death variable", désormais plus couramment appelée "script name" par les outils régulièrement mis à jour (DLTCEP, NI).
[ENEMY] ne fonctionne que si les créatures deviennent hostiles (cercle rouge), par conséquent, il ne fonctionnerait de toute façon que lorsque les créatures te verraient, ce qui aurait l'effet assez bizarre de les tuer à vue.

Les "death variable" ne sont pas toujours uniques. Tous les gobelins normaux ont la même, par exemple. L'intérêt de la "death variable" vient de la possibilité de personnifier des choses à partir de script (raison pour laquelle les gens l'appellent désormais plutôt "script name"). Ce n'est donc pas étonnant que beaucoup de créatures ne soient pas uniques de ce point de vue si aucun script n'a besoin de les identifier individuellement.
Au passage, "NONE" est un nom tout à fait valable. Ce n'est pas comme si la variable était vide. Ici il est toujours possible de s'en servir pour le script.

Si tu sais combien de créatures il y a, tu devrais plutôt utiliser une forme:

Code : Tout sélectionner

IF
 G("deja_fait", 0)
THEN
 RESPONSE #100
   ActionOverride("NONE", DestroySelf())
... autant de fois que nécessaire
   ActionOverride("NONE", DestroySelf())
   SG("deja_fait", 1)
END
Ce serait plus rapide et éviterait de les éliminer un par un (chaque cycle de script prenant du temps, ça pourrait se voir).

Reste à savoir si le jeu sait se débrouiller avec le fait que le nom de script de plusieurs créatures que tu veux commander n'est pas unique...
Dans le cas contraire, utilise la méthode proposée par Walar. Tu peux aussi ajouter une vérification sur la présence dans la zone qui t'intéresse (avec AreaCheck("ARxxxx")) pour être sûr que ton ordre ne s'applique pas ailleurs.
:!: Peu disponible
Guide d'installation (et FAQ) de Baldur's Gate, Baldur's Gate II, Baldur's Gate Trilogy (BGT), BG1Tutu, Widescreen, BGEE
Pensez à utiliser à la fonction Recherche pour trouver une réponse à votre question !
Sous Nain
Statut : Hors ligne
.

Message par Sous Nain »

Ok merci, ça marche : le CheckArea était ce qui me manquait (j'ai du le rater dans IESDP :timide: ). En tout cas cette solution marche.
Cependant, la solution avec utilisation du "None" ne fait rien, ou peut-être que ça en tue qu'un... en tout cas ça ne tue pas toutes les créatures avec ce script name même si je met l'instruction le bon nombre de fois.

Voila !
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

Juste une précision :
Walar a écrit :

Code : Tout sélectionner

IF
  Global("V#BRAT1","GLOBAL",0)
  !Dead("BRAT1")
THEN
  RESPONSE #100
    SetGlobal("V#BRAT1","GLOBAL",1)
    DestroySelf()
END

Code : Tout sélectionner

  WRITE_ASCII ~0x250~ ~V#BRAT1~
La ç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 à ajoutter.

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.
Je ne sais pas quelle version de WeiDU était utilisée à l'époque, mais depuis un moment, il suffit d'écrire ceci :

Code : Tout sélectionner

  WRITE_ASCII ~0x250~ ~V#BRAT1~ [color="#FFFF00"]#8[/color] 
#8 étant le nombre de caractères maximum que ce champ peut supporter.

On peut donc oublier la ligne

Code : Tout sélectionner

  WRITE_BYTE 0x257 0x00
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Répondre

Retourner vers « Scripts »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités