diff --git a/.gitattributes b/.gitattributes index 1c1b0a532b1..22f0ba289df 100644 --- a/.gitattributes +++ b/.gitattributes @@ -14205,6 +14205,7 @@ src/main/java/forge/game/event/FlipCoinEvent.java -text src/main/java/forge/game/event/LandPlayedEvent.java -text src/main/java/forge/game/event/LifeLossEvent.java -text src/main/java/forge/game/event/ManaBurnEvent.java -text +src/main/java/forge/game/event/MulliganEvent.java -text src/main/java/forge/game/event/PoisonCounterEvent.java -text src/main/java/forge/game/event/SetTappedEvent.java -text src/main/java/forge/game/event/ShuffleEvent.java -text diff --git a/src/main/java/forge/control/input/InputMulligan.java b/src/main/java/forge/control/input/InputMulligan.java index c1d10ecb0aa..1874503549f 100644 --- a/src/main/java/forge/control/input/InputMulligan.java +++ b/src/main/java/forge/control/input/InputMulligan.java @@ -84,9 +84,9 @@ public class InputMulligan extends Input { @Override public final void selectButtonCancel() { final Player humanPlayer = Singletons.getControl().getPlayer(); - final int newHand = humanPlayer.doMulligan(); + humanPlayer.doMulligan(); - if (newHand == 0) { + if (humanPlayer.getCardsIn(ZoneType.Hand).isEmpty()) { this.end(); } else { ButtonUtil.enableAllFocusOk(); diff --git a/src/main/java/forge/game/GameState.java b/src/main/java/forge/game/GameState.java index 1cf4df89fff..c21dafd7941 100644 --- a/src/main/java/forge/game/GameState.java +++ b/src/main/java/forge/game/GameState.java @@ -118,8 +118,12 @@ public class GameState { endOfTurn = new EndOfTurn(this); endOfCombat = new EndOfCombat(this); + if ( match0.getGameType() == GameType.Quest) + events.register(Singletons.getModel().getQuest()); // this one listens to player's mulligans ATM + events.register(Singletons.getControl().getSoundSystem()); events.register(gameLog); + } /** diff --git a/src/main/java/forge/game/event/MulliganEvent.java b/src/main/java/forge/game/event/MulliganEvent.java new file mode 100644 index 00000000000..2baa7348645 --- /dev/null +++ b/src/main/java/forge/game/event/MulliganEvent.java @@ -0,0 +1,15 @@ +package forge.game.event; + +import forge.game.player.Player; + +/** + * TODO: Write javadoc for this type. + * + */ +public class MulliganEvent extends Event { + + public final Player player; + public MulliganEvent(Player p) { + player = p; + } +} diff --git a/src/main/java/forge/game/player/HumanPlayer.java b/src/main/java/forge/game/player/HumanPlayer.java index dba11169373..49633907fd5 100644 --- a/src/main/java/forge/game/player/HumanPlayer.java +++ b/src/main/java/forge/game/player/HumanPlayer.java @@ -24,13 +24,10 @@ import forge.Card; import forge.Singletons; import forge.card.spellability.SpellAbility; import forge.control.input.Input; -import forge.game.GameType; import forge.game.GameState; import forge.game.zone.ZoneType; import forge.gui.GuiChoose; import forge.gui.GuiDialog; -import forge.quest.QuestController; -import forge.quest.bazaar.QuestItemType; /** *

@@ -131,19 +128,6 @@ public class HumanPlayer extends Player { return PlayerType.HUMAN; } - @Override - public final int doMulligan() { - int newHand = super.doMulligan(); - final QuestController quest = Singletons.getModel().getQuest(); - final boolean isQuest = Singletons.getModel().getMatch().getGameType().equals(GameType.Quest); - if (isQuest && quest.getAssets().hasItem(QuestItemType.SLEIGHT) && (getStats().getMulliganCount() == 1)) { - drawCard(); - newHand++; - getStats().notifyOpeningHandSize(newHand); - } - return newHand; - } - /* (non-Javadoc) * @see forge.game.player.Player#getController() */ diff --git a/src/main/java/forge/game/player/Player.java b/src/main/java/forge/game/player/Player.java index dd0698f0376..7705c11f586 100644 --- a/src/main/java/forge/game/player/Player.java +++ b/src/main/java/forge/game/player/Player.java @@ -61,6 +61,7 @@ import forge.game.event.CardDiscardedEvent; import forge.game.event.DrawCardEvent; import forge.game.event.LandPlayedEvent; import forge.game.event.LifeLossEvent; +import forge.game.event.MulliganEvent; import forge.game.event.PoisonCounterEvent; import forge.game.event.ShuffleEvent; import forge.game.phase.PhaseHandler; @@ -1322,20 +1323,21 @@ public abstract class Player extends GameEntity implements Comparable { * a GamePlayerRating object * @return an int */ - public int doMulligan() { + public void doMulligan() { final List hand = new ArrayList(getCardsIn(ZoneType.Hand)); for (final Card c : hand) { game.getAction().moveToLibrary(c); } shuffle(); - final int newHand = hand.size() - 1; - for (int i = 0; i < newHand; i++) { + for (int i = 1; i < hand.size(); i++) { // draws one card less drawCard(); } + + game.getEvents().post(new MulliganEvent(this)); // quest listener may interfere here + final int newHand = getCardsIn(ZoneType.Hand).size(); game.getGameLog().add("Mulligan", this + " has mulliganed down to " + newHand + " cards.", 0); stats.notifyHasMulliganed(); stats.notifyOpeningHandSize(newHand); - return newHand; } /** diff --git a/src/main/java/forge/game/player/PlayerControllerHuman.java b/src/main/java/forge/game/player/PlayerControllerHuman.java index 359b10ad8d4..27ad4cc512d 100644 --- a/src/main/java/forge/game/player/PlayerControllerHuman.java +++ b/src/main/java/forge/game/player/PlayerControllerHuman.java @@ -1,7 +1,6 @@ package forge.game.player; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/src/main/java/forge/quest/QuestController.java b/src/main/java/forge/quest/QuestController.java index eba2527010d..67a07172f62 100644 --- a/src/main/java/forge/quest/QuestController.java +++ b/src/main/java/forge/quest/QuestController.java @@ -21,16 +21,21 @@ import java.io.File; import com.google.common.base.Predicate; import com.google.common.base.Predicates; +import com.google.common.eventbus.Subscribe; import forge.Singletons; import forge.deck.Deck; import forge.quest.data.GameFormatQuest; import forge.game.GameFormat; +import forge.game.event.Event; +import forge.game.event.MulliganEvent; +import forge.game.player.PlayerType; import forge.item.CardPrinted; import forge.item.PreconDeck; import forge.properties.ForgeProps; import forge.properties.NewConstants; import forge.quest.bazaar.QuestBazaarManager; +import forge.quest.bazaar.QuestItemType; import forge.quest.bazaar.QuestPetStorage; import forge.quest.data.QuestAchievements; import forge.quest.data.QuestAssets; @@ -435,5 +440,16 @@ public class QuestController { return unlocksAvaliable > unlocksSpent ? Math.min(unlocksAvaliable - unlocksSpent, cntLocked) : 0; } + + @Subscribe + public void receiveGameEvent(Event ev) { // Receives events only during quest games + if ( ev instanceof MulliganEvent ) { + MulliganEvent mev = (MulliganEvent)ev; + // First mulligan is free + if (mev.player.getType() == PlayerType.HUMAN && getAssets().hasItem(QuestItemType.SLEIGHT) && mev.player.getStats().getMulliganCount() == 0) { + mev.player.drawCard(); + } + } + } }