Quest mulligan code moved out of HumanPlayer

QuestController is listening for some events and reacts to human's first mulligan
This commit is contained in:
Maxmtg
2013-03-16 11:19:24 +00:00
parent 9c4c2328ec
commit b19e5c82d8
8 changed files with 44 additions and 23 deletions

1
.gitattributes vendored
View File

@@ -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/LandPlayedEvent.java -text
src/main/java/forge/game/event/LifeLossEvent.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/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/PoisonCounterEvent.java -text
src/main/java/forge/game/event/SetTappedEvent.java -text src/main/java/forge/game/event/SetTappedEvent.java -text
src/main/java/forge/game/event/ShuffleEvent.java -text src/main/java/forge/game/event/ShuffleEvent.java -text

View File

@@ -84,9 +84,9 @@ public class InputMulligan extends Input {
@Override @Override
public final void selectButtonCancel() { public final void selectButtonCancel() {
final Player humanPlayer = Singletons.getControl().getPlayer(); final Player humanPlayer = Singletons.getControl().getPlayer();
final int newHand = humanPlayer.doMulligan(); humanPlayer.doMulligan();
if (newHand == 0) { if (humanPlayer.getCardsIn(ZoneType.Hand).isEmpty()) {
this.end(); this.end();
} else { } else {
ButtonUtil.enableAllFocusOk(); ButtonUtil.enableAllFocusOk();

View File

@@ -118,8 +118,12 @@ public class GameState {
endOfTurn = new EndOfTurn(this); endOfTurn = new EndOfTurn(this);
endOfCombat = new EndOfCombat(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(Singletons.getControl().getSoundSystem());
events.register(gameLog); events.register(gameLog);
} }
/** /**

View File

@@ -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;
}
}

View File

@@ -24,13 +24,10 @@ import forge.Card;
import forge.Singletons; import forge.Singletons;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.control.input.Input; import forge.control.input.Input;
import forge.game.GameType;
import forge.game.GameState; import forge.game.GameState;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.GuiChoose; import forge.gui.GuiChoose;
import forge.gui.GuiDialog; import forge.gui.GuiDialog;
import forge.quest.QuestController;
import forge.quest.bazaar.QuestItemType;
/** /**
* <p> * <p>
@@ -131,19 +128,6 @@ public class HumanPlayer extends Player {
return PlayerType.HUMAN; 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) /* (non-Javadoc)
* @see forge.game.player.Player#getController() * @see forge.game.player.Player#getController()
*/ */

View File

@@ -61,6 +61,7 @@ import forge.game.event.CardDiscardedEvent;
import forge.game.event.DrawCardEvent; import forge.game.event.DrawCardEvent;
import forge.game.event.LandPlayedEvent; import forge.game.event.LandPlayedEvent;
import forge.game.event.LifeLossEvent; import forge.game.event.LifeLossEvent;
import forge.game.event.MulliganEvent;
import forge.game.event.PoisonCounterEvent; import forge.game.event.PoisonCounterEvent;
import forge.game.event.ShuffleEvent; import forge.game.event.ShuffleEvent;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
@@ -1322,20 +1323,21 @@ public abstract class Player extends GameEntity implements Comparable<Player> {
* a GamePlayerRating object * a GamePlayerRating object
* @return an int * @return an int
*/ */
public int doMulligan() { public void doMulligan() {
final List<Card> hand = new ArrayList<Card>(getCardsIn(ZoneType.Hand)); final List<Card> hand = new ArrayList<Card>(getCardsIn(ZoneType.Hand));
for (final Card c : hand) { for (final Card c : hand) {
game.getAction().moveToLibrary(c); game.getAction().moveToLibrary(c);
} }
shuffle(); shuffle();
final int newHand = hand.size() - 1; for (int i = 1; i < hand.size(); i++) { // draws one card less
for (int i = 0; i < newHand; i++) {
drawCard(); 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); game.getGameLog().add("Mulligan", this + " has mulliganed down to " + newHand + " cards.", 0);
stats.notifyHasMulliganed(); stats.notifyHasMulliganed();
stats.notifyOpeningHandSize(newHand); stats.notifyOpeningHandSize(newHand);
return newHand;
} }
/** /**

View File

@@ -1,7 +1,6 @@
package forge.game.player; package forge.game.player;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;

View File

@@ -21,16 +21,21 @@ import java.io.File;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.base.Predicates; import com.google.common.base.Predicates;
import com.google.common.eventbus.Subscribe;
import forge.Singletons; import forge.Singletons;
import forge.deck.Deck; import forge.deck.Deck;
import forge.quest.data.GameFormatQuest; import forge.quest.data.GameFormatQuest;
import forge.game.GameFormat; 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.CardPrinted;
import forge.item.PreconDeck; import forge.item.PreconDeck;
import forge.properties.ForgeProps; import forge.properties.ForgeProps;
import forge.properties.NewConstants; import forge.properties.NewConstants;
import forge.quest.bazaar.QuestBazaarManager; import forge.quest.bazaar.QuestBazaarManager;
import forge.quest.bazaar.QuestItemType;
import forge.quest.bazaar.QuestPetStorage; import forge.quest.bazaar.QuestPetStorage;
import forge.quest.data.QuestAchievements; import forge.quest.data.QuestAchievements;
import forge.quest.data.QuestAssets; import forge.quest.data.QuestAssets;
@@ -436,4 +441,15 @@ public class QuestController {
return unlocksAvaliable > unlocksSpent ? Math.min(unlocksAvaliable - unlocksSpent, cntLocked) : 0; 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();
}
}
}
} }