Files
HeroesStone_PRC8/_module/nss/jw_trap_funct.nss
Jaysyn904 1eefc84201 Initial Commit
Initial Commit.
2025-09-14 15:40:46 -04:00

348 lines
5.5 KiB
Plaintext

// Does a random trap damage effect choosing from acid, fire, piercing
// negative, cold sonic and slashing.
// Difficulty should be 1 to 5, the PC is the victim, the loc is the location of the trap
void DoTrapDamage(object oPC,int nDifficulty,location lLoc);
// Returns f,s,a,e,n,c,o or b at random
string GetRandomTrapType();
// Returns the DC of the trap based on sDiff
// Used in TRAP scripts. sDiff should be 1 - 5
int getdifficulty(string sDiff);
// Returns the damage type of the trap based on sType
// Eg DAMAGE_TYPE_ACID etc
// Used in TRAP scripts
int getdamtype(string sType);
// Returns the first visual effect of the trap
// This is set off at the trap location. Eg VFX_IMP_SONIC etc
// Used in TRAP scripts
int getfirstvis(string sType);
// Returns the second visual effect of the trap.
// This is set off on the PC
// Used in TRAP scripts
int getsecondvis(string sType);
int getdifficulty (string sDiff)
{
int nDC;
if (sDiff=="1")
{
nDC=15;
}
if (sDiff=="2")
{
nDC=20;
}
if (sDiff=="3")
{
nDC=35;
}
if (sDiff=="4")
{
nDC=30;
}
if (sDiff=="5")
{
nDC=35;
}
return nDC;
}
int getdamtype (string sType)
{
int nDamType;
if (sType=="f")
{
nDamType=DAMAGE_TYPE_FIRE;
}
if (sType=="s")
{
nDamType=DAMAGE_TYPE_PIERCING;
}
if (sType=="a")
{
nDamType=DAMAGE_TYPE_ACID;
}
if (sType=="e")
{
nDamType=DAMAGE_TYPE_ELECTRICAL;
}
if (sType=="n")
{
nDamType=DAMAGE_TYPE_NEGATIVE;
}
if (sType=="c")
{
nDamType=DAMAGE_TYPE_COLD;
}
if (sType=="o")
{
nDamType=DAMAGE_TYPE_SONIC;
}
if (sType=="b")
{
nDamType=DAMAGE_TYPE_SLASHING;
}
return nDamType;
}
int getfirstvis (string sType)
{
int nDamType;
if (sType=="f")
{
nDamType=VFX_IMP_FLAME_M;
}
if (sType=="s")
{
nDamType=VFX_IMP_SPIKE_TRAP;
}
if (sType=="a")
{
nDamType=VFX_IMP_ACID_L;
}
if (sType=="e")
{
nDamType=VFX_IMP_LIGHTNING_M;
}
if (sType=="n")
{
nDamType=VFX_IMP_NEGATIVE_ENERGY;
}
if (sType=="c")
{
nDamType=VFX_IMP_FROST_L;
}
if (sType=="o")
{
nDamType=VFX_IMP_SONIC;
}
if (sType=="b")
{
nDamType=VFX_FNF_SWINGING_BLADE;
}
return nDamType;
}
int getsecondvis (string sType)
{
int nDamType;
if (sType=="f")
{
nDamType=VFX_COM_HIT_FIRE;
}
if (sType=="s")
{
nDamType=VFX_COM_SPARKS_PARRY;
}
if (sType=="a")
{
nDamType=VFX_COM_HIT_ACID;
}
if (sType=="e")
{
nDamType=VFX_COM_HIT_ELECTRICAL;
}
if (sType=="n")
{
nDamType=VFX_COM_HIT_NEGATIVE;
}
if (sType=="c")
{
nDamType=VFX_COM_HIT_FROST;
}
if (sType=="o")
{
nDamType=VFX_COM_HIT_SONIC;
}
if (sType=="b")
{
nDamType=VFX_COM_CHUNK_RED_MEDIUM;
}
return nDamType;
}
// Returns f,s,a,e,n,c,o or b at random
string GetRandomTrapType()
{
string sReturn="b";
int nRandom=d8();
switch (nRandom)
{
case 1: sReturn="f";
break;
case 2: sReturn="s";
break;
case 3: sReturn="a";
break;
case 4: sReturn="e";
break;
case 5: sReturn="n";
break;
case 6: sReturn="c";
break;
case 7: sReturn="o";
break;
case 8: sReturn="b";
break;
}
return sReturn;
}
void DoTrapDamage(object oPC,int nDifficulty,location lLoc)
{
int nRandom=d8();
int nDC;
int nFirstVis;
int nSecondVis;
int nDamType;
int nDamage=d10(nDifficulty);
switch (nDifficulty)
{
case 1: nDC=15;
break;
case 2: nDC=20;
break;
case 3: nDC=30;
break;
case 4: nDC=35;
break;
case 5: nDC=40;
break;
}
switch (nRandom)
{
case 1:
nDamType=DAMAGE_TYPE_FIRE;
nFirstVis=VFX_IMP_FLAME_M;
nSecondVis=VFX_COM_HIT_FIRE;
break;
case 2:
nDamType=DAMAGE_TYPE_PIERCING;
nFirstVis=VFX_IMP_SPIKE_TRAP;
nSecondVis=VFX_COM_SPARKS_PARRY;
break;
case 3:
nDamType=DAMAGE_TYPE_ACID;
nFirstVis=VFX_IMP_ACID_L;
nSecondVis=VFX_COM_HIT_ACID;
break;
case 4:
nDamType=DAMAGE_TYPE_ELECTRICAL;
nFirstVis=VFX_IMP_LIGHTNING_M;
nSecondVis=VFX_COM_HIT_ELECTRICAL;
break;
case 5:
nDamType=DAMAGE_TYPE_NEGATIVE;
nFirstVis=VFX_IMP_NEGATIVE_ENERGY;
nSecondVis=VFX_COM_HIT_NEGATIVE;
break;
case 6:
nDamType=DAMAGE_TYPE_COLD;
nFirstVis=VFX_IMP_FROST_L;
nSecondVis=VFX_COM_HIT_FROST;
break;
case 7:
nDamType=DAMAGE_TYPE_SONIC;
nFirstVis=VFX_IMP_SONIC;
nSecondVis=VFX_COM_HIT_SONIC;
break;
case 8:
nDamType=DAMAGE_TYPE_SLASHING;
nFirstVis=VFX_FNF_SWINGING_BLADE;
nSecondVis=VFX_COM_CHUNK_RED_MEDIUM;
break;
}
// apply visual effects
if (nFirstVis==VFX_FNF_SWINGING_BLADE)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(nFirstVis ),oPC);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectKnockdown(),oPC,3.0);
}
else
{
ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(nFirstVis),lLoc);
}
// check saving throw
if (ReflexSave(oPC,nDC,SAVING_THROW_TYPE_TRAP)!=0)
{
if (GetHasFeat(FEAT_EVASION,oPC)||GetHasFeat(FEAT_IMPROVED_EVASION,oPC))
{
FloatingTextStringOnCreature("Saved and evaded",oPC);
nDamage=0;
}
else
{
FloatingTextStringOnCreature("Saved for half damage",oPC);
nDamage=nDamage/2;
}
}
else
if (GetHasFeat(FEAT_IMPROVED_EVASION,oPC))
{
FloatingTextStringOnCreature("Improved evasion in effect",oPC);
nDamage=nDamage/2;
}
// apply damage and visuals to PC
if (nDamage>0)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(nSecondVis ),oPC);
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDamage(nDamage,nDamType,DAMAGE_POWER_PLUS_FIVE),oPC);
}
}