2026/02/08 Update

Archived Spellman's Project content.
Added missing Diamond Dragon stat feats.
Hospitaler's should be able to take Extra Turning.
Dodge proxies should allow entry into Champion of Corellon.
Mounted Combat is a prereq for Champion of Corellon.
Only Clerics have Domain reqs to enter Morninglord.
Verdant Lord was missing BAB 4 entry requirement.
Diamond Dragons don't get spellcraft.
Re-added Korobokuru race.
Added .ltr tables for Korobokuru.
Capped Blood in the Water at +20.
Capped Pearl of Black Doubt at +20.
Added json_GetFirstKnownSpell() and json_GetNextKnownSpell().
Updated all old NWNx functions to work with NWNxEE.
Added new switch to enable optional PRCX / NWNxEE shims.
Commented out ConvoCC switches on inc_switch_setup.nss
Diamond Dragon's stat increases are intrinsic when using NWNxEE.
Forsaker's stat increases are intrinsic when using NWNxEE.
Vow of Poverty's stat increases are intrinsic when using NWNxEE.
Cloud Dragon summon should be Neutral Good.
Fixed Verdant Lord's regen.
Fixed Forest Master's regen.
Morninglord's Creative Fire should affect Alchemy.
Added yes/no dialog when choosing Vow of Poverty bonus Exalted Feats.
Racial natural AC should be intrinsic when NWNxEE is enabled.
Transcendent Vitality's CON bonus is intrinsic when NWNxEE is enabled.
This commit is contained in:
Jaysyn904
2026-02-08 00:44:28 -05:00
parent 875f00c88f
commit 4026b6af2c
899 changed files with 2189 additions and 83980 deletions

View File

@@ -414,8 +414,72 @@ void main()
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HEALING_L_LAW), oHealTarget);
}
// Blood in the Water
if (GetHasSpellEffect(MOVE_TC_BLOOD_WATER, oSpellOrigin) && GetBaseItemType(oItem) != BASE_ITEM_ARMOR)
// Blood in the Water
if (GetHasSpellEffect(MOVE_TC_BLOOD_WATER, oSpellOrigin) && GetBaseItemType(oItem) != BASE_ITEM_ARMOR)
{
// Fake critical hit check
if (d20() >= GetWeaponCriticalRange(oSpellOrigin, oItem))
{
string sBlood = GetCreatureBloodColor(oSpellTarget);
int bGhost = GetIsIncorporeal(oSpellTarget);
int nRace = MyPRCGetRacialType(oSpellTarget);
effect eVFX;
if (sBlood == "R") eVFX = EffectVisualEffect(VFX_COM_CHUNK_RED_SMALL);
else if (sBlood == "Y") eVFX = EffectVisualEffect(VFX_COM_CHUNK_YELLOW_SMALL);
else if (sBlood == "W") eVFX = EffectVisualEffect(VFX_COM_BLOOD_SPARK_SMALL);
else if (sBlood == "G") eVFX = EffectVisualEffect(VFX_COM_CHUNK_GREEN_SMALL);
else if (sBlood == "N")
{
if (nRace == RACIAL_TYPE_UNDEAD)
{
if (bGhost) eVFX = EffectVisualEffect(VFX_COM_HIT_DIVINE);
else eVFX = EffectVisualEffect(VFX_COM_CHUNK_BONE_MEDIUM);
}
else eVFX = EffectVisualEffect(VFX_COM_CHUNK_STONE_SMALL);
}
else
{
eVFX = EffectVisualEffect(VFX_COM_CHUNK_RED_SMALL); // fallback VFX
}
// Increase total bonus stack count
int nStacks = GetLocalInt(oSpellOrigin, "BITW_STACKS") + 1;
SetLocalInt(oSpellOrigin, "BITW_STACKS", nStacks);
// Cap stacks at 20
if(nStacks > 20) nStacks = 20;
// Store time of last crit as integer seconds
SetLocalInt(oSpellOrigin, "BITW_LASTCRIT", (GetTimeHour() * 3600) + (GetTimeMinute() * 60) + GetTimeSecond());
// Remove old BITW_BUFF effect before applying updated buff
effect eOld = GetFirstEffect(oSpellOrigin);
while (GetIsEffectValid(eOld))
{
if (GetEffectTag(eOld) == "BITW_BUFF")
{
RemoveEffect(oSpellOrigin, eOld);
}
eOld = GetNextEffect(oSpellOrigin);
}
// Apply new combined attack and damage bonus with total stacks
effect eBuff = EffectLinkEffects(
EffectAttackIncrease(nStacks),
EffectDamageIncrease(IPGetDamageBonusConstantFromNumber(nStacks), DAMAGE_TYPE_SLASHING)
);
eBuff = TagEffect(eBuff, "BITW_BUFF");
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBuff, oSpellOrigin);
// Schedule decay check in 60 seconds (will only reset if no new crit since last)
DelayCommand(60.0, CheckBloodInTheWaterDecay(oSpellOrigin));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oSpellTarget);
}
}
/* if (GetHasSpellEffect(MOVE_TC_BLOOD_WATER, oSpellOrigin) && GetBaseItemType(oItem) != BASE_ITEM_ARMOR)
{
// Fake critical hit check
if (d20() >= GetWeaponCriticalRange(oSpellOrigin, oItem))
@@ -475,62 +539,8 @@ void main()
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oSpellTarget);
}
}
/* if (GetHasSpellEffect(MOVE_TC_BLOOD_WATER, oSpellOrigin) && GetBaseItemType(oItem) != BASE_ITEM_ARMOR)
{
// Fake critical hit check
if (d20() >= GetWeaponCriticalRange(oSpellOrigin, oItem))
{
string sBlood = GetCreatureBloodColor(oSpellTarget);
int bGhost = GetIsIncorporeal(oSpellTarget);
int nRace = MyPRCGetRacialType(oSpellTarget);
effect eVFX;
if (sBlood == "R") eVFX = EffectVisualEffect(VFX_COM_CHUNK_RED_SMALL);
if (sBlood == "Y") eVFX = EffectVisualEffect(VFX_COM_CHUNK_YELLOW_SMALL);
if (sBlood == "W") eVFX = EffectVisualEffect(VFX_COM_BLOOD_SPARK_SMALL);
if (sBlood == "G") eVFX = EffectVisualEffect(VFX_COM_CHUNK_GREEN_SMALL);
if (sBlood == "N")
{
if (nRace == RACIAL_TYPE_UNDEAD)
{
if (bGhost) eVFX = EffectVisualEffect(VFX_COM_HIT_DIVINE);
else eVFX = EffectVisualEffect(VFX_COM_CHUNK_BONE_MEDIUM);
}
else eVFX = EffectVisualEffect(VFX_COM_CHUNK_STONE_SMALL);
}
// --- STACKING LOGIC ---
int nStacks = GetLocalInt(oSpellOrigin, "BITW_STACKS");
nStacks += 1;
SetLocalInt(oSpellOrigin, "BITW_STACKS", nStacks);
// Remove any old bonus effect
effect eOld = GetFirstEffect(oSpellOrigin);
while (GetIsEffectValid(eOld))
{
if (GetEffectTag(eOld) == "BITW_BUFF")
{
RemoveEffect(oSpellOrigin, eOld);
}
eOld = GetNextEffect(oSpellOrigin);
}
// Apply new combined attack/damage bonus
effect eBuff = EffectLinkEffects(
EffectAttackIncrease(nStacks),
EffectDamageIncrease(IPGetDamageBonusConstantFromNumber(nStacks), DAMAGE_TYPE_SLASHING));
eBuff = TagEffect(eBuff, "BITW_BUFF");
DelayCommand(0.0, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBuff, oSpellOrigin, TurnsToSeconds(1)));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oSpellTarget);
}
}
*/
/* if(GetHasSpellEffect(MOVE_TC_BLOOD_WATER, oSpellOrigin) && GetBaseItemType(oItem) != BASE_ITEM_ARMOR && !GetIsImmune(oSpellTarget, IMMUNITY_TYPE_CRITICAL_HIT) )
{
// Fake critical hit check