/*
* EU3SaveGame.java
*
* Created on March 22, 2007, 2:24 PM
*/
package eug.specific.eu3;
import eug.parser.EUGFileIO;
import eug.shared.FilenameResolver;
import eug.shared.GenericObject;
import eug.shared.ObjectVariable;
import eug.shared.Scenario;
import eug.shared.Style;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
* @author Michael Myers
* @since EUGFile 1.03.00
*/
public class EU3SaveGame extends Scenario implements EU3DataSource {
// public static final String eu3FolderPath = "c:/program files/paradox interactive/europa universalis iii/";
// public static final String modName = "";
private String savePath;
private FilenameResolver resolver;
private Map<String, GenericObject> countryMap;
// private List<GenericObject> provinces;
private int lastProvId;
private GenericObject diplomacy;
private boolean hasUnsavedChanges = false;
/**
* Creates a new instance of EU3SaveGame
*/
public EU3SaveGame(GenericObject root, String savePath, String mainPath, String modName) {
this.root = root;
this.scenarioName = "";
this.savePath = savePath;
resolver = new FilenameResolver(mainPath, modName);
// initDisplayNames();
// initProvs();
// initCountries();
}
public EU3SaveGame(GenericObject root, String savePath, FilenameResolver resolver) {
this.root = root;
this.scenarioName = "";
this.savePath = savePath;
this.resolver = resolver;
}
public static EU3SaveGame loadSaveGame(String filename, String mainPath, String modName) {
return new EU3SaveGame(EUGFileIO.load(filename), filename, mainPath, modName);
}
public static EU3SaveGame loadSaveGame(String filename, FilenameResolver resolver) {
return new EU3SaveGame(EUGFileIO.load(filename), filename, resolver);
}
/** Load English display names from all files in the localisation dir. */
private void initDisplayNames() {
displayNames = new HashMap<String, String>();
for (File f : resolver.listFiles("localisation")) {
try {
BufferedReader r = new BufferedReader(new FileReader(f), (int)f.length());
String line;
while ((line = r.readLine()) != null) {
String[] array = line.split(";");
displayNames.put(array[0], array[1]);
}
r.close();
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
private void initProvs() {
provinces = new ArrayList<GenericObject>(1500);
for (int i = 1; /* loop until broken */; i++) {
GenericObject prov = root.getChild(Integer.toString(i));
if (prov == null) {
lastProvId = i-1;
break;
}
provinces.add(prov);
}
// System.out.println(lastProvId + " provinces");
}
private static final java.util.regex.Pattern tagPattern = java.util.regex.Pattern.compile("[A-Z][A-Z0-9]{2}");
private void initCountries() {
countryMap = new HashMap<String, GenericObject>(100);
for (GenericObject obj : root.children) {
if (tagPattern.matcher(obj.name).matches()) {
countryMap.put(obj.name, obj);
}
}
// System.out.println(countries.size() + " countries");
}
// Lazy accessor
private Map<String, GenericObject> getCountryMap() {
if (countries == null)
initCountries();
return countryMap;
}
// Lazy accessor
private List<GenericObject> getProvinces() {
if (provinces == null)
initProvs();
return provinces;
}
public List<String> getCountryTags() {
return new ArrayList<String>(getCountryMap().keySet());
}
public List<GenericObject> getCountries() {
return new ArrayList<GenericObject>(getCountryMap().values());
}
public EU3Country getEU3Country(final String tag) {
return new EU3Country(getCountryMap().get(tag.substring(0,3).toUpperCase()), this);
}
public EU3Province getEU3Province(int id) {
return new EU3Province(getProvinces().get(id + 1), this);
}
public GenericObject getCountry(String tag) {
return getCountryMap().get(tag.substring(0,3).toUpperCase());
}
public GenericObject getCountryHistory(String tag) {
return getCountryMap().get(tag.substring(0,3).toUpperCase()).getChild("history");
}
public GenericObject getProvince(int id) {
if (id > lastProvId)
return null;
return getProvinces().get(id-1);
}
public GenericObject getProvinceHistory(int id) {
return getProvinces().get(id-1).getChild("history");
}
public List<GenericObject> getWars() {
List<GenericObject> ret = root.getChildren("active_war");
ret.addAll(root.getChildren("previous_war"));
return ret;
}
public List<GenericObject> getWars(String date) {
List<GenericObject> ret = new ArrayList<GenericObject>();
// Only check wars if the date is in the past
if (EU3History.DATE_COMPARATOR.isBefore(date, getDate())) {
for (GenericObject war : root.getChildren("active_war")) {
List<String> participants =
EU3History.getHistStrings(war, date, "add_attacker", "rem_attacker");
if (!participants.isEmpty())
ret.add(war);
}
for (GenericObject war : root.getChildren("previous_war")) {
List<String> participants =
EU3History.getHistStrings(war, date, "add_attacker", "rem_attacker");
if (!participants.isEmpty())
ret.add(war);
}
}
return ret;
}
public void removeWar(String name) {
GenericObject toRemove = null;
for (GenericObject war : getWars()) {
if (war.getString("name").equals(name)) {
toRemove = war;
break;
}
}
if (toRemove != null) {
toRemove.getParent().removeChild(toRemove);
hasUnsavedChanges = true;
}
}
public String getCountryAsStr(String tag) {
return getCountryMap().get(tag.substring(0,3).toUpperCase()).toString(Style.EU3_SAVE_GAME);
}
public String getCountryHistoryAsStr(String tag) {
return getCountryMap().get(tag.substring(0,3).toUpperCase()).getChild("history").toString(Style.EU3_SAVE_GAME);
}
public String getProvinceAsStr(int id) {
return getProvinces().get(id-1).toString(Style.EU3_SAVE_GAME);
}
public String getProvinceHistoryAsStr(int id) {
return getProvinces().get(id-1).getChild("history").toString(Style.EU3_SAVE_GAME);
}
public void saveCountry(String tag, String cname, final String data) {
GenericObject country = getCountryMap().get(tag);
country.clear();
GenericObject newCountry = EUGFileIO.loadFromString(data);
country.addAllChildren(newCountry.getChild(tag));
hasUnsavedChanges = true;
}
public void saveProvince(int id, String pname, final String data) {
GenericObject province = getProvinces().get(id-1);
province.clear();
GenericObject newProvince = EUGFileIO.loadFromString(data);
province.addAllChildren(newProvince.getChild(Integer.toString(id)));
hasUnsavedChanges = true;
}
public void saveWar(String name, String data) {
GenericObject newWar = EUGFileIO.loadFromString(data);
for (GenericObject war : getWars()) {
if (war.getString("name").equals(name)) {
war.clear();
war.addAllChildren(newWar.getChild(0));
hasUnsavedChanges = true;
return;
}
}
}
public void saveChanges() {
if (hasUnsavedChanges) {
EUGFileIO.save(root, savePath, EUGFileIO.NO_COMMENT, true, Style.EU3_SAVE_GAME);
hasUnsavedChanges = false;
}
}
public boolean hasUnsavedChanges() {
return hasUnsavedChanges;
}
public void reloadCountry(String tag) {
// What to do here?
initCountries();
}
public void reloadCountryHistory(String tag) {
// What to do here?
initCountries();
}
public void reloadProvince(int id) {
// What to do here?
initProvs();
}
public void reloadProvinceHistory(int id) {
// What to do here?
initProvs();
}
public void preloadProvinces(int last) {
// ignore parameter, since it's so quick anyway
preloadProvinces();
}
public void preloadProvinces() {
if (provinces == null)
initProvs();
}
public void preloadCountries() {
if (countries == null)
initCountries();
}
@Override
public int numCountries() {
return getCountryMap().size();
}
public String getDate() {
return root.getString("date");
}
public int getLastProvID() {
return lastProvId;
}
// Lazy accessor
private GenericObject getDiplomacy() {
if (diplomacy == null)
diplomacy = root.getChild("diplomacy");
return diplomacy;
}
public List<GenericObject> getAlliances() {
return getDiplomacy().getChildren("alliance");
}
public List<GenericObject> getTradeAgreements() {
return getDiplomacy().getChildren("trade_agreement");
}
public List<GenericObject> getVassalizations() {
return getDiplomacy().getChildren("vassal");
}
public List<GenericObject> getCasusBellis() {
return getDiplomacy().getChildren("casus_belli");
}
public List<GenericObject> getRoyalMarriages() {
return getDiplomacy().getChildren("royal_marriage");
}
public List<GenericObject> getUnions() {
return getDiplomacy().getChildren("union");
}
void changeCountryTag(String oldTag, String newTag) {
oldTag = oldTag.toUpperCase();
newTag = newTag.toUpperCase();
if (oldTag.equals(newTag))
return;
if (getCountryMap() != null) {
countryMap.put(newTag, getCountryMap().get(oldTag));
countryMap.remove(oldTag);
}
// Emperor
if (root.getString("emperor").equals(oldTag))
root.setString("emperor", newTag);
// Papacy and cardinals
GenericObject papacy = root.getChild("papacy");
if (papacy.getString("controller").equals(oldTag))
papacy.setString("controller", newTag);
for (GenericObject cardinal : papacy.getChildren("cardinal"))
if (cardinal.getString("controller").equals(oldTag))
cardinal.setString("controller", newTag);
// Trade
GenericObject trade = root.getChild("trade");
for (GenericObject cot : trade.getChildren("cot")) {
for (GenericObject ctry : cot.children) {
if (ctry.name.equals(oldTag)) {
ctry.name = newTag;
break;
}
}
}
// Provinces
for (GenericObject prov : provinces) {
if (prov.getString("owner").equals(oldTag))
prov.setString("owner", newTag);
if (prov.getString("controller").equals(oldTag))
prov.setString("controller", newTag);
for (ObjectVariable var : prov.values) {
if (var.varname.equals("core")) {
if (var.getValue().equals(oldTag)) {
var.setValue(newTag);
break;
}
}
}
// ignore discoveries...
}
// Relations
preloadCountries();
for (GenericObject country : getCountryMap().values()) {
for (GenericObject child : country.children) {
if (child.name.equals(oldTag)) {
child.name = newTag;
break;
}
}
}
// Diplomacy
for (GenericObject alliance : getDiplomacy().children) {
if (alliance.getString("first").equals(oldTag) && !alliance.getString("second").equals(newTag))
alliance.setString("first", newTag);
else if (alliance.getString("second").equals(oldTag) && !alliance.getString("first").equals(newTag))
alliance.setString("second", newTag);
}
// Wars
for (GenericObject war : root.getChildren("active_war")) {
if (war.getString("attacker").equals(oldTag) && !war.getString("defender").equals(newTag))
war.setString("attacker", newTag);
else if (war.getString("defender").equals(oldTag) && !war.getString("attacker").equals(newTag))
war.setString("defender", newTag);
}
// Whew... I think that's it.
// Now to make sure there aren't old entries in the country database.
initCountries();
}
public static void main(String[] args) {
// javax.swing.JFileChooser jfc = new javax.swing.JFileChooser();
// int choice = jfc.showOpenDialog(null);
//
// if (choice == jfc.APPROVE_OPTION) {
/*EU3SaveGame scenario =*/ new EU3SaveGame(
EUGFileIO.load("C:\\Documents and Settings\\Michael\\Desktop\\Game utils\\EU3 save games\\Russia.eu3"),
"C:\\Documents and Settings\\Michael\\Desktop\\Game utils\\EU3 save games\\Russia.eu3",
"C:\\Program Files\\Paradox Entertainment\\Eu3 - DEMO\\",
"");
// Scanner scanner = new Scanner(System.in);
// while (true) {
// System.out.print("Command> ");
// String command = scanner.next();
// if (command.equals("end"))
// break;
// else if (command.equals("country")) {
// command = scanner.next();
// System.out.println(scenario.getCountry(command).go.toString());
// } else if (command.equals("prov")) {
// command = scanner.next();
// System.out.println(scenario.getProvince(Integer.parseInt(command)).go.toString());
// } else {
// System.err.println("Unknown command: " + command);
// }
// }
// }
}
}