106 lines
3.6 KiB
Haskell
106 lines
3.6 KiB
Haskell
module Dodge.Item.Display
|
|
( itemDisplay
|
|
, selectedItemDisplay
|
|
, itemString
|
|
)
|
|
where
|
|
import Dodge.Module
|
|
import Dodge.Data
|
|
import Dodge.Inventory.ItemSpace
|
|
import Padding
|
|
import LensHelp
|
|
|
|
import Data.Maybe
|
|
import Data.Sequence
|
|
|
|
itemString :: Item -> String
|
|
itemString = head . itemDisplay
|
|
|
|
itemBaseName :: Item -> String
|
|
itemBaseName it = case _iyBase $ _itType it of
|
|
CRAFT str -> show str
|
|
HELD str -> show str
|
|
x -> show x
|
|
|
|
itemDisplayWithNumber :: String -> Item -> [String]
|
|
itemDisplayWithNumber numberstr it = Prelude.take (itSlotsTaken it) $
|
|
(midPadL 15 ' ' thename (' ' : numberstr) ++ theparam)
|
|
: catMaybes [maybeWarmupStatus it,maybeRateStatus it]
|
|
++ moduleStrings it ++ repeat "*"
|
|
where
|
|
thename = itemBaseName it
|
|
theparam = fromMaybe []
|
|
. listToMaybe
|
|
$ mapMaybe ($ it)
|
|
[ maybeModeStatus
|
|
]
|
|
|
|
selectedItemDisplay :: Creature -> Item -> [String]
|
|
selectedItemDisplay cr it = itemDisplayWithNumber (showSelectedConsumption cr (_itConsumption it)) it
|
|
|
|
{- | Displays the item name, ammo if loaded, and any selected '_itCharMode'. -}
|
|
-- TODO make work on remote launchers
|
|
itemDisplay :: Item -> [String]
|
|
itemDisplay it = itemDisplayWithNumber (showConsumption (_itConsumption it)) it
|
|
|
|
showSelectedConsumption :: Creature -> ItemConsumption -> String
|
|
showSelectedConsumption cr ic = case ic of
|
|
LoadableAmmo{} -> showReloadProgress cr ic
|
|
AutoRecharging {} -> showAutoRechargeProgress ic
|
|
ChargeableAmmo{} -> show $ _wpCharge ic
|
|
ItemItselfConsumable{} -> show (_icAmount ic)
|
|
NoConsumption -> ""
|
|
|
|
showAutoRechargeProgress :: ItemConsumption -> String
|
|
showAutoRechargeProgress ic
|
|
| l < _arMax ic = show (_arProgress ic) ++ "C" ++ show l
|
|
| otherwise = show l
|
|
where
|
|
l = _arLoaded ic
|
|
|
|
showReloadProgress :: Creature -> ItemConsumption -> String
|
|
showReloadProgress cr ic = case cr ^?! crInvSel . iselAction of
|
|
ReloadAction i la _ -> show i ++ showLoadActionType la (_laLoaded ic)
|
|
_ -> case ic ^? laProgress . _Just . ix 0 of
|
|
Nothing -> show $ _laLoaded ic
|
|
Just la -> show (_actionTime la) ++ showLoadActionType la (_laLoaded ic)
|
|
|
|
showLoadProgress :: Int -> Maybe [LoadAction] -> String
|
|
showLoadProgress x mlas = case mlas ^? _Just . ix 0 of
|
|
Just la -> show (_actionTime la) ++ showLoadActionType la x
|
|
Nothing -> show x
|
|
|
|
showConsumption :: ItemConsumption -> String
|
|
showConsumption ic = case ic of
|
|
LoadableAmmo{} -> showLoadProgress (_laLoaded ic) (_laProgress ic)
|
|
AutoRecharging {} -> showAutoRechargeProgress ic
|
|
ChargeableAmmo{} -> show $ _wpCharge ic
|
|
ItemItselfConsumable{} -> show (_icAmount ic)
|
|
NoConsumption -> ""
|
|
|
|
showLoadActionType :: LoadAction -> Int -> String
|
|
showLoadActionType la x = case la of
|
|
LoadEject {} -> "E"
|
|
LoadInsert {} -> "L"
|
|
LoadAdd {} -> "A" ++ show x
|
|
LoadPrime {} -> "P"
|
|
|
|
maybeWarmupStatus :: Item -> Maybe String
|
|
maybeWarmupStatus it = case it ^? itUse . useDelay . warmMax of
|
|
Nothing -> Nothing
|
|
Just m -> case m - (_warmTime . _useDelay $ _itUse it) of
|
|
x | x <= 1 -> Just "*WARM"
|
|
| otherwise -> let n = show x
|
|
in Just $ Prelude.take (5 - Prelude.length n) "*WARM" ++ n
|
|
|
|
maybeModeStatus :: Item -> Maybe String
|
|
maybeModeStatus it = case it ^? itAttachment of
|
|
Just AttachCharMode {_atCharMode = (c :<| _)} -> Just [' ',c]
|
|
Just AttachMode {_atMode = i} -> Just $ show i
|
|
_ -> Nothing
|
|
|
|
maybeRateStatus :: Item -> Maybe String
|
|
maybeRateStatus it = case it ^? itUse . useDelay . rateMaxMax of
|
|
Nothing -> Nothing
|
|
_ -> Just $ leftPad 3 ' ' (show (_rateMax . _useDelay $ _itUse it))
|