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
;
12 import java
.nio
.ByteBuffer
;
14 public class GameSaver
{
16 public static class Data
{
18 private MobsController mMobsController
;
20 private DropController mDropController
;
22 private int[][] mForeMap
, mBackMap
;
24 public Data(MobsController mobsController
, DropController dropController
, int[][] foreMap
, int[][] backMap
) {
25 mMobsController
= mobsController
;
26 mDropController
= dropController
;
31 public MobsController
retrieveMobsController() {
32 assert mMobsController
!= null;
33 MobsController mobsController
= mMobsController
;
34 mMobsController
= null;
35 return mobsController
;
38 public DropController
retrieveDropController() {
39 assert mDropController
!= null;
40 DropController dropController
= mDropController
;
41 mDropController
= null;
42 return dropController
;
45 public int[][] retrieveForeMap() {
46 assert mForeMap
!= null;
47 int[][] foreMap
= mForeMap
;
52 public int[][] retrieveBackMap() {
53 assert mBackMap
!= null;
54 int[][] backMap
= mBackMap
;
59 public boolean isEmpty() {
60 return mMobsController
== null && mDropController
== null && mForeMap
== null && mBackMap
== null;
64 private static final int SAVE_VERSION
= 1;
66 private static byte[] intToBytes(int i
) {
67 return ByteBuffer
.allocate(4).putInt(i
).array();
70 private static void saveMap(FileHandle file
, int[][] map
) throws IOException
{
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
++) {
84 for (int[] ints
: map
) {
85 if (ints
[y
] != block
) {
86 out
.write(intToBytes(run
));
87 out
.write(intToBytes(block
));
93 out
.write(intToBytes(run
));
94 out
.write(intToBytes(block
));
101 private static int[][] loadMap(FileHandle file
) throws Exception
{
103 int version
, width
, height
;
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
) {
117 block
= in
.readInt();
118 for (int i
= x
; i
< x
+ run
; i
++) {
124 throw new Exception("version mismatch");
132 public static Data
load(MainConfig mainConfig
) {
133 String folder
= mainConfig
.getGameFolder();
134 FileHandle file
= Gdx
.files
.absolute(folder
+ "/saves/game.sav");
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();
146 throw new Exception("version mismatch");
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());
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/");
174 file
= Gdx
.files
.absolute(folder
+ "/saves/game.sav");
177 ObjectOutputStream out
= new ObjectOutputStream(file
.write(false));
178 out
.writeInt(SAVE_VERSION
);
179 out
.writeObject(dropController
);
180 out
.writeObject(mobsController
);
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
) {
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());