Session Profiles

Documentation for version v0.1.0-beta.3View source on GitHub

A session profile is a declarative YAML package that a content author ships with a map or an add-on so that end users can start a reproducible OmsiLaunch session with one command (OmsiLaunch.exe /predefined-profile:<id> /predefined-profile-index:<1..5> /new). This page is the normative reference for the omsilaunch.session-profile/v1 format as implemented by SessionProfileCompiler in src/OmsiLaunch.Core/SessionProfiles.cs, for the precedence rules applied by the CLI (CliInput.BuildSpecAsync and RejectProfileConflicts in tools/OmsiLaunch.Cli/Program.cs), and for the settings catalogue a profile may write (ConfigurationCatalog). Everything a profile can do, the CLI flags and the LaunchSpec can also do; a profile only packages those choices.

Stability: STABLE_BETA for parsing, validation, conflict detection and the settings / presentation / internet-textures / behavior blocks (offline test session-profiles.strict-compiler; the overlay and restore path is runtime validated by RV-005 and RV-006, see runtime validation status). The new.date, new.time, new.year and new.weather keys are UNAVAILABLE in this build (see The new block).

Package location and naming#

ItemRule
Package directory<installation root>\.omsilaunch\session-profiles\<id>\
Profile file<package>\profile.yaml (exact name, one file)
AssetsAny files or directories inside the package directory, referenced by relative path from presentation.splash.assets and internet-textures.profile
idMust be a plain directory name: it must not be empty or whitespace, must not contain \, / or :, and must not contain the sequence ... Violations are OL_E_SESSION_PROFILE_PATH_ESCAPE. The id value declared inside profile.yaml must equal the directory name byte for byte (case-sensitive); otherwise OL_E_SESSION_PROFILE_INVALID.
Selection/predefined-profile:<id> together with /predefined-profile-index:<n>. The index is mandatory: /predefined-profile without /predefined-profile-index fails with OL_E_SESSION_PROFILE_PRESET_NOT_FOUND.
Missing packageOL_E_SESSION_PROFILE_NOT_FOUND
Release layoutThe release package ships an example under .omsilaunch\examples\session-profiles\rmg-leste\ (see packaging). Examples are not profiles: copy a package to .omsilaunch\session-profiles\<id>\ to make it selectable.

A profile is installed and removed by the user or the content author. OmsiLaunch never writes into a package, never copies it, and never deletes it. The package directory is not part of any transaction.

Parsing rules#

RuleBehaviourError
Size limitprofile.yaml must not exceed 256 KiB (262,144 bytes)OL_E_SESSION_PROFILE_INVALID
Document shapeExactly one YAML document whose root node is a mappingOL_E_SESSION_PROFILE_INVALID
Schemaschema must be exactly omsilaunch.session-profile/v1 (case-sensitive)OL_E_SESSION_PROFILE_SCHEMA_UNSUPPORTED
Anchors and aliasesAny node carrying a YAML anchor (&name) anywhere in the document is rejected before validation; aliases (*name) therefore cannot occurOL_E_SESSION_PROFILE_INVALID ("YAML anchors are not supported.")
Unknown keysEvery mapping is closed: a key that is not listed for its context in the tables below is rejected ("Unknown property in <context>: <key>"). Keys are matched case-sensitively (Schema: is an unknown key). The only open mapping is settings, whose keys are validated against the settings catalogue instead.OL_E_SESSION_PROFILE_INVALID
ScalarsEvery leaf value must be a scalar; sequences and mappings where a scalar is expected are rejected ("<field> must be a scalar.")OL_E_SESSION_PROFILE_INVALID
NumbersIntegers are parsed with the invariant culture (1, 30); decimals in settings use . as the separatorOL_E_SESSION_PROFILE_INVALID
Dates and timesnew.date.value is parsed by DateOnly.Parse and new.time.value by TimeOnly.Parse, both invariant culture; use ISO forms yyyy-MM-dd and HH:mm[:ss]OL_E_SESSION_PROFILE_INVALID
YAML syntax errorsReported with the parser messageOL_E_SESSION_PROFILE_INVALID ("Invalid YAML: ...")
Executable contentYAML is parsed with YamlDotNet into a representation tree only; no tags, custom types or code execution are supported

Backslashes in plain (unquoted) scalars are literal characters. Write Windows paths with a single backslash (maps\Grundorf\global.cfg). A doubled backslash in a plain scalar stays doubled in the value; see The packaged example.

Key reference#

Contexts are named exactly as the compiler names them. Every key listed here is accepted; nothing else is.

profile (root mapping)#

KeyTypeRequiredDescription
schemastringyesLiteral omsilaunch.session-profile/v1.
idstringyesPackage identifier; must equal the directory name.
namestringyesDisplay name; reported in SessionProfileMetadata.Name.
authorstringyesAuthor; reported in SessionProfileMetadata.Author.
versionstringyesPackage version string (free form, quote it: "1.0"); reported in SessionProfileMetadata.Version.
compatibilitymappingnoSee compatibility.
newmappingnoNEW_MAP defaults. See new.
presetssequence of mappingsyes1 to 5 preset entries. Zero, more than five, or a non-sequence value is OL_E_SESSION_PROFILE_INVALID.

compatibility#

KeyTypeRequiredDescription
mapssequence of stringsnoMap identities (maps\<Map>\global.cfg) this profile is valid for. / is normalised to \; comparison is case-insensitive. An absent or empty list means "any map". When non-empty it is enforced for WorldMode.NewMap (against the effective new.map or /map) and for WorldMode.SavedSituation (against the map referenced by the selected .osn, resolved through the content catalogue). For WorldMode.LastMapState no map can be derived, so a non-empty list always fails. Failure: OL_E_SESSION_PROFILE_MAP_MISMATCH.

new#

The block is read and validated whenever it is present, but it is applied to the spec only when the selected world mode is NEW_MAP (/new, the CLI default). Under /saved:<file.osn> the block is ignored.

KeyTypeRequiredAppliedDescription
mapstringnoyesMap identity in the normalised form maps\<Map>\global.cfg (planning requires this exact shape: starts with maps\, ends with \global.cfg, no ..). Sets WorldSpec.MapIdentity.
entrypoint-indexintegernoyesPresented entrypoint index (0-based position in OMSI's entrypoint list). Sets PresentedEntrypointIndex and clears any entrypoint identity.
entrypointstringnoyesRaw entrypoint identity. Sets EntrypointIdentity and clears the presented index. If both entrypoint-index and entrypoint are present, entrypoint wins because it is applied last. Entrypoint identity selection is PARTIAL (BI-001): planning reports world.entrypoint-identity as RUNTIME_PARTIAL and the plan is not runnable. Prefer entrypoint-index.
datemappingnono (UNAVAILABLE)See new.date.
timemappingnono (UNAVAILABLE)See new.time.
yearintegernono (UNAVAILABLE)Explicit year.
weathermappingnono (UNAVAILABLE)See new.weather.

date, time, year and weather are compiled into DateSpec, TimeSpec, YearSpec and WeatherSpec with DateTimeMode.Explicit / the selected WeatherMode. The session planner (src/OmsiLaunch.Core/SessionPlanner.cs) then reports the capabilities world.explicit-date, world.explicit-time, world.explicit-year and weather as STATICALLY_PARTIAL, adds OL_E_CAPABILITY_UNAVAILABLE to the plan diagnostics and marks the plan not runnable. The plugin additionally rejects a handoff whose date or time mode is not Unset (plugin.request.unsupported). Consequence for this build: a profile that sets any of these four keys can be validated with /plan but cannot start a session (exit code 1, OL_E_PLAN_NOT_RUNNABLE). Leave them out of profiles intended to run.

new.date#

KeyTypeRequiredDescription
modestringyesMust be explicit (case-insensitive). Any other value is OL_E_SESSION_PROFILE_INVALID ("date must use explicit mode.").
valuestringyesyyyy-MM-dd.

new.time#

KeyTypeRequiredDescription
modestringyesMust be explicit.
valuestringyesHH:mm or HH:mm:ss.

new.weather#

KeyTypeRequiredDescription
modestringyespreset, icao or real (case-insensitive). Anything else: OL_E_SESSION_PROFILE_INVALID ("Unsupported weather mode").
presetstringwhen mode: presetWeather preset name.
icaostringwhen mode: icaoICAO station code.

preset (each entry of presets)#

KeyTypeRequiredDefaultDescription
indexintegeryes1 to 5, unique within the profile. Selected with /predefined-profile-index. Duplicate or out-of-range: OL_E_SESSION_PROFILE_INVALID; an index that exists nowhere in the profile: OL_E_SESSION_PROFILE_PRESET_NOT_FOUND.
idstringyesPreset identifier; reported as SessionProfileMetadata.PresetId.
namestringyesPreset display name; reported as SessionProfileMetadata.PresetName.
settingsmappingnononeSemantic options.cfg settings, see Settings. Keys are matched case-insensitively against the catalogue.
presentationmappingnoinheritSplash presentation, see presentation. When absent the preset inherits the baseline (/spec value or the CLI default, Managed).
internet-texturesmappingnoinheritSee internet-textures.
behaviormappingnoinheritTimeouts, see behavior.

Only the selected preset is applied. Every preset is still parsed and validated, so an error in preset 3 fails a request for preset 1.

presentation#

KeyTypeRequiredDescription
splashmappingyesRequired when presentation is present ("Presentation requires splash."). See presentation.splash.

presentation.splash#

KeyTypeRequiredDefaultDescription
modestringyesmanaged installs OmsiLaunch splash bitmaps for the session (SplashMode.Managed). unset or native preserves OMSI's own splash files (SplashMode.Unset; Native is an alias). Case-insensitive. Anything else: OL_E_SESSION_PROFILE_INVALID.
languagestringnoENGLocale of the second splash target: PTB, ENG, DEU, FRA (aliases PT-BR, EN, DE, FR; anything unknown resolves to ENG at session build). With mode: managed the session overlays GUI\NewSplashscreen_ENG.bmp and GUI\NewSplashscreen_<language>.bmp.
assetsstringnopackaged assetsDirectory relative to the package, containing ENG.bmp and, for a non-English language, <language>.bmp; each must be a 640x480, 24-bit BMP. The directory must exist at profile load (OL_E_SESSION_PROFILE_ASSET_MISSING); the files are validated at session start (OL_E_SPLASH_ASSET_MISSING, OL_E_SPLASH_FORMAT_UNSUPPORTED). Path confinement rules apply. When omitted the installation's .omsilaunch\assets\splash (or the packaged defaults) are used.

A profile cannot set SessionPresentationSpec.SuppressTrayIcon; it stays false unless a /spec sets it.

internet-textures#

KeyTypeRequiredDescription
modestringyesnative (InternetTexturesMode.Native, OMSI behaves normally), disabled (Disabled, the profiled in-process downloader is suppressed for the session), override (Override, a session-scoped .itx profile is installed as Texture\standard.itx). Case-insensitive; anything else: OL_E_SESSION_PROFILE_INVALID.
profilestringrequired for overridePath relative to the package of the .itx file. Missing key with override: OL_E_SESSION_PROFILE_INVALID; missing file: OL_E_SESSION_PROFILE_ASSET_MISSING. Path confinement rules apply. The file must consist of URL / target line pairs with http:// or https:// URLs (OL_E_ITX_PROFILE_INVALID otherwise) and every target must resolve below the installation's Texture\ directory without traversing a reparse point (OL_E_ITX_TARGET_OUTSIDE_TEXTURE_PATH). The listed targets and Texture\standard.ipr become session deletions (see transactions and recovery).

behavior#

KeyTypeRequiredDefaultDescription
startup-timeoutinteger (seconds)no180Time allowed from process start to Running. Must be positive at profile load; the session additionally requires 1 to 600 at start (OL_E_START_SESSION otherwise). Maps to LaunchBehaviorSpec.StartupTimeoutSeconds.
shutdown-timeoutinteger (seconds)no30Maps to LaunchBehaviorSpec.ShutdownTimeoutSeconds. ACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECT: the supervisor terminates OMSI directly and never reads this value.

When the behavior block is present, both timeouts are set (given value or default) and replace the baseline LaunchBehaviorSpec entirely, including RestoreConfiguration and SuppressStaleClosecheckWarning, which revert to their defaults (true, true).

Settings#

settings keys are the semantic names of ConfigurationCatalog (src/OmsiLaunch.Configuration/ConfigurationCatalog.cs). The compiler accepts a key only if it exists (OL_E_SESSION_PROFILE_SETTING_UNKNOWN) and is writable (OL_E_SESSION_PROFILE_SETTING_NOT_WRITABLE). Values are stored as strings and converted into an options.cfg patch when the session builds its overlays; an invalid value is therefore detected at StartSessionAsync, not at profile load, and fails the session with OL_E_START_SESSION whose message carries OL_E_INVALID_SETTING_VALUE: <key>. Every setting below writes options.cfg; all of them are session-scoped and restored exactly after the session.

Value forms:

  • bool is true or false (case-insensitive). For presence tokens the token is added or removed; for inverted tokens (no_*) true removes the negative token.
  • int / decimal are validated against the range; values with a divisor are stored divided (for example graphics.minObjectScreenPercent: 5 writes 0.05).
  • string is written verbatim.
Setting keyoptions.cfg tokenTypeRange / valuesEvidence
general.languagelanguagestringanySTATICALLY_VALIDATED
general.radioradiostringanySTATICALLY_VALIDATED
general.alternateViewaltViewbool (presence)STATICALLY_VALIDATED
general.showOwnDriversee_own_driverbool (presence)STATICALLY_VALIDATED
general.showErrorMessagesshowerrormessagesbool (presence)STATICALLY_VALIDATED
general.autoSavenoAutoSavebool (inverted presence)STATICALLY_VALIDATED
general.currentTimeuseActTimebool (presence)STATICALLY_VALIDATED
general.currentDateuseActDatebool (presence)STATICALLY_VALIDATED
general.currentYearuseActYearbool (presence)STATICALLY_VALIDATED
graphics.screenRatioscreenratiostringanySTATICALLY_VALIDATED
graphics.maxFPSmaxFPSint10..200STATICALLY_VALIDATED
graphics.tileDistanceperformance_tiledistmaxint1..20STATICALLY_VALIDATED
graphics.maxObjectDistanceMetersperformance_maxObjDistint20..5000STATICALLY_VALIDATED
graphics.minObjectScreenPercentperformance_minObjSizedecimal0..10, stored /100STATICALLY_VALIDATED
graphics.minReflectionObjectScreenPercentperformance_minObjSizeRefldecimal0..50, stored /100STATICALLY_VALIDATED
graphics.maxObjectComplexitymaxcomplexityint0..3STATICALLY_VALIDATED
graphics.maxMapComplexitymaxcomplexity_mapint0..2STATICALLY_VALIDATED
graphics.sunGlowsunglowbool (presence)STATICALLY_VALIDATED
graphics.loadAllTilesloadAllTilesbool (presence)STATICALLY_VALIDATED
graphics.stencilBufferno_stencilbufferbool (inverted presence)STATICALLY_VALIDATED
graphics.stencilShadowsshadow_stencilbool, written as on / offSTATICALLY_VALIDATED
graphics.rainReflectionsno_rain_reflbool (inverted presence)STATICALLY_VALIDATED
graphics.humansInRainReflectionsno_humans_on_rain_reflbool (inverted presence)STATICALLY_VALIDATED
graphics.realTimeReflectionsperformance_realreflexionsstringeconomy or fullSTATICALLY_PARTIAL
graphics.particlessmokesystems (4-line block)enabled,maxPerEmitter,playerVehicleOnly,inReflections (bool,int>=0,bool,bool)STATICALLY_VALIDATED
simulation.collisionno_collisionbool (inverted presence)STATICALLY_VALIDATED
simulation.collisionTerrainno_collision_terrainbool (inverted presence)STATICALLY_VALIDATED
simulation.collisionVehiclesno_collision_vehToVehbool (inverted presence)STATICALLY_VALIDATED
simulation.collisionPedestriansno_collision_pedastriansbool (inverted presence)STATICALLY_VALIDATED
simulation.ticketSellingticketsellingint0..2STATICALLY_VALIDATED
simulation.maintenancewear_lifespanint0..4STATICALLY_VALIDATED
simulation.disableAutomaticScheduleAnalysisPopupno_schedAnaPopUpbool (presence)STATICALLY_VALIDATED
simulation.ticketInfono_ticketinfo_visiblebool (inverted presence)STATICALLY_VALIDATED
simulation.automaticClutchno_automaticClutchbool (inverted presence)STATICALLY_VALIDATED
advanced.reducedMultithreadingno_multithreading_calculate + no_multithreading_texloadbool (both presence tokens)RUNTIME_PROVEN
view.driverSmoothdriverview_smoothbool (presence)STATICALLY_VALIDATED
view.driverMovingdriverview_movingbool (presence)STATICALLY_VALIDATED
controls.autoCenterautoCenterbool (presence)STATICALLY_VALIDATED
controls.reducedSteeringSpeedredSteerSpdbool (presence)STATICALLY_VALIDATED
traffic.randomVehiclesAIMaxCountRandom component 0int0..1000STATICALLY_VALIDATED (RV-005 runtime)
traffic.humansAIMaxCountRandom component 1int0..1000STATICALLY_VALIDATED (RV-005 runtime)
traffic.factorPercentAIUnschedFactorint1..300STATICALLY_VALIDATED
traffic.parkedVehiclesPercentAIMaxCountParkedint0..100STATICALLY_VALIDATED
traffic.scheduledVehiclesAIMaxCountScheduledint0..1000STATICALLY_VALIDATED
traffic.scheduledLinePriorityAIPriorityScheduledint1..4STATICALLY_VALIDATED
traffic.passengerFactorPercentAIPassFactorint0..200STATICALLY_VALIDATED
sound.stereosound_stereoint0..100STATICALLY_VALIDATED
sound.maxSimultaneousSoundssound_maxcountint5..1000STATICALLY_VALIDATED
sound.masterVolumesound_vol_masterdecimal0..1STATICALLY_VALIDATED

Catalogue entries that exist but are not writable (rejected with OL_E_SESSION_PROFILE_SETTING_NOT_WRITABLE): advanced.multithreadingCalculate, advanced.multithreadingTextureLoad (superseded by advanced.reducedMultithreading), graphics.texture, graphics.textureFilter.

Path confinement#

presentation.splash.assets and internet-textures.profile are resolved by Confined(package root, value):

  1. Rooted paths (C:\...), paths starting with \, and any path component equal to .. are rejected.
  2. The full path is computed and must start with the package directory.
  3. Every existing component below the package root, up to and including the final path, is inspected for the ReparsePoint attribute. A junction, directory symbolic link, or file symbolic link anywhere on that path is rejected, as is a component that cannot be inspected (IOException / UnauthorizedAccessException).

All three failures are OL_E_SESSION_PROFILE_PATH_ESCAPE. The same reparse-point rule is applied to .itx targets under Texture\ at session build.

Precedence and override conflicts#

CliInput.BuildSpecAsync composes the spec in this order:

  1. Defaults (NEW_MAP, everything unset, timeouts 180 s / 30 s).
  2. /spec:<file.json>, if given, replaces the defaults entirely.
  3. Installation root: an explicit installation argument wins over the spec's RootPath; . means the directory containing the executable.
  4. Profile (/predefined-profile + /predefined-profile-index): the package is loaded and RejectProfileConflicts runs against the raw CLI arguments before anything is merged. The world block of the seed is then reset to an empty WorldSpec of the selected mode (a /spec world is discarded when a profile is used) and SessionProfileCompiler.Apply layers the profile onto the seed: new (NEW_MAP only), settings (merged over the seed's Environment.General, profile wins per key), and presentation, internet-textures, behavior (each replaces the seed block only when the preset defines it).
  5. Remaining CLI arguments are layered on top: /map, /entrypoint, /entrypoint-index, /date, /time, /year, weather flags, vehicle flags, /set, splash flags, internet-textures flags, /startup-timeout, /shutdown-timeout. Timeouts from the CLI apply only when given; otherwise the spec/profile/default value stands.
  6. Compatibility check for non-NEW_MAP modes (ValidateCompatibility).

A CLI argument that targets a field the selected profile owns is a conflict, rejected with OL_E_SESSION_PROFILE_OVERRIDE_CONFLICT (exit code 2, category invalid_argument). The check is per field, not per value: repeating the profile's own value is still a conflict.

CLI argumentConflicts when the profile definesOnly in mode
/mapnew.mapNEW_MAP
/entrypoint or /entrypoint-indexnew.entrypoint or new.entrypoint-indexNEW_MAP
/datenew.dateNEW_MAP
/timenew.timeNEW_MAP
/yearnew.yearNEW_MAP
/weather, /weather-icao, /weather-realnew.weatherNEW_MAP
/set:<key>=...the same <key> in the preset's settings (case-insensitive)any
/splash, /splash-language, /splash-assetspresentation (any)any
/internet-textures, /internet-textures-profileinternet-textures (any)any
/startup-timeout, /shutdown-timeoutbehavior (any)any

Not conflicts: /set keys the preset does not define (they are added), vehicle flags (/vehicle, /repaint, /hof, /fleet, /registration, /no-vehicle; a profile cannot define a player vehicle), and any world argument under /saved (the new block is not applied there). /map, /entrypoint and /entrypoint-index are invalid together with /saved regardless of profiles (OL_E_INVALID_ARGUMENT).

Error codes#

CodeRaised whenCLI exit
OL_E_SESSION_PROFILE_NOT_FOUND<root>\.omsilaunch\session-profiles\<id>\profile.yaml does not exist2
OL_E_SESSION_PROFILE_PATH_ESCAPEid is not a plain directory name; assets / profile leaves the package or traverses a reparse point2
OL_E_SESSION_PROFILE_SCHEMA_UNSUPPORTEDschema is not omsilaunch.session-profile/v12
OL_E_SESSION_PROFILE_INVALIDsize limit, document shape, anchors, unknown key, missing required key, non-scalar value, bad number/date/time, id mismatch, preset count/index rules, unsupported mode words, non-positive timeout, presentation without splash, override without profile2
OL_E_SESSION_PROFILE_PRESET_NOT_FOUND/predefined-profile-index missing, outside 1..5, or no preset with that index2
OL_E_SESSION_PROFILE_SETTING_UNKNOWNa settings key is not in the catalogue2
OL_E_SESSION_PROFILE_SETTING_NOT_WRITABLEa settings key is catalogued but read-only2
OL_E_SESSION_PROFILE_ASSET_MISSINGassets directory or profile file does not exist inside the package2
OL_E_SESSION_PROFILE_MAP_MISMATCHcompatibility.maps is non-empty and the effective map is not listed (or cannot be derived)2
OL_E_SESSION_PROFILE_OVERRIDE_CONFLICTan explicit CLI argument targets a profile-owned field2

All of these are raised while the command line is being compiled, before planning. They are SessionProfileException (or ArgumentException for the conflict) and never start a session. The full catalogue is in errors; exit codes in exit codes.

How a profile appears in the API#

After a successful load the spec carries a SessionProfileMetadata record in LaunchSpec.SessionProfile:

FieldSource
Idid
Namename
Versionversion
Authorauthor
PresetIdselected preset id
PresetIndexselected preset index
PresetNameselected preset name
PackagePathabsolute package directory

The planner adds an informational diagnostic session_profile.selected to every SessionPlan built from such a spec, with data keys session_profile.id, session_profile.name, session_profile.version, session_profile.author, session_profile.preset_id, session_profile.preset_index, session_profile.preset_name and session_profile.path. It does not affect runnability. Integrators using the public API directly may call SessionProfileCompiler.Load and SessionProfileCompiler.Apply from OmsiLaunch.Core; the YAML representation never crosses into OmsiLaunch.Api.

Examples#

Example 1: settings-only profile, one preset#

<root>\.omsilaunch\session-profiles\quiet-evening\profile.yaml

schema: omsilaunch.session-profile/v1
id: quiet-evening
name: Quiet evening
author: Example author
version: "1.0"
presets:
  - index: 1
    id: default
    name: Low traffic, no autosave
    settings:
      traffic.randomVehicles: 40
      traffic.humans: 60
      general.autoSave: false
      sound.masterVolume: 0.6

Run: OmsiLaunch.exe /predefined-profile:quiet-evening /predefined-profile-index:1 /new /map:maps\Grundorf\global.cfg /entrypoint-index:0. The map and entrypoint come from the command line because the profile defines no new block; adding /set:graphics.maxFPS=60 is allowed, adding /set:traffic.humans=10 is a conflict.

Example 2: map-bound profile with three presets and packaged assets#

<root>\.omsilaunch\session-profiles\grundorf-tour\profile.yaml, with assets\splash\ENG.bmp, assets\splash\DEU.bmp and textures\offline.itx inside the package:

schema: omsilaunch.session-profile/v1
id: grundorf-tour
name: Grundorf guided tour
author: Example team
version: "2.1"
compatibility:
  maps:
    - maps\Grundorf\global.cfg
new:
  map: maps\Grundorf\global.cfg
  entrypoint-index: 0
presets:
  - index: 1
    id: low
    name: Low-end PC
    settings:
      graphics.maxFPS: 30
      graphics.tileDistance: 3
      graphics.rainReflections: false
    presentation:
      splash:
        mode: managed
        language: DEU
        assets: assets\splash
    internet-textures:
      mode: disabled
    behavior:
      startup-timeout: 300
  - index: 2
    id: mid
    name: Mid-range PC
    settings:
      graphics.maxFPS: 60
      graphics.tileDistance: 6
    internet-textures:
      mode: override
      profile: textures\offline.itx
  - index: 3
    id: high
    name: High-end PC
    settings:
      graphics.maxFPS: 120
      graphics.tileDistance: 10
      advanced.reducedMultithreading: false
    presentation:
      splash:
        mode: native

Run: OmsiLaunch.exe /predefined-profile:grundorf-tour /predefined-profile-index:2 /new. With /saved:situations\mytrip.osn the new block is skipped and the .osn must reference maps\Grundorf\global.cfg.

The packaged example#

The release ships docs/examples/session-profiles/rmg-leste/profile.yaml (view). It is syntactically valid, matches the schema and would load without error. Two properties keep it from starting a session unchanged in this build:

  1. It sets new.date, new.time and new.weather, which make the plan not runnable (see The new block).
  2. Its path values are plain scalars with doubled backslashes (maps\\RMG Leste\\global.cfg). YAML keeps them doubled, and map identities are compared textually (after / to \ normalisation only), so new.map and compatibility.maps would not match the catalogue identity maps\RMG Leste\global.cfg (OL_E_MAP_NOT_FOUND at planning). The assets value still resolves because Windows path normalisation collapses doubled separators.

The runnable form for this build is:

schema: omsilaunch.session-profile/v1
id: rmg-leste
name: RMG Leste
author: Equipe RMG
version: "1.0"
compatibility:
  maps:
    - maps\RMG Leste\global.cfg
new:
  map: maps\RMG Leste\global.cfg
  entrypoint-index: 3
presets:
  - index: 1
    id: weak
    name: PC fraco
    settings:
      graphics.maxFPS: 30
      graphics.tileDistance: 3
    presentation:
      splash:
        mode: managed
        language: PTB
        assets: assets\splash
    internet-textures:
      mode: disabled
  - index: 2
    id: medium
    name: PC medio
    settings:
      graphics.maxFPS: 40
      graphics.tileDistance: 5
  - index: 3
    id: strong
    name: PC forte
    settings:
      graphics.maxFPS: 60
      graphics.tileDistance: 8