public boolean execute(MOB mob, Vector commands, int metaFlags) throws java.io.IOException { if (commands != null) commands.removeElementAt(0); if ((commands == null) || (commands.size() == 0)) { if (!CMLib.flags().isSleeping(mob)) mob.tell("You aren't sleeping!?"); else { CMMsg msg = CMClass.getMsg(mob, null, null, CMMsg.MSG_STAND, "<S-NAME> awake(s) and stand(s) up."); if (mob.location().okMessage(mob, msg)) mob.location().send(mob, msg); } } else { String whom = CMParms.combine(commands, 0); MOB M = mob.location().fetchInhabitant(whom); if ((M == null) || (!CMLib.flags().canBeSeenBy(M, mob))) { mob.tell("You don't see '" + whom + "' here."); return false; } if (!CMLib.flags().isSleeping(M)) { mob.tell(M.name() + " is awake!"); return false; } CMMsg msg = CMClass.getMsg( mob, M, null, CMMsg.MSG_NOISYMOVEMENT, "<S-NAME> attempt(s) to wake <T-NAME> up."); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); execute(M, null, metaFlags | Command.METAFLAG_ORDER); } } return false; }
public void unInvoke() { // undo the affects of this spell if ((affected == null) || (!(affected instanceof MOB))) return; MOB mob = (MOB) affected; super.unInvoke(); if ((canBeUninvoked()) && (mob.location() != null)) { if ((failed) || (!CMLib.flags().isSitting(mob)) || (room == null) || (title == null) || (mob.location() != room)) mob.tell("You are no longer squatting."); else if (title.landOwner().length() > 0) { mob.tell( "Your squat has succeeded. This property no longer belongs to " + title.landOwner() + "."); title.setLandOwner(""); title.updateTitle(); title.updateLot(null); } else if (title.landOwner().length() > 0) { mob.tell("Your squat has succeeded. This property now belongs to you."); title.setLandOwner(mob.Name()); title.updateTitle(); title.updateLot(new XVector(mob.name())); } } failed = false; }
public boolean okMessage(final Environmental myHost, final CMMsg msg) { if (!super.okMessage(myHost, msg)) return false; if (msg.amITarget(this)) { MOB mob = msg.source(); switch (msg.targetMinor()) { case CMMsg.TYP_DRINK: if ((mob.isMine(this)) || (phyStats().weight() > 1000) || (!CMLib.flags().isGettable(this))) { if (!containsDrink()) { mob.tell(name() + " is empty."); return false; } if ((liquidType() == RawMaterial.RESOURCE_SALTWATER) || (liquidType() == RawMaterial.RESOURCE_LAMPOIL)) { mob.tell( "You don't want to be drinking " + RawMaterial.CODES.NAME(liquidType()).toLowerCase() + "."); return false; } return true; } mob.tell("You don't have that."); return false; case CMMsg.TYP_FILL: if ((liquidRemaining() >= amountOfLiquidHeld) && (liquidHeld() < 500000)) { mob.tell(name() + " is full."); return false; } if ((msg.tool() != null) && (msg.tool() != msg.target()) && (msg.tool() instanceof Drink)) { Drink thePuddle = (Drink) msg.tool(); if (!thePuddle.containsDrink()) { mob.tell(thePuddle.name() + " is empty."); return false; } if ((liquidRemaining() > 0) && (liquidType() != thePuddle.liquidType())) { mob.tell( "There is still some " + RawMaterial.CODES.NAME(liquidType()).toLowerCase() + " left in " + name() + ". You must empty it before you can fill it with " + RawMaterial.CODES.NAME(thePuddle.liquidType()).toLowerCase() + "."); return false; } return true; } mob.tell("You can't fill " + name() + " from that."); return false; default: break; } } return true; }
public boolean tick(Tickable ticking, int tickID) { if (!super.tick(ticking, tickID)) return false; if ((tickID == Tickable.TICKID_MOB) && (affected == spy)) { if (spy.amDead() || (spy.amFollowing() != invoker) || (!CMLib.flags().isInTheGame(spy, false))) unInvoke(); } return true; }
public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { if (commands.size() < 1) { mob.tell("Chant to whom?"); return false; } String mobName = CMParms.combine(commands, 0).trim().toUpperCase(); MOB target = getTarget(mob, commands, givenTarget); Room newRoom = mob.location(); if (target != null) { newRoom = target.location(); if ((!CMLib.flags().isAnimalIntelligence(target)) || (target.amFollowing() != mob)) { mob.tell("You have no animal follower named '" + mobName + "' here."); return false; } } else { mob.tell("You have no animal follower named '" + mobName + "' here."); return false; } if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; boolean success = proficiencyCheck(mob, 0, auto); if (success) { CMMsg msg = CMClass.getMsg( mob, target, this, verbalCastCode(mob, target, auto), auto ? "" : "^S<S-NAME> chant(s) to <T-NAMESELF>, invoking the a mystical connection.^?"); CMMsg msg2 = CMClass.getMsg(mob, target, this, verbalCastCode(mob, target, auto), null); if ((mob.location().okMessage(mob, msg)) && ((newRoom == mob.location()) || (newRoom.okMessage(mob, msg2)))) { mob.location().send(mob, msg); if (newRoom != mob.location()) newRoom.send(target, msg2); spy = target; beneficialAffect(mob, spy, asLevel, 0); Ability A = spy.fetchEffect(ID()); if (A != null) { mob.addNonUninvokableEffect((Ability) A.copyOf()); A.setAffectedOne(spy); } } } else beneficialVisualFizzle( mob, target, "<S-NAME> chant(s) to <T-NAMESELF>, but the magic fades."); // return whether it worked return success; }
public void executeMsg(final Environmental myHost, final CMMsg msg) { try { super.executeMsg(myHost, msg); if (spy == null) return; if (invoker == null) return; if ((msg.amISource(spy)) && ((msg.sourceMinor() == CMMsg.TYP_LOOK) || (msg.sourceMinor() == CMMsg.TYP_EXAMINE)) && (msg.target() != null) && ((invoker.location() != spy.location()) || (!(msg.target() instanceof Room)))) { disable = true; CMMsg newAffect = CMClass.getMsg(invoker, msg.target(), msg.sourceMinor(), null); msg.target().executeMsg(invoker, newAffect); } else if ((!msg.amISource(invoker)) && (invoker.location() != spy.location()) && (msg.source().location() == spy.location()) && (msg.othersCode() != CMMsg.NO_EFFECT) && (msg.othersMessage() != null) && (!disable)) { disable = true; invoker.executeMsg(invoker, msg); } else if (msg.amISource(invoker) && (!disable) && (msg.sourceMinor() == CMMsg.TYP_SPEAK) && (msg.sourceMessage() != null) && ((msg.sourceMajor() & CMMsg.MASK_MAGIC) == 0)) { int start = msg.sourceMessage().indexOf("\'"); int end = msg.sourceMessage().lastIndexOf("\'"); if ((start > 0) && (end > start)) { String msg2 = msg.sourceMessage().substring(start + 1, end).trim(); if (msg2.length() > 0) spy.enqueCommand(CMParms.parse(msg2.trim()), Command.METAFLAG_FORCED, 0); } } } finally { disable = false; if ((spy != null) && ((spy.amFollowing() != invoker) || (spy.amDead()) || (!CMLib.flags().isInTheGame(spy, false)) || (!CMLib.flags().isInTheGame(invoker, true)))) unInvoke(); } }
public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { if (mob.fetchEffect("Thief_Hide") != null) { mob.tell("You are already hiding."); return false; } if (mob.isInCombat()) { mob.tell("Not while in combat!"); return false; } if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; Set<MOB> H = mob.getGroupMembers(new HashSet<MOB>()); if (!H.contains(mob)) H.add(mob); int numBesidesMe = 0; for (Iterator e = H.iterator(); e.hasNext(); ) { MOB M = (MOB) e.next(); if ((M != mob) && (mob.location().isInhabitant(M))) numBesidesMe++; } if (numBesidesMe == 0) { mob.tell("You need a group to set up an ambush!"); return false; } for (int i = 0; i < mob.location().numInhabitants(); i++) { MOB M = mob.location().fetchInhabitant(i); if ((M != null) && (M != mob) && (!H.contains(M)) && (CMLib.flags().canSee(M))) { mob.tell(M, null, null, "<S-NAME> is watching you too closely."); return false; } } boolean success = proficiencyCheck(mob, 0, auto); if (!success) beneficialVisualFizzle(mob, null, "<S-NAME> attempt(s) to set up an ambush, but fail(s)."); else { CMMsg msg = CMClass.getMsg( mob, null, this, auto ? CMMsg.MSG_OK_ACTION : (CMMsg.MSG_DELICATE_HANDS_ACT | CMMsg.MASK_MOVE), "<S-NAME> set(s) up an ambush, directing everyone to hiding places."); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); invoker = mob; Ability hide = CMClass.getAbility("Thief_Hide"); for (Iterator e = H.iterator(); e.hasNext(); ) { MOB M = (MOB) e.next(); hide.invoke(M, M, true, adjustedLevel(mob, asLevel)); } } else success = false; } return success; }
public void executeMsg(Environmental host, CMMsg msg) { if (affected instanceof MOB) { MOB mob = (MOB) affected; if ((msg.source() == mob) && (msg.target() == mob.location()) && (msg.targetMinor() == CMMsg.TYP_LEAVE)) { failed = true; unInvoke(); } else if ((CMLib.flags().isStanding(mob)) || (mob.location() != room)) { failed = true; unInvoke(); } } super.executeMsg(host, msg); }
public static void pickAWimpyFight( MOB observer, boolean mobKiller, boolean misBehave, String attackMsg, String zapStr) { if (!canFreelyBehaveNormal(observer)) return; Room R = observer.location(); if (R != null) for (int i = 0; i < R.numInhabitants(); i++) { MOB mob = R.fetchInhabitant(i); if ((mob != null) && (mob != observer) && (CMLib.flags().isSleeping(mob)) && (CMLib.masking().maskCheck(zapStr, observer, false))) { startFight(observer, mob, mobKiller, misBehave, attackMsg); if (observer.isInCombat()) break; } } }
public boolean execute(MOB mob, Vector commands, int metaFlags) throws java.io.IOException { boolean quiet = false; if (mob == null) return false; Room R = mob.location(); if (R == null) return false; if ((commands.size() > 2) && (commands.lastElement() instanceof String) && (((String) commands.lastElement()).equalsIgnoreCase("UNOBTRUSIVELY"))) { commands.removeElementAt(commands.size() - 1); quiet = true; } if ((commands.size() > 1) && (commands.elementAt(1) instanceof MOB)) return processFollow(mob, (MOB) commands.elementAt(1), quiet); if (commands.size() < 2) { mob.tell("Follow whom?"); return false; } String whomToFollow = CMParms.combine(commands, 1); if ((whomToFollow.equalsIgnoreCase("self") || whomToFollow.equalsIgnoreCase("me")) || (mob.name().toUpperCase().startsWith(whomToFollow))) { nofollow(mob, true, quiet); return false; } MOB target = R.fetchInhabitant(whomToFollow); if ((target == null) || (!CMLib.flags().canBeSeenBy(target, mob))) { mob.tell("I don't see them here."); return false; } if ((target.isMonster()) && (!mob.isMonster())) { mob.tell("You cannot follow '" + target.name() + "'."); return false; } if (CMath.bset(target.getBitmap(), MOB.ATT_NOFOLLOW)) { mob.tell(target.name() + " is not accepting followers."); return false; } MOB ultiTarget = target.amUltimatelyFollowing(); if ((ultiTarget != null) && (CMath.bset(ultiTarget.getBitmap(), MOB.ATT_NOFOLLOW))) { mob.tell(ultiTarget.name() + " is not accepting followers."); return false; } processFollow(mob, target, quiet); return false; }
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 tick(Tickable ticking, int tickID) { if (!super.tick(ticking, tickID)) return false; if ((tickID == Tickable.TICKID_MOB) && (affected != null) && (affected instanceof MOB)) { MOB mob = (MOB) affected; if ((mob.isInCombat()) && (CMLib.flags().aliveAwakeMobileUnbound(mob, true)) && (mob.rangeToTarget() == 0) && (mob.charStats().getBodyPart(Race.BODY_HAND) > 1) && (!anyWeapons(mob))) { if (CMLib.dice().rollPercentage() > 95) helpProficiency(mob, 0); if ((naturalWeapon == null) || (naturalWeapon.amDestroyed())) { naturalWeapon = CMClass.getWeapon("GenWeapon"); naturalWeapon.setName("a knife hand"); naturalWeapon.setWeaponType(Weapon.TYPE_PIERCING); naturalWeapon.basePhyStats().setDamage(7); naturalWeapon.recoverPhyStats(); } CMLib.combat().postAttack(mob, mob.getVictim(), naturalWeapon); } } return true; }
public boolean mayICraft(final Item I) { if (I == null) return false; if (!super.mayBeCrafted(I)) return false; if (I.material() == RawMaterial.RESOURCE_PAPER) return false; if ((I.material() != RawMaterial.RESOURCE_COTTON) && (I.material() != RawMaterial.RESOURCE_SILK) && (I.material() != RawMaterial.RESOURCE_HEMP) && (I.material() != RawMaterial.RESOURCE_VINE) && (I.material() != RawMaterial.RESOURCE_WHEAT) && (I.material() != RawMaterial.RESOURCE_SEAWEED) && (((I.material() & RawMaterial.MATERIAL_MASK) != RawMaterial.MATERIAL_VEGETATION))) return false; if (CMLib.flags().isDeadlyOrMaliciousEffect(I)) return false; if (I instanceof Rideable) { Rideable R = (Rideable) I; int rideType = R.rideBasis(); switch (rideType) { case Rideable.RIDEABLE_LADDER: case Rideable.RIDEABLE_SLEEP: case Rideable.RIDEABLE_SIT: case Rideable.RIDEABLE_TABLE: return true; default: return false; } } if (I instanceof Shield) return true; if (I instanceof Weapon) return true; if (I instanceof Light) return true; if (I instanceof Armor) return (isANativeItem(I.Name())); if (I instanceof Container) return true; if ((I instanceof Drink) && (!(I instanceof Potion))) return true; if (I instanceof FalseLimb) return true; if (I instanceof Wand) return true; if (I.rawProperLocationBitmap() == Wearable.WORN_HELD) return true; return (isANativeItem(I.Name())); }
public boolean mayICraft(final Item I) { if (I == null) return false; if (!super.mayBeCrafted(I)) return false; if ((I.material() & RawMaterial.MATERIAL_MASK) != RawMaterial.MATERIAL_LEATHER) return false; if (CMLib.flags().isDeadlyOrMaliciousEffect(I)) return false; if (I.basePhyStats().level() < 31) return (isANativeItem(I.Name())); if (I instanceof Armor) { final long noWearLocations = Wearable.WORN_LEFT_FINGER | Wearable.WORN_RIGHT_FINGER | Wearable.WORN_EARS; if ((I.rawProperLocationBitmap() & noWearLocations) > 0) return (isANativeItem(I.Name())); return true; } if (I instanceof Rideable) { Rideable R = (Rideable) I; int rideType = R.rideBasis(); switch (rideType) { case Rideable.RIDEABLE_SLEEP: case Rideable.RIDEABLE_SIT: case Rideable.RIDEABLE_TABLE: return true; default: return false; } } if (I instanceof Shield) return true; if (I instanceof Weapon) { Weapon W = (Weapon) I; if ((W.requiresAmmunition()) || (W.weaponClassification() == Weapon.CLASS_FLAILED)) return true; return (isANativeItem(I.Name())); } if (I instanceof Container) return true; if ((I instanceof Drink) && (!(I instanceof Potion))) return true; if (I instanceof FalseLimb) return true; if (I.rawProperLocationBitmap() == Wearable.WORN_HELD) return true; return (isANativeItem(I.Name())); }
public List<Ability> returnOffensiveAffects(MOB caster, Physical fromMe) { MOB newMOB = CMClass.getFactoryMOB(); MOB newerMOB = CMClass.getFactoryMOB(); Vector offenders = new Vector(1); CMMsg msg = CMClass.getMsg(newMOB, newerMOB, null, CMMsg.MSG_LOOK, null); for (int a = 0; a < fromMe.numEffects(); a++) // personal { Ability A = fromMe.fetchEffect(a); if (A != null) { newMOB.recoverPhyStats(); A.affectPhyStats(newMOB, newMOB.phyStats()); if ((!CMLib.flags().canSee(newMOB)) || (!A.okMessage(newMOB, msg))) if ((A.invoker() == null) || ((A.invoker() != null) && (A.invoker().phyStats().level()) <= (caster.phyStats().level() + 1 + (2 * getXLEVELLevel(caster))))) offenders.addElement(A); } } newMOB.destroy(); newerMOB.destroy(); return offenders; }
public boolean grantsAggressivenessTo(MOB M) { return ((M != null) && (CMLib.flags().isSleeping(M))) && CMLib.masking().maskCheck(getParms(), M, false); }
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 invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { MOB target = mob; if ((auto) && (givenTarget != null) && (givenTarget instanceof MOB)) target = (MOB) givenTarget; if (target.fetchEffect(ID()) != null) { mob.tell(target, null, null, "<S-NAME> <S-IS-ARE> already squatting."); return false; } if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; if (CMLib.law().doesHavePriviledgesHere(mob, mob.location())) { mob.tell("This is your place already!"); return false; } LandTitle T = CMLib.law().getLandTitle(mob.location()); boolean confirmed = false; for (final Enumeration<Ability> a = mob.location().effects(); a.hasMoreElements(); ) { final Ability A = a.nextElement(); if (A == T) confirmed = true; } if (T == null) { mob.tell("This property is not available for sale, and cannot be squatted upon."); return false; } MOB warnMOB = null; if (T.landOwner().length() > 0) { Clan C = CMLib.clans().getClan(T.landOwner()); if (C == null) { MOB M = CMLib.players().getLoadPlayer(T.landOwner()); if (M != null) warnMOB = M; } else { for (Session S : CMLib.sessions().localOnlineIterable()) { if ((S.mob() != null) && (S.mob() != mob) && (S.mob().getClanID().equals(C.clanID()))) warnMOB = S.mob(); } } if ((warnMOB == null) || (!CMLib.flags().isInTheGame(warnMOB, true))) { mob.tell("The owners must be in the game for you to begin squatting."); return false; } } if (!confirmed) { mob.tell("You cannot squat on an area for sale."); return false; } if (!CMLib.flags().isSitting(mob)) { mob.tell("You must be sitting!"); return false; } boolean success = proficiencyCheck(mob, 0, auto); CMMsg msg = CMClass.getMsg( mob, null, this, auto ? CMMsg.MASK_ALWAYS : CMMsg.MSG_DELICATE_SMALL_HANDS_ACT, CMMsg.MSG_DELICATE_SMALL_HANDS_ACT, CMMsg.MSG_DELICATE_SMALL_HANDS_ACT, auto ? "" : "<S-NAME> start(s) squatting."); if (!success) return beneficialVisualFizzle( mob, null, auto ? "" : "<S-NAME> can't seem to get comfortable here."); else if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); failed = false; room = mob.location(); title = T; beneficialAffect(mob, target, asLevel, (CMProps.getIntVar(CMProps.SYSTEMI_TICKSPERMUDMONTH))); if (warnMOB != null) warnMOB.tell( "You've heard a rumor that someone is squatting on " + T.landOwner() + "'s property."); } return success; }
public boolean tick(Tickable ticking, int tickID) { int realLastWeather = super.lastWeather; if (!super.tick(ticking, tickID)) return false; Area A = CMLib.map().areaLocation(ticking); if (A == null) return false; Climate C = A.getClimateObj(); if (C == null) return false; lastWeather = realLastWeather; // handle freeze overs if ((coldWeather(lastWeather)) && (coldWeather(C.weatherType(null))) && (lastWeather != C.weatherType(null)) && (A.getTimeObj().getSeasonCode() == TimeClock.SEASON_WINTER) && (CMLib.dice().rollPercentage() < freezeOverChance)) { if (ticking instanceof Room) { Room R = (Room) ticking; if ((R.domainType() == Room.DOMAIN_OUTDOORS_WATERSURFACE) && (CMLib.dice().rollPercentage() < freezeOverChance) && (R instanceof Drink) && (((Drink) R).liquidType() == RawMaterial.RESOURCE_FRESHWATER)) { Ability A2 = CMClass.getAbility("Spell_IceSheet"); if (A2 != null) { MOB mob = CMLib.map().getFactoryMOB(R); A2.invoke(mob, R, true, 0); mob.destroy(); } } } else for (Enumeration<Room> e = A.getProperMap(); e.hasMoreElements(); ) { Room R = (Room) e.nextElement(); if ((R.domainType() == Room.DOMAIN_OUTDOORS_WATERSURFACE) && (CMLib.dice().rollPercentage() < freezeOverChance)) { Ability A2 = CMClass.getAbility("Spell_IceSheet"); if (A2 != null) { MOB mob = CMLib.map().getFactoryMOB(R); A2.invoke(mob, R, true, 0); mob.destroy(); } } } } if ((botherDown--) == 1) { resetBotherTicks(); switch (C.weatherType(null)) { case Climate.WEATHER_BLIZZARD: case Climate.WEATHER_SLEET: case Climate.WEATHER_SNOW: case Climate.WEATHER_HAIL: case Climate.WEATHER_THUNDERSTORM: case Climate.WEATHER_RAIN: for (Enumeration<Room> r = A.getProperMap(); r.hasMoreElements(); ) { Room R = (Room) r.nextElement(); if (CMLib.map().hasASky(R)) for (int i = 0; i < R.numInhabitants(); i++) { MOB mob = R.fetchInhabitant(i); if ((mob != null) && (!mob.isMonster()) && (CMLib.flags().aliveAwakeMobile(mob, true)) && (CMath.bset(mob.getBitmap(), MOB.ATT_AUTOWEATHER))) mob.tell(C.getWeatherDescription(A)); } } break; } } if ((diseaseDown--) == 1) { resetDiseaseTicks(); int coldChance = 0; int fluChance = 0; int frostBiteChance = 0; int heatExhaustionChance = 0; switch (C.weatherType(null)) { case Climate.WEATHER_BLIZZARD: case Climate.WEATHER_SLEET: case Climate.WEATHER_SNOW: coldChance = 99; fluChance = 25; frostBiteChance = 15; break; case Climate.WEATHER_HAIL: coldChance = 50; frostBiteChance = 10; break; case Climate.WEATHER_THUNDERSTORM: case Climate.WEATHER_RAIN: coldChance = 25; break; case Climate.WEATHER_WINTER_COLD: coldChance = 75; fluChance = 10; frostBiteChance = 5; break; case Climate.WEATHER_HEAT_WAVE: heatExhaustionChance = 15; break; case Climate.WEATHER_DROUGHT: heatExhaustionChance = 20; break; } for (Session S : CMLib.sessions().localOnlineIterable()) { if ((S.mob() == null) || (S.mob().location() == null) || (S.mob().location().getArea() != A) || (S.mob().isMonster())) continue; MOB M = S.mob(); Room R = M.location(); if ((R.domainConditions() & Room.CONDITION_COLD) > 0) { if (coldChance > 0) coldChance += 10; if (coldChance > 0) fluChance += 5; // yes, cold is related this way to flu if (frostBiteChance > 0) frostBiteChance = frostBiteChance + (int) Math.round(CMath.mul(frostBiteChance, 0.5)); } if ((R.domainConditions() & Room.CONDITION_HOT) > 0) { if (heatExhaustionChance > 0) heatExhaustionChance += 10; } if ((R.domainConditions() & Room.CONDITION_WET) > 0) { if (coldChance > 0) coldChance += 5; if (heatExhaustionChance > 5) heatExhaustionChance -= 5; if (frostBiteChance > 0) frostBiteChance = frostBiteChance + (int) Math.round(CMath.mul(frostBiteChance, 0.25)); } int save = (M.charStats().getSave(CharStats.STAT_SAVE_COLD) + M.charStats().getSave(CharStats.STAT_SAVE_WATER)) / 2; if ((CMLib.dice().rollPercentage() < (coldChance - save)) && ((C.weatherType(M.location()) != Climate.WEATHER_CLEAR))) { long coveredPlaces = 0; for (int l = 0; l < ALL_COVERED_SPOTS.length; l++) if (M.getWearPositions(ALL_COVERED_SPOTS[l]) == 0) coveredPlaces = coveredPlaces | ALL_COVERED_SPOTS[l]; Item I = null; for (int i = 0; i < M.numItems(); i++) { I = M.getItem(i); if ((I == null) || (I.amWearingAt(Wearable.IN_INVENTORY))) continue; if (I.amWearingAt(Wearable.WORN_ABOUT_BODY)) coveredPlaces = coveredPlaces | Wearable.WORN_TORSO | Wearable.WORN_LEGS; for (int l = 0; l < ALL_COVERED_SPOTS.length; l++) if (I.amWearingAt(ALL_COVERED_SPOTS[l])) coveredPlaces = coveredPlaces | ALL_COVERED_SPOTS[l]; } if ((coveredPlaces != ALL_COVERED_CODE) && (!CMSecurity.isDisabled(CMSecurity.DisFlag.AUTODISEASE))) { Ability COLD = CMClass.getAbility("Disease_Cold"); if (CMLib.dice().rollPercentage() < (fluChance + (((M.location().domainConditions() & Room.CONDITION_WET) > 0) ? 10 : 0))) COLD = CMClass.getAbility("Disease_Flu"); if ((COLD != null) && (M.fetchEffect(COLD.ID()) == null)) COLD.invoke(M, M, true, 0); } } if ((CMLib.dice().rollPercentage() < (frostBiteChance - save)) && ((C.weatherType(M.location()) != Climate.WEATHER_CLEAR))) { long unfrostedPlaces = 0; for (int l = 0; l < ALL_FROST_SPOTS.length; l++) if (M.getWearPositions(ALL_FROST_SPOTS[l]) == 0) unfrostedPlaces = unfrostedPlaces | ALL_FROST_SPOTS[l]; Item I = null; for (int i = 0; i < M.numItems(); i++) { I = M.getItem(i); if ((I == null) || (I.amWearingAt(Wearable.IN_INVENTORY))) continue; for (int l = 0; l < ALL_FROST_SPOTS.length; l++) if (I.amWearingAt(ALL_FROST_SPOTS[l])) unfrostedPlaces = unfrostedPlaces | ALL_FROST_SPOTS[l]; } if ((unfrostedPlaces != ALL_FROST_CODE) && (!CMSecurity.isDisabled(CMSecurity.DisFlag.AUTODISEASE))) { Ability COLD = CMClass.getAbility("Disease_FrostBite"); if ((COLD != null) && (M.fetchEffect(COLD.ID()) == null)) COLD.invoke(M, M, true, 0); } } if ((heatExhaustionChance > 0) && (CMLib.dice().rollPercentage() < (heatExhaustionChance - M.charStats().getSave(CharStats.STAT_SAVE_FIRE))) && (C.weatherType(M.location()) != Climate.WEATHER_CLEAR) && (!CMSecurity.isDisabled(CMSecurity.DisFlag.AUTODISEASE))) { Ability COLD = CMClass.getAbility("Disease_HeatExhaustion"); if ((COLD != null) && (M.fetchEffect(COLD.ID()) == null)) COLD.invoke(M, M, true, 0); } } } if ((rumbleDown--) == 1) { resetRumbleTicks(); for (Session S : CMLib.sessions().localOnlineIterable()) { if ((S.mob() == null) || (S.mob().location() == null) || (S.mob().location().getArea() != A) || (S.mob().isMonster()) || (!CMath.bset(S.mob().getBitmap(), MOB.ATT_AUTOWEATHER))) continue; Room R = S.mob().location(); if (R != null) { switch (C.weatherType(null)) { case Climate.WEATHER_THUNDERSTORM: { if (C.weatherType(R) != Climate.WEATHER_THUNDERSTORM) { if ((R.domainType() & Room.INDOORS) > 0) { if ((R.getArea() != null) && CMath.div( R.getArea().getAreaIStats()[Area.Stats.INDOOR_ROOMS.ordinal()], R.getArea().properSize()) < 0.90) S.mob() .tell( "^JA thunderous rumble and CRACK of lightning can be heard outside.^?" + CMProps.msp("thunder.wav", 40)); } else S.mob() .tell( "^JA thunderous rumble and CRACK of lightning can be heard.^?" + CMProps.msp("thunder.wav", 40)); } else if (R.getArea().getTimeObj().getTODCode() == TimeClock.TIME_DAY) S.mob() .tell( "^JA thunderous rumble and CRACK of lightning can be heard as the pounding rain soaks you.^?" + CMProps.msp("thunderandrain.wav", 40)); else S.mob() .tell( "^JA bolt of lightning streaks across the sky as the pounding rain soaks you!^?" + CMProps.msp("thunderandrain.wav", 40)); break; } case Climate.WEATHER_BLIZZARD: if (C.weatherType(R) == Climate.WEATHER_BLIZZARD) S.mob() .tell( "^JSwirling clouds of snow buffet you.^?" + CMProps.msp("blizzard.wav", 40)); break; case Climate.WEATHER_SNOW: if (C.weatherType(R) == Climate.WEATHER_SNOW) S.mob().tell("^JSnowflakes fall lightly on you.^?"); break; case Climate.WEATHER_DUSTSTORM: if (C.weatherType(R) == Climate.WEATHER_DUSTSTORM) S.mob() .tell( "^JSwirling clouds of dust assault you.^?" + CMProps.msp("windy.wav", 40)); break; case Climate.WEATHER_HAIL: if (C.weatherType(R) == Climate.WEATHER_HAIL) S.mob() .tell( "^JYou are being pelleted by hail! Ouch!^?" + CMProps.msp("hail.wav", 40)); break; case Climate.WEATHER_RAIN: if (C.weatherType(R) == Climate.WEATHER_RAIN) S.mob().tell("^JThe rain is soaking you!^?" + CMProps.msp("rainlong.wav", 40)); break; case Climate.WEATHER_SLEET: if (C.weatherType(R) == Climate.WEATHER_SLEET) S.mob() .tell( "^JCold and blistering sleet is soaking you numb!^?" + CMProps.msp("rain.wav", 40)); break; case Climate.WEATHER_WINDY: if (C.weatherType(R) == Climate.WEATHER_WINDY) S.mob().tell("^JThe wind gusts around you.^?" + CMProps.msp("wind.wav", 40)); break; } } } } if ((lightningDown--) == 1) { resetLightningTicks(); if (C.weatherType(null) == Climate.WEATHER_THUNDERSTORM) { boolean playerAround = false; for (Session S : CMLib.sessions().localOnlineIterable()) { if ((S.mob() == null) || (S.mob().location() == null) || (S.mob().location().getArea() != A) || (S.mob().isMonster()) || (C.weatherType(S.mob().location()) != Climate.WEATHER_THUNDERSTORM)) continue; playerAround = true; } if (playerAround) { Room R = A.getRandomProperRoom(); MOB M = R.fetchRandomInhabitant(); if (M != null) { Ability A2 = CMClass.getAbility("Chant_SummonLightning"); if (A2 != null) { A2.setMiscText("RENDER MUNDANE"); A2.invoke(M, M, true, M.phyStats().level()); } } else R = null; Room R2 = null; for (Enumeration<Room> e = A.getProperMap(); e.hasMoreElements(); ) { R2 = (Room) e.nextElement(); if ((R2 != R) && (R2.numInhabitants() > 0)) if ((A.getTimeObj().getTODCode() == TimeClock.TIME_DAY) || (C.weatherType(R2) != Climate.WEATHER_THUNDERSTORM)) { if ((R2.domainType() & Room.INDOORS) > 0) R2.showHappens( CMMsg.MSG_OK_ACTION, "^JA thunderous rumble and crack of lightning can be heard outside.^?" + CMProps.msp("thunder2.wav", 40)); else R2.showHappens( CMMsg.MSG_OK_ACTION, "^JA thunderous rumble and crack of lightning can be heard.^?" + CMProps.msp("thunder2.wav", 40)); } else R2.showHappens( CMMsg.MSG_OK_ACTION, "^JYou hear a thunderous rumble as a bolt of lightning streaks across the sky!^?" + CMProps.msp("thunder3.wav", 40)); } } } } if ((tornadoDown--) == 1) { resetTornadoTicks(); if ((C.weatherType(null) == Climate.WEATHER_THUNDERSTORM) || (C.weatherType(null) == Climate.WEATHER_WINDY)) { boolean playerAround = false; for (Session S : CMLib.sessions().localOnlineIterable()) { if ((S.mob() == null) || (S.mob().location() == null) || (S.mob().location().getArea() != A) || (S.mob().isMonster()) || (C.weatherType(S.mob().location()) != Climate.WEATHER_THUNDERSTORM)) continue; playerAround = true; } if (playerAround) { Room R = A.getRandomProperRoom(); MOB M = R.fetchRandomInhabitant(); if (M != null) { Ability A2 = CMClass.getAbility("Chant_SummonTornado"); if (A2 != null) { A2.setMiscText("RENDER MUNDANE"); MOB mob = CMLib.map().getFactoryMOB(R); A2.invoke(mob, null, true, 0); mob.destroy(); } } else R = null; Room R2 = null; for (Enumeration<Room> e = A.getProperMap(); e.hasMoreElements(); ) { R2 = (Room) e.nextElement(); if ((R2 != R) && (R2.numInhabitants() > 0)) if ((A.getTimeObj().getTODCode() == TimeClock.TIME_DAY) || (C.weatherType(R2) != Climate.WEATHER_THUNDERSTORM)) { if ((R2.domainType() & Room.INDOORS) > 0) R2.showHappens( CMMsg.MSG_OK_ACTION, "^JThe terrible rumble of a tornado can be heard outside.^?" + CMProps.msp("tornado.wav", 40)); else R2.showHappens( CMMsg.MSG_OK_ACTION, "^JThe terrible rumble of a tornado can be heard.^?" + CMProps.msp("tornado.wav", 40)); } else R2.showHappens( CMMsg.MSG_OK_ACTION, "^JA huge and terrible tornado touches down somewhere near by.^?" + CMProps.msp("tornado.wav", 40)); } } } } if ((dustDown--) == 1) { resetDustTicks(); if (C.weatherType(null) == Climate.WEATHER_DUSTSTORM) { Vector choices = new Vector(); Room R = null; for (Session S : CMLib.sessions().localOnlineIterable()) { if ((S.mob() == null) || (S.mob().location() == null) || (S.mob().location().getArea() != A) || (S.mob().isMonster()) || (C.weatherType(S.mob().location()) != Climate.WEATHER_DUSTSTORM)) continue; R = S.mob().location(); if ((R != null) && (!choices.contains(R))) choices.addElement(R); } if (choices.size() > 0) { R = (Room) choices.elementAt(CMLib.dice().roll(1, choices.size(), -1)); MOB M = R.fetchRandomInhabitant(); if ((M != null) && (C.weatherType(R) == Climate.WEATHER_DUSTSTORM) && (!CMLib.flags().isSleeping(M))) { Ability A2 = CMClass.getAbility("Skill_Dirt"); if (A2 != null) A2.invoke(M, M, true, 0); } } } } if ((hailDown--) == 1) { resetHailTicks(); if (C.weatherType(null) == Climate.WEATHER_HAIL) { Vector choices = new Vector(); Room R = null; for (Session S : CMLib.sessions().localOnlineIterable()) { if ((S.mob() == null) || (S.mob().location() == null) || (S.mob().location().getArea() != A) || (S.mob().isMonster()) || (C.weatherType(S.mob().location()) != Climate.WEATHER_HAIL)) continue; R = S.mob().location(); if ((R != null) && (!choices.contains(R))) choices.addElement(R); } if (choices.size() > 0) { R = (Room) choices.elementAt(CMLib.dice().roll(1, choices.size(), -1)); MOB M = R.fetchRandomInhabitant(); Ability A2 = CMClass.getAbility("Chant_SummonHail"); if ((A2 != null) && (C.weatherType(R) == Climate.WEATHER_HAIL)) { A2.setMiscText("RENDER MUNDANE"); A2.invoke(M, M, true, M.phyStats().level()); } } } } if ((C.weatherType(null) == Climate.WEATHER_DROUGHT) && (CMLib.dice().rollPercentage() < droughtFireChance)) { Room R = CMLib.map().roomLocation((Environmental) ticking); if ((R == null) && (ticking instanceof Area)) R = ((Area) ticking).getRandomProperRoom(); if ((R != null) && ((R.domainType() & Room.INDOORS) == 0) && (R.domainType() != Room.DOMAIN_OUTDOORS_SWAMP) && (R.domainType() != Room.DOMAIN_OUTDOORS_UNDERWATER) && (R.domainType() != Room.DOMAIN_OUTDOORS_WATERSURFACE) && ((R.domainConditions() & Room.CONDITION_WET) == 0)) { Item I = R.getRandomItem(); if ((I != null) && (CMLib.flags().isGettable(I))) switch (I.material() & RawMaterial.MATERIAL_MASK) { case RawMaterial.MATERIAL_CLOTH: case RawMaterial.MATERIAL_LEATHER: case RawMaterial.MATERIAL_PAPER: case RawMaterial.MATERIAL_VEGETATION: case RawMaterial.MATERIAL_WOODEN: { Ability A2 = CMClass.getAbility("Burning"); MOB mob = CMLib.map().getFactoryMOB(R); R.showHappens( CMMsg.MSG_OK_VISUAL, I.Name() + " spontaneously combusts in the seering heat!" + CMProps.msp("fire.wav", 40)); A2.invoke(mob, I, true, 0); mob.destroy(); } break; } } } if ((gustDown--) == 1) { resetGustTicks(); if ((C.weatherType(null) == Climate.WEATHER_WINDY) || (C.weatherType(null) == Climate.WEATHER_BLIZZARD) || (C.weatherType(null) == Climate.WEATHER_DUSTSTORM)) { Vector choices = new Vector(); Room R = null; for (Session S : CMLib.sessions().localOnlineIterable()) { if ((S.mob() == null) || (S.mob().location() == null) || (S.mob().location().getArea() != A) || (S.mob().isMonster()) || ((C.weatherType(S.mob().location()) != Climate.WEATHER_WINDY) && (C.weatherType(S.mob().location()) != Climate.WEATHER_BLIZZARD) && (C.weatherType(S.mob().location()) != Climate.WEATHER_DUSTSTORM))) continue; R = S.mob().location(); if ((R != null) && (!choices.contains(R))) choices.addElement(R); } if (choices.size() > 0) { R = (Room) choices.elementAt(CMLib.dice().roll(1, choices.size(), -1)); MOB M = CMLib.map().getFactoryMOB(R); Ability A2 = CMClass.getAbility("Chant_WindGust"); if (A2 != null) { A2.setMiscText("RENDER MUNDANE"); A2.invoke(M, M, true, M.phyStats().level()); } M.destroy(); } } } if ((rustDown--) == 1) { resetRustTicks(); for (Session S : CMLib.sessions().localOnlineIterable()) { if ((S.mob() == null) || (S.mob().location() == null) || (S.mob().location().getArea() != A) || (S.mob().isMonster())) continue; int rustChance = 0; switch (C.weatherType(S.mob().location())) { case Climate.WEATHER_BLIZZARD: case Climate.WEATHER_SLEET: case Climate.WEATHER_SNOW: rustChance = 5; break; case Climate.WEATHER_HAIL: rustChance = 5; break; case Climate.WEATHER_THUNDERSTORM: case Climate.WEATHER_RAIN: rustChance = 5; break; } MOB M = S.mob(); Room R = M.location(); switch (R.domainType()) { case Room.DOMAIN_INDOORS_UNDERWATER: case Room.DOMAIN_INDOORS_WATERSURFACE: case Room.DOMAIN_OUTDOORS_WATERSURFACE: case Room.DOMAIN_OUTDOORS_UNDERWATER: rustChance += 5; break; default: break; } if ((R.domainConditions() & Room.CONDITION_WET) > 0) rustChance += 2; if (CMLib.dice().rollPercentage() < rustChance) { int weatherType = C.weatherType(R); Vector rustThese = new Vector(); for (int i = 0; i < M.numItems(); i++) { Item I = M.getItem(i); if (I == null) continue; if ((!I.amWearingAt(Wearable.IN_INVENTORY)) && (((I.material() & RawMaterial.MATERIAL_MASK) == RawMaterial.MATERIAL_METAL)) && (I.subjectToWearAndTear()) && ((CMLib.dice().rollPercentage() > I.phyStats().ability() * 25))) rustThese.addElement(I); else if (I.amWearingAt(Wearable.WORN_ABOUT_BODY) && (((I.material() & RawMaterial.MATERIAL_MASK) != RawMaterial.MATERIAL_METAL))) { rustThese.clear(); break; } } if (R != null) for (int i = 0; i < rustThese.size(); i++) { Item I = (Item) rustThese.elementAt(i); CMMsg msg = CMClass.getMsg( M, I, null, CMMsg.MASK_ALWAYS | CMMsg.TYP_WATER, (weatherType != 0) ? "<T-NAME> rusts." : "<T-NAME> rusts in the water.", CMMsg.TYP_WATER, null, CMMsg.NO_EFFECT, null); if (R.okMessage(M, msg)) { R.send(M, msg); if (msg.value() <= 0) { I.setUsesRemaining(I.usesRemaining() - 1); if (I.usesRemaining() <= 0) { msg = CMClass.getMsg( M, null, null, CMMsg.MSG_OK_VISUAL, I.name() + " is destroyed!", null, I.name() + " carried by " + M.name() + " is destroyed!"); if (R.okMessage(M, msg)) R.send(M, msg); I.destroy(); } } } } } } } if (ticking instanceof Room) lastWeather = C.weatherType((Room) ticking); else lastWeather = C.weatherType(null); return true; }
public boolean okMessage(Environmental host, CMMsg msg) { if (!super.okMessage(host, msg)) return false; Room R = msg.source().location(); if ((host instanceof Area) && (R != null) && (R.getArea() != host)) return true; int weather = weather(host, R); // first handle the effect of storms on ranged // weapons if ((msg.targetMinor() == CMMsg.TYP_WEAPONATTACK) && (msg.source().rangeToTarget() != 0) && (msg.tool() instanceof Item) && (!(msg.tool() instanceof Electronics)) && ((msg.sourceMinor() == CMMsg.TYP_THROW) || ((msg.tool() instanceof Weapon) && ((((Weapon) msg.tool()).weaponClassification() == Weapon.CLASS_RANGED) || (((Weapon) msg.tool()).weaponClassification() == Weapon.CLASS_THROWN))))) { switch (weather) { case Climate.WEATHER_WINDY: case Climate.WEATHER_THUNDERSTORM: case Climate.WEATHER_BLIZZARD: case Climate.WEATHER_DUSTSTORM: { if ((CMLib.dice().rollPercentage() < windsheer) && (R != null)) { R.show( msg.source(), msg.target(), msg.tool(), CMMsg.MSG_OK_ACTION, "^WThe strong wind blows <S-YOUPOSS> attack against <T-NAMESELF> with <O-NAME> off target.^?"); return false; } break; } } } // then try to handle slippage in wet weather if (((msg.sourceMajor(CMMsg.MASK_MOVE))) && (R != null)) { String what = null; switch (weather) { case Climate.WEATHER_BLIZZARD: case Climate.WEATHER_SNOW: if (CMLib.dice().rollPercentage() < snowSlipChance) what = "cold wet"; break; case Climate.WEATHER_RAIN: case Climate.WEATHER_THUNDERSTORM: if (CMLib.dice().rollPercentage() < rainSlipChance) what = "slippery wet"; break; case Climate.WEATHER_SLEET: if (CMLib.dice().rollPercentage() < sleetSlipChance) what = "icy"; break; } if ((what != null) && (!CMLib.flags().isInFlight(msg.source())) && (R.domainType() != Room.DOMAIN_OUTDOORS_AIR) && (R.domainType() != Room.DOMAIN_OUTDOORS_WATERSURFACE) && (R.domainType() != Room.DOMAIN_OUTDOORS_UNDERWATER) && (CMLib.dice().rollPercentage() > ((msg.source().charStats().getStat(CharStats.STAT_DEXTERITY) * 3) + 25))) { int oldDisposition = msg.source().basePhyStats().disposition(); oldDisposition = oldDisposition & (~(PhyStats.IS_SLEEPING | PhyStats.IS_SNEAKING | PhyStats.IS_SITTING)); msg.source().basePhyStats().setDisposition(oldDisposition | PhyStats.IS_SITTING); msg.source().recoverPhyStats(); R.show( msg.source(), null, CMMsg.MSG_OK_ACTION, "^W<S-NAME> slip(s) on the " + what + " ground.^?"); return false; } } if ((R != null) && (weather == Climate.WEATHER_BLIZZARD)) { Ability A = CMClass.getAbility("Spell_ObscureSelf"); if (A != null) { A.setAffectedOne(msg.source()); if (!A.okMessage(msg.source(), msg)) return false; } } return true; }
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; }
public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { String whom = CMParms.combine(commands, 0); int dirCode = Directions.getGoodDirectionCode(whom); if (!CMLib.flags().canHear(mob)) { mob.tell("You don't hear anything."); return false; } if (room != null) for (final Enumeration<Ability> a = room.effects(); a.hasMoreElements(); ) { final Ability A = a.nextElement(); if ((A.ID().equals(ID())) && (invoker() == mob)) A.unInvoke(); } room = null; if (dirCode < 0) room = mob.location(); else { if ((mob.location().getRoomInDir(dirCode) == null) || (mob.location().getExitInDir(dirCode) == null)) { mob.tell("Listen which direction?"); return false; } room = mob.location().getRoomInDir(dirCode); if ((room.domainType() & Room.INDOORS) == 0) { mob.tell("You can only listen indoors."); return false; } } if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; boolean success = false; CMMsg msg = CMClass.getMsg( mob, null, this, auto ? CMMsg.MSG_OK_ACTION : (CMMsg.MSG_DELICATE_SMALL_HANDS_ACT), CMMsg.MSG_OK_VISUAL, CMMsg.MSG_OK_VISUAL, "<S-NAME> listen(s)" + ((dirCode < 0) ? "" : " " + Directions.getDirectionName(dirCode)) + "."); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); success = proficiencyCheck(mob, 0, auto); int numberHeard = 0; int levelsHeard = 0; for (int i = 0; i < room.numInhabitants(); i++) { MOB inhab = room.fetchInhabitant(i); if ((inhab != null) && (!CMLib.flags().isSneaking(inhab)) && (!CMLib.flags().isHidden(inhab)) && (inhab != mob)) { numberHeard++; if (inhab.phyStats().level() > (mob.phyStats().level() + (2 * super.getXLEVELLevel(mob)))) levelsHeard += (inhab.phyStats().level() - (mob.phyStats().level() + (2 * super.getXLEVELLevel(mob)))); } } if ((success) && (numberHeard > 0)) { if (((proficiency() + (getXLEVELLevel(mob) * 10)) > (50 + levelsHeard)) || (room == mob.location())) { mob.tell("You definitely hear " + numberHeard + " creature(s)."); if (proficiency() > ((room == mob.location()) ? 50 : 75)) { sourceRoom = mob.location(); beneficialAffect(mob, room, asLevel, ((room == mob.location()) ? 0 : 10)); } } else mob.tell("You definitely hear something."); } else mob.tell("You don't hear anything."); } return success; }