From 35643f0685955acc28305278b3af4f50e54786fa Mon Sep 17 00:00:00 2001
From: Chris Kearney <chris@kearneymail.com>
Date: Thu, 23 Apr 2015 22:10:12 -0700
Subject: [PATCH] fixed the enter exits, added an area set command, and some
 sven created npc

---
 .../java/com/comandante/creeper/Main.java     | 24 ++++++----
 .../comandante/creeper/fight/FightRun.java    |  5 +-
 .../com/comandante/creeper/npc/BergOrc.java   | 34 +++++++++++++
 .../com/comandante/creeper/npc/NpcStats.java  | 47 +++++++++++++++++-
 .../creeper/npc/SwampBerserker.java           | 34 +++++++++++++
 .../comandante/creeper/npc/TreeBerserker.java | 34 +++++++++++++
 .../creeper/server/command/AreaCommand.java   | 48 +++++++++++++++++++
 .../server/command/InventoryCommand.java      |  4 +-
 .../creeper/server/command/LookCommand.java   |  2 +-
 .../server/command/admin/BuildCommand.java    |  2 +-
 .../com/comandante/creeper/world/Area.java    |  7 +++
 .../comandante/creeper/world/MapMatrix.java   |  7 ---
 .../com/comandante/creeper/world/Room.java    |  4 +-
 .../comandante/creeper/world/RoomModel.java   | 13 ++++-
 .../creeper/world/RoomModelBuilder.java       | 10 +++-
 .../creeper/world/WorldExporter.java          | 21 +++++---
 world/world.json                              | 43 +++--------------
 17 files changed, 270 insertions(+), 69 deletions(-)
 create mode 100644 src/main/java/com/comandante/creeper/npc/BergOrc.java
 create mode 100644 src/main/java/com/comandante/creeper/npc/SwampBerserker.java
 create mode 100644 src/main/java/com/comandante/creeper/npc/TreeBerserker.java
 create mode 100644 src/main/java/com/comandante/creeper/server/command/AreaCommand.java

diff --git a/src/main/java/com/comandante/creeper/Main.java b/src/main/java/com/comandante/creeper/Main.java
index 1aac7e82..7e264d53 100644
--- a/src/main/java/com/comandante/creeper/Main.java
+++ b/src/main/java/com/comandante/creeper/Main.java
@@ -4,7 +4,10 @@ import com.comandante.creeper.Items.ItemType;
 import com.comandante.creeper.entity.EntityManager;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.managers.SessionManager;
+import com.comandante.creeper.npc.BergOrc;
 import com.comandante.creeper.npc.StreetHustler;
+import com.comandante.creeper.npc.SwampBerserker;
+import com.comandante.creeper.npc.TreeBerserker;
 import com.comandante.creeper.player.PlayerManager;
 import com.comandante.creeper.player.PlayerMetadata;
 import com.comandante.creeper.server.CreeperCommandRegistry;
@@ -42,8 +45,8 @@ public class Main {
     public static CreeperCommandRegistry creeperCommandRegistry;
     private static final Logger log = Logger.getLogger(Main.class);
 
-    private static final int PORT = 8081;
-    public static final String MUD_NAME = "creeperBETA";
+    private static final int PORT = 8080;
+    public static final String MUD_NAME = "creeper";
 
     public static void main(String[] args) throws Exception {
 
@@ -75,16 +78,20 @@ public class Main {
         entityManager.addEntity(new NpcSpawner(new StreetHustler(gameManager), Area.NEWBIE_ZONE, gameManager, new SpawnRule(10, 30, 3, 25)));
         entityManager.addEntity(new NpcSpawner(new StreetHustler(gameManager), Area.DEFAULT, gameManager, new SpawnRule(10, 3, 4, 25)));
 
-        Iterator<Map.Entry<Integer, Room>> rooms = roomManager.getRooms();
-        while (rooms.hasNext()) {
-            Map.Entry<Integer, Room> next = rooms.next();
-            next.getValue().setAreas(Sets.newHashSet(Area.NEWBIE_ZONE));
-        }
-
         startUpMessage("Adding beer");
         ItemSpawner itemSpawner = new ItemSpawner(ItemType.BEER, Area.NEWBIE_ZONE, new SpawnRule(20, 20, 2, 25), gameManager);
         entityManager.addEntity(itemSpawner);
 
+        startUpMessage("Adding Tree Berserkers");
+        entityManager.addEntity(new NpcSpawner(new TreeBerserker(gameManager), Area.NEWBIE_ZONE, gameManager, new SpawnRule(10, 6, 2, 100)));
+        entityManager.addEntity(new NpcSpawner(new TreeBerserker(gameManager), Area.NORTH1_ZONE, gameManager, new SpawnRule(10, 14, 2, 100)));
+
+        startUpMessage("Adding Swamp Berserkers");
+        entityManager.addEntity(new NpcSpawner(new SwampBerserker(gameManager), Area.NORTH2_ZONE, gameManager, new SpawnRule(10, 8, 2, 100)));
+
+        startUpMessage("Adding Berg Orcs");
+        entityManager.addEntity(new NpcSpawner(new BergOrc(gameManager), Area.BLOODRIDGE1_ZONE, gameManager, new SpawnRule(10, 8, 2, 100)));
+
         startUpMessage("Configuring Creeper Commmands");
         creeperCommandRegistry = new CreeperCommandRegistry(new UnknownCommand(gameManager));
         creeperCommandRegistry.addCommand(new DropCommand(gameManager));
@@ -105,6 +112,7 @@ public class Main {
         creeperCommandRegistry.addCommand(new SaveWorldCommand(gameManager));
         creeperCommandRegistry.addCommand(new BuildCommand(gameManager));
         creeperCommandRegistry.addCommand(new MapCommand(gameManager));
+        creeperCommandRegistry.addCommand(new AreaCommand(gameManager));
 
 
         CreeperServer creeperServer = new CreeperServer(PORT, db);
diff --git a/src/main/java/com/comandante/creeper/fight/FightRun.java b/src/main/java/com/comandante/creeper/fight/FightRun.java
index b9caaea1..58637188 100644
--- a/src/main/java/com/comandante/creeper/fight/FightRun.java
+++ b/src/main/java/com/comandante/creeper/fight/FightRun.java
@@ -55,8 +55,11 @@ public class FightRun implements Callable<FightResults> {
         }
 
         if (npcStats.getCurrentHealth() <= 0) {
-            gameManager.getChannelUtils().write(player.getPlayerId(), "You killed " + npc.getName(), true);
+            int experience = gameManager.getPlayerManager().getPlayerMetadata(player.getPlayerId()).getStats().getExperience();
+            experience += npc.getStats().getExperience();
+            gameManager.getChannelUtils().write(player.getPlayerId(), "You killed " + npc.getName() + " (" + npc.getStats().getExperience() + "exp)", true);
             gameManager.getChannelUtils().writeToRoom(player.getPlayerId(), npc.getDieMessage());
+            gameManager.getPlayerManager().getPlayerMetadata(player.getPlayerId()).getStats().setExperience(experience);
             gameManager.getEntityManager().deleteNpcEntity(npc.getEntityId());
             fightResults = new FightResultsBuilder().setNpcWon(false).setPlayerWon(true).createFightResults();
         }
diff --git a/src/main/java/com/comandante/creeper/npc/BergOrc.java b/src/main/java/com/comandante/creeper/npc/BergOrc.java
new file mode 100644
index 00000000..a4e2eecc
--- /dev/null
+++ b/src/main/java/com/comandante/creeper/npc/BergOrc.java
@@ -0,0 +1,34 @@
+package com.comandante.creeper.npc;
+
+import com.comandante.creeper.managers.GameManager;
+import com.comandante.creeper.world.Area;
+import com.comandante.creeper.server.Color;
+import com.google.common.base.Optional;
+import com.google.common.collect.Sets;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import static com.comandante.creeper.server.Color.BOLD_ON;
+import static com.comandante.creeper.server.Color.RESET;
+
+public class BergOrc extends Npc {
+    private final static long phraseIntervalMs = 300000;
+    private final static String NAME = "berg orc";
+    private final static Set<String> validTriggers = new HashSet<String>(Arrays.asList(new String[]
+                    {"b", "berg", "orc", "o", NAME}
+    ));
+
+    private final static String colorName = "berg" + BOLD_ON + Color.GREEN + " orc" + Color.RESET;
+    private final static String dieMessage = "a " + colorName + " breathes his last breath in a pool of " + BOLD_ON + Color.RED + "blood" + RESET + ".";
+
+    public BergOrc(GameManager gameManager) {
+        super(gameManager, NAME, colorName, 0, NpcStats.BERG_ORC.createStats(), dieMessage, Optional.of(Sets.newHashSet(Area.BLOODRIDGE1_ZONE)), validTriggers);
+    }
+
+    @Override
+    public BergOrc create(GameManager gameManager) {
+        return new BergOrc(gameManager);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/npc/NpcStats.java b/src/main/java/com/comandante/creeper/npc/NpcStats.java
index ee18b2f2..386e4e3f 100644
--- a/src/main/java/com/comandante/creeper/npc/NpcStats.java
+++ b/src/main/java/com/comandante/creeper/npc/NpcStats.java
@@ -15,7 +15,7 @@ public class NpcStats {
             .setWeaponRatingMin(5)
             .setWeaponRatingMax(10)
             .setNumberweaponOfRolls(1)
-            .setExperience(100);
+            .setExperience(3);
 
     public final static StatsBuilder DRUGGED_PIMP = new StatsBuilder()
             .setStrength(5)
@@ -29,6 +29,49 @@ public class NpcStats {
             .setWeaponRatingMin(5)
             .setWeaponRatingMax(10)
             .setNumberweaponOfRolls(1)
-            .setExperience(100);
+            .setExperience(3);
+
+    public final static StatsBuilder TREE_BERSERKER = new StatsBuilder()
+            .setStrength(8)
+            .setWillpower(1)
+            .setAim(1)
+            .setAgile(1)
+            .setArmorRating(8)
+            .setMeleSkill(6)
+            .setCurrentHealth(200)
+            .setMaxHealth(200)
+            .setWeaponRatingMin(8)
+            .setWeaponRatingMax(13)
+            .setNumberweaponOfRolls(1)
+            .setExperience(150);
+
+
+    public final static StatsBuilder SWAMP_BERSERKER = new StatsBuilder()
+            .setStrength(11)
+            .setWillpower(2)
+            .setAim(2)
+            .setAgile(1)
+            .setArmorRating(8)
+            .setMeleSkill(6)
+            .setCurrentHealth(230)
+            .setMaxHealth(230)
+            .setWeaponRatingMin(10)
+            .setWeaponRatingMax(13)
+            .setNumberweaponOfRolls(1)
+            .setExperience(190);
+
+    public final static StatsBuilder BERG_ORC = new StatsBuilder()
+            .setStrength(11)
+            .setWillpower(2)
+            .setAim(2)
+            .setAgile(1)
+            .setArmorRating(8)
+            .setMeleSkill(6)
+            .setCurrentHealth(230)
+            .setMaxHealth(230)
+            .setWeaponRatingMin(10)
+            .setWeaponRatingMax(13)
+            .setNumberweaponOfRolls(1)
+            .setExperience(190);
 
 }
diff --git a/src/main/java/com/comandante/creeper/npc/SwampBerserker.java b/src/main/java/com/comandante/creeper/npc/SwampBerserker.java
new file mode 100644
index 00000000..0ed76afe
--- /dev/null
+++ b/src/main/java/com/comandante/creeper/npc/SwampBerserker.java
@@ -0,0 +1,34 @@
+package com.comandante.creeper.npc;
+
+import com.comandante.creeper.managers.GameManager;
+import com.comandante.creeper.world.Area;
+import com.comandante.creeper.server.Color;
+import com.google.common.base.Optional;
+import com.google.common.collect.Sets;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import static com.comandante.creeper.server.Color.BOLD_ON;
+import static com.comandante.creeper.server.Color.RESET;
+
+public class SwampBerserker extends Npc {
+    private final static long phraseIntervalMs = 300000;
+    private final static String NAME = "swamp berserker";
+    private final static Set<String> validTriggers = new HashSet<String>(Arrays.asList(new String[]
+                    {"s", "swamp", "berserker","b", NAME}
+    ));
+
+    private final static String colorName = "swamp" + BOLD_ON + Color.MAGENTA + " berserker"  + Color.RESET ;
+    private final static String dieMessage = "a " + colorName + " breathes his last breath in a pool of " + BOLD_ON + Color.RED + "blood" + RESET + ".";
+
+    public SwampBerserker(GameManager gameManager) {
+        super(gameManager, NAME, colorName, 0, NpcStats.SWAMP_BERSERKER.createStats(), dieMessage, Optional.of(Sets.newHashSet(Area.NORTH2_ZONE)), validTriggers);
+    }
+
+    @Override
+    public SwampBerserker create(GameManager gameManager) {
+        return new SwampBerserker(gameManager);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/npc/TreeBerserker.java b/src/main/java/com/comandante/creeper/npc/TreeBerserker.java
new file mode 100644
index 00000000..292f7e18
--- /dev/null
+++ b/src/main/java/com/comandante/creeper/npc/TreeBerserker.java
@@ -0,0 +1,34 @@
+package com.comandante.creeper.npc;
+
+import com.comandante.creeper.managers.GameManager;
+import com.comandante.creeper.world.Area;
+import com.comandante.creeper.server.Color;
+import com.google.common.base.Optional;
+import com.google.common.collect.Sets;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import static com.comandante.creeper.server.Color.BOLD_ON;
+import static com.comandante.creeper.server.Color.RESET;
+
+public class TreeBerserker extends Npc {
+    private final static long phraseIntervalMs = 300000;
+    private final static String NAME = "tree berserker";
+    private final static Set<String> validTriggers = new HashSet<String>(Arrays.asList(new String[]
+                    {"t", "tree", "berserker", "b", NAME}
+    ));
+
+    private final static String colorName = "tree" + BOLD_ON + Color.MAGENTA + " berserker" + Color.RESET;
+    private final static String dieMessage = "a " + colorName + " breathes his last breath in a pool of " + BOLD_ON + Color.RED + "blood" + RESET + ".";
+
+    public TreeBerserker(GameManager gameManager) {
+        super(gameManager, NAME, colorName, 0, NpcStats.TREE_BERSERKER.createStats(), dieMessage, Optional.of(Sets.newHashSet(Area.NEWBIE_ZONE)), validTriggers);
+    }
+
+    @Override
+    public TreeBerserker create(GameManager gameManager) {
+        return new TreeBerserker(gameManager);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/server/command/AreaCommand.java b/src/main/java/com/comandante/creeper/server/command/AreaCommand.java
new file mode 100644
index 00000000..8c651069
--- /dev/null
+++ b/src/main/java/com/comandante/creeper/server/command/AreaCommand.java
@@ -0,0 +1,48 @@
+package com.comandante.creeper.server.command;
+
+import com.comandante.creeper.managers.GameManager;
+import com.comandante.creeper.player.Player;
+import com.comandante.creeper.world.Area;
+import com.google.common.base.Joiner;
+import com.google.common.collect.Sets;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.jboss.netty.channel.MessageEvent;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+
+
+public class AreaCommand extends Command {
+    final static List<String> validTriggers = Arrays.asList("a", "area");
+    final static String description = "Alter area settings for the current room.";
+
+    public AreaCommand(GameManager gameManager) {
+        super(gameManager, validTriggers, description);
+    }
+
+    @Override
+    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
+        configure(e);
+        try {
+            if (originalMessageParts.size() == 1) {
+                Set<Area> areas = currentRoom.getAreas();
+                for (Area area: areas) {
+                    write(area.getName() + "\r\n");
+                }
+                return;
+            }
+            String s = originalMessageParts.get(1);
+            List<String> strings = Arrays.asList(s.split(","));
+            Set<Area> newAreas = Sets.newConcurrentHashSet();
+            for (String string: strings) {
+                String trim = string.trim();
+                newAreas.add(Area.getByName(trim));
+                write("Added: " + trim + "\r\n");
+            }
+            currentRoom.setAreas(newAreas);
+        } finally {
+            super.messageReceived(ctx, e);
+        }
+    }
+}
diff --git a/src/main/java/com/comandante/creeper/server/command/InventoryCommand.java b/src/main/java/com/comandante/creeper/server/command/InventoryCommand.java
index 5402b7c5..075a06d4 100644
--- a/src/main/java/com/comandante/creeper/server/command/InventoryCommand.java
+++ b/src/main/java/com/comandante/creeper/server/command/InventoryCommand.java
@@ -43,9 +43,9 @@ public class InventoryCommand extends Command {
                     int remainingUses = maxUses - item.getNumberOfUses();
                     sb.append(" - ").append(remainingUses);
                     if (remainingUses == 1) {
-                        sb.append(" use left.");
+                        sb.append(" use left.").append("\r\n");
                     } else {
-                        sb.append(" uses left.");
+                        sb.append(" uses left.").append("\r\n");
                     }
                 }
             }
diff --git a/src/main/java/com/comandante/creeper/server/command/LookCommand.java b/src/main/java/com/comandante/creeper/server/command/LookCommand.java
index af16fa5e..02bb041d 100644
--- a/src/main/java/com/comandante/creeper/server/command/LookCommand.java
+++ b/src/main/java/com/comandante/creeper/server/command/LookCommand.java
@@ -35,7 +35,7 @@ public class LookCommand extends Command {
             for (String presentPlayerId : presentPlayerIds) {
                 Player presentPlayer = gameManager.getPlayerManager().getPlayer(presentPlayerId);
                 if (presentPlayer.getPlayerName().equals(target)) {
-                    write(playerManager.getLookString(player));
+                    write(playerManager.getLookString(presentPlayer));
                 }
             }
         } finally {
diff --git a/src/main/java/com/comandante/creeper/server/command/admin/BuildCommand.java b/src/main/java/com/comandante/creeper/server/command/admin/BuildCommand.java
index 05f4e451..cf6a3b58 100644
--- a/src/main/java/com/comandante/creeper/server/command/admin/BuildCommand.java
+++ b/src/main/java/com/comandante/creeper/server/command/admin/BuildCommand.java
@@ -145,7 +145,7 @@ public class BuildCommand extends Command {
         } else if (returnDirection.equals(RemoteExit.Direction.UP)) {
             newFloorModel.setRawMatrixCsv(Integer.toString(newRoomId) + "u|" + currentRoomId);
         } else if (returnDirection.equals(RemoteExit.Direction.ENTER)) {
-            newFloorModel.setRawMatrixCsv(Integer.toString(newRoomId) + "e|" + currentRoomId + "||" + remoteExit.getExitDetail());
+            newFloorModel.setRawMatrixCsv(Integer.toString(newRoomId));
         }
         newFloorModel.setName(UUID.randomUUID().toString());
         return newFloorModel;
diff --git a/src/main/java/com/comandante/creeper/world/Area.java b/src/main/java/com/comandante/creeper/world/Area.java
index 53fcacca..70508259 100644
--- a/src/main/java/com/comandante/creeper/world/Area.java
+++ b/src/main/java/com/comandante/creeper/world/Area.java
@@ -2,6 +2,13 @@ package com.comandante.creeper.world;
 
 public enum Area {
     DEFAULT("default"),
+    HOUSE_ZONE("house_zone"),
+    NORTH1_ZONE("north1_zone"),
+    NORTH2_ZONE("north2_zone"),
+    BLOODRIDGE1_ZONE("bloodridge1_zone"),
+    BLOODRIDGE2_ZONE("bloodridge2_zone"),
+    WESTERN1_ZONE("western1_zone"),
+    WESTERN2_ZONE("western2_zone"),
     NEWBIE_ZONE("newbie_zone");
 
     private final String name;
diff --git a/src/main/java/com/comandante/creeper/world/MapMatrix.java b/src/main/java/com/comandante/creeper/world/MapMatrix.java
index 33909ad5..3ad8f332 100644
--- a/src/main/java/com/comandante/creeper/world/MapMatrix.java
+++ b/src/main/java/com/comandante/creeper/world/MapMatrix.java
@@ -193,9 +193,6 @@ public class MapMatrix {
                                 sb.append("u|").append(exit.getRoomId());
                             } else if (exit.getDirection().equals(RemoteExit.Direction.DOWN)) {
                                 sb.append("d|").append(exit.getRoomId());
-                            }else if (exit.getDirection().equals(RemoteExit.Direction.ENTER)) {
-                                sb.append("e|").append(exit.getRoomId());
-                                sb.append("||").append(exit.getExitDetail());
                             }
                         }
                     }
@@ -254,10 +251,6 @@ public class MapMatrix {
                         Integer down = getDown(string);
                         addRemote(roomId, new RemoteExit(RemoteExit.Direction.DOWN, down, ""), remotes);
                     }
-                    if (string.contains("e|")) {
-                        Integer enter = getEnter(string);
-                        addRemote(roomId, new RemoteExit(RemoteExit.Direction.ENTER, enter, getEnterDescription(string)), remotes);
-                    }
                     data.add(roomId);
                 } else {
                     data.add(0);
diff --git a/src/main/java/com/comandante/creeper/world/Room.java b/src/main/java/com/comandante/creeper/world/Room.java
index a1a84ddc..87ce45cb 100644
--- a/src/main/java/com/comandante/creeper/world/Room.java
+++ b/src/main/java/com/comandante/creeper/world/Room.java
@@ -37,7 +37,7 @@ public abstract class Room extends CreeperEntity {
     private final Set<String> npcIds = Sets.newConcurrentHashSet();
     private final Set<String> itemIds = Sets.newConcurrentHashSet();
     private List<ItemSpawner> itemSpawners = Lists.newArrayList();
-    private Set<Area> areas = Sets.newHashSet(Area.DEFAULT);
+    private Set<Area> areas = Sets.newConcurrentHashSet();
     private Optional<String> mapData = Optional.absent();
     private final Set<String> roomTags;
 
@@ -220,6 +220,8 @@ public abstract class Room extends CreeperEntity {
         itemSpawners.add(itemSpawner);
     }
 
+
+
     @Override
     public void run() {
         Iterator<ItemSpawner> iterator = itemSpawners.iterator();
diff --git a/src/main/java/com/comandante/creeper/world/RoomModel.java b/src/main/java/com/comandante/creeper/world/RoomModel.java
index f92b2b0c..cb518b8a 100644
--- a/src/main/java/com/comandante/creeper/world/RoomModel.java
+++ b/src/main/java/com/comandante/creeper/world/RoomModel.java
@@ -2,6 +2,7 @@ package com.comandante.creeper.world;
 
 import com.google.gson.GsonBuilder;
 
+import java.util.Map;
 import java.util.Set;
 
 public class RoomModel {
@@ -12,14 +13,16 @@ public class RoomModel {
     String roomTitle;
     Set<String> roomTags;
     Set<String> areaNames;
+    Map<String, String> enterExitNames;
 
-    public RoomModel(int roomId, int floorId, String roomDescription, String roomTitle, Set<String> roomTags, Set<String> areaNames) {
+    public RoomModel(int roomId, int floorId, String roomDescription, String roomTitle, Set<String> roomTags, Set<String> areaNames, Map<String, String> enterExitNames) {
         this.roomId = roomId;
         this.floorId = floorId;
         this.roomDescription = roomDescription;
         this.roomTitle = roomTitle;
         this.roomTags = roomTags;
         this.areaNames = areaNames;
+        this.enterExitNames = enterExitNames;
     }
 
     public Set<String> getAreaNames() {
@@ -70,6 +73,14 @@ public class RoomModel {
         this.roomTitle = roomTitle;
     }
 
+    public Map<String, String> getEnterExitNames() {
+        return enterExitNames;
+    }
+
+    public void setEnterExitNames(Map<String, String> enterExitNames) {
+        this.enterExitNames = enterExitNames;
+    }
+
     public static void main(String[] args) {
 
         RoomModel roomModel = new RoomModelBuilder().build();
diff --git a/src/main/java/com/comandante/creeper/world/RoomModelBuilder.java b/src/main/java/com/comandante/creeper/world/RoomModelBuilder.java
index cbb53aa2..d7b3317c 100644
--- a/src/main/java/com/comandante/creeper/world/RoomModelBuilder.java
+++ b/src/main/java/com/comandante/creeper/world/RoomModelBuilder.java
@@ -1,7 +1,9 @@
 package com.comandante.creeper.world;
 
+import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 
+import java.util.Map;
 import java.util.Set;
 
 public class RoomModelBuilder {
@@ -11,6 +13,7 @@ public class RoomModelBuilder {
     private String roomTitle;
     private Set<String> roomTags = Sets.newHashSet();
     private Set<String> areaNames = Sets.newHashSet();
+    private Map<String, String> enterExitNames =Maps.newHashMap();
 
     public RoomModelBuilder setRoomId(int roomId) {
         this.roomId = roomId;
@@ -46,7 +49,12 @@ public class RoomModelBuilder {
         return this;
     }
 
+    public RoomModelBuilder addEnterExitName(Integer roomId, String enterExitName) {
+        enterExitNames.put(String.valueOf(roomId), enterExitName);
+        return this;
+    }
+
     public RoomModel build() {
-        return new RoomModel(roomId, floorId, roomDescription, roomTitle, roomTags, areaNames);
+        return new RoomModel(roomId, floorId, roomDescription, roomTitle, roomTags, areaNames, enterExitNames);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/world/WorldExporter.java b/src/main/java/com/comandante/creeper/world/WorldExporter.java
index 16e18e8e..597b97e3 100644
--- a/src/main/java/com/comandante/creeper/world/WorldExporter.java
+++ b/src/main/java/com/comandante/creeper/world/WorldExporter.java
@@ -4,6 +4,7 @@ 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.Maps;
 import com.google.common.collect.Sets;
 import com.google.common.io.Files;
 import com.google.gson.GsonBuilder;
@@ -12,10 +13,7 @@ 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;
+import java.util.*;
 
 public class WorldExporter {
 
@@ -62,7 +60,6 @@ public class WorldExporter {
             RoomModel next = roomModels.next();
             floorModel.getRoomModels().add(next);
         }
-
         return floorModel;
     }
 
@@ -71,6 +68,9 @@ public class WorldExporter {
             @Override
             public RoomModel apply(Room room) {
                 RoomModelBuilder roomModelBuilder = new RoomModelBuilder();
+                for (RemoteExit remoteExit : room.getEnterExits()) {
+                    roomModelBuilder.addEnterExitName(remoteExit.getRoomId(), remoteExit.getExitDetail());
+                }
                 roomModelBuilder.setRoomDescription(room.getRoomDescription());
                 roomModelBuilder.setRoomTitle(room.getRoomTitle());
                 roomModelBuilder.setRoomId(room.getRoomId());
@@ -100,6 +100,15 @@ public class WorldExporter {
                 for (String areaName : roomModel.getAreaNames()) {
                     basicRoomBuilder.addArea(Area.getByName(areaName));
                 }
+                Map<String, String> enterExitNames = roomModel.getEnterExitNames();
+                if (enterExitNames != null) {
+                    Iterator<Map.Entry<String, String>> iterator = enterExitNames.entrySet().iterator();
+                    while (iterator.hasNext()) {
+                        Map.Entry<String, String> next = iterator.next();
+                        RemoteExit remoteExit = new RemoteExit(RemoteExit.Direction.ENTER, Integer.parseInt(next.getKey()), next.getValue());
+                        basicRoomBuilder.addEnterExit(remoteExit);
+                    }
+                }
                 configureExits(basicRoomBuilder, mapMatrix, roomModel.getRoomId());
                 return basicRoomBuilder.createBasicRoom();
             }
@@ -129,8 +138,6 @@ public class WorldExporter {
                     basicRoomBuilder.setUpId(Optional.of(exit.getRoomId()));
                 } else if (exit.getDirection().equals(RemoteExit.Direction.DOWN)) {
                     basicRoomBuilder.setDownId(Optional.of(exit.getRoomId()));
-                } else if (exit.getDirection().equals(RemoteExit.Direction.ENTER)) {
-                    basicRoomBuilder.addEnterExit(exit);
                 }
             }
         }
diff --git a/world/world.json b/world/world.json
index 038500ad..4bb9c7b4 100644
--- a/world/world.json
+++ b/world/world.json
@@ -1,26 +1,9 @@
 {
   "floorModelList": [
-    {
-      "name": "65aac77e-98aa-46cf-aa1c-a0083c82e44c",
-      "id": 1,
-      "rawMatrixCsv": "2d|1,\n",
-      "roomModels": [
-        {
-          "roomId": 2,
-          "floorId": 1,
-          "roomDescription": "Newly created room. Set a new description with the desc command.",
-          "roomTitle": "Default Title, change with title command",
-          "roomTags": [],
-          "areaNames": [
-            "default"
-          ]
-        }
-      ]
-    },
     {
       "name": "main",
       "id": 0,
-      "rawMatrixCsv": ",1d|3u|2,\n",
+      "rawMatrixCsv": ",1,,\n",
       "roomModels": [
         {
           "roomId": 1,
@@ -29,25 +12,11 @@
           "roomTitle": "This is a blank title.",
           "roomTags": [],
           "areaNames": [
-            "newbie_zone"
-          ]
-        }
-      ]
-    },
-    {
-      "name": "a96d76e4-89e6-4348-af82-f44990c33b82",
-      "id": 2,
-      "rawMatrixCsv": "3u|1,\n",
-      "roomModels": [
-        {
-          "roomId": 3,
-          "floorId": 2,
-          "roomDescription": "Newly created room. Set a new description with the desc command.",
-          "roomTitle": "Default Title, change with title command",
-          "roomTags": [],
-          "areaNames": [
-            "default"
-          ]
+            "north2_zone",
+            "house_zone",
+            "north1_zone"
+          ],
+          "enterExitNames": {}
         }
       ]
     }
-- 
GitLab