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:
SenseiKiwi 2013-12-30 02:44:18 -04:00
parent 7afcfedbde
commit 3574b0468b
2 changed files with 86 additions and 13 deletions

View file

@ -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);
}
}

View file

@ -38,24 +38,82 @@ public class MazeBuilder
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 (IEdge<PartitionNode, DoorwayData> doorway : node.outbound())
for (IEdge<PartitionNode, DoorwayData> 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;
}
}
}