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/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

View File

@@ -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();

View File

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

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.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;
/**
* <p>
@@ -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()
*/

View File

@@ -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<Player> {
* a GamePlayerRating object
* @return an int
*/
public int doMulligan() {
public void doMulligan() {
final List<Card> hand = new ArrayList<Card>(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;
}
/**

View File

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

View File

@@ -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;
@@ -436,4 +441,15 @@ 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();
}
}
}
}