public boolean isGoodSafehouse(Room target) { if (target == null) return false; if ((target.domainType() == Room.DOMAIN_INDOORS_WOOD) || (target.domainType() == Room.DOMAIN_INDOORS_STONE)) for (int d = Directions.NUM_DIRECTIONS() - 1; d >= 0; d--) { Room R = target.getRoomInDir(d); if ((R != null) && (R.domainType() == Room.DOMAIN_OUTDOORS_CITY)) return true; } return false; }
public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; Room target = mob.location(); if ((auto) && (givenTarget != null) && (givenTarget instanceof Room)) target = (Room) givenTarget; Ability A = target.fetchEffect(ID()); if (A != null) { mob.tell("This place is already a safehouse."); return false; } if ((!auto) && (CMLib.law().getLegalBehavior(target) == null)) { mob.tell("There is no law here!"); return false; } if (!isGoodSafehouse(target)) { TrackingLibrary.TrackingFlags flags; flags = new TrackingLibrary.TrackingFlags() .plus(TrackingLibrary.TrackingFlag.OPENONLY) .plus(TrackingLibrary.TrackingFlag.AREAONLY) .plus(TrackingLibrary.TrackingFlag.NOEMPTYGRIDS) .plus(TrackingLibrary.TrackingFlag.NOAIR) .plus(TrackingLibrary.TrackingFlag.NOWATER); List<Room> V = CMLib.tracking().getRadiantRooms(target, flags, 50 + (2 * getXLEVELLevel(mob))); Room R = null; int v = 0; for (; v < V.size(); v++) { R = (Room) V.get(v); if ((isGoodSafehouse(R)) && (!isLawHere(R))) break; } mob.tell("A place like this can't be a safehouse."); if ((isGoodSafehouse(R)) && (!isLawHere(R))) { V = CMLib.tracking() .findBastardTheBestWay( target, new XVector(R), flags, 50 + (2 * getXLEVELLevel(mob))); StringBuffer trail = new StringBuffer(""); int dir = CMLib.tracking().trackNextDirectionFromHere(V, target, true); while (target != R) { if ((dir < 0) || (dir >= Directions.NUM_DIRECTIONS()) || (target == null)) break; trail.append(Directions.getDirectionName(dir)); if (target.getRoomInDir(dir) != R) trail.append(", "); target = target.getRoomInDir(dir); dir = CMLib.tracking().trackNextDirectionFromHere(V, target, true); } if (target == R) mob.tell("You happen to know of one nearby though. Go: " + trail.toString()); } return false; } boolean success = proficiencyCheck(mob, 0, auto); CMMsg msg = CMClass.getMsg( mob, null, this, auto ? CMMsg.MASK_ALWAYS : CMMsg.MSG_DELICATE_HANDS_ACT, CMMsg.MSG_OK_VISUAL, CMMsg.MSG_OK_VISUAL, auto ? "" : "<S-NAME> hide(s) out from the law here."); if (!success) return beneficialVisualFizzle( mob, null, auto ? "" : "<S-NAME> attempt(s) hide out from the law here, but things are just too hot."); else if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); beneficialAffect(mob, target, asLevel, (CMProps.getIntVar(CMProps.SYSTEMI_TICKSPERMUDMONTH))); } return success; }
public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { boolean saveTheTrap = false; if ((commands.size() > 0) && (commands.lastElement() instanceof Boolean)) { saveTheTrap = ((Boolean) commands.lastElement()).booleanValue(); commands.removeElementAt(commands.size() - 1); } String whatTounlock = CMParms.combine(commands, 0); Physical unlockThis = null; int dirCode = Directions.getGoodDirectionCode(whatTounlock); Room R = mob.location(); Room nextRoom = null; if (dirCode >= 0) { nextRoom = R.getRoomInDir(dirCode); unlockThis = R.getExitInDir(dirCode); } if ((unlockThis == null) && (whatTounlock.equalsIgnoreCase("room") || whatTounlock.equalsIgnoreCase("here"))) unlockThis = R; if (unlockThis == null) unlockThis = getAnyTarget(mob, commands, givenTarget, Wearable.FILTER_UNWORNONLY); if (unlockThis == null) return false; int oldProficiency = proficiency(); if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; boolean success = proficiencyCheck( mob, +(((mob.phyStats().level() + (getXLEVELLevel(mob) * 2)) - unlockThis.phyStats().level()) * 3), auto); Vector<Physical> permSetV = new Vector<Physical>(); Trap theTrap = CMLib.utensils().fetchMyTrap(unlockThis); if (theTrap != null) permSetV.addElement(unlockThis); Trap opTrap = null; boolean permanent = false; if ((unlockThis instanceof Room) && (CMLib.law().doesOwnThisProperty(mob, ((Room) unlockThis)))) permanent = true; else if (unlockThis instanceof Exit) { Room R2 = null; if (dirCode < 0) for (int d = Directions.NUM_DIRECTIONS() - 1; d >= 0; d--) if (R.getExitInDir(d) == unlockThis) { dirCode = d; R2 = R.getRoomInDir(d); break; } if ((CMLib.law().doesOwnThisProperty(mob, R)) || ((R2 != null) && (CMLib.law().doesOwnThisProperty(mob, R2)))) permanent = true; if (dirCode >= 0) { Exit exit = R.getReverseExit(dirCode); if (exit != null) opTrap = CMLib.utensils().fetchMyTrap(exit); if (opTrap != null) permSetV.addElement(exit); Trap roomTrap = null; if (nextRoom != null) roomTrap = CMLib.utensils().fetchMyTrap(nextRoom); if (roomTrap != null) permSetV.addElement(nextRoom); if ((theTrap != null) && (theTrap.disabled()) && (roomTrap != null)) { opTrap = null; unlockThis = nextRoom; theTrap = roomTrap; } } } if (unlockThis == null) { mob.tell("You can't seem to remember how this works."); return false; } CMMsg msg = CMClass.getMsg( mob, unlockThis, this, auto ? CMMsg.MSG_OK_ACTION : CMMsg.MSG_DELICATE_HANDS_ACT, CMMsg.MSG_DELICATE_HANDS_ACT, CMMsg.MSG_OK_ACTION, auto ? unlockThis.name() + " begins to glow." : "<S-NAME> attempt(s) to safely deactivate a trap on " + unlockThis.name() + "."); if ((success) && (!lastDone.contains("" + unlockThis))) { while (lastDone.size() > 40) lastDone.removeElementAt(0); lastDone.addElement("" + unlockThis); msg.setValue(1); } else msg.setValue(0); if (R.okMessage(mob, msg)) { R.send(mob, msg); if ((unlockThis == lastChecked) && ((theTrap == null) || (theTrap.disabled()))) setProficiency(oldProficiency); if (success) { if (theTrap != null) { theTrap.disable(); if (saveTheTrap) commands.addElement(theTrap); } if (opTrap != null) { opTrap.disable(); if (saveTheTrap) commands.addElement(opTrap); } if (permanent) { for (int i = 0; i < permSetV.size(); i++) { if (theTrap != null) { theTrap.unInvoke(); ((Physical) permSetV.elementAt(i)).delEffect(theTrap); } if (opTrap != null) { opTrap.unInvoke(); ((Physical) permSetV.elementAt(i)).delEffect(opTrap); } } CMLib.database().DBUpdateRoom(R); CMLib.database().DBUpdateExits(R); } } if ((!auto) && (!saveTheTrap)) mob.tell("You have completed your attempt."); lastChecked = unlockThis; } return success; }