content: {-# LANGUAGE DeriveGeneric, GeneralizedNewtypeDeriving #-}
  -- | Abstract identifiers for the main types in the engine. This is imported
  -- by modules that don't need to know the internal structure
  -- of the types. As a side effect, this prevents mutual dependencies
  -- among modules.
  module Game.LambdaHack.Common.Types
    ( ItemId, FactionId, LevelId, ActorId
    , Container(..)
    ) where
  
  import Prelude ()
  
  import Game.LambdaHack.Core.Prelude
  
  import Data.Binary
  import Data.Hashable
  import GHC.Generics (Generic)
  
  import Game.LambdaHack.Common.Point
  import Game.LambdaHack.Definition.Defs
  
  -- | A unique identifier of an item in the dungeon.
  newtype ItemId = ItemId Int
    deriving (Show, Eq, Ord, Enum, Binary)
  
  -- | A unique identifier of a faction in a game. It's assigned in the order
  -- from game mode roster, starting from one. We keep the @FactionId@
  -- and @TeamContinuity@ types separate mostly to let @FactionId@ reflect
  -- the order, which influences starting faction positions, etc.
  -- We use @TeamContinuity@ for dictionaries containing teams that may
  -- or may not be active factions in the current game, while @FactionId@ are
  -- used only for factions in the game (in particular, because they vary
  -- depending on order in game mode roster, while @TeamContinuity@ are stable).
  newtype FactionId = FactionId Int
    deriving (Show, Eq, Ord, Enum, Hashable, Binary)
  
  -- | Abstract level identifiers.
  newtype LevelId = LevelId Int
    deriving (Show, Eq, Ord, Hashable, Binary)
  
  instance Enum LevelId where
    fromEnum (LevelId n) = n
    toEnum = LevelId  -- picks the main branch of the dungeon
  
  -- | A unique identifier of an actor in the dungeon.
  newtype ActorId = ActorId Int
    deriving (Show, Eq, Ord, Enum, Binary)
  
  -- | Item container type.
  data Container =
      CFloor LevelId Point
    | CEmbed LevelId Point
    | CActor ActorId CStore
    | CTrunk FactionId LevelId Point   -- ^ for bootstrapping actor bodies
    deriving (Show, Eq, Ord, Generic)
  
  instance Binary Container
  