feat(xanthous): Store language on creatures
Add a new "language" field to the CreatureType raw type, which references the *name* of the language that creature speaks (this is so that different creatures can speak the same language without having to duplicate the language definition in the raws). At some point this should change to not hardcode the sets of languages and instead define them in data files like we do for creatures, but this is fine as a start. Change-Id: I6708570175e23472cb37e0061a329e54e8eac9c0 Reviewed-on: https://cl.tvl.fyi/c/depot/+/3205 Reviewed-by: grfn <grfn@gws.fyi> Tested-by: BuildkiteCI
This commit is contained in:
parent
5b0649d2a8
commit
26d7dadded
2 changed files with 29 additions and 1 deletions
|
@ -10,6 +10,9 @@ module Xanthous.Entities.RawTypes
|
|||
-- * Creatures
|
||||
, CreatureType(..)
|
||||
, hostile
|
||||
-- ** Language
|
||||
, LanguageName(..)
|
||||
, getLanguage
|
||||
|
||||
-- * Items
|
||||
, ItemType(..)
|
||||
|
@ -30,6 +33,7 @@ module Xanthous.Entities.RawTypes
|
|||
, HasEdible(..)
|
||||
, HasFriendly(..)
|
||||
, HasHitpointsHealed(..)
|
||||
, HasLanguage(..)
|
||||
, HasLongDescription(..)
|
||||
, HasMaxHitpoints(..)
|
||||
, HasName(..)
|
||||
|
@ -46,8 +50,28 @@ import Xanthous.Messages (Message(..))
|
|||
import Xanthous.Data (TicksPerTile, Hitpoints)
|
||||
import Xanthous.Data.EntityChar
|
||||
import Xanthous.Util.QuickCheck
|
||||
import Xanthous.Generators.Speech (Language, gormlak, english)
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
-- | Identifiers for languages that creatures can speak.
|
||||
--
|
||||
-- Non-verbal or non-sentient creatures have Nothing as their language
|
||||
--
|
||||
-- At some point, we will likely want to make languages be defined in data files
|
||||
-- somewhere, and reference them that way instead.
|
||||
data LanguageName = Gormlak | English
|
||||
deriving stock (Show, Eq, Ord, Generic, Enum, Bounded)
|
||||
deriving anyclass (NFData, CoArbitrary, Function)
|
||||
deriving Arbitrary via GenericArbitrary LanguageName
|
||||
deriving (ToJSON, FromJSON)
|
||||
via WithOptions '[ AllNullaryToStringTag 'True ]
|
||||
LanguageName
|
||||
|
||||
-- | Resolve a 'LanguageName' into an actual 'Language'
|
||||
getLanguage :: LanguageName -> Language
|
||||
getLanguage Gormlak = gormlak
|
||||
getLanguage English = english
|
||||
|
||||
data CreatureType = CreatureType
|
||||
{ _name :: !Text
|
||||
, _description :: !Text
|
||||
|
@ -55,12 +79,15 @@ data CreatureType = CreatureType
|
|||
, _maxHitpoints :: !Hitpoints
|
||||
, _friendly :: !Bool
|
||||
, _speed :: !TicksPerTile
|
||||
, _language :: !(Maybe LanguageName)
|
||||
}
|
||||
deriving stock (Show, Eq, Ord, Generic)
|
||||
deriving anyclass (NFData, CoArbitrary, Function)
|
||||
deriving Arbitrary via GenericArbitrary CreatureType
|
||||
deriving (ToJSON, FromJSON)
|
||||
via WithOptions '[ FieldLabelModifier '[Drop 1] ]
|
||||
via WithOptions '[ FieldLabelModifier '[Drop 1]
|
||||
, OmitNothingFields 'True
|
||||
]
|
||||
CreatureType
|
||||
makeFieldsNoPrefix ''CreatureType
|
||||
|
||||
|
|
|
@ -11,3 +11,4 @@ Creature:
|
|||
maxHitpoints: 5
|
||||
speed: 125
|
||||
friendly: false
|
||||
language: Gormlak
|
||||
|
|
Loading…
Reference in a new issue