31 lines
1.2 KiB
Haskell
31 lines
1.2 KiB
Haskell
module Dodge.DamageCircle
|
|
( damageCircle
|
|
) where
|
|
import Dodge.Data
|
|
import Dodge.WorldEvent.ThingsHit
|
|
import Geometry
|
|
import LensHelp
|
|
|
|
import Data.Foldable
|
|
import qualified IntMapHelp as IM
|
|
damageCircle :: Float -> Point2 -> DamageType -> Int -> World -> World
|
|
damageCircle r sp dt da w = w
|
|
& wallDamages %~ addwalldamages
|
|
& 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
|