Perfis de sessão

Documentação da versão v0.1.0-beta.3Ver fonte no GitHub

Tradução da página original em inglês do OmsiLaunch 0.1.0-beta3. A página em inglês é a referência normativa: se as duas divergirem, valem a página em inglês e o código.

Um perfil de sessão é um pacote YAML declarativo que um autor de conteúdo distribui com um mapa ou um add-on para que os usuários finais possam iniciar uma sessão reproduzível do OmsiLaunch com um único comando (OmsiLaunch.exe /predefined-profile:<id> /predefined-profile-index:<1..5> /new). Esta página é a referência normativa do formato omsilaunch.session-profile/v1 conforme implementado por SessionProfileCompiler em src/OmsiLaunch.Core/SessionProfiles.cs, das regras de precedência aplicadas pela CLI (CliInput.BuildSpecAsync e RejectProfileConflicts em tools/OmsiLaunch.Cli/Program.cs) e do catálogo de configurações que um perfil pode gravar (ConfigurationCatalog). Tudo o que um perfil pode fazer também pode ser feito pelas flags da CLI e pelo LaunchSpec; um perfil apenas empacota essas escolhas.

Estabilidade: STABLE_BETA para análise, validação, detecção de conflitos e os blocos settings / presentation / internet-textures / behavior (teste offline session-profiles.strict-compiler; o caminho de overlay e restauração é validado em runtime por RV-005 e RV-006, ver status da validação em runtime). As chaves new.date, new.time, new.year e new.weather são UNAVAILABLE neste build (ver O bloco new).

Local e nomenclatura do pacote#

ItemRegra
Diretório do pacote<installation root>\.omsilaunch\session-profiles\<id>\
Arquivo do perfil<package>\profile.yaml (nome exato, um arquivo)
AssetsQuaisquer arquivos ou diretórios dentro do diretório do pacote, referenciados por caminho relativo a partir de presentation.splash.assets e internet-textures.profile
idDeve ser um nome de diretório simples: não pode ser vazio nem só espaços, não pode conter \, / ou : e não pode conter a sequência ... Violações geram OL_E_SESSION_PROFILE_PATH_ESCAPE. O valor id declarado dentro de profile.yaml deve ser igual ao nome do diretório byte a byte (diferenciando maiúsculas de minúsculas); caso contrário, OL_E_SESSION_PROFILE_INVALID.
Seleção/predefined-profile:<id> junto com /predefined-profile-index:<n>. O índice é obrigatório: /predefined-profile sem /predefined-profile-index falha com OL_E_SESSION_PROFILE_PRESET_NOT_FOUND.
Pacote ausenteOL_E_SESSION_PROFILE_NOT_FOUND
Layout do releaseO pacote de release distribui um exemplo em .omsilaunch\examples\session-profiles\rmg-leste\ (ver empacotamento). Exemplos não são perfis: copie um pacote para .omsilaunch\session-profiles\<id>\ para torná-lo selecionável.

Um perfil é instalado e removido pelo usuário ou pelo autor do conteúdo. O OmsiLaunch nunca grava dentro de um pacote, nunca o copia e nunca o exclui. O diretório do pacote não faz parte de nenhuma transação.

Regras de análise#

RegraComportamentoErro
Limite de tamanhoprofile.yaml não pode exceder 256 KiB (262,144 bytes)OL_E_SESSION_PROFILE_INVALID
Forma do documentoExatamente um documento YAML cujo nó raiz é um mapeamentoOL_E_SESSION_PROFILE_INVALID
Schemaschema deve ser exatamente omsilaunch.session-profile/v1 (diferenciando maiúsculas de minúsculas)OL_E_SESSION_PROFILE_SCHEMA_UNSUPPORTED
Âncoras e aliasesQualquer nó que carregue uma âncora YAML (&name) em qualquer parte do documento é rejeitado antes da validação; portanto, aliases (*name) não podem ocorrerOL_E_SESSION_PROFILE_INVALID ("YAML anchors are not supported.")
Chaves desconhecidasTodo mapeamento é fechado: uma chave que não está listada para seu contexto nas tabelas abaixo é rejeitada ("Unknown property in <context>: <key>"). As chaves são comparadas diferenciando maiúsculas de minúsculas (Schema: é uma chave desconhecida). O único mapeamento aberto é settings, cujas chaves são validadas contra o catálogo de configurações.OL_E_SESSION_PROFILE_INVALID
EscalaresTodo valor folha deve ser um escalar; sequências e mapeamentos onde se espera um escalar são rejeitados ("<field> must be a scalar.")OL_E_SESSION_PROFILE_INVALID
NúmerosInteiros são analisados com a cultura invariável (1, 30); decimais em settings usam . como separadorOL_E_SESSION_PROFILE_INVALID
Datas e horasnew.date.value é analisado por DateOnly.Parse e new.time.value por TimeOnly.Parse, ambos com cultura invariável; use as formas ISO yyyy-MM-dd e HH:mm[:ss]OL_E_SESSION_PROFILE_INVALID
Erros de sintaxe YAMLReportados com a mensagem do parserOL_E_SESSION_PROFILE_INVALID ("Invalid YAML: ...")
Conteúdo executávelO YAML é analisado com YamlDotNet apenas em uma árvore de representação; não há suporte a tags, tipos personalizados ou execução de código

Barras invertidas em escalares simples (sem aspas) são caracteres literais. Escreva caminhos do Windows com uma única barra invertida (maps\Grundorf\global.cfg). Uma barra invertida dupla em um escalar simples permanece dupla no valor; ver O exemplo empacotado.

Referência de chaves#

Os contextos têm exatamente os nomes que o compilador usa. Toda chave listada aqui é aceita; nenhuma outra é.

profile (mapeamento raiz)#

ChaveTipoObrigatóriaDescrição
schemastringsimLiteral omsilaunch.session-profile/v1.
idstringsimIdentificador do pacote; deve ser igual ao nome do diretório.
namestringsimNome de exibição; reportado em SessionProfileMetadata.Name.
authorstringsimAutor; reportado em SessionProfileMetadata.Author.
versionstringsimString de versão do pacote (forma livre, coloque entre aspas: "1.0"); reportada em SessionProfileMetadata.Version.
compatibilitymapeamentonãoVer compatibility.
newmapeamentonãoPadrões de NEW_MAP. Ver new.
presetssequência de mapeamentossimDe 1 a 5 entradas de predefinição. Zero, mais de cinco ou um valor que não seja sequência gera OL_E_SESSION_PROFILE_INVALID.

compatibility#

ChaveTipoObrigatóriaDescrição
mapssequência de stringsnãoIdentidades de mapa (maps\<Map>\global.cfg) para as quais este perfil é válido. / é normalizado para \; a comparação não diferencia maiúsculas de minúsculas. Uma lista ausente ou vazia significa "qualquer mapa". Quando não vazia, é imposta para WorldMode.NewMap (contra o new.map efetivo ou /map) e para WorldMode.SavedSituation (contra o mapa referenciado pelo .osn selecionado, resolvido pelo catálogo de conteúdo). Para WorldMode.LastMapState nenhum mapa pode ser derivado, então uma lista não vazia sempre falha. Falha: OL_E_SESSION_PROFILE_MAP_MISMATCH.

new#

O bloco é lido e validado sempre que está presente, mas só é aplicado à especificação quando o modo de mundo selecionado é NEW_MAP (/new, o padrão da CLI). Com /saved:<file.osn> o bloco é ignorado.

ChaveTipoObrigatóriaAplicadaDescrição
mapstringnãosimIdentidade de mapa na forma normalizada maps\<Map>\global.cfg (o planejamento exige exatamente este formato: começa com maps\, termina com \global.cfg, sem ..). Define WorldSpec.MapIdentity.
entrypoint-indexinteironãosimÍndice do ponto de entrada apresentado (posição a partir de 0 na lista de pontos de entrada do OMSI). Define PresentedEntrypointIndex e limpa qualquer identidade de ponto de entrada.
entrypointstringnãosimIdentidade bruta do ponto de entrada. Define EntrypointIdentity e limpa o índice apresentado. Se entrypoint-index e entrypoint estiverem presentes, entrypoint prevalece porque é aplicado por último. A seleção por identidade de ponto de entrada é PARTIAL (BI-001): o planejamento reporta world.entrypoint-identity como RUNTIME_PARTIAL e o plano não é apto para execução. Prefira entrypoint-index.
datemapeamentonãonão (UNAVAILABLE)Ver new.date.
timemapeamentonãonão (UNAVAILABLE)Ver new.time.
yearinteironãonão (UNAVAILABLE)Ano explícito.
weathermapeamentonãonão (UNAVAILABLE)Ver new.weather.

date, time, year e weather são compilados em DateSpec, TimeSpec, YearSpec e WeatherSpec com DateTimeMode.Explicit / o WeatherMode selecionado. O planejador de sessão (src/OmsiLaunch.Core/SessionPlanner.cs) então reporta as capacidades world.explicit-date, world.explicit-time, world.explicit-year e weather como STATICALLY_PARTIAL, adiciona OL_E_CAPABILITY_UNAVAILABLE aos diagnósticos do plano e marca o plano como não apto para execução. O plugin, além disso, rejeita um handoff cujo modo de data ou hora não seja Unset (plugin.request.unsupported). Consequência para este build: um perfil que define qualquer uma dessas quatro chaves pode ser validado com /plan, mas não pode iniciar uma sessão (código de saída 1, OL_E_PLAN_NOT_RUNNABLE). Deixe-as fora dos perfis destinados a serem executados.

new.date#

ChaveTipoObrigatóriaDescrição
modestringsimDeve ser explicit (sem diferenciar maiúsculas de minúsculas). Qualquer outro valor gera OL_E_SESSION_PROFILE_INVALID ("date must use explicit mode.").
valuestringsimyyyy-MM-dd.

new.time#

ChaveTipoObrigatóriaDescrição
modestringsimDeve ser explicit.
valuestringsimHH:mm ou HH:mm:ss.

new.weather#

ChaveTipoObrigatóriaDescrição
modestringsimpreset, icao ou real (sem diferenciar maiúsculas de minúsculas). Qualquer outra coisa: OL_E_SESSION_PROFILE_INVALID ("Unsupported weather mode").
presetstringquando mode: presetNome da predefinição de clima.
icaostringquando mode: icaoCódigo ICAO da estação.

preset (cada entrada de presets)#

ChaveTipoObrigatóriaPadrãoDescrição
indexinteirosimDe 1 a 5, único dentro do perfil. Selecionado com /predefined-profile-index. Duplicado ou fora do intervalo: OL_E_SESSION_PROFILE_INVALID; um índice que não existe em nenhum lugar do perfil: OL_E_SESSION_PROFILE_PRESET_NOT_FOUND.
idstringsimIdentificador da predefinição; reportado como SessionProfileMetadata.PresetId.
namestringsimNome de exibição da predefinição; reportado como SessionProfileMetadata.PresetName.
settingsmapeamentonãonenhumConfigurações semânticas de options.cfg, ver Configurações. As chaves são comparadas com o catálogo sem diferenciar maiúsculas de minúsculas.
presentationmapeamentonãoherdarApresentação do splash, ver presentation. Quando ausente, a predefinição herda a linha de base (valor de /spec ou o padrão da CLI, Managed).
internet-texturesmapeamentonãoherdarVer internet-textures.
behaviormapeamentonãoherdarTimeouts, ver behavior.

Apenas a predefinição selecionada é aplicada. Todas as predefinições ainda são analisadas e validadas, então um erro na predefinição 3 faz falhar uma requisição da predefinição 1.

presentation#

ChaveTipoObrigatóriaDescrição
splashmapeamentosimObrigatório quando presentation está presente ("Presentation requires splash."). Ver presentation.splash.

presentation.splash#

ChaveTipoObrigatóriaPadrãoDescrição
modestringsimmanaged instala bitmaps de splash do OmsiLaunch durante a sessão (SplashMode.Managed). unset ou native preserva os arquivos de splash do próprio OMSI (SplashMode.Unset; Native é um alias). Sem diferenciar maiúsculas de minúsculas. Qualquer outra coisa: OL_E_SESSION_PROFILE_INVALID.
languagestringnãoENGIdioma do segundo destino de splash: PTB, ENG, DEU, FRA (aliases PT-BR, EN, DE, FR; qualquer valor desconhecido é resolvido como ENG na construção da sessão). Com mode: managed, a sessão aplica overlays de GUI\NewSplashscreen_ENG.bmp e GUI\NewSplashscreen_<language>.bmp.
assetsstringnãoassets empacotadosDiretório relativo ao pacote que contém ENG.bmp e, para um language diferente de inglês, <language>.bmp; cada um deve ser um BMP de 640x480 e 24 bits. O diretório deve existir no carregamento do perfil (OL_E_SESSION_PROFILE_ASSET_MISSING); os arquivos são validados no início da sessão (OL_E_SPLASH_ASSET_MISSING, OL_E_SPLASH_FORMAT_UNSUPPORTED). As regras de confinamento de caminho se aplicam. Quando omitido, é usado o .omsilaunch\assets\splash da instalação (ou os padrões empacotados).

Um perfil não pode definir SessionPresentationSpec.SuppressTrayIcon; ele permanece false, a menos que um /spec o defina.

internet-textures#

ChaveTipoObrigatóriaDescrição
modestringsimnative (InternetTexturesMode.Native, o OMSI se comporta normalmente), disabled (Disabled, o downloader interno ao processo, perfilado, é suprimido durante a sessão), override (Override, um perfil .itx com escopo de sessão é instalado como Texture\standard.itx). Sem diferenciar maiúsculas de minúsculas; qualquer outra coisa: OL_E_SESSION_PROFILE_INVALID.
profilestringobrigatória para overrideCaminho relativo ao pacote do arquivo .itx. Chave ausente com override: OL_E_SESSION_PROFILE_INVALID; arquivo ausente: OL_E_SESSION_PROFILE_ASSET_MISSING. As regras de confinamento de caminho se aplicam. O arquivo deve consistir em pares de linhas URL / target com URLs http:// ou https:// (caso contrário, OL_E_ITX_PROFILE_INVALID) e todo destino deve ser resolvido abaixo do diretório Texture\ da instalação sem atravessar um reparse point (OL_E_ITX_TARGET_OUTSIDE_TEXTURE_PATH). Os destinos listados e Texture\standard.ipr se tornam exclusões da sessão (ver transações e recuperação).

behavior#

ChaveTipoObrigatóriaPadrãoDescrição
startup-timeoutinteiro (segundos)não180Tempo permitido desde o início do processo até Running. Deve ser positivo no carregamento do perfil; a sessão exige, além disso, de 1 a 600 no início (caso contrário, OL_E_START_SESSION). Corresponde a LaunchBehaviorSpec.StartupTimeoutSeconds.
shutdown-timeoutinteiro (segundos)não30Corresponde a LaunchBehaviorSpec.ShutdownTimeoutSeconds. ACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECT: o supervisor encerra o OMSI diretamente e nunca lê este valor.

Quando o bloco behavior está presente, ambos os timeouts são definidos (valor informado ou padrão) e substituem inteiramente o LaunchBehaviorSpec da linha de base, incluindo RestoreConfiguration e SuppressStaleClosecheckWarning, que voltam aos seus padrões (true, true).

Configurações#

As chaves de settings são os nomes semânticos de ConfigurationCatalog (src/OmsiLaunch.Configuration/ConfigurationCatalog.cs). O compilador aceita uma chave somente se ela existir (OL_E_SESSION_PROFILE_SETTING_UNKNOWN) e for gravável (OL_E_SESSION_PROFILE_SETTING_NOT_WRITABLE). Os valores são armazenados como strings e convertidos em um patch de options.cfg quando a sessão constrói seus overlays; um valor inválido, portanto, é detectado em StartSessionAsync, não no carregamento do perfil, e faz a sessão falhar com OL_E_START_SESSION, cuja mensagem traz OL_E_INVALID_SETTING_VALUE: <key>. Todas as configurações abaixo gravam options.cfg; todas têm escopo de sessão e são restauradas exatamente após a sessão.

Formas de valor:

  • bool é true ou false (sem diferenciar maiúsculas de minúsculas). Para tokens de presença, o token é adicionado ou removido; para tokens invertidos (no_*), true remove o token negativo.
  • int / decimal são validados contra o intervalo; valores com divisor são armazenados divididos (por exemplo, graphics.minObjectScreenPercent: 5 grava 0.05).
  • string é gravada literalmente.
Chave de configuraçãoToken de options.cfgTipoIntervalo / valoresEvidência
general.languagelanguagestringqualquerSTATICALLY_VALIDATED
general.radioradiostringqualquerSTATICALLY_VALIDATED
general.alternateViewaltViewbool (presença)STATICALLY_VALIDATED
general.showOwnDriversee_own_driverbool (presença)STATICALLY_VALIDATED
general.showErrorMessagesshowerrormessagesbool (presença)STATICALLY_VALIDATED
general.autoSavenoAutoSavebool (presença invertida)STATICALLY_VALIDATED
general.currentTimeuseActTimebool (presença)STATICALLY_VALIDATED
general.currentDateuseActDatebool (presença)STATICALLY_VALIDATED
general.currentYearuseActYearbool (presença)STATICALLY_VALIDATED
graphics.screenRatioscreenratiostringqualquerSTATICALLY_VALIDATED
graphics.maxFPSmaxFPSint10..200STATICALLY_VALIDATED
graphics.tileDistanceperformance_tiledistmaxint1..20STATICALLY_VALIDATED
graphics.maxObjectDistanceMetersperformance_maxObjDistint20..5000STATICALLY_VALIDATED
graphics.minObjectScreenPercentperformance_minObjSizedecimal0..10, armazenado /100STATICALLY_VALIDATED
graphics.minReflectionObjectScreenPercentperformance_minObjSizeRefldecimal0..50, armazenado /100STATICALLY_VALIDATED
graphics.maxObjectComplexitymaxcomplexityint0..3STATICALLY_VALIDATED
graphics.maxMapComplexitymaxcomplexity_mapint0..2STATICALLY_VALIDATED
graphics.sunGlowsunglowbool (presença)STATICALLY_VALIDATED
graphics.loadAllTilesloadAllTilesbool (presença)STATICALLY_VALIDATED
graphics.stencilBufferno_stencilbufferbool (presença invertida)STATICALLY_VALIDATED
graphics.stencilShadowsshadow_stencilbool, gravado como on / offSTATICALLY_VALIDATED
graphics.rainReflectionsno_rain_reflbool (presença invertida)STATICALLY_VALIDATED
graphics.humansInRainReflectionsno_humans_on_rain_reflbool (presença invertida)STATICALLY_VALIDATED
graphics.realTimeReflectionsperformance_realreflexionsstringeconomy ou fullSTATICALLY_PARTIAL
graphics.particlessmokesystems (bloco de 4 linhas)enabled,maxPerEmitter,playerVehicleOnly,inReflections (bool,int>=0,bool,bool)STATICALLY_VALIDATED
simulation.collisionno_collisionbool (presença invertida)STATICALLY_VALIDATED
simulation.collisionTerrainno_collision_terrainbool (presença invertida)STATICALLY_VALIDATED
simulation.collisionVehiclesno_collision_vehToVehbool (presença invertida)STATICALLY_VALIDATED
simulation.collisionPedestriansno_collision_pedastriansbool (presença invertida)STATICALLY_VALIDATED
simulation.ticketSellingticketsellingint0..2STATICALLY_VALIDATED
simulation.maintenancewear_lifespanint0..4STATICALLY_VALIDATED
simulation.disableAutomaticScheduleAnalysisPopupno_schedAnaPopUpbool (presença)STATICALLY_VALIDATED
simulation.ticketInfono_ticketinfo_visiblebool (presença invertida)STATICALLY_VALIDATED
simulation.automaticClutchno_automaticClutchbool (presença invertida)STATICALLY_VALIDATED
advanced.reducedMultithreadingno_multithreading_calculate + no_multithreading_texloadbool (ambos tokens de presença)RUNTIME_PROVEN
view.driverSmoothdriverview_smoothbool (presença)STATICALLY_VALIDATED
view.driverMovingdriverview_movingbool (presença)STATICALLY_VALIDATED
controls.autoCenterautoCenterbool (presença)STATICALLY_VALIDATED
controls.reducedSteeringSpeedredSteerSpdbool (presença)STATICALLY_VALIDATED
traffic.randomVehiclesAIMaxCountRandom componente 0int0..1000STATICALLY_VALIDATED (RV-005 em runtime)
traffic.humansAIMaxCountRandom componente 1int0..1000STATICALLY_VALIDATED (RV-005 em 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

Entradas do catálogo que existem, mas não são graváveis (rejeitadas com OL_E_SESSION_PROFILE_SETTING_NOT_WRITABLE): advanced.multithreadingCalculate, advanced.multithreadingTextureLoad (substituídas por advanced.reducedMultithreading), graphics.texture, graphics.textureFilter.

Confinamento de caminho#

presentation.splash.assets e internet-textures.profile são resolvidos por Confined(package root, value):

  1. Caminhos enraizados (C:\...), caminhos que começam com \ e qualquer componente de caminho igual a .. são rejeitados.
  2. O caminho completo é calculado e deve começar com o diretório do pacote.
  3. Todo componente existente abaixo da raiz do pacote, até o caminho final inclusive, é inspecionado quanto ao atributo ReparsePoint. Uma junction, um link simbólico de diretório ou um link simbólico de arquivo em qualquer ponto desse caminho é rejeitado, assim como um componente que não pode ser inspecionado (IOException / UnauthorizedAccessException).

As três falhas geram OL_E_SESSION_PROFILE_PATH_ESCAPE. A mesma regra de reparse point é aplicada aos destinos .itx sob Texture\ na construção da sessão.

Precedência e conflitos de sobrescrita#

CliInput.BuildSpecAsync compõe a especificação nesta ordem:

  1. Padrões (NEW_MAP, tudo não definido, timeouts 180 s / 30 s).
  2. /spec:<file.json>, se informado, substitui inteiramente os padrões.
  3. Raiz da instalação: um argumento de instalação explícito prevalece sobre o RootPath da especificação; . significa o diretório que contém o executável.
  4. Perfil (/predefined-profile + /predefined-profile-index): o pacote é carregado e RejectProfileConflicts é executado contra os argumentos brutos da CLI antes de qualquer mesclagem. O bloco de mundo da base é então redefinido para um WorldSpec vazio do modo selecionado (um mundo de /spec é descartado quando um perfil é usado) e SessionProfileCompiler.Apply sobrepõe o perfil à base: new (apenas NEW_MAP), settings (mesclado sobre o Environment.General da base, o perfil prevalece por chave) e presentation, internet-textures, behavior (cada um substitui o bloco da base somente quando a predefinição o define).
  5. Argumentos restantes da CLI são sobrepostos por cima: /map, /entrypoint, /entrypoint-index, /date, /time, /year, flags de clima, flags de veículo, /set, flags de splash, flags de texturas da internet, /startup-timeout, /shutdown-timeout. Os timeouts da CLI se aplicam apenas quando informados; caso contrário, vale o valor da especificação/perfil/padrão.
  6. Verificação de compatibilidade para modos diferentes de NEW_MAP (ValidateCompatibility).

Um argumento da CLI que visa um campo pertencente ao perfil selecionado é um conflito, rejeitado com OL_E_SESSION_PROFILE_OVERRIDE_CONFLICT (código de saída 2, categoria invalid_argument). A verificação é por campo, não por valor: repetir o próprio valor do perfil ainda é um conflito.

Argumento da CLIConflita quando o perfil defineApenas no modo
/mapnew.mapNEW_MAP
/entrypoint ou /entrypoint-indexnew.entrypoint ou new.entrypoint-indexNEW_MAP
/datenew.dateNEW_MAP
/timenew.timeNEW_MAP
/yearnew.yearNEW_MAP
/weather, /weather-icao, /weather-realnew.weatherNEW_MAP
/set:<key>=...a mesma <key> nas settings da predefinição (sem diferenciar maiúsculas de minúsculas)qualquer
/splash, /splash-language, /splash-assetspresentation (qualquer)qualquer
/internet-textures, /internet-textures-profileinternet-textures (qualquer)qualquer
/startup-timeout, /shutdown-timeoutbehavior (qualquer)qualquer

Não são conflitos: chaves de /set que a predefinição não define (elas são adicionadas), flags de veículo (/vehicle, /repaint, /hof, /fleet, /registration, /no-vehicle; um perfil não pode definir um veículo do jogador) e qualquer argumento de mundo com /saved (o bloco new não é aplicado nesse caso). /map, /entrypoint e /entrypoint-index são inválidos junto com /saved, independentemente de perfis (OL_E_INVALID_ARGUMENT).

Códigos de erro#

CódigoGerado quandoSaída da CLI
OL_E_SESSION_PROFILE_NOT_FOUND<root>\.omsilaunch\session-profiles\<id>\profile.yaml não existe2
OL_E_SESSION_PROFILE_PATH_ESCAPEid não é um nome de diretório simples; assets / profile sai do pacote ou atravessa um reparse point2
OL_E_SESSION_PROFILE_SCHEMA_UNSUPPORTEDschema não é omsilaunch.session-profile/v12
OL_E_SESSION_PROFILE_INVALIDlimite de tamanho, forma do documento, âncoras, chave desconhecida, chave obrigatória ausente, valor não escalar, número/data/hora inválidos, divergência de id, regras de quantidade/índice de predefinições, palavras de modo não suportadas, timeout não positivo, presentation sem splash, override sem profile2
OL_E_SESSION_PROFILE_PRESET_NOT_FOUND/predefined-profile-index ausente, fora de 1..5 ou nenhuma predefinição com esse index2
OL_E_SESSION_PROFILE_SETTING_UNKNOWNuma chave de settings não está no catálogo2
OL_E_SESSION_PROFILE_SETTING_NOT_WRITABLEuma chave de settings está catalogada, mas é somente leitura2
OL_E_SESSION_PROFILE_ASSET_MISSINGo diretório assets ou o arquivo profile não existe dentro do pacote2
OL_E_SESSION_PROFILE_MAP_MISMATCHcompatibility.maps não está vazio e o mapa efetivo não está listado (ou não pode ser derivado)2
OL_E_SESSION_PROFILE_OVERRIDE_CONFLICTum argumento explícito da CLI visa um campo pertencente ao perfil2

Todos esses erros são gerados enquanto a linha de comando está sendo compilada, antes do planejamento. Eles são SessionProfileException (ou ArgumentException para o conflito) e nunca iniciam uma sessão. O catálogo completo está em erros; os códigos de saída em códigos de saída.

Como um perfil aparece na API#

Após um carregamento bem-sucedido, a especificação traz um registro SessionProfileMetadata em LaunchSpec.SessionProfile:

CampoOrigem
Idid
Namename
Versionversion
Authorauthor
PresetIdid da predefinição selecionada
PresetIndexindex da predefinição selecionada
PresetNamename da predefinição selecionada
PackagePathdiretório absoluto do pacote

O planejador adiciona um diagnóstico informativo session_profile.selected a todo SessionPlan construído a partir de tal especificação, com as chaves de dados session_profile.id, session_profile.name, session_profile.version, session_profile.author, session_profile.preset_id, session_profile.preset_index, session_profile.preset_name e session_profile.path. Ele não afeta a aptidão para execução. Integradores que usam a API pública diretamente podem chamar SessionProfileCompiler.Load e SessionProfileCompiler.Apply a partir de OmsiLaunch.Core; a representação YAML nunca passa para OmsiLaunch.Api.

Exemplos#

Exemplo 1: perfil apenas com configurações, uma predefinição#

<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

Execução: OmsiLaunch.exe /predefined-profile:quiet-evening /predefined-profile-index:1 /new /map:maps\Grundorf\global.cfg /entrypoint-index:0. O mapa e o ponto de entrada vêm da linha de comando porque o perfil não define nenhum bloco new; adicionar /set:graphics.maxFPS=60 é permitido, adicionar /set:traffic.humans=10 é um conflito.

Exemplo 2: perfil vinculado a um mapa com três predefinições e assets empacotados#

<root>\.omsilaunch\session-profiles\grundorf-tour\profile.yaml, com assets\splash\ENG.bmp, assets\splash\DEU.bmp e textures\offline.itx dentro do pacote:

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

Execução: OmsiLaunch.exe /predefined-profile:grundorf-tour /predefined-profile-index:2 /new. Com /saved:situations\mytrip.osn, o bloco new é ignorado e o .osn deve referenciar maps\Grundorf\global.cfg.

O exemplo empacotado#

O release distribui docs/examples/session-profiles/rmg-leste/profile.yaml (ver). Ele é sintaticamente válido, corresponde ao schema e seria carregado sem erro. Duas características o impedem de iniciar uma sessão sem alterações neste build:

  1. Ele define new.date, new.time e new.weather, que tornam o plano não apto para execução (ver O bloco new).
  2. Seus valores de caminho são escalares simples com barras invertidas duplas (maps\\RMG Leste\\global.cfg). O YAML as mantém duplas, e as identidades de mapa são comparadas textualmente (após apenas a normalização de / para \), então new.map e compatibility.maps não corresponderiam à identidade de catálogo maps\RMG Leste\global.cfg (OL_E_MAP_NOT_FOUND no planejamento). O valor de assets ainda é resolvido porque a normalização de caminhos do Windows reduz separadores duplicados.

A forma apta para execução neste build é:

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