module Dodge.Material.Damage where import Dodge.Data.World 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 lSparkCol outTo (argV $ reflectIn (p -.- sp) v) PIERCING -> a d $ colSparkRandDir 0.2 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