export function harvest(creep: Creep) { const moveTo = (pos:RoomPosition)=>{ creep.memory.move = { args: { to: pos, fDist: 1 } } creep.memory.state = 'move'; creep.memory.retState = 'harvest'; }; if (!creep.memory.harvest) { creep.memory.harvest = {}; } // Not enough energy if (creep.carry.energy < creep.carryCapacity) { let src: Source | null; // First we get our source. if (creep.memory.harvest.source) { src = Game.getObjectById(creep.memory.harvest.source); if (!src) return; } else { let sources = creep.room.find(FIND_SOURCES).sort((a, b) => b.energy - a.energy); if (!sources.length) return; src = sources[0]; } let err = creep.harvest(src); switch (err) { case ERR_NOT_IN_RANGE: moveTo(src.pos); delete creep.memory.harvest.spawn; break; } } // We now have enough energy else { let spwn: StructureSpawn | null; // First we get our spawn. if (creep.memory.harvest.spawn) { spwn = Game.getObjectById(creep.memory.harvest.source); if (!spwn) return; } else { let spawns = creep.room.find(FIND_MY_SPAWNS).sort((a, b) => b.energy - a.energy); if (!spawns.length) return; spwn = spawns[0]; } let err = creep.transfer(spwn, RESOURCE_ENERGY); switch(err) { case ERR_NOT_IN_RANGE: moveTo(spwn.pos); delete creep.memory.harvest.source; break; // Lets find another one. case ERR_FULL: delete creep.memory.harvest.spawn; break; } } }