Bugfix: Quest challenges now persist across restarts. Also some checkstyle.

This commit is contained in:
Doublestrike
2012-05-27 01:19:54 +00:00
parent fe9cf2fe21
commit d4b0cec48c
8 changed files with 112 additions and 107 deletions

View File

@@ -23,6 +23,7 @@ import java.awt.event.ComponentEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.File;
import java.util.List;
import javax.swing.JLayeredPane;
@@ -41,6 +42,10 @@ import forge.gui.match.VMatchUI;
import forge.gui.match.controllers.CDock;
import forge.gui.toolbox.CardFaceSymbols;
import forge.gui.toolbox.FSkin;
import forge.properties.ForgeProps;
import forge.properties.NewConstants;
import forge.quest.data.QuestPreferences.QPref;
import forge.quest.io.QuestDataIO;
import forge.view.FView;
/**
@@ -149,6 +154,14 @@ public enum FControl {
this.shortcuts = KeyboardShortcuts.attachKeyboardShortcuts();
this.display = FView.SINGLETON_INSTANCE.getLpnDocument();
// Preload quest data if present
final File dirQuests = ForgeProps.getFile(NewConstants.Quest.DATA_DIR);
final String questname = Singletons.getModel().getQuestPreferences().getPreference(QPref.CURRENT_QUEST);
final File data = new File(dirQuests.getPath(), questname);
if (data.exists()) {
AllZone.getQuest().load(QuestDataIO.loadData(data));
}
// Handles resizing in null layouts of layers in JLayeredPane.
Singletons.getView().getFrame().addComponentListener(new ComponentAdapter() {
@Override

View File

@@ -18,7 +18,6 @@
package forge.gui.home;
import java.awt.Component;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -36,7 +35,6 @@ import javax.swing.border.EmptyBorder;
import javax.swing.border.MatteBorder;
import net.miginfocom.swing.MigLayout;
import forge.AllZone;
import forge.Command;
import forge.Singletons;
import forge.gui.framework.DragCell;
@@ -62,10 +60,6 @@ import forge.gui.toolbox.FScrollPane;
import forge.gui.toolbox.FSkin;
import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref;
import forge.properties.ForgeProps;
import forge.properties.NewConstants;
import forge.quest.data.QuestPreferences.QPref;
import forge.quest.io.QuestDataIO;
/**
* Assembles Swing components of main menu panel in home screen.
@@ -95,12 +89,6 @@ public enum VMainMenu implements IVDoc {
.iconInBackground(true).iconScaleFactor(1.0).build();
private VMainMenu() {
// There'd a better home for this (model?)
final File dirQuests = ForgeProps.getFile(NewConstants.Quest.DATA_DIR);
final String questname = Singletons.getModel().getQuestPreferences().getPreference(QPref.CURRENT_QUEST);
final File data = new File(dirQuests.getPath(), questname);
if (data.exists()) { AllZone.getQuest().load(QuestDataIO.loadData(data)); }
// Add new menu items here (order doesn't matter).
allSubmenus.add(VSubmenuConstructed.SINGLETON_INSTANCE);
allSubmenus.add(VSubmenuDraft.SINGLETON_INSTANCE);

View File

@@ -18,7 +18,6 @@ import forge.gui.home.quest.SSubmenuQuestUtil.SelectablePanel;
import forge.gui.toolbox.FLabel;
import forge.quest.QuestController;
import forge.quest.QuestEventChallenge;
import forge.quest.bazaar.QuestItemType;
import forge.quest.bazaar.QuestPetController;
/**
@@ -72,9 +71,10 @@ public enum CSubmenuChallenges implements ICSubmenu, ICDoc {
new Command() {
@Override
public void execute() {
AllZone.getQuest().setAvailableChallenges(null);
AllZone.getQuest().getAssets().setItemLevel(QuestItemType.ZEPPELIN, 2);
update();
int todo = 5;
//AllZone.getQuest().getAchievements().setCurrentChallenges(null);
//AllZone.getQuest().getAssets().setItemLevel(QuestItemType.ZEPPELIN, 2);
//update();
}
});
@@ -114,6 +114,7 @@ public enum CSubmenuChallenges implements ICSubmenu, ICDoc {
final VSubmenuChallenges view = VSubmenuChallenges.SINGLETON_INSTANCE;
final QuestController qCtrl = AllZone.getQuest();
if (qCtrl.getAchievements() != null) {
view.getLblTitle().setText("Challenges: " + qCtrl.getRank());

View File

@@ -288,12 +288,19 @@ public class QuestWinLoseHandler extends ControlWinLose {
qData.getCards().clearShopList();
qData.getAssets().setItemLevel(QuestItemType.ZEPPELIN, 1);
if (qEvent instanceof QuestEventChallenge && !((QuestEventChallenge) qEvent).isRepeatable()) {
qData.getAchievements().addCompletedChallenge(((QuestEventChallenge) qEvent).getId());
}
if (qEvent instanceof QuestEventChallenge) {
final int id = ((QuestEventChallenge) qEvent).getId();
final int size = qData.getAchievements().getCurrentChallenges().size();
for (int i = 0; i < size; i++) {
if (qData.getAchievements().getCurrentChallenges().get(i) == id) {
qData.getAchievements().getCurrentChallenges().remove(i);
break;
}
}
if (qData.getAvailableChallenges() != null) {
qData.clearAvailableChallenges();
if (!((QuestEventChallenge) qEvent).isRepeatable()) {
qData.getAchievements().addLockedChallenge(((QuestEventChallenge) qEvent).getId());
}
}
matchState.reset();

View File

@@ -17,9 +17,7 @@
*/
package forge.quest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import forge.Singletons;
@@ -57,18 +55,7 @@ public class QuestController {
private QuestEvent currentEvent;
/** The decks. */
transient IStorage<Deck> decks;
// acquired
// since
// last
// game-win/loss
/** The available challenges. */
private List<Integer> availableChallenges = new ArrayList<Integer>();
/** The available quests. */
private List<Integer> availableQuests = null;
private transient IStorage<Deck> decks;
private QuestEventManager duelManager = null;
private QuestEventManager challengesManager = null;
@@ -93,14 +80,26 @@ public class QuestController {
"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 static final int MAX_PET_SLOTS = 2;
private Map<Integer, String> selectedPets = new HashMap<Integer, String>();
/**
*
* TODO: Write javadoc for this method.
* @param slot &emsp; int
* @param name &emsp; String
*/
public void selectPet(Integer slot, String name) {
selectedPets.put(slot, name);
}
/**
*
* @param slot &emsp; int
* @return String
*/
public String getSelectedPet(Integer slot) {
return selectedPets.get(slot);
}
@@ -185,39 +184,6 @@ public class QuestController {
return false;
}
/**
* Clear available challenges.
*/
public void clearAvailableChallenges() {
this.availableChallenges.clear();
}
/**
* Gets the available challenges.
*
* @return the available challenges
*/
public List<Integer> getAvailableChallenges() {
// This should be phased out after a while, when
// old quest decks have been updated. (changes made 19-9-11)
if (this.availableQuests != null) {
this.availableChallenges = this.availableQuests;
this.availableQuests = null;
}
return this.availableChallenges != null ? new ArrayList<Integer>(this.availableChallenges) : null;
}
/**
* Sets the available challenges.
*
* @param list
* the new available challenges
*/
public void setAvailableChallenges(final List<Integer> list) {
this.availableChallenges = list;
}
/**
* New game.
*
@@ -325,6 +291,11 @@ public class QuestController {
return this.duelManager;
}
/**
*
* TODO: Write javadoc for this method.
* @return QuestEventManager
*/
public QuestEventManager getChallengesManager() {
if (this.challengesManager == null) {
this.challengesManager = new QuestEventManager(ForgeProps.getFile(NewConstants.Quest.CHALLENGES));
@@ -332,6 +303,11 @@ public class QuestController {
return this.challengesManager;
}
/**
*
* TODO: Write javadoc for this method.
* @return QuestPetStorage
*/
public QuestPetStorage getPetsStorage() {
if (this.pets == null) {
this.pets = new QuestPetStorage(ForgeProps.getFile(NewConstants.Quest.BAZAAR));

View File

@@ -159,27 +159,27 @@ public class QuestEventManager {
}
/** Generates an array of new challenge opponents based on current win conditions.
*
*
* @param qCtrl &emsp; QuestController
* @return a {@link java.util.List} object.
*/
public final List<QuestEventChallenge> generateChallenges(final QuestController qCtrl) {
final QuestAchievements achievements = qCtrl.getAchievements();
final List<QuestEventChallenge> challengeOpponents = new ArrayList<QuestEventChallenge>();
final QuestAchievements qData = qCtrl.getAchievements();
final List<Integer> unlockedChallengeIds = new ArrayList<Integer>();
final List<Integer> availableChallengeIds = achievements.getCurrentChallenges();
int maxChallenges = qData.getWin() / 10;
int maxChallenges = achievements.getWin() / 10;
if (maxChallenges > 5) {
maxChallenges = 5;
}
// Generate IDs as needed.
if ((qCtrl.getAvailableChallenges() == null) || (qCtrl.getAvailableChallenges().size() < maxChallenges)) {
final List<Integer> unlockedChallengeIds = new ArrayList<Integer>();
final List<Integer> availableChallengeIds = new ArrayList<Integer>();
if (achievements.getCurrentChallenges().size() < maxChallenges) {
for (final QuestEventChallenge qc : allChallenges) {
if ((qc.getWinsReqd() <= qData.getWin())
&& !qData.getCompletedChallenges().contains(qc.getId())) {
if ((qc.getWinsReqd() <= achievements.getWin())
&& !achievements.getLockedChallenges().contains(qc.getId())
&& !availableChallengeIds.contains(qc.getId())) {
unlockedChallengeIds.add(qc.getId());
}
}
@@ -188,16 +188,16 @@ public class QuestEventManager {
maxChallenges = Math.min(maxChallenges, unlockedChallengeIds.size());
for (int i = 0; i < maxChallenges; i++) {
for (int i = availableChallengeIds.size(); i < maxChallenges; i++) {
availableChallengeIds.add(unlockedChallengeIds.get(i));
}
qCtrl.setAvailableChallenges(availableChallengeIds);
achievements.setCurrentChallenges(availableChallengeIds);
qCtrl.save();
}
// Finally, pull challenge events from available IDs and return.
for (final int i : qCtrl.getAvailableChallenges()) {
for (final int i : achievements.getCurrentChallenges()) {
challengeOpponents.add(getChallengeEventByNumber(i));
}

View File

@@ -14,22 +14,23 @@ public class QuestAchievements {
// Challenge history
/** The challenges played. */
int challengesPlayed = 0;
/** The completed challenges. */
List<Integer> completedChallenges = new ArrayList<Integer>();
/** The win. */
int win; // number of wins
int winstreakBest = 0;
int winstreakCurrent = 0;
private int challengesPlayed = 0;
/** */
private List<Integer> completedChallenges = new ArrayList<Integer>();
/** */
private List<Integer> currentChallenges = new ArrayList<Integer>();
/** The lost. */
int lost;
private int win;
private int winstreakBest = 0;
private int winstreakCurrent = 0;
private int lost;
// Difficulty - will store only index from now.
private int difficulty;
/**
* TODO: Write javadoc for Constructor.
* @param diff
* @param diff &emsp; int
*/
public QuestAchievements(int diff) {
difficulty = diff;
@@ -61,23 +62,23 @@ public class QuestAchievements {
public int getChallengesPlayed() {
return this.challengesPlayed;
}
/**
* <p>
* getCompletedChallenges.
* </p>
* Returns stored list of non-repeatable challenge IDs.
*
* @return List<Integer>
*/
public List<Integer> getCompletedChallenges() {
return this.completedChallenges;
}
/**
* Adds the challenges played.
*/
public void addChallengesPlayed() {
this.challengesPlayed++;
}
/**
* Returns stored list of non-repeatable challenge IDs.
*
* @return List<Integer>
*/
public List<Integer> getLockedChallenges() {
return this.completedChallenges;
}
/**
* <p>
* addCompletedChallenge.
@@ -87,11 +88,32 @@ public class QuestAchievements {
* @param i
* the i
*/
// Poorly named - this should be "setLockedChalleneges" or similar.
public void addCompletedChallenge(final int i) {
public void addLockedChallenge(final int i) {
this.completedChallenges.add(i);
}
/**
* Stores a list of current challenges.
*
* @return List<Integer>
*/
public List<Integer> getCurrentChallenges() {
if (this.currentChallenges == null) {
this.currentChallenges = new ArrayList<Integer>();
}
return this.currentChallenges;
}
/**
* Returns the stored list of current challenges.
*
* @param lst0 List<Integer>
*/
public void setCurrentChallenges(final List<Integer> lst0) {
this.currentChallenges = lst0;
}
/**
* Adds the lost.
*/

View File

@@ -54,8 +54,6 @@ public enum FView {
/** */
public void initialize() {
SplashFrame.PROGRESS_BAR.setDescription("Creating display components.");
// Frame styling
frmDocument.setMinimumSize(new Dimension(800, 600));
frmDocument.setLocationRelativeTo(null);