|
|
|
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)
|
|
|
|
}
|
|
|
|
},
|
|
|
|
}
|