//Script Name: buffme
//////////////////////////////////////////
// Created By: Genisys (Guile)
// Created On: 8/13/08
// Updated On: 4/01/09
/////////////////////////////////////////
/*
This script must be executed from another
script, utilizing the ExecuteScript("buffme", oPC);
function, basically this script will,
if PC is a spell caster, they
will cast all of their buffs instantly, if
they have the spells to cast.

*/
////////////////////////////////////////
#include "x2_inc_switches"
#include "prc_class_const"

////////////////////////////////////////

//PROTOTYPE(S) DECLARED
int GetHasBetter(object oTarget, int nInt);

void Buff ();

////////////////////////////////////////////

//Main Script
void main()
{
   //Make the caster use all buff spells instantly!
   Buff();

//Main Script End
}

/////////////////////////////////////////////////////////////////////////

//PROTOTYPE DEFINED
int GetHasBetter(object oTarget, int nInt)
{
  int b = 0;

 //If the current spell (which might be cast) is the lesser,
 //then lets see if they have a great version!

 if(nInt == 17) //Displacement
 {
  //Improved Invisibility has 50% concealment!
  if(GetHasSpell(SPELL_IMPROVED_INVISIBILITY, oTarget))
  b = 1;
 }

 else if(nInt ==27) //SPELL_EXPEDITIOUS_RETREAT
 {
  if(GetHasSpell(SPELL_HASTE, oTarget))
  b = 1;
 }

 else if(nInt ==44)//SPELL_MAGIC_WEAPON
 {
  if(GetHasSpell(SPELL_GREATER_MAGIC_WEAPON, oTarget))
  b = 1;
 }

 else if(nInt ==46)//SPELL_STONESKIN
 {
  if(GetHasSpell(SPELL_GREATER_STONESKIN, oTarget) ||
     GetHasSpell(SPELL_PREMONITION, oTarget))
  b = 1;
 }

 else if(nInt ==47)//SPELL_GREATER_STONESKIN
 {
  if(GetHasSpell(SPELL_PREMONITION, oTarget))
   b = 1;
 }

 else if(nInt ==52)//SPELL_INVISIBILITY
 {
  if(GetHasSpell(SPELL_IMPROVED_INVISIBILITY, oTarget) ||
     GetHasSpell(SPELL_INVISIBILITY_SPHERE, oTarget))
  b = 1;
 }

else if(nInt ==53)//SPELL_INVISIBILITY_SPHERE
 {
  if(GetHasSpell(SPELL_IMPROVED_INVISIBILITY, oTarget))
  b = 1;
 }

 else if(nInt ==57)//SPELL_LESSER_MIND_BLANK
 {
  if(GetHasSpell(SPELL_MIND_BLANK, oTarget))
  b = 1;
 }

 else if(nInt ==58)//SPELL_LESSER_SPELL_MANTLE
 {
  if(GetHasSpell(SPELL_SPELL_MANTLE, oTarget) ||
     GetHasSpell(SPELL_GREATER_SPELL_MANTLE, oTarget))
  b = 1;
 }

 else if(nInt ==59)//SPELL_SPELL_MANTLE
 {
  if(GetHasSpell(SPELL_GREATER_SPELL_MANTLE, oTarget))
  b = 1;
 }

 else if(nInt ==61)//SPELL_MINOR_GLOBE_OF_INVULNERABILITY
 {
  if(GetHasSpell(SPELL_GLOBE_OF_INVULNERABILITY, oTarget))
  b = 1;
 }

 else if(nInt ==81)//SPELL_SEE_INVISIBILITY
 {
  if(GetHasSpell(SPELL_TRUE_SEEING, oTarget))
  b = 1;
 }

 //Otherwise, if it's not a spell in one of these categories
 //Tell the script to have the player cast the spell...
 else
 {
  b = 2;
 }

return b;

/*
 //If they have a better spell don't allow them to cast this spell
 if(b==1)
 { return 1;}

 //Otherwise allow them to cast the spell..
 else
 { return 2;}
*/

//PROTOTYPE END
}

//////////////////////////////////////////////////////////////////////////////
//PROTOTYPE DEFINED
void Buff()
{


    object oPC;
    int nSpellId;
    int nSpell;
    int i;
    int nGs;

      oPC = OBJECT_SELF;

    //They must be a caster to use the item!
if ((GetLevelByClass(CLASS_TYPE_BARD, oPC)>0)||
    (GetLevelByClass(CLASS_TYPE_CLERIC, oPC)>0)||
    (GetLevelByClass(CLASS_TYPE_DRUID, oPC)>0)||
    (GetLevelByClass(CLASS_TYPE_PALADIN, oPC)>0)||
    (GetLevelByClass(CLASS_TYPE_RANGER, oPC)>0)||
    (GetLevelByClass(CLASS_TYPE_SORCERER, oPC)>0)||
	(GetLevelByClass(CLASS_TYPE_BLACKGUARD, oPC)>0)||
	(GetLevelByClass(CLASS_TYPE_OCULAR, oPC)>0)||
	(GetLevelByClass(CLASS_TYPE_HEALER, oPC)>0)||
	(GetLevelByClass(CLASS_TYPE_CULTIST_SHATTERED_PEAK, oPC)>0)||
	(GetLevelByClass(CLASS_TYPE_KNIGHT_CHALICE, oPC)>0)||
	(GetLevelByClass(CLASS_TYPE_VIGILANT, oPC)>0)||
	(GetLevelByClass(CLASS_TYPE_VASSAL, oPC)>0)||
	(GetLevelByClass(CLASS_TYPE_SOLDIER_OF_LIGHT, oPC)>0)||
	(GetLevelByClass(CLASS_TYPE_KNIGHT_MIDDLECIRCLE, oPC)>0)||
	(GetLevelByClass(CLASS_TYPE_ARCHIVIST, oPC)>0)||
	(GetLevelByClass(CLASS_TYPE_SHAMAN, oPC)>0)||
	(GetLevelByClass(CLASS_TYPE_SOHEI, oPC)>0)||
	(GetLevelByClass(CLASS_TYPE_SHADOWLORD, oPC)>0)||
	(GetLevelByClass(CLASS_TYPE_SLAYER_OF_DOMIEL, oPC)>0)||
	(GetLevelByClass(CLASS_TYPE_NENTYAR_HUNTER, oPC)>0)||
	(GetLevelByClass(CLASS_TYPE_BLIGHTER, oPC)>0)||	
    (GetLevelByClass(CLASS_TYPE_WIZARD, oPC)>0))
   {

     for(i = 0; i<87; i++)
     {

      //This tells us which spell we are looking at..
      //We look at each one in turn, and IF the caster can cast it
      //then we assign them a command to cast it at thier level..
      switch (i)
      {
       case 1: { nSpell = SPELL_AID; break; }
       case 2: { nSpell = SPELL_AMPLIFY; break; }
       case 3: { nSpell = SPELL_AURA_OF_VITALITY; break; }
       case 4: { nSpell = SPELL_AURAOFGLORY; break; }
       case 5: { nSpell = SPELL_BARKSKIN; break; }
       case 6: { nSpell = SPELL_BATTLETIDE; break; }
       case 7: { nSpell = SPELL_BLACKSTAFF; break; }
       case 8: { nSpell = SPELL_BLESS; break; }
       case 9: { nSpell = SPELL_BLESS_WEAPON; break; }
       case 10: { nSpell = SPELL_BLOOD_FRENZY; break; }

       //Redundant spells, we will check for better versions first!
       case 11: { nSpell = SPELL_CAMOFLAGE; break; }

       case 12: { nSpell = SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE; break; }
       case 13: { nSpell = SPELL_CLARITY; break; }
       case 14: { nSpell = SPELL_DARKFIRE; break; }
       case 15: { nSpell = SPELL_DEATH_ARMOR; break; }
       case 16: { nSpell = SPELL_DEATH_WARD; break; }
       case 17: { nSpell = SPELL_DISPLACEMENT; break; }
       case 18: { nSpell = SPELL_DIVINE_FAVOR; break; }
       case 19: { nSpell = SPELL_DIVINE_POWER; break; }
       case 20: { nSpell = SPELL_ELEMENTAL_SHIELD; break; }


       //Redundant spells, we will check for better versions first!
       case 21: { nSpell = SPELL_ENDURE_ELEMENTS; break; }
       case 22: { nSpell = SPELL_RESIST_ELEMENTS; break; }
       case 23: { nSpell = SPELL_PROTECTION_FROM_ELEMENTS; break; }
       case 24: { nSpell = SPELL_ENERGY_BUFFER; break; }


       case 25: { nSpell = SPELL_ENTROPIC_SHIELD; break; }
       case 26: { nSpell = SPELL_ETHEREAL_VISAGE; break; }
       case 27: { nSpell = SPELL_EXPEDITIOUS_RETREAT; break; }
       case 28: { nSpell = SPELL_FLAME_WEAPON; break; }
       case 29: { nSpell = SPELL_FREEDOM_OF_MOVEMENT; break; }
       case 30: { nSpell = SPELL_GHOSTLY_VISAGE; break; }
       case 31: { nSpell = SPELL_MAGE_ARMOR; break; }

       //Redundant Spells we will check for better first!
       case 32: { nSpell = SPELL_BULLS_STRENGTH; break; }
       case 33: { nSpell = SPELL_CATS_GRACE; break; }
       case 34: { nSpell = SPELL_EAGLE_SPLEDOR; break; }
       case 35: { nSpell = SPELL_ENDURANCE; break; }
       case 36: { nSpell = SPELL_FOXS_CUNNING; break; }
       case 37: { nSpell = SPELL_OWLS_WISDOM; break; }
       case 38: { nSpell = SPELL_GREATER_BULLS_STRENGTH; break; }
       case 39: { nSpell = SPELL_GREATER_CATS_GRACE; break; }
       case 40: { nSpell = SPELL_GREATER_EAGLE_SPLENDOR; break; }
       case 41: { nSpell = SPELL_GREATER_ENDURANCE; break; }
       case 42: { nSpell = SPELL_GREATER_FOXS_CUNNING; break; }
       case 43: { nSpell = SPELL_GREATER_OWLS_WISDOM; break; }

       //Redundant spells, we will check for better versions first!
       case 44: { nSpell = SPELL_MAGIC_WEAPON; break; }
       case 45: { nSpell = SPELL_GREATER_MAGIC_WEAPON; break; }

       //Redundant spells, we will check for better versions first!
       case 46: { nSpell = SPELL_STONESKIN; break; }
       case 47: { nSpell = SPELL_GREATER_STONESKIN; break; }
       case 48: { nSpell = SPELL_PREMONITION; break; }

       case 49: { nSpell = SPELL_HASTE; break; }
       case 50: { nSpell = SPELL_HOLY_AURA; break; }
       case 51: { nSpell = SPELL_HOLY_SWORD; break; }

       //Redundant spells, we will check for better versions first!
       case 52: { nSpell = SPELL_INVISIBILITY; break; }
       case 53: { nSpell = SPELL_INVISIBILITY_SPHERE; break; }
       case 54: { nSpell = SPELL_IMPROVED_INVISIBILITY; break; }

       case 55: { nSpell = SPELL_KEEN_EDGE; break; }
       case 56: { nSpell = SPELL_LIGHT; break; }

       //Redundant spells, we will check for better versions first!
       case 57: { nSpell = SPELL_LESSER_MIND_BLANK; break; }

       //Redundant spells, we will check for better versions first!
       case 58: { nSpell = SPELL_LESSER_SPELL_MANTLE; break; }
       case 59: { nSpell = SPELL_SPELL_MANTLE; break; }
       case 60: { nSpell = SPELL_GREATER_SPELL_MANTLE; break; }

       //Redundant spells, we will check for better versions first!
       case 61: { nSpell = SPELL_MINOR_GLOBE_OF_INVULNERABILITY; break; }
       case 62: { nSpell = SPELL_GLOBE_OF_INVULNERABILITY; break; }

       case 63: { nSpell = SPELL_MAGE_ARMOR; break; }
       case 64: { nSpell = SPELL_MAGIC_CIRCLE_AGAINST_CHAOS; break; }
       case 65: { nSpell = SPELL_MAGIC_CIRCLE_AGAINST_EVIL; break; }
       case 66: { nSpell = SPELL_MAGIC_VESTMENT; break; }
       case 67: { nSpell = SPELL_MASS_CAMOFLAGE; break; }
       case 68: { nSpell = SPELL_MASS_HASTE; break; }
       case 69: { nSpell = SPELL_MESTILS_ACID_SHEATH; break; }
       case 70: { nSpell = SPELL_MIND_BLANK; break; }
       case 71: { nSpell = SPELL_MONSTROUS_REGENERATION; break; }
       case 72: { nSpell = SPELL_NEGATIVE_ENERGY_PROTECTION; break; }
       case 73: { nSpell = SPELL_ONE_WITH_THE_LAND; break; }
       case 74: { nSpell = SPELL_OWLS_INSIGHT; break; }
       case 75: { nSpell = SPELL_PRAYER; break; }
       case 76: { nSpell = SPELL_PROTECTION_FROM_SPELLS; break; }
       case 77: { nSpell = SPELL_PROTECTION_FROM_EVIL; break; }
       case 78: { nSpell = SPELL_REGENERATE; break; }
       case 79: { nSpell = SPELL_RESISTANCE; break; }
       case 80: { nSpell = SPELL_SPELL_RESISTANCE; break; }

       //Redundant spells, we will check for better versions first!
       case 81: { nSpell = SPELL_SEE_INVISIBILITY; break; }

       case 82: { nSpell = SPELL_SHADOW_SHIELD; break; }
       case 83: { nSpell = SPELL_SHIELD; break; }
       case 84: { nSpell = SPELL_TRUE_SEEING; break; }
       case 85: { nSpell = SPELL_UNHOLY_AURA; break; }
       case 86: { nSpell = SPELL_VINE_MINE_CAMOUFLAGE; break; }
       case 87: { nSpell = SPELL_WOUNDING_WHISPERS; break; }
       case 88: { nSpell = SPELL_VIRTUE; break; }

      }


      //If they have the spell memorized make them cast quickly!
      if(GetHasSpell(nSpell, oPC)>0)
      {
        nGs = GetHasBetter(oPC, i);

       //If the user doesn't have a better spell memorized...
       if(nGs==2)
       {

         AssignCommand(oPC, ActionCastSpellAtObject
         (nSpell, oPC
         , METAMAGIC_ANY
         , FALSE
         , 0
         , PROJECTILE_PATH_TYPE_DEFAULT
         , TRUE));

       }

      }

     }

    }

   //Otherwise Tell the PC why they can't use the item..
   else
   {
    FloatingTextStringOnCreature("You must be a Spell Caster to use this item!", oPC, FALSE);
   }

//PROTOTYPE END
}

/////////////THE END, WOOHOO!!!///////////