public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { String dir = CMParms.combine(commands, 0); if (commands.size() > 0) dir = (String) commands.lastElement(); int dirCode = Directions.getGoodDirectionCode(dir); if (!preInvoke(mob, commands, givenTarget, auto, asLevel, 0, 0.0)) return false; MOB highestMOB = getHighestLevelMOB(mob, null); int levelDiff = mob.phyStats().level() + (2 * super.getXLEVELLevel(mob)) - getMOBLevel(highestMOB); if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; boolean success = false; CMMsg msg = CMClass.getMsg( mob, null, this, auto ? CMMsg.MSG_OK_VISUAL : CMMsg.MSG_DELICATE_HANDS_ACT, "<S-NAME> walk(s) carefully " + Directions.getDirectionName(dirCode) + "."); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); if (levelDiff < 0) levelDiff = levelDiff * 8; else levelDiff = levelDiff * 10; success = proficiencyCheck(mob, levelDiff, auto); int oldDex = mob.baseCharStats().getStat(CharStats.STAT_DEXTERITY); if (success) mob.baseCharStats().setStat(CharStats.STAT_DEXTERITY, oldDex + 100); mob.recoverCharStats(); CMLib.tracking().walk(mob, dirCode, false, false); if (oldDex != mob.baseCharStats().getStat(CharStats.STAT_DEXTERITY)) mob.baseCharStats().setStat(CharStats.STAT_DEXTERITY, oldDex); mob.recoverCharStats(); } return success; }
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 void fixExits(Room R) { for (int d = Directions.NUM_DIRECTIONS() - 1; d >= 0; d--) { GrinderDir D = new GrinderDir(); Room R2 = R.rawDoors()[d]; if (R2 != null) { D.room = R2.roomID(); Exit E2 = R.getRawExit(d); if (E2 != null) D.exit = E2; } doors[d] = D; } }
public boolean preInvoke( MOB mob, List<String> commands, Physical givenTarget, boolean auto, int asLevel, int secondsElapsed, double actionsRemaining) { if (secondsElapsed == 0) { String dir = CMParms.combine(commands, 0); if (commands.size() > 0) dir = (String) commands.get(commands.size() - 1); int dirCode = Directions.getGoodDirectionCode(dir); if (dirCode < 0) { mob.tell("Step where?"); return false; } if (mob.isInCombat()) { mob.tell("Not while you are fighting!"); return false; } if ((mob.location().getRoomInDir(dirCode) == null) || (mob.location().getExitInDir(dirCode) == null)) { mob.tell("Step where?"); return false; } CMMsg msg = CMClass.getMsg( mob, null, this, auto ? CMMsg.MSG_OK_VISUAL : CMMsg.MSG_DELICATE_HANDS_ACT, "<S-NAME> start(s) walking carefully " + Directions.getDirectionName(dirCode) + "."); if (mob.location().okMessage(mob, msg)) mob.location().send(mob, msg); else return false; } return true; }
/* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ public class GrinderRoom { public int z = 0; public int[] xy = null; public String roomID = ""; private Room roomCache = null; public Room room() { if ((roomID.length() > 0) && ((roomCache == null) || (roomCache.amDestroyed()))) { roomCache = CMLib.map().getRoom(roomID); if (roomCache != null) fixExits(roomCache); } return roomCache; } public boolean isRoomGood() { return ((roomCache != null) && (!roomCache.amDestroyed())); } public GrinderDir[] doors = new GrinderDir[Directions.NUM_DIRECTIONS()]; public GrinderRoom(String newRoomID) { roomCache = null; roomID = newRoomID; } public void fixExits(Room R) { for (int d = Directions.NUM_DIRECTIONS() - 1; d >= 0; d--) { GrinderDir D = new GrinderDir(); Room R2 = R.rawDoors()[d]; if (R2 != null) { D.room = R2.roomID(); Exit E2 = R.getRawExit(d); if (E2 != null) D.exit = E2; } doors[d] = D; } } public GrinderRoom(Room R) { roomCache = null; if (!R.amDestroyed()) { roomCache = R; fixExits(R); } roomID = R.roomID(); } }
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; }
public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { String whom = CMParms.combine(commands, 0); int dirCode = Directions.getGoodDirectionCode(whom); if (!CMLib.flags().canHear(mob)) { mob.tell("You don't hear anything."); return false; } if (room != null) for (final Enumeration<Ability> a = room.effects(); a.hasMoreElements(); ) { final Ability A = a.nextElement(); if ((A.ID().equals(ID())) && (invoker() == mob)) A.unInvoke(); } room = null; if (dirCode < 0) room = mob.location(); else { if ((mob.location().getRoomInDir(dirCode) == null) || (mob.location().getExitInDir(dirCode) == null)) { mob.tell("Listen which direction?"); return false; } room = mob.location().getRoomInDir(dirCode); if ((room.domainType() & Room.INDOORS) == 0) { mob.tell("You can only listen indoors."); return false; } } if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; boolean success = false; CMMsg msg = CMClass.getMsg( mob, null, this, auto ? CMMsg.MSG_OK_ACTION : (CMMsg.MSG_DELICATE_SMALL_HANDS_ACT), CMMsg.MSG_OK_VISUAL, CMMsg.MSG_OK_VISUAL, "<S-NAME> listen(s)" + ((dirCode < 0) ? "" : " " + Directions.getDirectionName(dirCode)) + "."); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); success = proficiencyCheck(mob, 0, auto); int numberHeard = 0; int levelsHeard = 0; for (int i = 0; i < room.numInhabitants(); i++) { MOB inhab = room.fetchInhabitant(i); if ((inhab != null) && (!CMLib.flags().isSneaking(inhab)) && (!CMLib.flags().isHidden(inhab)) && (inhab != mob)) { numberHeard++; if (inhab.phyStats().level() > (mob.phyStats().level() + (2 * super.getXLEVELLevel(mob)))) levelsHeard += (inhab.phyStats().level() - (mob.phyStats().level() + (2 * super.getXLEVELLevel(mob)))); } } if ((success) && (numberHeard > 0)) { if (((proficiency() + (getXLEVELLevel(mob) * 10)) > (50 + levelsHeard)) || (room == mob.location())) { mob.tell("You definitely hear " + numberHeard + " creature(s)."); if (proficiency() > ((room == mob.location()) ? 50 : 75)) { sourceRoom = mob.location(); beneficialAffect(mob, room, asLevel, ((room == mob.location()) ? 0 : 10)); } } else mob.tell("You definitely hear something."); } else mob.tell("You don't hear anything."); } return success; }