{-# LANGUAGE LambdaCase #-} module Dodge.Damage ( damageCrWl, damageDirection, damageCrWlID, maxDamageType, ) where import Geometry.Vector import ListHelp import Dodge.Data.CrWlID import Dodge.Data.World import qualified IntMapHelp as IM import LensHelp damageCrWlID :: Damage -> CrWlID -> World -> World damageCrWlID dam = \case NothingID -> id CrID cid -> cWorld . lWorld . creatures . ix cid . crState . csDamage .:~ dam WlID wlid -> cWorld . lWorld . wallDamages %~ IM.insertWith (++) wlid [dam] damageCrWl :: Damage -> Either Creature Wall -> World -> World damageCrWl dt (Left cr) = cWorld . lWorld . creatures . ix (_crID cr) . crState . csDamage .:~ dt damageCrWl dt (Right wl) = cWorld . lWorld . wallDamages %~ IM.insertWith (++) (_wlID wl) [dt] -- could sort for damage amount as well damageDirection :: [Damage] -> Maybe Float damageDirection ds = safeArgV =<< safeHead (ds ^.. each . dmVector) --collectDamageTypes :: [Damage] -> M.Map DamageType Int --collectDamageTypes = foldl' (flip f) M.empty -- where -- f dm = M.insertWith (+) (_dmType dm) (_dmAmount dm) -- maxDamageType :: [Damage] -> Maybe (Damage, Int) maxDamageType _ = Nothing --maxDamageType = safeMinimumOn (negate . snd) . M.assocs . collectDamageTypes