public Item buildMyThing(MOB mob, Room room) {
   Area A = room.getArea();
   boolean bonusWorthy = (Druid_MyPlants.myPlant(room, mob, 0) == null);
   Vector V = Druid_MyPlants.myAreaPlantRooms(mob, room.getArea());
   int pct = 0;
   if (A.getAreaIStats()[Area.Stats.VISITABLE_ROOMS.ordinal()] > 10)
     pct =
         (int)
             Math.round(
                 100.0
                     * CMath.div(
                         V.size(), A.getAreaIStats()[Area.Stats.VISITABLE_ROOMS.ordinal()]));
   Item I = buildMyPlant(mob, room);
   if ((I != null)
       && ((mob.charStats().getCurrentClass().baseClass().equalsIgnoreCase("Druid"))
           || (CMSecurity.isASysOp(mob)))) {
     if (!CMLib.law().isACity(A)) {
       if (pct > 0) {
         int newPct =
             (int)
                 Math.round(
                     100.0
                         * CMath.div(
                             V.size(), A.getAreaIStats()[Area.Stats.VISITABLE_ROOMS.ordinal()]));
         if ((newPct >= 50) && (A.fetchEffect("Chant_DruidicConnection") == null)) {
           Ability A2 = CMClass.getAbility("Chant_DruidicConnection");
           if (A2 != null) A2.invoke(mob, A, true, 0);
         }
       }
     } else if ((bonusWorthy) && (!mob.isMonster())) {
       long[] num = (long[]) plantBonuses.get(mob.Name() + "/" + room.getArea().Name());
       if ((num == null)
           || (System.currentTimeMillis() - num[1]
               > (room.getArea().getTimeObj().getDaysInMonth()
                   * room.getArea().getTimeObj().getHoursInDay()
                   * CMProps.getMillisPerMudHour()))) {
         num = new long[2];
         plantBonuses.remove(mob.Name() + "/" + room.getArea().Name());
         plantBonuses.put(mob.Name() + "/" + room.getArea().Name(), num);
         num[1] = System.currentTimeMillis();
       }
       if (V.size() >= num[0]) {
         num[0]++;
         if (num[0] < 19) {
           mob.tell("You have made this city greener.");
           CMLib.leveler().postExperience(mob, null, null, (int) num[0], false);
         }
       }
     }
   }
   return I;
 }
 public int castingQuality(MOB mob, Physical target) {
   if (mob != null) {
     if (!rightPlace(mob, false)) return Ability.QUALITY_INDIFFERENT;
     Item myPlant = Druid_MyPlants.myPlant(mob.location(), mob, 0);
     if (myPlant == null)
       return super.castingQuality(mob, target, Ability.QUALITY_BENEFICIAL_SELF);
   }
   return super.castingQuality(mob, target);
 }
 @Override
 public int castingQuality(MOB mob, Physical target) {
   if (mob != null) {
     final Item myPlant = Druid_MyPlants.myPlant(mob.location(), mob, 0);
     if (myPlant == null) return Ability.QUALITY_INDIFFERENT;
     if (target instanceof MOB) {
       if (((MOB) target).getWearPositions(Wearable.WORN_NECK) == 0)
         return Ability.QUALITY_INDIFFERENT;
     }
   }
   return super.castingQuality(mob, target);
 }
  @Override
  public boolean invoke(MOB mob, Vector commands, Physical givenTarget, boolean auto, int asLevel) {
    final MOB target = getTarget(mob, commands, givenTarget);
    if (target == null) return false;
    Item myPlant = Druid_MyPlants.myPlant(mob.location(), mob, 0);
    if (myPlant == null) {
      if (auto) myPlant = new Chant_SummonPlants().buildPlant(mob, mob.location());
      else {
        mob.tell(L("There doesn't appear to be any of your plants here to choke with."));
        return false;
      }
    }

    if (target.getWearPositions(Wearable.WORN_NECK) == 0) {
      if (!auto) mob.tell(L("Ummm, @x1 doesn't HAVE a neck...", target.name(mob)));
      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> chant(s) at <T-NAME> while pointing at @x1!^?", myPlant.name()));
      if (mob.location().okMessage(mob, msg)) {
        mob.location().send(mob, msg);
        target.moveItemTo(myPlant);
        myPlant.setRawWornCode(Wearable.WORN_NECK);
        mob.location()
            .show(
                target,
                null,
                CMMsg.MSG_OK_VISUAL,
                L("@x1 jumps up and wraps itself around <S-YOUPOSS> neck!", myPlant.name()));
        beneficialAffect(mob, myPlant, asLevel, 5);
      }
    } else
      return maliciousFizzle(
          mob, target, L("<S-NAME> chant(s) at <T-NAME>, but the magic fizzles."));

    // return whether it worked
    return success;
  }
Beispiel #5
0
  public boolean invoke(
      MOB mob, Vector commands, Environmental givenTarget, boolean auto, int asLevel) {
    if ((mob.fetchEffect(ID()) != null) || (mob.fetchEffect("Chant_Grapevine") != null)) {
      mob.tell("You are already listening through a grapevine.");
      return false;
    }
    MOB tapped = null;
    for (int i = 0; i < mob.location().numItems(); i++) {
      Item I = mob.location().fetchItem(i);
      if ((I != null) && (isPlant(I) != null)) {
        Ability A = isPlant(I);
        if ((A != null) && (A.invoker() != mob)) tapped = A.invoker();
      }
    }

    Vector myRooms = (tapped == null) ? null : Druid_MyPlants.myPlantRooms(tapped);
    if ((myRooms == null) || (myRooms.size() == 0)) {
      mob.tell("There doesn't appear to be any plants around here to listen through.");
      return false;
    }
    Item myPlant = Druid_MyPlants.myPlant(mob.location(), tapped, 0);
    if ((!auto) && (myPlant == null)) {
      mob.tell("You must be in the same room as someone elses plants to initiate this chant.");
      return false;
    }

    if (!super.invoke(mob, commands, givenTarget, auto, asLevel)) return false;

    boolean success = proficiencyCheck(mob, 0, auto);

    if (success) {
      CMMsg msg =
          CMClass.getMsg(
              mob,
              myPlant,
              this,
              verbalCastCode(mob, myPlant, auto),
              auto
                  ? ""
                  : "^S<S-NAME> chant(s) to <T-NAMESELF> and listen(s) carefully to <T-HIM-HER>!^?");
      if (mob.location().okMessage(mob, msg)) {
        mob.location().send(mob, msg);
        myChants = new Vector();
        beneficialAffect(mob, mob, asLevel, 0);
        Chant_TapGrapevine C = (Chant_TapGrapevine) mob.fetchEffect(ID());
        if (C == null) return false;
        for (int i = 0; i < myRooms.size(); i++) {
          Room R = (Room) myRooms.elementAt(i);
          int ii = 0;
          myPlant = Druid_MyPlants.myPlant(R, tapped, ii);
          while (myPlant != null) {
            Ability A = myPlant.fetchEffect(ID());
            if (A != null) myPlant.delEffect(A);
            myPlant.addNonUninvokableEffect((Ability) C.copyOf());
            A = myPlant.fetchEffect(ID());
            if (A != null) myChants.addElement(A);
            ii++;
            myPlant = Druid_MyPlants.myPlant(R, tapped, ii);
          }
        }
        C.myChants = (Vector) myChants.clone();
        myChants = new Vector();
      }

    } else
      beneficialVisualFizzle(
          mob, myPlant, "<S-NAME> chant(s) to <T-NAMESELF>, but nothing happens.");

    // return whether it worked
    return success;
  }