コード例 #1
0
ファイル: BioSet.java プロジェクト: kidaa/pcgen
  private void generateHeightWeight(final PlayerCharacter pc) {
    int baseHeight = 0;
    int baseWeight = 0;
    int htAdd = 0;
    int wtAdd = 0;
    String totalWeight = null;
    final String htwt =
        getTokenNumberInMaps(
            "SEX", 0, pc.getDisplay().getRegionString(), pc.getRace().getKeyName().trim());

    if (htwt == null) {
      return;
    }

    final StringTokenizer genderTok = new StringTokenizer(htwt, "[]", false);

    while (genderTok.hasMoreTokens()) {
      if (genderTok.nextToken().equals(pc.getDisplay().getGenderObject().toString())) {
        final String htWtLine = genderTok.nextToken();
        final StringTokenizer htwtTok = new StringTokenizer(htWtLine, "|", false);

        while (htwtTok.hasMoreTokens()) {
          final String tag = htwtTok.nextToken();

          if (tag.startsWith("BASEHT:")) {
            baseHeight = Integer.parseInt(tag.substring(7));
          } else if (tag.startsWith("BASEWT:")) {
            baseWeight = Integer.parseInt(tag.substring(7));
          } else if (tag.startsWith("HTDIEROLL:")) {
            htAdd = RollingMethods.roll(tag.substring(10));
          } else if (tag.startsWith("WTDIEROLL:")) {
            wtAdd = RollingMethods.roll(tag.substring(10));
          } else if (tag.startsWith("TOTALWT:")) {
            totalWeight = tag.substring(8);
          }
        }

        if ((baseHeight != 0) && (htAdd != 0)) {
          pc.setHeight(baseHeight + htAdd);
        }

        if ((totalWeight != null) && (baseWeight != 0) && (wtAdd != 0)) {
          totalWeight = replaceString(totalWeight, "HTDIEROLL", htAdd);
          totalWeight = replaceString(totalWeight, "BASEWT", baseWeight);
          totalWeight = replaceString(totalWeight, "WTDIEROLL", wtAdd);
          pc.setWeight(pc.getVariableValue(totalWeight, "").intValue());
        }

        break;
      }
      genderTok.nextToken(); // burn next token
    }
  }
コード例 #2
0
ファイル: BioSet.java プロジェクト: kidaa/pcgen
  private String generateBioValue(final String addKey, final PlayerCharacter pc) {
    final String line =
        getTokenNumberInMaps(
            addKey, 0, pc.getDisplay().getRegionString(), pc.getRace().getKeyName().trim());
    final String rv;

    if (line != null && line.length() > 0) {
      final StringTokenizer aTok = new StringTokenizer(line, "|");
      final List<String> aList = new ArrayList<String>();

      while (aTok.hasMoreTokens()) {
        aList.add(aTok.nextToken());
      }

      final int roll = RollingMethods.roll(1, aList.size()) - 1; // needs to be 0-offset
      rv = aList.get(roll);
    } else {
      rv = "";
    }

    return rv;
  }
コード例 #3
0
ファイル: BioSet.java プロジェクト: kidaa/pcgen
  /**
   * Randomizes the values of the passed in attributes.
   *
   * @param randomizeStr .-delimited list of attributes to randomize. (AGE.HT.WT.EYES.HAIR.SKIN are
   *     the possible values.)
   * @param pc The Player Character
   */
  public void randomize(final String randomizeStr, final PlayerCharacter pc) {
    if ((pc == null) || (pc.getRace() == null)) {
      return;
    }

    final List<String> ranList = new ArrayList<String>();
    final StringTokenizer lineTok = new StringTokenizer(randomizeStr, ".", false);

    while (lineTok.hasMoreTokens()) {
      final String aString = lineTok.nextToken();

      if (aString.startsWith("AGECAT")) {
        generateAge(Integer.parseInt(aString.substring(6)), false, pc);
      } else {
        ranList.add(aString);
      }
    }

    if (ranList.contains("AGE")) {
      generateAge(0, true, pc);
    }

    if (ranList.contains("HT") || ranList.contains("WT")) {
      generateHeightWeight(pc);
    }

    if (ranList.contains("EYES")) {
      pc.setEyeColor(generateBioValue("EYES", pc));
    }

    if (ranList.contains("HAIR")) {
      pc.setHairColor(generateBioValue("HAIR", pc));
    }

    if (ranList.contains("SKIN")) {
      pc.setSkinColor(generateBioValue("SKINTONE", pc));
    }
  }
コード例 #4
0
ファイル: PCClass.java プロジェクト: grimreaper/pcgen
  /*
   * REFACTOR Clearly this is part of the PCClass factory method that produces
   * PCClassLevels combined with some other work that will need to be done to
   * extract some of the complicated gunk out of here that goes out and puts
   * information into PCLevelInfo and PlayerCharacter.
   */
  public boolean addLevel(
      final boolean argLevelMax,
      final boolean bSilent,
      final PlayerCharacter aPC,
      final boolean ignorePrereqs) {

    // Check to see if we can add a level of this class to the
    // current character
    final int newLevel = aPC.getLevel(this) + 1;
    boolean levelMax = argLevelMax;

    aPC.setAllowInteraction(false);
    aPC.setLevelWithoutConsequence(this, newLevel);
    if (!ignorePrereqs) {
      // When loading a character, classes are added before feats, so
      // this test would always fail on loading if feats are required
      boolean doReturn = false;
      if (!qualifies(aPC, this)) {
        doReturn = true;
        if (!bSilent) {
          ShowMessageDelegate.showMessageDialog(
              "This character does not qualify for level " + newLevel,
              Constants.APPLICATION_NAME,
              MessageType.ERROR);
        }
      }
      aPC.setLevelWithoutConsequence(this, newLevel - 1);
      if (doReturn) {
        return false;
      }
    }
    aPC.setAllowInteraction(true);

    if (isMonster()) {
      levelMax = false;
    }

    if (hasMaxLevel() && (newLevel > getSafe(IntegerKey.LEVEL_LIMIT)) && levelMax) {
      if (!bSilent) {
        ShowMessageDelegate.showMessageDialog(
            "This class cannot be raised above level "
                + Integer.toString(getSafe(IntegerKey.LEVEL_LIMIT)),
            Constants.APPLICATION_NAME,
            MessageType.ERROR);
      }

      return false;
    }

    // Add the level to the current character
    int total = aPC.getTotalLevels();

    // No longer need this since the race now sets a bonus itself and Templates
    // are not able to reassign their feats.  There was nothing else returned in
    // this number
    //		if (total == 0) {
    //			aPC.setFeats(aPC.getInitialFeats());
    //		}
    setLevel(newLevel, aPC);

    // the level has now been added to the character,
    // so now assign the attributes of this class level to the
    // character...
    PCClassLevel classLevel = aPC.getActiveClassLevel(this, newLevel);

    // Make sure that if this Class adds a new domain that
    // we record where that domain came from
    final int dnum = aPC.getMaxCharacterDomains(this, aPC) - aPC.getDomainCount();

    if (dnum > 0 && !aPC.hasDefaultDomainSource()) {
      aPC.setDefaultDomainSource(new ClassSource(this, newLevel));
    }

    // Don't roll the hit points if the gui is not being used.
    // This is so GMGen can add classes to a person without pcgen flipping
    // out
    if (Globals.getUseGUI()) {
      final int levels =
          SettingsHandler.isHPMaxAtFirstClassLevel()
              ? aPC.totalNonMonsterLevels()
              : aPC.getTotalLevels();
      final boolean isFirst = levels == 1;

      aPC.rollHP(this, aPC.getLevel(this), isFirst);
    }

    if (!aPC.isImporting()) {
      DomainApplication.addDomainsUpToLevel(this, newLevel, aPC);
    }

    int levelUpStats = 0;

    // Add any bonus feats or stats that will be gained from this level
    // i.e. a bonus feat every 3 levels
    if (aPC.getTotalLevels() > total) {
      boolean processBonusStats = true;
      total = aPC.getTotalLevels();

      if (isMonster()) {
        // If we have less levels that the races monster levels
        // then we can not give a stat bonus (i.e. an Ogre has
        // 4 levels of Giant, so it does not get a stat increase at
        // 4th level because that is already taken into account in
        // its racial stat modifiers, but it will get one at 8th
        LevelCommandFactory lcf = aPC.getRace().get(ObjectKey.MONSTER_CLASS);
        int monLevels = 0;
        if (lcf != null) {
          monLevels = lcf.getLevelCount().resolve(aPC, "").intValue();
        }

        if (total <= monLevels) {
          processBonusStats = false;
        }
      }

      if (!aPC.isImporting()) {
        // We do not want to do these
        // calculations a second time when are
        // importing a character. The feat
        // number and the stat point pool are
        // already saved in the import file.

        // if (processBonusFeats) {
        //	final double bonusFeats = aPC.getBonusFeatsForNewLevel(this);
        //	if (bonusFeats > 0) {
        //		aPC.adjustFeats(bonusFeats);
        //	}
        // }

        if (processBonusStats) {
          final int bonusStats = Globals.getBonusStatsForLevel(total, aPC);
          if (bonusStats > 0) {
            aPC.setPoolAmount(aPC.getPoolAmount() + bonusStats);

            if (!bSilent && SettingsHandler.getShowStatDialogAtLevelUp()) {
              levelUpStats = StatApplication.askForStatIncrease(aPC, bonusStats, true);
            }
          }
        }
      }
    }

    int spMod = getSkillPointsForLevel(aPC, classLevel, total);

    PCLevelInfo pcl;

    if (aPC.getLevelInfoSize() > 0) {
      pcl = aPC.getLevelInfo(aPC.getLevelInfoSize() - 1);

      if (pcl != null) {
        pcl.setClassLevel(aPC.getLevel(this));
        pcl.setSkillPointsGained(aPC, spMod);
        pcl.setSkillPointsRemaining(pcl.getSkillPointsGained(aPC));
      }
    }

    Integer currentPool = aPC.getSkillPool(this);
    int newSkillPool = spMod + (currentPool == null ? 0 : currentPool);
    aPC.setSkillPool(this, newSkillPool);

    if (!aPC.isImporting()) {
      //
      // Ask for stat increase after skill points have been calculated
      //
      if (levelUpStats > 0) {
        StatApplication.askForStatIncrease(aPC, levelUpStats, false);
      }

      if (newLevel == 1) {
        AddObjectActions.doBaseChecks(this, aPC);
        CDOMObjectUtilities.addAdds(this, aPC);
        CDOMObjectUtilities.checkRemovals(this, aPC);
      }

      for (TransitionChoice<Kit> kit : classLevel.getSafeListFor(ListKey.KIT_CHOICE)) {
        kit.act(kit.driveChoice(aPC), classLevel, aPC);
      }
      TransitionChoice<Region> region = classLevel.get(ObjectKey.REGION_CHOICE);
      if (region != null) {
        region.act(region.driveChoice(aPC), classLevel, aPC);
      }
    }

    // this is a monster class, so don't worry about experience
    if (isMonster()) {
      return true;
    }

    if (!aPC.isImporting()) {
      CDOMObjectUtilities.checkRemovals(this, aPC);
      final int minxp = aPC.minXPForECL();
      if (aPC.getXP() < minxp) {
        aPC.setXP(minxp);
      } else if (aPC.getXP() >= aPC.minXPForNextECL()) {
        if (!bSilent) {
          ShowMessageDelegate.showMessageDialog(
              SettingsHandler.getGame().getLevelUpMessage(),
              Constants.APPLICATION_NAME,
              MessageType.INFORMATION);
        }
      }
    }

    //
    // Allow exchange of classes only when assign 1st level
    //
    if (containsKey(ObjectKey.EXCHANGE_LEVEL) && (aPC.getLevel(this) == 1) && !aPC.isImporting()) {
      ExchangeLevelApplication.exchangeLevels(aPC, this);
    }
    return true;
  }
コード例 #5
0
ファイル: BioSet.java プロジェクト: kidaa/pcgen
  private void generateAge(
      final int ageCategory, final boolean useClassOnly, final PlayerCharacter pc) {
    // Can't find a base age for the category,
    // then there's nothing to do
    final String age =
        getTokenNumberInMaps(
            "BASEAGE",
            ageCategory,
            pc.getDisplay().getRegionString(),
            pc.getRace().getKeyName().trim());

    if (age == null) {
      return;
    }

    // First check for class age modification information
    final int baseAge = Integer.parseInt(age);
    int ageAdd = -1;

    String aClass =
        getTokenNumberInMaps(
            "CLASS",
            ageCategory,
            pc.getDisplay().getRegionString(),
            pc.getRace().getKeyName().trim());

    if (aClass != null && !aClass.equals("0")) {
      // aClass looks like:
      // Barbarian,Rogue,Sorcerer[BASEAGEADD:3d6]|Bard,Fighter,Paladin,Ranger[BASEAGEADD:1d6]
      // So first, get the BASEAGEADD
      final StringTokenizer aTok = new StringTokenizer(aClass, "|");

      while (aTok.hasMoreTokens()) {
        // String looks like:
        // Barbarian,Rogue,Sorcerer[BASEAGEADD:3d6]
        String aString = aTok.nextToken();

        final int start = aString.indexOf("[");
        final int end = aString.indexOf("]");

        // should be BASEAGEADD:xdy
        String dieString = aString.substring(start + 1, end);

        if (dieString.startsWith("BASEAGEADD:")) {
          dieString = dieString.substring(11);
        }

        // Remove the dieString
        aString = aString.substring(0, start);

        final StringTokenizer bTok = new StringTokenizer(aString, ",");

        while (bTok.hasMoreTokens() && (ageAdd < 0)) {
          final String tClass = bTok.nextToken();

          if (pc.getClassKeyed(tClass) != null) {
            ageAdd = RollingMethods.roll(dieString);
          }
        }
      }
    }

    // If there was no class age modification,
    // then generate a number based on the .LST
    if ((ageAdd < 0) && !useClassOnly) {
      aClass =
          getTokenNumberInMaps(
              "AGEDIEROLL",
              ageCategory,
              pc.getDisplay().getRegionString(),
              pc.getRace().getKeyName().trim());

      if (aClass != null) {
        ageAdd = RollingMethods.roll(aClass);
      }
    }

    if ((ageAdd >= 0) && (baseAge > 0)) {
      final String maxage =
          getTokenNumberInMaps(
              "MAXAGE",
              ageCategory,
              pc.getDisplay().getRegionString(),
              pc.getRace().getKeyName().trim());
      if (maxage != null) {
        final int maxAge = Integer.parseInt(maxage);
        if (baseAge + ageAdd > maxAge) {
          ageAdd = maxAge - baseAge;
        }
      }
      pc.setAge(baseAge + ageAdd);
    }
  }