DEADSOFTWARE

Add chest
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / GameSaver.java
index 53d147228f96a334a31ce9cd2e575c14b154e55e..39d227844ac1badb1d7898e28490d37019535e70 100644 (file)
@@ -5,7 +5,8 @@ import com.badlogic.gdx.files.FileHandle;
 import ru.deadsoftware.cavedroid.MainConfig;
 import ru.deadsoftware.cavedroid.game.mobs.MobsController;
 import ru.deadsoftware.cavedroid.game.model.block.Block;
-import ru.deadsoftware.cavedroid.game.objects.DropController;
+import ru.deadsoftware.cavedroid.game.objects.drop.DropController;
+import ru.deadsoftware.cavedroid.game.objects.container.ContainerController;
 import ru.deadsoftware.cavedroid.game.world.GameWorld;
 
 import javax.annotation.CheckForNull;
@@ -24,11 +25,18 @@ public class GameSaver {
         @CheckForNull
         private DropController mDropController;
         @CheckForNull
+        private ContainerController mContainerController;
+        @CheckForNull
         private Block[][] mForeMap, mBackMap;
 
-        public Data(MobsController mobsController, DropController dropController, Block[][] foreMap, Block[][] backMap) {
+        public Data(MobsController mobsController,
+                    DropController dropController,
+                    ContainerController containerController,
+                    Block[][] foreMap,
+                    Block[][] backMap) {
             mMobsController = mobsController;
             mDropController = dropController;
+            mContainerController = containerController;
             mForeMap = foreMap;
             mBackMap = backMap;
         }
@@ -47,6 +55,13 @@ public class GameSaver {
             return dropController;
         }
 
+        public ContainerController retrieveFurnaceController() {
+            assert mContainerController != null;
+            ContainerController containerController = mContainerController;
+            mContainerController = null;
+            return containerController;
+        }
+
         public Block[][] retrieveForeMap() {
             assert mForeMap != null;
             Block[][] foreMap = mForeMap;
@@ -62,7 +77,11 @@ public class GameSaver {
         }
 
         public boolean isEmpty() {
-            return mMobsController == null && mDropController == null && mForeMap == null && mBackMap == null;
+            return mMobsController == null &&
+                    mDropController == null &&
+                    mContainerController == null &&
+                    mForeMap == null &&
+                    mBackMap == null;
         }
     }
 
@@ -118,7 +137,7 @@ public class GameSaver {
 
         BufferedOutputStream out = new BufferedOutputStream(file.write(false));
 
-        out.write(intToBytes(SAVE_VERSION));
+        out.write(SAVE_VERSION);
         out.write(intToBytes(width));
         out.write(intToBytes(height));
 
@@ -127,16 +146,16 @@ public class GameSaver {
             run = 0;
             for (Block[] blocks : map) {
                 int newValue = dict.get(blocks[y].getParams().getKey());
-                if (newValue != block) {
-                    out.write(intToBytes(run));
-                    out.write(intToBytes(block));
+                if (run >= 0xFF || newValue != block) {
+                    out.write(run);
+                    out.write(block);
                     run = 0;
                     block = dict.get(blocks[y].getParams().getKey());
                 }
                 run++;
             }
-            out.write(intToBytes(run));
-            out.write(intToBytes(block));
+            out.write(run);
+            out.write(block);
         }
 
         out.flush();
@@ -150,7 +169,7 @@ public class GameSaver {
 
         DataInputStream in = new DataInputStream(file.read());
 
-        version = in.readInt();
+        version = in.readByte();
 
         if (SAVE_VERSION == version) {
             width = in.readInt();
@@ -158,8 +177,8 @@ public class GameSaver {
             map = new Block[width][height];
             for (int y = 0; y < height; y++) {
                 for (int x = 0; x < width; x += run) {
-                    run = in.readInt();
-                    block = in.readInt();
+                    run = in.readUnsignedByte();
+                    block = in.readUnsignedByte();
                     for (int i = x; i < x + run; i++) {
                         map[i][y] = gameItemsHolder.getBlock(dict[block]);
                     }
@@ -183,10 +202,12 @@ public class GameSaver {
             int version = in.readInt();
             DropController dropController;
             MobsController mobsController;
+            ContainerController containerController;
 
             if (SAVE_VERSION == version) {
                 dropController = (DropController) in.readObject();
                 mobsController = (MobsController) in.readObject();
+                containerController = (ContainerController) in.readObject();
             } else {
                 throw new Exception("version mismatch");
             }
@@ -201,7 +222,7 @@ public class GameSaver {
                 throw new Exception("couldn't load");
             }
 
-            return new Data(mobsController, dropController, foreMap, backMap);
+            return new Data(mobsController, dropController, containerController, foreMap, backMap);
         } catch (Exception e) {
             Gdx.app.error("GameSaver", e.getMessage());
         }
@@ -212,6 +233,7 @@ public class GameSaver {
     public static void save(MainConfig mainConfig,
                             DropController dropController,
                             MobsController mobsController,
+                            ContainerController containerController,
                             GameWorld gameWorld) {
         String folder = mainConfig.getGameFolder();
         FileHandle file = Gdx.files.absolute(folder + "/saves/");
@@ -229,6 +251,7 @@ public class GameSaver {
             out.writeInt(SAVE_VERSION);
             out.writeObject(dropController);
             out.writeObject(mobsController);
+            out.writeObject(containerController);
             out.close();
 
             saveDict(Gdx.files.absolute(folder + "/saves/dict"), dict);