From 75e67e75cf3d453bdcfe73926e6de165370f4c21 Mon Sep 17 00:00:00 2001 From: Jaysyn904 <68194417+Jaysyn904@users.noreply.github.com> Date: Fri, 27 Aug 2021 21:41:28 -0400 Subject: [PATCH] Moved more overridden PRC scripts to nwnds_scripts Moved more overridden PRC scripts to nwnds_scripts. Deleted bad familiar 2da file. --- nwnds_2das/hen_familiar.2da | 11 - nwnds_scripts/race_skin.ncs | Bin 0 -> 53740 bytes nwnds_scripts/race_skin.nss | 1226 +++++++++++++++++++++++++++++++++++ nwnds_scripts/race_sla.ncs | Bin 0 -> 44010 bytes nwnds_scripts/race_sla.nss | 389 +++++++++++ 5 files changed, 1615 insertions(+), 11 deletions(-) delete mode 100644 nwnds_2das/hen_familiar.2da create mode 100644 nwnds_scripts/race_skin.ncs create mode 100644 nwnds_scripts/race_skin.nss create mode 100644 nwnds_scripts/race_sla.ncs create mode 100644 nwnds_scripts/race_sla.nss diff --git a/nwnds_2das/hen_familiar.2da b/nwnds_2das/hen_familiar.2da deleted file mode 100644 index 57976196f..000000000 --- a/nwnds_2das/hen_familiar.2da +++ /dev/null @@ -1,11 +0,0 @@ -2DA V2.0 - - NAME BASERESREF STRREF DESCRIPTION -0 CriticLizard NW_FM_CRITLIZ 16777904 16777905 -1 FloatingPolyp NW_FM_FLOPO 16777898 16777899 -3 Jankz NW_FM_JANKZ 16777908 16777909 -4 Kestrekel NW_FM_KESTREK 16777900 16777901 -5 Kivit NW_FM_KIVIT 16777910 16777911 -6 Sitak NW_FM_SITAK 16777912 16777913 -7 Wrab NW_FM_WRAB 16777914 16777915 -8 Ztal NW_FM_ZTAL 16777902 16777903 \ No newline at end of file diff --git a/nwnds_scripts/race_skin.ncs b/nwnds_scripts/race_skin.ncs new file mode 100644 index 0000000000000000000000000000000000000000..0d5f82a7c165126b9e2cbfb02429361585167590 GIT binary patch literal 53740 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 Gt^Wu1>-UWS literal 0 HcmV?d00001 diff --git a/nwnds_scripts/race_skin.nss b/nwnds_scripts/race_skin.nss new file mode 100644 index 000000000..4517492f1 --- /dev/null +++ b/nwnds_scripts/race_skin.nss @@ -0,0 +1,1226 @@ +// 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" + +void main() +{ + object oPC = OBJECT_SELF; + object oSkin = GetPCSkin(oPC); + int bFuncs = GetPRCSwitch(PRC_NWNX_FUNCS); + itemproperty ipIP; + + 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); + } + + //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(SPELL_WEIRD); + IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE); + ipIP = ItemPropertySpellImmunitySpecific(SPELL_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)) + { + //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_DISEASE); + IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE); + + ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_LEVEL_ABIL_DRAIN); + IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE); + } + + //natural armor 1-10 + // Note: This bonus will be Dodge bonus no matter what IP_CONST you specify. + 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); + + + //immunity to breathing-targetted spells + if(GetHasFeat(FEAT_BREATHLESS)) + { + ipIP = ItemPropertySpellImmunitySpecific(SPELL_DROWN); + IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE); + ipIP = ItemPropertySpellImmunitySpecific(SPELL_MASS_DROWN); + IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE); + ipIP = ItemPropertySpellImmunitySpecific(SPELL_CLOUDKILL); + IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE); + ipIP = ItemPropertySpellImmunitySpecific(SPELL_ACID_FOG); + IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE); + ipIP = ItemPropertySpellImmunitySpecific(SPELL_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(SPELL_CHARM_PERSON); + IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE); + ipIP = ItemPropertySpellImmunitySpecific(SPELL_CHARM_MONSTER); + IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE); + ipIP = ItemPropertySpellImmunitySpecific(SPELL_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(SPELL_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(SPELL_DROWN); + IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE); + ipIP = ItemPropertySpellImmunitySpecific(SPELL_MASS_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)) + { + 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_TAREK) // NWN Dark Sun + { + SetCompositeBonus(oSkin, "Tarek_Intim", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_INTIMIDATE); + SetCompositeBonus(oSkin, "Tarek_Persuade", -2, ITEM_PROPERTY_SKILL_BONUS, SKILL_PERSUADE); + SetCompositeBonus(oSkin, "Tarek_Perform", -2, ITEM_PROPERTY_SKILL_BONUS, SKILL_PERFORM); + SetCompositeBonus(oSkin, "Tarek_Hide", -4, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE); + } + if(GetRacialType(oPC) == RACIAL_TYPE_AARAKOCRA) // NWN Dark Sun + { + SetCompositeBonus(oSkin, "Aarakocra_Spot", 6, ITEM_PROPERTY_SKILL_BONUS, SKILL_SPOT); + } + if(GetRacialType(oPC) == RACIAL_TYPE_TARI) // NWN Dark Sun + { + SetCompositeBonus(oSkin, "Tari_Listen", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_LISTEN); + SetCompositeBonus(oSkin, "Tari_Search", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_SEARCH); + SetCompositeBonus(oSkin, "Tari_Spot", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_SPOT); + SetCompositeBonus(oSkin, "Tari_Reflex", 2, ITEM_PROPERTY_SAVING_THROW_BONUS, SAVING_THROW_REFLEX); + } + if(GetRacialType(oPC) == RACIAL_TYPE_GITH) // NWN Dark Sun + { + SetCompositeBonus(oSkin, "Gith_Jump", 10, ITEM_PROPERTY_SKILL_BONUS, SKILL_JUMP); + SetCompositeBonus(oSkin, "Gith_Hide", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_HIDE); + SetCompositeBonus(oSkin, "Gith_MvSil", 4, ITEM_PROPERTY_SKILL_BONUS, SKILL_MOVE_SILENTLY); + } + 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_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); + } + + + //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_REPLACE_EXISTING, FALSE, FALSE); + } + 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(1176)) // FEAT_KREEN_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 bonuses due to scent + if(GetHasFeat(FEAT_MINOT_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); + } + + // 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(DAMAGE_TYPE_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(DAMAGE_TYPE_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(DAMAGE_TYPE_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_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_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_DRAY1 || // NWN Dark Sun + nRace == RACIAL_TYPE_DRAY2 ) + { + 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_PTERRAN) // NWN Dark Sun + { + 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_GITH) // NWN Dark Sun + { + // Set primary weapon 1d4 @ Medium + string sResRef = "prc_claw_1d6l_"; + int nSize = PRCGetCreatureSize(oPC); + sResRef += GetAffixForSize(nSize); + AddNaturalPrimaryWeapon(oPC, sResRef, 2); + } + else if(nRace==RACIAL_TYPE_TAREK) // NWN Dark Sun + { + // Set primary weapon 1d4 @ Medium + string sResRef = "ds_tarek_slam_"; + int nSize = PRCGetCreatureSize(oPC); + sResRef += GetAffixForSize(nSize); + AddNaturalPrimaryWeapon(oPC, sResRef, 2); + } + else if(nRace==RACIAL_TYPE_BELGOI) // NWN Dark Sun + { + // Set primary weapon 1d4 @ Medium + string sResRef = "ds_belgoi_claw_"; + int nSize = PRCGetCreatureSize(oPC); + sResRef += GetAffixForSize(nSize); + AddNaturalPrimaryWeapon(oPC, sResRef, 2); + } + else if(nRace==RACIAL_TYPE_TARI) // NWN Dark Sun + { + // Set secondary creature weapon 1d3 @ Small + string sResRef = "ds_tari_bite_"; + int nSize = PRCGetCreatureSize(oPC); + sResRef += GetAffixForSize(nSize); + AddNaturalSecondaryWeapon(oPC, sResRef); + } + else if(nRace == RACIAL_TYPE_AARAKOCRA) // NWN Dark Sun + { + // Set secondary creature weapon 1d3 @ Medium + string sResRef = "ds_aarak_bite_"; + int nSize = PRCGetCreatureSize(oPC); + sResRef += GetAffixForSize(nSize); + AddNaturalSecondaryWeapon(oPC, sResRef); + // Set primary creature weapon 1d3 @ Medium + sResRef = "ds_aarak_claw_"; + nSize--; + sResRef += GetAffixForSize(nSize); + AddNaturalPrimaryWeapon(oPC, sResRef, 2); + } + else if(nRace == RACIAL_TYPE_THRIKREEN || // NWN Dark Sun + nRace == RACIAL_TYPE_JEZ || + nRace == RACIAL_TYPE_TONDI || + nRace == RACIAL_TYPE_TOKSA || + nRace == RACIAL_TYPE_JHOL || + nRace == RACIAL_TYPE_TKEECH || + nRace == RACIAL_TYPE_JERAL) + { + // Set secondary creature weapon 1d4 @ Medium + string sResRef = "ds_kreen_bite_"; + int nSize = PRCGetCreatureSize(oPC); + sResRef += GetAffixForSize(nSize); + AddNaturalSecondaryWeapon(oPC, sResRef); + // Set primary creature weapon 1d4 @ Medium + sResRef = "ds_kreen_claw_"; + nSize--; + sResRef += GetAffixForSize(nSize); + AddNaturalPrimaryWeapon(oPC, sResRef, 4); + } + + 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); + } + + //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); + } + + // Movement Speed bonuses + if (GetRacialType(oPC) == RACIAL_TYPE_CENTAUR) + ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectMovementSpeedIncrease(66), oPC); +} \ No newline at end of file diff --git a/nwnds_scripts/race_sla.ncs b/nwnds_scripts/race_sla.ncs new file mode 100644 index 0000000000000000000000000000000000000000..f63c3e58484ea1b46ce8a8457bc43d12748ad193 GIT binary patch literal 44010 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 eR6FXIJHy$IQn!V8|Wd2_