@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); }
public void unInvoke() { // undo the affects of this spell if (!(affected instanceof MOB)) return; MOB mob = (MOB) affected; super.unInvoke(); if ((canBeUninvoked() && (!mob.amDead()))) { mob.location().show(mob, null, CMMsg.MSG_OK_VISUAL, "<S-YOUPOSS> natural-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) { if (mob.isInCombat()) { mob.tell("Not while in combat!"); return false; } MOB target = getTarget(mob, commands, givenTarget); if (target == null) return false; if (CMLib.flags().isSitting(mob)) { mob.tell("You need to stand up!"); return false; } if (!CMLib.flags().aliveAwakeMobileUnbound(mob, false)) return false; if (CMLib.flags().canBeSeenBy(mob, target)) { mob.tell(target.name(mob) + " is watching you too closely."); return false; } Item w = mob.fetchWieldedItem(); if ((w == null) || (w.minRange() > 0) || (w.maxRange() > 0)) { mob.tell("You need a close melee weapon to shadowstrike."); return false; } if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; boolean success = proficiencyCheck(mob, 0, auto); int code = CMMsg.MASK_MALICIOUS | CMMsg.MSG_THIEF_ACT; String str = auto ? "" : "<S-NAME> strike(s) <T-NAMESELF> from the shadows!"; int otherCode = success ? code : CMMsg.NO_EFFECT; String otherStr = success ? str : null; CMMsg msg = CMClass.getMsg(mob, target, this, code, str, otherCode, otherStr, otherCode, otherStr); if (mob.location().okMessage(mob, msg)) { boolean alwaysInvis = CMath.bset(mob.basePhyStats().disposition(), PhyStats.IS_INVISIBLE); if (!alwaysInvis) mob.basePhyStats().setDisposition(mob.basePhyStats().disposition() | PhyStats.IS_INVISIBLE); mob.recoverPhyStats(); mob.location().send(mob, msg); CMLib.combat().postAttack(mob, target, w); if (!alwaysInvis) mob.basePhyStats().setDisposition(mob.basePhyStats().disposition() - PhyStats.IS_INVISIBLE); mob.recoverPhyStats(); if (success) { MOB oldVictim = target.getVictim(); MOB oldVictim2 = mob.getVictim(); if (oldVictim == mob) target.makePeace(); if (oldVictim2 == target) mob.makePeace(); if (mob.fetchEffect("Thief_Hide") == null) { Ability hide = mob.fetchAbility("Thief_Hide"); if (hide != null) hide.invoke(mob, null, false, asLevel); mob.location().recoverRoomStats(); if (CMLib.flags().canBeSeenBy(mob, target)) { target.setVictim(oldVictim); mob.setVictim(oldVictim2); } } } } return success; }