114 lines
2.6 KiB
Haskell
114 lines
2.6 KiB
Haskell
{-# 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
|