Page 1 sur 1

[SCRIPT] Divers problèmes rencontrés en créant un script

Posté : dim. 19 oct. 2003, 15:32
par Grenouillebleue
Voilà un script créé pour un ennemi, qui est supposé faire trois choses:

1. Transformer le gars en ennemi dès que son boss a fini son speech
2. Le faire ignorer tous les summons pour se concentrer sur les joueurs
3. Le faire boire une potion lorsqu'il tombe à moins de 50% de vie.

Les points 1. et 2. marchent sans souci, mais j'ai du mal avec le 3e... j'ai beau essayer, ça ne correspond pas. Porque ?

Code : Tout sélectionner

[b]// Passer ennemi[/b]

IF
  G("barbefight",1)
  !Allegiance(Myself,ENEMY)
THEN
  RESPONSE #100
    EquipMostDamagingMelee()
    Enemy()
    Continue()
END


[b]// Boire potion[/b]

IF
  !GlobalTimerNotExpired("time","LOCALS")
  HPPercentLT(Myself,50)
  HasItem("Potn52",Myself)
THEN
  RESPONSE #100
    UseItem("Potn52",Myself)
    SetGlobalTimer("time","LOCALS",8)
    Continue ()
END


[b]// Ignorer les summons[/b]

IF
  !Gender(SixthNearestEnemyOf(Myself),SUMMONED)
  See(SixthNearestEnemyOf(Myself))
  False()
THEN
  RESPONSE #100
END

IF
  !Gender(FifthNearestEnemyOf(Myself),SUMMONED)
  See(FifthNearestEnemyOf(Myself))
  False()
THEN
  RESPONSE #100
END

IF
  !Gender(FourthNearestEnemyOf(Myself),SUMMONED)
  See(FourthNearestEnemyOf(Myself))
  False()
THEN
  RESPONSE #100
END

IF
  !Gender(ThirdNearestEnemyOf(Myself),SUMMONED)
  See(ThirdNearestEnemyOf(Myself))
  False()
THEN
  RESPONSE #100
END

IF
  !Gender(SecondNearestEnemyOf(Myself),SUMMONED)
  See(SecondNearestEnemyOf(Myself))
  False()
THEN
  RESPONSE #100
END

IF
  !Gender(NearestEnemyOf(Myself),SUMMONED)
  See(NearestEnemyOf(Myself))
  False()
THEN
  RESPONSE #100
END

[b]// Attaquer la cible la plus proche non-summon[/b]

IF
  True()
THEN
  RESPONSE #100
    EquipMostDamagingMelee()
    AttackReevaluate(LastSeenBy(),30)
END

Posté : dim. 19 oct. 2003, 15:50
par Silk
Tu ne peux pas utiliser de boucles avec bgscript ? :heu:

Posté : dim. 19 oct. 2003, 15:57
par Grenouillebleue
Euh, utiliser quoi avec quoi ?
Qu'est-ce qu'une boucle ? Qu'est-ce que BGScript ? En quoi ça m'aiderait ? ;)

Pour l'instant, j'ai fait tous mes scripts sur le blocnotes

Posté : dim. 19 oct. 2003, 16:09
par Silk
bgscript est le langage utilisé baldur's gate. Une boucle c'est une vérification. Exemple NWN :

// Ce script détruit tout objet dans la zone dont le nom est "albert"
void main()
{
object oA;
string sResA;

oA = GetFirstObjectInArea(OBJECT_SELF);
sResA=GetResRef(oA);
if(sResA=="albert")
{
DestroyObject(oA);
oA = GetNextObjectInArea(OBJECT_SELF);
}
}

C'est une boucle. Ca pourrait se traduire par tant que... alors... Ici, tu pourrais appliquer à : "tant que l'ennemi le plus proche est un summon, passer à l'ennemi suivant" jusqu'à ce qu'il tombe sur un non-summon, auquel cas il l'attaque. Dans ton cas, ça ne marche qu'avec les 6 premiers ennemis, mais si c'est 6 summons (non, ce n'est pas limité à 5 ;) )...

Posté : dim. 19 oct. 2003, 16:17
par Grenouillebleue
Je ne crois pas qu'on ait ce genre de boucle dans BG2, vu les scripts que j'ai lu dans les mods Tashia, Chloe, Imoen ou Kelsey.

Quoi qu'il en soit, cette partie marche (et non, on ne peut avoir plus de cinq summons sans changer leur genre - et si on change leur genre, alors le script en tient compte :p ).

Ce qui ne marche pas, c'est le fait qu'il boit une potion.
POURQUOI CA NE MARCHE PÔ ?

En fait, je suppose que ma question, c'est: est-ce qu'il y a une commande qui fait recommencer le script au début ?

Tel que je vois les choses:
1. Le script dit au pirate de passer rouge, il le fait
2. Le script dit au pirate que s'il est blessé, il doit boire une potion; comme ce n'est pas le cas, ça passe à la suite
3. Le script dit au pirate d'attaquer la cible non-summon la plus proche. Il le fait

Et ? Est-ce que le script recommence de temps en temps (ce qui permettrait de déclencher la potion) ou est-ce qu'il s'arrête une fois arrivé en bas ? Si oui, comment le faire repartir ?

Posté : dim. 19 oct. 2003, 16:24
par Silk
Je sais, mais je parle par exemple des dominés et des lapins du sort de souhait... Il va les attaquer...

Posté : dim. 19 oct. 2003, 16:36
par Grenouillebleue
Pour les dominés, je vais mettre une condition supplémentaire. Ca aura en plus l'avantage d'éviter qu'ils s'attaquent les uns les autres si le PJ en domine quelques-uns.

Code : Tout sélectionner

IF
  !Gender(SixthNearestEnemyOf(Myself),SUMMONED)
  !StateCheck(SixthNearestEnemyOf(Myself),STATE_CHARMED)
  See(SixthNearestEnemyOf(Myself))
  False()
THEN
  RESPONSE #100
END
Et pour mon problème, il est réglé : il suffisait de remplacer "Attackreevaluate" par un "attack" tout simple. Visiblement, mon attackreevaluate bloquait le script

Enfin, si le perso utilise un sort de Wish pour avoir des lapins
1. Il est stupide
2. Il mérite bien que les pirates s'en prennent aux lapins :p

Posté : dim. 19 oct. 2003, 16:38
par Silk
C'est bien ce que je pensais... Je me suis déjà fait une armée de 49 soldats avec le bâton de domination ;) rangés en 7*7...

La domination est une des techniques les plus puissantes existantes faces à des adversaires dominables (pas des adversaires épiques comme Irenicus)...

Posté : dim. 19 oct. 2003, 17:26
par Isaya
Originally posted by Grenouillebleue@dimanche 19 octobre 2003, 16:11
Je ne crois pas qu'on ait ce genre de boucle dans BG2, vu les scripts que j'ai lu dans les mods Tashia, Chloe, Imoen ou Kelsey.

En fait, je suppose que ma question, c'est: est-ce qu'il y a une commande qui fait recommencer le script au début ?

Et ? Est-ce que le script recommence de temps en temps (ce qui permettrait de déclencher la potion) ou est-ce qu'il s'arrête une fois arrivé en bas ? Si oui, comment le faire repartir ?
Non, il n'y a pas de boucle dans les scripts BG.
Les scripts tournent en permanence : le taux de rafraîchissement de l'IA définie dans le programme de config détermine le rythme de répétition (typiquement 30 fois par seconde).
Une itération du script s'arrête dès qu'elle trouve une condition de remplie. La fois suivante, l'évaluation des conditions reprendra normalement depuis le début. Je crois que la commande Continue() permet de continuer depuis le point atteint.

Posté : dim. 19 oct. 2003, 17:31
par Silk
Ca, c'est une remarque très intéressante :)

Posté : lun. 20 oct. 2003, 23:58
par Grenouillebleue
Yup, voilà l'info dont j'avais besoin pour comprendre comment mettre mon script ;)

Merci m'siou !

Posté : mar. 28 oct. 2003, 12:51
par Elgaern
Question ayant trouvé sa réponse, sujet clos...