public ChameleonList<Ability> getClanLevelEffects(final MOB mob, final Integer level) { if (level == null) return getEmptyClanLevelEffects(mob); final DefaultClanGovernment myGovt = this; final List<Ability> myList = getClanLevelEffectsList(mob, level); final List<Ability> finalV = new Vector<Ability>(myList.size()); for (final Ability A : myList) { Ability finalA = (Ability) A.copyOf(); finalA.makeNonUninvokable(); finalA.setSavable(false); // must come AFTER the above finalA.setAffectedOne(mob); finalV.add(finalA); } final ChameleonList<Ability> finalFinalV; if (mob == null) { finalFinalV = new ChameleonList<Ability>( finalV, new ChameleonList.Signaler<Ability>(myList) { public boolean isDeprecated() { return false; } public void rebuild(final ChameleonList<Ability> me) {} }); } else { finalFinalV = new ChameleonList<Ability>( finalV, new ChameleonList.Signaler<Ability>(myList) { public boolean isDeprecated() { if ((mob == null) || (mob.amDestroyed())) return true; final Clan C = mob.getMyClan(); if (C == null) return true; if ((C.getGovernment() != myGovt) || (getClanLevelEffectsList(mob, Integer.valueOf(C.getClanLevel())) != oldReferenceListRef.get())) return true; return false; } public void rebuild(final ChameleonList<Ability> me) { final Clan C = (mob != null) ? mob.getMyClan() : null; if ((mob == null) || (mob.amDestroyed()) || (C == null)) me.changeMeInto(getEmptyClanLevelEffects(mob)); else me.changeMeInto( C.getGovernment() .getClanLevelEffects(mob, Integer.valueOf(C.getClanLevel()))); } }); } return finalFinalV; }
public boolean containsDrink() { if ((!CMLib.flags().isGettable(this)) && (owner() != null) && (owner() instanceof Room) && (((Room) owner()).getArea() != null) && (((Room) owner()).getArea().getClimateObj().weatherType((Room) owner()) == Climate.WEATHER_DROUGHT)) return false; if (liquidRemaining() < 1) { List<Item> V = getContents(); for (int v = 0; v < V.size(); v++) if ((V.get(v) instanceof Item) && (V.get(v) instanceof Drink) && ((((Item) V.get(v)).material() & RawMaterial.MATERIAL_MASK) == RawMaterial.MATERIAL_LIQUID)) return true; return false; } return true; }
public boolean preInvoke( MOB mob, List<String> commands, Physical givenTarget, boolean auto, int asLevel, int secondsElapsed, double actionsRemaining) { if (secondsElapsed == 0) { String dir = CMParms.combine(commands, 0); if (commands.size() > 0) dir = (String) commands.get(commands.size() - 1); int dirCode = Directions.getGoodDirectionCode(dir); if (dirCode < 0) { mob.tell("Step where?"); return false; } if (mob.isInCombat()) { mob.tell("Not while you are fighting!"); return false; } if ((mob.location().getRoomInDir(dirCode) == null) || (mob.location().getExitInDir(dirCode) == null)) { mob.tell("Step where?"); return false; } CMMsg msg = CMClass.getMsg( mob, null, this, auto ? CMMsg.MSG_OK_VISUAL : CMMsg.MSG_DELICATE_HANDS_ACT, "<S-NAME> start(s) walking carefully " + Directions.getDirectionName(dirCode) + "."); if (mob.location().okMessage(mob, msg)) mob.location().send(mob, msg); else return false; } return true; }
public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { MOB target = this.getTarget(mob, commands, givenTarget); if (target == null) return false; if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; boolean success = proficiencyCheck(mob, 0, auto); List<Ability> offensiveAffects = returnOffensiveAffects(mob, target); if ((success) && (offensiveAffects.size() > 0)) { // 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), auto ? "A visible glow surrounds <T-NAME>." : "^S<S-NAME> " + prayWord(mob) + " for <T-NAMESELF> to see the light.^?"); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); for (int a = offensiveAffects.size() - 1; a >= 0; a--) ((Ability) offensiveAffects.get(a)).unInvoke(); } } else beneficialWordsFizzle( mob, target, auto ? "" : "<S-NAME> " + prayWord(mob) + " for <T-NAMESELF>, 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; }
protected List<List<String>> loadRecipes() { String filename = parametersFile(); List<List<String>> recipes = (List<List<String>>) Resources.getResource("PARSED_RECIPE: " + filename); if (recipes == null) { StringBuffer str = new CMFile(Resources.buildResourcePath("skills") + filename, null, true).text(); recipes = loadList(str); if (recipes.size() == 0) Log.errOut("LeatherWorking", "Recipes not found!"); else { List<List<String>> pleaseAdd = new Vector(); for (int r = 0; r < recipes.size(); r++) { List<String> V = recipes.get(r); if (V.size() > 0) { String name = (String) V.get(RCP_FINALNAME); int baseLevel = CMath.s_int((String) V.get(RCP_LEVEL)) + 2; List<String> V1 = new XVector<String>(V); V1.set(RCP_FINALNAME, "Cuirbouli " + name); V1.set(RCP_LEVEL, "" + (baseLevel + 37)); pleaseAdd.add(V1); V1 = new XVector<String>(V); V1.set(RCP_FINALNAME, "Reinforced " + name); V1.set(RCP_LEVEL, "" + (baseLevel + 45)); pleaseAdd.add(V1); V1 = new XVector<String>(V); V1.set(RCP_FINALNAME, "Masterwork " + name); V1.set(RCP_LEVEL, "" + (baseLevel + 54)); pleaseAdd.add(V1); V1 = new XVector<String>(V); V1.set(RCP_FINALNAME, "Laminar " + name); V1.set(RCP_LEVEL, "" + (baseLevel + 63)); pleaseAdd.add(V1); V1 = new XVector<String>(V); V1.set(RCP_FINALNAME, "Battlemoulded " + name); V1.set(RCP_LEVEL, "" + (baseLevel + 72)); pleaseAdd.add(V1); V.set(RCP_FINALNAME, "Designer " + name); V.set(RCP_LEVEL, "" + (baseLevel + 30)); } } for (int i = 0; i < pleaseAdd.size(); i++) recipes.add(pleaseAdd.get(i)); } Resources.submitResource("PARSED_RECIPE: " + filename, recipes); } return recipes; }
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; }
public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; Room target = mob.location(); if ((auto) && (givenTarget != null) && (givenTarget instanceof Room)) target = (Room) givenTarget; Ability A = target.fetchEffect(ID()); if (A != null) { mob.tell("This place is already a safehouse."); return false; } if ((!auto) && (CMLib.law().getLegalBehavior(target) == null)) { mob.tell("There is no law here!"); return false; } if (!isGoodSafehouse(target)) { TrackingLibrary.TrackingFlags flags; flags = new TrackingLibrary.TrackingFlags() .plus(TrackingLibrary.TrackingFlag.OPENONLY) .plus(TrackingLibrary.TrackingFlag.AREAONLY) .plus(TrackingLibrary.TrackingFlag.NOEMPTYGRIDS) .plus(TrackingLibrary.TrackingFlag.NOAIR) .plus(TrackingLibrary.TrackingFlag.NOWATER); List<Room> V = CMLib.tracking().getRadiantRooms(target, flags, 50 + (2 * getXLEVELLevel(mob))); Room R = null; int v = 0; for (; v < V.size(); v++) { R = (Room) V.get(v); if ((isGoodSafehouse(R)) && (!isLawHere(R))) break; } mob.tell("A place like this can't be a safehouse."); if ((isGoodSafehouse(R)) && (!isLawHere(R))) { V = CMLib.tracking() .findBastardTheBestWay( target, new XVector(R), flags, 50 + (2 * getXLEVELLevel(mob))); StringBuffer trail = new StringBuffer(""); int dir = CMLib.tracking().trackNextDirectionFromHere(V, target, true); while (target != R) { if ((dir < 0) || (dir >= Directions.NUM_DIRECTIONS()) || (target == null)) break; trail.append(Directions.getDirectionName(dir)); if (target.getRoomInDir(dir) != R) trail.append(", "); target = target.getRoomInDir(dir); dir = CMLib.tracking().trackNextDirectionFromHere(V, target, true); } if (target == R) mob.tell("You happen to know of one nearby though. Go: " + trail.toString()); } return false; } boolean success = proficiencyCheck(mob, 0, auto); CMMsg msg = CMClass.getMsg( mob, null, this, auto ? CMMsg.MASK_ALWAYS : CMMsg.MSG_DELICATE_HANDS_ACT, CMMsg.MSG_OK_VISUAL, CMMsg.MSG_OK_VISUAL, auto ? "" : "<S-NAME> hide(s) out from the law here."); if (!success) return beneficialVisualFizzle( mob, null, auto ? "" : "<S-NAME> attempt(s) hide out from the law here, but things are just too hot."); else if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); beneficialAffect(mob, target, asLevel, (CMProps.getIntVar(CMProps.SYSTEMI_TICKSPERMUDMONTH))); } return success; }
public String getHelpStr() { if (getLongDesc().length() == 0) return null; if (helpStr == null) { StringBuilder str = new StringBuilder("\n\rOrganization type: " + getName() + "\n\r\n\r"); str.append(getLongDesc()).append("\n\r"); str.append("\n\rAuthority Chart:\n\r\n\r"); final List<ClanPosition> showablePositions = new Vector<ClanPosition>(); for (ClanPosition P : getPositions()) { boolean showMe = false; for (Clan.Authority a : P.getFunctionChart()) if (a == Authority.CAN_DO) showMe = true; if (showMe) showablePositions.add(P); } final List<ClanPosition> sortedPositions = new Vector<ClanPosition>(); while (sortedPositions.size() < showablePositions.size()) { ClanPosition highPos = null; for (ClanPosition P : showablePositions) if ((!sortedPositions.contains(P)) && ((highPos == null) || (highPos.getRank() < P.getRank()))) highPos = P; sortedPositions.add(highPos); } final int[] posses = new int[sortedPositions.size()]; int posTotalLen = 0; for (int p = 0; p < sortedPositions.size(); p++) { posses[p] = sortedPositions.get(p).getName().length() + 2; posTotalLen += posses[p]; } int funcMaxLen = 0; int funcTotal = 0; String[] functionNames = new String[Clan.Function.values().length]; for (int f = 0; f < Clan.Function.values().length; f++) { Clan.Function func = Clan.Function.values()[f]; funcTotal += func.name().length() + 1; if (func.name().length() > funcMaxLen) funcMaxLen = func.name().length() + 1; functionNames[f] = func.name(); } int funcAvg = funcTotal / Clan.Function.values().length; int funcMaxAvg = (int) CMath.round((double) funcAvg * 1.3); while ((funcMaxLen > funcMaxAvg) && ((funcMaxAvg + posTotalLen) > 78)) funcMaxLen--; if (posses.length > 0) while ((funcMaxLen + posTotalLen) > 78) { int highPos = 0; for (int p = 1; p < sortedPositions.size(); p++) if (posses[p] > posses[highPos]) highPos = p; posTotalLen--; posses[highPos]--; } final int commandColLen = funcMaxLen; str.append(CMStrings.padRight("Command", commandColLen - 1)).append("!"); for (int p = 0; p < posses.length; p++) { ClanPosition pos = sortedPositions.get(p); String name = CMStrings.capitalizeAndLower(pos.getName().replace('_', ' ')); str.append(CMStrings.padRight(name, posses[p] - 1)); if (p < posses.length - 1) str.append("!"); } str.append("\n\r"); Object lineDraw = new Object() { private static final String line = "----------------------------------------------------------------------------"; public String toString() { StringBuilder s = new StringBuilder(""); s.append(line.substring(0, commandColLen - 1)).append("+"); for (int p = 0; p < posses.length; p++) { s.append(CMStrings.padRight(line, posses[p] - 1)); if (p < posses.length - 1) s.append("+"); } return s.toString(); } }; str.append(lineDraw.toString()).append("\n\r"); for (Clan.Function func : Clan.Function.values()) { String fname = CMStrings.capitalizeAndLower(func.toString().replace('_', ' ')); str.append(CMStrings.padRight(fname, commandColLen - 1)).append("!"); for (int p = 0; p < sortedPositions.size(); p++) { ClanPosition pos = sortedPositions.get(p); Authority auth = pos.getFunctionChart()[func.ordinal()]; String x = ""; if (auth == Authority.CAN_DO) x = "X"; else if (auth == Authority.MUST_VOTE_ON) x = "v"; str.append(CMStrings.padCenter(x, posses[p] - 1)); if (p < posses.length - 1) str.append("!"); } str.append("\n\r").append(lineDraw.toString()).append("\n\r"); } /* protected String[] clanEffectNames =null; protected int[] clanEffectLevels =null; protected String[] clanEffectParms =null; protected String[] clanAbilityNames =null; protected int[] clanAbilityLevels =null; protected int[] clanAbilityProficiencies=null; protected boolean[] clanAbilityQuals =null; */ if ((clanAbilityLevels != null) && (clanEffectLevels != null) && (clanAbilityLevels.length > 0) && (clanEffectLevels.length > 0)) { str.append("\n\rBenefits per Clan Level:\n\r"); int maxLevel = -1; for (int x : clanEffectLevels) if (x > maxLevel) maxLevel = x; for (int x : clanAbilityLevels) if (x > maxLevel) maxLevel = x; for (int l = 1; l <= maxLevel; l++) { final List<String> levelBenefits = new LinkedList<String>(); for (int x = 0; x < clanEffectLevels.length; x++) if (clanEffectLevels[x] == l) { final Ability A = CMClass.getAbility(clanEffectNames[x]); if (A != null) { A.setMiscText(clanEffectParms[x]); String desc = A.accountForYourself(); if ((desc == null) || (desc.length() == 0)) desc = "Members gain the following effect: " + A.name(); levelBenefits.add(desc); } } for (int x = 0; x < clanAbilityLevels.length; x++) if (clanAbilityLevels[x] == l) { final Ability A = CMClass.getAbility(clanAbilityNames[x]); if (A != null) { if (clanAbilityQuals[x]) levelBenefits.add("Members qualify for: " + A.name()); else levelBenefits.add("Members automatically gain: " + A.name()); } } for (final String bene : levelBenefits) str.append("Level " + l + ": " + bene + "\n\r"); } } helpStr = str.toString(); } return helpStr; }
public void delPosition(ClanPosition pos) { List<ClanPosition> newPos = new LinkedList<ClanPosition>(); for (ClanPosition P : positions) if (P != pos) newPos.add(P); positions = newPos.toArray(new ClanPosition[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; }
public boolean execute(MOB mob, Vector commands, int metaFlags) throws java.io.IOException { if (commands.size() < 2) { mob.tell("Wear what?"); return false; } Wearable.CODES codes = Wearable.CODES.instance(); commands.removeElementAt(0); if (commands.firstElement() instanceof Item) { Item wearWhat = (Item) commands.firstElement(); boolean quietly = false; int wearLocationIndex = 0; commands.removeElementAt(0); if (commands.size() > 0) { if (commands.firstElement() instanceof Integer) { wearLocationIndex = ((Integer) commands.firstElement()).intValue(); commands.removeElementAt(0); } else if (commands.firstElement() instanceof String) { int newDex = codes.findDex_ignoreCase((String) commands.firstElement()); if (newDex > 0) { wearLocationIndex = newDex; commands.removeElementAt(0); } } if ((commands.size() > 0) && (commands.lastElement() instanceof String) && (((String) commands.lastElement()).equalsIgnoreCase("QUIETLY"))) quietly = true; } return wear(mob, wearWhat, wearLocationIndex, quietly); } // discover if a wear location was specified int wearLocationIndex = 0; for (int i = commands.size() - 2; i > 0; i--) if (((String) commands.elementAt(i)).equalsIgnoreCase("on")) { if ((i < commands.size() - 2) && ((String) commands.elementAt(i + 1)).equalsIgnoreCase("my")) commands.removeElementAt(i + 1); String possibleWearLocation = CMParms.combine(commands, i + 1).toLowerCase().trim(); int possIndex = CMParms.indexOfIgnoreCase(Wearable.CODES.NAMES(), possibleWearLocation); if (possIndex < 0) possIndex = Wearable.CODES.FINDDEX_endsWith(" " + possibleWearLocation); if (possIndex > 0) { wearLocationIndex = possIndex; while (commands.size() > i) commands.removeElementAt(commands.size() - 1); break; } else { mob.tell("You can't wear anything on your '" + possibleWearLocation + "'"); return false; } // will always break out here, one way or the other. } List<Item> items = CMLib.english().fetchItemList(mob, mob, null, commands, Wearable.FILTER_UNWORNONLY, true); if (items.size() == 0) mob.tell("You don't seem to be carrying that."); else { // sort hold-onlys down. Item I = null; for (int i = items.size() - 2; i >= 0; i--) { I = (Item) items.get(i); if (I.rawProperLocationBitmap() == Wearable.WORN_HELD) { items.remove(i); items.add(I); } } for (int i = 0; i < items.size(); i++) { I = (Item) items.get(i); if ((items.size() == 1) || (I.canWear(mob, 0))) wear(mob, I, wearLocationIndex, false); } } return false; }