@Override public void setMiscText(String txt) { super.setMiscText(""); if (txt.startsWith("-")) { txt = txt.substring(1).toLowerCase().trim(); for (final Object[] A : affects) if (((CMObject) A[0]).ID().toLowerCase().equals(txt)) { unAffectAffected(A); return; } for (final Object[] A : affects) if ((A[0] instanceof Ability) && (((Environmental) A[0]).name().toLowerCase().startsWith(txt))) { unAffectAffected(A); return; } for (final Object[] A : affects) if ((A[0] instanceof Behavior) && (((Behavior) A[0]).name().toLowerCase().startsWith(txt))) { unAffectAffected(A); return; } } else if (txt.trim().length() > 0) { if (txt.startsWith("+")) txt = txt.substring(1); else for (final Object[] A : affects) unAffectAffected(A); int x = txt.indexOf(' '); if (x < 0) return; final String abilityStr = txt.substring(0, x).trim(); String numTicksStr = txt.substring(x + 1).trim(); String parms = ""; x = numTicksStr.indexOf(' '); if (x > 0) { parms = numTicksStr.substring(x + 1).trim(); numTicksStr = numTicksStr.substring(0, x); } CMObject A = CMClass.getAbility(abilityStr); if (A == null) A = CMClass.getBehavior(abilityStr); if (A == null) A = CMClass.findAbility(abilityStr); if (A == null) A = CMClass.findBehavior(abilityStr); if (A != null) { affects.addElement(new Object[] {A, new int[] {CMath.s_int(numTicksStr)}}); if (A instanceof Ability) ((Ability) A).setMiscText(parms); if ((A instanceof Behavior) && (affected instanceof PhysicalAgent)) ((Behavior) A).setParms(parms); finishInit(A); } } }
public void finishInit(CMObject A) { if (affected == null) return; if (A instanceof Ability) { ((Ability) A).makeNonUninvokable(); ((Ability) A).makeLongLasting(); ((Ability) A).setAffectedOne(affected); } if ((A instanceof Behavior) && (affected instanceof PhysicalAgent)) ((Behavior) A).startBehavior((PhysicalAgent) affected); if (affected != null) affected.recoverPhyStats(); if (affected instanceof MOB) { ((MOB) affected).recoverCharStats(); ((MOB) affected).recoverMaxState(); } initialized = true; }
@Override void setOwner(Agent agent) { super.setOwner(agent); for (State s : states.values()) s.log = log; }
public String getTickStatusSummary(Tickable obj) { if (obj == null) return ""; long code = obj.getTickStatus(); if (obj instanceof Environmental) { if (CMath.bset(code, Tickable.STATUS_BEHAVIOR)) { long b = (code - Tickable.STATUS_BEHAVIOR); String codeWord = "Behavior #" + b; if ((b >= 0) && (b < ((Environmental) obj).numBehaviors())) { Behavior B = ((Environmental) obj).fetchBehavior((int) b); codeWord += " (" + B.name() + ": " + B.getTickStatus(); } else codeWord += " (#Error#)"; return codeWord; } else if (CMath.bset(code, Tickable.STATUS_SCRIPT) && (obj instanceof MOB)) { long b = (code - Tickable.STATUS_SCRIPT); String codeWord = "Script #" + b; if ((b >= 0) && (b < ((MOB) obj).numScripts())) { ScriptingEngine S = ((MOB) obj).fetchScript((int) b); codeWord += " (" + CMStrings.limit(S.getScript(), 20) + ": " + S.getTickStatus(); } return codeWord; } else if ((code & STATUS_ALLMISCTICKS) > 0) { long base = (code & STATUS_ALLMISCTICKS); int num = 0; for (int i = 1; i < 6; i++) if ((1 << (10 + i)) == base) { num = i; break; } return "Misc" + num + " Activity #" + (code - base); } else if (CMath.bset(code, Tickable.STATUS_AFFECT)) { long b = (code - Tickable.STATUS_AFFECT); String codeWord = "Effect #" + b; if ((b >= 0) && (b < ((Environmental) obj).numEffects())) { Environmental E = ((Environmental) obj).fetchEffect((int) b); codeWord += " (" + E.name() + ": " + E.getTickStatus() + ")"; } return codeWord; } } String codeWord = null; if (CMath.bset(code, Tickable.STATUS_BEHAVIOR)) codeWord = "Behavior?!"; else if (CMath.bset(code, Tickable.STATUS_SCRIPT)) codeWord = "Script?!"; else if (CMath.bset(code, Tickable.STATUS_AFFECT)) codeWord = "Effect?!"; else switch ((int) code) { case (int) Tickable.STATUS_ALIVE: codeWord = "Alive"; break; case (int) Tickable.STATUS_REBIRTH: codeWord = "Rebirth"; break; case (int) Tickable.STATUS_CLASS: codeWord = "Class"; break; case (int) Tickable.STATUS_DEAD: codeWord = "Dead"; break; case (int) Tickable.STATUS_END: codeWord = "End"; break; case (int) Tickable.STATUS_FIGHT: codeWord = "Fighting"; break; case (int) Tickable.STATUS_NOT: codeWord = "!"; break; case (int) Tickable.STATUS_OTHER: codeWord = "Other"; break; case (int) Tickable.STATUS_RACE: codeWord = "Race"; break; case (int) Tickable.STATUS_START: codeWord = "Start"; break; case (int) Tickable.STATUS_WEATHER: codeWord = "Weather"; break; default: codeWord = "?"; break; } return codeWord; }
@Override public boolean invoke( MOB mob, List<String> commands, Physical givenTarget, boolean auto, int asLevel) { final Physical target = getAnyTarget(mob, commands, givenTarget, Wearable.FILTER_UNWORNONLY); if (target == null) return false; if (target == mob) { mob.tell(L("@x1 doesn't look dead yet.", target.name(mob))); return false; } if (!(target instanceof DeadBody)) { mob.tell(L("You can't animate that.")); return false; } final DeadBody body = (DeadBody) target; if (body.isPlayerCorpse() || (body.getMobName().length() == 0) || ((body.charStats() != null) && (body.charStats().getMyRace() != null) && (body.charStats().getMyRace().racialCategory().equalsIgnoreCase("Undead")))) { mob.tell(L("You can't animate that.")); return false; } String race = "a"; if ((body.charStats() != null) && (body.charStats().getMyRace() != null)) race = CMLib.english().startWithAorAn(body.charStats().getMyRace().name()).toLowerCase(); String description = body.getMobDescription(); if (description.trim().length() == 0) description = "It looks dead."; else description += "\n\rIt also looks dead."; if (body.basePhyStats().level() < 7) { mob.tell(L("This creature is too weak to create a ghast from.")); 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("^S<S-NAME> @x1 to animate <T-NAMESELF> as a ghast.^?", prayForWord(mob))); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); int undeadLevel = this.getUndeadLevel(mob, 6, body.phyStats().level()); final MOB newMOB = CMClass.getMOB("GenUndead"); newMOB.setName(L("@x1 ghast", race)); newMOB.setDescription(description); newMOB.setDisplayText(L("@x1 ghast is here", race)); newMOB.basePhyStats().setLevel(undeadLevel); newMOB .baseCharStats() .setStat(CharStats.STAT_GENDER, body.charStats().getStat(CharStats.STAT_GENDER)); newMOB.baseCharStats().setMyRace(CMClass.getRace("Undead")); newMOB .baseCharStats() .setBodyPartsFromStringAfterRace(body.charStats().getBodyPartsAsString()); final Ability P = CMClass.getAbility("Prop_StatTrainer"); if (P != null) { P.setMiscText("NOTEACH STR=20 INT=10 WIS=10 CON=10 DEX=15 CHA=2"); newMOB.addNonUninvokableEffect(P); } newMOB.recoverCharStats(); newMOB.basePhyStats().setAttackAdjustment(CMLib.leveler().getLevelAttack(newMOB)); newMOB.basePhyStats().setDamage(CMLib.leveler().getLevelMOBDamage(newMOB)); newMOB.basePhyStats().setSensesMask(PhyStats.CAN_SEE_DARK); CMLib.factions().setAlignment(newMOB, Faction.Align.EVIL); newMOB.baseState().setHitPoints(25 * newMOB.basePhyStats().level()); newMOB.baseState().setMovement(CMLib.leveler().getLevelMove(newMOB)); newMOB.basePhyStats().setArmor(CMLib.leveler().getLevelMOBArmor(newMOB)); newMOB.baseState().setMana(100); newMOB.recoverCharStats(); newMOB.recoverPhyStats(); newMOB.recoverMaxState(); newMOB.resetToMaxState(); newMOB.addAbility(CMClass.getAbility("Paralysis")); Behavior B = CMClass.getBehavior("CombatAbilities"); if (B != null) newMOB.addBehavior(B); B = CMClass.getBehavior("Aggressive"); if (B != null) { B.setParms("+NAMES \"-" + mob.Name() + "\" -LEVEL +>" + newMOB.basePhyStats().level()); newMOB.addBehavior(B); } newMOB.addNonUninvokableEffect(CMClass.getAbility("Spell_CauseStink")); newMOB.addNonUninvokableEffect(CMClass.getAbility("Prop_ModExperience")); newMOB.text(); newMOB.bringToLife(mob.location(), true); CMLib.beanCounter().clearZeroMoney(newMOB, null); // newMOB.location().showOthers(newMOB,null,CMMsg.MSG_OK_ACTION,L("<S-NAME> appears!")); int it = 0; while (it < newMOB.location().numItems()) { final Item item = newMOB.location().getItem(it); if ((item != null) && (item.container() == body)) { final CMMsg msg2 = CMClass.getMsg(newMOB, body, item, CMMsg.MSG_GET, null); newMOB.location().send(newMOB, msg2); final CMMsg msg4 = CMClass.getMsg(newMOB, item, null, CMMsg.MSG_GET, null); newMOB.location().send(newMOB, msg4); final CMMsg msg3 = CMClass.getMsg(newMOB, item, null, CMMsg.MSG_WEAR, null); newMOB.location().send(newMOB, msg3); if (!newMOB.isMine(item)) it++; else it = 0; } else it++; } body.destroy(); mob.location().show(newMOB, null, CMMsg.MSG_OK_ACTION, L("<S-NAME> begin(s) to rise!")); newMOB.setStartRoom(null); beneficialAffect(mob, newMOB, 0, 0); mob.location().recoverRoomStats(); } } else return beneficialWordsFizzle( mob, target, L("<S-NAME> @x1 to animate <T-NAMESELF>, but fail(s) miserably.", prayForWord(mob))); // return whether it worked return success; }