mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 19:28:01 +00:00
Initial commit for Planar Conquest mode
This commit is contained in:
@@ -106,6 +106,12 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
|
||||
public Deck get() {
|
||||
return new Deck();
|
||||
}
|
||||
})),
|
||||
PlanarConquest(new DeckController<Deck>(null, new Supplier<Deck>() { //delay setting root folder until conquest loaded
|
||||
@Override
|
||||
public Deck get() {
|
||||
return new Deck();
|
||||
}
|
||||
}));
|
||||
|
||||
private final DeckController<? extends DeckBase> controller;
|
||||
|
||||
@@ -9,8 +9,8 @@ import forge.assets.FSkinImage;
|
||||
import forge.screens.constructed.ConstructedScreen;
|
||||
import forge.screens.gauntlet.GauntletScreen;
|
||||
import forge.screens.limited.LimitedScreen;
|
||||
import forge.screens.planarconquest.ConquestMenu;
|
||||
import forge.screens.quest.QuestMenu;
|
||||
import forge.screens.quest.QuestMenu.LaunchReason;
|
||||
import forge.screens.settings.SettingsScreen;
|
||||
import forge.toolbox.FButton;
|
||||
import forge.toolbox.FEvent;
|
||||
@@ -39,15 +39,16 @@ public class HomeScreen extends FScreen {
|
||||
Forge.openScreen(new LimitedScreen());
|
||||
}
|
||||
});
|
||||
addButton("???", new FEventHandler() {
|
||||
addButton("Planar Conquest", new FEventHandler() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
ConquestMenu.launchPlanarConquest(ConquestMenu.LaunchReason.StartPlanarConquest);
|
||||
}
|
||||
});
|
||||
addButton("Quest Mode", new FEventHandler() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
QuestMenu.launchQuestMode(LaunchReason.StartQuestMode);
|
||||
QuestMenu.launchQuestMode(QuestMenu.LaunchReason.StartQuestMode);
|
||||
}
|
||||
});
|
||||
addButton("Gauntlets", new FEventHandler() {
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
package forge.screens.planarconquest;
|
||||
|
||||
import forge.FThreads;
|
||||
import forge.quest.QuestUtil;
|
||||
import forge.screens.LaunchScreen;
|
||||
import forge.screens.LoadingOverlay;
|
||||
import forge.toolbox.FOptionPane;
|
||||
|
||||
public class ConquestMapScreen extends LaunchScreen {
|
||||
protected static final float PADDING = FOptionPane.PADDING;
|
||||
|
||||
public ConquestMapScreen() {
|
||||
super("", ConquestMenu.getMenu());
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void onActivate() {
|
||||
update();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void startMatch() {
|
||||
if (creatingMatch) { return; }
|
||||
creatingMatch = true; //ensure user doesn't create multiple matches by tapping multiple times
|
||||
|
||||
FThreads.invokeInBackgroundThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (QuestUtil.canStartGame()) {
|
||||
FThreads.invokeInEdtLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
LoadingOverlay.show("Loading new game...", new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
QuestUtil.finishStartingGame();
|
||||
creatingMatch = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
creatingMatch = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void update() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final boolean buildLaunchParams(LaunchParams launchParams) {
|
||||
return false; //this override isn't needed
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doLayoutAboveBtnStart(float startY, float width, float height) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
package forge.screens.planarconquest;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import forge.Forge;
|
||||
import forge.assets.FSkinImage;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.FDeckEditor.DeckController;
|
||||
import forge.deck.FDeckEditor.EditorType;
|
||||
import forge.menu.FMenuItem;
|
||||
import forge.menu.FPopupMenu;
|
||||
import forge.model.FModel;
|
||||
import forge.planarconquest.ConquestDataIO;
|
||||
import forge.planarconquest.ConquestPreferences.CQPref;
|
||||
import forge.properties.ForgeConstants;
|
||||
import forge.screens.FScreen;
|
||||
import forge.screens.LoadingOverlay;
|
||||
import forge.toolbox.FEvent;
|
||||
import forge.toolbox.FEvent.FEventHandler;
|
||||
|
||||
public class ConquestMenu extends FPopupMenu {
|
||||
private static final ConquestMenu conquestMenu = new ConquestMenu();
|
||||
private static final ConquestMapScreen mapScreen = new ConquestMapScreen();
|
||||
private static final ConquestPrefsScreen prefsScreen = new ConquestPrefsScreen();
|
||||
|
||||
private static final FMenuItem mapItem = new FMenuItem("Planar Map", FSkinImage.QUEST_MAP, new FEventHandler() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
Forge.openScreen(mapScreen);
|
||||
}
|
||||
});
|
||||
|
||||
public static ConquestMenu getMenu() {
|
||||
return conquestMenu;
|
||||
}
|
||||
|
||||
private ConquestMenu() {
|
||||
}
|
||||
|
||||
public enum LaunchReason {
|
||||
StartPlanarConquest,
|
||||
LoadConquest,
|
||||
NewConquest
|
||||
}
|
||||
|
||||
public static void launchPlanarConquest(final LaunchReason reason) {
|
||||
//attempt to load current quest
|
||||
final File dirConquests = new File(ForgeConstants.CONQUEST_SAVE_DIR);
|
||||
final String questname = FModel.getConquestPreferences().getPref(CQPref.CURRENT_CONQUEST);
|
||||
final File data = new File(dirConquests.getPath(), questname);
|
||||
if (data.exists()) {
|
||||
LoadingOverlay.show("Loading current conquest...", new Runnable() {
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public void run() {
|
||||
FModel.getConquest().load(ConquestDataIO.loadData(data));
|
||||
((DeckController<Deck>)EditorType.PlanarConquest.getController()).setRootFolder(FModel.getConquest().getDecks());
|
||||
if (reason == LaunchReason.StartPlanarConquest) {
|
||||
Forge.openScreen(mapScreen);
|
||||
}
|
||||
else {
|
||||
mapScreen.update();
|
||||
if (reason == LaunchReason.LoadConquest) {
|
||||
Forge.back();
|
||||
if (Forge.onHomeScreen()) { //open map screen if Load Conquest screen was opening direct from home screen
|
||||
Forge.openScreen(mapScreen);
|
||||
}
|
||||
}
|
||||
else {
|
||||
Forge.back();
|
||||
if (Forge.getCurrentScreen() instanceof LoadConquestScreen) {
|
||||
Forge.back(); //remove LoadConquestScreen from screen stack
|
||||
}
|
||||
if (Forge.onHomeScreen()) { //open map screen if New Conquest screen was opening direct from home screen
|
||||
Forge.openScreen(mapScreen);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
//if current quest can't be loaded, open New Conquest or Load Conquest screen based on whether a quest exists
|
||||
if (dirConquests.exists() && dirConquests.isDirectory() && dirConquests.list().length > 0) {
|
||||
Forge.openScreen(new LoadConquestScreen());
|
||||
}
|
||||
else {
|
||||
Forge.openScreen(new NewConquestScreen());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void buildMenu() {
|
||||
FScreen currentScreen = Forge.getCurrentScreen();
|
||||
addItem(mapItem); mapItem.setSelected(currentScreen == mapScreen);
|
||||
addItem(new FMenuItem("New Conquest", FSkinImage.NEW, new FEventHandler() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
Forge.openScreen(new NewConquestScreen());
|
||||
}
|
||||
}));
|
||||
addItem(new FMenuItem("Load Conquest", FSkinImage.OPEN, new FEventHandler() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
Forge.openScreen(new LoadConquestScreen());
|
||||
}
|
||||
}));
|
||||
addItem(new FMenuItem("Preferences", FSkinImage.SETTINGS, new FEventHandler() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
Forge.openScreen(prefsScreen);
|
||||
}
|
||||
}));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,131 @@
|
||||
package forge.screens.planarconquest;
|
||||
|
||||
import forge.assets.FImage;
|
||||
import forge.assets.FSkinFont;
|
||||
import forge.assets.FSkinImage;
|
||||
import forge.model.FModel;
|
||||
import forge.planarconquest.ConquestPreferences;
|
||||
import forge.planarconquest.ConquestPreferences.CQPref;
|
||||
import forge.screens.FScreen;
|
||||
import forge.toolbox.FContainer;
|
||||
import forge.toolbox.FDisplayObject;
|
||||
import forge.toolbox.FEvent;
|
||||
import forge.toolbox.FEvent.FEventHandler;
|
||||
import forge.toolbox.FLabel;
|
||||
import forge.toolbox.FNumericTextField;
|
||||
import forge.toolbox.FOptionPane;
|
||||
import forge.toolbox.FScrollPane;
|
||||
import forge.toolbox.FTextField;
|
||||
import forge.util.Utils;
|
||||
|
||||
public class ConquestPrefsScreen extends FScreen {
|
||||
private static final float PADDING = Utils.scale(5);
|
||||
|
||||
private enum PrefsGroup {
|
||||
TODO
|
||||
}
|
||||
|
||||
private FScrollPane scroller = add(new FScrollPane() {
|
||||
@Override
|
||||
protected ScrollBounds layoutAndGetScrollBounds(float visibleWidth, float visibleHeight) {
|
||||
float x = PADDING;
|
||||
float y = PADDING;
|
||||
float w = visibleWidth - 2 * PADDING;
|
||||
float fieldHeight = FTextField.getDefaultHeight();
|
||||
float dy = fieldHeight + PADDING;
|
||||
|
||||
for (FDisplayObject child : getChildren()) {
|
||||
if (child.isVisible()) {
|
||||
child.setBounds(x, y, w, fieldHeight);
|
||||
y += dy;
|
||||
}
|
||||
}
|
||||
|
||||
return new ScrollBounds(visibleWidth, y);
|
||||
}
|
||||
});
|
||||
|
||||
public ConquestPrefsScreen() {
|
||||
super("Conquest Preferences", ConquestMenu.getMenu());
|
||||
|
||||
scroller.add(new PrefsHeader("TODO", FSkinImage.QUEST_COIN, PrefsGroup.TODO));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doLayout(float startY, float width, float height) {
|
||||
scroller.setBounds(0, startY, width, height - startY);
|
||||
}
|
||||
|
||||
private class PrefsHeader extends FLabel {
|
||||
private PrefsHeader(String title, FImage icon, final PrefsGroup group) {
|
||||
super(new ButtonBuilder().text(title).font(FSkinFont.get(16)).icon(icon).iconScaleFactor(1f)
|
||||
.command(new FEventHandler() {
|
||||
private boolean showOptions = true;
|
||||
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
showOptions = !showOptions;
|
||||
for (FDisplayObject child : scroller.getChildren()) {
|
||||
if (child instanceof PrefsOption && ((PrefsOption)child).group == group) {
|
||||
child.setVisible(showOptions);
|
||||
}
|
||||
}
|
||||
scroller.revalidate();
|
||||
}
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
private static class PrefsOption extends FContainer {
|
||||
private static final float FIELD_WIDTH = new FTextField("99999").getAutoSizeWidth(); //base width on 5 digit number
|
||||
|
||||
private final FLabel label = add(new FLabel.Builder().build());
|
||||
private final OptionField field = add(new OptionField());
|
||||
private final CQPref pref;
|
||||
private final PrefsGroup group;
|
||||
|
||||
private PrefsOption(String label0, CQPref pref0, PrefsGroup group0) {
|
||||
label.setText(label0);
|
||||
pref = pref0;
|
||||
group = group0;
|
||||
field.setText(FModel.getConquestPreferences().getPref(pref0));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doLayout(float width, float height) {
|
||||
label.setBounds(0, 0, width - FIELD_WIDTH - PADDING, height);
|
||||
field.setBounds(width - FIELD_WIDTH, 0, FIELD_WIDTH, height);
|
||||
}
|
||||
|
||||
private class OptionField extends FNumericTextField {
|
||||
private OptionField() {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean validate() {
|
||||
if (super.validate()) {
|
||||
final ConquestPreferences prefs = FModel.getConquestPreferences();
|
||||
|
||||
int val = Integer.parseInt(getText());
|
||||
|
||||
String validationError = prefs.validatePreference(pref, val);
|
||||
if (validationError != null) {
|
||||
String prefType;
|
||||
switch (group) {
|
||||
default:
|
||||
prefType = "TODO";
|
||||
break;
|
||||
}
|
||||
FOptionPane.showErrorDialog(validationError, "Save Failed - " + prefType);
|
||||
return false;
|
||||
}
|
||||
|
||||
prefs.setPref(pref, getText());
|
||||
prefs.save();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,310 @@
|
||||
package forge.screens.planarconquest;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FilenameFilter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
|
||||
|
||||
import forge.FThreads;
|
||||
import forge.Forge;
|
||||
import forge.Graphics;
|
||||
import forge.assets.FSkinColor;
|
||||
import forge.assets.FSkinColor.Colors;
|
||||
import forge.assets.FSkinFont;
|
||||
import forge.assets.FSkinImage;
|
||||
import forge.card.CardRenderer;
|
||||
import forge.model.FModel;
|
||||
import forge.planarconquest.ConquestController;
|
||||
import forge.planarconquest.ConquestData;
|
||||
import forge.planarconquest.ConquestDataIO;
|
||||
import forge.planarconquest.ConquestPreferences.CQPref;
|
||||
import forge.properties.ForgeConstants;
|
||||
import forge.quest.QuestUtil;
|
||||
import forge.screens.FScreen;
|
||||
import forge.screens.settings.SettingsScreen;
|
||||
import forge.toolbox.FButton;
|
||||
import forge.toolbox.FEvent;
|
||||
import forge.toolbox.FList;
|
||||
import forge.toolbox.FEvent.FEventHandler;
|
||||
import forge.util.ThreadUtil;
|
||||
import forge.util.Utils;
|
||||
import forge.util.gui.SOptionPane;
|
||||
|
||||
public class LoadConquestScreen extends FScreen {
|
||||
private static final float PADDING = Utils.AVG_FINGER_HEIGHT * 0.1f;
|
||||
private static final FSkinColor SEL_COLOR = FSkinColor.get(Colors.CLR_ACTIVE);
|
||||
|
||||
private final ConquestFileLister lstConquests = add(new ConquestFileLister());
|
||||
private final FButton btnNewConquest = add(new FButton("New"));
|
||||
private final FButton btnRenameConquest = add(new FButton("Rename"));
|
||||
private final FButton btnDeleteConquest = add(new FButton("Delete"));
|
||||
|
||||
public LoadConquestScreen() {
|
||||
super("Load Planar Conquest");
|
||||
|
||||
btnNewConquest.setFont(FSkinFont.get(16));
|
||||
btnNewConquest.setCommand(new FEventHandler() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
Forge.openScreen(new NewConquestScreen());
|
||||
}
|
||||
});
|
||||
btnRenameConquest.setFont(btnNewConquest.getFont());
|
||||
btnRenameConquest.setCommand(new FEventHandler() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
renameConquest(lstConquests.getSelectedConquest());
|
||||
}
|
||||
});
|
||||
btnDeleteConquest.setFont(btnNewConquest.getFont());
|
||||
btnDeleteConquest.setCommand(new FEventHandler() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
deleteConquest(lstConquests.getSelectedConquest());
|
||||
}
|
||||
});
|
||||
|
||||
FThreads.invokeInBackgroundThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
final File dirConquests = new File(ForgeConstants.CONQUEST_SAVE_DIR);
|
||||
final ConquestController qc = FModel.getConquest();
|
||||
|
||||
// Iterate over files and load quest data for each.
|
||||
FilenameFilter takeDatFiles = new FilenameFilter() {
|
||||
@Override
|
||||
public boolean accept(final File dir, final String name) {
|
||||
return name.endsWith(".dat");
|
||||
}
|
||||
};
|
||||
File[] arrFiles = dirConquests.listFiles(takeDatFiles);
|
||||
Map<String, ConquestData> arrConquests = new HashMap<String, ConquestData>();
|
||||
for (File f : arrFiles) {
|
||||
arrConquests.put(f.getName(), ConquestDataIO.loadData(f));
|
||||
}
|
||||
|
||||
// Populate list with available quest data.
|
||||
lstConquests.setConquests(new ArrayList<ConquestData>(arrConquests.values()));
|
||||
|
||||
// If there are quests available, force select.
|
||||
if (arrConquests.size() > 0) {
|
||||
final String questname = FModel.getConquestPreferences().getPref(CQPref.CURRENT_CONQUEST);
|
||||
|
||||
// Attempt to select previous quest.
|
||||
if (arrConquests.get(questname) != null) {
|
||||
lstConquests.setSelectedConquest(arrConquests.get(questname));
|
||||
}
|
||||
else {
|
||||
lstConquests.setSelectedIndex(0);
|
||||
}
|
||||
|
||||
// Drop into AllZone.
|
||||
qc.load(lstConquests.getSelectedConquest());
|
||||
}
|
||||
else {
|
||||
qc.load(null);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void drawOverlay(Graphics g) {
|
||||
float y = lstConquests.getTop();
|
||||
g.drawLine(1, FList.LINE_COLOR, 0, y, getWidth(), y); //draw top border for list
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doLayout(float startY, float width, float height) {
|
||||
float buttonWidth = (width - 2 * PADDING) / 3;
|
||||
float buttonHeight = btnNewConquest.getAutoSizeBounds().height * 1.2f;
|
||||
|
||||
float y = startY + 2 * PADDING;
|
||||
lstConquests.setBounds(0, y, width, height - y - buttonHeight - 2 * PADDING);
|
||||
y += lstConquests.getHeight() + PADDING;
|
||||
|
||||
float x = 0;
|
||||
btnNewConquest.setBounds(x, y, buttonWidth, buttonHeight);
|
||||
x += buttonWidth + PADDING;
|
||||
btnRenameConquest.setBounds(x, y, buttonWidth, buttonHeight);
|
||||
x += buttonWidth + PADDING;
|
||||
btnDeleteConquest.setBounds(x, y, buttonWidth, buttonHeight);
|
||||
}
|
||||
|
||||
private void changeConquest() {
|
||||
FModel.getConquestPreferences().setPref(CQPref.CURRENT_CONQUEST,
|
||||
lstConquests.getSelectedConquest().getName() + ".dat");
|
||||
FModel.getConquestPreferences().save();
|
||||
}
|
||||
|
||||
private void renameConquest(final ConquestData quest) {
|
||||
if (quest == null) { return; }
|
||||
|
||||
ThreadUtil.invokeInGameThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
String questName;
|
||||
String oldConquestName = quest.getName();
|
||||
while (true) {
|
||||
questName = SOptionPane.showInputDialog("Enter new name for quest:", "Rename Conquest", null, oldConquestName);
|
||||
if (questName == null) { return; }
|
||||
|
||||
questName = QuestUtil.cleanString(questName);
|
||||
if (questName.equals(oldConquestName)) { return; } //quit if chose same name
|
||||
|
||||
if (questName.isEmpty()) {
|
||||
SOptionPane.showMessageDialog("Please specify a quest name.");
|
||||
continue;
|
||||
}
|
||||
|
||||
boolean exists = false;
|
||||
for (ConquestData questData : lstConquests) {
|
||||
if (questData.getName().equalsIgnoreCase(questName)) {
|
||||
exists = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (exists) {
|
||||
SOptionPane.showMessageDialog("A quest already exists with that name. Please pick another quest name.");
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
quest.rename(questName);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void deleteConquest(final ConquestData quest) {
|
||||
if (quest == null) { return; }
|
||||
|
||||
ThreadUtil.invokeInGameThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!SOptionPane.showConfirmDialog(
|
||||
"Are you sure you want to delete '" + quest.getName() + "'?",
|
||||
"Delete Conquest", "Delete", "Cancel")) {
|
||||
return;
|
||||
}
|
||||
|
||||
new File(ForgeConstants.CONQUEST_SAVE_DIR, quest.getName() + ".dat").delete();
|
||||
|
||||
lstConquests.removeConquest(quest);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private class ConquestFileLister extends FList<ConquestData> {
|
||||
private int selectedIndex = 0;
|
||||
|
||||
private ConquestFileLister() {
|
||||
setListItemRenderer(new ListItemRenderer<ConquestData>() {
|
||||
@Override
|
||||
public boolean tap(Integer index, ConquestData value, float x, float y, int count) {
|
||||
if (count == 2) {
|
||||
changeConquest();
|
||||
}
|
||||
else {
|
||||
selectedIndex = index;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getItemHeight() {
|
||||
return CardRenderer.getCardListItemHeight(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawValue(Graphics g, Integer index, ConquestData value, FSkinFont font, FSkinColor foreColor, FSkinColor backColor, boolean pressed, float x, float y, float w, float h) {
|
||||
float offset = w * SettingsScreen.INSETS_FACTOR - FList.PADDING; //increase padding for settings items
|
||||
x += offset;
|
||||
y += offset;
|
||||
w -= 2 * offset;
|
||||
h -= 2 * offset;
|
||||
|
||||
float totalHeight = h;
|
||||
String name = value.getName();
|
||||
h = font.getMultiLineBounds(name).height + SettingsScreen.SETTING_PADDING;
|
||||
|
||||
String winRatio = value.getWins() + "W / " + value.getLosses() + "L";
|
||||
float winRatioWidth = font.getBounds(winRatio).width + SettingsScreen.SETTING_PADDING;
|
||||
|
||||
g.drawText(name, font, foreColor, x, y, w - winRatioWidth, h, false, HAlignment.LEFT, false);
|
||||
g.drawText(winRatio, font, foreColor, x, y, w, h, false, HAlignment.RIGHT, false);
|
||||
|
||||
h += SettingsScreen.SETTING_PADDING;
|
||||
y += h;
|
||||
h = totalHeight - h + w * SettingsScreen.INSETS_FACTOR;
|
||||
float iconSize = h + Utils.scale(1);
|
||||
float iconOffset = SettingsScreen.SETTING_PADDING - Utils.scale(2);
|
||||
|
||||
String cards = String.valueOf(value.getCardPool().countAll());
|
||||
font = FSkinFont.get(12);
|
||||
float cardsWidth = font.getBounds(cards).width + iconSize + SettingsScreen.SETTING_PADDING;
|
||||
g.drawImage(FSkinImage.HAND, x + w - cardsWidth + iconOffset, y - SettingsScreen.SETTING_PADDING, iconSize, iconSize);
|
||||
g.drawText(cards, font, SettingsScreen.DESC_COLOR, x + w - cardsWidth + iconSize + SettingsScreen.SETTING_PADDING, y, w, h, false, HAlignment.LEFT, false);
|
||||
g.drawImage(FSkinImage.QUEST_COINSTACK, x + w + iconOffset, y - SettingsScreen.SETTING_PADDING, iconSize, iconSize);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected FSkinColor getItemFillColor(int index) {
|
||||
if (index == selectedIndex) {
|
||||
return SEL_COLOR;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void setConquests(List<ConquestData> qd0) {
|
||||
List<ConquestData> sorted = new ArrayList<ConquestData>();
|
||||
for (ConquestData qd : qd0) {
|
||||
sorted.add(qd);
|
||||
}
|
||||
Collections.sort(sorted, new Comparator<ConquestData>() {
|
||||
@Override
|
||||
public int compare(final ConquestData x, final ConquestData y) {
|
||||
return x.getName().toLowerCase().compareTo(y.getName().toLowerCase());
|
||||
}
|
||||
});
|
||||
setListData(sorted);
|
||||
}
|
||||
|
||||
public void removeConquest(ConquestData qd) {
|
||||
removeItem(qd);
|
||||
if (selectedIndex == getCount()) {
|
||||
selectedIndex--;
|
||||
}
|
||||
revalidate();
|
||||
}
|
||||
|
||||
public boolean setSelectedIndex(int i0) {
|
||||
if (i0 >= getCount()) { return false; }
|
||||
selectedIndex = i0;
|
||||
return true;
|
||||
}
|
||||
|
||||
public ConquestData getSelectedConquest() {
|
||||
if (selectedIndex == -1) { return null; }
|
||||
return getItemAt(selectedIndex);
|
||||
}
|
||||
|
||||
public boolean setSelectedConquest(ConquestData qd0) {
|
||||
for (int i = 0; i < getCount(); i++) {
|
||||
if (getItemAt(i) == qd0) {
|
||||
selectedIndex = i;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
package forge.screens.planarconquest;
|
||||
|
||||
import forge.FThreads;
|
||||
import forge.assets.FSkinFont;
|
||||
import forge.assets.FSkinImage;
|
||||
import forge.item.PaperCard;
|
||||
import forge.model.FModel;
|
||||
import forge.planarconquest.ConquestController;
|
||||
import forge.planarconquest.ConquestData;
|
||||
import forge.planarconquest.ConquestPlane;
|
||||
import forge.planarconquest.ConquestPreferences.CQPref;
|
||||
import forge.properties.ForgeConstants;
|
||||
import forge.quest.QuestUtil;
|
||||
import forge.screens.FScreen;
|
||||
import forge.screens.LoadingOverlay;
|
||||
import forge.toolbox.FChoiceList;
|
||||
import forge.toolbox.FComboBox;
|
||||
import forge.toolbox.FEvent;
|
||||
import forge.toolbox.FEvent.FEventHandler;
|
||||
import forge.toolbox.FLabel;
|
||||
import forge.toolbox.FOptionPane;
|
||||
import forge.util.FileUtil;
|
||||
import forge.util.ThreadUtil;
|
||||
import forge.util.Utils;
|
||||
import forge.util.gui.SOptionPane;
|
||||
|
||||
public class NewConquestScreen extends FScreen {
|
||||
private static final float EMBARK_BTN_HEIGHT = 2 * Utils.AVG_FINGER_HEIGHT;
|
||||
private static final float PADDING = FOptionPane.PADDING;
|
||||
|
||||
private final FLabel lblDifficulty = add(new FLabel.Builder().text("Difficulty:").build());
|
||||
private final FComboBox<String> cbxDifficulty = add(new FComboBox<String>(new String[]{ "Easy", "Medium", "Hard", "Expert" }));
|
||||
|
||||
private final FLabel lblStartingPlane = add(new FLabel.Builder().text("Starting world:").build());
|
||||
private final FComboBox<ConquestPlane> cbxStartingPlane = add(new FComboBox<ConquestPlane>(ConquestPlane.values()));
|
||||
|
||||
private final FLabel lblStartingCommander = add(new FLabel.Builder().text("Starting commander:").build());
|
||||
private final FChoiceList<PaperCard> lstCommanders = add(new FChoiceList<PaperCard>(cbxStartingPlane.getSelectedItem().getCommanders()));
|
||||
|
||||
private final FLabel btnEmbark = add(new FLabel.ButtonBuilder()
|
||||
.font(FSkinFont.get(22)).text("Embark!").icon(FSkinImage.QUEST_ZEP).command(new FEventHandler() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
//create new quest in game thread so option panes can wait for input
|
||||
ThreadUtil.invokeInGameThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
newConquest();
|
||||
}
|
||||
});
|
||||
}
|
||||
}).build());
|
||||
|
||||
public NewConquestScreen() {
|
||||
super("New Planar Conquest");
|
||||
|
||||
cbxStartingPlane.setChangedHandler(new FEventHandler() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
lstCommanders.setListData(cbxStartingPlane.getSelectedItem().getCommanders());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public int getSelectedDifficulty() {
|
||||
int difficulty = cbxDifficulty.getSelectedIndex();
|
||||
if (difficulty < 0) {
|
||||
difficulty = 0;
|
||||
}
|
||||
return difficulty;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doLayout(float startY, float width, float height) {
|
||||
float x = PADDING;
|
||||
float y = startY + PADDING;
|
||||
float right = width - PADDING;
|
||||
float w = width - 2 * PADDING;
|
||||
float h = cbxStartingPlane.getHeight();
|
||||
float gapY = PADDING / 2;
|
||||
|
||||
lblDifficulty.setBounds(x, y, width / 2 - x, h);
|
||||
x += lblDifficulty.getWidth();
|
||||
cbxDifficulty.setBounds(x, y, right - x, h);
|
||||
x = PADDING;
|
||||
y += h + gapY;
|
||||
|
||||
lblStartingPlane.setBounds(x, y, width / 2 - x, h);
|
||||
x += lblStartingPlane.getWidth();
|
||||
cbxStartingPlane.setBounds(x, y, right - x, h);
|
||||
x = PADDING;
|
||||
y += h + gapY;
|
||||
|
||||
lblStartingCommander.setBounds(x, y, w, h);
|
||||
y += h;
|
||||
lstCommanders.setBounds(x, y, w, height - EMBARK_BTN_HEIGHT - gapY - PADDING - y);
|
||||
y += lstCommanders.getHeight() + gapY;
|
||||
|
||||
btnEmbark.setBounds(x, y, w, EMBARK_BTN_HEIGHT);
|
||||
}
|
||||
|
||||
private void newConquest() {
|
||||
String conquestName;
|
||||
while (true) {
|
||||
conquestName = SOptionPane.showInputDialog("Historians will recall your conquest as:", "Conquest Name");
|
||||
if (conquestName == null) { return; }
|
||||
|
||||
conquestName = QuestUtil.cleanString(conquestName);
|
||||
|
||||
if (conquestName.isEmpty()) {
|
||||
SOptionPane.showMessageDialog("Please specify a conquest name.");
|
||||
continue;
|
||||
}
|
||||
if (FileUtil.doesFileExist(ForgeConstants.CONQUEST_SAVE_DIR + conquestName + ".dat")) {
|
||||
SOptionPane.showMessageDialog("A quest already exists with that name. Please pick another quest name.");
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
startNewConquest(conquestName);
|
||||
}
|
||||
|
||||
private void startNewConquest(final String conquestName) {
|
||||
FThreads.invokeInEdtLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
LoadingOverlay.show("Creating new quest...", new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
ConquestController qc = FModel.getConquest();
|
||||
qc.load(new ConquestData(conquestName, getSelectedDifficulty(), cbxStartingPlane.getSelectedItem(), lstCommanders.getSelectedItem()));
|
||||
qc.save();
|
||||
|
||||
// Save in preferences.
|
||||
FModel.getConquestPreferences().setPref(CQPref.CURRENT_CONQUEST, conquestName + ".dat");
|
||||
FModel.getConquestPreferences().save();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
package forge.toolbox;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
@@ -35,19 +34,19 @@ public class FChoiceList<T> extends FList<T> {
|
||||
private final CompactModeHandler compactModeHandler = new CompactModeHandler();
|
||||
private final List<Integer> selectedIndices = new ArrayList<Integer>();
|
||||
|
||||
public FChoiceList(Collection<? extends T> items) {
|
||||
public FChoiceList(Iterable<? extends T> items) {
|
||||
this(items, null);
|
||||
}
|
||||
protected FChoiceList(Collection<? extends T> items, T typeItem) {
|
||||
protected FChoiceList(Iterable<? extends T> items, T typeItem) {
|
||||
this(items, 0, 1, typeItem);
|
||||
if (items.size() > 0) {
|
||||
if (getCount() > 0) {
|
||||
addSelectedIndex(0); //select first item by default
|
||||
}
|
||||
}
|
||||
public FChoiceList(Collection<? extends T> items, int minChoices0, int maxChoices0) {
|
||||
public FChoiceList(Iterable<? extends T> items, int minChoices0, int maxChoices0) {
|
||||
this(items, minChoices0, maxChoices0, null);
|
||||
}
|
||||
protected FChoiceList(Collection<? extends T> items, int minChoices0, int maxChoices0, T typeItem) {
|
||||
protected FChoiceList(Iterable<? extends T> items, int minChoices0, int maxChoices0, T typeItem) {
|
||||
super(items);
|
||||
minChoices = minChoices0;
|
||||
maxChoices = maxChoices0;
|
||||
|
||||
Reference in New Issue
Block a user