mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-15 18:28:00 +00:00
Stack and Dock shall use LobbyPlayer, since using common Player makes no sense in hotseat mode
PlayerStartConditions: fix NPE
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user