Refactor damages
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user