From 3574b0468bd3ac4d63653b62c622e81b5639eba5 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Mon, 30 Dec 2013 02:44:18 -0400 Subject: [PATCH] Improved Doorway Placement Doorways are now placed in different ways, depending on the dimensions of the walls that they're on. This includes that large walls get two doorways connecting to the same room. --- .../experimental/DoorwayData.java | 15 ++++ .../experimental/MazeBuilder.java | 84 ++++++++++++++++--- 2 files changed, 86 insertions(+), 13 deletions(-) diff --git a/src/main/java/StevenDimDoors/experimental/DoorwayData.java b/src/main/java/StevenDimDoors/experimental/DoorwayData.java index ec1c5cc..5d596c2 100644 --- a/src/main/java/StevenDimDoors/experimental/DoorwayData.java +++ b/src/main/java/StevenDimDoors/experimental/DoorwayData.java @@ -33,4 +33,19 @@ public class DoorwayData { return axis; } + + public int width() + { + return (maxCorner.getX() - minCorner.getX() + 1); + } + + public int height() + { + return (maxCorner.getY() - minCorner.getY() + 1); + } + + public int length() + { + return (maxCorner.getZ() - minCorner.getZ() + 1); + } } diff --git a/src/main/java/StevenDimDoors/experimental/MazeBuilder.java b/src/main/java/StevenDimDoors/experimental/MazeBuilder.java index 5a14f6d..e4ea77a 100644 --- a/src/main/java/StevenDimDoors/experimental/MazeBuilder.java +++ b/src/main/java/StevenDimDoors/experimental/MazeBuilder.java @@ -38,24 +38,82 @@ public class MazeBuilder private static void carveDoorways(DirectedGraph roomGraph, World world, Point3D offset, Random random) { + final int MIN_DOUBLE_DOOR_SPAN = 10; + + int gap; + char axis; + Point3D lower; + Point3D upper; + DoorwayData doorway; + for (IGraphNode node : roomGraph.nodes()) { - for (IEdge doorway : node.outbound()) + for (IEdge passage : node.outbound()) { - char axis = doorway.data().axis(); - Point3D lower = doorway.data().minCorner(); + doorway = passage.data(); + axis = doorway.axis(); + lower = doorway.minCorner(); + upper = doorway.maxCorner(); - if (axis == DoorwayData.Z_AXIS) + switch (axis) { - carveDoorAlongZ(world, offset.getX() + lower.getX() + 1, offset.getY() + lower.getY() + 1, offset.getZ() + lower.getZ()); - } - else if (axis == DoorwayData.X_AXIS) - { - carveDoorAlongX(world, offset.getX() + lower.getX(), offset.getY() + lower.getY() + 1, offset.getZ() + lower.getZ() + 1); - } - else - { - carveHole(world, offset.getX() + lower.getX() + 1, offset.getY() + lower.getY(), offset.getZ() + lower.getZ() + 1); + case DoorwayData.X_AXIS: + if (doorway.length() >= MIN_DOUBLE_DOOR_SPAN) + { + gap = (doorway.length() - 2) / 3; + carveDoorAlongX(world, offset.getX() + lower.getX(), offset.getY() + lower.getY() + 1, offset.getZ() + lower.getZ() + gap); + carveDoorAlongX(world, offset.getX() + lower.getX(), offset.getY() + lower.getY() + 1, offset.getZ() + upper.getZ() - gap); + } + else if (doorway.length() > 3) + { + switch (random.nextInt(3)) + { + case 0: + carveDoorAlongX(world, offset.getX() + lower.getX(), offset.getY() + lower.getY() + 1, offset.getZ() + (lower.getZ() + upper.getZ()) / 2); + break; + case 1: + carveDoorAlongX(world, offset.getX() + lower.getX(), offset.getY() + lower.getY() + 1, offset.getZ() + lower.getZ() + 2); + break; + case 2: + carveDoorAlongX(world, offset.getX() + lower.getX(), offset.getY() + lower.getY() + 1, offset.getZ() + upper.getZ() - 2); + break; + } + } + else + { + carveDoorAlongX(world, offset.getX() + lower.getX(), offset.getY() + lower.getY() + 1, offset.getZ() + lower.getZ() + 1); + } + break; + case DoorwayData.Z_AXIS: + if (doorway.width() >= MIN_DOUBLE_DOOR_SPAN) + { + gap = (doorway.width() - 2) / 3; + carveDoorAlongZ(world, offset.getX() + lower.getX() + gap, offset.getY() + lower.getY() + 1, offset.getZ() + lower.getZ()); + carveDoorAlongZ(world, offset.getX() + upper.getX() - gap, offset.getY() + lower.getY() + 1, offset.getZ() + lower.getZ()); + } + else if (doorway.length() > 3) + { + switch (random.nextInt(3)) + { + case 0: + carveDoorAlongZ(world, offset.getX() + (lower.getX() + upper.getX()) / 2, offset.getY() + lower.getY() + 1, offset.getZ() + lower.getZ()); + break; + case 1: + carveDoorAlongZ(world, offset.getX() + lower.getX() + 2, offset.getY() + lower.getY() + 1, offset.getZ() + lower.getZ()); + break; + case 2: + carveDoorAlongZ(world, offset.getX() + upper.getX() - 2, offset.getY() + lower.getY() + 1, offset.getZ() + lower.getZ()); + break; + } + } + else + { + carveDoorAlongZ(world, offset.getX() + lower.getX() + 1, offset.getY() + lower.getY() + 1, offset.getZ() + lower.getZ()); + } + break; + case DoorwayData.Y_AXIS: + carveHole(world, offset.getX() + lower.getX() + 1, offset.getY() + lower.getY(), offset.getZ() + lower.getZ() + 1); + break; } } }