@Override public boolean tick(Tickable ticking, int tickID) { if (!super.tick(ticking, tickID)) return false; if ((tickID == Tickable.TICKID_MOB) && (invoker() != null) && (affected instanceof MOB)) { final MOB mob = (MOB) affected; final Set<MOB> invokerGroup = invoker().getGroupMembers(new HashSet<MOB>()); if (mob != invoker()) { if (mob.location() != invoker().location()) unInvoke(); else { if (invokerGroup.contains(mob)) unInvoke(); else if (mob.isInCombat()) { int levels = invoker().charStats().getClassLevel("Templar"); if (levels < 0) levels = invoker().phyStats().level(); if (CMLib.dice().rollPercentage() >= levels) { final MOB newvictim = mob.location().fetchRandomInhabitant(); if (newvictim != mob) mob.setVictim(newvictim); } } } } else if ((mob.location() != null) && (CMLib.flags().isEvil(invoker()))) { for (int m = 0; m < mob.location().numInhabitants(); m++) { final MOB M = mob.location().fetchInhabitant(m); if ((M != null) && (M != invoker()) && (!invokerGroup.contains(M)) && (!M.Name().equals(mob.getLiegeID()))) beneficialAffect(invoker, M, 0, Ability.TICKS_FOREVER); } } } return true; }
@Override public boolean okMessage(final Environmental myHost, final CMMsg msg) { if ((myHost != null) && (myHost instanceof MOB) && (msg.amISource((MOB) myHost))) { if (((msg.targetMinor() == CMMsg.TYP_LEAVE) || (msg.sourceMinor() == CMMsg.TYP_ADVANCE) || (msg.sourceMinor() == CMMsg.TYP_RETREAT) || (msg.sourceMinor() == CMMsg.TYP_RECALL))) { msg.source().tell(L("You can't really go anywhere -- you're a rock!")); return false; } } else if (((msg.targetMajor() & CMMsg.MASK_MALICIOUS) > 0) && (myHost instanceof MOB) && (msg.amITarget(myHost)) && (!CMath.bset(msg.sourceMajor(), CMMsg.MASK_ALWAYS))) { final MOB target = (MOB) msg.target(); if ((!target.isInCombat()) && (msg.source().isMonster()) && (msg.source().location() == target.location()) && (msg.source().getVictim() != target)) { msg.source().tell(L("Attack a rock?!")); if (target.getVictim() == msg.source()) { target.makePeace(); target.setVictim(null); } return false; } } return super.okMessage(myHost, msg); }
@Override public void unInvoke() { // undo the affects of this spell if (!(affected instanceof MOB)) return; final MOB mob = (MOB) affected; super.unInvoke(); if ((canBeUninvoked()) && (!mob.amDead())) { mob.location().show(mob, null, CMMsg.MSG_OK_VISUAL, L("<S-YOUPOSS> free-will returns.")); if (mob.amFollowing() != null) CMLib.commands().postFollow(mob, null, false); CMLib.commands().postStand(mob, true); if (mob.isMonster()) { if ((CMLib.dice().rollPercentage() > 50) || ((mob.getStartRoom() != null) && (mob.getStartRoom().getArea() != mob.location().getArea()) && (CMLib.flags().isAggressiveTo(mob, null) || (invoker == null) || (!mob.location().isInhabitant(invoker))))) CMLib.tracking().wanderAway(mob, true, true); else if ((invoker != null) && (invoker != mob)) mob.setVictim(invoker); } } }
@Override public boolean okMessage(final Environmental myHost, final CMMsg msg) { if (!super.okMessage(myHost, msg)) return false; if ((msg.target() == affected) && msg.isTarget(CMMsg.MASK_MALICIOUS) && CMLib.flags().isAPlant(msg.source()) && (affected instanceof MOB) && (pointsRemaining >= 0)) { final MOB mob = (MOB) affected; final MOB plantMOB = msg.source(); final Room R = plantMOB.location(); if ((R != null) && (R == mob.location())) { if ((msg.isSource(CMMsg.TYP_ADVANCE)) && (--pointsRemaining >= 0)) { R.show( plantMOB, affected, CMMsg.MSG_OK_ACTION, L("<S-NAME> struggle(s) against <T-YOUPOSS> anti-plant shell.")); return false; } else if (plantMOB.getVictim() == null) { plantMOB.setVictim(mob); if (mob.getVictim() == plantMOB) { if (mob.rangeToTarget() > 0) plantMOB.setRangeToTarget(mob.rangeToTarget()); else { plantMOB.setRangeToTarget(R.maxRange()); mob.setRangeToTarget(R.maxRange()); } } else plantMOB.setRangeToTarget(R.maxRange()); if ((--pointsRemaining) < 0) { unInvoke(); return true; } R.show( plantMOB, affected, CMMsg.MSG_OK_ACTION, L("<S-NAME> <S-IS-ARE> repelled by <T-YOUPOSS> anti-plant shell.")); return false; } else if ((plantMOB.getVictim() == affected) && (plantMOB.rangeToTarget() <= 0)) { plantMOB.setRangeToTarget(R.maxRange()); if (mob.getVictim() == plantMOB) mob.setRangeToTarget(R.maxRange()); if ((--pointsRemaining) < 0) { unInvoke(); return true; } R.show( plantMOB, affected, CMMsg.MSG_OK_ACTION, L("<S-NAME> <S-IS-ARE> repelled by <T-YOUPOSS> anti-plant shell.")); return false; } else if ((mob.getVictim() == plantMOB) && (mob.rangeToTarget() <= 0)) { mob.setRangeToTarget(R.maxRange()); if ((--pointsRemaining) < 0) { unInvoke(); return true; } R.show( plantMOB, affected, CMMsg.MSG_OK_ACTION, L("<S-NAME> <S-IS-ARE> repelled by <T-YOUPOSS> anti-plant shell.")); return false; } } } else if (msg.isSource(CMMsg.TYP_ADVANCE) && (msg.source() == affected) && (msg.source().getVictim() == msg.target()) && (CMLib.flags().isAPlant((MOB) msg.target())) && (pointsRemaining >= 0) && (msg.source().rangeToTarget() == 1)) { final MOB plantM = msg.source().getVictim(); if (plantM != null) { final Room R = plantM.location(); if (R != null) { final CMMsg msg2 = CMClass.getMsg( plantM, msg.source(), CMMsg.MSG_RETREAT, L("<S-NAME> <S-IS-ARE> pushed back by <T-YOUPOSS> anti-plant shell.")); if (R.okMessage(plantM, msg2)) R.send(plantM, msg2); } } } if (pointsRemaining < 0) { unInvoke(); return true; } return true; }
public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { Set<MOB> h = properTargets(mob, givenTarget, auto); if ((h == null) || (h.size() == 0)) { mob.tell("There doesn't appear to be anyone here worth repelling."); return false; } // the invoke method for spells receives as // parameters the invoker, and the REMAINING // command line parameters, divided into words, // and added as String objects to a vector. if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; boolean success = proficiencyCheck(mob, 0, auto); if (success) { if (mob.location() .show( mob, null, this, somanticCastCode(mob, null, auto), auto ? "" : "^S<S-NAME> wave(s) <S-HIS-HER> arms and cast(s) a spell.^?")) for (Iterator f = h.iterator(); f.hasNext(); ) { MOB target = (MOB) f.next(); // it worked, so build a copy of this ability, // and add it to the affects list of the // affected MOB. Then tell everyone else // what happened. CMMsg msg = CMClass.getMsg(mob, target, this, verbalCastCode(mob, target, auto), null); if ((mob.location().okMessage(mob, msg)) && (target.fetchEffect(this.ID()) == null)) { mob.location().send(mob, msg); if (msg.value() <= 0) { amountRemaining = 130; if (target.location() == mob.location()) { success = maliciousAffect( mob, target, asLevel, ((mob.phyStats().level() + (2 * getXLEVELLevel(mob))) * 10), -1); int level = 2; if ((CMLib.ableMapper().qualifyingClassLevel(mob, this) > 0) && ((adjustedLevel(mob, asLevel) - CMLib.ableMapper().qualifyingClassLevel(mob, this)) > 10)) level += ((adjustedLevel(mob, asLevel) - CMLib.ableMapper().qualifyingClassLevel(mob, this)) - 10) / 10; if (level < 2) level = 2; target .location() .show(target, null, CMMsg.MSG_OK_ACTION, "<S-NAME> become(s) repelled!"); if ((target.getVictim() != null) && (target.rangeToTarget() > 0)) target.setAtRange(target.rangeToTarget()); else if (target.location().maxRange() < level) target.setAtRange(target.location().maxRange()); else target.setAtRange(level); if (target.getVictim() != null) target.getVictim().setAtRange(target.rangeToTarget()); if (mob.getVictim() == null) mob.setVictim(null); // correct range if (target.getVictim() == null) target.setVictim(null); // correct range } } } } } else return maliciousFizzle( mob, null, "<S-NAME> wave(s) <S-HIS-HER> arms, but the spell fizzles."); // return whether it worked return success; }