LambdaHack-0.11.0.1: definition-src/Game/LambdaHack/Definition/DefsInternal.hs
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-- | Very basic types for content definitions with their internals exposed.
module Game.LambdaHack.Definition.DefsInternal
( GroupName(..), displayGroupName
, ContentId, toContentId, fromContentId, contentIdIndex
, ContentSymbol, toContentSymbol, displayContentSymbol
) where
import Prelude ()
import Game.LambdaHack.Core.Prelude
import Control.DeepSeq
import Data.Binary
import Data.Hashable
-- If ever needed, we can use a symbol table here, since content
-- is never serialized. But we'd need to cover the few cases
-- (e.g., @litemFreq@) where @GroupName@ goes into savegame.
newtype GroupName c = GroupName {fromGroupName :: Text}
deriving (Show, Eq, Ord, Hashable, Binary, NFData)
-- | This does not need to be 1-1, so should not be used in place of the
-- 'Eq' instance, etc.
displayGroupName :: GroupName c -> Text
displayGroupName = fromGroupName
-- | Content identifiers for the content type @c@.
newtype ContentId c = ContentId Word16
deriving (Show, Eq, Ord, Enum, Hashable, Binary)
toContentId :: Word16 -> ContentId c
{-# INLINE toContentId #-}
toContentId = ContentId
fromContentId :: ContentId c -> Word16
{-# INLINE fromContentId #-}
fromContentId (ContentId k) = k
contentIdIndex :: ContentId c -> Int
{-# INLINE contentIdIndex #-}
contentIdIndex (ContentId k) = fromEnum k
-- TODO: temporary, not to break compilation too soon:
--{--
type ContentSymbol c = Char
toContentSymbol :: Char -> ContentSymbol c
toContentSymbol = id
displayContentSymbol :: ContentSymbol c -> Char
displayContentSymbol = id
--}
-- TODO: The intended definitions. Error they are going to cause will
-- point out all the remaining item symbols hardwired in the engine
-- and make any future accidental hardwiring harder.
-- TODO2: extend to other content kinds than item kinds.
{-
-- | An abstract view on the symbol of a content item definition.
-- Hiding the constructor prevents hardwiring symbols inside the engine
-- by accident (this is still possible via conversion functions,
-- if one insists, so the abstraction is leaky, but that's fine).
newtype ContentSymbol c = ContentSymbol Char
deriving (Show, Eq, Ord, Binary, NFData) -- TODO: Generic and most others are only needed for TriggerItem, so once the latter is removed, these instances can go.
-- | This is a 1-1 inclusion. Don't use, if an equal named symbol already
-- exists in rules content.
toContentSymbol :: Char -> ContentSymbol c
{-# INLINE toContentSymbol #-}
toContentSymbol = ContentSymbol
-- | This does not need to be 1-1, so should not be used in place of the
-- 'Eq' instance, etc.
displayContentSymbol :: ContentSymbol c -> Char
{-# INLINE displayContentSymbol #-}
displayContentSymbol (ContentSymbol c) = c
--}