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

View File

@@ -48,6 +48,7 @@ import forge.util.Aggregates;
import forge.util.Lang;
import forge.util.MyRandom;
import forge.util.NameGenerator;
import forge.util.Utils;
import forge.util.storage.IStorage;
public class ConstructedScreen extends LaunchScreen {
@@ -55,14 +56,18 @@ public class ConstructedScreen extends LaunchScreen {
private static final ForgePreferences prefs = FModel.getPreferences();
private static final float PADDING = 5;
private static final int MAX_PLAYERS = 8;
private static final int VARIANTS_FONT_SIZE = 12;
// 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 List<Integer> teams = new ArrayList<Integer>(MAX_PLAYERS);
private List<Integer> archenemyTeams = new ArrayList<Integer>(MAX_PLAYERS);
// 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 FCheckBox vntVanguard = new FCheckBox("Vanguard");
private final FCheckBox vntCommander = new FCheckBox("Commander");
@@ -78,18 +83,20 @@ public class ConstructedScreen extends LaunchScreen {
protected ScrollBounds layoutAndGetScrollBounds(float visibleWidth, float visibleHeight) {
float y = 0;
float height;
for (int i = 0; i < activePlayersNum; i++) {
for (int i = 0; i < getNumPlayers(); i++) {
height = playerPanels.get(i).getPreferredHeight();
playerPanels.get(i).setBounds(0, y, visibleWidth, 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 cbArtifacts = new FCheckBox("Remove Artifacts");
@@ -105,6 +112,34 @@ public class ConstructedScreen extends LaunchScreen {
public ConstructedScreen() {
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));
////////////////////////////////////////////////////////
@@ -144,7 +179,7 @@ public class ConstructedScreen extends LaunchScreen {
playerPanels.add(player);
// Populate players panel
player.setVisible(i < activePlayersNum);
player.setVisible(i < getNumPlayers());
playersScroll.add(player);
}
@@ -185,35 +220,19 @@ public class ConstructedScreen extends LaunchScreen {
@Override
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() {
if (activePlayersNum >= MAX_PLAYERS) {
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);
y += cmbPlayerCount.getHeight() + PADDING;
playersScroll.setBounds(0, y, width, height - y);
}
public final FDeckChooser getDeckChooser(int playernum) {
@@ -221,7 +240,10 @@ public class ConstructedScreen extends LaunchScreen {
}
public int getNumPlayers() {
return activePlayersNum;
return cmbPlayerCount.getSelectedItem();
}
public void setNumPlayers(int numPlayers) {
cmbPlayerCount.setSelectedItem(numPlayers);
}
@Override
@@ -233,7 +255,7 @@ public class ConstructedScreen extends LaunchScreen {
return false;
}
for (int i = 0; i < activePlayersNum; i++) {
for (int i = 0; i < getNumPlayers(); i++) {
if (getDeckChooser(i).getPlayer() == null) {
FOptionPane.showMessageDialog("Please specify a deck for " + getPlayerName(i));
return false;
@@ -245,7 +267,7 @@ public class ConstructedScreen extends LaunchScreen {
boolean checkLegality = FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY);
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 errMsg = GameType.Constructed.getDecksFormat().getDeckConformanceProblem(getDeckChooser(i).getPlayer().getDeck());
if (errMsg != null) {
@@ -257,7 +279,7 @@ public class ConstructedScreen extends LaunchScreen {
Lobby lobby = FServer.getLobby();
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);
String name = getPlayerName(i);
LobbyPlayer lobbyPlayer = playerPanel.isPlayerAI() ? lobby.getAiPlayer(name,
@@ -462,12 +484,6 @@ public class ConstructedScreen extends LaunchScreen {
planarDeckList = 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();
add(avatarLabel);
@@ -860,19 +876,6 @@ public class ConstructedScreen extends LaunchScreen {
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() {
String[] currentPrefs = prefs.getPref(FPref.UI_AVATARS).split(",");
if (index < currentPrefs.length) {
@@ -1076,7 +1079,7 @@ public class ConstructedScreen extends LaunchScreen {
int lastTeam = -1;
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) {
lastTeam = teamList.get(i);
}