module.exports = { begin(creep){ if(!creep.memory.harvesting) creep.memory.harvesting = false; if(!creep.memory.counter) creep.memory.counter = 0; }, tick(creep){ if(creep.memory.harvesting) { pickUpEnergy(creep); onEnergyFullTurnToJobMode(creep); } else { performJobs(creep); onOutOfEnergyTurnHarvestingMode(creep); } } } function pickUpEnergy(creep){ if(!creep.memory.target) { const target = creep.pos.findClosestByRange(FIND_DROPPED_RESOURCES, {filter: {resourceType: RESOURCE_ENERGY}}); if(target) creep.memory.target = target.id; } const resource = Game.getObjectById(creep.memory.target); if(!resource) creep.memory.target = undefined; if(creep.pos.isNearTo(resource)) creep.pickup(resource); else creep.moveTo(resource); } function harvestSource(creep){ if(!creep.memory.target) creep.memory.target = getSourceIdFromRoomTable(creep); var source = Game.getObjectById(creep.memory.target); if(creep.pos.isNearTo(source)) creep.harvest(source); else creep.moveTo(source); } function onEnergyFullTurnToJobMode(creep){ if(!creep.store.getFreeCapacity(RESOURCE_ENERGY)) { creep.memory.harvesting = false; creep.memory.target = undefined; } } function performJobs(creep){ if(!creep.memory.target) creep.memory.target = getJobTarget(creep); var target = Game.getObjectById(creep.memory.target); if(creep.pos.isNearTo(target)) doJob(creep, target); else creep.moveTo(target); } function onOutOfEnergyTurnHarvestingMode(creep){ if(!creep.store.getUsedCapacity(RESOURCE_ENERGY)) { creep.memory.harvesting = true; creep.memory.target = undefined; creep.memory.counter += 1; } } function getSourceIdFromRoomTable(creep) { const sourceTable = creep.room.memory.layout.sources; const sourceIterator = creep.memory.counter%creep.room.memory.layout.sources.length; const sourceId = sourceTable[sourceIterator]; return sourceId; } function getJobTarget(creep) { var target; switch (creep.memory.counter%4) { case 0: target = creep.room.controller; break; case 1: target = creep.pos.findClosestByRange(FIND_MY_STRUCTURES, {filter:{structureType:STRUCTURE_SPAWN}}); break; case 2: target = creep.pos.findClosestByRange(FIND_MY_CONSTRUCTION_SITES); break; case 3: target = creep.pos.findClosestByRange(FIND_MY_STRUCTURES, {filter:(s)=>{return s.hitsMax != s.hits;}}); break; } if(target) return target.id; creep.memory.counter++; return undefined; } function doJob(creep, target){ var response; switch (creep.memory.counter%4) { case 0: response = creep.upgradeController(target); break; case 1: response = creep.transfer(target, RESOURCE_ENERGY); break; case 2: response = creep.build(target); break; case 3: response = creep.repair(target); break; } if(response == ERR_FULL) { creep.memory.counter++; creep.memory.target = undefined; } }