Add doors and an open command
Add a Door entity and an Open command, which necessitated supporting the direction prompt. Currently nothing actually puts doors on the map, which puts a slight damper on actually testing this out.
This commit is contained in:
parent
7770ed0548
commit
4db3a68efe
13 changed files with 151 additions and 29 deletions
|
@ -1,3 +1,4 @@
|
||||||
|
{-# LANGUAGE MultiWayIf #-}
|
||||||
{-# LANGUAGE ViewPatterns #-}
|
{-# LANGUAGE ViewPatterns #-}
|
||||||
module Xanthous.App (makeApp) where
|
module Xanthous.App (makeApp) where
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
@ -18,7 +19,9 @@ import Xanthous.Data
|
||||||
( move
|
( move
|
||||||
, Dimensions'(Dimensions)
|
, Dimensions'(Dimensions)
|
||||||
, positioned
|
, positioned
|
||||||
|
, Position
|
||||||
)
|
)
|
||||||
|
import Xanthous.Data.EntityMap (EntityMap)
|
||||||
import qualified Xanthous.Data.EntityMap as EntityMap
|
import qualified Xanthous.Data.EntityMap as EntityMap
|
||||||
import Xanthous.Game
|
import Xanthous.Game
|
||||||
import Xanthous.Game.Draw (drawGame)
|
import Xanthous.Game.Draw (drawGame)
|
||||||
|
@ -31,6 +34,7 @@ import qualified Xanthous.Entities.Character as Character
|
||||||
import Xanthous.Entities.Character (characterName)
|
import Xanthous.Entities.Character (characterName)
|
||||||
import Xanthous.Entities
|
import Xanthous.Entities
|
||||||
import Xanthous.Entities.Item (Item)
|
import Xanthous.Entities.Item (Item)
|
||||||
|
import Xanthous.Entities.Environment (Door, open, locked)
|
||||||
import Xanthous.Generators
|
import Xanthous.Generators
|
||||||
import qualified Xanthous.Generators.CaveAutomata as CaveAutomata
|
import qualified Xanthous.Generators.CaveAutomata as CaveAutomata
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
@ -96,11 +100,7 @@ handleCommand (Move dir) = do
|
||||||
|
|
||||||
handleCommand PickUp = do
|
handleCommand PickUp = do
|
||||||
pos <- use characterPosition
|
pos <- use characterPosition
|
||||||
ents <- uses entities $ EntityMap.atPositionWithIDs pos
|
items <- uses entities $ entitiesAtPositionWithType @Item pos
|
||||||
let items = flip foldMap ents $ \(eid, view positioned -> se) ->
|
|
||||||
case downcastEntity @Item se of
|
|
||||||
Just item -> [(eid, item)]
|
|
||||||
Nothing -> []
|
|
||||||
case items of
|
case items of
|
||||||
[] -> say_ ["items", "nothingToPickUp"]
|
[] -> say_ ["items", "nothingToPickUp"]
|
||||||
[(itemID, item)] -> do
|
[(itemID, item)] -> do
|
||||||
|
@ -114,11 +114,26 @@ handleCommand PreviousMessage = do
|
||||||
messageHistory %= popMessage
|
messageHistory %= popMessage
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
handleCommand Open = do
|
||||||
|
prompt_ @'DirectionPrompt ["open", "prompt"] Cancellable
|
||||||
|
$ \(DirectionResult dir) -> do
|
||||||
|
pos <- move dir <$> use characterPosition
|
||||||
|
doors <- uses entities $ entitiesAtPositionWithType @Door pos
|
||||||
|
if | null doors -> say_ ["open", "nothingToOpen"]
|
||||||
|
| any (view $ _2 . locked) doors -> say_ ["open", "locked"]
|
||||||
|
| otherwise -> do
|
||||||
|
for_ doors $ \(eid, _) ->
|
||||||
|
entities . ix eid . positioned . _SomeEntity . open .= True
|
||||||
|
say_ ["open", "success"]
|
||||||
|
pure ()
|
||||||
|
continue
|
||||||
|
|
||||||
handlePromptEvent
|
handlePromptEvent
|
||||||
:: Text -- ^ Prompt message
|
:: Text -- ^ Prompt message
|
||||||
-> Prompt (AppT Identity)
|
-> Prompt (AppT Identity)
|
||||||
-> BrickEvent Name ()
|
-> BrickEvent Name ()
|
||||||
-> AppM (Next GameState)
|
-> AppM (Next GameState)
|
||||||
|
|
||||||
handlePromptEvent _ (Prompt Cancellable _ _ _) (VtyEvent (EvKey KEsc [])) = do
|
handlePromptEvent _ (Prompt Cancellable _ _ _) (VtyEvent (EvKey KEsc [])) = do
|
||||||
promptState .= NoPrompt
|
promptState .= NoPrompt
|
||||||
continue
|
continue
|
||||||
|
@ -126,6 +141,7 @@ handlePromptEvent _ pr (VtyEvent (EvKey KEnter [])) = do
|
||||||
() <- state . coerce $ submitPrompt pr
|
() <- state . coerce $ submitPrompt pr
|
||||||
promptState .= NoPrompt
|
promptState .= NoPrompt
|
||||||
continue
|
continue
|
||||||
|
|
||||||
handlePromptEvent
|
handlePromptEvent
|
||||||
msg
|
msg
|
||||||
(Prompt c SStringPrompt (StringPromptState edit) cb)
|
(Prompt c SStringPrompt (StringPromptState edit) cb)
|
||||||
|
@ -135,6 +151,15 @@ handlePromptEvent
|
||||||
let prompt' = Prompt c SStringPrompt (StringPromptState edit') cb
|
let prompt' = Prompt c SStringPrompt (StringPromptState edit') cb
|
||||||
promptState .= WaitingPrompt msg prompt'
|
promptState .= WaitingPrompt msg prompt'
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
handlePromptEvent _ (Prompt _ SDirectionPrompt _ cb)
|
||||||
|
(VtyEvent (EvKey (KChar (directionFromChar -> Just dir)) []))
|
||||||
|
= do
|
||||||
|
() <- state . coerce . cb $ DirectionResult dir
|
||||||
|
promptState .= NoPrompt
|
||||||
|
continue
|
||||||
|
handlePromptEvent _ (Prompt _ SDirectionPrompt _ _) _ = continue
|
||||||
|
|
||||||
handlePromptEvent _ _ _ = undefined
|
handlePromptEvent _ _ _ = undefined
|
||||||
|
|
||||||
prompt
|
prompt
|
||||||
|
@ -159,3 +184,17 @@ prompt_
|
||||||
-> (PromptResult pt -> AppT Identity ()) -- ^ Prompt promise handler
|
-> (PromptResult pt -> AppT Identity ()) -- ^ Prompt promise handler
|
||||||
-> AppM ()
|
-> AppM ()
|
||||||
prompt_ msg = prompt msg $ object []
|
prompt_ msg = prompt msg $ object []
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
entitiesAtPositionWithType
|
||||||
|
:: forall a. (Entity a, Typeable a)
|
||||||
|
=> Position
|
||||||
|
-> EntityMap SomeEntity
|
||||||
|
-> [(EntityMap.EntityID, a)]
|
||||||
|
entitiesAtPositionWithType pos em =
|
||||||
|
let someEnts = EntityMap.atPositionWithIDs pos em
|
||||||
|
in flip foldMap someEnts $ \(eid, view positioned -> se) ->
|
||||||
|
case downcastEntity @a se of
|
||||||
|
Just e -> [(eid, e)]
|
||||||
|
Nothing -> []
|
||||||
|
|
|
@ -1,30 +1,39 @@
|
||||||
|
{-# LANGUAGE ViewPatterns #-}
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
module Xanthous.Command where
|
module Xanthous.Command where
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
import Graphics.Vty.Input (Key(..), Modifier(..))
|
|
||||||
|
|
||||||
import Xanthous.Prelude hiding (Left, Right, Down)
|
import Xanthous.Prelude hiding (Left, Right, Down)
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
import Graphics.Vty.Input (Key(..), Modifier(..))
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
import Xanthous.Data (Direction(..))
|
import Xanthous.Data (Direction(..))
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
data Command
|
data Command
|
||||||
= Quit
|
= Quit
|
||||||
| Move Direction
|
| Move Direction
|
||||||
| PreviousMessage
|
| PreviousMessage
|
||||||
| PickUp
|
| PickUp
|
||||||
|
| Open
|
||||||
|
|
||||||
commandFromKey :: Key -> [Modifier] -> Maybe Command
|
commandFromKey :: Key -> [Modifier] -> Maybe Command
|
||||||
commandFromKey (KChar 'q') [] = Just Quit
|
commandFromKey (KChar 'q') [] = Just Quit
|
||||||
|
commandFromKey (KChar (directionFromChar -> Just dir)) [] = Just $ Move dir
|
||||||
commandFromKey (KChar 'h') [] = Just $ Move Left
|
|
||||||
commandFromKey (KChar 'j') [] = Just $ Move Down
|
|
||||||
commandFromKey (KChar 'k') [] = Just $ Move Up
|
|
||||||
commandFromKey (KChar 'l') [] = Just $ Move Right
|
|
||||||
commandFromKey (KChar 'y') [] = Just $ Move UpLeft
|
|
||||||
commandFromKey (KChar 'u') [] = Just $ Move UpRight
|
|
||||||
commandFromKey (KChar 'b') [] = Just $ Move DownLeft
|
|
||||||
commandFromKey (KChar 'n') [] = Just $ Move DownRight
|
|
||||||
|
|
||||||
commandFromKey (KChar 'p') [MCtrl] = Just PreviousMessage
|
commandFromKey (KChar 'p') [MCtrl] = Just PreviousMessage
|
||||||
|
|
||||||
commandFromKey (KChar ',') [] = Just PickUp
|
commandFromKey (KChar ',') [] = Just PickUp
|
||||||
|
commandFromKey (KChar 'o') [] = Just Open
|
||||||
commandFromKey _ _ = Nothing
|
commandFromKey _ _ = Nothing
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
directionFromChar :: Char -> Maybe Direction
|
||||||
|
directionFromChar 'h' = Just Left
|
||||||
|
directionFromChar 'j' = Just Down
|
||||||
|
directionFromChar 'k' = Just Up
|
||||||
|
directionFromChar 'l' = Just Right
|
||||||
|
directionFromChar 'y' = Just UpLeft
|
||||||
|
directionFromChar 'u' = Just UpRight
|
||||||
|
directionFromChar 'b' = Just DownLeft
|
||||||
|
directionFromChar 'n' = Just DownRight
|
||||||
|
directionFromChar '.' = Just Here
|
||||||
|
directionFromChar _ = Nothing
|
||||||
|
|
|
@ -135,6 +135,7 @@ data Direction where
|
||||||
UpRight :: Direction
|
UpRight :: Direction
|
||||||
DownLeft :: Direction
|
DownLeft :: Direction
|
||||||
DownRight :: Direction
|
DownRight :: Direction
|
||||||
|
Here :: Direction
|
||||||
deriving stock (Show, Eq, Generic)
|
deriving stock (Show, Eq, Generic)
|
||||||
|
|
||||||
instance Arbitrary Direction where
|
instance Arbitrary Direction where
|
||||||
|
@ -150,6 +151,7 @@ opposite UpLeft = DownRight
|
||||||
opposite UpRight = DownLeft
|
opposite UpRight = DownLeft
|
||||||
opposite DownLeft = UpRight
|
opposite DownLeft = UpRight
|
||||||
opposite DownRight = UpLeft
|
opposite DownRight = UpLeft
|
||||||
|
opposite Here = Here
|
||||||
|
|
||||||
move :: Direction -> Position -> Position
|
move :: Direction -> Position -> Position
|
||||||
move Up = y -~ 1
|
move Up = y -~ 1
|
||||||
|
@ -160,6 +162,7 @@ move UpLeft = move Up . move Left
|
||||||
move UpRight = move Up . move Right
|
move UpRight = move Up . move Right
|
||||||
move DownLeft = move Down . move Left
|
move DownLeft = move Down . move Left
|
||||||
move DownRight = move Down . move Right
|
move DownRight = move Down . move Right
|
||||||
|
move Here = id
|
||||||
|
|
||||||
asPosition :: Direction -> Position
|
asPosition :: Direction -> Position
|
||||||
asPosition dir = move dir mempty
|
asPosition dir = move dir mempty
|
||||||
|
|
|
@ -9,11 +9,16 @@ import qualified Test.QuickCheck.Gen as Gen
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
import Xanthous.Entities (SomeEntity(..))
|
import Xanthous.Entities (SomeEntity(..))
|
||||||
import Xanthous.Entities.Character
|
import Xanthous.Entities.Character
|
||||||
|
import Xanthous.Entities.Item
|
||||||
|
import Xanthous.Entities.Creature
|
||||||
import Xanthous.Entities.Environment
|
import Xanthous.Entities.Environment
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
instance Arbitrary SomeEntity where
|
instance Arbitrary SomeEntity where
|
||||||
arbitrary = Gen.oneof
|
arbitrary = Gen.oneof
|
||||||
[ SomeEntity <$> arbitrary @Character
|
[ SomeEntity <$> arbitrary @Character
|
||||||
, pure $ SomeEntity Wall
|
, SomeEntity <$> arbitrary @Item
|
||||||
|
, SomeEntity <$> arbitrary @Creature
|
||||||
|
, SomeEntity <$> arbitrary @Wall
|
||||||
|
, SomeEntity <$> arbitrary @Door
|
||||||
]
|
]
|
||||||
|
|
|
@ -12,6 +12,7 @@ module Xanthous.Entities.Creature
|
||||||
import Xanthous.Prelude
|
import Xanthous.Prelude
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
import Data.Word
|
import Data.Word
|
||||||
|
import Test.QuickCheck.Arbitrary.Generic
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
import Xanthous.Entities.RawTypes hiding (Creature)
|
import Xanthous.Entities.RawTypes hiding (Creature)
|
||||||
import Xanthous.Entities (Draw(..), Entity(..), DrawRawChar(..))
|
import Xanthous.Entities (Draw(..), Entity(..), DrawRawChar(..))
|
||||||
|
@ -25,6 +26,9 @@ data Creature = Creature
|
||||||
deriving Draw via DrawRawChar "_creatureType" Creature
|
deriving Draw via DrawRawChar "_creatureType" Creature
|
||||||
makeLenses ''Creature
|
makeLenses ''Creature
|
||||||
|
|
||||||
|
instance Arbitrary Creature where
|
||||||
|
arbitrary = genericArbitrary
|
||||||
|
|
||||||
instance Entity Creature where
|
instance Entity Creature where
|
||||||
blocksVision _ = False
|
blocksVision _ = False
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,19 @@
|
||||||
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
module Xanthous.Entities.Environment
|
module Xanthous.Entities.Environment
|
||||||
( Wall(..)
|
( Wall(..)
|
||||||
|
, Door(..)
|
||||||
|
, open
|
||||||
|
, locked
|
||||||
) where
|
) where
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
import Xanthous.Prelude
|
import Xanthous.Prelude
|
||||||
import Test.QuickCheck
|
import Test.QuickCheck
|
||||||
|
import Test.QuickCheck.Arbitrary.Generic
|
||||||
import Brick (str)
|
import Brick (str)
|
||||||
import Brick.Widgets.Border.Style (unicode)
|
import Brick.Widgets.Border.Style (unicode)
|
||||||
|
import Brick.Types (Edges(..))
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
import Xanthous.Entities (Draw(..), entityIs, Entity(..))
|
import Xanthous.Entities (Draw(..), entityIs, Entity(..), SomeEntity)
|
||||||
import Xanthous.Entities.Draw.Util
|
import Xanthous.Entities.Draw.Util
|
||||||
import Xanthous.Data
|
import Xanthous.Data
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
@ -22,8 +28,40 @@ instance Entity Wall where
|
||||||
instance Arbitrary Wall where
|
instance Arbitrary Wall where
|
||||||
arbitrary = pure Wall
|
arbitrary = pure Wall
|
||||||
|
|
||||||
|
wallEdges :: (MonoFoldable mono, Element mono ~ SomeEntity)
|
||||||
|
=> Neighbors mono -> Edges Bool
|
||||||
|
wallEdges neighs = any (entityIs @Wall) <$> edges neighs
|
||||||
|
|
||||||
instance Draw Wall where
|
instance Draw Wall where
|
||||||
drawWithNeighbors neighs _wall =
|
drawWithNeighbors neighs _wall =
|
||||||
str . pure . borderFromEdges unicode $ wallEdges
|
str . pure . borderFromEdges unicode $ wallEdges neighs
|
||||||
|
|
||||||
|
data Door = Door
|
||||||
|
{ _open :: Bool
|
||||||
|
, _locked :: Bool
|
||||||
|
}
|
||||||
|
deriving stock (Show, Eq, Ord, Generic)
|
||||||
|
deriving anyclass (NFData, CoArbitrary, Function)
|
||||||
|
makeLenses ''Door
|
||||||
|
|
||||||
|
instance Arbitrary Door where
|
||||||
|
arbitrary = genericArbitrary
|
||||||
|
|
||||||
|
instance Draw Door where
|
||||||
|
drawWithNeighbors neighs door
|
||||||
|
| door ^. open
|
||||||
|
= str . pure $ case wallEdges neighs of
|
||||||
|
Edges True False False False -> vertDoor
|
||||||
|
Edges False True False False -> vertDoor
|
||||||
|
Edges True True False False -> vertDoor
|
||||||
|
Edges False False True False -> horizDoor
|
||||||
|
Edges False False False True -> horizDoor
|
||||||
|
Edges False False True True -> horizDoor
|
||||||
|
_ -> '+'
|
||||||
|
| otherwise = str "\\"
|
||||||
where
|
where
|
||||||
wallEdges = any (entityIs @Wall) <$> edges neighs
|
horizDoor = '␣'
|
||||||
|
vertDoor = '['
|
||||||
|
|
||||||
|
instance Entity Door where
|
||||||
|
blocksVision = not . view open
|
||||||
|
|
|
@ -36,7 +36,12 @@ data CreatureType = CreatureType
|
||||||
via WithOptions '[ FieldLabelModifier '[Drop 1] ]
|
via WithOptions '[ FieldLabelModifier '[Drop 1] ]
|
||||||
CreatureType
|
CreatureType
|
||||||
makeFieldsNoPrefix ''CreatureType
|
makeFieldsNoPrefix ''CreatureType
|
||||||
|
|
||||||
|
instance Arbitrary CreatureType where
|
||||||
|
arbitrary = genericArbitrary
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
data ItemType = ItemType
|
data ItemType = ItemType
|
||||||
{ _name :: Text
|
{ _name :: Text
|
||||||
, _description :: Text
|
, _description :: Text
|
||||||
|
|
|
@ -46,10 +46,12 @@ import Xanthous.Data.EntityMap (EntityMap, EntityID)
|
||||||
import qualified Xanthous.Data.EntityMap as EntityMap
|
import qualified Xanthous.Data.EntityMap as EntityMap
|
||||||
import Xanthous.Data.EntityMap.Graphics
|
import Xanthous.Data.EntityMap.Graphics
|
||||||
import Xanthous.Data (Positioned, Position(..), positioned, position)
|
import Xanthous.Data (Positioned, Position(..), positioned, position)
|
||||||
import Xanthous.Entities (SomeEntity(..), downcastEntity, entityIs)
|
import Xanthous.Entities
|
||||||
|
(SomeEntity(..), downcastEntity, entityIs, _SomeEntity)
|
||||||
import Xanthous.Entities.Character
|
import Xanthous.Entities.Character
|
||||||
import Xanthous.Entities.Creature
|
import Xanthous.Entities.Creature
|
||||||
import Xanthous.Entities.Item
|
import Xanthous.Entities.Item
|
||||||
|
import Xanthous.Entities.Environment
|
||||||
import Xanthous.Entities.Arbitrary ()
|
import Xanthous.Entities.Arbitrary ()
|
||||||
import Xanthous.Orphans ()
|
import Xanthous.Orphans ()
|
||||||
import Xanthous.Game.Prompt
|
import Xanthous.Game.Prompt
|
||||||
|
@ -198,6 +200,8 @@ collisionAt pos = do
|
||||||
if | null ents -> Nothing
|
if | null ents -> Nothing
|
||||||
| any (entityIs @Creature) ents -> pure Combat
|
| any (entityIs @Creature) ents -> pure Combat
|
||||||
| all (entityIs @Item) ents -> Nothing
|
| all (entityIs @Item) ents -> Nothing
|
||||||
|
| doors@(_ : _) <- ents ^.. folded . _SomeEntity @Door
|
||||||
|
, all (view open) doors -> Nothing
|
||||||
| otherwise -> pure Stop
|
| otherwise -> pure Stop
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
|
@ -41,6 +41,8 @@ drawPromptState (WaitingPrompt msg (Prompt _ pt ps _)) =
|
||||||
case (pt, ps) of
|
case (pt, ps) of
|
||||||
(SStringPrompt, StringPromptState edit) ->
|
(SStringPrompt, StringPromptState edit) ->
|
||||||
txt msg <+> renderEditor (txt . fold) True edit
|
txt msg <+> renderEditor (txt . fold) True edit
|
||||||
|
(SDirectionPrompt, DirectionPromptState) ->
|
||||||
|
txt msg
|
||||||
_ -> undefined
|
_ -> undefined
|
||||||
|
|
||||||
drawEntities
|
drawEntities
|
||||||
|
|
|
@ -49,6 +49,7 @@ data SPromptType :: PromptType -> Type where
|
||||||
|
|
||||||
class SingPromptType pt where singPromptType :: SPromptType pt
|
class SingPromptType pt where singPromptType :: SPromptType pt
|
||||||
instance SingPromptType 'StringPrompt where singPromptType = SStringPrompt
|
instance SingPromptType 'StringPrompt where singPromptType = SStringPrompt
|
||||||
|
instance SingPromptType 'DirectionPrompt where singPromptType = SDirectionPrompt
|
||||||
|
|
||||||
instance Show (SPromptType pt) where
|
instance Show (SPromptType pt) where
|
||||||
show SStringPrompt = "SStringPrompt"
|
show SStringPrompt = "SStringPrompt"
|
||||||
|
@ -75,6 +76,7 @@ data PromptResult (pt :: PromptType) where
|
||||||
|
|
||||||
data PromptState pt where
|
data PromptState pt where
|
||||||
StringPromptState :: Editor Text Name -> PromptState 'StringPrompt
|
StringPromptState :: Editor Text Name -> PromptState 'StringPrompt
|
||||||
|
DirectionPromptState :: PromptState 'DirectionPrompt
|
||||||
|
|
||||||
deriving stock instance Show (PromptState pt)
|
deriving stock instance Show (PromptState pt)
|
||||||
|
|
||||||
|
@ -100,17 +102,20 @@ mkPrompt :: PromptCancellable -> SPromptType pt -> (PromptResult pt -> m ()) ->
|
||||||
mkPrompt c pt@SStringPrompt cb =
|
mkPrompt c pt@SStringPrompt cb =
|
||||||
let ps = StringPromptState $ editorText Resource.Prompt (Just 1) ""
|
let ps = StringPromptState $ editorText Resource.Prompt (Just 1) ""
|
||||||
in Prompt c pt ps cb
|
in Prompt c pt ps cb
|
||||||
|
mkPrompt c pt@SDirectionPrompt cb = Prompt c pt DirectionPromptState cb
|
||||||
mkPrompt _ _ _ = undefined
|
mkPrompt _ _ _ = undefined
|
||||||
|
|
||||||
isCancellable :: Prompt m -> Bool
|
isCancellable :: Prompt m -> Bool
|
||||||
isCancellable (Prompt Cancellable _ _ _) = True
|
isCancellable (Prompt Cancellable _ _ _) = True
|
||||||
isCancellable (Prompt Uncancellable _ _ _) = False
|
isCancellable (Prompt Uncancellable _ _ _) = False
|
||||||
|
|
||||||
submitPrompt :: Prompt m -> m ()
|
submitPrompt :: Applicative m => Prompt m -> m ()
|
||||||
submitPrompt (Prompt _ pt ps cb) =
|
submitPrompt (Prompt _ pt ps cb) =
|
||||||
case (pt, ps) of
|
case (pt, ps) of
|
||||||
(SStringPrompt, StringPromptState edit) ->
|
(SStringPrompt, StringPromptState edit) ->
|
||||||
cb . StringResult . mconcat . getEditContents $ edit
|
cb . StringResult . mconcat . getEditContents $ edit
|
||||||
|
(SDirectionPrompt, DirectionPromptState) ->
|
||||||
|
pure () -- Don't use submit with a direction prompt
|
||||||
_ -> undefined
|
_ -> undefined
|
||||||
|
|
||||||
-- data PromptInput :: PromptType -> Type where
|
-- data PromptInput :: PromptType -> Type where
|
||||||
|
|
|
@ -98,10 +98,10 @@ 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
|
|
||||||
-- Remove all but the largest contiguous region of unfilled space
|
-- Remove all but the largest contiguous region of unfilled space
|
||||||
(_: smallerRegions) <- lift $ regions @UArray . amap not <$> freeze cells
|
(_: smallerRegions) <- lift $ regions @UArray . amap not <$> freeze cells
|
||||||
lift $ fillAllM (fold smallerRegions) cells
|
lift $ fillAllM (fold smallerRegions) cells
|
||||||
|
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 ()
|
||||||
|
|
|
@ -27,7 +27,7 @@ randomItems cells = do
|
||||||
let len = rangeSize $ bounds cells
|
let len = rangeSize $ bounds cells
|
||||||
(numItems :: Int) <- floor . (* fromIntegral len)
|
(numItems :: Int) <- floor . (* fromIntegral len)
|
||||||
<$> getRandomR @_ @Float (0.0004, 0.001)
|
<$> getRandomR @_ @Float (0.0004, 0.001)
|
||||||
items <- for [0..numItems] $ const do
|
items <- for [0..numItems] $ const $ do
|
||||||
pos <- randomPosition cells
|
pos <- randomPosition cells
|
||||||
itemType <- fmap (fromMaybe (error "no item raws!"))
|
itemType <- fmap (fromMaybe (error "no item raws!"))
|
||||||
. choose . ChooseElement
|
. choose . ChooseElement
|
||||||
|
|
|
@ -1,6 +1,14 @@
|
||||||
welcome: Welcome to Xanthous, {{characterName}}! It's dangerous out there, why not stay inside?
|
welcome: Welcome to Xanthous, {{characterName}}! It's dangerous out there, why not stay inside?
|
||||||
|
|
||||||
items:
|
items:
|
||||||
pickUp: You pick up the {{item.itemType.name}}
|
pickUp: You pick up the {{item.itemType.name}}
|
||||||
nothingToPickUp: There's nothing here to pick up
|
nothingToPickUp: "There's nothing here to pick up"
|
||||||
|
|
||||||
|
open:
|
||||||
|
prompt: Direction to open (hjklybnu.)?
|
||||||
|
success: "You open the door."
|
||||||
|
locked: "That door is locked"
|
||||||
|
nothingToOpen: "There's nothing to open there"
|
||||||
|
|
||||||
character:
|
character:
|
||||||
namePrompt: "What's your name? "
|
namePrompt: "What's your name? "
|
||||||
|
|
Loading…
Reference in a new issue