about summary refs log tree commit diff
path: root/users/grfn/xanthous/src/Xanthous
diff options
context:
space:
mode:
authorGriffin Smith <grfn@gws.fyi>2021-06-13T14·37-0400
committergrfn <grfn@gws.fyi>2021-06-14T13·04+0000
commit26d7dadded04cfb278765ed0b4479c471f9eb412 (patch)
treee1c0108de7328f50942a41d1640d21f19644df0a /users/grfn/xanthous/src/Xanthous
parent5b0649d2a8d618805a4df4cc6afc09cefef4fc1f (diff)
feat(xanthous): Store language on creatures r/2659
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
Diffstat (limited to 'users/grfn/xanthous/src/Xanthous')
-rw-r--r--users/grfn/xanthous/src/Xanthous/Entities/RawTypes.hs29
-rw-r--r--users/grfn/xanthous/src/Xanthous/Entities/Raws/gormlak.yaml1
2 files changed, 29 insertions, 1 deletions
diff --git a/users/grfn/xanthous/src/Xanthous/Entities/RawTypes.hs b/users/grfn/xanthous/src/Xanthous/Entities/RawTypes.hs
index d280136ae85e..a650a4f78ea7 100644
--- a/users/grfn/xanthous/src/Xanthous/Entities/RawTypes.hs
+++ b/users/grfn/xanthous/src/Xanthous/Entities/RawTypes.hs
@@ -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
 
diff --git a/users/grfn/xanthous/src/Xanthous/Entities/Raws/gormlak.yaml b/users/grfn/xanthous/src/Xanthous/Entities/Raws/gormlak.yaml
index 2eac895190b3..41247532f9dc 100644
--- a/users/grfn/xanthous/src/Xanthous/Entities/Raws/gormlak.yaml
+++ b/users/grfn/xanthous/src/Xanthous/Entities/Raws/gormlak.yaml
@@ -11,3 +11,4 @@ Creature:
   maxHitpoints: 5
   speed: 125
   friendly: false
+  language: Gormlak