Пример #1
0
  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,
          "Weave what? Enter \"weave list\" for a list, \"weave refit <item>\" to resize, \"weave learn <item>\", \"weave scan\", or \"weave 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);
    bundling = false;
    String startStr = null;
    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", 22)
                + " "
                + CMStrings.padRight("Lvl", 3)
                + " "
                + CMStrings.padRight("Material", 10)
                + " ");
      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, 22)
                    + " "
                    + CMStrings.padRight("" + level, 3)
                    + " "
                    + CMStrings.padRightPreserve("" + wood, 10)
                    + ((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;
      key = null;
      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;
      key = null;
      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.RESOURCE_COTTON)
          && (building.material() != RawMaterial.RESOURCE_SILK)
          && (building.material() != RawMaterial.RESOURCE_HEMP)
          && (building.material() != RawMaterial.RESOURCE_VINE)
          && (building.material() != RawMaterial.RESOURCE_WHEAT)
          && (building.material() != RawMaterial.RESOURCE_SEAWEED)) {
        commonTell(mob, "That's not made of any sort of weavable material.  It 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;
      key = null;
      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) {
          int level = CMath.s_int((String) V.get(RCP_LEVEL));
          if (level <= xlevel(mob)) {
            foundRecipe = V;
            break;
          }
        }
      }
      if (foundRecipe == null) {
        commonTell(
            mob,
            "You don't know how to weave a '" + recipeName + "'.  Try \"weave 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.RESOURCE_COTTON,
        RawMaterial.RESOURCE_SILK,
        RawMaterial.RESOURCE_HEMP,
        RawMaterial.RESOURCE_VINE,
        RawMaterial.RESOURCE_WHEAT,
        RawMaterial.RESOURCE_SEAWEED
      };
      String misctype = (String) foundRecipe.get(RCP_MISCTYPE);
      String spell =
          (foundRecipe.size() > RCP_SPELL) ? ((String) foundRecipe.get(RCP_SPELL)).trim() : "";
      bundling = spell.equalsIgnoreCase("BUNDLE") || misctype.equalsIgnoreCase("BUNDLE");
      int[][] data =
          fetchFoundResourceData(
              mob,
              woodRequired,
              "weavable material",
              pm,
              0,
              null,
              null,
              false,
              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], 0, 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(
              CMath.s_int((String) foundRecipe.get(RCP_TICKS)),
              mob,
              CMath.s_int((String) foundRecipe.get(RCP_LEVEL)),
              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) weaving " + building.name() + ".";
      displayText = "You are weaving " + building.name();
      verb = "weaving " + 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)));
      building.setMaterial(data[0][FOUND_CODE]);
      building.basePhyStats().setLevel(CMath.s_int((String) foundRecipe.get(RCP_LEVEL)));
      building.setSecretIdentity(getBrand(mob));
      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 (bundling) {
        building.setBaseValue(lostValue);
        building.basePhyStats().setWeight(woodRequired);
      }
      addSpells(building, spell);
      if (building instanceof Weapon) {
        ((Weapon) building).setWeaponClassification(Weapon.CLASS_FLAILED);
        for (int cl = 0; cl < Weapon.CLASS_DESCS.length; cl++) {
          if (misctype.equalsIgnoreCase(Weapon.CLASS_DESCS[cl]))
            ((Weapon) building).setWeaponClassification(cl);
        }
        building.basePhyStats().setDamage(armordmg);
        ((Weapon) building).setRawProperLocationBitmap(Wearable.WORN_WIELD | Wearable.WORN_HELD);
        ((Weapon) building).setRawLogicalAnd((capacity > 1));
      }
      key = null;
      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));
        setWearLocation(building, misctype, 0);
      } else if (building instanceof Container) {
        if (capacity > 0) {
          ((Container) building).setCapacity(capacity + woodRequired);
          ((Container) building).setContainTypes(canContain);
        }
        if (misctype.equalsIgnoreCase("LID"))
          ((Container) building).setLidsNLocks(true, false, false, false);
        else if (misctype.equalsIgnoreCase("LOCK")) {
          ((Container) building).setLidsNLocks(true, false, true, false);
          ((Container) building).setKeyName(Double.toString(Math.random()));
          key = CMClass.getItem("GenKey");
          ((DoorKey) key).setKey(((Container) building).keyName());
          key.setName("a key");
          key.setDisplayText("a small key sits here");
          key.setDescription("looks like a key to " + building.name());
          key.recoverPhyStats();
          key.text();
        }
      }
      if (building instanceof Rideable) {
        setRideBasis((Rideable) building, misctype);
      }
      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) {
      if (key != null) commands.addElement(key);
      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;
  }
Пример #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;
  }