packages feed

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