var g_BiomeID; var g_Terrains = {}; var g_Gaia = {}; var g_Decoratives = {}; var g_ResourceCounts = {}; var g_Heights = {}; function currentBiome() { return g_BiomeID; } function setSelectedBiome() { // TODO: Replace ugly default for atlas by a dropdown setBiome(g_MapSettings.Biome || "generic/alpine"); } function setBiome(biomeID) { RandomMapLogger.prototype.printDirectly("Setting biome " + biomeID + ".\n"); loadBiomeFile("defaultbiome"); setSkySet(pickRandom(["default", "cirrus", "cumulus", "sunny"])); setSunRotation(randomAngle()); setSunElevation(Math.PI * randFloat(1/6, 1/3)); g_BiomeID = biomeID; loadBiomeFile(biomeID); Engine.LoadLibrary("rmbiome/" + dirname(biomeID)); let setupBiomeFunc = global["setupBiome_" + basename(biomeID)]; if (setupBiomeFunc) setupBiomeFunc(); } /** * Copies JSON contents to defined global variables. */ function loadBiomeFile(file) { let path = "maps/random/rmbiome/" + file + ".json"; if (!Engine.FileExists(path)) { error("Could not load biome file '" + file + "'"); return; } let biome = Engine.ReadJSONFile(path); let copyProperties = (from, to) => { for (let prop in from) { if (from[prop] !== null && typeof from[prop] == "object" && !Array.isArray(from[prop])) { if (!to[prop]) to[prop] = {}; copyProperties(from[prop], to[prop]); } else to[prop] = from[prop]; } }; for (let rmsGlobal in biome) { if (rmsGlobal == "Description") continue; if (!global["g_" + rmsGlobal]) throw new Error(rmsGlobal + " not defined!"); copyProperties(biome[rmsGlobal], global["g_" + rmsGlobal]); } } function rBiomeTreeCount(multiplier = 1) { return [ g_ResourceCounts.trees.min * multiplier, g_ResourceCounts.trees.max * multiplier, g_ResourceCounts.trees.forestProbability ]; }