Affichage des résultats 1 à 8 sur 8

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

  1. #1
    Sous Nain Invités

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

    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:
    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... ?
    Dernière modification par Freddy_Gwendo ; 08/04/2016 à 05h19. Motif: Modification du titre de la discussion et mise en page

  2. #2
    Date d'inscription
    April 2003
    Messages
    979
    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:
    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:
    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:
    COMPILE ~WALAANPC\V#BRAT1.baf~
    Pas trop de problème sur ce point la, cela sert juste à compiler le script dans le jeu.

    Code:
    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:
      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:
      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.
    Dernière modification par Freddy_Gwendo ; 08/04/2016 à 05h22. Motif: Mise en page

  3. #3
    Sous Nain Invités
    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 ?

  4. #4
    Date d'inscription
    April 2003
    Messages
    979
    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:
    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.
    Dernière modification par Freddy_Gwendo ; 08/04/2016 à 05h23. Motif: Mise en page

  5. #5
    Sous Nain Invités
    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...

  6. #6
    Date d'inscription
    July 2003
    Localisation
    Plaisir
    Messages
    6 633
    [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:
    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.
    Dernière modification par Freddy_Gwendo ; 08/04/2016 à 05h24. Motif: Mise en page
    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 !

  7. #7
    Sous Nain Invités
    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 !

  8. #8
    Date d'inscription
    April 2011
    Localisation
    Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
    Messages
    4 203
    Juste une précision :

    Citation Envoyé par Walar Voir le message
    Code:
    IF
      Global("V#BRAT1","GLOBAL",0)
      !Dead("BRAT1")
    THEN
      RESPONSE #100
        SetGlobal("V#BRAT1","GLOBAL",1)
        DestroySelf()
    END
    Code:
      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:
      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:
      WRITE_ASCII ~0x250~ ~V#BRAT1~ #8
    #8 étant le nombre de caractères maximum que ce champ peut supporter.

    On peut donc oublier la ligne

    Code:
      WRITE_BYTE 0x257 0x00
    CARPE DIEM...
    Co-modérateur de La Forge
    Moddeur qui s'arrache les cheveux...

Discussions similaires

  1. [CARTES] Comment modifier les textes affichés dans les cartes avec WeiDU ?
    Par nal'ex dans le forum Cartes et Cartes du monde
    Réponses: 4
    Dernier message: 08/04/2016, 16h56
  2. [BUG] AREA 0700 : la Promenade de Waukyne
    Par Venolas dans le forum La Taverne d'Amkethran (Baldur's Gate 2)
    Réponses: 3
    Dernier message: 30/11/2005, 14h03

Les tags pour cette discussion

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243