module.exports = { begin(creep){ if(!creep.memory.collecting) creep.memory.collecting = false; if(!creep.memory.counter) creep.memory.counter = 0; }, tick(creep){ if(creep.memory.collecting) { withdrawEnergy(creep); energyFullCheck(creep); } else { transferEnergy(creep); energyEmptyCheck(creep); } } } function withdrawEnergy(creep){ if(!creep.memory.target) findWithdrawTarget(creep); const target = Game.getObjectById(creep.memory.target); if(!target) creep.memory.target = undefined; if(creep.pos.isNearTo(target)) { if(!target.store) creep.pickup(target); else creep.withdraw(target, RESOURCE_ENERGY); } else creep.moveTo(target); } function energyFullCheck(creep){ if(!creep.store.getFreeCapacity(RESOURCE_ENERGY)) { creep.memory.collecting = false; creep.memory.target = undefined; } } function transferEnergy(creep){ if(!creep.memory.target) findTransferTarget(creep); if(!creep.memory.target) return; const target = Game.getObjectById(creep.memory.target); if(target.store.getFreeCapacity(RESOURCE_ENERGY)==0) { creep.memory.target = undefined; creep.memory.counter++; } if(creep.pos.isNearTo(target)) creep.transfer(target, RESOURCE_ENERGY); else creep.moveTo(target); } function energyEmptyCheck(creep){ if(!creep.store.getUsedCapacity(RESOURCE_ENERGY)) { creep.memory.collecting = true; creep.memory.target = undefined; } } function findWithdrawTarget(creep){ var target = creep.pos.findClosestByRange(FIND_DROPPED_RESOURCES, { filter: (r)=>{ return r.resourceType == RESOURCE_ENERGY && r.amount > creep.store.getFreeCapacity(RESOURCE_ENERGY); }}); if(!target) target = creep.pos.findClosestByRange(FIND_RUINS, { filter: (r)=>{ return r.store.getUsedCapacity(RESOURCE_ENERGY) > creep.store.getFreeCapacity(RESOURCE_ENERGY); }}); if(!target) target = creep.pos.findClosestByRange(FIND_TOMBSTONES, { filter: (t)=>{ return t.store.getUsedCapacity(RESOURCE_ENERGY) > creep.store.getFreeCapacity(RESOURCE_ENERGY); }}); if(!target) target = creep.pos.findClosestByRange(FIND_STRUCTURES, { filter: (st)=>{ return st.structureType == STRUCTURE_CONTAINER && st.store.getUsedCapacity(RESOURCE_ENERGY) > 1000; }}); if(target) creep.memory.target = target.id; } function findTransferTarget(creep) { var target; switch (creep.memory.counter%3) { case 0: target = creep.pos.findClosestByRange(FIND_MY_STRUCTURES, { filter:(s)=> { return (s.structureType == STRUCTURE_SPAWN || s.structureType == STRUCTURE_EXTENSION) && s.store.getFreeCapacity(RESOURCE_ENERGY) > 0; }}); break; case 1: target = creep.pos.findClosestByRange(FIND_STRUCTURES, { filter:(s)=> { return s.structureType == STRUCTURE_CONTAINER && s.store.getFreeCapacity(RESOURCE_ENERGY) > 1000; }}); break; case 2: target = creep.room.storage; break; } if(target) creep.memory.target = target.id; creep.memory.counter++; }