Reify shockwaves

This commit is contained in:
2022-07-24 00:20:28 +01:00
parent 97174535d8
commit 5b9e9968f3
17 changed files with 197 additions and 166 deletions
+67
View File
@@ -0,0 +1,67 @@
module Dodge.Shockwave.Update
where
import Geometry.Vector
import Dodge.Zoning.Wall
import Dodge.Base.Collide
import Dodge.Wall.Damage
import Dodge.Data
import qualified IntMapHelp as IM
import LensHelp
import Data.Foldable
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
push = _swPush sw
dam = _swDam sw
t = _swTimer sw
tFraction = fromIntegral t / fromIntegral (_swMaxTime sw)
rad = r - (3/4) * r * tFraction
doDams w' = over creatures (IM.map damCr)
$ foldl'
(flip $ damageWall (Damage EXPLOSIVE 10000 p p p NoDamageEffect))
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 = cr
| otherwise = cr & crState . csDamage .:~
Damage PUSHDAM dam (cpos -.- v) cpos (cpos +.+ v)
(PushBackDamage (25 * push))
where
cpos = _crPos cr
v = normalizeV (cpos -.- p)
moveInverseShockwave
:: World
-> Shockwave
-> (World, Maybe Shockwave)
moveInverseShockwave w sw
| t <= 0 = ( w, Nothing)
| otherwise = (dams w, Just $ swTimer -~ 1 $ sw )
where
p = _swPos sw
r = _swRad sw
t = _swTimer sw
rad = r - 0.1 * r * fromIntegral (10 - t)
dams = over 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 = cr
| otherwise = cr & crState . csDamage .:~
Damage PUSHDAM 1 (cpos +.+ v) cpos (cpos -.- v) (PushBackDamage 25)
where
cpos = _crPos cr
v = normalizeV (cpos -.- p)