Add support for multiple levels

Add a data structure, based on the zipper comonad, which provides
support for multiple levels, each of which is its own entity map. The
current level is provided by coreturn, which the `entities` lens has
been updated to use. Nothing currently supports going up or down levels
yet - that's coming next.
This commit is contained in:
Griffin Smith 2020-01-04 23:48:51 -05:00
parent e669b54f0c
commit 6b0bab0e85
11 changed files with 397 additions and 14 deletions

View file

@ -25,6 +25,7 @@ import Control.Monad.Random (getRandom)
--------------------------------------------------------------------------------
import Xanthous.Game.State
import Xanthous.Data
import Xanthous.Data.Levels
import qualified Xanthous.Data.EntityMap as EntityMap
import Xanthous.Data.EntityMap.Graphics (visiblePositions)
import Xanthous.Entities.Character (Character, mkCharacter)
@ -38,11 +39,12 @@ initialStateFromSeed :: Int -> GameState
initialStateFromSeed seed =
let _randomGen = mkStdGen seed
chr = mkCharacter
(_characterEntityID, _entities)
(_characterEntityID, level)
= EntityMap.insertAtReturningID
(Position 0 0)
(SomeEntity chr)
mempty
_levels = oneLevel level
_messageHistory = mempty
_revealedPositions = mempty
_promptState = NoPrompt
@ -108,4 +110,4 @@ entitiesCollision
entitiesCollision = join . maximumMay . fmap entityCollision
collisionAt :: MonadState GameState m => Position -> m (Maybe Collision)
collisionAt pos = uses (entities . EntityMap.atPosition pos) entitiesCollision
collisionAt p = uses (entities . EntityMap.atPosition p) entitiesCollision