Following some testing and discussion, it appears that the scripts for two trap kits (Acid Blob and Holy) have errors in their script that do not align with the same scripts. That same testing reveals that two classes of traps use the wrong script on-triggering: Acid Splash and Frost.
Following confirmation from Valefort that the server is probably using base vanilla scripts for these traps, I have identified the following issues.
Acid Splash Trap
All trap-kit variants are currently placing the associated Negative Energy [nw_t1_neg*c.nss] Trap scripts instead of Acid Splash [nw_t1_splsh*c.nss].
Frost Trap
All trap-kit variants are currently placing the associated Acid Splash [nw_t1_splsh*c.nss] Trap scripts instead of Frost [nw_t1_cold*c.nss].
Acid Blob Trap: Affects nw_t1_acid*c.nss
The code as commented has two effects: one Paralysis effect with a linked fort save, and a damage element.
As implemented, the damage and paralysis check are both delivered on a failed reflex save, but where a comment says "Apply hold" damage is applied instead.
This means that on a failed reflex save, the damage is applied and a further fort save is attempted against paralysis, while on a passed reflex save *full* damage is applied without implementation of Improved Evasion. This further illustrates that there is no Improved Evasion test for this trap.
Unfortunately, the script itself is contradictory: in the opening comment is says the paralysis can be avoided with a reflex save, then applied a fort save to it and includes a comment saying to apply hold on a failed reflex save.
If damage was intended to be applied in either regard, 6 lines could be saved by putting it outside the if-statement entirely.*
These inconsistencies affect all 4 Acid Blob trap kit strengths.
Code:
nw_t1_acidminoc.NSS wrote:void main()
{
//Declare major variables
object oTarget = GetEnteringObject();
effect eDam = EffectDamage(d6(3), DAMAGE_TYPE_ACID);
int nSaveDC = 15;
effect eHold = EffectParalyze(nSaveDC, SAVING_THROW_FORT);
effect eVis = EffectVisualEffect(VFX_IMP_ACID_S);
effect eDur = EffectVisualEffect(VFX_DUR_PARALYZED);
effect eLink = EffectLinkEffects(eHold, eDur);
int nDamage;
//Make Reflex Save
if(!MySavingThrow(SAVING_THROW_REFLEX, oTarget, nSaveDC, SAVING_THROW_TYPE_TRAP))
{
//Apply Hold and Damage
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(2));
}
else
{
//Apply Hold
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
}
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
}
My suggested adjustments to align with internal code-commentary would be either the following, or a touch-attack like Holy traps:
nw_t1_acidminoc.NSS wrote:void main()
{
//Declare major variables
object oTarget = GetEnteringObject();
effect eDam = EffectDamage(d6(3), DAMAGE_TYPE_ACID);
int nSaveDC = 15;
effect eHold = EffectParalyze(nSaveDC, SAVING_THROW_FORT);
effect eVis = EffectVisualEffect(VFX_IMP_ACID_S);
effect eDur = EffectVisualEffect(VFX_DUR_PARALYZED);
effect eLink = EffectLinkEffects(eHold, eDur);
int nDamage;
//Make Reflex Save
if(!MySavingThrow(SAVING_THROW_REFLEX, oTarget, nSaveDC, SAVING_THROW_TYPE_TRAP))
{
//Apply Hold and Damage
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(2));
}
else
{
//Apply Hold
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(2));
}
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
}
Holy Trap: Affects nw_t1_holy*c.nss
As scripted, the Holy Trap pulls a target's AC, and then simulates an attack roll. However, as implemented in the script, this Armor-Class is never actually called, and the attack roll is checked to be greater than 0 - which is *always true*. If this was the intended case, the entire check could be removed and the entire code-block simplified, in a similar case to the Acid Blob trap above.
These inconsistencies affect all 4 Holy trap kit strengths.
Code:
nw_t1_holyminoc.NSS wrote:void main()
{
//Declare major variables
object oTarget = GetEnteringObject();
int nAC = GetAC(oTarget);
//Make attack roll
int nRoll = d20(1) + 10 + 2;
effect eDam = EffectDamage(d10(4), DAMAGE_TYPE_DIVINE);
effect eVis = EffectVisualEffect(VFX_IMP_SUNSTRIKE);
if (nRoll > 0)
{
if (GetRacialType(oTarget) == RACIAL_TYPE_UNDEAD)
{
//Apply Holy Damage and VFX impact
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
}
else
{
eDam = EffectDamage(d4(2), DAMAGE_TYPE_DIVINE);
//Apply Holy Damage and VFX impact
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
}
}
}
As an attack should be against a target's AC (As already pulled by the script) or Touch AC (if it can be pulled) rather than 0, the following would be more correct:
nw_t1_holyminoc.NSS wrote:void main()
{
//Declare major variables
object oTarget = GetEnteringObject();
int nAC = GetAC(oTarget); //If possible check Touch AC instead of full AC
//Make attack roll
int nRoll = d20(1) + 10 + 2;
effect eDam = EffectDamage(d10(4), DAMAGE_TYPE_DIVINE);
effect eVis = EffectVisualEffect(VFX_IMP_SUNSTRIKE);
if (nRoll > nAC )
{
if (GetRacialType(oTarget) == RACIAL_TYPE_UNDEAD)
{
//Apply Holy Damage and VFX impact
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
}
else
{
eDam = EffectDamage(d4(2), DAMAGE_TYPE_DIVINE);
//Apply Holy Damage and VFX impact
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
}
}
}
* : It may of course be a deliberate design decision that only 4 out of 11 player-placeable traps require a save of any kind to reduce or avoid damage (as opposed to the non-damage effect), in which case the script adjustments can be safely ignored. The first two with the incorrect scripts should still be looked in to, even in such an eventuality.