diff --git a/src/main/java/forge/game/GameAction.java b/src/main/java/forge/game/GameAction.java index e7a9883ac40..5abfb903d03 100644 --- a/src/main/java/forge/game/GameAction.java +++ b/src/main/java/forge/game/GameAction.java @@ -1479,6 +1479,9 @@ public class GameAction { game.setAge(GameAge.Play); // THIS CODE WILL WORK WITH PHASE = NULL { + if(game.getType() == GameType.Planechase) + firstPlayer.initPlane(); + handleLeylinesAndChancellors(); // Run Trigger beginning of the game final HashMap runParams = new HashMap(); @@ -1496,39 +1499,55 @@ public class GameAction { for( int i = 0; i < offset; i++ ) { whoCanMulligan.add(whoCanMulligan.remove(0)); } + + boolean[] hasKept = new boolean[whoCanMulligan.size()]; + int[] handSize = new int[whoCanMulligan.size()]; + for( int i = 0; i < whoCanMulligan.size(); i++) { + hasKept[i] = false; + handSize[i] = whoCanMulligan.get(i).getZone(ZoneType.Hand).size(); + } + MapOfLists exiledDuringMulligans = new HashMapOfLists(CollectionSuppliers.arrayLists()); + // rule 103.4b + boolean isMultiPlayer = game.getPlayers().size() > 2; + int mulliganDelta = isMultiPlayer ? 0 : 1; + + boolean allKept; do { + allKept = true; for (int i = 0; i < whoCanMulligan.size(); i++) { + if( hasKept[i]) continue; + Player p = whoCanMulligan.get(i); List toMulligan = p.canMulligan() ? p.getController().getCardsToMulligan(isCommander, firstPlayer) : null; - if ( toMulligan != null ) { + if ( toMulligan != null && !toMulligan.isEmpty()) { if( !isCommander ) { toMulligan = new ArrayList(p.getCardsIn(ZoneType.Hand)); for (final Card c : toMulligan) { moveToLibrary(c); } p.shuffle(); - p.drawCards(toMulligan.size() - 1); - - } else if ( !toMulligan.isEmpty() ){ + p.drawCards(handSize[i] - mulliganDelta); + } else { List toExile = Lists.newArrayList(toMulligan); for(Card c : toExile) { exile(c); } exiledDuringMulligans.addAll(p, toExile); p.drawCards(toExile.size() - 1); - } else - continue; - + } + p.onMulliganned(); + allKept = false; } else { game.getGameLog().add(GameEventType.MULLIGAN, p.getName() + " has kept a hand of " + p.getZone(ZoneType.Hand).size() + " cards"); - whoCanMulligan.remove(i--); + hasKept[i] = true; } } - } while( !whoCanMulligan.isEmpty() ); + mulliganDelta++; + } while( !allKept ); if( isCommander ) for(Entry> kv : exiledDuringMulligans.entrySet() ) { diff --git a/src/main/java/forge/game/MatchController.java b/src/main/java/forge/game/MatchController.java index 50bd5e7e5f1..61782add51f 100644 --- a/src/main/java/forge/game/MatchController.java +++ b/src/main/java/forge/game/MatchController.java @@ -132,9 +132,6 @@ public class MatchController { currentGame.getInputQueue().invokeGameAction(new Runnable() { @Override public void run() { - if(currentGame.getType() == GameType.Planechase) - firstPlayer.initPlane(); - currentGame.getAction().mulligan(firstPlayer); } }); diff --git a/src/main/java/forge/game/player/PlayerControllerHuman.java b/src/main/java/forge/game/player/PlayerControllerHuman.java index 2a243adbc3e..50ff8918a89 100644 --- a/src/main/java/forge/game/player/PlayerControllerHuman.java +++ b/src/main/java/forge/game/player/PlayerControllerHuman.java @@ -488,6 +488,6 @@ public class PlayerControllerHuman extends PlayerController { public List getCardsToMulligan(boolean isCommander, Player firstPlayer) { final InputConfirmMulligan inp = new InputConfirmMulligan(player, firstPlayer, isCommander); player.getGame().getInputQueue().setInputAndWait(inp); - return inp.isKeepHand() ? null : inp.getSelectedCards(); + return inp.isKeepHand() ? null : isCommander ? inp.getSelectedCards() : player.getCardsIn(ZoneType.Hand); } }