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.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;
|
||||
|
||||
import com.agateau.pixelwheels.gamesetup.Difficulty;
|
||||
import com.agateau.utils.log.NLog;
|
||||
import com.badlogic.gdx.files.FileHandle;
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
@@ -71,6 +72,7 @@ import java.util.Map;
|
||||
*
|
||||
* <pre>
|
||||
* {
|
||||
* "version": 2,
|
||||
* "trackStats": {
|
||||
* "$difficultyId": {
|
||||
* "$trackId": {
|
||||
@@ -107,6 +109,8 @@ import java.util.Map;
|
||||
* </pre>
|
||||
*/
|
||||
public class JsonGameStatsImplIO implements GameStatsImpl.IO {
|
||||
private static final int CURRENT_VERSION = 2;
|
||||
|
||||
private final FileHandle mHandle;
|
||||
private final Gson mGson = new GsonBuilder().setPrettyPrinting().create();
|
||||
|
||||
@@ -123,6 +127,47 @@ public class JsonGameStatsImplIO implements GameStatsImpl.IO {
|
||||
JsonParser parser = new JsonParser();
|
||||
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
|
||||
JsonObject trackStatsByDifficultyObject = root.getAsJsonObject("trackStats");
|
||||
for (Difficulty difficulty : Difficulty.values()) {
|
||||
@@ -181,6 +226,8 @@ public class JsonGameStatsImplIO implements GameStatsImpl.IO {
|
||||
public void save(GameStatsImpl gameStats) {
|
||||
JsonObject root = new JsonObject();
|
||||
|
||||
root.addProperty("version", CURRENT_VERSION);
|
||||
|
||||
// Add track stats
|
||||
JsonObject trackStatsByDifficultyObject = new JsonObject();
|
||||
root.add("trackStats", trackStatsByDifficultyObject);
|
||||
|
Reference in New Issue
Block a user