From c03b0ccea6b36609546b1ec16c1b5da90e9eb927 Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Wed, 22 Jul 2020 12:50:13 +0300 Subject: [PATCH] More robust harvester handling --- src/creep/harvester.ts | 51 +++++++++++++++++++++++++++++++----------- src/main.ts | 4 ++-- src/types.d.ts | 8 +++++++ 3 files changed, 48 insertions(+), 15 deletions(-) diff --git a/src/creep/harvester.ts b/src/creep/harvester.ts index fe4c178..3e19fd8 100644 --- a/src/creep/harvester.ts +++ b/src/creep/harvester.ts @@ -6,26 +6,51 @@ interface HarvesterMemory extends CreepMemory { sourceId: Id | undefined; } +enum Action { + Harvest = 'harvest', + Charge = 'charge' +} + export function runAsHarvester(creep: Creep) { const memory = creep.memory as HarvesterMemory; + if (memory.action === undefined) { + memory.action = Action.Harvest; + } + if (memory.sourceId === undefined) { memory.sourceId = selectSource(creep); } - if (creep.store.getFreeCapacity() > 0) { - const source = Game.getObjectById(memory.sourceId); - if (source && creep.harvest(source) === ERR_NOT_IN_RANGE) { - creep.say('🔄 harvest'); - creep.moveTo(source, { visualizePathStyle: { stroke: '#ffaa00' } }); - } - } else { - const target = findTarget(creep); - if (target) { - moveEnergyToTarget(creep, target); - } else { - moveToSpawn(creep); - } + switch (memory.action) { + case Action.Charge: + if (creep.store[RESOURCE_ENERGY] === 0) { + memory.action = Action.Harvest; + } + break; + case Action.Harvest: + if (creep.store.getFreeCapacity() === 0) { + memory.action = Action.Charge; + } + break; + } + + switch (memory.action) { + case Action.Harvest: + const source = Game.getObjectById(memory.sourceId); + if (source && creep.harvest(source) === ERR_NOT_IN_RANGE) { + creep.say('🔄 harvest'); + creep.moveTo(source, { visualizePathStyle: { stroke: '#ffaa00' } }); + } + break; + case Action.Charge: + const target = findTarget(creep); + if (target) { + moveEnergyToTarget(creep, target); + } else { + moveToSpawn(creep); + } + break; } } diff --git a/src/main.ts b/src/main.ts index 5a04b10..2ede16a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -21,7 +21,7 @@ function makeCreep(role: CreepRole, count: number) { const firstSpawn = _.first(Object.values(Game.spawns)); const name = makeName(); const memory = { role: role } as CreepMemory; - const err = firstSpawn.spawnCreep([WORK, WORK, CARRY, CARRY, MOVE], name, { memory }); + const err = firstSpawn.spawnCreep([WORK, WORK, CARRY, CARRY, MOVE, MOVE], name, { memory }); console.log(`Make creep "${role}"`, 'err', err); } } @@ -58,7 +58,7 @@ export const loop = ErrorMapper.wrapLoop(() => { callHarvestersFromOthers(2); - makeCreep(CreepRole.HARVESTER, 2); + makeCreep(CreepRole.HARVESTER, 4); makeCreep(CreepRole.UPGRADER, 4); makeCreep(CreepRole.BUILDER, 4); diff --git a/src/types.d.ts b/src/types.d.ts index 00727b9..0be1439 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -2,7 +2,15 @@ // memory extension samples interface CreepMemory { + /** + * Строка, которая определяет роль крипа, + * то есть действия, которые крип совершает. + */ role: string; + /** + * Действие, которое крип будет выполнять. + */ + action: string | undefined; room: string; working: boolean; }