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 | ||||
|   when (steps' > 0) | ||||
|    $ for_ [0 .. pred steps'] . const $ stepAutomata cells dims params | ||||
|   lift $ fillOuterEdgesM cells | ||||
|   pure cells | ||||
| 
 | ||||
| stepAutomata :: forall s g. MCells s -> Dimensions -> Params -> CellM g s () | ||||
|  |  | |||
|  | @ -7,6 +7,7 @@ module Xanthous.Generators.Util | |||
|   , randInitialize | ||||
|   , numAliveNeighborsM | ||||
|   , numAliveNeighbors | ||||
|   , fillOuterEdgesM | ||||
|   , cloneMArray | ||||
|   , floodFill | ||||
|   , regions | ||||
|  | @ -20,7 +21,7 @@ import Control.Monad.Random | |||
| import Data.Monoid | ||||
| import Data.Foldable (Foldable, toList) | ||||
| -------------------------------------------------------------------------------- | ||||
| import Xanthous.Util (foldlMapM', between) | ||||
| import Xanthous.Util (foldlMapM') | ||||
| import Xanthous.Data (Dimensions, width, height) | ||||
| -------------------------------------------------------------------------------- | ||||
| 
 | ||||
|  | @ -93,6 +94,16 @@ numAliveNeighbors cells (x, y) = | |||
|     neighborPositions :: [(Int, Int)] | ||||
|     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 arr idx = | ||||
|   let (minIdx, maxIdx) = bounds arr | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue