IA caster

Répondre
Partager Rechercher
Je trouve que l'IA pour les casters NPC hostiles est indigente.

Je n arrive pas a faire des casters qui utilisent reellement leurs sorts sur les joueurs. Dans 80% des cas, ils viennent au contact et se fon exploser.

QUelqu un a une solution ? Testé une IA sur le vault ? AUtre ?

Merci pour vos reponses eclairées.
Pour l'instant à part mettre les mains à la pâte et en scripter une soi-même, je ne vois pas... Sinon regarde aussi les scripts pour NwN 1er du nom sur le vault. Peut être qu'il y a des trucs intéressants à adapter.
essais de reprendre les scripts de nwn1. ils fonctionnaient mieux si je me rapel bien.


Je suis assez sur le cul de voir que le seul pretre dans l'equippe ne soit pas foutu d'healer une seule fois un membre de l'équippe alors que tous le mon en ai besoin.
Citation :
Publié par paladin3333
essais de reprendre les scripts de nwn1. ils fonctionnaient mieux si je me rapel bien.


Je suis assez sur le cul de voir que le seul pretre dans l'equippe ne soit pas foutu d'healer une seule fois un membre de l'équippe alors que tous le mon en ai besoin.
A priori ce sont les meme scripts non ?
j'ai pas regardé ce qu'il s'y trouve mais dans les scripts par défaut de dialogue, tu as ga_attack_caster qui donne ça.

Peut être une piste ?


Code PHP:

void main()
{

    
AIAttackPreference(OBJECT_SELFATTACK_PREFERENCE_CLASS_PRIORITY);


    
AIAttackInOrder(OBJECT_SELF,    AI_CLASS_TYPE_SPELLCASTERS        );        //first class to attack..

    
AIAttackInOrder(OBJECT_SELF,    AI_CLASS_TYPE_RANGED        );        //second..

    
AIAttackInOrder(OBJECT_SELF,    AI_CLASS_TYPE_MELEE        );        //so on..

Ca c'est pour attaquer les lanceur de sorts en premier, puis les archers et enfin les combattants de melée. Sinon j'ai regardé dans la campagne et je n'ai vu aucune variable ni aucun script particulier sur les créatures de type lanceurs de sorts qui pourtant utilisent bien leurs sorts. Tu devrais essayer d'exporter l'une d'entre elle et la tester sur un mod à part.
X2_L_BEH_MAGIC et X2_L_BEH_COMPASSION sont vos amis

La première variable contrôle les chances qu'un lanceur de sorts fasse appel à la magie, la seconde le degré de compassion d'un prêtre envers ses alliés.
Citation :
Publié par maero
X2_L_BEH_MAGIC et X2_L_BEH_COMPASSION sont vos amis

La première variable contrôle les chances qu'un lanceur de sorts fasse appel à la magie, la seconde le degré de compassion d'un prêtre envers ses alliés.
tu les trouves où ces variables s'il te plaît ?
__________________
http://img91.imageshack.us/img91/9666/yingyangwm8jt3.gif
http://simaon.free.fr/
Merci, je vais tester ca.

Sinon, je me suis apercu d un truc :

J ai un script qui au spawn d une creature ajuste son niveau par rapport au niveau des joueurs.

Pour cela j utilise la fonction , ResetCreatureLevelForXP
suivie de Forcerest

ET a partir de la la creature n utilise plus du tout ses spells. Idem en faisant la manip directement avec le DM client. ....
Citation :
Publié par maero
X2_L_BEH_MAGIC et X2_L_BEH_COMPASSION sont vos amis

La première variable contrôle les chances qu'un lanceur de sorts fasse appel à la magie, la seconde le degré de compassion d'un prêtre envers ses alliés.
J ai testé :

J ai créé un pretre orc. Avec des sorts de soins et des sorts d attaque.

J ai collé les deux variables sur la creature.

Et.... Rien

Elle n utilise absolument pas ses sorts.




EDIT :

Bon, c est mpoi qui suis con. Mon pretre n avait pas assez de sagesse pour peter ses spells....
Citation :
Publié par Ariok
Bon, c est mpoi qui suis con. Mon pretre n avait pas assez de sagesse pour peter ses spells....
J'avais aussi testé et c'est génial ces deux variables
le truc c'est qu'il faut éviter de mettre des sorts de boule de feu au PNJ s'il est en groupe
C est TOP ces deux variables, ca marche vraimment bien.

Il y a aussi celle ci qui est pas mal pour les caster : X2_SPELL_RANDOM. Avec celle ci j ai enfin eu un caster qui lance convocation de creature.

Ces 3 variables associées ameliorent enormement le comportement des caster NPC !
pour X2_SPELL_RANDOM moi franchement j'adore la mettre pour les PNJs caster qui sont soit débutant soit très maladroits


Pour info tu les mets à combien ?
Pour ma part X2_L_BEH_MAGIC entre 50 et 80 % (suivant le niveau du lanceur de sort)
et X2_L_BEH_COMPASSION entre 20 et 80 suivant le caractère offensif du pnj
J'avais écris des docs pour notre staff à la sortie du jeu. C'est pas formidable, c'est rien d'autre qu'une petite analyse de comment ça marche l'IA des créatures du jeu.

Scripts d'IA defaults

scripts IA de combat - version.DOC]Personaliser l'IA sans effectuer de modifs aux scripts

Voilà, si ça peut aider et si vous voyez des choses à y rajouter...
Citation :
Publié par Kétil Dimzad
J'avais écris des docs pour notre staff à la sortie du jeu. C'est pas formidable, c'est rien d'autre qu'une petite analyse de comment ça marche l'IA des créatures du jeu.

Scripts d'IA defaults

scripts IA de combat - version.DOC]Personaliser l'IA sans effectuer de modifs aux scripts

Voilà, si ça peut aider et si vous voyez des choses à y rajouter...
Merci beaucoup, c est tres interressant !
Lightbulb
Tiens j'ai trouvé ça aussi, ce qui a l'air vraiment intéressant si tu veux customiser tes attaques. Le soucis est de changer les cibles, car apparemment, oTarget est forcément le joueur le plus proche (et non pas l'ennemi le plus proche)


CHARACTER LEVEL SCRIPTS.
nw_c8_lv123.nss ---------- => Bard: Level 12 (Offensive)
nw_c8_lv203.nss ---------- => Bard: Level 20 (Offensive)
nw_c8_lv23.nss ---------- => Bard: Level 7 (Offensive)
nw_c8_lv73.nss ---------- => Bard: Level 7 (Offensive)
nw_cb_lv123.nss ---------- => Wizard: Level 12 (Offensive)
nw_cb_lv203.nss ---------- => Wizard: Level 20 (Offensive)
nw_cb_lv23.nss ---------- => Wizard: Level 2 (Offensive)
nw_cb_lv73.nss ---------- => Wizard: Level 7 (Offensive)
nw_cd_evsummon3.nss => Evil, low-level, summoner
nw_cd_lv123.nss ---------- => Cleric: Level 20
nw_cd_lv203.nss ---------- => Cleric: Level 20
nw_cd_lv23.nss ---------- => Cleric: Level 20

Surement à mettre dans l'event déclenché par la fin du tour de combat


exemple nw_cb_lv123.nss




De plus on peut mettre dans le OnSpawn de ces créatures des FLAGS comme
Code PHP:

// permet à la créature de se buffer avant l'arrivée des joueurs
SetSpawnInCondition(NW_FLAG_FAST_BUFF_ENEMY); 

Faudrait aussi que je regarde les SetAssociateState pour voir ce que ça donne sur des PNJs hors Henchman.. Mais si quelqu'un peut s'en occuper
ah bin tiens je viens de m'apercevoir que les scripts que j'ai cités n'étaint plus là dans nwn 2

en passant si quelqu'un savait ce que représentait le sort SPELL_MISLEAD (niveau 6 apparemment.. marche pas sur nwn 2 ) ainsi que PROTECTION_FROM_ELEMENTS (niveau 3 .. )

bon bin je mets celui des magiciens et ensorceleurs

apparemment il faut mettre une variable int sur le magicien
// FindWizardType
// * 0 - Typical Wizard
// * 1 - Fire Freak Wizard
// * 2 - Charm/Fear/Domination Wizard
// * 3 - Heavy Summoning Wizard
// * 4 - Death Spells

Code PHP:

//Wizard: Level 20 (Offensive)
//*  Spell Level    0   1   2   3   4   5   6   7   8   9
//* -------------------------------------------------------
//*  Spell/Day
//*  Level 1        3   1   -   -   -   -   -   -   -   -
//*  Level 2        4   2   -   -   -   -   -   -   -   -
//*  Level 3        4   2   1   -   -   -   -   -   -   -
//*  Level 4        4   3   2   -   -   -   -   -   -   -
//*  Level 5        4   3   2   1   -   -   -   -   -   -
//*  Level 6        4   3   3   2   -   -   -   -   -   -
//*  Level 7        4   4   3   2   1   -   -   -   -   -
//*  Level 8        4   4   3   3   2   -   -   -   -   -
//*  Level 9        4   4   4   3   2   1   -   -   -   -
//*  Level 10       4   4   4   3   3   2   -   -   -   -
//*  Level 11       4   4   4   4   3   2   1   -   -   -
//*  Level 12       4   4   4   4   3   3   2   -   -   -
//*  Level 13       4   4   4   4   3   3   2   1   -   -
//*  Level 14       4   4   4   4   4   3   3   2   -   -
//*  Level 15       4   4   4   4   4   4   3   2   1   -
//*  Level 16       4   4   4   4   4   4   3   3   2   -
//*  Level 17       4   4   4   4   4   4   4   3   2   1
//*  Level 18       4   4   4   4   4   4   4   3   3   2
//*  Level 19       4   4   4   4   4   4   4   4   3   3
//*  Level 20       4   4   4   4   4   4   4   4   4   4

// * Spell Suggestions
// * Protection Spells:  Level 1: Protection from Evil/Good/Law, Mage Armor
// *                     Level 2: Resist Elements, Invisibility, Mirror Image, Bull's Strength
// *                     Level 3: Magic Circle against Chaos/Evil/Good/Law, Protection from Elements,
// *                              Invisibility Sphere, Haste
// *                     Level 4: Minor Globe of Invulnerability, Stoneskin, Fire Shield,
// *                              Improved Invisibility
// *                     Level 5: N/A
// *                     Level 6: Globe of Invulnerability, True Seeing, Mislead, Mass Haste,
// *                              Tenser's Transformation
// *                     Level 7: Spell Turning, Mass Invisibility, Simulacrum
// *                     Level 8: Protection from Spells
// *                     Level 9: N/A
// * Offensive Spells:   Level 1: Charm Person, Color Spray, Sleep, Magic Missile,
// *                              Ray of Enfeeblement, Burning Hands, Summon Monster I
// *                     Level 2: Melf’s Acid Arrow, Summon Monster II, Web,
// *                              Ghoul Touch, Blindness/Deafness
// *                     Level 3: Dispel Magic, Flame Arrow, Stinking Cloud, Summon Monster III,
// *                              Hold Person, Fireball, Lightning Bolt, Vampiric Touch, Slow
// *                     Level 4: Summon Monster IV, Charm Monster, Confusion, Fear
// *                     Level 5: Cloudkill, Summon Monster V, Dominate Person, Feeblemind,
// *                              Hold Monster, Cone of Cold, Animate Dead,
// *                     Level 6: Greater Dispelling, Acid Fog, Summon Monster VI, Chain Lightning,
// *                              Circle of Death
// *                     Level 7: Power Word: Stun, Summon Monster VII, Delayed Blast Fireball,
// *                              Mordenkainen's Sword, Prismatic Spray, Control Undead, Finger of Death,
// *                     Level 8: Incendiary Cloud, Power Word: Blind, Summon Monster VIII, Mass Charm,
// *                     Level 9: Mordenkainen's Disjunction, Gate, Power Word: Kill, Summon Monster IX,
// *                              Dominate Monster, Meteor Swarm, Weird, Energy Drain, Wail of the Banshee,
// *                              Time Stop

int HasSpell(int Spell)
{
 
int nResult FALSE;
    if (
GetLocalInt(OBJECT_SELF,"SPELLS" IntToString(Spell)) == 0)
    {
        
nResult TRUE;
        
SetLocalInt(OBJECT_SELF,"SPELLS" IntToString(Spell), 1);
    }
 return 
nResult;
}

void main()
{
    
// * HACK: should replace with get nearest creature reputation type
    
object oNearestTarget GetNearestCreature(CREATURE_TYPE_PLAYER_CHARPLAYER_CHAR_IS_PC);
    
object oNearestFriend GetNearestCreature(CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_FRIEND);
    if(
GetLocalInt(OBJECT_SELF,"FindWizardType") == 0)
        {
            
int nRandNum Random(10);
            if(
nRandNum 4)
                {
                
nRandNum 0;
                }
            
SetLocalInt(OBJECT_SELF,"WizardType",nRandNum);// * 0 - Typical Wizard
                                                           // * 1 - Fire Freak Wizard
                                                           // * 2 - Charm/Fear/Domination Wizard
                                                           // * 3 - Heavy Summoning Wizard
                                                           // * 4 - Death Spells
            
SetLocalInt(OBJECT_SELF,"FindWizardType",1);
        }
     
//GetNearestCreature(CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY);

switch (GetLocalInt(OBJECT_SELF,"WizardType"))
{
case 
0:
  {
    if(
HasSpell(SPELL_HASTE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_HASTEOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_PREMONITION) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_PREMONITIONOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_MIND_BLANK) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_MIND_BLANKOBJECT_SELF);
    }
    
// je ne connais pas ce sort
    /*else
    if(HasSpell(SPELL_MISLEAD) == TRUE)
    {
        ClearAllActions();
        ActionCastSpellAtObject(SPELL_MISLEAD, OBJECT_SELF);
    }*/
    
else
    if(
HasSpell(SPELL_SPELL_TURNING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_SPELL_TURNINGOBJECT_SELF);
    }
    else
    if((
HasSpell(SPELL_PROTECTION_FROM_SPELLS) == TRUE)
       && ((
oNearestTarget != (GetNearestCreature(CREATURE_TYPE_CLASS,CLASS_TYPE_BARBARIAN)))
       || (
oNearestTarget != (GetNearestCreature(CREATURE_TYPE_CLASS,CLASS_TYPE_FIGHTER)))
       || (
oNearestTarget != (GetNearestCreature(CREATURE_TYPE_CLASS,CLASS_TYPE_MONK)))
       || (
oNearestTarget != (GetNearestCreature(CREATURE_TYPE_CLASS,CLASS_TYPE_ROGUE)))))
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_PROTECTION_FROM_SPELLSOBJECT_SELF);
    }
    else
    if ((
oNearestTarget == (GetNearestCreature(CREATURE_TYPE_RACIAL_TYPE,RACIAL_TYPE_ELEMENTAL)))
    && (
HasSpell(SPELL_PROTECTION_FROM_ENERGY) == TRUE))
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_PROTECTION_FROM_ENERGYOBJECT_SELF);
    }
    else
    
// * Check if player has protection spells on
    
if(HasSpell(SPELL_GREATER_DISPELLING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_GREATER_DISPELLINGoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_WAIL_OF_THE_BANSHEE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_WAIL_OF_THE_BANSHEEoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_METEOR_SWARM) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_METEOR_SWARMoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_INCENDIARY_CLOUD) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_INCENDIARY_CLOUDoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_FINGER_OF_DEATH) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_FINGER_OF_DEATHoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_PRISMATIC_SPRAY) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_PRISMATIC_SPRAYoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_CHAIN_LIGHTNING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_CHAIN_LIGHTNINGoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_CONE_OF_COLD) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_CONE_OF_COLDOBJECT_SELF);
    }
    else
    
// * Check distance so not too close to fireball
    
if((HasSpell(SPELL_FIREBALL) == TRUE) && (GetDistanceToObject(oNearestTarget) > 10.0))
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_FIREBALLoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_FLAME_ARROW) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_FLAME_ARROWoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_MELFS_ACID_ARROW) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_MELFS_ACID_ARROWoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_MAGIC_MISSILE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_MAGIC_MISSILEoNearestTarget);
    }
    else
    {
        
ActionAttack(oNearestTarget);
    }
  }
  break;
case 
1:  // * Uses more Fire Related Spells
  
{
    if(
HasSpell(SPELL_HASTE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_HASTEOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_PREMONITION) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_PREMONITIONOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_ELEMENTAL_SHIELD) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_ELEMENTAL_SHIELDOBJECT_SELF);
    }
    
/*
    else
    if(HasSpell(SPELL_MISLEAD) == TRUE)
    {
        ClearAllActions();
        ActionCastSpellAtObject(SPELL_MISLEAD, OBJECT_SELF);
    }*/
    
else
    if(
HasSpell(SPELL_SPELL_TURNING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_SPELL_TURNINGOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_PROTECTION_FROM_ENERGY) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_PROTECTION_FROM_ENERGYOBJECT_SELF);
    }
    else
    
// * Check if player has protection spells on
    
if(HasSpell(SPELL_GREATER_DISPELLING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_GREATER_DISPELLINGoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_TIME_STOP) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_TIME_STOPoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_METEOR_SWARM) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_METEOR_SWARMoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_INCENDIARY_CLOUD) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_INCENDIARY_CLOUDoNearestTarget);
    }
    else
    
// * Check distance so not too close to fireball
    
if((HasSpell(SPELL_FIREBALL) == TRUE) && (GetDistanceToObject(oNearestTarget) > 10.0))
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_FIREBALLoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_FLAME_ARROW) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_FLAME_ARROWoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_MELFS_ACID_ARROW) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_MELFS_ACID_ARROWoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_MAGIC_MISSILE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_MAGIC_MISSILEoNearestTarget);
    }
    else
    {
        
ActionAttack(oNearestTarget);
    }
  }
  break;
case 
2:  // * Concentrates on Charming/Domination/Fearing
  
{
    if(
HasSpell(SPELL_HASTE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_HASTEOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_PREMONITION) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_PREMONITIONOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_MIND_BLANK) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_MIND_BLANKOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_FEAR) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_FEAROBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_SPELL_TURNING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_SPELL_TURNINGOBJECT_SELF);
    }
    else
    
// * Check if player has protection spells on
    
if(HasSpell(SPELL_GREATER_DISPELLING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_GREATER_DISPELLINGoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_TIME_STOP) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_TIME_STOPoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_POWER_WORD_STUN) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_POWER_WORD_STUNoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_MASS_CHARM) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_MASS_CHARMoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_DOMINATE_MONSTER) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_DOMINATE_MONSTERoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_WAIL_OF_THE_BANSHEE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_WAIL_OF_THE_BANSHEEoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_FEEBLEMIND) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_FEEBLEMINDoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_DOMINATE_PERSON) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_DOMINATE_PERSONoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_CHARM_PERSON) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_CHARM_PERSONoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_MAGIC_MISSILE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_MAGIC_MISSILEoNearestTarget);
    }
    else
    {
        
ActionAttack(oNearestTarget);
    }
  }
  break;
case 
3:  // * Uses Many Summoning Spells
  
{
    if(
HasSpell(SPELL_HASTE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_HASTEOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_PREMONITION) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_PREMONITIONOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_ELEMENTAL_SHIELD) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_ELEMENTAL_SHIELDOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_SPELL_TURNING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_SPELL_TURNINGOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_PROTECTION_FROM_EVIL) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_PROTECTION_FROM_EVILOBJECT_SELF);
    }
    else
    
// * Check if player has protection spells on
    
if(HasSpell(SPELL_GREATER_DISPELLING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_GREATER_DISPELLINGoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_TIME_STOP) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_TIME_STOPoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_GATE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_GATEoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_POWER_WORD_STUN) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_POWER_WORD_STUNoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_MORDENKAINENS_SWORD) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_MORDENKAINENS_SWORDoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_WEB) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_WEBoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_SUMMON_CREATURE_VII) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_SUMMON_CREATURE_VIIoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_FLAME_ARROW) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_FLAME_ARROWoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_SUMMON_CREATURE_IV) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_SUMMON_CREATURE_IVoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_MAGIC_MISSILE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_MAGIC_MISSILEoNearestTarget);
    }
    else
    {
        
ActionAttack(oNearestTarget);
    }
  }
  break;
case 
4:  // * Deadly Wizard
  
{
    if(
HasSpell(SPELL_HASTE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_HASTEOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_PREMONITION) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_PREMONITIONOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_MIND_BLANK) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_MIND_BLANKOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_WAIL_OF_THE_BANSHEE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_WAIL_OF_THE_BANSHEEoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_SPELL_TURNING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_SPELL_TURNINGOBJECT_SELF);
    }
    else
    
// * Check if player has protection spells on
    
if(HasSpell(SPELL_GREATER_DISPELLING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_GREATER_DISPELLINGoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_TIME_STOP) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_TIME_STOPoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_POWER_WORD_KILL) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_POWER_WORD_KILLoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_FINGER_OF_DEATH) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_FINGER_OF_DEATHoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_ENERGY_DRAIN) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_ENERGY_DRAINoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_CLOUDKILL) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_CLOUDKILLoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_CHAIN_LIGHTNING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_CHAIN_LIGHTNINGoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_MAGIC_MISSILE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_MAGIC_MISSILEoNearestTarget);
    }
    else
    {
        
ActionAttack(oNearestTarget);
    }
  }
  break;
}

Code PHP:

// Wizard: Level 12 (Offensive)
//*  Spell Level    0   1   2   3   4   5   6   7   8   9
//* -------------------------------------------------------
//*  Spell/Day
//*  Level 1        3   1   -   -   -   -   -   -   -   -
//*  Level 2        4   2   -   -   -   -   -   -   -   -
//*  Level 3        4   2   1   -   -   -   -   -   -   -
//*  Level 4        4   3   2   -   -   -   -   -   -   -
//*  Level 5        4   3   2   1   -   -   -   -   -   -
//*  Level 6        4   3   3   2   -   -   -   -   -   -
//*  Level 7        4   4   3   2   1   -   -   -   -   -
//*  Level 8        4   4   3   3   2   -   -   -   -   -
//*  Level 9        4   4   4   3   2   1   -   -   -   -
//*  Level 10       4   4   4   3   3   2   -   -   -   -
//*  Level 11       4   4   4   4   3   2   1   -   -   -
//*  Level 12       4   4   4   4   3   3   2   -   -   -

// * Spell Suggestions
// * Protection Spells:  Level 1: Protection from Evil/Good/Law, Mage Armor
// *                     Level 2: Resist Elements, Invisibility, Mirror Image, Bull's Strength
// *                     Level 3: Magic Circle against Chaos/Evil/Good/Law, Protection from Elements,
// *                              Invisibility Sphere, Haste
// *                     Level 4: Minor Globe of Invulnerability, Stoneskin, Fire Shield,
// *                              Improved Invisibility
// *                     Level 5: N/A
// *                     Level 6: Globe of Invulnerability, True Seeing, Mislead, Mass Haste,
// *                              Tenser's Transformation
// * Offensive Spells:   Level 1: Charm Person, Color Spray, Sleep, Magic Missile,
// *                              Ray of Enfeeblement, Burning Hands, Summon Monster I
// *                     Level 2: Melf’s Acid Arrow, Summon Monster II, Web,
// *                              Ghoul Touch, Blindness/Deafness
// *                     Level 3: Dispel Magic, Flame Arrow, Stinking Cloud, Summon Monster III,
// *                              Hold Person, Fireball, Lightning Bolt, Vampiric Touch, Slow
// *                     Level 4: Summon Monster IV, Charm Monster, Confusion, Fear
// *                     Level 5: Cloudkill, Summon Monster V, Dominate Person, Feeblemind,
// *                              Hold Monster, Cone of Cold, Animate Dead,
// *                     Level 6: Greater Dispelling, Acid Fog, Summon Monster VI, Chain Lightning,
// *                              Circle of Death

int HasSpell(int Spell)
{
 
int nResult FALSE;
    if (
GetLocalInt(OBJECT_SELF,"SPELLS" IntToString(Spell)) == 0)
    {
        
nResult TRUE;
        
SetLocalInt(OBJECT_SELF,"SPELLS" IntToString(Spell), 1);
    }
 return 
nResult;
}

void main()
{
    
// * HACK: should replace with get nearest creature reputation type
    
object oNearestTarget GetNearestCreature(CREATURE_TYPE_PLAYER_CHARPLAYER_CHAR_IS_PC);
    
object oNearestFriend GetNearestCreature(CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_FRIEND);
    if(
GetLocalInt(OBJECT_SELF,"FindWizardType") == 0)
        {
            
int nRandNum Random(10);
            if(
nRandNum 4)
                {
                
nRandNum 0;
                }
            
SetLocalInt(OBJECT_SELF,"WizardType",nRandNum);// * 0 - Typical Wizard
                                                           // * 1 - Fire Freak Wizard
                                                           // * 2 - Charm/Fear/Domination Wizard
                                                           // * 3 - Heavy Summoning Wizard
                                                           // * 4 - Death Spells
            
SetLocalInt(OBJECT_SELF,"FindWizardType",1);
        }
     
//GetNearestCreature(CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY);

switch (GetLocalInt(OBJECT_SELF,"WizardType"))
{
case 
0:
  {
    if(
HasSpell(SPELL_HASTE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_HASTEOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_STONESKIN) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_STONESKINOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_CLARITY) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_CLARITYOBJECT_SELF);
    }
/*    else
    if(HasSpell(SPELL_MISLEAD) == TRUE)
    {
        ClearAllActions();
        ActionCastSpellAtObject(SPELL_MISLEAD, OBJECT_SELF);
    }*/
    
else
    if(
HasSpell(SPELL_SPELL_TURNING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_SPELL_TURNINGOBJECT_SELF);
    }
    else
    if((
HasSpell(SPELL_PROTECTION_FROM_SPELLS) == TRUE)
       && ((
oNearestTarget != (GetNearestCreature(CREATURE_TYPE_CLASS,CLASS_TYPE_BARBARIAN)))
       || (
oNearestTarget != (GetNearestCreature(CREATURE_TYPE_CLASS,CLASS_TYPE_FIGHTER)))
       || (
oNearestTarget != (GetNearestCreature(CREATURE_TYPE_CLASS,CLASS_TYPE_MONK)))
       || (
oNearestTarget != (GetNearestCreature(CREATURE_TYPE_CLASS,CLASS_TYPE_ROGUE)))))
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_PROTECTION_FROM_SPELLSOBJECT_SELF);
    }
    else
    if ((
oNearestTarget == (GetNearestCreature(CREATURE_TYPE_RACIAL_TYPE,RACIAL_TYPE_ELEMENTAL)))
    && (
HasSpell(SPELL_PROTECTION_FROM_ENERGY) == TRUE))
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_PROTECTION_FROM_ENERGYOBJECT_SELF);
    }
    else
    
// * Check if player has protection spells on
    
if(HasSpell(SPELL_GREATER_DISPELLING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_GREATER_DISPELLINGoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_CHAIN_LIGHTNING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_CHAIN_LIGHTNINGoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_CONE_OF_COLD) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_CONE_OF_COLDOBJECT_SELF);
    }
    else
    
// * Check distance so not too close to fireball
    
if((HasSpell(SPELL_FIREBALL) == TRUE) && (GetDistanceToObject(oNearestTarget) > 10.0))
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_FIREBALLoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_FLAME_ARROW) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_FLAME_ARROWoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_MELFS_ACID_ARROW) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_MELFS_ACID_ARROWoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_MAGIC_MISSILE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_MAGIC_MISSILEoNearestTarget);
    }
    else
    {
        
ActionAttack(oNearestTarget);
    }
  }
  break;
case 
1:  // * Uses more Fire Related Spells
  
{
    if(
HasSpell(SPELL_HASTE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_HASTEOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_STONESKIN) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_STONESKINOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_ELEMENTAL_SHIELD) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_ELEMENTAL_SHIELDOBJECT_SELF);
    }
/*    else
    if(HasSpell(SPELL_MISLEAD) == TRUE)
    {
        ClearAllActions();
        ActionCastSpellAtObject(SPELL_MISLEAD, OBJECT_SELF);
    }*/
    
else
    if(
HasSpell(SPELL_SPELL_TURNING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_SPELL_TURNINGOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_PROTECTION_FROM_ENERGY) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_PROTECTION_FROM_ENERGYOBJECT_SELF);
    }
    else
    
// * Check if player has protection spells on
    
if(HasSpell(SPELL_GREATER_DISPELLING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_GREATER_DISPELLINGoNearestTarget);
    }
    else
    
// * Check distance so not too close to fireball
    
if((HasSpell(SPELL_FIREBALL) == TRUE) && (GetDistanceToObject(oNearestTarget) > 10.0))
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_FIREBALLoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_FLAME_ARROW) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_FLAME_ARROWoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_MELFS_ACID_ARROW) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_MELFS_ACID_ARROWoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_MAGIC_MISSILE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_MAGIC_MISSILEoNearestTarget);
    }
    else
    {
        
ActionAttack(oNearestTarget);
    }
  }
  break;
case 
2:  // * Concentrates on Charming/Domination/Fearing
  
{
    if(
HasSpell(SPELL_HASTE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_HASTEOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_STONESKIN) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_STONESKINOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_CLARITY) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_CLARITYOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_FEAR) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_FEAROBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_SPELL_TURNING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_SPELL_TURNINGOBJECT_SELF);
    }
    else
    
// * Check if player has protection spells on
    
if(HasSpell(SPELL_GREATER_DISPELLING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_GREATER_DISPELLINGoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_WEB) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_WEBoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_FEEBLEMIND) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_FEEBLEMINDoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_DOMINATE_PERSON) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_DOMINATE_PERSONoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_CHARM_PERSON) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_CHARM_PERSONoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_MAGIC_MISSILE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_MAGIC_MISSILEoNearestTarget);
    }
    else
    {
        
ActionAttack(oNearestTarget);
    }
  }
  break;
case 
3:  // * Uses Many Summoning Spells
  
{
    if(
HasSpell(SPELL_HASTE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_HASTEOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_STONESKIN) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_STONESKINOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_ELEMENTAL_SHIELD) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_ELEMENTAL_SHIELDOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_SPELL_TURNING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_SPELL_TURNINGOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_PROTECTION_FROM_EVIL) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_PROTECTION_FROM_EVILOBJECT_SELF);
    }
    else
    
// * Check if player has protection spells on
    
if(HasSpell(SPELL_GREATER_DISPELLING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_GREATER_DISPELLINGoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_SUMMON_CREATURE_VI) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_SUMMON_CREATURE_VIoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_FLAME_ARROW) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_FLAME_ARROWoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_SUMMON_CREATURE_V) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_SUMMON_CREATURE_VoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_SUMMON_CREATURE_IV) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_SUMMON_CREATURE_IVoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_LIGHTNING_BOLT) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_LIGHTNING_BOLToNearestTarget);
    }
    else
    if(
HasSpell(SPELL_MAGIC_MISSILE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_MAGIC_MISSILEoNearestTarget);
    }
    else
    {
        
ActionAttack(oNearestTarget);
    }
  }
  break;
case 
4:  // * Deadly Wizard
  
{
    if(
HasSpell(SPELL_HASTE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_HASTEOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_STONESKIN) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_STONESKINOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_CLARITY) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_CLARITYOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_STINKING_CLOUD) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_STINKING_CLOUDOBJECT_SELF);
    }
    else
    if(
HasSpell(SPELL_SPELL_TURNING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_SPELL_TURNINGOBJECT_SELF);
    }
    else
    
// * Check if player has protection spells on
    
if(HasSpell(SPELL_GREATER_DISPELLING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_GREATER_DISPELLINGoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_CIRCLE_OF_DEATH) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_CIRCLE_OF_DEATHoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_CLOUDKILL) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_CLOUDKILLoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_CHAIN_LIGHTNING) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_CHAIN_LIGHTNINGoNearestTarget);
    }
    else
    if(
HasSpell(SPELL_MAGIC_MISSILE) == TRUE)
    {
        
ClearAllActions();
        
ActionCastSpellAtObject(SPELL_MAGIC_MISSILEoNearestTarget);
    }
    else
    {
        
ActionAttack(oNearestTarget);
    }
  }
  break;
}

par contre où est ce que j'ai choppé ces scripts... j'en sais plus rien
__________________
http://img91.imageshack.us/img91/9666/yingyangwm8jt3.gif
http://simaon.free.fr/
Je viens de voir que j'avais oublié de vous filer une doc sympa que j'avais faites ya qqs mois :

http://mowlvp.free.fr/documentation_...metrage_IA.zip

Ca décrit comment paramétrer simplement les comportements des créatures. Ya des trucs pour le combat aussi.

Par contre vous aurez ptet des modifs à faire dans l'IA de nwn2 pour pouvoir utiliser toutes ces possibilités, puisque en fait, obsidian a repris l'IA de nwn1 mais à commenté certaines passages. Enfin bon, voilà quoi...
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés