DEADSOFTWARE

Delete old GameItems
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / GameSaver.java
1 package ru.deadsoftware.cavedroid.game;
3 import com.badlogic.gdx.Gdx;
4 import com.badlogic.gdx.files.FileHandle;
5 import ru.deadsoftware.cavedroid.MainConfig;
6 import ru.deadsoftware.cavedroid.game.mobs.MobsController;
7 import ru.deadsoftware.cavedroid.game.objects.DropController;
8 import ru.deadsoftware.cavedroid.game.world.GameWorld;
10 import javax.annotation.CheckForNull;
11 import java.io.*;
12 import java.nio.ByteBuffer;
14 public class GameSaver {
16 private static final String TAG = "GameSaver";
18 public static class Data {
19 @CheckForNull
20 private MobsController mMobsController;
21 @CheckForNull
22 private DropController mDropController;
23 @CheckForNull
24 private int[][] mForeMap, mBackMap;
26 public Data(MobsController mobsController, DropController dropController, int[][] foreMap, int[][] backMap) {
27 mMobsController = mobsController;
28 mDropController = dropController;
29 mForeMap = foreMap;
30 mBackMap = backMap;
31 }
33 public MobsController retrieveMobsController() {
34 assert mMobsController != null;
35 MobsController mobsController = mMobsController;
36 mMobsController = null;
37 return mobsController;
38 }
40 public DropController retrieveDropController() {
41 assert mDropController != null;
42 DropController dropController = mDropController;
43 mDropController = null;
44 return dropController;
45 }
47 public int[][] retrieveForeMap() {
48 assert mForeMap != null;
49 int[][] foreMap = mForeMap;
50 mForeMap = null;
51 return foreMap;
52 }
54 public int[][] retrieveBackMap() {
55 assert mBackMap != null;
56 int[][] backMap = mBackMap;
57 mBackMap = null;
58 return backMap;
59 }
61 public boolean isEmpty() {
62 return mMobsController == null && mDropController == null && mForeMap == null && mBackMap == null;
63 }
64 }
66 private static final int SAVE_VERSION = 1;
68 private static byte[] intToBytes(int i) {
69 return ByteBuffer.allocate(4).putInt(i).array();
70 }
72 private static void saveMap(FileHandle file, int[][] map) throws IOException {
73 int run, block;
74 int width = map.length;
75 int height = map[0].length;
77 BufferedOutputStream out = new BufferedOutputStream(file.write(false));
79 out.write(intToBytes(SAVE_VERSION));
80 out.write(intToBytes(width));
81 out.write(intToBytes(height));
83 for (int y = 0; y < height; y++) {
84 block = map[0][y];
85 run = 0;
86 for (int[] ints : map) {
87 if (ints[y] != block) {
88 out.write(intToBytes(run));
89 out.write(intToBytes(block));
90 run = 0;
91 block = ints[y];
92 }
93 run++;
94 }
95 out.write(intToBytes(run));
96 out.write(intToBytes(block));
97 }
99 out.flush();
100 out.close();
103 private static int[][] loadMap(FileHandle file) throws Exception {
104 int[][] map;
105 int version, width, height;
106 int run, block;
108 DataInputStream in = new DataInputStream(file.read());
110 version = in.readInt();
112 if (SAVE_VERSION == version) {
113 width = in.readInt();
114 height = in.readInt();
115 map = new int[width][height];
116 for (int y = 0; y < height; y++) {
117 for (int x = 0; x < width; x += run) {
118 run = in.readInt();
119 block = in.readInt();
120 for (int i = x; i < x + run; i++) {
121 map[i][y] = block;
125 } else {
126 throw new Exception("version mismatch");
129 in.close();
130 return map;
133 @CheckForNull
134 public static Data load(MainConfig mainConfig) {
135 String folder = mainConfig.getGameFolder();
136 FileHandle file = Gdx.files.absolute(folder + "/saves/game.sav");
138 try {
139 ObjectInputStream in = new ObjectInputStream(file.read());
140 int version = in.readInt();
141 DropController dropController;
142 MobsController mobsController;
144 if (SAVE_VERSION == version) {
145 dropController = (DropController) in.readObject();
146 mobsController = (MobsController) in.readObject();
147 } else {
148 throw new Exception("version mismatch");
151 in.close();
153 int[][] foreMap = loadMap(Gdx.files.absolute(mainConfig.getGameFolder() + "/saves/foremap.sav"));
154 int[][] backMap = loadMap(Gdx.files.absolute(mainConfig.getGameFolder() + "/saves/backmap.sav"));
156 if (dropController == null || mobsController == null) {
157 throw new Exception("couldn't load");
160 return new Data(mobsController, dropController, foreMap, backMap);
161 } catch (Exception e) {
162 Gdx.app.error("GameSaver", e.getMessage());
165 return null;
168 public static void save(MainConfig mainConfig,
169 DropController dropController,
170 MobsController mobsController,
171 GameWorld gameWorld) {
173 Gdx.app.debug(TAG, "Saves are disabled for this build");
174 return;
177 /* String folder = mainConfig.getGameFolder();
178 FileHandle file = Gdx.files.absolute(folder + "/saves/");
179 file.mkdirs();
180 file = Gdx.files.absolute(folder + "/saves/game.sav");
182 try {
183 ObjectOutputStream out = new ObjectOutputStream(file.write(false));
184 out.writeInt(SAVE_VERSION);
185 out.writeObject(dropController);
186 out.writeObject(mobsController);
187 out.close();
188 // TODO: 4/20/24 save map
189 // saveMap(Gdx.files.absolute(folder + "/saves/foremap.sav"), gameWorld.getFullForeMap());
190 // saveMap(Gdx.files.absolute(folder + "/saves/backmap.sav"), gameWorld.getFullBackMap());
191 } catch (Exception e) {
192 e.printStackTrace();
193 }*/
196 public static boolean exists(MainConfig mainConfig) {
197 return false;
198 // String folder = mainConfig.getGameFolder();
199 // return (Gdx.files.absolute(folder + "/saves/game.sav").exists() &&
200 // Gdx.files.absolute(folder + "/saves/foremap.sav").exists() &&
201 // Gdx.files.absolute(folder + "/saves/backmap.sav").exists());