mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 18:58:00 +00:00
Support changing player count
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user