Surveillance des Mages Cagoulés

Surveillance des Mages Cagoulés#

Les mages cagoulés surveillent Athkatla, comment éviter de les attirer ?

Script de surveillance#

Exemple de script qui permet aux mages d’intervenir (ici AR0020.bcs) :

IF
    SpellCast([PC],0)
    !GlobalTimerNotExpired("SpellsBad","GLOBAL")
    Global("BribedCowled","GLOBAL",0)
    GlobalLT("CowledWarning","GLOBAL",7)
THEN
    RESPONSE #100
        CreateCreatureObjectDoor("COWENF2",LastTrigger,0,0,0)  // Cowled Enforcer
        SetGlobalTimer("SpellsBad","GLOBAL",ONE_HOUR)
END

Explications#

  • BribedCowled permet de savoir si le groupe a payé pour avoir le droit de pratiqué la magie en ville (0 pour non, 1 pour oui)

  • SpellsBad est le temps d’attente minimum entre chaque intervention des mages cagoulés

  • CowledWarning est le nombre d’avertissements reçus


  • SpellCast([PC],0) vaut vrai si un personnage PC lance un sort de mage

  • Global("BribedCowled","GLOBAL",0) vérifie que le groupe n’a pas le droit de pratiquer la magie en ville

  • GlobalLT("CowledWarning","GLOBAL",7) indique que si cette variable vaut 7 ou plus, les mages n’interviennent plus

  • SetGlobalTimer("SpellsBad","GLOBAL",ONE_HOUR) indique que le temps d’attente entre chaque intervention est d’une heure

Exemples#

IF
    Global("CanCastAthkatla", "LOCALS", 1)
    Global("BribedCowled", "GLOBAL", 0)
    GlobalLT("CowledWarning", "GLOBAL", 7)
    Allegiance(Myself, PC)
    !GlobalTimerNotExpired("SpellsBad", "GLOBAL")
    OR(7)
        AreaCheck("AR0020")  // City Gates
        AreaCheck("AR0300")  // The Docks
        AreaCheck("AR0400")  // Slums
        AreaCheck("AR0500")  // Bridge District
        AreaCheck("AR0700")  // Waukeen's Promenade
        AreaCheck("AR0900")  // Temple District
        AreaCheck("AR1000")  // Government District
THEN
    RESPONSE #100
        SetGlobal("CanCastAthkatla", "LOCALS", 0)
END

IF
    Global("CanCastAthkatla", "LOCALS", 0)
    OR(4)
        !Allegiance(Myself, PC)
        Global("BribedCowled", "GLOBAL", 1)
        GlobalGT("CowledWarning", "GLOBAL", 6)
        GlobalTimerNotExpired("SpellsBad", "GLOBAL")
THEN
    RESPONSE #100
        SetGlobal("CanCastAthkatla", "LOCALS", 1)
END

IF
    Global("CanCastAthkatla", "LOCALS", 0)
    !AreaCheck("AR0020")  // City Gates
    !AreaCheck("AR0300")  // The Docks
    !AreaCheck("AR0400")  // Slums
    !AreaCheck("AR0500")  // Bridge District
    !AreaCheck("AR0700")  // Waukeen's Promenade
    !AreaCheck("AR0900")  // Temple District
    !AreaCheck("AR1000")  // Government District
THEN
    RESPONSE #100
        SetGlobal("CanCastAthkatla", "LOCALS", 1)
END
IF
    Global("BDAI_NO_ARCANE","LOCALS",0)
    Global("BribedCowled","GLOBAL",0)
    ActionListEmpty()
    InParty(Myself)
    AreaType(OUTDOOR)
    OR(7)
        AreaCheck("AR0020")  // City Gates
        AreaCheck("AR0300")  // The Docks
        AreaCheck("AR0400")  // Slums
        AreaCheck("AR0500")  // Bridge District
        AreaCheck("AR0700")  // Waukeen's Promenade
        AreaCheck("AR0900")  // Temple District
        AreaCheck("AR1000")  // Government District
THEN
    RESPONSE #100
        SetGlobal("BDAI_NO_ARCANE","LOCALS",1)
END

IF
    Global("BDAI_NO_ARCANE","LOCALS",1)
    ActionListEmpty()
    InParty(Myself)
    !AreaType(OUTDOOR)
THEN
    RESPONSE #100
        SetGlobal("BDAI_NO_ARCANE","LOCALS",0)
END

IF
    Global("BDAI_NO_ARCANE","LOCALS",1)
    ActionListEmpty()
    InParty(Myself)
    !AreaCheck("AR0020")  // City Gates
    !AreaCheck("AR0300")  // The Docks
    !AreaCheck("AR0400")  // Slums
    !AreaCheck("AR0500")  // Bridge District
    !AreaCheck("AR0700")  // Waukeen's Promenade
    !AreaCheck("AR0900")  // Temple District
    !AreaCheck("AR1000")  // Government District
THEN
    RESPONSE #100
        SetGlobal("BDAI_NO_ARCANE","LOCALS",0)
END
  • AreaType(OUTDOOR) est ici superflu, il est vrai que toutes les zones concernées par la surveillance se situent en extérieur mais rien ne le garanti dans l’absolu (le second bloc ne sert donc pas)

  • InParty(Myself) est bien mais ne correspond pas totalement avec le script des mages qui est SpellCast([PC],0), il faudrait plutôt utiliser Allegiance(Myself, PC)

  • pas de gestion de SpellsBad

  • pas de gestion des cas où les conditions évolueraient au sein même d’une zone (par exemple, lors de la 7ème et dernière intervention, le script n’acceptera pas de lancer des sorts, car BDAI_NO_ARCANE vaudra toujours 1)

  • ActionListEmpty() est discutable car cela empêche le personnage de s’arrêter (c’est bien) mais le chargement des variables est importante et il est possible que des sorts n’aient pas la containte ActionListEmpty() et puissent donc être lancés

Note

Les mages cagoulés surveillent les sorts de mage.
Pas les sorts druidiques, pas les sorts divins, pas les compétences spéciales…
En revanche, cela impacte les objets qui lancent de façon indirecte, un sort de mage (comme les parchemins, mais aussi le casque de Vailhor).

Liste de carte dynamique#

Une des diffcultés que rencontre chaque mod, est de lister les différentes zones surveillées par les mages cagoulés de façon « dynamique », en effet elle est actuellement « en dur » et correspond à celle de la version vanilla. Mais elle peut être modifiée par d’autres mods sans pouvoir être prise en compte par le script.

Il serait utile d’ajouter collectivement une variable dans les zones surveillées par les mages cagoulés :

IF
    Global("CowledCheckArea", "AR...", 0)
THEN
    RESPONSE #100
        SetGlobal("CowledCheckArea", "AR...", 1)
END

En appliquant le bloc ci-dessus dans les maps concernées, dans tous les scripts des personnages il serait possible de checker dynamiquement cette valeur même si des mods ajoutent ou enlèvent des zones.

IF
    Global("CanCastAthkatla", "LOCALS", 1)
    Global("BribedCowled", "GLOBAL", 0)
    GlobalLT("CowledWarning", "GLOBAL", 7)
    Allegiance(Myself, PC)
    !GlobalTimerNotExpired("SpellsBad", "GLOBAL")
    Global("CowledCheckArea", "MYAREA", 1)
THEN
    RESPONSE #100
        SetGlobal("CanCastAthkatla", "LOCALS", 0)
END

IF
    Global("CanCastAthkatla", "LOCALS", 0)
    OR(5)
        !Allegiance(Myself, PC)
        Global("BribedCowled", "GLOBAL", 1)
        GlobalGT("CowledWarning", "GLOBAL", 6)
        GlobalTimerNotExpired("SpellsBad", "GLOBAL")
        Global("CowledCheckArea", "MYAREA", 0)
THEN
    RESPONSE #100
        SetGlobal("CanCastAthkatla", "LOCALS", 1)
END