Index: binaries/data/mods/public/gamesettings/attributes/PlayerName.js =================================================================== --- binaries/data/mods/public/gamesettings/attributes/PlayerName.js +++ binaries/data/mods/public/gamesettings/attributes/PlayerName.js @@ -66,6 +66,7 @@ */ pickRandomItems() { + let botPlayerNamesList = []; let picked = false; for (let i in this.values) { @@ -82,22 +83,31 @@ continue; picked = true; - // Pick one of the available botnames for the chosen civ - // Determine botnames - let chosenName = pickRandom(this.settings.civData[civ].AINames); - if (!this.settings.isNetworked) - chosenName = translate(chosenName); - - // Count how many players use the chosenName - let usedName = this.values.filter(oName => oName && oName.indexOf(chosenName) !== -1).length; - - this.values[i] = - usedName ? - sprintf(this.RomanLabel, { - "playerName": chosenName, - "romanNumber": this.RomanNumbers[usedName + 1] - }) : - chosenName; + // Pick a botname for the chosen civ + + const names = this.settings.civData[civ].AINames; + const remainingNames = names.filter(name => this.values.indexOf(name) === -1); + const chosenName = pickRandom(remainingNames.length ? remainingNames : names); + + if (!remainingNames.length) + warn (`Insufficient AINames available in ${civ} to avoid duplication.`); + + botPlayerNamesList.push(chosenName); + + //Avoid translating AI names if the game is networked. Closes #3307. + const label = this.settings.isNetworked ? this.CountLabel : translate(this.CountLabel); + + // Translation: the name of an AI-controlled player + const translatedChosenName = this.settings.isNetworked ? chosenName : translate(chosenName); + + // Count how many AI-controlled players use the chosenName + const count = botPlayerNamesList.filter(name => name == chosenName).length; + + this.values[i] = !count ? translatedChosenName : + sprintf(label, { + "playerName": translatedChosenName, + "nameCount": count + 1 + }); } if (picked) this.trigger("values"); @@ -128,9 +138,6 @@ } }; - -GameSettings.prototype.Attributes.PlayerName.prototype.RomanLabel = - translate("%(playerName)s %(romanNumber)s"); - -GameSettings.prototype.Attributes.PlayerName.prototype.RomanNumbers = - [undefined, "I", "II", "III", "IV", "V", "VI", "VII", "VIII"]; +// Translation: CountLabel is a template (sprintf format specifier) for the name of an AI-controlled player and a unique number for each of the players wtih a duplicate name. +GameSettings.prototype.Attributes.PlayerName.prototype.CountLabel = + markForTranslation("%(playerName)s (%(nameCount)i)"); Index: binaries/data/mods/public/gui/credits/texts/programming.json =================================================================== --- binaries/data/mods/public/gui/credits/texts/programming.json +++ binaries/data/mods/public/gui/credits/texts/programming.json @@ -290,6 +290,7 @@ { "nick": "tpearson", "name": "Timothy Pearson" }, { "nick": "user1", "name": "A. C." }, { "nick": "usey11" }, + { "nick": "Vantha"}, { "nick": "vincent_c", "name": "Vincent Cheng" }, { "nick": "vinhig", "name": "Vincent Higginson" }, { "nick": "vladislavbelov", "name": "Vladislav Belov" }, Index: binaries/data/mods/public/simulation/data/civs/gaul.json =================================================================== --- binaries/data/mods/public/simulation/data/civs/gaul.json +++ binaries/data/mods/public/simulation/data/civs/gaul.json @@ -64,6 +64,7 @@ "Divico", "Ambiorix", "Liscus", + "Orgetorix", "Valetiacus", "Viridovix" ], Index: binaries/data/mods/public/simulation/data/civs/iber.json =================================================================== --- binaries/data/mods/public/simulation/data/civs/iber.json +++ binaries/data/mods/public/simulation/data/civs/iber.json @@ -61,8 +61,12 @@ ], "AINames": [ "Audax", + "Calcus", "Ditalcus", "Minurus", + "Olyndicus", + "Orison", + "Tanginus", "Tautalus" ], "SkirmishReplacements": { Index: binaries/data/mods/public/simulation/data/civs/maur.json =================================================================== --- binaries/data/mods/public/simulation/data/civs/maur.json +++ binaries/data/mods/public/simulation/data/civs/maur.json @@ -55,12 +55,14 @@ ], "AINames": [ "Bindusara Maurya", + "Brihadratha Maurya", "Dasharatha Maurya", + "Devavarman Maurya", + "Kunala Maurya", "Samprati Maurya", "Shalishuka Maurya", - "Devavarman Maurya", "Shatadhanvan Maurya", - "Brihadratha Maurya" + "Tivala Maurya" ], "SkirmishReplacements": { "skirmish/units/default_infantry_ranged_b": "units/maur/infantry_archer_b",