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