diff --git a/src/RoomPlanner/Blueprints/Containers.ts b/src/RoomPlanner/Blueprints/Containers.ts new file mode 100644 index 0000000..3814ecd --- /dev/null +++ b/src/RoomPlanner/Blueprints/Containers.ts @@ -0,0 +1,12 @@ +export const buildContainers = (room: Room) => { + if ((room.controller?.level ?? 0) < 2) { + return; + } + const sources = room.find(FIND_SOURCES); + for (const source of sources) { + room.createConstructionSite(source.pos.x - 2, source.pos.y, STRUCTURE_CONTAINER); + room.createConstructionSite(source.pos.x + 2, source.pos.y, STRUCTURE_CONTAINER); + room.createConstructionSite(source.pos.x, source.pos.y - 2, STRUCTURE_CONTAINER); + room.createConstructionSite(source.pos.x, source.pos.y + 2, STRUCTURE_CONTAINER); + } +} \ No newline at end of file diff --git a/src/Workers/Constructor.ts b/src/Workers/Constructor.ts new file mode 100644 index 0000000..7bf50dd --- /dev/null +++ b/src/Workers/Constructor.ts @@ -0,0 +1,15 @@ +import { Fail, runAction } from "../Actions/Action"; +import { buildConstructionSite } from "../Actions/buildConstructionSite"; +import { harvestFromClosestActiveSource } from "../Actions/harvest"; +import { upgradeController } from "../Actions/upgradeController"; +import { WorkerDefinition } from "./worker"; + +export const Constructor: WorkerDefinition = { + runAction: (creep: Creep) => runAction(creep, harvestFromClosestActiveSource()) + .andThen(buildConstructionSite()) + .or(creep.room.controller ? upgradeController(creep.room.controller) : Fail) + .repeat(), + name: 'constructor', + requiredCreeps: (room: Room) => room.find(FIND_MY_CONSTRUCTION_SITES).length / 5 + 1, + bodyDefinition: (energy: number) => [WORK, MOVE, MOVE, CARRY, CARRY] +} \ No newline at end of file diff --git a/src/Workers/Upgrader.ts b/src/Workers/Upgrader.ts new file mode 100644 index 0000000..3a2686e --- /dev/null +++ b/src/Workers/Upgrader.ts @@ -0,0 +1,15 @@ +import { Fail, runAction } from "../Actions/Action"; +import { harvestFromClosestActiveSource } from "../Actions/harvest"; +import { transferEnergy } from "../Actions/transferEnergy"; +import { upgradeController } from "../Actions/upgradeController"; +import { WorkerDefinition } from "./worker"; + +export const Upgrader: WorkerDefinition = { + runAction: (creep: Creep, spawn: StructureSpawn) => runAction(creep, harvestFromClosestActiveSource()) + .andThen(transferEnergy(spawn)) + .or(creep.room.controller ? upgradeController(creep.room.controller) : Fail) + .repeat(), + name: 'upgrader', + requiredCreeps: (room: Room) => 2, + bodyDefinition: (energy: number) => [WORK, WORK, MOVE, CARRY] +} \ No newline at end of file diff --git a/src/Workers/worker.ts b/src/Workers/worker.ts new file mode 100644 index 0000000..858a13f --- /dev/null +++ b/src/Workers/worker.ts @@ -0,0 +1,24 @@ +export interface WorkerDefinition { + runAction: (creep: Creep, spawn: StructureSpawn) => void, + name: string, + requiredCreeps: (room: Room) => number, + bodyDefinition: (energy: number, spawn: StructureSpawn) => BodyPartConstant[] +} + +export const spawnWorkers = (spawn: StructureSpawn, workers: WorkerDefinition[]): void => { + for (const worker of workers) { + for (let i = 0; i < worker.requiredCreeps(spawn.room); i++) { + spawn.spawnCreep(worker.bodyDefinition(spawn.store.getCapacity(RESOURCE_ENERGY), spawn), worker.name + i.toString()); + } + } +}; + +export const runWorkers = (spawn: StructureSpawn, workers: WorkerDefinition[]): void => { + for (const worker of workers) { + for (const creep of Object.values(Game.creeps)) { + if (creep.name.startsWith(worker.name)) { + worker.runAction(creep, spawn); + } + } + } +}; \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index eea0273..5891d98 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,8 +3,12 @@ import { buildConstructionSite } from "./Actions/buildConstructionSite"; import { harvestFromClosestActiveSource } from "./Actions/harvest"; import { transferEnergy } from "./Actions/transferEnergy"; import { upgradeController } from "./Actions/upgradeController"; +import { buildContainers } from "./RoomPlanner/Blueprints/Containers"; import { buildExtentions } from "./RoomPlanner/Blueprints/Extensions"; import { buildRoads } from "./RoomPlanner/Blueprints/Roads"; +import { Constructor } from "./Workers/Constructor"; +import { Upgrader } from "./Workers/Upgrader"; +import { runWorkers, spawnWorkers } from "./Workers/worker"; export function loop() { const spawn = Game.spawns.Spawn1; @@ -12,34 +16,17 @@ export function loop() { if (!controller) { return; } - spawn.spawnCreep([WORK, CARRY, CARRY, MOVE], 'builder9'); - spawn.spawnCreep([WORK, CARRY, CARRY, MOVE], 'upgrader8'); - spawn.spawnCreep([WORK, CARRY, CARRY, MOVE], 'builder7'); - spawn.spawnCreep([WORK, CARRY, CARRY, MOVE], 'builder6'); - spawn.spawnCreep([WORK, CARRY, CARRY, MOVE], 'uprader5'); - spawn.spawnCreep([WORK, CARRY, CARRY, MOVE], 'builder4'); - spawn.spawnCreep([WORK, CARRY, CARRY, MOVE], 'builder3'); - spawn.spawnCreep([WORK, CARRY, CARRY, MOVE], 'upgrader2'); - spawn.spawnCreep([WORK, CARRY, CARRY, MOVE], 'upgrader1'); - for (const creep of Object.values(Game.creeps)) { - if (creep.name.startsWith('u') || creep.name.startsWith('w')) { - runAction(creep, harvestFromClosestActiveSource()) - .andThen(transferEnergy(spawn)) - .or(upgradeController(controller)) - .repeat() - } else if (creep.name.startsWith('b')) { - runAction(creep, harvestFromClosestActiveSource()) - .andThen(buildConstructionSite()) - .or(upgradeController(controller)) - .repeat() - } - } + spawnWorkers(spawn, [Constructor, Upgrader]); + runWorkers(spawn, [Constructor, Upgrader]); if (Game.time % 100 === 0) { buildRoads(spawn.room); } if (Game.time % 100 === 50) { buildExtentions(spawn.room); } + if (Game.time % 100 === 25) { + buildContainers(spawn.room); + } if (Game.cpu.bucket === 10000) { Game.cpu.generatePixel(); }