From 22a28f337c2d1a67808b34515d7d96ba3035ddcf Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 7 Aug 2017 23:59:02 -0400 Subject: [PATCH] Finished save format --- android/assets/sprites/back.png | Bin 7987 -> 4028 bytes android/assets/sprites/conveyort.png | Bin 213 -> 181 bytes core/src/io/anuke/mindustry/Control.java | 1 + core/src/io/anuke/mindustry/UI.java | 7 ++- core/src/io/anuke/mindustry/Vars.java | 2 + core/src/io/anuke/mindustry/io/SaveIO.java | 47 ++++++++++++++++++ .../src/io/anuke/mindustry/ui/MenuDialog.java | 28 ++++++++--- .../src/io/anuke/mindustry/ui/SaveDialog.java | 39 +++++++++++++++ 8 files changed, 116 insertions(+), 8 deletions(-) create mode 100644 core/src/io/anuke/mindustry/ui/SaveDialog.java diff --git a/android/assets/sprites/back.png b/android/assets/sprites/back.png index 9a2c29bc0f12976918f6adbcd2584ba8feac4469..70a6cf360af290b6f0737f1968c8bda23ae83c13 100644 GIT binary patch literal 4028 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 NI_Tv_IdJN?{|A;gWcvUB diff --git a/android/assets/sprites/conveyort.png b/android/assets/sprites/conveyort.png index afb9ebd8c744c156723d314ea2488338ec15f02b..c5a360ac404e7b1ead38aa2fb4ac0a94f1c1949b 100644 GIT binary patch delta 123 zcmcc0xRp_{Gr-TCmrII^fq{Y7)59eQNOOQN2OE$)!oRP3qM|$}2fMJUQIme}#)+O9 zF8ZD>jv*44lXJ4Ne${_{70Q<55FI_cv9+*v<$vkHOQ`&t;ucLK6VYG9+gJ delta 155 zcmdnWc$HDHGr-TCmrII^fq{Y7)59eQNGpIa2OE$quB!SnQBj_gMNU*sD0BYl=Mz0O zQv5w#977@wzn!v?7pRQoq6I_s236}#?9v&lza4A({cfe5WzpHY%X2z8DkY7rtEQh% sJg|d*CTG(l`vt2M4ltvj6{ZP{-T8ux*K}lC1MOq*boFyt=akR{07E@9tN;K2 diff --git a/core/src/io/anuke/mindustry/Control.java b/core/src/io/anuke/mindustry/Control.java index 41bc46c61d..1999dde58b 100644 --- a/core/src/io/anuke/mindustry/Control.java +++ b/core/src/io/anuke/mindustry/Control.java @@ -400,6 +400,7 @@ public class Control extends RendererModule{ AndroidInput.mousex = Gdx.graphics.getWidth()/2; AndroidInput.mousey = Gdx.graphics.getHeight()/2; + camera.position.set(player.x, player.y, 0); } } diff --git a/core/src/io/anuke/mindustry/UI.java b/core/src/io/anuke/mindustry/UI.java index d6df72dd97..9226b492a8 100644 --- a/core/src/io/anuke/mindustry/UI.java +++ b/core/src/io/anuke/mindustry/UI.java @@ -76,10 +76,13 @@ public class UI extends SceneModule{ int tw = w/64+1; - batch.draw(Textures.get("back"), 0, 0, 0, 0, w, h); + float scale = Unit.dp.inPixels(1f); + + batch.draw(Textures.get("back"), 0, 0, w, h, 0, 0, (float)w/h/scale * h/Textures.get("back").getHeight()/4f, -1f/scale * h/Textures.get("back").getHeight()/4f); for(int x = 0; x < tw; x ++){ - batch.draw(Textures.get("conveyort"), x*64, 0, 0, (int)(Timers.time()*2*(x%2-0.5f)), 32, h); + float offset = (Timers.time()*2*(x%2-0.5f))/32f; + batch.draw(Textures.get("conveyort"), x*64*scale, 0, 32*scale, h*scale, 0, offset, 1, h/32 + offset); } Draw.color(); diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index 12394df315..ea42a84d33 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -20,6 +20,8 @@ public class Vars{ public static boolean debug = false; + public static final int saveSlots = 4; + //turret and enemy shoot speed inverse multiplier public static final int multiplier = android ? 3 : 1; diff --git a/core/src/io/anuke/mindustry/io/SaveIO.java b/core/src/io/anuke/mindustry/io/SaveIO.java index 1731b9e69f..6d11d19c6c 100644 --- a/core/src/io/anuke/mindustry/io/SaveIO.java +++ b/core/src/io/anuke/mindustry/io/SaveIO.java @@ -3,9 +3,13 @@ package io.anuke.mindustry.io; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.ObjectMap; +import com.badlogic.gdx.utils.TimeUtils; import com.badlogic.gdx.utils.reflect.ClassReflection; import io.anuke.mindustry.Inventory; @@ -23,6 +27,11 @@ import io.anuke.ucore.entities.Entity; /* * Save format: * + * --META-- + * + * Save file version ID (int) + * Last saved timestamp (long) + * * --STATE DATA-- * Wave (int) * Wave countdown time (float) @@ -67,6 +76,11 @@ import io.anuke.ucore.entities.Entity; * */ public class SaveIO{ + /**Save file version ID. Should be incremented every breaking release.*/ + private static final int fileVersionID = 0; + + private static final SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss"); + //TODO automatic registration of types? private static final ObjectMap, Byte> enemyIDs = new ObjectMap, Byte>(){{ put(Enemy.class, (byte)0); @@ -80,10 +94,36 @@ public class SaveIO{ put(enemyIDs.get(value), value); }}; + public static boolean isSaveValid(int slot){ + try(DataInputStream stream = new DataInputStream(fileFor(slot).read())){ + return stream.readInt() == fileVersionID; + }catch (Exception e){ + return false; + } + } + + public static String getTimeString(int slot){ + + try(DataInputStream stream = new DataInputStream(fileFor(slot).read())){ + stream.readInt(); + Date date = new Date(stream.readLong()); + return format.format(date); + }catch (IOException e){ + throw new RuntimeException(e); + } + } + + public static FileHandle fileFor(int slot){ + return Gdx.files.local("mindustry-saves/" + slot + ".mins"); + } + public static void write(FileHandle file){ try(DataOutputStream stream = new DataOutputStream(file.write(false))){ + stream.writeInt(fileVersionID); //version id + stream.writeLong(TimeUtils.millis()); + //--GENERAL STATE-- stream.writeInt(Vars.control.getWave()); //wave stream.writeFloat(Vars.control.getWaveCountdown()); //wave countdown @@ -188,6 +228,13 @@ public class SaveIO{ try(DataInputStream stream = new DataInputStream(file.read())){ Item[] itemEnums = Item.values(); + int version = stream.readInt(); + /*long loadTime = */stream.readLong(); + + if(version != fileVersionID){ + //TODO throw an exception? + } + //general state int wave = stream.readInt(); diff --git a/core/src/io/anuke/mindustry/ui/MenuDialog.java b/core/src/io/anuke/mindustry/ui/MenuDialog.java index a8bf1ae648..be7660ba42 100644 --- a/core/src/io/anuke/mindustry/ui/MenuDialog.java +++ b/core/src/io/anuke/mindustry/ui/MenuDialog.java @@ -4,11 +4,13 @@ import static io.anuke.mindustry.Vars.ui; import io.anuke.mindustry.GameState; import io.anuke.mindustry.GameState.State; +import io.anuke.mindustry.Vars; import io.anuke.ucore.scene.ui.ConfirmDialog; import io.anuke.ucore.scene.ui.Dialog; import io.anuke.ucore.scene.ui.layout.Unit; public class MenuDialog extends Dialog{ + private SaveDialog save = new SaveDialog(); public MenuDialog(){ super("Paused", "dialog"); @@ -16,20 +18,34 @@ public class MenuDialog extends Dialog{ } void setup(){ + content().defaults().width(200).units(Unit.dp); + content().addButton("Back", ()->{ hide(); GameState.set(State.playing); - }).width(200).units(Unit.dp); + }); content().row(); content().addButton("Settings", ()->{ ui.showPrefs(); - }).width(200).units(Unit.dp); + }); + + if(!Vars.android){ + content().row(); + content().addButton("Controls", ()->{ + ui.showControls(); + }); + } content().row(); - content().addButton("Controls", ()->{ - ui.showControls(); - }).width(200).units(Unit.dp); + content().addButton("Save Game", ()->{ + save.show(); + }); + + content().row(); + content().addButton("Load Game", ()->{ + + }); content().row(); content().addButton("Back to menu", ()->{ @@ -37,6 +53,6 @@ public class MenuDialog extends Dialog{ hide(); GameState.set(State.menu); }).show(); - }).width(200).units(Unit.dp); + }); } } diff --git a/core/src/io/anuke/mindustry/ui/SaveDialog.java b/core/src/io/anuke/mindustry/ui/SaveDialog.java new file mode 100644 index 0000000000..f532b8740b --- /dev/null +++ b/core/src/io/anuke/mindustry/ui/SaveDialog.java @@ -0,0 +1,39 @@ +package io.anuke.mindustry.ui; + +import io.anuke.mindustry.Vars; +import io.anuke.mindustry.io.SaveIO; +import io.anuke.ucore.scene.ui.Dialog; +import io.anuke.ucore.scene.ui.TextButton; +import io.anuke.ucore.scene.ui.layout.Unit; + +public class SaveDialog extends Dialog{ + + public SaveDialog() { + super("Save Game"); + setup(); + } + + private void setup(){ + content().clear(); + + content().add("Select a save slot.").padBottom(4); + content().row(); + + for(int i = 0; i < Vars.saveSlots; i ++){ + TextButton button = new TextButton("[yellow]Slot " + i); + button.getLabelCell().top().left().growX(); + button.row(); + button.pad(12); + button.add("[gray]" + (!SaveIO.isSaveValid(i) ? "" : "Last Saved: " + SaveIO.getTimeString(i))); + button.getLabel().setFontScale(1f); + + button.clicked(()->{ + + }); + + content().add(button).size(400, 100).units(Unit.dp).pad(10); + content().row(); + } + } + +}