@screeps/engine
Version:
This is a module for Screeps standalone server. See [main repository](https://github.com/screeps/screeps) for more info.
81 lines (64 loc) • 2.65 kB
JavaScript
;
var _ = require('lodash'),
utils = require('../../../utils'),
driver = utils.getDriver(),
C = driver.constants;
function oldEnergyHandling(spawn, cost, { roomObjects, bulk }) {
var spawns = _.filter(roomObjects, i => i.type == 'spawn' && i.user == spawn.user && !i.off);
var extensions = _.filter(roomObjects, i => i.type == 'extension' && i.user == spawn.user && !i.off);
var availableEnergy = _.sum(extensions, 'store.energy') + _.sum(spawns, 'store.energy');
if (availableEnergy < cost) {
return false;
}
spawns.sort(utils.comparatorDistance(spawn));
spawns.forEach(i => {
var neededEnergy = Math.min(cost, i.store.energy);
i.store.energy -= neededEnergy;
cost -= neededEnergy;
bulk.update(i, { store: { energy: i.store.energy } });
});
if (cost <= 0) {
return true;
}
extensions.sort(utils.comparatorDistance(spawn));
extensions.forEach(extension => {
if (cost <= 0) {
return;
}
var neededEnergy = Math.min(cost, extension.store.energy);
extension.store.energy -= neededEnergy;
cost -= neededEnergy;
bulk.update(extension, { store: { energy: extension.store.energy } });
});
return true;
}
function newEnergyHandling(spawn, cost, energyStructures, { roomObjects, bulk }) {
energyStructures = _.filter(energyStructures, id => {
let energyStructure = roomObjects[id];
return energyStructure && !energyStructure.off && energyStructure.user === spawn.user && (energyStructure.type === 'spawn' || energyStructure.type === 'extension');
});
energyStructures = _.uniq(energyStructures);
let availableEnergy = _.sum(energyStructures, id => roomObjects[id].store.energy);
if (availableEnergy < cost) {
return false;
}
_.forEach(energyStructures, id => {
let energyStructure = roomObjects[id];
let energyChange = Math.min(cost, energyStructure.store.energy);
energyStructure.store.energy -= energyChange;
bulk.update(energyStructure, { store: { energy: energyStructure.store.energy } });
cost -= energyChange;
if (cost <= 0) {
return false;
}
});
return true;
}
module.exports = function chargeEnergy(spawn, cost, energyStructures, scope) {
if (energyStructures === undefined) {
return oldEnergyHandling(spawn, cost, scope);
} else {
return newEnergyHandling(spawn, cost, energyStructures, scope);
}
};
//# sourceMappingURL=../../../sourcemaps/processor/intents/spawns/_charge-energy.js.map