//////////////////////////////////////////////////////////////////////////////// // // Olander's AI // nw_c2_defaultb // by Don Anderson // dandersonru@msn.com // // On Spell Cast At // Original script by Bioware // //////////////////////////////////////////////////////////////////////////////// #include "x2_i0_spells" #include "oai_inc_ai" void main() { object oCaster = GetLastSpellCaster(); if(GetLastSpellHarmful()) { SetCommandable(TRUE); if(OAI_GetIsAlly(oCaster) == TRUE) { ClearPersonalReputation(oCaster, OBJECT_SELF); ClearAllActions(TRUE); DelayCommand(1.2, ActionDoCommand(OAI_DetermineCombatRound())); // Send the user-defined event as appropriate if(GetSpawnInCondition(NW_FLAG_SPELL_CAST_AT_EVENT)) { SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_SPELL_CAST_AT)); } return; } int bAttack = TRUE; // ------------------------------------------------------------------ // GZ, 2003-Oct-02 // Try to do something smart if we are subject to an AoE Spell. // ------------------------------------------------------------------ if (MatchAreaOfEffectSpell(GetLastSpell()) == TRUE) { int nAI = (GetBestAOEBehavior(GetLastSpell())); // from x2_i0_spells switch (nAI) { case X2_SPELL_AOEBEHAVIOR_DISPEL_L: case X2_SPELL_AOEBEHAVIOR_DISPEL_N: case X2_SPELL_AOEBEHAVIOR_DISPEL_M: case X2_SPELL_AOEBEHAVIOR_DISPEL_G: case X2_SPELL_AOEBEHAVIOR_DISPEL_C: bAttack = FALSE; ActionCastSpellAtLocation(nAI, GetLocation(OBJECT_SELF)); ActionDoCommand(SetCommandable(TRUE)); SetCommandable(FALSE); break; case X2_SPELL_AOEBEHAVIOR_FLEE: ClearActions(CLEAR_NW_C2_DEFAULTB_GUSTWIND); oCaster = GetLastSpellCaster(); ActionForceMoveToObject(oCaster, TRUE, 2.0); DelayCommand(1.2, ActionDoCommand(OAI_DetermineCombatRound(oCaster))); bAttack = FALSE; break; case X2_SPELL_AOEBEHAVIOR_IGNORE: // well ... nothing break; case X2_SPELL_AOEBEHAVIOR_GUST: ActionCastSpellAtLocation(SPELL_GUST_OF_WIND, GetLocation(OBJECT_SELF)); ActionDoCommand(SetCommandable(TRUE)); SetCommandable(FALSE); bAttack = FALSE; break; } } // --------------------------------------------------------------------- // Not an area of effect spell, but another hostile spell. // If we're not already fighting someone else, // attack the caster. // --------------------------------------------------------------------- if( !GetIsFighting(OBJECT_SELF) && bAttack) { if(GetBehaviorState(NW_FLAG_BEHAVIOR_OMNIVORE) || GetBehaviorState(NW_FLAG_BEHAVIOR_HERBIVORE)) { //DetermineSpecialBehavior(oCaster); OAI_DetermineSpecialBehavior(oCaster); } else { OAI_DetermineCombatRound(oCaster); } } // We were attacked, so yell for help SetCommandable(TRUE); //Shout Attack my target, only works with the On Spawn In setup SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK); //Shout that I was attacked SpeakString("NW_I_WAS_ATTACKED", TALKVOLUME_SILENT_TALK); } else { // --------------------------------------------------------------------- // July 14, 2003 BK // If there is a valid enemy nearby and a NON HARMFUL spell has been // cast on me I should call DetermineCombatRound // I may be invisible and casting spells on myself to buff myself up // --------------------------------------------------------------------- // Fix: JE - let's only do this if I'm currently in combat. If I'm not // in combat, and something casts a spell on me, it'll make me search // out the nearest enemy, no matter where they are on the level, which // is kinda dumb. object oEnemy =GetNearestEnemy(); if ((GetIsObjectValid(oEnemy) == TRUE) && (GetIsInCombat() == TRUE)) { // SpeakString("keep me in combat"); OAI_DetermineCombatRound(oEnemy); } } // Send the user-defined event as appropriate if(GetSpawnInCondition(NW_FLAG_SPELL_CAST_AT_EVENT)) { SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_SPELL_CAST_AT)); } }