Fill the outer edges of generated levels
To avoid the character being able to go OOB. This is something we had in the Rust version but I hadn't ported over yet
This commit is contained in:
parent
33c831d23d
commit
6678ac986c
2 changed files with 13 additions and 1 deletions
|
@ -98,6 +98,7 @@ generate' params dims = do
|
||||||
let steps' = params ^. steps
|
let steps' = params ^. steps
|
||||||
when (steps' > 0)
|
when (steps' > 0)
|
||||||
$ for_ [0 .. pred steps'] . const $ stepAutomata cells dims params
|
$ for_ [0 .. pred steps'] . const $ stepAutomata cells dims params
|
||||||
|
lift $ fillOuterEdgesM cells
|
||||||
pure cells
|
pure cells
|
||||||
|
|
||||||
stepAutomata :: forall s g. MCells s -> Dimensions -> Params -> CellM g s ()
|
stepAutomata :: forall s g. MCells s -> Dimensions -> Params -> CellM g s ()
|
||||||
|
|
|
@ -7,6 +7,7 @@ module Xanthous.Generators.Util
|
||||||
, randInitialize
|
, randInitialize
|
||||||
, numAliveNeighborsM
|
, numAliveNeighborsM
|
||||||
, numAliveNeighbors
|
, numAliveNeighbors
|
||||||
|
, fillOuterEdgesM
|
||||||
, cloneMArray
|
, cloneMArray
|
||||||
, floodFill
|
, floodFill
|
||||||
, regions
|
, regions
|
||||||
|
@ -20,7 +21,7 @@ import Control.Monad.Random
|
||||||
import Data.Monoid
|
import Data.Monoid
|
||||||
import Data.Foldable (Foldable, toList)
|
import Data.Foldable (Foldable, toList)
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
import Xanthous.Util (foldlMapM', between)
|
import Xanthous.Util (foldlMapM')
|
||||||
import Xanthous.Data (Dimensions, width, height)
|
import Xanthous.Data (Dimensions, width, height)
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -93,6 +94,16 @@ numAliveNeighbors cells (x, y) =
|
||||||
neighborPositions :: [(Int, Int)]
|
neighborPositions :: [(Int, Int)]
|
||||||
neighborPositions = [(i, j) | i <- [-1..1], j <- [-1..1], (i, j) /= (0, 0)]
|
neighborPositions = [(i, j) | i <- [-1..1], j <- [-1..1], (i, j) /= (0, 0)]
|
||||||
|
|
||||||
|
fillOuterEdgesM :: (MArray a Bool m, Ix i, Ix j) => a (i, j) Bool -> m ()
|
||||||
|
fillOuterEdgesM arr = do
|
||||||
|
((minX, minY), (maxX, maxY)) <- getBounds arr
|
||||||
|
for_ (range (minX, maxX)) $ \x -> do
|
||||||
|
writeArray arr (x, minY) True
|
||||||
|
writeArray arr (x, maxY) True
|
||||||
|
for_ (range (minY, maxY)) $ \y -> do
|
||||||
|
writeArray arr (minX, y) True
|
||||||
|
writeArray arr (maxX, y) True
|
||||||
|
|
||||||
safeGet :: (IArray a e, Ix i) => a i e -> i -> Maybe e
|
safeGet :: (IArray a e, Ix i) => a i e -> i -> Maybe e
|
||||||
safeGet arr idx =
|
safeGet arr idx =
|
||||||
let (minIdx, maxIdx) = bounds arr
|
let (minIdx, maxIdx) = bounds arr
|
||||||
|
|
Loading…
Reference in a new issue