Beispiel #1
0
 protected StringBuilder getAbilities(
     MOB viewerM, MOB ableM, Vector ofTypes, int mask, boolean addQualLine, int maxLevel) {
   final int COL_LEN1 = ListingLibrary.ColFixer.fixColWidth(3.0, viewerM);
   final int COL_LEN2 = ListingLibrary.ColFixer.fixColWidth(18.0, viewerM);
   final int COL_LEN3 = ListingLibrary.ColFixer.fixColWidth(19.0, viewerM);
   int highestLevel = 0;
   final int lowestLevel = ableM.phyStats().level() + 1;
   final StringBuilder msg = new StringBuilder("");
   for (final Enumeration<Ability> a = ableM.allAbilities(); a.hasMoreElements(); ) {
     final Ability A = a.nextElement();
     int level = CMLib.ableMapper().qualifyingLevel(ableM, A);
     if (level < 0) level = 0;
     if ((A != null)
         && (level > highestLevel)
         && (level < lowestLevel)
         && (ofTypes.contains(Integer.valueOf(A.classificationCode() & mask))))
       highestLevel = level;
   }
   if ((maxLevel >= 0) && (maxLevel < highestLevel)) highestLevel = maxLevel;
   for (int l = 0; l <= highestLevel; l++) {
     final StringBuilder thisLine = new StringBuilder("");
     int col = 0;
     for (final Enumeration<Ability> a = ableM.allAbilities(); a.hasMoreElements(); ) {
       final Ability A = a.nextElement();
       int level = CMLib.ableMapper().qualifyingLevel(ableM, A);
       if (level < 0) level = 0;
       if ((A != null)
           && (level == l)
           && (ofTypes.contains(Integer.valueOf(A.classificationCode() & mask)))) {
         if (thisLine.length() == 0) thisLine.append("\n\rLevel ^!" + l + "^?:\n\r");
         if ((++col) > 3) {
           thisLine.append("\n\r");
           col = 1;
         }
         thisLine.append(
             "^N[^H"
                 + CMStrings.padRight(Integer.toString(A.proficiency()), COL_LEN1)
                 + "%^?]^N"
                 + " " // +(A.isAutoInvoked()?"^H.^N":" ")
                 + CMStrings.padRight(
                     "^<HELP^>" + A.name() + "^</HELP^>", (col == 3) ? COL_LEN2 : COL_LEN3));
       }
     }
     if (thisLine.length() > 0) msg.append(thisLine);
   }
   if (msg.length() == 0) msg.append(L("^!None!^?"));
   else if (addQualLine)
     msg.append(
         L(
             "\n\r\n\rUse QUALIFY to see additional skills you can GAIN.")); // ^H.^N =
                                                                             // passive/auto-invoked."));
   return msg;
 }
Beispiel #2
0
  @Override
  public boolean invoke(
      final MOB mob, Vector commands, Physical givenTarget, final boolean auto, final int asLevel) {
    final Vector originalCommands = (Vector) commands.clone();
    if (super.checkStop(mob, commands)) return true;

    fireRequired = true;

    final CraftParms parsedVars = super.parseAutoGenerate(auto, givenTarget, commands);
    givenTarget = parsedVars.givenTarget;

    final PairVector<Integer, Integer> enhancedTypes = enhancedTypes(mob, commands);
    randomRecipeFix(mob, addRecipes(mob, loadRecipes()), commands, parsedVars.autoGenerate);
    if (commands.size() == 0) {
      commonTell(
          mob,
          L(
              "Make what? Enter \"@x1 list\" for a list, \"@x2 learn <item>\" to gain recipes, or \"@x3 stop\" to cancel.",
              triggerStrings()[0].toLowerCase(),
              triggerStrings()[0].toLowerCase(),
              triggerStrings()[0].toLowerCase()));
      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;
    }
    final List<List<String>> recipes = addRecipes(mob, loadRecipes());
    final String str = (String) commands.elementAt(0);
    String startStr = null;
    bundling = false;
    int duration = 4;
    final int[] cols = {
      ListingLibrary.ColFixer.fixColWidth(16, mob.session()),
      ListingLibrary.ColFixer.fixColWidth(3, mob.session())
    };
    if (str.equalsIgnoreCase("list")) {
      String mask = CMParms.combine(commands, 1);
      boolean allFlag = false;
      if (mask.equalsIgnoreCase("all")) {
        allFlag = true;
        mask = "";
      }
      final StringBuffer buf =
          new StringBuffer(
              L(
                  "@x1 @x2 Metals required\n\r",
                  CMStrings.padRight(L("Item"), cols[0]),
                  CMStrings.padRight(L("Lvl"), cols[1])));
      for (int r = 0; r < recipes.size(); r++) {
        final List<String> V = recipes.get(r);
        if (V.size() > 0) {
          final String item = replacePercent(V.get(RCP_FINALNAME), "");
          final int level = CMath.s_int(V.get(RCP_LEVEL));
          final String wood = getComponentDescription(mob, V, RCP_WOOD);
          if (((level <= xlevel(mob)) || allFlag)
              && ((mask.length() == 0)
                  || mask.equalsIgnoreCase("all")
                  || CMLib.english().containsString(item, mask)))
            buf.append(
                CMStrings.padRight(item, cols[0])
                    + " "
                    + CMStrings.padRight("" + level, cols[1])
                    + " "
                    + wood
                    + "\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);
    }

    activity = CraftingActivity.CRAFTING;
    buildingI = null;
    messedUp = false;
    String statue = null;
    if ((commands.size() > 1) && ((String) commands.lastElement()).startsWith("STATUE=")) {
      statue = (((String) commands.lastElement()).substring(7)).trim();
      if (statue.length() == 0) statue = null;
      else commands.removeElementAt(commands.size() - 1);
    }
    int amount = -1;
    if ((commands.size() > 1) && (CMath.isNumber((String) commands.lastElement()))) {
      amount = CMath.s_int((String) commands.lastElement());
      commands.removeElementAt(commands.size() - 1);
    }
    final String recipeName = CMParms.combine(commands, 0);
    List<String> foundRecipe = null;
    final List<List<String>> matches = matchingRecipeNames(recipes, recipeName, true);
    for (int r = 0; r < matches.size(); r++) {
      final List<String> V = matches.get(r);
      if (V.size() > 0) {
        final int level = CMath.s_int(V.get(RCP_LEVEL));
        if ((parsedVars.autoGenerate > 0) || (level <= xlevel(mob))) {
          foundRecipe = V;
          break;
        }
      }
    }
    if (foundRecipe == null) {
      commonTell(
          mob,
          L(
              "You don't know how to make a '@x1'.  Try \"@x2 list\" for a list.",
              recipeName,
              triggerStrings[0].toLowerCase()));
      return false;
    }

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

    if (amount > woodRequired) woodRequired = amount;
    final String misctype = foundRecipe.get(RCP_MISCTYPE);
    final int[] pm = {RawMaterial.MATERIAL_METAL, RawMaterial.MATERIAL_MITHRIL};
    bundling = misctype.equalsIgnoreCase("BUNDLE");
    final int[][] data =
        fetchFoundResourceData(
            mob,
            woodRequired,
            "metal",
            pm,
            0,
            null,
            null,
            bundling,
            parsedVars.autoGenerate,
            enhancedTypes);
    if (data == null) return false;
    fixDataForComponents(data, componentsFoundList);
    woodRequired = data[0][FOUND_AMT];
    if (!bundling) {
      fireRequired = true;
      final Item fire = getRequiredFire(mob, parsedVars.autoGenerate);
      if (fire == null) return false;
    } else fireRequired = false;

    final Session session = mob.session();
    if ((misctype.equalsIgnoreCase("statue"))
        && (session != null)
        && ((statue == null) || (statue.trim().length() == 0))) {
      final Ability me = this;
      final Physical target = givenTarget;
      session.prompt(
          new InputCallback(InputCallback.Type.PROMPT, "", 0) {
            @Override
            public void showPrompt() {
              session.promptPrint(L("What is a statue this of?\n\r: "));
            }

            @Override
            public void timedOut() {}

            @Override
            public void callBack() {
              final String of = this.input;
              if ((of.trim().length() == 0) || (of.indexOf('<') >= 0)) return;
              final Vector newCommands = (Vector) originalCommands.clone();
              newCommands.add("STATUE=" + of);
              me.invoke(mob, newCommands, target, auto, asLevel);
            }
          });
      return false;
    }

    if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false;
    final int lostValue =
        parsedVars.autoGenerate > 0
            ? 0
            : CMLib.materials()
                    .destroyResourcesValue(
                        mob.location(), data[0][FOUND_AMT], data[0][FOUND_CODE], 0, null)
                + CMLib.ableMapper().destroyAbilityComponents(componentsFoundList);
    buildingI = CMClass.getItem(foundRecipe.get(RCP_CLASSTYPE));
    if (buildingI == null) {
      commonTell(mob, L("There's no such thing as a @x1!!!", foundRecipe.get(RCP_CLASSTYPE)));
      return false;
    }
    duration =
        getDuration(
            CMath.s_int(foundRecipe.get(RCP_TICKS)),
            mob,
            CMath.s_int(foundRecipe.get(RCP_LEVEL)),
            4);
    String itemName =
        replacePercent(foundRecipe.get(RCP_FINALNAME), RawMaterial.CODES.NAME(data[0][FOUND_CODE]))
            .toLowerCase();
    if (bundling) itemName = "a " + woodRequired + "# " + itemName;
    else itemName = CMLib.english().startWithAorAn(itemName);
    buildingI.setName(itemName);
    startStr = L("<S-NAME> start(s) smithing @x1.", buildingI.name());
    displayText = L("You are smithing @x1", buildingI.name());
    verb = L("smithing @x1", buildingI.name());
    playSound = "tinktinktink2.wav";
    buildingI.setDisplayText(L("@x1 lies here", itemName));
    buildingI.setDescription(itemName + ". ");
    buildingI.basePhyStats().setWeight(getStandardWeight(woodRequired, bundling));
    buildingI.setBaseValue(
        CMath.s_int(foundRecipe.get(RCP_VALUE))
            + (woodRequired * (RawMaterial.CODES.VALUE(data[0][FOUND_CODE]))));
    buildingI.setMaterial(data[0][FOUND_CODE]);
    buildingI.basePhyStats().setLevel(CMath.s_int(foundRecipe.get(RCP_LEVEL)));
    buildingI.setSecretIdentity(getBrand(mob));
    final int capacity = CMath.s_int(foundRecipe.get(RCP_CAPACITY));
    final String spell = (foundRecipe.size() > RCP_SPELL) ? foundRecipe.get(RCP_SPELL).trim() : "";
    addSpells(buildingI, spell);

    if ((misctype.equalsIgnoreCase("statue")) && (statue != null) && (statue.trim().length() > 0)) {
      buildingI.setName(L("@x1 of @x2", itemName, statue.trim()));
      buildingI.setDisplayText(L("@x1 of @x2 is here", itemName, statue.trim()));
      buildingI.setDescription(L("@x1 of @x2. ", itemName, statue.trim()));
    } else if (buildingI instanceof Rideable) {
      setRideBasis((Rideable) buildingI, misctype);
      if (capacity == 0) ((Rideable) buildingI).setRiderCapacity(1);
      else if (capacity < 5) ((Rideable) buildingI).setRiderCapacity(capacity);
    } else if (buildingI instanceof Container) {
      ((Container) buildingI).setCapacity(capacity + woodRequired);
      if (misctype.equalsIgnoreCase("LID"))
        ((Container) buildingI).setDoorsNLocks(true, false, true, false, false, false);
      else if (misctype.equalsIgnoreCase("LOCK")) {
        ((Container) buildingI).setDoorsNLocks(true, false, true, true, false, true);
        ((Container) buildingI).setKeyName(Double.toString(Math.random()));
      } else ((Container) buildingI).setContainTypes(getContainerType(misctype));
    }
    if (buildingI instanceof Drink) {
      if (CMLib.flags().isGettable(buildingI)) {
        ((Drink) buildingI).setLiquidHeld(capacity * 50);
        ((Drink) buildingI).setThirstQuenched(250);
        if ((capacity * 50) < 250) ((Drink) buildingI).setThirstQuenched(capacity * 50);
        ((Drink) buildingI).setLiquidRemaining(0);
      }
    }
    if (bundling) buildingI.setBaseValue(lostValue);
    buildingI.recoverPhyStats();
    buildingI.text();
    buildingI.recoverPhyStats();

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

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

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

    final CMMsg msg = CMClass.getMsg(mob, buildingI, this, getActivityMessageType(), startStr);
    if (mob.location().okMessage(mob, msg)) {
      mob.location().send(mob, msg);
      buildingI = (Item) msg.target();
      beneficialAffect(mob, mob, asLevel, duration);
      enhanceItem(mob, buildingI, enhancedTypes);
    } else if (bundling) {
      messedUp = false;
      aborted = false;
      unInvoke();
    }
    return true;
  }