screeps-purescript-bot/src/Screeps/Types.purs

212 lines
7.5 KiB
Plaintext

module Screeps.Types where
import Prelude
import Data.Eq
import Data.Maybe (Maybe(..))
import Data.Either (note)
import Data.Generic.Rep ( class Generic )
import Data.Eq.Generic ( genericEq )
import Data.Show ( class Show )
import Data.Show.Generic ( genericShow )
import Data.Argonaut.Decode (class DecodeJson, decodeJson, JsonDecodeError(..), getField)
import Data.Argonaut.Encode (class EncodeJson, encodeJson)
import Data.Argonaut.Encode.Generic (genericEncodeJson)
import Data.Argonaut.Decode.Generic (genericDecodeJson)
foreign import data GameGlobal :: Type
foreign import data RawRoomObject :: Type -> Type
foreign import data Room :: Type
foreign import data WorldMap :: Type
foreign import data RawStructure :: Type -> Type
foreign import data RawOwnedStructure :: Type -> Type
foreign import data RawConstructionSite :: Type
foreign import data RawSpawn :: Type
foreign import data RawTower :: Type
foreign import data RawCreep :: Type
foreign import data RawMineral :: Type
foreign import data RawResource :: Type
foreign import data RawSource :: Type
foreign import data RawStorage :: Type
foreign import data RawFlag :: Type
foreign import data RawNuke :: Type
foreign import data RoomPosition :: Type
foreign import data Store ∷ Type
type RoomObject a = RawRoomObject a
type Structure a = RoomObject (RawStructure a)
type OwnedStructure a = Structure (RawOwnedStructure a)
type ConstructionSite = RoomObject RawConstructionSite
type Storage = OwnedStructure RawStorage
type Spawn = OwnedStructure RawSpawn
type Tower = OwnedStructure RawTower
type Creep = RoomObject RawCreep
type Mineral = RoomObject RawMineral
type Resource = RoomObject RawResource
type Source = RoomObject RawSource
type Flag = RoomObject RawFlag
type Nuke = RoomObject RawNuke
type Path = Array PathStep
type PathStep =
{ x :: Int
, y :: Int
, dx :: Number
, dy :: Number
, direction :: Direction }
newtype Id a = Id String
derive instance genericId :: Generic (Id a) _
instance eqId :: Eq (Id a) where eq = genericEq
instance showId :: Show (Id a) where show = genericShow
instance decodeJsonId :: DecodeJson (Id a) where decodeJson = genericDecodeJson
instance encodeJsonId :: EncodeJson (Id a) where encodeJson = genericEncodeJson
type BodyPart =
{ boost :: Maybe String
, type :: BodyPartType
, hits :: Int }
type MoveOptions = PathOptions
( reusePath :: Maybe Int
, serializeMemory :: Maybe Boolean
, noPathFinding :: Maybe Boolean )
type PathOptions o =
{ ignoreCreeps :: Maybe Boolean
, ignoreDestructibleStructures :: Maybe Boolean
, ignoreRoads :: Maybe Boolean
, ignore :: Maybe (Array RoomPosition)
, avoid :: Maybe (Array RoomPosition)
, maxOps :: Maybe Int
, heuristicWeight :: Maybe Number
, serialize :: Maybe Boolean
, maxRooms :: Maybe Int
| o }
moveOpts :: MoveOptions
moveOpts =
{ ignoreCreeps: Nothing
, ignoreDestructibleStructures: Nothing
, ignoreRoads: Nothing
, ignore: Nothing
, avoid: Nothing
, maxOps: Nothing
, heuristicWeight: Nothing
, serialize: Nothing
, maxRooms: Nothing
, reusePath: Nothing
, serializeMemory: Nothing
, noPathFinding: Nothing }
pathOpts :: PathOptions ()
pathOpts =
{ ignoreCreeps: Nothing
, ignoreDestructibleStructures: Nothing
, ignoreRoads: Nothing
, ignore: Nothing
, avoid: Nothing
, maxOps: Nothing
, heuristicWeight: Nothing
, serialize: Nothing
, maxRooms: Nothing }
newtype BodyPartType = BodyPartType String
derive instance genericBodyPartType :: Generic BodyPartType _
instance eqBodyPartType :: Eq BodyPartType where eq = genericEq
instance showBodyPartType :: Show BodyPartType where show = genericShow
newtype ResourceType = ResourceType String
derive instance genericResourceType :: Generic ResourceType _
instance eqResourceType :: Eq ResourceType where eq = genericEq
instance showResourceType :: Show ResourceType where
show (ResourceType s) = s
newtype ReturnCode = ReturnCode Int
derive instance genericReturnCode :: Generic ReturnCode _
instance eqReturnCode :: Eq ReturnCode where eq = genericEq
instance showReturnCode :: Show ReturnCode where
show (ReturnCode n) = show n
newtype StructureType = StructureType String
derive instance genericStructureType :: Generic StructureType _
instance eqStructureType :: Eq StructureType where eq = genericEq
instance showStructureType :: Show StructureType where show = genericShow
newtype Direction = Direction Int
derive instance genericDirection :: Generic Direction _
instance eqDirection :: Eq Direction where eq = genericEq
instance showDirection :: Show Direction where show = genericShow
newtype TerrainMask = TerrainMask Int
derive instance genericTerrainMask :: Generic TerrainMask _
instance eqTerrainMask :: Eq TerrainMask where eq = genericEq
instance showTerrainMask :: Show TerrainMask where show = genericShow
newtype Terrain = Terrain String
derive instance genericTerrain :: Generic Terrain _
instance eqTerrain :: Eq Terrain where eq = genericEq
instance showTerrain :: Show Terrain
where show (Terrain s) = s
data TargetPosition a =
TargetPt Int Int |
TargetObj (RoomObject a) |
TargetPos RoomPosition
type FilterFn a = a -> Boolean
newtype FindType a = FindType Int
-- | creep types are generic, irrelevant of job or role
data CreepType = CreepDrone | CreepNULL
-- | creeps can take on many roles, depending on what type they are
data Role = RoleIdle
| RoleHarvester
| RoleBuilder
| RoleNULL
instance showRole ∷ Show Role where
show RoleHarvester = "RoleHarvester"
show RoleBuilder = "RoleBuilder"
show RoleIdle = "RoleIdle"
show RoleNULL = "RoleNULL"
instance eqRoles ∷ Eq Role where
eq RoleNULL RoleNULL = true
eq RoleIdle RoleIdle = true
eq RoleHarvester RoleHarvester = true
eq RoleBuilder RoleBuilder = true
eq _ RoleNULL = false
eq RoleNULL _ = false
eq _ _ = false
roleList = [RoleIdle, RoleHarvester, RoleBuilder, RoleNULL] ∷ Array Role
instance encodeRole :: EncodeJson Role where
encodeJson RoleIdle = encodeJson "RoleIdle"
encodeJson RoleHarvester = encodeJson "RoleHarvester"
encodeJson RoleBuilder = encodeJson "RoleBuilder"
encodeJson RoleNULL = encodeJson "RoleNULL"
instance decodeRole :: DecodeJson Role where
decodeJson json = do
string <- decodeJson json
note (TypeMismatch "Role:") (roleFromStr string)
roleFromStr :: String -> Maybe Role
roleFromStr "RoleHarvester" = Just RoleHarvester
roleFromStr "RoleBuilder" = Just RoleBuilder
roleFromStr "RoleIdle" = Just RoleIdle
roleFromStr "RoleNULL" = Just RoleNULL
roleFromStr _ = Nothing
-- | jobs are like temporary roles
data Job = JobBuild | JobNULL
-- | the main loop control variable allow some control over state
-- encoded straight into the json memory so we write some instances
data LoopStatus = LoopGo | LoopStop | LoopNULL
instance encodeLoopStatus :: EncodeJson LoopStatus where
encodeJson LoopGo = encodeJson "loopGo"
encodeJson LoopStop = encodeJson "loopStop"
encodeJson LoopNULL = encodeJson "loopNULL"
instance decodeLoopStatus :: DecodeJson LoopStatus where
decodeJson json = do
string <- decodeJson json
note (TypeMismatch "LoopStatus:") (lsFromStr string)
lsFromStr :: String -> Maybe LoopStatus
lsFromStr "loopGo" = Just LoopGo
lsFromStr "loopStop" = Just LoopStop
lsFromStr "loopNULL" = Just LoopNULL
lsFromStr _ = Nothing