PRC8/nwn/nwnprc/trunk/include/prc_inc_turning.nss
Jaysyn904 e81e395031 Added Vow of Poverty
Added Vow of Poverty, Jaebrin, Hobgoblin Warsoul & Forsaker fixes (thanks PRC5 & @Fencas).  Added iprp_matcost.2da for new materials.  Updated PRC8 Tester module.  Cohorts updated to support 8 classes. Fixed ranged disarm w/ Fighter. Updated release archive.
2024-12-26 17:37:36 -05:00

651 lines
23 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Turn undead include
//:: prc_inc_turning
//::///////////////////////////////////////////////
/** @file
Defines functions that seem to have something
to do with Turn Undead (and various other
stuff).
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//////////////////////////////////////////////////
/* Function prototypes */
//////////////////////////////////////////////////
//gets the number of class levels that count for turning
int GetTurningClassLevel(object oCaster = OBJECT_SELF, int nTurnType = SPELL_TURN_UNDEAD);
//Returns the turning charisma modifier of OBJECT_SELF
int GetTurningCharismaMod(int nTurnType);
//this adjusts the highest HD of undead turned
int GetTurningCheckResult(int nLevel, int nTurningCheck);
//gets the equivalent HD total for turning purposes
//includes turn resistance and SR for outsiders
int GetHitDiceForTurning(object oTarget, int nTurnType, int nTargetRace);
int GetCommandedTotalHD(int nTurnType = SPELL_TURN_UNDEAD, int bUndeadMastery = FALSE);
//various sub-turning effect funcions
void DoTurn(object oTarget);
void DoDestroy(object oTarget);
void DoRebuke(object oTarget);
void DoCommand(object oTarget);
// This uses the turn type to determine whether the target should be turned or rebuked
// Return values:
// 0 - target can not be turned/rebuked
// 1 - target can be rebuked
// 2 - target can be turned
int GetIsTurnOrRebuke(object oTarget, int nTurnType, int nTargetRace);
// What this does is check to see if there is an discrete word
// That matches the input, and if there is returns TRUE
// (please use sName string in lowercase)
int CheckTargetName(object oTarget, string sName);
int GetIsAirCreature(object oCreature, int nAppearance);
int GetIsEarthCreature(object oCreature, int nAppearance);
int GetIsFireCreature(object oCreature, int nAppearance);
int GetIsWaterCreature(object oCreature, int nAppearance);
int GetIsColdCreature(object oCreature, int nAppearance);
int GetIsReptile(object oCreature, int nAppearance);
int GetIsSpider(object oCreature, int nAppearance);
// Does the cold damage for this feat
void FaithInTheFrost(object oPC, object oTarget);
// Does the fire damage for this feat
void LightOfAurifar(object oPC, object oTarget);
//////////////////////////////////////////////////
/* Includes */
//////////////////////////////////////////////////
#include "prc_inc_racial"
#include "inc_utility"
#include "bnd_inc_bndfunc"
#include "prc_inc_template"
//////////////////////////////////////////////////
/* Function definitions */
//////////////////////////////////////////////////
const int ACTION_REBUKE = 1;
const int ACTION_TURN = 2;
//private function
int GetIsTurnOrRebuke(object oTarget, int nTurnType, int nTargetRace)
{
//is not an enemy
if(GetIsFriend(oTarget)/* || GetFactionEqual(oTarget)*/)
return FALSE;
//already turned
//NOTE: At the moment this breaks down in "turning conflicts" where clerics try to
//turn each others undead. Fix later.
//if(GetHasSpellEffect(nTurnType, oTarget))
// return FALSE;
if(PRCGetHasEffect(EFFECT_TYPE_TURNED, oTarget))
return FALSE;
int nTargetAppearance = GetAppearanceType(oTarget);
int nReturn = FALSE;
switch(nTurnType)
{
case SPELL_TURN_UNDEAD:
{
if(nTargetRace == RACIAL_TYPE_UNDEAD)
{
// Evil clerics rebuke undead, otherwise turn
// Dread Necro, True Necro and Master of Shrouds always rebuke or command
if(GetAlignmentGoodEvil(OBJECT_SELF) == ALIGNMENT_EVIL
|| GetLevelByClass(CLASS_TYPE_DREAD_NECROMANCER)
|| GetLevelByClass(CLASS_TYPE_TRUENECRO)
|| GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS)
|| GetLevelByClass(CLASS_TYPE_NIGHTSTALKER) > 3)
nReturn = ACTION_REBUKE;
else
nReturn = ACTION_TURN;
}
else if(nTargetRace == RACIAL_TYPE_OUTSIDER && GetHasFeat(FEAT_EPIC_PLANAR_TURNING))
{
// Evil clerics turn non-evil outsiders, and rebuke evil outsiders
if(GetAlignmentGoodEvil(OBJECT_SELF) == ALIGNMENT_EVIL)
{
if(GetAlignmentGoodEvil(oTarget) != ALIGNMENT_EVIL)
nReturn = ACTION_TURN;
else
nReturn = ACTION_REBUKE;
}
// Good clerics turn non-good outsiders, and rebuke good outsiders
else
{
if(GetAlignmentGoodEvil(oTarget) != ALIGNMENT_GOOD)
nReturn = ACTION_TURN;
else
nReturn = ACTION_REBUKE;
}
}
break;
}
case SPELL_TURN_OUTSIDER:
{
if(nTargetRace == RACIAL_TYPE_OUTSIDER)
{
// Evil clerics turn non-evil outsiders, and rebuke evil outsiders
if(GetAlignmentGoodEvil(OBJECT_SELF) == ALIGNMENT_EVIL)
{
if(GetAlignmentGoodEvil(oTarget) != ALIGNMENT_EVIL)
nReturn = ACTION_TURN;
else
nReturn = ACTION_REBUKE;
}
// Good clerics turn non-good outsiders, and rebuke good outsiders
else
{
if(GetAlignmentGoodEvil(oTarget) != ALIGNMENT_GOOD)
nReturn = ACTION_TURN;
else
nReturn = ACTION_REBUKE;
}
}
break;
}
case SPELL_TURN_BLIGHTSPAWNED:
{
// Rebuke/Command blightspawned, either by tag from Blight touch
// Or from having a Blightlord master
if(GetTag(oTarget) == "prc_blightspawn" || GetLevelByClass(CLASS_TYPE_BLIGHTLORD, GetMaster(oTarget)))
{
nReturn = ACTION_REBUKE;
}
// Rebuke/Command evil animals and plants
else if(nTargetRace == RACIAL_TYPE_ANIMAL || nTargetRace == RACIAL_TYPE_PLANT)
{
if(GetAlignmentGoodEvil(oTarget) == ALIGNMENT_EVIL)
nReturn = ACTION_REBUKE;
}
break;
}
case SPELL_TURN_OOZE:
{
// Slime domain rebukes or commands oozes
if(nTargetRace == RACIAL_TYPE_OOZE)
nReturn = ACTION_REBUKE;
break;
}
case SPELL_TURN_PLANT:
{
// Plant domain rebukes or commands plants
if(GetPRCSwitch(PRC_BIOWARE_PLANT_DOMAIN_POWER))
{
if(nTargetRace == RACIAL_TYPE_VERMIN)
nReturn = ACTION_TURN;
}
else
{
if(nTargetRace == RACIAL_TYPE_PLANT)
nReturn = ACTION_REBUKE;
}
break;
}
case SPELL_TURN_AIR:
{
if(GetIsAirCreature(oTarget, nTargetAppearance))
nReturn = ACTION_REBUKE;
else if(GetIsEarthCreature(oTarget, nTargetAppearance))
nReturn = ACTION_TURN;
break;
}
case SPELL_TURN_EARTH:
{
if(GetIsAirCreature(oTarget, nTargetAppearance))
nReturn = ACTION_TURN;
else if(GetIsEarthCreature(oTarget, nTargetAppearance))
nReturn = ACTION_REBUKE;
break;
}
case SPELL_TURN_FIRE:
{
if(GetIsFireCreature(oTarget, nTargetAppearance))
nReturn = ACTION_REBUKE;
else if(GetIsWaterCreature(oTarget, nTargetAppearance))
nReturn = ACTION_TURN;
break;
}
case SPELL_TURN_WATER:
{
if(GetIsFireCreature(oTarget, nTargetAppearance))
nReturn = ACTION_TURN;
else if(GetIsWaterCreature(oTarget, nTargetAppearance))
nReturn = ACTION_REBUKE;
break;
}
case SPELL_TURN_REPTILE:
{
if(GetIsReptile(oTarget, nTargetAppearance))
nReturn = ACTION_REBUKE;
break;
}
case SPELL_TURN_SPIDER:
{
if(GetIsSpider(oTarget, nTargetAppearance))
nReturn = ACTION_REBUKE;
break;
}
case SPELL_TURN_COLD:
{
if(GetIsFireCreature(oTarget, nTargetAppearance))
nReturn = ACTION_TURN;
else if(GetIsColdCreature(oTarget, nTargetAppearance))
nReturn = ACTION_REBUKE;
break;
}
}
//always turn baelnorns & archliches
if(GetLevelByClass(CLASS_TYPE_BAELNORN, oTarget) || GetHasFeat(FEAT_TEMPLATE_ARCHLICH_MARKER, oTarget)) //:: Archlich
nReturn = ACTION_TURN;
//Immunity check
if(nReturn == ACTION_TURN && GetHasFeat(FEAT_TURNING_IMMUNITY, oTarget))
nReturn = FALSE;
if(nReturn == ACTION_REBUKE && GetHasFeat(FEAT_IMMUNITY_TO_REBUKING, oTarget))
nReturn = FALSE;
return nReturn;
}
//ok
void DoTurn(object oTarget)
{
//create the effect
effect eTurn = EffectLinkEffects(EffectTurned(), EffectVisualEffect(VFX_DUR_MIND_AFFECTING_FEAR));
eTurn = EffectLinkEffects(eTurn, EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE));
eTurn = SupernaturalEffect(eTurn);
//apply the effect for 60 seconds
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eTurn, oTarget, 60.0);
FaithInTheFrost(OBJECT_SELF, oTarget);
LightOfAurifar(OBJECT_SELF, oTarget);
}
//ok
void DoDestroy(object oTarget)
{
//supernatural so it penetrates immunity to death
ApplyEffectToObject(DURATION_TYPE_INSTANT, SupernaturalEffect(EffectDeath()), oTarget);//EffectDeath(TRUE)?
}
void DoRebuke(object oTarget)
{
//rebuke effect
//The character is frozen in fear and can take no actions.
//A cowering character takes a -2 penalty to Armor Class and loses
//her Dexterity bonus (if any).
//create the effect
effect eRebuke = EffectEntangle(); //this removes dex bonus
eRebuke = EffectLinkEffects(eRebuke, EffectACDecrease(2));
eRebuke = EffectLinkEffects(eRebuke, EffectVisualEffect(VFX_DUR_MIND_AFFECTING_FEAR));
eRebuke = EffectLinkEffects(eRebuke, EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE));
//apply the effect for 60 seconds
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eRebuke, oTarget, 60.0);
//handle unable to take actions
AssignCommand(oTarget, ClearAllActions());
AssignCommand(oTarget, DelayCommand(60.0, SetCommandable(TRUE)));
AssignCommand(oTarget, SetCommandable(FALSE));
FaithInTheFrost(OBJECT_SELF, oTarget);
LightOfAurifar(OBJECT_SELF, oTarget);
}
//ok
void DoCommand(object oTarget)
{
//create the effect
//supernatural will last over resting
ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(EffectCutsceneDominated()), oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DOMINATE_S), oTarget);
}
//ok
int GetTurningCheckResult(int nLevel, int nTurningCheck)
{
switch(nTurningCheck)
{
case 0:
return nLevel-4;
case 1:
case 2:
case 3:
return nLevel-3;
case 4:
case 5:
case 6:
return nLevel-2;
case 7:
case 8:
case 9:
return nLevel-1;
case 10:
case 11:
case 12:
return nLevel;
case 13:
case 14:
case 15:
return nLevel+1;
case 16:
case 17:
case 18:
return nLevel+2;
case 19:
case 20:
case 21:
return nLevel+3;
default:
if(nTurningCheck < 0)
return nLevel-4;
else
return nLevel+4;
}
//somethings gone wrong here
return 0;
}
int GetTurningClassLevel(object oCaster = OBJECT_SELF, int nTurnType = SPELL_TURN_UNDEAD)
{
int nLevel, nTemp;
if (nTurnType == SPELL_OPPORTUNISTIC_PIETY_TURN)
return GetLevelByClass(CLASS_TYPE_FACTOTUM, oCaster);
//Baelnorn & Archlich adds all class levels.
if(GetLevelByClass(CLASS_TYPE_BAELNORN, oCaster) || GetHasFeat(FEAT_TEMPLATE_ARCHLICH_MARKER, oCaster)) //:: Archlich
nLevel = GetHitDice(oCaster);
else
{
//full classes
nLevel += GetLevelByClass(CLASS_TYPE_CLERIC, oCaster);
nLevel += GetLevelByClass(CLASS_TYPE_DREAD_NECROMANCER, oCaster);
nLevel += GetLevelByClass(CLASS_TYPE_TRUENECRO);
nLevel += GetLevelByClass(CLASS_TYPE_SOLDIER_OF_LIGHT, oCaster);
nLevel += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster);
nLevel += GetLevelByClass(CLASS_TYPE_MORNINGLORD, oCaster);
nLevel += GetLevelByClass(CLASS_TYPE_ELDRITCH_DISCIPLE, oCaster);
nLevel += GetLevelByClass(CLASS_TYPE_SACREDPURIFIER, oCaster);
nLevel += GetLevelByClass(CLASS_TYPE_UR_PRIEST, oCaster);
if (!GetIsVestigeExploited(oCaster, VESTIGE_TENEBROUS_TURN_UNDEAD) && GetHasSpellEffect(VESTIGE_TENEBROUS, oCaster)) nLevel += GetBinderLevel(oCaster, VESTIGE_TENEBROUS);
//Mystics with sun domain can turn undead
if(GetHasFeat(FEAT_BONUS_DOMAIN_SUN, oCaster))
nLevel += GetLevelByClass(CLASS_TYPE_MYSTIC, oCaster);
//offset classes
nTemp = GetLevelByClass(CLASS_TYPE_PALADIN, oCaster)-3;
//Seek Eternal Rest
if (GetHasSpellEffect(SPELL_SEEK_ETERNAL_REST, oCaster)) nTemp = GetLevelByClass(CLASS_TYPE_PALADIN, oCaster);
if(nTemp > 0)nLevel += nTemp;
nTemp = GetLevelByClass(CLASS_TYPE_SHAMAN, oCaster)-2;
if(nTemp > 0) nLevel += nTemp;
nTemp = GetLevelByClass(CLASS_TYPE_TEMPLAR, oCaster)-3;
if(nTemp > 0) nLevel += nTemp;
nTemp = GetLevelByClass(CLASS_TYPE_BLACKGUARD, oCaster)-2;
if(nTemp > 0) nLevel += nTemp;
nTemp = GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster)-2;
if(nTemp > 0) nLevel += nTemp;
nTemp = GetLevelByClass(CLASS_TYPE_NIGHTSTALKER, oCaster)-3;
if(nTemp > 0) nLevel += nTemp;
//not undead turning classes
if(nTurnType == SPELL_TURN_SPIDER)
nLevel += GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster);
else if(nTurnType == SPELL_TURN_BLIGHTSPAWNED)
nLevel += GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oCaster);
else if(nTurnType == SPELL_TURN_OUTSIDER)
{
nTemp = GetLevelByClass(CLASS_TYPE_ANTI_PALADIN, oCaster)-3;
if(nTemp > 0) nLevel += nTemp;
}
}
//Improved turning feat
nLevel += GetHasFeat(FEAT_IMPROVED_TURNING, oCaster);
//Phylactery of Undead Turning
if(GetTag(GetItemInSlot(INVENTORY_SLOT_NECK, oCaster)) == "prc_turnphyl")
nLevel += 4;
//Weapon of Legacy bonuses
nLevel += GetLocalInt(oCaster, "WOLTurning");
return nLevel;
}
//ok
int GetTurningCharismaMod(int nTurnType)
{
int nChaMod = GetAbilityModifier(ABILITY_CHARISMA);
//Heartwarder adds two to cha checks
if(GetHasFeat(FEAT_HEART_PASSION))
nChaMod += 2;
if(nTurnType == SPELL_TURN_UNDEAD)
{
//Hierophants Mastery of Energy
if(GetHasFeat(FEAT_MASTER_OF_ENERGY))
nChaMod += 4;
//Consecrate spell
if(GetHasSpellEffect(SPELL_CONSECRATE))
nChaMod += 3;
//Desecrate spell
if(GetHasSpellEffect(SPELL_DES_20) || GetHasSpellEffect(SPELL_DES_100) || GetHasSpellEffect(SPELL_DESECRATE))
nChaMod -= 3;
}
return nChaMod;
}
//ok
int GetHitDiceForTurning(object oTarget, int nTurnType, int nTargetRace)
{
//Hit Dice + Turn Resistance
int nHD = GetHitDice(oTarget) + GetTurnResistanceHD(oTarget);
if(GetHasFeat(FEAT_TURN_SUBMISSION, oTarget))
nHD -= 4;
//Outsiders get SR (halved if turner has planar turning)
if(nTargetRace == RACIAL_TYPE_OUTSIDER)
{
int nSR = PRCGetSpellResistance(oTarget, OBJECT_SELF);
if(nTurnType == SPELL_TURN_OUTSIDER || GetHasFeat(FEAT_EPIC_PLANAR_TURNING))
nSR /= 2;
nHD += nSR;
}
return nHD;
}
//ok
int GetCommandedTotalHD(int nTurnType = SPELL_TURN_UNDEAD, int bUndeadMastery = FALSE)
{
int nCommandedTotalHD;
object oTest = GetFirstFactionMember(OBJECT_SELF, FALSE);
while(GetIsObjectValid(oTest))
{
if(GetMaster(oTest) == OBJECT_SELF && GetAssociateType(oTest) == ASSOCIATE_TYPE_DOMINATED)
{
int nRace = MyPRCGetRacialType(oTest);
int nTestHD = GetHitDiceForTurning(oTest, nTurnType, nRace);
if(nRace != RACIAL_TYPE_UNDEAD && bUndeadMastery)
nTestHD *= 10;
nCommandedTotalHD += nTestHD;
}
oTest = GetNextFactionMember(OBJECT_SELF, FALSE);
}
return nCommandedTotalHD;
}
int CheckTargetName(object oTarget, string sName)
{
return FindSubString(GetStringLowerCase(GetName(oTarget)), sName) > -1;
}
//ok - elemental savant/bonded summoner?
int GetIsAirCreature(object oCreature, int nAppearance)
{
return nAppearance == APPEARANCE_TYPE_ELEMENTAL_AIR
|| nAppearance == APPEARANCE_TYPE_ELEMENTAL_AIR_ELDER
|| nAppearance == APPEARANCE_TYPE_INVISIBLE_STALKER
|| nAppearance == APPEARANCE_TYPE_MEPHIT_AIR
|| nAppearance == APPEARANCE_TYPE_MEPHIT_DUST
|| nAppearance == APPEARANCE_TYPE_MEPHIT_ICE
|| nAppearance == APPEARANCE_TYPE_WILL_O_WISP
|| nAppearance == APPEARANCE_TYPE_DRAGON_GREEN
|| nAppearance == APPEARANCE_TYPE_WYRMLING_GREEN;
//|| CheckTargetName(oCreature, "air")) // This last one is to catch anything named with Air that doesnt use the appearances
}
//ok
int GetIsEarthCreature(object oCreature, int nAppearance)
{
return nAppearance == APPEARANCE_TYPE_ELEMENTAL_EARTH
|| nAppearance == APPEARANCE_TYPE_ELEMENTAL_EARTH_ELDER
|| nAppearance == APPEARANCE_TYPE_GARGOYLE
|| nAppearance == APPEARANCE_TYPE_MEPHIT_EARTH
|| nAppearance == APPEARANCE_TYPE_MEPHIT_SALT
|| nAppearance == APPEARANCE_TYPE_DRAGON_BLUE
|| nAppearance == APPEARANCE_TYPE_DRAGON_COPPER
|| nAppearance == APPEARANCE_TYPE_WYRMLING_BLUE
|| nAppearance == APPEARANCE_TYPE_WYRMLING_COPPER;
//|| CheckTargetName(oCreature, "earth")) // As above
}
//ok
int GetIsFireCreature(object oCreature, int nAppearance)
{
return nAppearance == APPEARANCE_TYPE_ELEMENTAL_FIRE
|| nAppearance == APPEARANCE_TYPE_ELEMENTAL_FIRE_ELDER
|| nAppearance == APPEARANCE_TYPE_AZER_MALE
|| nAppearance == APPEARANCE_TYPE_AZER_FEMALE
|| nAppearance == APPEARANCE_TYPE_GIANT_FIRE
|| nAppearance == APPEARANCE_TYPE_GIANT_FIRE_FEMALE
|| nAppearance == APPEARANCE_TYPE_MEPHIT_FIRE
|| nAppearance == APPEARANCE_TYPE_MEPHIT_MAGMA
|| nAppearance == APPEARANCE_TYPE_MEPHIT_STEAM
|| nAppearance == APPEARANCE_TYPE_DRAGON_BRASS
|| nAppearance == APPEARANCE_TYPE_DRAGON_GOLD
|| nAppearance == APPEARANCE_TYPE_DRAGON_RED
|| nAppearance == APPEARANCE_TYPE_WYRMLING_BRASS
|| nAppearance == APPEARANCE_TYPE_WYRMLING_GOLD
|| nAppearance == APPEARANCE_TYPE_WYRMLING_RED
|| nAppearance == APPEARANCE_TYPE_DOG_HELL_HOUND;
//|| CheckTargetName(oCreature, "fire")) // This last one is to catch anything named with Fire that doesnt use the appearances
}
//ok
int GetIsWaterCreature(object oCreature, int nAppearance)
{
return nAppearance == APPEARANCE_TYPE_ELEMENTAL_WATER
|| nAppearance == APPEARANCE_TYPE_ELEMENTAL_WATER_ELDER
|| nAppearance == APPEARANCE_TYPE_MEPHIT_WATER
|| nAppearance == APPEARANCE_TYPE_MEPHIT_OOZE
|| nAppearance == APPEARANCE_TYPE_DRAGON_BLACK
|| nAppearance == APPEARANCE_TYPE_DRAGON_BRONZE
|| nAppearance == APPEARANCE_TYPE_WYRMLING_BLACK
|| nAppearance == APPEARANCE_TYPE_WYRMLING_BRONZE;
//|| CheckTargetName(oCreature, "water")) // As above
}
//only animals in PnP
int GetIsReptile(object oCreature, int nAppearance)
{
if(nAppearance == APPEARANCE_TYPE_KOBOLD_A
|| nAppearance == APPEARANCE_TYPE_KOBOLD_B
|| nAppearance == APPEARANCE_TYPE_KOBOLD_CHIEF_A
|| nAppearance == APPEARANCE_TYPE_KOBOLD_CHIEF_B
|| nAppearance == APPEARANCE_TYPE_KOBOLD_SHAMAN_A
|| nAppearance == APPEARANCE_TYPE_KOBOLD_SHAMAN_B
|| nAppearance == APPEARANCE_TYPE_LIZARDFOLK_A
|| nAppearance == APPEARANCE_TYPE_LIZARDFOLK_B
|| nAppearance == APPEARANCE_TYPE_LIZARDFOLK_WARRIOR_A
|| nAppearance == APPEARANCE_TYPE_LIZARDFOLK_WARRIOR_B
|| nAppearance == APPEARANCE_TYPE_LIZARDFOLK_SHAMAN_A
|| nAppearance == APPEARANCE_TYPE_LIZARDFOLK_SHAMAN_B
|| nAppearance == 451 //Trog
|| nAppearance == 452 //Trog Warrior
|| nAppearance == 453 //Trog Cleric
|| nAppearance == 178 //Black Cobra
|| nAppearance == 183 //Cobra
|| nAppearance == 194) //Gold Cobra
//|| CheckTargetName(oCreature, "scale")
//|| CheckTargetName(oCreature, "snake")
//|| CheckTargetName(oCreature, "reptile")) // Reptilian names
{
return TRUE;
}
return FALSE;
}
int GetIsSpider(object oCreature, int nAppearance)
{
return GetLevelByClass(CLASS_TYPE_VERMIN, oCreature)
&& (nAppearance == APPEARANCE_TYPE_SPIDER_DEMON
|| nAppearance == APPEARANCE_TYPE_SPIDER_DIRE
|| nAppearance == APPEARANCE_TYPE_SPIDER_GIANT
|| nAppearance == APPEARANCE_TYPE_SPIDER_SWORD
|| nAppearance == APPEARANCE_TYPE_SPIDER_PHASE
|| nAppearance == APPEARANCE_TYPE_SPIDER_WRAITH
|| nAppearance == 463); //Maggris
//|| CheckTargetName(oCreature, "spider"); // Duh
}
int GetIsColdCreature(object oCreature, int nAppearance)
{
return nAppearance == APPEARANCE_TYPE_DOG_WINTER_WOLF
|| nAppearance == APPEARANCE_TYPE_DRAGON_WHITE
|| nAppearance == APPEARANCE_TYPE_GIANT_FROST
|| nAppearance == APPEARANCE_TYPE_GIANT_FROST_FEMALE
|| nAppearance == APPEARANCE_TYPE_MEPHIT_ICE
|| nAppearance == APPEARANCE_TYPE_WYRMLING_WHITE
|| nAppearance == APPEARANCE_TYPE_DRAGON_SILVER
|| nAppearance == APPEARANCE_TYPE_WYRMLING_SILVER;
//|| CheckTargetName(oCreature, "water")) // As above
}
void FaithInTheFrost(object oPC, object oTarget)
{
if (GetHasFeat(FEAT_FAITH_IN_THE_FROST, oPC))
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(GetAbilityModifier(ABILITY_CHARISMA, oPC), DAMAGE_TYPE_COLD), oTarget);
}
void LightOfAurifar(object oPC, object oTarget)
{
if (GetHasFeat(FEAT_LIGHT_OF_AURIFAR, oPC))
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(d6(2), DAMAGE_TYPE_FIRE), oTarget);
}
// Test main
//void main(){}