module Game.LambdaHack.Command
( Cmd, majorCmd, timedCmd, cmdSemantics, cmdDescription
) where
import Game.LambdaHack.Action
import Game.LambdaHack.Actions
import Game.LambdaHack.ItemAction
import Game.LambdaHack.Grammar
import Game.LambdaHack.EffectAction
import Game.LambdaHack.State
import qualified Game.LambdaHack.Feature as F
data Cmd =
Apply { verb :: Verb, object :: Object, syms :: [Char] }
| Project { verb :: Verb, object :: Object, syms :: [Char] }
| TriggerDir { verb :: Verb, object :: Object, feature :: F.Feature }
| TriggerTile { verb :: Verb, object :: Object, feature :: F.Feature }
| Pickup
| Drop
| Wait
| Inventory
| TgtFloor
| TgtEnemy
| TgtAscend Int
| EpsIncr Bool
| GameSave
| GameQuit
| Cancel
| Accept
| History
| CfgDump
| HeroCycle
| Version
| Help
| Redraw
deriving (Show, Read)
majorCmd :: Cmd -> Bool
majorCmd cmd = case cmd of
Apply{} -> True
Project{} -> True
TriggerDir{} -> True
TriggerTile{} -> True
Pickup -> True
Drop -> True
Inventory -> True
GameSave -> True
GameQuit -> True
Help -> True
_ -> False
timedCmd :: Cmd -> Bool
timedCmd cmd = case cmd of
Apply{} -> True
Project{} -> True
TriggerDir{} -> True
TriggerTile{} -> True
Pickup -> True
Drop -> True
GameSave -> True
GameQuit -> True
Wait -> True
_ -> False
cmdSemantics :: Cmd -> ActionFrame ()
cmdSemantics cmd = case cmd of
Apply{..} -> inFrame $ playerApplyGroupItem verb object syms
Project{..} -> playerProjectGroupItem verb object syms
TriggerDir{..} -> inFrame $ playerTriggerDir feature verb
TriggerTile{..} -> inFrame $ playerTriggerTile feature
Pickup -> inFrame $ pickupItem
Drop -> inFrame $ dropItem
Wait -> inFrame $ return ()
Inventory -> inventory
TgtFloor -> targetFloor TgtExplicit
TgtEnemy -> targetMonster TgtExplicit
TgtAscend k -> tgtAscend k
EpsIncr b -> inFrame $ epsIncr b
GameSave -> inFrame $ saveGame
GameQuit -> inFrame $ quitGame
Cancel -> inFrame $ cancelCurrent
Accept -> acceptCurrent displayHelp
History -> displayHistory
CfgDump -> inFrame $ dumpConfig
HeroCycle -> inFrame $ cycleHero
Version -> inFrame $ gameVersion
Help -> displayHelp
Redraw -> inFrame $ redraw
cmdDescription :: Cmd -> String
cmdDescription cmd = case cmd of
Apply{..} -> verb ++ " " ++ addIndefinite object
Project{..} -> verb ++ " " ++ addIndefinite object
TriggerDir{..} -> verb ++ " " ++ addIndefinite object
TriggerTile{..} -> verb ++ " " ++ addIndefinite object
Pickup -> "get an object"
Drop -> "drop an object"
Wait -> ""
Inventory -> "display inventory"
TgtFloor -> "target location"
TgtEnemy -> "target monster"
TgtAscend k | k == 1 -> "target next shallower level"
TgtAscend k | k >= 2 -> "target " ++ show k ++ " levels shallower"
TgtAscend k | k == 1 -> "target next deeper level"
TgtAscend k | k <= 2 -> "target " ++ show (k) ++ " levels deeper"
TgtAscend _ -> error "void level change in targeting mode in config file"
EpsIncr True -> "swerve targeting line"
EpsIncr False -> "unswerve targeting line"
GameSave -> "save and exit the game"
GameQuit -> "quit without saving"
Cancel -> "cancel action"
Accept -> "accept choice"
History -> "display previous messages"
CfgDump -> "dump current configuration"
HeroCycle -> "cycle among heroes on level"
Version -> "display game version"
Help -> "display help"
Redraw -> "clear messages"