Ejemplo n.º 1
0
  @Override
  public void executeMsg(Environmental affecting, CMMsg msg) {
    super.executeMsg(affecting, msg);
    final MOB source = msg.source();
    if (!canFreelyBehaveNormal(affecting)) return;
    final MOB observer = (MOB) affecting;

    if ((source != observer)
        && (msg.amITarget(observer))
        && (msg.targetMinor() == CMMsg.TYP_GIVE)
        && (msg.tool() instanceof Coins)) {
      if ((CMLib.flags().canBeSeenBy(source, observer))
          && (CMLib.flags().canBeSeenBy(observer, source))) {
        double value = ((Coins) msg.tool()).getTotalValue();
        final String currency = ((Coins) msg.tool()).getCurrency().toUpperCase();
        double takeCut = getMyCut(affecting, currency);
        double amountToTake = CMLib.beanCounter().abbreviatedRePrice(observer, value * takeCut);
        if ((amountToTake > 0.0)
            && (amountToTake
                < CMLib.beanCounter()
                    .getLowestDenomination(CMLib.beanCounter().getCurrency(observer))))
          amountToTake =
              CMLib.beanCounter().getLowestDenomination(CMLib.beanCounter().getCurrency(observer));
        value -= amountToTake;
        observer.recoverPhyStats();
        final Coins C = CMLib.beanCounter().makeBestCurrency(observer, value);
        if ((value > 0.0) && (C != null)) {
          // this message will actually end up triggering the hand-over.
          final CMMsg newMsg =
              CMClass.getMsg(
                  observer,
                  source,
                  C,
                  CMMsg.MSG_SPEAK,
                  L("^T<S-NAME> say(s) 'Thank you for your business' to <T-NAMESELF>.^?"));
          C.setOwner(observer);
          final long num = C.getNumberOfCoins();
          final String curr = C.getCurrency();
          final double denom = C.getDenomination();
          C.destroy();
          C.setNumberOfCoins(num);
          C.setCurrency(curr);
          C.setDenomination(denom);
          msg.addTrailerMsg(newMsg);
        } else CMLib.commands().postSay(observer, source, L("Gee, thanks. :)"), true, false);
        ((Coins) msg.tool()).destroy();
      } else if (!CMLib.flags().canBeSeenBy(source, observer))
        CMLib.commands()
            .postSay(observer, null, L("Wha?  Where did this come from?  Cool!"), true, false);
    } else if ((msg.source() == observer)
        && (msg.target() instanceof MOB)
        && (msg.targetMinor() == CMMsg.TYP_SPEAK)
        && (msg.tool() instanceof Coins)
        && (((Coins) msg.tool()).amDestroyed())
        && (!msg.source().isMine(msg.tool()))
        && (!((MOB) msg.target()).isMine(msg.tool())))
      CMLib.beanCounter()
          .giveSomeoneMoney(msg.source(), (MOB) msg.target(), ((Coins) msg.tool()).getTotalValue());
  }
Ejemplo n.º 2
0
  public boolean execute(MOB mob, Vector commands, int metaFlags) throws java.io.IOException {
    String whatToDrop = null;
    Environmental target = mob;
    Vector V = new Vector();
    if (commands.size() < 2) {
      mob.tell("Empty what where?");
      return false;
    }
    commands.removeElementAt(0);
    if (commands.size() > 1) {
      String s = (String) commands.lastElement();
      if (s.equalsIgnoreCase("here")) target = mob.location();
      else if (s.equalsIgnoreCase("me")) target = mob;
      else if (s.equalsIgnoreCase("self")) target = mob;
      else if ("INVENTORY".startsWith(s.toUpperCase())) target = mob;
      else if (s.equalsIgnoreCase("floor")) target = mob.location();
      else if (s.equalsIgnoreCase("ground")) target = mob.location();
      else {
        target =
            CMLib.english().possibleContainer(mob, commands, false, Wearable.FILTER_UNWORNONLY);
        if (target == null) target = mob.location().fetchFromRoomFavorItems(null, s);
        else commands.addElement("delme");
      }
      if (target != null) commands.removeElementAt(commands.size() - 1);
    }

    if ((target == null) || (!CMLib.flags().canBeSeenBy(target, mob))) {
      mob.tell("Empty it where?");
      return false;
    }

    int maxToDrop = CMLib.english().calculateMaxToGive(mob, commands, true, mob, false);
    if (maxToDrop < 0) return false;

    whatToDrop = CMParms.combine(commands, 0);
    boolean allFlag =
        (commands.size() > 0) ? ((String) commands.elementAt(0)).equalsIgnoreCase("all") : false;
    if (whatToDrop.toUpperCase().startsWith("ALL.")) {
      allFlag = true;
      whatToDrop = "ALL " + whatToDrop.substring(4);
    }
    if (whatToDrop.toUpperCase().endsWith(".ALL")) {
      allFlag = true;
      whatToDrop = "ALL " + whatToDrop.substring(0, whatToDrop.length() - 4);
    }
    int addendum = 1;
    String addendumStr = "";
    Drink drink = null;
    boolean doBugFix = true;
    while (doBugFix || ((allFlag) && (addendum <= maxToDrop))) {
      doBugFix = false;
      Item dropThis = mob.fetchCarried(null, whatToDrop + addendumStr);
      if ((dropThis == null) && (V.size() == 0) && (addendumStr.length() == 0) && (!allFlag)) {
        dropThis = mob.fetchWornItem(whatToDrop);
        if ((dropThis != null) && (dropThis instanceof Container)) {
          if ((!dropThis.amWearingAt(Wearable.WORN_HELD))
              && (!dropThis.amWearingAt(Wearable.WORN_WIELD))) {
            mob.tell("You must remove that first.");
            return false;
          }
          CMMsg newMsg = CMClass.getMsg(mob, dropThis, null, CMMsg.MSG_REMOVE, null);
          if (mob.location().okMessage(mob, newMsg)) mob.location().send(mob, newMsg);
          else return false;
        }
      }
      if (dropThis == null) break;
      if (dropThis instanceof Drink) drink = (Drink) dropThis;
      if ((CMLib.flags().canBeSeenBy(dropThis, mob))
          && (dropThis instanceof Container)
          && (!V.contains(dropThis))) V.addElement(dropThis);
      addendumStr = "." + (++addendum);
    }

    String str = "<S-NAME> empt(ys) <T-NAME>";
    if (target instanceof Room) str += " here.";
    else if (target instanceof MOB) str += ".";
    else str += " into " + target.Name() + ".";

    if ((V.size() == 0) && (drink != null)) {
      mob.tell(drink.name() + " must be POURed out.");
      return false;
    }

    if (V.size() == 0) mob.tell("You don't seem to be carrying that.");
    else if ((V.size() == 1) && (V.firstElement() == target))
      mob.tell("You can't empty something into itself!");
    else if ((V.size() == 1)
        && (V.firstElement() instanceof Drink)
        && (!((Drink) V.firstElement()).containsDrink()))
      mob.tell(mob, (Drink) V.firstElement(), null, "<T-NAME> is already empty.");
    else
      for (int v = 0; v < V.size(); v++) {
        Container C = (Container) V.elementAt(v);
        if (C == target) continue;
        List<Item> V2 = C.getContents();

        boolean skipMessage = false;
        if ((C instanceof Drink) && (((Drink) C).containsDrink())) {
          if (target instanceof Drink) {
            Command C2 = CMClass.getCommand("Pour");
            C2.execute(
                mob,
                new XVector("POUR", "$" + C.Name() + "$", "$" + target.Name() + "$"),
                metaFlags);
            skipMessage = true;
          } else {
            ((Drink) C).setLiquidRemaining(0);
            if (((Drink) C).disappearsAfterDrinking()) C.destroy();
          }
        }
        CMMsg msg = CMClass.getMsg(mob, C, CMMsg.MSG_QUIETMOVEMENT, str);
        Room R = mob.location();
        if (skipMessage || (R.okMessage(mob, msg))) {
          if (!skipMessage) R.send(mob, msg);
          for (int v2 = 0; v2 < V2.size(); v2++) {
            Item I = (Item) V2.get(v2);
            if (I instanceof Coins) ((Coins) I).setContainer(null);
            if (((I.container() == null) || (Get.get(mob, C, I, true, null, true)))
                && (I.container() == null)) {
              if (target instanceof Room) drop(mob, I, true, true);
              else if (target instanceof Container) {
                CMMsg putMsg =
                    CMClass.getMsg(mob, target, I, CMMsg.MASK_OPTIMIZE | CMMsg.MSG_PUT, null);
                if (R.okMessage(mob, putMsg)) R.send(mob, putMsg);
              }
              if (I instanceof Coins) ((Coins) I).putCoinsBack();
              if (I instanceof RawMaterial) ((RawMaterial) I).rebundle();
            }
          }
        }
      }
    mob.location().recoverRoomStats();
    mob.location().recoverRoomStats();
    return false;
  }