screeps-online/role.refiller.js
2019-11-29 15:19:38 +01:00

79 lines
2.7 KiB
JavaScript

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;