public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { if (mob.fetchEffect("Thief_Hide") != null) { mob.tell("You are already hiding."); return false; } if (mob.isInCombat()) { mob.tell("Not while in combat!"); return false; } if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; Set<MOB> H = mob.getGroupMembers(new HashSet<MOB>()); if (!H.contains(mob)) H.add(mob); int numBesidesMe = 0; for (Iterator e = H.iterator(); e.hasNext(); ) { MOB M = (MOB) e.next(); if ((M != mob) && (mob.location().isInhabitant(M))) numBesidesMe++; } if (numBesidesMe == 0) { mob.tell("You need a group to set up an ambush!"); return false; } for (int i = 0; i < mob.location().numInhabitants(); i++) { MOB M = mob.location().fetchInhabitant(i); if ((M != null) && (M != mob) && (!H.contains(M)) && (CMLib.flags().canSee(M))) { mob.tell(M, null, null, "<S-NAME> is watching you too closely."); return false; } } boolean success = proficiencyCheck(mob, 0, auto); if (!success) beneficialVisualFizzle(mob, null, "<S-NAME> attempt(s) to set up an ambush, but fail(s)."); else { CMMsg msg = CMClass.getMsg( mob, null, this, auto ? CMMsg.MSG_OK_ACTION : (CMMsg.MSG_DELICATE_HANDS_ACT | CMMsg.MASK_MOVE), "<S-NAME> set(s) up an ambush, directing everyone to hiding places."); if (mob.location().okMessage(mob, msg)) { mob.location().send(mob, msg); invoker = mob; Ability hide = CMClass.getAbility("Thief_Hide"); for (Iterator e = H.iterator(); e.hasNext(); ) { MOB M = (MOB) e.next(); hide.invoke(M, M, true, adjustedLevel(mob, asLevel)); } } else success = false; } return success; }
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 boolean tick(Tickable ticking, int tickID) { if (!super.tick(ticking, tickID)) return false; if ((tickID == Tickable.TICKID_MOB) && (affected != null) && (affected instanceof MOB)) { MOB mob = (MOB) affected; if ((mob.isInCombat()) && (CMLib.flags().aliveAwakeMobileUnbound(mob, true)) && (mob.rangeToTarget() == 0) && (mob.charStats().getBodyPart(Race.BODY_HAND) > 1) && (!anyWeapons(mob))) { if (CMLib.dice().rollPercentage() > 95) helpProficiency(mob, 0); if ((naturalWeapon == null) || (naturalWeapon.amDestroyed())) { naturalWeapon = CMClass.getWeapon("GenWeapon"); naturalWeapon.setName("a knife hand"); naturalWeapon.setWeaponType(Weapon.TYPE_PIERCING); naturalWeapon.basePhyStats().setDamage(7); naturalWeapon.recoverPhyStats(); } CMLib.combat().postAttack(mob, mob.getVictim(), naturalWeapon); } } return true; }
public boolean preInvoke( MOB mob, List<String> commands, Physical givenTarget, boolean auto, int asLevel, int secondsElapsed, double actionsRemaining) { if (secondsElapsed == 0) { String dir = CMParms.combine(commands, 0); if (commands.size() > 0) dir = (String) commands.get(commands.size() - 1); int dirCode = Directions.getGoodDirectionCode(dir); if (dirCode < 0) { mob.tell("Step where?"); return false; } if (mob.isInCombat()) { mob.tell("Not while you are fighting!"); return false; } if ((mob.location().getRoomInDir(dirCode) == null) || (mob.location().getExitInDir(dirCode) == null)) { mob.tell("Step where?"); return false; } CMMsg msg = CMClass.getMsg( mob, null, this, auto ? CMMsg.MSG_OK_VISUAL : CMMsg.MSG_DELICATE_HANDS_ACT, "<S-NAME> start(s) walking carefully " + Directions.getDirectionName(dirCode) + "."); if (mob.location().okMessage(mob, msg)) mob.location().send(mob, msg); else return false; } return true; }
public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) { if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false; boolean success = (!mob.isInCombat()) || proficiencyCheck(mob, 0, auto); if (success) { int AUTO = auto ? CMMsg.MASK_ALWAYS : 0; Room recalledRoom = mob.location(); Room recallRoom = mob.getStartRoom(); CMMsg msg = CMClass.getMsg( mob, recalledRoom, this, verbalCastCode(mob, recalledRoom, auto), CMMsg.MASK_MAGIC | AUTO | CMMsg.MSG_LEAVE, verbalCastCode(mob, recalledRoom, auto), auto ? "<S-NAME> disappear(s) into the Java Plane!" : "<S-NAME> recall(s) body and spirit to the Java Plane!"); CMMsg msg2 = CMClass.getMsg( mob, recallRoom, this, verbalCastCode(mob, recallRoom, auto), CMMsg.MASK_MAGIC | AUTO | CMMsg.MASK_MOVE | CMMsg.MSG_ENTER, verbalCastCode(mob, recallRoom, auto), null); if ((recalledRoom.okMessage(mob, msg)) && (recallRoom.okMessage(mob, msg2))) { recalledRoom.send(mob, msg); recallRoom.send(mob, msg2); if (recalledRoom.isInhabitant(mob)) recallRoom.bringMobHere(mob, false); for (int f = 0; f < mob.numFollowers(); f++) { MOB follower = mob.fetchFollower(f); msg = CMClass.getMsg( follower, recalledRoom, this, verbalCastCode(mob, recalledRoom, auto), CMMsg.MASK_MAGIC | AUTO | CMMsg.MSG_LEAVE, verbalCastCode(mob, recalledRoom, auto), auto ? "<S-NAME> disappear(s) into the Java Plane!" : "<S-NAME> <S-IS-ARE> sucked into the vortex created by " + mob.name() + "s recall."); if ((follower != null) && (follower.isMonster()) && (!follower.isPossessing()) && (follower.location() == recalledRoom) && (recalledRoom.isInhabitant(follower)) && (recalledRoom.okMessage(follower, msg))) { msg2 = CMClass.getMsg( follower, recallRoom, this, verbalCastCode(mob, recallRoom, auto), CMMsg.MASK_MAGIC | AUTO | CMMsg.MASK_MOVE | CMMsg.MSG_ENTER, verbalCastCode(mob, recallRoom, auto), null); if (recallRoom.okMessage(follower, msg2)) { recallRoom.send(follower, msg2); if (recalledRoom.isInhabitant(follower)) recallRoom.bringMobHere(follower, false); } } } } } else beneficialWordsFizzle( mob, null, "<S-NAME> attempt(s) to recall, but <S-HIS-HER> plea goes unheard."); // return whether it worked return success; }