Add Creep Actions

This commit is contained in:
uwap 2022-12-21 11:57:49 +01:00
parent 848e69dc05
commit a73f1f7004
9 changed files with 221 additions and 57 deletions

View file

@ -5,5 +5,8 @@ module.exports = {
root: true, root: true,
parserOptions: { parserOptions: {
"project": ["tsconfig.json"] "project": ["tsconfig.json"]
},
rules: {
'no-unused-vars': "off"
} }
}; };

6
.swcrc
View file

@ -1,4 +1,10 @@
{ {
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": false
}
},
"module": { "module": {
"type": "commonjs" "type": "commonjs"
} }

61
src/Actions/Action.ts Normal file
View file

@ -0,0 +1,61 @@
declare global {
interface CreepMemory {
state?: number
}
}
export interface ChainableAction {
or: (action: Action) => ChainableAction,
and: (action: Action) => ChainableAction,
andThen: (action: Action) => ChainableAction,
repeat: () => void
}
export const NoOp: Action = (creep: Creep, state: number = 0) => ({
or: () => NoOp(creep, state),
and: () => NoOp(creep, state),
andThen: () => NoOp(creep, state),
repeat: () => {}
});
export const Success: Action = (creep: Creep, state: number = 0) => ({
or: () => Success(creep, state),
and: (action: Action) => action(creep, state),
andThen: (action: Action) => {
creep.memory.state = state + 1;
return action(creep, state + 1);
},
repeat: () => {
creep.memory.state = 0;
}
});
export const InProgress: Action = (creep: Creep, state: number = 0) => ({
or: () => InProgress(creep, state),
and: (action: Action) => action(creep, state),
andThen: () => NoOp(creep, state),
repeat: () => {}
});
export const Fail: Action = (creep: Creep, state: number = 0) => ({
or: (action: Action) => action(creep, state),
and: () => NoOp(creep, state),
andThen: () => NoOp(creep, state),
repeat: () => {
console.log('Warning: Last task in series failed for creep ' + creep.name);
}
})
export const createAction = (name: string, action: (creep: Creep) => Action): Action => {
return (creep: Creep, state: number = 0) => {
if ((creep.memory.state ?? 0) > state) {
return Success(creep, state);
}
console.log(`[${creep.name}] Running action ${name}`)
return action(creep)(creep, state);
}
}
export const runAction = (creep: Creep, action: Action): ChainableAction => action(creep);
export type Action = (creep: Creep, state?: number) => ChainableAction;

23
src/Actions/harvest.ts Normal file
View file

@ -0,0 +1,23 @@
import { createAction, Fail, InProgress, Success } from "./Action";
import { moveTo } from "./moveTo";
export const harvestFromClosestActiveSource = () => createAction('harvestFromClosestActiveSource', (creep: Creep) => {
const source = creep.pos.findClosestByPath(FIND_SOURCES_ACTIVE);
if (!source) {
return Fail;
}
if (creep.store.getFreeCapacity(RESOURCE_ENERGY) === 0) {
return Success;
}
switch(creep.harvest(source)) {
case OK: {
return InProgress;
}
case ERR_NOT_IN_RANGE: {
return moveTo(source);
}
default: {
return Fail;
}
}
});

15
src/Actions/moveTo.ts Normal file
View file

@ -0,0 +1,15 @@
import { createAction, Fail, InProgress } from "./Action";
export const moveTo = (pos: _HasRoomPosition | RoomPosition) => createAction('moveTo', (creep: Creep) => {
switch(creep.moveTo(pos)) {
case OK: {
return InProgress;
}
case ERR_TIRED: {
return InProgress;
}
default: {
return Fail;
}
}
});

View file

@ -0,0 +1,22 @@
import { createAction, Fail, InProgress, Success } from "./Action";
import { moveTo } from "./moveTo";
export const transferEnergy = (target: Creep | StructureSpawn) => createAction('transferEnergy', (creep: Creep) => {
if (target.store.getFreeCapacity(RESOURCE_ENERGY) === 0) {
return Fail;
}
switch(creep.transfer(target, RESOURCE_ENERGY)) {
case OK: {
return InProgress;
}
case ERR_NOT_ENOUGH_RESOURCES: {
return Success;
}
case ERR_NOT_IN_RANGE: {
return moveTo(target);
}
default: {
return Fail;
}
}
});

View file

@ -0,0 +1,19 @@
import { createAction, Fail, InProgress, Success } from "./Action";
import { moveTo } from "./moveTo";
export const upgradeController = (controller: StructureController) => createAction('upgradeController', (creep: Creep) => {
switch(creep.upgradeController(controller)) {
case OK: {
return InProgress;
}
case ERR_NOT_ENOUGH_RESOURCES: {
return Success;
}
case ERR_NOT_IN_RANGE: {
return moveTo(controller);
}
default: {
return Fail;
}
}
});

View file

@ -1,10 +1,25 @@
import { runAction } from "./Actions/Action";
import { harvestFromClosestActiveSource } from "./Actions/harvest";
import { transferEnergy } from "./Actions/transferEnergy";
import { upgradeController } from "./Actions/upgradeController";
export function loop() { export function loop() {
const spawn = Game.spawns.Spawn1; const spawn = Game.spawns.Spawn1;
const controller = spawn.room.controller;
if (!controller) {
return;
}
spawn.spawnCreep([WORK, CARRY, CARRY, MOVE], 'w6');
spawn.spawnCreep([WORK, CARRY, CARRY, MOVE], 'w5');
spawn.spawnCreep([WORK, CARRY, CARRY, MOVE], 'w4');
spawn.spawnCreep([WORK, CARRY, CARRY, MOVE], 'w3');
spawn.spawnCreep([WORK, CARRY, CARRY, MOVE], 'w2');
spawn.spawnCreep([WORK, CARRY, CARRY, MOVE], 'w1'); spawn.spawnCreep([WORK, CARRY, CARRY, MOVE], 'w1');
for (const creep of Object.values(Game.creeps)) { for (const creep of Object.values(Game.creeps)) {
const source = creep.pos.findClosestByPath(FIND_SOURCES_ACTIVE); runAction(creep, harvestFromClosestActiveSource())
if (source && creep.harvest(source) === ERR_NOT_IN_RANGE) { .andThen(transferEnergy(spawn))
creep.moveTo(source); .or(upgradeController(controller))
} .repeat()
} }
} }

106
yarn.lock
View file

@ -67,71 +67,71 @@
slash "3.0.0" slash "3.0.0"
source-map "^0.7.3" source-map "^0.7.3"
"@swc/core-darwin-arm64@1.3.23": "@swc/core-darwin-arm64@1.3.24":
version "1.3.23" version "1.3.24"
resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.23.tgz#5e52f19bf96eef92d2ae0533e1598a717b2ca765" resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.24.tgz#d41fc574cb5049def9001903680fdd924f065052"
integrity sha512-IGOEHmE4aBDX7gQWpanI3A0ni47UcvX7rmcy0H8kE6mm/y7mEMWskvNsYhYzJl4GVZgw38v1/lL/A7MRX6g71A== integrity sha512-rR+9UpWm+fGXcipsjCst2hIL1GYIbo0YTLhJZWdIpQD6KRHHJMFXiydMgQQkDj2Ml7HpqUVgxj6m4ZWYL8b0OA==
"@swc/core-darwin-x64@1.3.23": "@swc/core-darwin-x64@1.3.24":
version "1.3.23" version "1.3.24"
resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.23.tgz#3a466b47821284e7fcab6ee7c5b8251dfec0697a" resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.24.tgz#0f7a3960b91cbd7f95f25542b29d0e08bde4f59d"
integrity sha512-eQSN+JJqx/5Dk2C5uet2l7HifGsDBorQHD3PAVnge5jxl+rXU/zbzX9Un56+uuUB0QYeS4Dyr8cN7NHuIKGxBA== integrity sha512-px+5vkGtgPH0m3FkkTBHynlRdS5rRz+lK+wiXIuBZFJSySWFl6RkKbvwkD+sf0MpazQlqwlv/rTOGJBw6oDffg==
"@swc/core-linux-arm-gnueabihf@1.3.23": "@swc/core-linux-arm-gnueabihf@1.3.24":
version "1.3.23" version "1.3.24"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.23.tgz#42984694b7ffc508188e64bdba6379c37fbf4abf" resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.24.tgz#a0fdd97b8341806b57290217830a5d1ab7d0b193"
integrity sha512-zxYvggbw6R/sTNey0qgsigFMY59DYepm1+JNojxOKjbnvxmgyeIa5sPdu/5gLj0TtJOiWvSGrpMPNUIVreUSGA== integrity sha512-jLs8ZOdTV4UW4J12E143QJ4mOMONQtqgAnuhBbRuWFzQ3ny1dfoC3P1jNWAJ2Xi59XdxAIXn0PggPNH4Kh34kw==
"@swc/core-linux-arm64-gnu@1.3.23": "@swc/core-linux-arm64-gnu@1.3.24":
version "1.3.23" version "1.3.24"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.23.tgz#6579f0f715a9646ab0ddcbaec2cd94815788c4af" resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.24.tgz#0536d03e12dd471ebafc180599488404aebb65cf"
integrity sha512-l8UWhcNvZ6RzNZBBToMYuKYijF0h7mbw2RuFV5rpCYF/k/Wh85PaDHPQIQ6qjMHJsIBHYXUt0HLAP+fiAfBiDw== integrity sha512-A/v0h70BekrwGpp1DlzIFGcHQ3QQ2PexXcnnuIBZeMc9gNmHlcZmg3EcwAnaUDiokhNuSUFA/wV94yk1OqmSkw==
"@swc/core-linux-arm64-musl@1.3.23": "@swc/core-linux-arm64-musl@1.3.24":
version "1.3.23" version "1.3.24"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.23.tgz#5c377db95ca3ceca3222945ce170398691e57863" resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.24.tgz#54f46ffea1bf6ffcbe7c62037efaefdfb5115214"
integrity sha512-TZDPp1wUE1ynVyY0vwIToyOULKEQ91H49R+p6Iu/2YY+UQQwUamhX0Gp8O85RT+j72/iHyhbQkz7yRg6v+GB5A== integrity sha512-pbc9eArWPTiMrbpS/pJo0IiQNAKAQBcBIDjWBGP1tcw2iDXYLw4bruwz9kI/VjakbshWb8MoE4T5ClkeuULvSw==
"@swc/core-linux-x64-gnu@1.3.23": "@swc/core-linux-x64-gnu@1.3.24":
version "1.3.23" version "1.3.24"
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.23.tgz#e77b3a63c800418ea234d70c1a0ad5762367b6d5" resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.24.tgz#c2b5cef83f8afd2a57d0eafbac083562d50cd0e6"
integrity sha512-rKqWnOmUyQfoKZuuXs/S0RNobN+kcUyMtwoCdRdCNqOlk1XZRCMpjGc9Aqn73K3xlZ6JXX6oLrXKn375b2dydw== integrity sha512-pP5pOLlY1xd352qo7rTlpVPUI9/9VhOd4b3Lk+LzfZDq9bTL2NDlGfyrPiwa5DGHMSzrugH56K2J68eutkxYVA==
"@swc/core-linux-x64-musl@1.3.23": "@swc/core-linux-x64-musl@1.3.24":
version "1.3.23" version "1.3.24"
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.23.tgz#f8cac09286f9ffaffe990ef61e759ce3785fd02e" resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.24.tgz#3459d01f9bf745568a4196c1993987f3d4a98303"
integrity sha512-1MK9eocIhuIr/+yUKnTNHpYovMQvfKTJQbU4UMfQLg2qyCGKAvO+jOy5JIGR9x04MWqz9U3EHHS/7Id35ekhFQ== integrity sha512-phNbP7zGp+Wcyxq1Qxlpe5KkxO7WLT2kVQUC7aDFGlVdCr+xdXsfH1MzheHtnr0kqTVQX1aiM8XXXHfFxR0oNA==
"@swc/core-win32-arm64-msvc@1.3.23": "@swc/core-win32-arm64-msvc@1.3.24":
version "1.3.23" version "1.3.24"
resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.23.tgz#7a723c3e5360573b5c1d21e504e3c11cc3cc024c" resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.24.tgz#85a18c844c00d66bf46db99d9c98e9550b4d28f5"
integrity sha512-3nmdugj0SJIGWeCJBhvPWIfnE2Ax8H2KZsJfcaWmWg0SDh19aAt48Ncyd8WHHBandJmVm2fSjaANSjp+cS2S9A== integrity sha512-qhbiJTWAOqyR+K9xnGmCkOWSz2EmWpDBstEJCEOTc6FZiEdbiTscDmqTcMbCKaTHGu8t+6erVA4t65/Eg6uWPA==
"@swc/core-win32-ia32-msvc@1.3.23": "@swc/core-win32-ia32-msvc@1.3.24":
version "1.3.23" version "1.3.24"
resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.23.tgz#43a439fc21144682e624d46ba4da5e7bb33b2629" resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.24.tgz#18318199ba06cab4ead8f6122b9f30b3f452b1e7"
integrity sha512-2AlGRhys1BsfLjXyWOd+5J/Ko2kkVQVuy3ZR8OBGy7XI54p0PpepabloYI9irr+4bi9vtyxoc5rS21PmJxB83Q== integrity sha512-JfghIlscE4Rz+Lc08lSoDh+R0cWxrISed5biogFfE6vZqhaDnw3E5Qshqw7O3pIaiq8L2u1nmzuyP581ZmpbRA==
"@swc/core-win32-x64-msvc@1.3.23": "@swc/core-win32-x64-msvc@1.3.24":
version "1.3.23" version "1.3.24"
resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.23.tgz#00ad332d847f2e3961d7bba4d1886dd767e1f92e" resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.24.tgz#b53746787e5af021787134d393fd67b0431f90d9"
integrity sha512-qYKP8sIM7VVLuDb5BkRBoHy28OHZWrUhPTO7WgpErhVVM9wnzmMi/Jgg8SyfMy6oheBjO0QiwWbXONxBwByjnQ== integrity sha512-3AmJRr0hwciwDBbzUNqaftvppzS8v9X/iv/Wl7YaVLBVpPfQvaZzfqLycvNMGLZb5vIKXR/u58txg3dRBGsJtw==
"@swc/core@^1.3.23": "@swc/core@^1.3.23":
version "1.3.23" version "1.3.24"
resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.23.tgz#62078fb161fad7edf7c8a8267cceccdeb2ab4a0d" resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.24.tgz#ef6b30267c1bbd48af62cbc91370fe9b3f5d6a23"
integrity sha512-Aa7yw5+7ErOxr+G0J1eU2hkb9nEMSdt1Ye3isdAgg9mrsPuttk+cfLp6nP/Lux/VUnu5k4eOxeTy9UhjJhRAFw== integrity sha512-QMOTd0AgiUT3K1crxLRqd3gw0f3FC8hhH1vvlIlryvYqU4c+FJ/T2G4ZhMKLxQlZ/jX6Rhk0gKINZRBxy2GFyQ==
optionalDependencies: optionalDependencies:
"@swc/core-darwin-arm64" "1.3.23" "@swc/core-darwin-arm64" "1.3.24"
"@swc/core-darwin-x64" "1.3.23" "@swc/core-darwin-x64" "1.3.24"
"@swc/core-linux-arm-gnueabihf" "1.3.23" "@swc/core-linux-arm-gnueabihf" "1.3.24"
"@swc/core-linux-arm64-gnu" "1.3.23" "@swc/core-linux-arm64-gnu" "1.3.24"
"@swc/core-linux-arm64-musl" "1.3.23" "@swc/core-linux-arm64-musl" "1.3.24"
"@swc/core-linux-x64-gnu" "1.3.23" "@swc/core-linux-x64-gnu" "1.3.24"
"@swc/core-linux-x64-musl" "1.3.23" "@swc/core-linux-x64-musl" "1.3.24"
"@swc/core-win32-arm64-msvc" "1.3.23" "@swc/core-win32-arm64-msvc" "1.3.24"
"@swc/core-win32-ia32-msvc" "1.3.23" "@swc/core-win32-ia32-msvc" "1.3.24"
"@swc/core-win32-x64-msvc" "1.3.23" "@swc/core-win32-x64-msvc" "1.3.24"
"@types/json-schema@^7.0.9": "@types/json-schema@^7.0.9":
version "7.0.11" version "7.0.11"