1
1
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:
Aurelien Gateau
2024-10-23 15:27:34 +02:00
parent 14a6b742f3
commit 7ca2db77e6
2 changed files with 130 additions and 0 deletions

View File

@@ -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));
}
}

View File

@@ -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);