Fix no damage to walls bug
This commit is contained in:
@@ -11,19 +11,16 @@ import Dodge.Data.World
|
||||
import Dodge.Wall.DamageEffect
|
||||
import LensHelp
|
||||
|
||||
-- maybeDestroyDoor should rather happen during the door mechanism update
|
||||
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
|
||||
MachinePart mcid -> w' & cWorld . machines . ix mcid . mcDamage .:~ dt
|
||||
BlockPart blid -> w' & cWorld . blocks . ix blid . blHP -~ x & maybeDestroyBlock blid
|
||||
DoorPart drid -> w' & cWorld . doors . ix drid . drHP -~ x & maybeDestroyDoor drid
|
||||
_ -> w'
|
||||
where
|
||||
x = dt' ^. dmAmount
|
||||
(w', dt') = damageWallEffect dt wl w
|
||||
|
||||
-- block destruction is convoluted...
|
||||
maybeDestroyBlock :: Int -> World -> World
|
||||
|
||||
@@ -8,10 +8,10 @@ import Dodge.Wall.Dust
|
||||
import Geometry
|
||||
import LensHelp
|
||||
|
||||
defaultWallDamage :: Damage -> Wall -> World -> (World, Int)
|
||||
defaultWallDamage dm wl = case _wlMaterial wl of
|
||||
damageWallEffect :: Damage -> Wall -> World -> (World, Damage)
|
||||
damageWallEffect dm wl = case _wlMaterial wl of
|
||||
Stone -> stoneWallDamage dm wl
|
||||
Glass -> windowWallDamage dm wl
|
||||
Glass -> glassWallDamage dm wl
|
||||
Dirt -> dirtWallDamage dm wl
|
||||
Crystal -> crystalWallDamage dm wl
|
||||
Metal -> stoneWallDamage dm wl
|
||||
@@ -19,7 +19,9 @@ defaultWallDamage dm wl = case _wlMaterial wl of
|
||||
Electronics -> stoneWallDamage dm wl
|
||||
Flesh -> stoneWallDamage dm wl
|
||||
|
||||
stoneWallDamage :: Damage -> Wall -> World -> (World, Int)
|
||||
-- there is quite a lot of duplication here, should be sorted out
|
||||
|
||||
stoneWallDamage :: Damage -> Wall -> World -> (World, Damage)
|
||||
stoneWallDamage dm wl = case _dmType dm of
|
||||
LASERING -> a 0 $ colSparkRandDir 0.2 lSparkCol outTo (reflDirWall sp p wl)
|
||||
PIERCING -> a d $ colSparkRandDir 0.2 pSparkCol outTo (reflDirWall sp p wl) . wlDustAt wl outTo
|
||||
@@ -37,7 +39,7 @@ stoneWallDamage dm wl = case _dmType dm of
|
||||
POISONDAM -> a 0 id
|
||||
ENTERREMENT -> a 0 id
|
||||
where
|
||||
a x f w = (f w, x)
|
||||
a x f w = (f w, dm & dmAmount .~ x)
|
||||
d = _dmAmount dm
|
||||
sp = _dmFrom dm
|
||||
p = _dmAt dm
|
||||
@@ -45,8 +47,8 @@ stoneWallDamage dm wl = case _dmType dm of
|
||||
pSparkCol = V4 5 1 0.5 2
|
||||
lSparkCol = V4 20 (-5) 0 1
|
||||
|
||||
windowWallDamage :: Damage -> Wall -> World -> (World, Int)
|
||||
windowWallDamage dm wl w =
|
||||
glassWallDamage :: Damage -> Wall -> World -> (World, Damage)
|
||||
glassWallDamage dm wl w =
|
||||
w & case _dmType dm of
|
||||
LASERING -> a 0 $ colSparkRandDir 0.2 lSparkCol outTo (reflDirWall sp p wl)
|
||||
PIERCING -> a d $ dosplint . colSparkRandDir 0.2 pSparkCol outTo (reflDirWall sp p wl) . wlDustAt wl outTo
|
||||
@@ -69,8 +71,8 @@ windowWallDamage dm wl w =
|
||||
w ^? cWorld . blocks . ix blid
|
||||
d :: Int
|
||||
d = max 1 $ maybe 1 (subtract 1 . _blHP) mbl
|
||||
a :: Int -> (World -> World) -> World -> (World, Int)
|
||||
a x f w' = (f w', x)
|
||||
a :: Int -> (World -> World) -> World -> (World, Damage)
|
||||
a x f w' = (f w', dm & dmAmount .~ x)
|
||||
dosplint = maybe id splinterBlock mbl
|
||||
sp = _dmFrom dm
|
||||
p = _dmAt dm
|
||||
@@ -78,7 +80,7 @@ windowWallDamage dm wl w =
|
||||
pSparkCol = V4 5 1 0.5 2
|
||||
lSparkCol = V4 20 (-5) 0 1
|
||||
|
||||
crystalWallDamage :: Damage -> Wall -> World -> (World, Int)
|
||||
crystalWallDamage :: Damage -> Wall -> World -> (World, Damage)
|
||||
crystalWallDamage dm wl = case _dmType dm of
|
||||
LASERING -> a 0 $ colSparkRandDir 0.2 lSparkCol outTo (reflDirWall sp p wl)
|
||||
PIERCING -> a 0 $ colSparkRandDir 0.2 pSparkCol outTo (reflDirWall sp p wl) . wlDustAt wl outTo
|
||||
@@ -96,7 +98,7 @@ crystalWallDamage dm wl = case _dmType dm of
|
||||
POISONDAM -> a 0 id
|
||||
ENTERREMENT -> a 0 id
|
||||
where
|
||||
a x f w = (f w, x)
|
||||
a x f w = (f w, dm & dmAmount .~ x)
|
||||
d = _dmAmount dm
|
||||
sp = _dmFrom dm
|
||||
p = _dmAt dm
|
||||
@@ -104,7 +106,7 @@ crystalWallDamage dm wl = case _dmType dm of
|
||||
pSparkCol = V4 5 1 0.5 2
|
||||
lSparkCol = V4 20 (-5) 0 1
|
||||
|
||||
dirtWallDamage :: Damage -> Wall -> World -> (World, Int)
|
||||
dirtWallDamage :: Damage -> Wall -> World -> (World, Damage)
|
||||
dirtWallDamage dm wl = case _dmType dm of
|
||||
LASERING -> a d $ wlDustAt wl outTo
|
||||
PIERCING -> a d $ wlDustAt wl outTo
|
||||
@@ -122,7 +124,7 @@ dirtWallDamage dm wl = case _dmType dm of
|
||||
POISONDAM -> a 0 id
|
||||
ENTERREMENT -> a 0 id
|
||||
where
|
||||
a x f w = (f w, x)
|
||||
a x f w = (f w, dm & dmAmount .~ x)
|
||||
d = _dmAmount dm
|
||||
sp = _dmFrom dm
|
||||
p = _dmAt dm
|
||||
|
||||
Reference in New Issue
Block a user