66 lines
2.0 KiB
Plaintext
66 lines
2.0 KiB
Plaintext
module Screeps.Game where
|
|
import Prelude
|
|
import Foreign.Object as F
|
|
import Effect (Effect)
|
|
import Screeps.Types
|
|
import Screeps.Memory as Memory
|
|
import Screeps.FFI ( runThisEffFn0, runThisFn1
|
|
, unsafeField, toMaybe )
|
|
import Data.Maybe ( Maybe )
|
|
import Data.Either ( Either(..) )
|
|
import Data.Argonaut.Core ( Json )
|
|
import Data.Argonaut.Encode ( encodeJson )
|
|
import Data.Map as Map
|
|
|
|
foreign import getGameGlobal ∷ Effect GameGlobal
|
|
foreign import createCreepImpl ∷ Spawn → Array BodyPartType → Json
|
|
→ (ReturnCode → Either ReturnCode String)
|
|
→ (String → Either ReturnCode String)
|
|
→ Effect (Either ReturnCode String)
|
|
foreign import rawGetUtility ∷ String → Memory.MemoryGlobal → Int
|
|
foreign import rawGetRole ∷ String → Memory.MemoryGlobal → Role
|
|
|
|
type Cpu = { limit ∷ Int
|
|
, tickLimit ∷ Int
|
|
, bucket ∷ Int }
|
|
|
|
cpu ∷ GameGlobal → Cpu
|
|
cpu = unsafeField "cpu"
|
|
spawns ∷ GameGlobal → F.Object Spawn
|
|
spawns = unsafeField "spawns"
|
|
|
|
creeps ∷ GameGlobal → F.Object Creep
|
|
creeps = unsafeField "creeps"
|
|
|
|
getUsed ∷ GameGlobal → Effect Number
|
|
getUsed game = runThisEffFn0 "getUsed" (cpu game)
|
|
|
|
getObjectById ∷ ∀ a. GameGlobal → Id a → Maybe a
|
|
getObjectById game id
|
|
= toMaybe (runThisFn1 "getObjectById" game id)
|
|
|
|
getUtility ∷ Memory.MemoryGlobal → String → Int
|
|
getUtility mem key = rawGetUtility key mem
|
|
|
|
getRole ∷ Memory.MemoryGlobal → String → Role
|
|
getRole mem key = rawGetRole key mem
|
|
|
|
rawSpawnCreep ∷ Spawn → Array BodyPartType → String
|
|
→ Role → Effect (Either ReturnCode String)
|
|
rawSpawnCreep spawn parts name role
|
|
= createCreepImpl spawn parts role' Left Right
|
|
where role' = encodeJson role
|
|
|
|
rawSpawnCreepAs ∷ Spawn
|
|
→ Array BodyPartType → String → Role
|
|
→ Effect (Either ReturnCode String)
|
|
rawSpawnCreepAs spawn parts name role
|
|
= createCreepImpl spawn parts role' Left Right
|
|
where role' = encodeJson role
|
|
|
|
time ∷ GameGlobal → Int
|
|
time = unsafeField "time"
|
|
|
|
map ∷ GameGlobal → WorldMap
|
|
map = unsafeField "map"
|