From c2c2551607f4aec74a2e747b8dd7c666992b6423 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 17 Jul 2018 10:42:44 -0400 Subject: [PATCH] Implemented save time recording --- build.gradle | 2 +- core/assets/bundles/bundle.properties | 1 + .../content/blocks/CraftingBlocks.java | 2 +- .../io/anuke/mindustry/core/GameState.java | 5 ++++ .../io/anuke/mindustry/entities/Player.java | 2 +- core/src/io/anuke/mindustry/game/Saves.java | 25 +++++++++++++++++-- .../anuke/mindustry/io/SaveFileVersion.java | 3 ++- core/src/io/anuke/mindustry/io/SaveMeta.java | 4 ++- .../anuke/mindustry/io/versions/Save16.java | 5 ++-- .../mindustry/ui/dialogs/LoadDialog.java | 2 ++ 10 files changed, 42 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index f84c174017..a0012d6e39 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ allprojects { gdxVersion = '1.9.8' roboVMVersion = '2.3.0' aiVersion = '1.8.1' - uCoreVersion = '27f83f3522e30c8f58e9fa4fe4764d5cd03195c7' + uCoreVersion = 'e4eec58b02' getVersionString = { String buildVersion = getBuildVersion() diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 0487354a34..4888825c1f 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -156,6 +156,7 @@ text.save.map=Map: {0} text.save.wave=Wave {0} text.save.difficulty=Difficulty: {0} text.save.date=Last Saved: {0} +text.save.playtime=Playtime: {0} text.confirm=Confirm text.delete=Delete text.ok=OK diff --git a/core/src/io/anuke/mindustry/content/blocks/CraftingBlocks.java b/core/src/io/anuke/mindustry/content/blocks/CraftingBlocks.java index 325090dedb..33ecc9f7a7 100644 --- a/core/src/io/anuke/mindustry/content/blocks/CraftingBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/CraftingBlocks.java @@ -21,7 +21,7 @@ public class CraftingBlocks extends BlockList implements ContentList{ health = 70; result = Items.carbide; craftTime = 45f; - burnDuration = 46f; + burnDuration = 45f; useFlux = true; consumes.items(new ItemStack[]{new ItemStack(Items.tungsten, 3)}); diff --git a/core/src/io/anuke/mindustry/core/GameState.java b/core/src/io/anuke/mindustry/core/GameState.java index 92eee9a4d3..10bddc2764 100644 --- a/core/src/io/anuke/mindustry/core/GameState.java +++ b/core/src/io/anuke/mindustry/core/GameState.java @@ -5,6 +5,7 @@ import io.anuke.mindustry.game.Difficulty; import io.anuke.mindustry.game.EventType.StateChangeEvent; import io.anuke.mindustry.game.GameMode; import io.anuke.mindustry.game.TeamInfo; +import io.anuke.mindustry.net.Net; import io.anuke.ucore.core.Events; public class GameState{ @@ -23,6 +24,10 @@ public class GameState{ state = astate; } + public boolean isPaused(){ + return is(State.paused) && !Net.active(); + } + public boolean is(State astate){ return state == astate; } diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index d9ba73b386..6040e36df7 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -283,7 +283,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra public void draw(){ if((debug && (!showPlayer || !showUI)) || dead) return; - if(!movement.isZero() && moved){ + if(!movement.isZero() && moved && !state.isPaused()){ walktime += Timers.delta() * movement.len() / 0.7f * getFloorOn().speedMultiplier; baseRotation = Mathf.slerpDelta(baseRotation, movement.angle(), 0.13f); } diff --git a/core/src/io/anuke/mindustry/game/Saves.java b/core/src/io/anuke/mindustry/game/Saves.java index c4e3477b28..f9ef61abad 100644 --- a/core/src/io/anuke/mindustry/game/Saves.java +++ b/core/src/io/anuke/mindustry/game/Saves.java @@ -2,6 +2,7 @@ package io.anuke.mindustry.game; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.TimeUtils; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.game.EventType.StateChangeEvent; import io.anuke.mindustry.io.SaveIO; @@ -10,6 +11,7 @@ import io.anuke.mindustry.maps.Map; import io.anuke.ucore.core.Events; import io.anuke.ucore.core.Settings; import io.anuke.ucore.core.Timers; +import io.anuke.ucore.util.Strings; import io.anuke.ucore.util.ThreadArray; import java.io.IOException; @@ -23,6 +25,9 @@ public class Saves{ private boolean saving; private float time; + private long totalPlaytime; + private long lastTimestamp; + public Saves(){ Events.on(StateChangeEvent.class, (prev, state) -> { if(state == State.menu){ @@ -35,8 +40,7 @@ public class Saves{ saves.clear(); int[] slots = Settings.getJson("save-slots", int[].class); - for(int i = 0; i < slots.length; i++){ - int index = slots[i]; + for(int index : slots){ if(SaveIO.isSaveValid(index)){ SaveSlot slot = new SaveSlot(index); saves.add(slot); @@ -53,6 +57,14 @@ public class Saves{ public void update(){ SaveSlot current = this.current; + if(current != null && !state.is(State.menu) + && !(state.isPaused() && ui.hasDialog())){ + if(lastTimestamp != 0){ + totalPlaytime += TimeUtils.timeSinceMillis(lastTimestamp); + } + lastTimestamp = TimeUtils.millis(); + } + if(!state.is(State.menu) && !state.gameOver && current != null && current.isAutosave()){ time += Timers.delta(); if(time > Settings.getInt("saveinterval") * 60){ @@ -75,6 +87,10 @@ public class Saves{ } } + public long getTotalPlaytime(){ + return totalPlaytime; + } + public void resetSave(){ current = null; } @@ -132,6 +148,7 @@ public class Saves{ SaveIO.loadFromSlot(index); meta = SaveIO.getData(index); current = this; + totalPlaytime = meta.timePlayed; } public void save(){ @@ -140,6 +157,10 @@ public class Saves{ current = this; } + public String getPlayTime(){ + return Strings.formatMillis(current == this ? totalPlaytime : meta.timePlayed); + } + public String getDate(){ return meta.date; } diff --git a/core/src/io/anuke/mindustry/io/SaveFileVersion.java b/core/src/io/anuke/mindustry/io/SaveFileVersion.java index 4a66242dfd..010ae561f5 100644 --- a/core/src/io/anuke/mindustry/io/SaveFileVersion.java +++ b/core/src/io/anuke/mindustry/io/SaveFileVersion.java @@ -15,12 +15,13 @@ public abstract class SaveFileVersion{ public SaveMeta getData(DataInputStream stream) throws IOException{ long time = stream.readLong(); //read last saved time + long playtime = stream.readLong(); int build = stream.readInt(); byte mode = stream.readByte(); //read the gamemode String map = stream.readUTF(); //read the map int wave = stream.readInt(); //read the wave byte difficulty = stream.readByte(); //read the difficulty - return new SaveMeta(version, time, build, mode, map, wave, Difficulty.values()[difficulty]); + return new SaveMeta(version, time, playtime, build, mode, map, wave, Difficulty.values()[difficulty]); } public abstract void read(DataInputStream stream) throws IOException; diff --git a/core/src/io/anuke/mindustry/io/SaveMeta.java b/core/src/io/anuke/mindustry/io/SaveMeta.java index ac682ec423..a0c5a83915 100644 --- a/core/src/io/anuke/mindustry/io/SaveMeta.java +++ b/core/src/io/anuke/mindustry/io/SaveMeta.java @@ -13,15 +13,17 @@ public class SaveMeta{ public int version; public int build; public String date; + public long timePlayed; public GameMode mode; public Map map; public int wave; public Difficulty difficulty; - public SaveMeta(int version, long date, int build, int mode, String map, int wave, Difficulty difficulty){ + public SaveMeta(int version, long date, long timePlayed, int build, int mode, String map, int wave, Difficulty difficulty){ this.version = version; this.build = build; this.date = Platform.instance.format(new Date(date)); + this.timePlayed = timePlayed; this.mode = GameMode.values()[mode]; this.map = world.maps().getByName(map); this.wave = wave; diff --git a/core/src/io/anuke/mindustry/io/versions/Save16.java b/core/src/io/anuke/mindustry/io/versions/Save16.java index b77fef58f6..42aaea8cf4 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save16.java +++ b/core/src/io/anuke/mindustry/io/versions/Save16.java @@ -25,8 +25,7 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -import static io.anuke.mindustry.Vars.state; -import static io.anuke.mindustry.Vars.world; +import static io.anuke.mindustry.Vars.*; public class Save16 extends SaveFileVersion{ @@ -37,6 +36,7 @@ public class Save16 extends SaveFileVersion{ @Override public void read(DataInputStream stream) throws IOException{ stream.readLong(); //time + stream.readLong(); //total playtime stream.readInt(); //build //general state @@ -154,6 +154,7 @@ public class Save16 extends SaveFileVersion{ //--META-- stream.writeInt(version); //version id stream.writeLong(TimeUtils.millis()); //last saved + stream.writeLong(headless ? 0 : control.getSaves().getTotalPlaytime()); //playtime stream.writeInt(Version.build); //build //--GENERAL STATE-- diff --git a/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java index b0c111c9bc..1f145363c0 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java @@ -124,6 +124,8 @@ public class LoadDialog extends FloatingDialog{ button.row(); button.label(() -> Bundles.format("text.save.autosave", color + Bundles.get(slot.isAutosave() ? "text.on" : "text.off"))); button.row(); + button.label(() -> Bundles.format("text.save.playtime", color + slot.getPlayTime())); + button.row(); button.add(Bundles.format("text.save.date", color + slot.getDate())).colspan(2).padTop(5).right(); button.row(); modifyButton(button, slot);