149 lines
4.9 KiB
Haskell
149 lines
4.9 KiB
Haskell
module Dodge.Wall.DamageEffect where
|
|
import Dodge.Data
|
|
import Dodge.Bullet
|
|
import Dodge.Spark
|
|
import Dodge.Base.Wall
|
|
import Dodge.Wall.Dust
|
|
import Dodge.Block
|
|
import Geometry
|
|
import LensHelp
|
|
|
|
import Control.Monad.State
|
|
--import Data.Maybe
|
|
|
|
defaultWallDamage :: Damage -> Wall -> World -> (World,Int)
|
|
defaultWallDamage dm wl = flip (.) (wallDamageEffect dm wl) $ case _wlMaterial wl of
|
|
Stone -> stoneWallDamage dm wl
|
|
Glass -> windowWallDamage dm wl
|
|
Dirt -> dirtWallDamage dm wl
|
|
Crystal -> crystalWallDamage dm wl
|
|
Metal -> stoneWallDamage dm wl
|
|
Wood -> stoneWallDamage dm wl
|
|
Electronics -> stoneWallDamage dm wl
|
|
Flesh -> stoneWallDamage dm wl
|
|
|
|
stoneWallDamage :: Damage -> Wall -> World -> (World,Int)
|
|
stoneWallDamage dm wl = case _dmType dm of
|
|
LASERING -> a 0 $ colSparkRandDir 0.2 4 lSparkCol outTo (reflDirWall sp p wl)
|
|
PIERCING -> a d $ colSparkRandDir 0.2 8 pSparkCol outTo (reflDirWall sp p wl) . wlDustAt wl outTo
|
|
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
|
|
TORQUEDAM -> a 0 id
|
|
PUSHDAM -> a 0 id
|
|
POISONDAM -> a 0 id
|
|
ENTERREMENT -> a 0 id
|
|
where
|
|
a x f w = (f w,x)
|
|
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
|
|
|
|
windowWallDamage :: Damage -> Wall -> World -> (World,Int)
|
|
windowWallDamage dm wl w = w & case _dmType dm of
|
|
LASERING -> a 0 $ colSparkRandDir 0.2 4 lSparkCol outTo (reflDirWall sp p wl)
|
|
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
|
|
|
|
crystalWallDamage :: Damage -> Wall -> World -> (World,Int)
|
|
crystalWallDamage dm wl = case _dmType dm of
|
|
LASERING -> a 0 $ colSparkRandDir 0.2 4 lSparkCol outTo (reflDirWall sp p wl)
|
|
PIERCING -> a 0 $ colSparkRandDir 0.2 8 pSparkCol 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
|
|
TORQUEDAM -> a 0 id
|
|
PUSHDAM -> a 0 id
|
|
POISONDAM -> a 0 id
|
|
ENTERREMENT -> a 0 id
|
|
where
|
|
a x f w = (f w,x)
|
|
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
|
|
|
|
dirtWallDamage :: Damage -> Wall -> World -> (World,Int)
|
|
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
|
|
TORQUEDAM -> a 0 id
|
|
PUSHDAM -> a 0 id
|
|
POISONDAM -> a 0 id
|
|
ENTERREMENT -> a 0 id
|
|
where
|
|
a x f w = (f w,x)
|
|
d = _dmAmount dm
|
|
sp = _dmFrom dm
|
|
p = _dmAt dm
|
|
outTo = p +.+ squashNormalizeV (sp -.- p)
|
|
|
|
wallDamageEffect :: Damage -> Wall -> World -> World
|
|
wallDamageEffect dm wl w = case _dmEffect dm of
|
|
BounceBullet bt -> w & instantBullets .:~ thebouncer
|
|
where
|
|
reflectVel = reflVelWall wl (_buVel bt)
|
|
thebouncer = aBulAt Nothing --id
|
|
pOut reflectVel (_buDrag bt) (_buHitEff bt) (_buWidth bt) BasicBulletTrajectory
|
|
& buTimer .~ _buTimer bt - 1
|
|
pOut = p +.+ squashNormalizeV (sp -.- p)
|
|
p = _dmAt dm
|
|
sp = _dmFrom dm
|
|
DamageSpawn f -> w & instantParticles .:~ thepart
|
|
& randGen .~ g
|
|
where
|
|
(thepart,g) = runState (f (Right wl) dm) $ _randGen w
|
|
_ -> w
|