sc2hs-0.1.0.0: app/Main.hs
{-#LANGUAGE NoMonadFailDesugaring #-}
{-#LANGUAGE OverloadedLabels, TypeOperators, DataKinds, MonoLocalBinds #-}
{-#LANGUAGE OverloadedStrings #-}
{-#LANGUAGE FlexibleContexts #-}
module Main where
import Network.SC2.LowLevel hiding (getStatus, Step)
import qualified Proto.S2clientprotocol.Sc2api as A
import qualified Proto.S2clientprotocol.Common as A
import qualified Proto.S2clientprotocol.Sc2api_Fields as A
import qualified Proto.S2clientprotocol.Raw as A
import qualified Proto.S2clientprotocol.Raw_Fields as A
import Lens.Labels.Unwrapped ()
import Control.Lens
import Control.Effects.Logging
import Network.SC2.Agent
main :: IO ()
main = withMain mempty (runLocal (runLoggingStdOut 999 . runSC2 bot) ) where
bot :: SC2LowLevel '[Logging] ()
bot = do
Right info <- syncRequest Ping
logMessage 1 ("info: " ++ show info)
Right maps@(map : _) <- syncRequest AvailableMaps
Right () <- syncRequest $ CreateGameFull (maps !! 8) [Participant Protoss, Computer (Random ()) Medium] Fog RandomSeed Realtime
logMessage 1 "create game success"
Right pid <- syncRequest $ JoinGame Protoss [Raw]
logMessage 1 ("join game: " ++ show pid)
Right info <- syncRequest $ GameInfo
runSC2Agent (initialiseWithGameInfo info) $ workerRush
-- Orders a worker rush on the first frame.
workerRush :: Member Logging r => Eff (Agent ':r ) ()
workerRush = do
updateObservations
units <- workers
locs <- enemyStartLocations
units `attack` (head locs)
logMessage 1 "Worker rush ^_^"
loop
loop :: Member Logging r => Eff (Agent ': r) ()
loop = do
step
status <- getStatus
case status of
Ended -> logMessage 1 "Ending game"
_ -> loop