From e58de716b893aceaafaab0ceb85e6594ff9778cb Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Fri, 24 May 2013 20:59:03 +0000 Subject: [PATCH] Stack and Dock shall use LobbyPlayer, since using common Player makes no sense in hotseat mode PlayerStartConditions: fix NPE --- src/main/java/forge/game/MatchController.java | 4 +- .../forge/game/PlayerStartConditions.java | 2 +- .../forge/gui/match/controllers/CDock.java | 44 ++++++++++++++----- .../forge/gui/match/controllers/CStack.java | 6 +-- .../java/forge/gui/match/views/VStack.java | 12 ++--- .../java/forge/gui/toolbox/FDeckChooser.java | 3 +- 6 files changed, 46 insertions(+), 25 deletions(-) diff --git a/src/main/java/forge/game/MatchController.java b/src/main/java/forge/game/MatchController.java index ac1c74bdb4a..1f7aa793e80 100644 --- a/src/main/java/forge/game/MatchController.java +++ b/src/main/java/forge/game/MatchController.java @@ -193,8 +193,8 @@ public class MatchController { // The UI controls should use these game data as models CMatchUI.SINGLETON_INSTANCE.initMatch(game.getRegisteredPlayers(), humanLobbyPlayer); - CDock.SINGLETON_INSTANCE.setModel(game, localHuman); - CStack.SINGLETON_INSTANCE.setModel(game.getStack(), localHuman); + CDock.SINGLETON_INSTANCE.setModel(game, humanLobbyPlayer); + CStack.SINGLETON_INSTANCE.setModel(game.getStack(), humanLobbyPlayer); CLog.SINGLETON_INSTANCE.setModel(game.getGameLog()); CCombat.SINGLETON_INSTANCE.setModel(game); CMessage.SINGLETON_INSTANCE.setModel(match); diff --git a/src/main/java/forge/game/PlayerStartConditions.java b/src/main/java/forge/game/PlayerStartConditions.java index 5e65c447c89..7b77d9cef4a 100644 --- a/src/main/java/forge/game/PlayerStartConditions.java +++ b/src/main/java/forge/game/PlayerStartConditions.java @@ -135,7 +135,7 @@ public class PlayerStartConditions { public static PlayerStartConditions fromDeck(final Deck deck) { PlayerStartConditions start = new PlayerStartConditions(deck); - if( deck.has(DeckSection.Commander)) { + if( deck != null && deck.has(DeckSection.Commander)) { start.setStartingLife(40); start.addCardsInCommand(deck.get(DeckSection.Commander).toFlatList()); } diff --git a/src/main/java/forge/gui/match/controllers/CDock.java b/src/main/java/forge/gui/match/controllers/CDock.java index 211ea513496..ce1e38c5e42 100644 --- a/src/main/java/forge/gui/match/controllers/CDock.java +++ b/src/main/java/forge/gui/match/controllers/CDock.java @@ -37,6 +37,7 @@ import forge.game.GameState; import forge.game.phase.CombatUtil; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; +import forge.game.player.LobbyPlayer; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.SOverlayUtils; @@ -63,22 +64,38 @@ public enum CDock implements ICDoc { private int arcState; private GameState game; - private Player player; + private LobbyPlayer player; - public void setModel(GameState game0, Player player0) { + public void setModel(GameState game0, LobbyPlayer player0) { game = game0; player = player0; } + private Player findAffectedPlayer() { + // try current priority + Player currentPriority = game.getPhaseHandler().getPriorityPlayer(); + if( currentPriority.getLobbyPlayer() == player ) return currentPriority; + + // otherwise find just any player, belonging to this lobbyplayer + for(Player p : game.getPlayers()) + if(p.getLobbyPlayer() == player ) + return p; + + return null; + } /** Concede game, bring up WinLose UI. */ public void concede() { if (FOverlay.SINGLETON_INSTANCE.getPanel().isShowing()) { return; } + + Player p = findAffectedPlayer(); + if( p == null ) return; + // if( c.isMindSlaved() ) return - player.concede(); + p.concede(); game.getAction().checkStateEffects(); } @@ -86,7 +103,10 @@ public enum CDock implements ICDoc { * End turn. */ public void endTurn() { - player.getController().autoPassTo(PhaseType.CLEANUP); + Player p = findAffectedPlayer(); + + if( p != null ) + p.getController().autoPassTo(PhaseType.CLEANUP); } private void revertLayout() { @@ -137,7 +157,8 @@ public enum CDock implements ICDoc { * View deck list. */ private void viewDeckList() { - showDeck(player.getGame().getMatch().getPlayers().get(0).getValue().getCurrentDeck()); + + showDeck(game.getMatch().getPlayers().get(0).getValue().getCurrentDeck()); } /** @@ -179,10 +200,11 @@ public enum CDock implements ICDoc { public void alphaStrike() { final PhaseHandler ph = game.getPhaseHandler(); - if (ph.is(PhaseType.COMBAT_DECLARE_ATTACKERS, player)) { - List defenders = player.getOpponents(); + Player p = findAffectedPlayer(); + if (ph.is(PhaseType.COMBAT_DECLARE_ATTACKERS, p)) { // ph.is(...) includes null check + List defenders = p.getOpponents(); - for (Card c : CardLists.filter(player.getCardsIn(ZoneType.Battlefield), Presets.CREATURES)) { + for (Card c : CardLists.filter(p.getCardsIn(ZoneType.Battlefield), Presets.CREATURES)) { if (c.isAttacking()) continue; @@ -238,8 +260,8 @@ public enum CDock implements ICDoc { deckList.append(s.getValue() + " x " + s.getKey() + nl); } - int rcMsg = -1138; - String ttl = "Human's Decklist"; + + String ttl = "Decklist"; if (dName != null) { ttl += " - " + dName; } @@ -253,7 +275,7 @@ public enum CDock implements ICDoc { msg.append("Copy Decklist to Clipboard?"); - rcMsg = JOptionPane.showConfirmDialog(null, msg, ttl, JOptionPane.OK_CANCEL_OPTION); + int rcMsg = JOptionPane.showConfirmDialog(null, msg, ttl, JOptionPane.OK_CANCEL_OPTION); if (rcMsg == JOptionPane.OK_OPTION) { final StringSelection ss = new StringSelection(deckList.toString()); diff --git a/src/main/java/forge/gui/match/controllers/CStack.java b/src/main/java/forge/gui/match/controllers/CStack.java index a4d7c20ef6f..8976194267b 100644 --- a/src/main/java/forge/gui/match/controllers/CStack.java +++ b/src/main/java/forge/gui/match/controllers/CStack.java @@ -5,7 +5,7 @@ import java.util.Observer; import forge.Command; import forge.FThreads; -import forge.game.player.Player; +import forge.game.player.LobbyPlayer; import forge.game.zone.MagicStack; import forge.gui.framework.EDocID; import forge.gui.framework.ICDoc; @@ -23,7 +23,7 @@ public enum CStack implements ICDoc, Observer { SINGLETON_INSTANCE; private MagicStack model; - private Player viewer; + private LobbyPlayer viewer; /* (non-Javadoc) * @see forge.gui.framework.ICDoc#getCommandOnSelect() @@ -61,7 +61,7 @@ public enum CStack implements ICDoc, Observer { FThreads.invokeInEdtNowOrLater(upd); } - public void setModel(MagicStack model, Player guiPlayer) { + public void setModel(MagicStack model, LobbyPlayer guiPlayer) { this.model = model; this.viewer = guiPlayer; } diff --git a/src/main/java/forge/gui/match/views/VStack.java b/src/main/java/forge/gui/match/views/VStack.java index 43f63523811..7d9b71d766e 100644 --- a/src/main/java/forge/gui/match/views/VStack.java +++ b/src/main/java/forge/gui/match/views/VStack.java @@ -34,7 +34,7 @@ import javax.swing.border.EmptyBorder; import net.miginfocom.swing.MigLayout; import forge.CardUtil; import forge.card.spellability.SpellAbilityStackInstance; -import forge.game.player.Player; +import forge.game.player.LobbyPlayer; import forge.game.player.PlayerController; import forge.game.zone.MagicStack; import forge.gui.framework.DragCell; @@ -117,7 +117,7 @@ public enum VStack implements IVDoc { /** * @param stack * @param viewer */ - public void updateStack(final MagicStack stack, final Player viewer) { + public void updateStack(final MagicStack stack, final LobbyPlayer viewer) { // No need to update this unless it's showing if (!parentCell.getSelected().equals(this)) { return; } @@ -170,13 +170,13 @@ public enum VStack implements IVDoc { } }); - if(spell.getSpellAbility().isOptionalTrigger() && spell.getSpellAbility().getActivatingPlayer() == viewer) { + if(spell.getSpellAbility().isOptionalTrigger() && spell.getSpellAbility().getActivatingPlayer().getLobbyPlayer() == viewer) { tar.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e){ if (e.getButton() == MouseEvent.BUTTON3) { - otMenu.setStackInstance(spell, viewer); + otMenu.setStackInstance(spell); otMenu.show(e.getComponent(), e.getX(), e.getY()); } } @@ -273,9 +273,9 @@ public enum VStack implements IVDoc { add(jmiAsk); } - public void setStackInstance(final SpellAbilityStackInstance SI, Player viewer) + public void setStackInstance(final SpellAbilityStackInstance SI) { - localPlayer = viewer == null ? null : viewer.getController(); + localPlayer = SI.getSpellAbility().getActivatingPlayer().getController(); triggerID = SI.getSpellAbility().getSourceTrigger(); diff --git a/src/main/java/forge/gui/toolbox/FDeckChooser.java b/src/main/java/forge/gui/toolbox/FDeckChooser.java index d997eb0af8e..64ae681a5b9 100644 --- a/src/main/java/forge/gui/toolbox/FDeckChooser.java +++ b/src/main/java/forge/gui/toolbox/FDeckChooser.java @@ -26,7 +26,6 @@ import forge.deck.Deck; import forge.deck.DeckgenUtil; import forge.deck.generate.GenerateThemeDeck; import forge.game.PlayerStartConditions; -import forge.gui.toolbox.FSkin.SkinProp; import forge.quest.QuestController; import forge.quest.QuestEvent; import forge.quest.QuestEventChallenge; @@ -113,7 +112,7 @@ public class FDeckChooser extends JPanel { titleLabel.setSelected(true); //titleLabel.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME)); //titleLabel.setBorder(null); - pnlRadios.add(btnChange, "w 180px!, h 28px!, gap 10px 0 0 5px, ax right"); + pnlRadios.add(btnChange, "w 180px!, h 28px!, gap 10px 0 0 4px, ax right"); } pnlRadios.add(grpRadios, "pushx, growx"); pnlRadios.add(btnRandom, "w 180px!, h 30px!, gap 10px 0 0 0, ax center, ay bottom");