{-# LANGUAGE LambdaCase #-} module Dodge.Creature.Statistics ( getCrMoveSpeed, crStrength, crDexterity, crIntelligence, ) where import Data.Maybe import Dodge.Data.Creature import qualified IntMapHelp as IM import LensHelp crDexterity :: Creature -> Int crDexterity cr = case cr ^. crType of Avatar { _avDexterity = x } -> x AvatarDead -> 0 ChaseCrit {} -> 46 SwarmCrit -> 46 AutoCrit -> 46 BarrelCrit {} -> 0 LampCrit {} -> 0 crStrength :: Creature -> Int crStrength cr = case cr ^. crType of Avatar { _avStrength = x } -> x AvatarDead -> 0 ChaseCrit {} -> 46 SwarmCrit -> 40 AutoCrit -> 46 BarrelCrit {} -> 0 LampCrit {} -> 0 crIntelligence :: Creature -> Int crIntelligence cr = case cr ^. crType of Avatar { _avIntelligence = x } -> x AvatarDead -> 0 ChaseCrit {} -> 20 SwarmCrit -> 20 AutoCrit -> 20 BarrelCrit {} -> 0 LampCrit {} -> 0 getCrMoveSpeed :: Creature -> Int getCrMoveSpeed cr = strFromHeldItem cr + strFromEquipment cr + crStrength cr strFromEquipment :: Creature -> Int strFromEquipment = sum . fmap equipmentStrValue . crCurrentEquipment equipmentStrValue :: Item -> Int equipmentStrValue itm = case _itType itm of EQUIP FRONTARMOUR -> negate 3 EQUIP POWERLEGS -> 3 _ -> 0 crCurrentEquipment :: Creature -> IM.IntMap Item crCurrentEquipment = IM.filter (isJust . (^? itLocation . ilEquipSite . _Just)) . _crInv strFromHeldItem :: Creature -> Int strFromHeldItem cr = fromMaybe 0 $ do Aiming <- cr ^? crStance . posture i <- cr ^? crManipulation . manObject . imRootSelectedItem fmap (negate . itemWeight) $ cr ^? crInv . ix i itemWeight :: Item -> Int itemWeight it = case it ^. itType of HELD hit -> heldItemWeight hit _ -> 1 heldItemWeight :: HeldItemType -> Int heldItemWeight = \case BANGSTICK{} -> 5 REWINDER -> 5 TIMESTOPPER -> 5 TIMESCROLLER -> 5 PISTOL -> 5 MACHINEPISTOL -> 5 AUTOPISTOL -> 5 SMG -> 10 BANGCONE -> 5 BLUNDERBUSS -> 10 GRAPECANNON{} -> 10 MINIGUNX{} -> 20 VOLLEYGUN{} -> 15 RIFLE -> 10 ALTERIFLE -> 10 AUTORIFLE -> 10 BURSTRIFLE -> 10 BANGROD -> 10 ELEPHANTGUN -> 10 AMR -> 10 AUTOAMR -> 10 SNIPERRIFLE -> 10 FLAMESPITTER -> 5 FLAMETHROWER -> 10 FLAMETORRENT -> 10 FLAMEWALL -> 10 BLOWTORCH -> 10 SPARKGUN -> 15 TESLAGUN -> 15 LASER -> 15 TRACTORGUN -> 10 RLAUNCHER -> 20 RLAUNCHERX{} -> 20 GLAUNCHER -> 10 POISONSPRAYER -> 10 SHATTERGUN -> 10 TORCH -> 5 FLATSHIELD -> 15 KEYCARD {} -> 5 BLINKER -> 5 BLINKERUNSAFE -> 5