{-# LANGUAGE DeriveGeneric #-}
-- | Terrain tile features.
module Game.LambdaHack.Common.Feature
  ( Feature(..)
  ) where

import Data.Binary
import Data.Hashable (Hashable)
import GHC.Generics (Generic)

import qualified Game.LambdaHack.Common.Effect as Effect
import Game.LambdaHack.Common.Misc

-- | All possible terrain tile features.
data Feature =
    Cause !(Effect.Effect Int)  -- ^ causes the effect when triggered
  | OpenTo !GroupName    -- ^ goes from a closed to an open tile when altered
  | CloseTo !GroupName   -- ^ goes from an open to a closed tile when altered
  | ChangeTo !GroupName  -- ^ alters tile, but does not change walkability
  | HideAs !GroupName    -- ^ when hidden, looks as a tile of the group
  | RevealAs !GroupName  -- ^ if secret, can be revealed to belong to the group

  | Walkable             -- ^ actors can walk through
  | Clear                -- ^ actors can see through
  | Dark                 -- ^ is not lit with an ambient shine
  | Suspect              -- ^ may not be what it seems (clients only)
  | Aura !(Effect.Effect Int)  -- ^ sustains the effect continuously, TODO
  | Impenetrable         -- ^ can never be excavated nor seen through

  | OftenItem            -- ^ initial items often generated there
  | OftenActor           -- ^ initial actors and stairs often generated there
  | NoItem               -- ^ no items ever generated there
  | NoActor              -- ^ no actors nor stairs ever generated there
  | Trail                -- ^ used for visible trails throughout the level
  deriving (Show, Read, Eq, Ord, Generic)

instance Binary Feature

instance Hashable Feature