From d111c941884a4e0f5126abc29df6160185183e95 Mon Sep 17 00:00:00 2001 From: nichinichisou Date: Wed, 28 Oct 2026 01:31:42 +0800 Subject: [PATCH 1/2] fix(music-data): accept master data without the arena music table The arena music table is optional: a master data set that does not list it exports without it, and the provenance leaves out every table that has no SHA-256. Co-Authored-By: Claude Sonnet 5.5 --- src/nnnotes/musicdata/__init__.py | 2 +- src/nnnotes/musicdata/deckdata.py | 8 ++++++++ tests/musicdata/test_deckdata.py | 4 ++++ tests/musicdata/test_musicdata.py | 20 ++++++++++++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/nnnotes/musicdata/__init__.py b/src/nnnotes/musicdata/__init__.py index 74cf1c5..d5c3161 100644 --- a/src/nnnotes/musicdata/__init__.py +++ b/src/nnnotes/musicdata/__init__.py @@ -1393,7 +1393,7 @@ def record(sid: int) -> dict: "master": { "source": master_source, "version": master_version, - "tables": {t: {"sha256": table_sha[t]} for t in read}, + "tables": {t: {"sha256": table_sha[t]} for t in read if t in table_sha}, }, "exporter": exporter, "deck": deck.info() if deck is not None else None, diff --git a/src/nnnotes/musicdata/deckdata.py b/src/nnnotes/musicdata/deckdata.py index a6f903e..0a6af1d 100644 --- a/src/nnnotes/musicdata/deckdata.py +++ b/src/nnnotes/musicdata/deckdata.py @@ -174,6 +174,10 @@ ) +# Tables a master data version may leave out (no rows then): the master data of newer game versions does not list them. +OPTIONAL_TABLES = frozenset({"MasterArenaMusic"}) + + class DeckDataError(ValueError): """An input the deck data cannot be made from (the message names it).""" @@ -261,10 +265,13 @@ def read(names): def read_master(src: MasterSource, key, tables=None) -> tuple[dict[str, list[dict]], dict[str, str]]: """The rows (`_allData`) of every table of `tables` (default: TABLES) and the SHA-256 of each file as served. + A table of OPTIONAL_TABLES the manifest does not list has no rows and no SHA-256. `key`: a master.MasterKey (unused for decoded master data: None).""" from ..source import master names = {t: f"{t}.bin" for t in (tables if tables is not None else (t for t, _ in TABLES))} + absent = {t for t, n in names.items() if t in OPTIONAL_TABLES and n not in src.hashes} + names = {t: n for t, n in names.items() if t not in absent} unlisted = [t for t, n in names.items() if n not in src.hashes] if unlisted: raise DeckDataError(f"master data {src.where}: {MANIFEST} lists no {', '.join(unlisted)}") @@ -296,6 +303,7 @@ def read_master(src: MasterSource, key, tables=None) -> tuple[dict[str, list[dic if not isinstance(rows, list) or not all(isinstance(r, dict) for r in rows): raise DeckDataError(f"master data {src.where}: {f} has no `_allData` rows") tables[t], shas[t] = rows, sha + tables.update((t, []) for t in absent) return tables, shas diff --git a/tests/musicdata/test_deckdata.py b/tests/musicdata/test_deckdata.py index 36729b6..7546273 100644 --- a/tests/musicdata/test_deckdata.py +++ b/tests/musicdata/test_deckdata.py @@ -443,6 +443,10 @@ def test_master_file_checks(tmp_path): "lists no MasterParameter, MasterEvent", src=deckdata.master_files(master_dir(tmp_path, skip={"MasterEvent", "MasterParameter"}, name="b")), ) + d = master_dir(tmp_path, skip={"MasterArenaMusic"}, name="opt") + tables, shas = deckdata.read_master(deckdata.master_files(d), KEY) + assert tables["MasterArenaMusic"] == [] and "MasterArenaMusic" not in shas + assert deckdata.master_subset(tables)["MasterArenaMusic"] == {"columns": [], "rows": []} d = master_dir(tmp_path, name="c") (d / "MasterBand.bin").unlink() failing(tmp_path, "no file MasterBand.bin", src=deckdata.master_files(d)) diff --git a/tests/musicdata/test_musicdata.py b/tests/musicdata/test_musicdata.py index 8cd8c4d..ac34914 100644 --- a/tests/musicdata/test_musicdata.py +++ b/tests/musicdata/test_musicdata.py @@ -1534,3 +1534,23 @@ def test_aptitude_disabled(tmp_path): assert doc["deck"]["gekisouAptitude"] is None assert all(c["deck"]["gekisouAptitude"] is None for s in doc["songs"] for c in s["charts"]) schema_validator().validate(doc) + + +def test_master_data_without_the_arena_music_table(tmp_path): + d = master_dir(tmp_path) + (d / "MasterArenaMusic.bin").unlink() + manifest = json.loads((d / "MasterManifest.json").read_text(encoding="utf-8")) + manifest["files"] = [f for f in manifest["files"] if f["name"] != "MasterArenaMusic.bin"] + (d / "MasterManifest.json").write_text(json.dumps(manifest), encoding="utf-8") + musicdata.export( + tmp_path / "music.json", + deckdata.master_files(d), + KEY, + CHARTS.__getitem__, + bgm, + **PROV, + deck=musicdata.Deck(module=FakeDeck(), workers=3), + ) + doc = json.loads((tmp_path / "music.json").read_bytes()) + assert "MasterArenaMusic" not in doc["provenance"]["master"]["tables"] + assert "MasterBand" in doc["provenance"]["master"]["tables"] From 1212bccf05e65e9c526f7f04db4a920050f73b7d Mon Sep 17 00:00:00 2001 From: nichinichisou Date: Wed, 28 Oct 2026 01:31:43 +0800 Subject: [PATCH 2/2] fix(story): read the app managers from the boot scene Game versions that build the camera and UI managers into the boot scene have no catalog key for them. The story scene, UI and font products now take the root GameObject of the boot data with the key's last segment as its name when the catalog lacks the key, and the typetrees of the manager components are part of the shipped Unity 6000.3.12f1 typetrees. Co-Authored-By: Claude Sonnet 5.5 --- scripts/gen_typetrees.py | 16 +++++++-- src/nnnotes/content/prefabs.py | 30 ++++++++++++++++- src/nnnotes/content/storyscene.py | 14 +++++--- src/nnnotes/content/storysimpleui.py | 2 +- src/nnnotes/content/storyui.py | 3 +- src/nnnotes/pipeline/story.py | 16 ++++++--- src/nnnotes/unity/typetrees/6000.3.12f1.json | 16 +++++++-- tests/content/test_storyscene.py | 18 +++++++++- tests/pipeline/test_story.py | 35 ++++++++++++++++---- 9 files changed, 127 insertions(+), 23 deletions(-) diff --git a/scripts/gen_typetrees.py b/scripts/gen_typetrees.py index 75f3ad3..dd10f66 100644 --- a/scripts/gen_typetrees.py +++ b/scripts/gen_typetrees.py @@ -59,21 +59,33 @@ ("Adv", "AdvSystem.Rendering", "AdvFieldRendererFeature"), ("App.Runtime", "App.Config", "AppConfigDefaultData"), ("DOTween.dll", "DG.Tweening.Core", "DOTweenSettings"), + ("Fwk", "Fwk.Cam", "CameraManager"), ("Fwk", "Fwk.Localization", "LocalizeManager"), ("Fwk", "Fwk.Rendering", "ScreenCaptureRendererFeature"), ("Fwk", "Fwk.Sound", "SoundVolumeSettings"), + ("Fwk", "Fwk.UI", "UICameraController"), + ("Fwk", "Fwk.UI", "UIInputController"), + ("Fwk", "Fwk.UI", "UIManager"), ("Fwk", "Fwk.UI.Rendering", "UIRendererFeature"), - ("SiriusAsset", "App.GachaAnimation.Blur.DualKawase", "DualKawaseBlurFeature"), + ("Fwk", "Fwk.UI", "UIScreenSizeWatcher"), + ("SiriusAsset", "App.GachaAnimation.PostProcessing", "CameraBlendFeature"), ("SiriusAsset", "App.GachaAnimation.ChromaticAberration", "ChromaticAberrationFeature"), + ("SiriusAsset", "App.GachaAnimation.Blur.DualKawase", "DualKawaseBlurFeature"), ("SiriusAsset", "App.GachaAnimation.Paraffin", "ParaffinFeature"), - ("SiriusAsset", "App.GachaAnimation.PostProcessing", "CameraBlendFeature"), ("SiriusAsset", "App.GachaAnimation.PostProcessing", "RadialBlurFeature"), ("SiriusAsset", "App.UI.Text.DropShadow", "TextDropShadowFeature"), + ("Unity.InputSystem", "UnityEngine.InputSystem.UI", "InputSystemUIInputModule"), ("Unity.RenderPipelines.Universal.Runtime", "UnityEngine.Rendering.Universal", "PostProcessData"), + ("Unity.RenderPipelines.Universal.Runtime", "UnityEngine.Rendering.Universal", "UniversalAdditionalCameraData"), ("Unity.RenderPipelines.Universal.Runtime", "UnityEngine.Rendering.Universal", "UniversalRenderPipelineAsset"), ("Unity.RenderPipelines.Universal.Runtime", "UnityEngine.Rendering.Universal", "UniversalRendererData"), ("Unity.TextMeshPro", "TMPro", "TMP_Settings"), ("Unity.TextMeshPro", "TMPro", "TMP_StyleSheet"), + ("UnityEngine.UI", "UnityEngine.UI", "CanvasScaler"), + ("UnityEngine.UI", "UnityEngine.EventSystems", "EventSystem"), + ("UnityEngine.UI", "UnityEngine.UI", "GraphicRaycaster"), + ("UnityEngine.UI", "UnityEngine.UI", "Image"), + ("UnityEngine.UI", "UnityEngine.EventSystems", "Physics2DRaycaster"), ) DEFAULT_OUT = Path(__file__).resolve().parents[1] / "src" / "nnnotes" / "unity" / "typetrees" diff --git a/src/nnnotes/content/prefabs.py b/src/nnnotes/content/prefabs.py index 7d13e3a..53383eb 100644 --- a/src/nnnotes/content/prefabs.py +++ b/src/nnnotes/content/prefabs.py @@ -137,9 +137,37 @@ def builtin_root(objects: Objects, cls: str) -> str: return hits[0] +# the app manager prefabs: catalog keys of some game versions, root GameObjects of the boot scene of others +BOOT_MANAGERS = ("EmbCommon/Prefab/CameraManager", "EmbCommon/Prefab/UIManager") + + +def boot_managers(catalog: Iterable[str]) -> list[str]: + """The app manager keys that the catalog `catalog` (its keys) lacks: the boot scene holds those managers.""" + held = set(catalog) + return [k for k in BOOT_MANAGERS if k not in held] + + +def boot_builtins(catalog: Iterable[str]) -> list[str]: + """The built-in selectors that bring the boot scene's manager GameObjects into a product ([] when the catalog + lists every manager).""" + return ["GameObject"] if boot_managers(catalog) else [] + + def key_object(objects: Objects, key: str, cls: str) -> str: """The one object of the catalog key `key` of class `cls`: a GameObject with its prefab document, a MonoBehaviour - by its script class, any other object by its class (ValueError otherwise).""" + by its script class, any other object by its class (ValueError otherwise). A manager key (BOOT_MANAGERS) that + is not a key of the table names the root GameObject of the boot scene with the key's last segment as its name.""" + if cls == "GameObject" and key in BOOT_MANAGERS and key not in objects.keys(): + name = key.rsplit("/", 1)[-1] + roots = [ + o + for o in objects.roots + if o in objects and objects.info(o).get("class") == "GameObject" and objects.info(o).get("name") == name + ] + hits = [o for o in roots if has_json(objects, o)] + if len(hits) != 1: + raise ValueError(f"{key}: {len(hits)} boot scene GameObjects named {name}") + return hits[0] def of(oid: str) -> str | None: c = objects.info(oid).get("class") diff --git a/src/nnnotes/content/storyscene.py b/src/nnnotes/content/storyscene.py index b8607c6..0ca2c7e 100644 --- a/src/nnnotes/content/storyscene.py +++ b/src/nnnotes/content/storyscene.py @@ -20,9 +20,11 @@ from __future__ import annotations +from collections.abc import Iterable + from .livenotes import animator_bindings from .livescene import GRAPHICS -from .prefabs import Objects, builtin_root, has_json, key_object, mesh_roles, ref_id, shader_table +from .prefabs import Objects, boot_managers, builtin_root, has_json, key_object, mesh_roles, ref_id, shader_table SCENE_FORMAT = 1 # scene.json "format" SCENE_KEY = "EmbScene/Adv" @@ -39,9 +41,13 @@ } -def keys() -> list[str]: - """The catalog keys of the story scene: the scene key, the prefab keys and the settings keys, sorted.""" - return sorted([SCENE_KEY, *PREFAB_KEYS.values(), *(key for key, _ in SETTINGS_KEYS.values())]) +def keys(catalog: Iterable[str]) -> list[str]: + """The catalog keys of the story scene in the catalog `catalog` (its keys): the scene key, the prefab keys and the + settings keys, sorted; a manager that the boot scene holds is no catalog key.""" + absent = set(boot_managers(catalog)) + return sorted( + [SCENE_KEY, *(k for k in PREFAB_KEYS.values() if k not in absent), *(key for key, _ in SETTINGS_KEYS.values())] + ) def scene(objects: Objects) -> tuple[dict, set[str], dict[str, set[str]]]: diff --git a/src/nnnotes/content/storysimpleui.py b/src/nnnotes/content/storysimpleui.py index 805f444..853b939 100644 --- a/src/nnnotes/content/storysimpleui.py +++ b/src/nnnotes/content/storysimpleui.py @@ -28,7 +28,7 @@ def addresses(catalog) -> dict[str, str]: def keys(catalog) -> list[str]: - return sorted({*addresses(catalog).values(), storyui.UI_MANAGER_KEY}) + return sorted({*addresses(catalog).values(), *(k for k in (storyui.UI_MANAGER_KEY,) if k in set(catalog))}) def ui(objects, language: str, settings) -> tuple[dict, set, dict]: diff --git a/src/nnnotes/content/storyui.py b/src/nnnotes/content/storyui.py index 71204e6..3b5293d 100644 --- a/src/nnnotes/content/storyui.py +++ b/src/nnnotes/content/storyui.py @@ -119,11 +119,12 @@ def window_keys(catalog: Iterable[str]) -> dict[str, str]: def keys(catalog: Iterable[str]) -> list[str]: """The catalog keys of the story UI in the catalog `catalog` (its keys): the widget, the chat widget, UIManager, the letterbox, the master id settings, the dialogs, the animations and the talk windows (window_keys), sorted.""" + held = set(catalog) return sorted( { WIDGET_KEY, CHAT_WIDGET_KEY, - UI_MANAGER_KEY, + *(k for k in (UI_MANAGER_KEY,) if k in held), LETTERBOX_KEY, MASTER_ID_SETTINGS_KEY, *DIALOG_KEYS.values(), diff --git a/src/nnnotes/pipeline/story.py b/src/nnnotes/pipeline/story.py index 1c65123..9593df0 100644 --- a/src/nnnotes/pipeline/story.py +++ b/src/nnnotes/pipeline/story.py @@ -67,6 +67,7 @@ from ..content import ( liveaudio, + prefabs, storyasset, storychat, storyepisode, @@ -261,14 +262,14 @@ class SceneStage(ProductStage): KIND = "StoryScene" def select(self, keys: list[str], env) -> list[str]: - return [DEFAULT] if set(storyscene.keys()) <= set(keys) else [] + return [DEFAULT] if set(storyscene.keys(keys)) <= set(keys) else [] def keys(self, subject: str, env) -> list[str]: _default(subject) - return storyscene.keys() + return storyscene.keys(_catalog(env)) def builtins(self, subject: str, env) -> list[str]: - return sorted(GRAPHICS.values()) + return sorted([*GRAPHICS.values(), *prefabs.boot_builtins(_catalog(env))]) def manifest(self, subject: str) -> str: return f"storyscenes/{_default(subject)}.json" @@ -362,6 +363,11 @@ def _language(subject: str) -> str: return subject +def _catalog(env) -> set[str]: + """The primary keys of the catalog of a planning environment.""" + return {loc["primaryKey"] for loc in env.fact("index")["locations"]} + + class UiStage(FontInputsStage): """story.ui: the ADV story UI in one client language (module documentation).""" @@ -386,7 +392,7 @@ def resources(self, subject: str, env) -> list[str]: def builtins(self, subject: str, env) -> list[str]: _language(subject) - return list(storyui.BUILTINS) + return [*storyui.BUILTINS, *prefabs.boot_builtins(_catalog(env))] def record(self, subject: str, env) -> dict: """The master record of the language: the text of every MasterText row in its text column.""" @@ -490,7 +496,7 @@ def resources(self, subject, env): def builtins(self, subject, env): font_subject(subject) - return list(storyui.BUILTINS) + return [*storyui.BUILTINS, *prefabs.boot_builtins(_catalog(env))] def record(self, subject, env): return UiStage().record(font_subject(subject)[1], env) diff --git a/src/nnnotes/unity/typetrees/6000.3.12f1.json b/src/nnnotes/unity/typetrees/6000.3.12f1.json index c4cde7d..7e8f86c 100644 --- a/src/nnnotes/unity/typetrees/6000.3.12f1.json +++ b/src/nnnotes/unity/typetrees/6000.3.12f1.json @@ -1,20 +1,32 @@ -{"format":1,"gameVersion":"1.0.1","unityVersion":"6000.3.12f1","classes":{ +{"format":1,"gameVersion":"1.1.0","unityVersion":"6000.3.12f1","classes":{ "Adv|AdvSystem.Rendering|AdvFieldRendererFeature":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"UInt8","m_Active",16384],[1,"PPtr<$Shader>","_alphaBlendShader",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$Shader>","_characterAlphaBlendShader",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$Shader>","_blurShader",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$Shader>","_curvedLensShader",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"int","_maxFieldRendererEntryCount",0],[1,"float","_characterBlurIntensityRate",0],[1,"float","_characterBlurScale",0],[1,"float","_backgroundBlurIntensityRate",0],[1,"float","_backgroundBlurScale",0]],"typeHash":"b366a9b62e0f9de433e9ca044d26c9d1"}, "App.Runtime|App.Config|AppConfigDefaultData":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"AppConfigDataModel","_defaultData",0],[2,"float","k__BackingField",0],[2,"float","k__BackingField",0],[2,"float","k__BackingField",0],[2,"float","k__BackingField",0],[2,"float","k__BackingField",0],[2,"float","k__BackingField",0],[2,"float","k__BackingField",0],[2,"float","k__BackingField",0]],"typeHash":"2b53ff748caf6baa04ce8616a3f29be9"}, "DOTween.dll|DG.Tweening.Core|DOTweenSettings":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"UInt8","useSafeMode",16384],[1,"SafeModeOptions","safeModeOptions",0],[2,"int","logBehaviour",0],[2,"int","nestedTweenFailureBehaviour",0],[1,"float","timeScale",0],[1,"float","unscaledTimeScale",0],[1,"UInt8","useSmoothDeltaTime",16384],[1,"float","maxSmoothUnscaledTime",0],[1,"int","rewindCallbackMode",0],[1,"UInt8","showUnityEditorReport",16384],[1,"int","logBehaviour",0],[1,"UInt8","drawGizmos",16384],[1,"UInt8","defaultRecyclable",16384],[1,"int","defaultAutoPlay",0],[1,"int","defaultUpdateType",0],[1,"UInt8","defaultTimeScaleIndependent",16384],[1,"int","defaultEaseType",0],[1,"float","defaultEaseOvershootOrAmplitude",0],[1,"float","defaultEasePeriod",0],[1,"UInt8","defaultAutoKill",16384],[1,"int","defaultLoopType",0],[1,"UInt8","debugMode",16384],[1,"UInt8","debugStoreTargetId",16384],[1,"UInt8","showPreviewPanel",16384],[1,"int","storeSettingsLocation",0],[1,"ModulesSetup","modules",0],[2,"UInt8","showPanel",16384],[2,"UInt8","audioEnabled",16384],[2,"UInt8","physicsEnabled",16384],[2,"UInt8","physics2DEnabled",16384],[2,"UInt8","spriteEnabled",16384],[2,"UInt8","uiEnabled",16384],[2,"UInt8","textMeshProEnabled",16384],[2,"UInt8","tk2DEnabled",16384],[2,"UInt8","deAudioEnabled",16384],[2,"UInt8","deUnityExtendedEnabled",16384],[2,"UInt8","epoOutlineEnabled",16384],[1,"UInt8","createASMDEF",16384],[1,"UInt8","showPlayingTweens",16384],[1,"UInt8","showPausedTweens",16384]],"typeHash":"4f1dec93fa2a0b0e7b8b47518da31b1c"}, +"Fwk|Fwk.Cam|CameraManager":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"UInt8","_dontDestroyOnload",16384],[1,"PPtr<$Camera>","_mainCamera",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$Camera>","_subCamera",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$UniversalAdditionalCameraData>","_mainCameraData",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$UniversalAdditionalCameraData>","_subCameraData",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0]],"typeHash":"9cd71123afe4d42d6ed5fe737ac22f6a"}, "Fwk|Fwk.Localization|LocalizeManager":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"UInt8","_dontDestroyOnload",16384],[1,"LanguageData","_languageDataList",0],[2,"Array","Array",0],[3,"int","size",0],[3,"LanguageData","data",0],[4,"int","_languageMode",0],[4,"vector","_fontNames",0],[5,"Array","Array",16384],[6,"int","size",0],[6,"string","data",0],[7,"Array","Array",16384],[8,"int","size",0],[8,"char","data",0],[4,"vector","_additionalFontNames",0],[5,"Array","Array",16384],[6,"int","size",0],[6,"string","data",0],[7,"Array","Array",16384],[8,"int","size",0],[8,"char","data",0],[1,"vector","_materialTypeList",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"string","data",0],[4,"Array","Array",16384],[5,"int","size",0],[5,"char","data",0]],"typeHash":"597220768ec4996f80d7cfd5e139645f"}, "Fwk|Fwk.Rendering|ScreenCaptureRendererFeature":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"UInt8","m_Active",16384]],"typeHash":"ce87445dd61732c847969290a1daa3b1"}, "Fwk|Fwk.Sound|SoundVolumeSettings":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"SoundVolumeData","_collection",0],[2,"Array","Array",0],[3,"int","size",0],[3,"SoundVolumeData","data",0],[4,"string","CategoryName",0],[5,"Array","Array",16384],[6,"int","size",0],[6,"char","data",0],[4,"float","DefaultVolume",0]],"typeHash":"6fb3a84e8c1ec611fde964d8d6005276"}, "Fwk|Fwk.UI.Rendering|UIRendererFeature":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"UInt8","m_Active",16384],[1,"BitField","_layerMask",0],[2,"unsigned int","m_Bits",0],[1,"int","_blurIterations",0],[1,"float","_blurOffset",0],[1,"int","_blurDownsample",0],[1,"float","_blurBlendRateMax",0],[1,"PPtr<$Shader>","_dualKawaseBlurShader",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0]],"typeHash":"12463b61d2af82f284b2248ea336f5f6"}, +"Fwk|Fwk.UI|UICameraController":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"PPtr<$Camera>","_uiCamera",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$UniversalAdditionalCameraData>","_uiCameraData",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0]],"typeHash":"03ef91c0c231ec4801be2d720f2afee5"}, +"Fwk|Fwk.UI|UIInputController":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"PPtr<$GameObject>","_locker",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0]],"typeHash":"ad548357668ee016a21544130c8e4129"}, +"Fwk|Fwk.UI|UIManager":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"UInt8","_dontDestroyOnload",16384],[1,"PPtr<$Transform>","_container",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$UICameraController>","_cameraController",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$UIInputController>","_inputController",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$UISoundEffectCatalog>","_uiSoundEffectCatalog",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0]],"typeHash":"69351d5f80bb1b303ab066e2a4e5a36b"}, +"Fwk|Fwk.UI|UIScreenSizeWatcher":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0]],"typeHash":"ff2895b01f6c9cc366d81e8d4f564dca"}, "SiriusAsset|App.GachaAnimation.Blur.DualKawase|DualKawaseBlurFeature":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"UInt8","m_Active",16384],[1,"PPtr<$Shader>","_blurShader",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0]],"typeHash":"d3a7f8d74210f879c214433da8371fb1"}, "SiriusAsset|App.GachaAnimation.ChromaticAberration|ChromaticAberrationFeature":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"UInt8","m_Active",16384],[1,"PPtr<$Shader>","_shader",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"int","_injectionPoint",0]],"typeHash":"7cfc6fee683d3cc7ee7724ba19dca473"}, "SiriusAsset|App.GachaAnimation.Paraffin|ParaffinFeature":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"UInt8","m_Active",16384],[1,"PPtr<$Shader>","_shader",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"int","_injectionPoint",0]],"typeHash":"514dcc098efe1dc5fdbb68299a5ee29c"}, "SiriusAsset|App.GachaAnimation.PostProcessing|CameraBlendFeature":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"UInt8","m_Active",16384],[1,"PPtr<$Shader>","_blendShader",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"int","_injectionPoint",0]],"typeHash":"6538c8022bb4b2f5105b707ccd06ae4d"}, "SiriusAsset|App.GachaAnimation.PostProcessing|RadialBlurFeature":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"UInt8","m_Active",16384],[1,"PPtr<$Shader>","_blurShader",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"int","_injectionPoint",0]],"typeHash":"10c8c66cb44cf8c825fee29edfbfcf5c"}, "SiriusAsset|App.UI.Text.DropShadow|TextDropShadowFeature":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"UInt8","m_Active",16384],[1,"PPtr<$Shader>","_silhouetteShader",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$Shader>","_blurShader",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$Shader>","_compositeShader",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0]],"typeHash":"85721efe8a16a08cd5d8f51013555270"}, +"Unity.InputSystem|UnityEngine.InputSystem.UI|InputSystemUIInputModule":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"UInt8","m_SendPointerHoverToParent",16384],[1,"float","m_MoveRepeatDelay",0],[1,"float","m_MoveRepeatRate",0],[1,"PPtr<$Transform>","m_XRTrackingOrigin",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$InputActionAsset>","m_ActionsAsset",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$InputActionReference>","m_PointAction",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$InputActionReference>","m_MoveAction",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$InputActionReference>","m_SubmitAction",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$InputActionReference>","m_CancelAction",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$InputActionReference>","m_LeftClickAction",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$InputActionReference>","m_MiddleClickAction",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$InputActionReference>","m_RightClickAction",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$InputActionReference>","m_ScrollWheelAction",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$InputActionReference>","m_TrackedDevicePositionAction",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$InputActionReference>","m_TrackedDeviceOrientationAction",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_DeselectOnBackgroundClick",16384],[1,"int","m_PointerBehavior",0],[1,"int","m_CursorLockBehavior",0],[1,"float","m_ScrollDeltaPerTick",0]],"typeHash":"daeac1347f8039f61cd4017ff33bd3c6"}, "Unity.RenderPipelines.Universal.Runtime|UnityEngine.Rendering.Universal|PostProcessData":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"ShaderResources","shaders",0],[2,"PPtr<$Shader>","stopNanPS",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$Shader>","subpixelMorphologicalAntialiasingPS",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$Shader>","gaussianDepthOfFieldPS",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$Shader>","bokehDepthOfFieldPS",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$Shader>","cameraMotionBlurPS",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$Shader>","paniniProjectionPS",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$Shader>","lutBuilderLdrPS",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$Shader>","lutBuilderHdrPS",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$Shader>","bloomPS",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$Shader>","temporalAntialiasingPS",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$Shader>","LensFlareDataDrivenPS",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$Shader>","LensFlareScreenSpacePS",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$Shader>","scalingSetupPS",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$Shader>","easuPS",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$Shader>","uberPostPS",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$Shader>","finalPostPassPS",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"int","m_ShaderResourcesVersion",0],[1,"TextureResources","textures",0],[2,"vector","blueNoise16LTex",0],[3,"Array","Array",0],[4,"int","size",0],[4,"PPtr<$Texture2D>","data",0],[5,"int","m_FileID",0],[5,"SInt64","m_PathID",0],[2,"vector","filmGrainTex",0],[3,"Array","Array",0],[4,"int","size",0],[4,"PPtr<$Texture2D>","data",0],[5,"int","m_FileID",0],[5,"SInt64","m_PathID",0],[2,"PPtr<$Texture2D>","smaaAreaTex",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$Texture2D>","smaaSearchTex",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"int","m_TexturesResourcesVersion",0]],"typeHash":"3fd3a74e10cdfd45658891dfffc27a90"}, +"Unity.RenderPipelines.Universal.Runtime|UnityEngine.Rendering.Universal|UniversalAdditionalCameraData":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"UInt8","m_RenderShadows",16384],[1,"int","m_RequiresDepthTextureOption",0],[1,"int","m_RequiresOpaqueTextureOption",0],[1,"int","m_CameraType",0],[1,"vector","m_Cameras",0],[2,"Array","Array",0],[3,"int","size",0],[3,"PPtr<$Camera>","data",0],[4,"int","m_FileID",0],[4,"SInt64","m_PathID",0],[1,"int","m_RendererIndex",0],[1,"BitField","m_VolumeLayerMask",0],[2,"unsigned int","m_Bits",0],[1,"PPtr<$Transform>","m_VolumeTrigger",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"int","m_VolumeFrameworkUpdateModeOption",0],[1,"UInt8","m_RenderPostProcessing",16384],[1,"int","m_Antialiasing",0],[1,"int","m_AntialiasingQuality",0],[1,"UInt8","m_StopNaN",16384],[1,"UInt8","m_Dithering",16384],[1,"UInt8","m_ClearDepth",16384],[1,"UInt8","m_AllowXRRendering",16384],[1,"UInt8","m_AllowHDROutput",16384],[1,"UInt8","m_UseScreenCoordOverride",16384],[1,"Vector4f","m_ScreenSizeOverride",0],[2,"float","x",0],[2,"float","y",0],[2,"float","z",0],[2,"float","w",0],[1,"Vector4f","m_ScreenCoordScaleBias",0],[2,"float","x",0],[2,"float","y",0],[2,"float","z",0],[2,"float","w",0],[1,"UInt8","m_RequiresDepthTexture",16384],[1,"UInt8","m_RequiresColorTexture",16384],[1,"Settings","m_TaaSettings",0],[2,"int","m_Quality",0],[2,"float","m_FrameInfluence",0],[2,"float","m_JitterScale",0],[2,"float","m_MipBias",0],[2,"float","m_VarianceClampScale",0],[2,"float","m_ContrastAdaptiveSharpening",0],[1,"int","m_Version",0]],"typeHash":"1b32c5551298e17b2b3237d120b9537b"}, "Unity.RenderPipelines.Universal.Runtime|UnityEngine.Rendering.Universal|UniversalRenderPipelineAsset":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"int","k_AssetVersion",0],[1,"int","k_AssetPreviousVersion",0],[1,"int","m_RendererType",0],[1,"PPtr<$ScriptableRendererData>","m_RendererData",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"vector","m_RendererDataList",0],[2,"Array","Array",0],[3,"int","size",0],[3,"PPtr<$ScriptableRendererData>","data",0],[4,"int","m_FileID",0],[4,"SInt64","m_PathID",0],[1,"int","m_DefaultRendererIndex",0],[1,"UInt8","m_RequireDepthTexture",16384],[1,"UInt8","m_RequireOpaqueTexture",16384],[1,"int","m_OpaqueDownsampling",0],[1,"UInt8","m_SupportsTerrainHoles",16384],[1,"UInt8","m_SupportsHDR",16384],[1,"int","m_HDRColorBufferPrecision",0],[1,"int","m_MSAA",0],[1,"float","m_RenderScale",0],[1,"int","m_UpscalingFilter",0],[1,"UInt8","m_FsrOverrideSharpness",16384],[1,"float","m_FsrSharpness",0],[1,"UInt8","m_EnableLODCrossFade",16384],[1,"int","m_LODCrossFadeDitheringType",0],[1,"int","m_ShEvalMode",0],[1,"int","m_LightProbeSystem",0],[1,"int","m_ProbeVolumeMemoryBudget",0],[1,"int","m_ProbeVolumeBlendingMemoryBudget",0],[1,"UInt8","m_SupportProbeVolumeGPUStreaming",16384],[1,"UInt8","m_SupportProbeVolumeDiskStreaming",16384],[1,"UInt8","m_SupportProbeVolumeScenarios",16384],[1,"UInt8","m_SupportProbeVolumeScenarioBlending",16384],[1,"int","m_ProbeVolumeSHBands",0],[1,"int","m_MainLightRenderingMode",0],[1,"UInt8","m_MainLightShadowsSupported",16384],[1,"int","m_MainLightShadowmapResolution",0],[1,"int","m_AdditionalLightsRenderingMode",0],[1,"int","m_AdditionalLightsPerObjectLimit",0],[1,"UInt8","m_AdditionalLightShadowsSupported",16384],[1,"int","m_AdditionalLightsShadowmapResolution",0],[1,"int","m_AdditionalLightsShadowResolutionTierLow",0],[1,"int","m_AdditionalLightsShadowResolutionTierMedium",0],[1,"int","m_AdditionalLightsShadowResolutionTierHigh",0],[1,"UInt8","m_ReflectionProbeBlending",16384],[1,"UInt8","m_ReflectionProbeBoxProjection",16384],[1,"UInt8","m_ReflectionProbeAtlas",16384],[1,"float","m_ShadowDistance",0],[1,"int","m_ShadowCascadeCount",0],[1,"float","m_Cascade2Split",0],[1,"Vector2f","m_Cascade3Split",0],[2,"float","x",0],[2,"float","y",0],[1,"Vector3f","m_Cascade4Split",0],[2,"float","x",0],[2,"float","y",0],[2,"float","z",0],[1,"float","m_CascadeBorder",0],[1,"float","m_ShadowDepthBias",0],[1,"float","m_ShadowNormalBias",0],[1,"UInt8","m_SoftShadowsSupported",16384],[1,"UInt8","m_ConservativeEnclosingSphere",16384],[1,"int","m_NumIterationsEnclosingSphere",0],[1,"int","m_SoftShadowQuality",0],[1,"int","m_AdditionalLightsCookieResolution",0],[1,"int","m_AdditionalLightsCookieFormat",0],[1,"UInt8","m_UseSRPBatcher",16384],[1,"UInt8","m_SupportsDynamicBatching",16384],[1,"UInt8","m_MixedLightingSupported",16384],[1,"UInt8","m_SupportsLightCookies",16384],[1,"UInt8","m_SupportsLightLayers",16384],[1,"int","m_DebugLevel",0],[1,"int","m_StoreActionsOptimization",0],[1,"UInt8","m_UseAdaptivePerformance",16384],[1,"int","m_ColorGradingMode",0],[1,"int","m_ColorGradingLutSize",0],[1,"UInt8","m_AllowPostProcessAlphaOutput",16384],[1,"UInt8","m_UseFastSRGBLinearConversion",16384],[1,"UInt8","m_SupportDataDrivenLensFlare",16384],[1,"UInt8","m_SupportScreenSpaceLensFlare",16384],[1,"UInt8","m_GPUResidentDrawerMode",16384],[1,"float","m_SmallMeshScreenPercentage",0],[1,"UInt8","m_GPUResidentDrawerEnableOcclusionCullingInCameras",16384],[1,"int","m_ShadowType",0],[1,"UInt8","m_LocalShadowsSupported",16384],[1,"int","m_LocalShadowsAtlasResolution",0],[1,"int","m_MaxPixelLights",0],[1,"int","m_ShadowAtlasResolution",0],[1,"int","m_VolumeFrameworkUpdateMode",0],[1,"PPtr<$VolumeProfile>","m_VolumeProfile",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"ProbeVolumeSceneData","apvScenesData",0],[2,"SerializedDictionary`2","obsoleteSceneBounds",0],[3,"vector","m_Keys",0],[4,"Array","Array",16384],[5,"int","size",0],[5,"string","data",0],[6,"Array","Array",16384],[7,"int","size",0],[7,"char","data",0],[3,"vector","m_Values",0],[4,"Array","Array",16384],[5,"int","size",0],[5,"AABB","data",0],[6,"Vector3f","m_Center",0],[7,"float","x",0],[7,"float","y",0],[7,"float","z",0],[6,"Vector3f","m_Extent",0],[7,"float","x",0],[7,"float","y",0],[7,"float","z",0],[2,"SerializedDictionary`2","obsoleteHasProbeVolumes",0],[3,"vector","m_Keys",0],[4,"Array","Array",16384],[5,"int","size",0],[5,"string","data",0],[6,"Array","Array",16384],[7,"int","size",0],[7,"char","data",0],[3,"vector","m_Values",16384],[4,"Array","Array",16384],[5,"int","size",0],[5,"UInt8","data",0],[1,"int","m_ShaderVariantLogLevel",0],[1,"int","m_ShadowCascades",0],[1,"TextureResources","m_Textures",0],[2,"PPtr<$Texture2D>","blueNoise64LTex",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$Texture2D>","bayerMatrixTex",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0]],"typeHash":"ea78afb1b30663b7c04c956e9f2acdec"}, "Unity.RenderPipelines.Universal.Runtime|UnityEngine.Rendering.Universal|UniversalRendererData":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"DebugShaderResources","debugShaders",0],[2,"PPtr<$Shader>","debugReplacementPS",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$Shader>","hdrDebugViewPS",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[1,"ProbeVolumeResources","probeVolumeResources",0],[2,"PPtr<$Shader>","probeVolumeDebugShader",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$Shader>","probeVolumeFragmentationDebugShader",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$Shader>","probeVolumeOffsetDebugShader",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$Shader>","probeVolumeSamplingDebugShader",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$Mesh>","probeSamplingDebugMesh",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$Texture2D>","probeSamplingDebugTexture",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[2,"PPtr<$ComputeShader>","probeVolumeBlendStatesCS",0],[3,"int","m_FileID",0],[3,"SInt64","m_PathID",0],[1,"vector","m_RendererFeatures",0],[2,"Array","Array",0],[3,"int","size",0],[3,"PPtr<$ScriptableRendererFeature>","data",0],[4,"int","m_FileID",0],[4,"SInt64","m_PathID",0],[1,"vector","m_RendererFeatureMap",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"SInt64","data",0],[1,"UInt8","m_UseNativeRenderPass",16384],[1,"PPtr<$XRSystemData>","xrSystemData",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$PostProcessData>","postProcessData",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"int","m_AssetVersion",0],[1,"BitField","m_PrepassLayerMask",0],[2,"unsigned int","m_Bits",0],[1,"BitField","m_OpaqueLayerMask",0],[2,"unsigned int","m_Bits",0],[1,"BitField","m_TransparentLayerMask",0],[2,"unsigned int","m_Bits",0],[1,"StencilStateData","m_DefaultStencilState",0],[2,"UInt8","overrideStencilState",16384],[2,"int","stencilReference",0],[2,"int","stencilCompareFunction",0],[2,"int","passOperation",0],[2,"int","failOperation",0],[2,"int","zFailOperation",0],[1,"UInt8","m_ShadowTransparentReceive",16384],[1,"int","m_RenderingMode",0],[1,"int","m_DepthPrimingMode",0],[1,"int","m_CopyDepthMode",0],[1,"int","m_DepthAttachmentFormat",0],[1,"int","m_DepthTextureFormat",0],[1,"UInt8","m_AccurateGbufferNormals",16384],[1,"int","m_IntermediateTextureMode",0]],"typeHash":"c5a78730dc24e0c4472a14856758a6b5"}, "Unity.TextMeshPro|TMPro|TMP_Settings":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"string","assetVersion",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"int","m_TextWrappingMode",0],[1,"UInt8","m_enableKerning",16384],[1,"vector","m_ActiveFontFeatures",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"unsigned int","data",0],[1,"UInt8","m_enableExtraPadding",16384],[1,"UInt8","m_enableTintAllSprites",16384],[1,"UInt8","m_enableParseEscapeCharacters",16384],[1,"UInt8","m_EnableRaycastTarget",16384],[1,"UInt8","m_GetFontFeaturesAtRuntime",16384],[1,"int","m_missingGlyphCharacter",0],[1,"UInt8","m_ClearDynamicDataOnBuild",16384],[1,"UInt8","m_warningsDisabled",16384],[1,"PPtr<$TMP_FontAsset>","m_defaultFontAsset",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_defaultFontAssetPath",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"float","m_defaultFontSize",0],[1,"float","m_defaultAutoSizeMinRatio",0],[1,"float","m_defaultAutoSizeMaxRatio",0],[1,"Vector2f","m_defaultTextMeshProTextContainerSize",0],[2,"float","x",0],[2,"float","y",0],[1,"Vector2f","m_defaultTextMeshProUITextContainerSize",0],[2,"float","x",0],[2,"float","y",0],[1,"UInt8","m_autoSizeTextContainer",16384],[1,"UInt8","m_IsTextObjectScaleStatic",16384],[1,"vector","m_fallbackFontAssets",0],[2,"Array","Array",0],[3,"int","size",0],[3,"PPtr<$TMP_FontAsset>","data",0],[4,"int","m_FileID",0],[4,"SInt64","m_PathID",0],[1,"UInt8","m_matchMaterialPreset",16384],[1,"UInt8","m_HideSubTextObjects",16384],[1,"PPtr<$TMP_SpriteAsset>","m_defaultSpriteAsset",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_defaultSpriteAssetPath",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"UInt8","m_enableEmojiSupport",16384],[1,"unsigned int","m_MissingCharacterSpriteUnicode",0],[1,"vector","m_EmojiFallbackTextAssets",0],[2,"Array","Array",0],[3,"int","size",0],[3,"PPtr<$TMP_Asset>","data",0],[4,"int","m_FileID",0],[4,"SInt64","m_PathID",0],[1,"string","m_defaultColorGradientPresetsPath",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"PPtr<$TMP_StyleSheet>","m_defaultStyleSheet",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_StyleSheetsResourcePath",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"PPtr<$TextAsset>","m_leadingCharacters",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"PPtr<$TextAsset>","m_followingCharacters",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_UseModernHangulLineBreakingRules",16384]],"typeHash":"bfa9d6dfbc3c74a843a3b197bdcc6639"}, -"Unity.TextMeshPro|TMPro|TMP_StyleSheet":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"TMP_Style","m_StyleList",0],[2,"Array","Array",0],[3,"int","size",0],[3,"TMP_Style","data",0],[4,"string","m_Name",0],[5,"Array","Array",16384],[6,"int","size",0],[6,"char","data",0],[4,"int","m_HashCode",0],[4,"string","m_OpeningDefinition",0],[5,"Array","Array",16384],[6,"int","size",0],[6,"char","data",0],[4,"string","m_ClosingDefinition",0],[5,"Array","Array",16384],[6,"int","size",0],[6,"char","data",0],[4,"vector","m_OpeningTagArray",0],[5,"Array","Array",16384],[6,"int","size",0],[6,"unsigned int","data",0],[4,"vector","m_ClosingTagArray",0],[5,"Array","Array",16384],[6,"int","size",0],[6,"unsigned int","data",0]],"typeHash":"8d5318ed8488b1fe17c08044ce1b8309"} +"Unity.TextMeshPro|TMPro|TMP_StyleSheet":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"TMP_Style","m_StyleList",0],[2,"Array","Array",0],[3,"int","size",0],[3,"TMP_Style","data",0],[4,"string","m_Name",0],[5,"Array","Array",16384],[6,"int","size",0],[6,"char","data",0],[4,"int","m_HashCode",0],[4,"string","m_OpeningDefinition",0],[5,"Array","Array",16384],[6,"int","size",0],[6,"char","data",0],[4,"string","m_ClosingDefinition",0],[5,"Array","Array",16384],[6,"int","size",0],[6,"char","data",0],[4,"vector","m_OpeningTagArray",0],[5,"Array","Array",16384],[6,"int","size",0],[6,"unsigned int","data",0],[4,"vector","m_ClosingTagArray",0],[5,"Array","Array",16384],[6,"int","size",0],[6,"unsigned int","data",0]],"typeHash":"8d5318ed8488b1fe17c08044ce1b8309"}, +"UnityEngine.UI|UnityEngine.EventSystems|EventSystem":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"PPtr<$GameObject>","m_FirstSelected",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_sendNavigationEvents",16384],[1,"int","m_DragThreshold",0]],"typeHash":"e987953190eb4c12cf19df790566dc2c"}, +"UnityEngine.UI|UnityEngine.EventSystems|Physics2DRaycaster":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"BitField","m_EventMask",0],[2,"unsigned int","m_Bits",0],[1,"int","m_MaxRayIntersections",0]],"typeHash":"e8d390bd9ecacc453a7500b90d0c0292"}, +"UnityEngine.UI|UnityEngine.UI|CanvasScaler":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"int","m_UiScaleMode",0],[1,"float","m_ReferencePixelsPerUnit",0],[1,"float","m_ScaleFactor",0],[1,"Vector2f","m_ReferenceResolution",0],[2,"float","x",0],[2,"float","y",0],[1,"int","m_ScreenMatchMode",0],[1,"float","m_MatchWidthOrHeight",0],[1,"int","m_PhysicalUnit",0],[1,"float","m_FallbackScreenDPI",0],[1,"float","m_DefaultSpriteDPI",0],[1,"float","m_DynamicPixelsPerUnit",0],[1,"UInt8","m_PresetInfoIsWorld",16384]],"typeHash":"540882762544409cc4530e60db00e951"}, +"UnityEngine.UI|UnityEngine.UI|GraphicRaycaster":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"UInt8","m_IgnoreReversedGraphics",16384],[1,"int","m_BlockingObjects",0],[1,"BitField","m_BlockingMask",0],[2,"unsigned int","m_Bits",0]],"typeHash":"5a4aa2850fe11587f47e34c270c7fd22"}, +"UnityEngine.UI|UnityEngine.UI|Image":{"nodes":[[0,"MonoBehaviour","Base",0],[1,"PPtr","m_GameObject",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"UInt8","m_Enabled",16384],[1,"PPtr","m_Script",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"string","m_Name",0],[2,"Array","Array",16384],[3,"int","size",0],[3,"char","data",0],[1,"PPtr<$Material>","m_Material",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"ColorRGBA","m_Color",0],[2,"float","r",0],[2,"float","g",0],[2,"float","b",0],[2,"float","a",0],[1,"UInt8","m_RaycastTarget",16384],[1,"Vector4f","m_RaycastPadding",0],[2,"float","x",0],[2,"float","y",0],[2,"float","z",0],[2,"float","w",0],[1,"UInt8","m_Maskable",16384],[1,"CullStateChangedEvent","m_OnCullStateChanged",0],[2,"PersistentCallGroup","m_PersistentCalls",0],[3,"PersistentCall","m_Calls",0],[4,"Array","Array",0],[5,"int","size",0],[5,"PersistentCall","data",0],[6,"PPtr<$Object>","m_Target",0],[7,"int","m_FileID",0],[7,"SInt64","m_PathID",0],[6,"string","m_TargetAssemblyTypeName",0],[7,"Array","Array",16384],[8,"int","size",0],[8,"char","data",0],[6,"string","m_MethodName",0],[7,"Array","Array",16384],[8,"int","size",0],[8,"char","data",0],[6,"int","m_Mode",0],[6,"ArgumentCache","m_Arguments",0],[7,"PPtr<$Object>","m_ObjectArgument",0],[8,"int","m_FileID",0],[8,"SInt64","m_PathID",0],[7,"string","m_ObjectArgumentAssemblyTypeName",0],[8,"Array","Array",16384],[9,"int","size",0],[9,"char","data",0],[7,"int","m_IntArgument",0],[7,"float","m_FloatArgument",0],[7,"string","m_StringArgument",0],[8,"Array","Array",16384],[9,"int","size",0],[9,"char","data",0],[7,"UInt8","m_BoolArgument",16384],[6,"int","m_CallState",0],[1,"PPtr<$Sprite>","m_Sprite",0],[2,"int","m_FileID",0],[2,"SInt64","m_PathID",0],[1,"int","m_Type",0],[1,"UInt8","m_PreserveAspect",16384],[1,"UInt8","m_FillCenter",16384],[1,"int","m_FillMethod",0],[1,"float","m_FillAmount",0],[1,"UInt8","m_FillClockwise",16384],[1,"int","m_FillOrigin",0],[1,"UInt8","m_UseSpriteMesh",16384],[1,"float","m_PixelsPerUnitMultiplier",0]],"typeHash":"dd9dda1dfd39e605c49e72003342ef5d"} }} diff --git a/tests/content/test_storyscene.py b/tests/content/test_storyscene.py index 2b1572e..cc6d855 100644 --- a/tests/content/test_storyscene.py +++ b/tests/content/test_storyscene.py @@ -132,9 +132,25 @@ def test_two_render_settings_raise_value_error(tmp_path): storyscene.scene(objs) +CATALOG = [storyscene.SCENE_KEY, *storyscene.PREFAB_KEYS.values(), *(k for k, _ in storyscene.SETTINGS_KEYS.values())] + + +def test_a_manager_the_boot_scene_holds_is_no_catalog_key(): + without = [k for k in CATALOG if k != storyscene.PREFAB_KEYS["cameraManager"]] + assert storyscene.keys(without) == sorted(without) and len(storyscene.keys(without)) == 6 + + def test_keys_list_the_seven_keys_sorted(): - ks = storyscene.keys() + ks = storyscene.keys(CATALOG) assert len(ks) == 7 and ks == sorted(ks) assert storyscene.SCENE_KEY in ks assert set(storyscene.PREFAB_KEYS.values()) <= set(ks) assert {key for key, _ in storyscene.SETTINGS_KEYS.values()} <= set(ks) + + +def test_a_manager_of_the_boot_scene_stands_for_its_missing_catalog_key(tmp_path): + held = keys() + del held[storyscene.PREFAB_KEYS["cameraManager"]] + held["builtin"] = [*held["builtin"], CAMERA] + doc, _, _ = storyscene.scene(Objects(table(Depot(tmp_path / "d"), held, objects()), Depot(tmp_path / "d"))) + assert doc["prefabs"]["cameraManager"] == CAMERA diff --git a/tests/pipeline/test_story.py b/tests/pipeline/test_story.py index 1188421..eee5e2d 100644 --- a/tests/pipeline/test_story.py +++ b/tests/pipeline/test_story.py @@ -2,7 +2,7 @@ import pytest -from nnnotes.content import storychat, storyepisode, storyscene, storyui +from nnnotes.content import prefabs, storychat, storyepisode, storyscene, storyui from nnnotes.formats import crilips from nnnotes.pipeline import assemble, contract, cristages, live, story from nnnotes.pipeline.assemble import Objects @@ -90,13 +90,32 @@ def test_the_crilips_product_has_one_subject_and_reads_the_library(): assert stage.select(["Cri/Sound/a"], None) == [] +class _CatalogEnv: + def __init__(self, keys): + self.keys = keys + + def fact(self, name): + assert name == "index" + return {"locations": [{"primaryKey": k} for k in self.keys]} + + +def test_the_scene_product_of_a_boot_scene_manager_catalog_adds_the_boot_gameobjects(): + stage = SceneStage() + env = _CatalogEnv([]) + assert stage.builtins("default", env) == ["GameObject", "GraphicsSettings", "PlayerSettings", "QualitySettings"] + assert storyscene.PREFAB_KEYS["cameraManager"] not in stage.keys("default", env) + assert stage.select(stage.keys("default", env), None) == ["default"] + + def test_the_scene_product_has_one_subject_its_keys_and_the_graphics_settings(): stage = SceneStage() - assert stage.keys("default", None) == storyscene.keys() and len(storyscene.keys()) == 7 - assert stage.builtins("default", None) == ["GraphicsSettings", "PlayerSettings", "QualitySettings"] + held = [*storyscene.keys(prefabs.BOOT_MANAGERS), *prefabs.BOOT_MANAGERS] + env = _CatalogEnv(held) + assert stage.keys("default", env) == storyscene.keys(held) and len(storyscene.keys(held)) == 7 + assert stage.builtins("default", env) == ["GraphicsSettings", "PlayerSettings", "QualitySettings"] assert stage.manifest("default") == "storyscenes/default.json" - assert stage.select([*storyscene.keys(), "Adv/Stage/bg"], None) == ["default"] - assert stage.select(storyscene.keys()[1:], None) == [] + assert stage.select([*storyscene.keys(held), "Adv/Stage/bg"], None) == ["default"] + assert stage.select(storyscene.keys(held)[1:], None) == [] with pytest.raises(ValueError, match="the only subject is default"): stage.keys("other", None) @@ -380,7 +399,11 @@ def test_the_story_ui_product_has_one_subject_per_client_language(tmp_path): assert stage.ui_keys("zh-Hant", env) == storyui.keys(sui.catalog_keys()) assert stage.keys("ja", env) == sorted([*storyui.keys(sui.catalog_keys()), "Adv/Chat/Prefabs/win_7"]) assert stage.resources("ja", None) == ["DOTweenSettings", "TMP Settings"] - assert stage.builtins("en", None) == ["GraphicsSettings", "MonoBehaviour:LocalizeManager"] + assert stage.builtins("en", env) == [ + "GraphicsSettings", + "MonoBehaviour:LocalizeManager", + *prefabs.boot_builtins(sui.catalog_keys()), + ] assert stage.manifest("zh-Hant") == "storyui/zh-Hant.json" assert PART_STAGES[UI] is UiStage with pytest.raises(ValueError, match="not a client language"):