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