Support changing player count

This commit is contained in:
drdev
2014-04-11 02:58:22 +00:00
parent b6aede3549
commit 7b0ca709ac
2 changed files with 79 additions and 70 deletions

View File

@@ -9,27 +9,29 @@ import forge.deck.DeckFormat;
public enum GameType { public enum GameType {
// deck composition rules, isPoolRestricted, can sideboard between matches // deck composition rules, isPoolRestricted, can sideboard between matches
Sealed ( DeckFormat.Limited, true, true, true ), Sealed (DeckFormat.Limited, true, true, true, "Sealed"),
Draft ( DeckFormat.Limited, true, true, true ), Draft (DeckFormat.Limited, true, true, true, "Draft"),
Gauntlet ( DeckFormat.Limited, true, true, true ), Gauntlet (DeckFormat.Limited, true, true, true, "Gauntlet"),
Quest ( DeckFormat.QuestDeck, true, true, false ), Quest (DeckFormat.QuestDeck, true, true, false, "Quest"),
Constructed ( DeckFormat.Constructed, false, true, true ), Constructed (DeckFormat.Constructed, false, true, true, "Constructed"),
Archenemy ( DeckFormat.Archenemy, false, false, true ), Archenemy (DeckFormat.Archenemy, false, false, true, "Archenemy"),
ArchenemyRumble ( DeckFormat.Archenemy, false, false, true ), ArchenemyRumble (DeckFormat.Archenemy, false, false, true, "Archenemy Rumble"),
Planechase ( DeckFormat.Planechase, false, false, true ), Planechase (DeckFormat.Planechase, false, false, true, "Planechase"),
Vanguard ( DeckFormat.Vanguard, true, true, true ), Vanguard (DeckFormat.Vanguard, true, true, true, "Vanguard"),
Commander ( DeckFormat.Commander, false, false, false); Commander (DeckFormat.Commander, false, false, false, "Commander");
private final DeckFormat decksFormat; private final DeckFormat decksFormat;
private final boolean bCardpoolLimited; private final boolean bCardpoolLimited;
private final boolean canSideboard; private final boolean canSideboard;
private final boolean addWonCardsMidgame; private final boolean addWonCardsMidgame;
private final String name;
GameType(DeckFormat formatType, boolean isDeckBuilderLimited, boolean sideboardingAllowed, boolean addAnteMidGame ) { GameType(DeckFormat formatType, boolean isDeckBuilderLimited, boolean sideboardingAllowed, boolean addAnteMidGame, String name0) {
bCardpoolLimited = isDeckBuilderLimited; bCardpoolLimited = isDeckBuilderLimited;
decksFormat = formatType; decksFormat = formatType;
canSideboard = sideboardingAllowed; canSideboard = sideboardingAllowed;
addWonCardsMidgame = addAnteMidGame; addWonCardsMidgame = addAnteMidGame;
name = name0;
} }
/** /**
@@ -67,4 +69,8 @@ public enum GameType {
return false; return false;
}*/ }*/
} }
public String toString() {
return name;
}
} }

View File

@@ -48,6 +48,7 @@ import forge.util.Aggregates;
import forge.util.Lang; import forge.util.Lang;
import forge.util.MyRandom; import forge.util.MyRandom;
import forge.util.NameGenerator; import forge.util.NameGenerator;
import forge.util.Utils;
import forge.util.storage.IStorage; import forge.util.storage.IStorage;
public class ConstructedScreen extends LaunchScreen { public class ConstructedScreen extends LaunchScreen {
@@ -55,14 +56,18 @@ public class ConstructedScreen extends LaunchScreen {
private static final ForgePreferences prefs = FModel.getPreferences(); private static final ForgePreferences prefs = FModel.getPreferences();
private static final float PADDING = 5; private static final float PADDING = 5;
private static final int MAX_PLAYERS = 8; private static final int MAX_PLAYERS = 8;
private static final int VARIANTS_FONT_SIZE = 12;
// General variables // General variables
private int activePlayersNum = 2; private final FLabel lblPlayers = new FLabel.Builder().text("Players:").fontSize(VARIANTS_FONT_SIZE).build();
private final FComboBox<Integer> cmbPlayerCount;
private GameType currentGameMode = GameType.Constructed; private GameType currentGameMode = GameType.Constructed;
private List<Integer> teams = new ArrayList<Integer>(MAX_PLAYERS); private List<Integer> teams = new ArrayList<Integer>(MAX_PLAYERS);
private List<Integer> archenemyTeams = new ArrayList<Integer>(MAX_PLAYERS); private List<Integer> archenemyTeams = new ArrayList<Integer>(MAX_PLAYERS);
// Variants frame and variables // Variants frame and variables
private final FLabel lblVariants = new FLabel.Builder().text("Variants:").fontSize(VARIANTS_FONT_SIZE).build();
private final FComboBox<Object> cmbVariants;
private final Set<GameType> appliedVariants = new TreeSet<GameType>(); private final Set<GameType> appliedVariants = new TreeSet<GameType>();
private final FCheckBox vntVanguard = new FCheckBox("Vanguard"); private final FCheckBox vntVanguard = new FCheckBox("Vanguard");
private final FCheckBox vntCommander = new FCheckBox("Commander"); private final FCheckBox vntCommander = new FCheckBox("Commander");
@@ -78,18 +83,20 @@ public class ConstructedScreen extends LaunchScreen {
protected ScrollBounds layoutAndGetScrollBounds(float visibleWidth, float visibleHeight) { protected ScrollBounds layoutAndGetScrollBounds(float visibleWidth, float visibleHeight) {
float y = 0; float y = 0;
float height; float height;
for (int i = 0; i < activePlayersNum; i++) { for (int i = 0; i < getNumPlayers(); i++) {
height = playerPanels.get(i).getPreferredHeight(); height = playerPanels.get(i).getPreferredHeight();
playerPanels.get(i).setBounds(0, y, visibleWidth, height); playerPanels.get(i).setBounds(0, y, visibleWidth, height);
y += height; y += height;
} }
return new ScrollBounds(visibleWidth, visibleHeight); return new ScrollBounds(visibleWidth, y);
}
@Override
protected void drawOverlay(Graphics g) {
g.drawLine(1.5f, PLAYER_BORDER_COLOR, 0, 0, getWidth(), 0);
} }
}; };
private final List<FLabel> closePlayerBtnList = new ArrayList<FLabel>(6);
private final FLabel addPlayerBtn = new FLabel.ButtonBuilder().fontSize(14).text("Add a Player").build();
private final FCheckBox cbSingletons = new FCheckBox("Singleton Mode"); private final FCheckBox cbSingletons = new FCheckBox("Singleton Mode");
private final FCheckBox cbArtifacts = new FCheckBox("Remove Artifacts"); private final FCheckBox cbArtifacts = new FCheckBox("Remove Artifacts");
@@ -105,6 +112,34 @@ public class ConstructedScreen extends LaunchScreen {
public ConstructedScreen() { public ConstructedScreen() {
super("Constructed"); super("Constructed");
add(lblPlayers);
cmbPlayerCount = add(new FComboBox<Integer>());
cmbPlayerCount.setFontSize(VARIANTS_FONT_SIZE);
for (int i = 2; i <= MAX_PLAYERS; i++) {
cmbPlayerCount.addItem(i);
}
cmbPlayerCount.setSelectedItem(2);
cmbPlayerCount.setChangedHandler(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
int numPlayers = getNumPlayers();
for (int i = 0; i < MAX_PLAYERS; i++) {
playerPanels.get(i).setVisible(i < numPlayers);
}
playersScroll.revalidate();
}
});
add(lblVariants);
cmbVariants = add(new FComboBox<Object>());
cmbVariants.setFontSize(VARIANTS_FONT_SIZE);
cmbVariants.addItem("(None)");
cmbVariants.addItem(GameType.Vanguard);
cmbVariants.addItem(GameType.Commander);
cmbVariants.addItem(GameType.Planechase);
cmbVariants.addItem(GameType.Archenemy);
cmbVariants.addItem(GameType.ArchenemyRumble);
/*lblTitle.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); /*lblTitle.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2));
//////////////////////////////////////////////////////// ////////////////////////////////////////////////////////
@@ -144,7 +179,7 @@ public class ConstructedScreen extends LaunchScreen {
playerPanels.add(player); playerPanels.add(player);
// Populate players panel // Populate players panel
player.setVisible(i < activePlayersNum); player.setVisible(i < getNumPlayers());
playersScroll.add(player); playersScroll.add(player);
} }
@@ -185,35 +220,19 @@ public class ConstructedScreen extends LaunchScreen {
@Override @Override
protected void doLayoutAboveBtnStart(float startY, float width, float height) { protected void doLayoutAboveBtnStart(float startY, float width, float height) {
playersScroll.setBounds(0, startY, width, height - startY); float x = PADDING;
} float y = startY + PADDING;
float fieldHeight = cmbPlayerCount.getHeight();
lblPlayers.setBounds(x, y, lblPlayers.getAutoSizeBounds().width + PADDING / 2, fieldHeight);
x += lblPlayers.getWidth();
cmbPlayerCount.setBounds(x, y, Utils.AVG_FINGER_WIDTH, fieldHeight);
x += cmbPlayerCount.getWidth() + PADDING;
lblVariants.setBounds(x, y, lblVariants.getAutoSizeBounds().width + PADDING / 2, fieldHeight);
x += lblVariants.getWidth();
cmbVariants.setBounds(x, y, width - x - PADDING, fieldHeight);
private void addPlayer() { y += cmbPlayerCount.getHeight() + PADDING;
if (activePlayersNum >= MAX_PLAYERS) { playersScroll.setBounds(0, y, width, height - y);
return;
}
int freeIndex = -1;
for (int i = 0; i < MAX_PLAYERS; i++) {
if (!playerPanels.get(i).isVisible()) {
freeIndex = i;
break;
}
}
playerPanels.get(freeIndex).setVisible(true);
activePlayersNum++;
addPlayerBtn.setEnabled(activePlayersNum < MAX_PLAYERS);
playerPanels.get(freeIndex).setVisible(true);
}
private void removePlayer(int playerIndex) {
activePlayersNum--;
PlayerPanel player = playerPanels.get(playerIndex);
player.setVisible(false);
addPlayerBtn.setEnabled(true);
} }
public final FDeckChooser getDeckChooser(int playernum) { public final FDeckChooser getDeckChooser(int playernum) {
@@ -221,7 +240,10 @@ public class ConstructedScreen extends LaunchScreen {
} }
public int getNumPlayers() { public int getNumPlayers() {
return activePlayersNum; return cmbPlayerCount.getSelectedItem();
}
public void setNumPlayers(int numPlayers) {
cmbPlayerCount.setSelectedItem(numPlayers);
} }
@Override @Override
@@ -233,7 +255,7 @@ public class ConstructedScreen extends LaunchScreen {
return false; return false;
} }
for (int i = 0; i < activePlayersNum; i++) { for (int i = 0; i < getNumPlayers(); i++) {
if (getDeckChooser(i).getPlayer() == null) { if (getDeckChooser(i).getPlayer() == null) {
FOptionPane.showMessageDialog("Please specify a deck for " + getPlayerName(i)); FOptionPane.showMessageDialog("Please specify a deck for " + getPlayerName(i));
return false; return false;
@@ -245,7 +267,7 @@ public class ConstructedScreen extends LaunchScreen {
boolean checkLegality = FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY); boolean checkLegality = FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY);
if (checkLegality && !variantTypes.contains(GameType.Commander)) { //Commander deck replaces regular deck and is checked later if (checkLegality && !variantTypes.contains(GameType.Commander)) { //Commander deck replaces regular deck and is checked later
for (int i = 0; i < activePlayersNum; i++) { for (int i = 0; i < getNumPlayers(); i++) {
String name = getPlayerName(i); String name = getPlayerName(i);
String errMsg = GameType.Constructed.getDecksFormat().getDeckConformanceProblem(getDeckChooser(i).getPlayer().getDeck()); String errMsg = GameType.Constructed.getDecksFormat().getDeckConformanceProblem(getDeckChooser(i).getPlayer().getDeck());
if (errMsg != null) { if (errMsg != null) {
@@ -257,7 +279,7 @@ public class ConstructedScreen extends LaunchScreen {
Lobby lobby = FServer.getLobby(); Lobby lobby = FServer.getLobby();
List<RegisteredPlayer> players = new ArrayList<RegisteredPlayer>(); List<RegisteredPlayer> players = new ArrayList<RegisteredPlayer>();
for (int i = 0; i < activePlayersNum; i++) { for (int i = 0; i < getNumPlayers(); i++) {
PlayerPanel playerPanel = playerPanels.get(i); PlayerPanel playerPanel = playerPanels.get(i);
String name = getPlayerName(i); String name = getPlayerName(i);
LobbyPlayer lobbyPlayer = playerPanel.isPlayerAI() ? lobby.getAiPlayer(name, LobbyPlayer lobbyPlayer = playerPanel.isPlayerAI() ? lobby.getAiPlayer(name,
@@ -462,12 +484,6 @@ public class ConstructedScreen extends LaunchScreen {
planarDeckList = new DeckList(); planarDeckList = new DeckList();
vgdAvatarList = new DeckList(); vgdAvatarList = new DeckList();
// Add a button to players 3+ to remove them from the setup
if (index >= 2) {
FLabel closeBtn = createCloseButton();
add(closeBtn);
}
createAvatar(); createAvatar();
add(avatarLabel); add(avatarLabel);
@@ -860,19 +876,6 @@ public class ConstructedScreen extends LaunchScreen {
txtPlayerName.setChangedHandler(nameChangedHandler); txtPlayerName.setChangedHandler(nameChangedHandler);
} }
private FLabel createCloseButton() {
final FLabel closeBtn = new FLabel.Builder().iconInBackground(false)
.icon(FSkinImage.CLOSE).build();
closeBtn.setCommand(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
removePlayer(closePlayerBtnList.indexOf(closeBtn) + 2);
}
});
closePlayerBtnList.add(closeBtn);
return closeBtn;
}
private void createAvatar() { private void createAvatar() {
String[] currentPrefs = prefs.getPref(FPref.UI_AVATARS).split(","); String[] currentPrefs = prefs.getPref(FPref.UI_AVATARS).split(",");
if (index < currentPrefs.length) { if (index < currentPrefs.length) {
@@ -1076,7 +1079,7 @@ public class ConstructedScreen extends LaunchScreen {
int lastTeam = -1; int lastTeam = -1;
final List<Integer> teamList = appliedVariants.contains(GameType.Archenemy) ? archenemyTeams : teams; final List<Integer> teamList = appliedVariants.contains(GameType.Archenemy) ? archenemyTeams : teams;
for (int i = 0; i < activePlayersNum; i++) { for (int i = 0; i < getNumPlayers(); i++) {
if (lastTeam == -1) { if (lastTeam == -1) {
lastTeam = teamList.get(i); lastTeam = teamList.get(i);
} }