From 686e8a7c95157ca11f284d17090615989bb3baea Mon Sep 17 00:00:00 2001 From: Sergey Date: Sat, 10 Nov 2018 01:09:25 +0200 Subject: [PATCH 1/3] Implement cache for active structures in rooms --- src/game/game.js | 5 +- src/game/structures.js | 25 ++++----- src/processor.js | 24 ++++----- src/processor/intents/_calc_spawns.js | 41 --------------- src/processor/intents/creeps/harvest.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 +- .../intents/power-spawns/process-power.js | 2 +- src/processor/intents/spawns/create-creep.js | 2 +- src/utils.js | 51 ------------------- 11 files changed, 33 insertions(+), 125 deletions(-) delete mode 100644 src/processor/intents/_calc_spawns.js diff --git a/src/game/game.js b/src/game/game.js index fc954ef9..d9754dd9 100644 --- a/src/game/game.js +++ b/src/game/game.js @@ -218,7 +218,6 @@ }; var c = {}; - for(var i in runtimeData.roomObjects) { var object = runtimeData.roomObjects[i]; @@ -270,7 +269,7 @@ addObjectToFindCache(register, C.FIND_MY_SPAWNS, register.spawns[i], object); addObjectToFindCache(register, C.FIND_HOSTILE_SPAWNS, register.spawns[i], object); } - + } if (!object.off && (object.type == 'extension' || object.type == 'spawn') && (object.user == runtimeData.user._id)) { register.rooms[object.room].energyAvailable += object.energy; @@ -329,7 +328,7 @@ } } - + runtimeData.flags.forEach(flagRoomData => { var data = flagRoomData.data.split("|"); diff --git a/src/game/structures.js b/src/game/structures.js index 95a568a5..fb092513 100644 --- a/src/game/structures.js +++ b/src/game/structures.js @@ -194,7 +194,8 @@ exports.make = function(_runtimeData, _intents, _register, _globals) { if(!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}); @@ -434,7 +435,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] || @@ -469,7 +470,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) { @@ -504,7 +505,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) { @@ -568,7 +569,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; } } @@ -628,7 +629,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; } @@ -689,7 +690,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(!this.power || this.energy < C.POWER_SPAWN_ENERGY_RATIO) { @@ -789,7 +790,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)) { @@ -853,7 +854,7 @@ exports.make = function(_runtimeData, _intents, _register, _globals) { if(data(this.id).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; } @@ -872,7 +873,7 @@ exports.make = function(_runtimeData, _intents, _register, _globals) { if(data(this.id).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; } @@ -892,7 +893,7 @@ exports.make = function(_runtimeData, _intents, _register, _globals) { if(data(this.id).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; } @@ -1461,7 +1462,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); diff --git a/src/processor.js b/src/processor.js index 1b797e29..c28c5870 100644 --- a/src/processor.js +++ b/src/processor.js @@ -20,7 +20,7 @@ function processRoom(roomId, {intents, roomObjects, users, roomTerrain, gameTime hasNewbieWalls = false, stats = driver.getRoomStatsUpdater(roomId), objectsToHistory = {}, - roomSpawns = [], roomExtensions = [], roomNukes = [], + roomNukes = [], oldRoomInfo = _.clone(roomInfo); roomInfo.active = false; @@ -107,13 +107,6 @@ function processRoom(roomId, {intents, roomObjects, users, roomTerrain, gameTime hasNewbieWalls = true; } - if(object.type == 'extension') { - roomExtensions.push(object); - } - if(object.type == 'spawn') { - roomSpawns.push(object); - } - driver.config.emit('processObject',object, roomObjects, roomTerrain, gameTime, roomInfo, bulk, bulkUsers); }); @@ -122,10 +115,6 @@ function processRoom(roomId, {intents, roomObjects, users, roomTerrain, gameTime require('./processor/intents/nukes/pretick')(nuke, intents, scope); } - if(roomSpawns.length || roomExtensions.length) { - require('./processor/intents/_calc_spawns')(roomSpawns, roomExtensions, scope); - } - movement.init(roomObjects, roomTerrain); if (intents) { @@ -235,6 +224,8 @@ function processRoom(roomId, {intents, roomObjects, users, roomTerrain, gameTime var resultPromises = []; var userVisibility = {}; + let ownedTypes = ['extension','spawn','link','storage','tower','observer','powerSpawn','extractor','terminal','lab','nuker'] + let ownedObjects = {} _.forEach(roomObjects, (object) => { if(!object || object._skip) { @@ -321,6 +312,10 @@ function processRoom(roomId, {intents, roomObjects, users, roomTerrain, gameTime } } + if(ownedTypes.includes(object.type)) { + (ownedObjects[object.type] = ownedObjects[object.type] || []).push(object) + } + if (object.user) { //userVisibility[object.user] = true; @@ -359,6 +354,11 @@ function processRoom(roomId, {intents, roomObjects, users, roomTerrain, gameTime } }); + + 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/creeps/harvest.js b/src/processor/intents/creeps/harvest.js index b8b5ddaa..b46d7074 100644 --- a/src/processor/intents/creeps/harvest.js +++ b/src/processor/intents/creeps/harvest.js @@ -77,7 +77,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/labs/unboost-creep.js b/src/processor/intents/labs/unboost-creep.js index 412f59c3..0390ba96 100644 --- a/src/processor/intents/labs/unboost-creep.js +++ b/src/processor/intents/labs/unboost-creep.js @@ -12,7 +12,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 8cf6d65f..4799fd88 100644 --- a/src/processor/intents/links/transfer.js +++ b/src/processor/intents/links/transfer.js @@ -32,7 +32,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.energy; diff --git a/src/processor/intents/nukers/launch-nuke.js b/src/processor/intents/nukers/launch-nuke.js index 1c1b21a1..4c87dddc 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.G < object.GCapacity || object.energy < object.energyCapacity) { diff --git a/src/processor/intents/power-spawns/process-power.js b/src/processor/intents/power-spawns/process-power.js index f17f8651..0dc2b4dc 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') 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 3902745a..0875ea7a 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 f6f39f7d..4180ea22 100644 --- a/src/utils.js +++ b/src/utils.js @@ -888,58 +888,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) { var propertiesInfo = {}; From 7c3e3c4df7b6dbda572398f3513d0b0a4198d913 Mon Sep 17 00:00:00 2001 From: Sergey Date: Mon, 18 Mar 2019 00:01:46 +0200 Subject: [PATCH 2/3] Add missed file --- .../intents/_check_active_structures.js | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/processor/intents/_check_active_structures.js diff --git a/src/processor/intents/_check_active_structures.js b/src/processor/intents/_check_active_structures.js new file mode 100644 index 00000000..90615b61 --- /dev/null +++ b/src/processor/intents/_check_active_structures.js @@ -0,0 +1,28 @@ +'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 }); + } + }); + } +}; +//# sourceMappingURL=../../sourcemaps/processor/intents/_check_active_structures.js.map From 963b7112678e86983e28ec805dfcb768c81f8668 Mon Sep 17 00:00:00 2001 From: Sergey Date: Mon, 18 Mar 2019 00:06:25 +0200 Subject: [PATCH 3/3] Update _check_active_structures.js --- src/processor/intents/_check_active_structures.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/processor/intents/_check_active_structures.js b/src/processor/intents/_check_active_structures.js index 90615b61..d7300c93 100644 --- a/src/processor/intents/_check_active_structures.js +++ b/src/processor/intents/_check_active_structures.js @@ -10,7 +10,7 @@ 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]) { + 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));