From bf023a61cebf1ee43d0816ae91120653f454725e Mon Sep 17 00:00:00 2001 From: justin Date: Sun, 17 Jul 2022 21:45:26 +0100 Subject: [PATCH] Add bullet damages field, move bullet data into own file --- src/Dodge/Bullet.hs | 53 +++++++++++---------- src/Dodge/Combine/Module.hs | 9 ++-- src/Dodge/Creature.hs | 2 + src/Dodge/Creature/Damage.hs | 16 ++----- src/Dodge/Creature/Inanimate.hs | 2 +- src/Dodge/Data.hs | 79 ++----------------------------- src/Dodge/Data/Bullet.hs | 38 +++++++++++++++ src/Dodge/Data/DamageType.hs | 33 +++++++++++++ src/Dodge/Particle/Damage.hs | 64 +++++++------------------ src/Dodge/Wall/DamageEffect.hs | 13 +---- src/Dodge/WorldEvent/Shockwave.hs | 8 ++-- 11 files changed, 137 insertions(+), 180 deletions(-) create mode 100644 src/Dodge/Data/Bullet.hs diff --git a/src/Dodge/Bullet.hs b/src/Dodge/Bullet.hs index 8a721d438..e90531ae5 100644 --- a/src/Dodge/Bullet.hs +++ b/src/Dodge/Bullet.hs @@ -1,5 +1,5 @@ module Dodge.Bullet where -import Dodge.Particle.Damage +import Dodge.WorldEvent.SpawnParticle import Dodge.Creature.Test import Dodge.Data import Dodge.Particle.HitEffect.ExpireAndDamage @@ -14,6 +14,8 @@ import qualified Streaming.Prelude as S import Data.Maybe import Dodge.Movement.Turn import Dodge.WorldEvent.ThingsHit +import Control.Monad.State +import System.Random --import Data.Bifunctor @@ -33,8 +35,9 @@ aBulAt -> BulletTrajectory -> BulletEffect -> BulletSpawn + -> [Damage] -> Bullet -aBulAt vfact pos vel drag width butraj be bs = Bullet +aBulAt vfact pos vel drag width butraj be bs dams = Bullet { _buState = bulstate , _buSpawn = bs , _buEffect = be @@ -46,6 +49,7 @@ aBulAt vfact pos vel drag width butraj be bs = Bullet , _buOldPos = pos , _buWidth = width , _buTimer = 100 + , _buDamages = dams } where bulstate = maybe NormalBulletState DelayedBullet vfact @@ -60,6 +64,7 @@ useAmmoParams vfact it cr w = w & instantBullets .:~ aBulAt thetraj (_amBulEffect bultype) (_amBulSpawn bultype) + (_amBulDams bultype) where sp = _crPos cr +.+ (muzlength + 10) *.* unitVectorAtAngle dir dir = _crDir cr @@ -87,15 +92,21 @@ useAmmoParams vfact it cr w = w & instantBullets .:~ aBulAt mvBullet :: World -> Bullet -> (World, Maybe Bullet) mvBullet w bt' | t <= 0 || magV (_buVel bt) < 1 = (w,Nothing) - | otherwise = bimap maybebounce (fmap dodrag) $ + | otherwise = bimap (maybespawn . maybebounce) (fmap dodrag) $ hiteff bt hitstream w where + maybespawn w' = fromMaybe w' $ do + (hp,_) <- runIdentity (S.head_ hitstream) + partspawn <- bulletSpawn bt' + let (thepart,g) = runState (partspawn hp) $ _randGen w' + return $ w' & instantParticles .:~ thepart + & randGen .~ g maybebounce = case _buEffect bt' of BounceBullet -> case runIdentity (S.head_ hitstream) of Just (hp, Left cr) | crIsArmouredFrom hp cr -> instantBullets .:~ bouncer where bouncer = (aBulAt Nothing pOut reflectVel (_buDrag bt) (_buWidth bt) - BasicBulletTrajectory (_buEffect bt) (_buSpawn bt) + BasicBulletTrajectory (_buEffect bt) (_buSpawn bt) (_buDamages bt) ) {_buTimer = _buTimer bt - 1} pOut = hp +.+ 2 *.* newDir reflectVel = magV bulVel *.* newDir @@ -106,7 +117,7 @@ mvBullet w bt' reflectVel = reflVelWall wl (_buVel bt) thebouncer = aBulAt Nothing --id pOut reflectVel (_buDrag bt) (_buWidth bt) BasicBulletTrajectory (_buEffect bt) - (_buSpawn bt) + (_buSpawn bt) (_buDamages bt) & buTimer .~ _buTimer bt - 1 pOut = hp +.+ squashNormalizeV (p -.- hp) _ -> id @@ -125,31 +136,23 @@ mvBullet w bt' vel = _buVel bt hiteff = hitEffFromBul t = _buTimer bt - --BounceBullet bt -> w & instantBullets .:~ thebouncer - -- where - -- reflectVel = reflVelWall wl (_buVel bt) - -- thebouncer = aBulAt Nothing --id - -- pOut reflectVel (_buDrag bt) (_buHitEff bt) (_buWidth bt) BasicBulletTrajectory - -- & buTimer .~ _buTimer bt - 1 - -- pOut = p +.+ squashNormalizeV (sp -.- p) - -- p = _dmAt dm - -- sp = _dmFrom dm --- BounceBullet bt | crIsArmouredFrom p cr -> w & instantBullets .:~ bouncer --- where --- bouncer = (aBulAt Nothing pOut reflectVel (_buDrag bt) (_buHitEff bt) (_buWidth bt) --- BasicBulletTrajectory --- ) {_buTimer = _buTimer bt - 1} --- pOut = p +.+ 2 *.* newDir --- reflectVel = magV bulVel *.* newDir --- newDir = squashNormalizeV (p -.- _crPos cr) --- bulVel = _buVel bt --- BounceBullet _ -> w + +bulletSpawn :: Bullet -> Maybe (Point2 -> State StdGen Particle) +bulletSpawn bu = case _buSpawn bu of + BulSpark -> Nothing + BulBall IncBall -> Just incBall + BulBall ConcBall -> Just concBall + BulBall TeslaBall -> Just aStaticBall hitEffFromBul :: Bullet -> Stream (Of (Point2, Either Creature Wall)) Identity () -> World -> (World,Maybe Bullet) -hitEffFromBul = expireAndDamage' basicBulDams +hitEffFromBul = expireAndDamage' setfromtodams + where + setfromtodams bu p = map f (_buDamages bu) + where + f = (dmFrom .~ _buPos bu) . (dmAt .~ p) . (dmTo .~ _buPos bu +.+ _buVel bu) mvBulletSlow :: Float -> World -> Bullet -> (World, Maybe Bullet) mvBulletSlow x w bt' diff --git a/src/Dodge/Combine/Module.hs b/src/Dodge/Combine/Module.hs index 830e44809..425500348 100644 --- a/src/Dodge/Combine/Module.hs +++ b/src/Dodge/Combine/Module.hs @@ -1,8 +1,6 @@ module Dodge.Combine.Module where import Dodge.Data import Dodge.Tesla -import Dodge.WorldEvent.SpawnParticle -import Dodge.Particle.Damage import Dodge.Item.Weapon.ExtraEffect import Dodge.Item.Weapon.Launcher import Dodge.Item.Weapon.TriggerType @@ -19,10 +17,10 @@ moduleModification imt = case imt of DRUMMAG -> itConsumption . laMax .~ 45 BELTMAG -> itConsumption . laMax .~ 150 MAGNETMAG -> itUse . useDelay . rateMax .~ 4 - INCENDBUL -> f $ spawnAtBulDams incBall + INCENDBUL -> itConsumption . laAmmoType . amBulSpawn .~ BulBall IncBall BOUNCEBUL -> itConsumption . laAmmoType . amBulEffect .~ BounceBullet - STATICBUL -> f $ spawnAtBulDams aStaticBall - CONCUSBUL -> f $ spawnAtBulDams concBall + STATICBUL -> itConsumption . laAmmoType . amBulSpawn .~ BulBall TeslaBall + CONCUSBUL -> itConsumption . laAmmoType . amBulSpawn .~ BulBall ConcBall TARGCR -> itTargeting .~ targetRBCreature TARGLAS -> itTargeting .~ targetLaser TARGPOS -> itTargeting .~ targetRBPress @@ -39,7 +37,6 @@ moduleModification imt = case imt of EXTRABATTERY -> itConsumption . laMax +~ 1000 ATTACHTORCH -> id where - f ameff = itConsumption . laAmmoType . amBulDams .~ ameff makeDirectedTele it = it & itTargeting .~ targetRBPress & itUse . useMods .:~ withPosDirWallCheck directedTelPos diff --git a/src/Dodge/Creature.hs b/src/Dodge/Creature.hs index 5ef56c052..e7dc927e0 100644 --- a/src/Dodge/Creature.hs +++ b/src/Dodge/Creature.hs @@ -238,6 +238,8 @@ inventoryX c = case c of , makeTypeCraftNum 1 HEATSENSOR , makeTypeCraftNum 1 BOUNCEMODULE , makeTypeCraftNum 1 INCENDIARYMODULE + , makeTypeCraftNum 1 CONCUSSMODULE + , makeTypeCraftNum 1 STATICMODULE ] _ -> [] diff --git a/src/Dodge/Creature/Damage.hs b/src/Dodge/Creature/Damage.hs index 34d826436..c2810568c 100644 --- a/src/Dodge/Creature/Damage.hs +++ b/src/Dodge/Creature/Damage.hs @@ -7,8 +7,6 @@ import Color import Geometry import LensHelp -import Control.Monad.State ---import System.Random import Data.List applyNoDamage :: [Damage] -> Creature -> World -> World @@ -39,17 +37,13 @@ applyDamageEffect dm de cr w = case de of | dist (_crPos cr) fromDir == 0 = 0 | otherwise = min 5 $ (push*5*pushRad / (dist (_crPos cr) fromDir * _crMass cr))**pushexp PushBackDamage pback -> w - & creatures . ix (_crID cr) . crPos .+.+~ (1/_crMass cr) *.* pback + & creatures . ix (_crID cr) . crPos .+.+~ (pback/_crMass cr) *.* (_dmTo dm -.- fromDir) TorqueDamage rot -> w & creatures . ix (_crID cr) . crDir +~ rot - DamageSpawn f -> w & instantParticles .:~ thepart - & randGen .~ g - where - (thepart,g) = runState (f (Left cr) dm) $ _randGen w - DamageSpawn' f -> w & instantBullets .:~ thepart - & randGen .~ g - where - (thepart,g) = runState (f (Left cr) dm) $ _randGen w +-- DamageSpawn f -> w & instantParticles .:~ thepart +-- & randGen .~ g +-- where +-- (thepart,g) = runState (f (Left cr) dm) $ _randGen w NoDamageEffect -> w where fromDir = _dmFrom dm diff --git a/src/Dodge/Creature/Inanimate.hs b/src/Dodge/Creature/Inanimate.hs index e2840c8b2..18eeb4cb3 100644 --- a/src/Dodge/Creature/Inanimate.hs +++ b/src/Dodge/Creature/Inanimate.hs @@ -96,7 +96,7 @@ damToExpBarrel' dm cr = case _dmType dm of $ cr & crHP -~ div amount 200 POISONDAM -> cr SPARKING -> cr - PUSHDAM -> cr LensHelp.& crPos .+.+~ (1 / _crMass cr *.* _dePushBack (_dmEffect dm)) +-- PUSHDAM -> cr LensHelp.& crPos .+.+~ (1 / _crMass cr *.* _dePushBack (_dmEffect dm)) _ -> cr LensHelp.& crHP -~ amount where amount = _dmAmount dm diff --git a/src/Dodge/Data.hs b/src/Dodge/Data.hs index 3d019d9cd..7fda4d516 100644 --- a/src/Dodge/Data.hs +++ b/src/Dodge/Data.hs @@ -10,6 +10,7 @@ circular imports are probably not a good idea. {-# LANGUAGE DerivingStrategies #-} module Dodge.Data ( module Dodge.Data + , module Dodge.Data.Bullet , module Dodge.Data.Door , module Dodge.Data.Item , module Dodge.Data.HUD @@ -46,6 +47,7 @@ module Dodge.Data , module Dodge.Data.RadarBlip , module Dodge.Data.PathGraph ) where +import Dodge.Data.Bullet import Dodge.Data.Door import Dodge.Data.Item import Dodge.Data.HUD @@ -524,34 +526,6 @@ data BeamType {_beamCombine :: (Point2 , (Point2,Point2,Beam) , (Point2,Point2,Beam)) -> World -> World} | BeamSimple -data BulletState = NormalBulletState - | DyingBulletState - | DelayedBullet Float -data BulletUpdateMod = NoBulletUpdateMod - -data BulletEffect = DestroyBullet - | BounceBullet - | PenetrateBullet -data BulletSpawn = BulBall EnergyBall | BulSpark - -data Bullet = Bullet - { _buState :: BulletState - , _buEffect :: BulletEffect - , _buSpawn :: BulletSpawn - , _buUpdateMod :: BulletUpdateMod - , _buTrajectory :: BulletTrajectory - , _buVel :: Point2 - , _buDrag :: Float - , _buPos :: Point2 - , _buOldPos :: Point2 - , _buWidth :: Float - , _buTimer :: Int --- , _buEffect :: BulletEffect --- , _buHitEff :: HitEffect' - } - -data EnergyBall = IncBall | TeslaBall | ConcBall - {- Objects without ids. Update themselves, perhaps with side effects. -} data Particle @@ -655,17 +629,6 @@ type HitEffect = Particle -> World -> (World,Maybe Particle) ---type HitEffect' = Bullet --- -> Stream (Of (Point2, Either Creature Wall)) Identity () --- -> World --- -> (World,Maybe Bullet) - -data BulletTrajectory - = BasicBulletTrajectory - | BezierTrajectory Point2 Point2 Point2 - | FlechetteTrajectory Point2 - | MagnetTrajectory Point2 - data AmmoType = ProjectileAmmo { _amPayload :: Point2 -> World -> World @@ -677,7 +640,7 @@ data AmmoType | BulletAmmo { _amString :: String -- , _amBulEff :: HitEffect' - , _amBulDams :: Bullet -> Point2 -> [Damage] + , _amBulDams :: [Damage] , _amBulWth :: Float , _amBulVel :: Point2 , _amBulTraj :: BulletTrajectory @@ -1260,39 +1223,6 @@ data Goal | SentinelAt Point2 Float deriving (Show) -data DamageEffect - = PushDamage - { _dePush :: Float - , _dePushExp :: Float - , _dePushRadius :: Float - } - | TorqueDamage { _deTorque :: Float } - | PushBackDamage {_dePushBack :: Point2 } - | DamageSpawn {_spawnFunc - :: Either Creature Wall -> Damage -> State StdGen Particle} - | DamageSpawn' {_spawnFunc' - :: Either Creature Wall -> Damage -> State StdGen Bullet} - | NoDamageEffect --- deriving (Eq,Ord,Show) - -data Damage = Damage - { _dmType :: DamageType - , _dmAmount :: Int , _dmFrom :: Point2 , _dmAt :: Point2 , _dmTo :: Point2 - , _dmEffect :: DamageEffect - } --- deriving (Eq,Ord,Show) - -isElectrical :: Damage -> Bool -isElectrical dm = case _dmType dm of - ELECTRICAL -> True - _ -> False - -isMovementDam :: Damage -> Bool -isMovementDam dm = case _dmType dm of - TORQUEDAM -> True - PUSHDAM -> True - _ -> False - data CreatureState = CrSt { _csDamage :: [Damage] , _csSpState :: CrSpState @@ -1413,8 +1343,6 @@ data InPlacement = InPlacement } makeLenses ''CreatureState -makeLenses ''Damage -makeLenses ''DamageEffect makeLenses ''World makeLenses ''Creature makeLenses ''Item @@ -1427,7 +1355,6 @@ makeLenses ''TweakParam makeLenses ''Prop makeLenses ''Modification makeLenses ''Particle -makeLenses ''Bullet makeLenses ''PressPlate makeLenses ''Button makeLenses ''ActionPlan diff --git a/src/Dodge/Data/Bullet.hs b/src/Dodge/Data/Bullet.hs new file mode 100644 index 000000000..f68001bbc --- /dev/null +++ b/src/Dodge/Data/Bullet.hs @@ -0,0 +1,38 @@ +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE StrictData #-} +module Dodge.Data.Bullet where +import Dodge.Data.DamageType +import Geometry.Data +import Control.Lens +data Bullet = Bullet + { _buState :: BulletState + , _buEffect :: BulletEffect + , _buSpawn :: BulletSpawn + , _buUpdateMod :: BulletUpdateMod + , _buTrajectory :: BulletTrajectory + , _buVel :: Point2 + , _buDrag :: Float + , _buPos :: Point2 + , _buOldPos :: Point2 + , _buWidth :: Float + , _buTimer :: Int + , _buDamages :: [Damage] + } +data EnergyBall = IncBall | TeslaBall | ConcBall +data BulletState = NormalBulletState + | DyingBulletState + | DelayedBullet Float +data BulletUpdateMod = NoBulletUpdateMod + +data BulletEffect = DestroyBullet + | BounceBullet + | PenetrateBullet +data BulletSpawn = BulBall EnergyBall | BulSpark + +data BulletTrajectory + = BasicBulletTrajectory + | BezierTrajectory Point2 Point2 Point2 + | FlechetteTrajectory Point2 + | MagnetTrajectory Point2 + +makeLenses ''Bullet diff --git a/src/Dodge/Data/DamageType.hs b/src/Dodge/Data/DamageType.hs index f34c14b89..75c4d374c 100644 --- a/src/Dodge/Data/DamageType.hs +++ b/src/Dodge/Data/DamageType.hs @@ -1,9 +1,12 @@ +{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE StrictData #-} {- Datatypes describing the type of damage effects that are to be applied to creatures. -} module Dodge.Data.DamageType where +import Geometry.Data +import Control.Lens data DamageType = PIERCING | BLUNT @@ -21,3 +24,33 @@ data DamageType | POISONDAM | ENTERREMENT deriving (Eq,Ord,Show,Read) +data DamageEffect + = PushDamage + { _dePush :: Float + , _dePushExp :: Float + , _dePushRadius :: Float + } + | TorqueDamage { _deTorque :: Float } + | PushBackDamage {_dePushBack :: Float } + | NoDamageEffect + deriving (Eq,Ord,Show) + +data Damage = Damage + { _dmType :: DamageType + , _dmAmount :: Int , _dmFrom :: Point2 , _dmAt :: Point2 , _dmTo :: Point2 + , _dmEffect :: DamageEffect + } + deriving (Eq,Ord,Show) + +isElectrical :: Damage -> Bool +isElectrical dm = case _dmType dm of + ELECTRICAL -> True + _ -> False + +isMovementDam :: Damage -> Bool +isMovementDam dm = case _dmType dm of + TORQUEDAM -> True + PUSHDAM -> True + _ -> False +makeLenses ''Damage +makeLenses ''DamageEffect diff --git a/src/Dodge/Particle/Damage.hs b/src/Dodge/Particle/Damage.hs index 6846b1ee7..617148dfe 100644 --- a/src/Dodge/Particle/Damage.hs +++ b/src/Dodge/Particle/Damage.hs @@ -1,22 +1,6 @@ module Dodge.Particle.Damage where import Dodge.Data import Geometry ---import LensHelp - -import System.Random -import Control.Monad.State - --- TODO unify particle position in a sensible manner -spawnAtBulDams :: (Point2 -> State StdGen Particle) - -> Bullet -> Point2 -> [Damage] -spawnAtBulDams thespawn bt p = - [ Damage PIERCING 50 sp p ep (DamageSpawn $ \_ dm -> thespawn (_dmAt dm)) - , Damage PUSHDAM 1 sp p ep . PushBackDamage $ 2 *.* bulVel - ] - where - sp = _buPos bt - bulVel = _buVel bt - ep = sp +.+ bulVel simpleDam :: DamageType -> Int -> Particle -> Point2 -> [Damage] simpleDam dt amount bt p = [ Damage dt amount sp p ep NoDamageEffect ] @@ -31,25 +15,17 @@ simpleDam' dt amount bt p = [ Damage dt amount sp p ep NoDamageEffect ] bulVel = _buVel bt ep = sp +.+ bulVel -heavyBulDams :: Bullet -> Point2 -> [Damage] -heavyBulDams bt p = - [ Damage PIERCING 300 sp p ep NoDamageEffect - , Damage PUSHDAM 1 sp p ep . PushBackDamage $ 2 *.* bulVel +heavyBulDams :: [Damage] +heavyBulDams = + [ Damage PIERCING 300 0 0 0 NoDamageEffect + , Damage PUSHDAM 1 0 0 0 $ PushBackDamage 2 ] - where - sp = _buPos bt - bulVel = _buVel bt - ep = sp +.+ bulVel -basicBulDams :: Bullet -> Point2 -> [Damage] -basicBulDams bt p = - [ Damage PIERCING 100 sp p ep NoDamageEffect - , Damage PUSHDAM 1 sp p ep . PushBackDamage $ 2 *.* bulVel +basicBulDams :: [Damage] +basicBulDams = + [ Damage PIERCING 100 0 0 0 NoDamageEffect + , Damage PUSHDAM 1 0 0 0 . PushBackDamage $ 2 ] - where - sp = _buPos bt - bulVel = _buVel bt - ep = sp +.+ bulVel basicSparkDams :: Particle -> Point2 -> [Damage] basicSparkDams bt p = [ Damage SPARKING 1 sp p ep NoDamageEffect ] @@ -58,18 +34,14 @@ basicSparkDams bt p = [ Damage SPARKING 1 sp p ep NoDamageEffect ] bulVel = _ptVel bt ep = sp +.+ bulVel -hvBulDams :: Bullet -> Point2 -> [Damage] -hvBulDams bt p = - [ Damage PIERCING 25 sp p ep NoDamageEffect - , Damage PIERCING 25 sp p ep NoDamageEffect - , Damage PIERCING 25 sp p ep NoDamageEffect - , Damage PIERCING 25 sp p ep NoDamageEffect - , Damage PIERCING 25 sp p ep NoDamageEffect - , Damage PIERCING 25 sp p ep NoDamageEffect - , Damage TORQUEDAM 1 sp p ep $ TorqueDamage 0.7 - , Damage PUSHDAM 1 sp p ep . PushBackDamage $ 3 *.* (ep -.- sp) +hvBulDams :: [Damage] +hvBulDams = + [ Damage PIERCING 25 0 0 0 NoDamageEffect + , Damage PIERCING 25 0 0 0 NoDamageEffect + , Damage PIERCING 25 0 0 0 NoDamageEffect + , Damage PIERCING 25 0 0 0 NoDamageEffect + , Damage PIERCING 25 0 0 0 NoDamageEffect + , Damage PIERCING 25 0 0 0 NoDamageEffect + , Damage TORQUEDAM 1 0 0 0 $ TorqueDamage 0.7 + , Damage PUSHDAM 1 0 0 0 $ PushBackDamage 3 ] - where - sp = _buPos bt - bulVel = _buVel bt - ep = sp +.+ bulVel diff --git a/src/Dodge/Wall/DamageEffect.hs b/src/Dodge/Wall/DamageEffect.hs index 450cbb4e9..46f8369f9 100644 --- a/src/Dodge/Wall/DamageEffect.hs +++ b/src/Dodge/Wall/DamageEffect.hs @@ -7,11 +7,8 @@ import Dodge.Block import Geometry import LensHelp -import Control.Monad.State ---import Data.Maybe - defaultWallDamage :: Damage -> Wall -> World -> (World,Int) -defaultWallDamage dm wl = flip (.) (wallDamageEffect dm wl) $ case _wlMaterial wl of +defaultWallDamage dm wl = case _wlMaterial wl of Stone -> stoneWallDamage dm wl Glass -> windowWallDamage dm wl Dirt -> dirtWallDamage dm wl @@ -128,11 +125,3 @@ dirtWallDamage dm wl = case _dmType dm of sp = _dmFrom dm p = _dmAt dm outTo = p +.+ squashNormalizeV (sp -.- p) - -wallDamageEffect :: Damage -> Wall -> World -> World -wallDamageEffect dm wl w = case _dmEffect dm of - DamageSpawn f -> w & instantParticles .:~ thepart - & randGen .~ g - where - (thepart,g) = runState (f (Right wl) dm) $ _randGen w - _ -> w diff --git a/src/Dodge/WorldEvent/Shockwave.hs b/src/Dodge/WorldEvent/Shockwave.hs index af3d56ecf..ac57bf71a 100644 --- a/src/Dodge/WorldEvent/Shockwave.hs +++ b/src/Dodge/WorldEvent/Shockwave.hs @@ -74,10 +74,11 @@ mvShockwave is w pt damCr cr | _crID cr `elem` is || dist (_crPos cr) p >= rad + _crRad cr = cr | otherwise = cr & crState . csDamage .:~ - Damage PUSHDAM dam cpos cpos cpos - (PushBackDamage (25 * push *.* squashNormalizeV (_crPos cr -.- p))) + Damage PUSHDAM dam (cpos -.- v) cpos (cpos +.+ v) + (PushBackDamage (25 * push)) where cpos = _crPos cr + v = normalizeV (cpos -.- p) {- Create a shockwave going from an outside circle into a center point. -} inverseShockwaveAt :: Point2 -- Center position @@ -113,7 +114,8 @@ moveInverseShockwave w pt damCr cr | dist (_crPos cr) p >= rad + _crRad cr = cr | otherwise = cr & crState . csDamage .:~ - Damage PUSHDAM 1 cpos cpos cpos (PushBackDamage $ 25 *.* squashNormalizeV (p -.- cpos)) + Damage PUSHDAM 1 (cpos +.+ v) cpos (cpos -.- v) (PushBackDamage 25) where cpos = _crPos cr + v = normalizeV (cpos -.- p)