示例#1
0
  public boolean resurrect(MOB tellMob, Room corpseRoom, DeadBody body, int XPLevel) {
    MOB rejuvedMOB = CMLib.players().getPlayer(((DeadBody) body).mobName());
    if (rejuvedMOB != null) {
      rejuvedMOB.tell("You are being resurrected.");
      if (rejuvedMOB.location() != corpseRoom) {
        rejuvedMOB
            .location()
            .showOthers(rejuvedMOB, null, CMMsg.MSG_OK_VISUAL, "<S-NAME> disappears!");
        corpseRoom.bringMobHere(rejuvedMOB, false);
      }
      Ability A = rejuvedMOB.fetchAbility("Prop_AstralSpirit");
      if (A != null) rejuvedMOB.delAbility(A);
      A = rejuvedMOB.fetchEffect("Prop_AstralSpirit");
      if (A != null) rejuvedMOB.delEffect(A);

      int it = 0;
      while (it < rejuvedMOB.location().numItems()) {
        Item item = rejuvedMOB.location().fetchItem(it);
        if ((item != null) && (item.container() == body)) {
          CMMsg msg2 = CMClass.getMsg(rejuvedMOB, body, item, CMMsg.MSG_GET, null);
          rejuvedMOB.location().send(rejuvedMOB, msg2);
          CMMsg msg3 = CMClass.getMsg(rejuvedMOB, item, null, CMMsg.MSG_GET, null);
          rejuvedMOB.location().send(rejuvedMOB, msg3);
          it = 0;
        } else it++;
      }
      body.delEffect(body.fetchEffect("Age")); // so misskids doesn't record it
      body.destroy();
      rejuvedMOB
          .baseEnvStats()
          .setDisposition(
              CMath.unsetb(rejuvedMOB.baseEnvStats().disposition(), EnvStats.IS_SITTING));
      rejuvedMOB
          .envStats()
          .setDisposition(
              CMath.unsetb(rejuvedMOB.baseEnvStats().disposition(), EnvStats.IS_SITTING));
      rejuvedMOB.location().show(rejuvedMOB, null, CMMsg.MSG_NOISYMOVEMENT, "<S-NAME> get(s) up!");
      corpseRoom.recoverRoomStats();
      Vector whatsToDo = CMParms.parse(CMProps.getVar(CMProps.SYSTEM_PLAYERDEATH));
      for (int w = 0; w < whatsToDo.size(); w++) {
        String whatToDo = (String) whatsToDo.elementAt(w);
        if (whatToDo.startsWith("UNL")) CMLib.leveler().level(rejuvedMOB);
        else if (whatToDo.startsWith("ASTR")) {
        } else if (whatToDo.startsWith("PUR")) {
        } else if ((whatToDo.trim().equals("0")) || (CMath.s_int(whatToDo) > 0)) {
          if (XPLevel >= 0) {
            int expLost = (CMath.s_int(whatToDo) + (2 * XPLevel)) / 2;
            rejuvedMOB.tell("^*You regain " + expLost + " experience points.^?^.");
            CMLib.leveler().postExperience(rejuvedMOB, null, null, expLost, false);
          }
        } else if (whatToDo.length() < 3) continue;
        else if (XPLevel >= 0) {
          double lvl = (double) body.envStats().level();
          for (int l = body.envStats().level(); l < rejuvedMOB.envStats().level(); l++)
            lvl = lvl / 2.0;
          int expRestored = (int) Math.round(((100.0 + (2.0 * ((double) XPLevel))) * lvl) / 2.0);
          rejuvedMOB.tell("^*You regain " + expRestored + " experience points.^?^.");
          CMLib.leveler().postExperience(rejuvedMOB, null, null, expRestored, false);
        }
      }
      return true;
    } else
      corpseRoom.show(
          tellMob,
          body,
          CMMsg.MSG_OK_VISUAL,
          "<T-NAME> twitch(es) for a moment, but the spirit is too far gone.");
    return false;
  }
示例#2
0
  public boolean dbMerge(MOB mob, String name, Modifiable dbM, Modifiable M, Set<String> ignores)
      throws java.io.IOException, CMException {
    if ((M instanceof Physical) && (dbM instanceof Physical)) {
      final Physical PM = (Physical) M;
      final Physical dbPM = (Physical) dbM;
      if (CMLib.flags().isCataloged(PM)) {
        mob.tell(L("^H**Warning: Changes will remove this object from the catalog."));
        PM.basePhyStats()
            .setDisposition(CMath.unsetb(PM.basePhyStats().disposition(), PhyStats.IS_CATALOGED));
      }
      if (CMLib.flags().isCataloged(dbPM))
        dbPM.basePhyStats()
            .setDisposition(CMath.unsetb(dbPM.basePhyStats().disposition(), PhyStats.IS_CATALOGED));
      PM.image();
      dbPM.image();
    }

    final String[] statCodes = dbM.getStatCodes();
    int showFlag = -1;
    if (CMProps.getIntVar(CMProps.Int.EDITORTYPE) > 0) showFlag = -999;
    boolean ok = false;
    boolean didSomething = false;
    while (!ok) {
      int showNumber = 0;
      mob.tell(name);
      for (int i = 0; i < statCodes.length; i++) {
        final String statCode = M.getStatCodes()[i];
        if (ignores.contains(statCode)
            || ((M instanceof MOB) && statCode.equalsIgnoreCase("INVENTORY"))) continue;
        final String promptStr = CMStrings.capitalizeAndLower(M.getStatCodes()[i]);
        final String dbVal = dbM.getStat(statCode);
        final String loVal = M.getStat(statCode);
        if (dbVal.equals(loVal)) continue;
        ++showNumber;
        if ((showFlag > 0) && (showFlag != showNumber)) continue;
        mob.tell(
            L(
                "^H@x1. @x2\n\rValue: ^W'@x3'\n\r^HDBVal: ^N'@x4'",
                "" + showNumber,
                promptStr,
                loVal,
                dbVal));
        if ((showFlag != showNumber) && (showFlag > -999)) continue;
        final String res =
            mob.session()
                .choose(
                    L("D)atabase Value, E)dit Value, or N)o Change, or Q)uit All: "),
                    L("DENQ"),
                    L("N"));
        if (res.trim().equalsIgnoreCase("N")) continue;
        if (res.trim().equalsIgnoreCase("Q")) throw new CMException("Cancelled by user.");
        didSomething = true;
        if (res.trim().equalsIgnoreCase("D")) {
          M.setStat(statCode, dbVal);
          continue;
        }
        M.setStat(
            statCode,
            CMLib.genEd().prompt(mob, M.getStat(statCode), ++showNumber, showFlag, promptStr));
      }
      if (showNumber == 0) return didSomething;
      if (showFlag < -900) {
        ok = true;
        break;
      }
      if (showFlag > 0) {
        showFlag = -1;
        continue;
      }
      showFlag = CMath.s_int(mob.session().prompt(L("Edit which? "), ""));
      if (showFlag <= 0) {
        showFlag = -1;
        ok = true;
      }
    }
    return didSomething;
  }
  @Override
  public boolean invoke(
      MOB mob, List<String> commands, Physical givenTarget, boolean auto, int asLevel) {
    final MOB target = this.getTarget(mob, commands, givenTarget);
    if (target == null) return false;
    if ((mob.getWorshipCharID().length() == 0)
        || (CMLib.map().getDeity(mob.getWorshipCharID()) == null)) {
      if (!auto) mob.tell(L("You must worship a god to use this prayer."));
      return false;
    }
    final Deity D = CMLib.map().getDeity(mob.getWorshipCharID());
    if ((target.getWorshipCharID().length() > 0)
        && (CMLib.map().getDeity(target.getWorshipCharID()) != null)) {
      if (!auto)
        mob.tell(
            L(
                "@x1 worships @x2, and may not be converted with this prayer.",
                target.name(mob),
                target.getWorshipCharID()));
      return false;
    }
    if ((CMLib.flags().isAnimalIntelligence(target)
        || CMLib.flags().isGolem(target)
        || (D == null))) {
      if (!auto) mob.tell(L("@x1 can not be converted with this prayer.", target.name(mob)));
      return false;
    }
    if (!auto) {
      if (convertStack.contains(target)) {
        final Long L = (Long) convertStack.elementAt(convertStack.indexOf(target), 2);
        if ((System.currentTimeMillis() - L.longValue()) > CMProps.getMillisPerMudHour() * 5)
          convertStack.removeElement(target);
      }
      if (convertStack.contains(target)) {
        mob.tell(L("@x1 must wait to be undeniably faithful again.", target.name(mob)));
        return false;
      }
    }

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

    int levelDiff =
        target.phyStats().level() - (mob.phyStats().level() + (2 * getXLEVELLevel(mob)));
    if (levelDiff < 0) levelDiff = 0;
    final boolean success = proficiencyCheck(mob, -(levelDiff * 25), auto);
    int type = verbalCastCode(mob, target, auto);
    int mal = CMMsg.MASK_MALICIOUS;
    if (auto) {
      type = CMath.unsetb(type, CMMsg.MASK_MALICIOUS);
      mal = 0;
    }
    if (success) {
      final CMMsg msg =
          CMClass.getMsg(
              mob,
              target,
              this,
              type,
              auto ? "" : L("^S<S-NAME> @x1 for <T-NAMESELF> to BELIEVE!^?", prayWord(mob)));
      final CMMsg msg2 =
          CMClass.getMsg(target, D, this, CMMsg.MSG_SERVE, L("<S-NAME> BELIEVE(S) !!!"));
      final CMMsg msg3 =
          CMClass.getMsg(
              mob,
              target,
              this,
              CMMsg.MSK_CAST_VERBAL | mal | CMMsg.TYP_MIND | (auto ? CMMsg.MASK_ALWAYS : 0),
              null);
      if ((mob.location().okMessage(mob, msg))
          && (mob.location().okMessage(mob, msg3))
          && (mob.location().okMessage(mob, msg2))) {
        mob.location().send(mob, msg);
        mob.location().send(mob, msg3);
        if ((msg.value() <= 0) && (msg3.value() <= 0)) {
          target.location().send(target, msg2);
          target.setWorshipCharID(godName);
          if (mob != target) CMLib.leveler().postExperience(mob, target, null, 25, false);
          godName = mob.getWorshipCharID();
          beneficialAffect(mob, target, asLevel, CMProps.getIntVar(CMProps.Int.TICKSPERMUDMONTH));
          convertStack.addElement(target, Long.valueOf(System.currentTimeMillis()));
        }
      }
    } else
      beneficialWordsFizzle(
          mob,
          target,
          auto ? "" : L("<S-NAME> @x1 for <T-NAMESELF>, but nothing happens.", prayWord(mob)));

    // return whether it worked
    return success;
  }
  @Override
  public boolean invoke(
      MOB mob, List<String> commands, Physical givenTarget, boolean auto, int asLevel) {
    final Physical target = getAnyTarget(mob, commands, givenTarget, Wearable.FILTER_ANY, true);
    if (target == null) return false;

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

    int type = verbalCastCode(mob, target, auto);
    if ((target instanceof MOB)
        && (CMath.bset(type, CMMsg.MASK_MALICIOUS))
        && (((MOB) target).charStats().getStat(CharStats.STAT_AGE) > 0)) {
      final MOB mobt = (MOB) target;
      if (mobt.charStats().ageCategory() <= Race.AGE_CHILD)
        type = CMath.unsetb(type, CMMsg.MASK_MALICIOUS);
      else if ((mobt.getLiegeID().equals(mob.Name())) || (mobt.amFollowing() == mob))
        type = CMath.unsetb(type, CMMsg.MASK_MALICIOUS);
      else if ((mobt.charStats().ageCategory() <= Race.AGE_MATURE)
          && (mobt.getLiegeID().length() > 0)) type = CMath.unsetb(type, CMMsg.MASK_MALICIOUS);
    }

    if ((target instanceof Item)
        || ((target instanceof MOB)
            && (((MOB) target).isMonster())
            && (CMLib.flags().isAnimalIntelligence((MOB) target))
            && (CMLib.law().doesHavePriviledgesHere(mob, mob.location())))) {
      type = CMath.unsetb(type, CMMsg.MASK_MALICIOUS);
    }

    boolean success = proficiencyCheck(mob, 0, auto);
    if (success) {
      final CMMsg msg =
          CMClass.getMsg(
              mob, target, this, type, auto ? "" : L("^S<S-NAME> chant(s) to <T-NAMESELF>.^?"));
      if (mob.location().okMessage(mob, msg)) {
        mob.location().send(mob, msg);
        final Ability A = target.fetchEffect("Age");
        if ((!(target instanceof MOB)) && (!(target instanceof CagedAnimal)) && (A == null)) {
          if (target instanceof Food) {
            mob.tell(L("@x1 rots away!", target.name(mob)));
            ((Item) target).destroy();
          } else if (target instanceof Item) {
            switch (((Item) target).material() & RawMaterial.MATERIAL_MASK) {
              case RawMaterial.MATERIAL_CLOTH:
              case RawMaterial.MATERIAL_FLESH:
              case RawMaterial.MATERIAL_LEATHER:
              case RawMaterial.MATERIAL_PAPER:
              case RawMaterial.MATERIAL_VEGETATION:
              case RawMaterial.MATERIAL_WOODEN:
                {
                  mob.location()
                      .showHappens(CMMsg.MSG_OK_VISUAL, L("@x1 rots away!", target.name()));
                  if (target instanceof Container) ((Container) target).emptyPlease(false);
                  ((Item) target).destroy();
                  break;
                }
              default:
                mob.location()
                    .showHappens(
                        CMMsg.MSG_OK_VISUAL,
                        L("@x1 ages, but nothing happens to it.", target.name()));
                break;
            }
          } else
            mob.location()
                .showHappens(
                    CMMsg.MSG_OK_VISUAL, L("@x1 ages, but nothing happens to it.", target.name()));
          success = false;
        } else if ((target instanceof MOB) && ((A == null) || (A.displayText().length() == 0))) {
          final MOB M = (MOB) target;
          mob.location().show(M, null, CMMsg.MSG_OK_VISUAL, L("<S-NAME> age(s) a bit."));
          if (M.baseCharStats().getStat(CharStats.STAT_AGE) <= 0)
            M.setAgeMinutes(M.getAgeMinutes() + (M.getAgeMinutes() / 10));
          else if ((M.playerStats() != null) && (M.playerStats().getBirthday() != null)) {
            final TimeClock C = CMLib.time().localClock(M.getStartRoom());
            final double aging = CMath.mul(M.baseCharStats().getStat(CharStats.STAT_AGE), .10);
            int years = (int) Math.round(Math.floor(aging));
            final int monthsInYear = C.getMonthsInYear();
            int months = (int) Math.round(CMath.mul(aging - Math.floor(aging), monthsInYear));
            if ((years <= 0) && (months == 0)) months++;
            M.playerStats().getBirthday()[PlayerStats.BIRTHDEX_YEAR] -= years;
            M.playerStats().getBirthday()[PlayerStats.BIRTHDEX_MONTH] -= months;
            if (M.playerStats().getBirthday()[PlayerStats.BIRTHDEX_MONTH] < 1) {
              M.playerStats().getBirthday()[PlayerStats.BIRTHDEX_YEAR]--;
              years++;
              M.playerStats().getBirthday()[PlayerStats.BIRTHDEX_MONTH] =
                  monthsInYear + M.playerStats().getBirthday()[PlayerStats.BIRTHDEX_MONTH];
            }
            M.baseCharStats()
                .setStat(CharStats.STAT_AGE, M.baseCharStats().getStat(CharStats.STAT_AGE) + years);
          }
          M.recoverPhyStats();
          M.recoverCharStats();
        } else if (A != null) {
          final long start = CMath.s_long(A.text());
          long age = System.currentTimeMillis() - start;
          final long millisPerMudday =
              CMProps.getIntVar(CMProps.Int.TICKSPERMUDDAY) * CMProps.getTickMillis();
          if (age < millisPerMudday) age = millisPerMudday;
          final long millisPerMonth = CMLib.time().globalClock().getDaysInMonth() * millisPerMudday;
          final long millisPerYear = CMLib.time().globalClock().getMonthsInYear() * millisPerMonth;
          long ageBy = age / 10;
          if (ageBy < millisPerMonth) ageBy = millisPerMonth + 1;
          else if (ageBy < millisPerYear) ageBy = millisPerYear + 1;
          A.setMiscText("" + (start - ageBy));
          if (target instanceof MOB)
            mob.location()
                .show((MOB) target, null, CMMsg.MSG_OK_VISUAL, L("<S-NAME> age(s) a bit."));
          else mob.location().showHappens(CMMsg.MSG_OK_VISUAL, L("@x1 ages a bit.", target.name()));
          target.recoverPhyStats();
        } else
          return beneficialWordsFizzle(
              mob, target, L("<S-NAME> chant(s) to <T-NAMESELF>, but the magic fades."));
      }
    } else if (CMath.bset(type, CMMsg.MASK_MALICIOUS))
      return maliciousFizzle(
          mob, target, L("<S-NAME> chant(s) to <T-NAMESELF>, but the magic fades."));
    else
      return beneficialWordsFizzle(
          mob, target, L("<S-NAME> chant(s) to <T-NAMESELF>, but the magic fades."));

    // return whether it worked
    return success;
  }
示例#5
0
  protected void fillExitsOfGridRoom(Room R, int x, int y) {
    if ((x < 0) || (y < 0) || (y >= yGridSize()) || (x >= xGridSize())) return;

    synchronized (R.baseEnvStats()) {
      int mask = R.baseEnvStats().sensesMask();
      if (CMath.bset(mask, EnvStats.SENSE_ROOMGRIDSYNC)) return;
      R.baseEnvStats().setSensesMask(mask | EnvStats.SENSE_ROOMGRIDSYNC);
    }

    // the adjacent rooms created by this method should also take
    // into account the possibility that they are on the edge.
    // it does NOT
    if (ox == null) ox = CMClass.getExit("Open");
    Room R2 = null;
    if (y > 0) {
      R2 = getMakeSingleGridRoom(x, y - 1);
      if (R2 != null) linkRoom(R, R2, Directions.NORTH, ox, ox);
    } else if ((rawDoors()[Directions.NORTH] != null) && (exits[Directions.NORTH] != null))
      linkRoom(
          R,
          rawDoors()[Directions.NORTH],
          Directions.NORTH,
          exits[Directions.NORTH],
          exits[Directions.NORTH]);

    if (x > 0) {
      R2 = getMakeSingleGridRoom(x - 1, y);
      if (R2 != null) linkRoom(R, R2, Directions.WEST, ox, ox);
    } else if ((rawDoors()[Directions.WEST] != null) && (exits[Directions.WEST] != null))
      linkRoom(
          R,
          rawDoors()[Directions.WEST],
          Directions.WEST,
          exits[Directions.WEST],
          exits[Directions.WEST]);
    if (y < (yGridSize() - 1)) {
      R2 = getMakeSingleGridRoom(x, y + 1);
      if (R2 != null) linkRoom(R, R2, Directions.SOUTH, ox, ox);
    } else if ((rawDoors()[Directions.SOUTH] != null) && (exits[Directions.SOUTH] != null))
      linkRoom(
          R,
          rawDoors()[Directions.SOUTH],
          Directions.SOUTH,
          exits[Directions.SOUTH],
          exits[Directions.SOUTH]);

    if (x < (xGridSize() - 1)) {
      R2 = getMakeSingleGridRoom(x + 1, y);
      if (R2 != null) linkRoom(R, R2, Directions.EAST, ox, ox);
    } else if ((rawDoors()[Directions.EAST] != null) && (exits[Directions.EAST] != null))
      linkRoom(
          R,
          rawDoors()[Directions.EAST],
          Directions.EAST,
          exits[Directions.EAST],
          exits[Directions.EAST]);

    if (Directions.NORTHEAST < Directions.NUM_DIRECTIONS()) {
      if ((y > 0) && (x > 0)) {
        R2 = getMakeSingleGridRoom(x - 1, y - 1);
        if (R2 != null) linkRoom(R, R2, Directions.NORTHWEST, ox, ox);
      } else if ((rawDoors()[Directions.NORTHWEST] != null)
          && (exits[Directions.NORTHWEST] != null))
        linkRoom(
            R,
            rawDoors()[Directions.NORTHWEST],
            Directions.NORTHWEST,
            exits[Directions.NORTHWEST],
            exits[Directions.NORTHWEST]);

      if ((x > 0) && (y < (yGridSize() - 1))) {
        R2 = getMakeSingleGridRoom(x - 1, y + 1);
        if (R2 != null) linkRoom(R, R2, Directions.SOUTHWEST, ox, ox);
      } else if ((rawDoors()[Directions.SOUTHWEST] != null)
          && (exits[Directions.SOUTHWEST] != null))
        linkRoom(
            R,
            rawDoors()[Directions.SOUTHWEST],
            Directions.SOUTHWEST,
            exits[Directions.SOUTHWEST],
            exits[Directions.SOUTHWEST]);

      if ((x < (xGridSize() - 1)) && (y > 0)) {
        R2 = getMakeSingleGridRoom(x + 1, y - 1);
        if (R2 != null) linkRoom(R, R2, Directions.NORTHEAST, ox, ox);
      } else if ((rawDoors()[Directions.NORTHEAST] != null)
          && (exits[Directions.NORTHEAST] != null))
        linkRoom(
            R,
            rawDoors()[Directions.NORTHEAST],
            Directions.NORTHEAST,
            exits[Directions.NORTHEAST],
            exits[Directions.NORTHEAST]);
      if ((x < (xGridSize() - 1)) && (y < (yGridSize() - 1))) {
        R2 = getMakeSingleGridRoom(x + 1, y + 1);
        if (R2 != null) linkRoom(R, R2, Directions.SOUTHEAST, ox, ox);
      } else if ((rawDoors()[Directions.SOUTHEAST] != null)
          && (exits[Directions.SOUTHEAST] != null))
        linkRoom(
            R,
            rawDoors()[Directions.SOUTHEAST],
            Directions.SOUTHEAST,
            exits[Directions.SOUTHEAST],
            exits[Directions.SOUTHEAST]);
    }

    for (int d = 0; d < gridexits.size(); d++) {
      WorldMap.CrossExit EX = (WorldMap.CrossExit) gridexits.elementAt(d);
      try {
        if ((EX.out) && (EX.x == x) && (EX.y == y))
          switch (EX.dir) {
            case Directions.NORTH:
              if (EX.y == 0) tryFillInExtraneousExternal(EX, ox, R);
              break;
            case Directions.SOUTH:
              if (EX.y == yGridSize() - 1) tryFillInExtraneousExternal(EX, ox, R);
              break;
            case Directions.EAST:
              if (EX.x == xGridSize() - 1) tryFillInExtraneousExternal(EX, ox, R);
              break;
            case Directions.WEST:
              if (EX.x == 0) tryFillInExtraneousExternal(EX, ox, R);
              break;
            case Directions.NORTHEAST:
              if ((EX.y == 0) && (EX.x == xGridSize() - 1)) tryFillInExtraneousExternal(EX, ox, R);
              break;
            case Directions.SOUTHWEST:
              if ((EX.y == yGridSize() - 1) && (EX.x == 0)) tryFillInExtraneousExternal(EX, ox, R);
              break;
            case Directions.NORTHWEST:
              if ((EX.y == 0) && (EX.x == 0)) tryFillInExtraneousExternal(EX, ox, R);
              break;
            case Directions.SOUTHEAST:
              if ((EX.y == yGridSize() - 1) && (EX.x == xGridSize() - 1))
                tryFillInExtraneousExternal(EX, ox, R);
              break;
          }
      } catch (Exception e) {
      }
    }
    R.baseEnvStats()
        .setSensesMask(CMath.unsetb(R.baseEnvStats().sensesMask(), EnvStats.SENSE_ROOMGRIDSYNC));
  }