@screeps/engine
Version:
This is a module for Screeps standalone server. See [main repository](https://github.com/screeps/screeps) for more info.
121 lines (107 loc) • 4.97 kB
JavaScript
const _ = require('lodash'),
utils = require('../../../../utils'),
driver = utils.getDriver(),
C = driver.constants,
fakeRuntime = require('../../../common/fake-runtime'),
flee = require('./flee');
function checkPath(pos1, pos2, scope) {
const ret = fakeRuntime.findPath(pos1, pos2, {}, scope);
const path = ret.path;
if (!path.length) {
return false;
}
return path[path.length - 1].x == pos2.x && path[path.length - 1].y == pos2.y;
}
module.exports = function(creep, context) {
const {scope, intents, healers, hostiles, fortifications} = context;
const {roomObjects, roomController} = scope;
const costCallbackIgnoreRamparts = function(roomName, cm) {
fortifications.forEach(i => cm.set(i.x, i.y, 0));
};
const haveAttack = fakeRuntime.hasActiveBodyparts(creep, C.ATTACK);
if(!haveAttack && fakeRuntime.hasActiveBodyparts(creep, C.RANGED_ATTACK) && flee(creep, 3, context)) {
return;
}
let target;
if(creep.hits < creep.hitsMax / 2 && _.some(healers) && !haveAttack) {
target = fakeRuntime.findClosestByPath(creep, healers, {ignoreRoads: true}, scope);
if(target) {
const direction = fakeRuntime.moveTo(creep, target, {maxRooms: 1, ignoreRoads: true}, scope);
if(direction) {
intents.set(creep._id, 'move', { direction });
} else {
target = null;
}
} else {
target = null;
}
}
if(haveAttack) {
const nearCreep = _.find(hostiles, c => utils.dist(creep, c) <= 1);
if(nearCreep) {
intents.set(creep._id, 'attack', { id: nearCreep._id, x: nearCreep.x, y: nearCreep.y });
}
}
if(!target) {
target = fakeRuntime.findClosestByPath(creep, hostiles, {ignoreRoads: true, ignoreCreeps: true}, scope);
if(target && (haveAttack || (utils.dist(creep, target) > 3))) {
const direction = fakeRuntime.moveTo(creep, target, {maxRooms: 1, ignoreRoads: true, ignoreCreeps: true}, scope);
if(direction) {
intents.set(creep._id, 'move', { direction });
}
}
}
if(!target) {
target = fakeRuntime.findClosestByPath(creep, hostiles, {maxRooms: 1, ignoreRoads: true, costCallback: costCallbackIgnoreRamparts}, scope);
if(target && (haveAttack || (utils.dist(creep, target) > 3))) {
const direction = fakeRuntime.moveTo(creep, target, {maxRooms: 1, ignoreRoads: true, costCallback: costCallbackIgnoreRamparts}, scope);
if(direction) {
intents.set(creep._id, 'move', { direction });
}
}
}
if(!target) {
target = fakeRuntime.findClosestByPath(creep, hostiles, {ignoreDestructibleStructures: true, maxRooms: 1, ignoreRoads: true}, scope);
if(target && (haveAttack || (utils.dist(creep, target) > 3))) {
const direction = fakeRuntime.moveTo(creep, target, {ignoreDestructibleStructures: true, maxRooms: 1, ignoreRoads: true}, scope);
if(direction) {
intents.set(creep._id, 'move', { direction });
}
}
}
if(!target) {
const unreachableSpawns = _.filter(roomObjects, o =>
o.type == 'spawn' && !checkPath(creep, new fakeRuntime.RoomPosition(o.x, o.y, o.room), scope)
);
if(!unreachableSpawns.length && roomController && roomController.user) {
intents.set(creep._id, 'suicide', {});
return;
}
target = unreachableSpawns[0];
if(target) {
const direction = fakeRuntime.moveTo(creep, target, {ignoreDestructibleStructures: true, maxRooms: 1, ignoreRoads: true}, scope);
if(direction) {
intents.set(creep._id, 'move', { direction });
}
}
return;
}
intents.set(creep._id, 'attack', { id: target._id, x: target.x, y: target.y });
if((haveAttack || fakeRuntime.hasActiveBodyparts(creep, C.WORK)) && !!creep['memory_move'] && !!creep['memory_move']['path']) {
if(!creep['memory_move']['path'].length) {
return;
}
const pos = fakeRuntime.RoomPosition.sUnpackLocal(creep['memory_move']['path'][0], creep.room);
const structures = _.filter(roomObjects, o => !!C.CONTROLLER_STRUCTURES[o.type] && o.type != 'spawn' && o.x == pos.x && o.y == pos.y);
if(structures.length > 0) {
if(fakeRuntime.hasActiveBodyparts(creep, C.RANGED_ATTACK)) {
intents.set(creep._id, 'rangedAttack', { id: structures[0]._id })
}
if(fakeRuntime.hasActiveBodyparts(creep, C.WORK)) {
intents.set(creep._id, 'dismantle', { id: structures[0]._id });
} else {
intents.set(creep._id, 'attack', { id: structures[0]._id, x: structures[0].x, y: structures[0].y });
}
}
}
};