Refactor, try to limit dependencies
This commit is contained in:
@@ -1,66 +1,77 @@
|
||||
{-# LANGUAGE TupleSections #-}
|
||||
|
||||
{- |
|
||||
Find which objects lie upon a line.
|
||||
-}
|
||||
module Dodge.WorldEvent.ThingsHit
|
||||
( thingsHit
|
||||
, thingHit
|
||||
, thingHitFilt
|
||||
, thingsHitExceptCr
|
||||
, crsHitRadial
|
||||
, wlsHitRadial
|
||||
)
|
||||
where
|
||||
import Dodge.Zoning.Wall
|
||||
import Dodge.Zoning.Creature
|
||||
import Dodge.Data
|
||||
-}
|
||||
module Dodge.WorldEvent.ThingsHit (
|
||||
thingsHit,
|
||||
thingHit,
|
||||
thingHitFilt,
|
||||
thingsHitExceptCr,
|
||||
crsHitRadial,
|
||||
wlsHitRadial,
|
||||
) where
|
||||
|
||||
import Control.Lens
|
||||
import Data.Bifunctor
|
||||
import qualified Data.IntSet as IS
|
||||
import Data.List (sortOn)
|
||||
import Data.Maybe
|
||||
import Dodge.Base
|
||||
import Dodge.Data.World
|
||||
import Dodge.Zoning.Creature
|
||||
import Dodge.Zoning.Wall
|
||||
import Geometry
|
||||
import qualified ListHelp as List
|
||||
|
||||
import Control.Lens
|
||||
import Data.Maybe
|
||||
import Data.List (sortOn)
|
||||
import Data.Bifunctor
|
||||
import qualified Data.IntSet as IS
|
||||
|
||||
{- List those objects that appear on a line. -}
|
||||
thingsHit
|
||||
:: Point2 -- ^ Line start point
|
||||
-> Point2 -- ^ Line end point
|
||||
-> World
|
||||
-> [(Point2, Either Creature Wall)]
|
||||
thingsHit sp ep w = List.mergeOn (dist sp . fst)
|
||||
(map (second Left) (crsHit sp ep w))
|
||||
(map (second Right) (wlsHit sp ep w))
|
||||
thingsHit ::
|
||||
-- | Line start point
|
||||
Point2 ->
|
||||
-- | Line end point
|
||||
Point2 ->
|
||||
World ->
|
||||
[(Point2, Either Creature Wall)]
|
||||
thingsHit sp ep w =
|
||||
List.mergeOn
|
||||
(dist sp . fst)
|
||||
(map (second Left) (crsHit sp ep w))
|
||||
(map (second Right) (wlsHit sp ep w))
|
||||
|
||||
--{- List those objects that appear on a line. -}
|
||||
--thingsHit
|
||||
-- :: Point2 -- ^ Line start point
|
||||
-- -> Point2 -- ^ Line end point
|
||||
-- -> World
|
||||
-- -> World
|
||||
-- -> StreamOf (Point2, Either Creature Wall)
|
||||
--thingsHit sp ep w = void $ S.mergeOn (dist sp . fst)
|
||||
--thingsHit sp ep w = void $ S.mergeOn (dist sp . fst)
|
||||
-- (S.map (second Left) (S.each $ crsHit sp ep w))
|
||||
-- (S.map (second Right) (wlsHit sp ep w))
|
||||
|
||||
crsHit :: Point2 -> Point2 -> World -> [(Point2, Creature)]
|
||||
crsHit sp ep w
|
||||
| sp == ep = mempty
|
||||
| otherwise = sortOn (dist sp . fst)
|
||||
. overlap1SegCrs sp ep
|
||||
. mapMaybe (\cid -> w ^? cWorld . creatures . ix cid)
|
||||
. IS.toList
|
||||
. crsNearSeg sp ep
|
||||
$ w
|
||||
| sp == ep = mempty
|
||||
| otherwise =
|
||||
sortOn (dist sp . fst)
|
||||
. overlap1SegCrs sp ep
|
||||
. mapMaybe (\cid -> w ^? cWorld . creatures . ix cid)
|
||||
. IS.toList
|
||||
. crsNearSeg sp ep
|
||||
$ w
|
||||
|
||||
thingHitFilt :: (Creature -> Bool) -> (Wall -> Bool)
|
||||
-> Point2 -> Point2 -> World -> Maybe (Point2, Either Creature Wall)
|
||||
thingHitFilt ::
|
||||
(Creature -> Bool) ->
|
||||
(Wall -> Bool) ->
|
||||
Point2 ->
|
||||
Point2 ->
|
||||
World ->
|
||||
Maybe (Point2, Either Creature Wall)
|
||||
thingHitFilt fcr fwl sp ep = List.find (f . snd) . thingsHit sp ep
|
||||
where
|
||||
f (Left cr) = fcr cr
|
||||
f (Right wl) = fwl wl
|
||||
|
||||
--thingHitFilt :: (Creature -> Bool) -> (Wall -> Bool)
|
||||
--thingHitFilt :: (Creature -> Bool) -> (Wall -> Bool)
|
||||
-- -> Point2 -> Point2 -> World -> Maybe (Point2, Either Creature Wall)
|
||||
--thingHitFilt fcr fwl sp ep = runIdentity . S.head_ . S.filter (f . snd) . thingsHit sp ep
|
||||
-- where
|
||||
@@ -72,37 +83,43 @@ thingHit sp ep = listToMaybe . thingsHit sp ep
|
||||
|
||||
{- List objects that appear on a line.
|
||||
Can filter out a creature. -}
|
||||
thingsHitExceptCr
|
||||
:: Maybe Int -- ^ A possible creature ID
|
||||
-> Point2 -- ^ Line start point
|
||||
-> Point2 -- ^ Line end point
|
||||
-> World
|
||||
-> [(Point2, Either Creature Wall)]
|
||||
thingsHitExceptCr Nothing sp ep = thingsHit sp ep
|
||||
thingsHitExceptCr ::
|
||||
-- | A possible creature ID
|
||||
Maybe Int ->
|
||||
-- | Line start point
|
||||
Point2 ->
|
||||
-- | Line end point
|
||||
Point2 ->
|
||||
World ->
|
||||
[(Point2, Either Creature Wall)]
|
||||
thingsHitExceptCr Nothing sp ep = thingsHit sp ep
|
||||
thingsHitExceptCr (Just cid) sp ep = filter crNotCid . thingsHit sp ep
|
||||
where
|
||||
crNotCid (_,Left cr) = _crID cr /= cid
|
||||
where
|
||||
crNotCid (_, Left cr) = _crID cr /= cid
|
||||
crNotCid _ = True
|
||||
|
||||
--{- List objects that appear on a line.
|
||||
--Can filter out a creature. -}
|
||||
--thingsHitExceptCr
|
||||
--thingsHitExceptCr
|
||||
-- :: Maybe Int -- ^ A possible creature ID
|
||||
-- -> Point2 -- ^ Line start point
|
||||
-- -> Point2 -- ^ Line end point
|
||||
-- -> World
|
||||
-- -> World
|
||||
-- -> StreamOf (Point2, Either Creature Wall)
|
||||
--thingsHitExceptCr Nothing sp ep = thingsHit sp ep
|
||||
--thingsHitExceptCr (Just cid) sp ep = S.filter crNotCid . thingsHit sp ep
|
||||
-- where
|
||||
-- where
|
||||
-- crNotCid (_,Left cr) = _crID cr /= cid
|
||||
-- crNotCid _ = True
|
||||
|
||||
wlsHit :: Point2 -> Point2 -> World -> [(Point2, Wall)]
|
||||
wlsHit sp ep
|
||||
| sp == ep = const mempty
|
||||
| otherwise = sortOn (dist sp . fst)
|
||||
. overlapSegWalls sp ep
|
||||
. wlsNearSeg sp ep
|
||||
| sp == ep = const mempty
|
||||
| otherwise =
|
||||
sortOn (dist sp . fst)
|
||||
. overlapSegWalls sp ep
|
||||
. wlsNearSeg sp ep
|
||||
|
||||
--wlsHit :: Point2 -> Point2 -> World -> StreamOf (Point2, Wall)
|
||||
--wlsHit sp ep
|
||||
-- | sp == ep = const mempty
|
||||
@@ -116,6 +133,7 @@ wlsHitRadial p r = mapMaybe f . wlsNearCirc p r
|
||||
f wl = uncurry (intersectSegSeg p (p -.- r *.* v)) (_wlLine wl) <&> (,wl)
|
||||
where
|
||||
v = normalizeV $ vNormal $ uncurry (-.-) $ _wlLine wl
|
||||
|
||||
--wlsHitRadial :: Point2 -> Float -> World -> StreamOf (Point2, Wall)
|
||||
--wlsHitRadial p r = S.mapMaybe f . wlsInsideCirc p r
|
||||
-- where
|
||||
@@ -126,7 +144,7 @@ wlsHitRadial p r = mapMaybe f . wlsNearCirc p r
|
||||
crsHitRadial :: Point2 -> Float -> World -> [(Point2, Creature)]
|
||||
crsHitRadial p r = mapMaybe f . crsNearCirc p r
|
||||
where
|
||||
f cr
|
||||
f cr
|
||||
| dist cpos p <= r = Just (cpos +.+ r *.* normalizeV (p -.- cpos), cr)
|
||||
| otherwise = Nothing
|
||||
where
|
||||
|
||||
Reference in New Issue
Block a user