Added new XML-based save file format. Old save file format will be converted automatically.

This commit is contained in:
jendave
2011-08-06 17:28:36 +00:00
parent 27c67684a6
commit 26a2cf7757
12 changed files with 236 additions and 278 deletions

7
.gitattributes vendored
View File

@@ -7420,14 +7420,15 @@ src/forge/properties/ForgeProps.java svneol=native#text/plain
src/forge/properties/NewConstants.java svneol=native#text/plain
src/forge/properties/Preferences.java svneol=native#text/plain
src/forge/properties/SavePreferencesListener.java svneol=native#text/plain
src/forge/quest/data/QuestBoosterPack.java svneol=native#text/plain
src/forge/quest/data/QuestData.java svneol=native#text/plain
src/forge/quest/data/QuestData_BoosterPack.java svneol=native#text/plain
src/forge/quest/data/QuestData_Prefs.java svneol=native#text/plain
src/forge/quest/data/QuestData_State.java svneol=native#text/plain
src/forge/quest/data/QuestMatchState.java svneol=native#text/plain
src/forge/quest/data/QuestPreferences.java svneol=native#text/plain
src/forge/quest/data/QuestUtil.java svneol=native#text/plain
src/forge/quest/data/pet/QuestPetAbstract.java svneol=native#text/plain
src/forge/quest/data/pet/QuestPetBird.java svneol=native#text/plain
src/forge/quest/data/pet/QuestPetCrocodile.java svneol=native#text/plain
src/forge/quest/data/pet/QuestPetFactory.java svneol=native#text/plain
src/forge/quest/data/pet/QuestPetHound.java svneol=native#text/plain
src/forge/quest/data/pet/QuestPetPlant.java svneol=native#text/plain
src/forge/quest/data/pet/QuestPetWolf.java svneol=native#text/plain

View File

@@ -9,6 +9,7 @@ easy--file=easy.txt
medium--file=medium.txt
hard--file=hard.txt
data-xml--file=questData.dat
data--file=questData
prefs--file=quest.preferences

View File

@@ -2,14 +2,11 @@ package forge;
//import java.io.BufferedReader;
//import java.io.File;
//import java.io.FileReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import forge.properties.NewConstants;
import java.util.*;
//balance the number of colors and creature/spells for
//new cards that are won in quest mode
public class QuestData_BoosterPack implements NewConstants {
@@ -308,7 +305,7 @@ public class QuestData_BoosterPack implements NewConstants {
} catch(Exception ex) {
ErrorViewer.showError(ex);
throw new RuntimeException("QuestData_BoosterPack : readFile() error, " + ex);
throw new RuntimeException("QuestBoosterPack : readFile() error, " + ex);
}
return cardList;

View File

@@ -104,6 +104,7 @@ public interface NewConstants {
public static final String PREFS = "quest/prefs";
public static final String DECKS = "quest/decks-dir";
public static final String XMLDATA = "quest/data-xml";
}
/**

View File

@@ -14,7 +14,7 @@ import java.util.*;
//balance the number of colors and creature/spells for
//new cards that are won in quest mode
public class QuestData_BoosterPack implements NewConstants {
public class QuestBoosterPack implements NewConstants {
// final private static String comment = "//";
private ArrayList<String> commonCreature = new ArrayList<String>();
@@ -42,7 +42,7 @@ public class QuestData_BoosterPack implements NewConstants {
//prints statistics to make sure everything is working
public static void main(String[] args) {
QuestData_BoosterPack q = new QuestData_BoosterPack();
QuestBoosterPack q = new QuestBoosterPack();
for(int i = 0; i < 100; i++)
q.print(q.getNewCards(6, 3, 1));
@@ -95,7 +95,7 @@ public class QuestData_BoosterPack implements NewConstants {
}
}//colorStats()
public QuestData_BoosterPack() {
public QuestBoosterPack() {
//setup(ForgeProps.getFile(QUEST.COMMON), commonCreature, commonSpell);
//setup(ForgeProps.getFile(QUEST.UNCOMMON), uncommonCreature, uncommonSpell);
//setup(ForgeProps.getFile(QUEST.RARE), rareCreature, rareSpell);
@@ -310,7 +310,7 @@ public class QuestData_BoosterPack implements NewConstants {
} catch(Exception ex) {
ErrorViewer.showError(ex);
throw new RuntimeException("QuestData_BoosterPack : readFile() error, " + ex);
throw new RuntimeException("QuestBoosterPack : readFile() error, " + ex);
}
return cardList;

View File

@@ -1,13 +1,17 @@
package forge.quest.data;
import com.esotericsoftware.minlog.Log;
import com.thoughtworks.xstream.XStream;
import forge.*;
import forge.error.ErrorViewer;
import forge.properties.ForgeProps;
import forge.properties.NewConstants;
import forge.quest.data.pet.*;
import java.io.*;
import java.util.*;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
//when you create QuestData and AFTER you copy the AI decks over
@@ -19,19 +23,15 @@ import java.util.*;
//OR non-static readAIQuestDeckFiles()
//which reads the files "questDecks-easy", "questDecks-medium","questDecks-hard",
public class QuestData {
QuestData_Prefs qdPrefs = null;
QuestPreferences qdPrefs = null;
private int rankIndex;
private int win;
private int lost;
private int plantLevel;
private int wolfPetLevel;
private int crocPetLevel;
private int birdPetLevel;
private int houndPetLevel;
private List<QuestPetAbstract> pets;
private String selectedPet;
private QuestPetAbstract selectedPet;
private int life;
private int estatesLevel;
@@ -47,12 +47,12 @@ public class QuestData {
private String difficulty;
private String mode = "";
private ArrayList<String> easyAIDecks;
private ArrayList<String> mediumAIDecks;
private ArrayList<String> hardAIDecks;
private transient ArrayList<String> easyAIDecks;
private transient ArrayList<String> mediumAIDecks;
private transient ArrayList<String> hardAIDecks;
private Map<String, Deck> myDecks = new HashMap<String, Deck>();
private Map<String, Deck> aiDecks = new HashMap<String, Deck>();
private transient Map<String, Deck> aiDecks = new HashMap<String, Deck>();
//holds String card names
private ArrayList<String> cardPool = new ArrayList<String>();
@@ -62,13 +62,13 @@ public class QuestData {
private ArrayList<Integer> availableQuests = new ArrayList<Integer>();
private ArrayList<Integer> completedQuests = new ArrayList<Integer>();
private QuestData_BoosterPack boosterPack = new QuestData_BoosterPack();
private transient QuestBoosterPack boosterPack = new QuestBoosterPack();
//used by shouldAddAdditionalCards()
private Random random = new Random();
//feel free to change this to something funnier
private String[] rankArray = {
private transient String[] rankArray = {
"Level 0 - Confused Wizard", "Level 1 - Mana Mage", "Level 2 - Death by Megrim",
"Level 3 - Shattered the Competition", "Level 4 - Black Knighted", "Level 5 - Shockingly Good",
"Level 6 - Regressed into Timmy", "Level 7 - Loves Blue Control", "Level 8 - Immobilized by Fear",
@@ -82,7 +82,7 @@ public class QuestData {
public boolean useNewQuestUI = false;
public QuestData() {
qdPrefs = new QuestData_Prefs();
qdPrefs = new QuestPreferences();
for (int i = 0; i < qdPrefs.getStartingBasic(); i++) {
cardPool.add("Forest");
@@ -99,6 +99,8 @@ public class QuestData {
cardPool.add("Snow-Covered Island");
cardPool.add("Snow-Covered Plains");
}
readAIQuestDeckFiles();
}//QuestData
//adds cards to card pool and sets difficulty
@@ -125,7 +127,7 @@ public class QuestData {
public String[] getOpponents() {
int index = getDiffIndex();
int index = getDifficultyIndex();
if (getWin() < qdPrefs.getWinsForMediumAI(index)) {
return getOpponents(easyAIDecks);
@@ -139,17 +141,10 @@ public class QuestData {
}//getOpponents()
static public void readAIQuestDeckFiles(QuestData data, ArrayList<String> aiDeckNames) {
private void readAIQuestDeckFiles(QuestData data, ArrayList<String> aiDeckNames) {
data.easyAIDecks = readFile(ForgeProps.getFile(NewConstants.QUEST.EASY), aiDeckNames);
data.mediumAIDecks = readFile(ForgeProps.getFile(NewConstants.QUEST.MEDIUM), aiDeckNames);
data.hardAIDecks = readFile(ForgeProps.getFile(
NewConstants.QUEST.HARD), aiDeckNames);
}
public void refreshAIQuestDeckFiles(ArrayList<String> aiDeckNames) {
easyAIDecks = readFile(ForgeProps.getFile(NewConstants.QUEST.EASY), aiDeckNames);
mediumAIDecks = readFile(ForgeProps.getFile(NewConstants.QUEST.MEDIUM), aiDeckNames);
hardAIDecks = readFile(ForgeProps.getFile(NewConstants.QUEST.HARD), aiDeckNames);
data.hardAIDecks = readFile(ForgeProps.getFile(NewConstants.QUEST.HARD), aiDeckNames);
}
public String[] getOpponents(ArrayList<String> aiDeck) {
@@ -200,54 +195,101 @@ public class QuestData {
static public QuestData loadData() {
try {
//read file "questData"
ObjectInputStream in = new ObjectInputStream(new FileInputStream(ForgeProps.getFile(NewConstants.QUEST.DATA)));
Object o = in.readObject();
in.close();
QuestData data;
QuestData_State state = (QuestData_State) o;
File xmlSaveFile = ForgeProps.getFile(NewConstants.QUEST.XMLDATA);
QuestData data = new QuestData();
//if the new file format does not exist, convert the old one and save it as the new copy
data.win = state.win;
data.lost = state.lost;
data.credits = state.credits;
data.rankIndex = state.rankIndex;
data.difficulty = state.difficulty;
data.mode = state.mode;
if (data.mode == null) {
data.mode = REALISTIC;
if (!xmlSaveFile.exists()) {
data = convertSaveFormat();
data.saveData();
}
data.plantLevel = state.plantLevel;
data.wolfPetLevel = state.wolfPetLevel;
data.crocPetLevel = state.crocPetLevel;
data.birdPetLevel = state.birdPetLevel;
data.houndPetLevel = state.houndPetLevel;
data.selectedPet = state.selectedPet;
data.life = state.life;
data.estatesLevel = state.estatesLevel;
data.luckyCoinLevel = state.luckyCoinLevel;
data.sleightOfHandLevel = state.sleightOfHandLevel;
data.gearLevel = state.gearLevel;
data.questsPlayed = state.questsPlayed;
data.availableQuests = state.availableQuests;
data.completedQuests = state.completedQuests;
else {
BufferedInputStream bin = new BufferedInputStream(new FileInputStream(xmlSaveFile));
GZIPInputStream zin = new GZIPInputStream(bin);
data.shopList = state.shopList;
data.cardPool = state.cardPool;
data.myDecks = state.myDecks;
data.aiDecks = state.aiDecks;
XStream xStream = new XStream();
readAIQuestDeckFiles(data, new ArrayList<String>(data.aiDecks.keySet()));
data = (QuestData) xStream.fromXML(zin);
data.readAIQuestDeckFiles(data, new ArrayList<String>());
zin.close();
}
return data;
}//try
}
catch (Exception ex) {
ErrorViewer.showError(ex, "Error loading Quest Data");
throw new RuntimeException(ex);
}
}//loadData()
}
private static QuestData convertSaveFormat() {
forge.QuestData oldData = forge.QuestData.loadData();
QuestData newData = new QuestData();
newData.difficulty = oldData.getDifficulty();
newData.diffIndex = oldData.getDiffIndex();
newData.rankIndex = oldData.getWin()/newData.qdPrefs.getWinsForRankIncrease(newData.diffIndex);
newData.win = oldData.getWin();
newData.lost = oldData.getLost();
newData.life = oldData.getLife();
newData.estatesLevel = oldData.getEstatesLevel();
newData.luckyCoinLevel = oldData.getLuckyCoinLevel();
newData.sleightOfHandLevel = oldData.getSleightOfHandLevel();
newData.gearLevel = oldData.getGearLevel();
newData.questsPlayed = oldData.getQuestsPlayed();
newData.credits = oldData.getCredits();
newData.mode = oldData.getMode();
newData.myDecks = new HashMap<String, Deck>();
for (String deckName : oldData.getDeckNames()) {
newData.myDecks.put(deckName, oldData.getDeck(deckName));
}
newData.cardPool = oldData.getCardpool();
newData.newCardList = oldData.getAddedCards();
newData.shopList = oldData.getShopList();
newData.availableQuests = oldData.getAvailableQuests();
newData.completedQuests = oldData.getCompletedQuests();
newData.pets = new ArrayList<QuestPetAbstract>();
QuestPetAbstract newPet;
if(oldData.getBirdPetLevel() > 0){
newPet = new QuestPetBird();
newPet.setLevel(oldData.getBirdPetLevel());
newData.pets.add(newPet);
}
if(oldData.getHoundPetLevel() > 0){
newPet = new QuestPetHound();
newPet.setLevel(oldData.getHoundPetLevel());
newData.pets.add(newPet);
}
if(oldData.getWolfPetLevel() > 0){
newPet = new QuestPetWolf();
newPet.setLevel(oldData.getWolfPetLevel());
newData.pets.add(newPet);
}
if(oldData.getCrocPetLevel() > 0){
newPet = new QuestPetCrocodile();
newPet.setLevel(oldData.getCrocPetLevel());
newData.pets.add(newPet);
}
if(oldData.getPlantLevel() > 0){
newPet = new QuestPetPlant();
newPet.setLevel(oldData.getPlantLevel());
newData.pets.add(newPet);
}
return newData;
}
//returns Strings of the card names
@@ -498,13 +540,13 @@ public class QuestData {
}
}
public long getCreditsToAdd(WinLose winLose) {
public long getCreditsToAdd(QuestMatchState matchState) {
long creds = (long) (qdPrefs.getMatchRewardBase() + (qdPrefs.getMatchRewardTotalWins() * win));
String[] wins = winLose.getWinMethods();
int[] winTurns = winLose.getWinTurns();
boolean[] mulliganedToZero = winLose.getMulliganedToZero();
String[] wins = matchState.getWinMethods();
int[] winTurns = matchState.getWinTurns();
boolean[] mulliganedToZero = matchState.getMulliganedToZero();
if (winLose.getLose() == 0) {
if (matchState.getLose() == 0) {
creds += qdPrefs.getMatchRewardNoLosses();
}
@@ -599,55 +641,15 @@ public class QuestData {
//********************FANTASY STUFF START***********************
public void addPlantLevel() {
plantLevel++;
public void setSelectedPet(QuestPetAbstract pet) {
selectedPet = pet;
}
public int getPlantLevel() {
return plantLevel;
}
public void addWolfPetLevel() {
wolfPetLevel++;
}
public int getWolfPetLevel() {
return wolfPetLevel;
}
public void addCrocPetLevel() {
crocPetLevel++;
}
public int getCrocPetLevel() {
return crocPetLevel;
}
public void addBirdPetLevel() {
birdPetLevel++;
}
public int getBirdPetLevel() {
return birdPetLevel;
}
public void addHoundPetLevel() {
houndPetLevel++;
}
public int getHoundPetLevel() {
return houndPetLevel;
}
public void setSelectedPet(String s) {
selectedPet = s;
}
public String getSelectedPet() {
public QuestPetAbstract getSelectedPet() {
return selectedPet;
}
public void setLife(int n) {
life = n;
}
@@ -724,12 +726,8 @@ public class QuestData {
return mode;
}
//should be called first, because the difficultly won't change
public String getDifficulty() {
return difficulty;
}
public int getDiffIndex() {
public int getDifficultyIndex() {
return diffIndex;
}
@@ -738,18 +736,6 @@ public class QuestData {
difficulty = qdPrefs.getDifficulty(i);
}
public void setDifficultyIndex() {
String[] diffStr = qdPrefs.getDifficulty();
for (int i = 0; i < diffStr.length; i++) {
if (difficulty.equals(diffStr[i])) {
diffIndex = i;
}
}
}
public String[] getDifficutlyChoices() {
return qdPrefs.getDifficulty();
}
public String getRank() {
//is rankIndex too big?
@@ -790,79 +776,21 @@ public class QuestData {
}
}
//opponentName is one of the Strings returned by getOpponents()
public Deck getOpponentDeck(String opponentName) {
return null;
}
public boolean hasSaveFile() {
//File f = new File(this.saveFileName); // The static field QuestData.saveFileName should be accessed in a static way
// No warning is given for it below in getBackupFilename
return ForgeProps.getFile(NewConstants.QUEST.DATA).exists();
}
//returns somethings like "questData-10"
//find a new filename
@SuppressWarnings("unused")
static private File getBackupFilename() {
//I made this a long because maybe an int would overflow, but who knows
File original = ForgeProps.getFile(NewConstants.QUEST.DATA);
File parent = original.getParentFile();
String name = original.getName();
long n = 1;
File f;
while ((f = new File(parent, name + "-" + n)).exists()) {
n++;
}
return f;
}//getBackupFilename()
static public void saveData(QuestData q) {
public void saveData() {
try {
/*
//rename previous file "questData" to something like questData-23
//just in case there is an error when playing the game or saving
File file = new File(saveFileName);
if(file.exists())
file.renameTo(getBackupFilename());
*/
File f = ForgeProps.getFile(NewConstants.QUEST.XMLDATA);
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(f));
GZIPOutputStream zout = new GZIPOutputStream(bout);
//setup QuestData_State
QuestData_State state = new QuestData_State();
state.win = q.win;
state.lost = q.lost;
state.credits = q.credits;
state.difficulty = q.difficulty;
state.mode = q.mode;
state.rankIndex = q.rankIndex;
XStream xStream = new XStream();
xStream.toXML(this, zout);
state.plantLevel = q.plantLevel;
state.wolfPetLevel = q.wolfPetLevel;
state.crocPetLevel = q.crocPetLevel;
state.birdPetLevel = q.birdPetLevel;
state.houndPetLevel = q.houndPetLevel;
state.selectedPet = q.selectedPet;
state.life = q.life;
state.estatesLevel = q.estatesLevel;
state.luckyCoinLevel = q.luckyCoinLevel;
state.sleightOfHandLevel = q.sleightOfHandLevel;
state.gearLevel = q.gearLevel;
state.questsPlayed = q.questsPlayed;
state.availableQuests = q.availableQuests;
state.cardPool = q.cardPool;
state.shopList = q.shopList;
state.myDecks = q.myDecks;
state.aiDecks = q.aiDecks;
//write object
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(ForgeProps.getFile(NewConstants.QUEST.DATA)));
out.writeObject(state);
out.flush();
out.close();
zout.flush();
zout.close();
} catch (Exception ex) {
ErrorViewer.showError(ex, "Error saving Quest Data");
throw new RuntimeException(ex);
@@ -876,8 +804,8 @@ public class QuestData {
}
for (int i = 0; i < 10; i++) {
QuestData.saveData(q);
QuestData.loadData();
q.saveData();
q = QuestData.loadData();
}
System.exit(1);

View File

@@ -1,69 +0,0 @@
package forge.quest.data;
/**
* QuestData_State.java
*
* Created on 26.10.2009
*/
import forge.Deck;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Map;
/**
* The class QuestData_State.
*
* @version V0.0 26.10.2009
* @author Clemens Koza
*/
public class QuestData_State implements Serializable {
private static final long serialVersionUID = 7007940230351051937L;
int rankIndex, win, lost;
int plantLevel, wolfPetLevel, crocPetLevel, birdPetLevel, houndPetLevel, life, estatesLevel, luckyCoinLevel, sleightOfHandLevel, gearLevel, questsPlayed;
long credits;
String difficulty, mode, selectedPet;
ArrayList<Integer> availableQuests, completedQuests;
ArrayList<String> cardPool, shopList;
Map<String, Deck> myDecks, aiDecks;
public QuestData_State() {}
/**
* This constructor is used by QestData_State in the default package to create a replacement object for the
* obsolete class.
*/
public QuestData_State(int rankIndex, int win, int lost, int plantLevel, int wolfPetLevel, int crocPetLevel, int birdPetLevel, int houndPetLevel, String selectedPet, int life, int estatesLevel, int luckyCoinLevel, int sleightOfHandLevel, int gearLevel, int questsPlayed,
ArrayList<Integer> availableQuests, ArrayList<Integer> completedQuests, long credits, String difficulty, String mode,
ArrayList<String> cardPool, ArrayList<String> shopList, Map<String, Deck> myDecks, Map<String, Deck> aiDecks) {
this.rankIndex = rankIndex;
this.win = win;
this.lost = lost;
this.plantLevel = plantLevel;
this.wolfPetLevel = wolfPetLevel;
this.crocPetLevel = crocPetLevel;
this.birdPetLevel = birdPetLevel;
this.houndPetLevel = houndPetLevel;
this.life = life;
this.estatesLevel = estatesLevel;
this.luckyCoinLevel = luckyCoinLevel;
this.sleightOfHandLevel = sleightOfHandLevel;
this.gearLevel = gearLevel;
this.questsPlayed = questsPlayed;
this.availableQuests = availableQuests;
this.completedQuests = completedQuests;
this.credits = credits;
this.difficulty = difficulty;
this.mode = mode;
this.cardPool = cardPool;
this.shopList = shopList;
this.myDecks = myDecks;
this.aiDecks = aiDecks;
}
}

View File

@@ -0,0 +1,78 @@
package forge.quest.data;
public class QuestMatchState {
//the way wins were achieved:
//Damage
//Poison Counters
//Battle of Wits
//Mortal Combat
//Milled
//Felidar Sovereign
//...
//
private String[] winMethods = new String[2];
private int[] winTurns = new int[2];
private boolean[] mulliganedToZero = new boolean[2];
private int win;
private int lose;
private boolean winRecently;
public void reset() {
win = 0;
lose = 0;
winMethods = new String[2];
}
public void addWin() {
win++;
winRecently = true;
}
public void addLose() {
lose++;
winRecently = false;
}
public int getWin() {
return win;
}
public int getLose() {
return lose;
}
public int countWinLose() {
return win + lose;
}
public void setWinMethod(int gameNumber, String method) {
winMethods[gameNumber] = method;
}
public String[] getWinMethods() {
return winMethods;
}
public void setWinTurn(int gameNumber, int turns) {
winTurns[gameNumber] = turns;
}
public int[] getWinTurns() {
return winTurns;
}
public boolean[] getMulliganedToZero() {
return mulliganedToZero;
}
public void setMulliganedToZero(int gameNumber, boolean b) {
mulliganedToZero[gameNumber] = b;
}
public boolean didWinRecently() {
return winRecently;
}
}

View File

@@ -7,7 +7,7 @@ import java.io.BufferedReader;
import java.io.FileReader;
import java.io.Serializable;
public class QuestData_Prefs implements Serializable {
public class QuestPreferences implements Serializable {
private static final long serialVersionUID = 3266336025656577905L;
private int numDiff = 4;
@@ -50,7 +50,7 @@ public class QuestData_Prefs implements Serializable {
private int matchRewardWinByTurnFifteen = 5;
private int matchRewardMullToZero = 500;
public QuestData_Prefs()
public QuestPreferences()
{
// if quest.prefs exists
grabPrefsFromFile();

View File

@@ -434,7 +434,7 @@ public class QuestUtil {
* White = 6
*/
QuestData_BoosterPack pack = new QuestData_BoosterPack();
QuestBoosterPack pack = new QuestBoosterPack();
qa.clearCompy();
int id = qa.getId();

View File

@@ -51,4 +51,8 @@ public abstract class QuestPetAbstract {
this.name = name;
this.maxLevel = maxLevel;
}
public void setLevel(int level){
this.level = level;
}
}

View File

@@ -0,0 +1,17 @@
package forge.quest.data.pet;
import java.util.ArrayList;
import java.util.List;
public class QuestPetFactory {
static List<QuestPetAbstract> getAllPets(){
List<QuestPetAbstract> pets = new ArrayList<QuestPetAbstract>();
pets.add(new QuestPetWolf());
pets.add(new QuestPetCrocodile());
pets.add(new QuestPetBird());
pets.add(new QuestPetHound());
return pets;
}
}