Beispiel #1
0
 public boolean okMessage(final Environmental myHost, final CMMsg msg) {
   if (!super.okMessage(myHost, msg)) return false;
   if (msg.amITarget(this)) {
     MOB mob = msg.source();
     switch (msg.targetMinor()) {
       case CMMsg.TYP_DRINK:
         if ((mob.isMine(this))
             || (phyStats().weight() > 1000)
             || (!CMLib.flags().isGettable(this))) {
           if (!containsDrink()) {
             mob.tell(name() + " is empty.");
             return false;
           }
           if ((liquidType() == RawMaterial.RESOURCE_SALTWATER)
               || (liquidType() == RawMaterial.RESOURCE_LAMPOIL)) {
             mob.tell(
                 "You don't want to be drinking "
                     + RawMaterial.CODES.NAME(liquidType()).toLowerCase()
                     + ".");
             return false;
           }
           return true;
         }
         mob.tell("You don't have that.");
         return false;
       case CMMsg.TYP_FILL:
         if ((liquidRemaining() >= amountOfLiquidHeld) && (liquidHeld() < 500000)) {
           mob.tell(name() + " is full.");
           return false;
         }
         if ((msg.tool() != null)
             && (msg.tool() != msg.target())
             && (msg.tool() instanceof Drink)) {
           Drink thePuddle = (Drink) msg.tool();
           if (!thePuddle.containsDrink()) {
             mob.tell(thePuddle.name() + " is empty.");
             return false;
           }
           if ((liquidRemaining() > 0) && (liquidType() != thePuddle.liquidType())) {
             mob.tell(
                 "There is still some "
                     + RawMaterial.CODES.NAME(liquidType()).toLowerCase()
                     + " left in "
                     + name()
                     + ".  You must empty it before you can fill it with "
                     + RawMaterial.CODES.NAME(thePuddle.liquidType()).toLowerCase()
                     + ".");
             return false;
           }
           return true;
         }
         mob.tell("You can't fill " + name() + " from that.");
         return false;
       default:
         break;
     }
   }
   return true;
 }
Beispiel #2
0
  public void executeMsg(final Environmental myHost, final CMMsg msg) {
    if (msg.source().riding() == this) {
      CMLib.commands().handleHygenicMessage(msg, 0, PlayerStats.HYGIENE_WATERCLEAN);
    }

    if (msg.amITarget(this)) {
      MOB mob = msg.source();
      switch (msg.targetMinor()) {
        case CMMsg.TYP_DRINK:
          amountOfLiquidRemaining -= amountOfThirstQuenched;
          boolean thirsty = mob.curState().getThirst() <= 0;
          boolean full =
              !mob.curState()
                  .adjThirst(amountOfThirstQuenched, mob.maxState().maxThirst(mob.baseWeight()));
          if (thirsty) mob.tell("You are no longer thirsty.");
          else if (full) mob.tell("You have drunk all you can.");
          if (disappearsAfterDrinking) {
            destroy();
            return;
          }
          break;
        case CMMsg.TYP_FILL:
          if ((msg.tool() != null) && (msg.tool() instanceof Drink)) {
            Drink thePuddle = (Drink) msg.tool();
            int amountToTake = amountTakenToFillMe(thePuddle);
            thePuddle.setLiquidRemaining(thePuddle.liquidRemaining() - amountToTake);
            if (amountOfLiquidRemaining <= 0) setLiquidType(thePuddle.liquidType());
            if (((long) amountOfLiquidRemaining + (long) amountToTake) <= (long) Integer.MAX_VALUE)
              amountOfLiquidRemaining += amountToTake;
            if (amountOfLiquidRemaining > amountOfLiquidHeld)
              amountOfLiquidRemaining = amountOfLiquidHeld;
            if ((amountOfLiquidRemaining <= 0) && (disappearsAfterDrinking)) {
              destroy();
              return;
            }
          }
          break;
        default:
          break;
      }
    }
    super.executeMsg(myHost, msg);
  }
  public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) {
    int autoGenerate = 0;
    if ((auto) && (commands.size() > 0) && (commands.firstElement() instanceof Integer)) {
      autoGenerate = ((Integer) commands.firstElement()).intValue();
      commands.removeElementAt(0);
      givenTarget = null;
    }
    DVector enhancedTypes = enhancedTypes(mob, commands);
    randomRecipeFix(mob, addRecipes(mob, loadRecipes()), commands, autoGenerate);
    if (commands.size() == 0) {
      commonTell(
          mob,
          "Make what? Enter \"mleatherwork list\" for a list, \"mleatherwork refit <item>\" to resize, \"mleatherwork learn <item>\", \"mleatherwork scan\", or \"mleatherwork mend <item>\".");
      return false;
    }
    if ((!auto)
        && (commands.size() > 0)
        && (((String) commands.firstElement()).equalsIgnoreCase("bundle"))) {
      bundling = true;
      if (super.invoke(mob, commands, givenTarget, auto, asLevel))
        return super.bundle(mob, commands);
      return false;
    }
    List<List<String>> recipes = addRecipes(mob, loadRecipes());
    String str = (String) commands.elementAt(0);
    playSound = "scissor.wav";
    String startStr = null;
    bundling = false;
    int multiplier = 4;
    int duration = 4;
    if (str.equalsIgnoreCase("list")) {
      String mask = CMParms.combine(commands, 1);
      StringBuffer buf = new StringBuffer("");
      int toggler = 1;
      int toggleTop = 2;
      for (int r = 0; r < toggleTop; r++)
        buf.append(
            CMStrings.padRight("Item", 30)
                + " "
                + CMStrings.padRight("Lvl", 3)
                + " "
                + CMStrings.padRight("Amt", 3)
                + " ");
      buf.append("\n\r");
      for (int r = 0; r < recipes.size(); r++) {
        List<String> V = recipes.get(r);
        if (V.size() > 0) {
          String item = replacePercent((String) V.get(RCP_FINALNAME), "");
          int level = CMath.s_int((String) V.get(RCP_LEVEL));
          String wood = getComponentDescription(mob, V, RCP_WOOD);
          if (wood.length() > 5) {
            if (toggler > 1) buf.append("\n\r");
            toggler = toggleTop;
          }
          if ((level <= xlevel(mob))
              && ((mask == null)
                  || (mask.length() == 0)
                  || mask.equalsIgnoreCase("all")
                  || CMLib.english().containsString(item, mask))) {
            buf.append(
                CMStrings.padRight(item, 30)
                    + " "
                    + CMStrings.padRight("" + (level), 3)
                    + " "
                    + CMStrings.padRightPreserve("" + wood, 3)
                    + ((toggler != toggleTop) ? " " : "\n\r"));
            if (++toggler > toggleTop) toggler = 1;
          }
        }
      }
      if (toggler != 1) buf.append("\n\r");
      commonTell(mob, buf.toString());
      enhanceList(mob);
      return true;
    } else if ((commands.firstElement() instanceof String)
        && (((String) commands.firstElement())).equalsIgnoreCase("learn")) {
      return doLearnRecipe(mob, commands, givenTarget, auto, asLevel);
    } else if (str.equalsIgnoreCase("scan")) return publicScan(mob, commands);
    else if (str.equalsIgnoreCase("mend")) {
      building = null;
      activity = CraftingActivity.CRAFTING;
      messedUp = false;
      Vector newCommands = CMParms.parse(CMParms.combine(commands, 1));
      building =
          getTarget(mob, mob.location(), givenTarget, newCommands, Wearable.FILTER_UNWORNONLY);
      if (!canMend(mob, building, false)) return false;
      activity = CraftingActivity.MENDING;
      if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false;
      startStr = "<S-NAME> start(s) mending " + building.name() + ".";
      displayText = "You are mending " + building.name();
      verb = "mending " + building.name();
    } else if (str.equalsIgnoreCase("refit")) {
      building = null;
      activity = CraftingActivity.CRAFTING;
      messedUp = false;
      Vector newCommands = CMParms.parse(CMParms.combine(commands, 1));
      building =
          getTarget(mob, mob.location(), givenTarget, newCommands, Wearable.FILTER_UNWORNONLY);
      if (building == null) return false;
      if ((building.material() & RawMaterial.MATERIAL_MASK) != RawMaterial.MATERIAL_LEATHER) {
        commonTell(mob, "That's not made of leather.  That can't be refitted.");
        return false;
      }
      if (!(building instanceof Armor)) {
        commonTell(mob, "You don't know how to refit that sort of thing.");
        return false;
      }
      if (building.phyStats().height() == 0) {
        commonTell(mob, building.name() + " is already the right size.");
        return false;
      }
      activity = CraftingActivity.REFITTING;
      if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false;
      startStr = "<S-NAME> start(s) refitting " + building.name() + ".";
      displayText = "You are refitting " + building.name();
      verb = "refitting " + building.name();
    } else {
      building = null;
      activity = CraftingActivity.CRAFTING;
      messedUp = false;
      aborted = false;
      int amount = -1;
      if ((commands.size() > 1) && (CMath.isNumber((String) commands.lastElement()))) {
        amount = CMath.s_int((String) commands.lastElement());
        commands.removeElementAt(commands.size() - 1);
      }
      String recipeName = CMParms.combine(commands, 0);
      List<String> foundRecipe = null;
      List<List<String>> matches = matchingRecipeNames(recipes, recipeName, true);
      for (int r = 0; r < matches.size(); r++) {
        List<String> V = matches.get(r);
        if (V.size() > 0) {
          String name = (String) V.get(RCP_FINALNAME);
          int level = CMath.s_int((String) V.get(RCP_LEVEL));
          if ((level <= xlevel(mob)) && (name.toUpperCase().indexOf("BATTLEMOULDED") >= 0)) {
            multiplier = 9;
            foundRecipe = V;
            break;
          } else if ((level <= xlevel(mob)) && (name.toUpperCase().indexOf("LAMINAR") >= 0)) {
            multiplier = 8;
            foundRecipe = V;
            break;
          } else if ((level <= (xlevel(mob))) && (name.toUpperCase().indexOf("MASTERWORK") >= 0)) {
            multiplier = 7;
            foundRecipe = V;
            break;
          } else if ((level <= xlevel(mob)) && (name.toUpperCase().indexOf("REINFORCED") >= 0)) {
            multiplier = 6;
            foundRecipe = V;
            break;
          } else if ((level <= (xlevel(mob))) && (name.toUpperCase().indexOf("CUIRBOULI") >= 0)) {
            multiplier = 5;
            foundRecipe = V;
            break;
          } else if (level <= (xlevel(mob))) {
            multiplier = 4;
            foundRecipe = V;
            break;
          }
        }
      }
      if (foundRecipe == null) {
        commonTell(
            mob,
            "You don't know how to make a '"
                + recipeName
                + "'.  Try \"mleatherwork list\" for a list.");
        return false;
      }

      final String woodRequiredStr = (String) foundRecipe.get(RCP_WOOD);
      final List<Object> componentsFoundList =
          getAbilityComponents(
              mob,
              woodRequiredStr,
              "make " + CMLib.english().startWithAorAn(recipeName),
              autoGenerate);
      if (componentsFoundList == null) return false;
      int woodRequired = CMath.s_int(woodRequiredStr);
      woodRequired = adjustWoodRequired(woodRequired, mob);

      if (amount > woodRequired) woodRequired = amount;
      int[] pm = {RawMaterial.MATERIAL_LEATHER};
      int[] pm1 = {RawMaterial.MATERIAL_METAL, RawMaterial.MATERIAL_MITHRIL};
      String misctype = (String) foundRecipe.get(RCP_MISCTYPE);
      bundling = misctype.equalsIgnoreCase("BUNDLE");
      int[][] data =
          fetchFoundResourceData(
              mob,
              woodRequired,
              "leather",
              pm,
              (multiplier == 6) ? 1 : 0,
              (multiplier == 6) ? "metal" : null,
              (multiplier == 6) ? pm1 : null,
              bundling,
              autoGenerate,
              enhancedTypes);
      if (data == null) return false;
      fixDataForComponents(data, componentsFoundList);
      woodRequired = data[0][FOUND_AMT];
      if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false;
      int lostValue =
          autoGenerate > 0
              ? 0
              : CMLib.materials()
                      .destroyResources(
                          mob.location(),
                          woodRequired,
                          data[0][FOUND_CODE],
                          data[1][FOUND_CODE],
                          null)
                  + CMLib.ableMapper().destroyAbilityComponents(componentsFoundList);
      building = CMClass.getItem((String) foundRecipe.get(RCP_CLASSTYPE));
      if (building == null) {
        commonTell(mob, "There's no such thing as a " + foundRecipe.get(RCP_CLASSTYPE) + "!!!");
        return false;
      }
      duration =
          getDuration(multiplier * CMath.s_int((String) foundRecipe.get(RCP_TICKS)), mob, 30, 4);
      String itemName =
          (replacePercent(
                  (String) foundRecipe.get(RCP_FINALNAME),
                  RawMaterial.CODES.NAME(data[0][FOUND_CODE])))
              .toLowerCase();
      if (bundling) itemName = "a " + woodRequired + "# " + itemName;
      else if (itemName.endsWith("s")) itemName = "some " + itemName;
      else itemName = CMLib.english().startWithAorAn(itemName);
      building.setName(itemName);
      startStr = "<S-NAME> start(s) making " + building.name() + ".";
      displayText = "You are making " + building.name();
      verb = "making " + building.name();
      building.setDisplayText(itemName + " lies here");
      building.setDescription(itemName + ". ");
      building
          .basePhyStats()
          .setWeight(
              (int) Math.round((double) woodRequired * this.getItemWeightMultiplier(bundling)));
      building.setBaseValue(CMath.s_int((String) foundRecipe.get(RCP_VALUE)) * multiplier);
      building.setMaterial(data[0][FOUND_CODE]);
      building.setSecretIdentity(getBrand(mob));
      int hardness = RawMaterial.CODES.HARDNESS(data[0][FOUND_CODE]) - 2;
      building
          .basePhyStats()
          .setLevel(CMath.s_int((String) foundRecipe.get(RCP_LEVEL)) + (2 * hardness));
      int capacity = CMath.s_int((String) foundRecipe.get(RCP_CAPACITY));
      long canContain = getContainerType((String) foundRecipe.get(RCP_CONTAINMASK));
      int armordmg = CMath.s_int((String) foundRecipe.get(RCP_ARMORDMG));
      if (armordmg != 0) armordmg = armordmg + (multiplier - 1);
      if (bundling) building.setBaseValue(lostValue);
      String spell =
          (foundRecipe.size() > RCP_SPELL) ? ((String) foundRecipe.get(RCP_SPELL)).trim() : "";
      addSpells(building, spell);
      if (building instanceof Weapon) {
        ((Weapon) building)
            .basePhyStats()
            .setAttackAdjustment(abilityCode() + (hardness * 5) + (abilityCode() - 1) - 1);
        ((Weapon) building).setWeaponClassification(Weapon.CLASS_FLAILED);
        setWeaponTypeClass((Weapon) building, misctype, Weapon.TYPE_SLASHING);
        building.basePhyStats().setDamage(armordmg + hardness);
        ((Weapon) building).setRawProperLocationBitmap(Wearable.WORN_WIELD | Wearable.WORN_HELD);
        ((Weapon) building).setRawLogicalAnd((capacity > 1));
      }
      if (building instanceof Armor) {
        if (capacity > 0) {
          ((Armor) building).setCapacity(capacity + woodRequired);
          ((Armor) building).setContainTypes(canContain);
        }
        ((Armor) building).basePhyStats().setArmor(0);
        if (armordmg != 0)
          ((Armor) building).basePhyStats().setArmor(armordmg + (abilityCode() - 1) + hardness);
        setWearLocation(building, misctype, 0);
      }
      if (building instanceof Drink) {
        if (CMLib.flags().isGettable(building)) {
          ((Drink) building).setLiquidRemaining(0);
          ((Drink) building).setLiquidHeld(capacity * 50);
          ((Drink) building).setThirstQuenched(250);
          if ((capacity * 50) < 250) ((Drink) building).setThirstQuenched(capacity * 50);
        }
      }
      building.recoverPhyStats();
      building.text();
      building.recoverPhyStats();
    }

    messedUp = !proficiencyCheck(mob, 0, auto);

    if (bundling) {
      messedUp = false;
      duration = 1;
      verb = "bundling " + RawMaterial.CODES.NAME(building.material()).toLowerCase();
      startStr = "<S-NAME> start(s) " + verb + ".";
      displayText = "You are " + verb;
    }

    if (autoGenerate > 0) {
      commands.addElement(building);
      return true;
    }

    CMMsg msg = CMClass.getMsg(mob, building, this, CMMsg.MSG_NOISYMOVEMENT, startStr);
    if (mob.location().okMessage(mob, msg)) {
      mob.location().send(mob, msg);
      building = (Item) msg.target();
      beneficialAffect(mob, mob, asLevel, duration);
      enhanceItem(mob, building, enhancedTypes);
    } else if (bundling) {
      messedUp = false;
      aborted = false;
      unInvoke();
    }
    return true;
  }
Beispiel #4
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;
  }
Beispiel #5
0
 public int amountTakenToFillMe(Drink theSource) {
   int amountToTake = amountOfLiquidHeld - amountOfLiquidRemaining;
   if (amountOfLiquidHeld >= 500000) amountToTake = theSource.liquidRemaining();
   if (amountToTake > theSource.liquidRemaining()) amountToTake = theSource.liquidRemaining();
   return amountToTake;
 }