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).
This commit is contained in:
Jaysyn904
2026-01-11 20:41:16 -05:00
parent a713b8c422
commit a192bca40e
5 changed files with 105 additions and 46 deletions

View File

@@ -498,6 +498,7 @@ effect EffectFatigue(){
effect eReturn = EffectAbilityDecrease(ABILITY_STRENGTH, 2); effect eReturn = EffectAbilityDecrease(ABILITY_STRENGTH, 2);
eReturn = EffectLinkEffects(eReturn, EffectAbilityDecrease(ABILITY_DEXTERITY, 2)); eReturn = EffectLinkEffects(eReturn, EffectAbilityDecrease(ABILITY_DEXTERITY, 2));
eReturn = EffectLinkEffects(eReturn, EffectMovementSpeedDecrease(25)); eReturn = EffectLinkEffects(eReturn, EffectMovementSpeedDecrease(25));
eReturn = EffectLinkEffects(eReturn, EffectIcon(EFFECT_ICON_FATIGUE));
eReturn = TagEffect(eReturn, "PRCFatigue"); eReturn = TagEffect(eReturn, "PRCFatigue");
return eReturn; return eReturn;
} }

View File

@@ -76,7 +76,7 @@
/* This variable MUST be updated with every new version of the PRC!!! */ /* 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!!! */ /* This variable MUST be updated every time 'assemble_spellbooks.bat' is run!!! */

View File

@@ -29,7 +29,7 @@
*/ */
//::////////////////////////////////////////////// //:://////////////////////////////////////////////
//::////////////////////////////////////////////// //:://////////////////////////////////////////////
#include "prc_inc_spells"
////////////////////////////////////////////////// //////////////////////////////////////////////////
/* Constants */ /* Constants */
////////////////////////////////////////////////// //////////////////////////////////////////////////
@@ -572,32 +572,49 @@ int GetMaxPowerCount(object oCreature, int nList)
int GetHasPower(int nPower, object oCreature = OBJECT_SELF) int GetHasPower(int nPower, object oCreature = OBJECT_SELF)
{ {
// Check MISC list first (for Hidden Talent and similar feats) // Debug output
if(GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_INVALID), oCreature)) if (DEBUG) DoDebug("GetHasPower: Checking power " + IntToString(nPower));
return TRUE;
// 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) if((GetLevelByClass(CLASS_TYPE_PSION, oCreature)
&& GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_PSION), oCreature) && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_PSION), oCreature)
) || ) ||
(GetLevelByClass(CLASS_TYPE_PSYWAR, oCreature) (GetLevelByClass(CLASS_TYPE_PSYWAR, oCreature)
&& GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_PSYWAR), oCreature) && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_PSYWAR), oCreature)
) || ) ||
(GetLevelByClass(CLASS_TYPE_PSYCHIC_ROGUE, oCreature) (GetLevelByClass(CLASS_TYPE_PSYCHIC_ROGUE, oCreature)
&& GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_PSYCHIC_ROGUE), oCreature) && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_PSYCHIC_ROGUE), oCreature)
) || ) ||
(GetLevelByClass(CLASS_TYPE_WILDER, oCreature) (GetLevelByClass(CLASS_TYPE_WILDER, oCreature)
&& GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_WILDER), oCreature) && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_WILDER), oCreature)
) || ) ||
(GetLevelByClass(CLASS_TYPE_FIST_OF_ZUOKEN, oCreature) (GetLevelByClass(CLASS_TYPE_FIST_OF_ZUOKEN, oCreature)
&& GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_FIST_OF_ZUOKEN), oCreature) && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_FIST_OF_ZUOKEN), oCreature)
) || ) ||
(GetLevelByClass(CLASS_TYPE_WARMIND, oCreature) (GetLevelByClass(CLASS_TYPE_WARMIND, oCreature)
&& GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_WARMIND), oCreature) && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_WARMIND), oCreature)
) )
// add new psionic classes here // add new psionic classes here
) )
return TRUE; return TRUE;
return FALSE;
return FALSE;
} }
string DebugListKnownPowers(object oCreature) string DebugListKnownPowers(object oCreature)

View File

@@ -166,23 +166,36 @@ void main()
string sFeatID; string sFeatID;
int added = 0; 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)); nPowerLevel = StringToInt(Get2DACache("spells", "Innate", i));
if(nPowerLevel > nMaxLevel) if(nPowerLevel > nMaxLevel)
break; continue;
string sName = GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", i))); string sName = GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", i)));
if(sName != "") // Check if it's a regular power or a subradial
{ int bHasPower = GetHasPower(i, oMeldshaper);
if (GetHasPower(i, oMeldshaper)) if (!bHasPower && GetIsSubradialSpell(i))
{ {
if(SORT) AddToTempList(oMeldshaper, sName, i); // For subradials, check if they know the master spell
else AddChoice(sName, i, oMeldshaper); int nMasterSpell = GetMasterSpellFromSubradial(i);
added++; if (nMasterSpell != -1)
} {
} bHasPower = GetHasPower(nMasterSpell, oMeldshaper);
}
}
if (bHasPower)
{
if(SORT) AddToTempList(oMeldshaper, sName, i);
else AddChoice(sName, i, oMeldshaper);
added++;
}
} }
if(SORT) if(SORT)

View File

@@ -287,16 +287,44 @@ void main()
} }
///////////////////////////Draconic Senses////////////////////////// ///////////////////////////Draconic Senses//////////////////////////
if(GetHasFeat(FEAT_DRACONIC_SENSES, oPC)) 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) switch(nPower)
{ {
case 1: IPSafeAddItemProperty(oSkin, ItemPropertyBonusFeat(IP_CONST_FEAT_LOWLIGHT_VISION), 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE); break; case 1:
case 2: IPSafeAddItemProperty(oSkin, ItemPropertyBonusFeat(IP_CONST_FEAT_LOWLIGHT_VISION), 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE); break; case 2:
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 if(DEBUG) DoDebug("Draconic Senses Branch Case 1 & 2: Lowlight vision");
default: IPSafeAddItemProperty(oSkin, ItemPropertyDarkvision(), 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE); //IPSafeAddItemProperty(oSkin, ItemPropertyBonusFeat(IP_CONST_FEAT_LOWLIGHT_VISION), 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE); break;
ApplyEffectToObject(DURATION_TYPE_PERMANENT, ExtraordinaryEffect(EffectUltravision()), oPC); 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_Spot", nPower, ITEM_PROPERTY_SKILL_BONUS, SKILL_SPOT);
SetCompositeBonus(oSkin, "DS_Search", nPower, ITEM_PROPERTY_SKILL_BONUS, SKILL_SEARCH); SetCompositeBonus(oSkin, "DS_Search", nPower, ITEM_PROPERTY_SKILL_BONUS, SKILL_SEARCH);
SetCompositeBonus(oSkin, "DS_Listen", nPower, ITEM_PROPERTY_SKILL_BONUS, SKILL_LISTEN); SetCompositeBonus(oSkin, "DS_Listen", nPower, ITEM_PROPERTY_SKILL_BONUS, SKILL_LISTEN);