Fix no damage to walls bug

This commit is contained in:
2022-07-28 18:57:53 +01:00
parent ec4ff84c46
commit c8ad3e1294
19 changed files with 177 additions and 158 deletions
+15 -13
View File
@@ -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