From 01eb86d307c57cf992f8bede637bdaeb1cdfbb04 Mon Sep 17 00:00:00 2001 From: Jaysyn904 <68194417+Jaysyn904@users.noreply.github.com> Date: Fri, 20 Mar 2026 18:07:36 -0400 Subject: [PATCH] 2026/03/20 Update Fixed issue where Factotum's Arcane Dilettante post rest dialog wasn't appearing. Desecrate now correctly doubles a caster's Animate Dead HD pool. Effects are now removed when leaving an area of Desecration. Undead HD pool is now calculated correctly in Animate Dead. --- nwn/nwnprc/trunk/scripts/prc_factotum.nss | 6 ++-- nwn/nwnprc/trunk/scripts/prc_tn_des_a.nss | 22 ++++++++++-- nwn/nwnprc/trunk/scripts/prc_tn_des_b.nss | 39 +++++++++++++--------- nwn/nwnprc/trunk/spells/nw_s0_animdead.nss | 2 +- nwn/nwnprc/trunk/spells/sp_desecrate.nss | 6 ++-- 5 files changed, 49 insertions(+), 26 deletions(-) diff --git a/nwn/nwnprc/trunk/scripts/prc_factotum.nss b/nwn/nwnprc/trunk/scripts/prc_factotum.nss index 6adf80a7..83ac5094 100644 --- a/nwn/nwnprc/trunk/scripts/prc_factotum.nss +++ b/nwn/nwnprc/trunk/scripts/prc_factotum.nss @@ -61,7 +61,7 @@ void main() if(nEvent == FALSE) { // Add eventhook to OnRestFinished to reset the used marker - AddEventScript(oPC, EVENT_ONPLAYERREST_FINISHED, "prc_factotum", FALSE, FALSE); + AddEventScript(oPC, EVENT_ONPLAYERREST_FINISHED, "prc_factotum", TRUE, FALSE); if (!GetLocalInt(oPC, "InspirationHBRunning")) DeleteLocalInt(oPC, "InspirationHB"); if (!GetLocalInt(oPC, "InspirationHB") && !GetLocalInt(oPC, "InspirationHBRunning")) { @@ -69,7 +69,7 @@ void main() SetLocalInt(oPC, "InspirationHB", TRUE); } } - else if(EVENT_ONCLIENTENTER) + else if(nEvent == EVENT_ONCLIENTENTER) { if(GetLevelByClass(CLASS_TYPE_FACTOTUM, oPC) > 0) { @@ -84,6 +84,6 @@ void main() AssignCommand(oPC, ClearAllActions(TRUE)); ClearFactotumSlots(oPC); SetLocalInt(oPC, "FactotumArcDil", GetMaxArcDilSpellLevel(oPC)); - StartDynamicConversation("prc_fact_splconv", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC); + DelayCommand(0.1f, StartDynamicConversation("prc_fact_splconv", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC)); } } diff --git a/nwn/nwnprc/trunk/scripts/prc_tn_des_a.nss b/nwn/nwnprc/trunk/scripts/prc_tn_des_a.nss index 96531203..0cf49773 100644 --- a/nwn/nwnprc/trunk/scripts/prc_tn_des_a.nss +++ b/nwn/nwnprc/trunk/scripts/prc_tn_des_a.nss @@ -74,6 +74,8 @@ void main() eLink = EffectLinkEffects(eLink, EffectAttackIncrease(1)); eLink = EffectLinkEffects(eLink, EffectSavingThrowIncrease(SAVING_THROW_ALL, 1)); eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE)); + eLink = EffectLinkEffects(eLink, EffectTurnResistanceIncrease(3)); + effect eHP = EffectTemporaryHitpoints(GetHitDice(oTarget)); effect eVis = EffectVisualEffect(VFX_IMP_HOLY_AID); @@ -82,13 +84,27 @@ void main() eHP = TagEffect(eHP, "EFFECT_DESECRATE_HP"); if(!GetPRCSwitch(PRC_TRUE_NECROMANCER_ALTERNATE_VISUAL)) - ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget); + SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget); else eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_DUR_PROTECTION_EVIL_MINOR)); - ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget); - ApplyEffectToObject(DURATION_TYPE_PERMANENT, eHP, oTarget); + SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget, 0.0f, SPELL_DESECRATE); + SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eHP, oTarget, 0.0f, SPELL_DESECRATE); } + else + { + // Apply visual indicator for non-undead + effect eIcon = EffectIcon(EFFECT_ICON_FRIGHTENED); + effect eVis = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); + //effect eLink = EffectLinkEffects(eIcon, eVis); + effect eLink = EffectLinkEffects(eLink, eVis); + eLink = EffectLinkEffects(eLink, EffectSavingThrowIncrease(SAVING_THROW_ALL, 1)); + eLink = EffectLinkEffects(eLink, EffectSavingThrowDecrease(SAVING_THROW_ALL, 1)); + + eLink = TagEffect(eLink, "EFFECT_DESECRATE_AURA"); + + SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget, 0.0f, SPELL_DESECRATE); + } } diff --git a/nwn/nwnprc/trunk/scripts/prc_tn_des_b.nss b/nwn/nwnprc/trunk/scripts/prc_tn_des_b.nss index c74bc5c9..9c501bf5 100644 --- a/nwn/nwnprc/trunk/scripts/prc_tn_des_b.nss +++ b/nwn/nwnprc/trunk/scripts/prc_tn_des_b.nss @@ -1,25 +1,33 @@ //:://///////////////////////////////////////////// -//:: Desecrate +//:: Desecrate onExit script //:: prc_tn_des_b //::////////////////////////////////////////////// /* You create an aura that boosts the undead around you. */ -#include "prc_alterations" +#include "prc_alterations" + +void main() +{ + object oTarget = GetExitingObject(); + + // Search through the valid effects on the target + effect eAOE = GetFirstEffect(oTarget); + while (GetIsEffectValid(eAOE)) + { + // If the effect was created by the AoE then remove it + if (GetEffectCreator(eAOE) == GetAreaOfEffectCreator()) + { + string sTag = GetEffectTag(eAOE); + if(sTag == "EFFECT_DESECRATE_AURA" || sTag == "EFFECT_DESECRATE_HP") + RemoveEffect(oTarget, eAOE); + } + // Get next effect on the target + eAOE = GetNextEffect(oTarget); + } +} -void main() -{ - object oTarget = GetExitingObject(); - - effect eAOE = GetFirstEffect(oTarget); - if(GetEffectCreator(eAOE) == GetAreaOfEffectCreator()) - { - string sTag = GetEffectTag(eAOE); - if(sTag == "EFFECT_DESECRATE_AURA" || sTag == "EFFECT_DESECRATE_HP") - RemoveEffect(oTarget, eAOE); - } - /* object oTarget = GetExitingObject(); if(GetHasSpellEffect(SPELL_DES_20, oTarget) || GetHasSpellEffect(SPELL_DES_100, oTarget) || GetHasSpellEffect(SPELL_DESECRATE, oTarget)) @@ -36,5 +44,4 @@ void main() //Get next effect on the target eAOE = GetNextEffect(oTarget); } - } */ -} \ No newline at end of file + } */ \ No newline at end of file diff --git a/nwn/nwnprc/trunk/spells/nw_s0_animdead.nss b/nwn/nwnprc/trunk/spells/nw_s0_animdead.nss index 77856382..4f4551b8 100644 --- a/nwn/nwnprc/trunk/spells/nw_s0_animdead.nss +++ b/nwn/nwnprc/trunk/spells/nw_s0_animdead.nss @@ -64,7 +64,7 @@ void main() if(GetPRCSwitch(PRC_PNP_ANIMATE_DEAD)) { int nMaxHD = GetLevelByClass(CLASS_TYPE_DREAD_NECROMANCER, oCaster) >= 8 ? - nCasterLevel * (4 + GetAbilityModifier(ABILITY_CHARISMA, oCaster)) : nCasterLevel * 4; + nCasterLevel * (4 + GetAbilityModifier(ABILITY_CHARISMA, oCaster)) : nCasterLevel * 2; if(GetHasSpellEffect(SPELL_DES_20) || GetHasSpellEffect(SPELL_DES_100) || GetHasSpellEffect(SPELL_DESECRATE)) nMaxHD *= 2; diff --git a/nwn/nwnprc/trunk/spells/sp_desecrate.nss b/nwn/nwnprc/trunk/spells/sp_desecrate.nss index ba8a2ffb..f56cab16 100644 --- a/nwn/nwnprc/trunk/spells/sp_desecrate.nss +++ b/nwn/nwnprc/trunk/spells/sp_desecrate.nss @@ -1,5 +1,5 @@ //:://///////////////////////////////////////////// -//:: Desecrate +//:: Desecrate onEnter script //:: sp_desecrate.nss //:: ////////////////////////////////////////////// /* @@ -41,7 +41,7 @@ void main() float fDuration = HoursToSeconds(2 * nCastLvl); int nMetaMagic = PRCGetMetaMagicFeat(); int nDesecrate; - string sTag = Get2DACache("vfx_persistent", "LABEL", AOE_PER_CONSECRATE); + string sTag = Get2DACache("vfx_persistent", "LABEL", AOE_PER_DESECRATE); //Make sure duration does no equal 0 if(fDuration < 2.0) @@ -76,7 +76,7 @@ void main() ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eVis, lLoc, fDuration); oAoE = GetAreaOfEffectObject(lLoc, "VFX_AOE_DESECRATE_20"); - SetAllAoEInts(SPELL_CONSECRATE, oAoE, 20, 0, nCastLvl); + SetAllAoEInts(SPELL_DESECRATE, oAoE, 20, 0, nCastLvl); } PRCSetSchool();