From a192bca40e5665f0a564d2f4c060f88caf39d578 Mon Sep 17 00:00:00 2001 From: Jaysyn904 <68194417+Jaysyn904@users.noreply.github.com> Date: Sun, 11 Jan 2026 20:41:16 -0500 Subject: [PATCH] 2026/01/11 Update Updated PRC8 version. Added EffectIcon for EFFECT_ICON_FATIGUE to PRCEffectFatigue. Fixed Midnight Augmentation to display all known powers as well as display radial powers. Draconic Senses now grants all of the abilities that it should. (Lowlight Vision, Darkvision, Ultravision). --- nwn/nwnprc/trunk/include/prc_effect_inc.nss | 1 + nwn/nwnprc/trunk/include/prc_inc_switch.nss | 2 +- nwn/nwnprc/trunk/include/psi_inc_powknown.nss | 69 ++++++++++++------- .../trunk/newspellbook/moi_midnightcnv.nss | 37 ++++++---- nwn/nwnprc/trunk/scripts/prc_dracfeat.nss | 42 +++++++++-- 5 files changed, 105 insertions(+), 46 deletions(-) diff --git a/nwn/nwnprc/trunk/include/prc_effect_inc.nss b/nwn/nwnprc/trunk/include/prc_effect_inc.nss index a41f7d9c..15ccc425 100644 --- a/nwn/nwnprc/trunk/include/prc_effect_inc.nss +++ b/nwn/nwnprc/trunk/include/prc_effect_inc.nss @@ -498,6 +498,7 @@ effect EffectFatigue(){ effect eReturn = EffectAbilityDecrease(ABILITY_STRENGTH, 2); eReturn = EffectLinkEffects(eReturn, EffectAbilityDecrease(ABILITY_DEXTERITY, 2)); eReturn = EffectLinkEffects(eReturn, EffectMovementSpeedDecrease(25)); + eReturn = EffectLinkEffects(eReturn, EffectIcon(EFFECT_ICON_FATIGUE)); eReturn = TagEffect(eReturn, "PRCFatigue"); return eReturn; } diff --git a/nwn/nwnprc/trunk/include/prc_inc_switch.nss b/nwn/nwnprc/trunk/include/prc_inc_switch.nss index 9fb62344..e19fe93b 100644 --- a/nwn/nwnprc/trunk/include/prc_inc_switch.nss +++ b/nwn/nwnprc/trunk/include/prc_inc_switch.nss @@ -76,7 +76,7 @@ /* This variable MUST be updated with every new version of the PRC!!! */ - const string PRC_VERSION = "PRC8 4.79"; + const string PRC_VERSION = "PRC8 4.80"; /* This variable MUST be updated every time 'assemble_spellbooks.bat' is run!!! */ diff --git a/nwn/nwnprc/trunk/include/psi_inc_powknown.nss b/nwn/nwnprc/trunk/include/psi_inc_powknown.nss index 20c19514..25486c36 100644 --- a/nwn/nwnprc/trunk/include/psi_inc_powknown.nss +++ b/nwn/nwnprc/trunk/include/psi_inc_powknown.nss @@ -29,7 +29,7 @@ */ //::////////////////////////////////////////////// //::////////////////////////////////////////////// - +#include "prc_inc_spells" ////////////////////////////////////////////////// /* Constants */ ////////////////////////////////////////////////// @@ -572,32 +572,49 @@ int GetMaxPowerCount(object oCreature, int nList) int GetHasPower(int nPower, object oCreature = OBJECT_SELF) { - // Check MISC list first (for Hidden Talent and similar feats) - if(GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_INVALID), oCreature)) - return TRUE; + // Debug output + if (DEBUG) DoDebug("GetHasPower: Checking power " + IntToString(nPower)); + + // Check if it's a subradial spell first + if (GetIsSubradialSpell(nPower)) + { + if(DEBUG) DoDebug("GetHasPower: " + IntToString(nPower) + " is a subradial"); + int nMasterSpell = GetMasterSpellFromSubradial(nPower); + if (nMasterSpell != -1) + { + if(DEBUG) DoDebug("GetHasPower: Master spell is " + IntToString(nMasterSpell)); + nPower = nMasterSpell; + } + } + + + // Check MISC list first (for Hidden Talent and similar feats) + if(GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_INVALID), oCreature)) + return TRUE; - if((GetLevelByClass(CLASS_TYPE_PSION, oCreature) - && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_PSION), oCreature) - ) || - (GetLevelByClass(CLASS_TYPE_PSYWAR, oCreature) - && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_PSYWAR), oCreature) - ) || - (GetLevelByClass(CLASS_TYPE_PSYCHIC_ROGUE, oCreature) - && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_PSYCHIC_ROGUE), oCreature) - ) || - (GetLevelByClass(CLASS_TYPE_WILDER, oCreature) - && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_WILDER), oCreature) - ) || - (GetLevelByClass(CLASS_TYPE_FIST_OF_ZUOKEN, oCreature) - && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_FIST_OF_ZUOKEN), oCreature) - ) || - (GetLevelByClass(CLASS_TYPE_WARMIND, oCreature) - && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_WARMIND), oCreature) - ) - // add new psionic classes here - ) - return TRUE; - return FALSE; + if((GetLevelByClass(CLASS_TYPE_PSION, oCreature) + && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_PSION), oCreature) + ) || + (GetLevelByClass(CLASS_TYPE_PSYWAR, oCreature) + && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_PSYWAR), oCreature) + ) || + (GetLevelByClass(CLASS_TYPE_PSYCHIC_ROGUE, oCreature) + && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_PSYCHIC_ROGUE), oCreature) + ) || + (GetLevelByClass(CLASS_TYPE_WILDER, oCreature) + && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_WILDER), oCreature) + ) || + (GetLevelByClass(CLASS_TYPE_FIST_OF_ZUOKEN, oCreature) + && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_FIST_OF_ZUOKEN), oCreature) + ) || + (GetLevelByClass(CLASS_TYPE_WARMIND, oCreature) + && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_WARMIND), oCreature) + ) + // add new psionic classes here + ) + return TRUE; + + return FALSE; } string DebugListKnownPowers(object oCreature) diff --git a/nwn/nwnprc/trunk/newspellbook/moi_midnightcnv.nss b/nwn/nwnprc/trunk/newspellbook/moi_midnightcnv.nss index 9f779775..9516b0f5 100644 --- a/nwn/nwnprc/trunk/newspellbook/moi_midnightcnv.nss +++ b/nwn/nwnprc/trunk/newspellbook/moi_midnightcnv.nss @@ -166,23 +166,36 @@ void main() string sFeatID; int added = 0; - for(i = 14001; i < 14260 ; i++) + for(i = 14001; i < 14351 ; i++) { + // Skip blank IDs between 14266 and 14329 + if(i >= 14266 && i < 14330) + continue; + nPowerLevel = StringToInt(Get2DACache("spells", "Innate", i)); if(nPowerLevel > nMaxLevel) - break; + continue; string sName = GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", i))); - - if(sName != "") - { - if (GetHasPower(i, oMeldshaper)) - { - if(SORT) AddToTempList(oMeldshaper, sName, i); - else AddChoice(sName, i, oMeldshaper); - added++; - } - } + + // Check if it's a regular power or a subradial + int bHasPower = GetHasPower(i, oMeldshaper); + if (!bHasPower && GetIsSubradialSpell(i)) + { + // For subradials, check if they know the master spell + int nMasterSpell = GetMasterSpellFromSubradial(i); + if (nMasterSpell != -1) + { + bHasPower = GetHasPower(nMasterSpell, oMeldshaper); + } + } + + if (bHasPower) + { + if(SORT) AddToTempList(oMeldshaper, sName, i); + else AddChoice(sName, i, oMeldshaper); + added++; + } } if(SORT) diff --git a/nwn/nwnprc/trunk/scripts/prc_dracfeat.nss b/nwn/nwnprc/trunk/scripts/prc_dracfeat.nss index 1cf1b040..3365d509 100644 --- a/nwn/nwnprc/trunk/scripts/prc_dracfeat.nss +++ b/nwn/nwnprc/trunk/scripts/prc_dracfeat.nss @@ -287,16 +287,44 @@ void main() } ///////////////////////////Draconic Senses////////////////////////// if(GetHasFeat(FEAT_DRACONIC_SENSES, oPC)) - { + { + effect eLow = EffectBonusFeat(FEAT_DARKVISION); + effect eDark = EffectBonusFeat(FEAT_LOWLIGHTVISION); + //effect eUltra = EffectUltravision(); + effect eUltra = EffectBonusFeat(FEAT_ULTRAVISION); + effect eLink; + + if(DEBUG) DoDebug("Entering Draconic Senses Branch. nPower is: "+IntToString(nPower)+"."); switch(nPower) { - case 1: IPSafeAddItemProperty(oSkin, ItemPropertyBonusFeat(IP_CONST_FEAT_LOWLIGHT_VISION), 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE); break; - case 2: IPSafeAddItemProperty(oSkin, ItemPropertyBonusFeat(IP_CONST_FEAT_LOWLIGHT_VISION), 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE); break; - case 3: IPSafeAddItemProperty(oSkin, ItemPropertyDarkvision(), 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE); break; - //Using Ultravision as the ability is Blindsense, not Blindsight - default: IPSafeAddItemProperty(oSkin, ItemPropertyDarkvision(), 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE); - ApplyEffectToObject(DURATION_TYPE_PERMANENT, ExtraordinaryEffect(EffectUltravision()), oPC); break; + case 1: + case 2: + { + if(DEBUG) DoDebug("Draconic Senses Branch Case 1 & 2: Lowlight vision"); + //IPSafeAddItemProperty(oSkin, ItemPropertyBonusFeat(IP_CONST_FEAT_LOWLIGHT_VISION), 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE); break; + SPApplyEffectToObject(DURATION_TYPE_PERMANENT, UnyieldingEffect(eLow), oPC); + break; + } + case 3: + { + if(DEBUG) DoDebug("Draconic Senses Branch Case 3: Lowlight vision + Darkvision"); + //IPSafeAddItemProperty(oSkin, ItemPropertyDarkvision(), 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE); break; + eLink = EffectLinkEffects(eLow, eDark); + SPApplyEffectToObject(DURATION_TYPE_PERMANENT, UnyieldingEffect(eLink), oPC); + break; + } + //;: Using Ultravision as the ability is Blindsense, not Blindsight + default: + { + if(DEBUG) DoDebug("Draconic Senses Branch Default: Lowlight vision + Darkvision + Ultravsion"); + //IPSafeAddItemProperty(oSkin, ItemPropertyDarkvision(), 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE); + eLink = EffectLinkEffects(eLow, eDark); + eLink = EffectLinkEffects(eUltra, eLink); + SPApplyEffectToObject(DURATION_TYPE_PERMANENT, UnyieldingEffect(eLink), oPC); + break; + } } + if(DEBUG) DoDebug("Draconic Senses: Adding skill bonuses."); SetCompositeBonus(oSkin, "DS_Spot", nPower, ITEM_PROPERTY_SKILL_BONUS, SKILL_SPOT); SetCompositeBonus(oSkin, "DS_Search", nPower, ITEM_PROPERTY_SKILL_BONUS, SKILL_SEARCH); SetCompositeBonus(oSkin, "DS_Listen", nPower, ITEM_PROPERTY_SKILL_BONUS, SKILL_LISTEN);