//::///////////////////////////////////////////////
//:: Name           Gravetouched Ghoul template script
//:: FileName       tmp_m_gravetouch
//:: 
//:://////////////////////////////////////////////
/*CREATING A GRAVETOUCHED GHOUL
�Gravetouched ghoul� is an acquired template that can be added to any corporeal aberration, fey, giant, humanoid, or monstrous
humanoid with Intelligence and Charisma scores of 3 or higher (referred to hereafter as the base creature).

A gravetouched ghoul speaks all the languages it spoke in life (usually Common). It has all the base creature�s statistics
and special abilities except as noted here.

Size and Type: The creature�s type changes to undead. Do not recalculate base attack bonus, saves, or skill points. Size is unchanged.

Hit Dice: Increase to d12.

Armor Class: The base creature�s natural armor bonus improves by 2.

Attack: A gravetouched ghoul retains all the attacks of the base creature and also gains a bite and two claw attacks if it
didn�t already have them. If the base creature uses weapons, the gravetouched ghoul retains this ability. 

Damage: Gravetouched ghouls have bite and claw attacks. 

Size Bite Damage Claw Damage
Fine       1     �
Diminutive 1d2   1
Tiny       1d3   1d2
Small      1d4   1d3
Medium     1d6   1d4
Large      1d8   1d6
Huge       2d6   1d8
Gargantuan 2d8   2d6
Colossal   4d6   2d8

Special Attacks: A gravetouched ghoul retains all the special attacks of the base creature and gains those described below. 
Saves have a DC of 10 + 1/2 the gravetouched ghoul�s HD + gravetouched ghoul�s Cha modifier unless otherwise noted.

Ghoul Rot (Su): The gravetouched ghoul's bite attack delivers the ghoul rot disease 

Paralysis (Ex): Victims hit by a gravetouched ghoul�s bite or claw attack must make a successful Fortitude save or be paralyzed for
1d4+1 rounds. Elves have immunity to this paralysis.

Special Qualities: A gravetouched ghoul retains all the special qualities of the base creature and gains those described below.

Turn Resistance (Ex): A gravetouched ghoul has +2 turn resistance.

Abilities: Increase from the base creature as follows: Str +2, Dex +4, Int +2, Wis +4, Cha +2. As an undead creature, a gravetouched ghoul has no Constitution score.

Feats: A gravetouched ghoul retains all its feats, and it gains Multiattack as a bonus feat.

Alignment: Base creature�s alignment changes to chaotic evil.

Level Adjustment: Same as base creature +2.
*/

#include "prc_inc_template"
#include "prc_inc_natweap"
#include "prc_inc_combat"

void main()
{
    int nEvent = GetRunningEvent();
    if(DEBUG) DoDebug("tmp_m_gravetouch running, event: " + IntToString(nEvent));

    // Get the PC. This is event-dependent
    object oPC;
    switch(nEvent)
    {
        case EVENT_ITEM_ONHIT:          oPC = OBJECT_SELF;               break;
        case EVENT_ONPLAYEREQUIPITEM:   oPC = GetItemLastEquippedBy();   break;
        case EVENT_ONPLAYERUNEQUIPITEM: oPC = GetItemLastUnequippedBy(); break;
        case EVENT_ONHEARTBEAT:         oPC = OBJECT_SELF;               break;

        default:
            oPC = OBJECT_SELF;
    }

    object oItem;
	object oSkin = GetPCSkin(oPC);
	itemproperty ipIP;

    // We aren't being called from any event, instead from EvalPRCFeats
    if(nEvent == FALSE)
    {
		//natural armor, Turn Resist
		SetCompositeBonus(oSkin, "Template_Gravetouched_ac", 2, ITEM_PROPERTY_AC_BONUS);
		SetCompositeBonus(oSkin, "Template_Gravetouched_turn", 2, ITEM_PROPERTY_TURN_RESISTANCE);
		
		// Alignment
		AdjustAlignment(oPC, ALIGNMENT_EVIL,    100, FALSE);
		AdjustAlignment(oPC, ALIGNMENT_CHAOTIC, 100, FALSE);
	
		//Abilities
		SetCompositeBonus(oSkin, "Template_Gravetouched_str", 2, ITEM_PROPERTY_ABILITY_BONUS, IP_CONST_ABILITY_STR);
		SetCompositeBonus(oSkin, "Template_Gravetouched_dex", 4, ITEM_PROPERTY_ABILITY_BONUS, IP_CONST_ABILITY_DEX);
		SetCompositeBonus(oSkin, "Template_Gravetouched_int", 2, ITEM_PROPERTY_ABILITY_BONUS, IP_CONST_ABILITY_INT);
		SetCompositeBonus(oSkin, "Template_Gravetouched_wis", 4, ITEM_PROPERTY_ABILITY_BONUS, IP_CONST_ABILITY_WIS);
		SetCompositeBonus(oSkin, "Template_Gravetouched_cha", 2, ITEM_PROPERTY_ABILITY_BONUS, IP_CONST_ABILITY_CHA);
		
		//feats
		ipIP = PRCItemPropertyBonusFeat(IP_CONST_FEAT_WEAPON_PROF_CREATURE);
 	   	IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
		ipIP = PRCItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_UNARMED_STRIKE);
 	   	IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE); 	   	
		
		//Natural Attacks
 	   	string sResRef = "prc_raks_bite_";
 	   	int nSize = PRCGetCreatureSize(oPC);
 	   	sResRef += GetAffixForSize(nSize);
 	   	AddNaturalSecondaryWeapon(oPC, sResRef);
 	   	//primary weapon
 	   	sResRef = "prc_claw_1d6l_";
 	   	sResRef += GetAffixForSize(nSize);
 	   	AddNaturalPrimaryWeapon(oPC, sResRef, 2);
	
		//make Gravetouched undead
		ipIP = PRCItemPropertyBonusFeat(IP_CONST_FEAT_UNDEAD_HD);
 	   	IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
 	   	ipIP = PRCItemPropertyBonusFeat(IP_CONST_FEAT_IMMUNITY_ABILITY_DECREASE);
 	   	IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
 	   	ipIP = PRCItemPropertyBonusFeat(IP_CONST_FEAT_IMMUNITY_CRITICAL);
 	   	IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
 	   	ipIP = PRCItemPropertyBonusFeat(IP_CONST_FEAT_IMMUNITY_DEATH);
 	   	IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
 	   	ipIP = PRCItemPropertyBonusFeat(IP_CONST_FEAT_IMMUNITY_DISEASE);
 	   	IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
 	   	ipIP = PRCItemPropertyBonusFeat(IP_CONST_FEAT_IMMUNITY_MIND_SPELLS);
 	   	IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
 	   	ipIP = PRCItemPropertyBonusFeat(IP_CONST_FEAT_IMMUNITY_PARALYSIS);
 	   	IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
 	   	ipIP = PRCItemPropertyBonusFeat(IP_CONST_FEAT_IMMUNITY_POISON);
 	   	IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
 	   	ipIP = PRCItemPropertyBonusFeat(IP_CONST_FEAT_IMMUNITY_SNEAKATTACK);
 	   	IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
 	   	ipIP = ItemPropertyDamageImmunity(IP_CONST_DAMAGETYPE_NEGATIVE, IP_CONST_DAMAGEIMMUNITY_100_PERCENT);
 	   	IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);

        // Hook in the events, needed from level 1 for Skirmish
        if(DEBUG) DoDebug("tmp_m_gravetouch: Adding eventhooks");
        AddEventScript(oPC, EVENT_ONPLAYEREQUIPITEM,   "tmp_m_gravetouch", TRUE, FALSE);
        AddEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, "tmp_m_gravetouch", TRUE, FALSE);
        AddEventScript(oPC, EVENT_ONHEARTBEAT,         "tmp_m_gravetouch", TRUE, FALSE);
    }
    // We're being called from the OnHit eventhook
    else if(nEvent == EVENT_ITEM_ONHIT)
    {
        oItem          = GetSpellCastItem();
        object oTarget = PRCGetSpellTargetObject();
        if(DEBUG) DoDebug("tmp_m_gravetouch: OnHit:\n"
                        + "oPC = " + DebugObject2Str(oPC) + "\n"
                        + "oItem = " + DebugObject2Str(oItem) + "\n"
                        + "oTarget = " + DebugObject2Str(oTarget) + "\n"
                          );
	    //FloatingTextStringOnCreature(GetName(oItem)+" is OnHit Item for Gravetouched", oPC, FALSE);
		int nDC = 10 + GetHitDice(oPC)/2 + GetAbilityModifier(ABILITY_CHARISMA, oPC);
		if (oItem == GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oPC))
		{
			// Disease bite
            if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_DISEASE)) ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDisease(DISEASE_GHOUL_ROT), oTarget);
		}
		// Can't paralyze elves
		if (GetIsCreatureWeapon(oItem) && MyPRCGetRacialType(oTarget) != RACIAL_TYPE_ELF)
		{
            if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_NONE)) ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectParalyze(), oTarget, RoundsToSeconds(d4()+1));		
		}
    }// end if - Running OnHit event
    // We are called from the OnPlayerEquipItem eventhook. Add OnHitCast: Unique Power to oPC's weapon
    else if(nEvent == EVENT_ONPLAYEREQUIPITEM)
    {
        oPC   = GetItemLastEquippedBy();
        oItem = GetItemLastEquipped();
        if(DEBUG) DoDebug("tmp_m_gravetouch - OnEquip\n"
                        + "oPC = " + DebugObject2Str(oPC) + "\n"
                        + "oItem = " + DebugObject2Str(oItem) + "\n"
                          );
		if (oItem == GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oPC))
		{
            IPSafeAddItemProperty(oItem, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 99999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
	        AddEventScript(oItem, EVENT_ITEM_ONHIT, "tmp_m_gravetouch", TRUE, FALSE);		
		}
		if (oItem == GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oPC))
		{
            IPSafeAddItemProperty(oItem, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 99999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
	        AddEventScript(oItem, EVENT_ITEM_ONHIT, "tmp_m_gravetouch", TRUE, FALSE);		
		}
		if (oItem == GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oPC))
		{
            IPSafeAddItemProperty(oItem, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 99999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
	        AddEventScript(oItem, EVENT_ITEM_ONHIT, "tmp_m_gravetouch", TRUE, FALSE);
	        //AddItemProperty(DURATION_TYPE_TEMPORARY, ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_POSITIVE, IP_CONST_DAMAGEBONUS_2), oItem, 99999.0);
		}		
    }
    // We are called from the OnPlayerUnEquipItem eventhook. Remove OnHitCast: Unique Power from oPC's weapon
    else if(nEvent == EVENT_ONPLAYERUNEQUIPITEM)
    {
        oPC   = GetItemLastUnequippedBy();
        oItem = GetItemLastUnequipped();
        if(DEBUG) DoDebug("tmp_m_gravetouch - OnUnEquip\n"
                        + "oPC = " + DebugObject2Str(oPC) + "\n"
                        + "oItem = " + DebugObject2Str(oItem) + "\n"
                          );

        // Only applies to creature weapons
        if(GetIsCreatureWeapon(oItem))
        {
            // Remove the temporary OnHitCastSpell: Unique
            RemoveEventScript(oItem, EVENT_ITEM_ONHIT, "tmp_m_gravetouch", TRUE, FALSE);
            RemoveSpecificProperty(oItem, ITEM_PROPERTY_ONHITCASTSPELL, IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 0, 1, "", -1, DURATION_TYPE_TEMPORARY);           
        }
    }  
    else if(nEvent == EVENT_ONHEARTBEAT)
    {
        if(DEBUG) DoDebug("tmp_m_gravetouch - OnHB\n"
                        + "oPC = " + DebugObject2Str(oPC) + "\n"
                        + "oItem = " + DebugObject2Str(oItem) + "\n"
                          ); 
     /*   FloatingTextStringOnCreature(GetName(oPC)+" is heartbeat", oPC, FALSE);                  
        oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oPC);                  
		if (GetIsObjectValid(oItem))
		{
           // IPSafeAddItemProperty(oItem, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 99999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
	       // AddEventScript(oItem, EVENT_ITEM_ONHIT, "tmp_m_gravetouch", TRUE, FALSE);
	        FloatingTextStringOnCreature(GetName(oItem)+" is in Creature Slot Bite", oPC, FALSE);
		}
        oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oPC);                  
		if (GetIsObjectValid(oItem))
		{
           // IPSafeAddItemProperty(oItem, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 99999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
	       // AddEventScript(oItem, EVENT_ITEM_ONHIT, "tmp_m_gravetouch", TRUE, FALSE);	
	        FloatingTextStringOnCreature(GetName(oItem)+" is in Creature Slot Right", oPC, FALSE);
		}
        oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oPC);                  
		if (GetIsObjectValid(oItem))
		{
           // IPSafeAddItemProperty(oItem, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 99999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
           // AddItemProperty(DURATION_TYPE_TEMPORARY, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), oItem, 99999.0);
	       // AddEventScript(oItem, EVENT_ITEM_ONHIT, "tmp_m_gravetouch", TRUE, FALSE);	
	        FloatingTextStringOnCreature(GetName(oItem)+" is in Creature Slot Left", oPC, FALSE);
	        
			// No equipping magical items, and make sure to ignore creature items
			itemproperty ip = GetFirstItemProperty(oItem);
			while(GetIsItemPropertyValid(ip))
			{
				FloatingTextStringOnCreature(ItemPropertyToString(ip)+" is on Creature Slot Left", oPC, FALSE);
				ip = GetNextItemProperty(oItem);
			}	        
			
			//AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyMonsterDamage(iMonsterDamage),oWeapL);
			
			//AddItemProperty(DURATION_TYPE_TEMPORARY, ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_POSITIVE, IP_CONST_DAMAGEBONUS_10), oItem, 99999.0);
		}*/
    }    
}