Updated PRC8 version. Hathran can now select an ethran as a cohort. Preliminary Circle Magic work done. Added Choke Hold, Pain Touch, Ki Shout, Great Ki Shout, Freezing the Lifeblood, Falling Star Strikea nd Unbalancing Strike feats. Warforged get Immunity Energy Drain, not Immunity: Ability Drain. Forsakers can use alchemical items. Added VectorToPerpendicular(). Added GetIsAlchemical(). Added GenerateRandomName(). Added _DoChokeHold(). Updated Shaman bonus feat list. Updated fighter bonus feat lists. Added Favored of the Companions to the Vow of Poverty bonus feat list. Ur-Priest can't enter RKV, BFZ or Thrall of Orcus.
1424 lines
58 KiB
Plaintext
1424 lines
58 KiB
Plaintext
// race_skin
|
||
// Handle skin and other mods for races.
|
||
// This file is where various content users can customize races.
|
||
|
||
#include "prc_inc_natweap"
|
||
#include "inc_dynconv"
|
||
#include "inc_nwnx_funcs"
|
||
#include "moi_inc_moifunc"
|
||
#include "prc_inc_combmove"
|
||
|
||
void main()
|
||
{
|
||
object oPC = OBJECT_SELF;
|
||
object oSkin = GetPCSkin(oPC);
|
||
|
||
int nNWNxEE = GetPRCSwitch(PRC_NWNXEE_ENABLED);
|
||
int nPRCx = GetPRCSwitch(PRC_PRCX_ENABLED);
|
||
int bFuncs = (nNWNxEE && nPRCx);
|
||
|
||
itemproperty ipIP;
|
||
|
||
if(DEBUG) DoDebug("race_skin >> Entering main function");
|
||
|
||
// Any PC that needs this feat will have a claw, which they're automatically proficient in
|
||
IPSafeAddItemProperty(oSkin, ItemPropertyBonusFeat(IP_CONST_FEAT_WEAPON_PROF_CREATURE), 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||
SetCompositeBonus(oSkin, "DieDieDie_Taunt", 50, ITEM_PROPERTY_DECREASED_SKILL_MODIFIER, SKILL_TAUNT);
|
||
SetCompositeBonus(oSkin, "DieDieDie_Parry", 50, ITEM_PROPERTY_DECREASED_SKILL_MODIFIER, SKILL_PARRY);
|
||
/*int nTumble = GetSkillRank(SKILL_TUMBLE, oPC, TRUE);
|
||
int nSpellCraft = GetSkillRank(SKILL_SPELLCRAFT, oPC);
|
||
if (nTumble >= 5)
|
||
{
|
||
int nPen = nTumble/5;
|
||
SetCompositeBonus(oSkin, "TumbleCheat", nPen, ITEM_PROPERTY_DECREASED_AC, IP_CONST_ACMODIFIERTYPE_DODGE);
|
||
}
|
||
if (nSpellCraft >= 5)
|
||
{
|
||
int nPen = nSpellCraft/5;
|
||
SetCompositeBonus(oSkin, "SpellcraftCheat_F", nPen, ITEM_PROPERTY_DECREASED_SAVING_THROWS, IP_CONST_SAVEBASETYPE_FORTITUDE);
|
||
SetCompositeBonus(oSkin, "SpellcraftCheat_W", nPen, ITEM_PROPERTY_DECREASED_SAVING_THROWS, IP_CONST_SAVEBASETYPE_WILL);
|
||
SetCompositeBonus(oSkin, "SpellcraftCheat_R", nPen, ITEM_PROPERTY_DECREASED_SAVING_THROWS, IP_CONST_SAVEBASETYPE_REFLEX);
|
||
//ApplyEffectToObject(DURATION_TYPE_PERMANENT, ExtraordinaryEffect(EffectSavingThrowDecrease(SAVING_THROW_ALL, nPen, SAVING_THROW_TYPE_SPELL)), oPC);
|
||
} */
|
||
if (GetPRCSwitch(PRC_PNP_KNOCKDOWN) && GetSkillRank(SKILL_DISCIPLINE, oPC, TRUE) == 0)
|
||
SetCompositeBonus(oSkin, "DisciplineBonus", GetBaseAttackBonus(oPC) + GetCombatMoveCheckBonus(oPC, COMBAT_MOVE_TRIP, TRUE), ITEM_PROPERTY_SKILL_BONUS, SKILL_DISCIPLINE);
|
||
|
||
|
||
//:: Immunity to Petrification (has to be done per spell, thanks Bioware!)
|
||
if(GetHasFeat(FEAT_IMMUNE_PETRIFICATION))
|
||
{
|
||
ipIP = ItemPropertySpellImmunitySpecific(398); //:: Flesh to Stone
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||
ipIP = ItemPropertySpellImmunitySpecific(791); //:: Breath, Petrify
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||
ipIP = ItemPropertySpellImmunitySpecific(793); //:: Touch, Petrify
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||
ipIP = ItemPropertySpellImmunitySpecific(792); //:: Gaze, Petrify
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||
ipIP = ItemPropertySpellImmunitySpecific(482); //:: Stonehold
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||
ipIP = ItemPropertySpellImmunitySpecific(1460); //:: Audience of Stone
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||
ipIP = ItemPropertySpellImmunitySpecific(1459); //:: Crystalize
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||
ipIP = ItemPropertySpellImmunitySpecific(1458); //:: Basilisk Mask
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||
ipIP = ItemPropertySpellImmunitySpecific(1457); //:: Gorgon Mask
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//immunity to cold
|
||
if(GetHasFeat(FEAT_IMM_COLD))
|
||
{
|
||
ipIP =ItemPropertyDamageImmunity(IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGEIMMUNITY_100_PERCENT);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//immunity to acid
|
||
if(GetHasFeat(FEAT_IMMUNE_ACID))
|
||
{
|
||
ipIP =ItemPropertyDamageImmunity(IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEIMMUNITY_100_PERCENT);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//immunity to electricity
|
||
if(GetHasFeat(FEAT_IMMUNE_ELECTRICITY))
|
||
{
|
||
ipIP =ItemPropertyDamageImmunity(IP_CONST_DAMAGETYPE_ELECTRICAL,IP_CONST_DAMAGEIMMUNITY_100_PERCENT);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//immunity to phantasms
|
||
//only immunity to wierd and phatasmal killer
|
||
if(GetHasFeat(FEAT_IMM_PHANT))
|
||
{
|
||
ipIP = ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_WEIRD);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
ipIP = ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_PHANTASMAL_KILLER);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//immunity to detection. NEEDS TESTING!!!
|
||
//tested and doesnt work (means you cant cast these on yourself)
|
||
//removed untill a solution is found
|
||
if(GetHasFeat(FEAT_NONDETECTION))
|
||
{
|
||
/*
|
||
ipIP = ItemPropertySpellImmunitySpecific(SPELL_SEE_INVISIBILITY);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
ipIP = ItemPropertySpellImmunitySpecific(SPELL_TRUE_SEEING);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
ipIP = ItemPropertySpellImmunitySpecific(SPELL_DARKVISION);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
*/
|
||
}
|
||
|
||
//immunity to artificial poisons
|
||
//replaced with immunity to all poisons
|
||
if(GetHasFeat(FEAT_IMM_APOI))
|
||
{
|
||
ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_POISON);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//immunity to disease
|
||
if(GetHasFeat(FEAT_IMMUNE_DISEASE))
|
||
{
|
||
ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_DISEASE);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//improved fortification - immunity to critical hits
|
||
if(GetHasFeat(FEAT_IMPROVED_FORTIFICATION))
|
||
{
|
||
ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_CRITICAL_HITS);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_BACKSTAB);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//Plant racial type immunities - sleep, paralysis, poison, mind-affecting, criticals
|
||
if(GetHasFeat(FEAT_PLANT_IMM))
|
||
{
|
||
//effect eSleepImmune = ExtraordinaryEffect(EffectImmunity(IMMUNITY_TYPE_SLEEP));
|
||
//AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSleepImmune, oPC));
|
||
|
||
ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_PARALYSIS);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
|
||
ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_POISON);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
|
||
ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_MINDSPELLS);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
|
||
ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_CRITICAL_HITS);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//Living Construct type immunities - sleep, paralysis, poison, disease, energy drain
|
||
if(GetHasFeat(FEAT_LIVING_CONSTRUCT))
|
||
{
|
||
ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_PARALYSIS);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
|
||
ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_POISON);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
|
||
ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_DISEASE);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
|
||
ipIP = ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_ENERGY_DRAIN);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
|
||
ipIP = ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_ENERVATION);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
|
||
effect eLevelImmune = ExtraordinaryEffect(EffectImmunity(IMMUNITY_TYPE_NEGATIVE_LEVEL));
|
||
eLevelImmune = UnyieldingEffect(eLevelImmune);
|
||
AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLevelImmune, oPC));
|
||
|
||
effect eSleepImmune = ExtraordinaryEffect(EffectImmunity(IMMUNITY_TYPE_SLEEP));
|
||
eSleepImmune = UnyieldingEffect(eSleepImmune);
|
||
AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSleepImmune, oPC));
|
||
}
|
||
|
||
//:: Natural Armor feats 1<>19
|
||
int nAC = 0;
|
||
|
||
if (GetHasFeat(FEAT_NATARM_19)) nAC = 19;
|
||
else if (GetHasFeat(FEAT_NATARM_18)) nAC = 18;
|
||
else if (GetHasFeat(FEAT_NATARM_17)) nAC = 17;
|
||
else if (GetHasFeat(FEAT_NATARM_16)) nAC = 16;
|
||
else if (GetHasFeat(FEAT_NATARM_15)) nAC = 15;
|
||
else if (GetHasFeat(FEAT_NATARM_14)) nAC = 14;
|
||
else if (GetHasFeat(FEAT_NATARM_13)) nAC = 13;
|
||
else if (GetHasFeat(FEAT_NATARM_12)) nAC = 12;
|
||
else if (GetHasFeat(FEAT_NATARM_11)) nAC = 11;
|
||
else if (GetHasFeat(FEAT_NATARM_10)) nAC = 10;
|
||
else if (GetHasFeat(FEAT_NATARM_9)) nAC = 9;
|
||
else if (GetHasFeat(FEAT_NATARM_8)) nAC = 8;
|
||
else if (GetHasFeat(FEAT_NATARM_7)) nAC = 7;
|
||
else if (GetHasFeat(FEAT_NATARM_6)) nAC = 6;
|
||
else if (GetHasFeat(FEAT_NATARM_5)) nAC = 5;
|
||
else if (GetHasFeat(FEAT_NATARM_4)) nAC = 4;
|
||
else if (GetHasFeat(FEAT_NATARM_3)) nAC = 3;
|
||
else if (GetHasFeat(FEAT_NATARM_2)) nAC = 2;
|
||
else if (GetHasFeat(FEAT_NATARM_1)) nAC = 1;
|
||
|
||
if (nAC > 0)
|
||
{
|
||
if (bFuncs)
|
||
{
|
||
//:: Fire NWNxEE shim to set base AC
|
||
SetLocalInt(oPC, "PRC_EE_BASEAC", nAC);
|
||
ExecuteScript("prcx_set_ac", oPC);
|
||
}
|
||
else
|
||
{
|
||
//:: Vanilla fallback
|
||
SetCompositeBonus(oSkin, "RacialNaturalArmor", nAC, ITEM_PROPERTY_AC_BONUS);
|
||
}
|
||
}
|
||
|
||
/* int nAC;
|
||
if(GetHasFeat(FEAT_NATARM_19)) nAC = 19;
|
||
else if(GetHasFeat(FEAT_NATARM_18)) nAC = 18;
|
||
else if(GetHasFeat(FEAT_NATARM_17)) nAC = 17;
|
||
else if(GetHasFeat(FEAT_NATARM_16)) nAC = 16;
|
||
else if(GetHasFeat(FEAT_NATARM_15)) nAC = 15;
|
||
else if(GetHasFeat(FEAT_NATARM_14)) nAC = 14;
|
||
else if(GetHasFeat(FEAT_NATARM_13)) nAC = 13;
|
||
else if(GetHasFeat(FEAT_NATARM_12)) nAC = 12;
|
||
else if(GetHasFeat(FEAT_NATARM_11)) nAC = 11;
|
||
else if(GetHasFeat(FEAT_NATARM_10)) nAC = 10;
|
||
else if(GetHasFeat(FEAT_NATARM_9)) nAC = 9;
|
||
else if(GetHasFeat(FEAT_NATARM_8)) nAC = 8;
|
||
else if(GetHasFeat(FEAT_NATARM_7)) nAC = 7;
|
||
else if(GetHasFeat(FEAT_NATARM_6)) nAC = 6;
|
||
else if(GetHasFeat(FEAT_NATARM_5)) nAC = 5;
|
||
else if(GetHasFeat(FEAT_NATARM_4)) nAC = 4;
|
||
else if(GetHasFeat(FEAT_NATARM_3)) nAC = 3;
|
||
else if(GetHasFeat(FEAT_NATARM_2)) nAC = 2;
|
||
else if(GetHasFeat(FEAT_NATARM_1)) nAC = 1;
|
||
|
||
if(nAC) SetCompositeBonus(oSkin, "RacialNaturalArmor", nAC, ITEM_PROPERTY_AC_BONUS); */
|
||
|
||
|
||
if (GetHasFeat(FEAT_ABERRANT_DEEPSPAWN, oPC))
|
||
{
|
||
string sResRef = "prc_tentacle_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
sResRef += GetAffixForSize(nSize);
|
||
if (DEBUG) DoDebug("race_skin >> Aberrant Tentacles added to oPC");
|
||
AddNaturalSecondaryWeapon(oPC, sResRef, 2);
|
||
}
|
||
//immunity to breathing-targeted spells
|
||
if(GetHasFeat(FEAT_BREATHLESS))
|
||
{
|
||
ipIP = ItemPropertySpellImmunitySpecific(368); //:: Drown
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
ipIP = ItemPropertySpellImmunitySpecific(1117); //:: Drown, Mass
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
ipIP = ItemPropertySpellImmunitySpecific(830); //:: Pulse, Drown
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
ipIP = ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_CLOUDKILL);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
ipIP = ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_STINKING_CLOUD);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//immunity to charm
|
||
if(GetHasFeat(FEAT_IMMUNE_CHARM) || GetRacialType(OBJECT_SELF) == RACIAL_TYPE_DOPPELGANGER)
|
||
{
|
||
ipIP = ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_CHARM_PERSON);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
ipIP = ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_CHARM_MONSTER);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
ipIP = ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_CHARM_PERSON_OR_ANIMAL);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//immunity to confusion
|
||
if(GetHasFeat(FEAT_IMMUNE_CONFUSION))
|
||
{
|
||
ipIP = ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_CONFUSION);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//immunity to drowning
|
||
//water gensasi and aquatic elves can breath water, so can some Spirit Folk
|
||
if(GetHasFeat(FEAT_WATER_BREATHING) || GetHasFeat(FEAT_BONUS_RIVER) || GetHasFeat(FEAT_BONUS_SEA))
|
||
{
|
||
ipIP = ItemPropertySpellImmunitySpecific(368); //:: Drown
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
ipIP = ItemPropertySpellImmunitySpecific(1117); //:: Drown, Mass
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
ipIP = ItemPropertySpellImmunitySpecific(830); //:: Pulse, Drown
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//Bamboo Spirit Folk Bonuses
|
||
if(GetHasFeat(FEAT_BONUS_BAMBOO))
|
||
{
|
||
ipIP = ItemPropertyBonusFeat(IP_CONST_FEAT_TRACKLESS_STEP);
|
||
if(bFuncs && !PRC_Funcs_GetFeatKnown(oPC, FEAT_TRACKLESS_STEP))
|
||
PRC_Funcs_AddFeat(oPC, FEAT_TRACKLESS_STEP);
|
||
else
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
SetCompositeBonus(oSkin, "Bamboo_Spirit_Lore", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_LORE);
|
||
}
|
||
//Mountain Spirit Folk Bonuses
|
||
if(GetHasFeat(FEAT_BONUS_MOUNTAIN))
|
||
{
|
||
SetCompositeBonus(oSkin, "SpiritFolk_Climb", 8, ITEM_PROPERTY_SKILL_BONUS, SKILL_CLIMB);
|
||
SetCompositeBonus(oSkin, "SpiritFolk_Balance", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_BALANCE);
|
||
SetCompositeBonus(oSkin, "SpiritFolk_Jump", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_JUMP);
|
||
SetCompositeBonus(oSkin, "SpiritFolk_Tumble", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_TUMBLE);
|
||
}
|
||
//Azer Heat Damage +1 (armed and unarmed)
|
||
if (GetHasFeat(FEAT_AZER_HEAT, oPC))
|
||
{
|
||
if (GetLocalInt(oPC, "ONEQUIP") == 1)
|
||
{
|
||
object oItem = GetItemLastUnequipped();
|
||
SetCompositeDamageBonusT(oItem, "AzerFlameDamage", 0, IP_CONST_DAMAGETYPE_FIRE);
|
||
}
|
||
else
|
||
{
|
||
ExecuteScript("race_azer_flame", oPC);
|
||
}
|
||
}
|
||
/* Bioware reads size based on appearance
|
||
//-1AC, -1 ATT, -4hide
|
||
if(GetHasFeat(FEAT_LARGE))
|
||
{
|
||
SetCompositeBonus(oSkin, "RacialSize_AC", 1, ITEM_PROPERTY_DECREASED_AC);
|
||
SetCompositeBonus(oSkin, "RacialSize_Attack", 1, ITEM_PROPERTY_DECREASED_ATTACK_MODIFIER);
|
||
SetCompositeBonus(oSkin, "RacialSize_SkillHide", 4, ITEM_PROPERTY_DECREASED_SKILL_MODIFIER, SKILL_HIDE);
|
||
}
|
||
|
||
//-2AC, -2 ATT, -8hide
|
||
else if(GetHasFeat(FEAT_HUGE))
|
||
{
|
||
SetCompositeBonus(oSkin, "RacialSize_AC", 2, ITEM_PROPERTY_DECREASED_AC);
|
||
SetCompositeBonus(oSkin, "RacialSize_Attack", 2, ITEM_PROPERTY_DECREASED_ATTACK_MODIFIER);
|
||
SetCompositeBonus(oSkin, "RacialSize_SkillHide", 8, ITEM_PROPERTY_DECREASED_SKILL_MODIFIER, SKILL_HIDE);
|
||
}
|
||
|
||
//+2AC, +2 ATT, +8hide
|
||
else if(GetHasFeat(FEAT_TINY))
|
||
{
|
||
SetCompositeBonus(oSkin, "RacialSize_AC", 2, ITEM_PROPERTY_AC_BONUS);
|
||
SetCompositeBonus(oSkin, "RacialSize_Attack", 2, ITEM_PROPERTY_ATTACK_BONUS);
|
||
SetCompositeBonus(oSkin, "RacialSize_SkillHide", 8, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
|
||
}
|
||
*/
|
||
//regeneration 5PH/round
|
||
if(GetHasFeat(FEAT_REGEN5))
|
||
{
|
||
SetCompositeBonus(oSkin, "RacialRegeneration_5", 5, ITEM_PROPERTY_REGENERATION);
|
||
}
|
||
|
||
if(GetHasFeat(FEAT_UNEARTHLY_GRACE))
|
||
{
|
||
PRCRemoveSpellEffects(SPELL_GLOURA_GRACE, oPC, oPC);
|
||
GZPRCRemoveSpellEffects(SPELL_GLOURA_GRACE, oPC, FALSE);
|
||
ActionCastSpellOnSelf(SPELL_GLOURA_GRACE);
|
||
/*int nGrace = GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
||
SetCompositeBonus(oSkin, "UnearthlyGraceAC", nGrace, ITEM_PROPERTY_AC_BONUS);
|
||
SetCompositeBonus(oSkin, "UnearthlyGraceSave", nGrace, ITEM_PROPERTY_SAVING_THROW_BONUS, SAVING_THROW_ALL);*/
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_ARANEA) //:: Aranea
|
||
{
|
||
SetCompositeBonus(oSkin, "Aranea_Climb", 8, ITEM_PROPERTY_SKILL_BONUS, SKILL_CLIMB);
|
||
SetCompositeBonus(oSkin, "Aranea_Jump", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_JUMP);
|
||
SetCompositeBonus(oSkin, "Aranea_Spot", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_SPOT);
|
||
SetCompositeBonus(oSkin, "Aranea_Listen", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_LISTEN);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_MECHANATRIX) //:: Mechanatrix
|
||
{
|
||
SetCompositeBonus(oSkin, "Mechanatrix_Lore", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_LORE);
|
||
SetCompositeBonus(oSkin, "Mechanatrix_Spot", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_SPOT);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_DROW_MALE || GetRacialType(oPC) == RACIAL_TYPE_DROW_FEMALE)
|
||
{
|
||
SetCompositeBonus(oSkin, "DrowWillSave", 2, ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC, SAVING_THROW_WILL);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_KRINTH)
|
||
{
|
||
SetCompositeBonus(oSkin, "KrinthSave", 1, ITEM_PROPERTY_SAVING_THROW_BONUS, SAVING_THROW_ALL);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_HADOZEE)
|
||
{
|
||
SetCompositeBonus(oSkin, "Hadozee_Climb", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_CLIMB);
|
||
SetCompositeBonus(oSkin, "Hadozee_Balance", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_BALANCE);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_BHUKA)
|
||
{
|
||
SetCompositeBonus(oSkin, "Bhuka_Lore", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_LORE);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_SKARN)
|
||
{
|
||
SetCompositeBonus(oSkin, "Skarn_Climb", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_CLIMB);
|
||
SetCompositeBonus(oSkin, "Skarn_Intim", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_INTIMIDATE);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_FERAL_GARGUN)
|
||
{
|
||
ipIP =ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_COLD, IP_CONST_DAMAGERESIST_5);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_CHITINE)
|
||
{
|
||
SetCompositeBonus(oSkin, "Chitine_Climb", 8, ITEM_PROPERTY_SKILL_BONUS, SKILL_CLIMB);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_TAER)
|
||
{
|
||
SetCompositeBonus(oSkin, "Taer_Climb", 8, ITEM_PROPERTY_SKILL_BONUS, SKILL_CLIMB);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_RILKAN)
|
||
{
|
||
int nLore = 1 + GetShapedMeldsCount(oPC)/2;
|
||
SetCompositeBonus(oSkin, "Rilkan_Racial_Knowledge", nLore, ITEM_PROPERTY_SKILL_BONUS, SKILL_LORE);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_NEANDERTHAL)
|
||
{
|
||
SetCompositeBonus(oSkin, "Neander_L", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_LISTEN);
|
||
SetCompositeBonus(oSkin, "Neander_S", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_SPOT);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_ULDRA)
|
||
{
|
||
ipIP =ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_COLD, IP_CONST_DAMAGERESIST_5);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
SetCompositeBonus(oSkin, "Uldra_Lore", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_LORE);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_EXTAMINAAR)
|
||
{
|
||
SetCompositeBonus(oSkin, "Extaminaar_C", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_CLIMB);
|
||
SetCompositeBonus(oSkin, "Extaminaar_T", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_TUMBLE);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_SKULK)
|
||
{
|
||
object oItem = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC);
|
||
int nArmorType = GetBaseAC(oItem);
|
||
//if not light armor, then remove racial bonuses
|
||
if(GetBaseAC(oItem) > 4)
|
||
{
|
||
SetCompositeBonus(oSkin, "Skulk_H", 0, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
|
||
SetCompositeBonus(oSkin, "Skulk_M", 0, ITEM_PROPERTY_SKILL_BONUS, SKILL_MOVE_SILENTLY);
|
||
}
|
||
else
|
||
{
|
||
SetCompositeBonus(oSkin, "Skulk_H", 15, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
|
||
SetCompositeBonus(oSkin, "Skulk_M", 8, ITEM_PROPERTY_SKILL_BONUS, SKILL_MOVE_SILENTLY);
|
||
}
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_HYBSIL)
|
||
{
|
||
effect eLink = EffectSeeInvisible();
|
||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, OBJECT_SELF);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_BARIAUR)
|
||
{
|
||
SetCompositeBonus(oSkin, "BariaurWSave", 1, ITEM_PROPERTY_SAVING_THROW_BONUS, SAVING_THROW_WILL);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_DOPPELGANGER)
|
||
{
|
||
SetCompositeBonus(oSkin, "Doppel_B", 10, ITEM_PROPERTY_SKILL_BONUS, SKILL_BLUFF);
|
||
SetCompositeBonus(oSkin, "Doppel_SM", 8, ITEM_PROPERTY_SKILL_BONUS, SKILL_SENSE_MOTIVE);
|
||
SetCompositeBonus(oSkin, "Doppel_I", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_INTIMIDATE);
|
||
SetCompositeBonus(oSkin, "Doppel_P", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_PERSUADE);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_MONGRELFOLK)
|
||
{
|
||
SetCompositeBonus(oSkin, "Mongrel_A", 1, ITEM_PROPERTY_SKILL_BONUS, SKILL_APPRAISE);
|
||
SetCompositeBonus(oSkin, "Mongrel_C", 1, ITEM_PROPERTY_SKILL_BONUS, SKILL_CLIMB);
|
||
SetCompositeBonus(oSkin, "Mongrel_J", 1, ITEM_PROPERTY_SKILL_BONUS, SKILL_JUMP);
|
||
SetCompositeBonus(oSkin, "Mongrel_L", 1, ITEM_PROPERTY_SKILL_BONUS, SKILL_LISTEN);
|
||
SetCompositeBonus(oSkin, "Mongrel_MS",1, ITEM_PROPERTY_SKILL_BONUS, SKILL_MOVE_SILENTLY);
|
||
SetCompositeBonus(oSkin, "Mongrel_SR",1, ITEM_PROPERTY_SKILL_BONUS, SKILL_SEARCH);
|
||
SetCompositeBonus(oSkin, "Mongrel_SP",1, ITEM_PROPERTY_SKILL_BONUS, SKILL_SPOT);
|
||
SetCompositeBonus(oSkin, "Mongrel_H", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
|
||
SetCompositeBonus(oSkin, "Mongrel_P", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_PICK_POCKET);
|
||
SetCompositeBonus(oSkin, "Mongrel_U", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_USE_MAGIC_DEVICE);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_VARAG) SetCompositeBonus(oSkin, "Varag_MS", 8, ITEM_PROPERTY_SKILL_BONUS, SKILL_MOVE_SILENTLY);
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_RETH_DEKALA)
|
||
{
|
||
SetCompositeBonus(oSkin, "Reth_Balance", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_BALANCE);
|
||
ipIP =ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGERESIST_15);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
ipIP =ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_ACID, IP_CONST_DAMAGERESIST_15);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_ARKAMOI || GetRacialType(oPC) == RACIAL_TYPE_LASHEMOI)
|
||
{
|
||
ipIP =ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_BLUDGEONING, IP_CONST_DAMAGERESIST_5);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_TURLEMOI || GetRacialType(oPC) == RACIAL_TYPE_HADRIMOI)
|
||
{
|
||
ipIP =ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_BLUDGEONING, IP_CONST_DAMAGERESIST_10);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_HADRIMOI)
|
||
{
|
||
SetEventScript(oPC, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "race_hadrimoi");
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_REDSPAWN_ARCANISS)
|
||
{
|
||
ipIP = ItemPropertyDamageImmunity(IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEIMMUNITY_100_PERCENT);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||
ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_PARALYSIS);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_GLOURA /* || GetRacialType(oPC) == RACIAL_TYPE_PIXIE */)
|
||
{
|
||
// Only apply racial wings if player doesn't have custom wings
|
||
if(!GetPersistantLocalInt(oPC, "AppearanceStoredWing"))
|
||
SetCreatureWingType(CREATURE_WING_TYPE_BUTTERFLY, oPC);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_AVARIEL)
|
||
{
|
||
// Only apply racial wings if player doesn't have custom wings
|
||
if(!GetPersistantLocalInt(oPC, "AppearanceStoredWing"))
|
||
SetCreatureWingType(CREATURE_WING_TYPE_BIRD, oPC);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_FEYRI)
|
||
{
|
||
// Only apply racial wings if player doesn't have custom wings
|
||
if(!GetPersistantLocalInt(oPC, "AppearanceStoredWing"))
|
||
SetCreatureWingType(CREATURE_WING_TYPE_DEMON, oPC);
|
||
}
|
||
|
||
/* if(GetRacialType(oPC) == RACIAL_TYPE_GLOURA) // || GetRacialType(oPC) == RACIAL_TYPE_PIXIE
|
||
{
|
||
SetCreatureWingType(CREATURE_WING_TYPE_BUTTERFLY, oPC);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_AVARIEL)
|
||
{
|
||
SetCreatureWingType(CREATURE_WING_TYPE_BIRD, oPC);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_FEYRI)
|
||
{
|
||
SetCreatureWingType(CREATURE_WING_TYPE_DEMON, oPC);
|
||
} */
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_JAEBRIN)
|
||
{
|
||
SetCompositeBonus(oSkin, "Jaebrin_Spell", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_SPELLCRAFT);
|
||
IPSafeAddItemProperty(oSkin, ItemPropertySpellImmunitySchool(IP_CONST_SPELLSCHOOL_ENCHANTMENT), 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||
string sResRef = "prc_troll_bite_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
//:: Needs 1d3 @ Medium
|
||
nSize--;
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 1);
|
||
}
|
||
|
||
//damage invulnerability fire
|
||
if(GetHasFeat(FEAT_DRAGON_IMMUNE_FIRE))
|
||
{
|
||
ipIP = ItemPropertyDamageImmunity(IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEIMMUNITY_100_PERCENT);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//fire resistance 5
|
||
if(GetHasFeat(FEAT_RESIST_FIRE5))
|
||
{
|
||
ipIP =ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGERESIST_5);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||
}
|
||
//cold resistance 5
|
||
if(GetHasFeat(FEAT_RESIST_COLD5))
|
||
{
|
||
ipIP =ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_COLD, IP_CONST_DAMAGERESIST_5);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||
}
|
||
//sonic resistance 5
|
||
if(GetHasFeat(FEAT_RESIST_SONIC5))
|
||
{
|
||
ipIP =ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_SONIC, IP_CONST_DAMAGERESIST_5);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_SHYFT)
|
||
{
|
||
SetCompositeBonus(oSkin, "Shyft_Hide_4", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
|
||
SetCompositeBonus(oSkin, "Shyft_MoveSilently_4", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_MOVE_SILENTLY);
|
||
}
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_UNDERFOLK)
|
||
{
|
||
SetCompositeBonus(oSkin, "Under_S", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_LISTEN);
|
||
}
|
||
|
||
//fire resistance 10
|
||
if(GetHasFeat(FEAT_RESIST_FIRE_10))
|
||
{
|
||
ipIP =ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGERESIST_10);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//cold resistance 10
|
||
if(GetHasFeat(FEAT_RESIST_COLD_10))
|
||
{
|
||
ipIP =ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_COLD, IP_CONST_DAMAGERESIST_10);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
// Very Heroic, +2 to all saving throws
|
||
if(GetHasFeat(FEAT_VERYHEROIC))
|
||
{
|
||
SetCompositeBonus(oSkin, "VeryHeroic", 2, ITEM_PROPERTY_SAVING_THROW_BONUS, SAVING_THROW_ALL);
|
||
}
|
||
|
||
// Skill Affinity, +2 to jump
|
||
if(GetHasFeat(FEAT_SA_JUMP))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Jump", 2, ITEM_PROPERTY_SKILL_BONUS, 28);
|
||
}
|
||
|
||
// Skill Affinity, +2 to bluff
|
||
if(GetHasFeat(FEAT_SA_BLUFF))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Bluff", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_BLUFF);
|
||
}
|
||
|
||
// Improved Skill Affinity, +4 to bluff
|
||
if(GetHasFeat(FEAT_SA_BLUFF_4))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Bluff_4", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_BLUFF);
|
||
}
|
||
|
||
// Skill Affinity, +2 to intimidate
|
||
if(GetHasFeat(FEAT_SA_INTIMIDATE))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Intimidate", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_INTIMIDATE);
|
||
}
|
||
|
||
// Skill Affinity, +2 to balance
|
||
if(GetHasFeat(FEAT_SA_BALANCE))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Balance", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_BALANCE);
|
||
}
|
||
|
||
// Skill Affinity, +4 to jump
|
||
if(GetHasFeat(FEAT_SA_JUMP_4))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Jump_4", 4, ITEM_PROPERTY_SKILL_BONUS, 28);
|
||
}
|
||
|
||
// Leap, +5 to Jump
|
||
if(GetHasFeat(FEAT_LEAP))
|
||
{
|
||
SetCompositeBonus(oSkin, "Leap", 5, ITEM_PROPERTY_SKILL_BONUS, 28);
|
||
}
|
||
|
||
// Thri-Kreen Leap
|
||
if(GetHasFeat(FEAT_THRIKREEN_LEAP))
|
||
{
|
||
SetCompositeBonus(oSkin, "TKLeap", 30, ITEM_PROPERTY_SKILL_BONUS, 28);
|
||
}
|
||
|
||
// Skill Affinity, +4 to spot
|
||
if(GetHasFeat(FEAT_SA_SPOT_4))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Spot_4", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_SPOT);
|
||
}
|
||
|
||
// Skill Affinity, +4 to spot
|
||
if(GetHasFeat(FEAT_KEEN_SIGHT))
|
||
{
|
||
SetCompositeBonus(oSkin, "Keen_Sight", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_SPOT);
|
||
}
|
||
|
||
// Skill Affinity, +4 to listen
|
||
if(GetHasFeat(FEAT_SA_LISTEN_4))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Listen_4", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_LISTEN);
|
||
}
|
||
|
||
// Skill Affinity, +4 to perform
|
||
if(GetHasFeat(FEAT_SA_PERFORM_4))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Perform_4", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_PERFORM);
|
||
}
|
||
|
||
// Skill Affinity, +2 to perform
|
||
if(GetHasFeat(FEAT_SA_PERFORM))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Perform", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_PERFORM);
|
||
}
|
||
|
||
// Skill Affinity, +2 to open locks
|
||
if(GetHasFeat(FEAT_SA_OPEN))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Open_Lock", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_OPEN_LOCK);
|
||
}
|
||
|
||
// Skill Affinity, +2 to sleight of hand/Pickpocket
|
||
if(GetHasFeat(FEAT_SA_PICKPOCKET))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Pickpocket", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_PICK_POCKET);
|
||
}
|
||
|
||
|
||
// Minotaur and other races bonuses due to scent
|
||
if(GetHasFeat(FEAT_ABILITY_SCENT) || GetHasFeat(FEAT_NEZUMI_KEEN_SCENT))
|
||
{
|
||
SetCompositeBonus(oSkin, "Minot_Scent_Spot", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_SPOT);
|
||
SetCompositeBonus(oSkin, "Minot_Scent_Search", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_SEARCH);
|
||
SetCompositeBonus(oSkin, "Minot_Scent_Listen", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_LISTEN);
|
||
IPSafeAddItemProperty(oSkin, ItemPropertyBonusFeat(IP_CONST_FEAT_KEEN_SENSES), 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
// Kender Bonuses
|
||
if(GetHasFeat(FEAT_KENDERBLUFF))
|
||
{
|
||
SetCompositeBonus(oSkin, "Kender_Bonus_Bluff", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_BLUFF);
|
||
}
|
||
|
||
// -4 to concentration
|
||
if(GetHasFeat(FEAT_LACKOFFOCUS))
|
||
{
|
||
SetCompositeBonus(oSkin, "LackofFocus", 4, ITEM_PROPERTY_DECREASED_SKILL_MODIFIER, SKILL_CONCENTRATION);
|
||
}
|
||
|
||
// Gully Dwarf Liabilities
|
||
if(GetHasFeat(FEAT_COWARDPITY))
|
||
{
|
||
SetCompositeBonus(oSkin, "Gully_Trait_Persuade", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_PERSUADE);
|
||
SetCompositeBonus(oSkin, "Gully_Trait_Fear", 4, ITEM_PROPERTY_DECREASED_SAVING_THROWS_SPECIFIC, SPELL_FEAR);
|
||
}
|
||
|
||
// Skill Affinity, +2 to move silently
|
||
if(GetHasFeat(FEAT_SA_MOVE))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Move", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_MOVE_SILENTLY);
|
||
}
|
||
|
||
// Skill Affinity, +4 to move silently
|
||
if(GetHasFeat(FEAT_SA_MOVE4))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Move_4", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_MOVE_SILENTLY);
|
||
}
|
||
|
||
// Skill Affinity, +2 to craft armor
|
||
if(GetHasFeat(FEAT_SA_CRFTARM))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Craft_Armor", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_CRAFT_ARMOR);
|
||
}
|
||
|
||
// Skill Affinity, +2 to craft weapon
|
||
if(GetHasFeat(FEAT_SA_CRFTWEAP))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Craft_Weapon", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_CRAFT_WEAPON);
|
||
}
|
||
|
||
// Skill Affinity, +2 to craft trap
|
||
if(GetHasFeat(FEAT_SA_CRFTTRAP))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Craft_Trap", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_CRAFT_TRAP);
|
||
}
|
||
|
||
// Skill Affinity, +2 to hide
|
||
if(GetHasFeat(FEAT_SA_HIDE))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Hide", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
|
||
}
|
||
|
||
// Skill Affinity, +4 to hide
|
||
// for forest gnomes since they get +4 or +8 in the woods.
|
||
//also for Volodni, which only get hide bonuses in the forest
|
||
if(GetHasFeat(FEAT_SA_HIDEF))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Hide_Forest", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
|
||
}
|
||
|
||
// Skill Affinity, +4 to hide
|
||
// for troglodytes since they get +4 or +8 underground.
|
||
if(GetHasFeat(FEAT_SA_HIDE_TROG))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Hide_UndrGrnd", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
|
||
}
|
||
|
||
// Skill Affinity, +5 to hide
|
||
// for grigs, as they get +5 in the woods.
|
||
if(GetHasFeat(FEAT_SA_HIDEF_5))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Hide_Forest", 5, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
|
||
}
|
||
|
||
|
||
// Skill Affinity, +4 to hide
|
||
// for forest gnomes since they get +4 or +8 in the woods.
|
||
if(GetHasFeat(FEAT_SA_HIDE4))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Hide_4", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE);
|
||
}
|
||
|
||
// Skill Affinity, +2 to appraise
|
||
// dwarves and deep halfings get racial +2 to appraise checks.
|
||
if(GetHasFeat(FEAT_SA_APPRAISE))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Appraise", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_APPRAISE);
|
||
}
|
||
|
||
// Skill Affinity, +6 to animal empathy
|
||
if(GetHasFeat(FEAT_SA_ANIMAL_EMP_6))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_AnimalEmpathy_6", 6, ITEM_PROPERTY_SKILL_BONUS, SKILL_ANIMAL_EMPATHY);
|
||
}
|
||
|
||
// Skill Affinity, +2 to animal empathy
|
||
if(GetHasFeat(FEAT_SA_ANIMAL_EMP))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_AnimalEmpathy_2", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_ANIMAL_EMPATHY);
|
||
}
|
||
|
||
// Skill Affinity, +2 to persuade
|
||
if(GetHasFeat(FEAT_SA_PERSUADE))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Persuade", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_PERSUADE);
|
||
}
|
||
|
||
// Skill Affinity, +2 to sense motive
|
||
if(GetHasFeat(FEAT_SA_SENSE_MOTIVE))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_SenseMotive", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_SENSE_MOTIVE);
|
||
}
|
||
|
||
// Skill Affinity, +2 to tumble
|
||
if(GetHasFeat(FEAT_SA_TUMBLE))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Tumble", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_TUMBLE);
|
||
}
|
||
|
||
// PSA to Lore and Spellcraft
|
||
if(GetHasFeat(FEAT_PSA_LORESPELL))
|
||
{
|
||
SetCompositeBonus(oSkin, "PSA_Lorespell_Lore", 1, ITEM_PROPERTY_SKILL_BONUS, SKILL_LORE);
|
||
SetCompositeBonus(oSkin, "PSA_Lorespell_Spell", 1, ITEM_PROPERTY_SKILL_BONUS, SKILL_SPELLCRAFT);
|
||
}
|
||
|
||
//+2 to save vs mind-affecting
|
||
if(GetHasFeat(FEAT_BONUS_MIND_2))
|
||
{
|
||
ipIP = ItemPropertyBonusSavingThrowVsX(IP_CONST_SAVEVS_MINDAFFECTING, 2);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
// Skill Penalty, -2 to persuade
|
||
if(GetHasFeat(FEAT_MINUS_PERSUADE_2))
|
||
{
|
||
SetCompositeBonus(oSkin, "Minus_Persuade", -2, ITEM_PROPERTY_SKILL_BONUS, SKILL_PERSUADE);
|
||
}
|
||
|
||
// Skill Penalty, -2 to Listen
|
||
if(GetHasFeat(FEAT_POORHEARING))
|
||
{
|
||
SetCompositeBonus(oSkin, "Poor_Listen", -2, ITEM_PROPERTY_SKILL_BONUS, SKILL_LISTEN);
|
||
}
|
||
|
||
//damage reduction 5/+1
|
||
if(GetHasFeat(FEAT_DAM_RED5))
|
||
{
|
||
ipIP =ItemPropertyDamageReduction(IP_CONST_DAMAGEREDUCTION_1, IP_CONST_DAMAGESOAK_5_HP);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//damage reduction 10/+1
|
||
if(GetHasFeat(FEAT_DAM_RED10))
|
||
{
|
||
ipIP =ItemPropertyDamageReduction(IP_CONST_DAMAGEREDUCTION_1, IP_CONST_DAMAGESOAK_10_HP);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//damage reduction 15/+1
|
||
if(GetHasFeat(FEAT_DAM_RED15))
|
||
{
|
||
ipIP =ItemPropertyDamageReduction(IP_CONST_DAMAGEREDUCTION_1, IP_CONST_DAMAGESOAK_15_HP);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//damage reduction 5/+3
|
||
if(GetHasFeat(FEAT_LESSER_FEY_DR))
|
||
{
|
||
ipIP =ItemPropertyDamageReduction(IP_CONST_DAMAGEREDUCTION_3, IP_CONST_DAMAGESOAK_5_HP);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//damage reduction 10/+3
|
||
if(GetHasFeat(FEAT_FEY_DR))
|
||
{
|
||
ipIP =ItemPropertyDamageReduction(IP_CONST_DAMAGEREDUCTION_3, IP_CONST_DAMAGESOAK_10_HP);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//damage vulnerability cold 50%
|
||
if(GetHasFeat(FEAT_VULN_COLD))
|
||
{
|
||
ipIP = ItemPropertyDamageVulnerability(IP_CONST_DAMAGETYPE_COLD, IP_CONST_DAMAGEVULNERABILITY_50_PERCENT);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//damage vulnerability fire 50%
|
||
if(GetHasFeat(FEAT_VULN_FIRE))
|
||
{
|
||
ipIP = ItemPropertyDamageVulnerability(IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEVULNERABILITY_50_PERCENT);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//damage immunity 50% Piercing
|
||
if(GetHasFeat(FEAT_PARTIAL_PIERCE_IMMUNE))
|
||
{
|
||
ipIP = ItemPropertyDamageImmunity(IP_CONST_DAMAGETYPE_PIERCING, IP_CONST_DAMAGEIMMUNITY_50_PERCENT);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//Svirfneblin dodge bonus (+4)
|
||
if(GetHasFeat(FEAT_SVIRFNEBLIN_DODGE))
|
||
{
|
||
SetCompositeBonus(oSkin, "Svirf_Dodge", 4, ITEM_PROPERTY_AC_BONUS);
|
||
}
|
||
|
||
if(GetHasFeat(FEAT_CRAFTGUILD))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Craft_GuildA", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_CRAFT_ARMOR);
|
||
SetCompositeBonus(oSkin, "SA_Craft_GuildW", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_CRAFT_WEAPON);
|
||
SetCompositeBonus(oSkin, "SA_Craft_GuildT", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_CRAFT_TRAP);
|
||
}
|
||
else if(GetHasFeat(FEAT_TECHGUILD))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Tech_GuildA", 1, ITEM_PROPERTY_SKILL_BONUS, SKILL_CRAFT_ARMOR);
|
||
SetCompositeBonus(oSkin, "SA_Tech_GuildW", 1, ITEM_PROPERTY_SKILL_BONUS, SKILL_CRAFT_WEAPON);
|
||
SetCompositeBonus(oSkin, "SA_Tech_GuildT", 1, ITEM_PROPERTY_SKILL_BONUS, SKILL_CRAFT_TRAP);
|
||
SetCompositeBonus(oSkin, "SA_Tech_GuildL", 1, ITEM_PROPERTY_SKILL_BONUS, SKILL_LORE);
|
||
}
|
||
else if(GetHasFeat(FEAT_SAGEGUILD))
|
||
{
|
||
SetCompositeBonus(oSkin, "SA_Sage_Guild", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_LORE);
|
||
}
|
||
|
||
//"cheat" ac boosts to Warforged armor so it stacks properly
|
||
if(GetHasFeat(FEAT_COMPOSITE_PLATING) &&
|
||
!(GetHasFeat(FEAT_MITHRIL_PLATING) || GetHasFeat(FEAT_ADAMANTINE_PLATING)
|
||
|| GetHasFeat(FEAT_IRONWOOD_PLATING) || GetHasFeat(FEAT_UNARMORED_BODY)))
|
||
SetCompositeBonus(oSkin, "CompositePlating", 2, ITEM_PROPERTY_AC_BONUS);
|
||
if(GetHasFeat(FEAT_MITHRIL_PLATING))
|
||
SetCompositeBonus(oSkin, "MithrilPlating", 3, ITEM_PROPERTY_AC_BONUS);
|
||
|
||
//Subdual to elements
|
||
//implemented as resist 1/- for heat and cold
|
||
if(GetHasFeat(FEAT_SUBDUAL_ELEMENTS))
|
||
{
|
||
ipIP =ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGERESIST_1);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
ipIP =ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_COLD, IP_CONST_DAMAGERESIST_1);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
//Subdual DR 1/-
|
||
//implemented as resist 1/- for slash/pierce/blud
|
||
if(GetHasFeat(FEAT_SUBDUAL))
|
||
{
|
||
ipIP =ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_SLASHING, IP_CONST_DAMAGERESIST_1);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
ipIP =ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_PIERCING, IP_CONST_DAMAGERESIST_1);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
ipIP =ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_BLUDGEONING, IP_CONST_DAMAGERESIST_1);
|
||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||
}
|
||
|
||
///Buommans vow of silence - moved to prc_feats.nss
|
||
/*if(GetHasFeat(FEAT_VOWOFSILENCE))
|
||
{
|
||
int nHasSilence = FALSE;
|
||
effect eTest = GetFirstEffect(oPC);
|
||
while(GetIsEffectValid(eTest) && !nHasSilence)
|
||
{
|
||
if(GetEffectType(eTest) == EFFECT_TYPE_SILENCE
|
||
&& GetEffectDurationType(eTest) == DURATION_TYPE_PERMANENT
|
||
&& GetEffectCreator(eTest) == oPC
|
||
&& GetEffectSubType(eTest) == SUBTYPE_SUPERNATURAL)
|
||
{
|
||
nHasSilence == TRUE;
|
||
}
|
||
eTest = GetNextEffect(oPC);
|
||
}
|
||
if(!nHasSilence)
|
||
{
|
||
effect eSilence = EffectSilence();
|
||
eSilence = SupernaturalEffect(eSilence);
|
||
AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSilence, oPC));
|
||
}
|
||
}*/
|
||
|
||
//Wemic
|
||
// Skill Bonus, +8 to jump
|
||
if(GetHasFeat(FEAT_WEMIC_JUMP_8))
|
||
{
|
||
SetCompositeBonus(oSkin, "WEMIC_JUMP_8", 8, ITEM_PROPERTY_SKILL_BONUS, 28);
|
||
}
|
||
|
||
// Metal hide - Bladeling armor restriction
|
||
if(GetHasFeat(FEAT_METAL_HIDE))
|
||
{
|
||
if(GetLocalInt(oPC, "ONEQUIP") == 2)
|
||
{
|
||
object oItem = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC);
|
||
int nArmorType = GetBaseAC(oItem);
|
||
//if not light armor, then force unequip
|
||
if(GetBaseAC(oItem) > 4)
|
||
AssignCommand(oPC, ActionUnequipItem(oItem));
|
||
|
||
if(DEBUG) DoDebug("race_skin (Bladeling) - Armor type: " + IntToString(GetBaseAC(oItem)));
|
||
}
|
||
}
|
||
|
||
//Warforged armor restrictions
|
||
if(GetIsWarforged(oPC))
|
||
{
|
||
ExecuteScript("race_warforged", oPC);
|
||
}
|
||
|
||
if(GetHasFeat(FEAT_SHIFTER_INSTINCTS))
|
||
{
|
||
SetCompositeBonus(oSkin, "ShifterInstinctSpot", 1, ITEM_PROPERTY_SKILL_BONUS, SKILL_SPOT);
|
||
SetCompositeBonus(oSkin, "ShifterInstinctSenseMotive", 1, ITEM_PROPERTY_SKILL_BONUS, SKILL_SENSE_MOTIVE);
|
||
SetCompositeBonus(oSkin, "ShifterInstinctListen", 1, ITEM_PROPERTY_SKILL_BONUS, SKILL_LISTEN);
|
||
}
|
||
|
||
if(GetHasFeat(FEAT_DRAGON_TRAINING))
|
||
SetCompositeBonus(oSkin, "RacialDragonTrsining", 4, ITEM_PROPERTY_AC_BONUS_VS_ALIGNMENT_GROUP, RACIAL_TYPE_DRAGON);
|
||
|
||
//natural weapons
|
||
//replace with a feat check
|
||
int nRace = GetRacialType(oPC);
|
||
if(nRace==RACIAL_TYPE_MINOTAUR || nRace==RACIAL_TYPE_KRYNN_MINOTAUR)
|
||
{
|
||
string sResRef = "prc_mino_gore_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalSecondaryWeapon(oPC, sResRef);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_TROLL)
|
||
{
|
||
string sResRef = "prc_troll_bite_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalSecondaryWeapon(oPC, sResRef);
|
||
//primary weapon
|
||
sResRef = "prc_claw_1d6l_";
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 2);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_RAKSHASA)
|
||
{
|
||
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);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_ZAKYA_RAKSHASA)
|
||
{
|
||
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, 1);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_LIZARDFOLK)
|
||
{
|
||
string sResRef = "prc_lizf_bite_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalSecondaryWeapon(oPC, sResRef);
|
||
//primary weapon
|
||
sResRef = "prc_claw_1d6m_";
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 2);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_TROGLODYTE)
|
||
{
|
||
string sResRef = "prc_lizf_bite_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalSecondaryWeapon(oPC, sResRef);
|
||
//primary weapon
|
||
sResRef = "prc_claw_1d6m_";
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 2);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_TANARUKK)
|
||
{
|
||
string sResRef = "prc_tana_bite_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalSecondaryWeapon(oPC, sResRef);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_WEMIC)
|
||
{
|
||
string sResRef = "prc_claw_1d6l_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 2);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_ILLITHID)
|
||
{
|
||
string sResRef = "prc_ill_tent_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 4);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_CENTAUR)
|
||
{
|
||
string sResRef = "prc_cent_hoof_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 2);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_ASABI)
|
||
{
|
||
string sResRef = "prc_lizf_bite_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalSecondaryWeapon(oPC, sResRef);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_DRAGONKIN)
|
||
{
|
||
//primary weapon
|
||
string sResRef = "prc_claw_1d6l_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 2);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_KHAASTA)
|
||
{
|
||
string sResRef = "prc_lizf_bite_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalSecondaryWeapon(oPC, sResRef);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_NEZUMI)
|
||
{
|
||
string sResRef = "prc_lizf_bite_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalSecondaryWeapon(oPC, sResRef);
|
||
//primary weapon
|
||
sResRef = "prc_claw_1d6l_";
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 2);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_POISON_DUSK)
|
||
{
|
||
string sResRef = "prc_lizf_bite_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalSecondaryWeapon(oPC, sResRef);
|
||
//primary weapon
|
||
sResRef = "prc_claw_1d6l_";
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 2);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_WILDREN)
|
||
{
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
//primary weapon
|
||
string sResRef = "prc_claw_1d6l_";
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 2);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_HOUND_ARCHON)
|
||
{
|
||
string sResRef = "prc_hdarc_bite_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalSecondaryWeapon(oPC, sResRef);
|
||
//primary weapon
|
||
sResRef = "prc_hdarc_slam_";
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 1);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_BLADELING)
|
||
{
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
//primary weapon
|
||
string sResRef = "prc_claw_1d6m_";
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 2);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_DRIDER)
|
||
{
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
//secondary weapon
|
||
string sResRef = "prc_drid_bite_";
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalSecondaryWeapon(oPC, sResRef);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_TAER)
|
||
{
|
||
AddNaturalSecondaryWeapon(oPC, "prc_troll_bite_m");
|
||
AddNaturalPrimaryWeapon(oPC, "prc_cent_hoof_s", 2);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_BAAZ)
|
||
{
|
||
string sResRef = "prc_lizf_bite_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalSecondaryWeapon(oPC, sResRef);
|
||
//primary weapon
|
||
sResRef = "prc_claw_1d6l_";
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 2);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_KAPAK)
|
||
{
|
||
string sResRef = "prc_lizf_bite_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalSecondaryWeapon(oPC, sResRef);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_WARFORGED)
|
||
{
|
||
string sResRef;
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
//primary weapon
|
||
sResRef = "prc_warf_slam_";
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 1);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_WARFORGED_CHARGER)
|
||
{
|
||
string sResRef;
|
||
int nSize = PRCGetCreatureSize(oPC)+1;
|
||
//primary weapon
|
||
sResRef = "prc_warf_slam_";
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 2);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_PTERRAN)
|
||
{
|
||
string sResRef = "prc_lizf_bite_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalSecondaryWeapon(oPC, sResRef);
|
||
//primary weapon - cheating since it needs 1d4l
|
||
sResRef = "prc_claw_1d6l_";
|
||
nSize--;
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 2);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_NAZTHARUNE_RAKSHASA)
|
||
{
|
||
string sResRef;
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
//primary weapon
|
||
sResRef = "prc_claw_1d6l_";
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 2);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_SATYR)
|
||
{
|
||
string sResRef = "prc_cent_hoof_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalSecondaryWeapon(oPC, sResRef);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_VILETOOTH_LIZARDFOLK)
|
||
{
|
||
string sResRef = "prc_vtth_bite_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalSecondaryWeapon(oPC, sResRef);
|
||
//primary weapon
|
||
sResRef = "prc_claw_1d6m_";
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 2);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_FERAL_GARGUN)
|
||
{
|
||
string sResRef = "prc_claw_1d6m_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 2);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_LASHEMOI)
|
||
{
|
||
//primary weapon
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
string sResRef = "prc_claw_1d6l_";
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 2);
|
||
// Added here just because
|
||
SetEventScript(oPC, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "race_lashemoi");
|
||
}
|
||
else if(nRace==RACIAL_TYPE_TURLEMOI)
|
||
{
|
||
//primary weapon
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
string sResRef = "prc_diatail_0_";
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 2);
|
||
// Added here just because
|
||
SetEventScript(oPC, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "race_turlemoi");
|
||
}
|
||
else if(nRace==RACIAL_TYPE_MUCKDWELLER)
|
||
{
|
||
string sResRef = "prc_claw_1d6m_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
//primary weapon
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 2);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_SPIRETOPDRAGON)
|
||
{
|
||
string sResRef = "prc_lizf_bite_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
//:: Needs 1d3 @ Tiny
|
||
nSize++;
|
||
sResRef += GetAffixForSize(nSize);
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 1);
|
||
}
|
||
else if(nRace==RACIAL_TYPE_ARANEA)
|
||
{
|
||
int nHumanoid = GetLocalInt(oPC, "AraneaHumanoidForm");
|
||
int nHybrid = GetLocalInt(oPC, "AraneaHybridForm");
|
||
|
||
if (!GetLocalInt(oPC, "AraneaHumanoidForm") && !GetLocalInt(oPC, "AraneaHybridForm") && !GetPersistantLocalInt(oPC, "nPCShifted") && !GetLocalInt(oPC, "shifting"))
|
||
{
|
||
string sResRef = "prc_ara_bite_";
|
||
int nSize = PRCGetCreatureSize(oPC);
|
||
//primary weapon
|
||
sResRef += GetAffixForSize(nSize);
|
||
DeleteLocalInt(oPC, "AraneaBiteRemoved");
|
||
if (!GetLocalInt(oPC, "AraneaBiteEquip")) AddNaturalPrimaryWeapon(oPC, sResRef, 1);
|
||
else if (GetLocalInt(oPC, "AraneaBiteEquip") == TRUE)
|
||
{
|
||
DeleteLocalInt(oPC, "AraneaBiteEquip");
|
||
AddNaturalPrimaryWeapon(oPC, sResRef, 1, TRUE);
|
||
object oNattySpideyWeapon = EquipNaturalWeapon(oPC, sResRef);
|
||
}
|
||
}
|
||
else if (GetPersistantLocalInt(oPC, "nPCShifted") == TRUE || GetLocalInt(oPC, "shifting") == TRUE)
|
||
{
|
||
if (!GetLocalInt(oPC, "AraneaBiteRemoved"))
|
||
{
|
||
SetLocalInt(oPC, "AraneaBiteRemoved", TRUE);
|
||
RemoveNaturalPrimaryWeapon(oPC, "prc_ara_bite_c");
|
||
RemoveNaturalPrimaryWeapon(oPC, "prc_ara_bite_d");
|
||
RemoveNaturalPrimaryWeapon(oPC, "prc_ara_bite_f");
|
||
RemoveNaturalPrimaryWeapon(oPC, "prc_ara_bite_g");
|
||
RemoveNaturalPrimaryWeapon(oPC, "prc_ara_bite_h");
|
||
RemoveNaturalPrimaryWeapon(oPC, "prc_ara_bite_l");
|
||
RemoveNaturalPrimaryWeapon(oPC, "prc_ara_bite_m");
|
||
RemoveNaturalPrimaryWeapon(oPC, "prc_ara_bite_s");
|
||
RemoveNaturalPrimaryWeapon(oPC, "prc_ara_bite_t");
|
||
}
|
||
}
|
||
}
|
||
//Draconian on-death effects
|
||
/*if(nRace == RACIAL_TYPE_BOZAK)
|
||
{
|
||
ExecuteScript("race_deaththroes", oPC);
|
||
if(GetCreatureWingType(oPC) != CREATURE_WING_TYPE_NONE)
|
||
return;
|
||
else SetCreatureWingType(PRC_WING_TYPE_DRAGON_BRONZE, oPC);
|
||
}
|
||
if(nRace == RACIAL_TYPE_BAAZ)
|
||
{
|
||
ExecuteScript("race_deaththroes", oPC);
|
||
if(GetCreatureWingType(oPC) != CREATURE_WING_TYPE_NONE)
|
||
return;
|
||
else SetCreatureWingType(PRC_WING_TYPE_DRAGON_BRASS, oPC);
|
||
}
|
||
if(nRace == RACIAL_TYPE_KAPAK)
|
||
{
|
||
ExecuteScript("race_deaththroes", oPC);
|
||
if(GetCreatureWingType(oPC) != CREATURE_WING_TYPE_NONE)
|
||
return;
|
||
else SetCreatureWingType(PRC_WING_TYPE_DRAGON_COPPER, oPC);
|
||
}*/
|
||
|
||
//Check only if not polymorphed or shifted
|
||
if(!GetIsPolyMorphedOrShifted(oPC))
|
||
{
|
||
//Enforce female Nymphs
|
||
if(nRace == RACIAL_TYPE_NYMPH && GetGender(oPC) != GENDER_FEMALE)
|
||
SetCreatureAppearanceType(oPC, 126);
|
||
|
||
//Shifter traits
|
||
if(GetHasFeat(FEAT_SHIFTER_SHIFTING))
|
||
{
|
||
int nNumTraits = 0;
|
||
nNumTraits += GetHasFeat(FEAT_SHIFTER_WILDHUNT) +
|
||
GetHasFeat(FEAT_SHIFTER_RAZORCLAW) +
|
||
GetHasFeat(FEAT_SHIFTER_LONGTOOTH) +
|
||
GetHasFeat(FEAT_SHIFTER_LONGSTRIDE) +
|
||
GetHasFeat(FEAT_SHIFTER_BEASTHIDE) +
|
||
GetHasFeat(FEAT_SHIFTER_DREAMSIGHT) +
|
||
GetHasFeat(FEAT_SHIFTER_GOREBRUTE);
|
||
if(GetHasFeat(FEAT_EXTRA_SHIFTER_TRAIT))
|
||
nNumTraits--;
|
||
|
||
if(!nNumTraits)
|
||
StartDynamicConversation("race_shfttrt_con", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
|
||
}
|
||
|
||
//Tinker Gnome guilds
|
||
if(GetHasFeat(FEAT_LIFEPATH) &&
|
||
!(GetHasFeat(FEAT_CRAFTGUILD) || GetHasFeat(FEAT_TECHGUILD) || GetHasFeat(FEAT_SAGEGUILD)))
|
||
StartDynamicConversation("race_lifepthconv", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
|
||
|
||
//Spirit Folk heritages
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_SPIRIT_FOLK &&
|
||
!(GetHasFeat(FEAT_BONUS_BAMBOO) || GetHasFeat(FEAT_BONUS_RIVER) || GetHasFeat(FEAT_BONUS_SEA) || GetHasFeat(FEAT_BONUS_MOUNTAIN)))
|
||
StartDynamicConversation("race_spiritfkcon", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
|
||
}
|
||
} |