module Game.LambdaHack.Tile
( SecretStrength(..), SmellTime(..)
, kindHasFeature, kindHas, hasFeature
, isClear, isLit, similar, canBeHidden
) where
import qualified Data.List as L
import Data.Binary
import Game.LambdaHack.Content.TileKind
import qualified Game.LambdaHack.Feature as F
import qualified Game.LambdaHack.Kind as Kind
import Game.LambdaHack.Misc
newtype SecretStrength = SecretStrength{secretStrength :: Time}
deriving (Show, Eq, Ord)
instance Binary SecretStrength where
put = put . secretStrength
get = fmap SecretStrength get
newtype SmellTime = SmellTime{smelltime :: Time} deriving Show
instance Binary SmellTime where
put = put . smelltime
get = fmap SmellTime get
kindHasFeature :: F.Feature -> TileKind -> Bool
kindHasFeature f t = f `elem` tfeature t
kindHas :: [F.Feature] -> [F.Feature] -> TileKind -> Bool
kindHas yes no t = L.all (`kindHasFeature` t) yes
&& not (L.any (`kindHasFeature` t) no)
hasFeature :: Kind.Ops TileKind -> F.Feature -> Kind.Id TileKind -> Bool
hasFeature Kind.Ops{okind} f t =
kindHasFeature f (okind t)
isClear :: Kind.Ops TileKind -> Kind.Id TileKind -> Bool
isClear Kind.Ops{ospeedup = Kind.TileSpeedup{isClearTab}} = isClearTab
isLit :: Kind.Ops TileKind -> Kind.Id TileKind -> Bool
isLit Kind.Ops{ospeedup = Kind.TileSpeedup{isLitTab}} = isLitTab
similar :: TileKind -> TileKind -> Bool
similar t u =
tsymbol t == tsymbol u &&
tname t == tname u &&
tcolor t == tcolor u &&
tcolor2 t == tcolor2 u
canBeHidden :: Kind.Ops TileKind -> TileKind -> Bool
canBeHidden Kind.Ops{ofoldrWithKey} t =
let sim _ s acc = acc || kindHasFeature F.Hidden s && similar t s
in ofoldrWithKey sim False