Zoning/streaming refactor
This commit is contained in:
@@ -10,7 +10,7 @@ module Dodge.WorldEvent.Explosion
|
||||
import Dodge.Data
|
||||
import Dodge.LightSource
|
||||
--import Dodge.Default
|
||||
import Dodge.Zone
|
||||
--import Dodge.Zone
|
||||
import Dodge.Base.Collide
|
||||
import Dodge.WorldEvent.SpawnParticle
|
||||
--import Dodge.WorldEvent.Flash
|
||||
|
||||
@@ -12,8 +12,9 @@ import Geometry
|
||||
import Picture
|
||||
import LensHelp
|
||||
|
||||
import Data.Foldable
|
||||
--import Data.Foldable
|
||||
import qualified Data.IntMap.Strict as IM
|
||||
import qualified Streaming.Prelude as S
|
||||
-- currently very effective against walls
|
||||
makeShockwaveAt
|
||||
:: [Int] -- ^ IDs of invulnerable creatures.
|
||||
@@ -52,7 +53,7 @@ mvShockwave
|
||||
:: [Int] -- ^ IDs of invulnerable creatures.
|
||||
-> World -> Particle -> (World, Maybe Particle)
|
||||
mvShockwave is w pt
|
||||
| _ptTimer pt <= 0 = ( w , Nothing)
|
||||
| _ptTimer pt <= 0 = ( w , Nothing)
|
||||
| otherwise = (doDams w , Just $ pt & ptTimer -~ 1)
|
||||
where
|
||||
r = _ptRad pt
|
||||
@@ -62,10 +63,15 @@ mvShockwave is w pt
|
||||
t = _ptTimer pt
|
||||
tFraction = fromIntegral t / fromIntegral (_ptMaxTime pt)
|
||||
rad = r - (3/4) * r * tFraction
|
||||
doDams = over creatures (IM.map damCr)
|
||||
. flip (foldl' (flip $ damageWall (Damage EXPLOSIVE 10000 p p p NoDamageEffect)))
|
||||
hitBlocks
|
||||
hitBlocks = wallsOnCirc' p rad $ wallsNearPoint' p w
|
||||
doDams w' = over creatures (IM.map damCr)
|
||||
. runIdentity
|
||||
$ S.fold_
|
||||
(flip $ damageWall (Damage EXPLOSIVE 10000 p p p NoDamageEffect))
|
||||
w'
|
||||
id
|
||||
hitBlocks
|
||||
hitBlocks = S.map snd . overlapCircWalls p rad $ wallsAlongCirc' 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 .:~
|
||||
|
||||
@@ -96,7 +96,7 @@ moveFlame rotd w pt
|
||||
, _ptCrIgnore = Nothing
|
||||
, _ptVel = speed *.* vel }
|
||||
dodamage = damageInArea closeCrs closeWls pt
|
||||
closeWls wl = uncurry circOnSeg (_wlLine wl) ep 5
|
||||
closeWls wl = uncurry segOnCirc (_wlLine wl) ep 5
|
||||
closeCrs cr = dist ep (_crPos cr)
|
||||
< _crRad cr + 10 - min 9 (max 0 (fromIntegral time - 80))
|
||||
+ 5 * angleCoeff (angleVV (ep -.- _crPos cr) rotd)
|
||||
@@ -197,7 +197,7 @@ damageInRadius :: Float -> Particle -> World -> World
|
||||
damageInRadius size pt = damageInArea isClose closeWls pt
|
||||
where
|
||||
p = _ptPos pt
|
||||
closeWls wl = uncurry circOnSeg (_wlLine wl) p size
|
||||
closeWls wl = uncurry segOnCirc (_wlLine wl) p size
|
||||
isClose cr = dist p (_crPos cr) < _crRad cr + size
|
||||
|
||||
damageInArea :: (Creature -> Bool) -> (Wall -> Bool) -> Particle -> World -> World
|
||||
|
||||
Reference in New Issue
Block a user