2025/12/14 Update

Spellfire Channeler was missing Improved Healing at 2nd level.
Added "Crafted Vial" CWI crafting baseitem type.
Added Craft Scepter crafting feat.
Added Magical Artisan: Craft Scepter.
Adjusted Hemp Rope label in iprp_material.2da & iprp_matcost.2da
Added Aroma of Death CWI crafting item and spell to support it.
Added Beetle Elixir CWI crafting item and spells to support it.
Added Harness of Armor CWI crafting item.
Swarm Tactics was missing a heartbeat script.
Added crafted descriptions for all CWI items in craft_wondrous.2da
Updated fileends for updated crafting options.
Scepters count as clubs for feats.
Gated errant DEBUG in prc_inc_nat_hb.
Added new switches for scepter crafitng.
Updated PRC Options magic supplies store for new crafting bastitems.
This commit is contained in:
Jaysyn904
2025-12-14 16:50:21 -05:00
parent 25bdd2ed4f
commit 3ebdc0ba62
56 changed files with 22015 additions and 21195 deletions

View File

@@ -0,0 +1,78 @@
//::///////////////////////////////////////////////
//:: Aroma of Curdled Death: On Enter
//:: FileName: curdled_death_a.nss
//::///////////////////////////////////////////////
/*
Creates an invisible cloud that moves with the user.
Effects based on Hit Dice:
- 3 HD or less: dies immediately (no save)
- 4-6 HD: Fort save DC 17 or dies
- 7+ HD: 1d4 Con damage (Fort DC 17 half)
*/
//::///////////////////////////////////////////////
#include "prc_inc_spells"
void main()
{
DoDebug("Entering curdled_death_a / onEnter.");
// Declare major variables
object oTarget = GetEnteringObject();
object oCreator = GetAreaOfEffectCreator();
int nHD = GetHitDice(oTarget);
// Skip if target is the creator (immune)
if(oTarget == oCreator) return;
// Check if target is hostile
if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oCreator))
{
// Signal spell cast at target
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_CLOUDKILL));
// Apply effects based on HD
if(nHD <= 3)
{
// Instant death for 3 HD or less
if(!GetIsImmune(oTarget, IMMUNITY_TYPE_DEATH))
{
DoDebug("curdled_death_a: found a target.");
effect eDeath = EffectDeath();
effect eVis = EffectVisualEffect(VFX_IMP_DEATH);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oTarget);
}
}
else if(nHD >= 4 && nHD <= 6)
{
// Fort save or die for 4-6 HD
if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, 17, SAVING_THROW_TYPE_DEATH, OBJECT_SELF))
{
DoDebug("curdled_death_a: found a target.");
effect eDeath = EffectDeath();
effect eVis = EffectVisualEffect(VFX_IMP_DEATH);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oTarget);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
}
}
else
{
// 7+ HD: Constitution damage with save for half
int nDam = d4();
if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, 17, SAVING_THROW_TYPE_SPELL, OBJECT_SELF))
{
// Full damage
DoDebug("curdled_death_a: found a target.");
AssignCommand(oCreator, ApplyAbilityDamage(oTarget, ABILITY_CONSTITUTION, nDam, DURATION_TYPE_TEMPORARY, TRUE, -1.0f));
}
else
{
// Half damage on successful save
DoDebug("curdled_death_a: found a target.");
AssignCommand(oCreator, ApplyAbilityDamage(oTarget, ABILITY_CONSTITUTION, nDam / 2, DURATION_TYPE_TEMPORARY, TRUE, -1.0f));
}
effect eNeg = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eNeg, oTarget);
}
}
}

View File

@@ -0,0 +1,82 @@
//::///////////////////////////////////////////////
//:: Aroma of Curdled Death: Heartbeat
//:: FileName: curdled_death_c.nss
//::///////////////////////////////////////////////
/*
Applies recurring effects each round to creatures
remaining in the cloud.
*/
//::///////////////////////////////////////////////
#include "prc_inc_spells"
void main()
{
DoDebug("Entering curdled_death_c / onHeartbeat.");
// Check if creator is still valid
if(!GetIsObjectValid(GetAreaOfEffectCreator()))
{
DestroyObject(OBJECT_SELF);
return;
}
object oTarget;
object oCreator = GetAreaOfEffectCreator();
// Cycle through all creatures in the AoE
oTarget = GetFirstInPersistentObject(OBJECT_SELF, OBJECT_TYPE_CREATURE);
while(GetIsObjectValid(oTarget))
{
// Skip the creator (immune)
if(oTarget != oCreator &&
spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oCreator))
{
int nHD = GetHitDice(oTarget);
// Signal spell cast at target
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_CLOUDKILL));
// Apply effects based on HD
if(nHD <= 3)
{
// Already dead from OnEnter, but check anyway
if(!GetIsImmune(oTarget, IMMUNITY_TYPE_DEATH))
{
effect eDeath = EffectDeath();
effect eVis = EffectVisualEffect(VFX_IMP_DEATH);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oTarget);
}
}
else if(nHD >= 4 && nHD <= 6)
{
// Fort save or die each round
if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, 17, SAVING_THROW_TYPE_DEATH, OBJECT_SELF))
{
effect eDeath = EffectDeath();
effect eVis = EffectVisualEffect(VFX_IMP_DEATH);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oTarget);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
}
}
else
{
// 7+ HD: Constitution damage each round
int nDam = d4();
if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, 17, SAVING_THROW_TYPE_SPELL, OBJECT_SELF))
{
// Full damage
AssignCommand(oCreator, ApplyAbilityDamage(oTarget, ABILITY_CONSTITUTION, nDam, DURATION_TYPE_TEMPORARY, TRUE, -1.0f));
}
else
{
// Half damage on successful save
AssignCommand(oCreator, ApplyAbilityDamage(oTarget, ABILITY_CONSTITUTION, nDam / 2, DURATION_TYPE_TEMPORARY, TRUE, -1.0f));
}
effect eNeg = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eNeg, oTarget);
}
}
oTarget = GetNextInPersistentObject(OBJECT_SELF, OBJECT_TYPE_CREATURE);
}
}

View File

@@ -0,0 +1,101 @@
//::///////////////////////////////////////////////
//:: Aroma of Curdled Death:
//:: FileName: cwi_aroma_death.nss
//::///////////////////////////////////////////////
//::
/*
AROMA OF CURDLED DEATH
Price (Item Level): 4,500 gp (9th)
Body Slot: <20>
Caster Level: 9th
Aura: Moderate; (DC 19) conjuration
Activation: Standard (manipulation)
Weight: <20>
This elegant, stoppered glass bottle holds a dark,
viscous fluid.
One round after you apply this elixir to
your skin, it creates an invisible cloud of
gas in a 10-foot radius that moves with you
and persists for 1 minute. You are immune
to the cloud<75>s effects, but every other
creature in the area that has 3 Hit Dice or
fewer immediately dies (no save). A creature that
has 4<>6 Hit Dice must succeed on a DC 17 Fortitude
save each round it remains in the area or die. A
creature that has 7 Hit Dice or more takes 1d4
points of Constitution damage (Fort DC 17 half)
per round of exposure.
Prerequisites: Craft Wondrous Item, cloudkill,
Craft (alchemy) 4 ranks.
Cost to Create: 2,250 gp, 180 XP, 5 days
*/
//::
//::///////////////////////////////////////////////
#include "prc_inc_spells"
void main()
{
object oUser = GetItemActivator();
object oItem = GetItemActivated();
location lTarget = GetItemActivatedTargetLocation();
object oTarget = GetItemActivatedTarget();
if (GetHasSpellEffect(SPELL_AROMA_OF_CURDLED_DEATH, OBJECT_SELF))
PRCRemoveSpellEffects(SPELL_AROMA_OF_CURDLED_DEATH, OBJECT_SELF, OBJECT_SELF);
SendMessageToPC (oUser, "Applying elixir to skin...");
// Applied to skin - mobile 10ft cloud
effect eDur = EffectVisualEffect(VFX_DUR_AURA_GREEN_DARK);
effect eAoE = EffectAreaOfEffect(185, "curdled_death_a", "curdled_death_c", "");
eAoE = EffectLinkEffects(eDur, eAoE);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_PULSE_NATURE), OBJECT_SELF);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAoE, OBJECT_SELF, 60.0f);
}
/* void main()
{
object oCaster = OBJECT_SELF;
location lTarget = PRCGetSpellTargetLocation();
object oTarget = PRCGetSpellTargetObject();
// Execute the elixir effect with proper spell context
ExecuteScript("curdled_death_x", oTarget);
} */
/* void main()
{
object oUser = GetItemActivator();
object oItem = GetItemActivated();
location lTarget = GetItemActivatedTargetLocation();
object oTarget = GetItemActivatedTarget();
// Check usage mode
if(oTarget == oUser)
{
// Applied to skin - mobile 10ft cloud
effect eAOE = EffectAreaOfEffect(185, "curdled_death_a", "curdled_death_c", "");
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAOE, oUser, RoundsToSeconds(60));
// Delayed activation (1 round)
DelayCommand(6.0, ApplyEffectToObject(DURATION_TYPE_INSTANT,
EffectVisualEffect(VFX_IMP_PULSE_NATURE), oUser));
}
else
{
// Opened/poured - stationary 5ft cloud
effect eAOE = EffectAreaOfEffect(185, "curdled_death_a", "curdled_death_c", "");
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, lTarget, RoundsToSeconds(60));
// Visual effect
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_GAS_EXPLOSION_GREASE), lTarget);
}
} */

View File

@@ -0,0 +1,62 @@
//////////////////////////////////////////////////
// Beetle Elixir
// cwi_elxr_beetle.nss
//////////////////////////////////////////////////
//::
/*
BEETLE ELIXIR
Price (Item Level): 1,350 gp (5th)
Body Slot: <20>
Caster Level: 6th
Aura: Moderate; (DC 18) transmutation
Activation: Full-round (manipulation)
Weight: <20>
The viscous liquid in this vial has an oily brown
color and smells a little like wet leaves.
Drinking beetle elixir causes your skin to harden,
darken, and gloss over, and short antennae to
sprout from your forehead.
You gain darkvision out to 60 feet and a +2
enhancement bonus to your existing natural armor.
(A creature without natural armor has an effective
natural armor bonus of +0.) These effects last for
12 hours.
Prerequisites: Craft Wondrous Item, alter self,
darkvision, Craft (alchemy) 5 ranks.
Cost to Create: 675 gp, 54 XP, 2 days
*/
//::
//;;//////////////////////////////////////////////
#include "prc_inc_spells"
void main()
{
object oTarget = GetItemActivator();
string sTargetName = GetName(oTarget);
object oItem = GetItemActivated();
string sItemName = GetName(oItem);
if (GetHasSpellEffect(SPELL_ELIXIR_OF_THE_BEETLE, OBJECT_SELF))
PRCRemoveSpellEffects(SPELL_ELIXIR_OF_THE_BEETLE, OBJECT_SELF, OBJECT_SELF);
if(DEBUG) DoDebug("Using "+sItemName+" on "+sTargetName+".");
// Apply darkvision effect
effect eDarkvision = EffectBonusFeat(FEAT_DARKVISION);
effect eVis = EffectVisualEffect(VFX_DUR_AURA_PULSE_BLUE_BLACK);
// Apply natural armor bonus
effect eArmor = EffectACIncrease(2, AC_NATURAL_BONUS);
// Link all effects
effect eLink = EffectLinkEffects(eDarkvision, eArmor);
eLink = EffectLinkEffects(eLink, eVis);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, OBJECT_SELF, HoursToSeconds(12));
}

View File

@@ -1664,6 +1664,13 @@ void main()
// -------------------------------------------------
bFailed = CICraftCheckCraftStaff(oItem,oPC,nSpell);
break;
case BASE_ITEM_CRAFTED_SCEPTER :
// -------------------------------------------------
// Craft Scepter
// -------------------------------------------------
bFailed = CICraftCheckCraftScepter(oItem,oPC,nSpell);
break;
default:
if(GetLocalInt(oPC, "InscribeRune"))

View File

@@ -16,6 +16,7 @@ int isSimple(object oItem)
return 1;
break;
case BASE_ITEM_CLUB:
case BASE_ITEM_CRAFTED_SCEPTER:
case BASE_ITEM_DAGGER:
case BASE_ITEM_LIGHTMACE:
case BASE_ITEM_SICKLE:

View File

@@ -177,7 +177,7 @@ void main()
}
}
}
if (GetBaseItemType(oWeap)==BASE_ITEM_CLUB)
if (GetBaseItemType(oWeap)==BASE_ITEM_CLUB || GetBaseItemType(oWeap)==BASE_ITEM_CRAFTED_SCEPTER)
{
if (GetItemHasItemProperty(oWeap, ITEM_PROPERTY_KEEN) == TRUE)
{