Files
loop/src/Dodge/Shockwave/Update.hs
T
2025-08-05 08:30:57 +01:00

63 lines
2.0 KiB
Haskell

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)