@screeps/engine
Version:
This is a module for Screeps standalone server. See [main repository](https://github.com/screeps/screeps) for more info.
62 lines (54 loc) • 2.14 kB
JavaScript
const _ = require('lodash'),
utils = require('../../../../utils'),
driver = utils.getDriver(),
C = driver.constants,
fakeRuntime = require('../../../common/fake-runtime'),
flee = require('./flee');
module.exports = function(creep, context) {
const {scope, intents, invaders} = context;
let healTargets = _.filter(invaders, c => utils.dist(c, creep) <= 3);
if(_.some(healTargets)) {
const healTarget = _.first(healTargets.sort((a, b) => (b.hitsMax - b.hits) - (a.hitsMax - a.hits)));
if(utils.dist(creep, healTarget) <= 1) {
intents.set(creep._id, 'heal', {id: healTarget._id, x: healTarget.x, y: healTarget.y});
} else {
intents.set(creep._id, 'rangedHeal', {id: healTarget._id});
}
}
if(creep.hits < creep.hitsMax / 2) {
if(!flee(creep, 4, context)) {
const fleeTarget = fakeRuntime.findClosestByPath(
creep,
_.filter(invaders, c => (c != creep) && fakeRuntime.hasActiveBodyparts(c, C.HEAL)),
null,
scope);
if(fleeTarget) {
const direction = fakeRuntime.moveTo(creep, fleeTarget, {range: 1}, scope);
if(direction) {
intents.set(creep._id, 'move', { direction });
}
}
}
return;
}
let target = fakeRuntime.findClosestByPath(creep, _.filter(invaders, c => c.hits < c.hitsMax), null, scope);
if(!target) {
if(flee(creep, 4, context)) {
return;
}
target = fakeRuntime.findClosestByPath(creep, _.filter(invaders, c => (c != creep) && !fakeRuntime.hasActiveBodyparts(c, C.HEAL)), null, scope);
}
if(!target) {
intents.set(creep._id, 'suicide', {});
return;
}
let direction = 0;
if(utils.dist(creep, target) <= 1) {
direction = utils.getDirection(target.x-creep.x,target.y-creep.y);
} else {
direction = fakeRuntime.moveTo(creep, target, {range: 1}, scope);
}
if(direction) {
intents.set(creep._id, 'move', { direction });
}
};