Index: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/alpine.json =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/alpine.json (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/alpine.json (revision 20129) @@ -0,0 +1,81 @@ +{ + "Environment": { + "Water": { + "WaterBody": { + "Color": { "r": 0.0, "g": 0.047, "b": 0.286 }, + "Tint": { "r": 0.471, "g": 0.776, "b": 0.863 }, + "Murkiness": 0.82, + "Waviness": 2 + } + }, + "Fog": { + "FogThickness": 0.26, + "FogFactor": 0.4 + }, + "Postproc": { + "PostprocEffect": "hdr", + "Saturation": 0.48, + "Contrast": 0.53, + "Bloom": 0.12 + } + }, + "Terrains": { + "mainTerrain": [ + "alpine_dirt_grass_50" + ], + "forestFloor1": "alpine_forrestfloor", + "forestFloor2": "alpine_forrestfloor", + "cliff": [ + "alpine_cliff_a", + "alpine_cliff_b", + "alpine_cliff_c" + ], + "tier1Terrain": "alpine_dirt", + "tier2Terrain": [ + "alpine_grass_snow_50", + "alpine_dirt_snow", + "alpine_dirt_snow" + ], + "tier3Terrain": [ + "alpine_snow_a", + "alpine_snow_b" + ], + "tier4Terrain": "new_alpine_grass_a", + "hill": "alpine_cliff_snow", + "dirt": [ + "alpine_dirt", + "alpine_grass_d" + ], + "road": "new_alpine_citytile", + "roadWild": "new_alpine_citytile", + "shoreBlend": "alpine_shore_rocks", + "shore": "alpine_shore_rocks_grass_50", + "water": "alpine_shore_rocks" + }, + "Gaia": { + "tree1": "gaia/flora_tree_pine", + "tree2": "gaia/flora_tree_pine", + "tree3": "gaia/flora_tree_pine", + "tree4": "gaia/flora_tree_pine", + "tree5": "gaia/flora_tree_pine", + "fruitBush": "gaia/flora_bush_berry", + "chicken": "gaia/fauna_chicken", + "mainHuntableAnimal": "gaia/fauna_goat", + "fish": "gaia/fauna_fish_tuna", + "secondaryHuntableAnimal": "gaia/fauna_deer", + "stoneLarge": "gaia/geology_stonemine_alpine_quarry", + "stoneSmall": "gaia/geology_stone_alpine_a", + "metalLarge": "gaia/geology_metal_alpine_slabs" + }, + "Decoratives": { + "grass": "actor|props/flora/grass_soft_small_tall.xml", + "grassShort": "actor|props/flora/grass_soft_large.xml", + "reeds": "actor|props/flora/reeds_pond_dry.xml", + "lillies": "actor|geology/stone_granite_large.xml", + "rockLarge": "actor|geology/stone_granite_large.xml", + "rockMedium": "actor|geology/stone_granite_med.xml", + "bushMedium": "actor|props/flora/bush_desert_a.xml", + "bushSmall": "actor|props/flora/bush_desert_a.xml", + "tree": "actor|flora/trees/pine.xml" + } +} Property changes on: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/alpine.json ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/autumn.json =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/autumn.json (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/autumn.json (revision 20129) @@ -0,0 +1,82 @@ +{ + "Environment": { + "Water": { + "WaterBody": { + "Color": { "r": 0.157, "g": 0.149, "b": 0.443 }, + "Tint": { "r": 0.443, "g": 0.42, "b": 0.824 }, + "Murkiness": 0.83, + "Waviness": 2.5 + } + }, + "Fog": { + "FogThickness": 0.22, + "FogFactor": 0.35, + "FogColor": { "r": 0.82, "g": 0.82, "b": 0.73 } + }, + "Postproc": { + "PostprocEffect": "hdr", + "Saturation": 0.56, + "Contrast": 0.56, + "Bloom": 0.38 + } + }, + "Terrains": { + "mainTerrain": [ + "temp_grass_aut", + "temp_grass_aut", + "temp_grass_d_aut" + ], + "forestFloor1": "temp_plants_bog_aut", + "forestFloor2": "temp_forestfloor_aut", + "cliff": [ + "temp_cliff_a", + "temp_cliff_b" + ], + "tier1Terrain": "temp_grass_plants_aut", + "tier2Terrain": [ + "temp_grass_b_aut", + "temp_grass_c_aut" + ], + "tier3Terrain": [ + "temp_grass_b_aut", + "temp_grass_long_b_aut" + ], + "tier4Terrain": "temp_grass_plants_aut", + "hill": "temp_highlands_aut", + "dirt": [ + "temp_cliff_a", + "temp_cliff_b" + ], + "road": "temp_road_aut", + "roadWild": "temp_road_overgrown_aut", + "shoreBlend": "temp_grass_plants_aut", + "shore": "temp_forestfloor_pine", + "water": "medit_sand_wet" + }, + "Gaia": { + "tree1": "gaia/flora_tree_euro_beech_aut", + "tree2": "gaia/flora_tree_euro_beech_aut", + "tree3": "gaia/flora_tree_pine", + "tree4": "gaia/flora_tree_oak_aut", + "tree5": "gaia/flora_tree_oak_aut", + "fruitBush": "gaia/flora_bush_berry", + "chicken": "gaia/fauna_chicken", + "mainHuntableAnimal": "gaia/fauna_deer", + "fish": "gaia/fauna_fish", + "secondaryHuntableAnimal": "gaia/fauna_rabbit", + "stoneLarge": "gaia/geology_stonemine_temperate_quarry", + "stoneSmall": "gaia/geology_stone_temperate", + "metalLarge": "gaia/geology_metal_temperate_slabs" + }, + "Decoratives": { + "grass": "actor|props/flora/grass_soft_dry_small_tall.xml", + "grassShort": "actor|props/flora/grass_soft_dry_large.xml", + "reeds": "actor|props/flora/reeds_pond_dry.xml", + "lillies": "actor|geology/stone_granite_large.xml", + "rockLarge": "actor|geology/stone_granite_large.xml", + "rockMedium": "actor|geology/stone_granite_med.xml", + "bushMedium": "actor|props/flora/bush_desert_dry_a.xml", + "bushSmall": "actor|props/flora/bush_desert_dry_a.xml", + "tree": "actor|flora/trees/european_beech_aut.xml" + } +} Property changes on: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/autumn.json ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/desert.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/desert.js (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/desert.js (revision 20129) @@ -0,0 +1,18 @@ +function setupBiome_desert() +{ + [g_Gaia.tree1, g_Gaia.tree2] = pickRandom([ + [ + "gaia/flora_tree_cretan_date_palm_short", + "gaia/flora_tree_cretan_date_palm_tall" + ], + [ + "gaia/flora_tree_date_palm", + "gaia/flora_tree_date_palm" + ] + ]); + + [g_Gaia.tree4, g_Gaia.tree5] = new Array(2).fill(pickRandom([ + "gaia/flora_tree_tamarix", + "gaia/flora_tree_senegal_date_palm" + ])); +} Property changes on: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/desert.js ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/desert.json =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/desert.json (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/desert.json (revision 20129) @@ -0,0 +1,81 @@ +{ + "Environment": { + "SunColor": { "r": 0.733, "g": 0.746, "b": 0.574 }, + "Water": { + "WaterBody": { + "Color": { "r": 0, "g": 0.227, "b": 0.843 }, + "Tint": { "r": 0, "g": 0.545, "b": 0.859 }, + "Murkiness": 0.22, + "Waviness": 1 + } + }, + "Fog": { + "FogThickness": 0, + "FogFactor": 0.5, + "FogColor": { "r": 0.852, "g": 0.746, "b": 0.493 } + }, + "Postproc": { + "PostprocEffect": "hdr", + "Saturation": 0.42, + "Contrast": 0.67, + "Bloom": 0.23 + } + }, + "Terrains": { + "mainTerrain": [ + "desert_dirt_rough", + "desert_dirt_rough_2", + "desert_sand_dunes_50", + "desert_sand_smooth" + ], + "forestFloor1": "forestfloor_dirty", + "forestFloor2": "desert_forestfloor_palms", + "cliff": [ + "desert_cliff_1", + "desert_cliff_2", + "desert_cliff_3", + "desert_cliff_4", + "desert_cliff_5" + ], + "tier1Terrain": "desert_dirt_rough", + "tier2Terrain": "desert_dirt_rocks_1", + "tier3Terrain": "desert_dirt_rocks_2", + "tier4Terrain": "desert_dirt_rough", + "hill": [ + "desert_dirt_rocks_1", + "desert_dirt_rocks_2", + "desert_dirt_rocks_3" + ], + "dirt": [ + "desert_lakebed_dry", + "desert_lakebed_dry_b" + ], + "road": "desert_city_tile", + "roadWild": "desert_city_tile", + "shoreBlend": "desert_shore_stones", + "shore": "desert_sand_smooth", + "water": "desert_sand_wet" + }, + "Gaia": { + "fruitBush": "gaia/flora_bush_grapes", + "chicken": "gaia/fauna_chicken", + "mainHuntableAnimal": "gaia/fauna_camel", + "fish": "gaia/fauna_fish", + "secondaryHuntableAnimal": "gaia/fauna_gazelle", + "stoneLarge": "gaia/geology_stonemine_desert_quarry", + "stoneSmall": "gaia/geology_stone_desert_small", + "metalLarge": "gaia/geology_metal_desert_slabs", + "tree3": "gaia/flora_tree_fig" + }, + "Decoratives": { + "grass": "actor|props/flora/grass_soft_dry_small_tall.xml", + "grassShort": "actor|props/flora/grass_soft_dry_large.xml", + "reeds": "actor|props/flora/reeds_pond_lush_a.xml", + "lillies": "actor|props/flora/reeds_pond_lush_b.xml", + "rockLarge": "actor|geology/stone_desert_med.xml", + "rockMedium": "actor|geology/stone_desert_med.xml", + "bushMedium": "actor|props/flora/bush_desert_dry_a.xml", + "bushSmall": "actor|props/flora/bush_desert_dry_a.xml", + "tree": "actor|flora/trees/palm_date.xml" + } +} Property changes on: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/desert.json ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/mediterranean.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/mediterranean.js (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/mediterranean.js (revision 20129) @@ -0,0 +1,31 @@ +function setupBiome_mediterranean() +{ + [g_Gaia.tree1, g_Gaia.tree2] = pickRandom([ + [ + "gaia/flora_tree_cretan_date_palm_short", + "gaia/flora_tree_cretan_date_palm_tall" + ], + [ + "gaia/flora_tree_carob", + "gaia/flora_tree_carob" + ], + [ + "gaia/flora_tree_medit_fan_palm", + "gaia/flora_tree_medit_fan_palm" + ]]); + + g_Gaia.tree3 = pickRandom([ + "gaia/flora_tree_apple", + "gaia/flora_tree_poplar_lombardy" + ]); + + [g_Gaia.tree4, g_Gaia.tree5] = new Array(2).fill(pickRandom([ + "gaia/flora_tree_cypress", + "gaia/flora_tree_aleppo_pine" + ])); + + g_Gaia.fruitBush = pickRandom([ + "gaia/flora_bush_berry", + "gaia/flora_bush_grapes" + ]); +} Property changes on: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/mediterranean.js ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/mediterranean.json =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/mediterranean.json (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/mediterranean.json (revision 20129) @@ -0,0 +1,75 @@ +{ + "Environment": { + "Water": { + "WaterBody": { + "Color": { "r": 0.024, "g": 0.212, "b": 0.024 }, + "Tint": { "r": 0.133, "g": 0.725, "b": 0.855 }, + "Murkiness": 0.8, + "Waviness": 3 + } + }, + "Fog": { + "FogThickness": 0.25, + "FogFactor": 0.3 + }, + "Postproc": { + "PostprocEffect": "hdr", + "Saturation": 0.51, + "Contrast": 0.62, + "Bloom": 0.12 + } + }, + "Terrains": { + "mainTerrain": [ + "medit_grass_field_a", + "medit_grass_field_b" + ], + "forestFloor1": "medit_grass_field", + "forestFloor2": "medit_grass_shrubs", + "cliff": [ + "medit_cliff_grass", + "medit_cliff_greek", + "medit_cliff_greek_2", + "medit_cliff_aegean", + "medit_cliff_italia", + "medit_cliff_italia_grass" + ], + "tier1Terrain": "medit_grass_field_b", + "tier2Terrain": "medit_grass_field_brown", + "tier3Terrain": "medit_grass_field_dry", + "tier4Terrain": "medit_grass_wild", + "hill": [ + "medit_rocks_grass_shrubs", + "medit_rocks_shrubs" + ], + "dirt": [ + "medit_dirt", + "medit_dirt_b" + ], + "road": "medit_city_tile", + "roadWild": "medit_city_tile", + "shoreBlend": "medit_sand", + "shore": "sand_grass_25", + "water": "medit_sand_wet" + }, + "Gaia": { + "chicken": "gaia/fauna_chicken", + "mainHuntableAnimal": "gaia/fauna_deer", + "fish": "gaia/fauna_fish", + "secondaryHuntableAnimal": "gaia/fauna_sheep", + "stoneLarge": "gaia/geology_stonemine_medit_quarry", + "stoneSmall": "gaia/geology_stone_mediterranean", + "metalLarge": "gaia/geology_metal_mediterranean_slabs" + }, + "Decoratives": { + "grass": "actor|props/flora/grass_soft_large_tall.xml", + "grassShort": "actor|props/flora/grass_soft_large.xml", + "reeds": "actor|props/flora/reeds_pond_lush_b.xml", + "lillies": "actor|props/flora/water_lillies.xml", + "rockLarge": "actor|geology/stone_granite_large.xml", + "rockMedium": "actor|geology/stone_granite_med.xml", + "bushMedium": "actor|props/flora/bush_medit_me.xml", + "bushSmall": "actor|props/flora/bush_medit_sm.xml", + "tree": "actor|flora/trees/palm_cretan_date.xml" + } +} Property changes on: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/mediterranean.json ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/savanna.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/savanna.js (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/savanna.js (revision 20129) @@ -0,0 +1,9 @@ +function setupBiome_savanna() +{ + g_Gaia.mainHuntableAnimal = pickRandom([ + "gaia/fauna_wildebeest", + "gaia/fauna_zebra", + "gaia/fauna_giraffe", + "gaia/fauna_elephant_african_bush" + ]); +} Property changes on: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/savanna.js ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/savanna.json =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/savanna.json (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/savanna.json (revision 20129) @@ -0,0 +1,81 @@ +{ + "Environment": { + "Water": { + "WaterBody": { + "Color": { "r": 0.055, "g": 0.176, "b": 0.431 }, + "Tint": { "r": 0.227, "g": 0.749, "b": 0.549 }, + "Murkiness": 0.77, + "Waviness": 1.5 + } + }, + "Fog": { + "FogThickness": 0.15, + "FogFactor": 0.25, + "FogColor": { "r": 0.847059, "g": 0.737255, "b": 0.482353 } + }, + "Postproc": { + "PostprocEffect": "hdr", + "Contrast": 0.57031, + "Bloom": 0.34 + } + }, + "Terrains": { + "mainTerrain": [ + "savanna_grass_a", + "savanna_grass_b" + ], + "forestFloor1": "savanna_forestfloor_a", + "forestFloor2": "savanna_forestfloor_b", + "cliff": [ + "savanna_cliff_a", + "savanna_cliff_b" + ], + "tier1Terrain": "savanna_shrubs_a", + "tier2Terrain": "savanna_dirt_rocks_b", + "tier3Terrain": "savanna_dirt_rocks_a", + "tier4Terrain": "savanna_grass_a", + "hill": [ + "savanna_grass_a", + "savanna_grass_b" + ], + "dirt": [ + "savanna_dirt_rocks_b", + "dirt_brown_e" + ], + "road": "savanna_tile_a", + "roadWild": "savanna_tile_a", + "shoreBlend": "savanna_riparian", + "shore": "savanna_riparian_bank", + "water": "savanna_riparian_wet" + }, + "Gaia": { + "tree1": "gaia/flora_tree_baobab", + "tree2": "gaia/flora_tree_baobab", + "tree3": "gaia/flora_tree_baobab", + "tree4": "gaia/flora_tree_baobab", + "tree5": "gaia/flora_tree_baobab", + "fruitBush": "gaia/flora_bush_grapes", + "chicken": "gaia/fauna_chicken", + "fish": "gaia/fauna_fish", + "secondaryHuntableAnimal": "gaia/fauna_gazelle", + "stoneLarge": "gaia/geology_stonemine_desert_quarry", + "stoneSmall": "gaia/geology_stone_savanna_small", + "metalLarge": "gaia/geology_metal_savanna_slabs" + }, + "Decoratives": { + "grass": "actor|props/flora/grass_savanna.xml", + "grassShort": "actor|props/flora/grass_medit_field.xml", + "reeds": "actor|props/flora/reeds_pond_lush_a.xml", + "lillies": "actor|props/flora/reeds_pond_lush_b.xml", + "rockLarge": "actor|geology/stone_savanna_med.xml", + "rockMedium": "actor|geology/stone_savanna_med.xml", + "bushMedium": "actor|props/flora/bush_desert_dry_a.xml", + "bushSmall": "actor|props/flora/bush_dry_a.xml", + "tree": "actor|flora/trees/baobab.xml" + }, + "TreeCount": { + "minTrees": 200, + "maxTrees": 1250, + "forestProbability": 0 + } +} Property changes on: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/savanna.json ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/snowy.json =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/snowy.json (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/snowy.json (revision 20129) @@ -0,0 +1,76 @@ +{ + "Environment": + { + "SunColor": { "r": 0.550, "g": 0.601, "b": 0.644 }, + "Water": { + "WaterBody": { + "Color": { "r": 0.067, "g": 0.212, "b": 0.361 }, + "Tint": { "r": 0.4, "g": 0.486, "b": 0.765 }, + "Murkiness": 0.83, + "Waviness": 5.5 + } + }, + "Fog": { + "FogThickness": 0.21, + "FogFactor": 0.6 + }, + "Postproc": { + "PostprocEffect": "hdr", + "Saturation": 0.37 + } + }, + "Terrains": { + "mainTerrain": [ + "polar_snow_b", + "snow grass 75", + "snow rocks", + "snow forest" + ], + "forestFloor1": "polar_tundra_snow", + "forestFloor2": "polar_tundra_snow", + "cliff": [ + "alpine_cliff_a", + "alpine_cliff_b" + ], + "tier1Terrain": "polar_snow_a", + "tier2Terrain": "polar_ice_snow", + "tier3Terrain": "polar_ice", + "tier4Terrain": "snow grass 2", + "hill": [ + "polar_snow_rocks", + "polar_cliff_snow" + ], + "dirt": "snow grass 2", + "road": "new_alpine_citytile", + "roadWild": "polar_ice_cracked", + "shoreBlend": "polar_ice", + "shore": "alpine_shore_rocks_icy", + "water": "alpine_shore_rocks" + }, + "Gaia": { + "tree1": "gaia/flora_tree_pine_w", + "tree2": "gaia/flora_tree_pine_w", + "tree3": "gaia/flora_tree_pine_w", + "tree4": "gaia/flora_tree_pine_w", + "tree5": "gaia/flora_tree_pine", + "fruitBush": "gaia/flora_bush_berry", + "chicken": "gaia/fauna_chicken", + "mainHuntableAnimal": "gaia/fauna_muskox", + "fish": "gaia/fauna_fish_tuna", + "secondaryHuntableAnimal": "gaia/fauna_walrus", + "stoneLarge": "gaia/geology_stonemine_alpine_quarry", + "stoneSmall": "gaia/geology_stone_alpine_a", + "metalLarge": "gaia/geology_metal_alpine_slabs" + }, + "Decoratives": { + "grass": "actor|props/flora/grass_soft_dry_small_tall.xml", + "grassShort": "actor|props/flora/grass_soft_dry_large.xml", + "reeds": "actor|props/flora/reeds_pond_dry.xml", + "lillies": "actor|geology/stone_granite_large.xml", + "rockLarge": "actor|geology/stone_granite_large.xml", + "rockMedium": "actor|geology/stone_granite_med.xml", + "bushMedium": "actor|props/flora/bush_desert_dry_a.xml", + "bushSmall": "actor|props/flora/bush_desert_dry_a.xml", + "tree": "actor|flora/trees/pine_w.xml" + } +} Property changes on: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/snowy.json ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/temperate.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/temperate.js (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/temperate.js (revision 20129) @@ -0,0 +1,53 @@ +function setupBiome_temperate() +{ + if (randBool()) + { + g_Terrains.mainTerrain = "alpine_grass"; + g_Terrains.forestFloor1 = "temp_forestfloor_pine"; + g_Terrains.forestFloor2 = "temp_grass_clovers_2"; + g_Terrains.tier1Terrain = "alpine_grass_a"; + g_Terrains.tier2Terrain = "alpine_grass_b"; + g_Terrains.tier3Terrain = "alpine_grass_c"; + g_Terrains.tier4Terrain = "temp_grass_mossy"; + } + else + { + g_Terrains.mainTerrain = "temp_grass_long_b"; + g_Terrains.forestFloor1 = "temp_forestfloor_pine"; + g_Terrains.forestFloor2 = "temp_plants_bog"; + g_Terrains.tier1Terrain = "temp_grass_d"; + g_Terrains.tier2Terrain = "temp_grass_c"; + g_Terrains.tier3Terrain = "temp_grass_clovers_2"; + g_Terrains.tier4Terrain = "temp_grass_plants"; + } + + [g_Gaia.tree1, g_Gaia.tree2] = pickRandom([ + [ + "gaia/flora_tree_oak", + "gaia/flora_tree_oak_large" + ], + [ + "gaia/flora_tree_poplar", + "gaia/flora_tree_poplar" + ], + [ + "gaia/flora_tree_euro_beech", + "gaia/flora_tree_euro_beech" + ] + ]); + + [g_Gaia.tree4, g_Gaia.tree5] = pickRandom([ + [ + "gaia/flora_tree_pine", + "gaia/flora_tree_aleppo_pine" + ], + [ + "gaia/flora_tree_pine", + "gaia/flora_tree_pine" + ], + [ + "gaia/flora_tree_aleppo_pine", + "gaia/flora_tree_aleppo_pine" + ] + ]); +} Property changes on: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/temperate.js ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/temperate.json =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/temperate.json (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/temperate.json (revision 20129) @@ -0,0 +1,63 @@ +{ + "Environment": { + "Water": { + "WaterBody": { + "Color": { "r": 0.114, "g": 0.192, "b": 0.463 }, + "Tint": { "r": 0.255, "g": 0.361, "b": 0.651 }, + "Murkiness": 0.83, + "Waviness": 5.5 + } + }, + "Fog": { + "FogThickness": 0.25, + "FogFactor": 0.4 + }, + "Postproc": { + "PostprocEffect": "hdr", + "Saturation": 0.62, + "Contrast": 0.62, + "Bloom": 0.3 + } + }, + "Terrains": { + "cliff": [ + "temp_cliff_a", + "temp_cliff_b" + ], + "hill": [ + "temp_dirt_gravel", + "temp_dirt_gravel_b" + ], + "dirt": [ + "temp_dirt_gravel", + "temp_dirt_gravel_b" + ], + "road": "temp_road", + "roadWild": "temp_road_overgrown", + "shoreBlend": "temp_mud_plants", + "shore": "sand_grass_25", + "water": "medit_sand_wet" + }, + "Gaia": { + "fruitBush": "gaia/flora_bush_berry", + "chicken": "gaia/fauna_chicken", + "fish": "gaia/fauna_fish", + "mainHuntableAnimal": "gaia/fauna_deer", + "secondaryHuntableAnimal": "gaia/fauna_sheep", + "stoneLarge": "gaia/geology_stonemine_temperate_quarry", + "stoneSmall": "gaia/geology_stone_temperate", + "metalLarge": "gaia/geology_metal_temperate_slabs", + "tree3": "gaia/flora_tree_apple" + }, + "Decoratives": { + "grass": "actor|props/flora/grass_soft_large_tall.xml", + "grassShort": "actor|props/flora/grass_soft_large.xml", + "reeds": "actor|props/flora/reeds_pond_lush_a.xml", + "lillies": "actor|props/flora/water_lillies.xml", + "rockLarge": "actor|geology/stone_granite_large.xml", + "rockMedium": "actor|geology/stone_granite_med.xml", + "bushMedium": "actor|props/flora/bush_medit_me.xml", + "bushSmall": "actor|props/flora/bush_medit_sm.xml", + "tree": "actor|flora/trees/oak.xml" + } +} Property changes on: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/temperate.json ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/tropic.json =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/tropic.json (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/tropic.json (revision 20129) @@ -0,0 +1,88 @@ +{ + "Environment": { + "Water": { + "WaterBody": { + "Color": { "r": 0.584, "g": 0.824, "b": 0.929 }, + "Tint": { "r": 0.569, "g": 0.965, "b": 0.945 }, + "Murkiness": 0.35, + "Waviness": 1.5 + } + }, + "Fog": { + "FogThickness": 0.2, + "FogFactor": 0.4 + }, + "Postproc": { + "PostprocEffect": "hdr", + "Contrast": 0.67, + "Saturation": 0.62, + "Bloom": 0.6 + } + }, + "Terrains": { + "mainTerrain": [ + "tropic_grass_c", + "tropic_grass_c", + "tropic_grass_c", + "tropic_grass_c", + "tropic_grass_plants", + "tropic_plants", + "tropic_plants_b" + ], + "forestFloor1": "tropic_plants_c", + "forestFloor2": "tropic_plants_c", + "cliff": [ + "tropic_cliff_a", + "tropic_cliff_a", + "tropic_cliff_a", + "tropic_cliff_a_plants" + ], + "tier1Terrain": "tropic_grass_c", + "tier2Terrain": "tropic_grass_plants", + "tier3Terrain": "tropic_plants", + "tier4Terrain": "tropic_plants_b", + "hill": [ + "tropic_cliff_grass" + ], + "dirt": [ + "tropic_dirt_a", + "tropic_dirt_a_plants" + ], + "road": "tropic_citytile_a", + "roadWild": "tropic_citytile_plants", + "shoreBlend": "temp_mud_plants", + "shore": "tropic_beach_dry_plants", + "water": "tropic_beach_dry" + }, + "Gaia": { + "tree1": "gaia/flora_tree_toona", + "tree2": "gaia/flora_tree_toona", + "tree3": "gaia/flora_tree_palm_tropic", + "tree4": "gaia/flora_tree_palm_tropic", + "tree5": "gaia/flora_tree_palm_tropic", + "fruitBush": "gaia/flora_bush_berry", + "chicken": "gaia/fauna_chicken", + "mainHuntableAnimal": "gaia/fauna_peacock", + "fish": "gaia/fauna_fish", + "secondaryHuntableAnimal": "gaia/fauna_tiger", + "stoneLarge": "gaia/geology_stonemine_tropic_quarry", + "stoneSmall": "gaia/geology_stone_tropic_a", + "metalLarge": "gaia/geology_metal_tropic_slabs" + }, + "Decoratives": { + "grass": "actor|props/flora/plant_tropic_a.xml", + "grassShort": "actor|props/flora/plant_lg.xml", + "reeds": "actor|props/flora/reeds_pond_lush_b.xml", + "lillies": "actor|props/flora/water_lillies.xml", + "rockLarge": "actor|geology/stone_granite_large.xml", + "rockMedium": "actor|geology/stone_granite_med.xml", + "bushMedium": "actor|props/flora/plant_tropic_large.xml", + "bushSmall": "actor|props/flora/plant_tropic_large.xml", + "tree": "actor|flora/trees/tree_tropic.xml" + }, + ""TreeCount": { + "minTrees": 1000, + "maxTrees": 6000, + "forestProbability": 0.52 + } +} Property changes on: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/biomes/tropic.json ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/defaultbiome.json =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/rmbiome/defaultbiome.json (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/rmbiome/defaultbiome.json (revision 20129) @@ -0,0 +1,83 @@ +{ + "Environment": { + "TerrainAmbientColor": { "r": 0.447059, "g": 0.509804, "b": 0.54902 }, + "UnitsAmbientColor": { "r": 0.57, "g": 0.58, "b": 0.55 }, + "Water": { + "WaterBody": { + "Color": { "r": 0.0, "g": 0.047, "b": 0.286 }, + "Tint": { "r": 0.471, "g": 0.776, "b": 0.863 }, + "Murkiness": 0.82, + "Waviness": 2 + } + }, + "Fog": { + "FogThickness": 0.26, + "FogFactor": 0.4 + }, + "Postproc": { + "PostprocEffect": "hdr", + "Saturation": 0.48, + "Contrast": 0.53, + "Bloom": 0.12 + } + }, + "Terrains": { + "mainTerrain": [ + "temp_grass_long_b" + ], + "forestFloor1": "temp_forestfloor_pine", + "forestFloor2": "temp_plants_bog", + "tier1Terrain": "temp_grass_d", + "tier2Terrain": "temp_grass_c", + "tier3Terrain": "temp_grass_clovers_2", + "tier4Terrain": "temp_grass_plants", + "cliff": [ + "temp_cliff_a", + "temp_cliff_b" + ], + "hill": [ + "temp_dirt_gravel", + "temp_dirt_gravel_b" + ], + "dirt": [ + "temp_dirt_gravel", + "temp_dirt_gravel_b" + ], + "road": "temp_road", + "roadWild": "temp_road_overgrown", + "shoreBlend": "temp_mud_plants", + "shore": "sand_grass_25", + "water": "medit_sand_wet" + }, + "Gaia": { + "tree1": "gaia/flora_tree_oak", + "tree2": "gaia/flora_tree_oak_large", + "tree3": "gaia/flora_tree_apple", + "tree4": "gaia/flora_tree_pine", + "tree5": "gaia/flora_tree_aleppo_pine", + "fruitBush": "gaia/flora_bush_berry", + "chicken": "gaia/fauna_chicken", + "fish": "gaia/fauna_fish", + "mainHuntableAnimal": "gaia/fauna_deer", + "secondaryHuntableAnimal": "gaia/fauna_sheep", + "stoneLarge": "gaia/geology_stonemine_medit_quarry", + "stoneSmall": "gaia/geology_stone_mediterranean", + "metalLarge": "gaia/geology_metal_mediterranean_slabs" + }, + "Decoratives": { + "grass": "actor|props/flora/grass_soft_large_tall.xml", + "grassShort": "actor|props/flora/grass_soft_large.xml", + "reeds": "actor|props/flora/reeds_pond_lush_a.xml", + "lillies": "actor|props/flora/pond_lillies_large.xml", + "rockLarge": "actor|geology/stone_granite_large.xml", + "rockMedium": "actor|geology/stone_granite_med.xml", + "bushMedium": "actor|props/flora/bush_medit_me.xml", + "bushSmall": "actor|props/flora/bush_medit_sm.xml", + "tree": "actor|flora/trees/oak.xml" + }, + "TreeCount": { + "minTrees": 500, + "maxTrees": 3000, + "forestProbability": 0.7 + } +} Property changes on: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/defaultbiome.json ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: ps/trunk/binaries/data/mods/public/maps/random/rmbiome/randombiome.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/rmbiome/randombiome.js (revision 20128) +++ ps/trunk/binaries/data/mods/public/maps/random/rmbiome/randombiome.js (revision 20129) @@ -1,915 +1,272 @@ +RMS.LoadLibrary("rmbiome/biomes"); + /** * Use constants as biome identifiers, so that we get reference errors if there is a typo. */ const g_BiomeTemperate = "temperate"; const g_BiomeSnowy = "snowy"; const g_BiomeDesert = "desert"; const g_BiomeAlpine = "alpine"; const g_BiomeMediterranean = "mediterranean"; const g_BiomeSavanna = "savanna"; const g_BiomeTropic = "tropic"; const g_BiomeAutumn = "autumn"; -const g_Biomes = deepfreeze([ - g_BiomeTemperate, - g_BiomeSnowy, - g_BiomeDesert, - g_BiomeAlpine, - g_BiomeMediterranean, - g_BiomeSavanna, - g_BiomeTropic, - g_BiomeAutumn -]); +var g_Terrains = {}; +var g_Gaia = {}; +var g_Decoratives = {}; +var g_TreeCount = {}; var g_BiomeID = g_BiomeTemperate; -var g_Terrains = { - "mainTerrain": ["temp_grass_long_b"], - "forestFloor1": "temp_forestfloor_pine", - "forestFloor2": "temp_plants_bog", - "tier1Terrain": "temp_grass_d", - "tier2Terrain": "temp_grass_c", - "tier3Terrain": "temp_grass_clovers_2", - "tier4Terrain": "temp_grass_plants", - "cliff": ["temp_cliff_a", "temp_cliff_b"], - "hill": ["temp_dirt_gravel", "temp_dirt_gravel_b"], - "dirt": ["temp_dirt_gravel", "temp_dirt_gravel_b"], - "road": "temp_road", - "roadWild": "temp_road_overgrown", - "shoreBlend": "temp_mud_plants", - "shore": "sand_grass_25", - "water": "medit_sand_wet" -}; - -var g_Gaia = { - "tree1": "gaia/flora_tree_oak", - "tree2": "gaia/flora_tree_oak_large", - "tree3": "gaia/flora_tree_apple", - "tree4": "gaia/flora_tree_pine", - "tree5": "gaia/flora_tree_aleppo_pine", - "fruitBush": "gaia/flora_bush_berry", - "chicken": "gaia/fauna_chicken", - "fish": "gaia/fauna_fish", - "mainHuntableAnimal": "gaia/fauna_deer", - "secondaryHuntableAnimal": "gaia/fauna_sheep", - "stoneLarge": "gaia/geology_stonemine_medit_quarry", - "stoneSmall": "gaia/geology_stone_mediterranean", - "metalLarge": "gaia/geology_metal_mediterranean_slabs" -}; - -var g_Decoratives = { - "grass": "actor|props/flora/grass_soft_large_tall.xml", - "grassShort": "actor|props/flora/grass_soft_large.xml", - "reeds": "actor|props/flora/reeds_pond_lush_a.xml", - "lillies": "actor|props/flora/pond_lillies_large.xml", - "rockLarge": "actor|geology/stone_granite_large.xml", - "rockMedium": "actor|geology/stone_granite_med.xml", - "bushMedium": "actor|props/flora/bush_medit_me.xml", - "bushSmall": "actor|props/flora/bush_medit_sm.xml", - "tree": "actor|flora/trees/oak.xml" -}; - -var g_TreeCount = { - "minTrees": 500, - "maxTrees": 3000, - "forestProbability": 0.7 -}; - function currentBiome() { return g_BiomeID; } function setSelectedBiome() { - if (g_Biomes.indexOf(g_MapSettings.Biome) == -1) - { - error("Can't set biome '" + g_MapSettings.Biome + "'"); - return; - } - setBiome(g_MapSettings.Biome); } function setBiome(biomeID) { - if (g_Biomes.indexOf(biomeID) == -1) - warn("Unknown biome: '" + biomeID + "'"); - else - g_BiomeID = biomeID; + loadBiomeFile("defaultbiome"); setSkySet(pickRandom(["cirrus", "cumulus", "sunny"])); - setSunRotation(randFloat(0, TWO_PI)); setSunElevation(randFloat(PI/ 6, PI / 3)); - setUnitsAmbientColor(0.57, 0.58, 0.55); - setTerrainAmbientColor(0.447059, 0.509804, 0.54902); - - if (g_BiomeID == g_BiomeTemperate) - { - // temperate ocean blue, a bit too deep and saturated perhaps but it looks nicer. - // this assumes ocean settings, maps that aren't oceans should reset. - setWaterColor(0.114, 0.192, 0.463); - setWaterTint(0.255, 0.361, 0.651); - setWaterWaviness(5.5); - setWaterMurkiness(0.83); - - setFogThickness(0.25); - setFogFactor(0.4); - - setPPEffect("hdr"); - setPPSaturation(0.62); - setPPContrast(0.62); - setPPBloom(0.3); - - g_Terrains = { - "cliff": ["temp_cliff_a", "temp_cliff_b"], - "hill": ["temp_dirt_gravel", "temp_dirt_gravel_b"], - "dirt": ["temp_dirt_gravel", "temp_dirt_gravel_b"], - "road": "temp_road", - "roadWild": "temp_road_overgrown", - "shoreBlend": "temp_mud_plants", - "shore": "sand_grass_25", - "water": "medit_sand_wet" - }; + g_BiomeID = biomeID; - if (randBool()) - { - g_Terrains.mainTerrain = "alpine_grass"; - g_Terrains.forestFloor1 = "temp_forestfloor_pine"; - g_Terrains.forestFloor2 = "temp_grass_clovers_2"; - g_Terrains.tier1Terrain = "alpine_grass_a"; - g_Terrains.tier2Terrain = "alpine_grass_b"; - g_Terrains.tier3Terrain = "alpine_grass_c"; - g_Terrains.tier4Terrain = "temp_grass_mossy"; - } - else - { - g_Terrains.mainTerrain = "temp_grass_long_b"; - g_Terrains.forestFloor1 = "temp_forestfloor_pine"; - g_Terrains.forestFloor2 = "temp_plants_bog"; - g_Terrains.tier1Terrain = "temp_grass_d"; - g_Terrains.tier2Terrain = "temp_grass_c"; - g_Terrains.tier3Terrain = "temp_grass_clovers_2"; - g_Terrains.tier4Terrain = "temp_grass_plants"; - } + loadBiomeFile("biomes/" + biomeID); - g_Gaia = { - "fruitBush": "gaia/flora_bush_berry", - "chicken": "gaia/fauna_chicken", - "fish": "gaia/fauna_fish", - "mainHuntableAnimal": "gaia/fauna_deer", - "secondaryHuntableAnimal": "gaia/fauna_sheep", - "stoneLarge": "gaia/geology_stonemine_temperate_quarry", - "stoneSmall": "gaia/geology_stone_temperate", - "metalLarge": "gaia/geology_metal_temperate_slabs" - }; + let setupBiomeFunc = global["setupBiome_" + biomeID]; + if (setupBiomeFunc) + setupBiomeFunc(); +} - var random_trees = randIntInclusive(1, 3); - if (random_trees == 1) - { - g_Gaia.tree1 = "gaia/flora_tree_oak"; - g_Gaia.tree2 = "gaia/flora_tree_oak_large"; - } - else if (random_trees == 2) - { - g_Gaia.tree1 = "gaia/flora_tree_poplar"; - g_Gaia.tree2 = "gaia/flora_tree_poplar"; - } - else - { - g_Gaia.tree1 = "gaia/flora_tree_euro_beech"; - g_Gaia.tree2 = "gaia/flora_tree_euro_beech"; - } - g_Gaia.tree3 = "gaia/flora_tree_apple"; - random_trees = randIntInclusive(1, 3); - if (random_trees == 1) - { - g_Gaia.tree4 = "gaia/flora_tree_pine"; - g_Gaia.tree5 = "gaia/flora_tree_aleppo_pine"; - } - else if (random_trees == 2) - { - g_Gaia.tree4 = "gaia/flora_tree_pine"; - g_Gaia.tree5 = "gaia/flora_tree_pine"; - } - else - { - g_Gaia.tree4 = "gaia/flora_tree_aleppo_pine"; - g_Gaia.tree5 = "gaia/flora_tree_aleppo_pine"; - } +function loadBiomeFile(file) +{ + let path = "maps/random/rmbiome/" + file + ".json"; - g_Decoratives = { - "grass": "actor|props/flora/grass_soft_large_tall.xml", - "grassShort": "actor|props/flora/grass_soft_large.xml", - "reeds": "actor|props/flora/reeds_pond_lush_a.xml", - "lillies": "actor|props/flora/water_lillies.xml", - "rockLarge": "actor|geology/stone_granite_large.xml", - "rockMedium": "actor|geology/stone_granite_med.xml", - "bushMedium": "actor|props/flora/bush_medit_me.xml", - "bushSmall": "actor|props/flora/bush_medit_sm.xml", - "tree": "actor|flora/trees/oak.xml" - }; - } - else if (g_BiomeID == g_BiomeSnowy) + if (!RMS.FileExists(path)) { - setSunColor(0.550, 0.601, 0.644); // a little darker - // Water is a semi-deep blue, fairly wavy, fairly murky for an ocean. - // this assumes ocean settings, maps that aren't oceans should reset. - setWaterColor(0.067, 0.212, 0.361); - setWaterTint(0.4, 0.486, 0.765); - setWaterWaviness(5.5); - setWaterMurkiness(0.83); - - g_Terrains = { - "mainTerrain": ["polar_snow_b", "snow grass 75", "snow rocks", "snow forest"], - "forestFloor1": "polar_tundra_snow", - "forestFloor2": "polar_tundra_snow", - "cliff": ["alpine_cliff_a", "alpine_cliff_b"], - "tier1Terrain": "polar_snow_a", - "tier2Terrain": "polar_ice_snow", - "tier3Terrain": "polar_ice", - "tier4Terrain": "snow grass 2", - "hill": ["polar_snow_rocks", "polar_cliff_snow"], - "dirt": "snow grass 2", - "road": "new_alpine_citytile", - "roadWild": "polar_ice_cracked", - "shoreBlend": "polar_ice", - "shore": "alpine_shore_rocks_icy", - "water": "alpine_shore_rocks" - }; - - g_Gaia = { - "tree1": "gaia/flora_tree_pine_w", - "tree2": "gaia/flora_tree_pine_w", - "tree3": "gaia/flora_tree_pine_w", - "tree4": "gaia/flora_tree_pine_w", - "tree5": "gaia/flora_tree_pine", - "fruitBush": "gaia/flora_bush_berry", - "chicken": "gaia/fauna_chicken", - "mainHuntableAnimal": "gaia/fauna_muskox", - "fish": "gaia/fauna_fish_tuna", - "secondaryHuntableAnimal": "gaia/fauna_walrus", - "stoneLarge": "gaia/geology_stonemine_alpine_quarry", - "stoneSmall": "gaia/geology_stone_alpine_a", - "metalLarge": "gaia/geology_metal_alpine_slabs" - }; - - g_Decoratives = { - "grass": "actor|props/flora/grass_soft_dry_small_tall.xml", - "grassShort": "actor|props/flora/grass_soft_dry_large.xml", - "reeds": "actor|props/flora/reeds_pond_dry.xml", - "lillies": "actor|geology/stone_granite_large.xml", - "rockLarge": "actor|geology/stone_granite_large.xml", - "rockMedium": "actor|geology/stone_granite_med.xml", - "bushMedium": "actor|props/flora/bush_desert_dry_a.xml", - "bushSmall": "actor|props/flora/bush_desert_dry_a.xml", - "tree": "actor|flora/trees/pine_w.xml" - }; - - setFogFactor(0.6); - setFogThickness(0.21); - setPPSaturation(0.37); - setPPEffect("hdr"); + error("Could not load biome file '" + file + "'"); + return; } - else if (g_BiomeID == g_BiomeDesert) - { - setSunColor(0.733, 0.746, 0.574); - // Went for a very clear, slightly blue-ish water in this case, basically no waves. - setWaterColor(0, 0.227, 0.843); - setWaterTint(0, 0.545, 0.859); - setWaterWaviness(1); - setWaterMurkiness(0.22); - - setFogFactor(0.5); - setFogThickness(0.0); - setFogColor(0.852, 0.746, 0.493); - - setPPEffect("hdr"); - setPPContrast(0.67); - setPPSaturation(0.42); - setPPBloom(0.23); - - g_Terrains = { - "mainTerrain": ["desert_dirt_rough", "desert_dirt_rough_2", "desert_sand_dunes_50", "desert_sand_smooth"], - "forestFloor1": "forestfloor_dirty", - "forestFloor2": "desert_forestfloor_palms", - "cliff": ["desert_cliff_1", "desert_cliff_2", "desert_cliff_3", "desert_cliff_4", "desert_cliff_5"], - "tier1Terrain": "desert_dirt_rough", - "tier2Terrain": "desert_dirt_rocks_1", - "tier3Terrain": "desert_dirt_rocks_2", - "tier4Terrain": "desert_dirt_rough", - "hill": ["desert_dirt_rocks_1", "desert_dirt_rocks_2", "desert_dirt_rocks_3"], - "dirt": ["desert_lakebed_dry", "desert_lakebed_dry_b"], - "road": "desert_city_tile", - "roadWild": "desert_city_tile", - "shoreBlend": "desert_shore_stones", - "shore": "desert_sand_smooth", - "water": "desert_sand_wet" - }; - - g_Gaia = { - "fruitBush": "gaia/flora_bush_grapes", - "chicken": "gaia/fauna_chicken", - "mainHuntableAnimal": "gaia/fauna_camel", - "fish": "gaia/fauna_fish", - "secondaryHuntableAnimal": "gaia/fauna_gazelle", - "stoneLarge": "gaia/geology_stonemine_desert_quarry", - "stoneSmall": "gaia/geology_stone_desert_small", - "metalLarge": "gaia/geology_metal_desert_slabs" - }; + let biome = RMS.ReadJSONFile(path) - if (randBool()) + let copyProperties = (from, to) => { + for (let prop in from) { - g_Gaia.tree1 = "gaia/flora_tree_cretan_date_palm_short"; - g_Gaia.tree2 = "gaia/flora_tree_cretan_date_palm_tall"; - } - else - { - g_Gaia.tree1 = "gaia/flora_tree_date_palm"; - g_Gaia.tree2 = "gaia/flora_tree_date_palm"; - } - g_Gaia.tree3 = "gaia/flora_tree_fig"; - - if (randBool()) - { - g_Gaia.tree4 = "gaia/flora_tree_tamarix"; - g_Gaia.tree5 = "gaia/flora_tree_tamarix"; - } - else - { - g_Gaia.tree4 = "gaia/flora_tree_senegal_date_palm"; - g_Gaia.tree5 = "gaia/flora_tree_senegal_date_palm"; - } - - g_Decoratives = { - "grass": "actor|props/flora/grass_soft_dry_small_tall.xml", - "grassShort": "actor|props/flora/grass_soft_dry_large.xml", - "reeds": "actor|props/flora/reeds_pond_lush_a.xml", - "lillies": "actor|props/flora/reeds_pond_lush_b.xml", - "rockLarge": "actor|geology/stone_desert_med.xml", - "rockMedium": "actor|geology/stone_desert_med.xml", - "bushMedium": "actor|props/flora/bush_desert_dry_a.xml", - "bushSmall": "actor|props/flora/bush_desert_dry_a.xml", - "tree": "actor|flora/trees/palm_date.xml" - }; - } - else if (g_BiomeID == g_BiomeAlpine) - { - // simulates an alpine lake, fairly deep. - // this is not intended for a clear running river, or even an ocean. - setWaterColor(0.0, 0.047, 0.286); // dark majestic blue - setWaterTint(0.471, 0.776, 0.863); // light blue - setWaterMurkiness(0.82); - setWaterWaviness(2); - - setFogThickness(0.26); - setFogFactor(0.4); - - setPPEffect("hdr"); - setPPSaturation(0.48); - setPPContrast(0.53); - setPPBloom(0.12); - - g_Terrains = { - "mainTerrain": ["alpine_dirt_grass_50"], - "forestFloor1": "alpine_forrestfloor", - "forestFloor2": "alpine_forrestfloor", - "cliff": ["alpine_cliff_a", "alpine_cliff_b", "alpine_cliff_c"], - "tier1Terrain": "alpine_dirt", - "tier2Terrain": ["alpine_grass_snow_50", "alpine_dirt_snow", "alpine_dirt_snow"], - "tier3Terrain": ["alpine_snow_a", "alpine_snow_b"], - "tier4Terrain": "new_alpine_grass_a", - "hill": "alpine_cliff_snow", - "dirt": ["alpine_dirt", "alpine_grass_d"], - "road": "new_alpine_citytile", - "roadWild": "new_alpine_citytile", - "shoreBlend": "alpine_shore_rocks", - "shore": "alpine_shore_rocks_grass_50", - "water": "alpine_shore_rocks" - }; - - g_Gaia = { - "tree1": "gaia/flora_tree_pine", - "tree2": "gaia/flora_tree_pine", - "tree3": "gaia/flora_tree_pine", - "tree4": "gaia/flora_tree_pine", - "tree5": "gaia/flora_tree_pine", - "fruitBush": "gaia/flora_bush_berry", - "chicken": "gaia/fauna_chicken", - "mainHuntableAnimal": "gaia/fauna_goat", - "fish": "gaia/fauna_fish_tuna", - "secondaryHuntableAnimal": "gaia/fauna_deer", - "stoneLarge": "gaia/geology_stonemine_alpine_quarry", - "stoneSmall": "gaia/geology_stone_alpine_a", - "metalLarge": "gaia/geology_metal_alpine_slabs" - }; - - g_Decoratives = { - "grass": "actor|props/flora/grass_soft_small_tall.xml", - "grassShort": "actor|props/flora/grass_soft_large.xml", - "reeds": "actor|props/flora/reeds_pond_dry.xml", - "lillies": "actor|geology/stone_granite_large.xml", - "rockLarge": "actor|geology/stone_granite_large.xml", - "rockMedium": "actor|geology/stone_granite_med.xml", - "bushMedium": "actor|props/flora/bush_desert_a.xml", - "bushSmall": "actor|props/flora/bush_desert_a.xml", - "tree": "actor|flora/trees/pine.xml" - }; - } - else if (g_BiomeID == g_BiomeMediterranean) - { - // Guess what, this is based on the colors of the mediterranean sea. - setWaterColor(0.024,0.212,0.024); - setWaterTint(0.133, 0.725,0.855); - setWaterWaviness(3); - setWaterMurkiness(0.8); - - setFogFactor(0.3); - setFogThickness(0.25); - - setPPEffect("hdr"); - setPPContrast(0.62); - setPPSaturation(0.51); - setPPBloom(0.12); - - g_Terrains = { - "mainTerrain": ["medit_grass_field_a", "medit_grass_field_b"], - "forestFloor1": "medit_grass_field", - "forestFloor2": "medit_grass_shrubs", - "cliff": ["medit_cliff_grass", "medit_cliff_greek", "medit_cliff_greek_2", "medit_cliff_aegean", "medit_cliff_italia", "medit_cliff_italia_grass"], - "tier1Terrain": "medit_grass_field_b", - "tier2Terrain": "medit_grass_field_brown", - "tier3Terrain": "medit_grass_field_dry", - "tier4Terrain": "medit_grass_wild", - "hill": ["medit_rocks_grass_shrubs", "medit_rocks_shrubs"], - "dirt": ["medit_dirt", "medit_dirt_b"], - "road": "medit_city_tile", - "roadWild": "medit_city_tile", - "shoreBlend": "medit_sand", - "shore": "sand_grass_25", - "water": "medit_sand_wet" - }; - - g_Gaia = { - "chicken": "gaia/fauna_chicken", - "mainHuntableAnimal": "gaia/fauna_deer", - "fish": "gaia/fauna_fish", - "secondaryHuntableAnimal": "gaia/fauna_sheep", - "stoneLarge": "gaia/geology_stonemine_medit_quarry", - "stoneSmall": "gaia/geology_stone_mediterranean", - "metalLarge": "gaia/geology_metal_mediterranean_slabs" - }; - - var random_trees = randIntInclusive(1, 3); - if (random_trees == 1) - { - g_Gaia.tree1 = "gaia/flora_tree_cretan_date_palm_short"; - g_Gaia.tree2 = "gaia/flora_tree_cretan_date_palm_tall"; - } - else if (random_trees == 2) - { - g_Gaia.tree1 = "gaia/flora_tree_carob"; - g_Gaia.tree2 = "gaia/flora_tree_carob"; - } - else - { - g_Gaia.tree1 = "gaia/flora_tree_medit_fan_palm"; - g_Gaia.tree2 = "gaia/flora_tree_medit_fan_palm"; - } + if (typeof from[prop] == "object" && !Array.isArray(from[prop])) + { + if (!to[prop]) + to[prop] = {}; - if (randBool()) - g_Gaia.tree3 = "gaia/flora_tree_apple"; - else - g_Gaia.tree3 = "gaia/flora_tree_poplar_lombardy"; - - if (randBool()) - { - g_Gaia.tree4 = "gaia/flora_tree_cypress"; - g_Gaia.tree5 = "gaia/flora_tree_cypress"; - } - else - { - g_Gaia.tree4 = "gaia/flora_tree_aleppo_pine"; - g_Gaia.tree5 = "gaia/flora_tree_aleppo_pine"; + copyProperties(from[prop], to[prop]); + } + else + to[prop] = from[prop]; } + }; - if (randBool()) - g_Gaia.fruitBush = "gaia/flora_bush_berry"; - else - g_Gaia.fruitBush = "gaia/flora_bush_grapes"; - - g_Decoratives = { - "grass": "actor|props/flora/grass_soft_large_tall.xml", - "grassShort": "actor|props/flora/grass_soft_large.xml", - "reeds": "actor|props/flora/reeds_pond_lush_b.xml", - "lillies": "actor|props/flora/water_lillies.xml", - "rockLarge": "actor|geology/stone_granite_large.xml", - "rockMedium": "actor|geology/stone_granite_med.xml", - "bushMedium": "actor|props/flora/bush_medit_me.xml", - "bushSmall": "actor|props/flora/bush_medit_sm.xml", - "tree": "actor|flora/trees/palm_cretan_date.xml" - }; - } - else if (g_BiomeID == g_BiomeSavanna) - { - // Using the Malawi as a reference, in parts where it's not too murky from a river nearby. - setWaterColor(0.055,0.176,0.431); - setWaterTint(0.227,0.749,0.549); - setWaterWaviness(1.5); - setWaterMurkiness(0.77); - - setFogFactor(0.25); - setFogThickness(0.15); - setFogColor(0.847059, 0.737255, 0.482353); - - setPPEffect("hdr"); - setPPContrast(0.57031); - setPPBloom(0.34); - - g_Terrains = { - "mainTerrain": ["savanna_grass_a", "savanna_grass_b"], - "forestFloor1": "savanna_forestfloor_a", - "forestFloor2": "savanna_forestfloor_b", - "cliff": ["savanna_cliff_a", "savanna_cliff_b"], - "tier1Terrain": "savanna_shrubs_a", - "tier2Terrain": "savanna_dirt_rocks_b", - "tier3Terrain": "savanna_dirt_rocks_a", - "tier4Terrain": "savanna_grass_a", - "hill": ["savanna_grass_a", "savanna_grass_b"], - "dirt": ["savanna_dirt_rocks_b", "dirt_brown_e"], - "road": "savanna_tile_a", - "roadWild": "savanna_tile_a", - "shoreBlend": "savanna_riparian", - "shore": "savanna_riparian_bank", - "water": "savanna_riparian_wet" - }; - - g_Gaia = { - "tree1": "gaia/flora_tree_baobab", - "tree2": "gaia/flora_tree_baobab", - "tree3": "gaia/flora_tree_baobab", - "tree4": "gaia/flora_tree_baobab", - "tree5": "gaia/flora_tree_baobab", - "fruitBush": "gaia/flora_bush_grapes", - "chicken": "gaia/fauna_chicken", - "fish": "gaia/fauna_fish", - "mainHuntableAnimal": pickRandom([ - "gaia/fauna_wildebeest", - "gaia/fauna_zebra", - "gaia/fauna_giraffe", - "gaia/fauna_elephant_african_bush" - ]), - "secondaryHuntableAnimal": "gaia/fauna_gazelle", - "stoneLarge": "gaia/geology_stonemine_desert_quarry", - "stoneSmall": "gaia/geology_stone_savanna_small", - "metalLarge": "gaia/geology_metal_savanna_slabs" - }; - - g_Decoratives = { - "grass": "actor|props/flora/grass_savanna.xml", - "grassShort": "actor|props/flora/grass_medit_field.xml", - "reeds": "actor|props/flora/reeds_pond_lush_a.xml", - "lillies": "actor|props/flora/reeds_pond_lush_b.xml", - "rockLarge": "actor|geology/stone_savanna_med.xml", - "rockMedium": "actor|geology/stone_savanna_med.xml", - "bushMedium": "actor|props/flora/bush_desert_dry_a.xml", - "bushSmall": "actor|props/flora/bush_dry_a.xml", - "tree": "actor|flora/trees/baobab.xml" - }; - - g_TreeCount = { - "minTrees": 200, - "maxTrees": 1250, - "forestProbability": 0 - }; - } - else if (g_BiomeID == g_BiomeTropic) - { - // Bora-Bora ish. Quite transparent, not wavy. - // Mostly for shallow maps. Maps where the water level goes deeper should use a much darker Water Color to simulate deep water holes. - setWaterColor(0.584,0.824,0.929); - setWaterTint(0.569,0.965,0.945); - setWaterWaviness(1.5); - setWaterMurkiness(0.35); - - setFogFactor(0.4); - setFogThickness(0.2); - - setPPEffect("hdr"); - setPPContrast(0.67); - setPPSaturation(0.62); - setPPBloom(0.6); - - g_Terrains = { - "mainTerrain": ["tropic_grass_c", "tropic_grass_c", "tropic_grass_c", "tropic_grass_c", "tropic_grass_plants", "tropic_plants", "tropic_plants_b"], - "forestFloor1": "tropic_plants_c", - "forestFloor2": "tropic_plants_c", - "cliff": ["tropic_cliff_a", "tropic_cliff_a", "tropic_cliff_a", "tropic_cliff_a_plants"], - "tier1Terrain": "tropic_grass_c", - "tier2Terrain": "tropic_grass_plants", - "tier3Terrain": "tropic_plants", - "tier4Terrain": "tropic_plants_b", - "hill": ["tropic_cliff_grass"], - "dirt": ["tropic_dirt_a", "tropic_dirt_a_plants"], - "road": "tropic_citytile_a", - "roadWild": "tropic_citytile_plants", - "shoreBlend": "temp_mud_plants", - "shore": "tropic_beach_dry_plants", - "water": "tropic_beach_dry" - }; - - g_Gaia = { - "tree1": "gaia/flora_tree_toona", - "tree2": "gaia/flora_tree_toona", - "tree3": "gaia/flora_tree_palm_tropic", - "tree4": "gaia/flora_tree_palm_tropic", - "tree5": "gaia/flora_tree_palm_tropic", - "fruitBush": "gaia/flora_bush_berry", - "chicken": "gaia/fauna_chicken", - "mainHuntableAnimal": "gaia/fauna_peacock", - "fish": "gaia/fauna_fish", - "secondaryHuntableAnimal": "gaia/fauna_tiger", - "stoneLarge": "gaia/geology_stonemine_tropic_quarry", - "stoneSmall": "gaia/geology_stone_tropic_a", - "metalLarge": "gaia/geology_metal_tropic_slabs" - }; - - g_Decoratives = { - "grass": "actor|props/flora/plant_tropic_a.xml", - "grassShort": "actor|props/flora/plant_lg.xml", - "reeds": "actor|props/flora/reeds_pond_lush_b.xml", - "lillies": "actor|props/flora/water_lillies.xml", - "rockLarge": "actor|geology/stone_granite_large.xml", - "rockMedium": "actor|geology/stone_granite_med.xml", - "bushMedium": "actor|props/flora/plant_tropic_large.xml", - "bushSmall": "actor|props/flora/plant_tropic_large.xml", - "tree": "actor|flora/trees/tree_tropic.xml" - }; - - g_TreeCount = { - "minTrees": 1000, - "maxTrees": 6000, - "forestProbabilityp": 0.52 - }; - } - else if (g_BiomeID == g_BiomeAutumn) - { - // basically temperate with a reddish twist in the reflection and the tint. Also less wavy. - // this assumes ocean settings, maps that aren't oceans should reset. - setWaterColor(0.157, 0.149, 0.443); - setWaterTint(0.443,0.42,0.824); - setWaterWaviness(2.5); - setWaterMurkiness(0.83); - - setFogFactor(0.35); - setFogThickness(0.22); - setFogColor(0.82,0.82, 0.73); - setPPSaturation(0.56); - setPPContrast(0.56); - setPPBloom(0.38); - setPPEffect("hdr"); - - g_Terrains = { - "mainTerrain": ["temp_grass_aut", "temp_grass_aut", "temp_grass_d_aut"], - "forestFloor1": "temp_plants_bog_aut", - "forestFloor2": "temp_forestfloor_aut", - "cliff": ["temp_cliff_a", "temp_cliff_b"], - "tier1Terrain": "temp_grass_plants_aut", - "tier2Terrain": ["temp_grass_b_aut", "temp_grass_c_aut"], - "tier3Terrain": ["temp_grass_b_aut", "temp_grass_long_b_aut"], - "tier4Terrain": "temp_grass_plants_aut", - "hill": "temp_highlands_aut", - "dirt": ["temp_cliff_a", "temp_cliff_b"], - "road": "temp_road_aut", - "roadWild": "temp_road_overgrown_aut", - "shoreBlend": "temp_grass_plants_aut", - "shore": "temp_forestfloor_pine", - "water": "medit_sand_wet" - }; - - g_Gaia = { - "tree1": "gaia/flora_tree_euro_beech_aut", - "tree2": "gaia/flora_tree_euro_beech_aut", - "tree3": "gaia/flora_tree_pine", - "tree4": "gaia/flora_tree_oak_aut", - "tree5": "gaia/flora_tree_oak_aut", - "fruitBush": "gaia/flora_bush_berry", - "chicken": "gaia/fauna_chicken", - "mainHuntableAnimal": "gaia/fauna_deer", - "fish": "gaia/fauna_fish", - "secondaryHuntableAnimal": "gaia/fauna_rabbit", - "stoneLarge": "gaia/geology_stonemine_temperate_quarry", - "stoneSmall": "gaia/geology_stone_temperate", - "metalLarge": "gaia/geology_metal_temperate_slabs" - }; - - g_Decoratives = { - "grass": "actor|props/flora/grass_soft_dry_small_tall.xml", - "grassShort": "actor|props/flora/grass_soft_dry_large.xml", - "reeds": "actor|props/flora/reeds_pond_dry.xml", - "lillies": "actor|geology/stone_granite_large.xml", - "rockLarge": "actor|geology/stone_granite_large.xml", - "rockMedium": "actor|geology/stone_granite_med.xml", - "bushMedium": "actor|props/flora/bush_desert_dry_a.xml", - "bushSmall": "actor|props/flora/bush_desert_dry_a.xml", - "tree": "actor|flora/trees/european_beech_aut.xml" - }; - } + for (let rmsGlobal in biome) + copyProperties(biome[rmsGlobal], global["g_" + rmsGlobal]); } function rBiomeTreeCount(multiplier = 1) { return [ g_TreeCount.minTrees * multiplier, g_TreeCount.maxTrees * multiplier, g_TreeCount.forestProbability ]; } function rBiomeT1() { return g_Terrains.mainTerrain; } function rBiomeT2() { return g_Terrains.forestFloor1; } function rBiomeT3() { return g_Terrains.forestFloor2; } function rBiomeT4() { return g_Terrains.cliff; } function rBiomeT5() { return g_Terrains.tier1Terrain; } function rBiomeT6() { return g_Terrains.tier2Terrain; } function rBiomeT7() { return g_Terrains.tier3Terrain; } function rBiomeT8() { return g_Terrains.hill; } function rBiomeT9() { return g_Terrains.dirt; } function rBiomeT10() { return g_Terrains.road; } function rBiomeT11() { return g_Terrains.roadWild; } function rBiomeT12() { return g_Terrains.tier4Terrain; } function rBiomeT13() { return g_Terrains.shoreBlend; } function rBiomeT14() { return g_Terrains.shore; } function rBiomeT15() { return g_Terrains.water; } function rBiomeE1() { return g_Gaia.tree1; } function rBiomeE2() { return g_Gaia.tree2; } function rBiomeE3() { return g_Gaia.tree3; } function rBiomeE4() { return g_Gaia.tree4; } function rBiomeE5() { return g_Gaia.tree5; } function rBiomeE6() { return g_Gaia.fruitBush; } function rBiomeE7() { return g_Gaia.chicken; } function rBiomeE8() { return g_Gaia.mainHuntableAnimal; } function rBiomeE9() { return g_Gaia.fish; } function rBiomeE10() { return g_Gaia.secondaryHuntableAnimal; } function rBiomeE11() { return g_Gaia.stoneLarge; } function rBiomeE12() { return g_Gaia.stoneSmall; } function rBiomeE13() { return g_Gaia.metalLarge; } function rBiomeA1() { return g_Decoratives.grass; } function rBiomeA2() { return g_Decoratives.grassShort; } function rBiomeA3() { return g_Decoratives.reeds; } function rBiomeA4() { return g_Decoratives.lillies; } function rBiomeA5() { return g_Decoratives.rockLarge; } function rBiomeA6() { return g_Decoratives.rockMedium; } function rBiomeA7() { return g_Decoratives.bushMedium; } function rBiomeA8() { return g_Decoratives.bushSmall; } function rBiomeA9() { return g_Decoratives.tree; } Index: ps/trunk/source/graphics/MapGenerator.cpp =================================================================== --- ps/trunk/source/graphics/MapGenerator.cpp (revision 20128) +++ ps/trunk/source/graphics/MapGenerator.cpp (revision 20129) @@ -1,314 +1,330 @@ /* Copyright (C) 2017 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * 0 A.D. is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with 0 A.D. If not, see . */ #include "precompiled.h" #include "MapGenerator.h" #include "lib/timer.h" #include "ps/CLogger.h" #include "ps/Profile.h" // TODO: what's a good default? perhaps based on map size #define RMS_RUNTIME_SIZE 96 * 1024 * 1024 CMapGeneratorWorker::CMapGeneratorWorker() { // If something happens before we initialize, that's a failure m_Progress = -1; } CMapGeneratorWorker::~CMapGeneratorWorker() { // Wait for thread to end pthread_join(m_WorkerThread, NULL); } void CMapGeneratorWorker::Initialize(const VfsPath& scriptFile, const std::string& settings) { CScopeLock lock(m_WorkerMutex); // Set progress to positive value m_Progress = 1; m_ScriptPath = scriptFile; m_Settings = settings; // Launch the worker thread int ret = pthread_create(&m_WorkerThread, NULL, &RunThread, this); ENSURE(ret == 0); } void* CMapGeneratorWorker::RunThread(void *data) { debug_SetThreadName("MapGenerator"); g_Profiler2.RegisterCurrentThread("MapGenerator"); CMapGeneratorWorker* self = static_cast(data); self->m_ScriptInterface = new ScriptInterface("RMS", "MapGenerator", ScriptInterface::CreateRuntime(g_ScriptRuntime, RMS_RUNTIME_SIZE)); // Run map generation scripts if (!self->Run() || self->m_Progress > 0) { // Don't leave progress in an unknown state, if generator failed, set it to -1 CScopeLock lock(self->m_WorkerMutex); self->m_Progress = -1; } // At this point the random map scripts are done running, so the thread has no further purpose // and can die. The data will be stored in m_MapData already if successful, or m_Progress // will contain an error value on failure. return NULL; } bool CMapGeneratorWorker::Run() { // We must destroy the ScriptInterface in the same thread because the JSAPI requires that! // Also we must not be in a request when calling the ScriptInterface destructor, so the autoFree object // must be instantiated before the request (destructors are called in reverse order of instantiation) struct AutoFree { AutoFree(ScriptInterface* p) : m_p(p) {} ~AutoFree() { SAFE_DELETE(m_p); } ScriptInterface* m_p; } autoFree(m_ScriptInterface); JSContext* cx = m_ScriptInterface->GetContext(); JSAutoRequest rq(cx); m_ScriptInterface->SetCallbackData(static_cast (this)); // Replace RNG with a seeded deterministic function m_ScriptInterface->ReplaceNondeterministicRNG(m_MapGenRNG); m_ScriptInterface->LoadGlobalScripts(); // Functions for RMS m_ScriptInterface->RegisterFunction("LoadLibrary"); m_ScriptInterface->RegisterFunction("ExportMap"); m_ScriptInterface->RegisterFunction("SetProgress"); m_ScriptInterface->RegisterFunction("MaybeGC"); + m_ScriptInterface->RegisterFunction("FileExists"); + m_ScriptInterface->RegisterFunction ("ReadJSONFile"); m_ScriptInterface->RegisterFunction, CMapGeneratorWorker::GetCivData>("GetCivData"); m_ScriptInterface->RegisterFunction("GetTemplate"); m_ScriptInterface->RegisterFunction("TemplateExists"); m_ScriptInterface->RegisterFunction, std::string, bool, CMapGeneratorWorker::FindTemplates>("FindTemplates"); m_ScriptInterface->RegisterFunction, std::string, bool, CMapGeneratorWorker::FindActorTemplates>("FindActorTemplates"); // Parse settings JS::RootedValue settingsVal(cx); if (!m_ScriptInterface->ParseJSON(m_Settings, &settingsVal) && settingsVal.isUndefined()) { LOGERROR("CMapGeneratorWorker::Run: Failed to parse settings"); return false; } // Init RNG seed u32 seed = 0; if (!m_ScriptInterface->HasProperty(settingsVal, "Seed") || !m_ScriptInterface->GetProperty(settingsVal, "Seed", seed)) LOGWARNING("CMapGeneratorWorker::Run: No seed value specified - using 0"); m_MapGenRNG.seed(seed); // Copy settings to global variable JS::RootedValue global(cx, m_ScriptInterface->GetGlobalObject()); if (!m_ScriptInterface->SetProperty(global, "g_MapSettings", settingsVal)) { LOGERROR("CMapGeneratorWorker::Run: Failed to define g_MapSettings"); return false; } // Load RMS LOGMESSAGE("Loading RMS '%s'", m_ScriptPath.string8()); if (!m_ScriptInterface->LoadGlobalScriptFile(m_ScriptPath)) { LOGERROR("CMapGeneratorWorker::Run: Failed to load RMS '%s'", m_ScriptPath.string8()); return false; } return true; } int CMapGeneratorWorker::GetProgress() { CScopeLock lock(m_WorkerMutex); return m_Progress; } shared_ptr CMapGeneratorWorker::GetResults() { CScopeLock lock(m_WorkerMutex); return m_MapData; } bool CMapGeneratorWorker::LoadLibrary(ScriptInterface::CxPrivate* pCxPrivate, const std::wstring& name) { CMapGeneratorWorker* self = static_cast(pCxPrivate->pCBData); return self->LoadScripts(name); } void CMapGeneratorWorker::ExportMap(ScriptInterface::CxPrivate* pCxPrivate, JS::HandleValue data) { CMapGeneratorWorker* self = static_cast(pCxPrivate->pCBData); // Copy results CScopeLock lock(self->m_WorkerMutex); self->m_MapData = self->m_ScriptInterface->WriteStructuredClone(data); self->m_Progress = 0; } void CMapGeneratorWorker::SetProgress(ScriptInterface::CxPrivate* pCxPrivate, int progress) { CMapGeneratorWorker* self = static_cast(pCxPrivate->pCBData); // Copy data CScopeLock lock(self->m_WorkerMutex); self->m_Progress = progress; } void CMapGeneratorWorker::MaybeGC(ScriptInterface::CxPrivate* pCxPrivate) { CMapGeneratorWorker* self = static_cast(pCxPrivate->pCBData); self->m_ScriptInterface->MaybeGC(); } +bool CMapGeneratorWorker::FileExists(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const std::wstring& filePath) +{ + return g_VFS->GetFileInfo(filePath, 0) == INFO::OK; +} + +JS::Value CMapGeneratorWorker::ReadJSONFile(ScriptInterface::CxPrivate* pCxPrivate, const std::wstring& filePath) +{ + JSContext* cx = pCxPrivate->pScriptInterface->GetContext(); + JSAutoRequest rq(cx); + JS::RootedValue out(cx); + pCxPrivate->pScriptInterface->ReadJSONFile(filePath, &out); + return out; +} + std::vector CMapGeneratorWorker::GetCivData(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) { VfsPath path(L"simulation/data/civs/"); VfsPaths pathnames; std::vector data; // Load all JSON files in civs directory Status ret = vfs::GetPathnames(g_VFS, path, L"*.json", pathnames); if (ret == INFO::OK) { for (const VfsPath& p : pathnames) { // Load JSON file CVFSFile file; PSRETURN ret = file.Load(g_VFS, p); if (ret != PSRETURN_OK) LOGERROR("CMapGeneratorWorker::GetCivData: Failed to load file '%s': %s", p.string8(), GetErrorString(ret)); else data.push_back(file.DecodeUTF8()); // assume it's UTF-8 } } else { // Some error reading directory wchar_t error[200]; LOGERROR("CMapGeneratorWorker::GetCivData: Error reading directory '%s': %s", path.string8(), utf8_from_wstring(StatusDescription(ret, error, ARRAY_SIZE(error)))); } return data; } CParamNode CMapGeneratorWorker::GetTemplate(ScriptInterface::CxPrivate* pCxPrivate, const std::string& templateName) { CMapGeneratorWorker* self = static_cast(pCxPrivate->pCBData); const CParamNode& templateRoot = self->m_TemplateLoader.GetTemplateFileData(templateName).GetChild("Entity"); if (!templateRoot.IsOk()) LOGERROR("Invalid template found for '%s'", templateName.c_str()); return templateRoot; } bool CMapGeneratorWorker::TemplateExists(ScriptInterface::CxPrivate* pCxPrivate, const std::string& templateName) { CMapGeneratorWorker* self = static_cast(pCxPrivate->pCBData); return self->m_TemplateLoader.TemplateExists(templateName); } std::vector CMapGeneratorWorker::FindTemplates(ScriptInterface::CxPrivate* pCxPrivate, const std::string& path, bool includeSubdirectories) { CMapGeneratorWorker* self = static_cast(pCxPrivate->pCBData); return self->m_TemplateLoader.FindTemplates(path, includeSubdirectories, SIMULATION_TEMPLATES); } std::vector CMapGeneratorWorker::FindActorTemplates(ScriptInterface::CxPrivate* pCxPrivate, const std::string& path, bool includeSubdirectories) { CMapGeneratorWorker* self = static_cast(pCxPrivate->pCBData); return self->m_TemplateLoader.FindTemplates(path, includeSubdirectories, ACTOR_TEMPLATES); } bool CMapGeneratorWorker::LoadScripts(const std::wstring& libraryName) { // Ignore libraries that are already loaded if (m_LoadedLibraries.find(libraryName) != m_LoadedLibraries.end()) return true; // Mark this as loaded, to prevent it recursively loading itself m_LoadedLibraries.insert(libraryName); VfsPath path = L"maps/random/" + libraryName + L"/"; VfsPaths pathnames; // Load all scripts in mapgen directory Status ret = vfs::GetPathnames(g_VFS, path, L"*.js", pathnames); if (ret == INFO::OK) { for (const VfsPath& p : pathnames) { LOGMESSAGE("Loading map generator script '%s'", p.string8()); if (!m_ScriptInterface->LoadGlobalScriptFile(p)) { LOGERROR("CMapGeneratorWorker::LoadScripts: Failed to load script '%s'", p.string8()); return false; } } } else { // Some error reading directory wchar_t error[200]; LOGERROR("CMapGeneratorWorker::LoadScripts: Error reading scripts in directory '%s': %s", path.string8(), utf8_from_wstring(StatusDescription(ret, error, ARRAY_SIZE(error)))); return false; } return true; } ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// CMapGenerator::CMapGenerator() : m_Worker(new CMapGeneratorWorker()) { } CMapGenerator::~CMapGenerator() { delete m_Worker; } void CMapGenerator::GenerateMap(const VfsPath& scriptFile, const std::string& settings) { m_Worker->Initialize(scriptFile, settings); } int CMapGenerator::GetProgress() { return m_Worker->GetProgress(); } shared_ptr CMapGenerator::GetResults() { return m_Worker->GetResults(); } Index: ps/trunk/source/graphics/MapGenerator.h =================================================================== --- ps/trunk/source/graphics/MapGenerator.h (revision 20128) +++ ps/trunk/source/graphics/MapGenerator.h (revision 20129) @@ -1,152 +1,154 @@ /* Copyright (C) 2017 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * 0 A.D. is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with 0 A.D. If not, see . */ #ifndef INCLUDED_MAPGENERATOR #define INCLUDED_MAPGENERATOR #include "ps/FileIo.h" #include "ps/ThreadUtil.h" #include "ps/TemplateLoader.h" #include "scriptinterface/ScriptInterface.h" #include #include class CMapGeneratorWorker; /** * Random map generator interface. Initialized by CMapReader and then checked * periodically during loading, until it's finished (progress value is 0). * * The actual work is performed by CMapGeneratorWorker in a separate thread. */ class CMapGenerator { NONCOPYABLE(CMapGenerator); public: CMapGenerator(); ~CMapGenerator(); /** * Start the map generator thread * * @param scriptFile The VFS path for the script, e.g. "maps/random/latium.js" * @param settings JSON string containing settings for the map generator */ void GenerateMap(const VfsPath& scriptFile, const std::string& settings); /** * Get status of the map generator thread * * @return Progress percentage 1-100 if active, 0 when finished, or -1 on error */ int GetProgress(); /** * Get random map data, according to this format: * http://trac.wildfiregames.com/wiki/Random_Map_Generator_Internals#Dataformat * * @return StructuredClone containing map data */ shared_ptr GetResults(); private: CMapGeneratorWorker* m_Worker; }; /** * Random map generator worker thread. * (This is run in a thread so that the GUI remains responsive while loading) * * Thread-safety: * - Initialize and constructor/destructor must be called from the main thread. * - ScriptInterface created and destroyed by thread * - StructuredClone used to return JS map data - JS:Values can't be used across threads/runtimes. */ class CMapGeneratorWorker { public: CMapGeneratorWorker(); ~CMapGeneratorWorker(); /** * Start the map generator thread * * @param scriptFile The VFS path for the script, e.g. "maps/random/latium.js" * @param settings JSON string containing settings for the map generator */ void Initialize(const VfsPath& scriptFile, const std::string& settings); /** * Get status of the map generator thread * * @return Progress percentage 1-100 if active, 0 when finished, or -1 on error */ int GetProgress(); /** * Get random map data, according to this format: * http://trac.wildfiregames.com/wiki/Random_Map_Generator_Internals#Dataformat * * @return StructuredClone containing map data */ shared_ptr GetResults(); private: // Mapgen /** * Load all scripts of the given library * * @param libraryName String specifying name of the library (subfolder of ../maps/random/) * @return true if all scripts ran successfully, false if there's an error */ bool LoadScripts(const std::wstring& libraryName); // callbacks for script functions static bool LoadLibrary(ScriptInterface::CxPrivate* pCxPrivate, const std::wstring& name); static void ExportMap(ScriptInterface::CxPrivate* pCxPrivate, JS::HandleValue data); static void SetProgress(ScriptInterface::CxPrivate* pCxPrivate, int progress); static void MaybeGC(ScriptInterface::CxPrivate* pCxPrivate); + static bool FileExists(ScriptInterface::CxPrivate* pCxPrivate, const std::wstring& filePath); + static JS::Value ReadJSONFile(ScriptInterface::CxPrivate* pCxPrivate, const std::wstring& filePath); static std::vector GetCivData(ScriptInterface::CxPrivate* pCxPrivate); static CParamNode GetTemplate(ScriptInterface::CxPrivate* pCxPrivate, const std::string& templateName); static bool TemplateExists(ScriptInterface::CxPrivate* pCxPrivate, const std::string& templateName); static std::vector FindTemplates(ScriptInterface::CxPrivate* pCxPrivate, const std::string& path, bool includeSubdirectories); static std::vector FindActorTemplates(ScriptInterface::CxPrivate* pCxPrivate, const std::string& path, bool includeSubdirectories); std::set m_LoadedLibraries; shared_ptr m_MapData; boost::rand48 m_MapGenRNG; int m_Progress; ScriptInterface* m_ScriptInterface; VfsPath m_ScriptPath; std::string m_Settings; CTemplateLoader m_TemplateLoader; // Thread static void* RunThread(void* data); bool Run(); pthread_t m_WorkerThread; CMutex m_WorkerMutex; }; #endif //INCLUDED_MAPGENERATOR