public Item buildMyThing(MOB mob, Room room) { Area A = room.getArea(); boolean bonusWorthy = (Druid_MyPlants.myPlant(room, mob, 0) == null); Vector V = Druid_MyPlants.myAreaPlantRooms(mob, room.getArea()); int pct = 0; if (A.getAreaIStats()[Area.Stats.VISITABLE_ROOMS.ordinal()] > 10) pct = (int) Math.round( 100.0 * CMath.div( V.size(), A.getAreaIStats()[Area.Stats.VISITABLE_ROOMS.ordinal()])); Item I = buildMyPlant(mob, room); if ((I != null) && ((mob.charStats().getCurrentClass().baseClass().equalsIgnoreCase("Druid")) || (CMSecurity.isASysOp(mob)))) { if (!CMLib.law().isACity(A)) { if (pct > 0) { int newPct = (int) Math.round( 100.0 * CMath.div( V.size(), A.getAreaIStats()[Area.Stats.VISITABLE_ROOMS.ordinal()])); if ((newPct >= 50) && (A.fetchEffect("Chant_DruidicConnection") == null)) { Ability A2 = CMClass.getAbility("Chant_DruidicConnection"); if (A2 != null) A2.invoke(mob, A, true, 0); } } } else if ((bonusWorthy) && (!mob.isMonster())) { long[] num = (long[]) plantBonuses.get(mob.Name() + "/" + room.getArea().Name()); if ((num == null) || (System.currentTimeMillis() - num[1] > (room.getArea().getTimeObj().getDaysInMonth() * room.getArea().getTimeObj().getHoursInDay() * CMProps.getMillisPerMudHour()))) { num = new long[2]; plantBonuses.remove(mob.Name() + "/" + room.getArea().Name()); plantBonuses.put(mob.Name() + "/" + room.getArea().Name(), num); num[1] = System.currentTimeMillis(); } if (V.size() >= num[0]) { num[0]++; if (num[0] < 19) { mob.tell("You have made this city greener."); CMLib.leveler().postExperience(mob, null, null, (int) num[0], false); } } } } return I; }
@Override public boolean okMessage(final Environmental myHost, final CMMsg msg) { if ((affected instanceof MOB) && (msg.amISource((MOB) affected)) && (msg.targetMinor() == CMMsg.TYP_DAMAGE) && (msg.tool() instanceof Weapon) && (msg.value() > 0) && (msg.target() instanceof MOB) && (((Weapon) msg.tool()).weaponClassification() == Weapon.CLASS_THROWN)) { if (CMLib.dice().rollPercentage() < 25) helpProficiency((MOB) affected, 0); final CMMsg msg2 = CMClass.getMsg( (MOB) msg.target(), msg.tool(), this, CMMsg.MSG_OK_VISUAL, L("^F^<FIGHT^><T-NAME> fragment(s) in <S-NAME>!^</FIGHT^>^?")); CMLib.color().fixSourceFightColor(msg2); msg.addTrailerMsg(msg2); msg.setValue( msg.value() + (int) Math.round( CMath.mul( 3.0 * msg.value(), CMath.div(proficiency(), 100.0 - (10.0 * getXLEVELLevel(invoker())))))); } return super.okMessage(myHost, msg); }
@Override public void affectCharStats(MOB affected, CharStats affectableStats) { super.affectCharStats(affected, affectableStats); affectableStats.setStat( CharStats.STAT_STRENGTH, (int) Math.round(CMath.div(affectableStats.getStat(CharStats.STAT_STRENGTH), 2.0))); }
@Override public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { final MOB target = this.getTarget(mob, commands, givenTarget); if (target == null) return false; if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; // now see if it worked final boolean success = proficiencyCheck(mob, 0, auto); if (success) { final CMMsg msg = CMClass.getMsg( mob, target, this, somanticCastCode(mob, target, auto), L( (auto ? "A " : "^S<S-NAME> incant(s) and point(s) at <T-NAMESELF>. A ") + "long shard of ice streaks through the air!^?") + CMLib.protocol().msp("spelldam2.wav", 40)); final CMMsg msg2 = CMClass.getMsg( mob, target, this, CMMsg.MSK_CAST_MALICIOUS_VERBAL | CMMsg.TYP_COLD | (auto ? CMMsg.MASK_ALWAYS : 0), null); if ((mob.location().okMessage(mob, msg)) && (mob.location().okMessage(mob, msg2))) { mob.location().send(mob, msg); invoker = mob; int damage = 0; final int maxDie = (adjustedLevel(mob, asLevel) + (2 * super.getX1Level(mob))) / 2; damage += CMLib.dice().roll(maxDie, 6, 15); mob.location().send(mob, msg2); if ((msg2.value() > 0) || (msg.value() > 0)) damage = (int) Math.round(CMath.div(damage, 2.0)); if (target.location() == mob.location()) CMLib.combat() .postDamage( mob, target, this, damage, CMMsg.MASK_ALWAYS | CMMsg.TYP_COLD, Weapon.TYPE_FROSTING, L("The lance <DAMAGE> <T-NAME>!")); } } else return maliciousFizzle( mob, target, L("<S-NAME> incant(s) and point(s) at <T-NAMESELF>, but flub(s) the spell.")); // return whether it worked return success; }
protected String getDeviation(double val, double val2) { if (val == val2) return "0%"; final double oval = val2 - val; final int pval = (int) Math.round(CMath.div((oval < 0) ? (oval * -1) : oval, val2 == 0 ? 1 : val2) * 100.0); if (oval > 0) return "-" + pval + "%"; return "+" + pval + "%"; }
@Override public void level(MOB mob, List<String> newAbilityIDs) { super.level(mob, newAbilityIDs); if (CMSecurity.isDisabled(CMSecurity.DisFlag.LEVELS)) return; final int attArmor = (((int) Math.round(CMath.div(mob.charStats().getStat(CharStats.STAT_DEXTERITY), 9.0))) + 1); mob.tell(L("^NYour grace grants you a defensive bonus of ^H@x1^?.^N", "" + attArmor)); }
@Override public void affectCharState(MOB affected, CharState affectableState) { super.affectCharState(affected, affectableState); if (affected == null) return; affectableState.setMovement( (int) Math.round( CMath.div( affectableState.getMovement(), drawups + (0.1 * super.getX1Level(invoker()))))); }
@Override public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { final MOB target = this.getTarget(mob, commands, givenTarget); if (target == null) return false; Room R = CMLib.map().roomLocation(target); if (R == null) R = mob.location(); if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; final boolean success = proficiencyCheck(mob, 0, auto); if (success) { final CMMsg msg = CMClass.getMsg( mob, target, this, somanticCastCode(mob, target, auto), L( auto ? "<T-NAME> <T-IS-ARE> sprayed with acid." : "^S<S-NAME> reach(es) for <T-NAMESELF>, spraying acid all over <T-HIM-HER>!^?") + CMLib.protocol().msp("spelldam1.wav", 40)); final CMMsg msg2 = CMClass.getMsg( mob, target, this, CMMsg.MSK_CAST_MALICIOUS_VERBAL | CMMsg.TYP_ACID | (auto ? CMMsg.MASK_ALWAYS : 0), null); if ((R.okMessage(mob, msg)) && ((R.okMessage(mob, msg2)))) { R.send(mob, msg); R.send(mob, msg2); invoker = mob; final int numDice = (adjustedLevel(mob, asLevel) + (2 * super.getX1Level(invoker()))) / 2; int damage = CMLib.dice().roll(2, numDice, 1); if ((msg2.value() > 0) || (msg.value() > 0)) damage = (int) Math.round(CMath.div(damage, 2.0)); CMLib.combat() .postDamage( mob, target, this, damage, CMMsg.MASK_ALWAYS | CMMsg.TYP_ACID, Weapon.TYPE_MELTING, L("The acid <DAMAGE> <T-NAME>!")); maliciousAffect(mob, target, asLevel, 3, -1); } } else return maliciousFizzle( mob, target, L("<S-NAME> reach(es) for <T-NAMESELF>, but nothing more happens.")); return success; }
@Override public String ageName() { final int cat = ageCategory(); if (cat < Race.AGE_ANCIENT) return Race.AGE_DESCS[cat]; int age = getStat(STAT_AGE); final int[] chart = getMyRace().getAgingChart(); final int diff = chart[Race.AGE_ANCIENT] - chart[Race.AGE_VENERABLE]; age = age - chart[Race.AGE_ANCIENT]; final int num = (diff > 0) ? (int) Math.abs(Math.floor(CMath.div(age, diff))) : 0; if (num <= 0) return Race.AGE_DESCS[cat]; return Race.AGE_DESCS[cat] + " " + CMath.convertToRoman(num); }
@Override public void affectPhyStats(Physical affected, PhyStats affectableStats) { super.affectPhyStats(affected, affectableStats); if (affected instanceof MOB) { if (CMLib.flags().isStanding((MOB) affected)) { final MOB mob = (MOB) affected; final int attArmor = (((int) Math.round(CMath.div(mob.charStats().getStat(CharStats.STAT_DEXTERITY), 9.0))) + 1) * (mob.charStats().getClassLevel(this) - 1); affectableStats.setArmor(affectableStats.armor() - attArmor); } } }
@Override public String healthText(MOB viewer, MOB mob) { final double pct = (CMath.div(mob.curState().getHitPoints(), mob.maxState().getHitPoints())); if (pct < .10) return L("^r@x1^r is near destruction!^N", mob.name(viewer)); else if (pct < .20) return L("^r@x1^r is massively shredded and damaged.^N", mob.name(viewer)); else if (pct < .30) return L("^r@x1^r is extremely shredded and damaged.^N", mob.name(viewer)); else if (pct < .40) return L("^y@x1^y is very shredded and damaged.^N", mob.name(viewer)); else if (pct < .50) return L("^y@x1^y is shredded and damaged.^N", mob.name(viewer)); else if (pct < .60) return L("^p@x1^p is shredded and slightly damaged.^N", mob.name(viewer)); else if (pct < .70) return L("^p@x1^p has lost numerous leaves.^N", mob.name(viewer)); else if (pct < .80) return L("^g@x1^g has lost some leaves.^N", mob.name(viewer)); else if (pct < .90) return L("^g@x1^g has lost a few leaves.^N", mob.name(viewer)); else if (pct < .99) return L("^g@x1^g is no longer in perfect condition.^N", mob.name(viewer)); else return L("^c@x1^c is in perfect condition.^N", mob.name(viewer)); }
@Override public String healthText(MOB viewer, MOB mob) { final double pct = (CMath.div(mob.curState().getHitPoints(), mob.maxState().getHitPoints())); if (pct < .10) return L("^r@x1^r is almost broken!^N", mob.name(viewer)); else if (pct < .20) return L("^r@x1^r is massively cracked and damaged.^N", mob.name(viewer)); else if (pct < .30) return L("^r@x1^r is extremely cracked and damaged.^N", mob.name(viewer)); else if (pct < .40) return L("^y@x1^y is very cracked and damaged.^N", mob.name(viewer)); else if (pct < .50) return L("^y@x1^y is cracked and damaged.^N", mob.name(viewer)); else if (pct < .60) return L("^p@x1^p is cracked and slightly damaged.^N", mob.name(viewer)); else if (pct < .70) return L("^p@x1^p is showing numerous cracks.^N", mob.name(viewer)); else if (pct < .80) return L("^g@x1^g is showing some crachs.^N", mob.name(viewer)); else if (pct < .90) return L("^g@x1^g is showing small cracks.^N", mob.name(viewer)); else if (pct < .99) return L("^g@x1^g is no longer in perfect condition.^N", mob.name(viewer)); else return L("^c@x1^c is in perfect condition.^N", mob.name(viewer)); }
protected final Map<String, Double> getRatesFor(final Environmental affecting, String currency) { if (spaceMaxCut <= 0.0) return rates; currency = currency.toUpperCase(); if (rates.containsKey(currency)) return rates; String myCurrency = CMLib.beanCounter().getCurrency(affecting); if (myCurrency.equalsIgnoreCase(currency)) { rates.put(currency, Double.valueOf(cut)); return rates; } SpaceObject homeO = CMLib.map().getSpaceObject(affecting, false); if (homeO != null) { myCurrency = CMLib.beanCounter().getCurrency(homeO); if (myCurrency.equalsIgnoreCase(currency)) { rates.put(currency, Double.valueOf(cut)); return rates; } } else { // no space object, wtf? this SHOULD fail if (!complainedAboutSpaceError) { complainedAboutSpaceError = true; Log.errOut( "MoneyChanger", affecting.Name() + " is not on a planet, so space rates cannot apply!"); } return rates; } for (Enumeration<Area> a = CMLib.map().spaceAreas(); a.hasMoreElements(); ) { Area A = a.nextElement(); if ((A != null) && (A != homeO)) { myCurrency = CMLib.beanCounter().getCurrency(A); if (myCurrency.equalsIgnoreCase(currency)) { SpaceObject oA = (SpaceObject) A; long distance = CMLib.map().getDistanceFrom(homeO, oA); if ((distance < 0) || (distance > spaceMaxDistance)) { rates.put(currency, Double.valueOf(spaceMaxCut)); } else { double pct = CMath.div(distance, spaceMaxDistance); double amt = spaceMaxCut * pct; if (amt < cut) amt = cut; rates.put(currency, Double.valueOf(cut)); } return rates; } } } return rates; }
@Override public String healthText(MOB viewer, MOB mob) { final double pct = (CMath.div(mob.curState().getHitPoints(), mob.maxState().getHitPoints())); if (pct < .10) return L("^r@x1^r is unstable and almost disintegrated!^N", mob.name(viewer)); else if (pct < .20) return L("^r@x1^r is nearing disintegration.^N", mob.name(viewer)); else if (pct < .30) return L("^r@x1^r is noticeably disintegrating.^N", mob.name(viewer)); else if (pct < .40) return L("^y@x1^y is very damaged and slightly disintegrated.^N", mob.name(viewer)); else if (pct < .50) return L("^y@x1^y is very damaged.^N", mob.name(viewer)); else if (pct < .60) return L("^p@x1^p is starting to show major damage.^N", mob.name(viewer)); else if (pct < .70) return L("^p@x1^p is definitely damaged.^N", mob.name(viewer)); else if (pct < .80) return L("^g@x1^g is disheveled and mildly damaged.^N", mob.name(viewer)); else if (pct < .90) return L("^g@x1^g is noticeably disheveled.^N", mob.name(viewer)); else if (pct < .99) return L("^g@x1^g is slightly disheveled.^N", mob.name(viewer)); else return L("^c@x1^c is in perfect condition.^N", mob.name(viewer)); }
@Override public String healthText(MOB viewer, MOB mob) { final double pct = (CMath.div(mob.curState().getHitPoints(), mob.maxState().getHitPoints())); if (pct < .10) return L("^r@x1^r is nearly defeated.^N", mob.name(viewer)); else if (pct < .20) return L("^r@x1^r is covered in blood.^N", mob.name(viewer)); else if (pct < .30) return L("^r@x1^r is bleeding badly from lots of wounds.^N", mob.name(viewer)); else if (pct < .40) return L("^y@x1^y has numerous bloody wounds and gashes.^N", mob.name(viewer)); else if (pct < .50) return L("^y@x1^y has some bloody wounds and gashes.^N", mob.name(viewer)); else if (pct < .60) return L("^p@x1^p has a few bloody wounds.^N", mob.name(viewer)); else if (pct < .70) return L("^p@x1^p is cut and bruised.^N", mob.name(viewer)); else if (pct < .80) return L("^g@x1^g has some minor cuts and bruises.^N", mob.name(viewer)); else if (pct < .90) return L("^g@x1^g has a few bruises and scratches.^N", mob.name(viewer)); else if (pct < .99) return L("^g@x1^g has a few small bruises.^N", mob.name(viewer)); else return L("^c@x1^c is in perfect health.^N", mob.name(viewer)); }
@Override public String healthText(MOB viewer, MOB mob) { final double pct = (CMath.div(mob.curState().getHitPoints(), mob.maxState().getHitPoints())); if (pct < .10) return L("^r@x1^r is one unhappy little critter!^N", mob.name(viewer)); else if (pct < .20) return L("^r@x1^r is covered in blood and matted hair.^N", mob.name(viewer)); else if (pct < .30) return L("^r@x1^r is bleeding badly from lots of wounds.^N", mob.name(viewer)); else if (pct < .40) return L("^y@x1^y has large patches of bloody matted fur.^N", mob.name(viewer)); else if (pct < .50) return L("^y@x1^y has some bloody matted fur.^N", mob.name(viewer)); else if (pct < .60) return L("^p@x1^p has a lot of cuts and gashes.^N", mob.name(viewer)); else if (pct < .70) return L("^p@x1^p has a few cut patches.^N", mob.name(viewer)); else if (pct < .80) return L("^g@x1^g has a cut patch of fur.^N", mob.name(viewer)); else if (pct < .90) return L("^g@x1^g has some disheveled fur.^N", mob.name(viewer)); else if (pct < .99) return L("^g@x1^g has some misplaced hairs.^N", mob.name(viewer)); else return L("^c@x1^c is in perfect health.^N", mob.name(viewer)); }
public String healthText(MOB viewer, MOB mob) { double pct = (CMath.div(mob.curState().getHitPoints(), mob.maxState().getHitPoints())); if (pct < .10) return "^r" + mob.displayName(viewer) + "^r is hovering on deaths door!^N"; else if (pct < .20) return "^r" + mob.displayName(viewer) + "^r is covered in blood and matted hair.^N"; else if (pct < .30) return "^r" + mob.displayName(viewer) + "^r is bleeding badly from lots of wounds.^N"; else if (pct < .40) return "^y" + mob.displayName(viewer) + "^y has large patches of bloody matted fur.^N"; else if (pct < .50) return "^y" + mob.displayName(viewer) + "^y has some bloody matted fur.^N"; else if (pct < .60) return "^p" + mob.displayName(viewer) + "^p has a lot of cuts and gashes.^N"; else if (pct < .70) return "^p" + mob.displayName(viewer) + "^p has a few cut patches.^N"; else if (pct < .80) return "^g" + mob.displayName(viewer) + "^g has a cut patch of fur.^N"; else if (pct < .90) return "^g" + mob.displayName(viewer) + "^g has some disheveled fur.^N"; else if (pct < .99) return "^g" + mob.displayName(viewer) + "^g has some misplaced hairs.^N"; else return "^c" + mob.displayName(viewer) + "^c is in perfect health.^N"; }
public String healthText(MOB viewer, MOB mob) { double pct = (CMath.div(mob.curState().getHitPoints(), mob.maxState().getHitPoints())); if (pct < .10) return "^r" + mob.displayName(viewer) + "^r is facing a cold death!^N"; else if (pct < .20) return "^r" + mob.displayName(viewer) + "^r is covered in blood.^N"; else if (pct < .30) return "^r" + mob.displayName(viewer) + "^r is bleeding badly from lots of wounds.^N"; else if (pct < .40) return "^y" + mob.displayName(viewer) + "^y has numerous bloody wounds and gashes.^N"; else if (pct < .50) return "^y" + mob.displayName(viewer) + "^y has some bloody wounds and gashes.^N"; else if (pct < .60) return "^p" + mob.displayName(viewer) + "^p has a few bloody wounds.^N"; else if (pct < .70) return "^p" + mob.displayName(viewer) + "^p is cut and bruised heavily.^N"; else if (pct < .80) return "^g" + mob.displayName(viewer) + "^g has some minor cuts and bruises.^N"; else if (pct < .90) return "^g" + mob.displayName(viewer) + "^g has a few bruises and scratched scales.^N"; else if (pct < .99) return "^g" + mob.displayName(viewer) + "^g has a few small bruises.^N"; else return "^c" + mob.displayName(viewer) + "^c is in perfect health.^N"; }
@Override public boolean okMessage(Environmental host, CMMsg msg) { if (msg.amITarget(this)) { switch (msg.targetMinor()) { case CMMsg.TYP_ACTIVATE: if (!isInstalled()) { if (!CMath.bset(msg.targetMajor(), CMMsg.MASK_CNTRLMSG)) msg.source().tell(L("@x1 is not installed or connected.", name())); return false; } else if (!isAllWiringHot(this)) { if (!CMath.bset(msg.targetMajor(), CMMsg.MASK_CNTRLMSG)) msg.source() .tell(L("The panel containing @x1 is not activated or connected.", name())); return false; } break; case CMMsg.TYP_DEACTIVATE: break; case CMMsg.TYP_LOOK: break; case CMMsg.TYP_POWERCURRENT: if ((!(this instanceof FuelConsumer)) && (!(this instanceof PowerGenerator)) && activated() && (powerNeeds() > 0) && (msg.value() > 0)) { double amtToTake = Math.min((double) powerNeeds(), (double) msg.value()); msg.setValue(msg.value() - (int) Math.round(amtToTake)); amtToTake *= getFinalManufacturer().getEfficiencyPct(); if (subjectToWearAndTear() && (usesRemaining() <= 200)) amtToTake *= CMath.div(usesRemaining(), 100.0); setPowerRemaining(Math.min(powerCapacity(), Math.round(amtToTake) + powerRemaining())); } break; } } return super.okMessage(host, msg); }
@Override public boolean okMessage(final Environmental myHost, final CMMsg msg) { if (!super.okMessage(myHost, msg)) return false; if (!(affected instanceof MOB)) return true; final MOB mob = (MOB) affected; if ((msg.amITarget(mob)) && (msg.sourceMinor() == CMMsg.TYP_FIRE) && (msg.targetMinor() == CMMsg.TYP_DAMAGE)) { final int recovery = (int) Math.round(CMath.div((msg.value()), 2.0)); mob.location() .show( mob, null, CMMsg.MSG_OK_VISUAL, L("The flame attack heals <S-NAME> @x1 points.", "" + recovery)); CMLib.combat() .postHealing(mob, mob, this, recovery, CMMsg.MASK_ALWAYS | CMMsg.TYP_CAST_SPELL, null); return false; } return true; }
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; }
@Override public int getSave(int which) { switch (which) { case STAT_SAVE_PARALYSIS: return getStat(STAT_SAVE_PARALYSIS) + (int) Math.round(CMath.div(getStat(STAT_CONSTITUTION) + getStat(STAT_STRENGTH), 2.0)); case STAT_SAVE_FIRE: return getStat(STAT_SAVE_FIRE) + (int) Math.round(CMath.div(getStat(STAT_CONSTITUTION) + getStat(STAT_DEXTERITY), 2.0)); case STAT_SAVE_COLD: return getStat(STAT_SAVE_COLD) + (int) Math.round(CMath.div(getStat(STAT_CONSTITUTION) + getStat(STAT_DEXTERITY), 2.0)); case STAT_SAVE_WATER: return getStat(STAT_SAVE_WATER) + (int) Math.round(CMath.div(getStat(STAT_CONSTITUTION) + getStat(STAT_DEXTERITY), 2.0)); case STAT_SAVE_GAS: return getStat(STAT_SAVE_GAS) + (int) Math.round(CMath.div(getStat(STAT_CONSTITUTION) + getStat(STAT_STRENGTH), 2.0)); case STAT_SAVE_MIND: return getStat(STAT_SAVE_MIND) + (int) Math.round( CMath.div( getStat(STAT_WISDOM) + getStat(STAT_INTELLIGENCE) + getStat(STAT_CHARISMA), 3.0)); case STAT_SAVE_GENERAL: return getStat(STAT_SAVE_GENERAL) + getStat(STAT_CONSTITUTION); case STAT_SAVE_JUSTICE: return getStat(STAT_SAVE_JUSTICE) + getStat(STAT_CHARISMA); case STAT_SAVE_ACID: return getStat(STAT_SAVE_ACID) + (int) Math.round(CMath.div(getStat(STAT_CONSTITUTION) + getStat(STAT_DEXTERITY), 2.0)); case STAT_SAVE_ELECTRIC: return getStat(STAT_SAVE_ELECTRIC) + (int) Math.round(CMath.div(getStat(STAT_CONSTITUTION) + getStat(STAT_DEXTERITY), 2.0)); case STAT_SAVE_POISON: return getStat(STAT_SAVE_POISON) + getStat(STAT_CONSTITUTION); case STAT_SAVE_UNDEAD: return getStat(STAT_SAVE_UNDEAD) + getStat(STAT_WISDOM) + getStat(STAT_FAITH); case STAT_SAVE_DISEASE: return getStat(STAT_SAVE_DISEASE) + getStat(STAT_CONSTITUTION); case STAT_SAVE_MAGIC: return getStat(STAT_SAVE_MAGIC) + getStat(STAT_INTELLIGENCE); case STAT_SAVE_TRAPS: return getStat(STAT_SAVE_TRAPS) + getStat(STAT_DEXTERITY); case STAT_SAVE_OVERLOOKING: return getStat(STAT_SAVE_OVERLOOKING); case STAT_SAVE_DETECTION: return getStat(STAT_SAVE_DETECTION); case STAT_FAITH: return getStat(STAT_FAITH); case STAT_SAVE_BLUNT: return getStat(STAT_SAVE_BLUNT); case STAT_SAVE_PIERCE: return getStat(STAT_SAVE_PIERCE); case STAT_SAVE_SLASH: return getStat(STAT_SAVE_SLASH); case STAT_SAVE_SPELLS: return getStat(STAT_SAVE_SPELLS); case STAT_SAVE_PRAYERS: return getStat(STAT_SAVE_PRAYERS); case STAT_SAVE_SONGS: return getStat(STAT_SAVE_SONGS); case STAT_SAVE_CHANTS: return getStat(STAT_SAVE_CHANTS); } return getStat(which); }
public static String getBasic(MOB M, int i) { StringBuffer str = new StringBuffer(""); switch (i) { case 0: str.append(M.Name() + ", "); break; case 1: str.append(M.description() + ", "); break; case 2: if (M.playerStats() != null) str.append(CMLib.time().date2String(M.playerStats().lastDateTime()) + ", "); break; case 3: if (M.playerStats() != null) str.append(M.playerStats().getEmail() + ", "); break; case 4: str.append(M.baseCharStats().getMyRace().name() + ", "); break; case 5: str.append( M.baseCharStats().getCurrentClass().name(M.baseCharStats().getCurrentClassLevel()) + ", "); break; case 6: str.append(M.baseEnvStats().level() + ", "); break; case 7: str.append(M.baseCharStats().displayClassLevel(M, true) + ", "); break; case 8: str.append(M.baseCharStats().getClassLevel(M.baseCharStats().getCurrentClass()) + ", "); break; case 9: { for (int c = M.charStats().numClasses() - 1; c >= 0; c--) { CharClass C = M.charStats().getMyClass(c); str.append( C.name(M.baseCharStats().getCurrentClassLevel()) + " (" + M.charStats().getClassLevel(C) + ") "); } str.append(", "); break; } case 10: if (M.maxCarry() > (Integer.MAX_VALUE / 3)) str.append("NA, "); else str.append(M.maxCarry() + ", "); break; case 11: str.append(CMStrings.capitalizeAndLower(CMLib.combat().fightingProwessStr(M)) + ", "); break; case 12: str.append(CMStrings.capitalizeAndLower(CMLib.combat().armorStr(M)) + ", "); break; case 13: str.append(CMLib.combat().adjustedDamage(M, null, null) + ", "); break; case 14: str.append(Math.round(CMath.div(M.getAgeHours(), 60.0)) + ", "); break; case 15: str.append(M.getPractices() + ", "); break; case 16: str.append(M.getExperience() + ", "); break; case 17: if (M.getExpNeededLevel() == Integer.MAX_VALUE) str.append("N/A, "); else str.append(M.getExpNextLevel() + ", "); break; case 18: str.append(M.getTrains() + ", "); break; case 19: str.append(CMLib.beanCounter().getMoney(M) + ", "); break; case 20: str.append(M.getWorshipCharID() + ", "); break; case 21: str.append(M.getLiegeID() + ", "); break; case 22: str.append(M.getClanID() + ", "); break; case 23: if (M.getClanID().length() > 0) { Clan C = CMLib.clans().getClan(M.getClanID()); if (C != null) str.append( CMLib.clans().getRoleName(C.getGovernment(), M.getClanRole(), true, false) + ", "); } break; case 24: str.append(M.fetchFaction(CMLib.factions().AlignID()) + ", "); break; case 25: { Faction.FactionRange FR = CMLib.factions() .getRange(CMLib.factions().AlignID(), M.fetchFaction(CMLib.factions().AlignID())); if (FR != null) str.append(FR.name() + ", "); else str.append(M.fetchFaction(CMLib.factions().AlignID())); break; } case 26: str.append(M.getWimpHitPoint() + ", "); break; case 27: if (M.getStartRoom() != null) str.append(M.getStartRoom().displayText() + ", "); break; case 28: if (M.location() != null) str.append(M.location().displayText() + ", "); break; case 29: if (M.getStartRoom() != null) str.append(M.getStartRoom().roomID() + ", "); break; case 30: if (M.location() != null) str.append(M.location().roomID() + ", "); break; case 31: { for (int inv = 0; inv < M.inventorySize(); inv++) { Item I = M.fetchInventory(inv); if ((I != null) && (I.container() == null)) str.append(I.name() + ", "); } break; } case 32: str.append(M.baseEnvStats().weight() + ", "); break; case 33: str.append(M.envStats().weight() + ", "); break; case 34: str.append(CMStrings.capitalizeAndLower(M.baseCharStats().genderName()) + ", "); break; case 35: if (M.playerStats() != null) str.append(M.playerStats().lastDateTime() + ", "); break; case 36: str.append(M.curState().getHitPoints() + ", "); break; case 37: str.append(M.curState().getMana() + ", "); break; case 38: str.append(M.curState().getMovement() + ", "); break; case 39: if (M.riding() != null) str.append(M.riding().name() + ", "); break; case 40: str.append(M.baseEnvStats().height() + ", "); break; case 41: if (!M.isMonster()) str.append(M.session().getAddress() + ", "); else if (M.playerStats() != null) str.append(M.playerStats().lastIP() + ", "); break; case 42: str.append(M.getQuestPoint() + ", "); break; case 43: str.append(M.maxState().getHitPoints() + ", "); break; case 44: str.append(M.maxState().getMana() + ", "); break; case 45: str.append(M.maxState().getMovement() + ", "); break; case 46: str.append(M.rawImage() + ", "); break; case 47: str.append(M.maxItems() + ", "); break; case 48: { String[] paths = CMProps.mxpImagePath(M.image()); if (paths[0].length() > 0) str.append(paths[0] + paths[1] + ", "); break; } case 49: if (CMProps.mxpImagePath(M.image())[0].length() > 0) str.append("true, "); else str.append("false, "); break; case 50: if (M.playerStats() != null) str.append(M.playerStats().notes() + ", "); break; case 51: if (M.playerStats() != null) { long lastDateTime = -1; for (int level = 0; level <= M.envStats().level(); level++) { long dateTime = M.playerStats().leveledDateTime(level); if ((dateTime > 1529122205) && (dateTime != lastDateTime)) { str.append("<TR>"); if (level == 0) str.append("<TD><FONT COLOR=WHITE>Created</FONT></TD>"); else str.append("<TD><FONT COLOR=WHITE>" + level + "</FONT></TD>"); str.append( "<TD><FONT COLOR=WHITE>" + CMLib.time().date2String(dateTime) + "</FONT></TD></TR>"); } } str.append(", "); } break; case 52: str.append(M.baseEnvStats().attackAdjustment() + ", "); break; case 53: str.append(M.baseEnvStats().damage() + ", "); break; case 54: str.append(M.baseEnvStats().armor() + ", "); break; case 55: str.append(M.envStats().speed() + ", "); break; case 56: str.append(M.baseEnvStats().speed() + ", "); break; case 57: { for (int e = 0; e < M.numExpertises(); e++) { String E = M.fetchExpertise(e); ExpertiseLibrary.ExpertiseDefinition X = CMLib.expertises().getDefinition(E); if (X == null) str.append(E + ", "); else str.append(X.name + ", "); } break; } case 58: { for (int t = 0; t < M.numTattoos(); t++) { String E = M.fetchTattoo(t); str.append(E + ", "); } break; } case 59: { if (M.playerStats() != null) for (int b = 0; b < M.playerStats().getSecurityGroups().size(); b++) { String B = (String) M.playerStats().getSecurityGroups().elementAt(b); if (B != null) str.append(B + ", "); } break; } case 60: { if (M.playerStats() != null) for (int b = 0; b < M.playerStats().getTitles().size(); b++) { String B = (String) M.playerStats().getTitles().elementAt(b); if (B != null) str.append(B + ", "); } break; } case 61: { for (Enumeration e = M.fetchFactions(); e.hasMoreElements(); ) { String FID = (String) e.nextElement(); Faction F = CMLib.factions().getFaction(FID); int value = M.fetchFaction(FID); if (F != null) str.append(F.name() + " (" + value + "), "); } break; } case 62: str.append(CMProps.getBoolVar(CMProps.SYSTEMB_ACCOUNTEXPIRATION) ? "true" : "false"); break; case 63: if (M.playerStats() != null) str.append(CMLib.time().date2String(M.playerStats().getAccountExpiration())); break; case 64: { for (int f = 0; f < M.numFollowers(); f++) str.append(M.fetchFollower(f).name()).append(", "); // Vector V=CMLib.database().DBScanFollowers(M); // for(int v=0;v<V.size();v++) // str.append(((MOB)V.elementAt(v)).name()).append(", "); break; } case 65: if ((M.playerStats() != null) && (M.playerStats().getAccount() != null)) str.append(M.playerStats().getAccount().accountName()); break; } return str.toString(); }
public double actionsCost(MOB mob, Vector cmds) { return CMath.div(CMProps.getIntVar(CMProps.SYSTEMI_DEFCMDTIME), 100.0); }
@Override public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { final MOB mobTarget = getTarget(mob, commands, givenTarget, true, false); Item target = getPossibility(mobTarget); if (target == null) target = getTarget(mob, mob.location(), givenTarget, commands, Wearable.FILTER_ANY); if (target == null) return false; if (((target.material() & RawMaterial.MATERIAL_MASK) != RawMaterial.MATERIAL_WOODEN) || (!target.subjectToWearAndTear())) { mob.tell(L("That can't be warped.")); return false; } if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; final boolean success = proficiencyCheck(mob, 0, auto); if (success) { final CMMsg msg = CMClass.getMsg( mob, target, this, verbalCastCode(mob, target, auto), auto ? L("<T-NAME> starts warping!") : L("^S<S-NAME> chant(s) at <T-NAMESELF>.^?")); final CMMsg msg2 = CMClass.getMsg(mob, mobTarget, this, verbalCastCode(mob, mobTarget, auto), null); if ((mob.location().okMessage(mob, msg)) && ((mobTarget == null) || (mob.location().okMessage(mob, msg2)))) { mob.location().send(mob, msg); if (mobTarget != null) mob.location().send(mob, msg2); if (msg.value() <= 0) { int damage = 100 + (mob.phyStats().level() + (2 * super.getXLEVELLevel(mob))) - target.phyStats().level(); if (CMLib.flags().isABonusItems(target)) damage = (int) Math.round(CMath.div(damage, 2.0)); target.setUsesRemaining(target.usesRemaining() - damage); if (mobTarget == null) mob.location() .show(mob, target, CMMsg.MSG_OK_VISUAL, L("<T-NAME> begin(s) to twist and warp!")); else mob.location() .show( mobTarget, target, CMMsg.MSG_OK_VISUAL, L("<T-NAME>, possessed by <S-NAME>, twists and warps!")); if (target.usesRemaining() > 0) target.recoverPhyStats(); else { target.setUsesRemaining(100); mob.location().show(mob, target, CMMsg.MSG_OK_VISUAL, L("<T-NAME> is destroyed!")); target.unWear(); target.destroy(); mob.location().recoverRoomStats(); } } } } else return maliciousFizzle(mob, null, L("<S-NAME> chant(s), but nothing happens.")); // return whether it worked return success; }
@Override public void executeMsg(Environmental host, CMMsg msg) { if (msg.amITarget(this)) { switch (msg.targetMinor()) { case CMMsg.TYP_ACTIVATE: if ((msg.source().location() != null) && (!CMath.bset(msg.targetMajor(), CMMsg.MASK_CNTRLMSG))) msg.source() .location() .show(msg.source(), this, CMMsg.MSG_OK_VISUAL, L("<S-NAME> activate(s) <T-NAME>.")); this.activate(true); break; case CMMsg.TYP_DEACTIVATE: if ((msg.source().location() != null) && (!CMath.bset(msg.targetMajor(), CMMsg.MASK_CNTRLMSG))) msg.source() .location() .show( msg.source(), this, CMMsg.MSG_OK_VISUAL, L("<S-NAME> deactivate(s) <T-NAME>.")); this.activate(false); break; case CMMsg.TYP_LOOK: super.executeMsg(host, msg); if (CMLib.flags().canBeSeenBy(this, msg.source())) msg.source() .tell( L( "@x1 is currently @x2", name(), (activated() ? "connected.\n\r" : "deactivated/disconnected.\n\r"))); return; case CMMsg.TYP_REPAIR: if (CMLib.dice().rollPercentage() < msg.value()) { setUsesRemaining(usesRemaining() < 100 ? 100 : usesRemaining()); msg.source().tell(L("@x1 is now repaired.\n\r", name())); } else { final int repairRequired = 100 - usesRemaining(); if (repairRequired > 0) { int repairApplied = (int) Math.round(CMath.mul(repairRequired, CMath.div(msg.value(), 100))); if (repairApplied < 0) repairApplied = 1; setUsesRemaining(usesRemaining() + repairApplied); msg.source().tell(L("@x1 is now @x2% repaired.\n\r", name(), "" + usesRemaining())); } } break; case CMMsg.TYP_ENHANCE: if ((CMLib.dice().rollPercentage() < msg.value()) && (CMLib.dice().rollPercentage() < 50)) { float addAmt = 0.01f; if (getInstalledFactor() < 1.0) { addAmt = (float) (CMath.div(100.0, msg.value()) * 0.1); if (addAmt < 0.1f) addAmt = 0.1f; } setInstalledFactor(this.getInstalledFactor() + addAmt); msg.source().tell(msg.source(), this, null, L("<T-NAME> is now enhanced.\n\r")); } else { msg.source() .tell( msg.source(), this, null, L("Your attempt to enhance <T-NAME> has failed.\n\r")); } break; } } super.executeMsg(host, msg); }
public double combatCastingTime(final MOB mob, final List<String> cmds) { return CMProps.getCombatActionSkillCost( ID(), CMath.div(CMProps.getIntVar(CMProps.SYSTEMI_DEFCOMABLETIME), 50.0)); }
protected boolean stopFalling(MOB mob) { final Room R = mob.location(); if (reversed()) { if (!hitTheCeiling) { hitTheCeiling = true; if (R != null) R.show( mob, null, CMMsg.MSG_OK_ACTION, L("<S-NAME> hit(s) the ceiling.@x1", CMLib.protocol().msp("splat.wav", 50))); CMLib.combat() .postDamage( mob, mob, this, damageToTake, CMMsg.MASK_ALWAYS | CMMsg.TYP_JUSTICE, -1, null); } return true; } hitTheCeiling = false; unInvoke(); if (R != null) { if (isAirRoom(R)) R.show( mob, null, CMMsg.MSG_OK_ACTION, L("<S-NAME> stop(s) falling.@x1", CMLib.protocol().msp("splat.wav", 50))); else if (CMLib.flags().isWaterySurfaceRoom(R) || CMLib.flags().isUnderWateryRoom(R)) R.show( mob, null, CMMsg.MSG_OK_ACTION, L("<S-NAME> hit(s) the water.@x1", CMLib.protocol().msp("splat.wav", 50))); else { R.show( mob, null, CMMsg.MSG_OK_ACTION, L("<S-NAME> hit(s) the ground.@x1", CMLib.protocol().msp("splat.wav", 50))); if (CMath.div(damageToTake, mob.maxState().getHitPoints()) > 0.05) { LimbDamage damage = (LimbDamage) mob.fetchEffect("BrokenLimbs"); if (damage == null) { damage = (LimbDamage) CMClass.getAbility("BrokenLimbs"); damage.setAffectedOne(mob); } List<String> limbs = damage.unaffectedLimbSet(); if (limbs.size() > 0) { if (mob.fetchEffect(damage.ID()) == null) { mob.addEffect(damage); damage.makeLongLasting(); } damage.damageLimb(limbs.get(CMLib.dice().roll(1, limbs.size(), -1))); } } } CMLib.combat() .postDamage( mob, mob, this, damageToTake, CMMsg.MASK_ALWAYS | CMMsg.TYP_JUSTICE, -1, null); } mob.delEffect(this); return false; }
@Override public boolean tick(Tickable ticking, int tickID) { if (!super.tick(ticking, tickID)) return false; if (tickID != Tickable.TICKID_MOB) return true; if (affected == null) return false; if (--fallTickDown > 0) return true; fallTickDown = 1; int direction = Directions.DOWN; String addStr = L("down"); if (reversed()) { direction = Directions.UP; addStr = L("upwards"); } if (affected instanceof MOB) { final MOB mob = (MOB) affected; if (mob == null) return false; if (mob.location() == null) return false; if (CMLib.flags().isInFlight(mob)) { damageToTake = 0; unInvoke(); return false; } else if (!canFallFrom(mob.location(), direction)) return stopFalling(mob); else { if (mob.phyStats().weight() < 1) { mob.tell(L("\n\r\n\rYou are floating gently @x1.\n\r\n\r", addStr)); } else { mob.tell(L("\n\r\n\rYOU ARE FALLING @x1!!\n\r\n\r", addStr.toUpperCase())); int damage = CMLib.dice() .roll( 1, (int) Math.round( CMath.mul( CMath.mul(mob.maxState().getHitPoints(), 0.1), CMath.div(mob.baseWeight(), 150.0))), 0); if (damage > (mob.maxState().getHitPoints() / 3)) damage = (mob.maxState().getHitPoints() / 3); damageToTake = reversed() ? damage : (damageToTake + damage); } temporarilyDisable = true; CMLib.tracking().walk(mob, direction, false, false); temporarilyDisable = false; if (!canFallFrom(mob.location(), direction)) return stopFalling(mob); return true; } } else if (affected instanceof Item) { final Item item = (Item) affected; if ((room == null) && (item.owner() != null) && (item.owner() instanceof Room)) room = (Room) item.owner(); if ((room == null) || ((room != null) && (!room.isContent(item))) || (!CMLib.flags().isGettable(item)) || (item.container() != null) || (CMLib.flags().isInFlight(item.ultimateContainer(null))) || (room.getRoomInDir(direction) == null)) { unInvoke(); return false; } if (room.numItems() > 100) { fallTickDown = CMLib.dice().roll(1, room.numItems() / 50, 0); if ((--fallTickDown) > 0) return true; } final Room nextRoom = room.getRoomInDir(direction); if (canFallFrom(room, direction)) { room.show(invoker, null, item, CMMsg.MSG_OK_ACTION, L("<O-NAME> falls @x1.", addStr)); nextRoom.moveItemTo(item, ItemPossessor.Expire.Player_Drop); room = nextRoom; nextRoom.show( invoker, null, item, CMMsg.MSG_OK_ACTION, L("<O-NAME> falls in from @x1.", (reversed() ? "below" : "above"))); return true; } if (reversed()) return true; unInvoke(); return false; } return false; }
@Override public void affectPhyStats(Physical affected, PhyStats affectableStats) { super.affectPhyStats(affected, affectableStats); affectableStats.setSpeed(CMath.div(affectableStats.speed(), 2.0)); }