75 lines
2.4 KiB
Haskell
75 lines
2.4 KiB
Haskell
module Dodge.Material.Damage where
|
|
import Dodge.Data
|
|
import Dodge.Spark
|
|
import Geometry
|
|
|
|
damageMaterial :: Damage -> Material
|
|
-> Float -- the angle of the hit surface, in radians
|
|
-> World -> (Int, World)
|
|
damageMaterial dm mt = case mt of
|
|
Stone -> damageStone dm
|
|
_ -> defDamageMaterial dm
|
|
-- Glass -> damageGlass dm
|
|
|
|
defDamageMaterial :: Damage -> Float -> World -> (Int,World)
|
|
defDamageMaterial dm _ w = (_dmAmount dm, w)
|
|
|
|
damageStone :: Damage -> Float -> World -> (Int,World)
|
|
damageStone dm dir = case _dmType dm of
|
|
LASERING -> a 0 $ colSparkRandDir 0.2 4 lSparkCol outTo (argV $ reflectIn (p -.- sp) v)
|
|
PIERCING -> a d $ colSparkRandDir 0.2 8 pSparkCol outTo (argV $ reflectIn (p -.- sp) v)
|
|
BLUNT -> a d id
|
|
SHATTERING -> a d id
|
|
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
|
|
TORQUEDAM -> a 0 id
|
|
PUSHDAM -> a 0 id
|
|
POISONDAM -> a 0 id
|
|
ENTERREMENT -> a 0 id
|
|
where
|
|
v = unitVectorAtAngle dir
|
|
a x f w = (x,f w)
|
|
d = _dmAmount dm
|
|
sp = _dmFrom dm
|
|
p = _dmAt dm
|
|
outTo = p +.+ squashNormalizeV (sp -.- p)
|
|
pSparkCol = V4 5 1 0.5 2
|
|
lSparkCol = V4 20 (-5) 0 1
|
|
|
|
--damageGlass :: Damage -> Float -> World -> (World,Int)
|
|
--damageGlass dm dir w = w & case _dmType dm of
|
|
-- LASERING -> a 0 $ id
|
|
-- PIERCING -> a d $ dosplint . colSparkRandDir 0.2 8 pSparkCol 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
|
|
-- TORQUEDAM -> a 0 id
|
|
-- PUSHDAM -> a 0 id
|
|
-- POISONDAM -> a 0 id
|
|
-- ENTERREMENT -> a 0 id
|
|
-- where
|
|
-- mbl = do
|
|
-- blid <- wl ^? wlStructure . wsBlock
|
|
-- w ^? 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)
|
|
-- dosplint = maybe id splinterBlock mbl
|
|
-- sp = _dmFrom dm
|
|
-- p = _dmAt dm
|
|
-- outTo = p +.+ squashNormalizeV (sp -.- p)
|
|
-- pSparkCol = V4 5 1 0.5 2
|
|
-- lSparkCol = V4 20 (-5) 0 1
|