26 lines
803 B
Haskell
26 lines
803 B
Haskell
module Dodge.Damage where
|
|
import Dodge.Data
|
|
import Dodge.Wall.Damage
|
|
import FoldableHelp
|
|
import Geometry.Vector
|
|
import LensHelp
|
|
|
|
import qualified Data.Map.Strict as M
|
|
|
|
damageCrWall :: Damage -> Either Creature Wall -> World -> World
|
|
damageCrWall dt (Left cr) = creatures . ix (_crID cr) . crState . csDamage .:~ dt
|
|
damageCrWall dt (Right wl) = damageWall dt wl
|
|
|
|
damageDirection :: [Damage] -> Maybe Float
|
|
damageDirection ds = do
|
|
dm <- safeMinimumOn (negate . _dmAmount) ds
|
|
safeArgV (_dmTo dm -.- _dmFrom dm)
|
|
|
|
collectDamageTypes :: [Damage] -> M.Map DamageType Int
|
|
collectDamageTypes = foldr f M.empty
|
|
where
|
|
f dm = M.insertWith (+) (_dmType dm) (_dmAmount dm)
|
|
|
|
maxDamageType :: [Damage] -> Maybe (DamageType,Int)
|
|
maxDamageType = safeMinimumOn (negate . snd) . M.assocs . collectDamageTypes
|