public List<Ability> getClanLevelEffectsList(final MOB mob, final Integer level) {
    if (clanEffectNames == null) return empty;

    if ((clanEffectMap == null)
        && (clanEffectNames != null)
        && (clanEffectLevels != null)
        && (clanEffectParms != null)) clanEffectMap = new Hashtable<Integer, List<Ability>>();

    if (clanEffectMap == null) return empty;

    if (clanEffectMap.containsKey(level)) return clanEffectMap.get(level);
    final CMObjUniqSortSVec<Ability> finalV = new CMObjUniqSortSVec<Ability>();
    for (int v = 0; v < clanEffectLevels.length; v++) {
      if ((clanEffectLevels[v] <= level.intValue())
          && (clanEffectNames.length > v)
          && (clanEffectParms.length > v)) {
        Ability A = CMClass.getAbility(clanEffectNames[v]);
        if (A != null) {
          // mob was set to null here to make the cache map actually relevant .. see caching below
          A.setProficiency(CMLib.ableMapper().getMaxProficiency((MOB) null, true, A.ID()));
          A.setMiscText(clanEffectParms[v]);
          A.makeNonUninvokable();
          A.setSavable(false); // must go AFTER the ablve
          finalV.add(A);
        }
      }
    }
    finalV.trimToSize();
    clanEffectMap.put(level, finalV);
    return finalV;
  }
Exemple #2
0
 public String runMacro(ExternalHTTPRequests httpReq, String parm) {
   java.util.Map<String, String> parms = parseParms(parm);
   String last = httpReq.getRequestParameter("COMPONENT");
   StringBuilder str = new StringBuilder("");
   if (parms.containsKey("DESC")) {
     str.append(CMLib.ableMapper().getAbilityComponentDesc(null, last));
   }
   String strstr = str.toString();
   if (strstr.endsWith(", ")) strstr = strstr.substring(0, strstr.length() - 2);
   return clearWebMacros(strstr);
 }
 public List<Ability> getClanLevelAbilities(Integer level) {
   if ((clanAbilityMap == null)
       && (clanAbilityNames != null)
       && (clanAbilityLevels != null)
       && (clanAbilityProficiencies != null)
       && (clanAbilityQuals != null)) {
     CMLib.ableMapper().delCharMappings(ID()); // necessary for a "clean start"
     clanAbilityMap = new Hashtable<Integer, List<Ability>>();
     for (int i = 0; i < clanAbilityNames.length; i++) {
       CMLib.ableMapper()
           .addDynaAbilityMapping(
               ID(),
               clanAbilityLevels[i],
               clanAbilityNames[i],
               clanAbilityProficiencies[i],
               "",
               !clanAbilityQuals[i],
               false);
     }
   }
   if (clanAbilityMap == null) return empty;
   if (clanAbilityMap.containsKey(level)) return clanAbilityMap.get(level);
   List<AbilityMapper.AbilityMapping> V =
       CMLib.ableMapper().getUpToLevelListings(ID(), level.intValue(), true, true);
   CMObjUniqSortSVec<Ability> finalV = new CMObjUniqSortSVec<Ability>();
   for (AbilityMapper.AbilityMapping able : V) {
     Ability A = CMClass.getAbility(able.abilityID);
     if (A != null) {
       A.setProficiency(CMLib.ableMapper().getDefaultProficiency(ID(), false, A.ID()));
       A.setSavable(false);
       A.setMiscText(CMLib.ableMapper().getDefaultParm(ID(), false, A.ID()));
       finalV.add(A);
     }
   }
   finalV.trimToSize();
   clanAbilityMap.put(level, finalV);
   return finalV;
 }
  public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) {

    int type = mob.location().domainType();
    if (((type & Room.INDOORS) > 0)
        || (type == Room.DOMAIN_OUTDOORS_AIR)
        || (type == Room.DOMAIN_OUTDOORS_CITY)
        || (type == Room.DOMAIN_OUTDOORS_SPACEPORT)
        || (type == Room.DOMAIN_OUTDOORS_UNDERWATER)
        || (type == Room.DOMAIN_OUTDOORS_WATERSURFACE)) {
      mob.tell("That magic won't work here.");
      return false;
    }
    if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false;

    boolean success = proficiencyCheck(mob, 0, auto);

    if (success) {
      CMMsg msg =
          CMClass.getMsg(
              mob,
              mob.location(),
              this,
              verbalCastCode(mob, mob.location(), auto),
              auto ? "" : "^S<S-NAME> " + prayForWord(mob) + " to make the land fruitful.^?");
      if (mob.location().okMessage(mob, msg)) {
        mob.location().send(mob, msg);
        beneficialAffect(
            mob,
            mob.location(),
            asLevel,
            CMLib.ableMapper().qualifyingClassLevel(mob, this)
                * (int)
                    ((CMProps.getMillisPerMudHour()
                            * ((long) mob.location().getArea().getTimeObj().getHoursInDay()))
                        / CMProps.getTickMillis()));
      }

    } else
      beneficialWordsFizzle(
          mob,
          null,
          "<S-NAME> " + prayForWord(mob) + " to make the land fruitful, but nothing happens.");

    // return whether it worked
    return success;
  }
  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;
  }
Exemple #6
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;
  }
Exemple #7
0
  public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) {
    Set<MOB> h = properTargets(mob, givenTarget, auto);
    if ((h == null) || (h.size() == 0)) {
      mob.tell("There doesn't appear to be anyone here worth repelling.");
      return false;
    }

    // the invoke method for spells receives as
    // parameters the invoker, and the REMAINING
    // command line parameters, divided into words,
    // and added as String objects to a vector.
    if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false;

    boolean success = proficiencyCheck(mob, 0, auto);

    if (success) {
      if (mob.location()
          .show(
              mob,
              null,
              this,
              somanticCastCode(mob, null, auto),
              auto ? "" : "^S<S-NAME> wave(s) <S-HIS-HER> arms and cast(s) a spell.^?"))
        for (Iterator f = h.iterator(); f.hasNext(); ) {
          MOB target = (MOB) f.next();

          // it worked, so build a copy of this ability,
          // and add it to the affects list of the
          // affected MOB.  Then tell everyone else
          // what happened.
          CMMsg msg = CMClass.getMsg(mob, target, this, verbalCastCode(mob, target, auto), null);
          if ((mob.location().okMessage(mob, msg)) && (target.fetchEffect(this.ID()) == null)) {
            mob.location().send(mob, msg);
            if (msg.value() <= 0) {
              amountRemaining = 130;
              if (target.location() == mob.location()) {
                success =
                    maliciousAffect(
                        mob,
                        target,
                        asLevel,
                        ((mob.phyStats().level() + (2 * getXLEVELLevel(mob))) * 10),
                        -1);
                int level = 2;
                if ((CMLib.ableMapper().qualifyingClassLevel(mob, this) > 0)
                    && ((adjustedLevel(mob, asLevel)
                            - CMLib.ableMapper().qualifyingClassLevel(mob, this))
                        > 10))
                  level +=
                      ((adjustedLevel(mob, asLevel)
                                  - CMLib.ableMapper().qualifyingClassLevel(mob, this))
                              - 10)
                          / 10;
                if (level < 2) level = 2;
                target
                    .location()
                    .show(target, null, CMMsg.MSG_OK_ACTION, "<S-NAME> become(s) repelled!");
                if ((target.getVictim() != null) && (target.rangeToTarget() > 0))
                  target.setAtRange(target.rangeToTarget());
                else if (target.location().maxRange() < level)
                  target.setAtRange(target.location().maxRange());
                else target.setAtRange(level);
                if (target.getVictim() != null)
                  target.getVictim().setAtRange(target.rangeToTarget());
                if (mob.getVictim() == null) mob.setVictim(null); // correct range
                if (target.getVictim() == null) target.setVictim(null); // correct range
              }
            }
          }
        }
    } else
      return maliciousFizzle(
          mob, null, "<S-NAME> wave(s) <S-HIS-HER> arms, but the spell fizzles.");

    // return whether it worked
    return success;
  }