public void reloadCharClasses(CharClass oldC) { for (Enumeration e = CMLib.map().rooms(); e.hasMoreElements(); ) { Room room = (Room) e.nextElement(); for (int i = 0; i < room.numInhabitants(); i++) { MOB M = room.fetchInhabitant(i); if (M == null) continue; for (int c = 0; c < M.baseCharStats().numClasses(); c++) if (M.baseCharStats().getMyClass(c) == oldC) { M.baseCharStats().setMyClasses(M.baseCharStats().getMyClassesStr()); break; } for (int c = 0; c < M.charStats().numClasses(); c++) if (M.charStats().getMyClass(c) == oldC) { M.charStats().setMyClasses(M.charStats().getMyClassesStr()); break; } } for (e = CMLib.players().players(); e.hasMoreElements(); ) { MOB M = (MOB) e.nextElement(); for (int c = 0; c < M.baseCharStats().numClasses(); c++) if (M.baseCharStats().getMyClass(c) == oldC) { M.baseCharStats().setMyClasses(M.baseCharStats().getMyClassesStr()); break; } for (int c = 0; c < M.charStats().numClasses(); c++) if (M.charStats().getMyClass(c) == oldC) { M.charStats().setMyClasses(M.charStats().getMyClassesStr()); break; } } } }
@Override public void executeMsg(final Environmental myHost, final CMMsg msg) { super.executeMsg(myHost, msg); if (((msg.sourceMinor() == CMMsg.TYP_SHUTDOWN) || ((msg.targetMinor() == CMMsg.TYP_EXPIRE) && (msg.target() == affected)) || (msg.sourceMinor() == CMMsg.TYP_ROOMRESET)) && (affected instanceof Room)) { updateLot(null); final Vector mobs = new Vector(); Room R = (Room) affected; if (R != null) { synchronized (("SYNC" + R.roomID()).intern()) { R = CMLib.map().getRoom(R); for (int m = 0; m < R.numInhabitants(); m++) { final MOB M = R.fetchInhabitant(m); if ((M != null) && (M.isSavable()) && (M.getStartRoom() == R) && ((M.basePhyStats().rejuv() == 0) || (M.basePhyStats().rejuv() == PhyStats.NO_REJUV))) { CMLib.catalog().updateCatalogIntegrity(M); mobs.addElement(M); } } if (!CMSecurity.isSaveFlag(CMSecurity.SaveFlag.NOPROPERTYMOBS)) CMLib.database().DBUpdateTheseMOBs(R, mobs); } } } }
@Override public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; final boolean success = proficiencyCheck(mob, 0, auto); final String str = auto ? L("The unholy word is spoken.") : L("^S<S-NAME> speak(s) the unholy word@x1 to <T-NAMESELF>.^?", ofDiety(mob)); final Room room = mob.location(); if (room != null) for (int i = 0; i < room.numInhabitants(); i++) { final MOB target = room.fetchInhabitant(i); if (target == null) break; int affectType = CMMsg.MSG_CAST_VERBAL_SPELL; if (auto) affectType = affectType | CMMsg.MASK_ALWAYS; if (CMLib.flags().isGood(target)) affectType = affectType | CMMsg.MASK_MALICIOUS; if (success) { final CMMsg msg = CMClass.getMsg(mob, target, this, affectType, str); if (room.okMessage(mob, msg)) { room.send(mob, msg); if (msg.value() <= 0) { if (CMLib.flags().canBeHeardSpeakingBy(mob, target)) { final Item I = Prayer_Curse.getSomething(mob, true); if (I != null) { Prayer_Curse.endLowerBlessings(I, CMLib.ableMapper().lowestQualifyingLevel(ID())); I.recoverPhyStats(); } Prayer_Curse.endLowerBlessings( target, CMLib.ableMapper().lowestQualifyingLevel(ID())); beneficialAffect(mob, target, asLevel, 0); target.recoverPhyStats(); } else if (CMath.bset(affectType, CMMsg.MASK_MALICIOUS)) maliciousFizzle(mob, target, L("<T-NAME> did not hear the unholy word!")); else beneficialWordsFizzle(mob, target, L("<T-NAME> did not hear the unholy word!")); } } } else { if (CMath.bset(affectType, CMMsg.MASK_MALICIOUS)) maliciousFizzle( mob, target, L("<S-NAME> attempt(s) to speak the unholy word to <T-NAMESELF>, but flub(s) it.")); else beneficialWordsFizzle( mob, target, L("<S-NAME> attempt(s) to speak the unholy word to <T-NAMESELF>, but flub(s) it.")); return false; } } // return whether it worked return success; }
public static boolean shopkeeperMobPresent(Room R) { if (R == null) return false; MOB M = null; for (int i = 0; i < R.numInhabitants(); i++) { M = R.fetchInhabitant(i); if ((M.getStartRoom() == R) && (M.isMonster()) && (CMLib.coffeeShops().getShopKeeper(M) != null)) return true; } return false; }
@Override public boolean tick(Tickable ticking, int tickID) { if ((affected == null) || (!(affected instanceof Room))) return super.tick(ticking, tickID); if ((--damageTickDown) >= 0) return super.tick(ticking, tickID); damageTickDown = 4; HashSet H = null; if ((invoker() != null) && (invoker().location() == affected)) { H = new HashSet(); invoker().getGroupMembers(H); } final Room R = (Room) affected; for (int i = 0; i < R.numInhabitants(); i++) { final MOB M = R.fetchInhabitant(i); if ((M != null) && ((H == null) || (!H.contains(M)))) { if (invoker() != null) { final int harming = CMLib.dice().roll(1, adjustedLevel(invoker(), 0) / 3, 1); CMLib.combat() .postDamage( invoker(), M, this, harming, CMMsg.MASK_MALICIOUS | CMMsg.TYP_UNDEAD, Weapon.TYPE_BURSTING, L("The unholy aura <DAMAGE> <T-NAME>!")); } else { final int harming = CMLib.dice().roll(1, CMLib.ableMapper().lowestQualifyingLevel(ID()) / 3, 1); CMLib.combat() .postDamage( M, M, this, harming, CMMsg.MASK_MALICIOUS | CMMsg.TYP_UNDEAD, Weapon.TYPE_BURSTING, L("The unholy aura <DAMAGE> <T-NAME>!")); } if ((!M.isInCombat()) && (M.isMonster()) && (M != invoker) && (invoker != null) && (M.location() == invoker.location()) && (M.location().isInhabitant(invoker)) && (CMLib.flags().canBeSeenBy(invoker, M))) CMLib.combat().postAttack(M, invoker, M.fetchWieldedItem()); } } return super.tick(ticking, tickID); }
public Set<MOB> getEveryoneHere(MOB spareMe, Room R) { final Set<MOB> V = new HashSet<MOB>(); if (R == null) return V; for (int i = 0; i < R.numInhabitants(); i++) { final MOB M = R.fetchInhabitant(i); if ((spareMe != null) && (spareMe == M)) continue; if ((M != null) && (!CMSecurity.isAllowed(M, R, CMSecurity.SecFlag.IMMORT)) && ((mask == null) || (CMLib.masking().maskCheck(mask, M, false)))) V.add(M); } return V; // CMLib.combat().postDeath(null,M,null); }
public boolean nonIPnonMonsterWithMe(MOB me) { if ((me.location() != null) && (me.session() != null)) { final Room R = me.location(); for (int i = 0; i < R.numInhabitants(); i++) { final MOB M = R.fetchInhabitant(i); if ((M == null) || (M == me)) continue; if ((M.session() != null) && (M.session().getAddress().equals(me.session().getAddress()))) return true; } } return false; }
public MOB victimHere(Room room, MOB mob) { if (room == null) return null; if (mob == null) return null; for (int i = 0; i < room.numInhabitants(); i++) { final MOB M = room.fetchInhabitant(i); if ((M != null) && (M != mob) && (!CMLib.flags().isEvil(M)) && (mob.mayIFight(M)) && (M.phyStats().level() < (mob.phyStats().level() + 5))) return M; } return null; }
private void fillCheckDeviations(Room R, String type, Vector<Environmental> check) { if (type.equalsIgnoreCase("mobs") || type.equalsIgnoreCase("both")) { for (int m = 0; m < R.numInhabitants(); m++) { final MOB M = R.fetchInhabitant(m); if ((M != null) && (M.isSavable()) && (!alreadyDone(M, check))) check.add(M); } } if (type.equalsIgnoreCase("items") || type.equalsIgnoreCase("both")) { for (int i = 0; i < R.numItems(); i++) { final Item I = R.getItem(i); if ((I != null) && ((I instanceof Armor) || (I instanceof Weapon)) && (!alreadyDone(I, check))) check.add(I); } for (int m = 0; m < R.numInhabitants(); m++) { final MOB M = R.fetchInhabitant(m); if (M != null) { for (int i = 0; i < M.numItems(); i++) { final Item I = M.getItem(i); if ((I != null) && ((I instanceof Armor) || (I instanceof Weapon)) && (!alreadyDone(I, check))) check.add(I); } final ShopKeeper SK = CMLib.coffeeShops().getShopKeeper(M); if (SK != null) { for (final Iterator<Environmental> i = SK.getShop().getStoreInventory(); i.hasNext(); ) { final Environmental E2 = i.next(); if (E2 instanceof Item) { final Item I = (Item) E2; if (((I instanceof Armor) || (I instanceof Weapon)) && (!alreadyDone(I, check))) check.add(I); } } } } } } }
public boolean isLawHere(Room R) { if (R != null) { LegalBehavior law = CMLib.law().getLegalBehavior(R); if (law != null) { Area A = CMLib.law().getLegalObject(R); MOB M = null; for (int r = 0; r < R.numInhabitants(); r++) { M = R.fetchInhabitant(r); if ((M != null) && (law.isAnyOfficer(A, M) || law.isJudge(A, M))) return true; } } } return false; }
public boolean tick(Tickable ticking, int tickID) { if ((affected != null) && (affected instanceof Room)) { Room R = (Room) affected; if ((R.myResource() & RawMaterial.MATERIAL_MASK) == RawMaterial.MATERIAL_VEGETATION) for (int m = 0; m < R.numInhabitants(); m++) { MOB M = R.fetchInhabitant(m); if (M != null) { Ability A = M.fetchEffect("Farming"); if (A == null) A = M.fetchEffect("Foraging"); if (A != null) A.setAbilityCode(2); } } } return super.tick(ticking, tickID); }
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 void swapRaces(Race newR, Race oldR) { for (Enumeration e = CMLib.map().rooms(); e.hasMoreElements(); ) { Room room = (Room) e.nextElement(); for (int i = 0; i < room.numInhabitants(); i++) { MOB M = room.fetchInhabitant(i); if (M == null) continue; if (M.baseCharStats().getMyRace() == oldR) M.baseCharStats().setMyRace(newR); if (M.charStats().getMyRace() == oldR) M.charStats().setMyRace(newR); } for (e = CMLib.players().players(); e.hasMoreElements(); ) { MOB M = (MOB) e.nextElement(); if (M.baseCharStats().getMyRace() == oldR) M.baseCharStats().setMyRace(newR); if (M.charStats().getMyRace() == oldR) M.charStats().setMyRace(newR); } } }
@Override public int castingQuality(MOB mob, Physical target) { if (mob != null) { if (target instanceof MOB) { final Room R = ((MOB) target).location(); boolean found = false; if (R != null) for (int r = 0; r < R.numInhabitants(); r++) { final MOB M = R.fetchInhabitant(r); if ((M != null) && (M != mob) && (M != target) && (CMLib.flags().isInvisible(M))) { found = true; break; } } if (!found) return Ability.QUALITY_INDIFFERENT; } } return super.castingQuality(mob, target); }
public void extinguish(MOB source, Environmental target, boolean mundane) { if (target instanceof Room) { Room R = (Room) target; for (int m = 0; m < R.numInhabitants(); m++) { MOB M = R.fetchInhabitant(m); if (M != null) extinguish(source, M, mundane); } for (int i = 0; i < R.numItems(); i++) { Item I = R.fetchItem(i); if (I != null) extinguish(source, I, mundane); } return; } for (int a = target.numEffects() - 1; a >= 0; a--) { Ability A = target.fetchEffect(a); if ((A != null) && ((!mundane) || ((A.classificationCode() & Ability.ALL_ACODES) == Ability.ACODE_PROPERTY))) { if ((CMath.bset(A.flags(), Ability.FLAG_HEATING) && (!mundane)) || (CMath.bset(A.flags(), Ability.FLAG_FIREBASED)) || ((A.ID().equalsIgnoreCase("Spell_SummonElemental") && A.text().toUpperCase().indexOf("FIRE") >= 0))) A.unInvoke(); } } if ((target instanceof MOB) && (!mundane)) { MOB tmob = (MOB) target; if (tmob.charStats().getMyRace().ID().equals("FireElemental")) CMLib.combat().postDeath(source, (MOB) target, null); for (int i = 0; i < tmob.inventorySize(); i++) { Item I = tmob.fetchInventory(i); if (I != null) extinguish(tmob, I, mundane); } } if ((target instanceof Light) && (((Light) target).isLit())) { ((Light) target).tick(target, Tickable.TICKID_LIGHT_FLICKERS); ((Light) target).light(false); } }
public static boolean robberyCheck(LandTitle A, CMMsg msg) { if (((msg.targetMinor() == CMMsg.TYP_GET) && (!msg.isTarget(CMMsg.MASK_INTERMSG))) || (msg.targetMinor() == CMMsg.TYP_PUSH) || (msg.targetMinor() == CMMsg.TYP_PULL)) { if ((msg.target() instanceof Item) && (((Item) msg.target()).owner() == msg.source().location()) && ((!(msg.tool() instanceof Item)) || (msg.source().isMine(msg.tool()))) && (!msg.sourceMajor(CMMsg.MASK_ALWAYS)) && (A.getOwnerName().length() > 0) && (msg.source().location() != null) && (msg.othersMessage() != null) && (msg.othersMessage().length() > 0) && (!shopkeeperMobPresent(msg.source().location())) && (!CMLib.law().doesHavePriviledgesHere(msg.source(), msg.source().location()))) { final Room R = msg.source().location(); final LegalBehavior B = CMLib.law().getLegalBehavior(R); if (B != null) { for (int m = 0; m < R.numInhabitants(); m++) { final MOB M = R.fetchInhabitant(m); if (CMLib.law().doesHavePriviledgesHere(M, R)) return true; } MOB D = null; final Clan C = CMLib.clans().getClan(A.getOwnerName()); if (C != null) D = C.getResponsibleMember(); else D = CMLib.players().getLoadPlayer(A.getOwnerName()); if (D == null) return true; B.accuse( CMLib.law().getLegalObject(R), msg.source(), D, new String[] {"PROPERTYROB", "THIEF_ROBBERY"}); } } return true; } return false; }
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; }
public int processVariableEquipment(MOB mob) { int newLastTickedDateTime = 0; if (mob != null) { Room R = mob.location(); if (R != null) { for (int i = 0; i < R.numInhabitants(); i++) { MOB M = R.fetchInhabitant(i); if ((M != null) && (!M.isMonster()) && (CMSecurity.isAllowed(M, R, "CMDMOBS"))) { newLastTickedDateTime = -1; break; } } if (newLastTickedDateTime == 0) { Vector rivals = new Vector(); for (int i = 0; i < mob.inventorySize(); i++) { Item I = mob.fetchInventory(i); if ((I != null) && (I.baseEnvStats().rejuv() > 0) && (I.baseEnvStats().rejuv() < Integer.MAX_VALUE)) { Vector V = null; for (int r = 0; r < rivals.size(); r++) { Vector V2 = (Vector) rivals.elementAt(r); Item I2 = (Item) V2.firstElement(); if (I2.rawWornCode() == I.rawWornCode()) { V = V2; break; } } if (V == null) { V = new Vector(); rivals.addElement(V); } V.addElement(I); } } for (int i = 0; i < rivals.size(); i++) { Vector V = (Vector) rivals.elementAt(i); if ((V.size() == 1) || (((Item) V.firstElement()).rawWornCode() == 0)) { for (int r = 0; r < V.size(); r++) { Item I = (Item) V.elementAt(r); if (CMLib.dice().rollPercentage() < I.baseEnvStats().rejuv()) mob.delInventory(I); else { I.baseEnvStats().setRejuv(0); I.envStats().setRejuv(0); } } } else { int totalChance = 0; for (int r = 0; r < V.size(); r++) { Item I = (Item) V.elementAt(r); totalChance += I.baseEnvStats().rejuv(); } int chosenChance = CMLib.dice().roll(1, totalChance, 0); totalChance = 0; Item chosenI = null; for (int r = 0; r < V.size(); r++) { Item I = (Item) V.elementAt(r); if (chosenChance <= (totalChance + I.baseEnvStats().rejuv())) { chosenI = I; break; } totalChance += I.baseEnvStats().rejuv(); } for (int r = 0; r < V.size(); r++) { Item I = (Item) V.elementAt(r); if (chosenI != I) mob.delInventory(I); else { I.baseEnvStats().setRejuv(0); I.envStats().setRejuv(0); } } } } if (mob instanceof ShopKeeper) { rivals = new Vector(); CoffeeShop shop = ((ShopKeeper) mob).getShop(); for (int v = 0; v < shop.getBaseInventory().size(); v++) { Environmental E = (Environmental) shop.getBaseInventory().elementAt(v); if ((E.baseEnvStats().rejuv() > 0) && (E.baseEnvStats().rejuv() < Integer.MAX_VALUE)) rivals.addElement(E); } for (int r = 0; r < rivals.size(); r++) { Environmental E = (Environmental) rivals.elementAt(r); if (CMLib.dice().rollPercentage() > E.baseEnvStats().rejuv()) shop.delAllStoreInventory(E); else { E.baseEnvStats().setRejuv(0); E.envStats().setRejuv(0); } } } mob.recoverEnvStats(); mob.recoverCharStats(); mob.recoverMaxState(); } } } return newLastTickedDateTime; }
@Override public boolean execute(MOB mob, Vector commands, int metaFlags) throws java.io.IOException { final boolean noisy = CMSecurity.isDebugging(CMSecurity.DbgFlag.MERGE); Vector placesToDo = new Vector(); commands.remove(0); if (commands.size() == 0) { mob.tell(L("Merge what? Try DATABASE or a filename")); return false; } if (mob.isMonster()) { mob.tell(L("No can do.")); return false; } if ((commands.size() > 0) && ((String) commands.get(0)).equalsIgnoreCase("noprompt")) commands.remove(0); if ((commands.size() > 0) && ((String) commands.get(0)).equalsIgnoreCase("?")) { final StringBuffer allFieldsMsg = new StringBuffer(""); final Vector allKnownFields = new Vector(); sortEnumeratedList(CMClass.mobTypes(), allKnownFields, allFieldsMsg); sortEnumeratedList(CMClass.basicItems(), allKnownFields, allFieldsMsg); sortEnumeratedList(CMClass.weapons(), allKnownFields, allFieldsMsg); sortEnumeratedList(CMClass.armor(), allKnownFields, allFieldsMsg); sortEnumeratedList(CMClass.clanItems(), allKnownFields, allFieldsMsg); sortEnumeratedList(CMClass.miscMagic(), allKnownFields, allFieldsMsg); sortEnumeratedList(CMClass.tech(), allKnownFields, allFieldsMsg); mob.tell(L("Valid field names are @x1", allFieldsMsg.toString())); return false; } String scope = "WORLD"; if ((commands.size() > 0) && ((String) commands.get(0)).equalsIgnoreCase("room")) { if (!CMSecurity.isAllowed(mob, mob.location(), CMSecurity.SecFlag.MERGE)) { mob.tell(L("You are not allowed to do that here.")); return false; } commands.remove(0); placesToDo.add(mob.location()); scope = "ROOM"; } if ((commands.size() > 0) && ((String) commands.get(0)).equalsIgnoreCase("area")) { if (!CMSecurity.isAllowed(mob, mob.location(), CMSecurity.SecFlag.MERGE)) { mob.tell(L("You are not allowed to do that here.")); return false; } commands.remove(0); placesToDo.add(mob.location().getArea()); scope = "AREA"; } if ((commands.size() > 0) && ((String) commands.get(0)).equalsIgnoreCase("world")) { if (!CMSecurity.isAllowedEverywhere(mob, CMSecurity.SecFlag.MERGE)) { mob.tell(L("You are not allowed to do that.")); return false; } commands.remove(0); placesToDo = new Vector(); scope = "WORLD"; } if (commands.size() == 0) { mob.tell(L("Merge what? DATABASE or filename")); return false; } String firstWord = (String) commands.get(0); if (firstWord.equalsIgnoreCase("DATABASE")) { commands.remove(0); if (commands.size() == 0) { mob.tell(L("Merge parameters missing: DBCLASS, DBSERVICE, DBUSER, DBPASS")); return false; } firstWord = (String) commands.get(0); return doArchonDBCompare(mob, scope, firstWord, commands); } final String filename = (String) commands.lastElement(); commands.remove(filename); final StringBuffer buf = new CMFile(filename, mob, CMFile.FLAG_LOGERRORS).text(); if ((buf == null) || (buf.length() == 0)) { mob.tell(L("File not found at: '@x1'!", filename)); return false; } final List<String> changes = new Vector(); final List<String> onfields = new Vector(); final List<String> ignore = new Vector(); List<String> use = null; final List<String> allKnownFields = new Vector(); final List things = new Vector(); boolean aremobs = false; if ((buf.length() > 20) && (buf.substring(0, 20).indexOf("<MOBS>") >= 0)) { if (mob.session() != null) mob.session().rawPrint(L("Unpacking mobs from file: '@x1'...", filename)); final String error = CMLib.coffeeMaker().addMOBsFromXML(buf.toString(), things, mob.session()); if (mob.session() != null) mob.session().rawPrintln("!"); if (error.length() > 0) { mob.tell(L("An error occurred on merge: @x1", error)); mob.tell(L("Please correct the problem and try the import again.")); return false; } aremobs = true; } else if ((buf.length() > 20) && (buf.substring(0, 20).indexOf("<ITEMS>") >= 0)) { if (mob.session() != null) mob.session().rawPrint(L("Unpacking items from file: '@x1'...", filename)); final String error = CMLib.coffeeMaker().addItemsFromXML(buf.toString(), things, mob.session()); if (mob.session() != null) mob.session().rawPrintln("!"); if (error.length() > 0) { mob.tell(L("An error occurred on merge: @x1", error)); mob.tell(L("Please correct the problem and try the import again.")); return false; } } else { mob.tell( L( "Files of this type are not yet supported by MERGE. You must merge an ITEMS or MOBS file at this time.")); return false; } if (things.size() == 0) { mob.tell(L("Nothing was found in the file to merge!")); return false; } final StringBuffer allFieldsMsg = new StringBuffer(""); if (aremobs) sortEnumeratedList(CMClass.mobTypes(), allKnownFields, allFieldsMsg); else { sortEnumeratedList(CMClass.basicItems(), allKnownFields, allFieldsMsg); sortEnumeratedList(CMClass.weapons(), allKnownFields, allFieldsMsg); sortEnumeratedList(CMClass.armor(), allKnownFields, allFieldsMsg); sortEnumeratedList(CMClass.clanItems(), allKnownFields, allFieldsMsg); sortEnumeratedList(CMClass.miscMagic(), allKnownFields, allFieldsMsg); sortEnumeratedList(CMClass.tech(), allKnownFields, allFieldsMsg); } allKnownFields.add("REJUV"); allFieldsMsg.append(L("REJUV ")); for (int i = 0; i < commands.size(); i++) { String str = ((String) commands.get(i)).toUpperCase(); if (str.startsWith("CHANGE=")) { use = changes; str = str.substring(7).trim(); } if (str.startsWith("ON=")) { use = onfields; str = str.substring(3).trim(); } if (str.startsWith("IGNORE=")) { use = ignore; str = str.substring(7).trim(); } int x = str.indexOf(','); while (x >= 0) { final String s = str.substring(0, x).trim(); if (s.length() > 0) { if (use == null) { mob.tell(L("'@x1' is an unknown parameter!", str)); return false; } if (allKnownFields.contains(s)) use.add(s); else { mob.tell( L( "'@x1' is an unknown field name. Valid fields include: @x2", s, allFieldsMsg.toString())); return false; } } str = str.substring(x + 1).trim(); x = str.indexOf(','); } if (str.length() > 0) { if (use == null) { mob.tell(L("'@x1' is an unknown parameter!", str)); return false; } if (allKnownFields.contains(str)) use.add(str); else { mob.tell( L( "'@x1' is an unknown field name. Valid fields include: @x2", str, allFieldsMsg.toString())); return false; } } } if ((onfields.size() == 0) && (ignore.size() == 0) && (changes.size() == 0)) { mob.tell( L( "You must specify either an ON, CHANGES, or IGNORE parameter for valid matches to be made.")); return false; } if (placesToDo.size() == 0) for (final Enumeration a = CMLib.map().areas(); a.hasMoreElements(); ) { final Area A = (Area) a.nextElement(); if (A.getCompleteMap().hasMoreElements() && CMSecurity.isAllowed( mob, (A.getCompleteMap().nextElement()), CMSecurity.SecFlag.MERGE)) placesToDo.add(A); } if (placesToDo.size() == 0) { mob.tell(L("There are no rooms to merge into!")); return false; } for (int i = placesToDo.size() - 1; i >= 0; i--) { if (placesToDo.get(i) instanceof Area) { final Area A = (Area) placesToDo.get(i); placesToDo.removeElement(A); for (final Enumeration r = A.getCompleteMap(); r.hasMoreElements(); ) { final Room R = (Room) r.nextElement(); if (CMSecurity.isAllowed(mob, R, CMSecurity.SecFlag.MERGE)) placesToDo.add(R); } } else if (placesToDo.get(i) instanceof Room) if (mob.session() != null) mob.session().rawPrint("."); else return false; } // now do the merge... if (mob.session() != null) mob.session().rawPrint(L("Merging and saving...")); if (noisy) mergedebugtell(mob, "Rooms to do: " + placesToDo.size()); if (noisy) mergedebugtell(mob, "Things loaded: " + things.size()); if (noisy) mergedebugtell(mob, "On fields=" + CMParms.toStringList(onfields)); if (noisy) mergedebugtell(mob, "Ignore fields=" + CMParms.toStringList(ignore)); if (noisy) mergedebugtell(mob, "Change fields=" + CMParms.toStringList(changes)); Log.sysOut("Import", mob.Name() + " merge '" + filename + "'."); for (int r = 0; r < placesToDo.size(); r++) { Room R = (Room) placesToDo.get(r); if (!CMSecurity.isAllowed(mob, R, CMSecurity.SecFlag.MERGE)) continue; if (R.roomID().length() == 0) continue; synchronized (("SYNC" + R.roomID()).intern()) { R = CMLib.map().getRoom(R); final Area.State oldFlags = R.getArea().getAreaState(); R.getArea().setAreaState(Area.State.FROZEN); CMLib.map().resetRoom(R); boolean savemobs = false; boolean saveitems = false; if (aremobs) { for (int m = 0; m < R.numInhabitants(); m++) { final MOB M = R.fetchInhabitant(m); if ((M != null) && (M.isSavable())) if (tryMerge(mob, R, M, things, changes, onfields, ignore, noisy)) savemobs = true; } } else { for (int i = 0; i < R.numItems(); i++) { final Item I = R.getItem(i); if ((I != null) && (tryMerge(mob, R, I, things, changes, onfields, ignore, noisy))) saveitems = true; } for (int m = 0; m < R.numInhabitants(); m++) { final MOB M = R.fetchInhabitant(m); if ((M != null) && (M.isSavable())) { for (int i = 0; i < M.numItems(); i++) { final Item I = M.getItem(i); if ((I != null) && (tryMerge(mob, R, I, things, changes, onfields, ignore, noisy))) savemobs = true; } final ShopKeeper SK = CMLib.coffeeShops().getShopKeeper(M); if (SK != null) { for (final Iterator<Environmental> i = SK.getShop().getStoreInventory(); i.hasNext(); ) { final Environmental E = i.next(); if (E instanceof Item) { final Item I = (Item) E; if (tryMerge(mob, R, I, things, changes, onfields, ignore, noisy)) savemobs = true; } } } } } } if (saveitems) CMLib.database().DBUpdateItems(R); if (savemobs) CMLib.database().DBUpdateMOBs(R); if (mob.session() != null) mob.session().rawPrint("."); R.getArea().setAreaState(oldFlags); } } if (mob.session() != null) mob.session().rawPrintln(L("!\n\rDone!")); Area A = null; for (int i = 0; i < placesToDo.size(); i++) { A = ((Room) placesToDo.get(i)).getArea(); if ((A != null) && (A.getAreaState() != Area.State.ACTIVE)) A.setAreaState(Area.State.ACTIVE); } return false; }
@Override public boolean okMessage(final Environmental myHost, final CMMsg msg) { if ((clanID().length() > 0) && (msg.amITarget(this))) { if (msg.source().getClanRole(clanID()) == null) { if ((msg.targetMinor() == CMMsg.TYP_GET) || (msg.targetMinor() == CMMsg.TYP_PUSH) || (msg.targetMinor() == CMMsg.TYP_PULL) || (msg.targetMinor() == CMMsg.TYP_CAST_SPELL)) { final Room R = CMLib.map().roomLocation(this); if (CMLib.clans().findRivalrousClan(msg.source()) == null) { msg.source().tell(L("You must belong to an elligible clan to take a clan item.")); return false; } else if (R != null) { for (int i = 0; i < R.numInhabitants(); i++) { final MOB M = R.fetchInhabitant(i); if ((M != null) && (M.isMonster()) && (M.getClanRole(clanID()) != null) && (CMLib.flags().aliveAwakeMobileUnbound(M, true)) && (CMLib.flags().canBeSeenBy(this, M)) && (!CMLib.flags().isAnimalIntelligence(M))) { R.show( M, null, CMMsg.MSG_QUIETMOVEMENT, L("<S-NAME> guard(s) @x1 closely.", name())); return false; } } String rulingClan = ""; final LegalBehavior B = CMLib.law().getLegalBehavior(R); if (B != null) rulingClan = B.rulingOrganization(); if (msg.source().getClanRole(rulingClan) == null) { msg.source() .tell(L("You must conquer and fully control this area to take the clan flag.")); return false; } if ((B != null) && (!B.isFullyControlled())) { msg.source().tell(L("Your clan does not yet fully control the area.")); return false; } } } else if ((msg.targetMinor() == CMMsg.TYP_DROP) && (!CMath.bset(msg.targetMajor(), CMMsg.MASK_INTERMSG))) { final Room R = msg.source().location(); LandTitle T = null; Area A = null; LegalBehavior B = null; if (R != null) { A = R.getArea(); T = CMLib.law().getLandTitle(R); } if ((T == null) || ((!T.getOwnerName().equals(clanID())) && ((!T.getOwnerName().equals(msg.source().getLiegeID())) || (!msg.source().isMarriedToLiege())) && (!T.getOwnerName().equals(msg.source().Name())))) { boolean ok = false; if (A != null) { B = CMLib.law().getLegalBehavior(R); if (B != null) ok = B.controlPoints() > 0; } if (!ok) { msg.source() .tell( L("You can not place a flag here, this place is controlled by the Archons.")); return false; } } } } else if ((msg.targetMinor() == CMMsg.TYP_GET) && (msg.source().location() != null) && (msg.source().isMonster())) { boolean foundOne = false; for (int i = 0; i < msg.source().location().numInhabitants(); i++) { final MOB M = msg.source().location().fetchInhabitant(i); if ((M != null) && (!M.isMonster()) && (M.getClanRole(clanID()) != null)) { foundOne = true; break; } } if (!foundOne) { msg.source().tell(L("You are guarding @x1 too closely.", name())); return false; } } } if (StdClanItem.stdOkMessage(this, msg)) { if ((clanID().length() > 0) && (msg.amITarget(this)) && (msg.targetMinor() == CMMsg.TYP_DROP)) { final LegalBehavior B = CMLib.law().getLegalBehavior(msg.source().location()); final String rulingClan = (B != null) ? B.rulingOrganization() : ""; if (rulingClan.length() == 0) msg.source() .tell( L("Area '@x1' is presently neutral.", msg.source().location().getArea().name())); else { msg.source() .tell( L( "Area '@x1' is presently controlled by @x2.", msg.source().location().getArea().name(), rulingClan)); if (!rulingClan.equals(clanID())) { int relation = Clan.REL_WAR; final Clan C = CMLib.clans().getClan(clanID()); if (C == null) { msg.source().tell(L("This ancient relic from a lost clan fades out of existence.")); this.destroy(); return false; } relation = C.getClanRelations(rulingClan); if (relation != Clan.REL_WAR) { msg.source() .tell( L("You must be at war with this clan to put down your flag on their area.")); return false; } } } } return super.okMessage(myHost, msg); } return false; }
public boolean invoke( MOB mob, Vector commands, Environmental givenTarget, boolean auto, int asLevel) { if ((auto || mob.isMonster()) && (commands.size() == 0)) commands.addElement(CMLib.map().getRandomRoom().displayText()); if (commands.size() < 1) { mob.tell("Pray for a gateway to where?"); return false; } if ((mob.location().getRoomInDir(Directions.GATE) != null) || (mob.location().getExitInDir(Directions.GATE) != null)) { mob.tell("A gateway cannot be created here."); return false; } String areaName = CMParms.combine(commands, 0).trim().toUpperCase(); oldRoom = null; newRoom = null; try { Vector rooms = CMLib.map().findRooms(CMLib.map().rooms(), mob, areaName, true, 10); if (rooms.size() > 0) newRoom = (Room) rooms.elementAt(CMLib.dice().roll(1, rooms.size(), -1)); } catch (NoSuchElementException e) { } if (newRoom == null) { mob.tell("You don't know of an place called '" + CMParms.combine(commands, 0) + "'."); return false; } int profNeg = 0; for (int i = 0; i < newRoom.numInhabitants(); i++) { MOB t = newRoom.fetchInhabitant(i); if (t != null) { int adjustment = t.envStats().level() - (mob.envStats().level() + (2 * super.getXLEVELLevel(mob))); if (t.isMonster()) adjustment = adjustment * 3; profNeg += adjustment; } } profNeg += newRoom.numItems() * 20; if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; boolean success = proficiencyCheck(mob, -profNeg, auto); if ((success) && ((newRoom.getRoomInDir(Directions.GATE) == null) && (newRoom.getExitInDir(Directions.GATE) == null))) { CMMsg msg = CMClass.getMsg( mob, mob.location(), this, verbalCastCode(mob, mob.location(), auto), "^S<S-NAME> " + prayWord(mob) + " for a blinding, divine gateway here.^?"); CMMsg msg2 = CMClass.getMsg( mob, newRoom, this, verbalCastCode(mob, newRoom, auto), "A blinding, divine gateway appears here."); if ((mob.location().okMessage(mob, msg)) && (newRoom.okMessage(mob, msg2))) { mob.location().send(mob, msg); newRoom.send(mob, msg2); Exit e = CMClass.getExit("GenExit"); e.setDescription("A divine gateway to somewhere"); e.setDisplayText("A divine gateway to somewhere"); e.setDoorsNLocks(false, true, false, false, false, false); e.setExitParams("gateway", "close", "open", "closed."); e.setName("a divine gateway"); mob.location().rawDoors()[Directions.GATE] = newRoom; newRoom.rawDoors()[Directions.GATE] = mob.location(); mob.location().setRawExit(Directions.GATE, e); newRoom.setRawExit(Directions.GATE, e); oldRoom = mob.location(); beneficialAffect(mob, e, asLevel, 5); } } else beneficialWordsFizzle( mob, null, "<S-NAME> " + prayWord(mob) + " for a gateway, but nothing happens."); // return whether it worked 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; }