Added facility to save and read DetailedInfo (DataRecorder data) in XML format using XStream.

This commit is contained in:
Woody Folsom
2012-03-16 15:54:45 -04:00
parent 0ac74b3297
commit 47520126ff
5 changed files with 62 additions and 13 deletions

1
.gitignore vendored
View File

@@ -15,4 +15,5 @@ docs
.classpath .classpath
player.txt player.txt
DetailedInfo.txt DetailedInfo.txt
DetailedInfo.xml
*.png *.png

BIN
lib/xstream-1.4.2.jar Normal file

Binary file not shown.

View File

@@ -4,24 +4,26 @@ import java.io.File;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import com.thoughtworks.xstream.annotations.XStreamOmitField;
import dk.itu.mario.MarioInterface.GamePlay; import dk.itu.mario.MarioInterface.GamePlay;
import dk.itu.mario.engine.sprites.SpriteTemplate;
import dk.itu.mario.engine.sprites.BulletBill; import dk.itu.mario.engine.sprites.BulletBill;
import dk.itu.mario.engine.sprites.Enemy; import dk.itu.mario.engine.sprites.Enemy;
import dk.itu.mario.engine.sprites.FlowerEnemy;
import dk.itu.mario.engine.sprites.Mario; import dk.itu.mario.engine.sprites.Mario;
import dk.itu.mario.engine.sprites.Shell; import dk.itu.mario.engine.sprites.Shell;
import dk.itu.mario.engine.sprites.Sprite; import dk.itu.mario.engine.sprites.Sprite;
import dk.itu.mario.engine.sprites.SpriteTemplate;
import dk.itu.mario.level.Level;
import dk.itu.mario.level.RandomLevel; import dk.itu.mario.level.RandomLevel;
import dk.itu.mario.scene.LevelScene; import dk.itu.mario.scene.LevelScene;
import dk.itu.mario.engine.sprites.FlowerEnemy;
public class DataRecorder { public class DataRecorder {
public boolean recording = true; public boolean recording = true;
@XStreamOmitField
private RandomLevel level; private RandomLevel level;
private boolean []keys, keyPressed; private boolean []keys, keyPressed;
@XStreamOmitField
private LevelScene levelScene; private LevelScene levelScene;
/** /**
@@ -213,7 +215,6 @@ public class DataRecorder {
} }
private boolean timeStopped = true; private boolean timeStopped = true;
private long endGRight;
public void endTime(){ public void endTime(){
if(timeStopped == false){ if(timeStopped == false){
@@ -424,7 +425,6 @@ public class DataRecorder {
public void fireKillRecord(Sprite sprite){ public void fireKillRecord(Sprite sprite){
killRecord(sprite); killRecord(sprite);
int enemyType = 0;
if(sprite instanceof FlowerEnemy){ if(sprite instanceof FlowerEnemy){
detailedLog += "FireKill: EnemyType = FlowerEnemy time = "+ (2982 - levelScene.timeLeft); detailedLog += "FireKill: EnemyType = FlowerEnemy time = "+ (2982 - levelScene.timeLeft);
detailedLog += "\n"; detailedLog += "\n";
@@ -668,7 +668,7 @@ public class DataRecorder {
printEnd(); printEnd();
} }
private void printDeaths(){ private void printDeaths() {
printStart("Player Died Against"); printStart("Player Died Against");
int deathsTotal = 0; int deathsTotal = 0;
@@ -789,7 +789,7 @@ public class DataRecorder {
public void fillGamePlayMetrics(RandomLevel level){ public void fillGamePlayMetrics(RandomLevel level){
GamePlay gpm = new GamePlay(); GamePlay gpm = new GamePlay();
gpm.completionTime = getCompletionTime(); gpm.completionTime = getCompletionTime();
gpm.totalTime = getTotalTime();////sums all the time, including from previous games if player died gpm.totalTime = getTotalTime();
gpm.jumpsNumber = getTimesJumped(); gpm.jumpsNumber = getTimesJumped();
gpm.timeSpentDucking = getTotalDuckTime(); gpm.timeSpentDucking = getTotalDuckTime();
gpm.duckNumber = getTimesDucked(); gpm.duckNumber = getTimesDucked();
@@ -838,7 +838,7 @@ public class DataRecorder {
gpm.write("player.txt"); gpm.write("player.txt");
System.out.println(detailedLog); System.out.println(detailedLog);
write(detailedLog); write(detailedLog);
writeXML();
} }
@@ -855,10 +855,25 @@ public class DataRecorder {
} }
private void writeXML() {
try {
FileWriter file = new FileWriter(new File("DetailedInfo.xml"));
file.write(toXML());
file.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public int getCompletionTime(){ public int getCompletionTime(){
return convertTime(completionTime); return convertTime(completionTime);
} }
/**
* Sums all the time, including from previous games if player died
* @return
*/
public int getTotalTime(){ public int getTotalTime(){
return convertTime(totalTime); return convertTime(totalTime);
} }
@@ -976,6 +991,14 @@ public class DataRecorder {
return (double)getTotalLargeTime()/(double)getTotalTime(); return (double)getTotalLargeTime()/(double)getTotalTime();
} }
public static DataRecorder fromXML(File file) throws IOException {
return (DataRecorder) XStreamFactory.getInstance().fromXML(file);
}
public String toXML() {
return XStreamFactory.getInstance().toXML(this);
}
/** /**
* Time in tiny mario form * Time in tiny mario form
* @return * @return

View File

@@ -0,0 +1,14 @@
package dk.itu.mario.engine;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
public class XStreamFactory {
public static XStream getInstance() {
XStream xstream = new XStream(new DomDriver());
xstream.processAnnotations(DataRecorder.class);
return xstream;
}
}

View File

@@ -2,6 +2,7 @@ package dk.itu.mario.scene;
import java.awt.GraphicsConfiguration; import java.awt.GraphicsConfiguration;
import java.io.DataInputStream; import java.io.DataInputStream;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import dk.itu.mario.MarioInterface.GamePlay; import dk.itu.mario.MarioInterface.GamePlay;
@@ -48,8 +49,18 @@ public class LevelSceneCustom extends LevelScene {
currentLevel = (Level) clg.generateLevel(gp); currentLevel = (Level) clg.generateLevel(gp);
String detailedInfo = FileHandler.readFile("DetailedInfo.txt"); String detailedInfo = FileHandler.readFile("DetailedInfo.txt");
//TODO parse DetailedInfo
System.out.println("DetailedInfo: " + detailedInfo); File xmlInfoFile = new File("DetailedInfo.xml");
if (xmlInfoFile.exists()) {
try {
DataRecorder dataRecorder = DataRecorder.fromXML(xmlInfoFile);
System.out.println("DetailedInfo (from xml file): " + detailedInfo);
} catch (IOException ioe) {
ioe.printStackTrace();
}
} else {
System.out.println("DetailedInfo (from txt file): " + detailedInfo);
}
try { try {
level = currentLevel.clone(); level = currentLevel.clone();
@@ -57,7 +68,7 @@ public class LevelSceneCustom extends LevelScene {
e.printStackTrace(); e.printStackTrace();
} }
//TODO change this // TODO change this
// level is always overground // level is always overground
Art.startMusic(2); Art.startMusic(2);