module Game.LambdaHack.FOV
( fullscan
) where
import qualified Data.List as L
import Game.LambdaHack.FOV.Common
import qualified Game.LambdaHack.FOV.Digital as Digital
import qualified Game.LambdaHack.FOV.Permissive as Permissive
import qualified Game.LambdaHack.FOV.Shadow as Shadow
import Game.LambdaHack.Point
import Game.LambdaHack.VectorXY
import Game.LambdaHack.Vector
import Game.LambdaHack.Level
import qualified Game.LambdaHack.Kind as Kind
import Game.LambdaHack.Content.TileKind
import qualified Game.LambdaHack.Tile as Tile
import Game.LambdaHack.Config
fullscan :: Kind.Ops TileKind
-> FovMode
-> Point
-> Level
-> [Point]
fullscan cotile fovMode loc Level{lxsize, lmap} =
case fovMode of
Shadow ->
L.concatMap (\ tr -> map tr (Shadow.scan (isCl . tr) 1 (0, 1))) tr8
Permissive ->
L.concatMap (\ tr -> map tr (Permissive.scan (isCl . tr))) tr4
Digital r ->
L.concatMap (\ tr -> map tr (Digital.scan r (isCl . tr))) tr4
Blind ->
let radiusOne = 1
in L.concatMap (\ tr -> map tr (Digital.scan radiusOne (isCl . tr))) tr4
where
isCl :: Point -> Bool
isCl = Tile.isClear cotile . (lmap Kind.!)
trV xy = shift loc $ toVector lxsize $ VectorXY xy
tr8 :: [(Distance, Progress) -> Point]
tr8 =
[ \ (p, d) -> trV ( p, d)
, \ (p, d) -> trV ( p, d)
, \ (p, d) -> trV ( p, d)
, \ (p, d) -> trV ( p, d)
, \ (p, d) -> trV ( d, p)
, \ (p, d) -> trV ( d, p)
, \ (p, d) -> trV ( d, p)
, \ (p, d) -> trV ( d, p)
]
tr4 :: [Bump -> Point]
tr4 =
[ \ (B(x, y)) -> trV ( x, y)
, \ (B(x, y)) -> trV ( y, x)
, \ (B(x, y)) -> trV ( x, y)
, \ (B(x, y)) -> trV ( y, x)
]