diff --git a/binaries/data/mods/public/simulation/ai/petra/_petrabot.js b/binaries/data/mods/public/simulation/ai/petra/_petrabot.js index f4f167f91b..79ed5adfb2 100644 --- a/binaries/data/mods/public/simulation/ai/petra/_petrabot.js +++ b/binaries/data/mods/public/simulation/ai/petra/_petrabot.js @@ -1,7 +1,7 @@ import { BaseAI } from "simulation/ai/common-api/baseAI.js"; import { Entity } from "simulation/ai/common-api/entity.js"; import { Config } from "simulation/ai/petra/config.js"; -import { Headquather } from "simulation/ai/petra/headquarters.js"; +import { Headquarters } from "simulation/ai/petra/headquarters.js"; import { Queue } from "simulation/ai/petra/queue.js"; import { QueueManager } from "simulation/ai/petra/queueManager.js"; @@ -80,7 +80,7 @@ PetraBot.prototype.CustomInit = function(gameState) this.queueManager = new QueueManager(this.Config, this.queues); - this.HQ = new Headquather(this.Config); + this.HQ = new Headquarters(this.Config); this.HQ.init(gameState, this.queues); diff --git a/binaries/data/mods/public/simulation/ai/petra/headquarters.js b/binaries/data/mods/public/simulation/ai/petra/headquarters.js index c9e7c30f97..3b5ecf63cc 100644 --- a/binaries/data/mods/public/simulation/ai/petra/headquarters.js +++ b/binaries/data/mods/public/simulation/ai/petra/headquarters.js @@ -39,7 +39,7 @@ import { Worker } from "simulation/ai/petra/worker.js"; * -picking new CC locations. */ -export function Headquather(config) +export function Headquarters(config) { this.Config = config; this.phasing = 0; // existing values: 0 means no, i > 0 means phasing towards phase i @@ -79,7 +79,7 @@ export function Headquather(config) } /** More initialisation for stuff that needs the gameState */ -Headquather.prototype.init = function(gameState, queues) +Headquarters.prototype.init = function(gameState, queues) { this.territoryMap = createTerritoryMap(gameState); // create borderMap: flag cells on the border of the map @@ -101,7 +101,7 @@ Headquather.prototype.init = function(gameState, queues) /** * initialization needed after deserialization (only called when deserialization) */ -Headquather.prototype.postinit = function(gameState) +Headquarters.prototype.postinit = function(gameState) { this.basesManager.postinit(gameState); this.updateTerritories(gameState); @@ -112,7 +112,7 @@ Headquather.prototype.postinit = function(gameState) * otherwise return undefined * for the moment, only the case land-sea-land is supported */ -Headquather.prototype.getSeaBetweenIndices = function(gameState, index1, index2) +Headquarters.prototype.getSeaBetweenIndices = function(gameState, index1, index2) { const path = gameState.ai.accessibility.getTrajectToIndex(index1, index2); if (path && path.length == 3 && gameState.ai.accessibility.regionType[path[1]] == "water") @@ -127,7 +127,7 @@ Headquather.prototype.getSeaBetweenIndices = function(gameState, index1, index2) return undefined; }; -Headquather.prototype.checkEvents = function(gameState, events) +Headquarters.prototype.checkEvents = function(gameState, events) { this.buildManager.checkEvents(gameState, events); @@ -302,7 +302,7 @@ Headquather.prototype.checkEvents = function(gameState, events) } }; -Headquather.prototype.handleNewBase = function(gameState) +Headquarters.prototype.handleNewBase = function(gameState) { if (!this.firstBaseConfig) // This is our first base, let us configure our starting resources. @@ -317,7 +317,7 @@ Headquather.prototype.handleNewBase = function(gameState) }; /** Ensure that all requirements are met when phasing up*/ -Headquather.prototype.checkPhaseRequirements = function(gameState, queues) +Headquarters.prototype.checkPhaseRequirements = function(gameState, queues) { if (gameState.getNumberOfPhases() == this.currentPhase) return; @@ -392,12 +392,12 @@ Headquather.prototype.checkPhaseRequirements = function(gameState, queues) }; /** Called by any "phase" research plan once it's started */ -Headquather.prototype.OnPhaseUp = function(gameState, phase) +Headquarters.prototype.OnPhaseUp = function(gameState, phase) { }; /** This code trains citizen workers, trying to keep close to a ratio of worker/soldiers */ -Headquather.prototype.trainMoreWorkers = function(gameState, queues) +Headquarters.prototype.trainMoreWorkers = function(gameState, queues) { // default template const requirementsDef = [ ["costsResource", 1, "food"] ]; @@ -506,7 +506,7 @@ Headquather.prototype.trainMoreWorkers = function(gameState, queues) }; /** picks the best template based on parameters and classes */ -Headquather.prototype.findBestTrainableUnit = function(gameState, classes, requirements) +Headquarters.prototype.findBestTrainableUnit = function(gameState, classes, requirements) { let units; if (classes.indexOf("Hero") != -1) @@ -591,12 +591,12 @@ Headquather.prototype.findBestTrainableUnit = function(gameState, classes, requi * returns an entity collection of workers through BaseManager.pickBuilders * TODO: when same accessIndex, sort by distance */ -Headquather.prototype.bulkPickWorkers = function(gameState, baseRef, number) +Headquarters.prototype.bulkPickWorkers = function(gameState, baseRef, number) { return this.basesManager.bulkPickWorkers(gameState, baseRef, number); }; -Headquather.prototype.getTotalResourceLevel = function(gameState, resources, proximity) +Headquarters.prototype.getTotalResourceLevel = function(gameState, resources, proximity) { return this.basesManager.getTotalResourceLevel(gameState, resources, proximity); }; @@ -605,7 +605,7 @@ Headquather.prototype.getTotalResourceLevel = function(gameState, resources, pro * Returns the current gather rate * This is not per-se exact, it performs a few adjustments ad-hoc to account for travel distance, stuffs like that. */ -Headquather.prototype.GetCurrentGatherRates = function(gameState) +Headquarters.prototype.GetCurrentGatherRates = function(gameState) { return this.basesManager.GetCurrentGatherRates(gameState); }; @@ -613,7 +613,7 @@ Headquather.prototype.GetCurrentGatherRates = function(gameState) /** * Returns the wanted gather rate. */ -Headquather.prototype.GetWantedGatherRates = function(gameState) +Headquarters.prototype.GetWantedGatherRates = function(gameState) { if (!this.turnCache.wantedRates) this.turnCache.wantedRates = gameState.ai.queueManager.wantedGatherRates(gameState); @@ -629,7 +629,7 @@ Headquather.prototype.GetWantedGatherRates = function(gameState) * We compare; we pick the one where the discrepancy is highest. * Need to balance long-term needs and possible short-term needs. */ -Headquather.prototype.pickMostNeededResources = function(gameState, allowedResources = []) +Headquarters.prototype.pickMostNeededResources = function(gameState, allowedResources = []) { const wantedRates = this.GetWantedGatherRates(gameState); const currentRates = this.GetCurrentGatherRates(gameState); @@ -664,7 +664,7 @@ Headquather.prototype.pickMostNeededResources = function(gameState, allowedResou * Returns the best position to build a new Civil Center * Whose primary function would be to reach new resources of type "resource". */ -Headquather.prototype.findEconomicCCLocation = function(gameState, template, resource, proximity, fromStrategic) +Headquarters.prototype.findEconomicCCLocation = function(gameState, template, resource, proximity, fromStrategic) { // This builds a map. The procedure is fairly simple. It adds the resource maps // (which are dynamically updated and are made so that they will facilitate DP placement) @@ -865,7 +865,7 @@ Headquather.prototype.findEconomicCCLocation = function(gameState, template, res * Returns the best position to build a new Civil Center * Whose primary function would be to assure territorial continuity with our allies */ -Headquather.prototype.findStrategicCCLocation = function(gameState, template) +Headquarters.prototype.findStrategicCCLocation = function(gameState, template) { // This builds a map. The procedure is fairly simple. // We minimize the Sum((dist - 300)^2) where the sum is on the three nearest allied CC @@ -1011,7 +1011,7 @@ Headquather.prototype.findStrategicCCLocation = function(gameState, template) * To do so, we suppose that the gain/distance is an increasing function of distance and look for the max distance * for performance reasons. */ -Headquather.prototype.findMarketLocation = function(gameState, template) +Headquarters.prototype.findMarketLocation = function(gameState, template) { let markets = gameState.updatingCollection("diplo-ExclusiveAllyMarkets", filters.byClass("Trade"), gameState.getExclusiveAllyEntities()).toEntityArray(); @@ -1132,7 +1132,7 @@ Headquather.prototype.findMarketLocation = function(gameState, template) * Returns the best position to build defensive buildings (fortress and towers) * Whose primary function is to defend our borders */ -Headquather.prototype.findDefensiveLocation = function(gameState, template) +Headquarters.prototype.findDefensiveLocation = function(gameState, template) { // We take the point in our territory which is the nearest to any enemy cc // but requiring a minimal distance with our other defensive structures @@ -1270,7 +1270,7 @@ Headquather.prototype.findDefensiveLocation = function(gameState, template) return [x, z, this.baseAtIndex(bestJdx)]; }; -Headquather.prototype.buildTemple = function(gameState, queues) +Headquarters.prototype.buildTemple = function(gameState, queues) { // at least one market (which have the same queue) should be build before any temple if (queues.economicBuilding.hasQueuedUnits() || @@ -1289,7 +1289,7 @@ Headquather.prototype.buildTemple = function(gameState, queues) queues.economicBuilding.addPlan(new ConstructionPlan(gameState, templateName)); }; -Headquather.prototype.buildMarket = function(gameState, queues) +Headquarters.prototype.buildMarket = function(gameState, queues) { if (gameState.getOwnEntitiesByClass("Market", true).hasEntities() || !this.canBuild(gameState, "structures/{civ}/market")) @@ -1325,7 +1325,7 @@ Headquather.prototype.buildMarket = function(gameState, queues) }; /** Build a farmstead */ -Headquather.prototype.buildFarmstead = function(gameState, queues) +Headquarters.prototype.buildFarmstead = function(gameState, queues) { // Only build one farmstead for the time being ("DropsiteFood" does not refer to CCs) if (gameState.getOwnEntitiesByClass("Farmstead", true).hasEntities()) @@ -1347,7 +1347,7 @@ Headquather.prototype.buildFarmstead = function(gameState, queues) * Try to build a wonder when required * force = true when called from the victoryManager in case of Wonder victory condition. */ -Headquather.prototype.buildWonder = function(gameState, queues, force = false) +Headquarters.prototype.buildWonder = function(gameState, queues, force = false) { if (queues.wonder && queues.wonder.hasQueuedUnits() || gameState.getOwnEntitiesByClass("Wonder", true).hasEntities() || @@ -1377,7 +1377,7 @@ Headquather.prototype.buildWonder = function(gameState, queues, force = false) }; /** Build a corral, and train animals there */ -Headquather.prototype.manageCorral = function(gameState, queues) +Headquarters.prototype.manageCorral = function(gameState, queues) { if (queues.corral.hasQueuedUnits()) return; @@ -1424,7 +1424,7 @@ Headquather.prototype.manageCorral = function(gameState, queues) * build more houses if needed. * kinda ugly, lots of special cases to both build enough houses but not tooo many… */ -Headquather.prototype.buildMoreHouses = function(gameState, queues) +Headquarters.prototype.buildMoreHouses = function(gameState, queues) { let houseTemplateString = "structures/{civ}/apartment"; if (!gameState.isTemplateAvailable(gameState.applyCiv(houseTemplateString)) || @@ -1518,7 +1518,7 @@ Headquather.prototype.buildMoreHouses = function(gameState, queues) }; /** Checks the status of the territory expansion. If no new economic bases created, build some strategic ones. */ -Headquather.prototype.checkBaseExpansion = function(gameState, queues) +Headquarters.prototype.checkBaseExpansion = function(gameState, queues) { if (queues.civilCentre.hasQueuedUnits()) return; @@ -1554,7 +1554,7 @@ Headquather.prototype.checkBaseExpansion = function(gameState, queues) } }; -Headquather.prototype.buildNewBase = function(gameState, queues, resource) +Headquarters.prototype.buildNewBase = function(gameState, queues, resource) { if (this.hasPotentialBase() && this.currentPhase == 1 && !gameState.isResearching(gameState.getPhaseName(2))) return false; @@ -1588,7 +1588,7 @@ Headquather.prototype.buildNewBase = function(gameState, queues, resource) }; /** Deals with building fortresses and towers along our border with enemies. */ -Headquather.prototype.buildDefenses = function(gameState, queues) +Headquarters.prototype.buildDefenses = function(gameState, queues) { if (this.saveResources && !this.canBarter || queues.defenseBuilding.hasQueuedUnits()) return; @@ -1647,7 +1647,7 @@ Headquather.prototype.buildDefenses = function(gameState, queues) } }; -Headquather.prototype.buildForge = function(gameState, queues) +Headquarters.prototype.buildForge = function(gameState, queues) { if (this.getAccountedPopulation(gameState) < this.Config.Military.popForForge || queues.militaryBuilding.hasQueuedUnits() || gameState.getOwnEntitiesByClass("Forge", true).length) @@ -1664,7 +1664,7 @@ Headquather.prototype.buildForge = function(gameState, queues) * Deals with constructing military buildings (e.g. barracks, stable). * They are mostly defined by Config.js. This is unreliable since changes could be done easily. */ -Headquather.prototype.constructTrainingBuildings = function(gameState, queues) +Headquarters.prototype.constructTrainingBuildings = function(gameState, queues) { if (this.saveResources && !this.canBarter || queues.militaryBuilding.hasQueuedUnits()) return; @@ -1779,7 +1779,7 @@ Headquather.prototype.constructTrainingBuildings = function(gameState, queues) /** * Find base nearest to ennemies for military buildings. */ -Headquather.prototype.findBestBaseForMilitary = function(gameState) +Headquarters.prototype.findBestBaseForMilitary = function(gameState) { const ccEnts = gameState.updatingGlobalCollection("allCCs", filters.byClass("CivCentre")).toEntityArray(); let bestBase; @@ -1815,7 +1815,7 @@ Headquather.prototype.findBestBaseForMilitary = function(gameState) * train with highest priority ranged infantry in the nearest civil center from a given set of positions * and garrison them there for defense */ -Headquather.prototype.trainEmergencyUnits = function(gameState, positions) +Headquarters.prototype.trainEmergencyUnits = function(gameState, positions) { if (gameState.ai.queues.emergency.hasQueuedUnits()) return false; @@ -1920,7 +1920,7 @@ Headquather.prototype.trainEmergencyUnits = function(gameState, positions) return true; }; -Headquather.prototype.canBuild = function(gameState, structure) +Headquarters.prototype.canBuild = function(gameState, structure) { const type = gameState.applyCiv(structure); if (this.buildManager.isUnbuildable(gameState, type)) @@ -1974,7 +1974,7 @@ Headquather.prototype.canBuild = function(gameState, structure) return true; }; -Headquather.prototype.updateTerritories = function(gameState) +Headquarters.prototype.updateTerritories = function(gameState) { const around = [ [-0.7, 0.7], [0, 1], [0.7, 0.7], [1, 0], [0.7, -0.7], [0, -1], [-0.7, -0.7], [-1, 0] ]; const alliedVictory = gameState.getAlliedVictory(); @@ -2049,7 +2049,7 @@ Headquather.prototype.updateTerritories = function(gameState) /** * returns the base corresponding to baseID */ -Headquather.prototype.getBaseByID = function(baseID) +Headquarters.prototype.getBaseByID = function(baseID) { return this.basesManager.getBaseByID(baseID); }; @@ -2059,33 +2059,33 @@ Headquather.prototype.getBaseByID = function(baseID) * ActiveBases includes only those with a built cc * PotentialBases includes also those with a cc in construction */ -Headquather.prototype.numActiveBases = function() +Headquarters.prototype.numActiveBases = function() { return this.basesManager.numActiveBases(); }; -Headquather.prototype.hasActiveBase = function() +Headquarters.prototype.hasActiveBase = function() { return this.basesManager.hasActiveBase(); }; -Headquather.prototype.numPotentialBases = function() +Headquarters.prototype.numPotentialBases = function() { return this.basesManager.numPotentialBases(); }; -Headquather.prototype.hasPotentialBase = function() +Headquarters.prototype.hasPotentialBase = function() { return this.basesManager.hasPotentialBase(); }; -Headquather.prototype.isDangerousLocation = function(gameState, pos, radius) +Headquarters.prototype.isDangerousLocation = function(gameState, pos, radius) { return this.isNearInvadingArmy(pos) || this.isUnderEnemyFire(gameState, pos, radius); }; /** Check that the chosen position is not too near from an invading army */ -Headquather.prototype.isNearInvadingArmy = function(pos) +Headquarters.prototype.isNearInvadingArmy = function(pos) { for (const army of this.defenseManager.armies) if (army.foePosition && SquareVectorDistance(army.foePosition, pos) < 12000) @@ -2093,7 +2093,7 @@ Headquather.prototype.isNearInvadingArmy = function(pos) return false; }; -Headquather.prototype.isUnderEnemyFire = function(gameState, pos, radius = 0) +Headquarters.prototype.isUnderEnemyFire = function(gameState, pos, radius = 0) { if (!this.turnCache.firingStructures) { @@ -2110,7 +2110,7 @@ Headquather.prototype.isUnderEnemyFire = function(gameState, pos, radius = 0) }; /** Compute the capture strength of all units attacking a capturable target */ -Headquather.prototype.updateCaptureStrength = function(gameState) +Headquarters.prototype.updateCaptureStrength = function(gameState) { this.capturableTargets.clear(); for (const ent of gameState.getOwnUnits().values()) @@ -2163,7 +2163,7 @@ Headquather.prototype.updateCaptureStrength = function(gameState) /** * Check if a structure in blinking territory should/can be defended (currently if it has some attacking armies around) */ -Headquather.prototype.isDefendable = function(ent) +Headquarters.prototype.isDefendable = function(ent) { if (!this.turnCache.numAround) this.turnCache.numAround = {}; @@ -2175,7 +2175,7 @@ Headquather.prototype.isDefendable = function(ent) /** * Get the number of population already accounted for */ -Headquather.prototype.getAccountedPopulation = function(gameState) +Headquarters.prototype.getAccountedPopulation = function(gameState) { if (this.turnCache.accountedPopulation == undefined) { @@ -2199,7 +2199,7 @@ Headquather.prototype.getAccountedPopulation = function(gameState) /** * Get the number of workers already accounted for */ -Headquather.prototype.getAccountedWorkers = function(gameState) +Headquarters.prototype.getAccountedWorkers = function(gameState) { if (this.turnCache.accountedWorkers == undefined) { @@ -2218,7 +2218,7 @@ Headquather.prototype.getAccountedWorkers = function(gameState) return this.turnCache.accountedWorkers; }; -Headquather.prototype.baseManagers = function() +Headquarters.prototype.baseManagers = function() { return this.basesManager.baseManagers; }; @@ -2227,7 +2227,7 @@ Headquather.prototype.baseManagers = function() * @param {number} territoryIndex - The index to get the map for. * @return {number} - The ID of the base at the given territory index. */ -Headquather.prototype.baseAtIndex = function(territoryIndex) +Headquarters.prototype.baseAtIndex = function(territoryIndex) { return this.basesManager.baseAtIndex(territoryIndex); }; @@ -2236,7 +2236,7 @@ Headquather.prototype.baseAtIndex = function(territoryIndex) * Some functions are run every turn * Others once in a while */ -Headquather.prototype.update = function(gameState, queues, events) +Headquarters.prototype.update = function(gameState, queues, events) { Engine.ProfileStart("Headquarters update"); this.emergencyManager.update(gameState); @@ -2346,7 +2346,7 @@ Headquather.prototype.update = function(gameState, queues, events) Engine.ProfileStop(); }; -Headquather.prototype.Serialize = function() +Headquarters.prototype.Serialize = function() { const properties = { "phasing": this.phasing, @@ -2408,7 +2408,7 @@ Headquather.prototype.Serialize = function() }; }; -Headquather.prototype.Deserialize = function(gameState, data) +Headquarters.prototype.Deserialize = function(gameState, data) { for (const key in data.properties) this[key] = data.properties[key]; diff --git a/binaries/data/mods/public/simulation/ai/petra/startingStrategy.js b/binaries/data/mods/public/simulation/ai/petra/startingStrategy.js index fc906fe403..fb9af62408 100644 --- a/binaries/data/mods/public/simulation/ai/petra/startingStrategy.js +++ b/binaries/data/mods/public/simulation/ai/petra/startingStrategy.js @@ -4,7 +4,7 @@ import { SquareVectorDistance, warn as aiWarn } from "simulation/ai/common-api/u import { Config } from "simulation/ai/petra/config.js"; import * as difficulty from "simulation/ai/petra/difficultyLevel.js"; import { gatherTreasure, getLandAccess, isFastMoving } from "simulation/ai/petra/entityExtend.js"; -import { Headquather } from "simulation/ai/petra/headquarters.js"; +import { Headquarters } from "simulation/ai/petra/headquarters.js"; import { ConstructionPlan } from "simulation/ai/petra/queueplanBuilding.js"; /** @@ -12,7 +12,7 @@ import { ConstructionPlan } from "simulation/ai/petra/queueplanBuilding.js"; * depending on the initial conditions */ -Headquather.prototype.gameAnalysis = function(gameState) +Headquarters.prototype.gameAnalysis = function(gameState) { // Analysis of the terrain and the different access regions if (!this.regionAnalysis(gameState)) @@ -61,7 +61,7 @@ Headquather.prototype.gameAnalysis = function(gameState) /** * Assign the starting entities to the different bases */ -Headquather.prototype.assignStartingEntities = function(gameState) +Headquarters.prototype.assignStartingEntities = function(gameState) { for (const ent of gameState.getOwnEntities().values()) { @@ -108,7 +108,7 @@ Headquather.prototype.assignStartingEntities = function(gameState) * determine the main land Index (or water index if none) * as well as the list of allowed (land andf water) regions */ -Headquather.prototype.regionAnalysis = function(gameState) +Headquarters.prototype.regionAnalysis = function(gameState) { const accessibility = gameState.ai.accessibility; let landIndex; @@ -205,7 +205,7 @@ Headquather.prototype.regionAnalysis = function(gameState) * load units and buildings from the config files * TODO: change that to something dynamic */ -Headquather.prototype.structureAnalysis = function(gameState) +Headquarters.prototype.structureAnalysis = function(gameState) { const civref = gameState.playerData.civ; const civ = civref in this.Config.buildings ? civref : 'default'; @@ -219,7 +219,7 @@ Headquather.prototype.structureAnalysis = function(gameState) * build our first base * if not enough resource, try first to do a dock */ -Headquather.prototype.buildFirstBase = function(gameState) +Headquarters.prototype.buildFirstBase = function(gameState) { if (gameState.ai.queues.civilCentre.hasQueuedUnits()) return; @@ -336,7 +336,7 @@ Headquather.prototype.buildFirstBase = function(gameState) * - if one of our allies has a cc, affect a small fraction of our army for his defense, the rest will attack * - otherwise all units will attack */ -Headquather.prototype.dispatchUnits = function(gameState) +Headquarters.prototype.dispatchUnits = function(gameState) { const allycc = gameState.getExclusiveAllyEntities().filter(filters.byClass("CivCentre")) .toEntityArray(); @@ -416,7 +416,7 @@ Headquather.prototype.dispatchUnits = function(gameState) * - if on a small island, favor fishing * - count the available wood resource, and allow rushes only if enough (we should otherwise favor expansion) */ -Headquather.prototype.configFirstBase = function(gameState) +Headquarters.prototype.configFirstBase = function(gameState) { if (!this.hasPotentialBase()) return;