parent
a741cd8352
commit
493a1e0bad
@ -1,47 +1,50 @@ |
||||
const roleHarvester = require('./role.harvester') |
||||
const roleRemoteHarvester = require('./role.remoteHarvester') |
||||
const roleTransporter = require('./role.transporter') |
||||
const roleBuilder = require('./role.builder') |
||||
const roleUpgrader = require('./role.upgrader') |
||||
const roleScout = require('./role.scout') |
||||
const roleAttacker = require('./role.attacker') |
||||
const roleRangedAttacker = require('./role.rangedAttacker') |
||||
const roleHauler = require('./role.hauler') |
||||
const roleHealer = require('./role.healer') |
||||
const roleFiller = require('./role.filler') |
||||
const roleReserver = require('./role.reserver') |
||||
|
||||
global.ROLES = { |
||||
harvester: { |
||||
prio: 3, |
||||
count: 3, |
||||
module: roleHarvester, |
||||
bodies: [ |
||||
[WORK, WORK, CARRY, MOVE], |
||||
[WORK, WORK, WORK, WORK, WORK, WORK, CARRY, MOVE], |
||||
[WORK, WORK, WORK, WORK, WORK, WORK, CARRY, MOVE, MOVE], |
||||
[WORK, WORK, WORK, WORK, WORK, WORK, CARRY, MOVE, MOVE, MOVE], |
||||
[WORK, WORK, WORK, WORK, WORK, WORK, CARRY, CARRY, MOVE, MOVE, MOVE], |
||||
[WORK, WORK, WORK, WORK, WORK, WORK, CARRY, CARRY, MOVE, MOVE, MOVE, MOVE], |
||||
] |
||||
}, |
||||
transporter: { |
||||
prio: 4, |
||||
count: 2, |
||||
module: roleTransporter, |
||||
bodies: [ |
||||
[CARRY, CARRY, MOVE], |
||||
[CARRY, CARRY, MOVE, CARRY, CARRY, MOVE], |
||||
[CARRY, CARRY, MOVE, CARRY, CARRY, MOVE, CARRY, CARRY, MOVE], |
||||
[CARRY, CARRY, MOVE, CARRY, CARRY, MOVE, CARRY, CARRY, MOVE, CARRY, CARRY, MOVE], |
||||
] |
||||
}, |
||||
builder: { |
||||
prio: 5, |
||||
count: 2, |
||||
maxExpands: 4, |
||||
module: roleBuilder, |
||||
baseBody: [WORK, CARRY, MOVE, MOVE], |
||||
expandBody: [WORK, CARRY, MOVE, MOVE], |
||||
}, |
||||
upgrader: { |
||||
prio: 6, |
||||
count: 2, |
||||
maxExpands: 4, |
||||
module: roleUpgrader, |
||||
baseBody: [WORK, CARRY, MOVE], |
||||
expandBody: [WORK, WORK, MOVE], |
||||
}, |
||||
global.roleModules = [ |
||||
roleHarvester, |
||||
roleRemoteHarvester, |
||||
roleBuilder, |
||||
roleTransporter, |
||||
roleUpgrader, |
||||
roleScout, |
||||
roleRangedAttacker, |
||||
roleHauler, |
||||
roleAttacker, |
||||
roleHealer, |
||||
roleFiller, |
||||
roleReserver, |
||||
] |
||||
|
||||
global.ROLES = {} |
||||
for (let mod of roleModules) { |
||||
ROLES[mod.name] = mod |
||||
} |
||||
|
||||
global.creepIsAttacker = creep => creep.getActiveBodyparts(ATTACK) + creep.getActiveBodyparts(RANGED_ATTACK) > 0 |
||||
global.activeRemotes = ['E8S4', 'E8S5', 'E9S5', 'E8S3'] |
||||
|
||||
global.ALREADY_IN_ROOM = 'alreadyInRoom' |
||||
global.MOVING = 'moving' |
||||
|
||||
global.moveToRoom = function (creep, targetRoom) { |
||||
if (creep.pos.roomName === targetRoom) { |
||||
return ALREADY_IN_ROOM |
||||
} |
||||
|
||||
const exitDir = Game.map.findExit(creep.room, targetRoom); |
||||
const exit = creep.pos.findClosestByRange(exitDir); |
||||
creep.moveTo(exit); |
||||
creep.say(targetRoom) |
||||
return MOVING |
||||
} |
||||
|
@ -0,0 +1,85 @@ |
||||
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) |
||||
} |
||||
} |
||||
}, |
||||
} |
@ -0,0 +1,58 @@ |
||||
const common = require('common') |
||||
|
||||
module.exports = { |
||||
name: 'filler', |
||||
prio: 4, |
||||
count: 2, |
||||
bodies: [ |
||||
[CARRY, CARRY, MOVE], |
||||
[CARRY, CARRY, MOVE, CARRY, CARRY, MOVE], |
||||
[CARRY, CARRY, MOVE, CARRY, CARRY, MOVE, CARRY, CARRY, MOVE], |
||||
[CARRY, CARRY, MOVE, CARRY, CARRY, MOVE, CARRY, CARRY, MOVE, CARRY, CARRY, MOVE], |
||||
], |
||||
tick (creep) { |
||||
if (creep.store.getFreeCapacity(RESOURCE_ENERGY) === 0) { |
||||
creep.memory.loading = false |
||||
} |
||||
else if (creep.store[RESOURCE_ENERGY] === 0) { |
||||
creep.memory.loading = true |
||||
} |
||||
|
||||
if (creep.memory.loading) { |
||||
let target = creep.pos.findClosestByPath(FIND_STRUCTURES, { |
||||
filter: s => { |
||||
return (s.structureType === STRUCTURE_STORAGE || s.structureType === STRUCTURE_CONTAINER) |
||||
&& s.store[RESOURCE_ENERGY] > Math.min(creep.store.getFreeCapacity(RESOURCE_ENERGY), 100) |
||||
} |
||||
}) |
||||
if (target) { |
||||
if (creep.withdraw(target, RESOURCE_ENERGY) === ERR_NOT_IN_RANGE) { |
||||
creep.moveTo(target, {visualizePathStyle: {stroke: '#f7e180'}}) |
||||
} |
||||
} else { |
||||
creep.moveTo(creep.pos.findClosestByRange(FIND_FLAGS, {filter: flag => flag.name.startsWith('idle')}), {visualizePathStyle: {stroke: '#ff0000'}}); |
||||
return 'idle' |
||||
} |
||||
} |
||||
else { |
||||
let target = creep.pos.findClosestByPath(FIND_STRUCTURES, { |
||||
filter: s => ( |
||||
s.structureType === STRUCTURE_EXTENSION |
||||
|| s.structureType === STRUCTURE_SPAWN |
||||
) |
||||
&& s.store.getFreeCapacity(RESOURCE_ENERGY) > 0 |
||||
}) |
||||
if (!target && creep.room.storage && creep.room.storage.store[RESOURCE_ENERGY] > 1e5) { |
||||
target = creep.room.storage.pos.findClosestByRange(FIND_STRUCTURES, {filter: s => s.structureType === STRUCTURE_LINK}) |
||||
} |
||||
if (target) { |
||||
if (creep.transfer(target, RESOURCE_ENERGY) === ERR_NOT_IN_RANGE) { |
||||
creep.moveTo(target, {visualizePathStyle: {stroke: '#00ff0f'}}); |
||||
} |
||||
} else { |
||||
creep.moveTo(creep.pos.findClosestByRange(FIND_FLAGS, {filter: flag => flag.name.startsWith('idle')}), {visualizePathStyle: {stroke: '#ff0000'}}); |
||||
return 'idle' |
||||
} |
||||
} |
||||
} |
||||
}; |
@ -0,0 +1,101 @@ |
||||
module.exports = { |
||||
name: 'hauler', |
||||
prio: 11, |
||||
tickInit () { |
||||
for (let room of Object.values(Game.rooms)) { |
||||
if (!room.memory.hauler) { |
||||
room.memory.hauler = {} |
||||
} |
||||
let harvesters = room.find(FIND_MY_CREEPS, {filter: c => c.memory.role === 'remoteHarvester' && c.memory.room === room.name}) |
||||
let filledContainers = room.find(FIND_STRUCTURES, {filter: s => s.structureType === STRUCTURE_CONTAINER && s.store[RESOURCE_ENERGY] > 0}) |
||||
if (room.find(FIND_STRUCTURES, {filter: s => s.structureType === STRUCTURE_TOWER || s.structureType === STRUCTURE_SPAWN}).length > 0 |
||||
|| (filledContainers.length === 0 && harvesters.length === 0) |
||||
|| room.find(FIND_HOSTILE_CREEPS, {filter: c => creepIsAttacker(c)}).length > 0 |
||||
) { |
||||
room.memory.hauler.targetCount = 0 |
||||
continue |
||||
} |
||||
room.memory.hauler.targetCount = Math.max(filledContainers.length, harvesters.length) * 6 |
||||
} |
||||
}, |
||||
nextSpawn (spawn, roleCreeps) { |
||||
for (let room of Object.values(Game.rooms)) { |
||||
if (_.filter(roleCreeps, {memory: {room: room.name}}).length < room.memory.hauler.targetCount) { |
||||
return [ |
||||
[CARRY, MOVE, CARRY, MOVE, CARRY, MOVE, CARRY, MOVE], |
||||
{room: room.name} |
||||
] |
||||
} |
||||
} |
||||
}, |
||||
tick (creep) { |
||||
let targetRoom = Game.rooms[creep.memory.room] |
||||
let hostileCreeps = [1] |
||||
if (targetRoom) { |
||||
hostileCreeps = targetRoom.find(FIND_HOSTILE_CREEPS, {filter: c => creepIsAttacker(c)}) |
||||
} |
||||
if (creep.store.getFreeCapacity(RESOURCE_ENERGY) > 0 && hostileCreeps.length === 0) { |
||||
if (moveToRoom(creep, creep.memory.room) === MOVING) { |
||||
return |
||||
} |
||||
|
||||
let dropped = creep.pos.findInRange(FIND_DROPPED_RESOURCES, 1); |
||||
if (dropped.length > 0) { |
||||
creep.pickup(dropped[0]) |
||||
} |
||||
|
||||
dropped = creep.pos.findClosestByPath(FIND_DROPPED_RESOURCES, {filter: r => r.amount >= 100}); |
||||
if (dropped) { |
||||
if (creep.pickup(dropped) === ERR_NOT_IN_RANGE) { |
||||
creep.moveTo(dropped) |
||||
return |
||||
} |
||||
} |
||||
|
||||
let target = creep.pos.findClosestByPath(FIND_TOMBSTONES, { |
||||
filter: (structure) => structure.store[RESOURCE_ENERGY] > 0 |
||||
}) |
||||
if (!target) { |
||||
target = creep.pos.findClosestByPath(FIND_RUINS, { |
||||
filter: (structure) => structure.store[RESOURCE_ENERGY] > 0 |
||||
}) |
||||
} |
||||
if (!target) { |
||||
target = creep.pos.findClosestByPath(FIND_STRUCTURES, { |
||||
filter: s => { |
||||
return s.structureType === STRUCTURE_CONTAINER |
||||
} |
||||
}) |
||||
} |
||||
if (target) { |
||||
if (creep.withdraw(target, RESOURCE_ENERGY) === ERR_NOT_IN_RANGE) { |
||||
creep.moveTo(target, {visualizePathStyle: {stroke: '#f7e180'}}) |
||||
} |
||||
} else { |
||||
if (!target) { |
||||
target = creep.pos.findClosestByRange(FIND_MY_CREEPS, { |
||||
filter: s => { |
||||
return s.store[RESOURCE_ENERGY] >= s.store.getCapacity(RESOURCE_ENERGY) * 0.5 |
||||
&& s.memory.role === 'remoteHarvester' |
||||
} |
||||
}) |
||||
} |
||||
if (target) { |
||||
if (creep.pos.getRangeTo(target) > 1) { |
||||
creep.moveTo(target, {visualizePathStyle: {stroke: '#f7e180'}}) |
||||
} |
||||
} |
||||
} |
||||
} else if (creep.store[RESOURCE_ENERGY] > 0) { |
||||
let storage = Game.rooms[creep.memory.colony].storage |
||||
if (creep.transfer(storage, RESOURCE_ENERGY) === ERR_NOT_IN_RANGE) { |
||||
creep.moveTo(storage) |
||||
} |
||||
} else if (moveToRoom(creep,creep.memory.colony) === MOVING) { |
||||
return |
||||
} else { |
||||
creep.moveTo(creep.pos.findClosestByRange(FIND_FLAGS, {filter: flag => flag.name.startsWith('idle')}), {visualizePathStyle: {stroke: '#ff0000'}}); |
||||
return 'idle' |
||||
} |
||||
}, |
||||
} |
@ -0,0 +1,88 @@ |
||||
module.exports = { |
||||
name: 'healer', |
||||
prio: 10, |
||||
tickInit () { |
||||
for (let room of Object.values(Game.rooms)) { |
||||
if (!room.memory.healer) { |
||||
room.memory.healer = {} |
||||
} |
||||
if (room.find(FIND_STRUCTURES, {filter: s => s.structureType === STRUCTURE_TOWER}).length > 0) { |
||||
room.memory.healer.targetCount = 0 |
||||
continue |
||||
} |
||||
room.memory.healer.targetCount = Math.min(room.find(FIND_HOSTILE_CREEPS).length, 1) |
||||
} |
||||
}, |
||||
nextSpawn (spawn, roleCreeps) { |
||||
for (let room of Object.values(Game.rooms)) { |
||||
if (_.filter(roleCreeps, {memory: {room: room.name}}).length < room.memory.healer.targetCount) { |
||||
return [ |
||||
[MOVE, MOVE, MOVE, MOVE, HEAL, HEAL, HEAL, HEAL], |
||||
{room: room.name} |
||||
] |
||||
} |
||||
} |
||||
}, |
||||
tick (creep) { |
||||
let room = Game.rooms[creep.memory.room] |
||||
let targetRoomName = creep.memory.room |
||||
if (creep.memory.room !== 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) |
||||
) { |
||||
creep.moveTo(creep.pos.findClosestByPath(FIND_FLAGS, {filter: el => el.name.startsWith('gather'), visualizePathStyle: {stroke: '#0017ff'}})) |
||||
return |
||||
} |
||||
if (!room || creep.memory.room !== 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, 4, {filter: c => c.getActiveBodyparts(ATTACK) > 0 && c.pos.roomName === targetRoomName}) |
||||
if (closeAttackers.length > 0) { |
||||
creep.moveByPath(PathFinder.search(creep.pos, closeAttackers.map(el => {return {pos: el.pos, range: 3}}), {flee: true, maxRooms: 1}).path) |
||||
} |
||||
|
||||
if (creep.hits < creep.hitsMax) { |
||||
creep.heal(creep) |
||||
return |
||||
} |
||||
|
||||
let healTargets = creep.pos.findInRange(FIND_MY_CREEPS, 1, {filter: c => c.hits < c.hitsMax && c.pos.roomName === targetRoomName}) |
||||
if (healTargets.length > 0) { |
||||
creep.heal(healTargets[0]) |
||||
return |
||||
} |
||||
|
||||
let rangedHealTarget = creep.pos.findClosestByRange(FIND_MY_CREEPS, {filter: c => c.hits < c.hitsMax && c.pos.roomName === targetRoomName}) |
||||
if (rangedHealTarget) { |
||||
creep.rangedHeal(rangedHealTarget) |
||||
creep.moveTo(rangedHealTarget, {visualizePathStyle: {stroke: '#00ff0f'}}) |
||||
return |
||||
} |
||||
|
||||
let possibleTarget = creep.pos.findClosestByPath(FIND_MY_CREEPS, {filter: c => creepIsAttacker(c) && c.pos.roomName === targetRoomName}) |
||||
let range = creep.pos.getRangeTo(possibleTarget) |
||||
if (range === 1) { |
||||
creep.moveByPath(PathFinder.search(creep.pos, {pos: possibleTarget.pos, range: 2}, {flee: true, maxRooms: 1}).path) |
||||
} |
||||
else if (range > 3) { |
||||
creep.moveTo(possibleTarget, {visualizePathStyle: {stroke: '#00ff0f'}}) |
||||
} |
||||
}, |
||||
} |
@ -0,0 +1,90 @@ |
||||
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) |
||||
} |
||||
}, |
||||
} |
@ -0,0 +1,54 @@ |
||||
let common = require('common') |
||||
|
||||
module.exports = { |
||||
name: 'remoteHarvester', |
||||
prio: 10, |
||||
bodies: [ |
||||
[WORK, WORK, WORK, CARRY, MOVE, MOVE, MOVE, MOVE], |
||||
[WORK, WORK, WORK, WORK, WORK, WORK, CARRY, MOVE, MOVE, MOVE, MOVE, MOVE, MOVE, MOVE], |
||||
[WORK, WORK, WORK, WORK, WORK, WORK, CARRY, CARRY, MOVE, MOVE, MOVE, MOVE, MOVE, MOVE, MOVE, MOVE], |
||||
], |
||||
tick (creep) { |
||||
let dropped = creep.pos.findInRange(FIND_DROPPED_RESOURCES, 1); |
||||
if (dropped.length > 0) { |
||||
creep.pickup(dropped[0]) |
||||
} |
||||
|
||||
let repairTargets = creep.pos.findInRange( |
||||
FIND_STRUCTURES, |
||||
3, |
||||
{filter: s => s.structureType === STRUCTURE_CONTAINER && s.hits + creep.getActiveBodyparts(WORK) * 100 <= s.hitsMax}); |
||||
if (repairTargets.length > 0) { |
||||
if (creep.store[RESOURCE_ENERGY] >= creep.getActiveBodyparts(WORK) * 10 && creep.repair(repairTargets[0]) === OK) { |
||||
return |
||||
} |
||||
} else { |
||||
let targetCreeps = creep.pos.findInRange(FIND_MY_CREEPS, 1, { |
||||
filter: tc => tc.store.getFreeCapacity(RESOURCE_ENERGY) && tc.memory.role !== 'remoteHarvester' |
||||
}); |
||||
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 |
||||
}); |
||||
if (targets.length > 0) { |
||||
creep.transfer(_.min(targets, el => el.store[RESOURCE_ENERGY]), RESOURCE_ENERGY) |
||||
} else { |
||||
if (creep.store[RESOURCE_ENERGY] >= creep.getActiveBodyparts(WORK) * 5) { |
||||
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, {visualizePathStyle: {stroke: '#ffaa00'}}); |
||||
} |
||||
} |
||||
}; |
@ -0,0 +1,31 @@ |
||||
module.exports = { |
||||
name: 'reserver', |
||||
prio: 20, |
||||
nextSpawn (spawn, roleCreeps) { |
||||
for (let roomName of activeRemotes) { |
||||
let room = Game.rooms[roomName] |
||||
if (!room) { |
||||
continue |
||||
} |
||||
if (!room.controller.owner |
||||
&& _.filter(roleCreeps, {memory: {room: roomName}}).length === 0 && ( |
||||
!room.controller.reservation |
||||
|| (room.controller.reservation.username === 'NativeException' && room.controller.reservation.ticksToEnd < 3000) |
||||
)) { |
||||
return [ |
||||
[CLAIM, CLAIM, MOVE, MOVE], |
||||
{room: roomName} |
||||
] |
||||
} |
||||
} |
||||
}, |
||||
tick (creep) { |
||||
if (moveToRoom(creep, creep.memory.room) === MOVING) { |
||||
return |
||||
} |
||||
let room = Game.rooms[creep.memory.room] |
||||
if (creep.reserveController(room.controller) === ERR_NOT_IN_RANGE) { |
||||
creep.moveTo(room.controller) |
||||
} |
||||
}, |
||||
} |
@ -1,5 +1,30 @@ |
||||
module.exports = { |
||||
name: 'scout', |
||||
count: 1, |
||||
prio: 15, |
||||
bodies: [[MOVE]], |
||||
nextSpawn (spawn, roleCreeps) { |
||||
for (let roomName of activeRemotes) { |
||||
if (!Game.rooms[roomName] && _.filter(roleCreeps, {memory: {room: roomName}}).length === 0) { |
||||
return [ |
||||
[MOVE], |
||||
{room: roomName} |
||||
] |
||||
} |
||||
} |
||||
}, |
||||
tick (creep) { |
||||
|
||||
let room = Game.rooms[creep.memory.room] |
||||
if (!room) { |
||||
for (let remoteRoom of activeRemotes) { |
||||
if (!Game.rooms[remoteRoom]) { |
||||
creep.memory.room = remoteRoom |
||||
} |
||||
} |
||||
} |
||||
let pos = new RoomPosition(25, 25, creep.memory.room) |
||||
if (moveToRoom(creep, creep.memory.room) === ALREADY_IN_ROOM && creep.pos.getRangeTo(pos) > 10) { |
||||
creep.moveByPath(PathFinder.search(creep.pos, {pos, range: 10}).path) |
||||
} |
||||
}, |
||||
} |
||||
|
Loading…
Reference in new issue