From cec9b9dfbf1afa5dc3ca7adb5a1d79f4c33070d7 Mon Sep 17 00:00:00 2001 From: Sergey Date: Sat, 10 Nov 2018 01:09:25 +0200 Subject: [PATCH] Implement cache for active structures in rooms --- src/game/power-creeps.js | 4 +- src/game/structures.js | 28 +++++----- src/processor.js | 14 +++-- src/processor/intents/_calc_spawns.js | 41 --------------- .../intents/_check_active_structures.js | 27 ++++++++++ src/processor/intents/creeps/harvest.js | 2 +- src/processor/intents/factories/produce.js | 2 +- src/processor/intents/labs/unboost-creep.js | 2 +- src/processor/intents/links/transfer.js | 2 +- src/processor/intents/nukers/launch-nuke.js | 2 +- src/processor/intents/power-creeps/renew.js | 2 +- .../intents/power-spawns/process-power.js | 2 +- src/processor/intents/spawns/create-creep.js | 2 +- src/utils.js | 51 ------------------- 14 files changed, 61 insertions(+), 120 deletions(-) delete mode 100644 src/processor/intents/_calc_spawns.js create mode 100644 src/processor/intents/_check_active_structures.js diff --git a/src/game/power-creeps.js b/src/game/power-creeps.js index dcabece5..314ca9cd 100644 --- a/src/game/power-creeps.js +++ b/src/game/power-creeps.js @@ -169,7 +169,7 @@ exports.make = function(_runtimeData, _intents, _register, _globals) { if(!this.my || !powerSpawn.my) { return C.ERR_NOT_OWNER; } - if(!utils.checkStructureAgainstController(data(powerSpawn.id), register.objectsByRoom[data(powerSpawn.id).room], data(powerSpawn.room.controller.id))) { + if(data(powerSpawn.id).off) { return C.ERR_RCL_NOT_ENOUGH; } @@ -329,7 +329,7 @@ exports.make = function(_runtimeData, _intents, _register, _globals) { register.assertTargetObject(target); return C.ERR_INVALID_TARGET; } - if((target instanceof globals.StructurePowerSpawn) && !utils.checkStructureAgainstController(data(target.id), register.objectsByRoom[data(target.id).room], data(target.room.controller.id))) { + if((target instanceof globals.StructurePowerSpawn) && data(target.id).off) { return C.ERR_RCL_NOT_ENOUGH; } if(!target.pos.isNearTo(this.pos)) { diff --git a/src/game/structures.js b/src/game/structures.js index 3432c42c..6b11a9d2 100644 --- a/src/game/structures.js +++ b/src/game/structures.js @@ -115,7 +115,7 @@ exports.make = function(_runtimeData, _intents, _register, _globals) { if(!this.room || !this.room.controller) { return false; } - return utils.checkStructureAgainstController(data(this.id), register.objectsByRoom[data(this.id).room], data(this.room.controller.id)); + return !data(this.id).off }); Object.defineProperty(globals, 'Structure', {enumerable: true, value: Structure}); @@ -321,7 +321,7 @@ exports.make = function(_runtimeData, _intents, _register, _globals) { if(this.cooldown > 0) { return C.ERR_TIRED; } - if(!utils.checkStructureAgainstController(data(this.id), register.objectsByRoom[data(this.id).room], data(this.room.controller.id))) { + if(data(this.id).off) { return C.ERR_RCL_NOT_ENOUGH; } if(!lab1 || !lab1.id || !register.structures[lab1.id] || @@ -364,7 +364,7 @@ exports.make = function(_runtimeData, _intents, _register, _globals) { if(this.cooldown > 0) { return C.ERR_TIRED; } - if(!utils.checkStructureAgainstController(data(this.id), register.objectsByRoom[data(this.id).room], data(this.room.controller.id))) { + if(data(this.id).off) { return C.ERR_RCL_NOT_ENOUGH; } if(!lab1 || !lab1.id || !register.structures[lab1.id] || @@ -413,7 +413,7 @@ exports.make = function(_runtimeData, _intents, _register, _globals) { if(!this.my) { return C.ERR_NOT_OWNER; } - if(!utils.checkStructureAgainstController(data(this.id), register.objectsByRoom[data(this.id).room], data(this.room.controller.id))) { + if(data(this.id).off) { return C.ERR_RCL_NOT_ENOUGH; } if(!target || !target.id || !register.creeps[target.id] || !(target instanceof globals.Creep) || target.spawning) { @@ -448,7 +448,7 @@ exports.make = function(_runtimeData, _intents, _register, _globals) { if(!this.my || !target.my) { return C.ERR_NOT_OWNER; } - if(!utils.checkStructureAgainstController(data(this.id), register.objectsByRoom[data(this.id).room], data(this.room.controller.id))) { + if(data(this.id).off) { return C.ERR_RCL_NOT_ENOUGH; } if(this.cooldown > 0) { @@ -507,7 +507,7 @@ exports.make = function(_runtimeData, _intents, _register, _globals) { if(!this.room.controller) { return C.ERR_RCL_NOT_ENOUGH; } - if(!utils.checkStructureAgainstController(data(this.id), register.objectsByRoom[data(this.id).room], data(this.room.controller.id))) { + if(data(this.id).off) { return C.ERR_RCL_NOT_ENOUGH; } @@ -552,7 +552,7 @@ exports.make = function(_runtimeData, _intents, _register, _globals) { if(!_.isString(roomName) || !/^(W|E)\d+(S|N)\d+$/.test(roomName)) { return C.ERR_INVALID_ARGS; } - if(!utils.checkStructureAgainstController(data(this.id), register.objectsByRoom[data(this.id).room], data(this.room.controller.id))) { + if(data(this.id).off) { return C.ERR_RCL_NOT_ENOUGH; } @@ -614,7 +614,7 @@ exports.make = function(_runtimeData, _intents, _register, _globals) { if(!this.my) { return C.ERR_NOT_OWNER; } - if(!utils.checkStructureAgainstController(data(this.id), register.objectsByRoom[data(this.id).room], data(this.room.controller.id))) { + if(data(this.id).off) { return C.ERR_RCL_NOT_ENOUGH; } var amount = 1; @@ -715,7 +715,7 @@ exports.make = function(_runtimeData, _intents, _register, _globals) { if(!this.my) { return C.ERR_NOT_OWNER; } - if(!utils.checkStructureAgainstController(data(this.id), register.objectsByRoom[data(this.id).room], data(this.room.controller.id))) { + if(data(this.id).off) { return C.ERR_RCL_NOT_ENOUGH; } if(!/^(W|E)\d+(N|S)\d+$/.test(targetRoomName)) { @@ -775,7 +775,7 @@ exports.make = function(_runtimeData, _intents, _register, _globals) { if(!data(this.id).store || (data(this.id).store.energy < C.TOWER_ENERGY_COST)) { return C.ERR_NOT_ENOUGH_ENERGY; } - if(!utils.checkStructureAgainstController(data(this.id), register.objectsByRoom[data(this.id).room], data(this.room.controller.id))) { + if(data(this.id).off) { return C.ERR_RCL_NOT_ENOUGH; } @@ -795,7 +795,7 @@ exports.make = function(_runtimeData, _intents, _register, _globals) { if(!data(this.id).store || (data(this.id).store.energy < C.TOWER_ENERGY_COST)) { return C.ERR_NOT_ENOUGH_ENERGY; } - if(!utils.checkStructureAgainstController(data(this.id), register.objectsByRoom[data(this.id).room], data(this.room.controller.id))) { + if(data(this.id).off) { return C.ERR_RCL_NOT_ENOUGH; } @@ -815,7 +815,7 @@ exports.make = function(_runtimeData, _intents, _register, _globals) { if(!data(this.id).store || (data(this.id).store.energy < C.TOWER_ENERGY_COST)) { return C.ERR_NOT_ENOUGH_ENERGY; } - if(!utils.checkStructureAgainstController(data(this.id), register.objectsByRoom[data(this.id).room], data(this.room.controller.id))) { + if(data(this.id).off) { return C.ERR_RCL_NOT_ENOUGH; } @@ -1370,7 +1370,7 @@ exports.make = function(_runtimeData, _intents, _register, _globals) { if(this.cooldown > 0) { return C.ERR_TIRED; } - if(!utils.checkStructureAgainstController(data(this.id), register.objectsByRoom[data(this.id).room], data(this.room.controller.id))) { + if(data(this.id).off) { return C.ERR_RCL_NOT_ENOUGH; } var [tx,ty] = utils.roomNameToXY(pos.roomName); @@ -1449,7 +1449,7 @@ exports.make = function(_runtimeData, _intents, _register, _globals) { return C.ERR_INVALID_TARGET; } - if(!utils.checkStructureAgainstController(rawFactory, register.objectsByRoom[rawFactory.room], data(this.room.controller.id))) { + if(rawFactory.off) { return C.ERR_RCL_NOT_ENOUGH; } diff --git a/src/processor.js b/src/processor.js index 7b7b39fa..9b27bc79 100644 --- a/src/processor.js +++ b/src/processor.js @@ -218,10 +218,6 @@ function processRoom(roomId, {intents, roomObjects, users, roomTerrain, gameTime }); } - if(roomSpawns.length || roomExtensions.length) { - require('./processor/intents/_calc_spawns')(roomSpawns, roomExtensions, scope); - } - movement.init(roomObjects, roomTerrain); if (intents) { @@ -339,6 +335,7 @@ function processRoom(roomId, {intents, roomObjects, users, roomTerrain, gameTime var resultPromises = []; var userVisibility = {}; + let ownedObjects = {}; _.forEach(roomObjects, (object) => { if(!object || object._skip) { @@ -439,6 +436,10 @@ function processRoom(roomId, {intents, roomObjects, users, roomTerrain, gameTime } } + if (object.type in C.CONTROLLER_STRUCTURES) { + (ownedObjects[object.type] = ownedObjects[object.type] || []).push(object) + } + if (object.user) { //userVisibility[object.user] = true; @@ -482,6 +483,11 @@ function processRoom(roomId, {intents, roomObjects, users, roomTerrain, gameTime driver.config.emit('postProcessObject', object, roomObjects, roomTerrain, gameTime, roomInfo, bulk, bulkUsers, eventLog, mapView); }); + + if(scope.roomController) { + require('./processor/intents/_check_active_structures')(ownedObjects, scope); + } + /*for(var user in userVisibility) { resultPromises.push(core.setUserRoomVisibility(user, roomId)); }*/ diff --git a/src/processor/intents/_calc_spawns.js b/src/processor/intents/_calc_spawns.js deleted file mode 100644 index ff96b55e..00000000 --- a/src/processor/intents/_calc_spawns.js +++ /dev/null @@ -1,41 +0,0 @@ -var _ = require('lodash'), - utils = require('../../utils'), - driver = utils.getDriver(), - C = driver.constants; - -module.exports = function(roomSpawns, roomExtensions, {roomController, bulk}) { - var spawns = roomSpawns; - - if(spawns.length > C.CONTROLLER_STRUCTURES.spawn[roomController.level|0]) { - spawns.sort(utils.comparatorDistance(roomController)); - spawns = _.take(spawns, C.CONTROLLER_STRUCTURES.spawn[roomController.level|0]); - roomSpawns.forEach(i => i._off = !_.contains(spawns, i)); - } - else { - roomSpawns.forEach(i => i._off = false); - } - - roomSpawns.forEach(i => { - if(i._off !== i.off) { - bulk.update(i._id, {off: i._off}); - } - }); - - - var extensions = roomExtensions; - - if(extensions.length > C.CONTROLLER_STRUCTURES.extension[roomController.level|0]) { - extensions.sort(utils.comparatorDistance(roomController)); - extensions = _.take(extensions, C.CONTROLLER_STRUCTURES.extension[roomController.level|0]); - roomExtensions.forEach(i => i._off = !_.contains(extensions, i)); - } - else { - roomExtensions.forEach(i => i._off = false); - } - - roomExtensions.forEach(i => { - if(i._off !== i.off) { - bulk.update(i._id, {off: i._off}); - } - }); -}; \ No newline at end of file diff --git a/src/processor/intents/_check_active_structures.js b/src/processor/intents/_check_active_structures.js new file mode 100644 index 00000000..2b956968 --- /dev/null +++ b/src/processor/intents/_check_active_structures.js @@ -0,0 +1,27 @@ +'use strict'; + +var _ = require('lodash'), + utils = require('../../utils'), + driver = utils.getDriver(), + C = driver.constants; + +module.exports = function (ownedObjects, { roomController, bulk }) { + + for (let type in ownedObjects) { + var objects = ownedObjects[type]; + + if (objects.length > C.CONTROLLER_STRUCTURES[type][roomController.level || 0]) { + objects.sort(utils.comparatorDistance(roomController)); + objects = _.take(objects, C.CONTROLLER_STRUCTURES[type][roomController.level | 0]); + ownedObjects[type].forEach(i => i._off = i.user != roomController.user || !_.contains(objects, i)); + } else { + ownedObjects[type].forEach(i => i._off = false); + } + + ownedObjects[type].forEach(i => { + if (i._off !== i.off) { + bulk.update(i._id, { off: i._off }); + } + }); + } +}; diff --git a/src/processor/intents/creeps/harvest.js b/src/processor/intents/creeps/harvest.js index e755df3c..6f48eca2 100644 --- a/src/processor/intents/creeps/harvest.js +++ b/src/processor/intents/creeps/harvest.js @@ -78,7 +78,7 @@ module.exports = function(object, intent, scope) { if(extractor.user && extractor.user != object.user) { return; } - if(!utils.checkStructureAgainstController(extractor, roomObjects, roomController)) { + if(extractor.off) { return; } if(extractor.cooldown) { diff --git a/src/processor/intents/factories/produce.js b/src/processor/intents/factories/produce.js index c7d5b961..ce771f75 100644 --- a/src/processor/intents/factories/produce.js +++ b/src/processor/intents/factories/produce.js @@ -14,7 +14,7 @@ module.exports = function(object, intent, scope) { return; } - if(!utils.checkStructureAgainstController(object, roomObjects, roomController)) { + if(object.off) { return; } diff --git a/src/processor/intents/labs/unboost-creep.js b/src/processor/intents/labs/unboost-creep.js index 19806fe5..7f4110db 100644 --- a/src/processor/intents/labs/unboost-creep.js +++ b/src/processor/intents/labs/unboost-creep.js @@ -14,7 +14,7 @@ module.exports = function(object, intent, scope) { if(!target || target.type != 'creep' || target.user != object.user) { return; } - if(!utils.checkStructureAgainstController(object, roomObjects, roomController)) { + if(object.off) { return; } if(Math.abs(target.x - object.x) > 1 || Math.abs(target.y - object.y) > 1) { diff --git a/src/processor/intents/links/transfer.js b/src/processor/intents/links/transfer.js index 2847b9f8..3a3d2c72 100644 --- a/src/processor/intents/links/transfer.js +++ b/src/processor/intents/links/transfer.js @@ -27,7 +27,7 @@ module.exports = function(object, intent, {roomObjects, bulk, roomController, ev if(object.cooldown > 0) { return; } - if(!utils.checkStructureAgainstController(object, roomObjects, roomController)) { + if(object.off) { return; } targetTotal = target.store.energy; diff --git a/src/processor/intents/nukers/launch-nuke.js b/src/processor/intents/nukers/launch-nuke.js index 5f6b9c76..04813694 100644 --- a/src/processor/intents/nukers/launch-nuke.js +++ b/src/processor/intents/nukers/launch-nuke.js @@ -7,7 +7,7 @@ var _ = require('lodash'), module.exports = function(object, intent, {roomObjects, bulk, roomController, gameTime, roomInfo}) { - if(!utils.checkStructureAgainstController(object, roomObjects, roomController)) { + if(object.off) { return; } if(object.store.G < object.storeCapacityResource.G || object.store.energy < object.storeCapacityResource.energy) { diff --git a/src/processor/intents/power-creeps/renew.js b/src/processor/intents/power-creeps/renew.js index 474331ca..2f1e6abd 100644 --- a/src/processor/intents/power-creeps/renew.js +++ b/src/processor/intents/power-creeps/renew.js @@ -13,7 +13,7 @@ module.exports = function(object, intent, {roomObjects, roomController, bulk, ga return; } - if(target.type == 'powerSpawn' && !utils.checkStructureAgainstController(target, roomObjects, roomController)) { + if(target.type == 'powerSpawn' && target.off) { return; } diff --git a/src/processor/intents/power-spawns/process-power.js b/src/processor/intents/power-spawns/process-power.js index 627c19b9..67fc672a 100644 --- a/src/processor/intents/power-spawns/process-power.js +++ b/src/processor/intents/power-spawns/process-power.js @@ -9,7 +9,7 @@ module.exports = function(object, intent, {roomObjects, bulk, bulkUsers, roomCon if(object.type != 'powerSpawn' || !object.store) return; - if(!utils.checkStructureAgainstController(object, roomObjects, roomController)) { + if(object.off) { return; } diff --git a/src/processor/intents/spawns/create-creep.js b/src/processor/intents/spawns/create-creep.js index 08ea6025..fe0e1ecf 100644 --- a/src/processor/intents/spawns/create-creep.js +++ b/src/processor/intents/spawns/create-creep.js @@ -14,7 +14,7 @@ module.exports = function(spawn, intent, scope) { if(spawn.type != 'spawn') return; - if(!utils.checkStructureAgainstController(spawn, roomObjects, roomController)) { + if(spawn.off) { return; } diff --git a/src/utils.js b/src/utils.js index 8740dca7..95718ae7 100644 --- a/src/utils.js +++ b/src/utils.js @@ -453,58 +453,7 @@ exports.sendAttackingNotification = function(target, roomController) { } }; -exports.checkStructureAgainstController = function(object, roomObjects, roomController) { - // owner-less objects are always active - if(!object.user) { - return true; - } - - // eliminate some other easy cases - if(!roomController || roomController.level < 1 || roomController.user !== object.user) { - return false; - } - - let allowedRemaining = C.CONTROLLER_STRUCTURES[object.type][roomController.level]; - - if(allowedRemaining === 0) { - return false; - } - - // if only one object ever allowed, this is it - if(C.CONTROLLER_STRUCTURES[object.type][8] === 1) { - return allowedRemaining !== 0; - } - // Scan through the room objects of the same type and count how many are closer. - let foundSelf = false; - let objectDist = Math.max(Math.abs(object.x - roomController.x), Math.abs(object.y - roomController.y)); - let objectIds = _.keys(roomObjects); - for (let i = 0; i < objectIds.length; i++) { - let compareObj = roomObjects[objectIds[i]]; - if(compareObj.type === object.type && compareObj.user === object.user) { - let compareDist = Math.max(Math.abs(compareObj.x - roomController.x), Math.abs(compareObj.y - roomController.y)); - - if(compareDist < objectDist) { - allowedRemaining--; - if (allowedRemaining === 0) { - return false; - } - } else if(!foundSelf && compareDist === objectDist) { - // Objects of equal distance that are discovered before we scan over the selected object are considered closer - if(object === compareObj) { - foundSelf = true; - } else { - allowedRemaining--; - if (allowedRemaining === 0) { - return false; - } - } - } - } - } - - return true; -}; exports.defineGameObjectProperties = function(obj, dataFn, properties, opts) { var propertiesInfo = {};