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) { GetEnergy(creep); energyFullCheck(creep); } else { BuildOrRepair(creep); energyEmptyCheck(creep); } } } function GetEnergy(creep){ if(!creep.memory.target) findEnergyTarget(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 BuildOrRepair(creep){ if(!creep.memory.target) findBuildOrRepairTarget(creep); if(!creep.memory.target) return; const target = Game.getObjectById(creep.memory.target); if(!target) { creep.memory.target = undefined; return; } if(target.hits && target.hits === target.hitsMax) { creep.memory.target = undefined; return; } if(creep.pos.isNearTo(target)) if(!target.hits) creep.build(target); else creep.repair(target); else creep.moveTo(target); } function energyEmptyCheck(creep){ if(!creep.store.getUsedCapacity(RESOURCE_ENERGY)) { creep.memory.collecting = true; creep.memory.target = undefined; } } function findEnergyTarget(creep){ var target; if(creep.room.storage.store.getUsedCapacity(RESOURCE_ENERGY) > creep.store.getFreeCapacity(RESOURCE_ENERGY)) target = creep.room.storage; if(!target) target = creep.pos.findClosestByRange(FIND_STRUCTURES, { filter: (st)=>{ return st.structureType == STRUCTURE_CONTAINER && st.store.getUsedCapacity(RESOURCE_ENERGY) > creep.store.getFreeCapacity(RESOURCE_ENERGY); }}); if(!target) 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) creep.memory.target = target.id; } function findBuildOrRepairTarget(creep) { var target; switch (creep.memory.counter%2) { case 0: target = creep.pos.findClosestByRange(FIND_MY_CONSTRUCTION_SITES); break; case 1: target = creep.pos.findClosestByRange(FIND_STRUCTURES, { filter:(s)=> { return s.hitsMax - s.hits && s.structureType != STRUCTURE_WALL; }}); break; } if(target) creep.memory.target = target.id; creep.memory.counter++; }