Convert generated levels to walls

Add support for converting generated levels to walls, and merge one into
the entity map at the beginning of the game.

There's nothing here that guarantees the character ends up *inside* the
level though (they almost always don't) so that'll have to be slotted
into the level generation process.
This commit is contained in:
Griffin Smith 2019-09-09 20:54:33 -04:00
parent e01cf9b056
commit 9ebdc6fbb4
20 changed files with 355 additions and 114 deletions

View file

@ -1,25 +1,30 @@
module Xanthous.App (makeApp) where
--------------------------------------------------------------------------------
import Xanthous.Prelude
import Brick hiding (App, halt, continue, raw)
import qualified Brick
import Graphics.Vty.Attributes (defAttr)
import Graphics.Vty.Input.Events (Event(EvKey))
import Control.Monad.State (get)
import Control.Monad.Random (getRandom)
--------------------------------------------------------------------------------
import Xanthous.Command
import Xanthous.Data (move, Position(..))
import Xanthous.Data (move, Position(..), Dimensions'(Dimensions), Dimensions)
import qualified Xanthous.Data.EntityMap as EntityMap
import Xanthous.Data.EntityMap (EntityMap)
import Xanthous.Game
import Xanthous.Game.Draw (drawGame)
import Xanthous.Monad
import Xanthous.Resource (Name)
--------------------------------------------------------------------------------
import Xanthous.Entities.Creature (Creature)
import qualified Xanthous.Entities.Creature as Creature
import Xanthous.Entities.RawTypes (EntityRaw(..))
import Xanthous.Entities.Raws (raw)
import Xanthous.Entities.SomeEntity
import Xanthous.Entities
import Xanthous.Generators
import qualified Xanthous.Generators.CaveAutomata as CaveAutomata
--------------------------------------------------------------------------------
type App = Brick.App GameState () Name
type AppM a = AppT (EventM Name) a
@ -43,7 +48,10 @@ testGormlak =
startEvent :: AppM ()
startEvent = do
() <- say ["welcome"]
say_ ["welcome"]
level <- generateLevel SCaveAutomata CaveAutomata.defaultParams
$ Dimensions 120 80
entities <>= level
entities %= EntityMap.insertAt (Position 10 10) (SomeEntity testGormlak)
handleEvent :: BrickEvent Name () -> AppM (Next GameState)
@ -62,3 +70,12 @@ handleCommand (Move dir) = do
handleCommand PreviousMessage = do
messageHistory %= popMessage
continue
--------------------------------------------------------------------------------
generateLevel :: SGenerator gen -> Params gen -> Dimensions -> AppM (EntityMap SomeEntity)
generateLevel g ps dims = do
gen <- use randomGen
let cells = generate g ps dims gen
_ <- getRandom @_ @Int -- perturb the generator, so we don't get the same level twice
pure $ SomeEntity <$> cellsToWalls cells