예제 #1
0
 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;
 }
예제 #2
0
  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;
  }
예제 #3
0
  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;
  }