diff --git a/.eslintrc.js b/.eslintrc.js index fe63229..95e95f0 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -5,5 +5,8 @@ module.exports = { root: true, parserOptions: { "project": ["tsconfig.json"] + }, + rules: { + 'no-unused-vars': "off" } }; \ No newline at end of file diff --git a/.swcrc b/.swcrc index 3f013e7..096bb29 100644 --- a/.swcrc +++ b/.swcrc @@ -1,4 +1,10 @@ { + "jsc": { + "parser": { + "syntax": "typescript", + "tsx": false + } + }, "module": { "type": "commonjs" } diff --git a/src/Actions/Action.ts b/src/Actions/Action.ts new file mode 100644 index 0000000..2007405 --- /dev/null +++ b/src/Actions/Action.ts @@ -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; \ No newline at end of file diff --git a/src/Actions/harvest.ts b/src/Actions/harvest.ts new file mode 100644 index 0000000..e91e685 --- /dev/null +++ b/src/Actions/harvest.ts @@ -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; + } + } +}); \ No newline at end of file diff --git a/src/Actions/moveTo.ts b/src/Actions/moveTo.ts new file mode 100644 index 0000000..8453067 --- /dev/null +++ b/src/Actions/moveTo.ts @@ -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; + } + } +}); \ No newline at end of file diff --git a/src/Actions/transferEnergy.ts b/src/Actions/transferEnergy.ts new file mode 100644 index 0000000..7e50646 --- /dev/null +++ b/src/Actions/transferEnergy.ts @@ -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; + } + } +}); \ No newline at end of file diff --git a/src/Actions/upgradeController.ts b/src/Actions/upgradeController.ts new file mode 100644 index 0000000..a118f8c --- /dev/null +++ b/src/Actions/upgradeController.ts @@ -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; + } + } +}); \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 68a385d..0ef7bc5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -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() { 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'); for (const creep of Object.values(Game.creeps)) { - const source = creep.pos.findClosestByPath(FIND_SOURCES_ACTIVE); - if (source && creep.harvest(source) === ERR_NOT_IN_RANGE) { - creep.moveTo(source); - } + runAction(creep, harvestFromClosestActiveSource()) + .andThen(transferEnergy(spawn)) + .or(upgradeController(controller)) + .repeat() + } } \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 54bbd7f..2e06acd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -67,71 +67,71 @@ slash "3.0.0" source-map "^0.7.3" -"@swc/core-darwin-arm64@1.3.23": - version "1.3.23" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.23.tgz#5e52f19bf96eef92d2ae0533e1598a717b2ca765" - integrity sha512-IGOEHmE4aBDX7gQWpanI3A0ni47UcvX7rmcy0H8kE6mm/y7mEMWskvNsYhYzJl4GVZgw38v1/lL/A7MRX6g71A== +"@swc/core-darwin-arm64@1.3.24": + version "1.3.24" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.24.tgz#d41fc574cb5049def9001903680fdd924f065052" + integrity sha512-rR+9UpWm+fGXcipsjCst2hIL1GYIbo0YTLhJZWdIpQD6KRHHJMFXiydMgQQkDj2Ml7HpqUVgxj6m4ZWYL8b0OA== -"@swc/core-darwin-x64@1.3.23": - version "1.3.23" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.23.tgz#3a466b47821284e7fcab6ee7c5b8251dfec0697a" - integrity sha512-eQSN+JJqx/5Dk2C5uet2l7HifGsDBorQHD3PAVnge5jxl+rXU/zbzX9Un56+uuUB0QYeS4Dyr8cN7NHuIKGxBA== +"@swc/core-darwin-x64@1.3.24": + version "1.3.24" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.24.tgz#0f7a3960b91cbd7f95f25542b29d0e08bde4f59d" + integrity sha512-px+5vkGtgPH0m3FkkTBHynlRdS5rRz+lK+wiXIuBZFJSySWFl6RkKbvwkD+sf0MpazQlqwlv/rTOGJBw6oDffg== -"@swc/core-linux-arm-gnueabihf@1.3.23": - version "1.3.23" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.23.tgz#42984694b7ffc508188e64bdba6379c37fbf4abf" - integrity sha512-zxYvggbw6R/sTNey0qgsigFMY59DYepm1+JNojxOKjbnvxmgyeIa5sPdu/5gLj0TtJOiWvSGrpMPNUIVreUSGA== +"@swc/core-linux-arm-gnueabihf@1.3.24": + version "1.3.24" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.24.tgz#a0fdd97b8341806b57290217830a5d1ab7d0b193" + integrity sha512-jLs8ZOdTV4UW4J12E143QJ4mOMONQtqgAnuhBbRuWFzQ3ny1dfoC3P1jNWAJ2Xi59XdxAIXn0PggPNH4Kh34kw== -"@swc/core-linux-arm64-gnu@1.3.23": - version "1.3.23" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.23.tgz#6579f0f715a9646ab0ddcbaec2cd94815788c4af" - integrity sha512-l8UWhcNvZ6RzNZBBToMYuKYijF0h7mbw2RuFV5rpCYF/k/Wh85PaDHPQIQ6qjMHJsIBHYXUt0HLAP+fiAfBiDw== +"@swc/core-linux-arm64-gnu@1.3.24": + version "1.3.24" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.24.tgz#0536d03e12dd471ebafc180599488404aebb65cf" + integrity sha512-A/v0h70BekrwGpp1DlzIFGcHQ3QQ2PexXcnnuIBZeMc9gNmHlcZmg3EcwAnaUDiokhNuSUFA/wV94yk1OqmSkw== -"@swc/core-linux-arm64-musl@1.3.23": - version "1.3.23" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.23.tgz#5c377db95ca3ceca3222945ce170398691e57863" - integrity sha512-TZDPp1wUE1ynVyY0vwIToyOULKEQ91H49R+p6Iu/2YY+UQQwUamhX0Gp8O85RT+j72/iHyhbQkz7yRg6v+GB5A== +"@swc/core-linux-arm64-musl@1.3.24": + version "1.3.24" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.24.tgz#54f46ffea1bf6ffcbe7c62037efaefdfb5115214" + integrity sha512-pbc9eArWPTiMrbpS/pJo0IiQNAKAQBcBIDjWBGP1tcw2iDXYLw4bruwz9kI/VjakbshWb8MoE4T5ClkeuULvSw== -"@swc/core-linux-x64-gnu@1.3.23": - version "1.3.23" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.23.tgz#e77b3a63c800418ea234d70c1a0ad5762367b6d5" - integrity sha512-rKqWnOmUyQfoKZuuXs/S0RNobN+kcUyMtwoCdRdCNqOlk1XZRCMpjGc9Aqn73K3xlZ6JXX6oLrXKn375b2dydw== +"@swc/core-linux-x64-gnu@1.3.24": + version "1.3.24" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.24.tgz#c2b5cef83f8afd2a57d0eafbac083562d50cd0e6" + integrity sha512-pP5pOLlY1xd352qo7rTlpVPUI9/9VhOd4b3Lk+LzfZDq9bTL2NDlGfyrPiwa5DGHMSzrugH56K2J68eutkxYVA== -"@swc/core-linux-x64-musl@1.3.23": - version "1.3.23" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.23.tgz#f8cac09286f9ffaffe990ef61e759ce3785fd02e" - integrity sha512-1MK9eocIhuIr/+yUKnTNHpYovMQvfKTJQbU4UMfQLg2qyCGKAvO+jOy5JIGR9x04MWqz9U3EHHS/7Id35ekhFQ== +"@swc/core-linux-x64-musl@1.3.24": + version "1.3.24" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.24.tgz#3459d01f9bf745568a4196c1993987f3d4a98303" + integrity sha512-phNbP7zGp+Wcyxq1Qxlpe5KkxO7WLT2kVQUC7aDFGlVdCr+xdXsfH1MzheHtnr0kqTVQX1aiM8XXXHfFxR0oNA== -"@swc/core-win32-arm64-msvc@1.3.23": - version "1.3.23" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.23.tgz#7a723c3e5360573b5c1d21e504e3c11cc3cc024c" - integrity sha512-3nmdugj0SJIGWeCJBhvPWIfnE2Ax8H2KZsJfcaWmWg0SDh19aAt48Ncyd8WHHBandJmVm2fSjaANSjp+cS2S9A== +"@swc/core-win32-arm64-msvc@1.3.24": + version "1.3.24" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.24.tgz#85a18c844c00d66bf46db99d9c98e9550b4d28f5" + integrity sha512-qhbiJTWAOqyR+K9xnGmCkOWSz2EmWpDBstEJCEOTc6FZiEdbiTscDmqTcMbCKaTHGu8t+6erVA4t65/Eg6uWPA== -"@swc/core-win32-ia32-msvc@1.3.23": - version "1.3.23" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.23.tgz#43a439fc21144682e624d46ba4da5e7bb33b2629" - integrity sha512-2AlGRhys1BsfLjXyWOd+5J/Ko2kkVQVuy3ZR8OBGy7XI54p0PpepabloYI9irr+4bi9vtyxoc5rS21PmJxB83Q== +"@swc/core-win32-ia32-msvc@1.3.24": + version "1.3.24" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.24.tgz#18318199ba06cab4ead8f6122b9f30b3f452b1e7" + integrity sha512-JfghIlscE4Rz+Lc08lSoDh+R0cWxrISed5biogFfE6vZqhaDnw3E5Qshqw7O3pIaiq8L2u1nmzuyP581ZmpbRA== -"@swc/core-win32-x64-msvc@1.3.23": - version "1.3.23" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.23.tgz#00ad332d847f2e3961d7bba4d1886dd767e1f92e" - integrity sha512-qYKP8sIM7VVLuDb5BkRBoHy28OHZWrUhPTO7WgpErhVVM9wnzmMi/Jgg8SyfMy6oheBjO0QiwWbXONxBwByjnQ== +"@swc/core-win32-x64-msvc@1.3.24": + version "1.3.24" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.24.tgz#b53746787e5af021787134d393fd67b0431f90d9" + integrity sha512-3AmJRr0hwciwDBbzUNqaftvppzS8v9X/iv/Wl7YaVLBVpPfQvaZzfqLycvNMGLZb5vIKXR/u58txg3dRBGsJtw== "@swc/core@^1.3.23": - version "1.3.23" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.23.tgz#62078fb161fad7edf7c8a8267cceccdeb2ab4a0d" - integrity sha512-Aa7yw5+7ErOxr+G0J1eU2hkb9nEMSdt1Ye3isdAgg9mrsPuttk+cfLp6nP/Lux/VUnu5k4eOxeTy9UhjJhRAFw== + version "1.3.24" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.24.tgz#ef6b30267c1bbd48af62cbc91370fe9b3f5d6a23" + integrity sha512-QMOTd0AgiUT3K1crxLRqd3gw0f3FC8hhH1vvlIlryvYqU4c+FJ/T2G4ZhMKLxQlZ/jX6Rhk0gKINZRBxy2GFyQ== optionalDependencies: - "@swc/core-darwin-arm64" "1.3.23" - "@swc/core-darwin-x64" "1.3.23" - "@swc/core-linux-arm-gnueabihf" "1.3.23" - "@swc/core-linux-arm64-gnu" "1.3.23" - "@swc/core-linux-arm64-musl" "1.3.23" - "@swc/core-linux-x64-gnu" "1.3.23" - "@swc/core-linux-x64-musl" "1.3.23" - "@swc/core-win32-arm64-msvc" "1.3.23" - "@swc/core-win32-ia32-msvc" "1.3.23" - "@swc/core-win32-x64-msvc" "1.3.23" + "@swc/core-darwin-arm64" "1.3.24" + "@swc/core-darwin-x64" "1.3.24" + "@swc/core-linux-arm-gnueabihf" "1.3.24" + "@swc/core-linux-arm64-gnu" "1.3.24" + "@swc/core-linux-arm64-musl" "1.3.24" + "@swc/core-linux-x64-gnu" "1.3.24" + "@swc/core-linux-x64-musl" "1.3.24" + "@swc/core-win32-arm64-msvc" "1.3.24" + "@swc/core-win32-ia32-msvc" "1.3.24" + "@swc/core-win32-x64-msvc" "1.3.24" "@types/json-schema@^7.0.9": version "7.0.11"