diff --git a/binaries/data/mods/public/gui/gamesettings/GameSettings.js b/binaries/data/mods/public/gui/gamesettings/GameSettings.js index e124412d3e..a482cf6fd7 100644 --- a/binaries/data/mods/public/gui/gamesettings/GameSettings.js +++ b/binaries/data/mods/public/gui/gamesettings/GameSettings.js @@ -88,21 +88,21 @@ class GameSettings */ pickRandomItems() { - let components = Object.keys(this); - let i = 0; - while (components.length && i < 100) + const components = Object.keys(this); + + // When we have looped components.length + 1 times, we are considered stuck. + for (let i = 0; i <= components.length; ++i) { - // Re-pick if any random setting was unrandomised, - // to make sure dependencies are cleared. - // TODO: there's probably a better way to handle this. - components = components.filter(comp => this[comp].pickRandomItems ? - !!this[comp].pickRandomItems() : false); - ++i; - } - if (i === 100) - { - throw new Error("Infinite loop picking random items, remains : " + uneval(components)); + // Re-pick if any random setting was unrandomised, to make sure dependencies are cleared. + let rePick = false; + for (const comp in this) + if (this[comp].pickRandomItems) + rePick = this[comp].pickRandomItems() || rePick; + if (!rePick) + return; } + + throw new Error("Infinite loop picking random items detected, components: " + uneval(components)); } /** diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/Biome.js b/binaries/data/mods/public/gui/gamesettings/attributes/Biome.js index 6484e6e2a1..f278bab2d1 100644 --- a/binaries/data/mods/public/gui/gamesettings/attributes/Biome.js +++ b/binaries/data/mods/public/gui/gamesettings/attributes/Biome.js @@ -82,11 +82,9 @@ GameSettings.prototype.Attributes.Biome = class Biome extends GameSetting pickRandomItems() { // If the map is random, we need to wait until it selects to know if we need to pick a biome. - if (this.settings.map.map === "random") - return true; - - if (this.biome !== "random") + if (this.settings.map.map === "random" || this.biome !== "random") return false; + this.biome = pickRandom(Array.from(this.available)); return true; } diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/Daytime.js b/binaries/data/mods/public/gui/gamesettings/attributes/Daytime.js index 668b67a505..f0715e5666 100644 --- a/binaries/data/mods/public/gui/gamesettings/attributes/Daytime.js +++ b/binaries/data/mods/public/gui/gamesettings/attributes/Daytime.js @@ -44,11 +44,9 @@ GameSettings.prototype.Attributes.Daytime = class Daytime extends GameSetting pickRandomItems() { // If the map is random, we need to wait until it is selected. - if (this.settings.map.map === "random") - return true; - - if (this.value !== "random") + if (this.settings.map.map === "random" || this.value !== "random") return false; + this.value = pickRandom(this.data).Id; return true; } diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/Landscape.js b/binaries/data/mods/public/gui/gamesettings/attributes/Landscape.js index c1456b0601..5ece917b53 100644 --- a/binaries/data/mods/public/gui/gamesettings/attributes/Landscape.js +++ b/binaries/data/mods/public/gui/gamesettings/attributes/Landscape.js @@ -57,10 +57,7 @@ GameSettings.prototype.Attributes.Landscape = class Landscape extends GameSettin pickRandomItems() { // If the map is random, we need to wait until it is selected. - if (this.settings.map.map === "random") - return true; - - if (!this.value || !this.value.startsWith("random")) + if (this.settings.map.map === "random" || !this.value || !this.value.startsWith("random")) return false; let items = []; diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/TeamPlacement.js b/binaries/data/mods/public/gui/gamesettings/attributes/TeamPlacement.js index 961c4f8934..3e7f2131c6 100644 --- a/binaries/data/mods/public/gui/gamesettings/attributes/TeamPlacement.js +++ b/binaries/data/mods/public/gui/gamesettings/attributes/TeamPlacement.js @@ -40,11 +40,9 @@ GameSettings.prototype.Attributes.TeamPlacement = class TeamPlacement extends Ga pickRandomItems() { // If the map is random, we need to wait until it is selected. - if (this.settings.map.map === "random") - return true; - - if (this.value !== "random") + if (this.settings.map.map === "random" || this.value !== "random") return false; + this.value = pickRandom(this.available).Id; return true; }