module Dodge.Shockwave.Update (updateShockwave) where import Linear.V3 import Dodge.Damage import Dodge.Data.World import LensHelp updateShockwave :: World -> Shockwave -> (World, Maybe Shockwave) updateShockwave w sw = case _swDirection sw of OutwardShockwave -> moveShockwave w sw InwardShockwave -> moveInverseShockwave w sw moveShockwave :: World -> Shockwave -> (World, Maybe Shockwave) moveShockwave w sw | _swTimer sw <= 0 = (w, Nothing) | otherwise = (doDams w, Just $ sw & swTimer -~ 1) where -- is = _swInvulnerableCrs sw r = _swRad sw p = _swPos sw dam = _swDam sw t = _swTimer sw tFraction = fromIntegral t / fromIntegral (_swMaxTime sw) rad = r - (3 / 4) * r * tFraction doDams | (p ^. _z >= 0) && (p ^. _z < 25) = damageInCircle (Explosive dam) (p ^. _xy) rad | otherwise = id -- doDams w' = -- over (cWorld . lWorld . creatures) (IM.map damCr) $ -- foldl' -- (flip $ damageWall (Explosive 1000 p)) -- w' -- hitBlocks -- hitBlocks = map snd . overlapCircWalls p rad $ wlsNearCirc p rad w -- -- this is not expansive enough -- damCr cr -- | _crID cr `elem` is || dist (_crPos cr) p >= rad + crRad (cr ^. crType) = cr -- | otherwise = cr & crDamage .:~ Explosive dam p --where -- cpos = _crPos cr -- v = normalizeV (cpos -.- p) moveInverseShockwave :: World -> Shockwave -> (World, Maybe Shockwave) moveInverseShockwave w sw | t <= 0 = (w, Nothing) | otherwise = (w, Just $ swTimer -~ 1 $ sw) where t = _swTimer sw -- rad = r - 0.1 * r * fromIntegral (10 - t) -- dams = over (cWorld . lWorld . creatures) (IM.map damCr) -- . flip (foldr (damageBlocksBy 1)) hitBlocks -- hitBlocks = wallsOnCirc' p rad $ wallsNearPoint' p w -- damCr cr -- | dist (_crPos cr) p >= rad + crRad (cr ^. crType) = cr -- | otherwise = cr & crDamage .:~ Explosive 1 p --where -- cpos = _crPos cr -- v = normalizeV (cpos -.- p)