Cinco De Mayo Update

Warforged Scouts can take Warforged Juggernaut.
Updated PRC8 version number.
FEAT_EXTRA_GRANTED_MANEUVER is for Crusaders, not Swordsages.
FEAT_EXTRA_GRANTED_MANEUVER now shows all 5 granted maneuvers after 19th lvl.
Mirror Image onCastAt script now uses PRCGetCasterLevel()
Summon Hamatula now uses PRCGetCasterLevel()
Spiritual Weapon now uses PRCGetCasterLevel()
Heal & Harm now SignalEvent on placeables.  DEITY$ only knows how many modules this broke.
Updated human readable changelog.
Added current list of PRC8 additions.
This commit is contained in:
Jaysyn904
2026-05-05 13:25:45 -04:00
parent 0aa32fb621
commit 129d5f33b8
10 changed files with 2725 additions and 1134 deletions

161
PRC8 Additions.txt Normal file
View File

@@ -0,0 +1,161 @@
CLASSES / PRESTIGE CLASSES
Fochlucan Lyrist
Verdant Lord
Lion of Talisid
RACIAL TYPES
Nezumi (OA)
Korobokuru (OA)
Warforged Scout (Eberron)
Shyft (Planescape)
Maeluth (Planescape)
Mechanatrix (Planescape)
Wispling (Planescape)
TEMPLATES
Baelnorn template
DOMAINS
Chaos
Glory
Law
Luck
Madness
Mind
Moon
FEATS
Combat Focus
Combat Awareness
Combat Stability
Combat Defense
Combat Vitality
Combat Strike
Choke Hold
Pain Touch
Ki Shout
Great Ki Shout
Freezing the Lifeblood
Falling Star Strike
Unbalancing Strike
Plant Defiance
Plant Control
Favored of the Companions
Create Infusion
Magical Artisan: Create Infusion
Craft Scepter
Magical Artisan: Craft Scepter
Improved Critical (touch attack)
Improved Critical (ray)
Weapon Focus (touch attack)
Epic Weapon Focus (touch attack)
Builder / System Feats
Intrinsic Armor
Intrinsic Weapon
SPELLS
Control Plants
Forestfold
Creeping Cold
Greater Creeping Cold
Immunity from Elements
Adrenaline Surge
Regeneration Line
Regenerate Ring
Regenerate Circle
Summoning
Summon Nature<72>s Ally I<>IX
Leonal<EFBFBD>s Roar
Repair Damage (spell line)
PSIONICS
Defensive Manifestation
INFUSIONS
Armor Enhancement (Lesser / Standard / Greater)
Resistance Item
Weapon Augmentation (Lesser / Standard / Personal)
CRAFTING SYSTEMS / ECONOMY
Create Infusion crafting system
Scepter crafting system
Offline PnP magical crafting system
Craftable Items
Aroma of Death
Beetle Elixir
Harness of Armor
New Base Item Types
Crafted Vial
Mundane Herb
Infused Herb
Mundane Scepter
Enchanted Scepter
Materials
Botanical material
Glassteel
SYSTEMS / GAMEPLAY MECHANICS
Scrying System Overhaul
Area-blocked scrying variables
Source-blocked scrying variables
Unified handling across spells/powers
Player Appearance System
Runtime player model swapping via racialappear.2da
Spell Systems
Spell Cancellation system
Spell Effect Viewer system
Spell Duration tracking UI
Summoning / Scaling
LevelUpSummon() system
Summon scaling framework (HD/class scaling)
Combat / Mechanics
Grapple removes invisibility rule enforcement
Double chakra bind system (Incarnum expansion)
Double totem bind system
UI / NUI SYSTEMS
NUI Spellcasting system
NUI Spell Effect Viewer
NUI Spell Duration Viewer
NUI Level-up spell selector
Power Attack GUI system
prc_onplayergui event system
NUI event dispatch framework
FRAMEWORKS / BACKEND SYSTEMS
JSON / Data Systems
JSON summoning support library
JSON spell/creature handling utilities
NWNx / PRCX Integration
Optional PRCX shim system / NWNxEE compatibility layer
SCRIPTING / ENGINE UTILITIES (NEW FUNCTIONS)
GenerateRandomName()
GetIsAlchemical()
VectorToPerpendicular()
GetCurrentUnixTimestamp()
LevelUpSummon()
json_GetFirstKnownSpell()
json_GetNextKnownSpell()
GetHealerCompanionBonus()
CelestialTemplateEffects()
MakeCelestialCreatureFromTemplate()
Item Properties
Expanded Damage Resistance tiers
Material-based crafting properties
Quality-based item properties
OTHER SYSTEMS / FEATURES
DM character inspection tool (view templates/effects)
Spell effect click-to-inspect system
PRC options system expansions (player toggles)
Dynamic conversation system expansions
Summon AI/stat scaling improvements

File diff suppressed because it is too large Load Diff

View File

@@ -3,8 +3,9 @@
LABEL ReqType ReqParam1 ReqParam2
0 Warforged RACE 149 ****
1 WarforgedCharger RACE 145 ****
2 ScriptVar VAR PRC_AllowJuggernaut 0
3 Base_Attack BAB 5 ****
4 AdamantineBody_WarForged FEAT 4781 ****
5 PowerAtk FEAT 28 ****
6 ImprovedBullrush FEAT 2806 ****
2 WarforgedScout RACE 144 ****
3 ScriptVar VAR PRC_AllowJuggernaut 0
4 Base_Attack BAB 5 ****
5 AdamantineBody_WarForged FEAT 4781 ****
6 PowerAtk FEAT 28 ****
7 ImprovedBullrush FEAT 2806 ****

View File

@@ -1066,7 +1066,7 @@ void spellsDispelAoE(object oTargetAoE, object oCaster, int nCasterLevel)
}
nChance += ((nCasterLevel + (GetAbilityScoreForClass(nClassCaster, oCaster)-10)/2) - (GetCasterLevel(oCreator))); // yes this is a sucky stupid hack
nChance += ((nCasterLevel + (GetAbilityScoreForClass(nClassCaster, oCaster)-10)/2) - (PRCGetCasterLevel(oCreator))); // yes this is a sucky stupid hack
//--------------------------------------------------------------------------
// the AI does cheat here, because it can not react as well as a player to

View File

@@ -76,7 +76,7 @@
/* This variable MUST be updated with every new version of the PRC!!! */
const string PRC_VERSION = "PRC8 4.89";
const string PRC_VERSION = "PRC8 4.91";
/* This variable MUST be updated every time 'assemble_spellbooks.bat' is run!!! */

View File

@@ -251,7 +251,7 @@ int GetMaxReadiedCount(object oPC, int nList)
int nMaxReadied = StringToInt(Get2DACache(GetAMSKnownFileName(nList), "ManeuversReadied", nLevel-1));
// Add in the custom modifier
nMaxReadied += GetReadiedManeuversModifier(oPC, nList);
if(nList == MANEUVER_LIST_SWORDSAGE)
if(nList == MANEUVER_LIST_CRUSADER)
nMaxReadied += GetHasFeat(FEAT_EXTRA_GRANTED_MANEUVER, oPC);
if(DEBUG) DoDebug("tob_inc_recovery: MaxManeuvers Readied: " +IntToString(nMaxReadied));
@@ -398,16 +398,30 @@ void GrantRandomManeuver(object oPC, int nList = MANEUVER_LIST_CRUSADER)
SetLocalInt(oPC, "ManeuverGranted" + IntToString(i), nMoveId);
}
void ListGrantedManeuvers(object oPC)
void ListGrantedManeuvers(object oPC)
{
int i;
int nMaxGranted = StringToInt(Get2DACache(GetAMSKnownFileName(MANEUVER_LIST_CRUSADER), "ManeuversGranted", GetLevelByClass(CLASS_TYPE_CRUSADER, oPC)-1));
nMaxGranted += GetHasFeat(FEAT_EXTRA_GRANTED_MANEUVER, oPC);
for(i = 1; i <= nMaxGranted; i++)
{
int nMoveId = GetLocalInt(oPC, "ManeuverGranted" + IntToString(i));
int nExpended = GetIsManeuverExpended(oPC, MANEUVER_LIST_CRUSADER, nMoveId);
if (nMoveId > 0 && !nExpended) FloatingTextStringOnCreature(GetManeuverName(nMoveId) + " is granted", oPC, FALSE);
}
}
/* void ListGrantedManeuvers(object oPC)
{
int i;
for(i = 1; i <= 4; i++)
for(i = 1; i <= 5; i++)
{
int nMoveId = GetLocalInt(oPC, "ManeuverGranted" + IntToString(i));
int nExpended = GetIsManeuverExpended(oPC, MANEUVER_LIST_CRUSADER, nMoveId);
if (nMoveId > 0 && !nExpended) FloatingTextStringOnCreature(GetManeuverName(nMoveId) + " is granted", oPC, FALSE);
}
}
} */
void GrantManeuvers(object oPC, int nList = MANEUVER_LIST_CRUSADER)
{

View File

@@ -7,7 +7,7 @@ void main()
// Get the caster of the potential dispel
object oCaster = GetLastSpellCaster();
int nCasterLevel = GetCasterLevel(oCaster);
int nCasterLevel = PRCGetCasterLevel(oCaster);
if(DEBUG) DoDebug("mirror_image_sa: EVENT_NPC_ONSPELLCASTAT triggered.");
@@ -33,10 +33,10 @@ void main()
// Ensure oOriginalCaster is valid
if (GetIsObjectValid(oOriginalCaster))
{
if(DEBUG) DoDebug("mirror_image_sa: Original caster found. Caster level: " + IntToString(GetCasterLevel(oOriginalCaster)));
if(DEBUG) DoDebug("mirror_image_sa: Original caster found. Caster level: " + IntToString(PRCGetCasterLevel(oOriginalCaster)));
// Determine the DC for the dispel check
int nDispelDC = 11 + GetCasterLevel(oOriginalCaster);
int nDispelDC = 11 + PRCGetCasterLevel(oOriginalCaster);
if(DEBUG) DoDebug("mirror_image_sa: Dispel DC: " + IntToString(nDispelDC));
// Determine the maximum cap for the dispel check

View File

@@ -17,7 +17,7 @@ void main()
{
//Declare major variables
int nMetaMagic = PRCGetMetaMagicFeat();
int nDuration = GetCasterLevel(OBJECT_SELF);
int nDuration = PRCGetCasterLevel(OBJECT_SELF);
object oPC = OBJECT_SELF;
effect eSummon = EffectSummonCreature("NW_DMVROCK");
if(GetPRCSwitch(MARKER_PRC_COMPANION))

View File

@@ -83,6 +83,12 @@ int DoSpell(object oCaster, object oTarget, int nSpellID)
{
if(bMass) fDelay = PRCGetRandomDelay();
int iTombTainted = GetHasFeat(FEAT_TOMB_TAINTED_SOUL, oTarget) && GetAlignmentGoodEvil(oTarget) != ALIGNMENT_GOOD;
// Signal placeables even if they're not creatures
if(GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE)
{
SignalEvent(oTarget, EventSpellCastAt(oCaster, nSpellID, FALSE));
}
iHeal = GetObjectType(oTarget) == OBJECT_TYPE_CREATURE &&
((!bIsHeal && (MyPRCGetRacialType(oTarget) == RACIAL_TYPE_UNDEAD || iTombTainted)) ||

View File

@@ -83,7 +83,7 @@ void main()
{
// Get the caster of the spell
object oCaster = GetLastSpellCaster();
int nCasterLevel = GetCasterLevel(oCaster);
int nCasterLevel = PRCGetCasterLevel(oCaster);
if(DEBUG) DoDebug("sp_spiritweapon: EVENT_NPC_ONSPELLCASTAT triggered.");