let common = require('common') module.exports = { name: 'harvester', prio: 3, count: 3, bodies: [ [WORK, WORK, CARRY, MOVE], [WORK, WORK, WORK, CARRY, MOVE], [WORK, WORK, WORK, WORK, WORK, CARRY, MOVE], [WORK, WORK, WORK, WORK, WORK, CARRY, MOVE, MOVE], [WORK, WORK, WORK, WORK, WORK, CARRY, MOVE, MOVE, MOVE], [WORK, WORK, WORK, WORK, WORK, CARRY, CARRY, MOVE, MOVE, MOVE], [WORK, WORK, WORK, WORK, WORK, CARRY, CARRY, MOVE, MOVE, MOVE, MOVE], ], tick (creep) { let dropped = creep.pos.findInRange(FIND_DROPPED_RESOURCES, 1); if (dropped.length > 0) { creep.pickup(dropped[0]) } let targetCreeps = creep.pos.findInRange(FIND_MY_CREEPS, 1, { filter: tc => tc.store.getFreeCapacity(RESOURCE_ENERGY) && tc.memory.role !== 'harvester' }); if (targetCreeps.length > 0) { creep.transfer(targetCreeps[0], RESOURCE_ENERGY) } else { let targets = creep.pos.findInRange(FIND_STRUCTURES, 1, { filter: (structure) => structure.store && structure.store.getFreeCapacity(RESOURCE_ENERGY) > 0 && structure.structureType === STRUCTURE_EXTENSION }); if (targets.length === 0) { targets = creep.pos.findInRange(FIND_STRUCTURES, 1, { filter: (structure) => structure.store && structure.store.getFreeCapacity(RESOURCE_ENERGY) > 0 }); } if (targets.length > 0) { creep.transfer(_.min(targets, el => el.store[RESOURCE_ENERGY]), RESOURCE_ENERGY) } else { let targetCreeps = creep.pos.findInRange(FIND_MY_CREEPS, 1, { filter: tc => tc.store.getFreeCapacity(RESOURCE_ENERGY) }); if (targetCreeps.length > 0) { let tc = targetCreeps[0] creep.transfer(tc, RESOURCE_ENERGY, tc.memory.role === 'harvester' ? tc.store.getFreeCapacity(RESOURCE_ENERGY) * 0.5 : creep.store[RESOURCE_ENERGY]) } else { let buildTargets = creep.pos.findInRange(FIND_MY_CONSTRUCTION_SITES, 1); if (buildTargets.length > 0 && creep.build(buildTargets[0]) === OK) { return } } } } let target = Game.getObjectById(creep.memory.source) let actionResult = creep.harvest(target) if (actionResult === ERR_NOT_IN_RANGE) { creep.moveTo(target, {reusePath: false, visualizePathStyle: {stroke: '#ffaa00'}}); } if (actionResult !== OK) { return 'idle' } } };