Progressively reveal the map to the player
As the character walks around the map, progressively reveal the entities on the map to them, using an algorithm based on well known circle-rasterizing and line-rasterizing algorithms to calculate lines of sight that are potentially obscured by walls.
This commit is contained in:
parent
6678ac986c
commit
58fce2ec19
17 changed files with 454 additions and 52 deletions
28
src/Xanthous/Data/EntityMap/Graphics.hs
Normal file
28
src/Xanthous/Data/EntityMap/Graphics.hs
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
{-# LANGUAGE ViewPatterns #-}
|
||||
--------------------------------------------------------------------------------
|
||||
module Xanthous.Data.EntityMap.Graphics where
|
||||
--------------------------------------------------------------------------------
|
||||
import Xanthous.Prelude
|
||||
--------------------------------------------------------------------------------
|
||||
import Xanthous.Util (takeWhileInclusive)
|
||||
import Xanthous.Data
|
||||
import Xanthous.Data.EntityMap
|
||||
import Xanthous.Entities
|
||||
import Xanthous.Util.Graphics (circle, line)
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
-- | Given a point and a radius of vision, returns a list of all entities that
|
||||
-- are *visible* (eg, not blocked by an entity that obscures vision) from that
|
||||
-- point
|
||||
visibleEntities :: Position -> Word -> EntityMap SomeEntity -> EntityMap SomeEntity
|
||||
visibleEntities (view _Position -> pos) visionRadius em
|
||||
= fromEIDsAndPositioned . fold . fold $ sightAdjustedLines
|
||||
where
|
||||
-- I love laziness!
|
||||
radius = circle pos $ fromIntegral visionRadius
|
||||
linesOfSight = radius <&> line pos
|
||||
entitiesOnLines = linesOfSight <&> map getPositionedAt
|
||||
sightAdjustedLines = entitiesOnLines <&> takeWhileInclusive (none $ blocksVision . snd)
|
||||
getPositionedAt p =
|
||||
let ppos = _Position # p
|
||||
in atPositionWithIDs ppos em
|
||||
Loading…
Add table
Add a link
Reference in a new issue