-- | The type of game rule sets and assorted game data.
module Game.LambdaHack.Content.RuleKind
  ( RuleKind(..), ruvalidate
  ) where

import Data.Text (Text)
import Data.Version

import Game.LambdaHack.Common.Misc
import Game.LambdaHack.Common.Point
import Game.LambdaHack.Common.PointXY
import Game.LambdaHack.Content.TileKind

-- TODO: very few rules are configurable yet, extend as needed.

-- | The type of game rule sets and assorted game data.
--
-- For now the rules are immutable througout the game, so there is
-- no type @Rule@ to hold any changing parameters, just @RuleKind@
-- for the fixed set.
-- However, in the future, if the rules can get changed during gameplay
-- based on data mining of player behaviour, we may add such a type
-- and then @RuleKind@ will become just a starting template, analogously
-- as for the other content.
--
-- The @raccessible@ field holds a predicate that tells
-- whether one position is accessible from another.
-- Precondition: the two positions are next to each other.
data RuleKind = RuleKind
  { rsymbol          :: !Char     -- ^ a symbol
  , rname            :: !Text     -- ^ short description
  , rfreq            :: !Freqs    -- ^ frequency within groups
  , raccessible      :: X -> Point -> TileKind -> Point -> TileKind -> Bool
  , rtitle           :: !Text     -- ^ the title of the game
  , rpathsDataFile   :: FilePath -> IO FilePath  -- ^ the path to data files
  , rpathsVersion    :: !Version  -- ^ the version of the game
  , ritemMelee       :: ![Char]   -- ^ symbols of melee weapons
  , ritemRanged      :: ![Char]   -- ^ symbols of ranged weapons and missiles
  , ritemProject     :: ![Char]   -- ^ symbols of items AI can project
  , rcfgRulesDefault :: !String   -- ^ the default game rules config file
  , rcfgUIDefault    :: !String   -- ^ the default UI settings config file
  , rmainMenuArt     :: !Text     -- ^ the ASCII art for the Main Menu
  }

-- | A dummy instance of the 'Show' class, to satisfy general requirments
-- about content. We won't have many rule sets and they contain functions,
-- so defining a proper instance is not practical.
instance Show RuleKind where
  show _ = "The game ruleset specification."

-- | Validates the ASCII art format (TODO).
ruvalidate :: [RuleKind] -> [RuleKind]
ruvalidate _ = []