2026/05/23 Update

Archivist wasn't specifically set as a divine class in classes.2da.
Added Create Infusion & Craft Scepter to the Archvist's feat 2da.
The Lich class is now getting the correct level based stat updates.
Fixed Create Infusion and Craft Scepter to use class level instead of caster level in feat.2da.
Added default level up package for Scout.
Added default level up package for Swashbuckler.
Fixed Contingent Resurrection to not permanently remove an epic spell slot.
Fixed the prc cache creature to be cutscene invisible, regardless of which function is creating it.
Added special handling in PRCGetLastSpellCastClass() for Bard/Sublime Chord to fix the DC issue.
Added more CEP2 wings to PRCIsFlying()
Added X2_CI_CRAFTSCEPTER_FEAT_ID to CIGetIsSpellRestrictedFromCraftFeat()
Fixed Small Shield handling in ArcaneSpellFailure()
Fixed Troglodyte's racial Stench ability.
Vow of Poverty dialog no longer shows up when you rest & haven't selected a feat for the previous level.
Swashbuckler Grace now supports 60 levels.
Swashbuckler Dodge now respects Daring Outlaw and supports 60 levels.
Blinding Glory isn't a Glory Domain spell in the PRC8.
Fixed TLK typo in Knight (Cavalier) package description.
This commit is contained in:
Jaysyn904
2026-05-23 10:36:02 -04:00
parent 1ea0b03976
commit cda92e9396
29 changed files with 4305 additions and 3525 deletions

View File

@@ -116,12 +116,22 @@ object _inc_lookups_GetCacheObject(string sTag)
//has to be an object, placeables cant go through the DB
oChest = CreateObject(OBJECT_TYPE_CREATURE, "prc_2da_cache",
GetLocation(GetObjectByTag("HEARTOFCHAOS")), FALSE, "Bioware2DACache");
SetPlotFlag(oChest, TRUE);
SetCreatureAppearanceType(oChest, APPEARANCE_TYPE_INVISIBLE_HUMAN_MALE);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY), oChest);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectCutsceneGhost(), oChest);
AssignCommand(oWP, ActionUseSkill(SKILL_HIDE, oChest));
}
if(!GetIsObjectValid(oChest))
{
//has to be an object, placeables cant go through the DB
oChest = CreateObject(OBJECT_TYPE_CREATURE, "prc_2da_cache",
GetStartingLocation(), FALSE, "Bioware2DACache");
SetPlotFlag(oChest, TRUE);
SetCreatureAppearanceType(oChest, APPEARANCE_TYPE_INVISIBLE_HUMAN_MALE);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY), oChest);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectCutsceneGhost(), oChest);
AssignCommand(oWP, ActionUseSkill(SKILL_HIDE, oChest));
}
int nContainer = 0;

View File

@@ -13,6 +13,8 @@
/* Function prototypes */
//////////////////////////////////////////////////
int PRCGetSpellLevelForClass(int nSpell, int nClass);
/**
* Returns the caster level when used in spells. You can use PRCGetCasterLevel()
* to determine a caster level from within a true spell script. In spell-like-
@@ -405,6 +407,7 @@ int ReserveFeatCL(object oCaster, int iSpellId);
#include "prc_inc_newip"
//#include "prc_inc_spells"
#include "prc_inc_descrptr"
#include "prc_inc_core"
//////////////////////////////////////////////////
/* Internal functions */
@@ -699,7 +702,41 @@ int PRCGetCasterLevel(object oCaster = OBJECT_SELF)
return iReturnLevel;
}
int PRCGetLastSpellCastClass(object oCaster = OBJECT_SELF)
int PRCGetLastSpellCastClass(object oCaster = OBJECT_SELF)
{
// note that a barbarian has a class type constant of zero. So nClass == 0 could in principle mean
// that a barbarian cast the spell, However, barbarians cannot cast spells, so it doesn't really matter
// beware of Barbarians with UMD, though. Also watch out for spell like abilities
// might have to provide a fix for these (for instance: if(nClass == -1) nClass = 0;
int nClass = GetLocalInt(oCaster, PRC_CASTERCLASS_OVERRIDE);
if(nClass)
{
if(DEBUG) DoDebug("PRCGetLastSpellCastClass: found override caster class = "+IntToString(nClass)+", original class = "+IntToString(GetLastSpellCastClass()));
return nClass;
}
nClass = GetLastSpellCastClass();
int NSB_Class = GetLocalInt(oCaster, "NSB_Class");
if(nClass == CLASS_TYPE_INVALID && GetSpellCastItem() == OBJECT_INVALID && NSB_Class)
nClass = NSB_Class;
// If caster has Sublime Chord levels, check if the spell
// is outside the base class's native range.
if(GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster) > 0 && nClass != CLASS_TYPE_INVALID)
{
int nSpellID = PRCGetSpellId(oCaster);
// If the spell is NOT found in the base class's spell list (returns -1),
// it must be a Sublime Chord spell (Level 4-9 or Epic).
if(PRCGetSpellLevelForClass(nSpellID, nClass) == -1 && nSpellID != -1)
{
nClass = CLASS_TYPE_SUBLIME_CHORD;
}
}
return nClass;
}
/* int PRCGetLastSpellCastClass(object oCaster = OBJECT_SELF)
{
// note that a barbarian has a class type constant of zero. So nClass == 0 could in principle mean
// that a barbarian cast the spell, However, barbarians cannot cast spells, so it doesn't really matter
@@ -719,7 +756,7 @@ int PRCGetLastSpellCastClass(object oCaster = OBJECT_SELF)
if(DEBUG) DoDebug("PRCGetLastSpellCastClass: returning caster class = "+IntToString(nClass)+" NSB_Class = "+IntToString(NSB_Class));
return nClass;
}
} */
int GetIsArcaneClass(int nClass, object oCaster = OBJECT_SELF)
{

View File

@@ -363,7 +363,8 @@ int PRCIsFlying(object oCreature)
bFlying = TRUE;
}
if(!bFlying
&& ((nWings > 0 && nWings < 79)
&& ((nWings > 0 && nWings < 79)
|| (nWings > 442 && nWings < 448)
|| (nWings > 1959 && nWings < 1962)
|| (nWings > 1962 && nWings < 1966)
|| nWings == 90))//CEP and Project Q wing models

View File

@@ -2726,6 +2726,7 @@ int CIGetIsSpellRestrictedFromCraftFeat(int nSpellID, int nFeatID)
case X2_CI_SCRIBESCROLL_FEAT_ID: sCol = "NoScroll"; break;
case X2_CI_CRAFTWAND_FEAT_ID:
case X2_CI_CRAFTROD_FEAT_ID:
case X2_CI_CRAFTSCEPTER_FEAT_ID:
case X2_CI_CRAFTSTAFF_FEAT_ID: sCol = "NoWand"; break;
}
return !(!StringToInt(Get2DACache(X2_CI_CRAFTING_SP_2DA,sCol,nSpellID)));

View File

@@ -485,7 +485,7 @@ int ArcaneSpellFailure(object oCaster, int nCastingClass, int nSpellLevel, int n
//shields
switch(nShield)
{
case BASE_ITEM_SMALLSHIELD: nASF -= 5; break;
case BASE_ITEM_SMALLSHIELD: nASF -= 10; break;
}
}