Reify shockwaves
This commit is contained in:
@@ -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)
|
||||
Reference in New Issue
Block a user