forked from Jaysyn/PRC8
253 lines
13 KiB
Plaintext
253 lines
13 KiB
Plaintext
|
//::///////////////////////////////////////////////
|
|||
|
//:: Name Gravetouched Ghoul template script
|
|||
|
//:: FileName tmp_m_gravetouch
|
|||
|
//::
|
|||
|
//:://////////////////////////////////////////////
|
|||
|
/*CREATING A GRAVETOUCHED GHOUL
|
|||
|
<EFBFBD>Gravetouched ghoul<75> 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<72>s statistics
|
|||
|
and special abilities except as noted here.
|
|||
|
|
|||
|
Size and Type: The creature<72>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<72>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<EFBFBD>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 <20>
|
|||
|
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<75>s HD + gravetouched ghoul<75>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<75>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<72>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);
|
|||
|
}*/
|
|||
|
}
|
|||
|
}
|