Perfis de sessão

Documentação da versão v0.1.0-beta.3Ver código-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: em caso de divergência, prevalecem a página em inglês e o código.

Um perfil de sessão é um pacote YAML declarativo que um autor de conteúdos distribui com um mapa ou um add-on para que os utilizadores finais possam iniciar uma sessão reprodutí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 tal como 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 definições que um perfil pode escrever (ConfigurationCatalog). Tudo o que um perfil pode fazer também o podem fazer as flags da CLI e o LaunchSpec; um perfil limita-se a empacotar essas escolhas.

Estabilidade: STABLE_BETA para a análise, a validação, a deteção de conflitos e os blocos settings / presentation / internet-textures / behavior (teste offline session-profiles.strict-compiler; o caminho de overlay e restauro está validado em runtime por RV-005 e RV-006, ver o estado 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).

Localização e nomenclatura do pacote#

ItemRegra
Diretório do pacote<installation root>\.omsilaunch\session-profiles\<id>\
Ficheiro do perfil<package>\profile.yaml (nome exato, um único ficheiro)
RecursosQuaisquer ficheiros ou diretórios dentro do diretório do pacote, referenciados por caminho relativo a partir de presentation.splash.assets e internet-textures.profile
idTem de 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 ... As violações dão OL_E_SESSION_PROFILE_PATH_ESCAPE. O valor id declarado dentro de profile.yaml tem de ser igual ao nome do diretório byte a byte (distinguindo maiúsculas de minúsculas); caso contrário OL_E_SESSION_PROFILE_INVALID.
Seleção/predefined-profile:<id> juntamente 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 em faltaOL_E_SESSION_PROFILE_NOT_FOUND
Estrutura no lançamentoO pacote de lançamento inclui um exemplo em .omsilaunch\examples\session-profiles\rmg-leste\ (ver empacotamento). Os exemplos não são perfis: para tornar um pacote selecionável, é preciso copiá-lo para .omsilaunch\session-profiles\<id>\.

Um perfil é instalado e removido pelo utilizador ou pelo autor de conteúdos. O OmsiLaunch nunca escreve num pacote, nunca o copia e nunca o elimina. 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
Esquemaschema tem de ser exatamente omsilaunch.session-profile/v1 (distinguindo maiúsculas de minúsculas)OL_E_SESSION_PROFILE_SCHEMA_UNSUPPORTED
Âncoras e aliasesQualquer nó com uma âncora YAML (&name) em qualquer parte do documento é rejeitado antes da validação; por isso, os aliases (*name) não podem ocorrerOL_E_SESSION_PROFILE_INVALID ("YAML anchors are not supported.")
Chaves desconhecidasTodos os mapeamentos são fechados: uma chave que não esteja listada para o seu contexto nas tabelas abaixo é rejeitada ("Unknown property in <context>: <key>"). As chaves são comparadas distinguindo maiúsculas de minúsculas (Schema: é uma chave desconhecida). O único mapeamento aberto é settings, cujas chaves são validadas contra o catálogo de definições.OL_E_SESSION_PROFILE_INVALID
EscalaresTodos os valores folha têm de ser escalares; sequências e mapeamentos onde se espera um escalar são rejeitados ("<field> must be a scalar.")OL_E_SESSION_PROFILE_INVALID
NúmerosOs inteiros são analisados com a cultura invariante (1, 30); os 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 a cultura invariante; usar 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 para uma árvore de representação; não são suportadas tags, tipos personalizados nem execução de código

As barras invertidas em escalares simples (sem aspas) são caracteres literais. Os caminhos do Windows escrevem-se com uma única barra invertida (maps\Grundorf\global.cfg). Uma barra invertida duplicada num escalar simples fica duplicada no valor; ver O exemplo incluído no pacote.

Referência das chaves#

Os contextos têm exatamente os nomes que o compilador lhes dá. Todas as chaves aqui listadas são aceites; nenhuma outra o é.

profile (mapeamento raiz)#

ChaveTipoObrigatóriaDescrição
schemastringsimLiteral omsilaunch.session-profile/v1.
idstringsimIdentificador do pacote; tem de ser igual ao nome do diretório.
namestringsimNome de apresentação; reportado em SessionProfileMetadata.Name.
authorstringsimAutor; reportado em SessionProfileMetadata.Author.
versionstringsimString de versão do pacote (forma livre; colocá-la entre aspas: "1.0"); reportada em SessionProfileMetadata.Version.
compatibilitymapeamentonãoVer compatibility.
newmapeamentonãoPredefinições de NEW_MAP. Ver new.
presetssequência de mapeamentossim1 a 5 entradas de predefinição. Zero, mais de cinco ou um valor que não seja uma sequência dá 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 distingue maiúsculas de minúsculas. Uma lista ausente ou vazia significa "qualquer mapa". Quando não está vazia, é imposta para WorldMode.NewMap (contra o new.map efetivo ou /map) e para WorldMode.SavedSituation (contra o mapa referenciado pelo .osn selecionado, resolvido através do catálogo de conteúdos). Para WorldMode.LastMapState não é possível derivar nenhum mapa, pelo que uma lista não vazia falha sempre. 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, a predefiniçã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 planeamento exige exatamente esta forma: começa por maps\, termina em \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 ambos presentes, prevalece entrypoint, porque é aplicado em último lugar. A seleção por identidade de ponto de entrada é PARTIAL (BI-001): o planeamento reporta world.entrypoint-identity como RUNTIME_PARTIAL e o plano não é executável. Preferir 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 planeador de sessões (src/OmsiLaunch.Core/SessionPlanner.cs) reporta então as capacidades world.explicit-date, world.explicit-time, world.explicit-year e weather como STATICALLY_PARTIAL, acrescenta OL_E_CAPABILITY_UNAVAILABLE aos diagnósticos do plano e marca o plano como não executável. Além disso, o plugin rejeita um handoff cujo modo de data ou de hora não seja Unset (plugin.request.unsupported). Consequência para este build: um perfil que defina qualquer uma destas quatro chaves pode ser validado com /plan, mas não consegue iniciar uma sessão (código de saída 1, OL_E_PLAN_NOT_RUNNABLE). Estas chaves devem ficar de fora dos perfis destinados a ser executados.

new.date#

ChaveTipoObrigatóriaDescrição
modestringsimTem de ser explicit (sem distinção de maiúsculas/minúsculas). Qualquer outro valor dá OL_E_SESSION_PROFILE_INVALID ("date must use explicit mode.").
valuestringsimyyyy-MM-dd.

new.time#

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

new.weather#

ChaveTipoObrigatóriaDescrição
modestringsimpreset, icao ou real (sem distinção de maiúsculas/minúsculas). Qualquer outro valor: OL_E_SESSION_PROFILE_INVALID ("Unsupported weather mode").
presetstringquando mode: presetNome da predefinição meteorológica.
icaostringquando mode: icaoCódigo ICAO da estação.

preset (cada entrada de presets)#

ChaveTipoObrigatóriaPredefiniçãoDescrição
indexinteirosim1 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 ponto do perfil: OL_E_SESSION_PROFILE_PRESET_NOT_FOUND.
idstringsimIdentificador da predefinição; reportado como SessionProfileMetadata.PresetId.
namestringsimNome de apresentação da predefinição; reportado como SessionProfileMetadata.PresetName.
settingsmapeamentonãonenhumaDefinições semânticas de options.cfg, ver Definições. As chaves são comparadas com o catálogo sem distinção de maiúsculas/minúsculas.
presentationmapeamentonãoherdadaApresentação do splash, ver presentation. Quando ausente, a predefinição herda a base (valor de /spec ou a predefinição da CLI, Managed).
internet-texturesmapeamentonãoherdadaVer internet-textures.
behaviormapeamentonãoherdadaTimeouts, ver behavior.

Só a predefinição selecionada é aplicada. Todas as predefinições são, ainda assim, analisadas e validadas, pelo que um erro na predefinição 3 faz falhar um pedido da predefinição 1.

presentation#

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

presentation.splash#

ChaveTipoObrigatóriaPredefiniçãoDescrição
modestringsimmanaged instala os bitmaps de ecrã de abertura (splash screen) do OmsiLaunch durante a sessão (SplashMode.Managed). unset ou native preserva os ficheiros de splash do próprio OMSI (SplashMode.Unset; Native é um alias). Sem distinção de maiúsculas/minúsculas. Qualquer outro valor: OL_E_SESSION_PROFILE_INVALID.
languagestringnãoENGIdioma do segundo destino do splash: PTB, ENG, DEU, FRA (aliases PT-BR, EN, DE, FR; qualquer valor desconhecido é resolvido para ENG na construção da sessão). Com mode: managed, a sessão aplica um overlay a GUI\NewSplashscreen_ENG.bmp e GUI\NewSplashscreen_<language>.bmp.
assetsstringnãorecursos incluídos no pacote de lançamentoDiretório relativo ao pacote que contém ENG.bmp e, para um language que não seja inglês, <language>.bmp; cada um tem de ser um BMP de 640x480 e 24 bits. O diretório tem de existir no carregamento do perfil (OL_E_SESSION_PROFILE_ASSET_MISSING); os ficheiros são validados no arranque da sessão (OL_E_SPLASH_ASSET_MISSING, OL_E_SPLASH_FORMAT_UNSUPPORTED). Aplicam-se as regras de confinamento de caminhos. Quando omitido, é usado o .omsilaunch\assets\splash da instalação (ou as predefinições incluídas no pacote de lançamento).

Um perfil não pode definir SessionPresentationSpec.SuppressTrayIcon; mantém-se false, a menos que um /spec o defina.

internet-textures#

ChaveTipoObrigatóriaDescrição
modestringsimnative (InternetTexturesMode.Native, o OMSI comporta-se normalmente), disabled (Disabled, o mecanismo de transferência interno do processo, com perfil de build, é suprimido durante a sessão), override (Override, um perfil .itx com âmbito de sessão é instalado como Texture\standard.itx). Sem distinção de maiúsculas/minúsculas; qualquer outro valor: OL_E_SESSION_PROFILE_INVALID.
profilestringobrigatória para overrideCaminho relativo ao pacote do ficheiro .itx. Chave em falta com override: OL_E_SESSION_PROFILE_INVALID; ficheiro em falta: OL_E_SESSION_PROFILE_ASSET_MISSING. Aplicam-se as regras de confinamento de caminhos. O ficheiro tem de consistir em pares de linhas URL / target com URLs http:// ou https:// (caso contrário OL_E_ITX_PROFILE_INVALID) e cada destino tem de ser resolvido abaixo do diretório Texture\ da instalação sem atravessar um ponto de reanálise (OL_E_ITX_TARGET_OUTSIDE_TEXTURE_PATH). Os destinos listados e Texture\standard.ipr tornam-se eliminações da sessão (ver transações e recuperação).

behavior#

ChaveTipoObrigatóriaPredefiniçãoDescrição
startup-timeoutinteiro (segundos)não180Tempo permitido desde o arranque do processo até Running. Tem de ser positivo no carregamento do perfil; a sessão exige, além disso, 1 a 600 no arranque (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 termina o OMSI diretamente e nunca lê este valor.

Quando o bloco behavior está presente, ambos os timeouts são definidos (valor indicado ou predefinição) e substituem por completo o LaunchBehaviorSpec de base, incluindo RestoreConfiguration e SuppressStaleClosecheckWarning, que voltam às respetivas predefinições (true, true).

Definições#

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

Formas dos valores:

  • bool é true ou false (sem distinção de maiúsculas/minúsculas). Nos tokens de presença, o token é acrescentado ou removido; nos tokens invertidos (no_*), true remove o token negativo.
  • int / decimal são validados contra o intervalo; os valores com divisor são guardados divididos (por exemplo, graphics.minObjectScreenPercent: 5 escreve 0.05).
  • string é escrita tal como está.
Chave da definiçã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, guardado /100STATICALLY_VALIDATED
graphics.minReflectionObjectScreenPercentperformance_minObjSizeRefldecimal0..50, guardado /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, escrito 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 caminhos#

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

  1. São rejeitados os caminhos com raiz (C:\...), os caminhos que começam por \ e qualquer componente de caminho igual a ...
  2. O caminho completo é calculado e tem de começar pelo diretório do pacote.
  3. Cada componente existente abaixo da raiz do pacote, até ao caminho final inclusive, é inspecionado quanto ao atributo ReparsePoint. Uma junção, uma ligação simbólica de diretório ou uma ligação simbólica de ficheiro em qualquer ponto desse caminho é rejeitada, tal como um componente que não possa ser inspecionado (IOException / UnauthorizedAccessException).

As três falhas dão OL_E_SESSION_PROFILE_PATH_ESCAPE. A mesma regra de pontos de reanálise é aplicada aos destinos .itx sob Texture\ na construção da sessão.

Precedência e conflitos de substituição#

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

  1. Predefinições (NEW_MAP, tudo por definir, timeouts 180 s / 30 s).
  2. /spec:<file.json>, se indicado, substitui por completo as predefiniçõ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 fusão. O bloco de mundo da semente é então reposto num WorldSpec vazio do modo selecionado (um mundo de /spec é descartado quando se usa um perfil) e SessionProfileCompiler.Apply sobrepõe o perfil à semente: new (apenas NEW_MAP), settings (fundidas sobre o Environment.General da semente, prevalecendo o perfil chave a chave) e presentation, internet-textures, behavior (cada um substitui o bloco da semente apenas quando a predefinição o define).
  5. Restantes argumentos da CLI são sobrepostos: /map, /entrypoint, /entrypoint-index, /date, /time, /year, flags de meteorologia, flags de veículo, /set, flags de splash, flags de internet-textures, /startup-timeout, /shutdown-timeout. Os timeouts da CLI só se aplicam quando indicados; caso contrário mantém-se o valor da especificação/perfil/predefinição.
  6. Verificação de compatibilidade para modos que não sejam NEW_MAP (ValidateCompatibility).

Um argumento da CLI que vise 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 é feita por campo, não por valor: repetir o próprio valor do perfil continua a ser um conflito.

Argumento da CLIEntra em conflito 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 distinção de maiúsculas/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 /set que a predefinição não define (são acrescentadas), 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 em conjunto com /saved, independentemente dos 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 ponto de reanálise2
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 em falta, valor não escalar, número/data/hora inválido, id não coincidente, regras de número/índice das 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 em falta, 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á no catálogo mas é só de leitura2
OL_E_SESSION_PROFILE_ASSET_MISSINGo diretório assets ou o ficheiro 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 estes erros são gerados durante a compilação da linha de comandos, antes do planeamento. São SessionProfileException (ou ArgumentException no caso do conflito) e nunca iniciam uma sessão. O catálogo completo está em erros; os códigos de saída estão em códigos de saída.

Como um perfil aparece na API#

Após um carregamento bem-sucedido, a especificação transporta um registo 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 planeador acrescenta um diagnóstico informativo session_profile.selected a cada SessionPlan construído a partir de uma 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. Não afeta a executabilidade. Os integradores que usam diretamente a API pública podem chamar SessionProfileCompiler.Load e SessionProfileCompiler.Apply a partir de OmsiLaunch.Core; a representação YAML nunca atravessa para OmsiLaunch.Api.

Exemplos#

Exemplo 1: perfil só com definiçõ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

Executar: 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 comandos porque o perfil não define nenhum bloco new; acrescentar /set:graphics.maxFPS=60 é permitido, acrescentar /set:traffic.humans=10 é um conflito.

Exemplo 2: perfil associado a um mapa, com três predefinições e recursos incluídos no pacote#

<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

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

O exemplo incluído no pacote#

O lançamento inclui docs/examples/session-profiles/rmg-leste/profile.yaml (ver). É sintaticamente válido, corresponde ao esquema e seria carregado sem erros. Duas propriedades impedem-no de iniciar uma sessão sem alterações neste build:

  1. Define new.date, new.time e new.weather, que tornam o plano não executável (ver O bloco new).
  2. Os seus valores de caminho são escalares simples com barras invertidas duplicadas (maps\\RMG Leste\\global.cfg). O YAML mantém-nas duplicadas e as identidades de mapa são comparadas textualmente (apenas após a normalização de / para \), pelo que new.map e compatibility.maps não corresponderiam à identidade do catálogo maps\RMG Leste\global.cfg (OL_E_MAP_NOT_FOUND no planeamento). O valor assets continua a ser resolvido porque a normalização de caminhos do Windows reduz os separadores duplicados.

A forma executável para este 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