I derped. Oh well. #122

Merged
StevenRS11 merged 18 commits from mazes into master 2014-01-04 07:15:16 +00:00
2 changed files with 86 additions and 13 deletions
Showing only changes of commit 3574b0468b - Show all commits

View File

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

View File

@@ -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)
else if (axis == DoorwayData.X_AXIS) {
{ gap = (doorway.length() - 2) / 3;
carveDoorAlongX(world, offset.getX() + lower.getX(), offset.getY() + lower.getY() + 1, offset.getZ() + lower.getZ() + 1); 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 }
{ else if (doorway.length() > 3)
carveHole(world, offset.getX() + lower.getX() + 1, offset.getY() + lower.getY(), 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
{
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;
} }
} }
} }