diff --git a/nwn/nwnprc/trunk/2das/feat.2da b/nwn/nwnprc/trunk/2das/feat.2da
index 7cf80ded..d2ad304b 100644
--- a/nwn/nwnprc/trunk/2das/feat.2da
+++ b/nwn/nwnprc/trunk/2das/feat.2da
@@ -3115,7 +3115,7 @@
3111 FEAT_FULL_DRAGON_BREATH 16832855 16832856 ife_X2DDBreath **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_FULL_DRAGON_BREATH 5 **** 6 **** **** **** 0 1
3112 FEAT_CLIMB 16847418 16847419 ife_climb **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 2749 **** 0 **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_JUMP 4 **** **** **** **** **** 0 1
3113 Two-Weapon_Rend 16828414 16828415 ife_tw_rend 9 **** 15 **** **** **** **** **** 20 **** 0 0 1 **** **** **** **** 1 **** **** **** 41 374 **** **** **** **** **** **** **** FEAT_TWO_WEAPON_REND 6 **** **** **** **** **** 1 1
-3114 FEAT_INVOKE_DIVINE_WRATH 16825348 16825349 ife_X1DivShl **** **** **** **** **** **** **** 9 13 **** 0 0 1 **** **** 2163 **** 1 **** **** 0 301 472 3139 3248 **** 7 26 **** **** FEAT_INVOKE_DIVINE_WRATH 6 1 **** **** **** **** 1 1
+3114 FEAT_INVOKE_DIVINE_WRATH 16825348 16825349 ife_X1DivShl **** **** **** **** **** **** **** 9 13 **** 0 0 1 **** **** 2163 **** 1 **** **** 0 **** **** **** **** **** 7 26 **** **** FEAT_INVOKE_DIVINE_WRATH 6 1 **** **** **** **** 1 1
3115 FEAT_EPIC_DIVINE_VIGOR 16825346 16825347 ife_turnvigor **** **** **** **** **** **** 19 **** 3116 774 0 0 1 **** **** 2162 **** 1 **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_EPIC_DIVINE_VIGOR 6 **** **** **** **** **** 1 1
3116 FEAT_DIVINE_VIGOR 16825344 16825345 ife_turnvigor **** **** **** **** **** **** 13 **** 13 294 0 0 1 **** **** 2164 3115 1 **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_DIVINE_VIGOR 6 **** **** **** **** **** 0 1
3117 FEAT_DIVINE_RESISTANCE 16825342 16825343 ife_turnresis **** **** **** **** **** **** 13 **** 3118 **** 0 0 1 **** **** 2166 3119 1 **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_DIVINE_RESISTANCE 6 **** **** **** **** **** 0 1
diff --git a/nwn/nwnprc/trunk/include/psi_inc_psifunc.nss b/nwn/nwnprc/trunk/include/psi_inc_psifunc.nss
index 798f6f81..c28ab7b2 100644
--- a/nwn/nwnprc/trunk/include/psi_inc_psifunc.nss
+++ b/nwn/nwnprc/trunk/include/psi_inc_psifunc.nss
@@ -29,6 +29,8 @@
/* Function prototypes */
//////////////////////////////////////////////////
+int IsUnagumentablePower(int nPower);
+
/**
* Determines if the power that is currently being attempted to be manifested
* can in fact be manifested. Calculates PP cost and pays it. Determines
@@ -143,6 +145,131 @@ struct manifestation EvaluateDiaDragChannel(object oManifester, object oTarget,
/* Internal functions */
//////////////////////////////////////////////////
+//:: Returns TRUE if nPower is a power that can't
+//:: normally be augmented.
+int IsUnagumentablePower(int nPower)
+{
+ switch (nPower)
+ {
+ case POWER_ANIMAL_AFFINITY:
+ case POWER_ASSIMILATE:
+ case POWER_ASTRALSEED:
+ case POWER_BITE_WOLF:
+ case POWER_BODY_EQUILIBRIUM:
+ case POWER_BODYPURIFICATION:
+ case POWER_BURST:
+ case POWER_CATAPSI:
+ case POWER_CHAMELEON:
+ case POWER_CLAIRTANGENT_HAND:
+ case POWER_CLAIRVOYANT_SENSE:
+ case POWER_CLAW_ENERGY_COLD:
+ case POWER_CLAW_ENERGY_ELEC:
+ case POWER_CLAW_ENERGY_FIRE:
+ case POWER_CLAW_OF_THE_VAMPIRE:
+ case POWER_CLOUD_MIND:
+ case POWER_CLOUD_MIND_MASS:
+ case POWER_CONCEALTHOUGHT:
+ case POWER_CONCEALAMORPHA:
+ case POWER_GREATAMORPHA:
+ case POWER_CONTROLAIR:
+ case POWER_CONTROL_OBJECT:
+ case POWER_CONTROLSOUND:
+ case POWER_CREATESOUND:
+ case POWER_CRYSTALLIZE:
+ case POWER_DARKVISION:
+ case POWER_DECEREBRATE:
+ case POWER_DESTINYDISSONANCE:
+ case POWER_DETECT_REMOTE_VIEWING:
+ case POWER_DIMENSIONDOOR:
+ case POWER_DIMENSION_SLIDE:
+ case POWER_DIMENSIONALANCHOR:
+ case POWER_DISMISSAL:
+ case POWER_DISPELLING_BUFFER:
+ case POWER_DISTRACT:
+ case POWER_DUODIMENSIONAL_CLAW:
+ case POWER_ECTOPLASMICFORM:
+ case POWER_ECTOSHAMBLER:
+ case POWER_GREASE:
+ case POWER_ELFSIGHT:
+ case POWER_EMPATHY:
+ case POWER_ENERGYADAPTION:
+ case POWER_ENERGYADAPTACID:
+ case POWER_ENERGYADAPTCOLD:
+ case POWER_ENERGYADAPTELEC:
+ case POWER_ENERGYADAPTFIRE:
+ case POWER_ENERGYADAPTSONIC:
+ case POWER_ENERGYWALL_COLD:
+ case POWER_ENERGYWALL_ELEC:
+ case POWER_ENERGYWALL_FIRE:
+ case POWER_ENERGYWALL_SONIC:
+ case POWER_ESCAPE_DETECTION:
+ case POWER_ETHEREALJAUNT:
+ case POWER_ETHEREALNESS:
+ case POWER_FREEDOM:
+ case POWER_GENESIS:
+ case POWER_HUSTLE:
+ case POWER_IDENTIFY:
+ case POWER_IMMOVABILITY:
+ case POWER_INERTBARRIER:
+ case POWER_IRONBODY:
+ case POWER_KEENEDGE:
+ case POWER_KNOCK:
+ case POWER_MATTERAGITATION:
+ case POWER_MINDBLANKPERSONAL:
+ case POWER_PSIMINDBLANK:
+ case POWER_MOMENTOFPRESCIENCEATTACK:
+ case POWER_MOMENTOFPRESCIENCEARMOUR:
+ case POWER_MOMENTOFPRESCIENCESAVES:
+ case POWER_MOMENTOFPRESCIENCESKILLS:
+ case POWER_MYLIGHT:
+ case POWER_NULL_PSIONICS_FIELD:
+ case POWER_PAINFUL_STRIKE:
+ case POWER_POWERLEECH:
+ case POWER_POWERRESISTANCE:
+ case POWER_PRECOGNITION_MAIN:
+ case POWER_GREATERPRECOGNITION_MAIN:
+ case POWER_LOCK:
+ case POWER_PSIONICREVIVIFY:
+ case POWER_PSYCHICCHIR_REPAIR:
+ case POWER_PSYCHICCHIR_TRANSFER:
+ case POWER_PSYCHICVAMPIRE:
+ case POWER_PSYCHOFEEDBACK:
+ case POWER_RECALLDEATH:
+ case POWER_REDDOPSI:
+ case POWER_REMOTE_VIEW_TRAP:
+ case POWER_REMOTE_VIEWING:
+ case POWER_PSIONICRESTORATION:
+ case POWER_SECONDCHANCE:
+ case POWER_SEQUESTER:
+ case POWER_SHADOWBODY:
+ case POWER_SHAREPAIN:
+ case POWER_SHATTERMINDBLANK:
+ case POWER_SKATE:
+ case POWER_STEADFASTPERCEP:
+ case POWER_SYNESTHETE:
+ case POWER_TELEMPATHICPRO:
+ case POWER_TELEPORT_SELFONLY:
+ case POWER_TELEPORT_PARTY:
+ case POWER_GREATER_TELEPORT_SELFONLY:
+ case POWER_GREATER_TELEPORT_PARTY:
+ case POWER_TELEPORTATIONCIRCLE_VISIBLE:
+ case POWER_TELEPORTATIONCIRCLE_HIDDEN:
+ case POWER_TIMELESSBODY:
+ case POWER_TOUCHSIGHT:
+ case POWER_TRUEMETABOLISM:
+ case POWER_TRUESEEING:
+ case POWER_TRUEVENOM:
+ case POWER_TRUEVENOM_WEAPON:
+ case POWER_UBIQVISION:
+ case POWER_VAMPIRIC_WEAPON:
+ case POWER_WEAPON_ENERGY_COLD:
+ case POWER_WEAPON_ENERGY_ELEC:
+ case POWER_WEAPON_ENERGY_FIRE:
+ return TRUE;
+ }
+ return FALSE;
+}
+
/** Internal function.
* Calculates PP cost reduction from various factors. Currently accounts for:
* - Thrallherd
diff --git a/nwn/nwnprc/trunk/scripts/ft_vowofpoverty.nss b/nwn/nwnprc/trunk/scripts/ft_vowofpoverty.nss
index 17411642..d40f78a0 100644
--- a/nwn/nwnprc/trunk/scripts/ft_vowofpoverty.nss
+++ b/nwn/nwnprc/trunk/scripts/ft_vowofpoverty.nss
@@ -100,7 +100,256 @@ void ConvertVoPToNWNxEE(object oPC)
SetPersistantLocalInt(oPC, "VoP_NWNxEE_Converted", TRUE);
}
-void main()
+#include "prc_feat_const"
+#include "prc_inc_function"
+
+const string VOP_TAG = "VoP";
+
+// Helper: add a VoP-tagged property to the skin
+void AddVoPProperty(object oSkin, itemproperty ip)
+{
+ ip = TagItemProperty(ip, VOP_TAG);
+ IPSafeAddItemProperty(oSkin, ip, 0.0f, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
+}
+
+// Remove all VoP-tagged properties from an item
+void RemoveVoPProperties(object oItem)
+{
+ itemproperty ip = GetFirstItemProperty(oItem);
+ while (GetIsItemPropertyValid(ip))
+ {
+ if (GetItemPropertyTag(ip) == VOP_TAG)
+ RemoveItemProperty(oItem, ip);
+ ip = GetNextItemProperty(oItem);
+ }
+}
+
+void main()
+{
+ int nEvent = GetRunningEvent();
+ if (DEBUG) DoDebug("ft_vowofpoverty running, event: " + IntToString(nEvent));
+
+ object oPC;
+ switch (nEvent)
+ {
+ case EVENT_ITEM_ONHIT: oPC = OBJECT_SELF; break;
+ case EVENT_ONPLAYEREQUIPITEM: oPC = GetItemLastEquippedBy(); break;
+ case EVENT_ONPLAYERUNEQUIPITEM: oPC = GetItemLastUnequippedBy(); break;
+ case EVENT_ONHEARTBEAT: oPC = OBJECT_SELF; break;
+ default: oPC = OBJECT_SELF;
+ }
+
+ object oItem;
+ object oSkin = GetPCSkin(oPC);
+ int nLevel = GetCharacterLevel(oPC) - GetPersistantLocalInt(oPC, "VoPLevel1") + 1;
+ int nACArmor = 4 + nLevel / 3;
+ int nACDeflection = nLevel / 6;
+ int nACNatural = nLevel / 8;
+ int nRegen = 1 + (nLevel - 17) / 7;
+ int nDR = 5 * (1 + (nLevel - 10) / 9);
+ int nER = (10 * (1 + (nLevel - 13) / 7)) - 5;
+ int nResist = 0;
+ if (nLevel >= 17) nResist = 1 + (nLevel - 7) / 5;
+ else if (nLevel >= 13) nResist = 2;
+ else if (nLevel >= 7) nResist = 1;
+
+ int nForsakerBonus = GetLevelByClass(CLASS_TYPE_FORSAKER, oPC) / 2;
+ int nSlot, nLevelCheck, nExaltedStrike, nTotalEnhancement;
+
+ if (nLevel >= 10) nExaltedStrike = 1 + (nLevel - 7) / 3;
+ else if (nLevel >= 4) nExaltedStrike = 1;
+ if (nForsakerBonus >= nExaltedStrike) nTotalEnhancement = nForsakerBonus;
+ else nTotalEnhancement = nExaltedStrike;
+
+ // EvalPRCFeats pass
+ if (nEvent == FALSE)
+ {
+ if (GetPRCSwitch("PRC_NWNXEE_ENABLED") && GetPRCSwitch("PRC_PRCX_ENABLED"))
+ ConvertVoPToNWNxEE(oPC);
+ if (GetPRCSwitch("PRC_NWNXEE_ENABLED") && GetPRCSwitch("PRC_PRCX_ENABLED"))
+ ConvertVoPFeatsToNWNxEE(oPC);
+
+ for (nLevelCheck = 1; nLevelCheck <= nLevel; nLevelCheck++)
+ {
+ if (!GetPersistantLocalInt(oPC, "VoPBoost" + IntToString(nLevelCheck)) && (nLevelCheck - (nLevelCheck / 4) * 4 == 3) && (nLevelCheck >= 7) && (nLevelCheck <= 27))
+ {
+ AssignCommand(oPC, ClearAllActions(TRUE));
+ SetPersistantLocalInt(oPC, "VoPBoostCheck", nLevelCheck);
+ StartDynamicConversation("ft_vowpoverty_ab", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
+ }
+ if (GetPersistantLocalInt(oPC, "VoPBoost" + IntToString(nLevelCheck)) >= 10)
+ {
+ int stat = GetPersistantLocalInt(oPC, "VoPBoost" + IntToString(nLevelCheck)) - 10;
+ int value = 2 * (1 + (nLevel - nLevelCheck) / 4);
+ if (GetPRCSwitch("PRC_NWNXEE_ENABLED") && GetPRCSwitch("PRC_PRCX_ENABLED"))
+ {
+ string sKey = "VoP_EE_Boost_" + IntToString(stat);
+ int nLastApplied = GetPersistantLocalInt(oPC, sKey);
+ int nDelta = value - nLastApplied;
+ if (nDelta > 0)
+ {
+ PRC_Funcs_ModAbilityScore(oPC, stat, nDelta);
+ SetPersistantLocalInt(oPC, sKey, value);
+ }
+ }
+ else
+ {
+ // Fallback: add tagged ability bonus to skin
+ itemproperty ip = ItemPropertyAbilityBonus(stat, value);
+ AddVoPProperty(oSkin, ip);
+ }
+ }
+ if (!GetPersistantLocalInt(oPC, "VoPFeat" + IntToString(nLevelCheck)) && (nLevelCheck - (nLevelCheck / 2) * 2 == 0))
+ {
+ AssignCommand(oPC, ClearAllActions(TRUE));
+ SetPersistantLocalInt(oPC, "VoPFeatCheck", nLevelCheck);
+ StartDynamicConversation("ft_vowpoverty_ft", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
+ }
+ }
+
+ // AC Armor (effect)
+ ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(EffectACIncrease(nACArmor, AC_ARMOUR_ENCHANTMENT_BONUS)), oPC);
+ // Deflection (effect)
+ ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(EffectACIncrease(nACDeflection, AC_DEFLECTION_BONUS)), oPC);
+ // Resistance (itemproperty, tagged)
+ if (nLevel >= 7)
+ {
+ itemproperty ip = ItemPropertyBonusSavingThrow(SAVING_THROW_ALL, nResist);
+ AddVoPProperty(oSkin, ip);
+ }
+ // Natural Armor (effect)
+ ApplyEffectToObject(DURATION_TYPE_PERMANENT, ExtraordinaryEffect(EffectACIncrease(nACNatural, AC_NATURAL_BONUS)), oPC);
+ // DR (effect)
+ if (nLevel >= 10) ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(EffectDamageReduction(nDR, nTotalEnhancement)), oPC);
+ // Energy resistances (effects)
+ if (nLevel >= 13)
+ {
+ ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageResistance(DAMAGE_TYPE_ACID, nER, 0, FALSE), oPC);
+ ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageResistance(DAMAGE_TYPE_COLD, nER, 0, FALSE), oPC);
+ ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageResistance(DAMAGE_TYPE_ELECTRICAL, nER, 0, FALSE), oPC);
+ ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageResistance(DAMAGE_TYPE_FIRE, nER, 0, FALSE), oPC);
+ ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageResistance(DAMAGE_TYPE_SONIC, nER, 0, FALSE), oPC);
+ }
+ // Freedom of Movement (tagged)
+ if (nLevel >= 14)
+ {
+ itemproperty ip = ItemPropertyFreeAction();
+ AddVoPProperty(oSkin, ip);
+ }
+ // Regeneration (tagged)
+ if (nLevel >= 17)
+ {
+ itemproperty ip = ItemPropertyRegeneration(nRegen);
+ AddVoPProperty(oSkin, ip);
+ }
+ // True Seeing (tagged)
+ if (nLevel >= 18)
+ {
+ itemproperty ip = ItemPropertyTrueSeeing();
+ AddVoPProperty(oSkin, ip);
+ }
+ // Exalted Strike (effect, already tagged)
+ effect eEffect1 = EffectAttackIncrease(nTotalEnhancement);
+ effect eEffect2 = VoPDamage(nTotalEnhancement);
+ effect eLink = EffectLinkEffects(eEffect1, eEffect2);
+ eLink = SupernaturalEffect(eLink);
+ eLink = TagEffect(eLink, "EffectExaltedStrike");
+ effect eCheckEffect = GetFirstEffect(oPC);
+ while (GetIsEffectValid(eCheckEffect))
+ {
+ if (GetEffectTag(eCheckEffect) == "EffectExaltedStrike") RemoveEffect(oPC, eCheckEffect);
+ eCheckEffect = GetNextEffect(oPC);
+ }
+ ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oPC);
+
+ // Enforce vow: unequip prohibited items
+ for (nSlot = 0; nSlot < 13; nSlot++)
+ {
+ oItem = GetItemInSlot(nSlot, oPC);
+ if (!(GetTag(oItem) == "xp1_mystrashand")
+ && !(GetTag(oItem) == "H2_SenseiAmulet")
+ && !(GetResRef(oItem) == "prc_sk_mblade_bs")
+ && !(GetResRef(oItem) == "prc_sk_mblade_th")
+ && !(GetResRef(oItem) == "prc_sk_mblade_ss")
+ && !(GetResRef(oItem) == "prc_sk_mblade_ls"))
+ {
+ if ((GetIsItemPropertyValid(GetFirstItemProperty(oItem)) && !(GetItemPropertyTag(GetFirstItemProperty(oItem)) == "Tag_PRC_OnHitKeeper")
+ && !(nSlot == 4 || nSlot == 5))
+ || (nSlot == 1 && GetBaseAC(oItem) >= 1)
+ || (nSlot == 5 && (GetBaseItemType(oItem) == BASE_ITEM_SMALLSHIELD
+ || GetBaseItemType(oItem) == BASE_ITEM_LARGESHIELD
+ || GetBaseItemType(oItem) == BASE_ITEM_TOWERSHIELD)))
+ {
+ AssignCommand(oPC, ClearAllActions(TRUE));
+ AssignCommand(oPC, ActionUnequipItem(oItem));
+ FloatingTextStringOnCreature(GetName(oItem) + " would break your vow!", oPC, FALSE);
+ }
+ }
+ }
+
+ // Register unequip hook
+ AddEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, "ft_vowofpoverty", TRUE, FALSE);
+ }
+ // OnEquip: enforce vow for equipped weapons
+ else if (nEvent == EVENT_ONPLAYEREQUIPITEM)
+ {
+ oItem = GetPCItemLastEquipped();
+ int iWeaponAllowed = (GetBaseItemType(oItem) == BASE_ITEM_CLUB
+ || GetBaseItemType(oItem) == BASE_ITEM_DAGGER
+ || GetBaseItemType(oItem) == BASE_ITEM_DART
+ || GetBaseItemType(oItem) == BASE_ITEM_HEAVYCROSSBOW
+ || GetBaseItemType(oItem) == BASE_ITEM_LIGHTCROSSBOW
+ || GetBaseItemType(oItem) == BASE_ITEM_LIGHTMACE
+ || GetBaseItemType(oItem) == BASE_ITEM_MORNINGSTAR
+ || GetBaseItemType(oItem) == BASE_ITEM_QUARTERSTAFF
+ || GetBaseItemType(oItem) == BASE_ITEM_SICKLE
+ || GetBaseItemType(oItem) == BASE_ITEM_SLING
+ || GetBaseItemType(oItem) == BASE_ITEM_SHORTSPEAR
+ || GetBaseItemType(oItem) == BASE_ITEM_BOLT
+ || GetBaseItemType(oItem) == BASE_ITEM_GOAD
+ || GetBaseItemType(oItem) == BASE_ITEM_KATAR
+ || GetBaseItemType(oItem) == BASE_ITEM_HEAVY_MACE
+ || GetBaseItemType(oItem) == BASE_ITEM_BULLET);
+
+ int iMagic = 0;
+ itemproperty eCheckIP = GetFirstItemProperty(oItem);
+ while (GetIsItemPropertyValid(eCheckIP))
+ {
+ if (!(GetItemPropertyTag(eCheckIP) == "Sanctify1")
+ && !(GetItemPropertyTag(eCheckIP) == "Sanctify2")
+ && !(GetItemPropertyTag(eCheckIP) == "Sanctify3")
+ && !(GetItemPropertyTag(eCheckIP) == "Sanctify4"))
+ iMagic = 1;
+ eCheckIP = GetNextItemProperty(oItem);
+ }
+ if (!(GetTag(oItem) == "xp1_mystrashand")
+ && !(GetTag(oItem) == "H2_SenseiAmulet")
+ && !(GetResRef(oItem) == "prc_sk_mblade_bs")
+ && !(GetResRef(oItem) == "prc_sk_mblade_th")
+ && !(GetResRef(oItem) == "prc_sk_mblade_ss")
+ && !(GetResRef(oItem) == "prc_sk_mblade_ls"))
+ {
+ if ((IPGetIsMeleeWeapon(oItem) || GetWeaponRanged(oItem)) && (iMagic || !iWeaponAllowed))
+ {
+ if (!(GetBaseItemType(oItem) == BASE_ITEM_SLING && GetItemPropertyType(GetFirstItemProperty(oItem)) == ITEM_PROPERTY_MIGHTY))
+ {
+ AssignCommand(oPC, ClearAllActions(TRUE));
+ AssignCommand(oPC, ActionUnequipItem(oItem));
+ FloatingTextStringOnCreature(GetName(oItem) + " would break your vow!", oPC, FALSE);
+ }
+ }
+ }
+ }
+ // OnUnequip: remove VoP-tagged properties from the unequipped item
+ else if (nEvent == EVENT_ONPLAYERUNEQUIPITEM)
+ {
+ oItem = GetPCItemLastUnequipped();
+ if (IPGetIsMeleeWeapon(oItem) || GetWeaponRanged(oItem))
+ RemoveVoPProperties(oItem);
+ }
+}
+
+/* void main()
{
int nEvent = GetRunningEvent();
if(DEBUG) DoDebug("prc_forsaker running, event: " + IntToString(nEvent));
@@ -186,13 +435,13 @@ void main()
SetCompositeBonus(oSkin, "VoPBoostStat"+IntToString(stat), value, ITEM_PROPERTY_ABILITY_BONUS, stat);
}
}
-/* //Applying stat boosts
- if(GetPersistantLocalInt(oPC, "VoPBoost"+IntToString(nLevelCheck)) >= 10)
- {
- int stat = GetPersistantLocalInt(oPC, "VoPBoost"+IntToString(nLevelCheck)) - 10;
- int value = 2 * (1 + (nLevel - nLevelCheck) / 4);
- SetCompositeBonus(oSkin, "VoPBoostStat"+IntToString(stat), value, ITEM_PROPERTY_ABILITY_BONUS, stat);
- } */
+ //:: Applying stat boosts
+ // if(GetPersistantLocalInt(oPC, "VoPBoost"+IntToString(nLevelCheck)) >= 10)
+ // {
+ // int stat = GetPersistantLocalInt(oPC, "VoPBoost"+IntToString(nLevelCheck)) - 10;
+ // int value = 2 * (1 + (nLevel - nLevelCheck) / 4);
+ // SetCompositeBonus(oSkin, "VoPBoostStat"+IntToString(stat), value, ITEM_PROPERTY_ABILITY_BONUS, stat);
+ // }
//Call exalted feat for each even level
if (!GetPersistantLocalInt(oPC, "VoPFeat"+IntToString(nLevelCheck)) && (nLevelCheck-(nLevelCheck/2)*2 == 0))
@@ -285,7 +534,7 @@ void main()
//Remove bonus from unequiped weapons
oItem = GetPCItemLastUnequipped();
- if(IPGetIsMeleeWeapon(oItem) || GetWeaponRanged(oItem)) IPRemoveAllItemProperties(oItem, DURATION_TYPE_PERMANENT);
+ if(IPGetIsMeleeWeapon(oItem) || GetWeaponRanged(oItem)) IPRemoveAllItemProperties(oItem, DURATION_TYPE_TEMPORARY);
AddEventScript(oPC, EVENT_SCRIPT_MODULE_ON_EQUIP_ITEM, "ft_vowofpoverty", TRUE, FALSE);
}
@@ -338,5 +587,5 @@ void main()
}
}
}
-}
+} */
diff --git a/nwn/nwnprc/trunk/scripts/prc_enforce_feat.nss b/nwn/nwnprc/trunk/scripts/prc_enforce_feat.nss
index 81ed839f..28ebf582 100644
--- a/nwn/nwnprc/trunk/scripts/prc_enforce_feat.nss
+++ b/nwn/nwnprc/trunk/scripts/prc_enforce_feat.nss
@@ -20,6 +20,9 @@
#include "inc_epicspells"
#include "prc_inc_shifting"
+// Returns TRUE if oCreature has any smite feature (ignores remaining uses)
+int GetCanSmite(object oCreature);
+
int CheckInvokerAbilityFocus(object oPC = OBJECT_SELF);
// Prevents a Man at Arms from taking improved critical
@@ -97,6 +100,40 @@ int _GetSizeForPrereq(object oPC)
// BEGIN FUNCTIONS
// ---------------
+int GetCanSmite(object oPC = OBJECT_SELF)
+{
+ return (GetLevelByClass(CLASS_TYPE_SANCTIFIED_MIND, oPC) > 1)
+ || GetHasFeat(FEAT_SMITE_GOOD_ALIGN, oPC, TRUE)
+ || GetHasFeat(FEAT_SMITE_GOOD, oPC, TRUE)
+ || GetHasFeat(FEAT_SMITE_UNDEAD, oPC, TRUE)
+ || GetHasFeat(FEAT_TEMPLATE_CELESTIAL_SMITE_EVIL, oPC, TRUE)
+ || GetHasFeat(FEAT_TEMPLATE_FIENDISH_SMITE_GOOD, oPC, TRUE)
+ || GetHasFeat(FEAT_TEMPLATE_HALF_CELESTIAL_HOLY_SMITE, oPC, TRUE)
+ || GetHasFeat(FEAT_TEMPLATE_HALF_FIENDISH_SMITE_GOOD, oPC, TRUE)
+ || GetHasFeat(FEAT_SAPPHIRE_SMITE, oPC, TRUE)
+ || GetHasFeat(FEAT_CRUSADER_SMITE, oPC, TRUE)
+ || GetHasFeat(FEAT_SMITE_OPPOSITION, oPC, TRUE)
+ || GetHasFeat(FEAT_KIAI_SMITE, oPC, TRUE)
+ || GetHasFeat(FEAT_CULTIST_SMITE_MAGE, oPC, TRUE)
+ || GetHasFeat(FEAT_SMITE_CHAOS, oPC, TRUE)
+ || GetHasFeat(FEAT_SHADOWBANE_SMITE, oPC, TRUE)
+ || GetHasFeat(FEAT_SMITE_EVIL, oPC, TRUE)
+ || GetHasFeat(FEAT_KILLOREN_ASPECT_D, oPC, TRUE);
+}
+
+int InvokeDivineWrath(object oPC = OBJECT_SELF)
+{
+ if(GetHasFeat(FEAT_INVOKE_DIVINE_WRATH))
+ {
+ if(!GetCanSmite(oPC))
+ {
+ SendMessageToPC(oPC, "You must have Smite as a class ability to take Invoke Divine Wrath. Please reslect your feats.");
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
//:: Eldritch Disciple gets one of these abilities at 1st level,
//:: and another ability every three levels thereafter (4th, 7th,
//:: and 10th level).
@@ -3006,6 +3043,7 @@ void main()
|| CheckDivineGifts()
|| DragonHeartFeats()
|| DiamondDragonFeats()
+ || InvokeDivineWrath()
//|| Blightbringer()
//|| Shaman()
)
diff --git a/nwn/nwnprc/trunk/scripts/prc_forsaker.nss b/nwn/nwnprc/trunk/scripts/prc_forsaker.nss
index ac5f48e6..b98d8aa0 100644
--- a/nwn/nwnprc/trunk/scripts/prc_forsaker.nss
+++ b/nwn/nwnprc/trunk/scripts/prc_forsaker.nss
@@ -185,10 +185,6 @@ void main()
if(!GetHasFeat(FEAT_VOWOFPOVERTY,oPC))
{
- // REMOVED: Aggressive inventory scanning that was removing all magical items
- // This was causing permanent property loss for players
- // The Forsaker class should still prevent magical item usage through equip events
-
if(GetIsUnarmed(oPC) && (nForsakerLvl >= 3)) //If it is unarmed, give DR bypass
{
ApplyEffectToObject(DURATION_TYPE_PERMANENT,EffectAttackIncrease(nBonus),oPC);
diff --git a/nwn/nwnprc/trunk/scripts/sp_disc_crown.nss b/nwn/nwnprc/trunk/scripts/sp_disc_crown.nss
index c594a2b5..7dde2671 100644
--- a/nwn/nwnprc/trunk/scripts/sp_disc_crown.nss
+++ b/nwn/nwnprc/trunk/scripts/sp_disc_crown.nss
@@ -11,7 +11,7 @@ void main()
object oHelm = GetItemInSlot(INVENTORY_SLOT_HEAD, oPC);
string sResRef = GetResRef(oHelm);
- if(sResRef == "prc_crown_mght")
+ if(sResRef == "prc_crown_might")
{
//+8 STR 1 round
effect eLink = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_POSITIVE);
diff --git a/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk b/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk
index 985034aa..8cfb071e 100644
Binary files a/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk and b/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk differ
diff --git a/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk.xml b/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk.xml
index 103375cc..6aa5c473 100644
--- a/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk.xml
+++ b/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk.xml
@@ -5016,7 +5016,7 @@ Use: Selected.
grey elves
Gray elves are the most noble and regal of all elves. Taller and grander in physical appearance than others of their race, gray elves have a reputation for being aloof and arrogant (even by elven standards). They certainly are more reclusive than high elves, living in isolated mountain citadels and allowing entry only to a select few outsiders. They have either silver hair and amber eyes or pale golden hair and violet eyes. They prefer clothing of white, silver, yellow, or gold, with cloaks of deep blue or purple.
- +2 Dexterity, +2 Intelligence, --2 Strength, --2 Constitution.
+ +2 Dexterity, +2 Intelligence, -2 Strength, -2 Constitution.
Medium: As Medium creatures, gray elves have no special bonuses or penalties due to their size.
@@ -46936,7 +46936,7 @@ Lore: 8 ranks.
Feat: Skill Focus: Lore
Spells: Ability to cast arcane spells of 3rd level or higher.
-ABILITIES:
+CLASS FEATURES:
Level
1: Bone Skin I - Add +2 to AC. This increases by another +2 for every four levels of Pale Master.
diff --git a/nwn/nwnprc/trunk/tlk/prc_consortium.tlk b/nwn/nwnprc/trunk/tlk/prc_consortium.tlk
index 8bfcfe48..8cfb071e 100644
Binary files a/nwn/nwnprc/trunk/tlk/prc_consortium.tlk and b/nwn/nwnprc/trunk/tlk/prc_consortium.tlk differ
diff --git a/nwn/nwnprc/trunk/users/Jaysyn/Augmentable powers PRC8.xlsx b/nwn/nwnprc/trunk/users/Jaysyn/Augmentable powers PRC8.xlsx
new file mode 100644
index 00000000..b1f42715
Binary files /dev/null and b/nwn/nwnprc/trunk/users/Jaysyn/Augmentable powers PRC8.xlsx differ