Пример #1
0
  /**
   * This takes a vector of TurnOrdered (Teams or Players), rolls initiative, and resolves ties. The
   * second argument is used when a specific teams initiative should be re-rolled.
   *
   * @param v A vector of items that need to have turns.
   * @param rerollRequests
   * @param bInitCompBonus A flag that determines whether initiative compensation bonus should be
   *     used: used to prevent one side getting long init win streaks
   */
  public static void rollInitAndResolveTies(
      List<? extends ITurnOrdered> v,
      List<? extends ITurnOrdered> rerollRequests,
      boolean bInitCompBonus) {
    for (ITurnOrdered item : v) {
      int bonus = 0;
      if (item instanceof Team) {
        bonus = ((Team) item).getTotalInitBonus(bInitCompBonus);
      }
      if (item instanceof Entity) {
        Entity e = (Entity) item;
        bonus =
            e.game.getTeamForPlayer(e.owner).getTotalInitBonus(false) + e.getCrew().getInitBonus();
      }
      if (rerollRequests == null) { // normal init roll
        item.getInitiative().addRoll(bonus); // add a roll for all
        // teams
      } else {
        // Resolve Tactical Genius (lvl 3) pilot ability
        for (ITurnOrdered rerollItem : rerollRequests) {
          if (item == rerollItem) { // this is the team re-rolling
            item.getInitiative().replaceRoll(bonus);
            break; // each team only needs one reroll
          }
        }
      }
    }

    // check for ties
    Vector<ITurnOrdered> ties = new Vector<ITurnOrdered>();
    for (ITurnOrdered item : v) {
      ties.removeAllElements();
      ties.addElement(item);
      for (ITurnOrdered other : v) {
        if ((item != other) && item.getInitiative().equals(other.getInitiative())) {
          ties.addElement(other);
        }
      }
      if (ties.size() > 1) {
        // We want to ignore init compensation here, because it will
        // get dealt with once we're done resolving ties
        rollInitAndResolveTies(ties, null, false);
      }
    }

    // initiative compensation
    if (bInitCompBonus && (v.size() > 0) && (v.get(0) instanceof Team)) {
      final ITurnOrdered comparisonElement = v.get(0);
      int difference = 0;
      ITurnOrdered winningElement = comparisonElement;

      // figure out who won init this round
      for (ITurnOrdered currentElement : v) {
        if (currentElement.getInitiative().compareTo(comparisonElement.getInitiative())
            > difference) {
          difference = currentElement.getInitiative().compareTo(comparisonElement.getInitiative());
          winningElement = currentElement;
        }
      }

      // set/reset the init comp counters
      ((Team) winningElement).setInitCompensationBonus(0);
      if (lastRoundInitWinner != null) {
        for (ITurnOrdered item : v) {
          if (!(item.equals(winningElement) || item.equals(lastRoundInitWinner))) {
            Team team = (Team) item;
            int newBonus = team.getInitCompensationBonus(bInitCompBonus) + 1;
            team.setInitCompensationBonus(newBonus);
          }
        }
      }
      lastRoundInitWinner = winningElement;
    }
  }