@screeps/engine
Version:
This is a module for Screeps standalone server. See [main repository](https://github.com/screeps/screeps) for more info.
99 lines (84 loc) • 3.7 kB
JavaScript
'use strict';
var _ = require('lodash'),
utils = require('../../utils'),
driver = utils.getDriver(),
C = driver.constants;
module.exports = function (object, target, damage, attackType, scope) {
const roomObjects = scope.roomObjects,
bulk = scope.bulk,
roomController = scope.roomController,
gameTime = scope.gameTime,
roomInfo = scope.roomInfo,
eventLog = scope.eventLog;
if (!target._id || !target.hits) {
return;
}
var attackBackPower = 0;
if (target.type == 'creep') {
if (attackType == C.EVENT_ATTACK_TYPE_MELEE && !_.any(roomObjects, { type: 'rampart', x: object.x, y: object.y })) {
attackBackPower = utils.calcBodyEffectiveness(target.body, C.ATTACK, 'attack', C.ATTACK_POWER);
}
target._damageToApply = (target._damageToApply || 0) + damage;
} else if (target.type == 'powerCreep') {
target._damageToApply = (target._damageToApply || 0) + damage;
} else {
if (attackType != C.EVENT_ATTACK_TYPE_NUKE && (target.type == 'constructedWall' || target.type == 'rampart')) {
const effect = _.find(target.effects, e => (e.power == C.PWR_FORTIFY || e.effect == C.EFFECT_INVULNERABILITY) && e.endTime > gameTime);
if (effect) {
return;
}
}
target.hits -= damage;
}
if (target.type == 'powerBank') {
attackBackPower = damage * C.POWER_BANK_HIT_BACK;
}
if (roomController && roomController.user == object.user && roomController.safeMode > gameTime) {
attackBackPower = 0;
}
if (target.type == 'constructedWall' && target.decayTime) {
require('./creeps/_clear-newbie-walls')(scope);
} else if (target.hits <= 0) {
if (target.type != 'creep' && target.type != 'powerCreep') {
require('./structures/_destroy')(target, scope, attackType);
eventLog.push({ event: C.EVENT_OBJECT_DESTROYED, objectId: target._id, data: { type: target.type } });
}
} else {
if (target.type != 'creep' && target.type != 'powerCreep') {
bulk.update(target, { hits: target.hits });
}
}
if (object.actionLog && object.type == 'creep') {
if (attackType == C.EVENT_ATTACK_TYPE_MELEE || attackType == C.EVENT_ATTACK_TYPE_DISMANTLE) {
object.actionLog.attack = {
x: target.x,
y: target.y
};
}
if (attackType == C.EVENT_ATTACK_TYPE_RANGED) {
object.actionLog.rangedAttack = {
x: target.x,
y: target.y
};
}
}
if (target.actionLog) {
target.actionLog.attacked = { x: object.x, y: object.y };
}
if (object.user != '2' && object.user != '3') {
if (target.notifyWhenAttacked) {
utils.sendAttackingNotification(target, roomController);
}
if (roomInfo && object.user && target.user && object.user != target.user && target.user != '2' && target.user != '3') {
roomInfo.lastPvpTime = gameTime;
}
}
if (attackBackPower) {
object._damageToApply = (object._damageToApply || 0) + attackBackPower;
object.actionLog.attacked = { x: target.x, y: target.y };
eventLog.push({ event: C.EVENT_ATTACK, objectId: target._id, data: { targetId: object._id,
damage: attackBackPower, attackType: C.EVENT_ATTACK_TYPE_HIT_BACK } });
}
eventLog.push({ event: C.EVENT_ATTACK, objectId: object._id, data: { targetId: target._id, damage, attackType } });
};
//# sourceMappingURL=../../sourcemaps/processor/intents/_damage.js.map