342 lines
11 KiB
Plaintext
342 lines
11 KiB
Plaintext
#include "en5_misc"
|
|
|
|
void CreateTrapKit(object oTarget, int iItemLevel);
|
|
void DetectTrap(object oPC,int iDC,int iLevel);
|
|
|
|
void main()
|
|
{
|
|
int iMinLevel;
|
|
int iMaxLevel;
|
|
int iLevel;
|
|
int iDC;
|
|
object oPC;
|
|
object oArea;
|
|
|
|
int iRogue = GetLevelByClass(CLASS_TYPE_ROGUE, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_SCOUT, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_BEGUILER, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_NINJA, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_FACTOTUM, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_PSYCHIC_ROGUE, oPC);
|
|
|
|
if (GetLocalInt(OBJECT_SELF,"Disabled") == 1)
|
|
return;
|
|
|
|
if (Random(12)>0 && iRogue == 0)
|
|
{
|
|
SetLocalInt(OBJECT_SELF,"Disabled",1);
|
|
return;
|
|
}
|
|
|
|
if (Random(8)>0 && iRogue > 0)
|
|
{
|
|
SetLocalInt(OBJECT_SELF,"Disabled",1);
|
|
return;
|
|
}
|
|
|
|
oPC = GetEnteringObject();
|
|
|
|
if (GetLocalInt(GetArea(OBJECT_SELF),"SpecialArea") == 1)
|
|
{
|
|
oArea=GetArea(GetObjectByTag(GetLocalString(GetArea(OBJECT_SELF),"Zone") + "_Enter"));
|
|
iMinLevel = GetLocalInt(oArea,"MinLevel");
|
|
iMaxLevel = GetLocalInt(oArea,"MaxLevel");
|
|
} else {
|
|
iMinLevel = GetLocalInt(GetArea(OBJECT_SELF),"MinLevel");
|
|
iMaxLevel = GetLocalInt(GetArea(OBJECT_SELF),"MaxLevel");
|
|
}
|
|
|
|
iLevel = Random(iMaxLevel-iMinLevel+1)+iMinLevel;
|
|
//GetError("Trap Level = " + IntToString(iLevel));
|
|
|
|
if (iLevel<1)
|
|
iLevel = GetHitDice(oPC);
|
|
|
|
iDC=GetLocalInt(OBJECT_SELF,"iDC");
|
|
if (iDC == 0)
|
|
{
|
|
iDC = iLevel + 8 + Random(10);
|
|
SetLocalInt(OBJECT_SELF,"iDC",iDC);
|
|
}
|
|
|
|
if (GetLocalInt(OBJECT_SELF,"Detected")==0)
|
|
{
|
|
DetectTrap(oPC,iDC,iLevel);
|
|
} else {
|
|
if (GetLocalInt(OBJECT_SELF,GetName(oPC))==0)
|
|
DetectTrap(oPC,iDC,iLevel);
|
|
}
|
|
|
|
}
|
|
|
|
void DetectTrap(object oPC,int iDC,int iLevel)
|
|
{
|
|
int iDetect;
|
|
int iDisable;
|
|
int iAquire;
|
|
int iItemLevel;
|
|
int iEffect;
|
|
int iDamageType;
|
|
int iRandom;
|
|
int iDice;
|
|
int iDamage;
|
|
object oGlow;
|
|
location lLoc;
|
|
effect eVisu;
|
|
effect eDamg;
|
|
|
|
iDetect=FALSE;
|
|
iDisable=FALSE;
|
|
iAquire=FALSE;
|
|
|
|
iItemLevel=GetItemLevel(iLevel);
|
|
|
|
if (GetHasSkill(SKILL_SEARCH,oPC))
|
|
if (GetIsSkillSuccessful(oPC,SKILL_SEARCH,iDC))
|
|
{
|
|
iDetect=TRUE;
|
|
SetLocalInt(OBJECT_SELF,GetName(oPC),1);
|
|
}
|
|
|
|
if (iDetect==TRUE && GetHasSkill(SKILL_DISABLE_TRAP,oPC))
|
|
if (GetIsSkillSuccessful(oPC,SKILL_DISABLE_TRAP,iDC))
|
|
iDisable=TRUE;
|
|
|
|
if (iDisable==TRUE && GetHasSkill(SKILL_DISABLE_TRAP,oPC) && GetLevelByClass(CLASS_TYPE_ROGUE,oPC)>0)
|
|
if (GetIsSkillSuccessful(oPC,SKILL_DISABLE_TRAP,iDC+10))
|
|
iAquire=TRUE;
|
|
|
|
if (iDetect == FALSE)
|
|
{
|
|
iDice = iLevel/2;
|
|
if (iDice<1)
|
|
iDice=1;
|
|
iDamage = d4(iDice);
|
|
iRandom = Random(9)+1;
|
|
switch (iRandom)
|
|
{
|
|
case 1: iEffect=VFX_FNF_GAS_EXPLOSION_ACID;
|
|
iDamageType=DAMAGE_TYPE_ACID;
|
|
break;
|
|
case 2: iEffect=VFX_FNF_GAS_EXPLOSION_EVIL;
|
|
iDamageType=DAMAGE_TYPE_NEGATIVE;
|
|
break;
|
|
case 3: iEffect=VFX_FNF_SWINGING_BLADE;
|
|
iDamageType=DAMAGE_TYPE_SLASHING;
|
|
break;
|
|
case 4: if (iDamage<30)
|
|
{
|
|
iEffect=VFX_IMP_SPIKE_TRAP;
|
|
iDamageType=DAMAGE_TYPE_PIERCING;
|
|
} else {
|
|
iEffect=VFX_FNF_MYSTICAL_EXPLOSION;
|
|
iDamageType=DAMAGE_TYPE_MAGICAL;
|
|
}
|
|
break;
|
|
case 5: if (iDamage<30)
|
|
iEffect=VFX_COM_HIT_ELECTRICAL;
|
|
else
|
|
iEffect=VFX_FNF_ELECTRIC_EXPLOSION;
|
|
iDamageType=DAMAGE_TYPE_ELECTRICAL;
|
|
break;
|
|
case 6: if (iDamage<30)
|
|
iEffect=VFX_COM_HIT_DIVINE;
|
|
else
|
|
iEffect=VFX_FNF_STRIKE_HOLY;
|
|
iDamageType=DAMAGE_TYPE_DIVINE;
|
|
break;
|
|
case 7: iEffect=VFX_IMP_SPIKE_TRAP;
|
|
iDamageType=DAMAGE_TYPE_PIERCING;
|
|
break;
|
|
case 8: iEffect=VFX_COM_HIT_FROST;
|
|
iDamageType=DAMAGE_TYPE_COLD;
|
|
break;
|
|
case 9: iEffect=VFX_COM_HIT_SONIC;
|
|
iDamageType=DAMAGE_TYPE_SONIC;
|
|
break;
|
|
}
|
|
eVisu = EffectVisualEffect(iEffect, FALSE);
|
|
eDamg = EffectDamage(iDamage,iDamageType);
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVisu, GetLocation(oPC));
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamg, oPC);
|
|
SendMessageToPC(oPC, "A trap hits you for " + IntToString(iDamage) + " points of damage.");
|
|
SetLocalInt(OBJECT_SELF,"Disabled",1);
|
|
}
|
|
|
|
if (iDetect == TRUE && iDisable == FALSE)
|
|
{
|
|
lLoc=GetLocation(GetNearestObjectByTag("en5_trap"));
|
|
oGlow=CreateObject(OBJECT_TYPE_PLACEABLE,"en5_trapglow",lLoc);
|
|
ApplyEffectToObject(2, EffectVisualEffect(VFX_DUR_GLOW_RED),oGlow);
|
|
ApplyEffectToObject(2, EffectVisualEffect(VFX_DUR_LIGHT_RED_15), oGlow);
|
|
SetLocalInt(OBJECT_SELF,"Detected",1);
|
|
SendMessageToPC(oPC, "You have detected a trap but are unable to disable it.");
|
|
}
|
|
|
|
if (iDetect == TRUE && iDisable == TRUE && iAquire==FALSE)
|
|
{
|
|
SendMessageToPC(oPC, "You have detected and disabled a trap.");
|
|
SetLocalInt(OBJECT_SELF,"Disabled",1);
|
|
GiveXPToCreature(oPC,iDC*10);
|
|
}
|
|
|
|
if (iDetect == TRUE && iDisable == TRUE && iAquire==TRUE)
|
|
{
|
|
CreateTrapKit(oPC,iItemLevel);
|
|
SendMessageToPC(oPC, "You have detected and disabled a trap, and you have aquired the device.");
|
|
SetLocalInt(OBJECT_SELF,"Disabled",1);
|
|
GiveXPToCreature(oPC,iDC*20);
|
|
}
|
|
}
|
|
|
|
void CreateTrapKit(object oTarget, int iItemLevel)
|
|
{
|
|
string sKit = "";
|
|
if (iItemLevel==1) // 200
|
|
{
|
|
int nRandom = d3();
|
|
switch (nRandom)
|
|
{
|
|
case 1: sKit = "nw_it_trap001"; break;
|
|
case 2: sKit = "nw_it_trap029"; break;
|
|
case 3: sKit = "nw_it_trap033"; break;
|
|
}
|
|
}
|
|
else if (iItemLevel==2) // 800
|
|
{
|
|
int nRandom = d12();
|
|
switch (nRandom)
|
|
{
|
|
case 1: sKit = "nw_it_trap001"; break;
|
|
case 2: sKit = "nw_it_trap029"; break;
|
|
case 3: sKit = "nw_it_trap033"; break;
|
|
case 4: sKit = "nw_it_trap002"; break;
|
|
case 5: sKit = "nw_it_trap030"; break;
|
|
case 6: sKit = "nw_it_trap037"; break;
|
|
case 7: sKit = "nw_it_trap034"; break;
|
|
case 8: sKit = "nw_it_trap005"; break;
|
|
case 9: sKit = "nw_it_trap038"; break;
|
|
case 10: sKit = "nw_it_trap041"; break;
|
|
case 11: sKit = "nw_it_trap003"; break;
|
|
case 12: sKit = "nw_it_trap031"; break;
|
|
}
|
|
|
|
}
|
|
else if (iItemLevel==3) // 200 - 2500
|
|
{
|
|
int nRandom = Random(17) + 1;
|
|
switch (nRandom)
|
|
{
|
|
case 1: sKit = "nw_it_trap002"; break;
|
|
case 2: sKit = "nw_it_trap030"; break;
|
|
case 3: sKit = "nw_it_trap037"; break;
|
|
case 4: sKit = "nw_it_trap034"; break;
|
|
case 5: sKit = "nw_it_trap005"; break;
|
|
case 6: sKit = "nw_it_trap038"; break;
|
|
case 7: sKit = "nw_it_trap041"; break;
|
|
case 8: sKit = "nw_it_trap003"; break;
|
|
case 9: sKit = "nw_it_trap031"; break;
|
|
case 10: sKit = "nw_it_trap035"; break;
|
|
case 11: sKit = "nw_it_trap006"; break;
|
|
case 12: sKit = "nw_it_trap042"; break;
|
|
case 13: sKit = "nw_it_trap004"; break;
|
|
case 14: sKit = "nw_it_trap032"; break;
|
|
case 15: sKit = "nw_it_trap039"; break;
|
|
case 16: sKit = "nw_it_trap009"; break;
|
|
case 17: sKit = "nw_it_trap036"; break;
|
|
}
|
|
|
|
}
|
|
else if (iItemLevel==4) // 800 - 10000
|
|
{
|
|
int nRandom = Random(19) + 1;
|
|
switch (nRandom)
|
|
{
|
|
case 1: sKit = "nw_it_trap035"; break;
|
|
case 2: sKit = "nw_it_trap006"; break;
|
|
case 3: sKit = "nw_it_trap042"; break;
|
|
case 4: sKit = "nw_it_trap004"; break;
|
|
case 5: sKit = "nw_it_trap032"; break;
|
|
case 6: sKit = "nw_it_trap039"; break;
|
|
case 7: sKit = "nw_it_trap009"; break;
|
|
case 8: sKit = "nw_it_trap036"; break;
|
|
case 9: sKit = "nw_it_trap013"; break;
|
|
case 10: sKit = "nw_it_trap040"; break;
|
|
case 11: sKit = "nw_it_trap007"; break;
|
|
case 12: sKit = "nw_it_trap043"; break;
|
|
case 13: sKit = "nw_it_trap010"; break;
|
|
case 14: sKit = "nw_it_trap017"; break;
|
|
case 15: sKit = "nw_it_trap021"; break;
|
|
case 16: sKit = "nw_it_trap014"; break;
|
|
case 17: sKit = "nw_it_trap025"; break;
|
|
case 18: sKit = "nw_it_trap008"; break;
|
|
case 19: sKit = "nw_it_trap044"; break;
|
|
}
|
|
|
|
}
|
|
else if (iItemLevel==5) // 2000 -16500
|
|
{
|
|
int nRandom = Random(18) + 1;
|
|
switch (nRandom)
|
|
{
|
|
case 1: sKit = "nw_it_trap039"; break;
|
|
case 2: sKit = "nw_it_trap009"; break;
|
|
case 3: sKit = "nw_it_trap036"; break;
|
|
case 4: sKit = "nw_it_trap013"; break;
|
|
case 5: sKit = "nw_it_trap040"; break;
|
|
case 6: sKit = "nw_it_trap007"; break;
|
|
case 7: sKit = "nw_it_trap043"; break;
|
|
case 8: sKit = "nw_it_trap010"; break;
|
|
case 9: sKit = "nw_it_trap017"; break;
|
|
case 10: sKit = "nw_it_trap021"; break;
|
|
case 11: sKit = "nw_it_trap014"; break;
|
|
case 12: sKit = "nw_it_trap025"; break;
|
|
case 13: sKit = "nw_it_trap008"; break;
|
|
case 14: sKit = "nw_it_trap044"; break;
|
|
case 15: sKit = "nw_it_trap018"; break;
|
|
case 16: sKit = "nw_it_trap011"; break;
|
|
case 17: sKit = "nw_it_trap022"; break;
|
|
case 18: sKit = "nw_it_trap026"; break;
|
|
}
|
|
|
|
}
|
|
else if (iItemLevel==6) // 2000 - ?
|
|
{
|
|
int nRandom = Random(27) + 1;
|
|
switch (nRandom)
|
|
{
|
|
case 1: sKit = "nw_it_trap039"; break;
|
|
case 2: sKit = "nw_it_trap009"; break;
|
|
case 3: sKit = "nw_it_trap036"; break;
|
|
case 4: sKit = "nw_it_trap013"; break;
|
|
case 5: sKit = "nw_it_trap040"; break;
|
|
case 6: sKit = "nw_it_trap007"; break;
|
|
case 7: sKit = "nw_it_trap043"; break;
|
|
case 8: sKit = "nw_it_trap010"; break;
|
|
case 9: sKit = "nw_it_trap017"; break;
|
|
case 10: sKit = "nw_it_trap021"; break;
|
|
case 11: sKit = "nw_it_trap014"; break;
|
|
case 12: sKit = "nw_it_trap025"; break;
|
|
case 13: sKit = "nw_it_trap008"; break;
|
|
case 14: sKit = "nw_it_trap044"; break;
|
|
case 15: sKit = "nw_it_trap018"; break;
|
|
case 16: sKit = "nw_it_trap011"; break;
|
|
case 17: sKit = "nw_it_trap022"; break;
|
|
case 18: sKit = "nw_it_trap026"; break;
|
|
case 19: sKit = "nw_it_trap015"; break;
|
|
case 20: sKit = "nw_it_trap012"; break;
|
|
case 21: sKit = "nw_it_trap019"; break;
|
|
case 22: sKit = "nw_it_trap023"; break;
|
|
case 23: sKit = "nw_it_trap016"; break;
|
|
case 24: sKit = "nw_it_trap027"; break;
|
|
case 25: sKit = "nw_it_trap020"; break;
|
|
case 26: sKit = "nw_it_trap024"; break;
|
|
case 27: sKit = "nw_it_trap028"; break;
|
|
}
|
|
|
|
}
|
|
//dbSpeak("Create Trapkit");
|
|
CreateItemOnObject(sKit, oTarget, 1);
|
|
|
|
}
|