Index: binaries/data/mods/public/gui/common/settings.js =================================================================== --- binaries/data/mods/public/gui/common/settings.js +++ binaries/data/mods/public/gui/common/settings.js @@ -201,15 +201,23 @@ function loadBiomes() { - return listFiles(g_BiomesDirectory, ".json", true).filter(biomeID => biomeID != "defaultbiome").map(biomeID => { - let description = Engine.ReadJSONFile(g_BiomesDirectory + biomeID + ".json").Description; - return { - "Id": biomeID, - "Title": translateWithContext("biome definition", description.Title), - "Description": description.Description ? translateWithContext("biome definition", description.Description) : "", - "Preview": description.Preview || undefined - }; + const biomeFileList = listFiles(g_BiomesDirectory, ".json", true).filter(biomeID => biomeID != "defaultbiome").map(biomeID => { + + const biomeFile = Engine.ReadJSONFile(g_BiomesDirectory + biomeID + ".json"); + if (biomeFile.Description !== undefined) + { + const description = biomeFile.Description; + + return { + "Id": biomeID, + "Title": translateWithContext("biome definition", description.Title), + "Description": description.Description ? translateWithContext("biome definition", description.Description) : "", + "Preview": description.Preview || undefined + }; + } + return undefined; }); + return biomeFileList.filter(biomeID => biomeID !== undefined); } /** Index: binaries/data/mods/public/gui/gamesettings/attributes/BiomeModifications.js =================================================================== --- binaries/data/mods/public/gui/gamesettings/attributes/BiomeModifications.js +++ binaries/data/mods/public/gui/gamesettings/attributes/BiomeModifications.js @@ -0,0 +1,31 @@ +/** + * This doesn't have a GUI setting. + */ +GameSettings.prototype.Attributes.BiomeModifications = class BiomeModifications extends GameSetting +{ + init() + { + this.value = undefined; + this.settings.map.watch(() => this.onMapChange(), ["map"]); + } + + toInitAttributes(attribs) + { + if (this.value) + attribs.settings.BiomeModifications = this.value; + } + + /** + * Exceptionally, this setting has no Deserialize: it's entirely determined by the map + */ + + onMapChange() + { + this.value = this.getMapSetting("BiomeModifications") || false; + } + + setValue(val) + { + this.value = val; + } +}; Index: binaries/data/mods/public/maps/random/archipelago.js =================================================================== --- binaries/data/mods/public/maps/random/archipelago.js +++ binaries/data/mods/public/maps/random/archipelago.js @@ -6,8 +6,6 @@ setSelectedBiome(); -const biomeTweaks = Engine.ReadJSONFile("maps/random/archipelago_biome_tweaks.json"); - const tMainTerrain = g_Terrains.mainTerrain; const tForestFloor1 = g_Terrains.forestFloor1; const tForestFloor2 = g_Terrains.forestFloor2; @@ -36,6 +34,10 @@ const oMetalLarge = g_Gaia.metalLarge; const oWoodTreasure = "gaia/treasure/wood"; +const treeMultiplier = g_ResourceCounts.trees.multiplier || 1; +const forestPlayerSpacing = g_ResourceCounts.Spacing.forestPlayerSpacing; +const forestForestSpacing = g_ResourceCounts.Spacing.forestForestSpacing; + const aGrass = g_Decoratives.grass; const aGrassShort = g_Decoratives.grassShort; const aRockLarge = g_Decoratives.rockLarge; @@ -152,13 +154,10 @@ else createMountains(tCliff, [avoidClasses(clPlayer, 2, clHill, 15), stayClasses(clLand, 0)], clHill, scaleByMapSize(1, 4) * numPlayers); -// adjust biomes (especially wood) -const biomeSpecifics = biomeTweaks[currentBiome()] || biomeTweaks.baseline; - -var [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(biomeSpecifics.treeAmount)); +var [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(treeMultiplier)); createForests( [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2], - [avoidClasses(clPlayer, biomeSpecifics.forestPlayerSpacing, clForest, biomeSpecifics.forestForestSpacing, clHill, 0), stayClasses(clLand, 3)], + [avoidClasses(clPlayer, forestPlayerSpacing, clForest, forestForestSpacing, clHill, 0), stayClasses(clLand, 3)], clForest, forestTrees ); Index: binaries/data/mods/public/maps/random/archipelago.json =================================================================== --- binaries/data/mods/public/maps/random/archipelago.json +++ binaries/data/mods/public/maps/random/archipelago.json @@ -5,7 +5,11 @@ "Description" : "A maze of islands of different sizes and shapes. Players start with more wood than normal.", "Keywords": ["naval"], "Preview" : "archipelago.png", - "SupportedBiomes": "generic/", + "SupportedBiomes": ["generic/arctic","archipelago/arctic_night"], + "BiomeModifications": { + "generic/arctic": ["archipelago/archipelago_tree_multiplier_1.2", "archipelago/archipelago_forest_spacing_normal"], + "archipelago/arctic_night": ["generic/arctic", "archipelago/archipelago_tree_multiplier_1.2", "archipelago/archipelago_forest_spacing_normal", "archipelago/arctic_night"] + }, "CircularMap" : true } } Index: binaries/data/mods/public/maps/random/rmbiome/archipelago/archipelago_forest_spacing_normal.json =================================================================== --- binaries/data/mods/public/maps/random/rmbiome/archipelago/archipelago_forest_spacing_normal.json +++ binaries/data/mods/public/maps/random/rmbiome/archipelago/archipelago_forest_spacing_normal.json @@ -0,0 +1,8 @@ +{ + "ResourceCounts": { + "Spacing": { + "forestForestSpacing": 13, + "forestPlayerSpacing": 10 + } + } +} Index: binaries/data/mods/public/maps/random/rmbiome/archipelago/archipelago_forest_spacing_wide.json =================================================================== --- binaries/data/mods/public/maps/random/rmbiome/archipelago/archipelago_forest_spacing_wide.json +++ binaries/data/mods/public/maps/random/rmbiome/archipelago/archipelago_forest_spacing_wide.json @@ -0,0 +1,8 @@ +{ + "ResourceCounts": { + "Spacing": { + "forestForestSpacing": 20, + "forestPlayerSpacing": 20 + } + } +} Index: binaries/data/mods/public/maps/random/rmbiome/archipelago/archipelago_tree_multiplier_1.2.json =================================================================== --- binaries/data/mods/public/maps/random/rmbiome/archipelago/archipelago_tree_multiplier_1.2.json +++ binaries/data/mods/public/maps/random/rmbiome/archipelago/archipelago_tree_multiplier_1.2.json @@ -0,0 +1,7 @@ +{ + "ResourceCounts": { + "trees": { + "multiplier": 1.2 + } + } +} Index: binaries/data/mods/public/maps/random/rmbiome/archipelago/archipelago_tree_multiplier_2.json =================================================================== --- binaries/data/mods/public/maps/random/rmbiome/archipelago/archipelago_tree_multiplier_2.json +++ binaries/data/mods/public/maps/random/rmbiome/archipelago/archipelago_tree_multiplier_2.json @@ -0,0 +1,7 @@ +{ + "ResourceCounts": { + "trees": { + "multiplier": 2 + } + } +} Index: binaries/data/mods/public/maps/random/rmbiome/archipelago/arctic_night.json =================================================================== --- binaries/data/mods/public/maps/random/rmbiome/archipelago/arctic_night.json +++ binaries/data/mods/public/maps/random/rmbiome/archipelago/arctic_night.json @@ -0,0 +1,21 @@ +{ + "Description": { + "Title": "Arctic Night", + "Description": "A region in the high snowy mountains. Biting winds sweep through the abundant conifer forests, making even the more resilient deer and mountain goats shiver." + }, + "Environment": { + "SkySet": "dark", + "SunColor": { "r": 0.4, "g": 0.9, "b": 1.045 }, + "SunElevation": 0.2, + "SunRotation": -1.7, + "AmbientColor": { "r": 0.294118, "g": 0.392157, "b": 0.494118 }, + "Water": { + "WaterBody": { + "Color": { "r": 0.0784314, "g": 0.147059, "b": 0.219608 }, + "Tint": { "r": 0.471, "g": 1, "b": 0.501961 }, + "Murkiness": 0.88, + "Waviness": 2 + } + } + } +} Index: binaries/data/mods/public/maps/random/rmbiome/randombiome.js =================================================================== --- binaries/data/mods/public/maps/random/rmbiome/randombiome.js +++ binaries/data/mods/public/maps/random/rmbiome/randombiome.js @@ -31,6 +31,28 @@ loadBiomeFile(biomeID); + if (g_MapSettings.BiomeModifications !== undefined) + { + const modifications = []; + + if (Object.keys(g_MapSettings.BiomeModifications).includes(biomeID)) + { + modifications.push(...g_MapSettings.BiomeModifications[biomeID]); + } + + if (Object.keys(g_MapSettings.BiomeModifications).includes(dirname(biomeID))) + { + modifications.push(...g_MapSettings.BiomeModifications[dirname(biomeID)]); + } + + for (const i in modifications) + { + RandomMapLogger.prototype.printDirectly("Adjsuting biome as specified in: " + modifications[i] + ".\n"); + loadBiomeFile(modifications[i]); + } + } + + Engine.LoadLibrary("rmbiome/" + dirname(biomeID)); let setupBiomeFunc = global["setupBiome_" + basename(biomeID)]; if (setupBiomeFunc)