var idler = require('idle.base'); var harvester = require('energy.harvest'); var collector = require('energy.storage'); var get_target = function(creep) { var walls = creep.room.find(FIND_STRUCTURES, { filter: (s) => s.structureType == STRUCTURE_WALL && s.hits < s.hitsMax }); for(var i = 0.0001; i < 1; i += 0.0001) { for(var wall of walls) { if ((wall.hits / wall.hitsMax) < i) { return wall; } } } return null; } var roleRepairer = { get_target: get_target, /** @param {Creep} creep @param {int} behaviourLevel **/ run: function(creep, behaviourLevel) { switch (creep.memory.state) { case "idle": idler.do_idle(creep); if (get_target(creep)){ // If there are any buildings to repair, switch back to the repair state idler.clear_idle(creep); creep.memory.state = "repair_structure"; creep.say("Repairing..."); } 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 "repair_structure": var closestDamagedStructure = get_target(creep); if(closestDamagedStructure) { if (creep.repair(closestDamagedStructure) == ERR_NOT_IN_RANGE) { creep.moveTo(closestDamagedStructure, {visualizePathStyle: {stroke: '#FF9999'}}); } } else { // Else, go idle creep.memory.state = "idle"; creep.say('Idling...'); } if (creep.store.getUsedCapacity() == 0) { // If we are out of energy, get more! creep.memory.state = "get_energy"; creep.say('Reloading...'); } break; case "get_energy": var energy_source; if(behaviourLevel >= 2) { energy_source = collector; } else { energy_source = harvester; } energy_source.do_collect(creep, "repair_structure", "Repairing..."); break; default: creep.memory.state = "repair_structure"; creep.say('Repairing...'); } } }; module.exports = roleRepairer;