aaaaaaaaaaaaaaaaa??!
This commit is contained in:
commit
302ac37756
24 changed files with 1337 additions and 0 deletions
11
.gitignore
vendored
Normal file
11
.gitignore
vendored
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
/bower_components/
|
||||||
|
/node_modules/
|
||||||
|
/.pulp-cache/
|
||||||
|
/output/
|
||||||
|
/generated-docs/
|
||||||
|
/.psc-package/
|
||||||
|
/.psc*
|
||||||
|
/.purs*
|
||||||
|
/.psa*
|
||||||
|
/.spago
|
||||||
|
index.js
|
109
packages.dhall
Normal file
109
packages.dhall
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
{-
|
||||||
|
Welcome to your new Dhall package-set!
|
||||||
|
|
||||||
|
Below are instructions for how to edit this file for most use
|
||||||
|
cases, so that you don't need to know Dhall to use it.
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
Most will want to do one or both of these options:
|
||||||
|
1. Override/Patch a package's dependency
|
||||||
|
2. Add a package not already in the default package set
|
||||||
|
|
||||||
|
This file will continue to work whether you use one or both options.
|
||||||
|
Instructions for each option are explained below.
|
||||||
|
|
||||||
|
### Overriding/Patching a package
|
||||||
|
|
||||||
|
Purpose:
|
||||||
|
- Change a package's dependency to a newer/older release than the
|
||||||
|
default package set's release
|
||||||
|
- Use your own modified version of some dependency that may
|
||||||
|
include new API, changed API, removed API by
|
||||||
|
using your custom git repo of the library rather than
|
||||||
|
the package set's repo
|
||||||
|
|
||||||
|
Syntax:
|
||||||
|
where `entityName` is one of the following:
|
||||||
|
- dependencies
|
||||||
|
- repo
|
||||||
|
- version
|
||||||
|
-------------------------------
|
||||||
|
let upstream = --
|
||||||
|
in upstream
|
||||||
|
with packageName.entityName = "new value"
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
Example:
|
||||||
|
-------------------------------
|
||||||
|
let upstream = --
|
||||||
|
in upstream
|
||||||
|
with halogen.version = "master"
|
||||||
|
with halogen.repo = "https://example.com/path/to/git/repo.git"
|
||||||
|
|
||||||
|
with halogen-vdom.version = "v4.0.0"
|
||||||
|
with halogen-vdom.dependencies = [ "extra-dependency" ] # halogen-vdom.dependencies
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
### Additions
|
||||||
|
|
||||||
|
Purpose:
|
||||||
|
- Add packages that aren't already included in the default package set
|
||||||
|
|
||||||
|
Syntax:
|
||||||
|
where `<version>` is:
|
||||||
|
- a tag (i.e. "v4.0.0")
|
||||||
|
- a branch (i.e. "master")
|
||||||
|
- commit hash (i.e. "701f3e44aafb1a6459281714858fadf2c4c2a977")
|
||||||
|
-------------------------------
|
||||||
|
let upstream = --
|
||||||
|
in upstream
|
||||||
|
with new-package-name =
|
||||||
|
{ dependencies =
|
||||||
|
[ "dependency1"
|
||||||
|
, "dependency2"
|
||||||
|
]
|
||||||
|
, repo =
|
||||||
|
"https://example.com/path/to/git/repo.git"
|
||||||
|
, version =
|
||||||
|
"<version>"
|
||||||
|
}
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
Example:
|
||||||
|
-------------------------------
|
||||||
|
let upstream = --
|
||||||
|
in upstream
|
||||||
|
with benchotron =
|
||||||
|
{ dependencies =
|
||||||
|
[ "arrays"
|
||||||
|
, "exists"
|
||||||
|
, "profunctor"
|
||||||
|
, "strings"
|
||||||
|
, "quickcheck"
|
||||||
|
, "lcg"
|
||||||
|
, "transformers"
|
||||||
|
, "foldable-traversable"
|
||||||
|
, "exceptions"
|
||||||
|
, "node-fs"
|
||||||
|
, "node-buffer"
|
||||||
|
, "node-readline"
|
||||||
|
, "datetime"
|
||||||
|
, "now"
|
||||||
|
]
|
||||||
|
, repo =
|
||||||
|
"https://github.com/hdgarrood/purescript-benchotron.git"
|
||||||
|
, version =
|
||||||
|
"v7.0.0"
|
||||||
|
}
|
||||||
|
-------------------------------
|
||||||
|
-}
|
||||||
|
let upstream =
|
||||||
|
https://github.com/purescript/package-sets/releases/download/psc-0.15.12-20231024/packages.dhall
|
||||||
|
sha256:8aa63621af6a0e6d8d4611279b454a1a69364be9f1151530aca72432160fa439
|
||||||
|
|
||||||
|
let overrides = {=}
|
||||||
|
|
||||||
|
let additions = {=}
|
||||||
|
|
||||||
|
in upstream // overrides // additions
|
35
spago.dhall
Normal file
35
spago.dhall
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
{-
|
||||||
|
Welcome to a Spago project!
|
||||||
|
You can edit this file as you like.
|
||||||
|
|
||||||
|
Need help? See the following resources:
|
||||||
|
- Spago documentation: https://github.com/purescript/spago
|
||||||
|
- Dhall language tour: https://docs.dhall-lang.org/tutorials/Language-Tour.html
|
||||||
|
|
||||||
|
When creating a new Spago project, you can use
|
||||||
|
`spago init --no-comments` or `spago init -C`
|
||||||
|
to generate this file without the comments in this block.
|
||||||
|
-}
|
||||||
|
{ name = "ps-screeps-bot"
|
||||||
|
, dependencies =
|
||||||
|
[ "argonaut-codecs"
|
||||||
|
, "argonaut-core"
|
||||||
|
, "argonaut-generic"
|
||||||
|
, "arrays"
|
||||||
|
, "console"
|
||||||
|
, "effect"
|
||||||
|
, "either"
|
||||||
|
, "foldable-traversable"
|
||||||
|
, "foreign-object"
|
||||||
|
, "functions"
|
||||||
|
, "integers"
|
||||||
|
, "lists"
|
||||||
|
, "maybe"
|
||||||
|
, "ordered-collections"
|
||||||
|
, "partial"
|
||||||
|
, "prelude"
|
||||||
|
, "tuples"
|
||||||
|
]
|
||||||
|
, packages = ./packages.dhall
|
||||||
|
, sources = [ "src/**/*.purs", "test/**/*.purs" ]
|
||||||
|
}
|
58
src/Main.purs
Normal file
58
src/Main.purs
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
module Main where
|
||||||
|
|
||||||
|
import Prelude
|
||||||
|
import Screeps.Types
|
||||||
|
|
||||||
|
import Data.Argonaut.Decode (printJsonDecodeError)
|
||||||
|
import Data.Either (Either(..))
|
||||||
|
import Data.Int (decimal, toStringAs)
|
||||||
|
import Data.Maybe (Maybe(..))
|
||||||
|
import Effect (Effect)
|
||||||
|
import Effect.Console (log)
|
||||||
|
import Screeps.Game as Game
|
||||||
|
import Screeps.Memory as Memory
|
||||||
|
import Shimmy.Creep (manageCreeps)
|
||||||
|
import Shimmy.Spawning (initSpawn)
|
||||||
|
|
||||||
|
main :: Effect Unit
|
||||||
|
main = do
|
||||||
|
game <- Game.getGameGlobal
|
||||||
|
memory <- Memory.getMemoryGlobal
|
||||||
|
status <- isInitialized memory
|
||||||
|
case status of
|
||||||
|
Nothing -> do
|
||||||
|
initLoop game memory LoopGo
|
||||||
|
Just s -> do
|
||||||
|
runLoop game memory s
|
||||||
|
|
||||||
|
-- | is initialized
|
||||||
|
isInitialized :: Memory.MemoryGlobal -> Effect (Maybe LoopStatus)
|
||||||
|
isInitialized memory = do
|
||||||
|
status <- Memory.get memory "loopStatus"
|
||||||
|
case status of
|
||||||
|
Left err -> do
|
||||||
|
log $ printJsonDecodeError err
|
||||||
|
pure Nothing
|
||||||
|
Right s -> case s of
|
||||||
|
Nothing -> pure $ Just LoopGo
|
||||||
|
Just s1 -> pure s1
|
||||||
|
|
||||||
|
-- | init loop
|
||||||
|
initLoop :: GameGlobal -> Memory.MemoryGlobal -> LoopStatus -> Effect Unit
|
||||||
|
initLoop game memory status = do
|
||||||
|
log "init loop"
|
||||||
|
Memory.set memory "loopStatus" $ Just status
|
||||||
|
Memory.set memory "utility" 0
|
||||||
|
let creeps = Game.creeps game
|
||||||
|
initSpawn creeps game memory
|
||||||
|
manageCreeps creeps game memory
|
||||||
|
--
|
||||||
|
|
||||||
|
|
||||||
|
-- | run loop
|
||||||
|
runLoop :: GameGlobal -> Memory.MemoryGlobal -> LoopStatus -> Effect Unit
|
||||||
|
runLoop game memory status = do
|
||||||
|
let creeps = Game.creeps game
|
||||||
|
time = Game.time game
|
||||||
|
log $ toStringAs decimal time
|
||||||
|
manageCreeps creeps game memory
|
117
src/Screeps/Const.js
Normal file
117
src/Screeps/Const.js
Normal file
|
@ -0,0 +1,117 @@
|
||||||
|
"use_strict";
|
||||||
|
|
||||||
|
export const ok = OK;
|
||||||
|
export const err_not_owner = ERR_NOT_OWNER;
|
||||||
|
export const err_no_path = ERR_NO_PATH;
|
||||||
|
export const err_name_exists = ERR_NAME_EXISTS;
|
||||||
|
export const err_busy = ERR_BUSY;
|
||||||
|
export const err_not_found = ERR_NOT_FOUND;
|
||||||
|
export const err_not_enough_energy = ERR_NOT_ENOUGH_ENERGY;
|
||||||
|
export const err_not_enough_resources = ERR_NOT_ENOUGH_RESOURCES;
|
||||||
|
export const err_invalid_target = ERR_INVALID_TARGET;
|
||||||
|
export const err_full = ERR_FULL;
|
||||||
|
export const err_not_in_range = ERR_NOT_IN_RANGE;
|
||||||
|
export const err_invalid_args = ERR_INVALID_ARGS;
|
||||||
|
export const err_tired = ERR_TIRED;
|
||||||
|
export const err_no_bodypart = ERR_NO_BODYPART;
|
||||||
|
export const err_not_enough_extensions = ERR_NOT_ENOUGH_EXTENSIONS;
|
||||||
|
export const err_rcl_not_enough = ERR_RCL_NOT_ENOUGH;
|
||||||
|
export const err_gcl_not_enough = ERR_GCL_NOT_ENOUGH;
|
||||||
|
|
||||||
|
export const find_exit_top = FIND_EXIT_TOP;
|
||||||
|
export const find_exit_right = FIND_EXIT_RIGHT;
|
||||||
|
export const find_exit_bottom = FIND_EXIT_BOTTOM;
|
||||||
|
export const find_exit_left = FIND_EXIT_LEFT;
|
||||||
|
export const find_exit = FIND_EXIT;
|
||||||
|
export const find_creeps = FIND_CREEPS;
|
||||||
|
export const find_my_creeps = FIND_MY_CREEPS;
|
||||||
|
export const find_hostile_creeps = FIND_HOSTILE_CREEPS;
|
||||||
|
export const find_sources_active = FIND_SOURCES_ACTIVE;
|
||||||
|
export const find_sources = FIND_SOURCES;
|
||||||
|
export const find_dropped_energy = FIND_DROPPED_ENERGY;
|
||||||
|
export const find_dropped_resources = FIND_DROPPED_RESOURCES;
|
||||||
|
export const find_structures = FIND_STRUCTURES;
|
||||||
|
export const find_structures0 = FIND_STRUCTURES;
|
||||||
|
export const find_my_structures = FIND_MY_STRUCTURES;
|
||||||
|
export const find_hostile_structures = FIND_HOSTILE_STRUCTURES;
|
||||||
|
export const find_flags = FIND_FLAGS;
|
||||||
|
export const find_construction_sites = FIND_CONSTRUCTION_SITES;
|
||||||
|
export const find_my_spawns = FIND_MY_SPAWNS;
|
||||||
|
export const find_hostile_spawns = FIND_HOSTILE_SPAWNS;
|
||||||
|
export const find_my_construction_sites = FIND_MY_CONSTRUCTION_SITES;
|
||||||
|
export const find_hostile_construction_sites = FIND_HOSTILE_CONSTRUCTION_SITES;
|
||||||
|
export const find_minerals = FIND_MINERALS;
|
||||||
|
export const find_nukes = FIND_NUKES;
|
||||||
|
|
||||||
|
export const structure_spawn = STRUCTURE_SPAWN;
|
||||||
|
export const structure_extension = STRUCTURE_EXTENSION;
|
||||||
|
export const structure_road = STRUCTURE_ROAD;
|
||||||
|
export const structure_wall = STRUCTURE_WALL;
|
||||||
|
export const structure_rampart = STRUCTURE_RAMPART;
|
||||||
|
export const structure_keeper_lair = STRUCTURE_KEEPER_LAIR;
|
||||||
|
export const structure_portal = STRUCTURE_PORTAL;
|
||||||
|
export const structure_controller = STRUCTURE_CONTROLLER;
|
||||||
|
export const structure_link = STRUCTURE_LINK;
|
||||||
|
export const structure_storage = STRUCTURE_STORAGE;
|
||||||
|
export const structure_tower = STRUCTURE_TOWER;
|
||||||
|
export const structure_observer = STRUCTURE_OBSERVER;
|
||||||
|
export const structure_power_bank = STRUCTURE_POWER_BANK;
|
||||||
|
export const structure_power_spawn = STRUCTURE_POWER_SPAWN;
|
||||||
|
export const structure_extractor = STRUCTURE_EXTRACTOR;
|
||||||
|
export const structure_lab = STRUCTURE_LAB;
|
||||||
|
export const structure_terminal = STRUCTURE_TERMINAL;
|
||||||
|
export const structure_container = STRUCTURE_CONTAINER;
|
||||||
|
export const structure_nuker = STRUCTURE_NUKER;
|
||||||
|
|
||||||
|
export const pMove = MOVE;
|
||||||
|
export const pWork = WORK;
|
||||||
|
export const pCarry = CARRY;
|
||||||
|
|
||||||
|
export const resource_energy = RESOURCE_ENERGY;
|
||||||
|
export const resource_power = RESOURCE_POWER;
|
||||||
|
|
||||||
|
export const resource_hydrogen = RESOURCE_HYDROGEN;
|
||||||
|
export const resource_oxygen = RESOURCE_OXYGEN;
|
||||||
|
export const resource_utrium = RESOURCE_UTRIUM;
|
||||||
|
export const resource_lemergium = RESOURCE_LEMERGIUM;
|
||||||
|
export const resource_keanium = RESOURCE_KEANIUM;
|
||||||
|
export const resource_zynthium = RESOURCE_ZYNTHIUM;
|
||||||
|
export const resource_catalyst = RESOURCE_CATALYST;
|
||||||
|
export const resource_ghodium = RESOURCE_GHODIUM;
|
||||||
|
|
||||||
|
export const resource_hydroxide = RESOURCE_HYDROXIDE;
|
||||||
|
export const resource_zynthium_keanite = RESOURCE_ZYNTHIUM_KEANITE;
|
||||||
|
export const resource_utrium_lemergite = RESOURCE_UTRIUM_LEMERGITE;
|
||||||
|
|
||||||
|
export const resource_utrium_hydride = RESOURCE_UTRIUM_HYDRIDE;
|
||||||
|
export const resource_utrium_oxide = RESOURCE_UTRIUM_OXIDE;
|
||||||
|
export const resource_keanium_hydride = RESOURCE_KEANIUM_HYDRIDE;
|
||||||
|
export const resource_keanium_oxide = RESOURCE_KEANIUM_OXIDE;
|
||||||
|
export const resource_lemergium_hydride = RESOURCE_LEMERGIUM_HYDRIDE;
|
||||||
|
export const resource_lemergium_oxide = RESOURCE_LEMERGIUM_OXIDE;
|
||||||
|
export const resource_zynthium_hydride = RESOURCE_ZYNTHIUM_HYDRIDE;
|
||||||
|
export const resource_zynthium_oxide = RESOURCE_ZYNTHIUM_OXIDE;
|
||||||
|
export const resource_ghodium_hydride = RESOURCE_GHODIUM_HYDRIDE;
|
||||||
|
export const resource_ghodium_oxide = RESOURCE_GHODIUM_OXIDE;
|
||||||
|
|
||||||
|
export const resource_utrium_acid = RESOURCE_UTRIUM_ACID;
|
||||||
|
export const resource_utrium_alkalide = RESOURCE_UTRIUM_ALKALIDE;
|
||||||
|
export const resource_keanium_acid = RESOURCE_KEANIUM_ACID;
|
||||||
|
export const resource_keanium_alkalide = RESOURCE_KEANIUM_ALKALIDE;
|
||||||
|
export const resource_lemergium_acid = RESOURCE_LEMERGIUM_ACID;
|
||||||
|
export const resource_lemergium_alkalide = RESOURCE_LEMERGIUM_ALKALIDE;
|
||||||
|
export const resource_zynthium_acid = RESOURCE_ZYNTHIUM_ACID;
|
||||||
|
export const resource_zynthium_alkalide = RESOURCE_ZYNTHIUM_ALKALIDE;
|
||||||
|
export const resource_ghodium_acid = RESOURCE_GHODIUM_ACID;
|
||||||
|
export const resource_ghodium_alkalide = RESOURCE_GHODIUM_ALKALIDE;
|
||||||
|
|
||||||
|
export const resource_catalyzed_utrium_acid = RESOURCE_CATALYZED_UTRIUM_ACID;
|
||||||
|
export const resource_catalyzed_utrium_alkalide = RESOURCE_CATALYZED_UTRIUM_ALKALIDE;
|
||||||
|
export const resource_catalyzed_keanium_acid = RESOURCE_CATALYZED_KEANIUM_ACID;
|
||||||
|
export const resource_catalyzed_keanium_alkalide = RESOURCE_CATALYZED_KEANIUM_ALKALIDE;
|
||||||
|
export const resource_catalyzed_lemergium_acid = RESOURCE_CATALYZED_LEMERGIUM_ACID;
|
||||||
|
export const resource_catalyzed_lemergium_alkalide = RESOURCE_CATALYZED_LEMERGIUM_ALKALIDE;
|
||||||
|
export const resource_catalyzed_zynthium_acid = RESOURCE_CATALYZED_ZYNTHIUM_ACID;
|
||||||
|
export const resource_catalyzed_zynthium_alkalide = RESOURCE_CATALYZED_ZYNTHIUM_ALKALIDE;
|
||||||
|
export const resource_catalyzed_ghodium_acid = RESOURCE_CATALYZED_GHODIUM_ACID;
|
||||||
|
export const resource_catalyzed_ghodium_alkalide = RESOURCE_CATALYZED_GHODIUM_ALKALIDE;
|
118
src/Screeps/Const.purs
Normal file
118
src/Screeps/Const.purs
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
module Screeps.Const where
|
||||||
|
import Prelude
|
||||||
|
import Screeps.Types
|
||||||
|
|
||||||
|
|
||||||
|
foreign import ok :: ReturnCode
|
||||||
|
foreign import err_not_owner :: ReturnCode
|
||||||
|
foreign import err_no_path :: ReturnCode
|
||||||
|
foreign import err_name_exists :: ReturnCode
|
||||||
|
foreign import err_busy :: ReturnCode
|
||||||
|
foreign import err_not_found :: ReturnCode
|
||||||
|
foreign import err_not_enough_energy :: ReturnCode
|
||||||
|
foreign import err_not_enough_resources :: ReturnCode
|
||||||
|
foreign import err_invalid_target :: ReturnCode
|
||||||
|
foreign import err_full :: ReturnCode
|
||||||
|
foreign import err_not_in_range :: ReturnCode
|
||||||
|
foreign import err_invalid_args :: ReturnCode
|
||||||
|
foreign import err_tired :: ReturnCode
|
||||||
|
foreign import err_no_bodypart :: ReturnCode
|
||||||
|
foreign import err_not_enough_extensions :: ReturnCode
|
||||||
|
foreign import err_rcl_not_enough :: ReturnCode
|
||||||
|
foreign import err_gcl_not_enough :: ReturnCode
|
||||||
|
|
||||||
|
foreign import pMove :: BodyPartType
|
||||||
|
foreign import pWork :: BodyPartType
|
||||||
|
foreign import pCarry :: BodyPartType
|
||||||
|
|
||||||
|
foreign import find_exit_top :: FindType RoomPosition
|
||||||
|
foreign import find_exit_right :: FindType RoomPosition
|
||||||
|
foreign import find_exit_bottom :: FindType RoomPosition
|
||||||
|
foreign import find_exit_left :: FindType RoomPosition
|
||||||
|
foreign import find_exit :: FindType RoomPosition
|
||||||
|
foreign import find_creeps :: FindType Creep
|
||||||
|
foreign import find_my_creeps :: FindType Creep
|
||||||
|
foreign import find_hostile_creeps :: FindType Creep
|
||||||
|
foreign import find_sources_active :: FindType Source
|
||||||
|
foreign import find_sources :: FindType Source
|
||||||
|
foreign import find_dropped_energy :: FindType Resource
|
||||||
|
foreign import find_dropped_resources :: FindType Resource
|
||||||
|
foreign import find_structures :: FindType (Structure Unit)
|
||||||
|
foreign import find_my_structures :: forall a. FindType (Structure a)
|
||||||
|
foreign import find_hostile_structures :: FindType (Structure Unit)
|
||||||
|
foreign import find_flags :: FindType Flag
|
||||||
|
foreign import find_construction_sites :: FindType ConstructionSite
|
||||||
|
foreign import find_my_spawns :: FindType Spawn
|
||||||
|
foreign import find_hostile_spawns :: FindType Spawn
|
||||||
|
foreign import find_my_construction_sites :: FindType ConstructionSite
|
||||||
|
foreign import find_hostile_construction_sites :: FindType ConstructionSite
|
||||||
|
foreign import find_minerals :: FindType Mineral
|
||||||
|
foreign import find_nukes :: FindType Nuke
|
||||||
|
|
||||||
|
foreign import structure_spawn :: StructureType
|
||||||
|
foreign import structure_extension :: StructureType
|
||||||
|
foreign import structure_road :: StructureType
|
||||||
|
foreign import structure_wall :: StructureType
|
||||||
|
foreign import structure_rampart :: StructureType
|
||||||
|
foreign import structure_keeper_lair :: StructureType
|
||||||
|
foreign import structure_portal :: StructureType
|
||||||
|
foreign import structure_controller :: StructureType
|
||||||
|
foreign import structure_link :: StructureType
|
||||||
|
foreign import structure_storage :: StructureType
|
||||||
|
foreign import structure_tower :: StructureType
|
||||||
|
foreign import structure_observer :: StructureType
|
||||||
|
foreign import structure_power_bank :: StructureType
|
||||||
|
foreign import structure_power_spawn :: StructureType
|
||||||
|
foreign import structure_extractor :: StructureType
|
||||||
|
foreign import structure_lab :: StructureType
|
||||||
|
foreign import structure_terminal :: StructureType
|
||||||
|
foreign import structure_container :: StructureType
|
||||||
|
foreign import structure_nuker :: StructureType
|
||||||
|
foreign import resource_energy :: ResourceType
|
||||||
|
foreign import resource_power :: ResourceType
|
||||||
|
|
||||||
|
foreign import resource_hydrogen :: ResourceType
|
||||||
|
foreign import resource_oxygen :: ResourceType
|
||||||
|
foreign import resource_utrium :: ResourceType
|
||||||
|
foreign import resource_lemergium :: ResourceType
|
||||||
|
foreign import resource_keanium :: ResourceType
|
||||||
|
foreign import resource_zynthium :: ResourceType
|
||||||
|
foreign import resource_catalyst :: ResourceType
|
||||||
|
foreign import resource_ghodium :: ResourceType
|
||||||
|
|
||||||
|
foreign import resource_hydroxide :: ResourceType
|
||||||
|
foreign import resource_zynthium_keanite :: ResourceType
|
||||||
|
foreign import resource_utrium_lemergite :: ResourceType
|
||||||
|
|
||||||
|
foreign import resource_utrium_hydride :: ResourceType
|
||||||
|
foreign import resource_utrium_oxide :: ResourceType
|
||||||
|
foreign import resource_keanium_hydride :: ResourceType
|
||||||
|
foreign import resource_keanium_oxide :: ResourceType
|
||||||
|
foreign import resource_lemergium_hydride :: ResourceType
|
||||||
|
foreign import resource_lemergium_oxide :: ResourceType
|
||||||
|
foreign import resource_zynthium_hydride :: ResourceType
|
||||||
|
foreign import resource_zynthium_oxide :: ResourceType
|
||||||
|
foreign import resource_ghodium_hydride :: ResourceType
|
||||||
|
foreign import resource_ghodium_oxide :: ResourceType
|
||||||
|
|
||||||
|
foreign import resource_utrium_acid :: ResourceType
|
||||||
|
foreign import resource_utrium_alkalide :: ResourceType
|
||||||
|
foreign import resource_keanium_acid :: ResourceType
|
||||||
|
foreign import resource_keanium_alkalide :: ResourceType
|
||||||
|
foreign import resource_lemergium_acid :: ResourceType
|
||||||
|
foreign import resource_lemergium_alkalide :: ResourceType
|
||||||
|
foreign import resource_zynthium_acid :: ResourceType
|
||||||
|
foreign import resource_zynthium_alkalide :: ResourceType
|
||||||
|
foreign import resource_ghodium_acid :: ResourceType
|
||||||
|
foreign import resource_ghodium_alkalide :: ResourceType
|
||||||
|
|
||||||
|
foreign import resource_catalyzed_utrium_acid :: ResourceType
|
||||||
|
foreign import resource_catalyzed_utrium_alkalide :: ResourceType
|
||||||
|
foreign import resource_catalyzed_keanium_acid :: ResourceType
|
||||||
|
foreign import resource_catalyzed_keanium_alkalide :: ResourceType
|
||||||
|
foreign import resource_catalyzed_lemergium_acid :: ResourceType
|
||||||
|
foreign import resource_catalyzed_lemergium_alkalide :: ResourceType
|
||||||
|
foreign import resource_catalyzed_zynthium_acid :: ResourceType
|
||||||
|
foreign import resource_catalyzed_zynthium_alkalide :: ResourceType
|
||||||
|
foreign import resource_catalyzed_ghodium_acid :: ResourceType
|
||||||
|
foreign import resource_catalyzed_ghodium_alkalide :: ResourceType
|
4
src/Screeps/Creep.js
Normal file
4
src/Screeps/Creep.js
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
"use strict";
|
||||||
|
export function totalAmtCarrying(creep){
|
||||||
|
return _.sum(creep.carry);
|
||||||
|
}
|
133
src/Screeps/Creep.purs
Normal file
133
src/Screeps/Creep.purs
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
module Screeps.Creep where
|
||||||
|
|
||||||
|
import Prelude
|
||||||
|
import Effect (Effect)
|
||||||
|
import Data.Maybe (Maybe)
|
||||||
|
import Data.Either (Either)
|
||||||
|
import Data.Argonaut.Decode (class DecodeJson, decodeJson, JsonDecodeError)
|
||||||
|
import Data.Argonaut.Encode (class EncodeJson, encodeJson)
|
||||||
|
import Screeps.FFI (unsafeGetCreepEff)
|
||||||
|
import Screeps.Types
|
||||||
|
import Screeps.FFI ( unsafeField, runThisFn1
|
||||||
|
, runThisEffFn1, runThisEffFn2
|
||||||
|
, runThisEffFn3, toMaybe
|
||||||
|
, unsafeGetCreepEff, unsafeSetCreepEff
|
||||||
|
, unsafeGetAllCreepEff )
|
||||||
|
foreign import data CreepCargo :: Type
|
||||||
|
foreign import totalAmtCarrying :: Creep -> Int
|
||||||
|
|
||||||
|
body :: Creep -> Array BodyPart
|
||||||
|
body creep = unsafeField "body" creep
|
||||||
|
|
||||||
|
carry :: Creep -> CreepCargo
|
||||||
|
carry = unsafeField "carry"
|
||||||
|
|
||||||
|
amtCarrying :: Creep -> ResourceType -> Int
|
||||||
|
amtCarrying creep res = unsafeField (show res) $ carry creep
|
||||||
|
|
||||||
|
carryCapacity :: Creep -> Int
|
||||||
|
carryCapacity = unsafeField "carryCapacity"
|
||||||
|
|
||||||
|
fatigue :: Creep -> Int
|
||||||
|
fatigue = unsafeField "fatigue"
|
||||||
|
|
||||||
|
hits :: Creep -> Int
|
||||||
|
hits = unsafeField "hits"
|
||||||
|
|
||||||
|
hitsMax :: Creep -> Int
|
||||||
|
hitsMax = unsafeField "hitsMax"
|
||||||
|
|
||||||
|
getId :: Creep -> Id Creep
|
||||||
|
getId = unsafeField "id"
|
||||||
|
|
||||||
|
getIdAsStr :: Creep -> String
|
||||||
|
getIdAsStr = unsafeField "id"
|
||||||
|
|
||||||
|
my :: Creep -> Boolean
|
||||||
|
my = unsafeField "my"
|
||||||
|
|
||||||
|
name :: Creep -> String
|
||||||
|
name = unsafeField "name"
|
||||||
|
|
||||||
|
owner :: Creep -> { username :: String }
|
||||||
|
owner = unsafeField "owner"
|
||||||
|
|
||||||
|
saying :: Creep -> Maybe String
|
||||||
|
saying c = toMaybe $ unsafeField "saying" c
|
||||||
|
|
||||||
|
spawning :: Creep -> Boolean
|
||||||
|
spawning = unsafeField "spawning"
|
||||||
|
|
||||||
|
ticksToLive :: Creep -> Int
|
||||||
|
ticksToLive = unsafeField "ticksToLive"
|
||||||
|
|
||||||
|
attackCreep :: Creep -> Creep -> Effect ReturnCode
|
||||||
|
attackCreep = runThisEffFn1 "attack"
|
||||||
|
|
||||||
|
attackStructure :: forall a. Creep → Structure a -> Effect ReturnCode
|
||||||
|
attackStructure = runThisEffFn1 "attack"
|
||||||
|
|
||||||
|
attackController :: forall a. Creep -> Structure a -> Effect ReturnCode
|
||||||
|
attackController = runThisEffFn1 "attackController"
|
||||||
|
|
||||||
|
build :: Creep -> ConstructionSite -> Effect ReturnCode
|
||||||
|
build = runThisEffFn1 "build"
|
||||||
|
|
||||||
|
cancelOrder :: Creep -> String -> Effect ReturnCode
|
||||||
|
cancelOrder = runThisEffFn1 "cancelOrder"
|
||||||
|
|
||||||
|
claimController :: forall a. Creep -> Structure a -> Effect ReturnCode
|
||||||
|
claimController = runThisEffFn1 "claimController"
|
||||||
|
|
||||||
|
dismantle :: forall a. Creep -> Structure a -> Effect ReturnCode
|
||||||
|
dismantle = runThisEffFn1 "dismantle"
|
||||||
|
|
||||||
|
drop :: Creep -> ResourceType -> Effect ReturnCode
|
||||||
|
drop = runThisEffFn1 "drop"
|
||||||
|
|
||||||
|
dropAmt :: Creep -> ResourceType -> Int -> Effect ReturnCode
|
||||||
|
dropAmt = runThisEffFn2 "drop"
|
||||||
|
|
||||||
|
getActiveBodyparts :: Creep -> BodyPartType -> Int
|
||||||
|
getActiveBodyparts = runThisFn1 "getActiveBodyparts"
|
||||||
|
|
||||||
|
harvestSource :: Creep -> Source -> Effect ReturnCode
|
||||||
|
harvestSource = runThisEffFn1 "harvest"
|
||||||
|
|
||||||
|
harvestMineral :: Creep -> Mineral -> Effect ReturnCode
|
||||||
|
harvestMineral = runThisEffFn1 "harvest"
|
||||||
|
|
||||||
|
heal :: Creep -> Creep -> Effect ReturnCode
|
||||||
|
heal = runThisEffFn1 "heal"
|
||||||
|
|
||||||
|
move :: Creep -> Direction -> Effect ReturnCode
|
||||||
|
move = runThisEffFn1 "move"
|
||||||
|
|
||||||
|
moveByPath :: Creep -> Path -> Effect ReturnCode
|
||||||
|
moveByPath = runThisEffFn1 "moveByPath"
|
||||||
|
|
||||||
|
moveTo :: forall a. Creep -> TargetPosition a -> Effect ReturnCode
|
||||||
|
moveTo creep (TargetPt x y) = runThisEffFn2 "moveTo" creep x y
|
||||||
|
moveTo creep (TargetPos pos) = runThisEffFn1 "moveTo" creep pos
|
||||||
|
moveTo creep (TargetObj obj) = runThisEffFn1 "moveTo" creep obj
|
||||||
|
|
||||||
|
transferToCreep :: Creep -> Creep -> ResourceType -> Int -> Effect ReturnCode
|
||||||
|
transferToCreep = runThisEffFn3 "transfer"
|
||||||
|
|
||||||
|
transferToStructure :: forall a. Creep -> Structure a -> ResourceType -> Effect ReturnCode
|
||||||
|
transferToStructure = runThisEffFn2 "transfer"
|
||||||
|
|
||||||
|
transferAmtToStructure :: forall a. Creep -> Structure a -> ResourceType -> Int -> Effect ReturnCode
|
||||||
|
transferAmtToStructure = runThisEffFn3 "transfer"
|
||||||
|
|
||||||
|
creepStore ∷ Creep → Store
|
||||||
|
creepStore = unsafeField "store"
|
||||||
|
|
||||||
|
getAllCreepMem ∷ ∀ a. (DecodeJson a) ⇒ String → Effect (Either JsonDecodeError a)
|
||||||
|
getAllCreepMem creep = decodeJson <$> unsafeGetAllCreepEff creep
|
||||||
|
|
||||||
|
getCreepMem ∷ ∀ a. (DecodeJson a) ⇒ String → String → Effect (Either JsonDecodeError a)
|
||||||
|
getCreepMem creep key = decodeJson <$> unsafeGetCreepEff creep key
|
||||||
|
|
||||||
|
setCreepMem ∷ ∀ a. (EncodeJson a) ⇒ String → String → a → Effect Unit
|
||||||
|
setCreepMem creep key val = unsafeSetCreepEff creep key $ encodeJson val
|
166
src/Screeps/FFI.js
Normal file
166
src/Screeps/FFI.js
Normal file
|
@ -0,0 +1,166 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
// module Screeps.FFI
|
||||||
|
|
||||||
|
export function unsafeField(key){
|
||||||
|
return function(obj){
|
||||||
|
return obj[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function unsafeGetFieldEff(key){
|
||||||
|
return function(obj){
|
||||||
|
return function(){
|
||||||
|
return obj[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function unsafeSetFieldEff(key){
|
||||||
|
return function(obj){
|
||||||
|
return function(val){
|
||||||
|
return function(){
|
||||||
|
obj[key] = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function unsafeDeleteFieldEff(key){
|
||||||
|
return function(obj){
|
||||||
|
return function(){
|
||||||
|
delete obj[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function runThisEffFn0(key){
|
||||||
|
return function(self){
|
||||||
|
return function(){
|
||||||
|
return self[key]();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function runThisEffFn1(key){
|
||||||
|
return function(self){
|
||||||
|
return function(a){
|
||||||
|
return function(){
|
||||||
|
return self[key](a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function runThisEffFn2(key){
|
||||||
|
return function(self){
|
||||||
|
return function(a){
|
||||||
|
return function(b){
|
||||||
|
return function(){
|
||||||
|
return self[key](a, b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function runThisEffFn3(key){
|
||||||
|
return function(self){
|
||||||
|
return function(a){
|
||||||
|
return function(b){
|
||||||
|
return function(c){
|
||||||
|
return function(){
|
||||||
|
return self[key](a, b, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function runThisEffFn4(key){
|
||||||
|
return function(self){
|
||||||
|
return function(a){
|
||||||
|
return function(b){
|
||||||
|
return function(c){
|
||||||
|
return function(d){
|
||||||
|
return function(){
|
||||||
|
return self[key](a, b, c, d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function runThisFn0(key){
|
||||||
|
return function(self){
|
||||||
|
return self[key]();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function runThisFn1(key){
|
||||||
|
return function(self){
|
||||||
|
return function(a){
|
||||||
|
return self[key](a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function runThisFn2(key){
|
||||||
|
return function(self){
|
||||||
|
return function(a){
|
||||||
|
return function(b){
|
||||||
|
return self[key](a,b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function runThisFn3(key){
|
||||||
|
return function(self){
|
||||||
|
return function(a){
|
||||||
|
return function(b){
|
||||||
|
return function(c){
|
||||||
|
return self[key](a,b,c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export const _null = null;
|
||||||
|
export const _undefined = undefined
|
||||||
|
export function notNullOrUndefined(x){
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
export function isNull(x){
|
||||||
|
return x === null;
|
||||||
|
}
|
||||||
|
export function isUndefined(x){
|
||||||
|
return x === undefined;
|
||||||
|
}
|
||||||
|
export function toMaybeImpl (val, nothing, just){
|
||||||
|
if(val === null || val === undefined){
|
||||||
|
return nothing;
|
||||||
|
} else {
|
||||||
|
return just(val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function unsafeGetAllCreepEff(creep){
|
||||||
|
return function(){
|
||||||
|
return Memory.creeps[creep];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function unsafeGetCreepEff(creep,key){
|
||||||
|
return function(){
|
||||||
|
return Memory.creeps[creep][key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function unsafeSetCreepEff(creep,key){
|
||||||
|
return function(val){
|
||||||
|
return Memory.creeps[creep][key] = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// export function rawSpawnCreep(){
|
||||||
|
// return function (self){
|
||||||
|
// return function(spawn){
|
||||||
|
// return function(parts){
|
||||||
|
// return function(name){
|
||||||
|
// return function(r){
|
||||||
|
// console.log("spawning creep...");
|
||||||
|
// return self.spawns[spawn].spawnCreep(parts,name,{memory: {role: r, utility: 1}});
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
37
src/Screeps/FFI.purs
Normal file
37
src/Screeps/FFI.purs
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
module Screeps.FFI where
|
||||||
|
import Prelude
|
||||||
|
import Effect (Effect)
|
||||||
|
import Data.Maybe (Maybe(Just, Nothing), isJust, fromJust, maybe)
|
||||||
|
import Data.Function.Uncurried ( Fn3, runFn3 )
|
||||||
|
import Screeps.Types
|
||||||
|
|
||||||
|
foreign import unsafeField :: forall obj val. String -> obj -> val
|
||||||
|
foreign import unsafeGetFieldEff :: forall obj val. String -> obj -> Effect val
|
||||||
|
foreign import unsafeSetFieldEff :: forall obj val. String -> obj -> val -> Effect Unit
|
||||||
|
foreign import unsafeDeleteFieldEff :: forall obj. String -> obj -> Effect Unit
|
||||||
|
foreign import runThisEffFn0 :: forall this a. String -> this -> Effect a
|
||||||
|
foreign import runThisEffFn1 :: forall this a b. String -> this -> a -> Effect b
|
||||||
|
foreign import runThisEffFn2 :: forall this a b c. String -> this -> a -> b -> Effect c
|
||||||
|
foreign import runThisEffFn3 :: forall this a b c d. String
|
||||||
|
-> this -> a -> b -> c -> Effect d
|
||||||
|
foreign import runThisEffFn4 :: forall this a b c d e. String
|
||||||
|
-> this -> a -> b -> c -> d -> Effect e
|
||||||
|
foreign import runThisFn0 :: forall this a. String -> this -> a
|
||||||
|
foreign import runThisFn1 :: forall this a b. String -> this -> a -> b
|
||||||
|
foreign import runThisFn2 :: forall this a b c. String -> this -> a -> b → c
|
||||||
|
foreign import runThisFn3 :: forall this a b c d. String -> this -> a -> b → c → d
|
||||||
|
|
||||||
|
foreign import data NullOrUndefined :: Type -> Type
|
||||||
|
foreign import _null :: forall a. NullOrUndefined a
|
||||||
|
foreign import _undefined :: forall a. NullOrUndefined a
|
||||||
|
foreign import notNullOrUndefined :: forall a. a -> NullOrUndefined a
|
||||||
|
foreign import isNull :: forall a. NullOrUndefined a -> Boolean
|
||||||
|
foreign import isUndefined :: forall a. NullOrUndefined a -> Boolean
|
||||||
|
foreign import toMaybeImpl :: forall a m. Fn3 (NullOrUndefined a) m (a -> m) m
|
||||||
|
|
||||||
|
foreign import unsafeGetAllCreepEff :: ∀ val. String → Effect val
|
||||||
|
foreign import unsafeGetCreepEff :: ∀ val. String → String → Effect val
|
||||||
|
foreign import unsafeSetCreepEff :: ∀ val. String → String → val → Effect Unit
|
||||||
|
|
||||||
|
toMaybe :: forall a. NullOrUndefined a -> Maybe a
|
||||||
|
toMaybe n = runFn3 toMaybeImpl n Nothing Just
|
32
src/Screeps/Game.js
Normal file
32
src/Screeps/Game.js
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
export function getGameGlobal(){ return Game; }
|
||||||
|
export function createCreepImpl(structure){
|
||||||
|
return function(parts){
|
||||||
|
return function(role){
|
||||||
|
return function(left){
|
||||||
|
return function(right){
|
||||||
|
return function(){
|
||||||
|
var result = structure.createCreep(parts,{utility: 1, role: role});
|
||||||
|
if (typeof result === "string"){
|
||||||
|
return right(result);
|
||||||
|
} else {
|
||||||
|
return left(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function rawGetUtility(key){
|
||||||
|
return function(obj){
|
||||||
|
return obj.creeps[key].utility;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function rawGetRole(key){
|
||||||
|
return function(obj){
|
||||||
|
return obj.creeps[key].role;
|
||||||
|
}
|
||||||
|
}
|
65
src/Screeps/Game.purs
Normal file
65
src/Screeps/Game.purs
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
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"
|
21
src/Screeps/Memory.js
Normal file
21
src/Screeps/Memory.js
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
export function getMemoryGlobal(){ return Memory; }
|
||||||
|
export function getRawMemoryGlobal(){ return RawMemory; }
|
||||||
|
export function getCreepsUtl(){
|
||||||
|
var res = []
|
||||||
|
for (var c in Memory.creeps) {
|
||||||
|
res = res.concat(Memory.creeps[c]["utility"])
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
export function getCreepsNames(){
|
||||||
|
var res = []
|
||||||
|
for (var c in Memory.creeps) {
|
||||||
|
res += c
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
export function setCreepsUtl(key,n){
|
||||||
|
return Memory.creeps[key] = n
|
||||||
|
}
|
22
src/Screeps/Memory.purs
Normal file
22
src/Screeps/Memory.purs
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
module Screeps.Memory where
|
||||||
|
import Prelude
|
||||||
|
import Effect (Effect)
|
||||||
|
import Screeps.FFI (unsafeGetFieldEff, unsafeSetFieldEff)
|
||||||
|
import Data.Tuple (Tuple)
|
||||||
|
import Data.Argonaut.Core ( Json )
|
||||||
|
import Data.Argonaut.Decode (class DecodeJson, decodeJson, JsonDecodeError)
|
||||||
|
import Data.Argonaut.Encode (class EncodeJson, encodeJson)
|
||||||
|
import Data.Either (Either)
|
||||||
|
import Foreign.Object as F
|
||||||
|
|
||||||
|
foreign import data MemoryGlobal :: Type
|
||||||
|
foreign import getMemoryGlobal :: Effect MemoryGlobal
|
||||||
|
foreign import data RawMemoryGlobal :: Type
|
||||||
|
foreign import getRawMemoryGlobal :: Effect RawMemoryGlobal
|
||||||
|
foreign import setCreepsUtl :: String -> Int -> Effect Unit
|
||||||
|
foreign import getCreepsUtl :: Effect (Array Int)
|
||||||
|
|
||||||
|
set :: forall a. (EncodeJson a) => MemoryGlobal -> String -> a -> Effect Unit
|
||||||
|
set memoryGlobal key val = unsafeSetFieldEff key memoryGlobal $ encodeJson val
|
||||||
|
get :: forall a. (DecodeJson a) => MemoryGlobal -> String -> Effect (Either JsonDecodeError a)
|
||||||
|
get memoryGlobal key = decodeJson <$> unsafeGetFieldEff key memoryGlobal
|
5
src/Screeps/Room.js
Normal file
5
src/Screeps/Room.js
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
export function setRoomMem(room,nharvs,maxnharvs){
|
||||||
|
return room.memory = { "nharvs" : nharvs, "maxnharvs" : maxnharvs };
|
||||||
|
}
|
36
src/Screeps/Room.purs
Normal file
36
src/Screeps/Room.purs
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
module Screeps.Room where
|
||||||
|
import Prelude
|
||||||
|
import Effect (Effect)
|
||||||
|
import Data.Maybe ( Maybe )
|
||||||
|
import Screeps.Structure ( structureType )
|
||||||
|
import Screeps.Game as Game
|
||||||
|
import Screeps.Types
|
||||||
|
import Screeps.FFI ( runThisFn0, runThisFn1
|
||||||
|
, runThisFn2, runThisFn3
|
||||||
|
, unsafeField, toMaybe )
|
||||||
|
import Foreign.Object as F
|
||||||
|
|
||||||
|
-- | returns a list of sources given a room
|
||||||
|
--findSources ∷ ∀ a. Room → Array (RoomObject a)
|
||||||
|
--findSources room = find' room find_structures (\s → isSource s)
|
||||||
|
foreign import setRoomMem :: Room → Int → Int → Effect Unit
|
||||||
|
|
||||||
|
find ∷ ∀ a. Room → FindType a → Array a
|
||||||
|
find = runThisFn1 "find"
|
||||||
|
-- | returns find when we want to use optional filter
|
||||||
|
find' ∷ ∀ a. Room → FindType a → FilterFn a → Array a
|
||||||
|
find' room findType filter = runThisFn2 "find" room findType { filter }
|
||||||
|
|
||||||
|
room ∷ ∀ a. RoomObject a → Room
|
||||||
|
room = unsafeField "room"
|
||||||
|
|
||||||
|
storage ∷ Room → Storage
|
||||||
|
storage = unsafeField "storage"
|
||||||
|
|
||||||
|
getTerrain ∷ Room → Terrain
|
||||||
|
getTerrain = runThisFn0 "getTerrain"
|
||||||
|
|
||||||
|
getTerrainAt ∷ ∀ a. TargetPosition a → String → Terrain
|
||||||
|
getTerrainAt (TargetPt x y) roomName = runThisFn3 "getTerrainAt" Game.map x y roomName
|
||||||
|
getTerrainAt (TargetPos pos) roomName = runThisFn2 "getTerrainAt" Game.map pos roomName
|
||||||
|
getTerrainAt (TargetObj obj) roomName = runThisFn2 "getTerrainAt" Game.map obj roomName
|
12
src/Screeps/Spawn.js
Normal file
12
src/Screeps/Spawn.js
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
export function spawnStoreCapacity(obj){
|
||||||
|
var ret = obj.store;
|
||||||
|
if (typeof ret !== 'undefined')
|
||||||
|
return ret.getFreeCapacity(RESOURCE_ENERGY);
|
||||||
|
}
|
||||||
|
export function spawnStoreEnergy(obj){
|
||||||
|
var ret = obj.store;
|
||||||
|
if (typeof ret !== 'undefined')
|
||||||
|
return ret[RESOURCE_ENERGY];
|
||||||
|
}
|
13
src/Screeps/Spawn.purs
Normal file
13
src/Screeps/Spawn.purs
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
module Screeps.Spawn where
|
||||||
|
|
||||||
|
import Prelude
|
||||||
|
import Effect (Effect)
|
||||||
|
import Screeps.Types
|
||||||
|
import Screeps.FFI ( unsafeField, toMaybe )
|
||||||
|
import Data.Maybe (Maybe)
|
||||||
|
|
||||||
|
foreign import spawnStoreCapacity ∷ ∀ obj. obj → Int
|
||||||
|
foreign import spawnStoreEnergy ∷ ∀ obj. obj → Int
|
||||||
|
|
||||||
|
spawnStore ∷ ∀ a. Structure a → Store
|
||||||
|
spawnStore = unsafeField "store"
|
19
src/Screeps/Storage.purs
Normal file
19
src/Screeps/Storage.purs
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
module Screeps.Storage where
|
||||||
|
import Prelude
|
||||||
|
import Screeps.Types
|
||||||
|
import Screeps.FFI (unsafeField,runThisFn0)
|
||||||
|
|
||||||
|
storeFreeCapacity ∷ Store → Int
|
||||||
|
storeFreeCapacity = runThisFn0 "getFreeCapacity"
|
||||||
|
|
||||||
|
storeCapacity ∷ Store → Int
|
||||||
|
storeCapacity = unsafeField "storeCapacity"
|
||||||
|
|
||||||
|
store ∷ Storage → Store
|
||||||
|
store = unsafeField "store"
|
||||||
|
|
||||||
|
storageGet ∷ Storage → ResourceType → Int
|
||||||
|
storageGet s (ResourceType res) = unsafeField res (store s)
|
||||||
|
|
||||||
|
storeGet ∷ Store → ResourceType → Int
|
||||||
|
storeGet s (ResourceType res) = unsafeField res s
|
8
src/Screeps/Structure.purs
Normal file
8
src/Screeps/Structure.purs
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
module Screeps.Structure where
|
||||||
|
import Prelude
|
||||||
|
import Effect (Effect)
|
||||||
|
import Screeps.Types
|
||||||
|
import Screeps.FFI ( unsafeField )
|
||||||
|
|
||||||
|
structureType ∷ ∀ a. Structure a → StructureType
|
||||||
|
structureType = unsafeField "structureType"
|
211
src/Screeps/Types.purs
Normal file
211
src/Screeps/Types.purs
Normal file
|
@ -0,0 +1,211 @@
|
||||||
|
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
|
20
src/Shimmy/Creep.purs
Normal file
20
src/Shimmy/Creep.purs
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
module Shimmy.Creep where
|
||||||
|
|
||||||
|
import Prelude
|
||||||
|
import Screeps.Types
|
||||||
|
|
||||||
|
import Data.Maybe (Maybe(..))
|
||||||
|
import Effect (Effect)
|
||||||
|
import Foreign.Object as F
|
||||||
|
import Screeps.Game as Game
|
||||||
|
import Screeps.Memory as Memory
|
||||||
|
import Shimmy.Spawning (doSpawnCheck)
|
||||||
|
|
||||||
|
manageCreeps :: F.Object Creep -> GameGlobal -> Memory.MemoryGlobal -> Effect Unit
|
||||||
|
manageCreeps hash game mem = do
|
||||||
|
let spawns = Game.spawns game
|
||||||
|
-- TODO: iterate over all spawns?
|
||||||
|
spawn1 = F.lookup "Spawn1" spawns
|
||||||
|
case spawn1 of
|
||||||
|
Nothing -> pure unit
|
||||||
|
Just s1 -> doSpawnCheck s1 (F.size hash) mem
|
74
src/Shimmy/Spawning.purs
Normal file
74
src/Shimmy/Spawning.purs
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
module Shimmy.Spawning where
|
||||||
|
|
||||||
|
import Prelude
|
||||||
|
|
||||||
|
import Data.Either (Either(..), hush)
|
||||||
|
import Data.Int (decimal, fromString, toStringAs)
|
||||||
|
import Data.Maybe (Maybe(..), fromMaybe)
|
||||||
|
import Effect (Effect)
|
||||||
|
import Effect.Console (log)
|
||||||
|
import Foreign.Object as F
|
||||||
|
import Screeps.Const (pCarry, pMove, pWork)
|
||||||
|
import Screeps.Game as Game
|
||||||
|
import Screeps.Memory as Memory
|
||||||
|
import Screeps.Room (room, setRoomMem)
|
||||||
|
import Screeps.Spawn (spawnStoreEnergy)
|
||||||
|
import Screeps.Types (BodyPartType(..), Creep, GameGlobal, Role(..), Spawn)
|
||||||
|
|
||||||
|
getLastId :: Memory.MemoryGlobal -> Effect (Maybe String)
|
||||||
|
getLastId memory = do
|
||||||
|
res <- Memory.get memory "last_id"
|
||||||
|
pure (join $ hush res)
|
||||||
|
|
||||||
|
decodeId :: Maybe String -> Effect Int
|
||||||
|
decodeId str = do
|
||||||
|
case str of
|
||||||
|
Nothing -> pure 0
|
||||||
|
Just int -> pure (fromMaybe 0 (fromString int))
|
||||||
|
|
||||||
|
encodeId :: Effect Int -> Effect String
|
||||||
|
encodeId int = do
|
||||||
|
int <#> (toStringAs decimal)
|
||||||
|
|
||||||
|
incrementId :: Int -> Effect Int
|
||||||
|
incrementId int = pure $ int + 1
|
||||||
|
|
||||||
|
namify :: Effect Int -> Effect String
|
||||||
|
namify int = do
|
||||||
|
(pure "shimmy") <> encodeId int
|
||||||
|
|
||||||
|
getCreepName :: Memory.MemoryGlobal -> Effect String
|
||||||
|
getCreepName memory = do
|
||||||
|
currentMin <- getLastId memory
|
||||||
|
nextMin <- decodeId currentMin >>= incrementId
|
||||||
|
creepName <- namify $ pure nextMin
|
||||||
|
(encodeId $ pure nextMin) >>= Memory.set memory "last_id"
|
||||||
|
pure creepName
|
||||||
|
|
||||||
|
spawnCreep :: Spawn -> Array BodyPartType -> String -> Role -> Effect Unit
|
||||||
|
spawnCreep spawn parts name role = do
|
||||||
|
res <- Game.rawSpawnCreep spawn parts name role
|
||||||
|
case res of
|
||||||
|
Left err -> log $ show err
|
||||||
|
Right str -> log $ str <> " spawned"
|
||||||
|
|
||||||
|
createIdleCreep :: Spawn -> Memory.MemoryGlobal -> Array BodyPartType -> Effect Unit
|
||||||
|
createIdleCreep spawn memory body = do
|
||||||
|
name <- getCreepName memory
|
||||||
|
spawnCreep spawn body name RoleIdle
|
||||||
|
|
||||||
|
doSpawnCheck :: Spawn -> Int -> Memory.MemoryGlobal -> Effect Unit
|
||||||
|
doSpawnCheck spawn numCreeps memory = if availableEnergy > 250 && numCreeps < 3 then do
|
||||||
|
createIdleCreep spawn memory [pWork, pCarry, pMove, pMove]
|
||||||
|
else pure unit
|
||||||
|
where availableEnergy = spawnStoreEnergy spawn
|
||||||
|
|
||||||
|
initSpawn :: F.Object Creep -> GameGlobal -> Memory.MemoryGlobal -> Effect Unit
|
||||||
|
initSpawn hash game mem = do
|
||||||
|
let spawns = Game.spawns game
|
||||||
|
spawn1 = F.lookup "Spawn1" spawns
|
||||||
|
case spawn1 of
|
||||||
|
Nothing -> pure unit
|
||||||
|
Just s1 -> do
|
||||||
|
let r = room s1
|
||||||
|
setRoomMem r 0 0
|
11
test/Main.purs
Normal file
11
test/Main.purs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
module Test.Main where
|
||||||
|
|
||||||
|
import Prelude
|
||||||
|
|
||||||
|
import Effect (Effect)
|
||||||
|
import Effect.Class.Console (log)
|
||||||
|
|
||||||
|
main :: Effect Unit
|
||||||
|
main = do
|
||||||
|
log "🍝"
|
||||||
|
log "You should add some tests."
|
Loading…
Reference in a new issue