file-format: rewrite save() to use a new XML-based file format
a file format that I just made up
This commit is contained in:
parent
6ccc6339fc
commit
a3d2c1f441
1 changed files with 75 additions and 56 deletions
|
@ -11,6 +11,10 @@ package micropolisj.engine;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
// for XML load/save
|
||||||
|
import java.util.zip.GZIPOutputStream;
|
||||||
|
import javax.xml.stream.*;
|
||||||
|
|
||||||
import static micropolisj.engine.TileConstants.*;
|
import static micropolisj.engine.TileConstants.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1911,13 +1915,16 @@ public class Micropolis
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void writeHistoryArray(int [] array, DataOutputStream out)
|
void writeHistoryArray(String tagName, int [] array, XMLStreamWriter out)
|
||||||
throws IOException
|
throws XMLStreamException
|
||||||
{
|
{
|
||||||
|
out.writeStartElement(tagName);
|
||||||
for (int i = 0; i < 240; i++)
|
for (int i = 0; i < 240; i++)
|
||||||
{
|
{
|
||||||
out.writeShort(array[i]);
|
if (i != 0) { out.writeCharacters(","); }
|
||||||
|
out.writeCharacters(Integer.toString(array[i]));
|
||||||
}
|
}
|
||||||
|
out.writeEndElement();
|
||||||
}
|
}
|
||||||
|
|
||||||
void loadMisc(DataInputStream dis)
|
void loadMisc(DataInputStream dis)
|
||||||
|
@ -1985,52 +1992,47 @@ public class Micropolis
|
||||||
indCap = false;
|
indCap = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void writeMisc(DataOutputStream out)
|
void writeMisc(XMLStreamWriter out)
|
||||||
throws IOException
|
throws XMLStreamException
|
||||||
{
|
{
|
||||||
out.writeShort(0);
|
out.writeStartElement("population");
|
||||||
out.writeShort(0);
|
out.writeAttribute("resPop", Integer.toString(resPop));
|
||||||
out.writeShort(resPop);
|
out.writeAttribute("comPop", Integer.toString(comPop));
|
||||||
out.writeShort(comPop);
|
out.writeAttribute("indPop", Integer.toString(indPop));
|
||||||
out.writeShort(indPop);
|
out.writeEndElement();
|
||||||
out.writeShort(resValve);
|
|
||||||
out.writeShort(comValve);
|
|
||||||
out.writeShort(indValve);
|
|
||||||
//8
|
|
||||||
out.writeInt(cityTime);
|
|
||||||
out.writeShort(crimeRamp);
|
|
||||||
out.writeShort(polluteRamp);
|
|
||||||
//12
|
|
||||||
out.writeShort(landValueAverage);
|
|
||||||
out.writeShort(crimeAverage);
|
|
||||||
out.writeShort(pollutionAverage);
|
|
||||||
out.writeShort(gameLevel);
|
|
||||||
//16
|
|
||||||
out.writeShort(evaluation.cityClass);
|
|
||||||
out.writeShort(evaluation.cityScore);
|
|
||||||
//18
|
|
||||||
for (int i = 18; i < 50; i++) {
|
|
||||||
out.writeShort(0);
|
|
||||||
}
|
|
||||||
//50
|
|
||||||
out.writeInt(budget.totalFunds);
|
|
||||||
out.writeShort(autoBulldoze ? 1 : 0);
|
|
||||||
out.writeShort(autoBudget ? 1 : 0);
|
|
||||||
//54
|
|
||||||
out.writeShort(autoGo ? 1 : 0);
|
|
||||||
out.writeShort(1); //userSoundOn
|
|
||||||
out.writeShort(cityTax);
|
|
||||||
out.writeShort(simSpeed.ordinal());
|
|
||||||
|
|
||||||
//58
|
out.writeStartElement("valves");
|
||||||
out.writeInt((int)(policePercent * 65536));
|
out.writeAttribute("resValve", Integer.toString(resValve));
|
||||||
out.writeInt((int)(firePercent * 65536));
|
out.writeAttribute("comValve", Integer.toString(comValve));
|
||||||
out.writeInt((int)(roadPercent * 65536));
|
out.writeAttribute("indValve", Integer.toString(indValve));
|
||||||
|
out.writeEndElement();
|
||||||
|
|
||||||
//64
|
out.writeStartElement("misc");
|
||||||
for (int i = 64; i < 120; i++) {
|
out.writeAttribute("cityTime", Integer.toString(cityTime));
|
||||||
out.writeShort(0);
|
out.writeAttribute("crimeRamp", Integer.toString(crimeRamp));
|
||||||
}
|
out.writeAttribute("polluteRamp", Integer.toString(polluteRamp));
|
||||||
|
out.writeAttribute("landValueAverage", Integer.toString(landValueAverage));
|
||||||
|
out.writeAttribute("crimeAverage", Integer.toString(crimeAverage));
|
||||||
|
out.writeAttribute("pollutionAverage", Integer.toString(pollutionAverage));
|
||||||
|
out.writeAttribute("gameLevel", Integer.toString(gameLevel));
|
||||||
|
out.writeAttribute("autoBulldoze", autoBulldoze ? "true" : "false");
|
||||||
|
out.writeAttribute("autoBudget", autoBudget ? "true" : "false");
|
||||||
|
out.writeAttribute("autoGo", autoGo ? "true" : "false");
|
||||||
|
out.writeAttribute("cityTax", Integer.toString(cityTax));
|
||||||
|
out.writeAttribute("simSpeed", simSpeed.name());
|
||||||
|
out.writeAttribute("policePercent", Double.toString(policePercent*100));
|
||||||
|
out.writeAttribute("firePercent", Double.toString(firePercent*100));
|
||||||
|
out.writeAttribute("roadPercent", Double.toString(roadPercent*100));
|
||||||
|
out.writeEndElement();
|
||||||
|
|
||||||
|
out.writeStartElement("evaluation");
|
||||||
|
out.writeAttribute("cityClass", Integer.toString(evaluation.cityClass));
|
||||||
|
out.writeAttribute("cityScore", Integer.toString(evaluation.cityScore));
|
||||||
|
out.writeEndElement();
|
||||||
|
|
||||||
|
out.writeStartElement("budget");
|
||||||
|
out.writeAttribute("funds", Integer.toString(budget.totalFunds));
|
||||||
|
out.writeEndElement();
|
||||||
}
|
}
|
||||||
|
|
||||||
void loadMap(DataInputStream dis)
|
void loadMap(DataInputStream dis)
|
||||||
|
@ -2047,9 +2049,10 @@ public class Micropolis
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void writeMap(DataOutputStream out)
|
void writeMap(XMLStreamWriter out)
|
||||||
throws IOException
|
throws XMLStreamException
|
||||||
{
|
{
|
||||||
|
out.writeStartElement("map");
|
||||||
for (int x = 0; x < DEFAULT_WIDTH; x++)
|
for (int x = 0; x < DEFAULT_WIDTH; x++)
|
||||||
{
|
{
|
||||||
for (int y = 0; y < DEFAULT_HEIGHT; y++)
|
for (int y = 0; y < DEFAULT_HEIGHT; y++)
|
||||||
|
@ -2070,9 +2073,13 @@ public class Micropolis
|
||||||
if (isZoneCenter(z & LOMASK)) {
|
if (isZoneCenter(z & LOMASK)) {
|
||||||
z |= 1024; //synthesize ZONEBIT
|
z |= 1024; //synthesize ZONEBIT
|
||||||
}
|
}
|
||||||
out.writeShort(z);
|
if (!(x==0 && y==0)) {
|
||||||
|
out.writeCharacters(",");
|
||||||
|
}
|
||||||
|
out.writeCharacters(Integer.toString(z));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
out.writeEndElement();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void load(File filename)
|
public void load(File filename)
|
||||||
|
@ -2145,16 +2152,28 @@ public class Micropolis
|
||||||
public void save(OutputStream outStream)
|
public void save(OutputStream outStream)
|
||||||
throws IOException
|
throws IOException
|
||||||
{
|
{
|
||||||
DataOutputStream out = new DataOutputStream(outStream);
|
try{
|
||||||
writeHistoryArray(history.res, out);
|
|
||||||
writeHistoryArray(history.com, out);
|
GZIPOutputStream z_out = new GZIPOutputStream(outStream);
|
||||||
writeHistoryArray(history.ind, out);
|
XMLStreamWriter out = XMLOutputFactory.newInstance().createXMLStreamWriter(z_out, "UTF-8");
|
||||||
writeHistoryArray(history.crime, out);
|
out.writeStartDocument();
|
||||||
writeHistoryArray(history.pollution, out);
|
out.writeStartElement("micropolis");
|
||||||
writeHistoryArray(history.money, out);
|
writeHistoryArray("res-history", history.res, out);
|
||||||
|
writeHistoryArray("com-history", history.com, out);
|
||||||
|
writeHistoryArray("ind-history", history.ind, out);
|
||||||
|
writeHistoryArray("crime-history", history.crime, out);
|
||||||
|
writeHistoryArray("pollution-history", history.pollution, out);
|
||||||
|
writeHistoryArray("money-history", history.money, out);
|
||||||
writeMisc(out);
|
writeMisc(out);
|
||||||
writeMap(out);
|
writeMap(out);
|
||||||
|
out.writeEndElement(); //micropolis
|
||||||
|
out.writeEndDocument();
|
||||||
out.close();
|
out.close();
|
||||||
|
z_out.close(); //because XMLStreamWriter does not call it for us
|
||||||
|
}
|
||||||
|
catch (XMLStreamException e) {
|
||||||
|
throw new IOException(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void toggleAutoBudget()
|
public void toggleAutoBudget()
|
||||||
|
|
Reference in a new issue