Profiles
An atmosphere profile is a named set of atmosphere settings in its own file in plugins/MythicSeasons/atmosphere-profiles/. A season, a world or a skill can apply it. The rules below hold for every block of atmosphere settings, such as a profile, a season's atmosphere: block or a worlds entry.
Using a profile
A profile file does nothing until one of these places names it.
| Where | Written as | Applies to |
|---|---|---|
| A season | profile: <name> under atmosphere: in seasons/<id>.yml |
Every world while that season runs |
| A world | profile: <name> under worlds.<world> in atmosphere.yml |
That world in every season |
| A skill | The atmosphereprofile mechanic | The caster's or target's world for a while |
A profile changes only the settings it names, and later places in the chain still win over it.
The profile file
temperature: "+4"
humidity: "*0.5"
physics:
auto-rate: "*0.5"
weather:
rain-precip-threshold: 0.3
cloud-layers:
cumulus:
coverage: "*0.6"
Saved as
atmosphere-profiles/dry-spell.yml: warmer, drier air with less rain and less cumulus.
- The name is the file name without
.ymland is not case-sensitive. Use only letters, digits,-and_, so the name works in a skill line. - Only
.ymlfiles directly in the folder count, read at startup and on/ms reload.example.ymlandmars.ymlare copied back at every start and reload when they are missing. - A profile takes what a season's
atmosphere:block takes.profile,worldsandtransitiondo nothing in it and log no message, so a profile cannot name another profile. - A file without any known setting, or with a YAML error (which the server logs), is not loaded or listed. Everything that names it reports that the file does not exist.
Value forms
These forms work for every setting a block can change, the top level of atmosphere.yml included.
| Written as | What it does | Example |
|---|---|---|
A number, "1.3" or "=1.3" |
Sets the value | cond-rate: 1.3 |
"*1.4", "/2" |
Multiplies or divides the value so far | humidity: "*1.6" |
"+3", "-3" |
Adds or subtracts | temperature: "-3" |
| A keyframe map | Follows a curve over the season | humidity: {START: "*0.8", END: "*1.2"} |
| A formula | Works the number out from the calendar or a MythicMobs placeholder | humidity: "*(1 + 0.2 * step(6, month))" |
- The value so far is what the earlier places of the chain left, or the built-in default. Spaces after the operator do not matter.
- Quote every operator. An unquoted
*1.4is a YAML error and the whole file is not read. An unquoted+3or-3is a plain number and sets the value to 3 or -3. - Relative values stack across places:
"*0.5"twice gives 0.25. - After each place the value is moved into the setting's range without a message, and later places go on from there.
- Text that is neither a number nor a formula logs
'<text>' is not a number, an operator or a formula (<reason>), ignoring, and a list ortruelogsexpected a number, an operator like "*1.4", or a keyframe map, ignoring. The setting keeps its value. An empty text sets nothing. Onlyvisible-from-insidein a layer file also takestrueandfalse. "/0"logsdivision by zero, ignoring.
Keyframes
A keyframe map sets values at points of the season. Its keys are percentages (0 to 100) or phase names, and its values can take any form above except another map. The value runs in a straight line between keys and holds the first or last value outside them. The order of the keys does not matter.
A phase name is the middle of its phase. With the default thresholds START is 4.5, EARLY 13.5, MIDDLE 51, LATE 88 and END 96.
- Only a season's own
atmosphere:block and itsworldsblocks use that season'ssub-season-thresholds. Everywhere else, profiles included, phase names use the defaults 9, 18, 84 and 92. - Phase names are not case-sensitive. Numbers below 0 or above 100 are accepted and lie outside the season. A key that is neither a number nor a phase name logs
keyframe '<key>' is neither a percentage nor a phase name (START/EARLY/MIDDLE/LATE/END), ignoring. - A relative value in a keyframe works on the value so far, and then the two keyframes around the current point are blended.
clouds.outflow.wind-yandphysics.surface-max-humidity(-1 for automatic or off) switch halfway without blending when either keyframe around the current point is negative.- Progress follows the calendar while the calendar is on and the world has a date. Otherwise it stays at the middle of the current phase, and keyframes do not move.
Formulas
A formula lets a setting follow the date, the time of day, the season's progress or a MythicMobs placeholder. Write it on its own ("0.5 + month / 10") or after an operator ("*(1 + 0.25 * step(6, month))"). Keyframe values, shape numbers and style variables in cloud-layers.<file name> blocks take formulas too. A formula takes numbers, +, -, *, /, parentheses and the values and functions below.
| Value | Meaning |
|---|---|
day, month, year |
The date. Day and month start at 1, months in the order of months in calendar.yml |
day-of-year |
Day of the year, from 1 |
weekday |
Day of the week, 1 for the first entry of week-days in calendar.yml (Monday with sync-time-with-real-world) |
hour |
Time of day, 0 to 24 (6.5 is half past six) |
progress |
How far the season is, in percent, as keyframes use it |
| Function | Result |
|---|---|
min(a, b), max(a, b) |
The smaller or the larger number |
abs(x), floor(x), fract(x) |
x without its sign, x rounded down, x minus floor(x) |
clamp(x, low, high) |
x kept between low and high |
mix(a, b, t) |
a + (b - a) * t |
step(edge, x) |
0 when x is below edge, otherwise 1 |
smoothstep(low, high, x) |
0 up to low, 1 from high, a smooth curve between |
sin(x), cos(x) |
Sine and cosine of x in radians |
pow(x, y) |
x to the power y, ignoring the sign of x |
sqrt(x) |
Square root, 0 for negative x |
- With the calendar off, or without a date, the date values and
weekdayare 0 andhourfollows the world's clock.weekdayis also 0 whenweek-daysis empty. - Inside a formula, x / 0 is 0. A leading
"/"whose formula gives 0 leaves the value as it is. - Names are not case-sensitive. A
-followed by a letter joins words into one name (day-of-year), so subtract with spaces:hour - day.month-1subtracts 1. max-distancein a layer file has its own formula, ofview-distanceonly, see Layer Options.
MythicMobs placeholders
A MythicMobs placeholder, angle brackets included, can stand anywhere a formula takes a number: humidity: "*<global.var.wetness>". The setting follows a change of the variable within a second.
- Placeholders are read without a caster. Global variables and other placeholders that need no mob or player work. Caster, target, skill and world variables give no number.
<global.var.wetness|1>gives 1 until a skill sets the variable.- While a placeholder gives no number, the settings that use it keep the value so far, and the console says so once per placeholder. Without MythicMobs no placeholder gives a number.
- On servers that share their weather, the weather follows the calendar and placeholders of the server that simulates it, and each server draws its clouds with its own.
Clouds in a block
| Key | What it does |
|---|---|
clouds.layers |
The layers to draw by file name, as a list ([cumulus, ground-fog]) or one name, [] for none. The last place that sets it replaces the whole list. A name without a file logs clouds.layers lists '<name>', but there is no cloud-layers/<name>.yml; skipping it. See Cloud Options. |
clouds.tint |
A colour grade over every layer, as hex RGB or ARGB in quotes ("8A93A6", a leading # is allowed). tint works as the key too. The last place that sets one wins: "FFFFFF" cancels an earlier one, "" sets nothing. Text that is not hex logs '<text>' is not a hex colour, ignoring. See Cloud Options. |
cloud-layers.<file name>.<setting> |
Changes one layer: its file first, then every block for the layer, in chain order. See Layer Options. |
- Layer names are not case-sensitive. A block for a layer that is not in the final
clouds.layerslist does nothing. type,color,voxel-size,max-distance,thickness,top-clearance,visible-from-inside,toggleandtoggle-defaultonly work in the layer file. In a block they log'<setting>' can only be set in the layer's own file in the cloud-layers folder, ignoring.- A layer with a
shapetakesshape.<number>for the numbers that scale or move its pattern (Shapes). A layer with astyletakesstyle.<variable>, which changes only the server look. The style itself is picked in the layer file (Styles). - At the top level of
atmosphere.yml,cloud-layersis ignored with a message: a layer's base values belong in its file.
Settings a block can change
| Section | Page |
|---|---|
temperature, humidity |
Season Adjustments |
biome-defaults, weather |
Weather |
physics, except solver-threads |
Physics |
forcing, except air-masses.size, .speed and .direction |
Forcing |
clouds.layers, tint, storm-fade-seconds, outflow and sample-size |
Cloud Options |
cloud-layers.<file name> |
Layer Options |
The settings only atmosphere.yml can hold are listed on Options. In a block they are ignored with one of the messages below.
Where a block can sit
The places apply from the top of the table down. A later place wins for any setting both set.
| Order | Place | Written in | Applies to |
|---|---|---|---|
| 1 | Built-in defaults | Everything | |
| 2 | atmosphere.yml |
Its sections: physics, forcing and so on |
Every world, every season |
| 3 | World block | worlds.<world> in atmosphere.yml |
One world, every season |
| 4 | Season adjustment | season-adjustments.<season> in atmosphere.yml |
Every world, one season |
| 5 | Profile of the season | profile: in the atmosphere: block of seasons/<id>.yml |
Every world, one season |
| 6 | Season block | atmosphere: in seasons/<id>.yml |
Every world, one season |
| 7 | Profile of the world | profile: under worlds.<world> in atmosphere.yml |
One world, every season |
| 8 | Season world block | atmosphere.worlds.<world> in seasons/<id>.yml |
One world, one season |
| 9 | Forced profiles | The atmosphereprofile mechanic, lowest priority first |
One world, for a while |
- World names and season ids are not case-sensitive.
- Places 4, 5, 6 and 8 belong to a season. In a world whose season is
disabledonly 1, 2, 3, 7 and 9 apply. - A season wins over place 3. The shipped
season-adjustmentssettemperatureandhumidityfor every season, which replaces a world's own. Use place 7 or 8 to win over the season. profileworks only in place 3, where it applies as place 7, and in place 6, where it applies as place 5. Elsewhere it does nothing and logs no message.transition.blend-daysandworldsare read in places 2 and 6,transition.blend-percentonly in place 6.- The
atmosphere:block of a biome file is something else, see Weather.
atmosphere:
profile: dry-spell
temperature:
START: "+2"
MIDDLE: "+8"
END: "+2"
transition:
blend-percent: 10
worlds:
resource_world:
physics:
max-wind: 20
In a season file.
max-windis in m/s, and the blend covers the last 10 percent of the season.
How the result is built
Take a world survival in the shipped winter, with temperature: 3 and profile: example under worlds.survival in atmosphere.yml:
| Place | temperature |
humidity |
|---|---|---|
| 1, built-in default | 0 | 1.0 |
3, worlds.survival |
3 | 1.0 |
4, season-adjustments.winter: -12 and 0.55 |
-12 | 0.55 |
7, profile example: "-4" and "*1.6" |
-16 | 0.88 |
9, a skill forces mars: -60 and 0.0 |
-60 | 0.0 |
The season adjustment replaces the world's 3, and the shipped winter block sets neither key.
Blending between seasons
Near the end of a season the whole result fades into the next season's result at progress 0, over transition.blend-days (see Options).
- Numbers fade in a straight line, and the wind direction turns the short way round.
clouds.outflow.wind-yandphysics.surface-max-humidityswitch halfway when either side is -1. - The cloud list switches halfway. A layer in both lists fades its settings.
- A tint fades channel by channel when both seasons set one, and switches halfway when only one does.
- Forced profiles apply to both sides.
The shipped profiles
example
A heavy, dark, windy overcast: 4 degrees colder ("-4"), 60 percent more moisture ("*1.6"), cloud and rain that form more easily (buoyancy 0.055, lapse-rate 0.055, cond-rate 1.3, auto-threshold 0.45), a day that hardly warms up (diurnal-offset -6, diurnal-amplitude 4), a stronger, steadier upper wind (speed-base 9, speed-top 38, wander-a 12) and storms that need less rain and a weaker updraft (storm-precip-threshold 0.3, storm-updraft-threshold 1.6). Every layer gets a grey-blue tint ("8A93A6"), and the cumulus is heavier and broader with a darker underside (coverage 1.8, noise-scale 140, noise-scale-y 70, shade-bottom 0.5), 40 blocks above the terrain but never above y200.
mars
Freezing, bone-dry air that never rains, with orange dust and thin ice streaks in place of the regular clouds. Its temperature: -60 is unquoted, so it replaces the season's shift. Sky and fog keep the colours of the world's biomes. The settings are on Mars layers.
- To turn a world into Mars, set
profile: marsunderworlds.<world>inatmosphere.ymland run/ms reload. It applies in every season and wins over the season files, except their ownatmosphere.worlds.<world>blocks. The simulation has to run in that world, see Turning it on. - The dust particles come from the pack skill
MS_MarsDust, whichMS_Atmosphereruns where the atmosphereprofile condition findsmars, the surface wind is at least 3 m/s and the player has season particles on. Packs installed before that skill existed need it added toskills/Atmosphere.ymlby hand, see Packs. - That condition sees the world's own profile and forced profiles, so a
marsnamed in a season file gives no dust particles.
Checking what applies
/ms atmosphere profileslists the loaded profiles./ms atmosphere profile [world]lists every setting some place sets, with that place, see Debugging. Settings at their default are left out. A world without a running simulation shows every setting at its default and no layers.- The atmosphereprofile condition,
<mythicseasons.atmosphereprofile>and%ms_atmosphere_profile%report the world's own profile and the forced ones, lowest priority first, ornone. A profile named by a season file is in none of them.
The chain example above, before the skill runs:
Profile survival (winter 40%)
Forced: example
Cloud tint: #8A93A6
biome-defaults.temp-scale 18 (atmosphere.yml)
biome-defaults.temp-offset -2 (atmosphere.yml)
biome-defaults.vapor-base 2 (atmosphere.yml)
biome-defaults.vapor-scale 10 (atmosphere.yml)
temperature -16 (profile example)
humidity 0.88 (profile example)
forcing.diurnal-amplitude 4 (profile example)
The label in brackets names the place: atmosphere.yml, world <world>, season-adjustments <season>, profile <name> (named by a season or a world), season <id>, season <id> world <world>, override <name> (a forced profile) and cloud-layers/<file name>.yml (the layer's own file). During a blend the first line ends with , <percent>% into <next season>, and a value whose two sides come from different places shows both, as <first>><second>.
Messages
Each message starts with its place (one of the labels above), then cloud-layers.<layer> inside a layer block, and the setting with @<key> where a value is at fault. Messages about values and clouds are in the sections above.
| Message | Cause |
|---|---|
unknown atmosphere setting '<key>', ignoring |
A misspelled key, season-adjustments or clouds.quality in a block, or a layer setting outside cloud-layers.<file name> |
'<key>' cannot change with the season or world (...); set it in atmosphere.yml instead |
enabled, shared-weather-group, grid, timing, physics.solver-threads or a clouds setting only atmosphere.yml holds |
'<key>' cannot change with the season, world or profile; set it at the top level of atmosphere.yml instead |
forcing.air-masses.size, .speed or .direction in a block |
'<key>' moved into the cloud layer files: ... |
An old clouds.<setting> key that is now a layer setting |
unknown cloud layer setting '<key>', ignoring |
An unknown key in a layer block |
'<key>' must hold settings as cloud-layers.<layer>.<setting> (...), ignoring |
cloud-layers written as a list or a plain value |
Atmosphere: the MythicMobs placeholder <placeholder> gave '<text>', not a number; ... |
Once per placeholder |
Atmosphere: <placeholder> in the atmosphere settings is a MythicMobs placeholder, but MythicMobs is not installed; ... |
Once per placeholder |
season <id> references unknown atmosphere profile '<name>' |
The profile is not loaded. Repeats each time the settings are rebuilt, often every second |
atmosphere.yml worlds.<world>.profile: there is no atmosphere-profiles/<name>.yml |
The profile is not loaded, also when the file exists without any setting |