74 lines
2.5 KiB
Plaintext
74 lines
2.5 KiB
Plaintext
#include "hc_text_traps"
|
|
#include "prc_inc_spells"
|
|
|
|
void triggerTrap(object oTrap, object oVictim);
|
|
|
|
void main()
|
|
{
|
|
object oPC = GetPCSpeaker();
|
|
SendMessageToPC(oPC, DISARMING);
|
|
|
|
if (oPC != OBJECT_INVALID)
|
|
{
|
|
int nRogueLevel = GetLevelByClass(CLASS_TYPE_ROGUE, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_SCOUT, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_NINJA, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_FACTOTUM, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_BEGUILER, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_PSYCHIC_ROGUE, oPC);
|
|
|
|
int nSkillMod = GetLocalInt(oPC, "nSkillMod");
|
|
object oTrappedItem = GetLocalObject(oPC, "oToolTarget");
|
|
int iTrapDC = GetTrapDisarmDC(oTrappedItem) - 100;
|
|
int bCanDisarmTrap = FALSE; // Assume that the person cannot spot a trap.
|
|
// Determine spotting capability
|
|
if ((iTrapDC <= 20) || ((iTrapDC > 20) && (nRogueLevel >= 1)))
|
|
bCanDisarmTrap = TRUE;
|
|
// Only check to see if detected if not previously detected
|
|
// and the PC has the ability to do detect it.
|
|
if (bCanDisarmTrap)
|
|
{
|
|
int nDisarm = GetSkillRank(SKILL_DISABLE_TRAP, oPC);
|
|
int nDCCheck = d20() + nDisarm + nSkillMod;
|
|
if (nDCCheck >= iTrapDC && nDisarm >= 1) // Trap disarmed
|
|
{
|
|
SetTrapDisabled(oTrappedItem);
|
|
SendMessageToPC(oPC, DISARMED);
|
|
}
|
|
else if ((nDCCheck - iTrapDC) < -4)
|
|
{
|
|
SendMessageToPC(oPC, TRAPTRIGGERED);
|
|
triggerTrap(oTrappedItem, oPC);
|
|
}
|
|
else
|
|
SendMessageToPC(oPC, FAILDISARM);
|
|
}
|
|
else
|
|
{
|
|
triggerTrap(oTrappedItem, oPC);
|
|
}
|
|
|
|
DeleteLocalObject(oPC, "oToolTarget");
|
|
DeleteLocalInt(oPC, "nSkillMod");
|
|
|
|
}
|
|
}
|
|
|
|
void triggerTrap(object oTrappedObject, object oVictim)
|
|
{
|
|
switch (GetObjectType(oTrappedObject))
|
|
{
|
|
case OBJECT_TYPE_DOOR:
|
|
AssignCommand(oVictim, ActionDoCommand(SetLocked(oTrappedObject, FALSE)));
|
|
AssignCommand(oVictim, ActionOpenDoor(oTrappedObject));
|
|
AssignCommand(oVictim, ActionDoCommand(SetLocked(oTrappedObject, TRUE)));
|
|
break;
|
|
case OBJECT_TYPE_PLACEABLE:
|
|
AssignCommand(oVictim, ActionInteractObject(oTrappedObject));
|
|
break;
|
|
case OBJECT_TYPE_TRIGGER:
|
|
AssignCommand(oVictim, ActionForceMoveToLocation(GetLocation(oTrappedObject)));
|
|
break;
|
|
}
|
|
}
|