39 lines
1.2 KiB
Haskell
39 lines
1.2 KiB
Haskell
module Dodge.DamageCircle (
|
|
damageCircle,
|
|
) where
|
|
|
|
import Data.Foldable
|
|
import Dodge.Data.World
|
|
import Dodge.WorldEvent.ThingsHit
|
|
import Geometry
|
|
import qualified IntMapHelp as IM
|
|
import LensHelp
|
|
|
|
damageCircle :: Float -> Point2 -> DamageType -> Int -> World -> World
|
|
damageCircle r sp dt da w =
|
|
w
|
|
& cWorld . wallDamages %~ addwalldamages
|
|
& cWorld . creatures %~ addcreaturedamages
|
|
where
|
|
--addwalldamages wlds = runIdentity $ S.fold_ (damageWlCircle wldam) wlds id wlstodam
|
|
addwalldamages wlds = foldl' (damageWlCircle wldam) wlds wlstodam
|
|
wlstodam = wlsHitRadial sp r w
|
|
wldam p = Damage dt da sp p (sp +.+ r *.* normalizeV (p -.- sp)) NoDamageEffect
|
|
addcreaturedamages crs = foldl' (damageCrCircle crdam) crs crstodam
|
|
crdam p cr = Damage dt da sp p (_crPos cr) NoDamageEffect
|
|
crstodam = crsHitRadial sp r w
|
|
|
|
damageWlCircle ::
|
|
(Point2 -> Damage) ->
|
|
IM.IntMap [Damage] ->
|
|
(Point2, Wall) ->
|
|
IM.IntMap [Damage]
|
|
damageWlCircle f wldams (p, wl) = IM.insertWith (++) (_wlID wl) [f p] wldams
|
|
|
|
damageCrCircle ::
|
|
(Point2 -> Creature -> Damage) ->
|
|
IM.IntMap Creature ->
|
|
(Point2, Creature) ->
|
|
IM.IntMap Creature
|
|
damageCrCircle crdam crs (p, cr) = crs & ix (_crID cr) . crState . csDamage .:~ crdam p cr
|