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 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; }