public void recursiveDropMOB(MOB mob, Room room, Item thisContainer, boolean bodyFlag) { // caller is responsible for recovering any env // stat changes! if (CMLib.flags().isHidden(thisContainer)) thisContainer .baseEnvStats() .setDisposition( thisContainer.baseEnvStats().disposition() & ((int) EnvStats.ALLMASK - EnvStats.IS_HIDDEN)); mob.delInventory(thisContainer); thisContainer.unWear(); if (!bodyFlag) bodyFlag = (thisContainer instanceof DeadBody); if (bodyFlag) { room.addItem(thisContainer); thisContainer.setExpirationDate(0); } else room.addItemRefuse(thisContainer, CMProps.getIntVar(CMProps.SYSTEMI_EXPIRE_PLAYER_DROP)); thisContainer.recoverEnvStats(); boolean nothingDone = true; do { nothingDone = true; for (int i = 0; i < mob.inventorySize(); i++) { Item thisItem = mob.fetchInventory(i); if ((thisItem != null) && (thisItem.container() == thisContainer)) { recursiveDropMOB(mob, room, thisItem, bodyFlag); nothingDone = false; break; } } } while (!nothingDone); }
public void confirmWearability(MOB mob) { if (mob == null) return; Race R = mob.charStats().getMyRace(); DVector reWearSet = new DVector(2); Item item = null; for (int i = 0; i < mob.inventorySize(); i++) { item = mob.fetchInventory(i); if ((item != null) && (!item.amWearingAt(Wearable.IN_INVENTORY))) { Long oldCode = Long.valueOf(item.rawWornCode()); item.unWear(); if (reWearSet.size() == 0) reWearSet.addElement(item, oldCode); else { short layer = (item instanceof Armor) ? ((Armor) item).getClothingLayer() : 0; int d = 0; for (; d < reWearSet.size(); d++) if (reWearSet.elementAt(d, 1) instanceof Armor) { if (((Armor) reWearSet.elementAt(d, 1)).getClothingLayer() > layer) break; } else if (0 > layer) break; if (d >= reWearSet.size()) reWearSet.addElement(item, oldCode); else reWearSet.insertElementAt(d, item, oldCode); } } } for (int r = 0; r < reWearSet.size(); r++) { item = (Item) reWearSet.elementAt(r, 1); long oldCode = ((Long) reWearSet.elementAt(r, 2)).longValue(); int msgCode = CMMsg.MSG_WEAR; if ((oldCode & Wearable.WORN_WIELD) > 0) msgCode = CMMsg.MSG_WIELD; else if ((oldCode & Wearable.WORN_HELD) > 0) msgCode = CMMsg.MSG_HOLD; CMMsg msg = CMClass.getMsg( mob, item, null, CMMsg.NO_EFFECT, null, msgCode, null, CMMsg.NO_EFFECT, null); if ((R.okMessage(mob, msg)) && (item.okMessage(item, msg)) && ((mob.charStats().getWearableRestrictionsBitmap() & oldCode) == 0) && (item.canWear(mob, oldCode))) item.wearAt(oldCode); } // why wasn't that here before? mob.recoverEnvStats(); mob.recoverCharStats(); mob.recoverMaxState(); }
@Override public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { final Item target = getTarget(mob, mob.location(), givenTarget, commands, Wearable.FILTER_ANY); if (target == null) return false; if (!(target instanceof Weapon)) { mob.tell(L("That's not a weapon!")); 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); target.unWear(); if (mob.isMine(target)) mob.location() .show(mob, target, CMMsg.MSG_DROP, L("<T-NAME> flies out of <S-YOUPOSS> hands!")); else mob.location() .show(mob, target, CMMsg.MSG_OK_ACTION, L("<T-NAME> starts flying around!")); if (mob.location().isContent(target)) beneficialAffect(mob, target, asLevel, 0); } } 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, Vector commands, Physical givenTarget, boolean auto, int asLevel) { boolean announce = false; if (commands.size() > 0) { if (((String) commands.lastElement()).equals("!")) { commands.removeElementAt(commands.size() - 1); announce = true; } } final MOB target = getTargetAnywhere(mob, commands, givenTarget, true); 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, CMMsg.MASK_MOVE | CMMsg.TYP_JUSTICE | (auto ? CMMsg.MASK_ALWAYS : 0), auto ? L("<T-NAME> <T-IS-ARE> knocked out of <T-HIS-HER> shoes!!!") : L( "^F**<S-NAME> BLAST(S) <T-NAMESELF>**, knocking <T-HIM-HER> out of <T-HIS-HER> shoes!!^?")); CMLib.color().fixSourceFightColor(msg); if (target.location().okMessage(mob, msg)) { target.location().send(mob, msg); if (target.curState().getHitPoints() > 2) target.curState().setHitPoints(target.curState().getHitPoints() / 2); if (target.curState().getMana() > 2) target.curState().setMana(target.curState().getMana() / 2); if (target.curState().getMovement() > 2) target.curState().setMovement(target.curState().getMovement() / 2); final Item I = target.fetchFirstWornItem(Wearable.WORN_FEET); if (I != null) { I.unWear(); I.removeFromOwnerContainer(); target.location().addItem(I, ItemPossessor.Expire.Player_Drop); } Log.sysOut("Banish", mob.Name() + " wrathed " + target.name() + "."); if (announce) { final Command C = CMClass.getCommand("Announce"); try { C.execute( mob, new XVector( "ANNOUNCE", target.name() + " is knocked out of " + target.charStats().hisher() + " shoes!!!"), Command.METAFLAG_FORCED); } catch (final Exception e) { } } } } else return beneficialVisualFizzle( mob, target, L("<S-NAME> attempt(s) to inflict <S-HIS-HER> wrath upon <T-NAMESELF>, but fail(s).")); return success; }
@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(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) { final MOB mobTarget = getTarget(mob, commands, givenTarget, true, false); Item target = getPossibility(mobTarget); if (target == null) target = getTarget(mob, mob.location(), givenTarget, commands, Wearable.FILTER_ANY); if (target == null) return false; if (((target.material() & RawMaterial.MATERIAL_MASK) != RawMaterial.MATERIAL_WOODEN) || (!target.subjectToWearAndTear())) { mob.tell(L("That can't be warped.")); 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), auto ? L("<T-NAME> starts warping!") : L("^S<S-NAME> chant(s) at <T-NAMESELF>.^?")); final CMMsg msg2 = CMClass.getMsg(mob, mobTarget, this, verbalCastCode(mob, mobTarget, auto), null); if ((mob.location().okMessage(mob, msg)) && ((mobTarget == null) || (mob.location().okMessage(mob, msg2)))) { mob.location().send(mob, msg); if (mobTarget != null) mob.location().send(mob, msg2); if (msg.value() <= 0) { int damage = 100 + (mob.phyStats().level() + (2 * super.getXLEVELLevel(mob))) - target.phyStats().level(); if (CMLib.flags().isABonusItems(target)) damage = (int) Math.round(CMath.div(damage, 2.0)); target.setUsesRemaining(target.usesRemaining() - damage); if (mobTarget == null) mob.location() .show(mob, target, CMMsg.MSG_OK_VISUAL, L("<T-NAME> begin(s) to twist and warp!")); else mob.location() .show( mobTarget, target, CMMsg.MSG_OK_VISUAL, L("<T-NAME>, possessed by <S-NAME>, twists and warps!")); if (target.usesRemaining() > 0) target.recoverPhyStats(); else { target.setUsesRemaining(100); mob.location().show(mob, target, CMMsg.MSG_OK_VISUAL, L("<T-NAME> is destroyed!")); target.unWear(); target.destroy(); mob.location().recoverRoomStats(); } } } } else return maliciousFizzle(mob, null, L("<S-NAME> chant(s), 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 || 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; }