diff --git a/src/game/game.js b/src/game/game.js index de8ebbd5..09547a98 100644 --- a/src/game/game.js +++ b/src/game/game.js @@ -304,7 +304,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; @@ -363,7 +363,7 @@ } } - + runtimeData.flags.forEach(flagRoomData => { var data = flagRoomData.data.split("|"); diff --git a/src/game/structures.js b/src/game/structures.js index 34c2736d..b65521bd 100644 --- a/src/game/structures.js +++ b/src/game/structures.js @@ -195,7 +195,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}); @@ -436,7 +437,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] || @@ -476,7 +477,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) { @@ -511,7 +512,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) { @@ -575,7 +576,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; } } @@ -635,7 +636,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; } @@ -698,7 +699,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; @@ -803,7 +804,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)) { @@ -867,7 +868,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; } @@ -887,7 +888,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; } @@ -907,7 +908,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; } @@ -1476,7 +1477,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 0ba5e2a9..46a0912e 100644 --- a/src/processor.js +++ b/src/processor.js @@ -290,6 +290,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) { @@ -384,6 +386,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; @@ -422,6 +428,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/_check_active_structures.js b/src/processor/intents/_check_active_structures.js new file mode 100644 index 00000000..d7300c93 --- /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 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 3372c016..73d18b52 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 a07e03c4..91a47304 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 56ee03a8..322dbc45 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 547d9d1a..d97460d2 100644 --- a/src/utils.js +++ b/src/utils.js @@ -960,58 +960,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 = {};