module Dodge.Creature.Damage (applyCreatureDamage) where import Dodge.Material.Damage import Data.List import Dodge.Creature.Mass import Dodge.Creature.Material import Dodge.Creature.Test import Dodge.Data.World import Dodge.Spark import Geometry import LensHelp applyCreatureDamage :: [Damage] -> Creature -> World -> World applyCreatureDamage dms cr w = foldl' (applyIndividualDamage cr) w dms applyIndividualDamage :: Creature -> World -> Damage -> World applyIndividualDamage cr w dm = damMatSideEffect dm (crMaterial (_crType cr)) (Left cr) $ case dm of Piercing{} -> applyPiercingDamage cr dm w _ -> w & damageHP cr (_dmAmount dm) applyPiercingDamage :: Creature -> Damage -> World -> World applyPiercingDamage cr dm | crIsArmouredFrom p cr = f . makeSpark NormalSpark p1 (argV (p1 - p)) | otherwise = f . damageHP cr (_dmAmount dm) where f = cWorld . lWorld . creatures . ix (_crID cr) . crPos -~ _dmVector dm / V2 x x x = crMass (_crType cr) p = _dmPos dm p1 = p + 2 *.* squashNormalizeV (p - _crPos cr) damageHP :: Creature -> Int -> World -> World damageHP cr x = (cWorld . lWorld . creatures . ix (_crID cr) . crHP -~ x) . (cWorld . lWorld . creatures . ix (_crID cr) . crPain +~ x)