{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE StrictData #-} module Dodge.Data.Terminal where import Dodge.Data.WorldEffect import Color import Control.Lens import qualified Data.Text as T import qualified Data.Map.Strict as M data TerminalStatus = TerminalOff | TerminalBusy | TerminalReady deriving (Eq,Ord,Show,Read) data TerminalInput = TerminalInput { _tiText :: T.Text , _tiFocus :: Bool , _tiSel :: (Int,Int) } deriving (Eq,Ord,Show,Read) data TerminalBootProgram = TerminalBootMempty | TerminalBootLines [TerminalLine] deriving (Eq,Ord,Show,Read) data Terminal = Terminal { _tmID :: Int , _tmBootProgram :: TerminalBootProgram -- Terminal -> World -> [TerminalLine] , _tmButtonID :: Int , _tmMachineID :: Int , _tmName :: String , _tmDisplayedLines :: [(String,Color)] , _tmFutureLines :: [TerminalLine] , _tmMaxLines :: Int , _tmTitle :: String , _tmInput :: TerminalInput , _tmScrollCommands :: [TerminalCommand] , _tmWriteCommands :: [TerminalCommand] , _tmDeathEffect :: TmWdWd -- Terminal -> World -> World , _tmStatus :: TerminalStatus , _tmCommandHistory :: [String] , _tmToggles :: M.Map String TerminalToggle } deriving (Eq,Ord,Show,Read) data TerminalLineString = TerminalLineConst String Color deriving (Eq,Ord,Show,Read) data TmTm = TmId | TmTmClearDisplayedLines | TmTmSetStatus TerminalStatus deriving (Eq,Ord,Show,Read) data TerminalLine = TerminalLineDisplay {_tlPause :: Int ,_tlString :: TerminalLineString -- World -> (String, Color) } | TerminalLineTerminalEffect {_tlPause :: Int ,_tlTermEffect :: TmTm -- Terminal -> Terminal } | TerminalLineEffect {_tlPause :: Int ,_tlEffect :: TmWdWd --Terminal -> World -> World } deriving (Eq,Ord,Show,Read) data TerminalToggle = TerminalToggle { _ttTriggerID :: Int , _ttDeathEffect :: BlBl } deriving (Eq,Ord,Show,Read) data BlBl = BlNegate | BlConst Bool | BlId deriving (Eq,Ord,Show,Read) data EffectArguments = NoArguments {_cmdEffect :: [TerminalLine]} | OneArgument {_argType :: String ,_argList :: M.Map String [TerminalLine] } deriving (Eq,Ord,Show,Read) data TerminalCommandEffect = TerminalCommandArguments EffectArguments | TerminalCommandEffectDamageCoding | TerminalCommandEffectSensorParameter | TerminalCommandEffectLinkedObject | TerminalCommandEffectHelp | TerminalCommandEffectNoArgumentsStr String | TerminalCommandEffectCommands | TerminalCommandEffectSingleCommand WdWd [String] | TerminalCommandEffectNone deriving (Eq,Ord,Show,Read) data TerminalCommand = TerminalCommand { _tcString :: String , _tcAlias :: [String] , _tcHelp :: String , _tcEffect :: TerminalCommandEffect -- Terminal -> World -> EffectArguments } deriving (Eq,Ord,Show,Read) makeLenses ''Terminal makeLenses ''TerminalLine makeLenses ''TerminalCommand makeLenses ''TerminalInput