Control wall damage effects using the wall

This commit is contained in:
2021-11-01 16:50:09 +00:00
parent 7ddbbdda14
commit e4c73b9b8b
7 changed files with 93 additions and 57 deletions
+5 -5
View File
@@ -218,15 +218,15 @@ defaultMachine = Machine
, _mcDraw = const mempty , _mcDraw = const mempty
, _mcPos = V2 0 0 , _mcPos = V2 0 0
, _mcDir = 0 , _mcDir = 0
, _mcHP = 100 , _mcHP = 1000
, _mcSensor = 0 , _mcSensor = 0
, _mcDamage = [] , _mcDamage = []
} }
defaultMachineUpdate :: Machine -> World -> World defaultMachineUpdate :: Machine -> World -> World
defaultMachineUpdate mc w defaultMachineUpdate mc
| _mcHP mc < 1 = w & machines %~ IM.delete mcid | _mcHP mc < 1 = (machines %~ IM.delete mcid)
& deleteWallIDs (_mcWallIDs mc) . deleteWallIDs (_mcWallIDs mc)
| otherwise = w & machines . ix mcid %~ ( (mcDamage .~ []) . (mcHP -~ dams) ) | otherwise = machines . ix mcid %~ ( (mcDamage .~ []) . (mcHP -~ dams) )
where where
dams = sum $ map _dmAmount $ _mcDamage mc dams = sum $ map _dmAmount $ _mcDamage mc
mcid = _mcID mc mcid = _mcID mc
+2 -5
View File
@@ -9,7 +9,7 @@ import Dodge.SoundLogic.LoadSound
import Dodge.Creature.State.Data import Dodge.Creature.State.Data
import Dodge.Data.DamageType import Dodge.Data.DamageType
import Dodge.WorldEvent import Dodge.WorldEvent
import Dodge.WorldEvent.DamageBlock import Dodge.Wall.Damage
import Dodge.Default import Dodge.Default
import Dodge.Item.Draw import Dodge.Item.Draw
import Dodge.Item.Data import Dodge.Item.Data
@@ -186,7 +186,6 @@ moveLaser phaseV pos dir w pt
) )
where where
xp = pos +.+ 800 *.* unitVectorAtAngle dir xp = pos +.+ 800 *.* unitVectorAtAngle dir
reflectDir wall = argV (reflectIn (uncurry (-.-) (_wlLine wall)) (xp -.- pos))
f :: [Wall] -> Point2 -> Point2 -> (Maybe (Point2,Either Creature Wall),[Point2]) f :: [Wall] -> Point2 -> Point2 -> (Maybe (Point2,Either Creature Wall),[Point2])
f seenWs x y = case find (h' seenWs) $ thingsHitExceptCrLongLine Nothing x y w of f seenWs x y = case find (h' seenWs) $ thingsHitExceptCrLongLine Nothing x y w of
Just (p,Right wl) Just (p,Right wl)
@@ -225,9 +224,7 @@ moveLaser phaseV pos dir w pt
hitEffect = case thHit of hitEffect = case thHit of
Just (p,Left cr) Just (p,Left cr)
-> creatures . ix (_crID cr) . crState . crDamage %~ (Lasering 19 pos p xp :) -> creatures . ix (_crID cr) . crState . crDamage %~ (Lasering 19 pos p xp :)
Just (p,Right wl) -> colSpark 8 (V4 20 (-5) 0 1) (p +.+ safeNormalizeV (pos -.- p)) Just (p,Right wl) -> damageWall (Lasering 19 pos p xp) wl
(reflectDir wl)
. damageWall (Lasering 19 pos p xp) wl
_ -> id _ -> id
pic = setLayer 1 $ pictures pic = setLayer 1 $ pictures
[ setDepth 19 . color (brightX 0 0.5 yellow) $ lineOfThickness 20 (pos:ps) [ setDepth 19 . color (brightX 0 0.5 yellow) $ lineOfThickness 20 (pos:ps)
+11 -16
View File
@@ -6,7 +6,7 @@ module Dodge.Particle.Bullet.HitEffect
import Dodge.Data import Dodge.Data
import Dodge.Data.DamageType import Dodge.Data.DamageType
import Dodge.Data.SoundOrigin import Dodge.Data.SoundOrigin
import Dodge.WorldEvent.DamageBlock import Dodge.Wall.Damage
import Dodge.WorldEvent import Dodge.WorldEvent
import Dodge.Particle.Bullet.Spawn import Dodge.Particle.Bullet.Spawn
import Dodge.SoundLogic import Dodge.SoundLogic
@@ -16,7 +16,7 @@ import Dodge.WorldEvent.Shockwave
import Dodge.Creature.State.Data import Dodge.Creature.State.Data
import Dodge.Creature.Property import Dodge.Creature.Property
import Geometry import Geometry
import Geometry.Vector3D --import Geometry.Vector3D
import Picture import Picture
import System.Random import System.Random
@@ -132,24 +132,18 @@ bulConCr' bt p cr w
mkwave = over worldEvents $ (.) (makeShockwaveAt [] p 15 4 1 white) mkwave = over worldEvents $ (.) (makeShockwaveAt [] p 15 4 1 white)
{- | Hitting wall effects: create a spark, damage blocks. -} {- | Hitting wall effects: create a spark, damage blocks. -}
bulHitWall :: Particle -> Point2 -> Wall -> World -> World bulHitWall :: Particle -> Point2 -> Wall -> World -> World
bulHitWall bt p wl w = damageBlocksBy 5 wl bulHitWall bt p = damageWall (Piercing 100 sp p ep)
. smokeCloudAt dustcol 20 200 1 (addZ 20 pOut)
$ colSpark' 0.2 8 theCol pOut (reflectDir wl)
w
where where
dustcol = _wlColor wl & _4 .~ 1 ep = sp +.+ _btVel' bt
theCol = brightX 100 1.5 white
sp = head $ _btTrail' bt sp = head $ _btTrail' bt
pOut = p +.+ safeNormalizeV (sp -.- p)
reflectDir wall = argV (reflectIn (uncurry (-.-) (_wlLine wall)) (p -.- sp) )
{- | Bounce off walls, do damage to blocks. -} {- | Bounce off walls, do damage to blocks. -}
bulBounceWall' :: Particle -> Point2 -> Wall -> World -> World bulBounceWall :: Particle -> Point2 -> Wall -> World -> World
bulBounceWall' bt p wl w = damageBlocksBy 5 wl $ over worldEvents addBouncer w bulBounceWall bt p wl = damageWall (Blunt 50 sp p ep) wl . over worldEvents addBouncer
where where
ep = sp +.+ _btVel' bt
sp = head $ _btTrail' bt sp = head $ _btTrail' bt
pOut = p +.+ safeNormalizeV (sp -.- p) pOut = p +.+ safeNormalizeV (sp -.- p)
bouncer = (aGenBulAt Nothing pOut reflectVel bouncer = (aGenBulAt Nothing pOut reflectVel (_btHitEffect' bt) (_btWidth' bt)
(_btHitEffect' bt) (_btWidth' bt)
) {_btTimer' = _btTimer' bt - 1} ) {_btTimer' = _btTimer' bt - 1}
wallV = uncurry (-.-) (_wlLine wl) wallV = uncurry (-.-) (_wlLine wl)
reflectVel = reflectIn wallV (_btVel' bt) reflectVel = reflectIn wallV (_btVel' bt)
@@ -159,14 +153,15 @@ bulBounceWall' bt p wl w = damageBlocksBy 5 wl $ over worldEvents addBouncer w
-- this list -- this list
{- | Create flamelet on wall. -} {- | Create flamelet on wall. -}
bulIncWall' bulIncWall
:: Particle :: Particle
-> Point2 -- Impact point -> Point2 -- Impact point
-> Wall -> Wall
-> World -> World
-> World -> World
bulIncWall' bt p wl w = damageBlocksBy 5 wl $ incFlamelets w bulIncWall bt p wl = damageWall (Blunt 50 sp p ep) wl . incFlamelets
where where
ep = sp +.+ _btVel' bt
sp = head $ _btTrail' bt sp = head $ _btTrail' bt
pOut = p +.+ safeNormalizeV (sp -.- p) pOut = p +.+ safeNormalizeV (sp -.- p)
wallV = uncurry (-.-) (_wlLine wl) wallV = uncurry (-.-) (_wlLine wl)
+3 -5
View File
@@ -89,11 +89,10 @@ splinterBlock bl w = foldr unshadowBlock w (_blShadows bl) -- foldr shiftTowardC
& blocks . ix (_blID bl) . blHPs %~ tail & blocks . ix (_blID bl) . blHPs %~ tail
& theSoundEffect cen & theSoundEffect cen
where where
wls = map (_walls w IM.!) (IS.toList $ _blWallIDs bl) wls = IM.restrictKeys (_walls w) (_blWallIDs bl)
ps = map (fst . _wlLine) wls cen = centroid $ fmap (fst . _wlLine) wls
cen = centroid ps
theSoundEffect theSoundEffect
| _wlOpacity (head wls) == SeeThrough = mkSoundSplinterGlass | _wlOpacity (snd $ IM.findMin wls) == SeeThrough = mkSoundSplinterGlass
| otherwise = mkSoundSplinterBlock | otherwise = mkSoundSplinterBlock
unshadowBlock :: Int -> World -> World unshadowBlock :: Int -> World -> World
@@ -121,7 +120,6 @@ destroyBlock bl w = w
where where
wlids = _blWallIDs bl wlids = _blWallIDs bl
pos = fst . _wlLine $ _walls w IM.! IS.findMin wlids pos = fst . _wlLine $ _walls w IM.! IS.findMin wlids
-- | Note the explict use of record syntax. Using lens created a space leak. -- | Note the explict use of record syntax. Using lens created a space leak.
resetWorldEvents :: World -> World resetWorldEvents :: World -> World
resetWorldEvents w = w {_worldEvents = id} resetWorldEvents w = w {_worldEvents = id}
+71
View File
@@ -0,0 +1,71 @@
{- | Controls a walls response to external damage.
- Indestructible walls may still produce sparks, dust etc
-}
module Dodge.Wall.Damage
( damageBlocksBy
, damageWall
) where
import Dodge.Data
import Dodge.Data.DamageType
import Dodge.WorldEvent.SpawnParticle
import Dodge.WorldEvent.Cloud
import Geometry
import Geometry.Vector3D
import Color
import Control.Lens
damageWall :: DamageType -> Wall -> World -> World
damageWall dt wl = case _wlStructure wl of
MachinePart mcid -> machines . ix mcid . mcDamage %~ (dt :)
BlockPart blid -> wallEff dt wl . (blocks . ix blid %~ damageBlockWith dt)
_ -> wallEff dt wl
{- | Damage effects on indestructible walls -}
-- TODO take into account damage amount for amount of dust/sparks?
wallEff :: DamageType -> Wall -> World -> World
wallEff dt wl = case dt of
Lasering _ sp p _ -> colSpark 8 lSparkCol (outTo sp p) (reflDirWall sp p wl)
Piercing _ sp p _ -> colSpark' 0.2 8 pSparkCol (outTo sp p) (reflDirWall sp p wl)
. smokeCloudAt dustcol 20 200 1 (addZ 20 (outTo sp p))
Blunt _ sp p _ -> smokeCloudAt dustcol 20 200 1 (addZ 20 (outTo sp p))
Cutting {} -> id
SparkDam {} -> id
Flaming {} -> id
Electrical {} -> id
Concussive {} -> id
TorqueDam {} -> id
PushDam {} -> id
PoisonDam {} -> id
where
outTo sp p = p +.+ safeNormalizeV (sp -.- p)
dustcol = _wlColor wl & _4 .~ 1
pSparkCol = brightX 100 1.5 white
lSparkCol = V4 20 (-5) 0 1
reflDirWall :: Point2 -> Point2 -> Wall -> Float
reflDirWall sp ep wl = argV (reflectIn (uncurry (-.-) (_wlLine wl)) (ep -.- sp))
damageBlockWith :: DamageType -> Block -> Block
damageBlockWith dt = case dt of
Piercing dam _ _ _ -> blHPs %~ reduceHead dam
Blunt dam _ _ _ -> blHPs %~ reduceHead dam
Cutting dam _ _ _ -> blHPs %~ reduceHead dam
Concussive dam _ _ _ _ -> blHPs %~ reduceHead dam
Lasering {} -> id
SparkDam {} -> id
Flaming {} -> id
Electrical {} -> id
TorqueDam {} -> id
PushDam {} -> id
PoisonDam {} -> id
reduceHead :: Int -> [Int] -> [Int]
reduceHead y (x:xs) = x-y:xs
reduceHead _ _ = []
damageBlocksBy :: Int -> Wall -> World -> World
damageBlocksBy x wl = case wl ^? wlStructure . wlStBlock of
Just blid -> blocks . ix blid . blHPs %~ reduceHeadBy x
Nothing -> id
where
reduceHeadBy y (z:zs) = z - y : zs
reduceHeadBy _ [] = []
-25
View File
@@ -1,25 +0,0 @@
module Dodge.WorldEvent.DamageBlock
( damageBlocksBy
, damageWall
) where
import Dodge.Data
import Dodge.Data.DamageType
import Control.Lens
damageWall :: DamageType -> Wall -> World -> World
damageWall dt wl = case _wlStructure wl of
MachinePart mcid -> machines . ix mcid . mcDamage %~ (dt :)
BlockPart blid -> blocks . ix blid %~ damageBlockWith dt
_ -> id
damageBlockWith :: DamageType -> Block -> Block
damageBlockWith _ = id
damageBlocksBy :: Int -> Wall -> World -> World
damageBlocksBy x wl = case wl ^? wlStructure . wlStBlock of
Just blid -> blocks . ix blid . blHPs %~ reduceHeadBy x
Nothing -> id
where
reduceHeadBy y (z:zs) = z - y : zs
reduceHeadBy _ [] = []
+1 -1
View File
@@ -6,7 +6,7 @@ module Dodge.WorldEvent.Shockwave
import Dodge.Data import Dodge.Data
import Dodge.Data.DamageType import Dodge.Data.DamageType
import Dodge.Creature.State.Data import Dodge.Creature.State.Data
import Dodge.WorldEvent.DamageBlock import Dodge.Wall.Damage
import Dodge.Base import Dodge.Base
import Dodge.Zone import Dodge.Zone
import Dodge.Picture.Layer import Dodge.Picture.Layer