Redo maxDamageType

This commit is contained in:
2025-06-08 20:56:56 +01:00
parent 70c78824f3
commit 1b769ad504
4 changed files with 81 additions and 73 deletions
+4 -4
View File
@@ -3,6 +3,7 @@ module Dodge.Creature.State (
doDamage,
) where
import Dodge.Data.Damage.Type
import Dodge.Item.BackgroundEffect
import Dodge.Item.MaxAmmo
import Control.Applicative
@@ -108,10 +109,9 @@ checkDeath cr w
-- could look at the amount of damage here (given by maxDamage) too
corpseOrGib :: Creature -> World -> World
corpseOrGib cr = case cr ^? crState . csDamage . to maxDamageType . _Just . _1 of
Just Flaming{} -> plNew (cWorld . lWorld . corpses) cpID (thecorpse & cpSPic %~ scorchSPic)
Just Electrical{} -> plNew (cWorld . lWorld . corpses) cpID thecorpse
Just Poison{} -> plNew (cWorld . lWorld . corpses) cpID (thecorpse & cpSPic %~ poisonSPic)
_ | _crPastDamage cr > 200 -> addCrGibs cr
Just CookingDamage -> plNew (cWorld . lWorld . corpses) cpID (thecorpse & cpSPic %~ scorchSPic)
Just PoisonDamage -> plNew (cWorld . lWorld . corpses) cpID (thecorpse & cpSPic %~ poisonSPic)
Just PhysicalDamage | _crPastDamage cr > 200 -> addCrGibs cr
_ -> plNew (cWorld . lWorld . corpses) cpID thecorpse
where
thecorpse = makeCorpse cr
+25 -8
View File
@@ -7,12 +7,15 @@ module Dodge.Damage (
maxDamageType,
) where
import Dodge.Data.Damage.Type
import Geometry.Vector
import ListHelp
import Dodge.Data.CrWlID
import Dodge.Data.World
import qualified IntMapHelp as IM
import LensHelp
import qualified Data.Map.Strict as M
import FoldableHelp
damageCrWlID :: Damage -> CrWlID -> World -> World
damageCrWlID dam = \case
@@ -28,12 +31,26 @@ damageCrWl dt (Right wl) = cWorld . lWorld . wallDamages %~ IM.insertWith (++) (
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
dmType :: Damage -> DamageType
dmType = \case
Piercing {} -> PhysicalDamage
Blunt {} -> PhysicalDamage
Sparking {} -> CookingDamage
Crushing {} -> PhysicalDamage
Shattering {} -> PhysicalDamage
Flaming {} -> CookingDamage
Lasering {} -> CookingDamage
Flashing {} -> CookingDamage
Electrical {} -> CookingDamage
Explosive {} -> PhysicalDamage
Poison {} -> PoisonDamage
Enterrement {} -> PhysicalDamage
--maxDamageType = safeMinimumOn (negate . snd) . M.assocs . collectDamageTypes
collectDamageTypes :: [Damage] -> M.Map DamageType Int
collectDamageTypes = foldl' (flip f) M.empty
where
f dm = at (dmType dm) . non 0 +~ _dmAmount dm
--f dm = M.insertWith (+) (dmType dm) (_dmAmount dm)
maxDamageType :: [Damage] -> Maybe (DamageType, Int)
maxDamageType = safeMinimumOn (negate . snd) . M.assocs . collectDamageTypes
+3
View File
@@ -33,3 +33,6 @@ data Damage
makeLenses ''Damage
deriveJSON defaultOptions ''Damage
--deriveJSON defaultOptions ''DamageType
--instance ToJSONKey DamageType
--instance FromJSONKey DamageType