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

View File

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

View File

@@ -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<Player> defenders = player.getOpponents();
Player p = findAffectedPlayer();
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())
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());

View File

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

View File

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

View File

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