// 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); } }