From c06edf3cc698f36e995719dc6e192c5663110f6d Mon Sep 17 00:00:00 2001 From: Griffin Smith Date: Fri, 13 Sep 2019 15:24:05 -0400 Subject: Place the chacracter in the level at startup time Randomly select a position in the largest contiguous region of the generated level in which to place the character at startup time. --- src/Xanthous/App.hs | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) (limited to 'src/Xanthous/App.hs') diff --git a/src/Xanthous/App.hs b/src/Xanthous/App.hs index af6b5caf61..0dc24b9d41 100644 --- a/src/Xanthous/App.hs +++ b/src/Xanthous/App.hs @@ -9,7 +9,13 @@ import Control.Monad.State (get) import Control.Monad.Random (getRandom) -------------------------------------------------------------------------------- import Xanthous.Command -import Xanthous.Data (move, Position(..), Dimensions'(Dimensions), Dimensions) +import Xanthous.Data + ( move + , Position(..) + , Dimensions'(Dimensions) + , Dimensions + , positionFromPair + ) import qualified Xanthous.Data.EntityMap as EntityMap import Xanthous.Data.EntityMap (EntityMap) import Xanthous.Game @@ -24,6 +30,7 @@ import Xanthous.Entities.Raws (raw) import Xanthous.Entities import Xanthous.Generators import qualified Xanthous.Generators.CaveAutomata as CaveAutomata +import Xanthous.Generators.LevelContents -------------------------------------------------------------------------------- type App = Brick.App GameState () Name @@ -49,10 +56,13 @@ testGormlak = startEvent :: AppM () startEvent = do say_ ["welcome"] - level <- generateLevel SCaveAutomata CaveAutomata.defaultParams - $ Dimensions 120 80 + (level, charPos) <- + generateLevel SCaveAutomata CaveAutomata.defaultParams + $ Dimensions 80 80 entities <>= level - entities %= EntityMap.insertAt (Position 10 10) (SomeEntity testGormlak) + characterPosition .= charPos + -- entities %= EntityMap.insertAt (Position 10 10) (SomeEntity testGormlak) + handleEvent :: BrickEvent Name () -> AppM (Next GameState) handleEvent (VtyEvent (EvKey k mods)) @@ -73,9 +83,15 @@ handleCommand PreviousMessage = do -------------------------------------------------------------------------------- -generateLevel :: SGenerator gen -> Params gen -> Dimensions -> AppM (EntityMap SomeEntity) +generateLevel + :: SGenerator gen + -> Params gen + -> Dimensions + -> AppM (EntityMap SomeEntity, Position) 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 + charPos <- positionFromPair <$> chooseCharacterPosition cells + let level = SomeEntity <$> cellsToWalls cells + pure (level, charPos) -- cgit 1.4.1