Index: ps/trunk/binaries/data/mods/public/gui/gamesettings/GameSettings.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/gamesettings/GameSettings.js +++ ps/trunk/binaries/data/mods/public/gui/gamesettings/GameSettings.js @@ -88,21 +88,21 @@ */ pickRandomItems() { - let components = Object.keys(this); - let i = 0; - while (components.length && i < 100) - { - // 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) + 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) { - 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)); } /** Index: ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/Biome.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/Biome.js +++ ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/Biome.js @@ -82,11 +82,9 @@ 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; } Index: ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/Daytime.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/Daytime.js +++ ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/Daytime.js @@ -44,11 +44,9 @@ 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; } Index: ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/Landscape.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/Landscape.js +++ ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/Landscape.js @@ -57,10 +57,7 @@ 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 = []; Index: ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/TeamPlacement.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/TeamPlacement.js +++ ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/TeamPlacement.js @@ -40,11 +40,9 @@ 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; }