43 lines
1.4 KiB
Haskell
43 lines
1.4 KiB
Haskell
{- | Controls a walls response to external damage.
|
|
- Indestructible walls may still produce sparks, dust etc
|
|
-}
|
|
module Dodge.Wall.Damage (
|
|
damageBlocksBy,
|
|
damageWall,
|
|
) where
|
|
|
|
import Dodge.Block
|
|
import Dodge.Data.World
|
|
import Dodge.Wall.DamageEffect
|
|
import LensHelp
|
|
|
|
damageWall :: Damage -> Wall -> World -> World
|
|
damageWall dt wl w = case _wlStructure wl of
|
|
MachinePart mcid ->
|
|
fst . defaultWallDamage dt wl $
|
|
w
|
|
& cWorld . machines . ix mcid . mcDamage .:~ dt
|
|
BlockPart blid ->
|
|
let (w', x) = defaultWallDamage dt wl w
|
|
in w' & cWorld . blocks . ix blid . blHP -~ x & maybeDestroyBlock blid
|
|
DoorPart drid ->
|
|
let (w', x) = defaultWallDamage dt wl w
|
|
in w' & cWorld . doors . ix drid . drHP -~ x & maybeDestroyDoor drid
|
|
_ -> fst $ defaultWallDamage dt wl w
|
|
|
|
-- block destruction is convoluted...
|
|
maybeDestroyBlock :: Int -> World -> World
|
|
maybeDestroyBlock blid w = case w ^? cWorld . blocks . ix blid of
|
|
Just bl | _blHP bl < 1 -> destroyBlock bl w
|
|
_ -> w
|
|
|
|
maybeDestroyDoor :: Int -> World -> World
|
|
maybeDestroyDoor drid w = case w ^? cWorld . doors . ix drid of
|
|
Just dr | _drHP dr < 1 -> destroyDoor dr w
|
|
_ -> w
|
|
|
|
damageBlocksBy :: Int -> Wall -> World -> World
|
|
damageBlocksBy x wl = case wl ^? wlStructure . wsBlock of
|
|
Just blid -> cWorld . blocks . ix blid . blHP -~ x
|
|
Nothing -> id
|