public List<Object> convertToV2(List<Ability> spellsV, Physical target) { final List<Object> VTOO = new Vector<Object>(); for (int v = 0; v < spellsV.size(); v++) { Ability A = spellsV.get(v); final Ability EA = (target != null) ? target.fetchEffect(A.ID()) : null; if ((EA == null) && (didHappen())) { final String t = A.text(); A = (Ability) A.copyOf(); Vector<String> V2 = new Vector<String>(); if (t.length() > 0) { final int x = t.indexOf('/'); if (x < 0) { V2 = CMParms.parse(t); A.setMiscText(""); } else { V2 = CMParms.parse(t.substring(0, x)); A.setMiscText(t.substring(x + 1)); } } VTOO.add(A); VTOO.add(V2); } } return VTOO; }
public void removeMyAffectsFrom(Physical P) { if (P == null) return; int x = 0; final Vector<Ability> eff = new Vector<Ability>(); Ability thisAffect = null; for (x = 0; x < P.numEffects(); x++) // personal { thisAffect = P.fetchEffect(x); if (thisAffect != null) eff.addElement(thisAffect); } if (eff.size() > 0) { final Map<String, String> h = makeMySpellsH(getMySpellsV()); if (unrevocableSpells != null) { for (int v = unrevocableSpells.size() - 1; v >= 0; v--) { thisAffect = unrevocableSpells.get(v); if (h.containsKey(thisAffect.ID())) P.delEffect(thisAffect); } } else for (x = 0; x < eff.size(); x++) { thisAffect = eff.elementAt(x); final String ID = h.get(thisAffect.ID()); if ((ID != null) && (thisAffect.invoker() == getInvokerMOB(P, P))) { thisAffect.unInvoke(); if ((!uninvocable) && (!thisAffect.canBeUninvoked())) P.delEffect(thisAffect); } } unrevocableSpells = null; } }
@Override public boolean tick(Tickable ticking, int tickID) { if (!super.tick(ticking, tickID)) return false; if ((tickID == Tickable.TICKID_MOB) && (affected instanceof MOB)) { final MOB mob = (MOB) affected; if (!DATA.containsKey(mob)) DATA.put(mob, new int[DATA_TOTAL]); final int[] data = DATA.get(mob); if ((mob.session() != null) && (mob.session().getPreviousCMD() != null)) { if ((lastCommand != null) && (!CMParms.combine(mob.session().getPreviousCMD(), 0).equals(lastCommand))) { data[DATA_TYPEDCOMMAND]++; List<MOB> V = null; if (mob.session().getAddress() != null) V = IPS.get(mob.session().getAddress()); if (V != null) for (int v = 0; v < V.size(); v++) { final MOB M = V.get(v); if (M == mob) continue; if (M.session() == null) continue; if (!CMLib.flags().isInTheGame(M, true)) continue; final String hisLastCmd = CMParms.combine(mob.session().getPreviousCMD(), 0); final Archon_Multiwatch A = (Archon_Multiwatch) M.fetchEffect(ID()); if (A != null) { if ((A.lastCommand != null) && (!A.lastCommand.equals(hisLastCmd))) data[DATA_SYNCHROFOUND]++; break; } } } lastCommand = CMParms.combine(mob.session().getPreviousCMD(), 0); } } return true; }
@Override protected List<List<String>> loadRecipes() { final String filename = parametersFile(); @SuppressWarnings("unchecked") List<List<String>> recipes = (List<List<String>>) Resources.getResource("PARSED_RECIPE: " + filename); if (recipes == null) { final StringBuffer str = new CMFile(Resources.buildResourcePath("skills") + filename, null, CMFile.FLAG_LOGERRORS) .text(); recipes = loadList(str); if (recipes.size() == 0) Log.errOut("LeatherWorking", "Recipes not found!"); else { final List<List<String>> newRecipes = new Vector<List<String>>(); for (int r = 0; r < recipes.size(); r++) { final List<String> V = recipes.get(r); if (V.size() > 0) { final String name = V.get(RCP_FINALNAME); final int baseLevel = CMath.s_int(V.get(RCP_LEVEL)) + 2; for (final Stage s : Stage.values()) { final List<String> V1 = new XVector<String>(V); V1.set(RCP_FINALNAME, s.name() + " " + name); final int level = baseLevel + s.recipeLevel; V1.set(RCP_LEVEL, "" + level); for (int i = 0; i <= newRecipes.size(); i++) { if (newRecipes.size() == i) { newRecipes.add(V1); break; } else if (CMath.s_int(newRecipes.get(i).get(RCP_LEVEL)) > level) { newRecipes.add(i, V1); break; } } } } } recipes.clear(); recipes = newRecipes; } Resources.submitResource("PARSED_RECIPE: " + filename, recipes); } return recipes; }
@Override public void setBodyPartsFromStringAfterRace(String str) { final List<String> V = CMParms.parseSemicolons(str, true); bodyAlterations = null; for (int i = 0; i < getMyRace().bodyMask().length; i++) { if (V.size() <= i) break; final int val = CMath.s_int(V.get(i)); final int num = getMyRace().bodyMask()[i]; if (num != val) alterBodypart(i, val - num); } }
@Override public Ability fetchAbility(int index) { final List<Ability> spellsV = getMySpellsV(); if (spellsV.size() == 0) return null; if ((index < 0) || (index >= spellsV.size())) return null; try { return spellsV.get(index); } catch (final Exception e) { return null; } }
@Override public Trap setTrap(MOB mob, Physical P, int trapBonus, int qualifyingClassLevel, boolean perm) { if (P == null) return null; final Item I = getPoison(mob); if (I != null) { final List<Ability> V = returnOffensiveAffects(I); if (V.size() > 0) setMiscText(V.get(0).ID()); I.destroy(); } return super.setTrap(mob, P, trapBonus, qualifyingClassLevel, perm); }
@Override public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { material = RawMaterial.RESOURCE_OAK; if ((mob.location().myResource() & RawMaterial.MATERIAL_MASK) == RawMaterial.MATERIAL_WOODEN) material = mob.location().myResource(); else { final List<Integer> V = mob.location().resourceChoices(); final Vector V2 = new Vector(); if (V != null) for (int v = 0; v < V.size(); v++) { if (((V.get(v).intValue() & RawMaterial.MATERIAL_MASK) == RawMaterial.MATERIAL_WOODEN) && ((V.get(v).intValue()) != RawMaterial.RESOURCE_WOOD)) V2.addElement(V.get(v)); } if (V2.size() > 0) material = ((Integer) V2.elementAt(CMLib.dice().roll(1, V2.size(), -1))).intValue(); } return super.invoke(mob, commands, givenTarget, auto, asLevel); }
public String spellAccountingsWithMask(String pre, String post) { final List<Ability> spellList = getMySpellsV(); String id = ""; for (int v = 0; v < spellList.size(); v++) { final Ability A = spellList.get(v); if (spellList.size() == 1) id += A.name(); else if (v == (spellList.size() - 1)) id += "and " + A.name(); else id += A.name() + ", "; } if (spellList.size() > 0) id = pre + id + post; final String maskString = getMaskString(text()); if (maskString.length() > 0) id += " Restrictions: " + CMLib.masking().maskDesc(maskString); return id; }
public boolean addMeIfNeccessary( PhysicalAgent source, Physical target, boolean makeLongLasting, int asLevel, short maxTicks) { final List<Ability> V = getMySpellsV(); if ((target == null) || (V.size() == 0) || ((compiledMask != null) && (!CMLib.masking().maskCheck(compiledMask, target, true)))) return false; final List VTOO = convertToV2(V, target); if (VTOO.size() == 0) return false; final MOB qualMOB = getInvokerMOB(source, target); for (int v = 0; v < VTOO.size(); v += 2) { final Ability A = (Ability) VTOO.get(v); final Vector V2 = (Vector) VTOO.get(v + 1); if (level >= 0) asLevel = level; else if (asLevel <= 0) asLevel = (affected != null) ? affected.phyStats().level() : 0; A.invoke(qualMOB, V2, target, true, asLevel); final Ability EA = target.fetchEffect(A.ID()); lastMOB = target; // this needs to go here because otherwise it makes non-item-invoked spells long lasting, // which means they dont go away when item is removed. if (EA != null) { if ((maxTicks > 0) && (maxTicks < Short.MAX_VALUE) && (CMath.s_int(EA.getStat("TICKDOWN")) > maxTicks)) EA.setStat("TICKDOWN", Short.toString(maxTicks)); else if (makeLongLasting) { EA.makeLongLasting(); if (!uninvocable) { EA.makeNonUninvokable(); if (unrevocableSpells == null) unrevocableSpells = new Vector<Ability>(); unrevocableSpells.add(EA); } } } } return true; }
@Override public boolean execute(MOB mob, List<String> commands, int metaFlags) throws java.io.IOException { if (!mob.isMonster()) { if ((commands != null) && (commands.size() > 1) && (commands.get(1).toUpperCase().equals("OFF"))) { final Command C = CMClass.getCommand("NoSounds"); if (C != null) { return C.execute(mob, commands, metaFlags); } } boolean force = false; if (commands != null) { for (final Object o : commands) { if (o.toString().equalsIgnoreCase("force")) force = true; } } final Session session = mob.session(); if ((!mob.isAttributeSet(MOB.Attrib.SOUND)) || (!session.getClientTelnetMode(Session.TELNET_MSP))) { session.changeTelnetMode(Session.TELNET_MSP, true); for (int i = 0; ((i < 5) && (!session.getClientTelnetMode(Session.TELNET_MSP))); i++) { try { mob.session().prompt("", 500); } catch (final Exception e) { } } if (session.getClientTelnetMode(Session.TELNET_MSP)) { mob.setAttribute(MOB.Attrib.SOUND, true); mob.tell(L("MSP Sound/Music enabled.\n\r")); } else if (force) { session.setClientTelnetMode(Session.TELNET_MSP, true); session.setServerTelnetMode(Session.TELNET_MSP, true); mob.setAttribute(MOB.Attrib.SOUND, true); mob.tell(L("MSP Sound/Music has been forceably enabled.\n\r")); } else mob.tell(L("Your client does not appear to support MSP.")); } else { mob.tell(L("MSP Sound/Music is already enabled.\n\r")); } } return false; }
public List<Ability> getMySpellsV() { if (spellV != null) return spellV; spellV = new Vector<Ability>(); final String names = getParmString(text()); final List<String> set = CMParms.parseSemicolons(names, true); String thisOne = null; for (int s = 0; s < set.size(); s++) { thisOne = set.get(s); if (thisOne.equalsIgnoreCase("NOUNINVOKE")) { this.uninvocable = false; continue; } if (thisOne.toUpperCase().startsWith("LEVEL")) { level = (short) CMParms.getParmInt(thisOne, "LEVEL", -1); if (level >= 0) continue; } if (thisOne.toUpperCase().startsWith("MAXTICKS")) { maxTicks = (short) CMParms.getParmInt(thisOne, "MAXTICKS", -1); if (maxTicks != -1) continue; } final int pctDex = thisOne.indexOf("% "); if ((pctDex > 0) && (thisOne.substring(pctDex + 1).trim().length() > 0)) thisOne = thisOne.substring(pctDex + 1).trim(); String parm = ""; if ((thisOne != null) && (thisOne.endsWith(")"))) { final int x = thisOne.indexOf('('); if (x > 0) { parm = thisOne.substring(x + 1, thisOne.length() - 1); thisOne = thisOne.substring(0, x).trim(); } } Ability A = CMClass.getAbility(thisOne); if ((A != null) && ((A.classificationCode() & Ability.ALL_DOMAINS) != Ability.DOMAIN_ARCHON)) { A = (Ability) A.copyOf(); A.setMiscText(parm); spellV.add(A); } } return spellV; }
@Override public boolean invoke( MOB mob, List<String> commands, Physical givenTarget, boolean auto, int asLevel) { if (commands.size() < 2) { mob.tell(L("You must specify what to cast this on, and then what you want it to emote.")); return false; } final Vector<String> V = new Vector<String>(); V.addElement(commands.get(0)); final Item target = getTarget(mob, mob.location(), givenTarget, V, Wearable.FILTER_ANY); if (target == null) return false; if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; final boolean success = proficiencyCheck(mob, 0, auto); if (success) { final CMMsg msg = CMClass.getMsg(mob, target, this, verbalCastCode(mob, target, auto), null); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); mob.location() .show( mob, target, CMMsg.MSG_OK_ACTION, L("<T-NAME> @x1.", CMParms.combine(commands, 1))); } } else mob.location() .show( mob, target, CMMsg.MSG_OK_ACTION, L("<T-NAME> twitch(es) oddly, but does nothing more.")); // return whether it worked return success; }
@Override public boolean invoke( MOB mob, List<String> commands, Physical givenTarget, boolean auto, int asLevel) { final MOB target = super.getTarget(mob, commands, givenTarget); if (target == null) return false; final Race R = target.charStats().getMyRace(); if (R.bodyMask()[Race.BODY_HEAD] <= 0) { mob.tell(L("@x1 has no head!", target.name(mob))); return false; } LegalBehavior B = null; if (mob.location() != null) B = CMLib.law().getLegalBehavior(mob.location()); List<LegalWarrant> warrants = new Vector<LegalWarrant>(); if (B != null) warrants = B.getWarrantsOf(CMLib.law().getLegalObject(mob.location()), target); if ((warrants.size() == 0) && (!CMSecurity.isAllowed(mob, mob.location(), CMSecurity.SecFlag.ABOVELAW))) { mob.tell(L("You are not allowed to behead @x1 at this time.", target.Name())); return false; } final Item w = mob.fetchWieldedItem(); Weapon ww = null; if ((w == null) || (!(w instanceof Weapon))) { mob.tell(L("You cannot behead without a weapon!")); return false; } ww = (Weapon) w; if ((!auto) && (!CMSecurity.isASysOp(mob))) { if (ww.weaponDamageType() != Weapon.TYPE_SLASHING) { mob.tell(L("You cannot behead with a @x1!", ww.name())); return false; } if (mob.isInCombat() && (mob.rangeToTarget() > 0)) { mob.tell(L("You are too far away to try that!")); return false; } if (!CMLib.flags().isBoundOrHeld(target)) { mob.tell(L("@x1 is not bound and would resist.", target.charStats().HeShe())); return false; } } if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; int levelDiff = target.phyStats().level() - (mob.phyStats().level() + (2 * getXLEVELLevel(mob))); if (levelDiff > 0) levelDiff = levelDiff * 3; else levelDiff = 0; final boolean hit = (auto) || CMLib.combat().rollToHit(mob, target); boolean success = proficiencyCheck(mob, 0, auto) && (hit); if (success) { final CMMsg msg = CMClass.getMsg( mob, target, this, CMMsg.MASK_MALICIOUS | CMMsg.MASK_MOVE | CMMsg.MASK_SOUND | CMMsg.TYP_JUSTICE | (auto ? CMMsg.MASK_ALWAYS : 0), null); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); target.curState().setHitPoints(1); final Ability A2 = target.fetchEffect("Injury"); if (A2 != null) A2.setMiscText(mob.Name() + "/head"); CMLib.combat() .postDamage( mob, target, ww, Integer.MAX_VALUE / 2, CMMsg.MSG_WEAPONATTACK, ww.weaponClassification(), auto ? "" : L( "^F^<FIGHT^><S-NAME> rear(s) back and behead(s) <T-NAME>!^</FIGHT^>^?@x1", CMLib.protocol().msp("decap.wav", 30))); mob.location().recoverRoomStats(); final Item limb = CMClass.getItem("GenLimb"); limb.setName(L("@x1`s head", target.Name())); limb.basePhyStats().setAbility(1); limb.setDisplayText(L("the bloody head of @x1 is sitting here.", target.Name())); limb.setSecretIdentity(target.name() + "`s bloody head."); int material = RawMaterial.RESOURCE_MEAT; for (int r = 0; r < R.myResources().size(); r++) { final Item I = R.myResources().get(r); final int mat = I.material() & RawMaterial.MATERIAL_MASK; if (((mat == RawMaterial.MATERIAL_FLESH)) || (r == R.myResources().size() - 1)) { material = I.material(); break; } } limb.setMaterial(material); limb.basePhyStats().setLevel(1); limb.basePhyStats().setWeight(5); limb.recoverPhyStats(); mob.location().addItem(limb, ItemPossessor.Expire.Player_Drop); for (int i = 0; i < warrants.size(); i++) { final LegalWarrant W = warrants.get(i); W.setCrime("pardoned"); W.setOffenses(0); } } else success = false; if (mob.getVictim() == target) mob.makePeace(true); if (target.getVictim() == mob) target.makePeace(true); } else maliciousFizzle(mob, target, L("<S-NAME> attempt(s) a beheading and fail(s)!")); return success; }
protected static boolean tryMerge( MOB mob, Room room, Environmental E, List things, List<String> changes, List<String> onfields, List<String> ignore, boolean noisy) { boolean didAnything = false; final List<String> efields = new Vector(); List<String> allMyFields = new Vector(); final String[] EFIELDS = E.getStatCodes(); for (int i = 0; i < EFIELDS.length; i++) if (!efields.contains(EFIELDS[i])) efields.add(EFIELDS[i]); efields.add("REJUV"); allMyFields = new XVector<String>(efields); for (int v = 0; v < ignore.size(); v++) if (efields.contains(ignore.get(v))) efields.remove(ignore.get(v)); for (int v = 0; v < changes.size(); v++) if (efields.contains(changes.get(v))) efields.remove(changes.get(v)); if (noisy) mergedebugtell(mob, "AllMy-" + CMParms.toStringList(allMyFields)); if (noisy) mergedebugtell(mob, "efields-" + CMParms.toStringList(efields)); for (int t = 0; t < things.size(); t++) { final Environmental E2 = (Environmental) things.get(t); if (noisy) mergedebugtell( mob, E.name() + "/" + E2.name() + "/" + CMClass.classID(E) + "/" + CMClass.classID(E2)); if (CMClass.classID(E).equals(CMClass.classID(E2))) { Vector fieldsToCheck = null; if (onfields.size() > 0) { fieldsToCheck = new Vector(); for (int v = 0; v < onfields.size(); v++) if (efields.contains(onfields.get(v))) fieldsToCheck.add(onfields.get(v)); } else fieldsToCheck = new XVector<String>(efields); boolean checkedOut = fieldsToCheck.size() > 0; if (noisy) mergedebugtell(mob, "fieldsToCheck-" + CMParms.toStringList(fieldsToCheck)); if (checkedOut) for (int i = 0; i < fieldsToCheck.size(); i++) { final String field = (String) fieldsToCheck.get(i); if (noisy) mergedebugtell( mob, field + "/" + getStat(E, field) + "/" + getStat(E2, field) + "/" + getStat(E, field).equals(getStat(E2, field))); if (!getStat(E, field).equals(getStat(E2, field))) { checkedOut = false; break; } } if (checkedOut) { List<String> fieldsToChange = null; if (changes.size() == 0) fieldsToChange = new XVector<String>(allMyFields); else { fieldsToChange = new Vector(); for (int v = 0; v < changes.size(); v++) if (allMyFields.contains(changes.get(v))) fieldsToChange.add(changes.get(v)); } if (noisy) mergedebugtell(mob, "fieldsToChange-" + CMParms.toStringList(fieldsToChange)); for (int i = 0; i < fieldsToChange.size(); i++) { final String field = fieldsToChange.get(i); if (noisy) mergedebugtell( mob, E.name() + " wants to change " + field + " value " + getStat(E, field) + " to " + getStat(E2, field) + "/" + (!getStat(E, field).equals(getStat(E2, field)))); if (!getStat(E, field).equals(getStat(E2, field))) { setStat(E, field, getStat(E2, field)); Log.sysOut( "Merge", "The " + CMStrings.capitalizeAndLower(field) + " field on " + E.Name() + " in " + room.roomID() + " was changed to " + getStat(E2, field) + "."); didAnything = true; } } } } } if (didAnything) { if (E instanceof Physical) ((Physical) E).recoverPhyStats(); if (E instanceof MOB) { ((MOB) E).recoverCharStats(); ((MOB) E).recoverMaxState(); } E.text(); } return didAnything; }
public Map<String, String> makeMySpellsH(List<Ability> V) { final Hashtable<String, String> spellH = new Hashtable<String, String>(); for (int v = 0; v < V.size(); v++) spellH.put(V.get(v).ID(), V.get(v).ID()); return spellH; }
@Override protected boolean autoGenInvoke( final MOB mob, List<String> commands, Physical givenTarget, final boolean auto, final int asLevel, int autoGenerate, boolean forceLevels, List<Item> crafted) { if (super.checkStop(mob, commands)) return true; if (super.checkInfo(mob, commands)) return true; final PairVector<EnhancedExpertise, Integer> enhancedTypes = enhancedTypes(mob, commands); randomRecipeFix(mob, addRecipes(mob, loadRecipes()), commands, autoGenerate); if (commands.size() == 0) { commonTell( mob, L( "Make what? Enter \"mleatherwork list\" for a list, \"mleatherworkd info <item>\", \"mleatherwork refit <item>\" to resize," + " \"mleatherwork learn <item>\", \"mleatherwork scan\", \"mleatherwork mend <item>\", or \"mleatherwork stop\" to cancel.")); return false; } if ((!auto) && (commands.size() > 0) && ((commands.get(0)).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 = commands.get(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); boolean allFlag = false; if (mask.equalsIgnoreCase("all")) { allFlag = true; mask = ""; } final StringBuffer buf = new StringBuffer(""); int toggler = 1; final int toggleTop = 2; final int[] cols = { CMLib.lister().fixColWidth(30, mob.session()), CMLib.lister().fixColWidth(3, mob.session()), CMLib.lister().fixColWidth(3, mob.session()) }; for (int r = 0; r < toggleTop; r++) buf.append( (r > 0 ? " " : "") + CMStrings.padRight(L("Item"), cols[0]) + " " + CMStrings.padRight(L("Lvl"), cols[1]) + " " + CMStrings.padRight(L("Amt"), cols[2])); buf.append("\n\r"); 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 (wood.length() > 5) { if (toggler > 1) buf.append("\n\r"); toggler = toggleTop; } 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]) + " " + CMStrings.padRightPreserve("" + wood, cols[2]) + ((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.get(0))).equalsIgnoreCase("learn")) { return doLearnRecipe(mob, commands, givenTarget, auto, asLevel); } else if (str.equalsIgnoreCase("scan")) return publicScan(mob, commands); else if (str.equalsIgnoreCase("mend")) { buildingI = null; activity = CraftingActivity.CRAFTING; messedUp = false; final Vector<String> newCommands = CMParms.parse(CMParms.combine(commands, 1)); buildingI = getTarget(mob, mob.location(), givenTarget, newCommands, Wearable.FILTER_UNWORNONLY); if (!canMend(mob, buildingI, false)) return false; activity = CraftingActivity.MENDING; if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; startStr = L("<S-NAME> start(s) mending @x1.", buildingI.name()); displayText = L("You are mending @x1", buildingI.name()); verb = L("mending @x1", buildingI.name()); } else if (str.equalsIgnoreCase("refit")) { buildingI = null; activity = CraftingActivity.CRAFTING; messedUp = false; final Vector<String> newCommands = CMParms.parse(CMParms.combine(commands, 1)); buildingI = getTarget(mob, mob.location(), givenTarget, newCommands, Wearable.FILTER_UNWORNONLY); if (buildingI == null) return false; if ((buildingI.material() & RawMaterial.MATERIAL_MASK) != RawMaterial.MATERIAL_LEATHER) { commonTell(mob, L("That's not made of leather. That can't be refitted.")); return false; } if (!(buildingI instanceof Armor)) { commonTell(mob, L("You don't know how to refit that sort of thing.")); return false; } if (buildingI.phyStats().height() == 0) { commonTell(mob, L("@x1 is already the right size.", buildingI.name(mob))); return false; } activity = CraftingActivity.REFITTING; if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; startStr = L("<S-NAME> start(s) refitting @x1.", buildingI.name()); displayText = L("You are refitting @x1", buildingI.name()); verb = L("refitting @x1", buildingI.name()); } else { buildingI = null; activity = CraftingActivity.CRAFTING; messedUp = false; aborted = false; int amount = -1; if ((commands.size() > 1) && (CMath.isNumber(commands.get(commands.size() - 1)))) { amount = CMath.s_int(commands.get(commands.size() - 1)); commands.remove(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 String name = V.get(RCP_FINALNAME); final int level = CMath.s_int(V.get(RCP_LEVEL)); if (level <= xlevel(mob)) { final int x = name.indexOf(' '); final Stage stage = Stage.valueOf(name.substring(0, x)); multiplier = stage.multiplier; foundRecipe = V; break; } } } if (foundRecipe == null) { commonTell( mob, L( "You don't know how to make a '@x1'. Try \"mleatherwork list\" for a list.", recipeName)); return false; } final String woodRequiredStr = foundRecipe.get(RCP_WOOD); final int[] compData = new int[CF_TOTAL]; final List<Object> componentsFoundList = getAbilityComponents( mob, woodRequiredStr, "make " + CMLib.english().startWithAorAn(recipeName), autoGenerate, compData); if (componentsFoundList == null) return false; int woodRequired = CMath.s_int(woodRequiredStr); woodRequired = adjustWoodRequired(woodRequired, mob); if (amount > woodRequired) woodRequired = amount; final int[] pm = {RawMaterial.MATERIAL_LEATHER}; final int[] pm1 = {RawMaterial.MATERIAL_METAL, RawMaterial.MATERIAL_MITHRIL}; final String misctype = foundRecipe.get(RCP_MISCTYPE); bundling = misctype.equalsIgnoreCase("BUNDLE"); final 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; final int lostValue = autoGenerate > 0 ? 0 : CMLib.materials() .destroyResourcesValue( mob.location(), woodRequired, data[0][FOUND_CODE], data[1][FOUND_CODE], null) + CMLib.ableComponents().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(multiplier * CMath.s_int(foundRecipe.get(RCP_TICKS)), mob, 30, 4); buildingI.setMaterial(super.getBuildingMaterial(woodRequired, data, compData)); String itemName = (replacePercent( 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); buildingI.setName(itemName); startStr = L("<S-NAME> start(s) making @x1.", buildingI.name()); displayText = L("You are making @x1", buildingI.name()); verb = L("making @x1", buildingI.name()); buildingI.setDisplayText(L("@x1 lies here", itemName)); buildingI.setDescription(itemName + ". "); buildingI .basePhyStats() .setWeight(getStandardWeight(woodRequired + compData[CF_AMOUNT], bundling)); buildingI.setBaseValue(CMath.s_int(foundRecipe.get(RCP_VALUE)) * multiplier); buildingI.setSecretIdentity(getBrand(mob)); final int hardness = RawMaterial.CODES.HARDNESS(buildingI.material()) - 2; buildingI.basePhyStats().setLevel(CMath.s_int(foundRecipe.get(RCP_LEVEL)) + hardness); final int capacity = CMath.s_int(foundRecipe.get(RCP_CAPACITY)); final long canContain = getContainerType(foundRecipe.get(RCP_CONTAINMASK)); int armordmg = CMath.s_int(foundRecipe.get(RCP_ARMORDMG)); if (armordmg != 0) armordmg = armordmg + (multiplier - 1); if (bundling) buildingI.setBaseValue(lostValue); final String spell = (foundRecipe.size() > RCP_SPELL) ? foundRecipe.get(RCP_SPELL).trim() : ""; addSpells(buildingI, spell); if (buildingI instanceof Weapon) { ((Weapon) buildingI) .basePhyStats() .setAttackAdjustment(baseYield() + abilityCode() + (hardness * 5) - 1); ((Weapon) buildingI).setWeaponClassification(Weapon.CLASS_FLAILED); setWeaponTypeClass((Weapon) buildingI, misctype, Weapon.TYPE_SLASHING); buildingI.basePhyStats().setDamage(armordmg + hardness); ((Weapon) buildingI).setRawProperLocationBitmap(Wearable.WORN_WIELD | Wearable.WORN_HELD); ((Weapon) buildingI).setRawLogicalAnd((capacity > 1)); } if ((buildingI instanceof Armor) && (!(buildingI instanceof FalseLimb))) { if ((capacity > 0) && (buildingI instanceof Container)) { ((Container) buildingI).setCapacity(capacity + woodRequired); ((Container) buildingI).setContainTypes(canContain); } ((Armor) buildingI).basePhyStats().setArmor(0); if (armordmg != 0) ((Armor) buildingI) .basePhyStats() .setArmor(armordmg + (baseYield() + abilityCode() - 1) + hardness); setWearLocation(buildingI, misctype, 0); } if (buildingI instanceof Drink) { if (CMLib.flags().isGettable(buildingI)) { ((Drink) buildingI).setLiquidRemaining(0); ((Drink) buildingI).setLiquidHeld(capacity * 50); ((Drink) buildingI).setThirstQuenched(250); if ((capacity * 50) < 250) ((Drink) buildingI).setThirstQuenched(capacity * 50); } } 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 (autoGenerate > 0) { crafted.add(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; }
@Override public boolean invoke( MOB mob, List<String> commands, Physical givenTarget, boolean auto, int asLevel) { if (commands.size() < 2) { if (mob.isMonster() && (commands.size() == 1)) { final String parm = correctItem(mob); if (parm != null) commands.add(parm); } if (commands.size() < 2) { mob.tell(L("You must specify a target, and what item to swap on the target!")); return false; } } final Item I = mob.findItem(null, commands.get(commands.size() - 1)); if ((I == null) || (!CMLib.flags().canBeSeenBy(I, mob))) { mob.tell(L("You don't seem to have '@x1'.", (commands.get(commands.size() - 1)))); return false; } if (((I instanceof Armor) && (I.basePhyStats().armor() > 1)) || ((I instanceof Weapon) && (I.basePhyStats().damage() > 1))) { mob.tell(L("@x1 is not buffoonish enough!", I.name(mob))); return false; } commands.remove(commands.size() - 1); final MOB target = getTarget(mob, commands, givenTarget); if (target == null) return false; final Item targetItem = targetItem(target); if (targetItem == null) { if (!freePosition(target)) { mob.tell(L("@x1 has no free wearing positions!", target.name(mob))); return false; } } if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; int levelDiff = target.phyStats().level() - mob.phyStats().level(); final boolean success = proficiencyCheck(mob, 0, auto); if (levelDiff > 0) levelDiff = -(levelDiff * ((!CMLib.flags().canBeSeenBy(mob, target)) ? 5 : 15)); else levelDiff = -(levelDiff * ((!CMLib.flags().canBeSeenBy(mob, target)) ? 1 : 2)); if (success) { final CMMsg msg = CMClass.getMsg( mob, target, this, (CMMsg.MSG_NOISYMOVEMENT | CMMsg.MASK_DELICATE | CMMsg.MASK_MALICIOUS) | (auto ? CMMsg.MASK_ALWAYS : 0), auto ? "" : L("<S-NAME> do(es) buffoonery to <T-NAMESELF>.")); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); long position = -1; if (targetItem != null) { position = targetItem.rawWornCode(); targetItem.unWear(); } else { final Vector<Long> free = getFreeWearingPositions(target); if (free.size() < 1) { mob.tell(L("@x1 has no free wearing positions!", target.name(mob))); return false; } if ((free.contains(Long.valueOf(Wearable.WORN_WIELD))) && ((I instanceof Weapon) || (!(I instanceof Armor)))) position = Wearable.WORN_WIELD; else position = free.elementAt(CMLib.dice().roll(1, free.size(), -1)).longValue(); } if (position >= 0) { I.unWear(); target.moveItemTo(I); I.wearAt(position); } } } else return beneficialVisualFizzle( mob, target, L("<S-NAME> attempt(s) buffoonery on <T-NAMESELF>, but fail(s).")); return success; }
@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; }
@Override public Ability fetchRandomAbility() { final List<Ability> spellsV = getMySpellsV(); if (spellsV.size() == 0) return null; return spellsV.get(CMLib.dice().roll(1, spellsV.size(), -1)); }
@Override public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { if (CMParms.combine(commands, 0).equalsIgnoreCase("auto")) { DATA.clear(); IPS.clear(); final Hashtable<String, List<MOB>> ipes = new Hashtable<String, List<MOB>>(); for (final Session S : CMLib.sessions().localOnlineIterable()) { if ((S.getAddress().length() > 0) && (S.mob() != null)) { List V = ipes.get(S.getAddress()); if (V == null) { V = new Vector(); ipes.put(S.getAddress(), V); } if (!V.contains(S.mob())) V.add(S.mob()); } } final StringBuffer rpt = new StringBuffer(""); for (final Enumeration e = ipes.keys(); e.hasMoreElements(); ) { final String addr = (String) e.nextElement(); final List<MOB> names = ipes.get(addr); if (names.size() > 1) { IPS.put(addr, names); rpt.append("Watch #" + (IPS.size()) + " added: "); for (int n = 0; n < names.size(); n++) { final MOB MN = names.get(n); if (MN.fetchEffect(ID()) == null) { final Ability A = (Ability) copyOf(); MN.addNonUninvokableEffect(A); A.setSavable(false); } rpt.append(MN.Name() + " "); } rpt.append("\n\r"); } } if (rpt.length() == 0) rpt.append("No users with duplicate IDs found. Try MULTIWATCH ADD name1 name2 ... "); mob.tell(rpt.toString()); return true; } else if (CMParms.combine(commands, 0).equalsIgnoreCase("stop")) { boolean foundLegacy = false; for (final Session S : CMLib.sessions().localOnlineIterable()) { if ((S != null) && (S.mob() != null) && (S.mob().fetchEffect(ID()) != null)) { foundLegacy = true; break; } } if ((DATA.size() == 0) && (IPS.size() == 0) && (!foundLegacy)) { mob.tell(L("Multiwatch is already off.")); return false; } for (final Enumeration<List<MOB>> e = IPS.elements(); e.hasMoreElements(); ) { final List<MOB> V = e.nextElement(); for (int v = 0; v < V.size(); v++) { final MOB M = V.get(v); final Ability A = M.fetchEffect(ID()); if (A != null) M.delEffect(A); } } for (final Session S : CMLib.sessions().localOnlineIterable()) { if ((S != null) && (S.mob() != null)) { final MOB M = S.mob(); final Ability A = M.fetchEffect(ID()); if (A != null) M.delEffect(A); } } mob.tell(L("Multiplay watcher is now turned off.")); DATA.clear(); IPS.clear(); return true; } else if ((commands.size() > 1) && ((String) commands.firstElement()).equalsIgnoreCase("add")) { final Vector V = new Vector(); for (int i = 1; i < commands.size(); i++) { final String name = (String) commands.elementAt(i); final MOB M = CMLib.players().getPlayer(name); if ((M.session() != null) && (CMLib.flags().isInTheGame(M, true))) V.addElement(M); else mob.tell(L("'@x1' is not online.", name)); } if (V.size() > 1) { for (int n = 0; n < V.size(); n++) { final MOB MN = (MOB) V.elementAt(n); if (MN.fetchEffect(ID()) == null) { final Ability A = (Ability) copyOf(); MN.addNonUninvokableEffect(A); A.setSavable(false); } } IPS.put("MANUAL" + (IPS.size() + 1), V); mob.tell(L("Manual Watch #@x1 added.", "" + IPS.size())); } return true; } else if ((commands.size() == 0) && (DATA.size() > 0) && (IPS.size() > 0)) { final StringBuffer report = new StringBuffer(""); for (final Enumeration<String> e = IPS.keys(); e.hasMoreElements(); ) { final String key = e.nextElement(); int sync = 0; final List<MOB> V = IPS.get(key); for (int v = 0; v < V.size(); v++) { final MOB M = V.get(v); final int data[] = DATA.get(M); if (data != null) sync += data[DATA_SYNCHROFOUND]; } report.append("^x" + key + "^?^., Syncs: " + sync + "\n\r"); report.append( CMStrings.padRight(L("Name"), 25) + CMStrings.padRight(L("Speech"), 15) + CMStrings.padRight(L("Socials"), 15) + CMStrings.padRight(L("CMD"), 10) + CMStrings.padRight(L("ORDERS"), 10) + "\n\r"); for (int v = 0; v < V.size(); v++) { final MOB M = V.get(v); int data[] = DATA.get(M); if (data == null) data = new int[DATA_TOTAL]; report.append(CMStrings.padRight(M.Name(), 25)); report.append( CMStrings.padRight( data[DATA_GOODSPEECH] + "/" + data[DATA_DIRSPEECH] + "/" + data[DATA_ANYSPEECH], 15)); report.append( CMStrings.padRight( data[DATA_GOODSOCIAL] + "/" + data[DATA_DIRSOCIAL] + "/" + data[DATA_ANYSOCIAL], 15)); report.append(CMStrings.padRight(data[DATA_TYPEDCOMMAND] + "", 10)); report.append(CMStrings.padRight(data[DATA_ORDER] + "", 10)); report.append("\n\r"); } report.append("\n\r"); } mob.tell(report.toString()); return true; } else { mob.tell(L("Try MULTIWATCH AUTO, MULTIWATCH STOP, or MULTIWATCH ADD name1 name2..")); return false; } }
public static int updateLotWithThisData( Room R, LandTitle T, boolean resetRoomName, boolean clearAllItems, List optPlayerList, int lastNumItems) { boolean updateItems = false; boolean updateExits = false; boolean updateRoom = false; synchronized (("SYNC" + R.roomID()).intern()) { R = CMLib.map().getRoom(R); if (T.getOwnerName().length() == 0) { Item I = null; for (int i = R.numItems() - 1; i >= 0; i--) { I = R.getItem(i); if ((I == null) || (I.Name().equalsIgnoreCase("id"))) continue; CMLib.catalog().updateCatalogIntegrity(I); if (clearAllItems) { I.destroy(); updateItems = true; } else { if (I.expirationDate() == 0) { long now = System.currentTimeMillis(); now += (TimeManager.MILI_MINUTE * CMProps.getIntVar(CMProps.Int.EXPIRE_PLAYER_DROP)); I.setExpirationDate(now); } if ((I.phyStats().rejuv() != PhyStats.NO_REJUV) && (I.phyStats().rejuv() != 0)) { I.basePhyStats().setRejuv(PhyStats.NO_REJUV); I.recoverPhyStats(); } } } Ability A = null; if (clearAllItems) for (final Enumeration<Ability> a = R.effects(); a.hasMoreElements(); ) { A = a.nextElement(); if (((A != null) && ((A.classificationCode() & Ability.ALL_ACODES) != Ability.ACODE_PROPERTY))) { A.unInvoke(); R.delEffect(A); updateRoom = true; } } for (int d = Directions.NUM_DIRECTIONS() - 1; d >= 0; d--) { final Room R2 = R.rawDoors()[d]; Exit E = R.getRawExit(d); if ((E != null) && (E.hasALock()) && (E.isGeneric())) { E.setKeyName(""); E.setDoorsNLocks(E.hasADoor(), E.isOpen(), E.defaultsClosed(), false, false, false); updateExits = true; if (R2 != null) { E = R2.getRawExit(Directions.getOpDirectionCode(d)); if ((E != null) && (E.hasALock()) && (E.isGeneric())) { E.setKeyName(""); E.setDoorsNLocks(E.hasADoor(), E.isOpen(), E.defaultsClosed(), false, false, false); CMLib.database().DBUpdateExits(R2); R2.getArea().fillInAreaRoom(R2); } } } } if (updateExits) { CMLib.database().DBUpdateExits(R); R.getArea().fillInAreaRoom(R); } if (updateItems) CMLib.database().DBUpdateItems(R); if (updateRoom) CMLib.database().DBUpdateRoom(R); colorForSale(R, T.rentalProperty(), resetRoomName); return -1; } if ((lastNumItems < 0) && (!CMSecurity.isDisabled(CMSecurity.DisFlag.PROPERTYOWNERCHECKS)) && (optPlayerList != null)) { boolean playerExists = (CMLib.players().getPlayer(T.getOwnerName()) != null); if (!playerExists) playerExists = (CMLib.clans().getClan(T.getOwnerName()) != null); if (!playerExists) playerExists = optPlayerList.contains(T.getOwnerName()); if (!playerExists) for (int i = 0; i < optPlayerList.size(); i++) if (((String) optPlayerList.get(i)).equalsIgnoreCase(T.getOwnerName())) { playerExists = true; break; } if (!playerExists) { T.setOwnerName(""); T.updateLot(null); return -1; } } int x = R.description().indexOf(SALESTR); if (x >= 0) { R.setDescription(R.description().substring(0, x)); CMLib.database().DBUpdateRoom(R); } x = R.description().indexOf(RENTSTR); if (x >= 0) { R.setDescription(R.description().substring(0, x)); CMLib.database().DBUpdateRoom(R); } // this works on the priciple that // 1. if an item has ONLY been removed, the lastNumItems will be != current # items // 2. if an item has ONLY been added, the dispossessiontime will be != null // 3. if an item has been added AND removed, the dispossession time will be != null on the // added if ((lastNumItems >= 0) && (R.numItems() != lastNumItems)) updateItems = true; for (int i = 0; i < R.numItems(); i++) { final Item I = R.getItem(i); if ((I.expirationDate() != 0) && ((I.isSavable()) || (I.Name().equalsIgnoreCase("id"))) && ((!(I instanceof DeadBody)) || (((DeadBody) I).isPlayerCorpse()))) { I.setExpirationDate(0); updateItems = true; } if ((I.phyStats().rejuv() != Integer.MAX_VALUE) && (I.phyStats().rejuv() != 0)) { I.basePhyStats().setRejuv(PhyStats.NO_REJUV); I.recoverPhyStats(); updateItems = true; } } lastNumItems = R.numItems(); if ((!CMSecurity.isSaveFlag(CMSecurity.SaveFlag.NOPROPERTYITEMS)) && (updateItems)) CMLib.database().DBUpdateItems(R); } return lastNumItems; }
@Override public void setStat(String code, String val) { if (CMLib.coffeeMaker().getGenItemCodeNum(code) >= 0) CMLib.coffeeMaker().setGenItemStat(this, code, val); else switch (getCodeNum(code)) { case 0: setDoorsNLocks( hasADoor(), isOpen(), defaultsClosed(), CMath.s_bool(val), false, CMath.s_bool(val) && defaultsLocked()); break; case 1: setDoorsNLocks( CMath.s_bool(val), isOpen(), CMath.s_bool(val) && defaultsClosed(), hasALock(), isLocked(), defaultsLocked()); break; case 2: setCapacity(CMath.s_parseIntExpression(val)); break; case 3: setContainTypes(CMath.s_parseBitLongExpression(Container.CONTAIN_DESCS, val)); break; case 4: setOpenDelayTicks(CMath.s_parseIntExpression(val)); break; case 5: setPowerCapacity(CMath.s_parseLongExpression(val)); break; case 6: { final List<String> mats = CMParms.parseCommas(val, true); final int[] newMats = new int[mats.size()]; for (int x = 0; x < mats.size(); x++) { final int rsccode = RawMaterial.CODES.FIND_CaseSensitive(mats.get(x).trim()); if (rsccode > 0) newMats[x] = rsccode; } super.setConsumedFuelType(newMats); break; } case 7: setPowerCapacity(CMath.s_parseLongExpression(val)); break; case 8: setGeneratedAmountPerTick(CMath.s_parseIntExpression(val)); break; case 9: activate(CMath.s_bool(val)); break; case 10: setManufacturerName(val); break; case 11: setInstalledFactor(CMath.s_float(val)); break; case 12: setDoorsNLocks( hasADoor(), isOpen(), CMath.s_bool(val), hasALock(), isLocked(), defaultsLocked()); break; case 13: setDoorsNLocks( hasADoor(), isOpen(), defaultsClosed(), hasALock(), isLocked(), CMath.s_bool(val)); break; default: CMProps.setStatCodeExtensionValue(getStatCodes(), xtraValues, code, val); break; } }
public static boolean doRentalProperty(Area A, String ID, String owner, int rent) { if (!CMProps.getBoolVar(CMProps.Bool.MUDSTARTED)) return false; final int month = A.getTimeObj().getMonth(); final int day = A.getTimeObj().getDayOfMonth(); final int year = A.getTimeObj().getYear(); final Object O = Resources.getResource("RENTAL INFO/" + owner); List<PlayerData> pDataV = null; if (O instanceof List) pDataV = (List<PlayerData>) O; else pDataV = CMLib.database().DBReadData(owner, "RENTAL INFO"); if (pDataV == null) pDataV = new Vector(); DatabaseEngine.PlayerData pData = null; if (pDataV.size() == 0) { pData = new DatabaseEngine.PlayerData(); pData.who = owner; pData.section = "RENTAL INFO"; pData.key = "RENTAL INFO/" + owner; pData.xml = ID + "|~>|" + day + " " + month + " " + year + "|~;|"; CMLib.database().DBCreateData(owner, "RENTAL INFO", "RENTAL INFO/" + owner, pData.xml); pDataV.add(pData); Resources.submitResource("RENTAL INFO/" + owner, pDataV); return false; } else if (pDataV.get(0) != null) { pData = pDataV.get(0); String parse = pData.xml; int x = parse.indexOf("|~;|"); final StringBuffer reparse = new StringBuffer(""); boolean changesMade = false; boolean needsToPay = false; while (x >= 0) { String thisOne = parse.substring(0, x); if (thisOne.startsWith(ID + "|~>|")) { thisOne = thisOne.substring((ID + "|~>|").length()); final Vector dateV = CMParms.parse(thisOne); if (dateV.size() == 3) { int lastYear = CMath.s_int((String) dateV.lastElement()); int lastMonth = CMath.s_int((String) dateV.elementAt(1)); final int lastDay = CMath.s_int((String) dateV.firstElement()); while (!needsToPay) { if (lastYear < year) needsToPay = true; else if ((lastYear == year) && (lastMonth < month) && (day >= lastDay)) needsToPay = true; if (needsToPay) { if (CMLib.beanCounter() .modifyLocalBankGold( A, owner, CMLib.utensils().getFormattedDate(A) + ":Withdrawal of " + rent + ": Rent for " + ID, CMLib.beanCounter().getCurrency(A), (-rent))) { lastMonth++; if (lastMonth > A.getTimeObj().getMonthsInYear()) { lastMonth = 1; lastYear++; } changesMade = true; needsToPay = false; } } else break; } if (changesMade) reparse.append(ID + "|~>|" + lastDay + " " + lastMonth + " " + lastYear + "|~;|"); if (needsToPay && (!changesMade)) return true; } } else reparse.append(thisOne + "|~;|"); parse = parse.substring(x + 4); x = parse.indexOf("|~;|"); } if (changesMade) { CMLib.database() .DBReCreateData(owner, "RENTAL INFO", "RENTAL INFO/" + owner, reparse.toString()); pData = new DatabaseEngine.PlayerData(); pData.who = owner; pData.section = "RENTAL INFO"; pData.key = "RENTAL INFO/" + owner; pData.xml = reparse.toString(); pDataV.set(0, pData); Resources.removeResource("RENTAL INFO/" + owner); Resources.submitResource("RENTAL INFO/" + owner, pDataV); } return needsToPay; } return false; }
@Override public void grantAbilities(MOB mob, boolean isBorrowedClass) { super.grantAbilities(mob, isBorrowedClass); // if he already has one, don't give another! if (mob.playerStats() != null) { final int classLevel = mob.baseCharStats().getClassLevel(this); if (classLevel < 2) return; if ((classLevel % 2) != 0) return; int maxSkills = classLevel / 2; // now only give one, for current level, respecting alignment! // first, get a list of all skills you don't qualify for that you MIGHT have gained or will // gain final List<Ability> choices = new Vector<Ability>(); for (final Enumeration<Ability> a = CMClass.abilities(); a.hasMoreElements(); ) { final Ability A = a.nextElement(); final int lql = CMLib.ableMapper().lowestQualifyingLevel(A.ID()); if ((CMLib.ableMapper().qualifyingLevel(mob, A) <= 0) && (lql < 25) && (lql > 0) && (!CMLib.ableMapper().getSecretSkill(A.ID())) && (CMLib.ableMapper().qualifiesByAnyCharClass(A.ID())) && (CMLib.ableMapper().availableToTheme(A.ID(), Area.THEME_FANTASY, true)) && (!CMLib.ableMapper().qualifiesOnlyByClan(mob, A)) && (!CMLib.ableMapper().qualifiesOnlyByRace(mob, A)) && (A.isAutoInvoked() || ((A.triggerStrings() != null) && (A.triggerStrings().length > 0)))) choices.add(A); } // now count those you already have for (int a = choices.size() - 1; a >= 0; a--) { final Ability A = choices.get(a); if (mob.fetchAbility(A.ID()) != null) maxSkills--; } if (maxSkills < 1) // if that reduced you to 0, you are done. return; // now eliminate those you already have, and those that are // above your level, if you are <25 for (int a = choices.size() - 1; a >= 0; a--) { final Ability A = choices.get(a); final int lql = CMLib.ableMapper().lowestQualifyingLevel(A.ID()); if ((mob.fetchAbility(ID()) != null) || ((lql != classLevel) && (lql != classLevel - 1) && (classLevel < 25))) choices.remove(a); } if (choices.size() == 0) return; final Ability A = choices.get(CMLib.dice().roll(1, choices.size(), -1)); if (A != null) giveMobAbility(mob, A, 0, "", isBorrowedClass); } else { final List<AbilityMapper.AbilityMapping> V = CMLib.ableMapper() .getUpToLevelListings(ID(), mob.charStats().getClassLevel(ID()), false, false); for (final AbilityMapper.AbilityMapping able : V) { final Ability A = CMClass.getAbility(able.abilityID); if ((A != null) && (!CMLib.ableMapper().getAllQualified(ID(), true, A.ID())) && (!CMLib.ableMapper().getDefaultGain(ID(), true, A.ID()))) giveMobAbility( mob, A, CMLib.ableMapper().getDefaultProficiency(ID(), true, A.ID()), CMLib.ableMapper().getDefaultParm(ID(), true, A.ID()), isBorrowedClass); } } }
protected boolean stopFalling(MOB mob) { final Room R = mob.location(); if (reversed()) { if (!hitTheCeiling) { hitTheCeiling = true; if (R != null) R.show( mob, null, CMMsg.MSG_OK_ACTION, L("<S-NAME> hit(s) the ceiling.@x1", CMLib.protocol().msp("splat.wav", 50))); CMLib.combat() .postDamage( mob, mob, this, damageToTake, CMMsg.MASK_ALWAYS | CMMsg.TYP_JUSTICE, -1, null); } return true; } hitTheCeiling = false; unInvoke(); if (R != null) { if (isAirRoom(R)) R.show( mob, null, CMMsg.MSG_OK_ACTION, L("<S-NAME> stop(s) falling.@x1", CMLib.protocol().msp("splat.wav", 50))); else if (CMLib.flags().isWaterySurfaceRoom(R) || CMLib.flags().isUnderWateryRoom(R)) R.show( mob, null, CMMsg.MSG_OK_ACTION, L("<S-NAME> hit(s) the water.@x1", CMLib.protocol().msp("splat.wav", 50))); else { R.show( mob, null, CMMsg.MSG_OK_ACTION, L("<S-NAME> hit(s) the ground.@x1", CMLib.protocol().msp("splat.wav", 50))); if (CMath.div(damageToTake, mob.maxState().getHitPoints()) > 0.05) { LimbDamage damage = (LimbDamage) mob.fetchEffect("BrokenLimbs"); if (damage == null) { damage = (LimbDamage) CMClass.getAbility("BrokenLimbs"); damage.setAffectedOne(mob); } List<String> limbs = damage.unaffectedLimbSet(); if (limbs.size() > 0) { if (mob.fetchEffect(damage.ID()) == null) { mob.addEffect(damage); damage.makeLongLasting(); } damage.damageLimb(limbs.get(CMLib.dice().roll(1, limbs.size(), -1))); } } } CMLib.combat() .postDamage( mob, mob, this, damageToTake, CMMsg.MASK_ALWAYS | CMMsg.TYP_JUSTICE, -1, null); } mob.delEffect(this); return false; }
@Override public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { final Vector areas = new Vector(); if (commands.size() == 0) areas.addElement(mob.location().getArea()); else if (((String) commands.lastElement()).equalsIgnoreCase("far")) { commands.removeElementAt(commands.size() - 1); for (final Enumeration e = CMLib.map().areas(); e.hasMoreElements(); ) areas.addElement(e.nextElement()); } else if (((String) commands.lastElement()).equalsIgnoreCase("near")) { commands.removeElementAt(commands.size() - 1); areas.addElement(mob.location().getArea()); } else areas.addElement(mob.location().getArea()); final MOB mobTarget = getTarget(mob, commands, givenTarget, true, false); Item target = null; if (mobTarget != null) { target = getItem(mobTarget); if (target == null) return maliciousFizzle( mob, mobTarget, L("<S-NAME> attempt(s) a scattering spell at <T-NAMESELF>, but nothing happens.")); } List<Item> targets = new Vector(); if (givenTarget instanceof Item) targets.add((Item) givenTarget); else if (target != null) targets.add(target); else { targets = CMLib.english().fetchItemList(mob, mob, null, commands, Wearable.FILTER_ANY, true); if (targets.size() == 0) mob.tell(L("You don't seem to be carrying that.")); } if (targets.size() == 0) return false; if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; final boolean success = proficiencyCheck(mob, 0, auto); if (success) { String str = null; if (mobTarget == null) str = auto ? L("<S-NAME> <S-IS-ARE> enveloped in a scattering field!") : L("^S<S-NAME> utter(s) a scattering spell!^?"); else str = auto ? L("<T-NAME> <T-IS-ARE> enveloped in a scattering field!") : L("^S<S-NAME> utter(s) a scattering spell, causing <T-NAMESELF> to resonate.^?"); CMMsg msg = CMClass.getMsg(mob, mobTarget, this, verbalCastCode(mob, target, auto), str); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); if (msg.value() <= 0) { for (int i = 0; i < targets.size(); i++) { target = targets.get(i); msg = CMClass.getMsg(mob, target, this, verbalCastCode(mob, target, auto), null); Room room = null; for (int x = 0; (x < 10) && (room == null); x++) room = ((Area) areas.elementAt(CMLib.dice().roll(1, areas.size(), -1))) .getRandomMetroRoom(); if (mob.location().okMessage(mob, msg) && (room != null)) { mob.location().send(mob, msg); if (msg.value() <= 0) { target.unWear(); if (target.owner() instanceof MOB) { final MOB owner = (MOB) target.owner(); mob.location() .show( owner, room, target, CMMsg.MASK_ALWAYS | CMMsg.MSG_THROW, L("<O-NAME> vanishes from <S-YOUPOSS> inventory!")); room.showOthers( owner, room, target, CMMsg.MASK_ALWAYS | CMMsg.MSG_THROW, L("<O-NAME> appears from out of nowhere!")); } else { mob.location() .show( mob, room, target, CMMsg.MASK_ALWAYS | CMMsg.MSG_THROW, L("<O-NAME> vanishes!")); room.showOthers( mob, room, target, CMMsg.MASK_ALWAYS | CMMsg.MSG_THROW, L("<O-NAME> appears from out of nowhere!")); } if (!room.isContent(target)) room.moveItemTo( target, ItemPossessor.Expire.Player_Drop, ItemPossessor.Move.Followers); room.recoverRoomStats(); } } } } } } else return maliciousFizzle( mob, mobTarget, L("<S-NAME> attempt(s) a scattering spell, but nothing happens.")); // return whether it worked return success; }
@Override public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { if ((!auto) && (!(CMLib.flags().isGood(mob)))) { mob.tell(L("Your alignment has alienated you from your god.")); return false; } final List<String> V = new Vector<String>(); if (commands.size() > 0) { V.add((String) commands.elementAt(0)); commands.removeElementAt(0); } final MOB target = getTarget(mob, V, givenTarget); if (target == null) return false; if (commands.size() == 0) { if (mob.isMonster()) commands.addElement("FLEE"); else { if (V.size() > 0) mob.tell(L("Command @x1 to do what?", V.get(0))); return false; } } if (!target.charStats().getMyRace().racialCategory().equals("Equine")) { mob.tell(L("@x1 is not a horse!", target.name(mob))); return false; } if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; final boolean success = proficiencyCheck(mob, 0, auto); if (success) { final CMMsg msg = CMClass.getMsg( mob, target, this, verbalSpeakCode(mob, target, auto), auto ? "" : L( "^S<S-NAME> command(s) <T-NAMESELF> to '@x1'.^?", CMParms.combine(commands, 0))); final CMMsg msg2 = CMClass.getMsg( mob, target, this, CMMsg.MASK_MALICIOUS | CMMsg.MASK_SOUND | CMMsg.TYP_MIND | (auto ? CMMsg.MASK_ALWAYS : 0), null); final CMMsg omsg = CMClass.getMsg(mob, target, null, CMMsg.MSG_ORDER, null); if ((mob.location().okMessage(mob, msg)) && ((mob.location().okMessage(mob, msg2))) && (mob.location().okMessage(mob, omsg))) { mob.location().send(mob, msg); if (msg.value() <= 0) { mob.location().send(mob, msg2); mob.location().send(mob, omsg); if ((msg2.value() <= 0) && (omsg.sourceMinor() == CMMsg.TYP_ORDER)) { invoker = mob; target.makePeace(); target.enqueCommand(commands, Command.METAFLAG_FORCED | Command.METAFLAG_ORDER, 0); } } } } else return maliciousFizzle( mob, target, L("<S-NAME> attempt(s) to command <T-NAMESELF>, but it definitely didn't work.")); // return whether it worked return success; }
@Override public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { if ((auto || mob.isMonster()) && ((commands.size() < 1) || (((String) commands.firstElement()).equals(mob.name())))) { commands.clear(); if (mob.numItems() > 0) commands.addElement(mob.getRandomItem()); commands.addElement(CMLib.map().getRandomArea().Name()); } final Room oldRoom = mob.location(); if (commands.size() < 2) { mob.tell(L("Teleport what object to what place or person?")); return false; } final String objectName = (String) commands.firstElement(); final Item target = mob.findItem(null, objectName); if (target == null) { mob.tell(L("You don't seem to have an item '@x1'.", objectName)); return false; } if (target.amWearingAt(Wearable.IN_INVENTORY)) { mob.tell(L("You seem to be wearing or holding the item '@x1'.", objectName)); return false; } String searchWhat = null; if (commands.size() > 2) { final String s = (String) commands.elementAt(1); if (s.equalsIgnoreCase("room")) searchWhat = "R"; if (s.equalsIgnoreCase("area")) searchWhat = "E"; if (s.equalsIgnoreCase("mob")) searchWhat = "M"; if (s.equalsIgnoreCase("monster")) searchWhat = "M"; if (s.equalsIgnoreCase("player")) searchWhat = "P"; if (s.equalsIgnoreCase("user")) searchWhat = "P"; if (s.equalsIgnoreCase("item")) searchWhat = "I"; if (s.equalsIgnoreCase("object")) searchWhat = "I"; if (searchWhat != null) commands.removeElementAt(1); } if (searchWhat == null) searchWhat = "ERIPM"; final String destinationString = CMParms.combine(commands, 1).trim().toUpperCase(); final List<Room> candidates = CMLib.map().findWorldRoomsLiberally(mob, destinationString, searchWhat, 10, 600000); if (candidates.size() == 0) { mob.tell(L("You don't know of a place called '@x1'.", destinationString.toLowerCase())); return false; } if (CMLib.flags().isSitting(mob) || CMLib.flags().isSleeping(mob)) { mob.tell(L("You need to stand up!")); return false; } Room newRoom = null; int tries = 0; while ((tries < 20) && (newRoom == null)) { newRoom = candidates.get(CMLib.dice().roll(1, candidates.size(), -1)); if (((newRoom.roomID().length() == 0) && (CMLib.dice().rollPercentage() > 50)) || ((newRoom.domainType() == Room.DOMAIN_OUTDOORS_AIR) && (CMLib.dice().rollPercentage() > 10))) { newRoom = null; continue; } final CMMsg enterMsg = CMClass.getMsg( mob, newRoom, null, CMMsg.MSG_ENTER, null, CMMsg.MSG_ENTER, null, CMMsg.MSG_ENTER, null); if (!newRoom.okMessage(mob, enterMsg)) newRoom = null; tries++; } if ((newRoom == null) || (newRoom == oldRoom)) { mob.tell(L("Your magic seems unable to send anything there.")); return false; } if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; boolean success = proficiencyCheck(mob, 0, auto); final CMMsg msg = CMClass.getMsg( mob, target, this, somanticCastCode(mob, target, auto), L("^S<S-NAME> invoke(s) a teleportation spell upon <T-NAME>.^?")); if (oldRoom.okMessage(mob, msg)) { oldRoom.send(mob, msg); newRoom.bringMobHere(mob, false); target.unWear(); success = CMLib.commands().postDrop(mob, target, true, false, false) && (!mob.isMine(target)); oldRoom.bringMobHere(mob, false); if (success) { oldRoom.show(mob, target, null, CMMsg.MSG_OK_VISUAL, L("<T-NAME> vanishes!")); newRoom.showOthers( mob, target, null, CMMsg.MSG_OK_VISUAL, L("<T-NAME> appear(s) out of nowhere!")); } else mob.tell(L("Nothing happens.")); } // return whether it worked return success; }