UNPKG

@screeps/engine

Version:

This is a module for Screeps standalone server. See [main repository](https://github.com/screeps/screeps) for more info.

123 lines (103 loc) 4.7 kB
'use strict'; const _ = require('lodash'), utils = require('../../../../utils'), driver = utils.getDriver(), C = driver.constants, fakeRuntime = require('../../../common/fake-runtime'), defence = require('./defence'); const makeBody = function (description) { return _.reduce(description, (result, segment) => { _.times(segment.count, () => { result.body.push(segment.part);result.boosts.push(segment.boost); }); return result; }, { body: [], boosts: [] }); }; const behaviors = { 'coordinated': function coordinatedDefender(creep, context) { const spots = context.spots, scope = context.scope, intents = context.intents, roomObjects = context.roomObjects, core = context.core, defenders = context.defenders; const safeMatrixCallback = defence.createSafeMatrixCallback(context); const creeps = _.clone(defenders); for (let spot in spots) { const creep = roomObjects[spots[spot]]; _.pull(creeps, creep); if (!creep) { continue; } if (50 * creep.x + creep.y == spot) { continue; } fakeRuntime.walkTo(creep, { x: Math.floor(spot / 50), y: spot % 50, room: creep.room }, { range: 0, costCallback: safeMatrixCallback }, context); } if (core.spawning) { for (let creep of creeps) { if (utils.dist(creep, core) == 1) { const direction = fakeRuntime.flee(creep, [core], 2, { costCallback: safeMatrixCallback }, scope); if (direction) { intents.set(creep._id, 'move', { direction }); return true; } } } } }, 'simple-melee': function simpleMelee(creep, context) { const hostiles = context.hostiles, intents = context.intents, scope = context.scope; if (!_.some(hostiles)) { return; } const safeMatrixCallback = defence.createSafeMatrixCallback(context); const target = fakeRuntime.findClosestByPath(creep, hostiles, { costCallback: safeMatrixCallback }, scope); if (!target) { return; } if (utils.dist(creep, target) <= 1) { intents.set(creep._id, 'attack', { id: target._id, x: target.x, y: target.y }); } else { fakeRuntime.walkTo(creep, target, { costCallback: safeMatrixCallback }, context); } }, 'fortifier': function fortifier(creep, context) { const ramparts = context.ramparts, intents = context.intents; if (!creep.store.energy || !_.some(ramparts)) { return; } const repairRamparts = _.filter(ramparts, r => r.hitsTarget && r.hits < r.hitsTarget); if (!_.some(repairRamparts)) { return; } const target = _.first(repairRamparts); if (!target) { return; } if (utils.dist(creep, target) <= 3) { intents.set(creep._id, 'repair', { id: target._id, x: target.x, y: target.y }); return; } const safeMatrixCallback = defence.createSafeMatrixCallback(context); fakeRuntime.walkTo(creep, target, { range: 3, costCallback: safeMatrixCallback }, context); const targetInRange = _.first(_.filter(repairRamparts, r => utils.dist(creep, r) <= 3)); if (targetInRange) { intents.set(creep._id, 'repair', { id: targetInRange._id, x: targetInRange.x, y: targetInRange.y }); } } }; const bodies = { fortifier: makeBody([{ part: C.WORK, count: 15, boost: 'XLH2O' }, { part: C.CARRY, count: 15 }, { part: C.MOVE, count: 15 }]), weakDefender: makeBody([{ part: C.ATTACK, count: 15 }, { part: C.MOVE, count: 15 }]), fullDefender: makeBody([{ part: C.ATTACK, count: 25 }, { part: C.MOVE, count: 25 }]), boostedDefender: makeBody([{ part: C.ATTACK, count: 25, boost: 'UH2O' }, { part: C.MOVE, count: 25 }]), boostedRanger: makeBody([{ part: C.RANGED_ATTACK, count: 25, boost: 'KHO2' }, { part: C.MOVE, count: 25 }]), fullBoostedMelee: makeBody([{ part: C.ATTACK, count: 44, boost: 'XUH2O' }, { part: C.MOVE, count: 6, boost: 'XZHO2' }]), fullBoostedRanger: makeBody([{ part: C.RANGED_ATTACK, count: 44, boost: 'XKHO2' }, { part: C.MOVE, count: 6, boost: 'XZHO2' }]) }; module.exports = { bodies, behaviors }; //# sourceMappingURL=../../../../sourcemaps/processor/intents/invader-core/stronghold/creeps.js.map