Refactor damages

This commit is contained in:
2025-06-07 14:26:00 +01:00
parent 7a192e7631
commit 81a7dcd962
24 changed files with 271 additions and 277 deletions
+79 -81
View File
@@ -1,3 +1,4 @@
{-# LANGUAGE TupleSections #-}
module Dodge.Wall.DamageEffect where
import Dodge.Base.Wall
@@ -9,7 +10,7 @@ import Geometry
import LensHelp
damageWallEffect :: Damage -> Wall -> World -> (World, Damage)
damageWallEffect dm wl = case _wlMaterial wl of
damageWallEffect dm wl = (,dm) . case _wlMaterial wl of
Stone -> stoneWallDamage dm wl
Glass -> glassWallDamage dm wl
Dirt -> dirtWallDamage dm wl
@@ -21,97 +22,94 @@ damageWallEffect dm wl = case _wlMaterial wl of
-- 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
PIERCING -> a d $ makeSpark NormalSpark outTo (reflDirWall sp p wl) . wlDustAt wl outTo
LASERING -> a 0 $ makeSpark FireSpark outTo (reflDirWall sp p wl)
BLUNT -> a d $ wlDustAt wl outTo
SHATTERING -> a d $ muchWlDustAt wl outTo
CRUSHING -> a d id
EXPLOSIVE -> a d id
CUTTING -> a d id
SPARKING -> a 0 id
FLAMING -> a 0 id
ELECTRICAL -> a 0 id
CONCUSSIVE -> a d id
POISONDAM -> a 0 id
ENTERREMENT -> a 0 id
stoneWallDamage :: Damage -> Wall -> World -> World
stoneWallDamage dm wl = case dm of
Piercing d p t -> a d $ makeSpark NormalSpark (outTo p t)
(reflDirWall p (p+t) wl) . wlDustAt wl (outTo p t)
Lasering d p t -> a 0 $ makeSpark FireSpark (outTo p t) (reflDirWall p (p+t) wl)
Blunt d p t -> a d $ wlDustAt wl (outTo p t)
Shattering d p t -> a d $ muchWlDustAt wl (outTo p t)
Crushing d _ -> a d id
Explosive d _ -> a d id
Sparking {} -> a 0 id
Flaming {} -> a 0 id
Electrical {} -> a 0 id
Poison {} -> a 0 id
Enterrement {} -> a 0 id
where
a x f w = (f w, dm & dmAmount .~ x)
d = _dmAmount dm
sp = _dmFrom dm
p = _dmAt dm
outTo = p +.+ squashNormalizeV (sp -.- p)
a x f w = (f w)
outTo x y = x -.- squashNormalizeV y
-- d = _dmAmount dm
-- sp = _dmFrom dm
-- p = _dmAt dm
-- outTo = p +.+ squashNormalizeV (sp -.- p)
glassWallDamage :: Damage -> Wall -> World -> (World, Damage)
glassWallDamage :: Damage -> Wall -> World -> World
glassWallDamage dm wl w =
w & case _dmType dm of
LASERING -> a 0 $ makeSpark FireSpark outTo (reflDirWall sp p wl)
PIERCING -> a d $ dosplint . makeSpark NormalSpark outTo (reflDirWall sp p wl) . wlDustAt wl outTo
BLUNT -> a d $ dosplint . wlDustAt wl outTo
SHATTERING -> a d $ dosplint . muchWlDustAt wl outTo
CRUSHING -> a d dosplint
EXPLOSIVE -> a d dosplint
CUTTING -> a d dosplint
SPARKING -> a 0 id
FLAMING -> a 0 id
ELECTRICAL -> a 0 id
CONCUSSIVE -> a 0 dosplint
POISONDAM -> a 0 id
ENTERREMENT -> a 0 id
w & case dm of
Lasering d p t -> a 0 $ makeSpark FireSpark (outTo p t) (reflDirWall p (p+t) wl)
Piercing d p t -> a d $ dosplint . makeSpark NormalSpark (outTo p t) (reflDirWall p (p+t) wl) . wlDustAt wl (outTo p t)
Blunt d p t -> a d $ dosplint . wlDustAt wl (outTo p t)
Shattering d p t -> a d $ dosplint . muchWlDustAt wl (outTo p t)
Crushing {} -> a d dosplint
Explosive {} -> a d dosplint
Sparking {} -> a 0 id
Flaming {} -> a 0 id
Electrical {} -> a 0 id
Poison {} -> a 0 id
Enterrement {} -> a 0 id
where
mbl = do
blid <- wl ^? wlStructure . wsBlock
w ^? cWorld . lWorld . blocks . ix blid
d :: Int
d = max 1 $ maybe 1 (subtract 1 . _blHP) mbl
a :: Int -> (World -> World) -> World -> (World, Damage)
a x f w' = (f w', dm & dmAmount .~ x)
a :: Int -> (World -> World) -> World -> (World)
a x f w' = (f w')
dosplint = maybe id splinterBlock mbl
sp = _dmFrom dm
p = _dmAt dm
outTo = p +.+ squashNormalizeV (sp -.- p)
-- sp = _dmFrom dm
-- p = _dmAt dm
--outTo = p +.+ squashNormalizeV (sp -.- p)
outTo p t = p -.- squashNormalizeV t
crystalWallDamage :: Damage -> Wall -> World -> (World, Damage)
crystalWallDamage dm wl = case _dmType dm of
LASERING -> a 0 $ makeSpark FireSpark outTo (reflDirWall sp p wl)
PIERCING -> a 0 $ makeSpark NormalSpark outTo (reflDirWall sp p wl)-- . wlDustAt wl outTo
BLUNT -> a 0 $ wlDustAt wl outTo
SHATTERING -> a d $ muchWlDustAt wl outTo
CRUSHING -> a 0 id
EXPLOSIVE -> a 0 id
CUTTING -> a 0 id
SPARKING -> a 0 id
FLAMING -> a 0 id
ELECTRICAL -> a 0 id
CONCUSSIVE -> a 0 id
POISONDAM -> a 0 id
ENTERREMENT -> a 0 id
crystalWallDamage :: Damage -> Wall -> World -> World
crystalWallDamage dm wl = case dm of
Lasering d p t -> a 0 $ makeSpark FireSpark (outTo p t) (reflDirWall p (p+t) wl)
Piercing d p t -> a 0 $ makeSpark NormalSpark (outTo p t) (reflDirWall p (p+t) wl) . wlDustAt wl (outTo p t)
Blunt d p t -> a 0 $ wlDustAt wl (outTo p t)
Shattering d p t -> a d $ muchWlDustAt wl (outTo p t)
Crushing {} -> a 0 id
Explosive {} -> a 0 id
Sparking {} -> a 0 id
Flaming {} -> a 0 id
Electrical {} -> a 0 id
Poison {} -> a 0 id
Enterrement {} -> a 0 id
where
a x f w = (f w, dm & dmAmount .~ x)
d = _dmAmount dm
sp = _dmFrom dm
p = _dmAt dm
outTo = p +.+ squashNormalizeV (sp -.- p)
a x f w = (f w)
--d = _dmAmount dm
--sp = _dmFrom dm
--p = _dmAt dm
--outTo = p +.+ squashNormalizeV (sp -.- p)
outTo p t = p -.- squashNormalizeV t
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
BLUNT -> a d $ wlDustAt wl outTo
SHATTERING -> a d $ muchWlDustAt wl outTo
CRUSHING -> a d $ wlDustAt wl outTo
EXPLOSIVE -> a d $ muchWlDustAt wl outTo
CUTTING -> a d $ muchWlDustAt wl outTo
SPARKING -> a 0 id
FLAMING -> a 0 id
ELECTRICAL -> a 0 id
CONCUSSIVE -> a d id
POISONDAM -> a 0 id
ENTERREMENT -> a 0 id
dirtWallDamage :: Damage -> Wall -> World -> World
dirtWallDamage dm wl = case dm of
Lasering d p t -> a d $ wlDustAt wl (outTo p t)
Piercing d p t -> a d $ wlDustAt wl (outTo p t)
Blunt d p t -> a d $ wlDustAt wl (outTo p t)
Shattering d p t -> a d $ muchWlDustAt wl (outTo p t)
Crushing d _ -> a d id
Explosive d _ -> a d id
Sparking {} -> a 0 id
Flaming {} -> a 0 id
Electrical {} -> a 0 id
Poison {} -> a 0 id
Enterrement {} -> a 0 id
where
a x f w = (f w, dm & dmAmount .~ x)
d = _dmAmount dm
sp = _dmFrom dm
p = _dmAt dm
outTo = p +.+ squashNormalizeV (sp -.- p)
a x f w = (f w)
--d = _dmAmount dm
--sp = _dmFrom dm
--p = _dmAt dm
--outTo = p +.+ squashNormalizeV (sp -.- p)
outTo p t = p -.- squashNormalizeV t