Safe Haskell | None |
---|---|
Language | Haskell2010 |
Operations on the Area
type that involve random numbers.
Synopsis
- xyInArea :: Area -> Rnd Point
- mkVoidRoom :: Area -> Rnd Area
- mkRoom :: (X, Y) -> (X, Y) -> Area -> Rnd Area
- connectGrid :: EnumSet Point -> (X, Y) -> Rnd [(Point, Point)]
- randomConnection :: (X, Y) -> Rnd (Point, Point)
- data HV
- type Corridor = [Point]
- connectPlaces :: (Area, Fence, Area) -> (Area, Fence, Area) -> Rnd (Maybe Corridor)
- connectGrid' :: EnumSet Point -> (X, Y) -> EnumSet Point -> EnumSet Point -> [(Point, Point)] -> Rnd [(Point, Point)]
- sortPoint :: (Point, Point) -> (Point, Point)
- mkCorridor :: HV -> Point -> Bool -> Point -> Bool -> Area -> Rnd Corridor
- borderPlace :: Area -> Fence -> (Area, Area)
Picking points inside areas
mkVoidRoom :: Area -> Rnd Area Source #
Create a void room, i.e., a single point area within the designated area.
:: (X, Y) | minimum size |
-> (X, Y) | maximum size |
-> Area | the containing area, not the room itself |
-> Rnd Area |
Create a random room according to given parameters.
Choosing connections
connectGrid :: EnumSet Point -> (X, Y) -> Rnd [(Point, Point)] Source #
Pick a subset of connections between adjacent areas within a grid until there is only one connected component in the graph of all areas.
randomConnection :: (X, Y) -> Rnd (Point, Point) Source #
Pick a single random connection between adjacent areas within a grid.
Plotting corridors
The choice of horizontal and vertical orientation.
connectPlaces :: (Area, Fence, Area) -> (Area, Fence, Area) -> Rnd (Maybe Corridor) Source #
Try to connect two interiors of places with a corridor.
Choose entrances some steps away from the edges, if the place
is big enough. Note that with pfence == FNone
, the inner area considered
is the strict interior of the place, without the outermost tiles.
The corridor connects (touches) the inner areas and the turning point of the corridor (if any) is outside of the outer areas and inside the grid areas.
Internal operations
connectGrid' :: EnumSet Point -> (X, Y) -> EnumSet Point -> EnumSet Point -> [(Point, Point)] -> Rnd [(Point, Point)] Source #
sortPoint :: (Point, Point) -> (Point, Point) Source #
Sort the sequence of two points, in the derived lexicographic order.
:: HV | orientation of the starting section |
-> Point | starting point |
-> Bool | starting is inside |
-> Point | ending point |
-> Bool | ending is inside |
-> Area | the area containing the intermediate point |
-> Rnd Corridor | straight sections of the corridor |
Create a corridor, either horizontal or vertical, with a possible intermediate part that is in the opposite direction. There might not always exist a good intermediate point if the places are allowed to be close together and then we let the intermediate part degenerate.