You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
screeps/default/role.attacker.js

85 lines
3.1 KiB

module.exports = {
name: 'attacker',
prio: 10,
tickInit () {
for (let room of Object.values(Game.rooms)) {
if (!room.memory.attacker) {
room.memory.attacker = {}
}
if (room.find(FIND_STRUCTURES, {filter: s => s.structureType === STRUCTURE_TOWER}).length > 0) {
room.memory.attacker.targetCount = 0
continue
}
room.memory.attacker.targetCount = Math.min(room.find(FIND_HOSTILE_CREEPS).length, 2)
}
},
nextSpawn (spawn, roleCreeps) {
for (let room of Object.values(Game.rooms)) {
if (_.filter(roleCreeps, {memory: {room: room.name}}).length < room.memory.attacker.targetCount) {
return [
[ATTACK, MOVE, ATTACK, MOVE, ATTACK, MOVE, ATTACK, MOVE, ATTACK, MOVE, ATTACK, MOVE],
{room: room.name}
]
}
}
},
tick (creep) {
let room = Game.rooms[creep.memory.room]
let targetRoomName = creep.memory.room
if (targetRoomName !== 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 <= 1) {
creep.move(RIGHT)
} else if (creep.pos.y <= 1) {
creep.move(BOTTOM)
} else if (creep.pos.x >= 48) {
creep.move(LEFT)
} else if (creep.pos.y >= 48) {
creep.move(TOP)
}
let targetCreep
if (creep.memory.lastTarget) {
targetCreep = Game.getObjectById(creep.memory.lastTarget)
if (targetCreep && targetCreep.pos.roomName !== targetRoomName) {
delete creep.memory.lastTarget
targetCreep = undefined
}
}
if (targetCreep && !creepIsAttacker(targetCreep)) {
let closeAttackers = creep.pos.findInRange(FIND_HOSTILE_CREEPS, 3, {filter: c => c.getActiveBodyparts(ATTACK) > 0 && c.pos.roomName === targetRoomName})
if (closeAttackers.length > 0) {
targetCreep = closeAttackers[0]
}
}
if (!targetCreep) {
targetCreep = creep.pos.findClosestByRange(FIND_HOSTILE_CREEPS, {filter: c => (creepIsAttacker(c) || c.getActiveBodyparts(CARRY) >= 2) && c.pos.roomName === targetRoomName})
}
if (targetCreep) {
creep.memory.lastTarget = targetCreep.id
if (creep.attack(targetCreep) === ERR_NOT_IN_RANGE) {
creep.moveTo(targetCreep.pos)
}
}
},
}