mirror of
https://github.com/agateau/pixelwheels.git
synced 2025-10-05 17:32:39 +02:00
GameStats: add support for loading v1 file format
This commit is contained in:
@@ -157,4 +157,87 @@ public class JsonGameStatsImplIOTests {
|
|||||||
stats.addResult(TrackStats.ResultType.LAP, "bob", value);
|
stats.addResult(TrackStats.ResultType.LAP, "bob", value);
|
||||||
stats.addResult(TrackStats.ResultType.TOTAL, "bob", value * 3);
|
stats.addResult(TrackStats.ResultType.TOTAL, "bob", value * 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCanLoadV1Stats() {
|
||||||
|
// GIVEN championships
|
||||||
|
Championship ch1 = new Championship("ch1", "Championship #1");
|
||||||
|
Track track = ch1.addTrack("t", "track");
|
||||||
|
|
||||||
|
Championship ch2 = new Championship("ch2", "Championship #2");
|
||||||
|
|
||||||
|
// AND a V1 stat file
|
||||||
|
FileHandle v1File = new FileHandle(mTemporaryFolder.getRoot() + "/v1.json");
|
||||||
|
v1File.writeString(
|
||||||
|
"{"
|
||||||
|
+ " \"trackStats\": {"
|
||||||
|
+ " \"t\": {"
|
||||||
|
+ " \"lap\": ["
|
||||||
|
+ " {"
|
||||||
|
+ " \"vehicle\": \"red\","
|
||||||
|
+ " \"value\": 5.6"
|
||||||
|
+ " },"
|
||||||
|
+ " {"
|
||||||
|
+ " \"vehicle\": \"green\","
|
||||||
|
+ " \"value\": 5.8"
|
||||||
|
+ " },"
|
||||||
|
+ " {"
|
||||||
|
+ " \"vehicle\": \"blue\","
|
||||||
|
+ " \"value\": 6.0"
|
||||||
|
+ " }"
|
||||||
|
+ " ],"
|
||||||
|
+ " \"total\": ["
|
||||||
|
+ " {"
|
||||||
|
+ " \"vehicle\": \"orange\","
|
||||||
|
+ " \"value\": 22.1"
|
||||||
|
+ " },"
|
||||||
|
+ " {"
|
||||||
|
+ " \"vehicle\": \"yellow\","
|
||||||
|
+ " \"value\": 22.6"
|
||||||
|
+ " },"
|
||||||
|
+ " {"
|
||||||
|
+ " \"vehicle\": \"purple\","
|
||||||
|
+ " \"value\": 22.7"
|
||||||
|
+ " }"
|
||||||
|
+ " ]"
|
||||||
|
+ " }"
|
||||||
|
+ " },"
|
||||||
|
+ " \"bestChampionshipRank\": {"
|
||||||
|
+ " \"ch1\": 0,"
|
||||||
|
+ " \"ch2\": 1"
|
||||||
|
+ " },"
|
||||||
|
+ " \"events\": {"
|
||||||
|
+ " \"LEAVING_ROAD\": 3190,"
|
||||||
|
+ " \"MISSILE_HIT\": 40,"
|
||||||
|
+ " \"PICKED_BONUS\": 994"
|
||||||
|
+ " }"
|
||||||
|
+ "}",
|
||||||
|
false /* append */);
|
||||||
|
JsonGameStatsImplIO io = new JsonGameStatsImplIO(v1File);
|
||||||
|
|
||||||
|
// AND an associated GameStats instance
|
||||||
|
// WHEN loading it
|
||||||
|
GameStats gameStats = new GameStatsImpl(io);
|
||||||
|
|
||||||
|
// THEN track stats have been loaded as Difficulty.HARD stats
|
||||||
|
TrackStats trackStats = gameStats.getTrackStats(Difficulty.HARD, track);
|
||||||
|
ArrayList<TrackResult> trackResults = trackStats.get(TrackStats.ResultType.LAP);
|
||||||
|
assertThat(trackResults.get(0).vehicle, is("red"));
|
||||||
|
assertThat(trackResults.get(0).value, is(5.6f));
|
||||||
|
assertThat(trackResults.get(1).vehicle, is("green"));
|
||||||
|
assertThat(trackResults.get(1).value, is(5.8f));
|
||||||
|
assertThat(trackResults.get(2).vehicle, is("blue"));
|
||||||
|
assertThat(trackResults.get(2).value, is(6.0f));
|
||||||
|
trackResults = trackStats.get(TrackStats.ResultType.TOTAL);
|
||||||
|
assertThat(trackResults.get(0).vehicle, is("orange"));
|
||||||
|
assertThat(trackResults.get(0).value, is(22.1f));
|
||||||
|
assertThat(trackResults.get(1).vehicle, is("yellow"));
|
||||||
|
assertThat(trackResults.get(1).value, is(22.6f));
|
||||||
|
assertThat(trackResults.get(2).vehicle, is("purple"));
|
||||||
|
assertThat(trackResults.get(2).value, is(22.7f));
|
||||||
|
|
||||||
|
// AND best championship ranks have been loaded as Difficulty.HARD ranks
|
||||||
|
assertThat(gameStats.getBestChampionshipRank(Difficulty.HARD, ch1), is(0));
|
||||||
|
assertThat(gameStats.getBestChampionshipRank(Difficulty.HARD, ch2), is(1));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -19,6 +19,7 @@
|
|||||||
package com.agateau.pixelwheels.stats;
|
package com.agateau.pixelwheels.stats;
|
||||||
|
|
||||||
import com.agateau.pixelwheels.gamesetup.Difficulty;
|
import com.agateau.pixelwheels.gamesetup.Difficulty;
|
||||||
|
import com.agateau.utils.log.NLog;
|
||||||
import com.badlogic.gdx.files.FileHandle;
|
import com.badlogic.gdx.files.FileHandle;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.GsonBuilder;
|
import com.google.gson.GsonBuilder;
|
||||||
@@ -71,6 +72,7 @@ import java.util.Map;
|
|||||||
*
|
*
|
||||||
* <pre>
|
* <pre>
|
||||||
* {
|
* {
|
||||||
|
* "version": 2,
|
||||||
* "trackStats": {
|
* "trackStats": {
|
||||||
* "$difficultyId": {
|
* "$difficultyId": {
|
||||||
* "$trackId": {
|
* "$trackId": {
|
||||||
@@ -107,6 +109,8 @@ import java.util.Map;
|
|||||||
* </pre>
|
* </pre>
|
||||||
*/
|
*/
|
||||||
public class JsonGameStatsImplIO implements GameStatsImpl.IO {
|
public class JsonGameStatsImplIO implements GameStatsImpl.IO {
|
||||||
|
private static final int CURRENT_VERSION = 2;
|
||||||
|
|
||||||
private final FileHandle mHandle;
|
private final FileHandle mHandle;
|
||||||
private final Gson mGson = new GsonBuilder().setPrettyPrinting().create();
|
private final Gson mGson = new GsonBuilder().setPrettyPrinting().create();
|
||||||
|
|
||||||
@@ -123,6 +127,47 @@ public class JsonGameStatsImplIO implements GameStatsImpl.IO {
|
|||||||
JsonParser parser = new JsonParser();
|
JsonParser parser = new JsonParser();
|
||||||
JsonObject root = parser.parse(json).getAsJsonObject();
|
JsonObject root = parser.parse(json).getAsJsonObject();
|
||||||
|
|
||||||
|
int version = root.has("version") ? root.get("version").getAsInt() : 1;
|
||||||
|
switch (version) {
|
||||||
|
case 2:
|
||||||
|
loadV2(gameStats, root);
|
||||||
|
return;
|
||||||
|
case 1:
|
||||||
|
loadV1(gameStats, root);
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
NLog.e(
|
||||||
|
"Don't know how to load stats from version %d, not loading anything",
|
||||||
|
version);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Load v1 stats as stats for Difficulty.HARD */
|
||||||
|
private void loadV1(GameStatsImpl gameStats, JsonObject root) {
|
||||||
|
Difficulty difficulty = Difficulty.HARD;
|
||||||
|
|
||||||
|
// trackStats / $trackId
|
||||||
|
JsonObject trackStatsObject = root.getAsJsonObject("trackStats");
|
||||||
|
if (trackStatsObject != null) {
|
||||||
|
HashMap<String, TrackStats> trackStatsByTrack =
|
||||||
|
gameStats.mTrackStatsByDifficulty.get(difficulty);
|
||||||
|
trackStatsByTrack.clear();
|
||||||
|
for (Map.Entry<String, JsonElement> kv : trackStatsObject.entrySet()) {
|
||||||
|
String trackId = kv.getKey();
|
||||||
|
TrackStats trackStats = new TrackStats(gameStats);
|
||||||
|
trackStatsByTrack.put(trackId, trackStats);
|
||||||
|
loadTrackStats(trackStats, kv.getValue().getAsJsonObject());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// bestChampionshipRank
|
||||||
|
JsonObject ranksObject = root.getAsJsonObject("bestChampionshipRank");
|
||||||
|
loadStringIntMap(gameStats.mBestChampionshipRankByDifficulty.get(difficulty), ranksObject);
|
||||||
|
|
||||||
|
loadStringIntMap(gameStats.mEvents, root.getAsJsonObject("events"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadV2(GameStatsImpl gameStats, JsonObject root) {
|
||||||
// trackStats / $difficultyId / $trackId
|
// trackStats / $difficultyId / $trackId
|
||||||
JsonObject trackStatsByDifficultyObject = root.getAsJsonObject("trackStats");
|
JsonObject trackStatsByDifficultyObject = root.getAsJsonObject("trackStats");
|
||||||
for (Difficulty difficulty : Difficulty.values()) {
|
for (Difficulty difficulty : Difficulty.values()) {
|
||||||
@@ -181,6 +226,8 @@ public class JsonGameStatsImplIO implements GameStatsImpl.IO {
|
|||||||
public void save(GameStatsImpl gameStats) {
|
public void save(GameStatsImpl gameStats) {
|
||||||
JsonObject root = new JsonObject();
|
JsonObject root = new JsonObject();
|
||||||
|
|
||||||
|
root.addProperty("version", CURRENT_VERSION);
|
||||||
|
|
||||||
// Add track stats
|
// Add track stats
|
||||||
JsonObject trackStatsByDifficultyObject = new JsonObject();
|
JsonObject trackStatsByDifficultyObject = new JsonObject();
|
||||||
root.add("trackStats", trackStatsByDifficultyObject);
|
root.add("trackStats", trackStatsByDifficultyObject);
|
||||||
|
Reference in New Issue
Block a user