工作階段設定檔

文件版本 v0.1.0-beta.3在 GitHub 上檢視原始檔

本頁為 OmsiLaunch 0.1.0-beta3 英文原始頁面 的翻譯。英文頁面為規範版本:若有出入,以英文頁面與程式碼為準。

工作階段設定檔是一種宣告式 YAML 套件,由內容作者隨地圖或附加元件一起發佈,讓終端使用者只需一個命令(OmsiLaunch.exe /predefined-profile:<id> /predefined-profile-index:<1..5> /new)就能啟動可重現的 OmsiLaunch 工作階段。本頁是下列內容的規範性參考:由 src/OmsiLaunch.Core/SessionProfiles.cs 中的 SessionProfileCompiler 所實作的 omsilaunch.session-profile/v1 格式、CLI 套用的優先順序規則(tools/OmsiLaunch.Cli/Program.cs 中的 CliInput.BuildSpecAsync 與 RejectProfileConflicts),以及設定檔可寫入的設定目錄(ConfigurationCatalog)。設定檔能做的一切,CLI 旗標與 LaunchSpec 也都能做;設定檔只是將這些選擇打包起來。

穩定性:剖析、驗證、衝突偵測以及 settings / presentation / internet-textures / behavior 區塊為 STABLE_BETA(離線測試 session-profiles.strict-compiler;overlay(暫時覆蓋)與還原路徑已由 RV-005 與 RV-006 於執行階段驗證,請見執行階段驗證狀態)。new.date、new.time、new.year 與 new.weather 鍵在此組建中為 UNAVAILABLE(請見 new 區塊)。

套件位置與命名#

項目規則
套件目錄<installation root>\.omsilaunch\session-profiles\<id>\
設定檔檔案<package>\profile.yaml(名稱須完全相同,僅一個檔案)
資產套件目錄內的任何檔案或目錄,由 presentation.splash.assets 與 internet-textures.profile 以相對路徑參考
id必須是單純的目錄名稱:不可為空或僅含空白字元、不可包含 \、/ 或 :,且不可包含序列 ..。違反時為 OL_E_SESSION_PROFILE_PATH_ESCAPE。profile.yaml 內宣告的 id 值必須與目錄名稱逐位元組相同(區分大小寫);否則為 OL_E_SESSION_PROFILE_INVALID。
選取/predefined-profile:<id> 搭配 /predefined-profile-index:<n>。索引為必要:只有 /predefined-profile 而沒有 /predefined-profile-index 時會以 OL_E_SESSION_PROFILE_PRESET_NOT_FOUND 失敗。
套件不存在OL_E_SESSION_PROFILE_NOT_FOUND
發行配置發行套件在 .omsilaunch\examples\session-profiles\rmg-leste\ 下隨附一個範例(請見封裝)。範例不是設定檔:請將套件複製到 .omsilaunch\session-profiles\<id>\ 才能選取。

設定檔由使用者或內容作者安裝與移除。OmsiLaunch 從不寫入套件、從不複製套件,也從不刪除套件。套件目錄不屬於任何交易。

剖析規則#

規則行為錯誤
大小限制profile.yaml 不可超過 256 KiB(262,144 位元組)OL_E_SESSION_PROFILE_INVALID
文件結構恰好一個 YAML 文件,其根節點為對應(mapping)OL_E_SESSION_PROFILE_INVALID
結構描述schema 必須完全等於 omsilaunch.session-profile/v1(區分大小寫)OL_E_SESSION_PROFILE_SCHEMA_UNSUPPORTED
錨點與別名文件中任何位置帶有 YAML 錨點(&name)的節點都會在驗證前遭拒絕;因此不可能出現別名(*name)OL_E_SESSION_PROFILE_INVALID("YAML anchors are not supported.")
未知鍵每個對應都是封閉的:未列在下表中對應情境的鍵會遭拒絕("Unknown property in <context>: <key>")。鍵的比對區分大小寫(Schema: 是未知鍵)。唯一開放的對應是 settings,其鍵改為依設定目錄驗證。OL_E_SESSION_PROFILE_INVALID
純量每個葉節點值都必須是純量;預期純量之處若為序列或對應會遭拒絕("<field> must be a scalar.")OL_E_SESSION_PROFILE_INVALID
數字整數以不變文化特性剖析(1、30);settings 中的小數以 . 作為分隔符號OL_E_SESSION_PROFILE_INVALID
日期與時間new.date.value 由 DateOnly.Parse 剖析,new.time.value 由 TimeOnly.Parse 剖析,兩者皆使用不變文化特性;請使用 ISO 格式 yyyy-MM-dd 與 HH:mm[:ss]OL_E_SESSION_PROFILE_INVALID
YAML 語法錯誤以剖析器訊息回報OL_E_SESSION_PROFILE_INVALID("Invalid YAML: ...")
可執行內容YAML 以 YamlDotNet 僅剖析為表示樹;不支援標籤、自訂型別或程式碼執行

純量(未加引號)中的反斜線是字面字元。Windows 路徑請以單一反斜線書寫(maps\Grundorf\global.cfg)。純量中的雙反斜線在值中仍會維持雙反斜線;請見隨附的範例。

鍵參考#

情境名稱與編譯器所使用的名稱完全相同。此處列出的每個鍵都會被接受;除此之外一律不接受。

profile(根對應)#

鍵型別必要說明
schema字串是字面值 omsilaunch.session-profile/v1。
id字串是套件識別碼;必須等於目錄名稱。
name字串是顯示名稱;回報於 SessionProfileMetadata.Name。
author字串是作者;回報於 SessionProfileMetadata.Author。
version字串是套件版本字串(格式自由,請加上引號:"1.0");回報於 SessionProfileMetadata.Version。
compatibility對應否請見 compatibility。
new對應否NEW_MAP 預設值。請見 new。
presets對應的序列是1 到 5 個預設組合(preset)項目。零個、超過五個或非序列的值為 OL_E_SESSION_PROFILE_INVALID。

compatibility#

鍵型別必要說明
maps字串的序列否此設定檔適用的地圖識別碼(maps\<Map>\global.cfg)。/ 會正規化為 \;比對不區分大小寫。清單不存在或為空表示「任何地圖」。清單非空時,會對 WorldMode.NewMap(對照有效的 new.map 或 /map)以及 WorldMode.SavedSituation(對照所選 .osn 參考的地圖,透過內容目錄解析)強制執行。對 WorldMode.LastMapState 無法推導出地圖,因此非空清單一律失敗。失敗:OL_E_SESSION_PROFILE_MAP_MISMATCH。

new#

只要此區塊存在就會被讀取與驗證,但只有在所選世界模式為 NEW_MAP(/new,CLI 預設值)時才會套用到 spec。在 /saved:<file.osn> 下此區塊會被忽略。

鍵型別必要是否套用說明
map字串否是正規化形式 maps\<Map>\global.cfg 的地圖識別碼(規劃時要求完全符合此形狀:以 maps\ 開頭、以 \global.cfg 結尾、不含 ..)。設定 WorldSpec.MapIdentity。
entrypoint-index整數否是所呈現的進入點索引(在 OMSI 進入點清單中以 0 起算的位置)。設定 PresentedEntrypointIndex 並清除任何進入點識別碼。
entrypoint字串否是原始進入點識別碼。設定 EntrypointIdentity 並清除所呈現的索引。若同時有 entrypoint-index 與 entrypoint,由於 entrypoint 最後套用,因此以它為準。以進入點識別碼選取為 PARTIAL(BI-001):規劃時會將 world.entrypoint-identity 回報為 RUNTIME_PARTIAL,且計畫不可執行。建議使用 entrypoint-index。
date對應否否(UNAVAILABLE)請見 new.date。
time對應否否(UNAVAILABLE)請見 new.time。
year整數否否(UNAVAILABLE)明確年份。
weather對應否否(UNAVAILABLE)請見 new.weather。

date、time、year 與 weather 會以 DateTimeMode.Explicit/所選的 WeatherMode 編譯為 DateSpec、TimeSpec、YearSpec 與 WeatherSpec。接著工作階段規劃器(src/OmsiLaunch.Core/SessionPlanner.cs)會將功能 world.explicit-date、world.explicit-time、world.explicit-year 與 weather 回報為 STATICALLY_PARTIAL,在計畫診斷訊息中加入 OL_E_CAPABILITY_UNAVAILABLE,並將計畫標記為不可執行。此外,外掛程式也會拒絕日期或時間模式不為 Unset 的交接資料(plugin.request.unsupported)。對此組建的影響:設定了這四個鍵中任何一個的設定檔可以用 /plan 驗證,但無法啟動工作階段(結束代碼 1,OL_E_PLAN_NOT_RUNNABLE)。預定要執行的設定檔請不要包含這些鍵。

new.date#

鍵型別必要說明
mode字串是必須為 explicit(不區分大小寫)。其他任何值皆為 OL_E_SESSION_PROFILE_INVALID("date must use explicit mode.")。
value字串是yyyy-MM-dd。

new.time#

鍵型別必要說明
mode字串是必須為 explicit。
value字串是HH:mm 或 HH:mm:ss。

new.weather#

鍵型別必要說明
mode字串是preset、icao 或 real(不區分大小寫)。其他任何值:OL_E_SESSION_PROFILE_INVALID("Unsupported weather mode")。
preset字串mode: preset 時天氣預設組合名稱。
icao字串mode: icao 時ICAO 氣象站代碼。

preset(presets 的每個項目)#

鍵型別必要預設值說明
index整數是1 到 5,在設定檔內唯一。以 /predefined-profile-index 選取。重複或超出範圍:OL_E_SESSION_PROFILE_INVALID;設定檔中任何地方都不存在的索引:OL_E_SESSION_PROFILE_PRESET_NOT_FOUND。
id字串是預設組合識別碼;回報為 SessionProfileMetadata.PresetId。
name字串是預設組合顯示名稱;回報為 SessionProfileMetadata.PresetName。
settings對應否無語意 options.cfg 設定,請見設定。鍵以不區分大小寫的方式與設定目錄比對。
presentation對應否繼承啟動畫面(splash)呈現,請見 presentation。不存在時,預設組合會繼承基準值(/spec 的值或 CLI 預設值 Managed)。
internet-textures對應否繼承請見 internet-textures。
behavior對應否繼承逾時,請見 behavior。

只會套用所選的預設組合。但每個預設組合仍會被剖析與驗證,因此預設組合 3 中的錯誤也會使對預設組合 1 的請求失敗。

presentation#

鍵型別必要說明
splash對應是presentation 存在時為必要("Presentation requires splash.")。請見 presentation.splash。

presentation.splash#

鍵型別必要預設值說明
mode字串是managed 會在工作階段期間安裝 OmsiLaunch 的啟動畫面點陣圖(SplashMode.Managed)。unset 或 native 會保留 OMSI 自己的啟動畫面檔案(SplashMode.Unset;Native 為別名)。不區分大小寫。其他任何值:OL_E_SESSION_PROFILE_INVALID。
language字串否ENG第二個啟動畫面目標的地區語言:PTB、ENG、DEU、FRA(別名 PT-BR、EN、DE、FR;任何未知值在建立工作階段時會解析為 ENG)。搭配 mode: managed 時,工作階段會以 overlay 覆蓋 GUI\NewSplashscreen_ENG.bmp 與 GUI\NewSplashscreen_<language>.bmp。
assets字串否套件隨附的資產相對於套件的目錄,其中包含 ENG.bmp,以及(非英文 language 時)<language>.bmp;每個檔案都必須是 640x480、24 位元的 BMP。載入設定檔時目錄必須存在(OL_E_SESSION_PROFILE_ASSET_MISSING);檔案在工作階段啟動時驗證(OL_E_SPLASH_ASSET_MISSING、OL_E_SPLASH_FORMAT_UNSUPPORTED)。適用路徑限制規則。省略時使用安裝中的 .omsilaunch\assets\splash(或隨附的預設資產)。

設定檔無法設定 SessionPresentationSpec.SuppressTrayIcon;除非由 /spec 設定,否則它維持為 false。

internet-textures#

鍵型別必要說明
mode字串是native(InternetTexturesMode.Native,OMSI 正常運作)、disabled(Disabled,工作階段期間抑制組建設定檔所涵蓋的處理程序內下載器)、override(Override,將工作階段範圍的 .itx 設定檔安裝為 Texture\standard.itx)。不區分大小寫;其他任何值:OL_E_SESSION_PROFILE_INVALID。
profile字串override 時為必要.itx 檔案相對於套件的路徑。override 時缺少此鍵:OL_E_SESSION_PROFILE_INVALID;檔案不存在:OL_E_SESSION_PROFILE_ASSET_MISSING。適用路徑限制規則。檔案必須由 URL / target 行對組成,且 URL 為 http:// 或 https://(否則為 OL_E_ITX_PROFILE_INVALID),而每個目標都必須解析到安裝的 Texture\ 目錄之下,且不可經過重新分析點(OL_E_ITX_TARGET_OUTSIDE_TEXTURE_PATH)。列出的目標與 Texture\standard.ipr 會成為工作階段刪除項目(請見交易與復原)。

behavior#

鍵型別必要預設值說明
startup-timeout整數(秒)否180從處理程序啟動到 Running 的允許時間。載入設定檔時必須為正數;工作階段在啟動時另外要求 1 到 600(否則為 OL_E_START_SESSION)。對應至 LaunchBehaviorSpec.StartupTimeoutSeconds。
shutdown-timeout整數(秒)否30對應至 LaunchBehaviorSpec.ShutdownTimeoutSeconds。ACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECT:監督程式會直接終止 OMSI,從不讀取此值。

behavior 區塊存在時,兩個逾時都會被設定(指定值或預設值),並完全取代基準的 LaunchBehaviorSpec,包括 RestoreConfiguration 與 SuppressStaleClosecheckWarning,這兩者會恢復為其預設值(true、true)。

設定#

settings 的鍵是 ConfigurationCatalog(src/OmsiLaunch.Configuration/ConfigurationCatalog.cs)的語意名稱。編譯器只接受存在(OL_E_SESSION_PROFILE_SETTING_UNKNOWN)且可寫入(OL_E_SESSION_PROFILE_SETTING_NOT_WRITABLE)的鍵。值以字串儲存,並在工作階段建立其 overlay 時轉換為 options.cfg 修補;因此無效值會在 StartSessionAsync 時才被偵測到,而非在載入設定檔時,並使工作階段以 OL_E_START_SESSION 失敗,其訊息帶有 OL_E_INVALID_SETTING_VALUE: <key>。下列每個設定都會寫入 options.cfg;它們全都限於工作階段範圍,並在工作階段結束後精確還原。

值的形式:

  • bool 為 true 或 false(不區分大小寫)。對於存在型 token,會新增或移除該 token;對於反向 token(no_*),true 會移除否定 token。
  • int / decimal 會依範圍驗證;帶有除數的值會以除過的值儲存(例如 graphics.minObjectScreenPercent: 5 會寫入 0.05)。
  • string 依原樣寫入。
設定鍵options.cfg token型別範圍/值證據
general.languagelanguagestring任意STATICALLY_VALIDATED
general.radioradiostring任意STATICALLY_VALIDATED
general.alternateViewaltViewbool(存在型)STATICALLY_VALIDATED
general.showOwnDriversee_own_driverbool(存在型)STATICALLY_VALIDATED
general.showErrorMessagesshowerrormessagesbool(存在型)STATICALLY_VALIDATED
general.autoSavenoAutoSavebool(反向存在型)STATICALLY_VALIDATED
general.currentTimeuseActTimebool(存在型)STATICALLY_VALIDATED
general.currentDateuseActDatebool(存在型)STATICALLY_VALIDATED
general.currentYearuseActYearbool(存在型)STATICALLY_VALIDATED
graphics.screenRatioscreenratiostring任意STATICALLY_VALIDATED
graphics.maxFPSmaxFPSint10..200STATICALLY_VALIDATED
graphics.tileDistanceperformance_tiledistmaxint1..20STATICALLY_VALIDATED
graphics.maxObjectDistanceMetersperformance_maxObjDistint20..5000STATICALLY_VALIDATED
graphics.minObjectScreenPercentperformance_minObjSizedecimal0..10,儲存時 /100STATICALLY_VALIDATED
graphics.minReflectionObjectScreenPercentperformance_minObjSizeRefldecimal0..50,儲存時 /100STATICALLY_VALIDATED
graphics.maxObjectComplexitymaxcomplexityint0..3STATICALLY_VALIDATED
graphics.maxMapComplexitymaxcomplexity_mapint0..2STATICALLY_VALIDATED
graphics.sunGlowsunglowbool(存在型)STATICALLY_VALIDATED
graphics.loadAllTilesloadAllTilesbool(存在型)STATICALLY_VALIDATED
graphics.stencilBufferno_stencilbufferbool(反向存在型)STATICALLY_VALIDATED
graphics.stencilShadowsshadow_stencilbool,寫成 on / offSTATICALLY_VALIDATED
graphics.rainReflectionsno_rain_reflbool(反向存在型)STATICALLY_VALIDATED
graphics.humansInRainReflectionsno_humans_on_rain_reflbool(反向存在型)STATICALLY_VALIDATED
graphics.realTimeReflectionsperformance_realreflexionsstringeconomy 或 fullSTATICALLY_PARTIAL
graphics.particlessmokesystems(4 行區塊)enabled,maxPerEmitter,playerVehicleOnly,inReflections (bool,int>=0,bool,bool)STATICALLY_VALIDATED
simulation.collisionno_collisionbool(反向存在型)STATICALLY_VALIDATED
simulation.collisionTerrainno_collision_terrainbool(反向存在型)STATICALLY_VALIDATED
simulation.collisionVehiclesno_collision_vehToVehbool(反向存在型)STATICALLY_VALIDATED
simulation.collisionPedestriansno_collision_pedastriansbool(反向存在型)STATICALLY_VALIDATED
simulation.ticketSellingticketsellingint0..2STATICALLY_VALIDATED
simulation.maintenancewear_lifespanint0..4STATICALLY_VALIDATED
simulation.disableAutomaticScheduleAnalysisPopupno_schedAnaPopUpbool(存在型)STATICALLY_VALIDATED
simulation.ticketInfono_ticketinfo_visiblebool(反向存在型)STATICALLY_VALIDATED
simulation.automaticClutchno_automaticClutchbool(反向存在型)STATICALLY_VALIDATED
advanced.reducedMultithreadingno_multithreading_calculate + no_multithreading_texloadbool(兩個存在型 token)RUNTIME_PROVEN
view.driverSmoothdriverview_smoothbool(存在型)STATICALLY_VALIDATED
view.driverMovingdriverview_movingbool(存在型)STATICALLY_VALIDATED
controls.autoCenterautoCenterbool(存在型)STATICALLY_VALIDATED
controls.reducedSteeringSpeedredSteerSpdbool(存在型)STATICALLY_VALIDATED
traffic.randomVehiclesAIMaxCountRandom 第 0 個分量int0..1000STATICALLY_VALIDATED(RV-005 執行階段)
traffic.humansAIMaxCountRandom 第 1 個分量int0..1000STATICALLY_VALIDATED(RV-005 執行階段)
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

存在於目錄中但不可寫入的項目(以 OL_E_SESSION_PROFILE_SETTING_NOT_WRITABLE 拒絕):advanced.multithreadingCalculate、advanced.multithreadingTextureLoad(已由 advanced.reducedMultithreading 取代)、graphics.texture、graphics.textureFilter。

路徑限制#

presentation.splash.assets 與 internet-textures.profile 由 Confined(package root, value) 解析:

  1. 根路徑(C:\...)、以 \ 開頭的路徑,以及任何等於 .. 的路徑元件都會遭拒絕。
  2. 計算完整路徑,且該路徑必須以套件目錄開頭。
  3. 從套件根目錄以下直到最終路徑(含)的每個現有元件,都會檢查是否帶有 ReparsePoint 屬性。該路徑上任何位置的 junction、目錄符號連結或檔案符號連結都會遭拒絕;無法檢查的元件(IOException / UnauthorizedAccessException)也會遭拒絕。

這三種失敗都是 OL_E_SESSION_PROFILE_PATH_ESCAPE。建立工作階段時,同樣的重新分析點規則也會套用到 Texture\ 下的 .itx 目標。

優先順序與覆寫衝突#

CliInput.BuildSpecAsync 依下列順序組合 spec:

  1. 預設值(NEW_MAP、所有項目皆未設定、逾時 180 s / 30 s)。
  2. /spec:<file.json>:若有指定,會完全取代預設值。
  3. 安裝根目錄:明確的安裝引數優先於 spec 的 RootPath;. 表示包含可執行檔的目錄。
  4. 設定檔(/predefined-profile + /predefined-profile-index):載入套件,並在合併任何內容之前,對原始 CLI 引數執行 RejectProfileConflicts。接著種子的世界區塊會重設為所選模式的空 WorldSpec(使用設定檔時,/spec 的世界會被捨棄),再由 SessionProfileCompiler.Apply 將設定檔疊加到種子上:new(僅 NEW_MAP)、settings(合併到種子的 Environment.General 之上,逐鍵以設定檔為準),以及 presentation、internet-textures、behavior(各自只在預設組合有定義時取代種子的對應區塊)。
  5. 其餘 CLI 引數疊加在最上層:/map、/entrypoint、/entrypoint-index、/date、/time、/year、天氣旗標、車輛旗標、/set、啟動畫面旗標、Internet Textures 旗標、/startup-timeout、/shutdown-timeout。CLI 的逾時只在有指定時套用;否則維持 spec/設定檔/預設值。
  6. 對非 NEW_MAP 模式進行相容性檢查(ValidateCompatibility)。

以所選設定檔所擁有之欄位為目標的 CLI 引數即為衝突,會以 OL_E_SESSION_PROFILE_OVERRIDE_CONFLICT 拒絕(結束代碼 2,類別 invalid_argument)。檢查是以欄位為單位,而非以值為單位:即使重複指定設定檔自己的值,仍然算是衝突。

CLI 引數設定檔定義下列項目時衝突僅限模式
/mapnew.mapNEW_MAP
/entrypoint 或 /entrypoint-indexnew.entrypoint 或 new.entrypoint-indexNEW_MAP
/datenew.dateNEW_MAP
/timenew.timeNEW_MAP
/yearnew.yearNEW_MAP
/weather, /weather-icao, /weather-realnew.weatherNEW_MAP
/set:<key>=...預設組合 settings 中相同的 <key>(不區分大小寫)任意
/splash, /splash-language, /splash-assetspresentation(任何內容)任意
/internet-textures, /internet-textures-profileinternet-textures(任何內容)任意
/startup-timeout, /shutdown-timeoutbehavior(任何內容)任意

不屬於衝突的情況:預設組合未定義的 /set 鍵(會被加入)、車輛旗標(/vehicle、/repaint、/hof、/fleet、/registration、/no-vehicle;設定檔無法定義玩家車輛),以及 /saved 下的任何世界引數(new 區塊在該情況下不會套用)。無論是否使用設定檔,/map、/entrypoint 與 /entrypoint-index 搭配 /saved 一律無效(OL_E_INVALID_ARGUMENT)。

錯誤碼#

代碼發生時機CLI 結束代碼
OL_E_SESSION_PROFILE_NOT_FOUND<root>\.omsilaunch\session-profiles\<id>\profile.yaml 不存在2
OL_E_SESSION_PROFILE_PATH_ESCAPEid 不是單純的目錄名稱;assets / profile 離開套件或經過重新分析點2
OL_E_SESSION_PROFILE_SCHEMA_UNSUPPORTEDschema 不是 omsilaunch.session-profile/v12
OL_E_SESSION_PROFILE_INVALID大小限制、文件結構、錨點、未知鍵、缺少必要鍵、非純量值、錯誤的數字/日期/時間、id 不符、預設組合數量/索引規則、不支援的模式字詞、非正數逾時、presentation 缺少 splash、override 缺少 profile2
OL_E_SESSION_PROFILE_PRESET_NOT_FOUND缺少 /predefined-profile-index、超出 1..5,或沒有具該 index 的預設組合2
OL_E_SESSION_PROFILE_SETTING_UNKNOWNsettings 鍵不在設定目錄中2
OL_E_SESSION_PROFILE_SETTING_NOT_WRITABLEsettings 鍵已列入目錄但為唯讀2
OL_E_SESSION_PROFILE_ASSET_MISSING套件內不存在 assets 目錄或 profile 檔案2
OL_E_SESSION_PROFILE_MAP_MISMATCHcompatibility.maps 非空,且有效地圖未列於其中(或無法推導)2
OL_E_SESSION_PROFILE_OVERRIDE_CONFLICT明確的 CLI 引數以設定檔所擁有的欄位為目標2

這些錯誤全都在編譯命令列時、規劃之前發生。它們是 SessionProfileException(衝突則為 ArgumentException),且絕不會啟動工作階段。完整目錄請見錯誤;結束代碼請見結束代碼。

設定檔在 API 中的呈現方式#

成功載入後,spec 會在 LaunchSpec.SessionProfile 中攜帶一筆 SessionProfileMetadata 記錄:

欄位來源
Idid
Namename
Versionversion
Authorauthor
PresetId所選預設組合的 id
PresetIndex所選預設組合的 index
PresetName所選預設組合的 name
PackagePath套件目錄的絕對路徑

規劃器會在由此類 spec 建立的每個 SessionPlan 中加入資訊性診斷訊息 session_profile.selected,其資料鍵為 session_profile.id、session_profile.name、session_profile.version、session_profile.author、session_profile.preset_id、session_profile.preset_index、session_profile.preset_name 與 session_profile.path。它不影響是否可執行。直接使用公開 API 的整合者可以呼叫 OmsiLaunch.Core 中的 SessionProfileCompiler.Load 與 SessionProfileCompiler.Apply;YAML 表示法絕不會進入 OmsiLaunch.Api。

範例#

範例 1:僅含設定、單一預設組合的設定檔#

<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

執行:OmsiLaunch.exe /predefined-profile:quiet-evening /predefined-profile-index:1 /new /map:maps\Grundorf\global.cfg /entrypoint-index:0。由於設定檔未定義 new 區塊,地圖與進入點來自命令列;加上 /set:graphics.maxFPS=60 是允許的,加上 /set:traffic.humans=10 則為衝突。

範例 2:綁定地圖、含三個預設組合與隨附資產的設定檔#

<root>\.omsilaunch\session-profiles\grundorf-tour\profile.yaml,套件內含 assets\splash\ENG.bmp、assets\splash\DEU.bmp 與 textures\offline.itx:

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

執行:OmsiLaunch.exe /predefined-profile:grundorf-tour /predefined-profile-index:2 /new。若使用 /saved:situations\mytrip.osn,則會略過 new 區塊,且該 .osn 必須參考 maps\Grundorf\global.cfg。

隨附的範例#

發行版本隨附 docs/examples/session-profiles/rmg-leste/profile.yaml(檢視)。它語法有效、符合結構描述,且載入時不會發生錯誤。但有兩個特性使它在此組建中無法不經修改就啟動工作階段:

  1. 它設定了 new.date、new.time 與 new.weather,這會使計畫不可執行(請見 new 區塊)。
  2. 它的路徑值是含雙反斜線的純量(maps\\RMG Leste\\global.cfg)。YAML 會保留雙反斜線,而地圖識別碼是以文字比對(僅做 / 到 \ 的正規化),因此 new.map 與 compatibility.maps 不會符合目錄識別碼 maps\RMG Leste\global.cfg(規劃時為 OL_E_MAP_NOT_FOUND)。assets 值仍可解析,因為 Windows 路徑正規化會合併重複的分隔符號。

此組建中可執行的形式如下:

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