var idler = require('idle.base'); var collector = require('energy.storage'); // Finds the buildings that need energy var find_targets = function(creep) { var ref = creep.pos.findClosestByRange(FIND_STRUCTURES, { filter: (structure) => { return (structure.structureType == STRUCTURE_EXTENSION || structure.structureType == STRUCTURE_SPAWN || structure.structureType == STRUCTURE_TOWER) && structure.store.getFreeCapacity(RESOURCE_ENERGY) > 0; } }); if (!ref) { ref = creep.pos.findClosestByRange(FIND_STRUCTURES, { filter: (s) => { return (s.structureType == STRUCTURE_STORAGE && s.store.getFreeCapacity(RESOURCE_ENERGY) > 0); } }) } return ref; } var roleRefiller = { /** @param {Creep} creep @param {int} behaviourLevel **/ run: function(creep, behaviourLevel) { switch (creep.memory.state) { case "idle": idler.do_idle(creep); if (find_targets(creep)){ // If there are any buildings to charge, switch back to the charge state idler.clear_idle(creep); creep.memory.state = "charge_structure"; creep.say("Charging..."); } if (creep.store.getFreeCapacity() > 0) { // If we are not full with energy, switch to the get_energy state idler.clear_idle(creep); creep.memory.state = "get_energy"; creep.say('Reloading...'); } break; case "charge_structure": var target = find_targets(creep); if(target) { if(creep.transfer(target, RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) { creep.moveTo(target, {visualizePathStyle: {stroke: '#449900'}}); } } else { // Else, go idle creep.memory.state = "idle"; creep.say('Idling...'); } if (creep.store.getUsedCapacity() == 0) { // If we are not full with energy, switch to the get_energy state creep.memory.state = "get_energy"; creep.say('Reloading...'); } break; case "get_energy": collector.do_collect(creep, "charge_structure", "Charging..."); break; default: creep.memory.state = "idle"; creep.say('Idling...'); } } }; module.exports = roleRefiller;