Describe what you see when you walk over items
Every step the character takes, describe the entities at that position excluding the character.
This commit is contained in:
parent
4db3a68efe
commit
dd16166665
12 changed files with 82 additions and 14 deletions
|
@ -8,7 +8,8 @@ import qualified Brick
|
||||||
import Brick.Widgets.Edit (handleEditorEvent)
|
import Brick.Widgets.Edit (handleEditorEvent)
|
||||||
import Graphics.Vty.Attributes (defAttr)
|
import Graphics.Vty.Attributes (defAttr)
|
||||||
import Graphics.Vty.Input.Events (Event(EvKey), Key(..))
|
import Graphics.Vty.Input.Events (Event(EvKey), Key(..))
|
||||||
import Control.Monad.State (get, state, StateT(..))
|
import Control.Monad.State (get, state, StateT(..), MonadState)
|
||||||
|
import Control.Monad.Random (MonadRandom)
|
||||||
import Data.Coerce
|
import Data.Coerce
|
||||||
import Control.Monad.State.Class (modify)
|
import Control.Monad.State.Class (modify)
|
||||||
import Data.Aeson (object, ToJSON)
|
import Data.Aeson (object, ToJSON)
|
||||||
|
@ -29,12 +30,14 @@ import Xanthous.Game.Prompt
|
||||||
import Xanthous.Monad
|
import Xanthous.Monad
|
||||||
import Xanthous.Resource (Name)
|
import Xanthous.Resource (Name)
|
||||||
import Xanthous.Messages (message)
|
import Xanthous.Messages (message)
|
||||||
|
import Xanthous.Util.Inflection (toSentence)
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
import qualified Xanthous.Entities.Character as Character
|
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.Entities.Environment (Door, open, locked)
|
||||||
|
import Xanthous.Entities.Character
|
||||||
import Xanthous.Generators
|
import Xanthous.Generators
|
||||||
import qualified Xanthous.Generators.CaveAutomata as CaveAutomata
|
import qualified Xanthous.Generators.CaveAutomata as CaveAutomata
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
@ -93,6 +96,7 @@ handleCommand (Move dir) = do
|
||||||
collisionAt newPos >>= \case
|
collisionAt newPos >>= \case
|
||||||
Nothing -> do
|
Nothing -> do
|
||||||
characterPosition .= newPos
|
characterPosition .= newPos
|
||||||
|
describeEntitiesAt newPos
|
||||||
modify updateCharacterVision
|
modify updateCharacterVision
|
||||||
Just Combat -> undefined
|
Just Combat -> undefined
|
||||||
Just Stop -> pure ()
|
Just Stop -> pure ()
|
||||||
|
@ -198,3 +202,15 @@ entitiesAtPositionWithType pos em =
|
||||||
case downcastEntity @a se of
|
case downcastEntity @a se of
|
||||||
Just e -> [(eid, e)]
|
Just e -> [(eid, e)]
|
||||||
Nothing -> []
|
Nothing -> []
|
||||||
|
|
||||||
|
describeEntitiesAt :: (MonadState GameState m, MonadRandom m) => Position -> m ()
|
||||||
|
describeEntitiesAt pos =
|
||||||
|
use ( entities
|
||||||
|
. EntityMap.atPosition pos
|
||||||
|
. to (filter (not . entityIs @Character))
|
||||||
|
) >>= \case
|
||||||
|
Empty -> pure ()
|
||||||
|
ents ->
|
||||||
|
let descriptions = description <$> ents
|
||||||
|
in say ["entities", "description"] $ object
|
||||||
|
["entityDescriptions" A..= toSentence descriptions]
|
||||||
|
|
|
@ -38,9 +38,11 @@ import Xanthous.Orphans ()
|
||||||
|
|
||||||
class (Show a, Eq a, Draw a) => Entity a where
|
class (Show a, Eq a, Draw a) => Entity a where
|
||||||
blocksVision :: a -> Bool
|
blocksVision :: a -> Bool
|
||||||
|
description :: a -> Text
|
||||||
|
|
||||||
instance Entity a => Entity (Positioned a) where
|
instance Entity a => Entity (Positioned a) where
|
||||||
blocksVision (Positioned _ ent) = blocksVision ent
|
blocksVision (Positioned _ ent) = blocksVision ent
|
||||||
|
description (Positioned _ ent) = description ent
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
data SomeEntity where
|
data SomeEntity where
|
||||||
|
@ -59,6 +61,7 @@ instance Draw SomeEntity where
|
||||||
|
|
||||||
instance Entity SomeEntity where
|
instance Entity SomeEntity where
|
||||||
blocksVision (SomeEntity ent) = blocksVision ent
|
blocksVision (SomeEntity ent) = blocksVision ent
|
||||||
|
description (SomeEntity ent) = description ent
|
||||||
|
|
||||||
downcastEntity :: (Entity a, Typeable a) => SomeEntity -> Maybe a
|
downcastEntity :: (Entity a, Typeable a) => SomeEntity -> Maybe a
|
||||||
downcastEntity (SomeEntity e) = cast e
|
downcastEntity (SomeEntity e) = cast e
|
||||||
|
|
|
@ -41,6 +41,7 @@ instance Draw Character where
|
||||||
|
|
||||||
instance Entity Character where
|
instance Entity Character where
|
||||||
blocksVision _ = False
|
blocksVision _ = False
|
||||||
|
description _ = "yourself"
|
||||||
|
|
||||||
instance Arbitrary Character where
|
instance Arbitrary Character where
|
||||||
arbitrary = genericArbitrary
|
arbitrary = genericArbitrary
|
||||||
|
|
|
@ -9,13 +9,14 @@ module Xanthous.Entities.Creature
|
||||||
, damage
|
, damage
|
||||||
) where
|
) where
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
import Xanthous.Prelude
|
import Xanthous.Prelude
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
import Data.Word
|
import Data.Word
|
||||||
import Test.QuickCheck.Arbitrary.Generic
|
import Test.QuickCheck.Arbitrary.Generic
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
import Xanthous.Entities.RawTypes hiding (Creature)
|
import Xanthous.Entities.RawTypes hiding (Creature, description)
|
||||||
import Xanthous.Entities (Draw(..), Entity(..), DrawRawChar(..))
|
import qualified Xanthous.Entities.RawTypes as Raw
|
||||||
|
import Xanthous.Entities (Draw(..), Entity(..), DrawRawChar(..))
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
data Creature = Creature
|
data Creature = Creature
|
||||||
|
@ -31,6 +32,7 @@ instance Arbitrary Creature where
|
||||||
|
|
||||||
instance Entity Creature where
|
instance Entity Creature where
|
||||||
blocksVision _ = False
|
blocksVision _ = False
|
||||||
|
description = view $ creatureType . Raw.description
|
||||||
|
|
||||||
newWithType :: CreatureType -> Creature
|
newWithType :: CreatureType -> Creature
|
||||||
newWithType _creatureType =
|
newWithType _creatureType =
|
||||||
|
|
|
@ -24,6 +24,7 @@ data Wall = Wall
|
||||||
|
|
||||||
instance Entity Wall where
|
instance Entity Wall where
|
||||||
blocksVision _ = True
|
blocksVision _ = True
|
||||||
|
description _ = "a wall"
|
||||||
|
|
||||||
instance Arbitrary Wall where
|
instance Arbitrary Wall where
|
||||||
arbitrary = pure Wall
|
arbitrary = pure Wall
|
||||||
|
@ -65,3 +66,4 @@ instance Draw Door where
|
||||||
|
|
||||||
instance Entity Door where
|
instance Entity Door where
|
||||||
blocksVision = not . view open
|
blocksVision = not . view open
|
||||||
|
description _ = "a door"
|
||||||
|
|
|
@ -1,17 +1,19 @@
|
||||||
{-# LANGUAGE TemplateHaskell #-}
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
module Xanthous.Entities.Item
|
module Xanthous.Entities.Item
|
||||||
( Item(..)
|
( Item(..)
|
||||||
, itemType
|
, itemType
|
||||||
, newWithType
|
, newWithType
|
||||||
) where
|
) where
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
import Xanthous.Prelude
|
import Xanthous.Prelude
|
||||||
import Test.QuickCheck
|
import Test.QuickCheck
|
||||||
import Data.Aeson (ToJSON, FromJSON)
|
import Data.Aeson (ToJSON, FromJSON)
|
||||||
import Data.Aeson.Generic.DerivingVia
|
import Data.Aeson.Generic.DerivingVia
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
import Xanthous.Entities.RawTypes hiding (Item)
|
import Xanthous.Entities.RawTypes hiding (Item, description)
|
||||||
import Xanthous.Entities (Draw(..), Entity(..), DrawRawChar(..))
|
import qualified Xanthous.Entities.RawTypes as Raw
|
||||||
|
import Xanthous.Entities (Draw(..), Entity(..), DrawRawChar(..))
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
data Item = Item
|
data Item = Item
|
||||||
|
@ -30,6 +32,7 @@ instance Arbitrary Item where
|
||||||
|
|
||||||
instance Entity Item where
|
instance Entity Item where
|
||||||
blocksVision _ = False
|
blocksVision _ = False
|
||||||
|
description = view $ itemType . Raw.description
|
||||||
|
|
||||||
newWithType :: ItemType -> Item
|
newWithType :: ItemType -> Item
|
||||||
newWithType = Item
|
newWithType = Item
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
Item:
|
Item:
|
||||||
name: noodles
|
name: noodles
|
||||||
description: a big bowl o' noodles
|
description: "a big bowl o' noodles"
|
||||||
longDescription: You know exactly what kind of noodles
|
longDescription: You know exactly what kind of noodles
|
||||||
char:
|
char:
|
||||||
char: 'n'
|
char: 'n'
|
||||||
|
|
15
src/Xanthous/Util/Inflection.hs
Normal file
15
src/Xanthous/Util/Inflection.hs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{-# LANGUAGE ViewPatterns #-}
|
||||||
|
|
||||||
|
module Xanthous.Util.Inflection
|
||||||
|
( toSentence
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Xanthous.Prelude
|
||||||
|
|
||||||
|
toSentence :: (MonoFoldable mono, Element mono ~ Text) => mono -> Text
|
||||||
|
toSentence xs = case reverse . toList $ xs of
|
||||||
|
[] -> ""
|
||||||
|
[x] -> x
|
||||||
|
[b, a] -> a <> " and " <> b
|
||||||
|
(final : butlast) ->
|
||||||
|
intercalate ", " (reverse butlast) <> ", and " <> final
|
|
@ -1,5 +1,8 @@
|
||||||
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?
|
||||||
|
|
||||||
|
entities:
|
||||||
|
description: You see here {{entityDescriptions}}
|
||||||
|
|
||||||
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"
|
||||||
|
|
|
@ -7,6 +7,7 @@ import qualified Xanthous.Generators.UtilSpec
|
||||||
import qualified Xanthous.MessageSpec
|
import qualified Xanthous.MessageSpec
|
||||||
import qualified Xanthous.OrphansSpec
|
import qualified Xanthous.OrphansSpec
|
||||||
import qualified Xanthous.Util.GraphicsSpec
|
import qualified Xanthous.Util.GraphicsSpec
|
||||||
|
import qualified Xanthous.Util.InflectionSpec
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = defaultMain test
|
main = defaultMain test
|
||||||
|
@ -21,4 +22,5 @@ test = testGroup "Xanthous"
|
||||||
, Xanthous.OrphansSpec.test
|
, Xanthous.OrphansSpec.test
|
||||||
, Xanthous.DataSpec.test
|
, Xanthous.DataSpec.test
|
||||||
, Xanthous.Util.GraphicsSpec.test
|
, Xanthous.Util.GraphicsSpec.test
|
||||||
|
, Xanthous.Util.InflectionSpec.test
|
||||||
]
|
]
|
||||||
|
|
18
test/Xanthous/Util/InflectionSpec.hs
Normal file
18
test/Xanthous/Util/InflectionSpec.hs
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
module Xanthous.Util.InflectionSpec (main, test) where
|
||||||
|
|
||||||
|
import Test.Prelude
|
||||||
|
import Xanthous.Util.Inflection
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = defaultMain test
|
||||||
|
|
||||||
|
test :: TestTree
|
||||||
|
test = testGroup "Xanthous.Util.Inflection"
|
||||||
|
[ testGroup "toSentence"
|
||||||
|
[ testCase "empty" $ toSentence [] @?= ""
|
||||||
|
, testCase "single" $ toSentence ["x"] @?= "x"
|
||||||
|
, testCase "two" $ toSentence ["x", "y"] @?= "x and y"
|
||||||
|
, testCase "three" $ toSentence ["x", "y", "z"] @?= "x, y, and z"
|
||||||
|
, testCase "four" $ toSentence ["x", "y", "z", "w"] @?= "x, y, z, and w"
|
||||||
|
]
|
||||||
|
]
|
|
@ -4,7 +4,7 @@ cabal-version: 1.12
|
||||||
--
|
--
|
||||||
-- see: https://github.com/sol/hpack
|
-- see: https://github.com/sol/hpack
|
||||||
--
|
--
|
||||||
-- hash: 40187d0301465905043b8caafec5465e644f711620c9fc1cfc57af4105ebe08c
|
-- hash: cebd0598e7aa48a62741fd8a9acc462bb693bb9356947147e0604d8e4b395739
|
||||||
|
|
||||||
name: xanthous
|
name: xanthous
|
||||||
version: 0.1.0.0
|
version: 0.1.0.0
|
||||||
|
@ -59,6 +59,7 @@ library
|
||||||
Xanthous.Resource
|
Xanthous.Resource
|
||||||
Xanthous.Util
|
Xanthous.Util
|
||||||
Xanthous.Util.Graphics
|
Xanthous.Util.Graphics
|
||||||
|
Xanthous.Util.Inflection
|
||||||
other-modules:
|
other-modules:
|
||||||
Paths_xanthous
|
Paths_xanthous
|
||||||
hs-source-dirs:
|
hs-source-dirs:
|
||||||
|
@ -132,6 +133,7 @@ executable xanthous
|
||||||
Xanthous.Resource
|
Xanthous.Resource
|
||||||
Xanthous.Util
|
Xanthous.Util
|
||||||
Xanthous.Util.Graphics
|
Xanthous.Util.Graphics
|
||||||
|
Xanthous.Util.Inflection
|
||||||
Paths_xanthous
|
Paths_xanthous
|
||||||
hs-source-dirs:
|
hs-source-dirs:
|
||||||
src
|
src
|
||||||
|
@ -185,6 +187,7 @@ test-suite test
|
||||||
Xanthous.MessageSpec
|
Xanthous.MessageSpec
|
||||||
Xanthous.OrphansSpec
|
Xanthous.OrphansSpec
|
||||||
Xanthous.Util.GraphicsSpec
|
Xanthous.Util.GraphicsSpec
|
||||||
|
Xanthous.Util.InflectionSpec
|
||||||
Paths_xanthous
|
Paths_xanthous
|
||||||
hs-source-dirs:
|
hs-source-dirs:
|
||||||
test
|
test
|
||||||
|
|
Loading…
Reference in a new issue