mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 11:18:01 +00:00
Releasing the beast: fully refactored quest submenu, featuring multiple quest support, preference editor, submenu tabs, and a host of other tools (and updates).
This commit is contained in:
9
.gitattributes
vendored
9
.gitattributes
vendored
@@ -10235,6 +10235,8 @@ res/images/icons/GoldIcon.png -text svneol=unset#image/png
|
||||
res/images/icons/GoldIconLarge.png -text svneol=unset#image/png
|
||||
res/images/icons/GoldIconSmall.png -text svneol=unset#image/png
|
||||
res/images/icons/HeartIcon.png -text svneol=unset#image/png
|
||||
res/images/icons/IconMinus.png -text
|
||||
res/images/icons/IconPlus.png -text
|
||||
res/images/icons/LeafIconSmall.png -text svneol=unset#image/png
|
||||
res/images/icons/Life.png -text svneol=unset#image/png
|
||||
res/images/icons/Mage01.jpg -text
|
||||
@@ -11330,12 +11332,15 @@ src/main/java/forge/view/Main.java -text
|
||||
src/main/java/forge/view/editor/EditorTopLevel.java -text
|
||||
src/main/java/forge/view/editor/package-info.java svneol=native#text/plain
|
||||
src/main/java/forge/view/home/HomeTopLevel.java -text
|
||||
src/main/java/forge/view/home/QuestFileLister.java -text
|
||||
src/main/java/forge/view/home/SplashFrame.java -text
|
||||
src/main/java/forge/view/home/StartButton.java -text
|
||||
src/main/java/forge/view/home/SubButton.java -text
|
||||
src/main/java/forge/view/home/SubTab.java -text
|
||||
src/main/java/forge/view/home/ViewConstructed.java -text
|
||||
src/main/java/forge/view/home/ViewDraft.java -text
|
||||
src/main/java/forge/view/home/ViewQuest.java -text
|
||||
src/main/java/forge/view/home/ViewQuestPreferences.java -text
|
||||
src/main/java/forge/view/home/ViewSealed.java -text
|
||||
src/main/java/forge/view/home/ViewSettings.java -text
|
||||
src/main/java/forge/view/home/ViewUtilities.java -text
|
||||
@@ -11356,13 +11361,17 @@ src/main/java/forge/view/toolbox/CardFaceSymbols.java svneol=native#text/plain
|
||||
src/main/java/forge/view/toolbox/CardViewer.java -text
|
||||
src/main/java/forge/view/toolbox/DeckLister.java -text
|
||||
src/main/java/forge/view/toolbox/FButton.java -text
|
||||
src/main/java/forge/view/toolbox/FCheckBox.java -text
|
||||
src/main/java/forge/view/toolbox/FLabel.java -text
|
||||
src/main/java/forge/view/toolbox/FList.java -text
|
||||
src/main/java/forge/view/toolbox/FOverlay.java -text
|
||||
src/main/java/forge/view/toolbox/FPanel.java -text
|
||||
src/main/java/forge/view/toolbox/FProgressBar.java -text
|
||||
src/main/java/forge/view/toolbox/FRadioButton.java -text
|
||||
src/main/java/forge/view/toolbox/FRoundedPanel.java -text
|
||||
src/main/java/forge/view/toolbox/FScrollPane.java -text
|
||||
src/main/java/forge/view/toolbox/FSkin.java -text
|
||||
src/main/java/forge/view/toolbox/FTextArea.java -text
|
||||
src/main/java/forge/view/toolbox/FVerticalTabPanel.java -text
|
||||
src/main/java/forge/view/toolbox/package-info.java svneol=native#text/plain
|
||||
src/main/java/net/slightlymagic/braids/LICENSE.txt svneol=native#text/plain
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -96,6 +96,7 @@ res/pics/ZEN
|
||||
res/pics/booster
|
||||
res/pics/icons
|
||||
res/pics/tokens
|
||||
res/quest/data
|
||||
res/quest/questData.dat
|
||||
res/quest/questData.dat.xml
|
||||
res/reprintSetInfo.log
|
||||
|
||||
BIN
res/images/icons/IconMinus.png
Normal file
BIN
res/images/icons/IconMinus.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.0 KiB |
BIN
res/images/icons/IconPlus.png
Normal file
BIN
res/images/icons/IconPlus.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.1 KiB |
@@ -1,30 +1,61 @@
|
||||
difficultyString=Easy,Normal,Hard,Very Hard
|
||||
# Num of Wins for each Difficulty to gain a Booster, Rank, Duel vs Tougher AI Decks
|
||||
winsForBooster=1,1,2,2
|
||||
winsForRankIncrease=3,4,5,6
|
||||
winsForMediumAI=10,9,8,7
|
||||
winsForHardAI=20,18,16,14
|
||||
winsForVeryHardAI=40,36,32,28
|
||||
# When starting a quest this is how much of each type you'll start with. Plus your starting Credits.
|
||||
startingBasicLand=20
|
||||
startingSnowBasicLand=5
|
||||
startingCommons=82,80,78,76
|
||||
startingUncommons=20,18,16,15
|
||||
startingRares=10,10,10,8
|
||||
startingCredits=250
|
||||
# When winning a booster pack, this is what you'll expect to see in a pack.
|
||||
boosterPackCommon=11
|
||||
boosterPackUncommon=3
|
||||
boosterPackRare=1
|
||||
# Match rewards that are used by the quest system
|
||||
matchRewardBase=25
|
||||
matchRewardTotalWins=0.3
|
||||
matchRewardNoLosses=25
|
||||
matchRewardPoisonWinBonus=50
|
||||
matchRewardMilledWinBonus=40
|
||||
matchRewardAltWinBonus=100
|
||||
matchRewardWinOnFirstTurn=1500
|
||||
matchRewardWinByTurnFive=250
|
||||
matchRewardWinByTurnTen=50
|
||||
matchRewardWinByTurnFifteen=5
|
||||
matchRewardMullToZero=500
|
||||
BOOSTER_COMMONS=11
|
||||
BOOSTER_UNCOMMONS=3
|
||||
BOOSTER_RARES=1
|
||||
REWARDS_BASE=30
|
||||
REWARDS_UNDEFEATED=25
|
||||
REWARDS_WINS_MULTIPLIER=0.3
|
||||
REWARDS_POISON=50
|
||||
REWARDS_MILLED=40
|
||||
REWARDS_MULLIGAN0=500
|
||||
REWARDS_ALTERNATIVE=100
|
||||
REWARDS_TURN15=5
|
||||
REWARDS_TURN10=50
|
||||
REWARDS_TURN5=250
|
||||
REWARDS_TURN1=1500
|
||||
STARTING_BASIC_LANDS=20
|
||||
STARTING_SNOW_LANDS=5
|
||||
|
||||
STARTING_COMMONS_EASY=82
|
||||
STARTING_COMMONS_MEDIUM=80
|
||||
STARTING_COMMONS_HARD=78
|
||||
STARTING_COMMONS_EXPERT=76
|
||||
|
||||
STARTING_UNCOMMONS_EASY=40
|
||||
STARTING_UNCOMMONS_MEDIUM=36
|
||||
STARTING_UNCOMMONS_HARD=32
|
||||
STARTING_UNCOMMONS_EXPERT=28
|
||||
|
||||
STARTING_RARES_EASY=20
|
||||
STARTING_RARES_MEDIUM=18
|
||||
STARTING_RARES_HARD=16
|
||||
STARTING_RARES_EXPERT=15
|
||||
|
||||
STARTING_CREDITS_EASY=250
|
||||
STARTING_CREDITS_MEDIUM=200
|
||||
STARTING_CREDITS_HARD=150
|
||||
STARTING_CREDITS_EXPERT=100
|
||||
|
||||
WINS_BOOSTER_EASY=1
|
||||
WINS_BOOSTER_MEDIUM=1
|
||||
WINS_BOOSTER_HARD=2
|
||||
WINS_BOOSTER_EXPERT=2
|
||||
|
||||
WINS_RANKUP_EASY=3
|
||||
WINS_RANKUP_MEDIUM=4
|
||||
WINS_RANKUP_HARD=5
|
||||
WINS_RANKUP_EXPERT=6
|
||||
|
||||
WINS_MEDIUMAI_EASY=10
|
||||
WINS_MEDIUMAI_MEDIUM=9
|
||||
WINS_MEDIUMAI_HARD=8
|
||||
WINS_MEDIUMAI_EXPERT=7
|
||||
|
||||
WINS_HARDAI_EASY=20
|
||||
WINS_HARDAI_MEDIUM=18
|
||||
WINS_HARDAI_HARD=16
|
||||
WINS_HARDAI_EXPERT=14
|
||||
|
||||
WINS_EXPERTAI_EASY=40
|
||||
WINS_EXPERTAI_MEDIUM=36
|
||||
WINS_EXPERTAI_HARD=32
|
||||
WINS_EXPERTAI_EXPERT=28
|
||||
|
||||
@@ -190,6 +190,11 @@ public class FControl {
|
||||
return this.home;
|
||||
}
|
||||
|
||||
/** @return HomeTopLevel */
|
||||
public ControlHomeUI getHomeController() {
|
||||
return this.home.getController();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the match view.
|
||||
*
|
||||
|
||||
@@ -4,23 +4,35 @@ import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.io.File;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import forge.AllZone;
|
||||
import forge.Command;
|
||||
import forge.Constant;
|
||||
import forge.Singletons;
|
||||
import forge.control.FControl;
|
||||
import forge.deck.Deck;
|
||||
import forge.game.GameType;
|
||||
import forge.gui.GuiUtils;
|
||||
import forge.gui.deckeditor.DeckEditorQuest;
|
||||
import forge.gui.deckeditor.DeckEditorShop;
|
||||
import forge.quest.data.QuestChallenge;
|
||||
import forge.quest.data.QuestData;
|
||||
import forge.quest.data.QuestDataIO;
|
||||
import forge.quest.data.QuestEvent;
|
||||
import forge.quest.data.QuestEventManager;
|
||||
import forge.quest.data.QuestPreferences;
|
||||
import forge.quest.data.QuestPreferences.QPref;
|
||||
import forge.quest.data.QuestUtil;
|
||||
import forge.quest.data.item.QuestItemZeppelin;
|
||||
import forge.quest.data.pet.QuestPetAbstract;
|
||||
import forge.view.GuiTopLevel;
|
||||
import forge.view.home.ViewQuest;
|
||||
|
||||
@@ -31,20 +43,34 @@ import forge.view.home.ViewQuest;
|
||||
public class ControlQuest {
|
||||
private ViewQuest view;
|
||||
private QuestEvent event;
|
||||
private final ActionListener actPetSelect, actPlantSelect;
|
||||
private final MouseAdapter madStartGame;
|
||||
private QuestData qData;
|
||||
private QuestPreferences qPrefs;
|
||||
private QuestEventManager qem;
|
||||
private JPanel selectedTab;
|
||||
|
||||
private final MouseAdapter madStartGame, madDuels, madChallenges,
|
||||
madQuests, madDecks, madPreferences;
|
||||
private final ActionListener actPetSelect, actPlantSelect,
|
||||
actSpellShop, actBazaar, actEmbark, actNewDeck, actCurrentDeck;
|
||||
private final Command cmdDeckExit, cmdDeckDelete, cmdDeckSelect,
|
||||
cmdQuestSelect, cmdQuestDelete;
|
||||
private Deck currentDeck;
|
||||
private Map<String, QuestData> arrQuests;
|
||||
|
||||
/**
|
||||
* Controls logic and listeners for quest mode in home screen.
|
||||
*
|
||||
* @param v0   ViewQuest
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public ControlQuest(ViewQuest v0) {
|
||||
// Inits
|
||||
this.view = v0;
|
||||
this.qem = new QuestEventManager();
|
||||
this.qPrefs = Singletons.getModel().getQuestPreferences();
|
||||
AllZone.setQuestEventManager(this.qem);
|
||||
|
||||
if (view.hasPreviousQuest()) {
|
||||
updateDeckList();
|
||||
}
|
||||
//========= Listener inits
|
||||
|
||||
// Game start logic must happen outside of the EDT.
|
||||
madStartGame = new MouseAdapter() {
|
||||
@@ -60,14 +86,33 @@ public class ControlQuest {
|
||||
}
|
||||
};
|
||||
|
||||
madDuels = new MouseAdapter() { @Override
|
||||
public void mouseClicked(MouseEvent e) { view.showDuelsTab(); } };
|
||||
|
||||
madChallenges = new MouseAdapter() { @Override
|
||||
public void mouseClicked(MouseEvent e) { view.showChallengesTab(); } };
|
||||
|
||||
madQuests = new MouseAdapter() { @Override
|
||||
public void mouseClicked(MouseEvent e) { view.showQuestsTab(); } };
|
||||
|
||||
madDecks = new MouseAdapter() { @Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
view.showDecksTab();
|
||||
if (ControlQuest.this.qem != null) { refreshDecks(); }
|
||||
}
|
||||
};
|
||||
|
||||
madPreferences = new MouseAdapter() { @Override
|
||||
public void mouseClicked(MouseEvent e) { view.showPrefsTab(); } };
|
||||
|
||||
actPetSelect = new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent actionEvent) {
|
||||
if (view.getPetComboBox().getSelectedIndex() > 0) {
|
||||
view.getQuestData().getPetManager().setSelectedPet(
|
||||
(String) view.getPetComboBox().getSelectedItem());
|
||||
if (view.getCbxPet().getSelectedIndex() > 0) {
|
||||
qData.getPetManager().setSelectedPet(
|
||||
(String) view.getCbxPet().getSelectedItem());
|
||||
} else {
|
||||
view.getQuestData().getPetManager().setSelectedPet(null);
|
||||
qData.getPetManager().setSelectedPet(null);
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -75,98 +120,162 @@ public class ControlQuest {
|
||||
actPlantSelect = new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent actionEvent) {
|
||||
view.getQuestData().getPetManager()
|
||||
.setUsePlant(view.getPlantCheckBox().isSelected());
|
||||
qData.getPetManager()
|
||||
.setUsePlant(view.getCbPlant().isSelected());
|
||||
}
|
||||
};
|
||||
|
||||
actSpellShop = new ActionListener() { @Override
|
||||
public void actionPerformed(ActionEvent e) { showSpellShop(); } };
|
||||
|
||||
actBazaar = new ActionListener() { @Override
|
||||
public void actionPerformed(ActionEvent e) { showBazaar(); } };
|
||||
|
||||
actEmbark = new ActionListener() { @Override
|
||||
public void actionPerformed(ActionEvent e) { newQuest(); } };
|
||||
|
||||
actCurrentDeck = new ActionListener() { @Override
|
||||
public void actionPerformed(ActionEvent e) { view.showDecksTab(); } };
|
||||
|
||||
actNewDeck = new ActionListener() { @Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
final DeckEditorQuest editor = new DeckEditorQuest(qData);
|
||||
editor.show(cmdDeckExit);
|
||||
editor.setVisible(true);
|
||||
}
|
||||
};
|
||||
|
||||
cmdDeckExit = new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
AllZone.getQuestData().saveData();
|
||||
refreshDecks();
|
||||
GuiTopLevel g = ((GuiTopLevel) AllZone.getDisplay());
|
||||
g.getController().getHomeView().getBtnQuest().grabFocus();
|
||||
}
|
||||
};
|
||||
|
||||
cmdDeckSelect = new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
currentDeck = view.getLstDecks().getSelectedDeck();
|
||||
view.setCurrentDeckStatus();
|
||||
}
|
||||
};
|
||||
|
||||
cmdDeckDelete = new Command() { @Override
|
||||
public void execute() { refreshDecks(); } };
|
||||
|
||||
cmdQuestSelect = new Command() { @Override
|
||||
public void execute() { changeQuest(); } };
|
||||
|
||||
cmdQuestDelete = new Command() { @Override
|
||||
public void execute() { refreshQuests(); } };
|
||||
|
||||
addListeners();
|
||||
}
|
||||
|
||||
private void addListeners() {
|
||||
if (view.hasPreviousQuest()) {
|
||||
view.getBtnStart().removeMouseListener(madStartGame);
|
||||
view.getBtnStart().addMouseListener(madStartGame);
|
||||
|
||||
view.getPetComboBox().removeActionListener(actPetSelect);
|
||||
view.getPetComboBox().addActionListener(actPetSelect);
|
||||
|
||||
view.getPlantCheckBox().removeActionListener(actPlantSelect);
|
||||
view.getPlantCheckBox().addActionListener(actPlantSelect);
|
||||
}
|
||||
}
|
||||
|
||||
/** @return ViewQuest */
|
||||
public ViewQuest getView() {
|
||||
return view;
|
||||
}
|
||||
|
||||
/** */
|
||||
private void updateDeckList() {
|
||||
view.getLstDeckChooser().setListData(AllZone.getQuestData().getDeckNames().toArray());
|
||||
view.getLstDeckChooser().setSelectedIndex(0);
|
||||
/** @return {@link forge.quest.gui.main.QuestEventManager} */
|
||||
public QuestEventManager getQEM() {
|
||||
return this.qem;
|
||||
}
|
||||
|
||||
/** */
|
||||
public void showDeckEditor() {
|
||||
final Command exit = new Command() {
|
||||
private static final long serialVersionUID = -5110231879431074581L;
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
// saves all deck data
|
||||
AllZone.getQuestData().saveData();
|
||||
updateDeckList();
|
||||
}
|
||||
};
|
||||
|
||||
DeckEditorQuest g = new DeckEditorQuest(AllZone.getQuestData());
|
||||
g.show(exit);
|
||||
g.setVisible(true);
|
||||
/** @return {@link forge.Command} What to do when the deck editor exits. */
|
||||
public Command getExitCommand() {
|
||||
return cmdDeckExit;
|
||||
}
|
||||
|
||||
private void updateCredits() {
|
||||
view.getLblCredits().setText(Long.toString(view.getQuestData().getCredits()));
|
||||
/** @return String   indicates the rank of this current quest */
|
||||
public String getRankString() {
|
||||
return qData.getRank();
|
||||
}
|
||||
|
||||
private void updateLife() {
|
||||
view.getLblLife().setText(Long.toString(view.getQuestData().getLife()));
|
||||
/** @return forge.deck.Deck */
|
||||
public Deck getCurrentDeck() {
|
||||
return this.currentDeck;
|
||||
}
|
||||
|
||||
/** */
|
||||
public void showCardShop() {
|
||||
final Command exit = new Command() {
|
||||
private static final long serialVersionUID = 8567193482568076362L;
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
// saves all deck data
|
||||
AllZone.getQuestData().saveData();
|
||||
updateDeckList();
|
||||
updateCredits();
|
||||
//updateLife();
|
||||
}
|
||||
};
|
||||
|
||||
DeckEditorShop g = new DeckEditorShop(AllZone.getQuestData());
|
||||
g.show(exit);
|
||||
g.setVisible(true);
|
||||
/** @return */
|
||||
public Map<String, QuestData> getAllQuests() {
|
||||
return arrQuests;
|
||||
}
|
||||
|
||||
/** */
|
||||
public void showBazaar() {
|
||||
GuiTopLevel g = ((GuiTopLevel) AllZone.getDisplay());
|
||||
/**
|
||||
* Updates visual state of tabber.
|
||||
* @param tab0   JPanel tab object (can pass SubTab too).
|
||||
*/
|
||||
public void updateTabber(JPanel tab0) {
|
||||
if (selectedTab != null) {
|
||||
selectedTab.setEnabled(false);
|
||||
}
|
||||
|
||||
g.getController().changeState(FControl.QUEST_BAZAAR);
|
||||
g.validate();
|
||||
} // card shop button
|
||||
tab0.setEnabled(true);
|
||||
selectedTab = tab0;
|
||||
}
|
||||
|
||||
private void addListeners() {
|
||||
view.getTabDuels().removeMouseListener(madDuels);
|
||||
view.getTabDuels().addMouseListener(madDuels);
|
||||
|
||||
view.getTabChallenges().removeMouseListener(madChallenges);
|
||||
view.getTabChallenges().addMouseListener(madChallenges);
|
||||
|
||||
view.getTabDecks().removeMouseListener(madDecks);
|
||||
view.getTabDecks().addMouseListener(madDecks);
|
||||
|
||||
view.getTabQuests().removeMouseListener(madQuests);
|
||||
view.getTabQuests().addMouseListener(madQuests);
|
||||
|
||||
view.getTabPreferences().removeMouseListener(madPreferences);
|
||||
view.getTabPreferences().addMouseListener(madPreferences);
|
||||
|
||||
view.getBtnEmbark().removeActionListener(actEmbark);
|
||||
view.getBtnEmbark().addActionListener(actEmbark);
|
||||
|
||||
view.getLstQuests().setSelectCommand(cmdQuestSelect);
|
||||
view.getLstQuests().setEditCommand(cmdQuestDelete);
|
||||
view.getLstQuests().setDeleteCommand(cmdQuestDelete);
|
||||
|
||||
if (this.qem != null) {
|
||||
view.getBtnStart().removeMouseListener(madStartGame);
|
||||
view.getBtnStart().addMouseListener(madStartGame);
|
||||
|
||||
view.getBtnBazaar().removeActionListener(actBazaar);
|
||||
view.getBtnBazaar().addActionListener(actBazaar);
|
||||
|
||||
view.getBtnNewDeck().removeActionListener(actNewDeck);
|
||||
view.getBtnNewDeck().addActionListener(actNewDeck);
|
||||
|
||||
view.getBtnCurrentDeck().removeActionListener(actCurrentDeck);
|
||||
view.getBtnCurrentDeck().addActionListener(actCurrentDeck);
|
||||
|
||||
view.getBtnSpellShop().removeActionListener(actSpellShop);
|
||||
view.getBtnSpellShop().addActionListener(actSpellShop);
|
||||
|
||||
view.getCbxPet().removeActionListener(actPetSelect);
|
||||
view.getCbxPet().addActionListener(actPetSelect);
|
||||
|
||||
view.getCbPlant().removeActionListener(actPlantSelect);
|
||||
view.getCbPlant().addActionListener(actPlantSelect);
|
||||
|
||||
view.getLstDecks().setSelectCommand(cmdDeckSelect);
|
||||
view.getLstDecks().setDeleteCommand(cmdDeckDelete);
|
||||
|
||||
view.getLstDecks().setExitCommand(cmdDeckExit);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The actuator for new quests.
|
||||
*/
|
||||
public void newQuest() {
|
||||
private void newQuest() {
|
||||
int difficulty = 0;
|
||||
QuestData questData = new QuestData();
|
||||
QuestData newdata = new QuestData();
|
||||
|
||||
final String mode = view.getRadFantasy().isSelected()
|
||||
? forge.quest.data.QuestData.FANTASY
|
||||
@@ -181,32 +290,197 @@ public class ControlQuest {
|
||||
} else if (view.getRadExpert().isSelected()) {
|
||||
difficulty = 3;
|
||||
} else {
|
||||
JOptionPane.showMessageDialog(null,
|
||||
"This should not be happening!",
|
||||
"New Quest: Difficulty Bug!?", JOptionPane.ERROR_MESSAGE);
|
||||
throw new IllegalStateException(
|
||||
"ControlQuest() > newQuest(): Error starting new quest!");
|
||||
}
|
||||
|
||||
final Object o = JOptionPane.showInputDialog(null, "Poets will remember your quest as:", "Quest Name", JOptionPane.OK_CANCEL_OPTION);
|
||||
|
||||
if (o == null) { return; }
|
||||
|
||||
final String questName = GuiUtils.cleanString(o.toString());
|
||||
|
||||
if (getAllQuests().get(questName) != null || questName.equals("")) {
|
||||
JOptionPane.showMessageDialog(null, "Please pick another quest name, a quest already has that name.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (questData.hasSaveFile()) {
|
||||
// this will overwrite your save file!
|
||||
final Object[] possibleValues = { "Yes", "No" };
|
||||
final Object choice = JOptionPane.showOptionDialog(null,
|
||||
"Starting a new quest will overwrite your current quest. Continue?", "Start New Quest?",
|
||||
JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, possibleValues, possibleValues[1]);
|
||||
// Give the user a few cards to build a deck
|
||||
newdata.newGame(difficulty, mode, view.getCbStandardStart().isSelected());
|
||||
newdata.setName(questName);
|
||||
newdata.saveData();
|
||||
|
||||
if (!choice.equals(0)) {
|
||||
return;
|
||||
view.getParentView().resetQuest();
|
||||
} // New Quest
|
||||
|
||||
private void changeQuest() {
|
||||
AllZone.setQuestData(view.getLstQuests().getSelectedQuest());
|
||||
this.qData = AllZone.getQuestData();
|
||||
this.qem = new QuestEventManager();
|
||||
this.qem.assembleAllEvents();
|
||||
AllZone.setQuestEventManager(this.qem);
|
||||
|
||||
refreshDecks();
|
||||
refreshStats();
|
||||
}
|
||||
|
||||
/** Resets quests, then retrieves and sets current quest. */
|
||||
public void refreshQuests() {
|
||||
File dirQuests = new File("res/quest/data/");
|
||||
|
||||
// Temporary transition code between v1.2.2 and v1.2.3.
|
||||
// Can be safely deleted after release of 1.2.3.
|
||||
if (!dirQuests.exists()) {
|
||||
dirQuests.mkdirs();
|
||||
}
|
||||
File olddata = new File("res/quest/questData.dat");
|
||||
File newpath = new File(dirQuests.getPath() + "questData.dat");
|
||||
|
||||
if (olddata.exists()) { olddata.renameTo(newpath); }
|
||||
// end block which can be deleted
|
||||
|
||||
// Iterate over files and load quest datas for each.
|
||||
File[] arrFiles = dirQuests.listFiles();
|
||||
arrQuests = new HashMap<String, QuestData>();
|
||||
for (File f : arrFiles) {
|
||||
arrQuests.put(f.getName(), QuestDataIO.loadData(f));
|
||||
}
|
||||
|
||||
// Populate list with available quest datas.
|
||||
view.getLstQuests().setQuests(arrQuests.values().toArray(new QuestData[0]));
|
||||
|
||||
// If there are quests available, force select.
|
||||
if (arrQuests.size() > 0) {
|
||||
final String questname = qPrefs.getPreference(QPref.CURRENT_QUEST);
|
||||
|
||||
// Attempt to select previous quest.
|
||||
if (arrQuests.get(questname) != null) {
|
||||
view.getLstQuests().setSelectedQuestData(arrQuests.get(questname));
|
||||
}
|
||||
else {
|
||||
view.getLstQuests().setSelectedIndex(0);
|
||||
}
|
||||
|
||||
// Save in preferences.
|
||||
qPrefs.setPreference(QPref.CURRENT_QUEST,
|
||||
view.getLstQuests().getSelectedQuest().getName());
|
||||
|
||||
// Drop into AllZone.
|
||||
AllZone.setQuestData(view.getLstQuests().getSelectedQuest());
|
||||
}
|
||||
else {
|
||||
AllZone.setQuestData(null);
|
||||
}
|
||||
|
||||
this.qData = AllZone.getQuestData();
|
||||
|
||||
if (qem.getAllDuels() == null) {
|
||||
qem.assembleAllEvents();
|
||||
}
|
||||
}
|
||||
|
||||
/** Resets decks, then retrieves and sets current deck. */
|
||||
public void refreshDecks() {
|
||||
Deck[] temp = (qData == null ? new Deck[] {} : qData.getDecks().toArray(new Deck[0]));
|
||||
|
||||
view.getLstDecks().setDecks(temp);
|
||||
|
||||
if (!view.getLstDecks().setSelectedDeck(currentDeck)) {
|
||||
if (!view.getLstDecks().setSelectedIndex(0)) {
|
||||
currentDeck = null;
|
||||
}
|
||||
else {
|
||||
currentDeck = view.getLstDecks().getSelectedDeck();
|
||||
}
|
||||
}
|
||||
|
||||
// give the user a few cards to build a deck
|
||||
questData.newGame(difficulty, mode, view.getCbStandardStart().isSelected());
|
||||
view.setCurrentDeckStatus();
|
||||
}
|
||||
|
||||
questData.saveData();
|
||||
/** Updates all statistics in several panels. */
|
||||
public void refreshStats() {
|
||||
if (qData == null) { return; }
|
||||
|
||||
// set global variable
|
||||
AllZone.setQuestData(questData);
|
||||
view.getParentView().resetQuest();
|
||||
// Stats panel
|
||||
view.getLblCredits().setText("Credits: " + qData.getCredits());
|
||||
view.getLblLife().setText("Life: " + qData.getLife());
|
||||
view.getLblWins().setText("Wins: " + qData.getWin());
|
||||
view.getLblLosses().setText("Losses: " + qData.getLost());
|
||||
view.getBarProgress().setVisible(false);
|
||||
view.setCurrentDeckStatus();
|
||||
|
||||
final int num = nextChallengeInWins();
|
||||
if (num == 0) {
|
||||
view.getLblNextChallengeInWins().setText("Next challenge available now.");
|
||||
}
|
||||
else {
|
||||
view.getLblNextChallengeInWins().setText("Next challenge available in " + num + " wins.");
|
||||
}
|
||||
|
||||
view.getLblWinStreak().setText(
|
||||
"Win streak: " + qData.getWinStreakCurrent()
|
||||
+ " (Best:" + qData.getWinStreakBest() + ")");
|
||||
|
||||
// Start panel: pet, plant, zep.
|
||||
if (this.qData.getMode().equals(QuestData.FANTASY)) {
|
||||
final Set<String> petList = this.qData.getPetManager().getAvailablePetNames();
|
||||
final QuestPetAbstract currentPet = this.qData.getPetManager().getSelectedPet();
|
||||
|
||||
// Pet list visibility
|
||||
if (petList.size() > 0) {
|
||||
view.getCbxPet().setEnabled(true);
|
||||
view.getCbxPet().addItem("Don't summon a pet");
|
||||
for (final String pet : petList) {
|
||||
view.getCbxPet().addItem("Summon " + pet);
|
||||
}
|
||||
|
||||
if (currentPet != null) { view.getCbxPet().setSelectedItem(currentPet.getName()); }
|
||||
} else {
|
||||
view.getCbxPet().setVisible(false);
|
||||
}
|
||||
|
||||
// Plant visiblity
|
||||
if (this.qData.getPetManager().getPlant().getLevel() == 0) {
|
||||
view.getCbPlant().setVisible(false);
|
||||
}
|
||||
else {
|
||||
view.getCbPlant().setVisible(true);
|
||||
view.getCbPlant().setSelected(this.qData.getPetManager().shouldPlantBeUsed());
|
||||
}
|
||||
|
||||
// Zeppelin visibility
|
||||
final QuestItemZeppelin zeppelin = (QuestItemZeppelin) this.qData.getInventory().getItem("Zeppelin");
|
||||
view.getCbZep().setVisible(zeppelin.hasBeenUsed());
|
||||
}
|
||||
else {
|
||||
view.getCbxPet().setVisible(false);
|
||||
view.getCbPlant().setVisible(false);
|
||||
view.getCbZep().setVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
/** */
|
||||
@SuppressWarnings("serial")
|
||||
private void showSpellShop() {
|
||||
final Command exit = new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
AllZone.getQuestData().saveData();
|
||||
refreshStats();
|
||||
}
|
||||
};
|
||||
|
||||
DeckEditorShop g = new DeckEditorShop(AllZone.getQuestData());
|
||||
g.show(exit);
|
||||
g.setVisible(true);
|
||||
}
|
||||
|
||||
/** */
|
||||
private void showBazaar() {
|
||||
GuiTopLevel g = ((GuiTopLevel) AllZone.getDisplay());
|
||||
|
||||
g.getController().changeState(FControl.QUEST_BAZAAR);
|
||||
g.validate();
|
||||
}
|
||||
|
||||
/** */
|
||||
@@ -216,7 +490,7 @@ public class ControlQuest {
|
||||
"ControlQuest() > startGame() must be accessed from outside the event dispatch thread.");
|
||||
}
|
||||
|
||||
if (view.getLstDeckChooser().getSelectedIndex() == -1) {
|
||||
if (currentDeck == null) {
|
||||
JOptionPane.showMessageDialog(null,
|
||||
"A mysterious wall blocks your way."
|
||||
+ "\n\rAn unseen sepulchral voice booms:"
|
||||
@@ -225,6 +499,8 @@ public class ControlQuest {
|
||||
return;
|
||||
}
|
||||
|
||||
view.getBarProgress().setVisible(true);
|
||||
|
||||
// If everything is OK, show progress bar and start inits.
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
@@ -242,9 +518,9 @@ public class ControlQuest {
|
||||
event = view.getSelectedOpponent().getEvent();
|
||||
AllZone.setQuestEvent(event);
|
||||
Constant.Runtime.setGameType(GameType.Quest);
|
||||
final QuestItemZeppelin zeppelin = (QuestItemZeppelin) view.getQuestData().getInventory().getItem("Zeppelin");
|
||||
final QuestItemZeppelin zeppelin = (QuestItemZeppelin) qData.getInventory().getItem("Zeppelin");
|
||||
zeppelin.setZeppelinUsed(false);
|
||||
view.getQuestData().randomizeOpponents();
|
||||
qData.randomizeOpponents();
|
||||
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
@@ -253,13 +529,8 @@ public class ControlQuest {
|
||||
}
|
||||
});
|
||||
|
||||
String deckname = (String) view.getLstDeckChooser().getSelectedValue();
|
||||
Constant.Runtime.HUMAN_DECK[0] = view.getQuestData().getDeck(deckname);
|
||||
Constant.Runtime.HUMAN_DECK[0] = currentDeck;
|
||||
Constant.Runtime.COMPUTER_DECK[0] = event.getEventDeck();
|
||||
final Deck humanDeck = view.getQuestData().getDeck(deckname);
|
||||
|
||||
Constant.Runtime.HUMAN_DECK[0] = humanDeck;
|
||||
|
||||
Constant.Quest.OPP_ICON_NAME[0] = event.getIcon();
|
||||
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@@ -278,11 +549,11 @@ public class ControlQuest {
|
||||
|
||||
AllZone.getMatchState().reset();
|
||||
if (event.getEventType().equals("challenge")) {
|
||||
setupChallenge(humanDeck);
|
||||
setupChallenge(currentDeck);
|
||||
} else {
|
||||
setupDuel(humanDeck);
|
||||
setupDuel(currentDeck);
|
||||
}
|
||||
view.getQuestData().saveData();
|
||||
qData.saveData();
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -295,15 +566,15 @@ public class ControlQuest {
|
||||
* @param humanDeck
|
||||
* a {@link forge.deck.Deck} object.
|
||||
*/
|
||||
final void setupDuel(final Deck humanDeck) {
|
||||
private void setupDuel(final Deck humanDeck) {
|
||||
final Deck computer = event.getEventDeck();
|
||||
Constant.Runtime.COMPUTER_DECK[0] = computer;
|
||||
|
||||
AllZone.getGameAction().newGame(
|
||||
Constant.Runtime.HUMAN_DECK[0], Constant.Runtime.COMPUTER_DECK[0],
|
||||
QuestUtil.getHumanStartingCards(view.getQuestData()),
|
||||
QuestUtil.getComputerStartingCards(view.getQuestData()),
|
||||
view.getQuestData().getLife(), 20);
|
||||
QuestUtil.getHumanStartingCards(qData),
|
||||
QuestUtil.getComputerStartingCards(qData),
|
||||
qData.getLife(), 20);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -317,15 +588,45 @@ public class ControlQuest {
|
||||
private void setupChallenge(final Deck humanDeck) {
|
||||
int extraLife = 0;
|
||||
|
||||
if (view.getQuestData().getInventory().getItemLevel("Gear") == 2) {
|
||||
if (qData.getInventory().getItemLevel("Gear") == 2) {
|
||||
extraLife = 3;
|
||||
}
|
||||
|
||||
AllZone.getGameAction().newGame(
|
||||
Constant.Runtime.HUMAN_DECK[0], Constant.Runtime.COMPUTER_DECK[0],
|
||||
QuestUtil.getHumanStartingCards(view.getQuestData(), event),
|
||||
QuestUtil.getComputerStartingCards(view.getQuestData(), event),
|
||||
view.getQuestData().getLife() + extraLife, ((QuestChallenge) event).getAILife());
|
||||
QuestUtil.getHumanStartingCards(qData, event),
|
||||
QuestUtil.getComputerStartingCards(qData, event),
|
||||
qData.getLife() + extraLife, ((QuestChallenge) event).getAILife());
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* nextChallengeInWins.
|
||||
* </p>
|
||||
*
|
||||
* @return a int.
|
||||
*/
|
||||
private int nextChallengeInWins() {
|
||||
// Number of wins was 25, lowering the number to 20 to help short term
|
||||
// questers.
|
||||
if (qData.getWin() < 20) {
|
||||
return 20 - qData.getWin();
|
||||
}
|
||||
|
||||
// The int mul has been lowered by one, should face special opps more
|
||||
// frequently.
|
||||
final int challengesPlayed = qData.getChallengesPlayed();
|
||||
int mul = 5;
|
||||
|
||||
if (qData.getInventory().hasItem("Zeppelin")) {
|
||||
mul = 3;
|
||||
} else if (qData.getInventory().hasItem("Map")) {
|
||||
mul = 4;
|
||||
}
|
||||
|
||||
final int delta = (challengesPlayed * mul) - qData.getWin();
|
||||
|
||||
return (delta > 0) ? delta : 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -409,4 +409,23 @@ public final class GuiUtils {
|
||||
overlay.removeAll();
|
||||
overlay.hideOverlay();
|
||||
}
|
||||
|
||||
/** Duplicate in DeckEditorQuestMenu and
|
||||
* probably elsewhere...can streamline at some point.
|
||||
*
|
||||
* @param in   {@link java.lang.String}
|
||||
* @return {@link java.lang.String}
|
||||
*/
|
||||
public static String cleanString(final String in) {
|
||||
final StringBuffer out = new StringBuffer();
|
||||
final char[] c = in.toCharArray();
|
||||
|
||||
for (int i = 0; (i < c.length) && (i < 20); i++) {
|
||||
if (Character.isLetterOrDigit(c[i]) || (c[i] == '-') || (c[i] == '_') || (c[i] == ' ')) {
|
||||
out.append(c[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return out.toString();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,6 +36,7 @@ import forge.gui.input.InputControl;
|
||||
import forge.properties.ForgePreferences;
|
||||
import forge.properties.ForgeProps;
|
||||
import forge.properties.NewConstants;
|
||||
import forge.quest.data.QuestPreferences;
|
||||
import forge.util.FileUtil;
|
||||
import forge.util.HttpUtil;
|
||||
|
||||
@@ -57,7 +58,8 @@ public class FModel {
|
||||
private BuildInfo buildInfo;
|
||||
|
||||
/** The preferences. */
|
||||
private ForgePreferences preferences;
|
||||
private final QuestPreferences questPreferences;
|
||||
private final ForgePreferences preferences;
|
||||
private FGameState gameState;
|
||||
|
||||
/**
|
||||
@@ -84,12 +86,14 @@ public class FModel {
|
||||
|
||||
// Instantiate preferences
|
||||
try {
|
||||
this.setPreferences(new ForgePreferences("forge.preferences"));
|
||||
this.preferences = new ForgePreferences("forge.preferences");
|
||||
} catch (final Exception exn) {
|
||||
// Log.error("Error loading preferences: " + exn);
|
||||
throw new RuntimeException(exn);
|
||||
}
|
||||
|
||||
// Instantiate quest preferences
|
||||
this.questPreferences = new QuestPreferences();
|
||||
|
||||
// TODO this single setting from preferences should not be here, or,
|
||||
// it should be here with all the other settings at the same time.
|
||||
// Unfortunately, they're tied up in legacy code in the Display interface,
|
||||
@@ -269,9 +273,9 @@ public class FModel {
|
||||
return this.preferences;
|
||||
}
|
||||
|
||||
/** @param fp0 {@link forge.properties.ForgePreferences} */
|
||||
public final void setPreferences(final ForgePreferences fp0) {
|
||||
this.preferences = fp0;
|
||||
/** @return {@link forge.quest.data.QuestPreferences} */
|
||||
public final QuestPreferences getQuestPreferences() {
|
||||
return this.questPreferences;
|
||||
}
|
||||
|
||||
/** @return {@link forge.model.FGameState} */
|
||||
|
||||
@@ -24,6 +24,7 @@ import java.util.Map;
|
||||
|
||||
import net.slightlymagic.maxmtg.Predicate;
|
||||
import forge.SetUtils;
|
||||
import forge.Singletons;
|
||||
import forge.deck.Deck;
|
||||
import forge.error.ErrorViewer;
|
||||
import forge.item.CardPrinted;
|
||||
@@ -31,6 +32,7 @@ import forge.item.InventoryItem;
|
||||
import forge.item.ItemPool;
|
||||
import forge.properties.ForgeProps;
|
||||
import forge.properties.NewConstants;
|
||||
import forge.quest.data.QuestPreferences.QPref;
|
||||
import forge.quest.data.item.QuestInventory;
|
||||
import forge.quest.data.pet.QuestPetManager;
|
||||
import forge.util.MyRandom;
|
||||
@@ -68,6 +70,10 @@ public final class QuestData {
|
||||
/** The lost. */
|
||||
private int lost;
|
||||
|
||||
private int winstreakBest = 0;
|
||||
|
||||
private int winstreakCurrent = 0;
|
||||
|
||||
/** The credits. */
|
||||
private long credits; // this money is good for all modes
|
||||
|
||||
@@ -93,6 +99,9 @@ public final class QuestData {
|
||||
/** The difficulty. */
|
||||
private String difficulty;
|
||||
|
||||
/** */
|
||||
private String name = "";
|
||||
|
||||
// Quest mode - there should be an enum :(
|
||||
/** The mode. */
|
||||
private String mode = "";
|
||||
@@ -170,15 +179,25 @@ public final class QuestData {
|
||||
"What Do You Do With The Other Hand?", "Freelance Sorcerer, Works Weekends",
|
||||
"Should We Hire Commentators?", "Saltblasted For Your Talent", "Serra Angel Is Your Girlfriend", };
|
||||
|
||||
/** */
|
||||
public QuestData() {
|
||||
this("An Unknown Quest");
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Constructor for QuestData.
|
||||
* </p>
|
||||
*
|
||||
* @param s0   String name
|
||||
*/
|
||||
public QuestData() {
|
||||
public QuestData(String s0) {
|
||||
this.initTransients();
|
||||
this.myCards.addBasicLands(this.getCardPool(), QuestPreferences.getStartingBasic(),
|
||||
QuestPreferences.getStartingSnowBasic());
|
||||
this.setName(s0);
|
||||
|
||||
this.myCards.addBasicLands(this.getCardPool(),
|
||||
Singletons.getModel().getQuestPreferences().getPreferenceInt(QPref.STARTING_BASIC_LANDS),
|
||||
Singletons.getModel().getQuestPreferences().getPreferenceInt(QPref.STARTING_BASIC_LANDS));
|
||||
this.randomizeOpponents();
|
||||
}
|
||||
|
||||
@@ -213,7 +232,7 @@ public final class QuestData {
|
||||
: CardPrinted.Predicates.Presets.IS_TRUE;
|
||||
|
||||
this.myCards.setupNewGameCardPool(filter, diff);
|
||||
this.setCredits(QuestPreferences.getStartingCredits());
|
||||
this.setCredits(Singletons.getModel().getQuestPreferences().getPreferenceInt(QPref.STARTING_CREDITS, diff));
|
||||
|
||||
this.mode = m0de;
|
||||
this.life = this.mode.equals(QuestData.FANTASY) ? 15 : 20;
|
||||
@@ -356,6 +375,12 @@ public final class QuestData {
|
||||
*/
|
||||
public void addLost() {
|
||||
this.lost++;
|
||||
|
||||
if (winstreakCurrent > winstreakBest) {
|
||||
winstreakBest = winstreakCurrent;
|
||||
}
|
||||
|
||||
winstreakCurrent = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -372,8 +397,13 @@ public final class QuestData {
|
||||
*/
|
||||
public void addWin() { // changes getRank()
|
||||
this.win++;
|
||||
this.winstreakCurrent++;
|
||||
|
||||
final int winsToLvlUp = QuestPreferences.getWinsForRankIncrease(this.diffIndex);
|
||||
if (winstreakCurrent > winstreakBest) {
|
||||
winstreakBest = winstreakCurrent;
|
||||
}
|
||||
|
||||
final int winsToLvlUp = Singletons.getModel().getQuestPreferences().getPreferenceInt(QPref.WINS_RANKUP, this.diffIndex);
|
||||
if ((this.win % winsToLvlUp) == 0) {
|
||||
this.rankIndex++;
|
||||
}
|
||||
@@ -480,14 +510,15 @@ public final class QuestData {
|
||||
|
||||
/**
|
||||
* Guess difficulty index.
|
||||
* NOTE: Used in old UI only, soon to be deprecated.
|
||||
*/
|
||||
public void guessDifficultyIndex() {
|
||||
final String[] diffStr = QuestPreferences.getDifficulty();
|
||||
/*final String[] diffStr = QuestPreferences.getDifficulty();
|
||||
for (int i = 0; i < diffStr.length; i++) {
|
||||
if (this.difficulty.equals(diffStr[i])) {
|
||||
this.diffIndex = i;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
// Level, read-only ( note: it increments in addWin() )
|
||||
@@ -512,6 +543,15 @@ public final class QuestData {
|
||||
return QuestData.RANK_TITLES[this.rankIndex];
|
||||
}
|
||||
|
||||
/** @return int */
|
||||
public int getWinStreakBest() {
|
||||
return this.winstreakBest;
|
||||
}
|
||||
|
||||
/** @return int */
|
||||
public int getWinStreakCurrent() {
|
||||
return this.winstreakCurrent;
|
||||
}
|
||||
// decks management
|
||||
/**
|
||||
* Gets the deck names.
|
||||
@@ -522,6 +562,11 @@ public final class QuestData {
|
||||
return new ArrayList<String>(this.getMyDecks().keySet());
|
||||
}
|
||||
|
||||
/** @return List<Deck> */
|
||||
public List<Deck> getDecks() {
|
||||
return new ArrayList<Deck>(this.getMyDecks().values());
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the deck.
|
||||
*
|
||||
@@ -684,7 +729,8 @@ public final class QuestData {
|
||||
this.myDecks = myDecks0;
|
||||
}
|
||||
|
||||
public static final QuestPreconManager getPreconManager() {
|
||||
/** @return QuestPreconManager */
|
||||
public static QuestPreconManager getPreconManager() {
|
||||
return preconManager;
|
||||
}
|
||||
|
||||
@@ -726,4 +772,14 @@ public final class QuestData {
|
||||
public void setVersionNumber(final int versionNumber0) {
|
||||
this.versionNumber = versionNumber0;
|
||||
}
|
||||
|
||||
/** @param s0   {@link java.lang.String} */
|
||||
public void setName(String s0) {
|
||||
this.name = s0;
|
||||
}
|
||||
|
||||
/** @return {@link java.lang.String} */
|
||||
public String getName() {
|
||||
return this.name;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,21 +74,27 @@ public class QuestDataIO {
|
||||
public QuestDataIO() {
|
||||
}
|
||||
|
||||
/** @return {@link forge.quest.data.QuestData} */
|
||||
public static QuestData loadData() {
|
||||
return QuestDataIO.loadData(ForgeProps.getFile(NewConstants.Quest.XMLDATA));
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* loadData.
|
||||
* </p>
|
||||
*
|
||||
* @return a {@link forge.quest.data.QuestData} object.
|
||||
* @param xmlSaveFile   {@link java.io.File}
|
||||
* @return {@link forge.quest.data.QuestData}
|
||||
*/
|
||||
public static QuestData loadData() {
|
||||
public static QuestData loadData(final File xmlSaveFile) {
|
||||
try {
|
||||
// read file "questData"
|
||||
QuestData data = null;
|
||||
String name = xmlSaveFile.getName()
|
||||
.substring(0, xmlSaveFile.getName().length() - 4);
|
||||
|
||||
final File xmlSaveFile = ForgeProps.getFile(NewConstants.Quest.XMLDATA);
|
||||
if (!xmlSaveFile.exists()) {
|
||||
return new QuestData();
|
||||
return new QuestData(name);
|
||||
}
|
||||
|
||||
final GZIPInputStream zin = new GZIPInputStream(new FileInputStream(xmlSaveFile));
|
||||
@@ -109,6 +115,7 @@ public class QuestDataIO {
|
||||
xStream.registerConverter(new GameTypeToXml());
|
||||
xStream.alias("CardPool", ItemPool.class);
|
||||
data = (QuestData) xStream.fromXML(xml.toString());
|
||||
data.setName(name);
|
||||
|
||||
if (data.getVersionNumber() != QuestData.CURRENT_VERSION_NUMBER) {
|
||||
QuestDataIO.updateSaveFile(data, xml.toString());
|
||||
@@ -193,7 +200,7 @@ public class QuestDataIO {
|
||||
xStream.registerConverter(new CardPoolToXml());
|
||||
xStream.alias("CardPool", ItemPool.class);
|
||||
|
||||
final File f = ForgeProps.getFile(NewConstants.Quest.XMLDATA);
|
||||
final File f = new File("res/quest/data/" + qd.getName() + ".dat");
|
||||
final BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(f));
|
||||
final GZIPOutputStream zout = new GZIPOutputStream(bout);
|
||||
xStream.toXML(qd, zout);
|
||||
|
||||
@@ -24,9 +24,11 @@ import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
import forge.AllZone;
|
||||
import forge.Singletons;
|
||||
import forge.deck.DeckIO;
|
||||
import forge.properties.ForgeProps;
|
||||
import forge.properties.NewConstants;
|
||||
import forge.quest.data.QuestPreferences.QPref;
|
||||
import forge.util.FileUtil;
|
||||
|
||||
/**
|
||||
@@ -58,6 +60,12 @@ public class QuestEventManager {
|
||||
/** The all challenges. */
|
||||
private List<QuestChallenge> allChallenges = null;
|
||||
|
||||
private final QuestPreferences qpref;
|
||||
|
||||
/** */
|
||||
public QuestEventManager() {
|
||||
this.qpref = Singletons.getModel().getQuestPreferences();
|
||||
}
|
||||
/**
|
||||
* <p>
|
||||
* assembleAllEvents.
|
||||
@@ -354,31 +362,32 @@ public class QuestEventManager {
|
||||
* @return an array of {@link java.lang.String} objects.
|
||||
*/
|
||||
public final List<QuestDuel> generateDuels() {
|
||||
if (AllZone.getQuestData() == null) { return null; }
|
||||
|
||||
final int index = AllZone.getQuestData().getDifficultyIndex();
|
||||
final List<QuestDuel> duelOpponents = new ArrayList<QuestDuel>();
|
||||
|
||||
if (AllZone.getQuestData().getWin() < QuestPreferences.getWinsForMediumAI(index)) {
|
||||
if (AllZone.getQuestData().getWin() < qpref.getPreferenceInt(QPref.WINS_MEDIUMAI, index)) {
|
||||
duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(this.easyAIduels, 0));
|
||||
duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(this.easyAIduels, 1));
|
||||
duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(this.easyAIduels, 2));
|
||||
} else if (AllZone.getQuestData().getWin() == QuestPreferences.getWinsForMediumAI(index)) {
|
||||
} else if (AllZone.getQuestData().getWin() == qpref.getPreferenceInt(QPref.WINS_MEDIUMAI, index)) {
|
||||
duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(this.easyAIduels, 0));
|
||||
duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(this.mediumAIduels, 0));
|
||||
duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(this.mediumAIduels, 1));
|
||||
} else if (AllZone.getQuestData().getWin() < QuestPreferences.getWinsForHardAI(index)) {
|
||||
} else if (AllZone.getQuestData().getWin() < qpref.getPreferenceInt(QPref.WINS_HARDAI, index)) {
|
||||
duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(this.mediumAIduels, 0));
|
||||
duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(this.mediumAIduels, 1));
|
||||
duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(this.mediumAIduels, 2));
|
||||
}
|
||||
|
||||
else if (AllZone.getQuestData().getWin() == QuestPreferences.getWinsForHardAI(index)) {
|
||||
else if (AllZone.getQuestData().getWin() == qpref.getPreferenceInt(QPref.WINS_HARDAI, index)) {
|
||||
duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(this.mediumAIduels, 0));
|
||||
duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(this.hardAIduels, 0));
|
||||
duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(this.hardAIduels, 1));
|
||||
}
|
||||
|
||||
else if (AllZone.getQuestData().getWin() < QuestPreferences.getWinsForVeryHardAI(index)) {
|
||||
else if (AllZone.getQuestData().getWin() < qpref.getPreferenceInt(QPref.WINS_EXPERTAI, index)) {
|
||||
duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(this.hardAIduels, 0));
|
||||
duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(this.hardAIduels, 1));
|
||||
duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(this.hardAIduels, 2));
|
||||
@@ -401,6 +410,8 @@ public class QuestEventManager {
|
||||
* @return a {@link java.util.List} object.
|
||||
*/
|
||||
public final List<QuestChallenge> generateChallenges() {
|
||||
if (AllZone.getQuestData() == null) { return null; }
|
||||
|
||||
final forge.quest.data.QuestData questData = AllZone.getQuestData();
|
||||
|
||||
final List<QuestChallenge> challengeOpponents = new ArrayList<QuestChallenge>();
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -24,6 +24,7 @@ import java.util.Map.Entry;
|
||||
import net.slightlymagic.braids.util.lambda.Lambda1;
|
||||
import net.slightlymagic.maxmtg.Predicate;
|
||||
import forge.SetUtils;
|
||||
import forge.Singletons;
|
||||
import forge.card.BoosterGenerator;
|
||||
import forge.card.BoosterUtils;
|
||||
import forge.card.CardRarity;
|
||||
@@ -36,6 +37,7 @@ import forge.item.InventoryItem;
|
||||
import forge.item.ItemPool;
|
||||
import forge.item.ItemPoolView;
|
||||
import forge.item.PreconDeck;
|
||||
import forge.quest.data.QuestPreferences.QPref;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
/**
|
||||
@@ -44,6 +46,7 @@ import forge.util.MyRandom;
|
||||
*/
|
||||
public final class QuestUtilCards {
|
||||
private final QuestData q;
|
||||
private final QuestPreferences qpref;
|
||||
|
||||
/**
|
||||
* Instantiates a new quest util cards.
|
||||
@@ -53,6 +56,7 @@ public final class QuestUtilCards {
|
||||
*/
|
||||
public QuestUtilCards(final QuestData qd) {
|
||||
this.q = qd;
|
||||
this.qpref = Singletons.getModel().getQuestPreferences();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -93,9 +97,9 @@ public final class QuestUtilCards {
|
||||
* @return the array list
|
||||
*/
|
||||
public ArrayList<CardPrinted> addCards(final Predicate<CardPrinted> fSets) {
|
||||
final int nCommon = QuestPreferences.getNumCommon();
|
||||
final int nUncommon = QuestPreferences.getNumUncommon();
|
||||
final int nRare = QuestPreferences.getNumRare();
|
||||
final int nCommon = qpref.getPreferenceInt(QPref.BOOSTER_COMMONS);
|
||||
final int nUncommon = qpref.getPreferenceInt(QPref.BOOSTER_UNCOMMONS);
|
||||
final int nRare = qpref.getPreferenceInt(QPref.BOOSTER_RARES);
|
||||
|
||||
final ArrayList<CardPrinted> newCards = new ArrayList<CardPrinted>();
|
||||
newCards.addAll(BoosterUtils.generateCards(fSets, nCommon, CardRarity.Common, null));
|
||||
@@ -166,9 +170,9 @@ public final class QuestUtilCards {
|
||||
* the idx difficulty
|
||||
*/
|
||||
public void setupNewGameCardPool(final Predicate<CardPrinted> filter, final int idxDifficulty) {
|
||||
final int nC = QuestPreferences.getStartingCommons(idxDifficulty);
|
||||
final int nU = QuestPreferences.getStartingUncommons(idxDifficulty);
|
||||
final int nR = QuestPreferences.getStartingRares(idxDifficulty);
|
||||
final int nC = qpref.getPreferenceInt(QPref.STARTING_COMMONS, idxDifficulty);
|
||||
final int nU = qpref.getPreferenceInt(QPref.STARTING_UNCOMMONS, idxDifficulty);
|
||||
final int nR = qpref.getPreferenceInt(QPref.STARTING_RARES, idxDifficulty);
|
||||
|
||||
this.addAllCards(BoosterUtils.getQuestStarterDeck(filter, nC, nU, nR));
|
||||
}
|
||||
|
||||
@@ -43,7 +43,6 @@ import forge.error.ErrorViewer;
|
||||
import forge.gui.GuiUtils;
|
||||
import forge.quest.data.QuestData;
|
||||
import forge.quest.data.QuestDataIO;
|
||||
import forge.quest.data.QuestPreferences;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
@@ -131,7 +130,7 @@ public class QuestOptions extends JFrame {
|
||||
* </p>
|
||||
*/
|
||||
private void setupRadioButtonText() {
|
||||
final String[] diff = QuestPreferences.getDifficulty();
|
||||
/*final String[] diff = QuestPreferences.getDifficulty();
|
||||
final JRadioButton[] b = { this.easyRadio, this.mediumRadio, this.hardRadio, this.veryHardRadio };
|
||||
|
||||
for (int i = 0; i < diff.length; i++) {
|
||||
@@ -140,7 +139,7 @@ public class QuestOptions extends JFrame {
|
||||
final int numGames = numberLevels * QuestPreferences.getWinsForRankIncrease(i);
|
||||
|
||||
b[i].setText(String.format("%s - %d", diff[i], numGames));
|
||||
}
|
||||
}*/
|
||||
|
||||
} // setupRadioButtonText()
|
||||
|
||||
|
||||
@@ -49,6 +49,7 @@ import forge.quest.data.QuestChallenge;
|
||||
import forge.quest.data.QuestData;
|
||||
import forge.quest.data.QuestEvent;
|
||||
import forge.quest.data.QuestPreferences;
|
||||
import forge.quest.data.QuestPreferences.QPref;
|
||||
import forge.quest.data.QuestUtil;
|
||||
import forge.util.MyRandom;
|
||||
import forge.view.GuiTopLevel;
|
||||
@@ -75,13 +76,14 @@ public class QuestWinLoseHandler extends ControlWinLose {
|
||||
|
||||
/** String constraint parameters for title blocks and cardviewer blocks. */
|
||||
private final String constraintsTitle = "w 95%!, gap 0 0 20px 10px";
|
||||
private final String constraintsText = "w 95%!,, h 150px!, gap 0 0 0 20px";
|
||||
private final String constraintsText = "w 95%!,, h 180px!, gap 0 0 0 20px";
|
||||
private final String constraintsCards = "w 95%!, h 330px!, gap 0 0 0 20px";
|
||||
|
||||
private class CommonObjects {
|
||||
private FMatchState matchState;
|
||||
private QuestData qData;
|
||||
private QuestEvent qEvent;
|
||||
private QuestPreferences qPrefs;
|
||||
}
|
||||
|
||||
private final CommonObjects model;
|
||||
@@ -98,6 +100,7 @@ public class QuestWinLoseHandler extends ControlWinLose {
|
||||
this.model.matchState = AllZone.getMatchState();
|
||||
this.model.qData = AllZone.getQuestData();
|
||||
this.model.qEvent = AllZone.getQuestEvent();
|
||||
this.model.qPrefs = Singletons.getModel().getQuestPreferences();
|
||||
this.wonMatch = this.model.matchState.isMatchWonBy(AllZone.getHumanPlayer().getName());
|
||||
this.skin = Singletons.getView().getSkin();
|
||||
this.isAnte = Singletons.getModel().getPreferences().isPlayForAnte();
|
||||
@@ -217,7 +220,7 @@ public class QuestWinLoseHandler extends ControlWinLose {
|
||||
// Win or lose, still a chance to win a booster, frequency set in
|
||||
// preferences
|
||||
final int outcome = this.wonMatch ? this.model.qData.getWin() : this.model.qData.getLost();
|
||||
if ((outcome % QuestPreferences.getWinsForBooster(this.model.qData.getDifficultyIndex())) == 0) {
|
||||
if ((outcome % this.model.qPrefs.getPreferenceInt(QPref.WINS_BOOSTER, this.model.qData.getDifficultyIndex())) == 0) {
|
||||
this.awardBooster();
|
||||
}
|
||||
|
||||
@@ -274,12 +277,14 @@ public class QuestWinLoseHandler extends ControlWinLose {
|
||||
*/
|
||||
@Override
|
||||
public final void actionOnQuit() {
|
||||
int x = Singletons.getModel().getQuestPreferences().getPreferenceInt(QPref.PENALTY_LOSS);
|
||||
|
||||
// Record win/loss in quest data
|
||||
if (this.wonMatch) {
|
||||
this.model.qData.addWin();
|
||||
} else {
|
||||
this.model.qData.addLost();
|
||||
this.model.qData.subtractCredits(15);
|
||||
this.model.qData.subtractCredits(x);
|
||||
}
|
||||
|
||||
this.model.qData.getCards().clearShopList();
|
||||
@@ -317,7 +322,7 @@ public class QuestWinLoseHandler extends ControlWinLose {
|
||||
int credEstates = 0;
|
||||
|
||||
// Basic win bonus
|
||||
final int base = QuestPreferences.getMatchRewardBase();
|
||||
final int base = this.model.qPrefs.getPreferenceInt(QPref.REWARDS_BASE);
|
||||
double multiplier = 1;
|
||||
|
||||
String diff = AllZone.getQuestEvent().getDifficulty();
|
||||
@@ -332,8 +337,11 @@ public class QuestWinLoseHandler extends ControlWinLose {
|
||||
} else if (diff.equalsIgnoreCase("expert")) {
|
||||
multiplier = 3;
|
||||
}
|
||||
credBase += (int) ((base * multiplier) + (QuestPreferences.getMatchRewardTotalWins() * this.model.qData
|
||||
.getWin()));
|
||||
|
||||
credBase += (int) ((base * multiplier)
|
||||
+ (Double.parseDouble(this.model.qPrefs.getPreference(QPref.REWARDS_WINS_MULTIPLIER))
|
||||
* this.model.qData.getWin()));
|
||||
|
||||
sb.append(diff + " opponent: " + credBase + " credits.<br>");
|
||||
// Gameplay bonuses (for each game win)
|
||||
boolean hasNeverLost = true;
|
||||
@@ -375,7 +383,7 @@ public class QuestWinLoseHandler extends ControlWinLose {
|
||||
}
|
||||
// Mulligan to zero
|
||||
final int cntCardsHumanStartedWith = humanRating.getOpeningHandSize();
|
||||
final int mulliganReward = QuestPreferences.getMatchMullToZero();
|
||||
final int mulliganReward = this.model.qPrefs.getPreferenceInt(QPref.REWARDS_MULLIGAN0);
|
||||
|
||||
if (0 == cntCardsHumanStartedWith) {
|
||||
credGameplay += mulliganReward;
|
||||
@@ -407,8 +415,8 @@ public class QuestWinLoseHandler extends ControlWinLose {
|
||||
|
||||
// Undefeated bonus
|
||||
if (hasNeverLost) {
|
||||
credUndefeated += QuestPreferences.getMatchRewardNoLosses();
|
||||
final int reward = QuestPreferences.getMatchRewardNoLosses();
|
||||
credUndefeated += this.model.qPrefs.getPreferenceInt(QPref.REWARDS_UNDEFEATED);
|
||||
final int reward = this.model.qPrefs.getPreferenceInt(QPref.REWARDS_UNDEFEATED);
|
||||
sb.append(String.format("You have not lost once! " + "Bonus: %d credits.<br>", reward));
|
||||
}
|
||||
|
||||
@@ -581,11 +589,12 @@ public class QuestWinLoseHandler extends ControlWinLose {
|
||||
}
|
||||
|
||||
private void penalizeLoss() {
|
||||
int x = Singletons.getModel().getQuestPreferences().getPreferenceInt(QPref.PENALTY_LOSS);
|
||||
this.icoTemp = GuiUtils.getResizedIcon("HeartIcon.png", 0.5);
|
||||
|
||||
this.lblTemp1 = new TitleLabel("Gameplay Results");
|
||||
|
||||
this.lblTemp2 = new JLabel("You lose! You have lost 15 credits.");
|
||||
this.lblTemp2 = new JLabel("You lose! You have lost " + x + " credits.");
|
||||
this.lblTemp2.setFont(skin.getFont(14));
|
||||
this.lblTemp2.setForeground(Color.white);
|
||||
this.lblTemp2.setHorizontalAlignment(SwingConstants.CENTER);
|
||||
@@ -625,18 +634,13 @@ public class QuestWinLoseHandler extends ControlWinLose {
|
||||
case LifeReachedZero:
|
||||
return 0; // nothing special here, ordinary kill
|
||||
case Milled:
|
||||
return QuestPreferences.getMatchRewardMilledWinBonus();
|
||||
return this.model.qPrefs.getPreferenceInt(QPref.REWARDS_MILLED);
|
||||
case Poisoned:
|
||||
return QuestPreferences.getMatchRewardPoisonWinBonus();
|
||||
case DidNotLoseYet:
|
||||
return QuestPreferences.getMatchRewardAltWinBonus(); // Felidar,
|
||||
// Helix
|
||||
// Pinnacle,
|
||||
// etc.
|
||||
case SpellEffect:
|
||||
return QuestPreferences.getMatchRewardAltWinBonus(); // Door to
|
||||
// Nothingness,
|
||||
// etc.
|
||||
return this.model.qPrefs.getPreferenceInt(QPref.REWARDS_POISON);
|
||||
case DidNotLoseYet: // Felidar, Helix Pinnacle, etc.
|
||||
return this.model.qPrefs.getPreferenceInt(QPref.REWARDS_UNDEFEATED);
|
||||
case SpellEffect: // Door to Nothingness, etc.
|
||||
return this.model.qPrefs.getPreferenceInt(QPref.REWARDS_UNDEFEATED);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@@ -655,13 +659,13 @@ public class QuestWinLoseHandler extends ControlWinLose {
|
||||
int credits = 0;
|
||||
|
||||
if (iTurn == 1) {
|
||||
credits = QuestPreferences.getMatchRewardWinFirst();
|
||||
credits = this.model.qPrefs.getPreferenceInt(QPref.REWARDS_TURN1);
|
||||
} else if (iTurn <= 5) {
|
||||
credits = QuestPreferences.getMatchRewardWinByFifth();
|
||||
credits = this.model.qPrefs.getPreferenceInt(QPref.REWARDS_TURN5);
|
||||
} else if (iTurn <= 10) {
|
||||
credits = QuestPreferences.getMatchRewardWinByTen();
|
||||
credits = this.model.qPrefs.getPreferenceInt(QPref.REWARDS_TURN10);
|
||||
} else if (iTurn <= 15) {
|
||||
credits = QuestPreferences.getMatchRewardWinByFifteen();
|
||||
credits = this.model.qPrefs.getPreferenceInt(QPref.REWARDS_TURN15);
|
||||
}
|
||||
|
||||
return credits;
|
||||
|
||||
@@ -22,6 +22,7 @@ import java.awt.event.ComponentAdapter;
|
||||
import java.awt.event.ComponentEvent;
|
||||
|
||||
import javax.swing.AbstractAction;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
|
||||
@@ -262,4 +263,24 @@ public class HomeTopLevel extends FPanel {
|
||||
public ControlHomeUI getController() {
|
||||
return control;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JButton} */
|
||||
public JButton getBtnConstructed() {
|
||||
return this.btnConstructed;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JButton} */
|
||||
public JButton getBtnSealed() {
|
||||
return this.btnSealed;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JButton} */
|
||||
public JButton getBtnDraft() {
|
||||
return this.btnDraft;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JButton} */
|
||||
public JButton getBtnQuest() {
|
||||
return this.btnQuest;
|
||||
}
|
||||
}
|
||||
|
||||
335
src/main/java/forge/view/home/QuestFileLister.java
Normal file
335
src/main/java/forge/view/home/QuestFileLister.java
Normal file
@@ -0,0 +1,335 @@
|
||||
package forge.view.home;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.SwingConstants;
|
||||
import javax.swing.border.MatteBorder;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.Command;
|
||||
import forge.Singletons;
|
||||
import forge.gui.GuiUtils;
|
||||
import forge.quest.data.QuestData;
|
||||
import forge.view.toolbox.FLabel;
|
||||
import forge.view.toolbox.FSkin;
|
||||
|
||||
/**
|
||||
* Creates file list/table for quick deleting, editing, and basic info.
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class QuestFileLister extends JPanel {
|
||||
private ImageIcon icoDelete, icoDeleteOver, icoEdit, icoEditOver;
|
||||
private FSkin skin;
|
||||
private RowPanel previousSelect;
|
||||
private RowPanel[] rows;
|
||||
private Command cmdRowSelect, cmdRowDelete, cmdRowEdit;
|
||||
private final Color clrDefault, clrHover, clrActive, clrBorders;
|
||||
|
||||
/** */
|
||||
public QuestFileLister() {
|
||||
this(true, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates deck list for selected decks for quick deleting, editing, and basic info.
|
||||
* Set "selectable" and "editable" to show those buttons, or not.
|
||||
*
|
||||
* @param deletable {@link java.lang.Boolean}
|
||||
* @param editable {@link java.lang.Boolean}
|
||||
*/
|
||||
public QuestFileLister(final boolean deletable, final boolean editable) {
|
||||
super();
|
||||
this.skin = Singletons.getView().getSkin();
|
||||
|
||||
this.clrDefault = new Color(0, 0, 0, 0);
|
||||
this.clrHover = skin.getColor(FSkin.SkinProp.CLR_HOVER);
|
||||
this.clrActive = skin.getColor(FSkin.SkinProp.CLR_ACTIVE);
|
||||
this.clrBorders = skin.getColor(FSkin.SkinProp.CLR_BORDERS);
|
||||
|
||||
this.setOpaque(false);
|
||||
this.setLayout(new MigLayout("insets 0, gap 0, wrap"));
|
||||
|
||||
icoDelete = new ImageIcon("res/images/icons/DeleteIcon.png");
|
||||
icoDeleteOver = new ImageIcon("res/images/icons/DeleteIconOver.png");
|
||||
icoEdit = new ImageIcon("res/images/icons/EditIcon.png");
|
||||
icoEditOver = new ImageIcon("res/images/icons/EditIconOver.png");
|
||||
}
|
||||
|
||||
/** @param qd0   {@link forge.quest.data.QuestData}[] */
|
||||
public void setQuests(QuestData[] qd0) {
|
||||
this.removeAll();
|
||||
List<RowPanel> tempRows = new ArrayList<RowPanel>();
|
||||
|
||||
// Title row
|
||||
// Note: careful with the widths of the rows here;
|
||||
// scroll panes will have difficulty dynamically resizing if 100% width is set.
|
||||
final JPanel rowTitle = new JPanel();
|
||||
rowTitle.setBackground(skin.getColor(FSkin.SkinProp.CLR_ZEBRA));
|
||||
rowTitle.setLayout(new MigLayout("insets 0, gap 0"));
|
||||
rowTitle.add(new FLabel("Delete", SwingConstants.CENTER), "w 15%!, h 20px!, gap 0 0 5px 0");
|
||||
rowTitle.add(new FLabel("Edit", SwingConstants.CENTER), "w 15%!, h 20px!, gap 0 0 5px 0");
|
||||
rowTitle.add(new FLabel("Name", SwingConstants.CENTER), "w 40%!, h 20px!, gap 0 0 5px 0");
|
||||
rowTitle.add(new FLabel("Mode", SwingConstants.CENTER), "w 15%!, h 20px!, gap 0 0 5px 0");
|
||||
rowTitle.add(new FLabel("Record", SwingConstants.CENTER), "w 15%!, h 20px!, gap 0 0 5px 0");
|
||||
this.add(rowTitle, "w 98%!, h 30px!, gapleft 1%");
|
||||
|
||||
RowPanel row;
|
||||
for (QuestData qd : qd0) {
|
||||
row = new RowPanel(qd);
|
||||
row.add(new DeleteButton(row), "w 15%!, h 20px!, gap 0 0 5px 0");
|
||||
row.add(new EditButton(row), "w 15%!, h 20px!, gaptop 5px");
|
||||
row.add(new FLabel(qd.getName()), "w 40%!, h 20px!, gap 0 0 5px 0");
|
||||
row.add(new FLabel(qd.getMode(), SwingConstants.CENTER), "w 15%!, h 20px!, gap 0 0 5px 0");
|
||||
row.add(new FLabel(qd.getWin() + "/" + qd.getLost(), SwingConstants.CENTER), "w 15%!, h 20px!, gap 0 0 5px 0");
|
||||
this.add(row, "w 98%!, h 30px!, gap 1% 0 0 0");
|
||||
tempRows.add(row);
|
||||
}
|
||||
|
||||
rows = tempRows.toArray(new RowPanel[0]);
|
||||
revalidate();
|
||||
}
|
||||
|
||||
/** @return {@link forge.deck.Deck} */
|
||||
public QuestData getSelectedQuest() {
|
||||
return previousSelect.getQuestData();
|
||||
}
|
||||
|
||||
private class DeleteButton extends JButton {
|
||||
public DeleteButton(final RowPanel r0) {
|
||||
super();
|
||||
setRolloverEnabled(true);
|
||||
setPressedIcon(icoDeleteOver);
|
||||
setRolloverIcon(icoDeleteOver);
|
||||
setIcon(icoDelete);
|
||||
setOpaque(false);
|
||||
setContentAreaFilled(false);
|
||||
setBorder(null);
|
||||
setBorderPainted(false);
|
||||
setToolTipText("Delete this deck");
|
||||
|
||||
this.addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseEntered(MouseEvent e) {
|
||||
if (!r0.selected) {
|
||||
r0.setBackground(clrHover);
|
||||
r0.setOpaque(true);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void mouseExited(MouseEvent e) {
|
||||
if (!r0.selected) {
|
||||
r0.setBackground(clrDefault);
|
||||
r0.setOpaque(false);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
deleteFile(r0);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private class EditButton extends JButton {
|
||||
public EditButton(final RowPanel r0) {
|
||||
super();
|
||||
setRolloverEnabled(true);
|
||||
setPressedIcon(icoEditOver);
|
||||
setRolloverIcon(icoEditOver);
|
||||
setIcon(icoEdit);
|
||||
setOpaque(false);
|
||||
setContentAreaFilled(false);
|
||||
setBorder(null);
|
||||
setBorderPainted(false);
|
||||
setToolTipText("Edit this deck");
|
||||
|
||||
this.addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseEntered(MouseEvent e) {
|
||||
if (!r0.selected) {
|
||||
r0.setBackground(clrHover);
|
||||
r0.setOpaque(true);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void mouseExited(MouseEvent e) {
|
||||
if (!r0.selected) {
|
||||
r0.setBackground(clrDefault);
|
||||
r0.setOpaque(false);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
editFileName(r0.getQuestData().getName());
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private class RowPanel extends JPanel {
|
||||
private boolean selected = false;
|
||||
private QuestData questData;
|
||||
|
||||
public RowPanel(QuestData qd0) {
|
||||
super();
|
||||
setOpaque(false);
|
||||
setBackground(new Color(0, 0, 0, 0));
|
||||
setLayout(new MigLayout("insets 0, gap 0"));
|
||||
setBorder(new MatteBorder(0, 0, 1, 0, clrBorders));
|
||||
questData = qd0;
|
||||
|
||||
this.addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseEntered(MouseEvent e) {
|
||||
if (!selected) {
|
||||
((RowPanel) e.getSource()).setBackground(clrHover);
|
||||
((RowPanel) e.getSource()).setOpaque(true);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void mouseExited(MouseEvent e) {
|
||||
if (!selected) {
|
||||
((RowPanel) e.getSource()).setBackground(clrDefault);
|
||||
((RowPanel) e.getSource()).setOpaque(false);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void mousePressed(MouseEvent e) {
|
||||
selectHandler((RowPanel) e.getSource());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void setSelected(boolean b0) {
|
||||
selected = b0;
|
||||
setOpaque(b0);
|
||||
setBackground(b0 ? clrActive : clrHover);
|
||||
}
|
||||
|
||||
public boolean isSelected() {
|
||||
return selected;
|
||||
}
|
||||
|
||||
public QuestData getQuestData() {
|
||||
return questData;
|
||||
}
|
||||
}
|
||||
|
||||
/** @return {@link java.lang.Integer} */
|
||||
public int getSelectedIndex() {
|
||||
for (int i = 0; i < rows.length; i++) {
|
||||
if (rows[i].isSelected()) { return i; }
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/** Selects a row programatically.
|
||||
* @param i0   int
|
||||
* @return boolean success
|
||||
*/
|
||||
public boolean setSelectedIndex(int i0) {
|
||||
if (i0 >= rows.length) { return false; }
|
||||
selectHandler(rows[i0]);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param qd0   Quest data object to select (if exists in list)
|
||||
* @return boolean success
|
||||
*/
|
||||
public boolean setSelectedQuestData(QuestData qd0) {
|
||||
for (RowPanel r : rows) {
|
||||
if (r.getQuestData().getName().equals(qd0.getName())) {
|
||||
selectHandler(r);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/** @param c0   {@link forge.Command} command executed on row select. */
|
||||
public void setSelectCommand(Command c0) {
|
||||
this.cmdRowSelect = c0;
|
||||
}
|
||||
|
||||
/** @param c0   {@link forge.Command} command executed on row edit. */
|
||||
public void setEditCommand(Command c0) {
|
||||
this.cmdRowEdit = c0;
|
||||
}
|
||||
|
||||
/** @param c0   {@link forge.Command} command executed on delete. */
|
||||
public void setDeleteCommand(Command c0) {
|
||||
this.cmdRowDelete = c0;
|
||||
}
|
||||
|
||||
private void selectHandler(RowPanel r0) {
|
||||
if (previousSelect != null) {
|
||||
previousSelect.setSelected(false);
|
||||
}
|
||||
r0.setSelected(true);
|
||||
previousSelect = r0;
|
||||
|
||||
if (cmdRowSelect != null) { cmdRowSelect.execute(); }
|
||||
}
|
||||
|
||||
private void editFileName(String s0) {
|
||||
final Object o = JOptionPane.showInputDialog(null,
|
||||
"Rename Quest to:", "Quest Rename", JOptionPane.OK_CANCEL_OPTION);
|
||||
|
||||
if (o == null) { return; }
|
||||
|
||||
final String questName = GuiUtils.cleanString(o.toString());
|
||||
|
||||
boolean exists = false;
|
||||
|
||||
for (RowPanel r : rows) {
|
||||
if (r.getQuestData().getName().equalsIgnoreCase(questName)) {
|
||||
exists = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (exists || questName.equals("")) {
|
||||
JOptionPane.showMessageDialog(null, "Please pick another quest name, a quest already has that name.");
|
||||
return;
|
||||
}
|
||||
else {
|
||||
File newpath = new File("res/quest/data/" + questName + ".dat");
|
||||
File oldpath = new File("res/quest/data/" + s0 + ".dat");
|
||||
|
||||
oldpath.renameTo(newpath);
|
||||
}
|
||||
|
||||
if (cmdRowEdit != null) { cmdRowEdit.execute(); }
|
||||
}
|
||||
|
||||
private void deleteFile(RowPanel r0) {
|
||||
final QuestData qd = r0.getQuestData();
|
||||
|
||||
final int n = JOptionPane.showConfirmDialog(null,
|
||||
"Are you sure you want to delete \"" + qd.getName()
|
||||
+ "\" ?", "Delete Deck", JOptionPane.YES_NO_OPTION);
|
||||
|
||||
if (n == JOptionPane.NO_OPTION) {
|
||||
return;
|
||||
}
|
||||
|
||||
new File("res/quest/data/" + r0.getQuestData().getName() + ".dat").delete();
|
||||
|
||||
if (cmdRowDelete != null) { cmdRowDelete.execute(); }
|
||||
|
||||
this.remove(r0);
|
||||
this.repaint();
|
||||
this.revalidate();
|
||||
}
|
||||
}
|
||||
96
src/main/java/forge/view/home/SubTab.java
Normal file
96
src/main/java/forge/view/home/SubTab.java
Normal file
@@ -0,0 +1,96 @@
|
||||
package forge.view.home;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Cursor;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
|
||||
import forge.Singletons;
|
||||
import forge.view.toolbox.FSkin;
|
||||
|
||||
/** Standardized tab for submenus in home screen. */
|
||||
public class SubTab extends JPanel {
|
||||
private static final long serialVersionUID = -2193833603356739321L;
|
||||
private final Color clrBorders, clrHover;
|
||||
private final MouseAdapter madHover;
|
||||
private final FSkin skin;
|
||||
|
||||
private boolean enabled = false;
|
||||
private boolean hovering = false;
|
||||
private int w, h;
|
||||
|
||||
/** @param s0   {@link java.lang.String} tab text */
|
||||
public SubTab(String s0) {
|
||||
super();
|
||||
this.setOpaque(false);
|
||||
this.skin = Singletons.getView().getSkin();
|
||||
this.clrBorders = skin.getColor(FSkin.SkinProp.CLR_BORDERS);
|
||||
this.clrHover = skin.getColor(FSkin.SkinProp.CLR_HOVER);
|
||||
this.setCursor(new Cursor(Cursor.HAND_CURSOR));
|
||||
|
||||
this.madHover = new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseEntered(MouseEvent e) {
|
||||
hovering = true;
|
||||
repaint();
|
||||
}
|
||||
@Override
|
||||
public void mouseExited(MouseEvent e) {
|
||||
hovering = false;
|
||||
repaint();
|
||||
}
|
||||
};
|
||||
this.removeMouseListener(madHover);
|
||||
this.addMouseListener(madHover);
|
||||
|
||||
final JLabel lbl = new JLabel(s0);
|
||||
lbl.setForeground(skin.getColor(FSkin.SkinProp.CLR_TEXT));
|
||||
lbl.setFont(skin.getFont(12));
|
||||
this.add(lbl);
|
||||
}
|
||||
|
||||
/** @param b0   {@link java.lang.Boolean} */
|
||||
public void setEnabled(boolean b0) {
|
||||
this.enabled = b0;
|
||||
this.repaint();
|
||||
}
|
||||
|
||||
/** @return {@link java.lang.Boolean} */
|
||||
public boolean isEnabled() {
|
||||
return this.enabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void paintComponent(Graphics g) {
|
||||
super.paintComponent(g);
|
||||
w = getWidth();
|
||||
h = getHeight();
|
||||
|
||||
g.setColor(clrBorders);
|
||||
|
||||
if (this.enabled) {
|
||||
g.drawLine(0, h - 1, 3, h - 1); // SW
|
||||
g.drawLine(3, 10, 3, h); // W
|
||||
g.drawArc(3, 0, 20, 20, 90, 90); //NW
|
||||
g.drawLine(13, 0, w - 13, 0); //N
|
||||
g.drawArc(w - 23, 0, 20, 20, 90, -90); //NE
|
||||
g.drawLine(w - 3, 10, w - 3, h); //E
|
||||
g.drawLine(w - 3, h - 1, w, h - 1); //SE
|
||||
}
|
||||
else if (this.hovering) {
|
||||
g.drawLine(0, h - 1, w, h - 1);
|
||||
g.setColor(clrHover);
|
||||
g.fillArc(3, 0, 20, 20, 90, 90); //NW
|
||||
g.fillArc(w - 23, 0, 20, 20, 90, -90); //NE
|
||||
g.fillRect(3, 10, w - 6, h - 12); // Bottom
|
||||
g.fillRect(13, 0, w - 26, 10); // Top
|
||||
}
|
||||
else {
|
||||
g.drawLine(0, h - 1, w, h - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
386
src/main/java/forge/view/home/ViewQuestPreferences.java
Normal file
386
src/main/java/forge/view/home/ViewQuestPreferences.java
Normal file
@@ -0,0 +1,386 @@
|
||||
package forge.view.home;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Font;
|
||||
import java.awt.event.FocusAdapter;
|
||||
import java.awt.event.FocusEvent;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.SwingConstants;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.Singletons;
|
||||
import forge.quest.data.QuestPreferences;
|
||||
import forge.quest.data.QuestPreferences.QPref;
|
||||
import forge.view.toolbox.FLabel;
|
||||
import forge.view.toolbox.FSkin;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class ViewQuestPreferences extends JPanel {
|
||||
private final FSkin skin;
|
||||
private final QuestPreferences prefs;
|
||||
private final JPanel pnlDifficulty, pnlBooster, pnlRewards;
|
||||
private final FLabel lblErrRewards, lblErrBooster, lblErrDifficulty;
|
||||
private String constraints1, constraints2;
|
||||
|
||||
private enum ErrType {
|
||||
REWARDS,
|
||||
DIFFICULTY,
|
||||
BOOSTER
|
||||
}
|
||||
|
||||
/** */
|
||||
public ViewQuestPreferences() {
|
||||
this.setOpaque(false);
|
||||
this.setLayout(new MigLayout("insets 0, gap 0, wrap"));
|
||||
this.skin = Singletons.getView().getSkin();
|
||||
this.prefs = Singletons.getModel().getQuestPreferences();
|
||||
|
||||
pnlRewards = new JPanel();
|
||||
pnlDifficulty = new JPanel();
|
||||
pnlBooster = new JPanel();
|
||||
|
||||
lblErrRewards = new FLabel("Rewards Error");
|
||||
lblErrDifficulty = new FLabel("Difficulty Error");
|
||||
lblErrBooster = new FLabel("Booster Error");
|
||||
|
||||
lblErrRewards.setForeground(Color.red);
|
||||
lblErrRewards.setFontStyle(Font.BOLD);
|
||||
lblErrDifficulty.setForeground(Color.red);
|
||||
lblErrDifficulty.setFontStyle(Font.BOLD);
|
||||
lblErrBooster.setForeground(Color.red);
|
||||
lblErrBooster.setFontStyle(Font.BOLD);
|
||||
|
||||
// Rewards panel
|
||||
pnlRewards.setOpaque(false);
|
||||
pnlRewards.setLayout(new MigLayout("insets 0, gap 0, wrap 2"));
|
||||
|
||||
pnlRewards.add(new FLabel("Rewards", new ImageIcon("res/images/icons/CoinIcon.png")), "w 100%!, h 30px!, span 2 1");
|
||||
pnlRewards.add(lblErrRewards, "w 100%!, h 30px!, span 2 1");
|
||||
|
||||
constraints1 = "w 60px, h 26px!";
|
||||
constraints2 = "w 150px!, h 26px!";
|
||||
|
||||
pnlRewards.add(new FLabel("Base winnings"), constraints2);
|
||||
pnlRewards.add(new PrefInput(QPref.REWARDS_BASE, ErrType.REWARDS), constraints1);
|
||||
|
||||
pnlRewards.add(new FLabel("No losses"), constraints2);
|
||||
pnlRewards.add(new PrefInput(QPref.REWARDS_UNDEFEATED, ErrType.REWARDS), constraints1);
|
||||
|
||||
pnlRewards.add(new FLabel("Poison win"), constraints2);
|
||||
pnlRewards.add(new PrefInput(QPref.REWARDS_POISON, ErrType.REWARDS), constraints1);
|
||||
|
||||
pnlRewards.add(new FLabel("Milling win"), constraints2);
|
||||
pnlRewards.add(new PrefInput(QPref.REWARDS_MILLED, ErrType.REWARDS), constraints1);
|
||||
|
||||
pnlRewards.add(new FLabel("Mulligan 0 win"), constraints2);
|
||||
pnlRewards.add(new PrefInput(QPref.REWARDS_MULLIGAN0, ErrType.REWARDS), constraints1);
|
||||
|
||||
pnlRewards.add(new FLabel("Alternative win"), constraints2);
|
||||
pnlRewards.add(new PrefInput(QPref.REWARDS_ALTERNATIVE, ErrType.REWARDS), constraints1);
|
||||
|
||||
pnlRewards.add(new FLabel("Win by turn 15"), constraints2);
|
||||
pnlRewards.add(new PrefInput(QPref.REWARDS_TURN15, ErrType.REWARDS), constraints1);
|
||||
|
||||
pnlRewards.add(new FLabel("Win by turn 10"), constraints2);
|
||||
pnlRewards.add(new PrefInput(QPref.REWARDS_TURN10, ErrType.REWARDS), constraints1);
|
||||
|
||||
pnlRewards.add(new FLabel("Win by turn 5"), constraints2);
|
||||
pnlRewards.add(new PrefInput(QPref.REWARDS_TURN5, ErrType.REWARDS), constraints1);
|
||||
|
||||
pnlRewards.add(new FLabel("First turn win"), constraints2);
|
||||
pnlRewards.add(new PrefInput(QPref.REWARDS_TURN1, ErrType.REWARDS), constraints1);
|
||||
|
||||
// Difficulty table panel
|
||||
pnlDifficulty.setOpaque(false);
|
||||
pnlDifficulty.setLayout(new MigLayout("insets 0, gap 0, wrap 5"));
|
||||
|
||||
pnlDifficulty.add(new FLabel("Difficulty Adjustments", new ImageIcon("res/images/icons/NotesIcon.png")), "w 100%!, h 30px!, span 5 1");
|
||||
pnlDifficulty.add(lblErrDifficulty, "w 100%!, h 30px!, span 5 1");
|
||||
|
||||
constraints1 = "w 60px!, h 26px!";
|
||||
constraints2 = "w 150px!, h 26px!";
|
||||
|
||||
pnlDifficulty.add(new FLabel(""), constraints2);
|
||||
pnlDifficulty.add(new FLabel("Easy"), constraints1);
|
||||
pnlDifficulty.add(new FLabel("Medium"), constraints1);
|
||||
pnlDifficulty.add(new FLabel("Hard"), constraints1);
|
||||
pnlDifficulty.add(new FLabel("Expert"), constraints1);
|
||||
|
||||
pnlDifficulty.add(new FLabel("Wins For Booster"), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_BOOSTER_EASY, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_BOOSTER_MEDIUM, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_BOOSTER_HARD, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_BOOSTER_EXPERT, ErrType.DIFFICULTY), constraints1);
|
||||
|
||||
pnlDifficulty.add(new FLabel("Wins For Rank Increase"), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_RANKUP_EASY, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_RANKUP_MEDIUM, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_RANKUP_HARD, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_RANKUP_EXPERT, ErrType.DIFFICULTY), constraints1);
|
||||
|
||||
pnlDifficulty.add(new FLabel("Wins For Medium AI"), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_MEDIUMAI_EASY, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_MEDIUMAI_MEDIUM, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_MEDIUMAI_HARD, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_MEDIUMAI_EXPERT, ErrType.DIFFICULTY), constraints1);
|
||||
|
||||
pnlDifficulty.add(new FLabel("Wins For Hard AI"), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_HARDAI_EASY, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_HARDAI_MEDIUM, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_HARDAI_HARD, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_HARDAI_EXPERT, ErrType.DIFFICULTY), constraints1);
|
||||
|
||||
pnlDifficulty.add(new FLabel("Wins For Expert AI"), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_EXPERTAI_EASY, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_EXPERTAI_MEDIUM, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_EXPERTAI_HARD, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_EXPERTAI_EXPERT, ErrType.DIFFICULTY), constraints1);
|
||||
|
||||
pnlDifficulty.add(new FLabel("Starting commons"), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_COMMONS_EASY, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_COMMONS_MEDIUM, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_COMMONS_HARD, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_COMMONS_EXPERT, ErrType.DIFFICULTY), constraints1);
|
||||
|
||||
pnlDifficulty.add(new FLabel("Starting uncommons"), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_UNCOMMONS_EASY, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_UNCOMMONS_MEDIUM, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_UNCOMMONS_HARD, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_UNCOMMONS_EXPERT, ErrType.DIFFICULTY), constraints1);
|
||||
|
||||
pnlDifficulty.add(new FLabel("Starting rares"), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_RARES_EASY, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_RARES_MEDIUM, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_RARES_HARD, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_RARES_EXPERT, ErrType.DIFFICULTY), constraints1);
|
||||
|
||||
pnlDifficulty.add(new FLabel("Starting credits"), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_CREDITS_EASY, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_CREDITS_MEDIUM, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_CREDITS_HARD, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_CREDITS_EXPERT, ErrType.DIFFICULTY), constraints1);
|
||||
|
||||
pnlDifficulty.add(new FLabel("Starting basic lands"), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_BASIC_LANDS, ErrType.DIFFICULTY), constraints1 + ", wrap");
|
||||
|
||||
pnlDifficulty.add(new FLabel("Starting snow lands"), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_SNOW_LANDS, ErrType.DIFFICULTY), constraints1 + ", wrap");
|
||||
|
||||
pnlDifficulty.add(new FLabel("Penalty for loss"), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.PENALTY_LOSS, ErrType.DIFFICULTY), constraints1 + ", wrap");
|
||||
|
||||
// Booster breakdown panel
|
||||
pnlBooster.setOpaque(false);
|
||||
pnlBooster.setLayout(new MigLayout("insets 0, gap 0, wrap 2"));
|
||||
|
||||
pnlBooster.add(new FLabel("Booster Pack Ratios", new ImageIcon("res/images/icons/BookIcon.png")), "w 100%!, h 30px!, span 2 1");
|
||||
pnlBooster.add(lblErrBooster, "w 100%!, h 30px!, span 2 1");
|
||||
|
||||
constraints1 = "w 60px!, h 26px!";
|
||||
constraints2 = "w 150px!, h 26px!";
|
||||
pnlBooster.add(new FLabel("Common"), constraints2);
|
||||
pnlBooster.add(new PrefInput(QPref.BOOSTER_COMMONS, ErrType.BOOSTER), constraints1);
|
||||
|
||||
pnlBooster.add(new FLabel("Uncommon"), constraints2);
|
||||
pnlBooster.add(new PrefInput(QPref.BOOSTER_UNCOMMONS, ErrType.BOOSTER), constraints1);
|
||||
|
||||
pnlBooster.add(new FLabel("Rare"), constraints2);
|
||||
pnlBooster.add(new PrefInput(QPref.BOOSTER_RARES, ErrType.BOOSTER), constraints1);
|
||||
|
||||
constraints1 = "w 100%!, gap 0 0 20px 0";
|
||||
this.add(pnlRewards, constraints1);
|
||||
this.add(pnlDifficulty, constraints1);
|
||||
this.add(pnlBooster, constraints1);
|
||||
|
||||
resetErrors();
|
||||
}
|
||||
|
||||
private class PrefInput extends JTextField {
|
||||
private final QPref qpref;
|
||||
private final ErrType err;
|
||||
private final Color clrHover, clrActive, clrText;
|
||||
private boolean isFocus = false;
|
||||
private String previousText = "";
|
||||
|
||||
/**
|
||||
* @param qp1   {@link forge.quest.data.QuestPreferences.QPref}
|
||||
* preferences ident enum
|
||||
* @param e0   {@link forge.view.home.ViewQuestPreference.ErrType}
|
||||
* where error should display to
|
||||
*/
|
||||
public PrefInput(QPref qp0, ErrType e0) {
|
||||
super();
|
||||
|
||||
this.qpref = qp0;
|
||||
this.err = e0;
|
||||
this.clrHover = skin.getColor(FSkin.SkinProp.CLR_HOVER);
|
||||
this.clrActive = skin.getColor(FSkin.SkinProp.CLR_ACTIVE);
|
||||
this.clrText = skin.getColor(FSkin.SkinProp.CLR_TEXT);
|
||||
|
||||
this.setOpaque(false);
|
||||
this.setBorder(null);
|
||||
this.setFont(skin.getFont(13));
|
||||
this.setForeground(clrText);
|
||||
this.setCaretColor(clrText);
|
||||
this.setBackground(clrHover);
|
||||
this.setHorizontalAlignment(SwingConstants.CENTER);
|
||||
this.setText(prefs.getPreference(qpref));
|
||||
this.setPreviousText(prefs.getPreference(qpref));
|
||||
|
||||
this.addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseEntered(MouseEvent e) {
|
||||
if (isFocus) { return; }
|
||||
setOpaque(true);
|
||||
repaint();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseExited(MouseEvent e) {
|
||||
if (isFocus) { return; }
|
||||
setOpaque(false);
|
||||
repaint();
|
||||
}
|
||||
});
|
||||
|
||||
this.addFocusListener(new FocusAdapter() {
|
||||
@Override
|
||||
public void focusGained(FocusEvent e) {
|
||||
isFocus = true;
|
||||
setOpaque(true);
|
||||
setBackground(clrActive);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void focusLost(FocusEvent e) {
|
||||
isFocus = false;
|
||||
setOpaque(false);
|
||||
setBackground(clrHover);
|
||||
|
||||
// TODO for slight performance improvement
|
||||
// check if value has changed before validating
|
||||
validateAndSave(PrefInput.this);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public QPref getQPref() {
|
||||
return this.qpref;
|
||||
}
|
||||
|
||||
public ErrType getErrType() {
|
||||
return this.err;
|
||||
}
|
||||
|
||||
public String getPreviousText() {
|
||||
return this.previousText;
|
||||
}
|
||||
|
||||
public void setPreviousText(String s0) {
|
||||
this.previousText = s0;
|
||||
}
|
||||
}
|
||||
|
||||
private int temp1, temp2;
|
||||
/**
|
||||
* Checks validity of values entered into prefInputs.
|
||||
* @param i0   a PrefInput object
|
||||
*/
|
||||
private void validateAndSave(PrefInput i0) {
|
||||
if (i0.getText().equals(i0.getPreviousText())) { return; }
|
||||
|
||||
int val = Integer.parseInt(i0.getText());
|
||||
resetErrors();
|
||||
|
||||
switch (i0.getQPref()) {
|
||||
case STARTING_CREDITS_EASY: case STARTING_CREDITS_MEDIUM:
|
||||
case STARTING_CREDITS_HARD: case STARTING_CREDITS_EXPERT:
|
||||
case REWARDS_MILLED: case REWARDS_MULLIGAN0:
|
||||
case REWARDS_ALTERNATIVE: case REWARDS_TURN5:
|
||||
if (val > 500) {
|
||||
showError(i0, "Value too large (maximum 500).");
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case BOOSTER_COMMONS:
|
||||
temp1 = prefs.getPreferenceInt(QPref.BOOSTER_UNCOMMONS);
|
||||
temp2 = prefs.getPreferenceInt(QPref.BOOSTER_RARES);
|
||||
|
||||
if (temp1 + temp2 + val > 15) {
|
||||
showError(i0, "Booster packs must have maximum 15 cards.");
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case BOOSTER_UNCOMMONS:
|
||||
temp1 = prefs.getPreferenceInt(QPref.BOOSTER_COMMONS);
|
||||
temp2 = prefs.getPreferenceInt(QPref.BOOSTER_RARES);
|
||||
|
||||
if (temp1 + temp2 + val > 15) {
|
||||
showError(i0, "Booster packs must have maximum 15 cards.");
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case BOOSTER_RARES:
|
||||
temp1 = prefs.getPreferenceInt(QPref.BOOSTER_COMMONS);
|
||||
temp2 = prefs.getPreferenceInt(QPref.BOOSTER_UNCOMMONS);
|
||||
|
||||
if (temp1 + temp2 + val > 15) {
|
||||
showError(i0, "Booster packs must have maximum 15 cards.");
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case REWARDS_TURN1:
|
||||
if (val > 2000) {
|
||||
showError(i0, "Value too large (maximum 2000).");
|
||||
return;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (val > 100) {
|
||||
showError(i0, "Value too large (maximum 100).");
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
prefs.setPreference(i0.getQPref(), i0.getText());
|
||||
prefs.save();
|
||||
i0.setPreviousText(i0.getText());
|
||||
}
|
||||
|
||||
private void showError(PrefInput i0, String s0) {
|
||||
String s = "Save failed: " + s0;
|
||||
switch(i0.getErrType()) {
|
||||
case BOOSTER:
|
||||
lblErrBooster.setVisible(true);
|
||||
lblErrBooster.setText(s);
|
||||
break;
|
||||
case DIFFICULTY:
|
||||
lblErrDifficulty.setVisible(true);
|
||||
lblErrDifficulty.setText(s);
|
||||
break;
|
||||
case REWARDS:
|
||||
lblErrRewards.setVisible(true);
|
||||
lblErrRewards.setText(s);
|
||||
break;
|
||||
default:
|
||||
}
|
||||
|
||||
i0.setText(i0.getPreviousText());
|
||||
}
|
||||
|
||||
private void resetErrors() {
|
||||
lblErrBooster.setVisible(false);
|
||||
lblErrDifficulty.setVisible(false);
|
||||
lblErrRewards.setVisible(false);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package forge.view.toolbox;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.io.File;
|
||||
@@ -18,12 +19,15 @@ import javax.swing.border.MatteBorder;
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.AllZone;
|
||||
import forge.Command;
|
||||
import forge.Constant;
|
||||
import forge.Singletons;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.DeckIO;
|
||||
import forge.deck.DeckManager;
|
||||
import forge.game.GameType;
|
||||
import forge.gui.deckeditor.DeckEditorCommon;
|
||||
import forge.gui.deckeditor.DeckEditorQuest;
|
||||
import forge.view.GuiTopLevel;
|
||||
|
||||
/**
|
||||
* Creates deck list for selected decks for quick deleting, editing, and basic info.
|
||||
@@ -36,20 +40,20 @@ public class DeckLister extends JPanel {
|
||||
private ImageIcon icoEdit;
|
||||
private ImageIcon icoEditOver;
|
||||
private FSkin skin;
|
||||
private RowPanel previousSelection = null;
|
||||
private RowPanel previousSelect;
|
||||
private RowPanel[] rows;
|
||||
private GameType gametype;
|
||||
private Command cmdExit;
|
||||
private Command cmdEditorExit, cmdDelete, cmdRowSelect;
|
||||
private final Color clrDefault, clrHover, clrActive, clrBorders;
|
||||
|
||||
/**
|
||||
* Creates deck list for selected decks for quick deleting, editing, and basic info.
|
||||
* "selectable" and "editable" assumed true.
|
||||
*
|
||||
* @param gt0 {@link forge.game.GameType}
|
||||
* @param cmd0 {@link forge.Command}, when exiting deck editor
|
||||
*/
|
||||
public DeckLister(GameType gt0, Command cmd0) {
|
||||
this(gt0, cmd0, true, true);
|
||||
public DeckLister(GameType gt0) {
|
||||
this(gt0, null);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -58,14 +62,18 @@ public class DeckLister extends JPanel {
|
||||
*
|
||||
* @param gt0 {@link forge.game.GameType}
|
||||
* @param cmd0 {@link forge.Command}, when exiting deck editor
|
||||
* @param deletable {@link java.lang.Boolean}
|
||||
* @param editable {@link java.lang.Boolean}
|
||||
*/
|
||||
public DeckLister(GameType gt0, Command cmd0, boolean deletable, boolean editable) {
|
||||
public DeckLister(GameType gt0, Command cmd0) {
|
||||
super();
|
||||
skin = Singletons.getView().getSkin();
|
||||
gametype = gt0;
|
||||
cmdExit = cmd0;
|
||||
this.skin = Singletons.getView().getSkin();
|
||||
this.gametype = gt0;
|
||||
this.cmdEditorExit = cmd0;
|
||||
|
||||
this.clrDefault = new Color(0, 0, 0, 0);
|
||||
this.clrHover = skin.getColor(FSkin.SkinProp.CLR_HOVER);
|
||||
this.clrActive = skin.getColor(FSkin.SkinProp.CLR_ACTIVE);
|
||||
this.clrBorders = skin.getColor(FSkin.SkinProp.CLR_BORDERS);
|
||||
|
||||
this.setOpaque(false);
|
||||
this.setLayout(new MigLayout("insets 0, gap 0, wrap"));
|
||||
|
||||
@@ -83,18 +91,20 @@ public class DeckLister extends JPanel {
|
||||
// Title row
|
||||
// Note: careful with the widths of the rows here;
|
||||
// scroll panes will have difficulty dynamically resizing if 100% width is set.
|
||||
JPanel rowTitle = new JPanel();
|
||||
rowTitle.setBackground(skin.getColor(FSkin.SkinProp.CLR_INACTIVE));
|
||||
JPanel rowTitle = new TitlePanel();
|
||||
rowTitle.setBackground(skin.getColor(FSkin.SkinProp.CLR_ZEBRA));
|
||||
rowTitle.setLayout(new MigLayout("insets 0, gap 0"));
|
||||
rowTitle.add(new TitleLabel("Delete"), "w 10%!, h 20px!, gaptop 5px");
|
||||
rowTitle.add(new TitleLabel("Edit"), "w 10%!, h 20px!, gaptop 5px");
|
||||
rowTitle.add(new TitleLabel("Deck Name"), "w 60%!, h 20px!, gaptop 5px");
|
||||
rowTitle.add(new TitleLabel("Main"), "w 10%!, h 20px!, gaptop 5px");
|
||||
rowTitle.add(new TitleLabel("Side"), "w 10%!, h 20px!, gaptop 5px");
|
||||
rowTitle.add(new FLabel("Delete", SwingConstants.CENTER), "w 10%!, h 20px!, gaptop 5px");
|
||||
rowTitle.add(new FLabel("Edit", SwingConstants.CENTER), "w 10%!, h 20px!, gaptop 5px");
|
||||
rowTitle.add(new FLabel("Deck Name", SwingConstants.CENTER), "w 60%!, h 20px!, gaptop 5px");
|
||||
rowTitle.add(new FLabel("Main", SwingConstants.CENTER), "w 10%!, h 20px!, gaptop 5px");
|
||||
rowTitle.add(new FLabel("Side", SwingConstants.CENTER), "w 10%!, h 20px!, gaptop 5px");
|
||||
this.add(rowTitle, "w 98%!, h 30px!, gapleft 1%");
|
||||
|
||||
RowPanel row;
|
||||
for (Deck d : decks0) {
|
||||
if (d.getName() == null) { continue; }
|
||||
|
||||
row = new RowPanel(d);
|
||||
row.add(new DeleteButton(row), "w 10%!, h 20px!, gaptop 5px");
|
||||
row.add(new EditButton(row), "w 10%!, h 20px!, gaptop 5px");
|
||||
@@ -136,9 +146,17 @@ public class DeckLister extends JPanel {
|
||||
this.addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseEntered(MouseEvent e) {
|
||||
if (r0.selected) { return; }
|
||||
r0.setBackground(skin.getColor(FSkin.SkinProp.CLR_HOVER));
|
||||
r0.setOpaque(true);
|
||||
if (!r0.selected) {
|
||||
r0.setBackground(clrHover);
|
||||
r0.setOpaque(true);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void mouseExited(MouseEvent e) {
|
||||
if (!r0.selected) {
|
||||
r0.setBackground(clrDefault);
|
||||
r0.setOpaque(false);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
@@ -164,9 +182,17 @@ public class DeckLister extends JPanel {
|
||||
this.addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseEntered(MouseEvent e) {
|
||||
if (r0.selected) { return; }
|
||||
r0.setBackground(skin.getColor(FSkin.SkinProp.CLR_HOVER));
|
||||
r0.setOpaque(true);
|
||||
if (!r0.selected) {
|
||||
r0.setBackground(clrHover);
|
||||
r0.setOpaque(true);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void mouseExited(MouseEvent e) {
|
||||
if (!r0.selected) {
|
||||
r0.setBackground(clrDefault);
|
||||
r0.setOpaque(false);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
@@ -176,30 +202,43 @@ public class DeckLister extends JPanel {
|
||||
}
|
||||
}
|
||||
|
||||
// Here only to prevent visual artifact problems from translucent skin colors.
|
||||
private class TitlePanel extends JPanel {
|
||||
@Override
|
||||
public void paintComponent(Graphics g) {
|
||||
g.setColor(getBackground());
|
||||
g.clearRect(0, 0, getWidth(), getHeight());
|
||||
g.fillRect(0, 0, getWidth(), getHeight());
|
||||
super.paintComponent(g);
|
||||
}
|
||||
}
|
||||
|
||||
private class RowPanel extends JPanel {
|
||||
private Color bgDefault = null;
|
||||
private boolean selected = false;
|
||||
private Deck deck;
|
||||
|
||||
public RowPanel(Deck d0) {
|
||||
super();
|
||||
setOpaque(false);
|
||||
setBackground(new Color(0, 0, 0, 0));
|
||||
setLayout(new MigLayout("insets 0, gap 0"));
|
||||
setBorder(new MatteBorder(0, 0, 1, 0, skin.getColor(FSkin.SkinProp.CLR_BORDERS)));
|
||||
setBorder(new MatteBorder(0, 0, 1, 0, clrBorders));
|
||||
deck = d0;
|
||||
|
||||
this.addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseEntered(MouseEvent e) {
|
||||
if (selected) { return; }
|
||||
setBackground(skin.getColor(FSkin.SkinProp.CLR_HOVER));
|
||||
setOpaque(true);
|
||||
if (!selected) {
|
||||
((RowPanel) e.getSource()).setBackground(clrHover);
|
||||
((RowPanel) e.getSource()).setOpaque(true);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void mouseExited(MouseEvent e) {
|
||||
if (selected) { return; }
|
||||
setBackground(bgDefault);
|
||||
setOpaque(false);
|
||||
if (!selected) {
|
||||
((RowPanel) e.getSource()).setBackground(clrDefault);
|
||||
((RowPanel) e.getSource()).setOpaque(false);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void mousePressed(MouseEvent e) {
|
||||
@@ -209,9 +248,9 @@ public class DeckLister extends JPanel {
|
||||
}
|
||||
|
||||
public void setSelected(boolean b0) {
|
||||
bgDefault = (b0 ? skin.getColor(FSkin.SkinProp.CLR_ACTIVE) : null);
|
||||
selected = b0;
|
||||
setBackground(bgDefault);
|
||||
setOpaque(b0);
|
||||
setBackground(b0 ? clrActive : clrHover);
|
||||
}
|
||||
|
||||
public boolean isSelected() {
|
||||
@@ -223,15 +262,6 @@ public class DeckLister extends JPanel {
|
||||
}
|
||||
}
|
||||
|
||||
private class TitleLabel extends JLabel {
|
||||
public TitleLabel(String txt0) {
|
||||
super(txt0);
|
||||
setForeground(skin.getColor(FSkin.SkinProp.CLR_TEXT));
|
||||
setFont(skin.getFont(11));
|
||||
setHorizontalAlignment(SwingConstants.CENTER);
|
||||
}
|
||||
}
|
||||
|
||||
private class MainLabel extends JLabel {
|
||||
public MainLabel(String txt0) {
|
||||
super(txt0);
|
||||
@@ -254,7 +284,6 @@ public class DeckLister extends JPanel {
|
||||
setHorizontalAlignment(SwingConstants.CENTER);
|
||||
setForeground(skin.getColor(FSkin.SkinProp.CLR_TEXT));
|
||||
setFont(skin.getBoldFont(12));
|
||||
setHorizontalAlignment(SwingConstants.CENTER);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -267,19 +296,68 @@ public class DeckLister extends JPanel {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/** Selects a row programatically.
|
||||
* @param i0   int
|
||||
* @return boolean Was able to select, or not.
|
||||
*/
|
||||
public boolean setSelectedIndex(int i0) {
|
||||
if (i0 >= rows.length) { return false; }
|
||||
selectHandler(rows[i0]);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param d0   Deck object to select (if exists in list)
|
||||
* @return boolean Found deck, or didn't.
|
||||
*/
|
||||
public boolean setSelectedDeck(Deck d0) {
|
||||
for (RowPanel r : rows) {
|
||||
if (r.getDeck() == d0) {
|
||||
selectHandler(r);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/** @param c0   {@link forge.Command} command executed on delete. */
|
||||
public void setDeleteCommand(Command c0) {
|
||||
this.cmdDelete = c0;
|
||||
}
|
||||
|
||||
/** @param c0   {@link forge.Command} command executed on row select. */
|
||||
public void setSelectCommand(Command c0) {
|
||||
this.cmdRowSelect = c0;
|
||||
}
|
||||
|
||||
/** @param c0   {@link forge.Command} command executed on editor exit. */
|
||||
public void setExitCommand(Command c0) {
|
||||
this.cmdEditorExit = c0;
|
||||
}
|
||||
|
||||
private void selectHandler(RowPanel r0) {
|
||||
if (previousSelection != null) {
|
||||
previousSelection.setSelected(false);
|
||||
if (previousSelect != null) {
|
||||
previousSelect.setSelected(false);
|
||||
}
|
||||
r0.setSelected(true);
|
||||
previousSelection = r0;
|
||||
previousSelect = r0;
|
||||
|
||||
if (cmdRowSelect != null) { cmdRowSelect.execute(); }
|
||||
}
|
||||
|
||||
private void editDeck(Deck d0) {
|
||||
DeckEditorCommon editor = new DeckEditorCommon(gametype);
|
||||
editor.show(cmdExit);
|
||||
editor.getCustomMenu().showDeck(d0, gametype);
|
||||
editor.setVisible(true);
|
||||
if (gametype == GameType.Quest) {
|
||||
Constant.Runtime.HUMAN_DECK[0] = d0;
|
||||
final DeckEditorQuest editor = new DeckEditorQuest(AllZone.getQuestData());
|
||||
editor.show(cmdEditorExit);
|
||||
editor.setVisible(true);
|
||||
}
|
||||
else {
|
||||
final DeckEditorCommon editor = new DeckEditorCommon(gametype);
|
||||
editor.show(cmdEditorExit);
|
||||
editor.getCustomMenu().showDeck(d0, gametype);
|
||||
editor.setVisible(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void deleteDeck(RowPanel r0) {
|
||||
@@ -318,6 +396,11 @@ public class DeckLister extends JPanel {
|
||||
address1.delete();
|
||||
address2.delete();
|
||||
}
|
||||
else if (gametype.equals(GameType.Quest)) {
|
||||
AllZone.getQuestData().removeDeck(d0.getName());
|
||||
AllZone.getQuestData().saveData();
|
||||
((GuiTopLevel) AllZone.getDisplay()).getController().getHomeView().getBtnQuest().grabFocus();
|
||||
}
|
||||
else {
|
||||
deckmanager.deleteDeck(d0.getName());
|
||||
|
||||
@@ -326,6 +409,9 @@ public class DeckLister extends JPanel {
|
||||
}
|
||||
|
||||
this.remove(r0);
|
||||
this.repaint();
|
||||
this.revalidate();
|
||||
|
||||
if (cmdDelete != null) { cmdDelete.execute(); }
|
||||
}
|
||||
}
|
||||
|
||||
43
src/main/java/forge/view/toolbox/FCheckBox.java
Normal file
43
src/main/java/forge/view/toolbox/FCheckBox.java
Normal file
@@ -0,0 +1,43 @@
|
||||
package forge.view.toolbox;
|
||||
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
|
||||
import javax.swing.JCheckBox;
|
||||
|
||||
import forge.Singletons;
|
||||
|
||||
/**
|
||||
* A custom instance of JCheckBox using Forge skin properties.
|
||||
*/
|
||||
public class FCheckBox extends JCheckBox {
|
||||
private static final long serialVersionUID = -8633657166511001814L;
|
||||
private final FSkin skin;
|
||||
|
||||
/** */
|
||||
public FCheckBox() {
|
||||
this("");
|
||||
}
|
||||
|
||||
/** @param s0   {@link java.lang.String} */
|
||||
public FCheckBox(final String s0) {
|
||||
super(s0);
|
||||
this.skin = Singletons.getView().getSkin();
|
||||
this.setForeground(skin.getColor(FSkin.SkinProp.CLR_TEXT));
|
||||
this.setBackground(skin.getColor(FSkin.SkinProp.CLR_HOVER));
|
||||
this.setFont(skin.getFont(14));
|
||||
this.setOpaque(false);
|
||||
|
||||
this.addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseEntered(MouseEvent e) {
|
||||
setOpaque(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseExited(MouseEvent e) {
|
||||
setOpaque(false);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
143
src/main/java/forge/view/toolbox/FLabel.java
Normal file
143
src/main/java/forge/view/toolbox/FLabel.java
Normal file
@@ -0,0 +1,143 @@
|
||||
package forge.view.toolbox;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.awt.Image;
|
||||
import java.awt.event.ComponentAdapter;
|
||||
import java.awt.event.ComponentEvent;
|
||||
|
||||
import javax.swing.Icon;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JLabel;
|
||||
|
||||
import forge.Singletons;
|
||||
|
||||
/**
|
||||
* A custom instance of JLabel using Forge skin properties.
|
||||
*
|
||||
* Font size can be scaled to a percentage of label height (60% by default).
|
||||
*
|
||||
* Font scaling can be toggled.
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class FLabel extends JLabel {
|
||||
private final FSkin skin;
|
||||
private final ComponentAdapter cadResize;
|
||||
private boolean scaleAuto;
|
||||
private double fontScaleFactor = 0.6;
|
||||
private double iconScaleFactor = 0.8;
|
||||
private double aspectRatio;
|
||||
private Image img = null;
|
||||
private int w, h;
|
||||
private int fontStyle = Font.PLAIN;
|
||||
|
||||
/** */
|
||||
public FLabel() {
|
||||
this("");
|
||||
}
|
||||
|
||||
/** @param i0   {@link javax.swing.ImageIcon} */
|
||||
public FLabel(final Icon i0) {
|
||||
this("");
|
||||
this.setIcon(i0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param s0   {@link java.lang.String}
|
||||
* @param i0   {@link javax.swing.ImageIcon}
|
||||
*/
|
||||
public FLabel(final String s0, final Icon i0) {
|
||||
this(s0);
|
||||
this.setIcon(i0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param s0   {@link java.lang.String} text
|
||||
* @param align0   Text alignment
|
||||
*/
|
||||
public FLabel(final String s0, final int align0) {
|
||||
this(s0);
|
||||
this.setHorizontalAlignment(align0);
|
||||
}
|
||||
|
||||
/** @param s0   {@link java.lang.String} */
|
||||
public FLabel(final String s0) {
|
||||
super(s0);
|
||||
this.skin = Singletons.getView().getSkin();
|
||||
this.setForeground(skin.getColor(FSkin.SkinProp.CLR_TEXT));
|
||||
|
||||
this.cadResize = new ComponentAdapter() {
|
||||
@Override
|
||||
public void componentResized(ComponentEvent e) {
|
||||
switch (fontStyle) {
|
||||
case Font.BOLD:
|
||||
setFont(skin.getBoldFont((int) (getHeight() * fontScaleFactor)));
|
||||
break;
|
||||
case Font.ITALIC:
|
||||
setFont(skin.getItalicFont((int) (getHeight() * fontScaleFactor)));
|
||||
break;
|
||||
default:
|
||||
setFont(skin.getFont((int) (getHeight() * fontScaleFactor)));
|
||||
}
|
||||
|
||||
if (img == null) { return; }
|
||||
aspectRatio = img.getWidth(null) / img.getHeight(null);
|
||||
h = (int) (getHeight() * iconScaleFactor);
|
||||
w = (int) (h * aspectRatio * iconScaleFactor);
|
||||
if (w == 0 || h == 0) { return; }
|
||||
|
||||
FLabel.super.setIcon(new ImageIcon(img.getScaledInstance(w, h, Image.SCALE_SMOOTH)));
|
||||
}
|
||||
};
|
||||
|
||||
this.setScaleAuto(true);
|
||||
}
|
||||
|
||||
/** @param b0   {@link java.lang.boolean} */
|
||||
public void setScaleAuto(final boolean b0) {
|
||||
this.scaleAuto = b0;
|
||||
if (scaleAuto) {
|
||||
this.addComponentListener(cadResize);
|
||||
}
|
||||
else {
|
||||
this.removeComponentListener(cadResize);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether bold or italic font should be used for this label.
|
||||
*
|
||||
* @param i0   Font.BOLD or Font.ITALIC
|
||||
*/
|
||||
public void setFontStyle(int i0) {
|
||||
this.fontStyle = i0;
|
||||
}
|
||||
|
||||
/** @param d0   Scale factor for font size relative to label height, percent. */
|
||||
public void setFontScaleFactor(final double d0) {
|
||||
this.fontScaleFactor = d0;
|
||||
}
|
||||
|
||||
/** @param d0   Scale factor for icon size relative to label height, percent. */
|
||||
public void setIconScaleFactor(final double d0) {
|
||||
this.iconScaleFactor = d0;
|
||||
}
|
||||
|
||||
/** @return {@link java.lang.boolean} */
|
||||
public boolean isScaleAuto() {
|
||||
return this.scaleAuto;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIcon(final Icon i0) {
|
||||
if (scaleAuto) {
|
||||
// Setting the icon in the usual way leads to scaling problems.
|
||||
// So, only the image is saved, and scaled along with the font
|
||||
// in the resize adapter.
|
||||
if (i0 == null) { return; }
|
||||
this.img = ((ImageIcon) i0).getImage();
|
||||
}
|
||||
else {
|
||||
super.setIcon(i0);
|
||||
}
|
||||
}
|
||||
}
|
||||
45
src/main/java/forge/view/toolbox/FRadioButton.java
Normal file
45
src/main/java/forge/view/toolbox/FRadioButton.java
Normal file
@@ -0,0 +1,45 @@
|
||||
package forge.view.toolbox;
|
||||
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
|
||||
import javax.swing.JRadioButton;
|
||||
|
||||
import forge.Singletons;
|
||||
|
||||
/**
|
||||
* A custom instance of JRadioButton using Forge skin properties.
|
||||
*/
|
||||
public class FRadioButton extends JRadioButton {
|
||||
private static final long serialVersionUID = -2366973722131882766L;
|
||||
private final FSkin skin;
|
||||
|
||||
/** */
|
||||
public FRadioButton() {
|
||||
this("");
|
||||
}
|
||||
|
||||
/** @param s0   {@link java.lang.String} */
|
||||
public FRadioButton(String s0) {
|
||||
super();
|
||||
this.setText(s0);
|
||||
this.skin = Singletons.getView().getSkin();
|
||||
this.setForeground(skin.getColor(FSkin.SkinProp.CLR_TEXT));
|
||||
this.setBackground(skin.getColor(FSkin.SkinProp.CLR_HOVER));
|
||||
this.setFont(skin.getFont(14));
|
||||
this.setOpaque(false);
|
||||
|
||||
this.addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseEntered(MouseEvent e) {
|
||||
setOpaque(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseExited(MouseEvent e) {
|
||||
setOpaque(false);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -25,6 +25,6 @@ public class FScrollPane extends JScrollPane {
|
||||
|
||||
skin = Singletons.getView().getSkin();
|
||||
setBorder(new LineBorder(skin.getColor(FSkin.SkinProp.CLR_BORDERS), 1));
|
||||
setBackground(skin.getColor(FSkin.SkinProp.CLR_ZEBRA));
|
||||
setOpaque(false);
|
||||
}
|
||||
}
|
||||
|
||||
25
src/main/java/forge/view/toolbox/FTextArea.java
Normal file
25
src/main/java/forge/view/toolbox/FTextArea.java
Normal file
@@ -0,0 +1,25 @@
|
||||
package forge.view.toolbox;
|
||||
|
||||
import javax.swing.JTextArea;
|
||||
|
||||
import forge.Singletons;
|
||||
|
||||
/**
|
||||
* A custom instance of JTextArea using Forge skin properties.
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class FTextArea extends JTextArea {
|
||||
private final FSkin skin;
|
||||
/** */
|
||||
public FTextArea() {
|
||||
super();
|
||||
this.skin = Singletons.getView().getSkin();
|
||||
this.setForeground(skin.getColor(FSkin.SkinProp.CLR_TEXT));
|
||||
this.setOpaque(false);
|
||||
this.setWrapStyleWord(true);
|
||||
this.setLineWrap(true);
|
||||
this.setFocusable(false);
|
||||
this.setEditable(false);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user