From 7130997df960baf1a209b52b6a57056a08aff31e Mon Sep 17 00:00:00 2001 From: mimo Date: Tue, 11 Nov 2014 22:08:28 +0000 Subject: [PATCH] still more fixes on ai serialization + some cleanings This was SVN commit r15954. --- .../public/simulation/ai/petra/_petrabot.js | 2 + .../simulation/ai/petra/headquarters.js | 111 +++++++++--------- .../simulation/ai/petra/queueplan-building.js | 8 +- 3 files changed, 64 insertions(+), 57 deletions(-) diff --git a/binaries/data/mods/public/simulation/ai/petra/_petrabot.js b/binaries/data/mods/public/simulation/ai/petra/_petrabot.js index 795394bb1e..566100a646 100644 --- a/binaries/data/mods/public/simulation/ai/petra/_petrabot.js +++ b/binaries/data/mods/public/simulation/ai/petra/_petrabot.js @@ -89,6 +89,8 @@ m.PetraBot.prototype.CustomInit = function(gameState, sharedScript) this.myIndex = this.accessibility.getAccessValue(myKeyEntities.toEntityArray()[0].position()); this.HQ.init(gameState, this.queues); + + this.HQ.start(gameState); } }; diff --git a/binaries/data/mods/public/simulation/ai/petra/headquarters.js b/binaries/data/mods/public/simulation/ai/petra/headquarters.js index 5bf598789d..c285f5d6ac 100644 --- a/binaries/data/mods/public/simulation/ai/petra/headquarters.js +++ b/binaries/data/mods/public/simulation/ai/petra/headquarters.js @@ -50,7 +50,7 @@ m.HQ = function(Config) }; // More initialisation for stuff that needs the gameState -m.HQ.prototype.init = function(gameState, queues, deserialization) +m.HQ.prototype.init = function(gameState, queues, deserializing) { this.territoryMap = m.createTerritoryMap(gameState); // initialize base map. Each pixel is a base ID, or 0 if not or not accessible @@ -104,7 +104,7 @@ m.HQ.prototype.init = function(gameState, queues, deserialization) else if (this.Config.difficulty == 1) this.targetNumWorkers = Math.max(1, Math.min(60, Math.floor(gameState.getPopulationMax()/2))); else - this.targetNumWorkers = Math.max(1, Math.min(120,Math.floor(gameState.getPopulationMax()/3))); + this.targetNumWorkers = Math.max(1, Math.min(120, Math.floor(gameState.getPopulationMax()/3))); this.treasures = gameState.getEntities().filter(function (ent) { var type = ent.resourceSupplyType(); @@ -125,7 +125,7 @@ m.HQ.prototype.init = function(gameState, queues, deserialization) } this.updateTerritories(gameState); - if (this.baseManagers[b0] && !deserialization) // Affects entities in the different bases + if (this.baseManagers[b0] && !deserializing) // Assign entities in the different bases { var self = this; var width = gameState.getMap().width; @@ -285,10 +285,16 @@ m.HQ.prototype.init = function(gameState, queues, deserialization) this.tradeManager.init(gameState); }; -m.HQ.prototype.start = function(gameState, deserialization) +m.HQ.prototype.start = function(gameState, deserializing) { - if (deserialization) + if (deserializing) { + // Rebuild the base maps from the territory indices of each base + this.basesMap = new API3.Map(gameState.sharedScript); + for each (let base in this.baseManagers) + for (let j of base.territoryIndices) + this.basesMap.map[j] = base.ID; + var self = this; gameState.getOwnEntities().forEach( function (ent) { if (!ent.resourceDropsiteTypes() || ent.hasClass("Elephant")) @@ -296,57 +302,56 @@ m.HQ.prototype.start = function(gameState, deserialization) let base = self.baseManagers[ent.getMetadata(PlayerID, "base")]; base.assignResourceToDropsite(gameState, ent); }); + return; } - else - { - // adapt our starting strategy to the available resources - // - if on a small island, favor fishing and require less fields to save room for buildings - var startingSize = 0; - for (var region in this.allowedRegions) - { - for each (var base in this.baseManagers) - { - if (!base.anchor || base.accessIndex != +region) - continue; - startingSize += gameState.ai.accessibility.regionSize[region]; - break; - } - } - if (this.Config.debug > 1) - API3.warn("starting size " + startingSize + "(cut at 1500 for fish pushing)"); - if (startingSize < 1500) - { - this.Config.Economy.popForDock = Math.min(this.Config.Economy.popForDock, 16); - this.Config.Economy.initialFields = Math.min(this.Config.Economy.initialFields, 3); - this.Config.Economy.targetNumFishers = Math.max(this.Config.Economy.targetNumFishers, 2); - } - // - count the available wood resource, and allow rushes only if enough (we should otherwise favor expansion) - var startingWood = gameState.getResources()["wood"]; - var check = {}; - for (var proxim of ["nearby", "medium", "faraway"]) - { - for each (var base in this.baseManagers) - { - for each (var supply in base.dropsiteSupplies["wood"][proxim]) - { - if (check[supply.id]) // avoid double counting as same resource can appear several time - continue; - check[supply.id] = true; - startingWood += supply.ent.resourceSupplyAmount(); - } - } - } - if (this.Config.debug > 1) - API3.warn("startingWood: " + startingWood + "(cut at 8500 for no rush and 6000 for saveResources)"); - if (startingWood < 6000) - { - this.saveResources = true; - this.Config.Economy.initialFields = Math.min(this.Config.Economy.initialFields, 2); - } - if (startingWood > 8500 && this.canBuildUnits) - this.attackManager.setRushes(); + // adapt our starting strategy to the available resources + // - if on a small island, favor fishing and require less fields to save room for buildings + var startingSize = 0; + for (var region in this.allowedRegions) + { + for each (var base in this.baseManagers) + { + if (!base.anchor || base.accessIndex != +region) + continue; + startingSize += gameState.ai.accessibility.regionSize[region]; + break; + } } + if (this.Config.debug > 1) + API3.warn("starting size " + startingSize + "(cut at 1500 for fish pushing)"); + if (startingSize < 1500) + { + this.Config.Economy.popForDock = Math.min(this.Config.Economy.popForDock, 16); + this.Config.Economy.initialFields = Math.min(this.Config.Economy.initialFields, 3); + this.Config.Economy.targetNumFishers = Math.max(this.Config.Economy.targetNumFishers, 2); + } + // - count the available wood resource, and allow rushes only if enough (we should otherwise favor expansion) + var startingWood = gameState.getResources()["wood"]; + var check = {}; + for (var proxim of ["nearby", "medium", "faraway"]) + { + for each (var base in this.baseManagers) + { + for each (var supply in base.dropsiteSupplies["wood"][proxim]) + { + if (check[supply.id]) // avoid double counting as same resource can appear several time + continue; + check[supply.id] = true; + startingWood += supply.ent.resourceSupplyAmount(); + } + } + } + if (this.Config.debug > 1) + API3.warn("startingWood: " + startingWood + "(cut at 8500 for no rush and 6000 for saveResources)"); + if (startingWood < 6000) + { + this.saveResources = true; + this.Config.Economy.initialFields = Math.min(this.Config.Economy.initialFields, 2); + } + + if (startingWood > 8500 && this.canBuildUnits) + this.attackManager.setRushes(); }; // returns the sea index linking regions 1 and region 2 (supposed to be different land region) diff --git a/binaries/data/mods/public/simulation/ai/petra/queueplan-building.js b/binaries/data/mods/public/simulation/ai/petra/queueplan-building.js index 1a86591820..eab691d03f 100644 --- a/binaries/data/mods/public/simulation/ai/petra/queueplan-building.js +++ b/binaries/data/mods/public/simulation/ai/petra/queueplan-building.js @@ -165,13 +165,13 @@ m.ConstructionPlan.prototype.findGoodPosition = function(gameState) { var base = this.metadata.base; for (var j = 0; j < friendlyTiles.map.length; ++j) - if (gameState.ai.HQ.basesMap.map[j] === base) + if (gameState.ai.HQ.basesMap.map[j] == base) friendlyTiles.map[j] = 45; } else { for (var j = 0; j < friendlyTiles.map.length; ++j) - if (gameState.ai.HQ.basesMap.map[j] !== 0) + if (gameState.ai.HQ.basesMap.map[j] != 0) friendlyTiles.map[j] = 45; } @@ -231,7 +231,7 @@ m.ConstructionPlan.prototype.findGoodPosition = function(gameState) var base = this.metadata.base; for (var j = 0; j < friendlyTiles.map.length; ++j) { - if (gameState.ai.HQ.basesMap.map[j] !== base) + if (gameState.ai.HQ.basesMap.map[j] != base) friendlyTiles.map[j] = 0; else if (favorBorder && gameState.ai.HQ.borderMap.map[j] > 0) friendlyTiles.map[j] += 50; @@ -258,7 +258,7 @@ m.ConstructionPlan.prototype.findGoodPosition = function(gameState) else if (disfavorBorder && gameState.ai.HQ.borderMap.map[j] == 0 && friendlyTiles.map[j] > 0) friendlyTiles.map[j] += 10; - if (preferredBase && gameState.ai.HQ.basesMap.map[j] === this.metadata.preferredBase) + if (preferredBase && gameState.ai.HQ.basesMap.map[j] == this.metadata.preferredBase) friendlyTiles.map[j] += 200; if (friendlyTiles.map[j] > 0)