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.
This commit is contained in:
@@ -33,4 +33,19 @@ public class DoorwayData
|
|||||||
{
|
{
|
||||||
return axis;
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,24 +38,82 @@ public class MazeBuilder
|
|||||||
|
|
||||||
private static void carveDoorways(DirectedGraph<PartitionNode, DoorwayData> roomGraph, World world, Point3D offset, Random random)
|
private static void carveDoorways(DirectedGraph<PartitionNode, DoorwayData> 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<PartitionNode, DoorwayData> node : roomGraph.nodes())
|
for (IGraphNode<PartitionNode, DoorwayData> node : roomGraph.nodes())
|
||||||
{
|
{
|
||||||
for (IEdge<PartitionNode, DoorwayData> doorway : node.outbound())
|
for (IEdge<PartitionNode, DoorwayData> passage : node.outbound())
|
||||||
{
|
{
|
||||||
char axis = doorway.data().axis();
|
doorway = passage.data();
|
||||||
Point3D lower = doorway.data().minCorner();
|
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());
|
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 (axis == DoorwayData.X_AXIS)
|
else if (doorway.length() > 3)
|
||||||
{
|
{
|
||||||
carveDoorAlongX(world, offset.getX() + lower.getX(), offset.getY() + lower.getY() + 1, offset.getZ() + lower.getZ() + 1);
|
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
|
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);
|
carveHole(world, offset.getX() + lower.getX() + 1, offset.getY() + lower.getY(), offset.getZ() + lower.getZ() + 1);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user