DEADSOFTWARE

Move game world to new package
[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 public static class Data {
17 @CheckForNull
18 private MobsController mMobsController;
19 @CheckForNull
20 private DropController mDropController;
21 @CheckForNull
22 private int[][] mForeMap, mBackMap;
24 public Data(MobsController mobsController, DropController dropController, int[][] foreMap, int[][] backMap) {
25 mMobsController = mobsController;
26 mDropController = dropController;
27 mForeMap = foreMap;
28 mBackMap = backMap;
29 }
31 public MobsController retrieveMobsController() {
32 assert mMobsController != null;
33 MobsController mobsController = mMobsController;
34 mMobsController = null;
35 return mobsController;
36 }
38 public DropController retrieveDropController() {
39 assert mDropController != null;
40 DropController dropController = mDropController;
41 mDropController = null;
42 return dropController;
43 }
45 public int[][] retrieveForeMap() {
46 assert mForeMap != null;
47 int[][] foreMap = mForeMap;
48 mForeMap = null;
49 return foreMap;
50 }
52 public int[][] retrieveBackMap() {
53 assert mBackMap != null;
54 int[][] backMap = mBackMap;
55 mBackMap = null;
56 return backMap;
57 }
59 public boolean isEmpty() {
60 return mMobsController == null && mDropController == null && mForeMap == null && mBackMap == null;
61 }
62 }
64 private static final int SAVE_VERSION = 1;
66 private static byte[] intToBytes(int i) {
67 return ByteBuffer.allocate(4).putInt(i).array();
68 }
70 private static void saveMap(FileHandle file, int[][] map) throws IOException {
71 int run, block;
72 int width = map.length;
73 int height = map[0].length;
75 BufferedOutputStream out = new BufferedOutputStream(file.write(false));
77 out.write(intToBytes(SAVE_VERSION));
78 out.write(intToBytes(width));
79 out.write(intToBytes(height));
81 for (int y = 0; y < height; y++) {
82 block = map[0][y];
83 run = 0;
84 for (int[] ints : map) {
85 if (ints[y] != block) {
86 out.write(intToBytes(run));
87 out.write(intToBytes(block));
88 run = 0;
89 block = ints[y];
90 }
91 run++;
92 }
93 out.write(intToBytes(run));
94 out.write(intToBytes(block));
95 }
97 out.flush();
98 out.close();
99 }
101 private static int[][] loadMap(FileHandle file) throws Exception {
102 int[][] map;
103 int version, width, height;
104 int run, block;
106 DataInputStream in = new DataInputStream(file.read());
108 version = in.readInt();
110 if (SAVE_VERSION == version) {
111 width = in.readInt();
112 height = in.readInt();
113 map = new int[width][height];
114 for (int y = 0; y < height; y++) {
115 for (int x = 0; x < width; x += run) {
116 run = in.readInt();
117 block = in.readInt();
118 for (int i = x; i < x + run; i++) {
119 map[i][y] = block;
123 } else {
124 throw new Exception("version mismatch");
127 in.close();
128 return map;
131 @CheckForNull
132 public static Data load(MainConfig mainConfig) {
133 String folder = mainConfig.getGameFolder();
134 FileHandle file = Gdx.files.absolute(folder + "/saves/game.sav");
136 try {
137 ObjectInputStream in = new ObjectInputStream(file.read());
138 int version = in.readInt();
139 DropController dropController;
140 MobsController mobsController;
142 if (SAVE_VERSION == version) {
143 dropController = (DropController) in.readObject();
144 mobsController = (MobsController) in.readObject();
145 } else {
146 throw new Exception("version mismatch");
149 in.close();
151 int[][] foreMap = loadMap(Gdx.files.absolute(mainConfig.getGameFolder() + "/saves/foremap.sav"));
152 int[][] backMap = loadMap(Gdx.files.absolute(mainConfig.getGameFolder() + "/saves/backmap.sav"));
154 if (dropController == null || mobsController == null) {
155 throw new Exception("couldn't load");
158 return new Data(mobsController, dropController, foreMap, backMap);
159 } catch (Exception e) {
160 Gdx.app.error("GameSaver", e.getMessage());
163 return null;
166 public static void save(MainConfig mainConfig,
167 DropController dropController,
168 MobsController mobsController,
169 GameWorld gameWorld) {
171 String folder = mainConfig.getGameFolder();
172 FileHandle file = Gdx.files.absolute(folder + "/saves/");
173 file.mkdirs();
174 file = Gdx.files.absolute(folder + "/saves/game.sav");
176 try {
177 ObjectOutputStream out = new ObjectOutputStream(file.write(false));
178 out.writeInt(SAVE_VERSION);
179 out.writeObject(dropController);
180 out.writeObject(mobsController);
181 out.close();
182 saveMap(Gdx.files.absolute(folder + "/saves/foremap.sav"), gameWorld.getFullForeMap());
183 saveMap(Gdx.files.absolute(folder + "/saves/backmap.sav"), gameWorld.getFullBackMap());
184 } catch (Exception e) {
185 e.printStackTrace();
189 public static boolean exists(MainConfig mainConfig) {
190 String folder = mainConfig.getGameFolder();
191 return (Gdx.files.absolute(folder + "/saves/game.sav").exists() &&
192 Gdx.files.absolute(folder + "/saves/foremap.sav").exists() &&
193 Gdx.files.absolute(folder + "/saves/backmap.sav").exists());