Stack and Dock shall use LobbyPlayer, since using common Player makes no sense in hotseat mode

PlayerStartConditions: fix NPE
This commit is contained in:
Maxmtg
2013-05-24 20:59:03 +00:00
parent b76e08777d
commit e58de716b8
6 changed files with 46 additions and 25 deletions

View File

@@ -193,8 +193,8 @@ public class MatchController {
// The UI controls should use these game data as models // The UI controls should use these game data as models
CMatchUI.SINGLETON_INSTANCE.initMatch(game.getRegisteredPlayers(), humanLobbyPlayer); CMatchUI.SINGLETON_INSTANCE.initMatch(game.getRegisteredPlayers(), humanLobbyPlayer);
CDock.SINGLETON_INSTANCE.setModel(game, localHuman); CDock.SINGLETON_INSTANCE.setModel(game, humanLobbyPlayer);
CStack.SINGLETON_INSTANCE.setModel(game.getStack(), localHuman); CStack.SINGLETON_INSTANCE.setModel(game.getStack(), humanLobbyPlayer);
CLog.SINGLETON_INSTANCE.setModel(game.getGameLog()); CLog.SINGLETON_INSTANCE.setModel(game.getGameLog());
CCombat.SINGLETON_INSTANCE.setModel(game); CCombat.SINGLETON_INSTANCE.setModel(game);
CMessage.SINGLETON_INSTANCE.setModel(match); CMessage.SINGLETON_INSTANCE.setModel(match);

View File

@@ -135,7 +135,7 @@ public class PlayerStartConditions {
public static PlayerStartConditions fromDeck(final Deck deck) { public static PlayerStartConditions fromDeck(final Deck deck) {
PlayerStartConditions start = new PlayerStartConditions(deck); PlayerStartConditions start = new PlayerStartConditions(deck);
if( deck.has(DeckSection.Commander)) { if( deck != null && deck.has(DeckSection.Commander)) {
start.setStartingLife(40); start.setStartingLife(40);
start.addCardsInCommand(deck.get(DeckSection.Commander).toFlatList()); start.addCardsInCommand(deck.get(DeckSection.Commander).toFlatList());
} }

View File

@@ -37,6 +37,7 @@ import forge.game.GameState;
import forge.game.phase.CombatUtil; import forge.game.phase.CombatUtil;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.SOverlayUtils; import forge.gui.SOverlayUtils;
@@ -63,14 +64,26 @@ public enum CDock implements ICDoc {
private int arcState; private int arcState;
private GameState game; 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; game = game0;
player = player0; 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. */ /** Concede game, bring up WinLose UI. */
public void concede() { public void concede() {
@@ -78,7 +91,11 @@ public enum CDock implements ICDoc {
return; return;
} }
player.concede(); Player p = findAffectedPlayer();
if( p == null ) return;
// if( c.isMindSlaved() ) return
p.concede();
game.getAction().checkStateEffects(); game.getAction().checkStateEffects();
} }
@@ -86,7 +103,10 @@ public enum CDock implements ICDoc {
* End turn. * End turn.
*/ */
public void endTurn() { public void endTurn() {
player.getController().autoPassTo(PhaseType.CLEANUP); Player p = findAffectedPlayer();
if( p != null )
p.getController().autoPassTo(PhaseType.CLEANUP);
} }
private void revertLayout() { private void revertLayout() {
@@ -137,7 +157,8 @@ public enum CDock implements ICDoc {
* View deck list. * View deck list.
*/ */
private void viewDeckList() { 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() { public void alphaStrike() {
final PhaseHandler ph = game.getPhaseHandler(); final PhaseHandler ph = game.getPhaseHandler();
if (ph.is(PhaseType.COMBAT_DECLARE_ATTACKERS, player)) { Player p = findAffectedPlayer();
List<Player> defenders = player.getOpponents(); if (ph.is(PhaseType.COMBAT_DECLARE_ATTACKERS, p)) { // ph.is(...) includes null check
List<Player> 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()) if (c.isAttacking())
continue; continue;
@@ -238,8 +260,8 @@ public enum CDock implements ICDoc {
deckList.append(s.getValue() + " x " + s.getKey() + nl); deckList.append(s.getValue() + " x " + s.getKey() + nl);
} }
int rcMsg = -1138;
String ttl = "Human's Decklist"; String ttl = "Decklist";
if (dName != null) { if (dName != null) {
ttl += " - " + dName; ttl += " - " + dName;
} }
@@ -253,7 +275,7 @@ public enum CDock implements ICDoc {
msg.append("Copy Decklist to Clipboard?"); 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) { if (rcMsg == JOptionPane.OK_OPTION) {
final StringSelection ss = new StringSelection(deckList.toString()); final StringSelection ss = new StringSelection(deckList.toString());

View File

@@ -5,7 +5,7 @@ import java.util.Observer;
import forge.Command; import forge.Command;
import forge.FThreads; import forge.FThreads;
import forge.game.player.Player; import forge.game.player.LobbyPlayer;
import forge.game.zone.MagicStack; import forge.game.zone.MagicStack;
import forge.gui.framework.EDocID; import forge.gui.framework.EDocID;
import forge.gui.framework.ICDoc; import forge.gui.framework.ICDoc;
@@ -23,7 +23,7 @@ public enum CStack implements ICDoc, Observer {
SINGLETON_INSTANCE; SINGLETON_INSTANCE;
private MagicStack model; private MagicStack model;
private Player viewer; private LobbyPlayer viewer;
/* (non-Javadoc) /* (non-Javadoc)
* @see forge.gui.framework.ICDoc#getCommandOnSelect() * @see forge.gui.framework.ICDoc#getCommandOnSelect()
@@ -61,7 +61,7 @@ public enum CStack implements ICDoc, Observer {
FThreads.invokeInEdtNowOrLater(upd); FThreads.invokeInEdtNowOrLater(upd);
} }
public void setModel(MagicStack model, Player guiPlayer) { public void setModel(MagicStack model, LobbyPlayer guiPlayer) {
this.model = model; this.model = model;
this.viewer = guiPlayer; this.viewer = guiPlayer;
} }

View File

@@ -34,7 +34,7 @@ import javax.swing.border.EmptyBorder;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import forge.CardUtil; import forge.CardUtil;
import forge.card.spellability.SpellAbilityStackInstance; import forge.card.spellability.SpellAbilityStackInstance;
import forge.game.player.Player; import forge.game.player.LobbyPlayer;
import forge.game.player.PlayerController; import forge.game.player.PlayerController;
import forge.game.zone.MagicStack; import forge.game.zone.MagicStack;
import forge.gui.framework.DragCell; import forge.gui.framework.DragCell;
@@ -117,7 +117,7 @@ public enum VStack implements IVDoc<CStack> {
/** /**
* @param stack * @param stack
* @param viewer */ * @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 // No need to update this unless it's showing
if (!parentCell.getSelected().equals(this)) { return; } if (!parentCell.getSelected().equals(this)) { return; }
@@ -170,13 +170,13 @@ public enum VStack implements IVDoc<CStack> {
} }
}); });
if(spell.getSpellAbility().isOptionalTrigger() && spell.getSpellAbility().getActivatingPlayer() == viewer) { if(spell.getSpellAbility().isOptionalTrigger() && spell.getSpellAbility().getActivatingPlayer().getLobbyPlayer() == viewer) {
tar.addMouseListener(new MouseAdapter() { tar.addMouseListener(new MouseAdapter() {
@Override @Override
public void mouseClicked(MouseEvent e){ public void mouseClicked(MouseEvent e){
if (e.getButton() == MouseEvent.BUTTON3) if (e.getButton() == MouseEvent.BUTTON3)
{ {
otMenu.setStackInstance(spell, viewer); otMenu.setStackInstance(spell);
otMenu.show(e.getComponent(), e.getX(), e.getY()); otMenu.show(e.getComponent(), e.getX(), e.getY());
} }
} }
@@ -273,9 +273,9 @@ public enum VStack implements IVDoc<CStack> {
add(jmiAsk); 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(); triggerID = SI.getSpellAbility().getSourceTrigger();

View File

@@ -26,7 +26,6 @@ import forge.deck.Deck;
import forge.deck.DeckgenUtil; import forge.deck.DeckgenUtil;
import forge.deck.generate.GenerateThemeDeck; import forge.deck.generate.GenerateThemeDeck;
import forge.game.PlayerStartConditions; import forge.game.PlayerStartConditions;
import forge.gui.toolbox.FSkin.SkinProp;
import forge.quest.QuestController; import forge.quest.QuestController;
import forge.quest.QuestEvent; import forge.quest.QuestEvent;
import forge.quest.QuestEventChallenge; import forge.quest.QuestEventChallenge;
@@ -113,7 +112,7 @@ public class FDeckChooser extends JPanel {
titleLabel.setSelected(true); titleLabel.setSelected(true);
//titleLabel.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME)); //titleLabel.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME));
//titleLabel.setBorder(null); //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(grpRadios, "pushx, growx");
pnlRadios.add(btnRandom, "w 180px!, h 30px!, gap 10px 0 0 0, ax center, ay bottom"); pnlRadios.add(btnRandom, "w 180px!, h 30px!, gap 10px 0 0 0, ax center, ay bottom");