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.WindowAdapter;
import java.awt.event.WindowEvent; import java.awt.event.WindowEvent;
import java.awt.event.WindowListener; import java.awt.event.WindowListener;
import java.io.File;
import java.util.List; import java.util.List;
import javax.swing.JLayeredPane; import javax.swing.JLayeredPane;
@@ -41,6 +42,10 @@ import forge.gui.match.VMatchUI;
import forge.gui.match.controllers.CDock; import forge.gui.match.controllers.CDock;
import forge.gui.toolbox.CardFaceSymbols; import forge.gui.toolbox.CardFaceSymbols;
import forge.gui.toolbox.FSkin; 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; import forge.view.FView;
/** /**
@@ -149,6 +154,14 @@ public enum FControl {
this.shortcuts = KeyboardShortcuts.attachKeyboardShortcuts(); this.shortcuts = KeyboardShortcuts.attachKeyboardShortcuts();
this.display = FView.SINGLETON_INSTANCE.getLpnDocument(); 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. // Handles resizing in null layouts of layers in JLayeredPane.
Singletons.getView().getFrame().addComponentListener(new ComponentAdapter() { Singletons.getView().getFrame().addComponentListener(new ComponentAdapter() {
@Override @Override

View File

@@ -18,7 +18,6 @@
package forge.gui.home; package forge.gui.home;
import java.awt.Component; import java.awt.Component;
import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@@ -36,7 +35,6 @@ import javax.swing.border.EmptyBorder;
import javax.swing.border.MatteBorder; import javax.swing.border.MatteBorder;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import forge.AllZone;
import forge.Command; import forge.Command;
import forge.Singletons; import forge.Singletons;
import forge.gui.framework.DragCell; import forge.gui.framework.DragCell;
@@ -62,10 +60,6 @@ import forge.gui.toolbox.FScrollPane;
import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin;
import forge.properties.ForgePreferences; import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref; 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. * 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(); .iconInBackground(true).iconScaleFactor(1.0).build();
private VMainMenu() { 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). // Add new menu items here (order doesn't matter).
allSubmenus.add(VSubmenuConstructed.SINGLETON_INSTANCE); allSubmenus.add(VSubmenuConstructed.SINGLETON_INSTANCE);
allSubmenus.add(VSubmenuDraft.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.gui.toolbox.FLabel;
import forge.quest.QuestController; import forge.quest.QuestController;
import forge.quest.QuestEventChallenge; import forge.quest.QuestEventChallenge;
import forge.quest.bazaar.QuestItemType;
import forge.quest.bazaar.QuestPetController; import forge.quest.bazaar.QuestPetController;
/** /**
@@ -72,9 +71,10 @@ public enum CSubmenuChallenges implements ICSubmenu, ICDoc {
new Command() { new Command() {
@Override @Override
public void execute() { public void execute() {
AllZone.getQuest().setAvailableChallenges(null); int todo = 5;
AllZone.getQuest().getAssets().setItemLevel(QuestItemType.ZEPPELIN, 2); //AllZone.getQuest().getAchievements().setCurrentChallenges(null);
update(); //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 VSubmenuChallenges view = VSubmenuChallenges.SINGLETON_INSTANCE;
final QuestController qCtrl = AllZone.getQuest(); final QuestController qCtrl = AllZone.getQuest();
if (qCtrl.getAchievements() != null) { if (qCtrl.getAchievements() != null) {
view.getLblTitle().setText("Challenges: " + qCtrl.getRank()); view.getLblTitle().setText("Challenges: " + qCtrl.getRank());

View File

@@ -288,12 +288,19 @@ public class QuestWinLoseHandler extends ControlWinLose {
qData.getCards().clearShopList(); qData.getCards().clearShopList();
qData.getAssets().setItemLevel(QuestItemType.ZEPPELIN, 1); qData.getAssets().setItemLevel(QuestItemType.ZEPPELIN, 1);
if (qEvent instanceof QuestEventChallenge && !((QuestEventChallenge) qEvent).isRepeatable()) { if (qEvent instanceof QuestEventChallenge) {
qData.getAchievements().addCompletedChallenge(((QuestEventChallenge) qEvent).getId()); 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) { if (!((QuestEventChallenge) qEvent).isRepeatable()) {
qData.clearAvailableChallenges(); qData.getAchievements().addLockedChallenge(((QuestEventChallenge) qEvent).getId());
}
} }
matchState.reset(); matchState.reset();

View File

@@ -17,9 +17,7 @@
*/ */
package forge.quest; package forge.quest;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import forge.Singletons; import forge.Singletons;
@@ -57,18 +55,7 @@ public class QuestController {
private QuestEvent currentEvent; private QuestEvent currentEvent;
/** The decks. */ /** The decks. */
transient IStorage<Deck> decks; private 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 QuestEventManager duelManager = null; private QuestEventManager duelManager = null;
private QuestEventManager challengesManager = null; private QuestEventManager challengesManager = null;
@@ -93,14 +80,26 @@ public class QuestController {
"What Do You Do With The Other Hand?", "Freelance Sorcerer, Works Weekends", "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", }; "Should We Hire Commentators?", "Saltblasted For Your Talent", "Serra Angel Is Your Girlfriend", };
/** */
public static final int MAX_PET_SLOTS = 2; public static final int MAX_PET_SLOTS = 2;
private Map<Integer, String> selectedPets = new HashMap<Integer, String>(); 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) { public void selectPet(Integer slot, String name) {
selectedPets.put(slot, name); selectedPets.put(slot, name);
} }
/**
*
* @param slot &emsp; int
* @return String
*/
public String getSelectedPet(Integer slot) { public String getSelectedPet(Integer slot) {
return selectedPets.get(slot); return selectedPets.get(slot);
} }
@@ -185,39 +184,6 @@ public class QuestController {
return false; 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. * New game.
* *
@@ -325,6 +291,11 @@ public class QuestController {
return this.duelManager; return this.duelManager;
} }
/**
*
* TODO: Write javadoc for this method.
* @return QuestEventManager
*/
public QuestEventManager getChallengesManager() { public QuestEventManager getChallengesManager() {
if (this.challengesManager == null) { if (this.challengesManager == null) {
this.challengesManager = new QuestEventManager(ForgeProps.getFile(NewConstants.Quest.CHALLENGES)); this.challengesManager = new QuestEventManager(ForgeProps.getFile(NewConstants.Quest.CHALLENGES));
@@ -332,6 +303,11 @@ public class QuestController {
return this.challengesManager; return this.challengesManager;
} }
/**
*
* TODO: Write javadoc for this method.
* @return QuestPetStorage
*/
public QuestPetStorage getPetsStorage() { public QuestPetStorage getPetsStorage() {
if (this.pets == null) { if (this.pets == null) {
this.pets = new QuestPetStorage(ForgeProps.getFile(NewConstants.Quest.BAZAAR)); this.pets = new QuestPetStorage(ForgeProps.getFile(NewConstants.Quest.BAZAAR));

View File

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

View File

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

View File

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