// wazoo_mordspawn - Mordenkainen's Faithful Hound Spawn


void fnMordenkainenEffects(object oMe)
{ // PURPOSE: Handle true seeing, invis, and barking when detecting new enemies
  effect eE;
  object oOb;
  object oAttack;
  int nN;
  float fDelay=5.0+(IntToFloat(Random(15))/10.0);
  eE=EffectInvisibility(INVISIBILITY_TYPE_IMPROVED);
  ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eE,oMe,8.0);
  eE=EffectTrueSeeing();
  ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eE,oMe,8.0);
  if (!GetIsInCombat(oMe))
  { // not in combat
      if (GetDistanceBetween(oMe,GetMaster(oMe))>8.0&&GetArea(oMe)==GetArea(GetMaster(oMe)))
      { // move back
          AssignCommand(oMe,ClearAllActions(TRUE));
          AssignCommand(oMe,ActionMoveToObject(GetMaster(oMe),TRUE,3.0));
      } // move back
      else if (GetArea(oMe)!=GetArea(GetMaster(oMe)))
      { // jump
          AssignCommand(oMe,ClearAllActions(TRUE));
          AssignCommand(oMe,JumpToObject(GetMaster(oMe)));
      } // jump
      nN=1;
      oOb=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oMe,nN,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY);
      while(oOb!=OBJECT_INVALID)
      { // new object
          if (GetLocalInt(oOb,"bWZMordDetect")==FALSE&&GetLocalInt(oMe,"bWZBarkedRecent")==FALSE)
          { // detect new creature
              SetLocalInt(oOb,"bWZMordDetect",TRUE);
              DelayCommand(30.0,DeleteLocalInt(oOb,"bWZMordDetect"));
              SetLocalInt(oMe,"bWZBarkedRecent",TRUE);
              DelayCommand(8.0,DeleteLocalInt(oOb,"bWZBarkedRecent"));
              AssignCommand(oMe,ClearAllActions(TRUE));
              PlaySound("as_an_dogbark2");
              if (GetDistanceBetween(oMe,oOb)<5.0) oAttack=oOb;
          } // detect new creature
        nN++;
        oOb=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oMe,nN,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY);
       } // new object
       if (GetIsObjectValid(oAttack))
       { // attack
           AssignCommand(oMe,ActionAttack(oAttack));
       } // attack
  } // not in combat
  else
  { // in combat
      if (GetDistanceBetween(oMe,GetMaster(oMe))>10.0&&GetArea(oMe)==GetArea(GetMaster(oMe)))
      { // move back
          AssignCommand(oMe,ClearAllActions(TRUE));
          AssignCommand(oMe,ActionMoveToObject(GetMaster(oMe),TRUE,3.0));
      } // move back
      else if (GetArea(oMe)!=GetArea(GetMaster(oMe)))
      { // jump
          AssignCommand(oMe,ClearAllActions(TRUE));
          AssignCommand(oMe,JumpToObject(GetMaster(oMe)));
      } // jump
  } // in combat
  DelayCommand(fDelay,fnMordenkainenEffects(oMe));
} // fnMordenkainenEffects()

void main()
{
    fnMordenkainenEffects(OBJECT_SELF);
}