module.exports = { name: 'rangedAttacker', prio: 10, tickInit () { for (let room of Object.values(Game.rooms)) { if (!room.memory.rangedAttacker) { room.memory.rangedAttacker = {} } if (room.find(FIND_STRUCTURES, {filter: s => s.structureType === STRUCTURE_TOWER}).length > 0) { room.memory.rangedAttacker.targetCount = 0 continue } room.memory.rangedAttacker.targetCount = Math.min(room.find(FIND_HOSTILE_CREEPS).length, 2) } }, nextSpawn (spawn, roleCreeps) { for (let [roomName, roomMemory] of Object.entries(Memory.rooms)) { if (_.filter(roleCreeps, {memory: {room: roomName}}).length < roomMemory.rangedAttacker.targetCount) { return [ [RANGED_ATTACK, MOVE, RANGED_ATTACK, MOVE, RANGED_ATTACK, MOVE, RANGED_ATTACK, MOVE, RANGED_ATTACK, MOVE], {room: roomName} ] } } }, tick (creep) { let room = Game.rooms[creep.memory.room] let targetRoomName = creep.memory.room if (creep.memory.colony === creep.pos.roomName && (_.filter(Game.creeps, {memory: {role: 'healer', room: targetRoomName}, spawning: false}).length < Memory.rooms[targetRoomName].healer.targetCount || _.filter(Game.creeps, {memory: {role: 'attacker', room: targetRoomName}, spawning: false}).length < Memory.rooms[targetRoomName].attacker.targetCount || _.filter(Game.creeps, {memory: {role: 'rangedAttacker', room: targetRoomName}, spawning: false}).length < Memory.rooms[targetRoomName].rangedAttacker.targetCount) ) { if (creep.ticksToLive < 1200) { creep.moveTo(creep.pos.findClosestByPath(FIND_MY_SPAWNS)) } else { creep.moveTo(creep.pos.findClosestByPath(FIND_FLAGS, { filter: el => el.name.startsWith('gather'), visualizePathStyle: {stroke: '#0017ff'} })) } return } if (!room || targetRoomName !== creep.pos.roomName) { creep.moveTo(new RoomPosition(25, 25, creep.memory.room)) return } if (creep.pos.x <= 2) { creep.move(RIGHT) } else if (creep.pos.y <= 2) { creep.move(BOTTOM) } else if (creep.pos.x >= 47) { creep.move(LEFT) } else if (creep.pos.y >= 47) { creep.move(TOP) } let targetCreep if (creep.memory.lastTarget) { targetCreep = Game.getObjectById(creep.memory.lastTarget) } let closeAttackers = creep.pos.findInRange(FIND_HOSTILE_CREEPS, 3, {filter: c => creepIsAttacker(c)}) if (closeAttackers.length > 0) { creep.moveByPath(PathFinder.search(creep.pos, closeAttackers.map(el => {return {pos: el.pos, range: 2}}), {flee: true, maxRooms: 1}).path) targetCreep = closeAttackers[0] } if (!targetCreep) { targetCreep = creep.pos.findClosestByRange(FIND_HOSTILE_CREEPS, {filter: c => creepIsAttacker(c) || c.getActiveBodyparts(CARRY) >= 2}) } if (targetCreep) { let targetIsAttacker = creepIsAttacker(targetCreep) creep.memory.lastTarget = targetCreep.id let range = creep.pos.getRangeTo(targetCreep.pos) if (range <= 3) { creep.rangedAttack(targetCreep) } else { let driveByTargets = creep.pos.findInRange(FIND_HOSTILE_CREEPS, 3, {filter: c => creepIsAttacker(c) || c.getActiveBodyparts(CARRY) >= 2}) if (driveByTargets.length > 0) { creep.rangedAttack(driveByTargets[0]) } } let distanceToKeep = targetIsAttacker ? 3 : 2 creep.moveByPath(PathFinder.search(creep.pos, [{pos: targetCreep.pos, range: distanceToKeep}], {maxRooms: 1, flee: range < distanceToKeep}).path) } }, }