The Backstory
Recently, I have been trying to tweak the advanced worldgen parameters to get a somewhat catered game experience.
A pet peeve of mine with smaller worlds is the options for poles in worldgen. I'm not a fan of how there isn't really any option that respects the size of the continent. What I'd really love a range of [random latitude] to [random latitude] in addition to the [north pole] to [equator], [equator] to [south pole], or [north pole] to [north pole] options we have now, but it is what it is. So instead, I wanted to go with no poles, use the 2x2 temperature mesh with temperature extremes, and chalk up the wild temperatures as just another way the world was magical. However, I was having trouble picking temperature minimums and maximums, and since I couldn't find anyone else who had done anything like this, I decided to do it myself.
Preliminary FindingsMy preliminary research told me a few things:
- The default min-max is 25-75, which on a non-polar map seemed to only make temperate and warm climates.
- Temperature Min/Max of 0 - 100 (with no poles) did not result in freezing temperatures, but did result in scorching ones.
- The data in the temperature maps output by legends is stored in the pixels of a greyscale .bmp
- The greyscale pixel values have fixed temperature representations. This is important because it means that if one map has a pixel with an RGB of 170 ea. and another map has a pixel with that same RGB value, they represent the same temperature. The alternative would be that white & black represented the minimum and maximum temperatures for one world, which doesn't tell us much.
- The range value (HSV, 0 = white, 100 = full color (in this case, black)) for non-polar worlds with Min/Max of 0-100 was about 24ish to 72ish. This told me that the range of recordable values was significantly wider than from 0-100.
The Experiment
My goal with this experiment was to understand the relationships between the climates reported in embark, the parameter values selected (for temp min and max), and the legends temperature map output value.
To do this, I created worlds with advanced worldgen, each with identical parameters, save for a few things. I tried to minimize world generation time and make the generation times consistent. To summarize, the worlds:
- are pocket worlds (17x17)
- have no megabeasts, monsters, the like
- have minimum temperature equal to maximum temperature
- have no temperature variance
- have no poles
- have world names equal to their temperature preset
- use a painted preset for terrain, with oceans on all sides, a medium elevation shoreline, and some mountain regions (so dwarves can spawn)
- have 5 civilizations
- have a history length of 2 years
[WORLD_GEN]
[TITLE:TEMP TESTING]
[DIM:17:17]
[EMBARK_POINTS:1504]
[END_YEAR:2]
[BEAST_END_YEAR:30:80]
[REVEAL_ALL_HISTORY:1]
[CULL_HISTORICAL_FIGURES:0]
[ELEVATION:1:400:401:401]
[RAINFALL:0:100:26:26]
[TEMPERATURE:0:0:0:0]
[DRAINAGE:0:100:26:26]
[VOLCANISM:0:100:26:26]
[SAVAGERY:0:100:26:26]
[ELEVATION_FREQUENCY:1:1:1:1:1:1]
[RAIN_FREQUENCY:1:1:1:1:1:1]
[DRAINAGE_FREQUENCY:1:1:1:1:1:1]
[TEMPERATURE_FREQUENCY:2:1:0:0:0:4]
[SAVAGERY_FREQUENCY:1:1:1:1:1:1]
[VOLCANISM_FREQUENCY:1:1:1:1:1:1]
[POLE:NONE]
[MINERAL_SCARCITY:2500]
[MEGABEAST_CAP:0]
[SEMIMEGABEAST_CAP:0]
[TITAN_NUMBER:0]
[TITAN_ATTACK_TRIGGER:80:0:100000]
[DEMON_NUMBER:0]
[NIGHT_TROLL_NUMBER:0]
[BOGEYMAN_NUMBER:0]
[VAMPIRE_NUMBER:0]
[WEREBEAST_NUMBER:0]
[SECRET_NUMBER:0]
[REGIONAL_INTERACTION_NUMBER:0]
[DISTURBANCE_INTERACTION_NUMBER:0]
[EVIL_CLOUD_NUMBER:0]
[EVIL_RAIN_NUMBER:0]
[GENERATE_DIVINE_MATERIALS:0]
[GOOD_SQ_COUNTS:0:0:0]
[EVIL_SQ_COUNTS:0:0:0]
[PEAK_NUMBER_MIN:0]
[PARTIAL_OCEAN_EDGE_MIN:0]
[COMPLETE_OCEAN_EDGE_MIN:4]
[VOLCANO_MIN:0]
[REGION_COUNTS:SWAMP:0:0:0]
[REGION_COUNTS:DESERT:0:0:0]
[REGION_COUNTS:FOREST:0:0:0]
[REGION_COUNTS:MOUNTAINS:0:0:0]
[REGION_COUNTS:OCEAN:0:0:0]
[REGION_COUNTS:GLACIER:0:0:0]
[REGION_COUNTS:TUNDRA:0:0:0]
[REGION_COUNTS:GRASSLAND:0:0:0]
[REGION_COUNTS:HILLS:0:0:0]
[EROSION_CYCLE_COUNT:250]
[RIVER_MINS:0:0]
[PERIODICALLY_ERODE_EXTREMES:1]
[OROGRAPHIC_PRECIPITATION:1]
[SUBREGION_MAX:2750]
[CAVERN_LAYER_COUNT:3]
[CAVERN_LAYER_OPENNESS_MIN:0]
[CAVERN_LAYER_OPENNESS_MAX:100]
[CAVERN_LAYER_PASSAGE_DENSITY_MIN:0]
[CAVERN_LAYER_PASSAGE_DENSITY_MAX:100]
[CAVERN_LAYER_WATER_MIN:0]
[CAVERN_LAYER_WATER_MAX:100]
[HAVE_BOTTOM_LAYER_1:1]
[HAVE_BOTTOM_LAYER_2:1]
[LEVELS_ABOVE_GROUND:15]
[LEVELS_ABOVE_LAYER_1:5]
[LEVELS_ABOVE_LAYER_2:1]
[LEVELS_ABOVE_LAYER_3:1]
[LEVELS_ABOVE_LAYER_4:1]
[LEVELS_ABOVE_LAYER_5:2]
[LEVELS_AT_BOTTOM:1]
[CAVE_MIN_SIZE:5]
[CAVE_MAX_SIZE:25]
[MOUNTAIN_CAVE_MIN:0]
[NON_MOUNTAIN_CAVE_MIN:0]
[ALL_CAVES_VISIBLE:1]
[SHOW_EMBARK_TUNNEL:2]
[TOTAL_CIV_NUMBER:5]
[TOTAL_CIV_POPULATION:15000]
[SITE_CAP:18]
[PLAYABLE_CIVILIZATION_REQUIRED:1]
[ELEVATION_RANGES:0:0:0]
[RAIN_RANGES:0:0:0]
[DRAINAGE_RANGES:0:0:0]
[SAVAGERY_RANGES:0:0:0]
[VOLCANISM_RANGES:0:0:0]
[PS_EL:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1]
[PS_EL:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1]
[PS_EL:1:1:1:1:1:150:150:150:150:150:150:150:1:1:1:1:1]
[PS_EL:1:1:1:1:150:150:150:150:150:150:150:150:150:1:1:1:1]
[PS_EL:1:1:1:150:150:150:225:225:225:225:225:150:150:150:1:1:1]
[PS_EL:1:1:150:150:150:225:300:300:300:300:300:225:150:150:150:1:1]
[PS_EL:1:1:150:150:225:300:300:300:300:300:300:300:225:150:150:1:1]
[PS_EL:1:1:150:150:225:300:300:350:350:350:300:300:225:150:150:1:1]
[PS_EL:1:1:150:150:225:300:300:350:400:350:300:300:225:150:150:1:1]
[PS_EL:1:1:150:150:225:300:300:350:350:350:300:300:225:150:150:1:1]
[PS_EL:1:1:150:150:225:300:300:300:300:300:300:300:225:150:150:1:1]
[PS_EL:1:1:150:150:150:225:300:300:300:300:300:225:150:150:150:1:1]
[PS_EL:1:1:1:150:150:150:225:225:225:225:225:150:150:150:1:1:1]
[PS_EL:1:1:1:1:150:150:150:150:150:150:150:150:150:1:1:1:1]
[PS_EL:1:1:1:1:1:150:150:150:150:150:150:150:1:1:1:1:1]
[PS_EL:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1]
[PS_EL:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1]
[PS_VL:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50]
[PS_VL:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50]
[PS_VL:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50]
[PS_VL:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50]
[PS_VL:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50]
[PS_VL:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50]
[PS_VL:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50]
[PS_VL:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50]
[PS_VL:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50]
[PS_VL:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50]
[PS_VL:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50]
[PS_VL:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50]
[PS_VL:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50]
[PS_VL:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50]
[PS_VL:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50]
[PS_VL:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50]
[PS_VL:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50:50]
I made 41 one of them: temperature values range from -50 to 150, spaced 5 apart.
The climate data was collected via embarking, the value and rgb data from exported temperature maps via legends.
For all cases, if multiple temperatures were available, the highest one available was used to collect data from (for all data). The reason for this will be explained in the section labeled "Additional Observations & Conclusions".
The DataTrial # | Min & Max | Climate | Value | RGB |
1 | -50 | Freezing | 0 | 0 |
2 | -45 | Freezing | 2 | 6 |
3 | -40 | Freezing | 4 | 12 |
4 | -35 | Freezing | 7 | 19 |
5 | -30 | Freezing | 9 | 25 |
6 | -25 | Freezing | 12 | 31 |
7 | -20 | Freezing | 14 | 38 |
8 | -15 | Freezing | 17 | 44 |
9 | -10 | Freezing | 20 | 51 |
10 | -5 | Freezing | 22 | 57 |
11 | 0 | Cold | 24 | 63 |
12 | 5 | Cold | 27 | 70 |
13 | 10 | Cold | 29 | 76 |
14 | 15 | Temperate | 32 | 82 |
15 | 20 | Temperate | 34 | 89 |
16 | 25 | Temperate | 37 | 95 |
17 | 30 | Temperate | 40 | 102 |
18 | 35 | Temperate | 42 | 108 |
19 | 40 | Temperate | 44 | 114 |
20 | 45 | Temperate | 47 | 121 |
21 | 50 | Warm | 49 | 127 |
22 | 55 | Warm | 52 | 133 |
23 | 60 | Warm | 54 | 140 |
24 | 65 | Warm | 57 | 146 |
25 | 70 | Warm | 60 | 153 |
26 | 75 | Hot | 62 | 159 |
27 | 80 | Hot | 64 | 165 |
28 | 85 | Hot | 67 | 172 |
29 | 90 | Scorching | 69 | 178 |
30 | 95 | Scorching | 72 | 184 |
31 | 100 | Scorching | 74 | 191 |
32 | 105 | Scorching | 77 | 197 |
33 | 110 | Scorching | 80 | 204 |
34 | 115 | Scorching | 82 | 210 |
35 | 120 | Scorching | 84 | 216 |
36 | 125 | Scorching | 87 | 223 |
37 | 130 | Scorching | 89 | 229 |
38 | 135 | Scorching | 92 | 235 |
39 | 140 | Scorching | 94 | 242 |
40 | 145 | Scorching | 97 | 248 |
41 | 150 | Scorching | 100 | 255 |
Additional Observations & ConclusionThe fact that my trials perfectly encompassed the entire grayscale is due to my preliminary research. In fact, when choosing the values I actually thought I'd be going above and below the range where the grayscale maps could provide insight into the temperature (colder than 0v, 0rgb and hotter than 100v, 255rgb). For those curious, I did create a few extra worlds above and below the temperatures (and made some adventurers to die in them). There, I was able to confirm that yes, temperature presets above 150 still result in 100v and 255rgb, while presets below -50 still result in 0v and 0rgb.
It seems to me that generated temperatures are subtracted from, rather than added to. Allow me to explain.
For one, it seems the elevation from mountains shave off, at their peak, about 8 RGB or so, which is just a hair more than a -5 change in temperature parameter. However, some worlds, especially hotter ones, go even further. While their highest temperature is perfectly in line with a linear trend, they vary drastically. It'll be easiest to show you visually. The numbers labeling the images indicate the minimum and maximum parameters the world shown was generated at.
Most of the data is much like these images below. Note the center (where the mountains are) are slightly darker than the surrounding area, but there is no difference between low-lying (elevation 150) and oceanic (elevation 1) temperatures.
0: (kinda hard to see because the theme on this forum is so dark)
35:
80:
There are some minor anomalies starting in as early as 70, 75 and 85, but nothing compared to what happens later.
The crazier anomalies start where it gets scorching
90:
They get more pronounced as it gets hotter.
That said, some of the highest temps have little or no anomalies at all!
While I don't have an explanation for the anomalies (maybe something to do with the orthographic rain projections?), I can say with confidence that they are the reason why I recorded only the hottest temperatures from each world.
I hope this helps provide some insight into how you might want to set your temperature parameters in the future. I've uploaded all the files I used to perform the experiment, including the auto-it scripts, here:
http://dffd.bay12games.com/file.php?id=13267. I highly encourage those interested to take a gander at the full collection of maps there, and play around with the test worlds.
Thank you for reading, and feel free to ask any questions and/or make comments about my process.