int CheckForAnyTrap(struct char_data *ch, struct obj_data *i) { if(DEBUG) dlog("CheckForAnyTrap"); if((ITEM_TYPE(i) == ITEM_TRAP) && (GET_TRAP_CHARGES(i) > 0)) return(TriggerTrap(ch, i)); return(FALSE); }
bool InfoPoint::Entered(Actor *actor) { if (outline->PointIn( actor->Pos ) ) { goto check; } // be more lenient for travel regions, fixed iwd2 ar1100 to1101 region if (Type == ST_TRAVEL && outline->BBox.PointInside(actor->Pos)) { goto check; } // why is this here? actors which aren't *in* a trap get IF_INTRAP // repeatedly unset, so this triggers again and again and again. // i disabled it for ST_PROXIMITY for now.. /*if (Type != ST_PROXIMITY && (PersonalDistance(Pos, actor)<MAX_OPERATING_DISTANCE) ) { goto check; }*/ // this method is better (fuzzie, 2009) and also works for the iwd ar6002 northeast exit if (Type == ST_TRAVEL && PersonalDistance(TrapLaunch, actor)<MAX_OPERATING_DISTANCE) { goto check; } // fuzzie can't escape pst's ar1405 without this one, maybe we should really be checking // for distance from the outline for travel regions instead? if (Type == ST_TRAVEL && PersonalDistance(TalkPos, actor)<MAX_OPERATING_DISTANCE) { goto check; } if (Flags&TRAP_USEPOINT) { if (PersonalDistance(UsePoint, actor)<MAX_OPERATING_DISTANCE) { goto check; } } return false; check: if (Type==ST_TRAVEL) { actor->LastMarked = GetGlobalID(); return true; } if (actor->GetInternalFlag()&IF_INTRAP) { return false; } // allow entering trap when trying to disarm if (Type == ST_PROXIMITY && actor->GetDisarmingTrap() == GetGlobalID()) { return false; } // recheck ar1404 mirror trap Shadow1 still works if you modify TRAP_NPC logic if ((Flags&TRAP_NPC) ^ (!!actor->InParty)) { //no need to avoid a travel trigger //skill? if (TriggerTrap(0, actor->GetGlobalID()) ) { actor->LastMarked = GetGlobalID(); return true; } } return false; }
int CheckForGetTrap(struct char_data *ch, struct obj_data *i) { if(DEBUG) dlog("CheckForGetTrap"); if ((ITEM_TYPE(i) == ITEM_TRAP) && (IS_SET(GET_TRAP_EFF(i),TRAP_EFF_OBJECT)) && (GET_TRAP_CHARGES(i) > 0)) { return(TriggerTrap(ch, i)); } return(FALSE); }
int CheckForMoveTrap(struct char_data *ch, int dir) { struct obj_data *i; if(DEBUG) dlog("CheckForMoveTrap"); for (i = real_roomp(ch->in_room)->contents; i; i = i->next_content) { if ((ITEM_TYPE(i) == ITEM_TRAP) && (IS_SET(GET_TRAP_EFF(i),TRAP_EFF_MOVE)) && (GET_TRAP_CHARGES(i) > 0)) if (IS_SET(GET_TRAP_EFF(i), TrapDir[dir])) return(TriggerTrap(ch, i)); } return(FALSE); }
int CheckForInsideTrap(struct char_data *ch, struct obj_data *i) { struct obj_data *t; if(DEBUG) dlog("CheckForInsideTrap"); for (t = i->contains; t; t = t->next_content) { if ((ITEM_TYPE(t) == ITEM_TRAP) && (IS_SET(GET_TRAP_EFF(t),TRAP_EFF_OBJECT)) && (GET_TRAP_CHARGES(t) > 0)) { return(TriggerTrap(ch, t)); } } return(FALSE); }
void Highlightable::TryDisarm(Actor *actor) { if (!Trapped || !TrapDetected) return; int skill = actor->GetStat(IE_TRAPS); int roll = 0; int bonus = 0; int trapDC = TrapRemovalDiff; if (core->HasFeature(GF_3ED_RULES)) { skill = actor->GetSkill(IE_TRAPS); roll = core->Roll(1, 20, 0); bonus = actor->GetAbilityBonus(IE_INT); trapDC = TrapRemovalDiff/7 + 10; // oddity from the original if (skill == 0) { // a trained skill trapDC = 100; } } else { roll = core->Roll(1, skill/2, 0); skill /= 2; } int check = skill + roll + bonus; if (check > trapDC) { AddTrigger(TriggerEntry(trigger_disarmed, actor->GetGlobalID())); //trap removed Trapped = 0; if (core->HasFeature(GF_3ED_RULES)) { // ~Successful Disarm Device - d20 roll %d + Disarm Device skill %d + INT mod %d >= Trap DC %d~ displaymsg->DisplayRollStringName(39266, DMC_LIGHTGREY, actor, roll, skill-bonus, bonus, trapDC); } displaymsg->DisplayConstantStringName(STR_DISARM_DONE, DMC_LIGHTGREY, actor); int xp = actor->CalculateExperience(XP_DISARM, actor->GetXPLevel(1)); Game *game = core->GetGame(); game->ShareXP(xp, SX_DIVIDE); core->GetGameControl()->ResetTargetMode(); core->PlaySound(DS_DISARMED); } else { if (core->HasFeature(GF_3ED_RULES)) { // ~Failed Disarm Device - d20 roll %d + Disarm Device skill %d + INT mod %d >= Trap DC %d~ displaymsg->DisplayRollStringName(39266, DMC_LIGHTGREY, actor, roll, skill-bonus, bonus, trapDC); } displaymsg->DisplayConstantStringName(STR_DISARM_FAIL, DMC_LIGHTGREY, actor); TriggerTrap(skill, actor->GetGlobalID()); } ImmediateEvent(); }
void Highlightable::TryDisarm(Actor *actor) { if (!Trapped || !TrapDetected) return; int skill = actor->GetStat(IE_TRAPS); if (skill/2+core->Roll(1,skill/2,0)>TrapRemovalDiff) { AddTrigger(TriggerEntry(trigger_disarmed, actor->GetGlobalID())); //trap removed Trapped = 0; displaymsg->DisplayConstantStringName(STR_DISARM_DONE, DMC_LIGHTGREY, actor); int xp = actor->CalculateExperience(XP_DISARM, actor->GetXPLevel(1)); Game *game = core->GetGame(); game->ShareXP(xp, SX_DIVIDE); } else { displaymsg->DisplayConstantStringName(STR_DISARM_FAIL, DMC_LIGHTGREY, actor); TriggerTrap(skill, actor->GetGlobalID()); } ImmediateEvent(); }