package org.pixelgaffer.turnierserver.codr;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import org.pixelgaffer.turnierserver.codr.simulator.CodrAiServer;
import org.pixelgaffer.turnierserver.codr.simulator.CodrGameImpl;
import org.pixelgaffer.turnierserver.codr.utilities.ErrorLog;
import org.pixelgaffer.turnierserver.codr.utilities.Paths;
/**
* Stellt ein lokal gespeichertes Spiel dar.
*
* @author Philip
*/
public class GameSaved extends GameBase {
public int offlineId = -1;
public CodrGameImpl game;
/**
* wird verwendet, wenn ein neues Spiel gestartet wird
*
* @param ggameType
*/
public GameSaved(String ggameType) {
super(GameMode.playing);
gameType = ggameType;
getNewID();
}
/**
* wird verwendet, wenn der GameManager das Spiel aus dem Dateisystem lädt.
*
* @param iid
*/
public GameSaved(int iid) {
super(GameMode.saved);
offlineId = iid;
loadProps();
}
public void loadProps() {
if (mode != GameMode.saved && mode != GameMode.playing) {
ErrorLog.write("dies ist kein lesbares Objekt (Game.loadProps)");
return;
}
try {
Reader reader = new FileReader(Paths.gameProperties(this));
Properties prop = new Properties();
prop.load(reader);
reader.close();
date = prop.getProperty("date");
gameType = prop.getProperty("logic");
} catch (IOException e) {
ErrorLog.write("Fehler bei Laden aus der properties.txt (Game)");
}
}
public void storeProps() {
if (mode != GameMode.playing) {
ErrorLog.write("dies ist kein speicherbares Objekt (Game.storeProps)");
return;
}
if (offlineId == -1) {
getNewID();
}
Properties prop = new Properties();
prop.setProperty("date", date);
prop.setProperty("logic", gameType);
try {
File dir = new File(Paths.game(this));
dir.mkdirs();
Writer writer = new FileWriter(Paths.gameProperties(this));
prop.store(writer, offlineId + "");
writer.close();
} catch (IOException e) {
ErrorLog.write("Es kann keine Properties-Datei angelegt werden. (Game)");
}
}
/**
* Setzt den date-String auf die aktuelle Zeit
*/
public void setDateNow() {
Date now = new Date();
SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm,ss");
date = format.format(now);
}
public void getNewID() {
for (int i = 1; i < 10000; i++) {
File dir = new File(Paths.game(i));
if (dir.mkdirs()) {
offlineId = i;
return;
}
}
ErrorLog.write("GetNewID-ERROR: Mehr als 10.000 Spielordner wurden ausprobiert: Möglicherweise gibt es keine Zugriffsberechtigung.");
}
public void play(List<Version> opponents) {
System.out.println("play(" + opponents + ")");
try {
game = new CodrGameImpl(this, opponents);
System.out.println(game);
CodrAiServer server = new CodrAiServer(game);
System.out.println(server);
server.start();
System.out.println("server gestartet");
Properties p = new Properties();
p.put("turnierserver.worker.host", "localhost");
p.put("turnierserver.worker.server.port", Integer.toString(server.getPort()));
p.put("turnierserver.worker.server.aichar", "");
p.put("turnierserver.serializer.compress.worker", "false");
System.out.println(p);
game.startAis(p);
} catch (IOException | ReflectiveOperationException e) {
e.printStackTrace();
}
setDateNow();
}
}