From f97be94b7d8e16edf930a48399657f31ec98e6ea Mon Sep 17 00:00:00 2001
From: Chris Kearney <chris.kearney@urbanairship.com>
Date: Thu, 4 Sep 2014 22:59:15 -0700
Subject: [PATCH] reading and writing to a json file for roomdata is working

---
 .../java/com/comandante/creeper/Main.java     |  14 +--
 .../comandante/creeper/room/MapsManager.java  |   2 +
 .../creeper/room/RoomLayoutCsvPrototype.java  | 100 ------------------
 .../comandante/creeper/room/RoomModel.java    |  12 ++-
 .../creeper/room/RoomModelBuilder.java        |   8 +-
 .../creeper/room/WorldExporter.java           | 100 +++++++++++++++++-
 .../command/admin/SaveWorldCommand.java       |   3 +-
 7 files changed, 124 insertions(+), 115 deletions(-)
 delete mode 100644 src/main/java/com/comandante/creeper/room/RoomLayoutCsvPrototype.java

diff --git a/src/main/java/com/comandante/creeper/Main.java b/src/main/java/com/comandante/creeper/Main.java
index 96f189da..d6655cad 100644
--- a/src/main/java/com/comandante/creeper/Main.java
+++ b/src/main/java/com/comandante/creeper/Main.java
@@ -7,11 +7,10 @@ import com.comandante.creeper.npc.StreetHustler;
 import com.comandante.creeper.player.PlayerManager;
 import com.comandante.creeper.player.PlayerMetadata;
 import com.comandante.creeper.room.Area;
-import com.comandante.creeper.room.MapMatrix;
 import com.comandante.creeper.room.MapsManager;
 import com.comandante.creeper.room.Room;
-import com.comandante.creeper.room.RoomLayoutCsvPrototype;
 import com.comandante.creeper.room.RoomManager;
+import com.comandante.creeper.room.WorldExporter;
 import com.comandante.creeper.server.CreeperCommandRegistry;
 import com.comandante.creeper.server.CreeperServer;
 import com.comandante.creeper.server.command.DropCommand;
@@ -68,16 +67,12 @@ public class Main {
             System.out.println("Creating Brian User.");
             playerManager.savePlayerMetadata(new PlayerMetadata("brian", "poop", new String(Base64.encodeBase64("brian".getBytes())), chrisBrianStats));
         }
-        MapMatrix floorMapMatrix = RoomLayoutCsvPrototype.buildRooms(entityManager);
         System.out.print("Building all rooms.");
         MapsManager mapsManager = new MapsManager(roomManager);
-        mapsManager.addFloorMatrix(1, floorMapMatrix);
-        mapsManager.generateAllMaps(9, 9);
         GameManager gameManager = new GameManager(roomManager, playerManager, entityManager, mapsManager);
-        gameManager.getFloorManager().addFloor(1, "main");
-
-
-
+        WorldExporter worldExporter = new WorldExporter(roomManager, mapsManager, gameManager.getFloorManager(), entityManager);
+        worldExporter.readWorldFromDisk();
+        mapsManager.generateAllMaps(9, 9);
         entityManager.addEntity(new NpcSpawner(new StreetHustler(gameManager), Area.NEWBIE_ZONE, gameManager, new SpawnRule(10, 100, 4, 100)));
         Iterator<Map.Entry<Integer, Room>> rooms = roomManager.getRooms();
         while (rooms.hasNext()) {
@@ -105,7 +100,6 @@ public class Main {
 
         CreeperServer creeperServer = new CreeperServer(8080, db);
         creeperServer.run(gameManager);
-
         System.out.println("Creeper started.");
     }
 
diff --git a/src/main/java/com/comandante/creeper/room/MapsManager.java b/src/main/java/com/comandante/creeper/room/MapsManager.java
index e4cf561c..bf0ea560 100644
--- a/src/main/java/com/comandante/creeper/room/MapsManager.java
+++ b/src/main/java/com/comandante/creeper/room/MapsManager.java
@@ -29,7 +29,9 @@ public class MapsManager {
     }
 
     public String drawMap(Integer roomId, Coords max) {
+        Room room = roomManager.getRoom(roomId);
         MapMatrix floorMatrix = floorMatrixMaps.get(roomManager.getRoom(roomId).getFloorId());
+
         MapMatrix mapMatrix = floorMatrix.extractMatrix(roomId, max);
         return mapMatrix.renderMap(roomId);
     }
diff --git a/src/main/java/com/comandante/creeper/room/RoomLayoutCsvPrototype.java b/src/main/java/com/comandante/creeper/room/RoomLayoutCsvPrototype.java
deleted file mode 100644
index c2b6b1e2..00000000
--- a/src/main/java/com/comandante/creeper/room/RoomLayoutCsvPrototype.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package com.comandante.creeper.room;
-
-
-import com.comandante.creeper.entity.EntityManager;
-import com.google.common.base.Optional;
-import com.google.common.collect.Lists;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.List;
-
-public class RoomLayoutCsvPrototype {
-    public static String mapCSV = ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8517,8518,8519,8520,8521\n" +
-            ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9017,9018,9019,9020,9021\n" +
-            ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9517,9518,9519,9520,9521\n" +
-            ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10017,10018,10019,10020,10021\n" +
-            ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10517,10518,10519,10520,10521\n" +
-            "2005,2006,2007,2008,2009,2010,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,11017,11018,11019,11020,11021\n" +
-            "2505,2506,2507,2508,2509,2510,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10006,10007,10008,10009,10010,9511,11514,11515,11516,11517,11518,11519,11520,11521\n" +
-            "3005,3006,3007,3008,3009,3010,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10505,,,,,,,,,,,,,\n" +
-            "3505,3506,3507,3508,3509,3510,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,11005,,,,,,,,,,,,,\n" +
-            "4005,4006,4007,4008,4009,4010,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,11505,,,,,,,,,,,,,\n" +
-            "4505,4506,4507,4508,4509,4510,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,12005,,,,,,,,,,,,,\n" +
-            "5005,5006,5007,5008,5009,5010,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,12505,,,,,,,,,,,,,\n" +
-            "5505,5506,5507,5508,5509,5510,,,,,,,,,25506,,,,25007,,,,,,,,,,,,20510,,,,,,,13005,,,,,,,,,,,,,\n" +
-            "6005,6006,6007,6008,6009,6010,509,510,511,512,513,514,515,516,517,518,519,520,521,3,4,26509,6,1,8,9,10,11,12,13,21010,15,16,17,18,19,20,21,,,,,,,,,,,,,\n" +
-            "6505,6506,6507,6508,6509,6510,,,,,,,,,26006,,,,,,,,,,,,,,,,21510,,,,,,,,,,,,,,,,,,,,\n" +
-            "7005,7006,7007,7008,7009,7010,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,\n" +
-            "7505,7506,7507,7508,7509,7510,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,\n" +
-            "8005,8006,8007,8008,8009,8010,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,\n" +
-            "8505,8506,8507,8508,8509,8510,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,\n" +
-            "9005,9006,9007,9008,9009,9010,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,\n" +
-            "9505,9506,9507,9508,9509,9510,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,\n";
-
-
-    public static MapMatrix buildRooms(EntityManager entityManager) {
-        MapMatrix mapMatrix = MapMatrix.createMatrixFromCsv(mapCSV);
-        List<BasicRoom> rooms = Lists.newArrayList();
-        Iterator<List<Integer>> rows = mapMatrix.getRows();
-        while (rows.hasNext()) {
-            List<Integer> row = rows.next();
-            for (Integer newRoomId : row) {
-                if (newRoomId == 0) {
-                    continue;
-                }
-                BasicRoomBuilder basicRoomBuilder = new BasicRoomBuilder();
-                basicRoomBuilder.setRoomId(newRoomId);
-                basicRoomBuilder.setRoomDescription("This is a temporary description.");
-                basicRoomBuilder.setRoomTitle("The generated room-" + newRoomId);
-                basicRoomBuilder.setFloorId(1);
-                Integer north = mapMatrix.getNorth(newRoomId);
-                if (north > 0) {
-                    basicRoomBuilder.setNorthId(Optional.of(north));
-                }
-                Integer east = mapMatrix.getEast(newRoomId);
-                if (east > 0) {
-                    basicRoomBuilder.setEastId(Optional.of(east));
-                }
-                Integer south = mapMatrix.getSouth(newRoomId);
-                if (south > 0) {
-                    basicRoomBuilder.setSouthId(Optional.of(south));
-                }
-                Integer west = mapMatrix.getWest(newRoomId);
-                if (west > 0) {
-                    basicRoomBuilder.setWestId(Optional.of(west));
-                }
-                rooms.add(basicRoomBuilder.createBasicRoom());
-            }
-        }
-        for (Room room : rooms) {
-            entityManager.addEntity(room);
-        }
-        return mapMatrix;
-    }
-
-    public static void main(String[] args) throws IOException {
-        int totalRows = 500;
-        int toalColums = 500;
-
-        List<List<Integer>> rows = Lists.newArrayList();
-
-        for (int i = 0; i < totalRows; i++) {
-            rows.add(Lists.<Integer>newArrayList());
-        }
-        int id = 1;
-        FileWriter fileWriter = new FileWriter(new File("/tmp/bigmap.csv"));
-        for (List<Integer> row : rows) {
-            for (int i = 0; i < toalColums; i++) {
-                id++;
-                fileWriter.write(id + ",");
-            }
-            fileWriter.write("\n");
-        }
-
-        fileWriter.close();
-    }
-
-}
diff --git a/src/main/java/com/comandante/creeper/room/RoomModel.java b/src/main/java/com/comandante/creeper/room/RoomModel.java
index 8c140766..1e178a39 100644
--- a/src/main/java/com/comandante/creeper/room/RoomModel.java
+++ b/src/main/java/com/comandante/creeper/room/RoomModel.java
@@ -7,17 +7,27 @@ import java.util.Set;
 public class RoomModel {
 
     int roomId;
+    int floorId;
     String roomDescription;
     String roomTitle;
     Set<String> roomTags;
 
-    public RoomModel(int roomId, String roomDescription, String roomTitle, Set<String> roomTags) {
+    public RoomModel(int roomId, int floorId, String roomDescription, String roomTitle, Set<String> roomTags) {
         this.roomId = roomId;
+        this.floorId = floorId;
         this.roomDescription = roomDescription;
         this.roomTitle = roomTitle;
         this.roomTags = roomTags;
     }
 
+    public int getFloorId() {
+        return floorId;
+    }
+
+    public void setFloorId(int floorId) {
+        this.floorId = floorId;
+    }
+
     public Set<String> getRoomTags() {
         return roomTags;
     }
diff --git a/src/main/java/com/comandante/creeper/room/RoomModelBuilder.java b/src/main/java/com/comandante/creeper/room/RoomModelBuilder.java
index 2b82dbdf..60bf1dbc 100644
--- a/src/main/java/com/comandante/creeper/room/RoomModelBuilder.java
+++ b/src/main/java/com/comandante/creeper/room/RoomModelBuilder.java
@@ -4,6 +4,7 @@ import java.util.Set;
 
 public class RoomModelBuilder {
     private int roomId;
+    private int floorId;
     private String roomDescription;
     private String roomTitle;
     private Set<String> roomTags;
@@ -13,6 +14,11 @@ public class RoomModelBuilder {
         return this;
     }
 
+    public RoomModelBuilder setFloorId(int floorId) {
+        this.floorId = floorId;
+        return this;
+    }
+
     public RoomModelBuilder setRoomDescription(String roomDescription) {
         this.roomDescription = roomDescription;
         return this;
@@ -29,6 +35,6 @@ public class RoomModelBuilder {
     }
 
     public RoomModel build() {
-        return new RoomModel(roomId, roomDescription, roomTitle, roomTags);
+        return new RoomModel(roomId, floorId, roomDescription, roomTitle, roomTags);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/room/WorldExporter.java b/src/main/java/com/comandante/creeper/room/WorldExporter.java
index 2ff1c0b8..0ea432d7 100644
--- a/src/main/java/com/comandante/creeper/room/WorldExporter.java
+++ b/src/main/java/com/comandante/creeper/room/WorldExporter.java
@@ -1,14 +1,20 @@
 package com.comandante.creeper.room;
 
+import com.comandante.creeper.entity.EntityManager;
 import com.google.common.base.Function;
+import com.google.common.base.Optional;
 import com.google.common.collect.Iterators;
+import com.google.common.collect.Sets;
 import com.google.common.io.Files;
 import com.google.gson.GsonBuilder;
 
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.nio.charset.Charset;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Set;
 
 public class WorldExporter {
@@ -18,11 +24,13 @@ public class WorldExporter {
     private final RoomManager roomManager;
     private final MapsManager mapsManager;
     private final FloorManager floorManager;
+    private final EntityManager entityManager;
 
-    public WorldExporter(RoomManager roomManager, MapsManager mapsManager, FloorManager floorManager) {
+    public WorldExporter(RoomManager roomManager, MapsManager mapsManager, FloorManager floorManager, EntityManager entityManager) {
         this.roomManager = roomManager;
         this.mapsManager = mapsManager;
         this.floorManager = floorManager;
+        this.entityManager = entityManager;
     }
 
     public void saveWorld() {
@@ -38,6 +46,7 @@ public class WorldExporter {
         floorModel.setId(floorId);
         floorModel.setRawMatrixCsv(mapMatrix.getCsv());
         floorModel.setRoomModels((new HashSet<RoomModel>()));
+        floorModel.setName(floorManager.getName(floorId));
         Iterator<RoomModel> roomModels = Iterators.transform(rooms.iterator(), getRoomModels());
         while (roomModels.hasNext()) {
             RoomModel next = roomModels.next();
@@ -47,7 +56,7 @@ public class WorldExporter {
         String floorjson = new GsonBuilder().setPrettyPrinting().create().toJson(floorModel, FloorModel.class);
 
         try {
-            Files.write(floorjson.getBytes(), new File(WORLD_DIR + floorManager.getName(floorId) + ".json"));
+            Files.write(floorjson.getBytes(), new File(WORLD_DIR + floorManager.getName(floorId) + "_floor.json"));
         } catch (IOException e) {
             e.printStackTrace();
         }
@@ -67,4 +76,91 @@ public class WorldExporter {
         };
     }
 
+    public Function<RoomModel, BasicRoom> getBasicRoom(final MapMatrix mapMatrix) {
+        return new Function<RoomModel, BasicRoom>() {
+            @Override
+            public BasicRoom apply(RoomModel roomModel) {
+                BasicRoomBuilder basicRoomBuilder = new BasicRoomBuilder()
+                        .setRoomId(roomModel.getRoomId())
+                        .setFloorId(roomModel.getFloorId())
+                        .setRoomDescription(roomModel.getRoomDescription())
+                        .setRoomTitle(roomModel.getRoomTitle());
+
+                for (String tag : roomModel.getRoomTags()) {
+                    basicRoomBuilder.addTag(tag);
+                }
+                Integer north = mapMatrix.getNorth(roomModel.getRoomId());
+                if (north > 0) {
+                    basicRoomBuilder.setNorthId(Optional.of(north));
+                }
+                Integer east = mapMatrix.getEast(roomModel.getRoomId());
+                if (east > 0) {
+                    basicRoomBuilder.setEastId(Optional.of(east));
+                }
+                Integer south = mapMatrix.getSouth(roomModel.getRoomId());
+                if (south > 0) {
+                    basicRoomBuilder.setSouthId(Optional.of(south));
+                }
+                Integer west = mapMatrix.getWest(roomModel.getRoomId());
+                if (west > 0) {
+                    basicRoomBuilder.setWestId(Optional.of(west));
+                }
+                return basicRoomBuilder.createBasicRoom();
+            }
+        };
+    }
+
+    public MapMatrix readWorldFromDisk() throws FileNotFoundException {
+        FloorModel floorModel = new GsonBuilder().create().fromJson(Files.newReader(new File(("world/main_floor.json")), Charset.defaultCharset()), FloorModel.class);
+        MapMatrix matrixFromCsv = MapMatrix.createMatrixFromCsv(floorModel.getRawMatrixCsv());
+        Set<Room> rooms = Sets.newHashSet();
+        if (floorModel.getRoomModels().size() == 0) {
+            Iterator<List<Integer>> rows = matrixFromCsv.getRows();
+            while (rows.hasNext()) {
+                List<Integer> row = rows.next();
+                for (Integer roomId: row) {
+                    if (roomId.equals(0)){
+                        continue;
+                    }
+                    BasicRoomBuilder basicRoomBuilder = new BasicRoomBuilder();
+                    basicRoomBuilder.setFloorId(floorModel.getId());
+                    basicRoomBuilder.setRoomId(roomId);
+                    basicRoomBuilder.setRoomTitle("This is a blank title.");
+                    basicRoomBuilder.setRoomDescription("This is a blank Description.\nWords should go here, ideally.");
+                    Integer north = matrixFromCsv.getNorth(roomId);
+                    if (north > 0) {
+                        basicRoomBuilder.setNorthId(Optional.of(north));
+                    }
+                    Integer east = matrixFromCsv.getEast(roomId);
+                    if (east > 0) {
+                        basicRoomBuilder.setEastId(Optional.of(east));
+                    }
+                    Integer south = matrixFromCsv.getSouth(roomId);
+                    if (south > 0) {
+                        basicRoomBuilder.setSouthId(Optional.of(south));
+                    }
+                    Integer west = matrixFromCsv.getWest(roomId);
+                    if (west > 0) {
+                        basicRoomBuilder.setWestId(Optional.of(west));
+                    }
+                    rooms.add(basicRoomBuilder.createBasicRoom());
+                }
+            }
+            for (Room r: rooms) {
+                entityManager.addEntity(r);
+            }
+            floorManager.addFloor(floorModel.getId(), floorModel.getName());
+            mapsManager.addFloorMatrix(floorModel.getId(), matrixFromCsv);
+            return matrixFromCsv;
+        }
+        Iterator<BasicRoom> transform = Iterators.transform(floorModel.getRoomModels().iterator(), getBasicRoom(matrixFromCsv));
+        while (transform.hasNext()) {
+            BasicRoom next = transform.next();
+            entityManager.addEntity(next);
+        }
+        floorManager.addFloor(floorModel.getId(), floorModel.getName());
+        mapsManager.addFloorMatrix(floorModel.getId(), matrixFromCsv);
+        return matrixFromCsv;
+    }
+
 }
diff --git a/src/main/java/com/comandante/creeper/server/command/admin/SaveWorldCommand.java b/src/main/java/com/comandante/creeper/server/command/admin/SaveWorldCommand.java
index 8f2820f2..ff69a189 100644
--- a/src/main/java/com/comandante/creeper/server/command/admin/SaveWorldCommand.java
+++ b/src/main/java/com/comandante/creeper/server/command/admin/SaveWorldCommand.java
@@ -25,7 +25,8 @@ public class SaveWorldCommand extends Command {
         WorldExporter worldExporter = new WorldExporter(
                         getGameManager().getRoomManager(),
                         getGameManager().getMapsManager(),
-                        getGameManager().getFloorManager());
+                        getGameManager().getFloorManager(),
+                        getGameManager().getEntityManager());
 
         worldExporter.saveWorld();
         getGameManager().getChannelUtils().write(getPlayerId(extractCreeperSession(e.getChannel())), "World saved.");
-- 
GitLab