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 . lWorld . wallDamages %~ addwalldamages & cWorld . lWorld . 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