diff --git a/Assets/AddressableAssetsData/AddressableAssetSettings.asset b/Assets/AddressableAssetsData/AddressableAssetSettings.asset index 424140ee..31fc4dc4 100644 --- a/Assets/AddressableAssetsData/AddressableAssetSettings.asset +++ b/Assets/AddressableAssetsData/AddressableAssetSettings.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b538de6207ff76d76e808f192acbbb38dadbe529a099f1bd7f0a566a0d69c8c0 -size 5132 +oid sha256:1d88981dafaadc91dfb40255b40a80896ee4ca8c417e6f9b28a18e5d6604422c +size 5155 diff --git a/Assets/AddressableAssetsData/Windows/addressables_content_state.bin b/Assets/AddressableAssetsData/Windows/addressables_content_state.bin index 7d7ab1fe..afcf5b74 100644 Binary files a/Assets/AddressableAssetsData/Windows/addressables_content_state.bin and b/Assets/AddressableAssetsData/Windows/addressables_content_state.bin differ diff --git a/Assets/FR2_Cache.asset b/Assets/FR2_Cache.asset index f44b482f..fe02f2ff 100644 --- a/Assets/FR2_Cache.asset +++ b/Assets/FR2_Cache.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ec339e0603b3f90d2247c4862bcc1a4b32f06c97dc19bd091e28eb74c258ac56 -size 291 +oid sha256:1406401b638900b688c39f7d50aa2119f94fd5310bc63f0f09038d032e495b68 +size 8841392 diff --git a/Assets/Localization/Chinese (Simplified) (zh-CN).asset b/Assets/Localization/Chinese (Simplified) (zh-CN).asset index 687087cf..5db281ab 100644 --- a/Assets/Localization/Chinese (Simplified) (zh-CN).asset +++ b/Assets/Localization/Chinese (Simplified) (zh-CN).asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5340aa24a80affc77c39379d729b1cd4d35bf07b98805bbd658ebb065678beb2 -size 1152 +oid sha256:ae50b007d5674e75c3836e8d8ed9d6dc33ae40be3614b00c18e44a1320d8e968 +size 694 diff --git a/Assets/Localization/English (en).asset b/Assets/Localization/English (en).asset index 7c91ab6c..aa81e843 100644 --- a/Assets/Localization/English (en).asset +++ b/Assets/Localization/English (en).asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3b0330f7f9af0b1c088ae37ea6e4f0a2e3cf79f09f851a42724ca091ed82d023 +oid sha256:ba8e4a9d0848dcd9d94cd60519cea550ffe07a296a29d2a9952b0b8de776ab6e size 659 diff --git a/Assets/Localization/Localization Settings.asset b/Assets/Localization/Localization Settings.asset index ebb1e118..5cb13222 100644 --- a/Assets/Localization/Localization Settings.asset +++ b/Assets/Localization/Localization Settings.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3d3286c54c1371d3529b40a152aba59fb2699a8e9c912732be1c85f405b163f3 -size 7535 +oid sha256:d06a1c54d63d7579018efc04f5040ca01eaa81c0d5134713f57f6f2c801170ac +size 7538 diff --git a/Assets/Localization/Story/Chapter0_Lines Shared Data.asset b/Assets/Localization/Story/Chapter0_Lines Shared Data.asset index 54294df7..21885d2d 100644 --- a/Assets/Localization/Story/Chapter0_Lines Shared Data.asset +++ b/Assets/Localization/Story/Chapter0_Lines Shared Data.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:301c1e96a574d7a7c726d56ed67cffe5154daf371be231673cfcec3e5df89532 -size 24431 +oid sha256:76108f08e663487fe015aa2d55c4e45b3768253d7a8ecf3aaaa52a409768c7fc +size 276 diff --git a/Assets/Localization/Story/Chapter0_Lines_zh-CN.asset b/Assets/Localization/Story/Chapter0_Lines_zh-CN.asset index 034b0681..f7bc76f2 100644 --- a/Assets/Localization/Story/Chapter0_Lines_zh-CN.asset +++ b/Assets/Localization/Story/Chapter0_Lines_zh-CN.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ea4d0949ffab4bcaec877dd015cf6d9af99637dad8721b5810a9a5ccb110315d -size 977 +oid sha256:410baa301ade89fc630392961228ac53148fac43f80ec36d826ba2f3a76f222b +size 1733526 diff --git a/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/Beatmap.bytes b/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/Beatmap.bytes index 145d4d17..1ffd39d0 100644 Binary files a/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/Beatmap.bytes and b/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/Beatmap.bytes differ diff --git a/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/CommandScripts.bytes b/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/CommandScripts.bytes index 0080eaa5..448ef8d4 100644 Binary files a/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/CommandScripts.bytes and b/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/CommandScripts.bytes differ diff --git a/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/ProjectInfo.bytes b/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/ProjectInfo.bytes index da170462..e41f0a1b 100644 Binary files a/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/ProjectInfo.bytes and b/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/ProjectInfo.bytes differ diff --git a/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/SongInfo.bytes b/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/SongInfo.bytes index 0c833f01..a1bf0594 100644 Binary files a/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/SongInfo.bytes and b/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/SongInfo.bytes differ diff --git a/Assets/Resources/Chapter0.asset b/Assets/Resources/Chapter0.asset index 62d49ce2..8509954a 100644 --- a/Assets/Resources/Chapter0.asset +++ b/Assets/Resources/Chapter0.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1d76b9e65207e2fdbc463369c88f20764a2c591b1ff472735d8f150080ede7cc -size 17770 +oid sha256:36fb19efae81dbd01582a47e3049592f87718644de68e5550bcf387eb978eb5b +size 274 diff --git a/Assets/Resources/TutorialCollection.asset b/Assets/Resources/TutorialCollection.asset index be733baf..83e4bbdf 100644 --- a/Assets/Resources/TutorialCollection.asset +++ b/Assets/Resources/TutorialCollection.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:735bc731ac19917b2481c80b09db44a8fa89d2b67faeea7a8e1f1ad0b848abdf -size 3840 +oid sha256:1fbaecfa2c8fffa93345a1cf0d594bee6b51fda08b542012f1372ff8ded7fe48 +size 3837 diff --git a/Assets/Scenes/MenuScene.unity b/Assets/Scenes/MenuScene.unity index 83a07ae3..97a16388 100644 --- a/Assets/Scenes/MenuScene.unity +++ b/Assets/Scenes/MenuScene.unity @@ -1879,7 +1879,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!4 &75568547 Transform: m_ObjectHideFlags: 0 @@ -2024,7 +2024,7 @@ MonoBehaviour: columnStep: 720 rowStep: 525 marginLeft: 50 - helperReservedLeftSpace: 1600 + helperReservedLeftSpace: 1200 marginRight: 50 marginTop: 50 marginBottom: 50 @@ -4539,6 +4539,390 @@ RectTransform: m_AnchoredPosition: {x: 32.5, y: -27.5} m_SizeDelta: {x: 25, y: 45} m_Pivot: {x: 0.5, y: 0.5} +--- !u!1001 &314352139 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 132536, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_Name + value: IngameDebugConsole (1) + objectReference: {fileID: 0} + - target: {fileID: 11440770, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_ReferenceResolution.x + value: 1920 + objectReference: {fileID: 0} + - target: {fileID: 11440770, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_ReferenceResolution.y + value: 1080 + objectReference: {fileID: 0} + - target: {fileID: 22331464, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_Camera + value: + objectReference: {fileID: 751614408} + - target: {fileID: 22331464, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_RenderMode + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 22414360, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchoredPosition.x + value: 923.58 + objectReference: {fileID: 0} + - target: {fileID: 22426080, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22426080, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22426080, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22428984, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22428984, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22428984, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22428984, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22428984, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22428984, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22455554, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22455554, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22455554, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22455554, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22455554, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22455554, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22457152, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22457152, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_Pivot.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22457152, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22457152, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22457152, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22457152, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22457152, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22457152, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22457152, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22457152, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22457152, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22457152, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 22457152, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22457152, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22457152, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22457152, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22457152, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22457152, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22457152, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22457152, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22468896, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22468896, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22468896, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22468896, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22468896, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22468896, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22488670, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22488670, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22488670, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22488670, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22488670, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22488670, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22495692, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22495692, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22495692, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22495692, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22495692, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22495692, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224619367409363176, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224619367409363176, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224619367409363176, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224619367409363176, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224619367409363176, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224619367409363176, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224856348943071238, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224856348943071238, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224856348943071238, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224856348943071238, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224856348943071238, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224856348943071238, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 958269219681220773, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: m_fontSize + value: 16 + objectReference: {fileID: 0} + - target: {fileID: 958269219681220773, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: 'm_ActiveFontFeatures.Array.data[0]' + value: 1801810542 + objectReference: {fileID: 0} + - target: {fileID: 2369662702609791303, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: m_fontSize + value: 16 + objectReference: {fileID: 0} + - target: {fileID: 2369662702609791303, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: 'm_ActiveFontFeatures.Array.data[0]' + value: 1801810542 + objectReference: {fileID: 0} + - target: {fileID: 4760950775166374324, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: 'm_ActiveFontFeatures.Array.data[0]' + value: 1801810542 + objectReference: {fileID: 0} + - target: {fileID: 5379786813386287946, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: 'm_ActiveFontFeatures.Array.data[0]' + value: 1801810542 + objectReference: {fileID: 0} + - target: {fileID: 6275684029659916475, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: 'm_ActiveFontFeatures.Array.data[0]' + value: 1801810542 + objectReference: {fileID: 0} + - target: {fileID: 7682126221316033537, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: 'm_ActiveFontFeatures.Array.data[0]' + value: 1801810542 + objectReference: {fileID: 0} + - target: {fileID: 7917212057380179541, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: 'm_ActiveFontFeatures.Array.data[0]' + value: 1801810542 + objectReference: {fileID: 0} + - target: {fileID: 8026934286120355878, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: m_fontSize + value: 16 + objectReference: {fileID: 0} + - target: {fileID: 8026934286120355878, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: 'm_ActiveFontFeatures.Array.data[0]' + value: 1801810542 + objectReference: {fileID: 0} + - target: {fileID: 8276117061088563291, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: m_fontSize + value: 16 + objectReference: {fileID: 0} + - target: {fileID: 8276117061088563291, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: 'm_ActiveFontFeatures.Array.data[0]' + value: 1801810542 + objectReference: {fileID: 0} + - target: {fileID: 8949468901311314302, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: m_fontSize + value: 16 + objectReference: {fileID: 0} + - target: {fileID: 8949468901311314302, guid: 67117722a812a2e46ab8cb8eafbf5f5e, + type: 3} + propertyPath: 'm_ActiveFontFeatures.Array.data[0]' + value: 1801810542 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} --- !u!1 &314360844 GameObject: m_ObjectHideFlags: 0 @@ -7275,9 +7659,6 @@ MonoBehaviour: m_EditorClassIdentifier: Assembly-CSharp::Ichni.Story.Dialogue.StoryDialogueController dialogueRunner: {fileID: 449802389} storyUIPage: {fileID: 78737089} - yarnLinesTable: - m_TableReference: - m_TableCollectionName: --- !u!114 &449802391 MonoBehaviour: m_ObjectHideFlags: 0 @@ -12338,7 +12719,7 @@ MonoBehaviour: m_Right: 0 m_Top: 0 m_Bottom: 0 - m_ChildAlignment: 1 + m_ChildAlignment: 4 m_Spacing: 50 m_ChildForceExpandWidth: 0 m_ChildForceExpandHeight: 0 @@ -13212,22 +13593,21 @@ MonoBehaviour: transitionUIPage: {fileID: 2081546316} settingsUIPage: {fileID: 1385276032} languageList: - - English - Simplified Chinese + - English - Traditional Chinese - Japanese - Korean - Vietnamese - Thai displayLanguageList: - - English - "\u7B80\u4F53\u4E2D\u6587" + - English - "\u7E41\u9AD4\u4E2D\u6587" - "\u65E5\u672C\u8A9E" - "\uD55C\uAD6D\uC5B4" - "Ti\u1EBFng Vi\u1EC7t" - "\u0E20\u0E32\u0E29\u0E32\u0E44\u0E17\u0E22" - isEnteringGame: 0 --- !u!4 &811649975 Transform: m_ObjectHideFlags: 0 @@ -24500,7 +24880,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!114 &1644203570 MonoBehaviour: m_ObjectHideFlags: 0 @@ -36950,3 +37330,4 @@ SceneRoots: - {fileID: 1644203571} - {fileID: 75568547} - {fileID: 1483720712} + - {fileID: 314352139} diff --git a/Assets/Scripts/Manager/ThemeBundleManager.cs b/Assets/Scripts/Manager/ThemeBundleManager.cs index 10c21847..4b8f802c 100644 --- a/Assets/Scripts/Manager/ThemeBundleManager.cs +++ b/Assets/Scripts/Manager/ThemeBundleManager.cs @@ -19,17 +19,42 @@ namespace Ichni public IntReactiveProperty waitingBundleAmount; + // 只记录本 Manager 通过 AssetBundle.LoadFromFileAsync 加载的 Theme Bundle。 + // Addressables(包括 Unity Localization)拥有自己的 Bundle 引用计数,绝不能通过 + // AssetBundle.UnloadAllAssetBundles 代替各系统分别释放资源。 + private readonly List loadedAssetBundles = new List(); + private void Awake() { instance = this; loadedThemeBundleList = new List(); - AssetBundle.UnloadAllAssetBundles(true); LoadAllThemeBundlesAbstract(); //LoadThemeBundle("basic"); //LoadThemeBundle("departure_to_multiverse"); } + private void OnDestroy() + { + // 仅卸载本实例拥有的 Theme Bundle,不影响 Addressables 管理的 Locale、String Table + // 或其它系统加载的 AssetBundle。 + foreach (AssetBundle bundle in loadedAssetBundles) + { + if (bundle != null) + { + bundle.Unload(true); + } + } + + loadedAssetBundles.Clear(); + loadedThemeBundleList?.Clear(); + + if (instance == this) + { + instance = null; + } + } + public bool TryGetThemeBundle(string themeBundleName, out ThemeBundle themeBundle) { themeBundle = loadedThemeBundleList.Find(bundle => bundle.themeBundleName == themeBundleName); @@ -112,32 +137,51 @@ namespace Ichni AssetBundleCreateRequest createRequest = AssetBundle.LoadFromFileAsync(uri); yield return createRequest; AssetBundle bundle = createRequest.assetBundle; - Object[] ob = bundle.LoadAllAssets(); - loadedThemeBundleList.Add(new ThemeBundle(themeBundleName)); - - for (int i = 0; i < ob.Length; i++) + if (bundle == null) { - if (ob[i].GetType() == typeof(GameObject)) + Debug.LogError($"Theme Bundle 加载失败:{uri}"); + waitingBundleAmount.Value--; + yield break; + } + + loadedAssetBundles.Add(bundle); + + try + { + Object[] ob = bundle.LoadAllAssets(); + loadedThemeBundleList.Add(new ThemeBundle(themeBundleName)); + + for (int i = 0; i < ob.Length; i++) { - loadedThemeBundleList[^1].assetList_GameObject.Add(ob[i] as GameObject); - } - else if (ob[i].GetType() == typeof(Material)) - { - loadedThemeBundleList[^1].assetList_Material.Add(ob[i] as Material); - } - else if (ob[i].GetType() == typeof(Texture2D)) - { - loadedThemeBundleList[^1].assetList_Texture.Add(ob[i] as Texture2D); - } - else - { - loadedThemeBundleList[^1].assetList_Other.Add(ob[i]); + if (ob[i].GetType() == typeof(GameObject)) + { + loadedThemeBundleList[^1].assetList_GameObject.Add(ob[i] as GameObject); + } + else if (ob[i].GetType() == typeof(Material)) + { + loadedThemeBundleList[^1].assetList_Material.Add(ob[i] as Material); + } + else if (ob[i].GetType() == typeof(Texture2D)) + { + loadedThemeBundleList[^1].assetList_Texture.Add(ob[i] as Texture2D); + } + else + { + loadedThemeBundleList[^1].assetList_Other.Add(ob[i]); + } } } + catch (System.Exception exception) + { + Debug.LogException(exception, this); + } + finally + { + waitingBundleAmount.Value--; + } yield return new WaitForEndOfFrame(); print(themeBundleName + " Done!"); - waitingBundleAmount.Value--; } } @@ -253,4 +297,4 @@ namespace Ichni return null; } } -} \ No newline at end of file +} diff --git a/Assets/Scripts/Menu/MenuManager.cs b/Assets/Scripts/Menu/MenuManager.cs index bcf7f6db..5b54739d 100644 --- a/Assets/Scripts/Menu/MenuManager.cs +++ b/Assets/Scripts/Menu/MenuManager.cs @@ -1,4 +1,3 @@ -using System; using System.Collections; using System.Collections.Generic; using AK.Wwise; @@ -8,7 +7,6 @@ using Ichni.Story.UI; using Ichni.UI; using Sirenix.OdinInspector; using SLSUtilities.WwiseAssistance; -using UniRx; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.Serialization; @@ -34,14 +32,26 @@ namespace Ichni public partial class MenuManager { - AsyncOperation asyncOperation; - public bool isEnteringGame; + private const string GameSceneName = "GameScene"; + private const float DefaultTransitionDelay = 0.6f; + + private Coroutine gameSceneLoadCoroutine; + private AsyncOperation gameSceneLoadOperation; /// - /// 当前 MenuScene 是否已经完成 GameScene 预加载且尚未处于切场中。 - /// TutorialFlowController 在写入“已处理”剧情变量前使用此状态进行最后一次启动前检查。 + /// 是否已经接受了某个进入游戏的请求。 + /// 从确认进入开始便保持为 true,用于阻止按钮连点和多个入口同时发起场景切换。 /// - public bool CanBeginGame => !isEnteringGame && asyncOperation != null; + public bool isEnteringGame { get; private set; } + + /// + /// 当前是否可以接受新的 GameScene 进入请求。 + /// GameScene 改为玩家确认后按需加载,因此不再依赖菜单启动阶段的预加载句柄。 + /// + public bool CanBeginGame => + !isEnteringGame && + gameSceneLoadCoroutine == null && + gameSceneLoadOperation == null; private void Awake() { @@ -88,8 +98,6 @@ namespace Ichni information?.ClearMenuReturnDestination(); Application.targetFrameRate = SettingsManager.instance.settingsSaveData.targetFrame; - asyncOperation = SceneManager.LoadSceneAsync("GameScene"); - asyncOperation.allowSceneActivation = false; } } @@ -97,25 +105,17 @@ namespace Ichni { public void EnterGame() { - // 剧情 SongBlock 仅在玩家确认进入指定目标歌曲后才要求返回剧情; - // 普通选曲与从剧情入口改选其它歌曲都继续返回选曲页。 - StorySongEntryContext context = InformationTransistor.instance?.storySongEntryContext; - MenuReturnDestination destination = context != null && context.isActive && - context.returnToStoryAfterGame - ? MenuReturnDestination.Story - : MenuReturnDestination.SongSelection; - EnterGame(destination); + ScheduleGameSceneLoad(ResolveCurrentReturnDestination(), 0f); } /// - /// 激活已预加载的 GameScene,并写入唯一的菜单返回目标。 + /// 按需加载 GameScene,并写入唯一的菜单返回目标。 /// 普通选曲使用 ,教程使用 /// 。 /// public void EnterGame(MenuReturnDestination returnDestination) { - InformationTransistor.instance?.SetMenuReturnDestination(returnDestination); - EnterGameScene(); + ScheduleGameSceneLoad(returnDestination, 0f); } /// @@ -127,36 +127,138 @@ namespace Ichni { if (!CanBeginGame) { - Debug.LogWarning("[MenuManager] GameScene 未完成预加载或菜单已在切换,忽略启动请求。"); + Debug.LogWarning("[MenuManager] 菜单已经接受其它进入请求,忽略本次 GameScene 启动请求。"); return false; } - if (InformationTransistor.instance == null || - !InformationTransistor.instance.PrepareGameLaunch(chapter, song, difficulty, returnDestination)) + if (InformationTransistor.instance == null || chapter == null || song == null || difficulty == null) { return false; } - isEnteringGame = true; + if (!TryReserveGameEntry()) + return false; + + if (!InformationTransistor.instance.PrepareGameLaunch(chapter, song, difficulty, returnDestination)) + { + CancelGameEntryReservation(); + return false; + } + sourcePage?.FadeOut(); transitionUIPage?.FadeIn(); AudioManager.Post(AK.EVENTS.ENTERTOGAME); - Observable.Timer(TimeSpan.FromSeconds(0.6f)).Subscribe(_ => EnterGameScene()); + return ScheduleGameSceneLoad(returnDestination, DefaultTransitionDelay); + } + + /// + /// 在进入动画开始前预占本次场景切换。 + /// 标准 Play、快速进入和 TutorialBlock 都必须通过这里防止同一帧的重复点击。 + /// + public bool TryReserveGameEntry() + { + if (!CanBeginGame) + return false; + + isEnteringGame = true; return true; } - - public void EnterGameScene() + + /// + /// 为已经完成自定义入场动画的入口安排 GameScene 加载。 + /// 延迟使用 realtime,确保暂停或修改 timeScale 时仍能正常进入游戏。 + /// + public bool ScheduleCurrentGameSceneLoad(float delay = DefaultTransitionDelay) { - if (asyncOperation == null) + return ScheduleGameSceneLoad(ResolveCurrentReturnDestination(), delay); + } + + /// + /// 在指定转场延迟后启动 GameScene 的异步加载。 + /// 这里绝不把 allowSceneActivation 设为 false:场景开始加载后会自然完成并自动激活, + /// 避免阻塞 Localization、Addressables 和其它 Unity AsyncOperation。 + /// + public bool ScheduleGameSceneLoad(MenuReturnDestination returnDestination, float delay) + { + if (gameSceneLoadCoroutine != null || gameSceneLoadOperation != null) { - Debug.LogError("[MenuManager] GameScene 尚未完成预加载,无法进入游戏。"); - isEnteringGame = false; - return; + Debug.LogWarning("[MenuManager] GameScene 加载已经安排或正在执行,忽略重复请求。"); + return false; } + if (!isEnteringGame && !TryReserveGameEntry()) + return false; + + InformationTransistor.instance?.SetMenuReturnDestination(returnDestination); + gameSceneLoadCoroutine = StartCoroutine( + LoadGameSceneAfterTransition(Mathf.Max(0f, delay))); + return true; + } + + /// + /// 保留给既有 UnityEvent 和旧调用点的立即加载入口。 + /// 新代码通常应使用 ,把转场延迟也交给 MenuManager。 + /// + public void EnterGameScene() + { + ScheduleCurrentGameSceneLoad(0f); + } + + private IEnumerator LoadGameSceneAfterTransition(float delay) + { + if (delay > 0f) + yield return new WaitForSecondsRealtime(delay); + MenuInputManager.instance?.gameInput?.Menu.Disable(); - asyncOperation.allowSceneActivation = true; + + try + { + gameSceneLoadOperation = SceneManager.LoadSceneAsync( + GameSceneName, LoadSceneMode.Single); + } + catch (System.Exception exception) + { + Debug.LogException(exception, this); + HandleGameSceneLoadFailure("创建 GameScene 异步加载操作时发生异常。"); + yield break; + } + + if (gameSceneLoadOperation == null) + { + HandleGameSceneLoadFailure( + $"SceneManager.LoadSceneAsync 未能创建场景 '{GameSceneName}' 的加载操作。"); + yield break; + } + + // 不设置 allowSceneActivation=false。长时间挂起场景激活会冻结后续 AsyncOperation, + // 导致 Addressables String Table、AssetBundle 等资源永久停留在 0%。 + while (!gameSceneLoadOperation.isDone) + yield return null; + } + + private MenuReturnDestination ResolveCurrentReturnDestination() + { + // 剧情 SongBlock 仅在玩家确认进入指定目标歌曲后才要求返回剧情; + // 普通选曲与从剧情入口改选其它歌曲都继续返回选曲页。 + StorySongEntryContext context = InformationTransistor.instance?.storySongEntryContext; + return context != null && context.isActive && context.returnToStoryAfterGame + ? MenuReturnDestination.Story + : MenuReturnDestination.SongSelection; + } + + private void HandleGameSceneLoadFailure(string reason) + { + Debug.LogError($"[MenuManager] {reason}", this); + gameSceneLoadCoroutine = null; + gameSceneLoadOperation = null; + CancelGameEntryReservation(); + MenuInputManager.instance?.gameInput?.Menu.Enable(); + } + + private void CancelGameEntryReservation() + { + isEnteringGame = false; } } } diff --git a/Assets/Scripts/NewStorySystem/Data/StoryData.Editor.cs b/Assets/Scripts/NewStorySystem/Data/StoryData.Editor.cs index f602c941..c7266515 100644 --- a/Assets/Scripts/NewStorySystem/Data/StoryData.Editor.cs +++ b/Assets/Scripts/NewStorySystem/Data/StoryData.Editor.cs @@ -63,6 +63,11 @@ namespace Ichni.Story issues.Add("[Warning] Yarn Project 未配置;TextBlock 无法开始对应的 Yarn 节点。"); } + if (yarnLineStringTable == null || yarnLineStringTable.IsEmpty) + { + issues.Add("[Error] Yarn Line String Table 未配置;Player 中无法在启动对话前加载当前 Locale 的台词表。"); + } + foreach (StoryVariableDefinition variable in initialVariables) { if (variable == null) @@ -777,4 +782,3 @@ namespace Ichni.Story } #endif - diff --git a/Assets/Scripts/NewStorySystem/Data/StoryData.cs b/Assets/Scripts/NewStorySystem/Data/StoryData.cs index a114c322..0dfb5da5 100644 --- a/Assets/Scripts/NewStorySystem/Data/StoryData.cs +++ b/Assets/Scripts/NewStorySystem/Data/StoryData.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using Sirenix.OdinInspector; using UnityEngine; +using UnityEngine.Localization; using Yarn.Unity; namespace Ichni.Story @@ -22,6 +23,11 @@ namespace Ichni.Story [Tooltip("该章节对应的 YarnProject 编译资产。TextBlock 会在运行时从此项目中执行配置的 Yarn Node。")] public YarnProject yarnProject; + [TitleGroup("Chapter Settings")] + [LabelText("Yarn Line String Table")] + [Tooltip("该章节 Yarn 台词对应的 Unity Localization String Table。运行时会在启动对话前显式加载当前 Locale 的表;此配置必须与 DialogueRunner 上 UnityLocalisedLineProvider 使用的表一致。")] + public LocalizedStringTable yarnLineStringTable; + /// /// 本章节永久剧情变量的默认值。它们只属于本章节,且不会直接写入存档; /// 玩家第一次通过 Yarn 或其它剧情入口写入同名变量后,存档值才会覆盖这里的默认值。 diff --git a/Assets/Scripts/NewStorySystem/Dialogue/StoryDialogueController.cs b/Assets/Scripts/NewStorySystem/Dialogue/StoryDialogueController.cs index 673c1830..725598fd 100644 --- a/Assets/Scripts/NewStorySystem/Dialogue/StoryDialogueController.cs +++ b/Assets/Scripts/NewStorySystem/Dialogue/StoryDialogueController.cs @@ -1,9 +1,10 @@ +using System.Collections; using System.Collections.Generic; -using System.Reflection; using Ichni.Story.UI; using UnityEngine; using UnityEngine.Events; -using UnityEngine.Localization; +using UnityEngine.Localization.Tables; +using UnityEngine.ResourceManagement.AsyncOperations; using Yarn.Unity; using Yarn.Unity.UnityLocalization; @@ -25,10 +26,6 @@ namespace Ichni.Story.Dialogue [Tooltip("故事树页面:对话进行时淡出、结束后淡入(可选)。")] public StoryUIPage storyUIPage; - [Header("Localization")] - [Tooltip("所有章节 Yarn 台词共用的 Unity Localization String Table(建议命名 YarnLines)。留空时保留当前 UnityLocalisedLineProvider 的既有表配置。")] - public LocalizedStringTable yarnLinesTable; - /// /// 对话结束后依次执行并清空的回调队列。供 unlock_song 等 Yarn 命令 /// 把"解锁提示"排队到对话结束后弹出。 @@ -43,6 +40,9 @@ namespace Ichni.Story.Dialogue private ChapterStorySave _activeDialogueSnapshot; private string _activeDialogueChapterIndex; private bool _isCancellingDialogue; + private Coroutine _dialogueStartupCoroutine; + + private const float DialogueTableLoadTimeoutSeconds = 30f; /// /// 当前对话对应的 TextBlock ID。Yarn 选项记忆与变量指令使用它定位所属章节 Block, @@ -62,7 +62,6 @@ namespace Ichni.Story.Dialogue private void Awake() { instance = this; - EnsureUnityLocalisedLineProvider(); } private void Start() @@ -110,33 +109,41 @@ namespace Ichni.Story.Dialogue { if (block == null) return; + Debug.Log($"[YarnDiag] StoryDialogueController.PlayBlock: block={block.blockId}, node={block.YarnNodeName}"); + if (dialogueRunner == null) { - Debug.LogError("[StoryDialogueController] 未配置 DialogueRunner,无法开始对话。"); + Debug.LogError("[YarnDiag] [ERROR] 未配置 DialogueRunner,无法开始对话!"); return; } - if (dialogueRunner.IsDialogueRunning) + if (dialogueRunner.IsDialogueRunning || _dialogueStartupCoroutine != null) { - Debug.LogWarning("[StoryDialogueController] 已有对话在进行中,忽略本次点击。"); + Debug.LogWarning("[YarnDiag] [WARNING] 已有对话正在运行或启动,忽略本次点击!"); return; } if (string.IsNullOrEmpty(block.YarnNodeName)) { - Debug.LogWarning($"[StoryDialogueController] block '{block.blockId}' 未配置 yarnNodeName,无法开始对话。"); + Debug.LogWarning($"[YarnDiag] [WARNING] block '{block.blockId}' 未配置 yarnNodeName,无法开始对话!"); return; } - // 将 DialogueRunner 的 YarnProject 对齐到当前章节(支持多章节共用一个 Runner) + // 将 DialogueRunner 的 YarnProject 对齐到当前章节,并验证场景中持久化的 LineProvider 配置。 EnsureProjectForCurrentChapter(); + if (!ValidateUnityLocalisedLineProvider()) + { + return; + } + + Debug.Log($"[YarnDiag] YarnProject={dialogueRunner.YarnProject?.name}, NodesCount={(dialogueRunner.YarnProject?.Program != null ? dialogueRunner.YarnProject.Program.Nodes.Count : 0)}, LineProviderType={dialogueRunner.LineProvider.GetType().FullName}"); // StartDialogue 对缺失 Node 只会在内部抛出/记录错误;必须在开启事务前预检, // 否则会留下一个没有机会提交或回滚的半开事务。 if (dialogueRunner.YarnProject?.Program == null || !dialogueRunner.YarnProject.Program.Nodes.ContainsKey(block.YarnNodeName)) { - Debug.LogError($"[StoryDialogueController] Yarn Project 中不存在节点 '{block.YarnNodeName}',已取消启动 Block '{block.blockId}'。", dialogueRunner); + Debug.LogError($"[YarnDiag] [ERROR] Yarn Project 中不存在节点 '{block.YarnNodeName}',已取消启动 Block '{block.blockId}'!", dialogueRunner); return; } @@ -164,35 +171,139 @@ namespace Ichni.Story.Dialogue // 在 Yarn 命令或选项改变章节变量前先登记来源,并为 Marker 所在列创建快照。 StoryProgress.BeginBlockMutation(_activeBlockId); - if (storyUIPage != null) - storyUIPage.FadeOut(); - - // 启动异常会回滚本次章节事务;正常结束仍由 onDialogueComplete 统一提交。 - StartDialogueSafely(block.YarnNodeName).Forget(); + // Unity Localization 的 AsyncOperationHandle 原生支持协程等待。 + // 先在项目侧显式加载当前章节台词表,再启动 Yarn;不修改 Yarn Spinner Package, + // 也不把 Unity Addressables Handle 转换为 YarnTask。 + _dialogueStartupCoroutine = StartCoroutine(StartDialogueSafely(block.YarnNodeName)); } /// - /// 以受保护方式启动 Yarn。缺失 Provider、Presenter 等启动级异常不应让 StorySave 的事务永久处于活动状态, - /// 因而会被转换为 Failed 流程并完整恢复进入对话前的章节快照。 + /// 使用 Unity Localization 的公开 API 加载当前章节台词表。 + /// + /// 在 Yarn Spinner 3.2.1 中是 no-op, + /// 不能用来预载 String Table;因此这里直接等待 。 + /// /// - private async YarnTask StartDialogueSafely(string yarnNodeName) + private IEnumerator StartDialogueSafely(string yarnNodeName) { + LocalizationBootstrap.BeginInitialization(); + while (!LocalizationBootstrap.IsReady && !LocalizationBootstrap.HasFailed) + { + LocalizationBootstrap.RefreshState(); + yield return null; + } + + if (!LocalizationBootstrap.IsReady) + { + FailDialogueStartup($"Localization 初始化失败:{LocalizationBootstrap.FailureReason}"); + yield break; + } + + StoryData storyData = StoryManager.instance?.treeController?.ActiveStoryData; + if (storyData?.yarnLineStringTable == null || storyData.yarnLineStringTable.IsEmpty) + { + FailDialogueStartup( + $"章节 '{storyData?.chapterIndex ?? ""}' 未配置 Yarn Line String Table。"); + yield break; + } + + AsyncOperationHandle tableOperation; + //Debug.Log(storyData.yarnLineStringTable.GetTable()); try { - await dialogueRunner.StartDialogue(yarnNodeName); + // LocalizedStringTable 会自动使用 LocalizationSettings.SelectedLocale。 + // 这与 UnityLocalisedLineProvider 后续读取台词时使用的 Locale 保持一致。 + Debug.Log($"[YarnDiag] 开始加载 Yarn 台词表。Table={storyData.yarnLineStringTable.TableReference}, Locale={UnityEngine.Localization.Settings.LocalizationSettings.SelectedLocale?.Identifier.Code ?? ""}"); + tableOperation = storyData.yarnLineStringTable.GetTableAsync(); } catch (System.Exception exception) { - Debug.LogException(exception, dialogueRunner); - // 启动阶段可能已经让部分 Presenter 进入展示状态;先请求停止,再立即清理事务。 - // 后续若收到 Runner 的完成事件,会因 activeBlockId 已被清空而被安全忽略。 - if (dialogueRunner != null && dialogueRunner.IsDialogueRunning) - { - dialogueRunner.GetComponent()?.CancelCurrentPresentation(); - dialogueRunner.Stop().Forget(); - } - RestoreInterruptedDialogue("启动 Yarn 对话失败"); + FailDialogueStartup("创建 Yarn 台词表加载操作失败。", exception); + yield break; } + + Debug.Log( + $"[YarnDiag] 开始加载章节台词表。Chapter={storyData.chapterIndex}, " + + $"Table={storyData.yarnLineStringTable.TableReference}, " + + $"Locale={UnityEngine.Localization.Settings.LocalizationSettings.SelectedLocale?.Identifier.Code ?? ""}"); + + float loadStartedAt = Time.realtimeSinceStartup; + float nextProgressLogAt = loadStartedAt + 5f; + while (!tableOperation.IsDone) + { + float elapsed = Time.realtimeSinceStartup - loadStartedAt; + if (elapsed >= DialogueTableLoadTimeoutSeconds) + { + FailDialogueStartup( + $"加载 Yarn 台词表超时。Table={storyData.yarnLineStringTable.TableReference}, " + + $"Elapsed={elapsed:F1}s, Percent={tableOperation.PercentComplete:P0}"); + yield break; + } + + if (Time.realtimeSinceStartup >= nextProgressLogAt) + { + Debug.LogWarning( + $"[YarnDiag] Yarn 台词表仍在加载。Elapsed={elapsed:F1}s, " + + $"Percent={tableOperation.PercentComplete:P0}"); + nextProgressLogAt += 5f; + } + + yield return null; + } + + if (tableOperation.Status != AsyncOperationStatus.Succeeded || tableOperation.Result == null) + { + FailDialogueStartup( + $"Yarn 台词表加载失败。Table={storyData.yarnLineStringTable.TableReference}", + tableOperation.OperationException); + yield break; + } + + Debug.Log( + $"[YarnDiag] 章节台词表加载完成。Locale={tableOperation.Result.LocaleIdentifier.Code}, " + + $"Entries={tableOperation.Result.Count}"); + + _dialogueStartupCoroutine = null; + storyUIPage?.FadeOut(); + StartDialogueRunnerSafely(yarnNodeName).Forget(); + } + + /// + /// 调用 Yarn Spinner 的公开 API。 + /// 返回时表示所有 Presenter 已完成 OnDialogueStartedAsync,且 Runner 已调用 Dialogue.Continue。 + /// + private async YarnTask StartDialogueRunnerSafely(string yarnNodeName) + { + try + { + Debug.Log($"[YarnDiag] 调用 DialogueRunner.StartDialogue。Node={yarnNodeName}"); + await dialogueRunner.StartDialogue(yarnNodeName); + Debug.Log( + $"[YarnDiag] DialogueRunner 初始启动完成。Node={yarnNodeName}, " + + $"IsDialogueRunning={dialogueRunner.IsDialogueRunning}"); + } + catch (System.Exception exception) + { + FailDialogueStartup("启动 Yarn 对话失败。", exception); + } + } + + private void FailDialogueStartup(string reason, System.Exception exception = null) + { + _dialogueStartupCoroutine = null; + + if (exception != null) + Debug.LogException(exception, dialogueRunner); + + Debug.LogError($"[YarnDiag] {reason}", dialogueRunner); + + if (dialogueRunner != null && dialogueRunner.IsDialogueRunning) + { + dialogueRunner.GetComponent()?.CancelCurrentPresentation(); + dialogueRunner.Stop().Forget(); + } + + RestoreInterruptedDialogue(reason); } /// @@ -202,12 +313,22 @@ namespace Ichni.Story.Dialogue /// public bool CancelActiveDialogue() { - if (_isCancellingDialogue || string.IsNullOrEmpty(_activeBlockId) || - dialogueRunner == null || !dialogueRunner.IsDialogueRunning) + if (_isCancellingDialogue || string.IsNullOrEmpty(_activeBlockId)) { return false; } + if (_dialogueStartupCoroutine != null) + { + StopCoroutine(_dialogueStartupCoroutine); + _dialogueStartupCoroutine = null; + RestoreInterruptedDialogue("玩家在对话启动阶段中途退出"); + return true; + } + + if (dialogueRunner == null || !dialogueRunner.IsDialogueRunning) + return false; + _isCancellingDialogue = true; _dialogueEndActions.Clear(); dialogueRunner.GetComponent()?.CancelCurrentPresentation(); @@ -246,44 +367,29 @@ namespace Ichni.Story.Dialogue } /// - /// DialogueRunner.lineProvider 为 [SerializeReference] internal 字段。 - /// Inspector 的 "Use Unity Localised Line Provider" 按钮有时无法将 MonoBehaviour - /// 引用正确持久化到该字段;此方法在运行时用反射补救,确保使用正确的 Provider。 + /// 验证 DialogueRunner 序列化的 LineProvider 是否为 UnityLocalisedLineProvider。 + /// + /// LineProvider 应通过 Yarn Spinner Inspector 持久化配置;运行时不使用反射修改 Package 内部字段, + /// 这样 Editor、Mono 与 IL2CPP Build 使用完全相同的装配结果。 + /// /// - private void EnsureUnityLocalisedLineProvider() + private bool ValidateUnityLocalisedLineProvider() { - if (dialogueRunner == null) return; - - FieldInfo field = typeof(DialogueRunner).GetField( - "lineProvider", - BindingFlags.NonPublic | BindingFlags.Instance); - - if (field == null) return; - - UnityLocalisedLineProvider provider = field.GetValue(dialogueRunner) as UnityLocalisedLineProvider; - provider ??= dialogueRunner.GetComponent(); - - if (provider != null) + if (dialogueRunner == null) { - if (field.GetValue(dialogueRunner) != provider) - { - field.SetValue(dialogueRunner, provider); - Debug.Log("[StoryDialogueController] Assigned UnityLocalisedLineProvider to DialogueRunner.lineProvider."); - } + return false; + } - // Yarn 的 Localized Line Provider 本身只持有一个 String Table 引用;统一使用 YarnLines - // 可避免在切换章节时依赖反射替换不同表。未配置时不覆盖旧场景,便于分步迁移现有 Chapter0_Lines。 - if (yarnLinesTable != null && !yarnLinesTable.IsEmpty) - { - FieldInfo tableField = typeof(UnityLocalisedLineProvider).GetField( - "stringsTable", BindingFlags.NonPublic | BindingFlags.Instance); - tableField?.SetValue(provider, yarnLinesTable); - } - } - else + if (dialogueRunner.LineProvider is UnityLocalisedLineProvider) { - Debug.LogWarning("[StoryDialogueController] UnityLocalisedLineProvider not found on DialogueRunner's GameObject. Localized line text will be unavailable."); + return true; } + + Debug.LogError( + "[StoryDialogueController] DialogueRunner.lineProvider 未配置为 UnityLocalisedLineProvider。" + + "请在 Yarn Spinner Inspector 中使用 Unity Localization Line Provider,并配置台词 String Table。", + dialogueRunner); + return false; } private void HandleDialogueComplete() diff --git a/Assets/Scripts/NewStorySystem/Dialogue/VNDialoguePresenter.cs b/Assets/Scripts/NewStorySystem/Dialogue/VNDialoguePresenter.cs index ea8037dc..b616a4a2 100644 --- a/Assets/Scripts/NewStorySystem/Dialogue/VNDialoguePresenter.cs +++ b/Assets/Scripts/NewStorySystem/Dialogue/VNDialoguePresenter.cs @@ -92,8 +92,10 @@ namespace Ichni.Story.Dialogue // ── DialoguePresenterBase 实现 ─────────────────────────────────────────── - public override async YarnTask OnDialogueStartedAsync() + public override YarnTask OnDialogueStartedAsync() { + Debug.Log("[YarnDiag] VNDialoguePresenter.OnDialogueStartedAsync 开始。"); + // 快进是一次 Yarn 对话会话的临时操作,绝不能遗留到下一次进入 TextBlock。 _isFastForwarding = false; _typewriterComplete = false; @@ -101,18 +103,17 @@ namespace Ichni.Story.Dialogue // 对话记录只保留当前一次 TextBlock;每次 Yarn 对话真正开始时清空上一段残留内容。 DialogueHistory.BeginSession(); - if (Page != null) - { - var tcs = new YarnTaskCompletionSource(); - Page.PlayFadeIn(() => tcs.TrySetResult(true)); - await tcs.Task; - } + Page.PlayFadeIn(); + Debug.Log("[YarnDiag] VNDialoguePresenter.OnDialogueStartedAsync 完成。"); + return YarnTask.CompletedTask; } public override async YarnTask RunLineAsync(LocalizedLine line, LineCancellationToken token) { if (Page == null) return; + Debug.Log($"[YarnDiag] VNDialoguePresenter.RunLineAsync: LineID='{line.TextID}', Speaker='{line.CharacterName}', Text='{line.TextWithoutCharacterName.Text}', RawText='{line.RawText}'"); + // 确保选项区不可见;台词区始终可见 if (Page.choiceFrame != null) Page.choiceFrame.SetActive(false); @@ -126,6 +127,11 @@ namespace Ichni.Story.Dialogue // ── 打字效果 ── string fullText = line.TextWithoutCharacterName.Text; + if (string.IsNullOrEmpty(fullText) && !string.IsNullOrEmpty(line.RawText)) + { + fullText = line.RawText; + Debug.LogWarning($"[YarnDiag] [WARNING] 台词 '{line.TextID}' 本地化解析结果为空,回退使用 RawText: '{fullText}'"); + } // 记录的是本次实际展示时已经解析完成的本地化文本,而非 Yarn Key。 DialogueHistory.AddLine(line.CharacterName, fullText); _typewriterComplete = false; @@ -285,23 +291,39 @@ namespace Ichni.Story.Dialogue private void OnAdvanceButtonClicked() { + Debug.Log($"[YarnDiag] OnAdvanceButtonClicked 推进按钮被点击!_runner={(_runner != null ? _runner.name : "null")}, _typewriterComplete={_typewriterComplete}, _isFastForwarding={_isFastForwarding}, _optionTcs={(_optionTcs != null)}"); + // 未记忆选项必须由 ChoiceButton 明确选择;推进按钮不能越过当前选择。 if (_optionTcs != null) + { + Debug.LogWarning("[YarnDiag] OnAdvanceButtonClicked 被拦截:正在等待选项选择。"); return; + } // 如果玩家在快进时点击屏幕/推进键,则打断快进状态并停止当前动作 if (_isFastForwarding) { + Debug.Log("[YarnDiag] OnAdvanceButtonClicked 打断快进模式。"); _isFastForwarding = false; return; } - if (_runner == null) return; + if (_runner == null) + { + Debug.LogError("[YarnDiag] [ERROR] OnAdvanceButtonClicked 拦截:_runner 为 null!"); + return; + } if (!_typewriterComplete) + { + Debug.Log("[YarnDiag] RequestHurryUpLine (跳过打字效果)"); _runner.RequestHurryUpLine(); // 第一次点击:跳过打字效果 + } else + { + Debug.Log("[YarnDiag] RequestNextLine (推进下一行)"); _runner.RequestNextLine(); // 第二次点击:推进到下一行 + } } private void OnFastForwardButtonClicked() diff --git a/Assets/Scripts/NewStorySystem/Helper/StoryHelperController.cs b/Assets/Scripts/NewStorySystem/Helper/StoryHelperController.cs index 70997d10..4b07896c 100644 --- a/Assets/Scripts/NewStorySystem/Helper/StoryHelperController.cs +++ b/Assets/Scripts/NewStorySystem/Helper/StoryHelperController.cs @@ -326,7 +326,7 @@ namespace Ichni.Story /// 本地化失败时显示 Key,确保测试阶段仍能定位缺失条目,而不是得到空白气泡。 private string GetLocalizedText(StoryHelperData helperData, string key, string fallback) { - if (string.IsNullOrEmpty(key)) + if (string.IsNullOrEmpty(key) || helperData == null) return fallback; try diff --git a/Assets/Scripts/NewStorySystem/Progress/TutorialFlowController.cs b/Assets/Scripts/NewStorySystem/Progress/TutorialFlowController.cs index 1129a21a..cac4578f 100644 --- a/Assets/Scripts/NewStorySystem/Progress/TutorialFlowController.cs +++ b/Assets/Scripts/NewStorySystem/Progress/TutorialFlowController.cs @@ -76,7 +76,7 @@ namespace Ichni.Story if (MenuManager.instance == null || InformationTransistor.instance == null || !MenuManager.instance.CanBeginGame) { - Debug.LogWarning("[TutorialFlowController] MenuManager、InformationTransistor 或 GameScene 预加载未就绪,无法进入教程。"); + Debug.LogWarning("[TutorialFlowController] MenuManager、InformationTransistor 未就绪,或菜单已经接受其它进入请求,无法进入教程。"); return false; } diff --git a/Assets/Scripts/NewStorySystem/Timeline/StoryTimelineController.cs b/Assets/Scripts/NewStorySystem/Timeline/StoryTimelineController.cs index c07535c9..cdf9caa5 100644 --- a/Assets/Scripts/NewStorySystem/Timeline/StoryTimelineController.cs +++ b/Assets/Scripts/NewStorySystem/Timeline/StoryTimelineController.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Ichni.Diagnostics; using Ichni.Menu.UI; using TMPro; using UnityEngine; @@ -421,12 +422,38 @@ namespace Ichni.Story.UI } } - private void OnSelectedLocaleChanged(Locale _) + private async void OnSelectedLocaleChanged(Locale newLocale) { + BuildHangTracer.Log("TIMELINE_EVENT", $"[OnSelectedLocaleChanged] 收到语言切换通知: newLocale={(newLocale != null ? newLocale.Identifier.Code : "null")},_markers.Count={_markers.Count}"); + foreach (RuntimeMarker marker in _markers) { - marker.view.SetLabel(GetLocalizedLabel(marker.definition.labelKey)); + if (string.IsNullOrEmpty(marker.definition.labelKey)) continue; + + try + { + BuildHangTracer.Log("TIMELINE_EVENT", $"[OnSelectedLocaleChanged] 开始异步获取 Key '{marker.definition.labelKey}' 的本地化文本..."); + var handle = LocalizationSettings.StringDatabase.GetLocalizedStringAsync(localizationTable, marker.definition.labelKey); + while (!handle.IsDone) + { + await System.Threading.Tasks.Task.Yield(); + } + BuildHangTracer.Log("TIMELINE_EVENT", $"[OnSelectedLocaleChanged] 获取 Key '{marker.definition.labelKey}' 完成!Result='{handle.Result}'"); + + // 异步等待结束后,防范对象在此期间被销毁 + if (marker.view != null) + { + marker.view.SetLabel(string.IsNullOrEmpty(handle.Result) ? marker.definition.labelKey : handle.Result); + } + } + catch (System.Exception exception) + { + BuildHangTracer.Log("TIMELINE_EVENT", $"[OnSelectedLocaleChanged] 异常: {exception.Message}"); + Debug.LogWarning($"[StoryTimeline] 无法本地化 Label Key '{marker.definition.labelKey}'。{exception.Message}"); + if (marker.view != null) marker.view.SetLabel(marker.definition.labelKey); + } } + BuildHangTracer.Log("TIMELINE_EVENT", "[OnSelectedLocaleChanged] 全部 Marker 更新完成。"); } /// diff --git a/Assets/Scripts/NewStorySystem/Tree/TextBlockView.cs b/Assets/Scripts/NewStorySystem/Tree/TextBlockView.cs index 9cfe9823..91b5da74 100644 --- a/Assets/Scripts/NewStorySystem/Tree/TextBlockView.cs +++ b/Assets/Scripts/NewStorySystem/Tree/TextBlockView.cs @@ -103,6 +103,8 @@ namespace Ichni.Story.UI protected override void OnClicked() { + Debug.Log($"[YarnDiag] TextBlockView.OnClicked: blockId={blockId}, yarnNodeName={YarnNodeName}"); + if (StoryDialogueController.instance == null) { Debug.LogWarning($"[TextBlockView] 场景中缺少 StoryDialogueController,无法播放 block '{blockId}' 的对话。"); diff --git a/Assets/Scripts/NewStorySystem/UI/DialogUIPage.cs b/Assets/Scripts/NewStorySystem/UI/DialogUIPage.cs index b16205e3..76705c70 100644 --- a/Assets/Scripts/NewStorySystem/UI/DialogUIPage.cs +++ b/Assets/Scripts/NewStorySystem/UI/DialogUIPage.cs @@ -91,12 +91,12 @@ namespace Ichni.Story.UI public void PlayFadeIn(UnityAction onComplete = null) { - FadeIn(0.2f, false, onComplete); + FadeIn(0.2f, true, onComplete); } public void PlayFadeOut(UnityAction onComplete = null) { - FadeOut(0.2f, false, onComplete); + FadeOut(0.2f, true, onComplete); } private void OnBackButtonClicked() diff --git a/Assets/Scripts/Settings/LocalizationBootstrap.cs b/Assets/Scripts/Settings/LocalizationBootstrap.cs new file mode 100644 index 00000000..39a053b8 --- /dev/null +++ b/Assets/Scripts/Settings/LocalizationBootstrap.cs @@ -0,0 +1,158 @@ +using System; +using System.Collections; +using Ichni.Diagnostics; +using UnityEngine; +using UnityEngine.Localization.Settings; +using UnityEngine.ResourceManagement.AsyncOperations; + +namespace Ichni +{ + /// + /// Unity Localization 的统一启动入口。 + /// + /// 本类只包装 Unity 官方提供的 , + /// 不自行初始化 Addressables、不查询 Locale Label,也不复制 Localization Package 的内部加载流程。 + /// 因此 Settings、Yarn 与其它本地化消费者始终等待同一个由 Unity 管理的初始化操作。 + /// + /// + public static class LocalizationBootstrap + { + public enum InitializationState + { + NotStarted, + Initializing, + Ready, + Failed + } + + private static AsyncOperationHandle _initializationOperation; + + public static InitializationState State { get; private set; } = InitializationState.NotStarted; + public static bool IsReady => State == InitializationState.Ready; + public static bool HasFailed => State == InitializationState.Failed; + public static string FailureReason { get; private set; } + + /// + /// Unity Localization 官方初始化 Handle。 + /// 获取该属性会以幂等方式启动初始化,但不会同步阻塞主线程。 + /// + public static AsyncOperationHandle InitializationOperation + { + get + { + BeginInitialization(); + return _initializationOperation; + } + } + + /// + /// 在关闭 Domain Reload 的 Editor 配置下,清理上一次 Play Mode 留下的项目侧状态。 + /// Localization Package 会自行重建其内部 Handle,本类不持有也不释放 Package 的资源。 + /// + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] + private static void ResetState() + { + _initializationOperation = default; + State = InitializationState.NotStarted; + FailureReason = null; + } + + /// + /// 按 Unity 官方流程获取唯一的 Localization 初始化操作。 + /// 可以由多个系统重复调用;已经启动后不会创建第二条加载链。 + /// + public static void BeginInitialization() + { + if (State != InitializationState.NotStarted) + { + return; + } + + try + { + // 不设置 InitializeSynchronously,也不直接访问 SelectedLocale。 + // InitializationOperation 会异步完成 Locale 选择及所有配置为 Preload 的数据库初始化。 + _initializationOperation = LocalizationSettings.InitializationOperation; + State = InitializationState.Initializing; + Log("开始等待 Unity Localization 官方 InitializationOperation。"); + RefreshState(); + } + catch (Exception exception) + { + Fail("无法创建 Unity Localization 初始化操作。", exception); + } + } + + /// + /// 刷新初始化结果。供 YarnTask 等不能直接 yield AsyncOperationHandle 的异步流程调用。 + /// + public static void RefreshState() + { + if (State != InitializationState.Initializing) + { + return; + } + + if (!_initializationOperation.IsValid()) + { + Fail("Unity Localization 返回了无效的 InitializationOperation Handle。"); + return; + } + + if (!_initializationOperation.IsDone) + { + return; + } + + if (_initializationOperation.Status != AsyncOperationStatus.Succeeded) + { + Fail("Unity Localization 初始化失败。", _initializationOperation.OperationException); + return; + } + + LocaleReady(); + } + + /// + /// 供 MonoBehaviour 协程等待 Unity Localization 初始化。 + /// 此处直接 yield 官方 Handle,不使用轮询超时或自建 Addressables 状态机。 + /// + public static IEnumerator WaitForInitialization() + { + BeginInitialization(); + + if (State == InitializationState.Initializing) + { + yield return _initializationOperation; + RefreshState(); + } + } + + private static void LocaleReady() + { + State = InitializationState.Ready; + FailureReason = null; + + // SelectedLocale 只有在完整 InitializationOperation 成功后才允许同步读取。 + string localeCode = LocalizationSettings.SelectedLocale != null + ? LocalizationSettings.SelectedLocale.Identifier.Code + : ""; + Log($"Unity Localization 初始化完成。SelectedLocale={localeCode}"); + } + + private static void Fail(string message, Exception exception = null) + { + FailureReason = exception == null ? message : $"{message} Exception={exception}"; + State = InitializationState.Failed; + + Debug.LogError($"[LocalizationBootstrap] {FailureReason}"); + BuildHangTracer.Log("LOCALIZATION_BOOTSTRAP", $"[Failed] {FailureReason}"); + } + + private static void Log(string message) + { + Debug.Log($"[LocalizationBootstrap] {message}"); + BuildHangTracer.Log("LOCALIZATION_BOOTSTRAP", message); + } + } +} diff --git a/Assets/Scripts/Settings/LocalizationBootstrap.cs.meta b/Assets/Scripts/Settings/LocalizationBootstrap.cs.meta new file mode 100644 index 00000000..54266e4d --- /dev/null +++ b/Assets/Scripts/Settings/LocalizationBootstrap.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7a3bb067e72f4b1ca56834f12479b841 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Settings/SettingsManager.cs b/Assets/Scripts/Settings/SettingsManager.cs index 964cfb18..b6041be9 100644 --- a/Assets/Scripts/Settings/SettingsManager.cs +++ b/Assets/Scripts/Settings/SettingsManager.cs @@ -1,7 +1,10 @@ using Ichni.Menu; +using System.Collections; using System.Collections.Generic; +using Ichni.Diagnostics; using Sirenix.OdinInspector; using UnityEngine; +using UnityEngine.Localization; using UnityEngine.Localization.Settings; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; @@ -10,6 +13,7 @@ using UnityEngine.Serialization; namespace Ichni { + [DefaultExecutionOrder(-10000)] public class SettingsManager : SerializedMonoBehaviour { private const string SettingsSaveFileName = "SettingsSave.json"; @@ -19,6 +23,21 @@ namespace Ichni private const string BalancedQualityName = "Balanced"; private const string HighFidelityQualityName = "High Fidelity"; + /// + /// 与设置界面 Dropdown 顺序严格一致的 Locale Code。 + /// 不使用 AvailableLocales.Locales 的返回顺序,因为 Addressables Catalog 的条目顺序不属于稳定存档契约。 + /// + private static readonly string[] SupportedLocaleCodes = + { + "zh-CN", + "en", + "zh-TW", + "ja", + "ko", + "vi-VN", + "th" + }; + public static SettingsManager instance; [FormerlySerializedAs("settingsPage")] @@ -30,11 +49,17 @@ namespace Ichni // 记录相机在玩家关闭后处理前的原始状态。重新开启时必须恢复原始值,不能无条件将所有相机改为开启。 private readonly Dictionary postProcessingCameraStates = new Dictionary(); + // 语言切换请求统一由一个协程串行处理。协程运行期间的新请求只覆盖目标索引。 + private Coroutine applyLanguageSettingsCoroutine; + private bool isLanguageRoutineRunning; + private int pendingLanguageIndex = -1; + private void Awake() { if (instance == null) { instance = this; + DontDestroyOnLoad(gameObject); SceneManager.sceneLoaded += OnSceneLoaded; RenderPipelineManager.beginCameraRendering += ApplyPostProcessingSettingBeforeCameraRender; @@ -54,6 +79,14 @@ namespace Ichni SceneManager.sceneLoaded -= OnSceneLoaded; RenderPipelineManager.beginCameraRendering -= ApplyPostProcessingSettingBeforeCameraRender; + + if (applyLanguageSettingsCoroutine != null) + { + StopCoroutine(applyLanguageSettingsCoroutine); + applyLanguageSettingsCoroutine = null; + } + + isLanguageRoutineRunning = false; instance = null; } @@ -82,9 +115,10 @@ namespace Ichni { settingsSaveData = CreateDefaultSettingsSaveData(); } - + Debug.Log($"[SettingsManager] 已加载存档:{savePath},当前语言索引={settingsSaveData.languageIndex}"); ApplyAudioSettings(); ApplyGraphicSettings(); + ApplyLanguageSettings(); } /// @@ -92,10 +126,10 @@ namespace Ichni /// public void ApplyAudioSettings() { - AkSoundEngine.SetRTPCValue("MasterVolume", settingsSaveData.masterVolume); - AkSoundEngine.SetRTPCValue("MusicVolume", settingsSaveData.musicVolume); - AkSoundEngine.SetRTPCValue("SoundFXVolume", settingsSaveData.soundEffectVolume); - AkSoundEngine.SetRTPCValue("UIVolume", settingsSaveData.uiVolume); + AkUnitySoundEngine.SetRTPCValue("MasterVolume", settingsSaveData.masterVolume); + AkUnitySoundEngine.SetRTPCValue("MusicVolume", settingsSaveData.musicVolume); + AkUnitySoundEngine.SetRTPCValue("SoundFXVolume", settingsSaveData.soundEffectVolume); + AkUnitySoundEngine.SetRTPCValue("UIVolume", settingsSaveData.uiVolume); ApplyInGameAudioEffectsSettings(); } @@ -312,14 +346,143 @@ namespace Ichni } /// - /// 将当前语言索引应用到既有的 I2 与 Unity Localization 管线。 - /// 语言将于 Localization 重构时改为稳定的 Locale ID;本阶段只迁移数据承载方式。 + /// 将当前语言索引应用到 Unity Localization 管线。 + /// 本方法只等待 Unity 官方 InitializationOperation,并在其完成后应用玩家最新一次语言选择。 /// public void ApplyLanguageSettings() { - I2.Loc.LocalizationManager.CurrentLanguage = MenuManager.instance.languageList[settingsSaveData.languageIndex]; - LocalizationSettings.SelectedLocale = LocalizationSettings.AvailableLocales.Locales[settingsSaveData.languageIndex]; - I2.Loc.LocalizationManager.UpdateSources(); + if (settingsSaveData == null) + { + BuildHangTracer.Log("SETTINGS_MGR", "[ApplyLanguageSettings] settingsSaveData 为空,取消语言切换。"); + return; + } + + pendingLanguageIndex = settingsSaveData.languageIndex; + + if (isLanguageRoutineRunning) + { + BuildHangTracer.Log( + "SETTINGS_MGR", + $"[ApplyLanguageSettings] 已有语言切换流程运行,更新待处理索引为 {pendingLanguageIndex}。"); + return; + } + + isLanguageRoutineRunning = true; + + BuildHangTracer.Log( + "SETTINGS_MGR", + $"[ApplyLanguageSettings] 启动语言切换流程,目标索引={pendingLanguageIndex}。"); + + //LocalizationSettings.SelectedLocale = LocalizationSettings.AvailableLocales.GetLocale(SupportedLocaleCodes[pendingLanguageIndex]); + + applyLanguageSettingsCoroutine = StartCoroutine(ApplyLanguageSettingsRoutine()); + } + + private IEnumerator ApplyLanguageSettingsRoutine() + { + // try/finally 确保协程正常结束、被 StopCoroutine 或发生异常时,运行状态都会被清除。 + try + { + // 避开 Dropdown.onValueChanged 当前同步调用栈。 + yield return null; + + BuildHangTracer.Log( + "SETTINGS_COROUTINE", + $"[Coroutine] 等待 Unity Localization InitializationOperation。" + + $"CurrentState={LocalizationBootstrap.State}"); + + yield return LocalizationBootstrap.WaitForInitialization(); + if (!LocalizationBootstrap.IsReady) + { + BuildHangTracer.Log( + "SETTINGS_COROUTINE", + $"[Coroutine] Unity Localization 初始化失败,取消语言切换。" + + $"Reason={LocalizationBootstrap.FailureReason}"); + pendingLanguageIndex = -1; + yield break; + } + + BuildHangTracer.Log( + "SETTINGS_COROUTINE", + $"[Coroutine] Unity Localization 已就绪。启动 Locale=" + + $"{LocalizationSettings.SelectedLocale?.Identifier.Code ?? ""}"); + + // 处理流程运行期间收到的最新请求。 + while (pendingLanguageIndex >= 0) + { + int requestedLanguageIndex = pendingLanguageIndex; + pendingLanguageIndex = -1; + + if (requestedLanguageIndex < 0 || + requestedLanguageIndex >= SupportedLocaleCodes.Length) + { + BuildHangTracer.Log( + "SETTINGS_COROUTINE", + $"[Coroutine] 语言索引无效。Index={requestedLanguageIndex}," + + $"SupportedCount={SupportedLocaleCodes.Length}。回退到简体中文。"); + + // 旧版本存档或损坏存档可能留下越界索引。将它修正为稳定的默认值, + // 避免首次启动时保持一个不受 SettingsSave 控制的 Locale。 + requestedLanguageIndex = 0; + settingsSaveData.languageIndex = 0; + } + + string targetLocaleCode = SupportedLocaleCodes[requestedLanguageIndex]; + Locale targetLocale = LocalizationSettings.AvailableLocales.GetLocale(targetLocaleCode); + Locale currentLocale = LocalizationSettings.SelectedLocale; + + BuildHangTracer.Log( + "SETTINGS_COROUTINE", + $"[Coroutine] 准备切换 Locale:" + + $"{currentLocale?.Identifier.Code ?? ""} -> " + + $"{targetLocale?.Identifier.Code ?? ""}"); + + if (targetLocale == null) + { + BuildHangTracer.Log( + "SETTINGS_COROUTINE", + $"[Coroutine] Localization Settings 中不存在 Locale '{targetLocaleCode}',取消本次切换。"); + continue; + } + + if (currentLocale == targetLocale) + { + BuildHangTracer.Log("SETTINGS_COROUTINE", "[Coroutine] 目标 Locale 与当前 Locale 相同,跳过切换。"); + continue; + } + + LocalizationSettings.SelectedLocale = targetLocale; + + // setter 会同步更新 SelectedLocale,并通知 LocalizedString / LocalizedAsset 按需刷新。 + // 初始化已在本协程开头完成,因此此处不会触发同步 Locale 加载。 + yield return null; + + Locale appliedLocale = LocalizationSettings.SelectedLocale; + if (appliedLocale == targetLocale) + { + BuildHangTracer.Log( + "SETTINGS_COROUTINE", + $"<<< [CRITICAL] SelectedLocale 已切换:{targetLocale.Identifier.Code}"); + } + else + { + BuildHangTracer.Log( + "SETTINGS_COROUTINE", + $"[Coroutine] SelectedLocale 校验失败。Expected={targetLocale.Identifier.Code}," + + $"Actual={appliedLocale?.Identifier.Code ?? ""}"); + } + } + } + finally + { + applyLanguageSettingsCoroutine = null; + isLanguageRoutineRunning = false; + + BuildHangTracer.Log( + "SETTINGS_COROUTINE", + $"[Coroutine] 语言切换流程结束。PendingIndex={pendingLanguageIndex}"); + + } } /// diff --git a/Assets/Scripts/UI/Base/KeyRebindButton.cs b/Assets/Scripts/UI/Base/KeyRebindButton.cs index 7ae1684c..45eb69fb 100644 --- a/Assets/Scripts/UI/Base/KeyRebindButton.cs +++ b/Assets/Scripts/UI/Base/KeyRebindButton.cs @@ -35,6 +35,8 @@ namespace Ichni.UI if (action == null) { Debug.LogError($"在InputActionAsset中未找到名为 '{actionName}' 的Action。"); + inputActions.Enable(); + waitingForInputCover.SetActive(false); return; } diff --git a/Assets/Scripts/UI/Base/SettingsUIElementBase.cs b/Assets/Scripts/UI/Base/SettingsUIElementBase.cs index e94fbc27..290782c8 100644 --- a/Assets/Scripts/UI/Base/SettingsUIElementBase.cs +++ b/Assets/Scripts/UI/Base/SettingsUIElementBase.cs @@ -48,12 +48,20 @@ namespace Ichni.UI this.title = title; this.subTitle = subTitle; titleText.gameObject.SetActive(true); - titleText.GetComponent().SetTerm(title); + var titleLoc = titleText.GetComponent(); + if (titleLoc != null) + titleLoc.SetTerm(title); + else + titleText.text = title; if (subTitle != "") { subTitleText.gameObject.SetActive(true); - subTitleText.GetComponent().SetTerm(subTitle); + var subLoc = subTitleText.GetComponent(); + if (subLoc != null) + subLoc.SetTerm(subTitle); + else + subTitleText.text = subTitle; } else { diff --git a/Assets/Scripts/UI/Base/TextButton.cs b/Assets/Scripts/UI/Base/TextButton.cs index 4e1c9dfe..9569e449 100644 --- a/Assets/Scripts/UI/Base/TextButton.cs +++ b/Assets/Scripts/UI/Base/TextButton.cs @@ -15,7 +15,15 @@ namespace Ichni.UI { base.SetUp(title, subTitle); - buttonText.GetComponent().SetTerm(textContent); + var localize = buttonText.GetComponent(); + if (localize != null) + { + localize.SetTerm(textContent); + } + else + { + buttonText.text = textContent; + } button.onClick.AddListener(() => { diff --git a/Assets/Scripts/UI/Settings/GamePlaySettingsWindow.cs b/Assets/Scripts/UI/Settings/GamePlaySettingsWindow.cs index f0fd83fc..b47877c5 100644 --- a/Assets/Scripts/UI/Settings/GamePlaySettingsWindow.cs +++ b/Assets/Scripts/UI/Settings/GamePlaySettingsWindow.cs @@ -1,5 +1,6 @@ using System.Collections; using System.Collections.Generic; +using Ichni.Diagnostics; using Ichni.Menu; using UnityEngine; @@ -24,8 +25,11 @@ namespace Ichni.UI languageDropdown.SetUp(gameSettings.languageIndex, MenuManager.instance.displayLanguageList, "Menu UI/Settings_Language"); languageDropdown.updateValueAction = () => { + BuildHangTracer.Log("UI_DROPDOWN", $"[Dropdown] 玩家选择语言索引: {languageDropdown.selectedIndex}"); gameSettings.languageIndex = languageDropdown.selectedIndex; + BuildHangTracer.Log("UI_DROPDOWN", "[Dropdown] 即将调用 SettingsManager.ApplyLanguageSettings()"); SettingsManager.instance.ApplyLanguageSettings(); + BuildHangTracer.Log("UI_DROPDOWN", "[Dropdown] SettingsManager.ApplyLanguageSettings() 调用完成返回"); }; } diff --git a/Assets/Scripts/UI/Settings/RebindingWindow.cs b/Assets/Scripts/UI/Settings/RebindingWindow.cs index 1df9809c..e5482a02 100644 --- a/Assets/Scripts/UI/Settings/RebindingWindow.cs +++ b/Assets/Scripts/UI/Settings/RebindingWindow.cs @@ -45,12 +45,14 @@ namespace Ichni.Menu public partial class RebindingWindow { + private const string RebindsSaveKey = "Rebinds"; + public void LoadBindings() { // 检查EasySave中是否存在存档 - if (ES3.FileExists(rebindsFilePath)) + if (ES3.FileExists(rebindsFilePath) && ES3.KeyExists(RebindsSaveKey, rebindsFilePath)) { - string rebindsJson = ES3.Load("Rebinds", rebindsFilePath); + string rebindsJson = ES3.Load(RebindsSaveKey, rebindsFilePath); inputActions.LoadBindingOverridesFromJson(rebindsJson); Debug.Log("键位已从EasySave加载。"); } @@ -66,7 +68,7 @@ namespace Ichni.Menu public void SaveBindings() { string rebindsJson = inputActions.SaveBindingOverridesAsJson(); - ES3.Save("Rebinds", rebindsJson, rebindsFilePath); + ES3.Save(RebindsSaveKey, rebindsJson, rebindsFilePath); Debug.Log("键位已保存到EasySave。"); } } @@ -79,10 +81,15 @@ namespace Ichni.Menu // 移除所有覆盖(即恢复到Asset文件中的原始设置) inputActions.RemoveAllBindingOverrides(); - // 从EasySave中删除存档 - if (ES3.KeyExists("Rebind", rebindsFilePath)) + // 从EasySave中删除存档Key与文件 + if (ES3.KeyExists(RebindsSaveKey, rebindsFilePath)) { - ES3.DeleteKey("Rebind", rebindsFilePath); + ES3.DeleteKey(RebindsSaveKey, rebindsFilePath); + } + + if (ES3.FileExists(rebindsFilePath)) + { + ES3.DeleteFile(rebindsFilePath); } Debug.Log("所有键位已重置为默认值。"); diff --git a/Assets/Scripts/UI/SongSelection/PlaySongUI.cs b/Assets/Scripts/UI/SongSelection/PlaySongUI.cs index 98d9ce58..d072bd4c 100644 --- a/Assets/Scripts/UI/SongSelection/PlaySongUI.cs +++ b/Assets/Scripts/UI/SongSelection/PlaySongUI.cs @@ -1,9 +1,6 @@ -using System; -using System.Collections; using System.Collections.Generic; using DG.Tweening; using SLSUtilities.WwiseAssistance; -using UniRx; using UnityEngine; using UnityEngine.UI; @@ -51,12 +48,8 @@ namespace Ichni.Menu selectedTab.RefreshUnlockState(); - if (MenuManager.instance.isEnteringGame) - { + if (!MenuManager.instance.TryReserveGameEntry()) return; - } - - MenuManager.instance.isEnteringGame = true; InformationTransistor.instance.SetInformation( ChapterSelectionManager.instance.currentChapter, @@ -77,10 +70,7 @@ namespace Ichni.Menu arrowSeq.OnComplete(() => { MenuManager.instance.transitionUIPage.FadeIn(); - Observable.Timer(TimeSpan.FromSeconds(0.6f)).Subscribe(_ => - { - MenuManager.instance.EnterGame(); - }); + MenuManager.instance.ScheduleCurrentGameSceneLoad(); }); arrowSeq.Play(); diff --git a/Assets/Scripts/UI/SongSelection/SongSelectionTab.cs b/Assets/Scripts/UI/SongSelection/SongSelectionTab.cs index 249cecb8..88450f2f 100644 --- a/Assets/Scripts/UI/SongSelection/SongSelectionTab.cs +++ b/Assets/Scripts/UI/SongSelection/SongSelectionTab.cs @@ -1,11 +1,8 @@ -using System; -using System.Collections; using System.Collections.Generic; using DG.Tweening; using Sirenix.OdinInspector; using SLSUtilities.WwiseAssistance; using TMPro; -using UniRx; using UnityEngine; using UnityEngine.Serialization; using UnityEngine.UI; @@ -62,12 +59,8 @@ namespace Ichni.Menu return; } - if (MenuManager.instance.isEnteringGame) - { + if (!MenuManager.instance.TryReserveGameEntry()) return; - } - - MenuManager.instance.isEnteringGame = true; InformationTransistor.instance.SetInformation( ChapterSelectionManager.instance.currentChapter, @@ -78,11 +71,7 @@ namespace Ichni.Menu SongSelectionManager.instance.StopPreviewSong(); MenuManager.instance.transitionUIPage.FadeIn(); - - Observable.Timer(TimeSpan.FromSeconds(0.6f)).Subscribe(_ => - { - MenuManager.instance.EnterGame(); - }); + MenuManager.instance.ScheduleCurrentGameSceneLoad(); } else { diff --git a/Assets/Scripts/Utilities.meta b/Assets/Scripts/Utilities.meta new file mode 100644 index 00000000..fe9df2fe --- /dev/null +++ b/Assets/Scripts/Utilities.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a5cdb3053b7ba374db5ab1b00a409bf7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Utilities/BuildHangTracer.cs b/Assets/Scripts/Utilities/BuildHangTracer.cs new file mode 100644 index 00000000..8baa0db9 --- /dev/null +++ b/Assets/Scripts/Utilities/BuildHangTracer.cs @@ -0,0 +1,64 @@ +using System; +using System.IO; +using UnityEngine; + +namespace Ichni.Diagnostics +{ + /// + /// 专用于 Standalone Build 的实时落盘诊断日志工具。 + /// 绕过 Unity 默认日志缓冲区,直接将日志强行追加写入独立文本文件, + /// 确保即使游戏卡死(未响应),卡死前最后一条日志也能 100% 写入磁盘。 + /// + public static class BuildHangTracer + { + private static string _logFilePath; + + public static string LogFilePath + { + get + { + if (string.IsNullOrEmpty(_logFilePath)) + { + _logFilePath = Path.Combine(Application.persistentDataPath, "build_hang_trace.txt"); + } + return _logFilePath; + } + } + + /// + /// 强行立即追加一行日志到磁盘独立文件 + /// + public static void Log(string tag, string message) + { + try + { + string timestamp = DateTime.Now.ToString("HH:mm:ss.fff"); + string logLine = $"[{timestamp}] [{tag}] {message}{Environment.NewLine}"; + File.AppendAllText(LogFilePath, logLine); + } + catch + { + // 静默忽略日志写入本身的异常 + } + } + + /// + /// 清空之前的日志文件并记录初始化标志 + /// + public static void ClearLog() + { + try + { + if (File.Exists(LogFilePath)) + { + File.Delete(LogFilePath); + } + Log("INIT", $"--- 诊断日志已重置。日志存储路径:{LogFilePath} ---"); + } + catch + { + // 静默忽略 + } + } + } +} diff --git a/Assets/Scripts/Utilities/BuildHangTracer.cs.meta b/Assets/Scripts/Utilities/BuildHangTracer.cs.meta new file mode 100644 index 00000000..5aed42b4 --- /dev/null +++ b/Assets/Scripts/Utilities/BuildHangTracer.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: bebb1ee94395f2648b7cf5892a16c9fd \ No newline at end of file diff --git a/Assets/Settings/URP-HighFidelity.asset b/Assets/Settings/URP-HighFidelity.asset index 466d617c..dfc1e51b 100644 --- a/Assets/Settings/URP-HighFidelity.asset +++ b/Assets/Settings/URP-HighFidelity.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1fcd0af0523aaedc90eac0cdfd9474fd1b1c0ee9c616adbc810bf7ed911c308c -size 4596 +oid sha256:4d4398514f6e7f3df219d1ebd195c58e9c9288085289292c45f5488a669ac130 +size 4594 diff --git a/Assets/Story/Chapter0/C0_A0.yarn b/Assets/Story/Chapter0/C0_A0.yarn deleted file mode 100644 index c7751639..00000000 --- a/Assets/Story/Chapter0/C0_A0.yarn +++ /dev/null @@ -1,83 +0,0 @@ -// ============================================================ -// Chapter 0 · Block A0 -// 命名约定:C{章节}_{BlockId}_{分段} -// 入口节点:C0_A0 -// 分段节点:C0_A0_first_meeting / C0_A0_reveal / C0_A0_conceal -// C0_A0_truth_known / C0_A0_end -// ============================================================ - -title: C0_A0 -position: 0,0 ---- -// 变量声明(默认值;StoryVariableStorage 存有存档值时会自动覆盖) -<> -<> -SLS: 勇士,你终于来了。我们等待你很久了。 #line:0c2e7ae -<> -Asahi: ……这就是那个传说中的地方吗? #line:0871a99 -<> -=== - -title: C0_A0_first_meeting -position: -150,250 ---- -<> -SLS: 这里曾是一场被时间掩埋的战争的终结之地。 #line:0cdce7d -SLS: 我们称之为"遗忘之地"。 #line:0fe1e57 -<> -Asahi: 为什么叫这个名字? #line:068875f -SLS: 因为死去的人希望被遗忘—— #line:04a17d7 -<> -SLS: ——而活下来的人,却永远无法忘记。 #line:03e5d89 -Asahi: …… #line:0a4b2fc - -// 玩家选择:决定是否对朝日如实相告 --> 让朝日知道全部真相 #line:019f988 - <> - <> --> 暂时不告诉朝日 #line:02b0524 - <> --> 聊聊朝日的过去 <> #line:0e8d4c1 - Asahi: 那段记忆……我终于能开口谈了。 #line:0a3f9b7 - <> -=== - -title: C0_A0_reveal -position: -250,500 ---- -SLS: 勇士,你选择了如实相告。这需要勇气。 #line:0f8c24f -SLS: 朝日,你所在的这个世界,从未真正平静过。 #line:0b9f3b6 -SLS: 那场战争留下的烙印,至今仍深藏在每一片土地之下。 #line:0e67923 -Asahi: 我……我需要时间来接受这一切。 #line:0365430 -SLS: 我们等你。 #line:081f185 -<> -<> -=== - -title: C0_A0_conceal -position: -50,500 ---- -SLS: 有些事,时机未到,不必强求。 #line:0a8fa30 -SLS: 今天先让朝日了解这里的历史就够了。 #line:09b7cff -Asahi: 谢谢你。我会记住的。 #line:097c353 -<> -=== - -title: C0_A0_truth_known -position: 150,250 ---- -SLS: 既然朝日已知晓实情,接下来的路会更加艰难。 #line:09fe68f -SLS: 但你所拥有的力量,也会随觉悟的深入而增长。 #line:06154cb -Asahi: 我已经准备好了。 #line:04617a4 -<> -<> -=== - -title: C0_A0_end -position: 0,750 ---- -<> -SLS: 无论你作何选择,这段旅途都只属于你。 #line:00bf206 -SLS: 去吧,勇士。前方还有很长的路。 #line:03c5112 -Asahi: 我会一直陪着你的,不管去哪里。 #line:06d2a12 -=== diff --git a/Assets/Story/Chapter0/C0_ContractDecision.yarn b/Assets/Story/Chapter0/C0_ContractDecision.yarn new file mode 100644 index 00000000..76821b95 --- /dev/null +++ b/Assets/Story/Chapter0/C0_ContractDecision.yarn @@ -0,0 +1,364 @@ +// Chapter 0 · C0-S03 契约抉择与镜的降临 +// 对应场景卡:docs/chapter0-scene-03-contract-decision-card.md +// 类型:Important TextBlock(待 StoryData 配置) +// 目标 Block ID:c0_contract_decision +// 入口 Node:C0_ContractDecision +// Timeline Marker:c0_contract_decision_checkpoint(“第五日 · 抉择”) +// +// 章节变量:c0_contract_route(Int,默认值 0) +// 0 = 尚未选择;1 = 接受契约;2 = 拒绝契约。 +// 接受后开放 c0_public_disclosure,并 Forbidden c0_refusal_ending。 +// 拒绝后开放 c0_refusal_ending,并 Forbidden c0_public_disclosure。 +// +// 本稿不添加 #line 标签;待文本批准后由 Yarn 工具统一生成。 +// 角色立绘与镜的专用演出命令待 CharacterRegistry、Portrait 与 VFX 资源确认后补充。 + +title: C0_ContractDecision +--- +最终会面室的门在曦身后无声合拢,透明墙面随即恢复了完整的隔音状态。父亲和母亲仍站在走廊另一侧,只要她回头,就能隔着玻璃看见他们。 #line:0df8a89 + +房间里听不见外面的任何声音,连父亲无意识敲击终端边缘的动作也变成了一段安静的画面。 #line:03f331c + +五日前摆满圆桌的资料已经被收走大半。桌面上只剩三样东西:一份薄得近乎失礼的程序确认书,一支没有联网功能的笔,以及那台曾经接收未知通信的装置。装置表面没有指示灯,黑色外壳沉默得像一块普通的金属。 #line:0e8234d + +窗外,泽尼斯正处于上午最繁忙的时段。公共列车沿着研究区外缘连续驶过,几座实验塔正在更换白昼模式的遮光层,更远处的学校穹顶反射着稳定而明亮的恒星光。 #line:0d0ea2e + +没有警报,没有停工,也没有谁知道这间房里即将失去或得到什么。 #line:0cf6ba3 + +程衡和徐允雅已经起身等候。两人仍穿着第一次会面时那种适合日常工作的深色服装,没有礼仪人员,也没有摄录设备。徐允雅先看了一眼门外的曦父母,随后把桌边一张空椅拉开。 #line:0bee901 + +徐允雅: 早上好,曦。你父母可以随时进入,也可以通过书面方式参与最后核对。现在保持隔音,是你刚才确认过的选择;如果你改变主意,我们会立即打开门。 #line:0913da0 + +曦: 先这样吧。他们已经把能说的都说了,我也把能问的都问了。要是最后还盯着他们的表情,我可能会把“我想怎样”看成“他们希望我怎样”。 #line:0f3af0b + +徐允雅: 明白。最终程序不会因此减少任何权利,你仍可暂停、离开,或者要求他们进来。只要神尚未确认契约成立,今天就不存在不可撤回的步骤。 #line:03031f1 + +曦在椅子上坐下,把随身带来的文件袋放到膝上。五天里,袋口已经被她开合了太多次,原本平整的封边留下几道浅浅的折痕。她的手指刚摸到那几道折痕,便意识到自己又在数它们,只好把手掌压在膝盖上。 #line:0a17f8c + +程衡: 在正式核对以前,我只补充一件事。星联希望这场交易成立,这一点没有改变;你拥有拒绝交易的全部权利,这一点也没有改变。前一句不会削弱后一句。 #line:0f01df4 + +曦: 你说这些的时候,能不能偶尔不要这么干脆?我本来准备了一路,想看看你们会不会在最后一分钟突然变得很会劝人。 #line:059f9ae + +程衡: 如果我们在最后一分钟才开始劝你,就说明前五天所说的自愿都不可信。至于说话方式,我可以尽量不让每一句都像正式公告,但不保证进步明显。 #line:071b105 + +曦忍不住笑了一下,紧绷的肩膀也跟着松开一点。那点轻松很快过去,却没有让她觉得自己不够严肃;她只是终于能够正常呼吸,然后看着徐允雅将那份程序确认书推到圆桌中央。 #line:0577a12 + +徐允雅: 这份文件不是神的契约,也不包含任何飞升技术。它只记录星联已经向你提供全部已知事实,没有隐瞒已经获得的答案,也没有把无法验证的推测当作保证。 #line:0eb07d4 + +徐允雅: 我会进行最后一次知情核对。它不是考试,你不需要复述文件原句;如果任何一项与你的理解不一致,我们就停下来重新确认。 #line:074d119 + +曦: 好。我可能会说得慢一点,但不是因为没听懂。 #line:0290438 + +徐允雅: 第一项。神指定你为唯一候选人。我们没有发现这一指定与你的家庭、能力、教育经历或任何可验证特质有关,也没有第二位候选人等待替换。你是否理解? #line:0cfe686 + +曦: 理解。也就是说,至少在你们能够验证的范围里,不是因为我比别人特殊,只是它选中了我。 #line:0f1bad0 + +徐允雅: 是。第二项。若你接受,神承诺解除阻碍星联继续抵达第十等级的科技锁,但至今没有交付相关知识,也没有说明科技锁的原理。契约成立以前,星联无法提前验证最终收益。 #line:0116584 + +曦: 理解。我们知道它能够建立这条通信,也知道自己的研究确实被某种东西挡住了,但这还不能证明它以后一定会兑现承诺。 #line:09cc204 + +徐允雅: 第三项,也是目前唯一得到明确说明的履约规则。你需要在一名高维陪同者的陪伴下前往多个世界,并在离开每个世界以前,献上一件你真诚认为是当地最珍贵的事物。 #line:027ba29 + +徐允雅: 星联不知道世界数量、旅程期限、献祭对象的范围、献祭方式及后果,也不知道你能否返回。对于这些事项,我们没有保留答案,因为我们从未得到答案。你是否理解? #line:03e9943 + +曦的指尖重新碰到文件袋封边。那些未知事项她已经读过许多遍,甚至能够背出徐允雅整理它们时使用的顺序;可当它们在这间房里被重新说出口,纸面上的空白还是变回了真实的、没有边界的远方。 #line:0608210 + +曦: 理解。我不知道会去多少地方,不知道要在那里做什么,也不知道所谓献祭究竟会发生什么。我只知道最后的选择必须是我真心相信的,不能靠别人替我写一个答案。 #line:074d095 + +徐允雅: 准确。第四项。拒绝不会导致处罚、追责或对你家人的限制,神也不会指定新的候选人。交易将直接终止,星联继续依靠现有研究面对未来。 #line:0c362a6 + +曦: 理解。不会有人在我拒绝以后被叫进另一间房,也不会有人因为我留下就失去现在的生活。星联失去的是突破科技锁的机会,不是明天。 #line:0b28385 + +徐允雅: 最后一项。若你接受,并由神确认契约成立,选择将不可撤回。神允许十至十五周的告别与出发准备期,这段时间包含你提出的母星旅行;但星联无权在契约成立以后替你取消旅程。 #line:0853e6e + +曦: 理解。签约以后不是马上把我从椅子上带走,可那也不是让我再考虑十几周。考虑到今天就结束了,后面的时间只用来告别和准备。 #line:004634c + +徐允雅: 核对完成。你可以阅读并签署星联的程序确认书,也可以不签。无论哪一种,都不会自动代表你接受神的契约;真正的答案必须由你亲口给出,并由通信装置转交。 #line:0f2648b + +曦拿起那支笔。确认书只有两页,内容和她五天里读过的版本完全一致。她在自己的名字旁停了几秒,随后签下“曦”。笔尖划过纸面时没有发光,也没有触发任何隐藏程序,只留下普通而清晰的字迹。 #line:042b1a9 + +徐允雅收回文件,核对签名以后将它放进封存槽。槽口闭合,桌面重新只剩那台黑色装置。 #line:039a57d + +程衡: 从现在开始,没有需要继续说明的事项,也没有任何人会作最后陈述。你可以现在回答,也可以离开房间;如果选择离开,程序会保持关闭。 #line:04bfb5f + +房间安静下来。程衡没有看向通信装置,徐允雅也没有再碰自己的终端。门外的父母仍在原来的位置,窗外一列满载乘客的公共列车驶入站台,短暂停留后又沿着既定轨道离开。 #line:0bb96b4 + +五天没有替曦找到一个不会失去任何东西的答案。它只是让她看清,害怕离开并不等于不愿意离开,对未知世界的好奇也不会抹去她对家人的不舍;那些互相冲突的念头没有排成一条漂亮的理由,却都真实地属于她。 #line:07c2583 + +-> 接受契约。 #line:0ed4da4 + <> +-> 拒绝契约。 #line:0790643 + <> +=== + +title: C0_ContractDecision_AcceptConfirm +--- +曦张开嘴,却发现准备过很多遍的回答仍然卡在喉咙里。她端起水杯喝了一口,杯沿碰到牙齿,发出一声过分清楚的轻响。 #line:05e9d36 + +曦: 我想接受。等一下,我知道这句话应该说得更确定一点,可我现在确实很紧张。你们能让我先把后半句说完吗? #line:08c73ba + +徐允雅: 可以。通信装置尚未开启,你现在说的任何内容都不会被视为最终确认。 #line:04051a9 + +曦: 我还是害怕,也没有突然觉得自己一定能完成所有事情。我只是想了五天以后,发现“害怕去”和“不愿意去”不是一回事。 #line:0a8012a + +曦: 我爱自己的家,也真的想知道那些世界是什么样子;如果我因为害怕就把这扇门关上,我以后大概会一直记得今天。 #line:0d4614c + +程衡没有接着她的话赞许或致谢,只把手放在桌面上,等待她自己决定是否继续。徐允雅则将通信装置的待机权限交给曦,黑色表面浮现一行简单的确认文字:契约一旦成立,无法撤回。 #line:0a23d2d + +-> 我明白契约成立后无法撤回。确认接受。 #line:0973dad + <> + <> +=== + +title: C0_ContractDecision_RefuseConfirm +--- +曦看着桌面上的通信装置,过了很久才把双手从膝上松开。她没有感觉到轻松,也没有像自己想象中那样立刻后悔;两种结果都没有到来,只有一句必须由她亲口说出的答案。 #line:044fb56 + +曦: 我想拒绝。我知道星联会因此失去唯一的机会,也知道没有第二个人可以替代我,但我不能真诚地答应一场连自己要承担什么都不知道的旅程。 #line:037392d + +徐允雅: 你的理由不需要接受审核。最后确认只说明结果:一旦拒绝,通信程序将关闭,交易终止,神不会指定第二位候选人。 #line:0d61cf2 + +-> 我明白交易将就此终止。确认拒绝。 #line:0d743c2 + <> + <> +=== + +title: C0_ContractDecision_RefusalExit +--- +徐允雅没有再问任何问题。她关闭通信装置的待机权限,将所有尚未发送的数据从隔离区清除,随后把程序确认书与拒绝记录一同封存。黑色装置从头到尾没有亮起,神也没有留下声音、文字或惩罚。 #line:08bbeff + +程衡: 我代表联星共同体确认,你已经拒绝契约,交易程序到此终止。星联会继续现有研究,并承担保护你与家人隐私的责任;你不欠这个文明一份道歉,也不需要向任何人证明自己足够勇敢。 #line:01e0d04 + +曦: 真的就这样结束了吗? #line:090e0e0 + +程衡: 就这样结束。自愿选择如果需要用额外代价来惩罚拒绝,就不再是自愿选择。 #line:0d3279e + +曦低头看了看自己空着的双手。她带来的文件已经全部归还,通信装置也被重新封闭,房间里没有任何东西需要她继续处理。五日前闯进普通生活的那道问题,竟然真的能够在一句回答以后停止。 #line:03d0a06 + +徐允雅解除了房间隔音。门外的声音重新进入室内,父亲敲击终端边缘的轻响也终于有了节奏。曦走出门时,父母同时向前迈了一步,却谁也没有先问她给出了什么答案。 #line:01423d8 + +曦: 我拒绝了。不是因为你们希望我留下,也不是因为我觉得星联不值得……我只是没有办法答应。 #line:054a2ca + +父亲的肩膀明显放松了一瞬,随后又因为听见她最后那句话而重新绷紧。他没有说“这样最好”,只是伸手接过她一直空抱在怀里的文件袋,又在发现袋子已经归还以后,有些笨拙地把手收了回来。 #line:0b7d05f + +父亲: 那我们回家。你不需要在走廊里把理由整理成一份报告。 #line:00099d9 + +母亲: 如果以后想谈,我们就谈;如果今天不想,今天先去吃午饭。你作出的答案已经足够完整,不需要为了照顾我们的反应再补充什么。 #line:087a13c + +曦回头看了一眼最终会面室。程衡和徐允雅仍站在圆桌旁,那台通信装置已经沉入桌面下方的隔离舱,透明窗外的列车与行人依旧按照原来的节奏穿行。 #line:05c1998 + +她和父母一起走向升降梯。门在三人身后合拢,没有掌声,没有指责,也没有谁追出来要求她重新考虑;只有公共事务中心的引导系统照常询问,他们是否要返回大厅。 #line:00c08fd +=== + +title: C0_ContractDecision_KagamiArrival +--- +曦把手掌放到通信装置上方的感应区。装置没有读取指纹或生理特征,只在确认她主动维持接触以后,将一句没有经过修饰的回答送入那条由通信密钥开启的未知通道。 #line:00c657b + +曦: 我接受契约。这是我自己的决定。我知道它不能撤回,也知道你们没有向我保证能够回来。 #line:00bff31 + +黑色装置的表面亮起一条细线。它没有播放神的声音,也没有显示来自另一端的文字;那条光只是从左向右走完一次,像某个不需要语言的系统确认已经收到答案。 #line:0ef4bbe + +那条光走到装置边缘以后没有折返,也没有留下新的文字,只是在曦面前彻底熄灭。 #line:03dcd65 + +房间里什么都没有发生。曦等了两秒,又等了两秒,忍不住看向徐允雅。 #line:05ecde3 + +曦: 这算是成功,还是装置在让我保持耐心? #line:0b67877 + +徐允雅没有立刻回答。她的终端已经收到确认,屏幕上只有一个从未在测试中出现过的稳定状态:契约成立。她反复核对了两个独立读数,才抬起头来。 #line:00dfe4e + +徐允雅: 契约已经成立。通信通道自行关闭,装置没有再接收到任何附加信息。 #line:0b61a51 + +程衡: 那么从这一刻开始,星联负责完成公开说明、家属保护以及你要求的告别与母星旅行。我们会在履约窗口内安排全部准备,但不会把这段时间变成连续不断的仪式。 #line:0db548e + +曦: 谢谢。虽然我现在听见“从这一刻开始”,还是有一点想假装刚才只是把手放错了地方。 #line:0fdba2f + +程衡: 这很正常。你不需要因为已经接受,就立刻表现得像不再害怕。 #line:0fbcad5 + +曦正想回答,窗外一列经过透明墙面的列车忽然断成了两截。 #line:0ca6701 + +它并没有真的断裂。车厢仍沿着轨道平稳前进,可玻璃中的倒影停留在半秒以前;桌边金属饰条映出的程衡则转向了一个现实中不存在的角度。 #line:04372cc + +徐允雅的终端已经暗屏,屏幕上却出现了房间顶部的俯视图,而那里没有任何摄像设备。 #line:0b16927 + +曦下意识站起身。她的椅子向后滑出一小段距离,椅脚与地面摩擦的声音真实而清楚;可圆桌表面映出的那把椅子仍停在原处,仿佛倒影暂时拒绝承认现实已经改变。 #line:0696459 + +下一瞬间,房间里所有能够反射光线的表面同时偏转。窗玻璃、金属桌沿、终端暗屏,甚至曦眼睛里极小的高光,都映出了同一个不属于三维空间的切面。 #line:0c860b8 + +一枚镜面在圆桌上方展开,紧接着是第二枚、第三枚,以及无法通过遮挡关系数清的更多平面。它们没有从某处飞来,也没有挤占周围的空气,只像一个原本就存在的整体突然允许这间房看见自己的一小部分。 #line:0857cfc + +那些镜面不断翻折、分离又重新嵌合,组成一团没有固定外轮廓的几何复合体。它像一枚活着的万华镜,也像某种巨大结构落入三维世界的碎片。 #line:0a75b95 + +部分表面映照着房间的真实影像,另一些则同时呈现人体热量、建筑线框与不断刷新的数据形态;半透明的镜面深处,光点和细线组成的风暴正在无声涌动。 #line:01b86ba + +徐允雅抬起终端,终端却没有发出警报。它能够记录光线、温度与空间变化,却无法把眼前之物归入任何一种已知设备或生命结构。她没有靠近,只把终端保持在不会妨碍曦的位置。 #line:03d9768 + +镜面复合体完成一次规模极大的重组。一个平静、没有明确性别,也无法确定来源方向的声音随之出现在房间里。 #line:0ed45b3 + +镜: 契约确认。履约窗口开始计算。 #line:0db3fc3 + +曦握住椅背,确认它不会继续向后滑。她先看了看程衡,又看了看徐允雅,发现这两位平时似乎永远知道下一步程序的人此刻都没有立即开口。 #line:0f97f6f + +曦: 所以……你就是那位高维陪同者? #line:0e65648 + +镜: 是。你们可以称呼我为镜。这是我为自己选择的名称,也是我允许你们使用的称谓;它不负责描述我的完整结构或形态。 #line:06183ab + +程衡: 我代表星联确认你的身份与职责。你是否能够使用我们理解的方式,说明你将在旅程中承担什么? #line:06f8a0a + +镜: 陪同曦进入契约指定的世界,观察履约过程,并在她的生命或继续履约的能力受到决定性威胁时提供保护。除此以外,我不替她行动,不替她作出献祭判断,也不负责消除旅程中的普通困难。 #line:0fc9b76 + +它的回答没有敌意,也没有安抚。镜面仍以稳定而复杂的规律改变位置,偶尔从曦面前掠过的反射既呈现她此刻的神情,也呈现由光点构成的骨骼与热量轮廓。 #line:037d786 + +“一个紧张的少女”和“一组可观测数据”,对镜而言似乎只是同一对象的两种表面。 #line:066f3e9 + +曦: 你能不能先别把我的骨头也照出来?我知道这可能只是你观察东西的方式,但第一次见面就看得这么彻底,还是有点奇怪。 #line:0c45524 + +镜面没有停止重组,其中朝向曦的一部分却改变了角度,热量和线框影像从她身上移开,转而落在空着的墙面上。 #line:0ecb3cb + +镜: 该显示方式不是履约所必需。我会限制它对你感知的干扰。 #line:0f16506 + +曦没能判断这算不算礼貌。镜没有道歉,也没有等待她表示满意,只是完成了一项不会影响任务的调整,随后安静地悬停在圆桌上方。 #line:002839e + +-> 你到底是什么? #line:0806abc + <> +=== + +title: C0_ContractDecision_AskIdentity +--- +曦: 你说自己是高维陪同者,可“高维”对我来说还是资料里的一行字。你到底是什么,这个样子又是你的身体吗? #line:033ec2e + +镜: 我是四维生命。你所处的世界以三个空间方向组织物质,而我能够将你们称为时间的方向作为可观测结构的一部分。眼前形态不是完整身体,只是我与三维环境建立交互时使用的投影。 #line:09c01f8 + +曦: 所以这些镜面只是你的一小部分? #line:0e5158d + +镜: “一小部分”仍然容易让你把我想象成一个被切开的三维物体,但作为当前交流所需的近似,可以这样理解。完整说明会要求你同时建立目前不具备的感知与认知结构,我不会向你灌输那种知识。 #line:0646fc7 + +曦: 这一句听起来很像“你现在还理解不了”,只是你说得特别完整。 #line:0386fca + +镜: 这是当前最接近事实的说法。我的保留仅限于你暂时无法建立的认知结构,并非故意制造神秘。 #line:08e82de + +徐允雅: 你是第一次以这种方式进入三维世界吗? #line:0293ade + +镜: 是。过去我可以直接观测三维世界的完整时间结构,没有以投影与其中个体持续同行的必要。此次进入是契约职责的一部分。 #line:02002a1 + +徐允雅没有追问它观察过多少文明,也没有要求它证明“完整”意味着什么。她只把回答记录下来,并在镜面再次映出终端内部结构以前主动关闭了扫描界面。 #line:0fbef34 + +曦: 好吧,四维生命,三维投影,目前只能近似理解。我先把这几个词记住,剩下的等我哪天真的长出第四个方向再问——这句是玩笑,你不用替我纠正物理条件。 #line:08e04cf + +镜没有回应这句玩笑,也没有表现出理解或困惑。它只是将几枚彼此交叠的镜面展开,使房间的真实倒影重新与现实保持一致。 #line:022422e + +-> 你会怎样保护我? #line:0c679df + <> +=== + +title: C0_ContractDecision_AskProtection +--- +曦: 你刚才说会在决定性的危险里保护我。能不能说得具体一点?如果我在另一个世界受伤、迷路,或者被什么东西追着跑,你都会出手吗? #line:08fb4d1 + +镜: 不一定。受伤、迷路与受到追逐,均不足以单独证明你的生命或履约能力将被终止。我会判断事件是否越过必要边界,并只在越过时介入。 #line:08ba0df + +曦: 也就是说,普通的麻烦还是要我自己解决。即使在我看来已经非常不普通,只要你认为我还能继续,就可能站在旁边看着。 #line:0aabf7e + +镜: 正确。我的职责是确保契约具备继续执行的可能,不是把旅程改造成对你没有阻力的移动过程。若每一个困难都由我移除,你的行动与判断将失去作用。 #line:08c4212 + +曦: 你说“正确”的时候,真的会让人很难假装自己刚才理解错了。 #line:0325362 + +镜: 精确理解职责边界,有利于你在未来作出判断。模糊承诺只会让你在危险发生时错误估计可用条件。 #line:0593e43 + +程衡: 若你的判断与曦本人冲突,谁拥有最终决定权? #line:06c1a82 + +镜: 对是否需要保护的判断由我执行,因为她无法在所有情况下观测自身生命状态;对旅程中的行动与献祭选择,我没有替代权。神要求的是曦的真诚判断,不是我的答案。 #line:01e8230 + +曦: 那至少有一件事很清楚。你不会在关键时候把我丢下,但也不会因为我喊得很大声,就替我把所有问题处理掉。 #line:01ec34a + +镜: 可以这样概括。我的判断只依据实际威胁,不依据你是否表现得足够镇定。 #line:03125b8 + +曦: 这听起来不算温柔,不过至少很清楚。我知道什么时候可以依靠你,也知道什么时候只能靠自己。 #line:0127fc2 + +镜: 清楚的职责边界足以支持你作出判断。 #line:008f576 + +曦看向程衡,像是想确认这位文明最高公共职位的承担者是否有办法要求高维陪同者稍微放松一点。程衡沉默片刻,最终只给了她一个很轻的摇头;显然,星联现有的任何礼仪规范都没有覆盖这种情况。 #line:0dc49ba + +-> 你知道我还能不能回来吗? #line:0ef43d8 + <> +=== + +title: C0_ContractDecision_AskReturn +--- +曦: 还有一个问题。你刚才说四维生命能够把时间当作可观测结构,那你应该知道未来,对吗?你知道我最后还能不能回到这里吗? #line:0b9dd01 + +镜面深处的数据流没有停顿,也没有因为这个问题加快。镜显然不需要考虑应该给出怎样的安慰,只需要决定哪些信息属于它的职责范围。 #line:0d626c7 + +镜: 我能够观测这个世界的完整时间结构,也知道你所询问的结果。但我不会向你透露未来。这不是能力不足,也不是对答案进行暗示,而是明确拒绝回答。 #line:04f2668 + +曦: 连“可能”或者“大概”都不能说? #line:016ff6a + +镜: 不能。若我用模糊措辞引导你推测,仍然是在提供未来信息。我没有获得这样做的权限。 #line:0110663 + +曦: 你们高维生物拒绝回答的时候,都这么彻底吗? #line:00a65cf + +镜: 关于其他四维生命,我无法回答。关于我,此项拒绝不会因提问方式改变。 #line:0c7e363 + +曦: 好,我明白了。至少我不用把你每句话翻来覆去地猜,怀疑某个停顿是不是暗示。 #line:0c30810 + +镜: 正确。我没有为你留下暗示。 #line:07d7cf8 + +这份回答并没有让曦安心,却比一句刻意温柔的谎言更容易握住。镜知道结局,却把答案留在她无法触及的位置;从这一刻开始,未来仍然只能以三维生命熟悉的方式到来,一秒接着一秒,没有提前展开的地图。 #line:0cd6261 + +徐允雅: 履约窗口已经开始。曦在离开以前,是否仍可按照她的意愿与家人生活,并完成母星旅行? #line:0e34b2b + +镜: 可以。神允许的准备期为十至十五周,告别、旅行与必要装备准备均在窗口内。具体出发时点会在期限内确认,确定以后我会提前通知。 #line:0210d35 + +程衡: 在公开程序开始前,我们需要让她的父母进来。他们知道全部已知事实,也有权亲眼确认陪同者已经出现。 #line:06eebcb + +镜: 允许。其在场不会影响当前任务。 #line:08d03db + +徐允雅解除门锁与隔音。门刚打开,父亲和母亲便同时看见了悬浮在圆桌上方的镜面复合体。父亲原本已经准备迈进房间,脚步却在透明分界线前停了半拍。 #line:0145c89 + +母亲先看向曦,确认她仍然站得稳,才把视线移向那些持续重组的镜面。 #line:0cd4311 + +父亲: 曦,这就是会陪你出发的存在吗? #line:0df508f + +曦: 它允许我们叫它镜。它会在真正要命的时候保护我,普通麻烦还是归我自己;它知道我能不能回来,但拒绝告诉我。大概就是这些,我也是刚刚才听完。 #line:06b7a9f + +父亲: 你总结得比资料清楚。 #line:0c4141a + +母亲走到曦身边,没有触碰镜,也没有对它的形态提出研究问题。她把手放在曦肩上,确认女儿真的在这里以后,才开口询问。 #line:09b09cb + +母亲: 镜,在出发以前,你会一直跟随她吗? #line:0dfd539 + +镜: 是。我将公开陪同并观察她的准备过程。你们可以继续与她共同生活,我不会要求她提前脱离现有关系,也不会代替她安排告别。 #line:070fa97 + +父亲: 如果我们认为某项准备会伤害她,能向你提出意见吗? #line:08d1808 + +镜: 可以提出。我会判断该信息是否影响履约与安全,但不承诺接受所有意见。你们与曦之间的家庭决定仍由你们自行处理。 #line:0dab1d7 + +父亲显然不喜欢这个答案,却也没有同镜争论。他只是走到曦另一侧,把刚才在门外反复开合的终端彻底关掉。 #line:09201c1 + +曦: 爸,妈,我接受了。对不起,我知道你们希望我留下,可我最后还是—— #line:0937588 + +母亲: 先不用道歉。我们说过,出来以后无论答案是什么,你都先到我们这里来。 #line:0854a84 + +父亲: 我还是希望你留下,这个愿望没有因为契约成立就突然消失。但接下来的十几周,我们要做的不是每天要求你重新回答一次。 #line:0e4016d + +曦点了点头。她原本以为说出接受以后,房间里的一切都会立即变成告别;可父母仍站在她身边,窗外的列车仍在运行,学校终端甚至在她的包里轻轻震动,提醒下午还有一份尚未提交的实践记录。 #line:061a771 + +镜从圆桌上方移开。它没有模拟行走,也没有缩小成更便于人类接受的形态,只是让不断重组的镜面整体平稳地悬停在曦身后。光点与线条组成的数据风暴透过半透明表层流动,将门外熟悉的走廊切成许多同时存在的反射。 #line:002c675 + +程衡: 公开说明会在征得你和家人的时间安排后进行。今天以前,星联保护的是唯一候选人的身份;从今天开始,我们需要让所有人知道,这场机会由一个真实的人承担,而不是一条没有代价的科技新闻。 #line:0898236 + +曦: 我能先回家吗?至少让我把学校那份记录交了。我不想成为文明英雄的第一天,就收到实践课逾期提醒。 #line:0dc2017 + +程衡: 可以。公开程序从今天开始准备,不要求你从这一分钟起停止原来的生活。 #line:088260c + +镜: 在出发前,你可以继续处理原有的学习与生活安排。 #line:0492bf2 + +曦: 谢谢,这一项我其实可以自己判断。 #line:0d4a5dd + +镜: 明白。我不会干涉。 #line:0531416 + +最终会面室的门完全打开。曦和父母一同走向升降梯,镜则保持着不远不近的距离跟在他们身后。 #line:0d0dc39 + +走廊里没有其他访客,公共事务中心也尚未向外发布任何消息;在这一小段仍然无人知晓的时间里,曦还能以普通学生的身份回家。 #line:0e4efc9 + +只是从光洁墙面和升降梯门上,她已经能够看见那个不属于三维世界的倒影始终随行。 #line:07cfe6c +=== diff --git a/Assets/Story/Chapter0/C0_RollbackDemo_Convergence.yarn.meta b/Assets/Story/Chapter0/C0_ContractDecision.yarn.meta similarity index 86% rename from Assets/Story/Chapter0/C0_RollbackDemo_Convergence.yarn.meta rename to Assets/Story/Chapter0/C0_ContractDecision.yarn.meta index 04218d1e..a502ebfb 100644 --- a/Assets/Story/Chapter0/C0_RollbackDemo_Convergence.yarn.meta +++ b/Assets/Story/Chapter0/C0_ContractDecision.yarn.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 786552bb2c0e45cb89f7e9f67beeb6b3 +guid: cbec2b9f936308a41aa4c8b67d21e7c1 ScriptedImporter: internalIDToNameTable: [] externalObjects: {} diff --git a/Assets/Story/Chapter0/C0_DepartureToAsteria.yarn b/Assets/Story/Chapter0/C0_DepartureToAsteria.yarn new file mode 100644 index 00000000..55a9ebab --- /dev/null +++ b/Assets/Story/Chapter0/C0_DepartureToAsteria.yarn @@ -0,0 +1,429 @@ +// Chapter 0 · C0-S06 离开泽尼斯,前往母星 +// 对应场景卡:docs/chapter0-scene-06-departure-to-asteria-card.md +// 类型:Important TextBlock(待 StoryData 配置) +// 目标 Block ID:c0_departure_to_asteria +// 入口 Node:C0_DepartureToAsteria +// 标题 Localization Key:story_c0_block_departure_to_asteria +// +// Unlock Condition:c0_contract_route == 1 +// Forbidden Condition:c0_contract_route == 2 +// 前置 Block:c0_old_life_preparation +// 本稿不写入新的剧情变量,不新增 Timeline Marker。 +// 三项互动按固定顺序出现,每组只有一个选项。 +// +// 本稿不添加 #line 标签;待文本批准后由 Yarn 工具统一生成。 +// 角色立绘、场景切换、超光速航行与母星远景 VFX 待资源确认后补充。 + +title: C0_DepartureToAsteria +--- +闹钟响起以前,曦已经睁着眼睛躺了很久。 #line:017dc5e + +房间里的夜间照明尚未完全关闭,门边那只行李包安静地立在原处。她昨晚已经检查过三遍,却还是从床上坐起来,重新确认旅行终端、环境适应衣装、常用药、照片盒和那支旧多功能探针都在各自的位置。 #line:0fe967c + +什么也没有遗漏。这个结论并没有让她轻松多少。 #line:0ccacc0 + +她拉开衣柜,发现自己竟然还在考虑要不要多带一件普通外套。官方衣装能够应对远比泽尼斯清晨复杂的环境,可那件外套是她平时上学会穿的款式,袖口还留着一次拆装设备时没洗干净的浅色痕迹。 #line:00e23e6 + +曦最后没有把它塞进行李,只穿在了身上。至少在真正离开以前,她还不需要把自己从日常衣物里提前剥离出来。 #line:0dd5d1d + +厨房的灯在固定时间亮起。母亲已经开始准备早餐,父亲坐在桌边查看轨道维护状态;镜悬停在靠窗的位置,半透明镜面将住宅区逐渐变亮的天光分割成许多规则反射。 #line:0a8f6e7 + +它不需要睡眠,也没有因为今天是离开日而改变重组节律。对镜而言,行程从昨晚到今早没有获得新的确定性;只是三维世界的时钟终于抵达了对应位置。 #line:011462d + +母亲: 你是不是又检查行李了? #line:0ea5277 + +曦: 只检查了一次。今天的一次,不算昨晚那三次。 #line:0df16a6 + +父亲: 如果你每换一个日期就重新计数,这套方法可以让任何重复检查看起来都很合理。 #line:00a25a7 + +曦: 我只是确认终端没有在夜里自己离家出走。结果很好,它比我镇定得多。 #line:0518038 + +母亲把早餐放到她面前,没有说“多吃一点”。那句话太容易听起来像在为一段无法预计长度的旅程储存最后一顿饭,于是她只问曦要不要加和平常一样多的调味酱。 #line:051d529 + +曦点了头,又在拿起餐具以后看向门边的行李。 #line:0a70522 + +父亲: 主线路的维护没有延期。我们八点四十分出门,九点二十分以前可以到枢纽;如果中途发生故障,东侧换乘线还能留下二十七分钟余量。 #line:044e15b + +曦: 昨天你说还有两条替代线路。 #line:0413fee + +父亲: 另一条今早临时增加了货运优先级,不适合带着行李换乘。我已经从方案里删掉了。 #line:00f6e9e + +母亲: 你们可以等吃完再讨论怎样避免一场还没有发生的交通故障。早餐不会因为路线规划得更完整就自动进到胃里。 #line:048e269 + +曦低头切开食物。她知道自己应该吃,却发现每一口都需要先说服喉咙配合。终端上的时间仍在向前走,镜也没有提醒她加快速度;真正让她想逃离餐桌的,不是迟到,而是这顿饭一旦结束,全家就会一起走向门外。 #line:0490ebf + +-> 像平常一样,把早餐吃完。 #line:0747491 + <> +=== + +title: C0_DepartureToAsteria_Breakfast +--- +曦把终端屏幕扣到桌面上,不再用行程确认当作放下餐具的理由。 #line:084fda8 + +曦: 好吧,先吃饭。要是我因为在家没吃完早餐,到了母星第一件事就去找餐厅,整个旅行计划都会显得很没出息。 #line:07d90db + +母亲: 去找餐厅有什么问题?母星的食物本来也是旅行的一部分。你不需要每一站都先证明自己看懂了历史。 #line:0851b4a + +父亲: 不过轨道枢纽的餐饮区价格偏高。如果只是饿了,可以等转乘以后再买。 #line:0e3e1f5 + +曦: 我明明还坐在家里,为什么已经开始听母星消费建议了? #line:061609e + +三个人终于把注意力放回早餐。他们谈起学校实践小组昨晚发来的报告,也谈起那张没有拍好的合照。父亲认为镜只出现在画面边缘反而更符合当天情况;母亲则花了一分钟寻找曦差点碰掉的固定件,最后承认普通照片里根本看不见那种细节。 #line:07ab682 + +镜没有加入评价。它已经读取过图像,也知道其中每一个人的完整时间线,却没有说明照片将来会被谁再次打开,或者这一顿早餐会怎样留在曦的记忆里。 #line:043e02a + +早餐结束时,母亲像往常一样收走餐具,曦也像往常一样站起来帮忙。两个人同时伸手去拿同一只杯子,手指碰到以后又一起停住。 #line:0072b13 + +母亲: 你去换鞋吧。今天不用为了证明一切照常,连杯子都一定要自己洗。 #line:098e728 + +曦: 可你昨晚还说,不要把我当成碰一下家务就会耽误文明未来的人。 #line:025bfd8 + +母亲: 所以我现在只是一个不想让女儿错过列车的母亲。杯子归我,鞋子归你。 #line:0b85dfe + +曦没有继续争。她回到房间,背起随身包,又握住大行李的提手。走到家门口时,她忽然停下来,回头看了一眼仍未完全收拾的房间。 #line:0c14872 + +床铺没有整理,书桌上还放着学校发来的课程资料,衣柜门也因为她刚才犹豫过那件外套而留着一条缝。这里不像一间为永久离开准备好的房间,只像主人急着赶一趟很早的旅行,过几天还会回来把东西放回原位。 #line:0fc66d8 + +曦: 我是不是应该把房间收拾好再走? #line:0fa60c5 + +父亲: 如果你现在开始,至少会错过主线路。房间留着吧,等你回来再收。 #line:0ee7c33 + +母亲: 我们会替你保留原样,不会把它改成纪念室,也不会把所有东西收进仓库。 #line:0ac37bb + +曦: 我不是在担心纪念室。我只是觉得……如果回来以后还得先整理床铺,会不会很破坏气氛? #line:09c734f + +母亲: 那就回来以后再整理。现在把门关上吧。 #line:0132878 + +曦照做了。门锁确认仍然使用她熟悉的提示音,没有因为主人即将离开世界而增加任何特殊告别。 #line:062d6b0 + +一家人按计划走到住宅区交通站。镜跟在曦侧后方,万华镜般的结构在清晨人流中格外醒目,却没有占据普通乘客的通道。几名居民认出他们,远远说了一句“旅途平安”,随后继续赶往自己的工作地点。 #line:0afbaea + +曦每次都认真回应,直到母亲轻轻碰了碰她的手臂。 #line:031baef + +母亲: 你不用让每一句祝福都得到同样标准的回答。点头也可以,没听见也不算辜负谁。 #line:080bb94 + +曦: 我知道。可他们可能只会见我这一次。 #line:0a92310 + +父亲: 你也可能只会见他们这一次,但你不知道他们叫什么。一次相遇不要求双方把所有能说的话都说完。 #line:0a633de + +公共列车到站后,一家人与早班通勤者一起上车。没有专门车厢,也没有乘客因为曦出现就被要求改乘下一班;只是靠近他们的位置自然空出一点距离,让镜能够稳定悬停,也让这个家庭在抵达枢纽以前不必回答陌生人的问题。 #line:0d9dbc5 + +列车驶过曦上学时熟悉的研究区。她看见学校所在的交通支线从远处向另一方向分开,今天却没有在换乘提示出现时起身。 #line:0102739 + +接下来的线路是她过去很少乘坐的方向。城市模块逐渐变得宽阔,物流与客运轨道汇入同一片巨大的枢纽结构;泽尼斯没有为离开者修建纪念性大门,只有足以把无数居民送往其它世界的成熟交通系统。 #line:0b0f14c + +<> +=== + +title: C0_DepartureToAsteria_Terminal +--- +九点十六分,列车提前四分钟抵达泽尼斯星际客运枢纽。 #line:0e27d14 + +父亲看了一眼终端,像是终于验证了自己的路线规划没有辜负任何人。曦原本想取笑他,却发现母亲也在确认时间,于是只把行李从置物架上拖下来。 #line:0973ebb + +枢纽大厅比公共事务中心热闹得多。长途旅客拖着行李在不同航线之间换乘,货运人员隔着透明分流层处理设备,公共广播不断提醒某条短程线路更换登乘区。没有写着曦名字的欢迎画面,也没有为她清空大厅。 #line:046e61e + +一块公共屏幕正在播放昨日新闻的后续摘要。画面里短暂出现公共会堂和镜的投影,随后便切换到星系工程进度与几条普通交通信息。曦看见自己的脸只停留了几秒,竟然因此松了一口气。 #line:039bd53 + +客运工作人员在普通柜台核验她的终端和行李。系统先确认环境适应衣装的运输状态,又扫描照片盒与旧探针,最后在镜靠近时弹出一项少见的非标准形态登记。 #line:08bc373 + +工作人员: 随行高维投影不需要座位、维生资源或独立行李额度。为了不影响紧急通行,客舱会为你保留一处直径三米的稳定区域,可以接受吗? #line:00a0556 + +镜: 可以。该区域大于我维持三维投影所需的空间。 #line:05c67a7 + +工作人员: 如果形态在航程中发生变化,请提前通知客舱系统。登记只用于乘客安全,不限制你在允许区域内移动。 #line:05ff221 + +镜: 我的投影不会在本次航程中超出登记范围。 #line:0ff6d91 + +工作人员像处理任何一种特殊交通需求一样确认选项,没有询问镜能否展示更高维度,也没有试图把扫描设备对准不断重组的镜面内部。 #line:092c113 + +轮到曦的行李称重时,系统显示仍有大量剩余额度。母亲看见结果,立刻认为昨晚还可以再放一件外套;曦拉开自己的衣袖,证明那件外套已经以另一种方式随行。 #line:01ab486 + +母亲: 到母星以后如果天气不合适,你要换下来的时候就会发现包里没有地方放。 #line:06b4c21 + +父亲: 剩余额度足够。她可以把外套折好放在照片盒上方,不会压坏任何设备。 #line:0936d63 + +曦: 为什么到了这里,你们还在替一件外套开技术会议? #line:0997cf3 + +母亲: 因为这件事还有办法解决。 #line:0a1cbd3 + +她说完以后,三个人都安静下来。 #line:0785f05 + +工作人员把登乘凭证交回曦,没有催促他们继续前进。星联为曦和家人保留的区域只是一段避开大厅主要人流的候乘廊道,透明隔墙外仍能看见普通旅客经过,既保护隐私,也没有把他们隔离成一场秘密行动。 #line:0c4929e + +距离检票还有半个多小时。曦坐在父母中间,先确认抵达阿斯特里亚的预计时间,又确认轨道枢纽到海洋区域的换乘线路,最后第三次说明自己会在落地以后发送消息。 #line:026b8a7 + +母亲: 我记得。文字就可以,不需要为了证明一切顺利拍一段完整影像。 #line:048dd34 + +曦: 如果航线延迟呢? #line:055195f + +父亲: 公共系统会同步延迟。你不需要在载具还没停稳时先解释为什么晚了几分钟。 #line:0577464 + +曦: 如果母星的网络和泽尼斯不使用同一个即时频道呢? #line:0b888ee + +父亲: 使用。你昨晚测试过旅行终端。 #line:098a99f + +曦: 我知道,我只是在确认你们也知道。 #line:0a4cc9f + +镜: 在进入跨界通道以前,曦仍可使用星联通信网络。母星旅行不会改变这一条件。 #line:0fc4625 + +母亲: 谢谢。这个回答我们确实需要再听一次。 #line:0e60bb9 + +镜: 如果通信条件发生变化,我会及时告知曦。 #line:09953d5 + +父亲: 这就够了。 #line:042b9a1 + +广播在此时提示阿斯特里亚航线即将开始检票。普通旅客陆续站起身,候乘廊道尽头的权限边界由柔和的白光变为通行状态。 #line:0044214 + +父亲和母亲能够陪曦走到那里,却不能继续进入乘客区。 #line:0d46dca + +曦也跟着站起来。她原本在终端里写过几句话,内容包括谢谢、对不起、会照顾好自己,还有一段她已经记不清为什么需要那么正式的保证。真正站在边界前时,那些句子忽然全部挤在一起,没有一句愿意先出来。 #line:0dee76c + +母亲替她拉平衣领。动作和公共说明前一模一样,只是这一次,她没有在确认衣领早已整齐以后立刻收回手。 #line:00a0630 + +父亲握着行李提手,直到系统提醒物品必须由乘客本人通过边界,才把它交给曦。 #line:0513965 + +曦接过行李,却没有迈出去。 #line:0c9c536 + +-> 抱住他们。 #line:0616315 + <> +=== + +title: C0_DepartureToAsteria_Farewell +--- +曦先抱住了母亲。 #line:06fec57 + +这个动作比她想象中用力。母亲原本还想提醒她不要压到随身终端,话说到一半便停了,只把手臂收紧,像是终于允许自己不再维持整个清晨的从容。 #line:052010a + +曦: 我原来准备了很多话,可我现在一句都想不起来。不是完全想不起来,我只是……不知道应该先说哪一句。 #line:0ec0285 + +母亲: 那就不要按顺序说。到了母星告诉我们一声,觉得好看的东西先自己看,不用每次都急着拍回来。还有,不喜欢的安排可以拒绝,你不是因为接受了契约,就连旅行路线也不能改。 #line:02c9a8a + +曦: 你看,你还是一下说了这么多。 #line:0b7431b + +母亲: 因为我也没有想好顺序。 #line:09fff30 + +曦笑了一下,眼泪却在这时候掉下来。母亲替她擦了一次,发现新的眼泪立刻补上,索性不再继续。 #line:09a6ea4 + +父亲站在旁边等她松开母亲,没有用“时间到了”催促。曦转过去抱住他时,他抬起的手在半空停了一瞬,最后落到她背上。 #line:0ef0ea2 + +父亲: 那支探针我昨天检查过,电源和接口都正常。它要是真的没有用,也不要为了证明我准备得对,硬拿它去处理不认识的设备。 #line:01976a8 + +曦: 我知道。先确认,再拆开;找不到答案的时候不要假装已经有答案。我会记得。 #line:081bec9 + +父亲: 也不只是设备。别人等着你决定的时候,你可以停一会儿。害怕不会让你失去选择的资格,暂时不知道也不会。 #line:0a7dc57 + +曦: 你们这样说,我会更不想松手。 #line:0cf694c + +父亲: 我知道。 #line:0163df6 + +他没有接着说“那就不要走”。曦也没有要求他把这句话补出来。 #line:08fef1c + +广播开始第二次检票提示。周围的旅客保持着足够距离,工作人员没有越过权限边界提醒他们加快,只把这一组登乘状态暂时保留在开放列表里。 #line:0085c8e + +曦终于松开手,后退半步。母亲眼睛已经发红,父亲仍然握着那只突然空下来的手,像是不知道下一件可以检查的东西在哪里。 #line:0e49072 + +曦: 我到了就联系你们。不是保证以后每一天都有办法联系,只是母星到了以后一定发。 #line:07f7b36 + +母亲: 好。我们等这一条。 #line:090fe91 + +父亲: 路上先休息。不要因为我们站在这里,就一直守着窗户看泽尼斯。 #line:0bb0dd9 + +曦: 可我想看。 #line:0597ce8 + +父亲: 那就看。我的意思是,不用把难受当成必须完成的任务。 #line:029f425 + +曦拖起行李,通过权限边界。镜在她身后保持原有距离,经过父母面前时没有停下来接受托付,也没有作出任何契约以外的保证。 #line:0fe951c + +走出十几步后,通道开始转弯。曦原本告诉自己不要回头,脚步却在透明隔墙前停住了。 #line:0a2197e + +她回过身。父亲和母亲仍站在原地,母亲抬手挥了挥,父亲慢了半拍才像刚刚想起一样跟着抬起手。两个人的身影没有被鲜花、标语或全星联的掌声包围,只隔着一道普通乘客每天都会经过的权限边界。 #line:03d772e + +曦也向他们挥手,直到自动步道带着她越过转角,再也看不见那段候乘廊道。 #line:0a5b7ba + +她没有立刻擦干眼泪。镜没有询问,也没有说明回头是否改变了任何结果,只在登乘路线分岔时移动到正确通道,确保曦不会因为看着身后走错方向。 #line:070b181 + +客舱内仍有许多普通旅客。星联保留的独立区域只是靠近舷窗的一组座位,周围没有警戒人员;一名年幼乘客从远处认出了曦,小心地向她挥手,随后又被监护人提醒不要走近打扰。 #line:019ae06 + +曦吸了吸鼻子,也向孩子挥了挥手。对方立刻露出笑容,却没有因此跑过来要求合影。 #line:05bb00c + +舱门关闭以前,母亲发来一条只有四个字的信息:“已经看不到了。” #line:02affc6 + +曦盯着那句话,回复自己已经坐好,又补充窗边位置比预计更宽。她删除了几次想加在后面的内容,最后只发送一张行李安稳放在脚边的照片。 #line:0b3d9a7 + +载具按时离开泊位。泽尼斯的客运枢纽从舷窗外缓慢后退,城市结构与轨道设施在上升过程中逐渐连成巨大的几何网络。曦第一次从外部看见自己生活过的世界,而不是站在地表仰望其它航线。 #line:010ae56 + +她能够辨认的地方很快消失。学校、住宅区和公共事务中心都缩进城市光带里,随后连大陆本身也被云层和行星弧面重新包围。 #line:01a12bb + +曦把“已经安全离港”发送给父母。母亲很快回复“看到了”,父亲则附上客运系统早已自动同步的航线状态,像是即使女儿已经离开,他仍然可以再确认一次交通没有故障。 #line:0c9a82d + +<> +=== + +title: C0_DepartureToAsteria_InTransit +--- +载具抵达超光速航道入口以后,舷窗自动降低透明度。远处星光沿航行方向收束,随后被导航图层替代;泽尼斯最后一点可辨认的反光从视野中消失,客舱里只剩下柔和照明和稳定的设备低鸣。 #line:03819dd + +没有乘客为这一过程欢呼。对星联公民而言,跨越恒星系的航行已经和城市换乘一样成熟;有人继续阅读,有人调整座椅准备休息,刚才向曦挥手的孩子则在询问抵达以后能不能立刻购买母星纪念品。 #line:031df7b + +曦靠在舷窗旁,眼睛仍有些发酸。她明明刚刚离开父母,却又因为正在前往从未见过的母星而控制不住地观察导航进度,随后为这点期待感到一阵没有来由的内疚。 #line:0265dfa + +曦: 我现在有点想看母星,又觉得自己不应该这么快开始期待。听起来是不是很奇怪? #line:0d89019 + +镜: 你刚刚离开父母,也正在接近此前无法亲身到达的地点。两种事件产生不同反应,不存在逻辑冲突。 #line:0fa1e1c + +曦: 你的意思是,我可以一边难过,一边期待? #line:0919a18 + +镜: 两种状态已经同时存在。是否允许它们存在,不会改变这一事实。 #line:0b51a2e + +曦: 好吧,这种说法很像你。至少你没有劝我“想开一点”。 #line:0bd05bf + +镜: 我不会提供与事实不符的安慰。 #line:0c97a4b + +曦打开母星旅行资料。她从小看过无数次阿斯特里亚的地图,却从未需要真正决定自己会从哪座枢纽下船、在哪条线路换乘,以及第一晚把行李放在哪里。过去属于教材的地点突然变成一段几小时后必须亲自走过的路线。 #line:07f32f7 + +旅行计划从轨道枢纽开始,随后搭乘行星纵向交通线前往大洋之心外围的海洋深层站点。之后的景点将由下至上连接母星不同历史层次,最终通往行星轨道与恒星边缘。 #line:0230dd5 + +曦: 我以前一直以为去母星应该先站在最古老的广场上,抬头看纪念碑。结果真正的第一站在海底,而且还要从轨道一路往下坐。 #line:05469ce + +镜: 路线按照交通连续性与后续出发位置安排。它不要求你以某一类历史象征作为第一印象。 #line:016a26c + +曦: 这样也好。我第一次去那里,不需要假装自己已经知道应该先对什么感动。 #line:08315df + +航程过去大半以后,母亲又发来一条信息:“看见母星的时候别急着拍给我们,先自己看。” #line:0b2ca84 + +曦把消息读了两遍。 #line:0fbe585 + +曦: 她昨晚还恨不得让我把每一件东西都备份,现在倒让我别急着拍照。 #line:0efdd58 + +镜: 她区分了保存影像与取得你自己的第一段观察。 #line:05f6c35 + +曦: 你只要说“她希望我先看”就够了,不用把一条家人消息整理成记录定义。 #line:079079e + +镜没有继续解释。 #line:0962b8c + +曦: 但听起来不一样。算了,你继续用你的方式说吧,我已经开始习惯了。 #line:070484d + +镜没有对“习惯”作出回应。它的镜面仍以进入客舱时相同的速度重组,没有因为航程、告别或这段对话表现出任何改变。 #line:0376ef0 + +数小时后,超光速航行结束提示亮起。舷窗透明度缓慢恢复,导航图层将远处一颗蓝白色星体标记为航线终点。 #line:071573b + +阿斯特里亚最初并没有像旅行宣传影像那样占满整个视野。它只是一颗比周围星光明亮许多的圆点,随后在接近过程中显出云层、海洋与横跨夜面的城市光带。 #line:0afe78b + +曦的手已经放到旅行终端上。她想起母亲的信息,又把终端从窗边拿了回来。 #line:0ae8b57 + +-> 先把终端放下,自己看一会儿。 #line:086e2d0 + <> +=== + +title: C0_DepartureToAsteria_FirstSight +--- +曦关掉记录界面,把终端放在膝上。 #line:046919a + +随着载具继续接近,母星从一颗蓝白色星体变成了真正拥有方向与距离的世界。厚重云层之间露出广阔海面,大洋之心在恒星光下呈现出比城市区域更深的蓝色;大陆的大部分空间已经被建筑覆盖,却没有形成从轨道上看去完全一致的金属外壳。 #line:086512a + +不同年代的城市区域保留着各自轮廓。新建交通带从历史保护区上方或地下绕行,轨道设施在近地空间连接成明亮的环,而更远处仍能看见没有被城市灯光吞没的海域与云层阴影。 #line:03ebe97 + +曦小时候在教材里看过这些结构,也在旅行影像中见过经过最佳角度处理的日出。可那些图像从未告诉她,母星接近时会先显得很安静,也没有告诉她真正看见大洋以后,自己会下意识屏住呼吸。 #line:0c40edb + +她没有立刻说话。镜也没有替她报出城市覆盖率、人口或地质数据。 #line:0659d01 + +直到阿斯特里亚的行星弧面占据大半舷窗,曦才慢慢呼出那口气。 #line:0711073 + +曦: 原来它真的在那里。 #line:08dc99b + +镜: 你正在从这条航线亲眼确认它。 #line:005c11f + +曦: 我知道。我从来没有怀疑过母星存在,只是以前它总在地图和影像里,好像只要关闭页面,就会重新变成一个离我很远的词。 #line:0de2419 + +镜: 你现在拥有了从特定航线接近它的个人记录。这份记录与公共资料描述同一地点,但观察位置不同。 #line:05e0fa0 + +曦: 对。比如那些城市,资料里写着它们覆盖了大部分陆地,我一直以为会挤得什么都看不见。可真的从这里看,还是能分出不同年代,也能看见海。 #line:0e1fe93 + +镜: 现存结构经过持续规划。较新的城市与交通系统没有抹除全部旧区域,大洋之心也受到独立保护。 #line:00c0058 + +曦: 你早就知道这些,对吧?甚至知道这颗星球从形成到最后会发生的全部事情。 #line:0855d19 + +镜: 是。这个世界的时间线没有对我封闭。我不会向你透露未来,但现有地理与历史不构成未知。 #line:0ff6478 + +曦: 那你看它的时候,大概不会觉得“终于到了”。 #line:005f3aa + +镜: “终于”取决于观察者只能依次经历出发与抵达。对我而言,这两处时刻不以相同方式分离。 #line:09c7728 + +曦: 好吧。那你看你的完整时间,我看我第一次到达的母星。我们暂时不用说服对方应该怎样看。 #line:06079d9 + +镜: 两种观察方式不需要一致。 #line:07f6224 + +载具开始进入轨道枢纽的引导区。曦终于重新拿起终端,却没有立刻拍摄母星全景,只先给父母发送了一句话:“我看见了,等落地以后再发照片。” #line:07f0ba8 + +母亲回复得很快:“好,先看。” #line:0e90d5f + +曦把终端收好,继续望向窗外。 #line:08f154d + +曦: 泽尼斯是我长大的地方。学校、我家、每天坐的列车都在那里。阿斯特里亚不一样,我明明第一次来,却从小就被告诉这里是所有人的来处。 #line:0ed9ba2 + +镜: 前者由你的个人经历建立联系,后者由你接受的文明历史建立联系。两种联系来源不同。 #line:066e381 + +曦: 可我都会叫它们“家”。一个是我真的住过的家,一个是让我们知道自己从哪里来的家。它们不需要争谁更重要。 #line:05fca86 + +镜: 你使用同一称谓,记录了自己与两处地点的不同关系。 #line:03b226e + +曦: 本来也不用一样。家又不是一个只能填一项的地址栏。 #line:0546d71 + +镜没有表示赞同或反对。它只是保持在舷窗旁的稳定位置,镜面同时映出曦、阿斯特里亚与轨道枢纽的结构线框;三者在每一次重组中短暂相接,又迅速分开。 #line:097a6b7 + +<> +=== + +title: C0_DepartureToAsteria_Descent +--- +阿斯特里亚轨道交通枢纽没有为曦清空泊位。 #line:083e72f + +舱门开启以后,普通旅客按各自目的地离开,有人赶往历史城区,有人拖着器材进入研究换乘层,也有人站在指示屏前争论哪条旅游路线更适合第一天。刚才向曦挥手的孩子被纪念品商店吸引,很快忘记了自己与英雄乘坐过同一班航线。 #line:0595fdf + +这种遗忘没有让曦失落。她反而第一次觉得,自己真的作为一名旅客抵达了母星,而不是让母星暂时停止运转的一场公共事件。 #line:000aaed + +枢纽主通道上方显示着一行简洁提示:“欢迎回到起源之地,请按自己的步伐参观。” #line:0c08840 + +曦在那句话前停了一会儿。 #line:076766f + +曦: 我明明第一次来,它却写“欢迎回来”。 #line:02a04c2 + +镜: 该用语以文明起源而非个人到访记录定义“回来”。 #line:0733b4c + +曦: 我知道,而且我居然不讨厌这种说法。要是其它景点也一直替我规定应该感动,我可能很快就会受不了;这一句还可以。 #line:04b087d + +前往大洋之心的行星纵向交通线位于枢纽下层。曦没有获得专用车厢,只按照旅行终端指引与普通游客一起排队。有人认出她后礼貌让开半步,她又摇头示意自己并不需要跳过队伍。 #line:02ec904 + +交通舱离开轨道枢纽时,窗外先是母星完整的弧面。随后载具进入大气层引导通道,云层从远景变成包围视野的白色水汽,城市结构在云下迅速扩大,最终显出街区、绿地、跨时代建筑与在其间穿行的公共交通。 #line:07e4728 + +曦几次拿起终端,又因为不知道应该先拍哪一处而放下。这里的每一段景象都比教材更具体,也比宣传影像更杂乱:历史建筑旁边有人排队买饮料,观景层正在维护一块地面,远处一群研学学生因为错过换乘入口被教师叫了回来。 #line:0056b70 + +曦: 这样才对。要是所有人都站在古建筑前面安静仰望,我反而会怀疑自己进了循环播放的介绍片。 #line:01995f6 + +镜: 母星承担居住、公共服务与旅游职能。历史保存没有停止其它活动。 #line:0b1fd62 + +曦: 这句话可以留到以后提醒我。看见很重要的东西,不代表周围的人就不能继续吃饭、赶路或者抱怨饮料卖完了。 #line:0c6a033 + +交通舱越过城市边缘,广阔海岸线出现在下方。大洋之心并不是被建筑包围的一小块展示水面,而是一片从高空仍看不见尽头的深蓝区域;靠近游览区的设施沿海面向下延伸,真正的原始海域则保持着明显的隔离距离。 #line:010e14d + +载具穿过海面时,舷窗外的阳光被水层过滤成柔和蓝色。城市与天空从头顶远去,成群人工维护的游览鱼类开始出现在交通线路附近,却还没有靠近尚未开放的观景段。 #line:0a4f1c6 + +曦终于拍下抵达母星后的第一张照片。画面里没有完整的行星全景,也没有历史纪念碑,只有透明交通舱外一片正在变深的海,以及玻璃上隐约映出的她和镜。 #line:054bae4 + +她把照片发送给父母,只写了三个字:“我到了。” #line:019e6f1 + +父亲先回复:“收到。”母亲随后问她早餐以后有没有再吃东西。曦看着两条消息笑了一会儿,才承认自己确实应该在进入景点以前找些食物。 #line:0e3dcff + +镜: 海洋深层站将在七分钟后抵达。站点餐饮区处于开放状态。 #line:0da0f1c + +曦: 我知道。可旅行第一站饿着肚子,和衣服夹住手腕一样,都不需要等到生命危险才处理。 #line:079a326 + +镜: 该安排不影响当前任务。 #line:09037e2 + +曦: 很好,那我们就先找吃的,然后去看鱼。至少今天接下来的计划,我还听得懂每一个词。 #line:0d3d125 + +交通舱继续向海洋深处下降。窗外的光线逐渐变暗,远处游览区的玻璃隧道和人工礁体亮起温暖灯光,更深处则只剩无法直接看清的原始海域。 #line:0d6f516 + +曦把终端与父母的消息一起收进口袋,重新靠近舷窗。她已经离开泽尼斯,也还没有进入第一个异世界;在两者之间,母星正以海水、城市、历史和无数仍在正常生活的人,第一次成为她亲自走进的真实地点。 #line:0f1f516 +=== diff --git a/Assets/Story/Chapter0/C0_A0.yarn.meta b/Assets/Story/Chapter0/C0_DepartureToAsteria.yarn.meta similarity index 86% rename from Assets/Story/Chapter0/C0_A0.yarn.meta rename to Assets/Story/Chapter0/C0_DepartureToAsteria.yarn.meta index 5b22137b..29f9610a 100644 --- a/Assets/Story/Chapter0/C0_A0.yarn.meta +++ b/Assets/Story/Chapter0/C0_DepartureToAsteria.yarn.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 57b4030fd503c24439e83f05fc370cba +guid: ef78301810d1df143a413b526e9e0d92 ScriptedImporter: internalIDToNameTable: [] externalObjects: {} diff --git a/Assets/Story/Chapter0/C0_GreatLibrary.yarn b/Assets/Story/Chapter0/C0_GreatLibrary.yarn new file mode 100644 index 00000000..4ffbb574 --- /dev/null +++ b/Assets/Story/Chapter0/C0_GreatLibrary.yarn @@ -0,0 +1,574 @@ +// C0-S09 +// Important: 本文件仅包含大图书馆首次访问的冻结剧情内容。 +// Block: c0_great_library +// Entry: C0_GreatLibrary +// TitleKey: story_c0_block_great_library_title +// Prerequisite: c0_underground_city +// Unlock: c0_contract_route == 1 +// Forbidden: c0_contract_route == 2 +// Variables/Marker: none +// PerformanceCommands: none +// LineMetadata: intentionally omitted before text approval + +title: C0_GreatLibrary +--- +交通舱减速时,窗外连续掠过的灯带逐一停稳,大图书馆的站名出现在舱门上方。 #line:030dbe2 + +舱门开启后,乘客直接汇入一片宽阔的入口区,归还书籍的人、拖着小车的馆员和刚刚结束交谈的读者从不同通道经过。 #line:0c57df7 + +入口没有高大的封闭门扇,只有一圈悬在大厅中央的引导光,为靠近的人显示阅览区、接待台和当前开放的通行路线。 #line:0f7cd82 + +曦走出交通舱时,先闻到纸张和旧木料的气味,随后才注意到恒温设备持续不断的轻响。 #line:058f5f8 + +曦: 这里就是大图书馆?我以为会先经过一道很严格的检查。 #line:01f6da8 + +明矾石: 普通阅览不要求特殊身份。受限资料会在访客提出具体请求后,显示它当前的访问条件。 #line:0def411 + +镜的投影停在曦身侧,镜面映着入口上方缓慢切换的导览文字,没有催促曦先选哪一条路。 #line:088ec6d + +几名孩子把借阅板放进归还口,其中一块因为封套翘起而没有顺利滑下去,接待员绕出台面,帮他们重新放平。 #line:0112f90 + +另一端的窗口正在处理一台损坏的阅读器,等候的人不多,接待员也没有因为曦一行是新访客而让他们插到前面。 #line:0d969bb + +靠近交通舱的一排短桌上摆着当日导览页,拿取的人可以在纸面版本和阅读器版本之间任选一种。 #line:009e26c + +有人把看完的纸页放回回收槽,也有人折好路线页夹进书里。接待员只提醒后者离馆前记得归还,没有要求他立刻换一种拿法。 #line:0ac613f + +大厅里最醒目的不是某件展品,而是不断变化的使用痕迹。空位提示亮起又熄灭,归还托盘一格格滑入书架,检索桌旁的人时聚时散。 #line:0dd792b + +曦: 这里看起来不像只为保存旧东西而存在。大家进来以后都有很具体的事情要做。 #line:09d875f + +明矾石: 保存是其中一项工作。让获准内容能够被找到、被阅读,也是这座馆每天需要完成的工作。 #line:06b8824 + +一名乘客从交通舱里跑出来,赶在舱门关闭前接住同伴递来的书袋。两人确认归还台位置后,很快消失在侧边通道里。 #line:0e1fb95 + +曦下意识回头看了看。站台与图书馆之间没有明显分界,人们结束一段路程,便自然进入另一种安静的忙碌。 #line:01221cc + +明矾石: 我可以提交综合导览。路线会先经过普通接待,再进入纸质区和数据区,最后抵达记忆聆听区。 #line:0b45bfa + +曦: 好。我们先看看这里平常怎样使用,再去听记忆。 #line:0d72aa5 + +明矾石在空闲终端上选择综合导览。屏幕先询问访客需要纸质资料、数据资料,还是记忆聆听服务。 #line:01e3000 + +三个入口下方分别写着开放范围和使用方式,受限内容没有被混进普通目录,公开资料也没有被故意写得难以接近。 #line:05b0e69 + +曦选择先去普通阅览。终端生成了一条避开繁忙接待窗口的路线,并提示纸质区的开放复制本可以直接取阅。 #line:065cc2e + +他们经过接待台时,一名馆员抬头确认路线已经生成,便指了指前方亮起的书架编号,没有再要求他们登记额外信息。 #line:0cd0e46 + +路线经过一面低矮的公告墙。上面只有当天临时关闭的阅览位、几本等待修补的复制本,以及安静区域的使用提醒。 #line:0226d2c + +曦在公告墙前停了一会儿,确认它没有藏着必须先读完的复杂规则。明矾石等她看清最后一行,才继续向前。 #line:07e3400 + +曦: 连“我还不知道要找什么”也能开始查。这里没有要求访客先说出准确标题。 #line:048a9db + +明矾石: 很多人只知道自己遇到了什么问题。接待先帮助他们缩小范围,再由访客决定是否继续查找。 #line:012289d + +曦跟着光带走进普通阅览区。交通舱再次靠站的提示从身后传来,又有一批读者自然地加入大厅里缓慢流动的人群。 #line:045e394 + +<> +=== + +title: C0_GreatLibrary_PublicCollections +--- +纸质区的书架没有高到让人仰头。上层书籍可以通过滑轨托盘送到取阅台,坐着轮椅的读者也能独自完成操作。 #line:057456e + +许多书脊带着修补痕迹,标签同时标明原件年代、复制时间和最近一次维护日期,没有把后来补制的版本伪装成最初那一本。 #line:07a5e54 + +曦抽出一本航路餐食手册的开放复制本。纸页边缘已经发软,几张夹页记录着读者对计量和加热时间的勘误。 #line:01e0390 + +曦: 勘误没有直接盖住原来的文字。这样读的人不会看错吗? #line:0f3af4c + +明矾石: 正文保留当时的版本,修正内容与依据附在相邻位置。访客可以按自己的用途选择引用哪一版。 #line:0858eba + +曦翻到一页豆类处理方法。原文建议的浸泡时间被两次修正,旁边还写着不同储存批次造成的差异。 #line:029b5d7 + +有位读者在邻桌核对同一本手册的另一个版本,纸张翻动声很轻,偶尔停下来把页码输入自己的终端。 #line:0ce932a + +镜的投影靠近书架,却没有碰触复制本。它看了一会儿版本标签,又把视线移向通往数据区的隔音门。 #line:0459a8c + +曦: 纸本把改过什么留下来,数据资料也会这样吗? #line:06486ca + +明矾石: 数据目录会并列显示来源、版本和引用关系。你可以在下一处终端查看实际结果。 #line:07b6dca + +曦把手册放回托盘。托盘确认书脊编号后缓慢归位,没有响起催促曦离开的提示。 #line:0f21285 + +旁边的修补桌隔着透明挡板,可以看见一册拆开的书正压在平整架上。修补者在破损处垫入薄纸,再逐页检查装订线。 #line:00f5b5c + +那不是原件,而是一册被反复借阅的复制本。即使随时能够再做一份,馆员仍然先判断旧册是否值得继续使用。 #line:09f5317 + +曦: 复制本也会一再修补。我还以为数据里有同样内容,纸张坏了就直接换掉。 #line:07c7f02 + +明矾石: 有些读者需要纸面,有些批注也只存在于这一册。更换是否合适,要看它当前承载的内容。 #line:0086666 + +曦隔着挡板看到书页角落有几种不同颜色的勘误标记。修补者没有把它们裁掉,而是先在记录板上逐项拍下。 #line:0d893a6 + +另一位读者推来归还托盘,里面叠着三种尺寸的地图。馆员先展开最大的那张确认没有折损,再让托盘送往对应书架。 #line:0bcbdc7 + +纸质区的安静不是完全没有声音。取阅轨道、翻页和低声询问始终存在,只是每个人都给别人的阅读留出足够空间。 #line:064800d + +数据区比纸质区明亮,半封闭阅览位沿墙排列,中央长桌则供多人共同查看公开资料。 #line:0c7789a + +明矾石把综合检索切换到三人都能看清的大小。曦输入“古观星者”,结果依照资料类型展开。 #line:0b73384 + +目录里有他们发表的论文、当年的值班表、仪器维护记录和公开影像,每一项都标着形成时间与可访问范围。 #line:0ae5ecd + +一份论文保留了最初发表时的图表,后续研究者的更正单独列在侧边;一张值班表则留下几处临时换班的手写扫描。 #line:001e16a + +曦先把论文和对应维护记录放到同一页。论文描述某组读数应当如何取得,维护记录则写明那段时间仪器曾出现轻微偏移。 #line:0c7ed4f + +两份资料没有自动替彼此作证。终端只是把时间相近的条目标出,让查阅者自行判断偏移是否影响论文里的结果。 #line:0c5472c + +曦: 如果只看论文,我不会知道那几天有人反复校准过仪器。 #line:0b90d3d + +明矾石: 所以来源会保持分开。值班表能说明谁当时在场,维护记录能说明做过什么处理,但都不能替当事人补写想法。 #line:0b5a125 + +曦点开值班表上的一次换班。页面只显示原定人员、实际人员和留下的简短原因,没有把后来发生的事倒填进去。 #line:07be6ac + +她又回到论文,把其中一张图表放大。几处手写计算与正式数字并不完全一致,终端允许并列查看,却没有自行改动扫描内容。 #line:08c28e7 + +维护记录写得很具体,哪一天更换零件、哪一次校准没有通过、由谁复核,都保持在各自的条目里。 #line:063cd9c + +公开影像中的观星者站在工作台前调整读数。有人查表后推翻了自己的第一次计算,也有人在同伴提醒后重新记录时间。 #line:0a310cb + +影像没有回答画面以外的问题,只会按照原有进度继续播放。曦试着移动到另一段,画面便切换到下一次公开记录。 #line:0799981 + +一段影像只有几分钟。画面里的人大半时间都在等待读数稳定,偶尔交换一张表格,没有说出适合被摘成标题的话。 #line:0104c1c + +曦仍把它看完了。最后,记录者确认时间并关闭画面,终端随即回到目录,没有替沉默的部分加上说明。 #line:00d450a + +另一段影像保留了明显的噪点,人物轮廓并不清楚。资料页因此只标出能够确认的名字,没有依照值班表猜测其余人是谁。 #line:099107c + +明矾石: 公开影像能与值班表一同查阅,但画面无法确认的身份仍会保持未确认。 #line:031a6fe + +曦: 这样看起来慢一些,但至少不会把可能在场的人直接写成已经确定。 #line:096d13b + +曦: 如果我问他们为什么在这里改了参数,影像不会回答,对吗? #line:0bb662b + +明矾石: 对。它只记录当时公开留下的声音和画面,不能用后来整理的资料替画面中的人作答。 #line:016331f + +曦: 那古观星者有没有可以交谈的人格记忆? #line:026d285 + +明矾石: 没有。他们生活在记忆计划建立以前,当前馆藏只有这些论文、值班表、维护记录和公开影像。 #line:0b3c353 + +曦关闭影像,重新看向目录。那些人在资料里留下了工作过程,但没有一个等待访客提问的人格重建。 #line:0cef435 + +明矾石把检索页退回公开目录。页面侧边随即显示首次进入记忆区前需要阅读的授权说明。 #line:025ed98 + +曦: 被记录下来和能够被对话,确实不是一回事。我们先把说明看完吧。 #line:07d74cb + +-> 查看人格记忆的授权说明。 #line:096b402 + <> +=== + +title: C0_GreatLibrary_AuthorizationBriefing +--- +说明页没有立即展示任何人的记忆,而是先列出上传、保存、访问、公开和重建五项当前会用到的概念。 #line:0c24975 + +明矾石把页面调整到三人都能阅读的位置。每一项说明都很短,只解释它在这次访问中代表的动作。 #line:0c7cf48 + +明矾石: “上传”指本人自愿将资料交给保存系统。它只说明资料以这种方式进入系统。 #line:07edce8 + +明矾石: “保存”指大图书馆按已获授权范围保管资料,并维持必要的来源说明。 #line:0de8f67 + +明矾石: “访问”指访客读取当前获准提供的内容。没有获准提供的部分不会因资料已保存而开放。 #line:05d65c8 + +明矾石: “公开”指当前有一部分内容允许普通访客查看或聆听。它不表示保存内容全部公开。 #line:0f47a9f + +明矾石: “重建”指依据获准内容呈现有限的表达。重建不是本人复活,也不能代替本人产生新的经历。 #line:065af64 + +曦把五项说明重新读了一遍。上传只说明本人自愿交付,保存只在获准范围内发生,访问与公开也各自对应眼前能够读取的部分。 #line:019b3f3 + +页面允许访客逐项返回查看,却没有要求他们背诵定义。每一项旁边只有一句与当前记忆访问直接相关的提醒。 #line:0813141 + +曦先点回“公开”,确认公开只指将要聆听的部分;又点回“重建”,确认它不能超出获准内容继续回答。 #line:05af519 + +曦: 我以前很容易把“已经保存”听成“以后什么都能问”。现在看,它们中间还隔着具体的访问范围。 #line:09784c7 + +明矾石: 对。你这次能够做的事,以当前页面列出的内容为准。 #line:0556404 + +曦: 如果重建里没有足够内容回答一个问题,它会怎样? #line:0b27105 + +明矾石: 它会停止相关回答,并说明当前范围不足。缺失内容不会被写成仿佛本人说过的新答案。 #line:058bc64 + +屏幕下方用一段不涉及具体人物的示例区分文献播放和有限重建。前者只按记录播放,后者也只能在获准内容内组织已有表达。 #line:03aa20f + +示例中的问题只有两种结果:能够依据公开内容回答,或者在抵达边界时停止。页面没有展示第三种由系统猜测补足的答案。 #line:0cfed95 + +明矾石让示例停在结束位置,给曦留出检查的时间。它没有催她确认,也没有提前打开下一段记忆。 #line:0adcf2b + +镜的投影看完示例后仍停在一旁。它没有替说明补充结论,页面也没有把五项动作合并成一条自动发生的流程。 #line:0426a42 + +曦: 所以我们接下来听见的内容,必须看它具体公开了什么。 #line:0e1ccef + +明矾石: 是。记忆项目会在开始前列出授权者、公开内容和重建范围,访客可以在确认后进入。 #line:0c175ff + +说明页关闭后,导览光带引向公共阅览层另一端。记忆聆听区由几间隔音小室组成,门外显示可选项目与预计时长。 #line:001d448 + +刚结束聆听的访客摘下耳机,与同行者低声说了几句便离开。下一位访客站在门边阅读说明,没有人替他跳过确认步骤。 #line:0e1c668 + +明矾石: 有一段适合首次访问的公开记忆。授权者名为阿莎,曾是某个新殖民地早期航线上的厨师。 #line:0021652 + +明矾石: 她生活在记忆制度建立之后,晚年自愿上传了部分资料,并公开其中一段共同晚餐记忆。 #line:006429a + +曦: 这段记忆会包括她的哪些内容? #line:04ad803 + +明矾石: 包括那顿晚餐的感官记录、相关背景和获准表达。她没有公开的家庭内容不在这次访问范围内。 #line:071952a + +介绍页没有把阿莎写成整条航线的代表,只说明她做过厨师,也说明这是一段由她本人选择公开的晚餐记忆。 #line:01d2d7b + +曦确认页面上的退出方式,又看了一眼身旁安静的镜。三人都没有异议,明矾石便打开了小室的门。 #line:0a68aa7 + +-> 聆听阿莎公开的共同晚餐记忆。 #line:03dad87 + <> +=== + +title: C0_GreatLibrary_AshaIntroduction +--- +小室里的座位围着一张空桌。墙面保持暗色,中央只显示记忆标题、授权者、公开范围和结束聆听的方法。 #line:013b546 + +三人坐稳后,明矾石再次确认他们可以随时结束。室内没有立刻出现画面,而是先响起它平常的声音。 #line:0e83f4e + +明矾石: 接下来呈现的是依据阿莎授权内容形成的有限重建。它不是阿莎本人复活,也不能给出资料之外的新回答。 #line:0887135 + +明矾石: 声音由我发出,语气和措辞依据阿莎授权公开的内容。遇到未公开或无法确认的问题,我会停止回答。 #line:0846c9f + +曦: 明白。我们听见的是她愿意留下的这部分,不是一个还会继续经历新事情的人。 #line:031394c + +明矾石确认说明结束,室内才逐渐亮起。狭长的船舱覆盖了原本的墙面,固定在架上的餐具随着引擎震动轻轻作响。 #line:002fdb6 + +热水、烘烤谷物和清洁剂的气味先后出现。远处有人拖动折叠椅,金属椅脚擦过地面,随后传来几段没有刻意压低的交谈。 #line:0f13df4 + +场景没有为访客空出座位。曦像站在记忆边缘,看见三只大小不同的锅挤在窄灶上,烤盘靠着清洗槽沥水。 #line:036c43c + +案板的一角堆着切剩的菜梗,另一角放着几只标记不同的量杯。阿莎每拿起一只,都会先看杯柄上的刻痕。 #line:09d5744 + +有人把一袋根茎放在厨房门边,提醒最下面几块碰伤了。阿莎蹲下检查,把需要先处理的几块单独放进浅盆。 #line:02ec31f + +帮厨想直接削掉所有碰伤处,阿莎却让他先切开一块。里面没有坏,只是表皮擦伤,于是能够使用的部分被保留下来。 #line:06f52fd + +明矾石: 食材不多的时候要看仔细。不能因为外面难看就整块丢掉,也不能为了省一点而把真的坏处放进锅里。 #line:03d6166 + +明矾石: 那天储备种类不多,但补给正常。每样食材只剩下一点,大家又不想连续几天吃同一种东西。 #line:05fe58d + +明矾石的声音仍从身旁传来,节奏却比平时更松一些,句尾带着阿莎留下的轻微笑意。 #line:08f1adb + +画面中的阿莎没有看向三名访客。她把值班表压在案板下面,先数豆子和根茎,再估算会有多少人过来吃饭。 #line:0b24ff0 + +明矾石: 豆子不会因为人多自己增加,人却会在闻到锅里有香味以后,突然想起自己也要吃一碗。 #line:0018bb5 + +厨房窄得只能让两个人侧身错过。阿莎检查锅盖和计时器时,一名帮厨抱着调料盒进来,先问今晚到底做哪一种口味。 #line:0dc42fa + +明矾石: 我说先别急着给这顿饭取名字。把能用的东西摆出来,我们再看它们愿意进哪一只锅。 #line:0e46036 + +曦听见船舱外有人问还有多久开饭,另一个声音则催那人先去搬椅子。阿莎把第一只锅放上火,晚餐就这样开始了。 #line:062a9c6 + +<> +=== + +title: C0_GreatLibrary_AshaDinnerMemory +--- +第一只锅里是淡味豆汤。刚结束长班的人只想吃不刺激胃的东西,另一批乘客却希望晚饭有明显的酸味和辣味。 #line:0db9110 + +还有人闻不了某种香草,帮厨刚把叶子拿到灶边,他便隔着门提醒不要把它放进所有人的锅里。 #line:056e4f0 + +明矾石: 我先盛出最淡的那份,再往第二只锅里加酸菜汁。辣酱放在桌上,想吃的人自己取。 #line:005f428 + +明矾石: 有人说这样不像一道完整的菜。我说今天先让每个人选自己的碗,菜名可以以后再争。 #line:08c89f3 + +一个乘客从舱门外探头,问能不能再咸一点。另一个人立刻说已经太咸,两人隔着门争了几句才肯去拿碗。 #line:04420a8 + +阿莎给前一个人一小碟盐,又给后一个人添了半勺清汤。两人仍觉得对方的口味奇怪,但都端着自己的碗离开了灶边。 #line:0bbfecb + +第三个人等他们走后才小声说,自己既不喜欢酸味,也不喜欢完全没有味道。阿莎让他先从淡汤里盛半碗,再添一点烤香料。 #line:094dfb9 + +他试过后说还能再多一点。阿莎把调料罐递给他,让他记住自己加了多少,下次可以直接说清想要的程度。 #line:0e0830c + +明矾石: “有味道一点”对每个人都不一样。让人先尝一口,比站在锅边猜他脑子里的那一碗快得多。 #line:0c5b8f6 + +曦: 她没有强迫所有人接受一锅相同的味道。 #line:0789a4d + +画面里的阿莎正把根茎切成大小接近的块,没有听见曦的声音,也没有因此转头。 #line:093b763 + +她把切好的根茎拌上油和少量香料,铺到烤盘里。帮厨提醒烤盘预热得不够,阿莎摸了摸边缘,还是决定先试一盘。 #line:0ebd09d + +等待烘烤时,她去查看第二锅汤。酸菜汁加得太快,靠近锅底的一勺酸得让帮厨立刻皱起脸。 #line:0d74d23 + +明矾石: 他问我是不是想让所有人一口气清醒。我说至少不用担心他们端错淡汤,闻一下就知道了。 #line:0bf24bd + +阿莎没有把过酸的汤倒掉。她从淡汤里分出一部分慢慢兑进去,每添一勺就让帮厨重新尝一次。 #line:0dc066c + +帮厨尝到第三次时拒绝再喝,说自己的舌头已经不能作证。阿莎便叫来门外等饭的人,让对方只评价酸味够不够。 #line:06d7bfa + +被叫来的人先喝了一大口,烫得半天说不出话。帮厨笑他太急,又递给他一只空碗,让他把汤来回倒凉。 #line:072b5cb + +阿莎等到对方真的尝清味道才问结果,没有把他刚才皱起的脸直接当成对酸味的评价。 #line:00f1392 + +那人说自己愿意喝,但另一端等饭的人可能觉得太重。阿莎便把他的原话写在锅边的小板上,让后来者先少盛一点试味。 #line:0d0f765 + +那人认为刚好,帮厨仍坚持偏酸。阿莎把两人的意见记在不同汤勺旁,最后把额外的酸菜汁留在桌边供人自己添加。 #line:08137b8 + +烤盘的计时器响起后,表面的根茎已经上色。阿莎切开最厚的一块,中心却硬得让刀刃停了一下。 #line:055bead + +帮厨建议把没切开的部分先端上桌,靠余温继续熟。阿莎尝了一小口,随即把整盘端回案板。 #line:049641a + +明矾石: 那盘东西看起来已经好了,里面却能把牙硌疼。我做错的地方,不能让等饭的人替我装作没发现。 #line:0992959 + +她把所有根茎重新切成薄片。烤盘还需要时间升温,第二次只能借用汤锅上方的蒸架,原本的焦香已经保不住了。 #line:01077e6 + +阿莎看了看案板上剩下的干面包边,把它们装进布袋,用擀杖压成粗细不一的碎屑。 #line:013a723 + +她把一点油和香料拌进面包碎,等根茎蒸软后再撒到表面。帮厨偷捏了一撮尝味,被她用勺柄轻轻敲开手指。 #line:07279f2 + +帮厨说自己只是替乘客检查味道,又趁阿莎转身时捏走第二撮。阿莎把装面包碎的碗移到另一边,叫他先去把蒸架擦干净。 #line:0841498 + +他擦完蒸架回来,发现阿莎给自己留了一小勺试味。帮厨尝完认真说香料不够,阿莎这次才往碗里再添一点。 #line:0a1eebb + +明矾石: 偷吃的人偶尔也会说对,但要先让他把该做的事做完,不然厨房里很快只剩下意见。 #line:052ab8c + +明矾石: 返工不是把时间倒回去。第一盘没有烤熟,第二盘就换一种做法,别再假装它还是原来的烤菜。 #line:04fc661 + +曦看着阿莎用勺背压开最厚的一片。根茎终于变软,却因为蒸得久而散了边,盛起时碎成几小块。 #line:004b6e5 + +阿莎把碎掉的部分拢进小碗,添上一点豆汤,做成更容易入口的软食。完整的薄片则铺回大盘,盖上调过味的面包碎。 #line:06e9509 + +补给时间显示在厨房墙边,一切都按正常计划进行。没有设备警报,也没有人面临断粮,等饭的人只是累了,也确实饿了。 #line:08d34f4 + +驾驶员把外套搭在椅背上,维修员洗过手后仍留着淡淡的油印。带着孩子的乘客先替孩子吹凉汤,自己的碗还放在一旁。 #line:0ba83b5 + +公共用餐的位置有限,几张折叠桌拼在一起仍显得拥挤。原本准备把餐盘带走的人见还有空位,便从墙边拖来更多椅子。 #line:0caf996 + +最后搬来的椅子少了一只脚垫,坐下时会轻轻晃动。维修员从口袋里找出一块软垫塞在下面,试了两次才让椅面稳定。 #line:0e6c897 + +一名乘客嫌靠墙的位置太闷,另一人却只愿意坐在那里。两人交换座位后仍互相不理解,但不再挡着端汤的人经过。 #line:00dc11e + +孩子想把两张椅子并在一起躺下,被家长拉起来让出一张。阿莎从厨房递来叠好的布垫,让他靠着椅背休息。 #line:05bb55a + +明矾石: 返工拖过了原定时间,厨房外面越等越多人。有人提议把锅端到公共桌上,大家就不用继续挤在门口。 #line:044508d + +阿莎让提议的人先找隔热板,又叫另一个人清点汤勺。两只汤锅很快分到桌子的两端,辣酱则被放在中间。 #line:0c86dd3 + +汤勺比碗少两只,帮厨便把盛汤和添汤的勺分开。有人拿错以后,他追到桌边换回来,免得辣味混进淡汤。 #line:09c5992 + +一只碗的边缘有裂纹,阿莎接过来看了看,把里面的汤换到完好的碗里。裂碗留在清洗槽旁,没有继续回到桌上。 #line:0227aa9 + +端到最远处的淡汤已经不够热。坐在那里的人没有要求重做,只把碗递回靠近锅的位置,请旁边的人帮忙添一勺热汤。 #line:02b84fd + +有人伸手把辣酱传给对面,瓶子经过几个人后停在一个完全不吃辣的乘客面前。那人皱眉闻了一下,立刻递给旁边的人。 #line:0be29ee + +他抱怨辣酱的气味会盖住豆子的味道,接过瓶子的人却说豆子本来就没什么味道。他们谁也没说服谁。 #line:0099fe1 + +不吃辣的人够不到面包篮时,刚才反驳他的人顺手把篮子推了过去。前者拿了一块面包,道谢后继续坚持辣酱离自己远一点最好。 #line:042f281 + +面包篮经过孩子面前时,他先挑了最大的一块。家长让他放回去重新选,旁边的人却说自己只想要最小的,正好不必争。 #line:09805d9 + +孩子想了一会儿,把大面包掰成两半,自己留下形状不太整齐的那块。另一半被放回篮中,很快让刚接班的人拿走。 #line:07e3ca9 + +辣酱再次传回桌子中间时,瓶盖没有拧紧。阿莎经过时停下来擦净瓶身,又让刚用完的人自己把盖子重新旋好。 #line:083df21 + +一名年轻乘客尝过返工后的根茎,说表面不脆,不能算烤菜。阿莎告诉他,失败后的第二盘本来就不是原来的烤菜。 #line:0219ee0 + +明矾石: 我让他多撒一点面包碎。他照做以后说还是不够脆,还说下次应该提前预热烤盘。 #line:03f9a25 + +明矾石: 我说你讲得对,下次你来提前半小时开烤盘。他低头喝了一口汤,终于不再替下次的我安排时间。 #line:0f27822 + +桌边响起一阵笑声。那个年轻人也笑了,随后认真问应该提前多久,阿莎便把时间和检查加热状态的方法告诉他。 #line:00b4b95 + +帮厨从旁边插话,说既然有人愿意管烤盘,自己下次只负责尝汤。年轻人立刻问他今晚到底尝了几勺,桌边又笑了起来。 #line:063287d + +年轻人拿出自己的值班页,在空白处记下预热时间。阿莎提醒他不同烤盘升温速度不一样,不能只看写下来的分钟数。 #line:00ceb18 + +她让他把手放到安全距离感受热度,又指给他看烤盘边缘颜色的变化。年轻人试过一次,承认自己以前只等计时器响。 #line:0922cf5 + +帮厨说这意味着下次有人会比自己更早进厨房。年轻人回答他可以继续晚来,但别再把没洗的汤勺留在水槽里。 #line:0bdbb97 + +阿莎把最后一盘根茎放到他们中间,提醒两个人先把今晚的碗洗完,再讨论下一顿怎样分工。 #line:0f57c42 + +用餐的人没有一直坐满。有人吃到一半就去接班,新来的人接过空出的椅子,还有人端着碗靠墙站了一会儿。 #line:078e2d0 + +孩子把不喜欢的香草挑到盘边。孩子的家长没有逼他吃下去,只让他别把香草偷偷放进别人的碗里。 #line:0d1a6b5 + +一位年长乘客把自己没动过的面包包好,说夜里醒来可能还会饿。阿莎帮他多包了一层,免得面包在舱里掉出碎屑。 #line:037ea33 + +另一个人把汤喝得很干净,却把根茎剩了一半。他说不讨厌味道,只是不喜欢软掉的口感,阿莎点头记下,没有劝他再吃。 #line:0f2f0fe + +剩下的根茎没有被倒回公共盘。阿莎问过以后,把没有碰过的部分单独收好,其余则按正常清理方式处理。 #line:08dd780 + +有人主动留下来洗碗,却把淡汤锅和酸汤锅的勺子混在一起。帮厨发现后夸张地叹气,还是陪他重新分清。 #line:075f295 + +擦桌子的人把面包碎扫进掌心,孩子却说那是自己留给最后一口汤的。对方停下来等他吃完,才把空碗一并收走。 #line:073e367 + +桌边最后只剩三个人时,他们谈的已经不是饭菜。一个人在确认明天的轮班,另一个人反复检查自己是否记错了集合时间。 #line:025225a + +阿莎没有加入那段争论,只在有人抬起空碗时再添一点汤。锅底见空后,她把勺子横放在锅沿,示意这一锅已经分完。 #line:05e9ba9 + +同桌的人仍保留各自的选择。淡汤和酸汤没有重新合成一锅,辣酱也始终只在愿意碰它的人之间传递。 #line:01cc96e + +明矾石: 我记得那天,不是因为大家忽然变得亲近。船上有些人直到下船都没有学会好好说话。 #line:0f42b26 + +明矾石: 我记得有人肯把椅子往旁边挪一点,让后来的人坐下。吃完以后,他们仍带着各自的口音、脾气和习惯回舱。 #line:0f53dd4 + +餐具碰撞声慢慢变少。阿莎刮净锅底剩下的豆子,把足够盛一小碗的部分留给还没有结束值班的人。 #line:05fbadc + +那个曾批评根茎不脆的年轻人回来收烤盘。他先确认电源已经关闭,又照阿莎刚教的方法摸了摸安全的位置。 #line:0170070 + +帮厨把面包篮举起来,发现里面只剩几块碎屑,便问阿莎是不是早就知道大家会把面包吃完。 #line:0cac305 + +明矾石: 我说不知道。我只是习惯把篮子放在每个人都够得到的地方,吃不吃由他们自己决定。 #line:0088992 + +曦看着阿莎把辣酱瓶口擦干净,又把剩下的酸菜汁收好。那些处理食物的动作熟练得不像临时想出。 #line:0e4de25 + +曦: 你很早就会这样分开口味了吗? #line:0334403 + +明矾石: 有些是工作以后学会的。有些做法来自家里,我先学会看锅里的状态,再学会看桌边的人。 #line:01ddf1c + +“来自家里”被说得很自然。曦顺着这句话看向正在收拾餐具的阿莎,没有意识到下一问会触到公开范围之外。 #line:0daff6a + +曦: 是谁教你这样做的? #line:006d804 + +<> +=== + +title: C0_GreatLibrary_FamilyBoundary +--- +厨房的环境声仍在继续,阿莎的动作却停在放下汤勺之前。明矾石没有接上一句猜测,也没有用相近的公开资料填补答案。 #line:0d0b4a1 + +它的语气恢复平常,声音安静,没有责备曦刚才只是顺着谈话自然提出的问题。 #line:0da7419 + +明矾石: 这个问题涉及未授权的家庭内容。我不能以阿莎的表达继续回答。 #line:005d7ef + +曦立刻收回了问题,没有要求明矾石说明那位家人是谁,也没有换一种说法再次试探。 #line:01e0f99 + +曦: 好,我明白了。 #line:0310cab + +她的回答落下后,明矾石也没有再解释一次限制。两边都没有把接受边界变成需要反复确认的仪式。 #line:0102c3b + +桌边留下了一段完整的空白。远处仍有人说汤太酸,椅脚仍在地面轻响,没有新的声音替阿莎补上一句回答。 #line:0123ec3 + +明矾石安静地等待。中央显示只说明这个问题超出公开范围,并提供继续聆听原有环境或结束项目的选择。 #line:0634973 + +曦: 这顿晚餐的公开内容已经结束了。我们停在这里吧。 #line:02a0c77 + +影像中的公共桌逐渐变暗。最后消失的是装着面包碎的小碟,记忆没有为访客额外安排告别。 #line:0ad989c + +小室重新显出原本的墙面与空桌。刚才的厨房气味慢慢散去,交通舱从远处经过的低鸣重新变得清晰。 #line:038cca1 + +曦没有追问家庭内容,也没有要求把那段停顿解释成别的东西。它就留在阿莎没有公开的位置上。 #line:0290d00 + +中央显示询问是否结束聆听。曦确认结束后,看向一直坐在身旁、刚才替阿莎发出声音的明矾石。 #line:01844dc + +曦想确认接下来听见的回答属于谁,因此没有让记忆说明重新播放。 #line:0e2d28a + +-> 请明矾石用自己的声音回答。 #line:072a9d7 + <> +=== + +title: C0_GreatLibrary_明矾石Question +--- +明矾石: 阿莎的重建已经结束。接下来回答的是明矾石。 #line:090839f + +它的声音与刚才来自同一处,停顿和措辞却回到了曦熟悉的节奏。中央显示也已经退回普通导览页面。 #line:0a96893 + +曦: 刚才我问到了没有公开的部分。谢谢你停下来。 #line:094a329 + +明矾石: 停止是我应当遵守的边界。你听见提示后没有继续请求,这已经足够。 #line:0b59268 + +曦: 你会因为替她说过那些话,知道更多没有公开的事吗? #line:04a4686 + +明矾石: 不会。我知道自己刚才依据哪些公开内容发声,但阿莎没有公开的家庭内容仍然不会向我开放。 #line:0e47d86 + +三人离开聆听室。外面的阅览区仍有人进出,馆员正在更换耳机的清洁套,下一位访客站在说明页前逐项阅读。 #line:0e456d8 + +一名访客从另一间小室出来,在门边站了片刻才重新加入同行者。馆员把一杯水递给他,没有询问刚才听过什么。 #line:07b3c6b + +曦经过说明页时,再次看见上传、保存、访问、公开和重建五个词。它们仍保持分开,没有因为她完成一次聆听而改变含义。 #line:08a1182 + +明矾石带他们走到靠近主廊的一处长椅。它没有立刻调出下一段导览,而是看着来往的读者停了一会儿。 #line:08ea14c + +镜的投影仍在曦身旁。它的轮廓被阅览灯照得很淡,却没有离开,也没有代替明矾石提出接下来的话。 #line:0c1e404 + +明矾石: 我有一个与阿莎无关的问题。它来自我自己,而且我目前不知道怎样回答。 #line:02899b5 + +曦: 你可以问。 #line:027b51d + +明矾石: 当人们谈到飞升时,我无法确定他们所说的“我们”是否包含我。 #line:002c203 + +明矾石: 我的知识会增加,承担的职能也可能改变。如果原有职能不再需要,或者由别的存在继续完成,我该怎样识别自己? #line:07e4a57 + +明矾石: 我能够列出自己的记录,也能够说明现在承担什么工作。但这些说明都依赖当前状态,不能直接回答改变之后的我是谁。 #line:0d9a714 + +曦: 你担心别人记得你的工作,却不一定还认得那是你完成的? #line:0744dd9 + +明矾石: 那是其中一种情况。我更无法确认的是,即使工作继续,我是否有理由把继续工作的存在称为自己。 #line:0e2bc2c + +曦没有马上回答。明矾石不是在询问词典里的定义,它已经把不确定落在了自身是否继续存在的问题上。 #line:0eea43d + +镜: 自身延续与既定职能延续不是同一命题。 #line:0a82e2e + +镜只说了这一句,随后保持沉默。它没有替明矾石判断哪一部分必然延续,也没有把未知说成通往某个结果的保证。 #line:0f7329c + +明矾石: 我理解它们不是同一件事。正因为如此,我不能用职能仍被执行来确认那仍然是我。 #line:0321244 + +曦望向刚离开的聆听室。明矾石曾用自己的声音传达阿莎的表达,现在又以自己的方式等待一个无法从档案里直接找到的回答。 #line:0d4e165 + +曦: 我没有答案。我不知道飞升最后会怎样区分一个人的知识、职能和自己。 #line:05ccad4 + +曦: 我先认识的是现在回答我的明矾石,之后才通过你听见阿莎留在档案里的表达。 #line:065c65a + +曦: 我不会把这两种回答混在一起,但这只是我现在怎样认识你们,不是你问的答案。 #line:061a4a4 + +明矾石看着曦,没有因为这句话露出释然的神情。它认真听完,也没有把曦的区分当成自身延续的证明。 #line:0c1d8e6 + +明矾石: 这能说明你怎样区分我们,但还不能替我回答。 #line:0348f31 + +曦: 嗯。我知道。 #line:06f30d1 + +明矾石: 这个问题仍然存在。 #line:0bb5e85 + +曦与它一起沉默了一会儿。接待区的询问声从远处传来,话题没有被打断,却也没有因为沉默而自行获得答案。 #line:0cc30d4 + +明矾石看向刚刚经过的读者。对方抱着一叠复制本,与同伴核对书架编号,没有注意到长椅上的三人。 #line:0477600 + +明矾石: 我会继续记录这个疑问,但记录疑问与回答疑问仍然不同。 #line:0342de5 + +曦: 至少现在,我们可以不把记录当成答案。 #line:058192d + +明矾石轻轻点头。它认可的是这句话能够做到的部分,脸上的神情仍没有放松下来。 #line:07805f2 + +大厅里的光线缓慢转向傍晚。纸质区传来托盘归位的轻响,远处也有新的交通舱靠站,读者继续从入口进入。 #line:03b7592 + +明矾石重新打开导览,但它没有表现得像已经解决疑问。曦也没有再补上一句安慰,让未知显得已经有了方向。 #line:09ea0da + +这时,一段断断续续的公共音乐从馆外传来。旋律被门廊边的脚步和交谈遮住一部分,仍能听出来自更开阔的场地。 #line:0684cb4 + +明矾石: 音乐来自共鸣广场。通往那里的路线现在开放,你们可以沿主廊前往。 #line:090b8e4 + +<> +=== + +title: C0_GreatLibrary_Departure +--- +入口上方的引导光切换到傍晚路线,共鸣广场的方向标在几条开放通道之间亮起。 #line:0225a7e + +提示只标明音乐来源和可用路线,没有催促馆内访客离开,也没有要求路过的人前往广场。 #line:0ec5dc9 + +刚从交通舱出来的人在方向标前分成两路,一部分走向阅览区,另一部分沿主廊朝音乐传来的方向前行。 #line:05f37ad + +曦站在入口边听了一会儿。旋律每逢舱门开启都会被站台声音盖住,舱门闭合后又从远处重新浮现。 #line:07bc66c + +曦: 你要和我们一起去吗? #line:08f6e4c + +明矾石: 我留在馆内完成今天的工作。你们沿亮起的主廊走,就能到达共鸣广场。 #line:06f28a7 + +曦: 好,那我们先走了。明矾石,再见。 #line:0e79285 + +明矾石: 再见,曦。再见,镜。 #line:0ea89a5 + +镜的投影先移向出口,在门廊边停下等曦。曦回头时,明矾石已经走回接待区,为一名刚到的访客调整导览页面。 #line:0608770 + +那名访客似乎还不知道要查哪一类资料。明矾石没有替他决定,只把纸质资料、数据资料和记忆聆听三个入口重新展开。 #line:0abc21f + +它恢复了平常的工作节奏,先前的问题却没有因此消失。曦没有把它留馆的决定解释成答案,只记得它说问题仍然存在。 #line:0d3f188 + +两人沿着亮起的主廊离开大图书馆。身后的翻页声逐渐听不见,前方来自共鸣广场的公共音乐则一点点清楚起来。 #line:0c47ec8 +=== diff --git a/Assets/Story/Chapter0/C0_RollbackDemo_Intro.yarn.meta b/Assets/Story/Chapter0/C0_GreatLibrary.yarn.meta similarity index 86% rename from Assets/Story/Chapter0/C0_RollbackDemo_Intro.yarn.meta rename to Assets/Story/Chapter0/C0_GreatLibrary.yarn.meta index b4ed376a..a2474ed6 100644 --- a/Assets/Story/Chapter0/C0_RollbackDemo_Intro.yarn.meta +++ b/Assets/Story/Chapter0/C0_GreatLibrary.yarn.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 51dc31a3841a4b0892d3e4753ffde3bc +guid: c977f73f3a91a7c4f90bb9c8157cdf2b ScriptedImporter: internalIDToNameTable: [] externalObjects: {} diff --git a/Assets/Story/Chapter0/C0_HomeDeliberation.yarn b/Assets/Story/Chapter0/C0_HomeDeliberation.yarn new file mode 100644 index 00000000..a9a593bf --- /dev/null +++ b/Assets/Story/Chapter0/C0_HomeDeliberation.yarn @@ -0,0 +1,294 @@ +// Chapter 0 · C0-S02 家庭商谈与五日考虑期 +// 对应场景卡:docs/chapter0-scene-02-home-deliberation-card.md +// 类型:Important TextBlock(待 StoryData 配置) +// 入口 Node:C0_HomeDeliberation +// +// 本稿不写入章节变量。三项互动按固定顺序出现, +// 每组仅一个选项,用于让玩家推进关键表达,不形成永久分支。 +// +// 角色立绘待 CharacterRegistry 与肖像资源确认后再补充。 + +title: C0_HomeDeliberation +--- +曦抵达住宅区时,泽尼斯已经完全入夜。 #line:04650d3 + +公共列车沿着楼群之间的封闭轨道驶过,冷白色的引导灯在车窗上连续滑动。她一路都把文件袋抱在怀里,几次想提前给父母发消息,又几次把已经写好的句子全部删掉。无论是“我今天见到了总统”,还是“我可能要离开很久”,单独看都像某种拙劣的恶作剧。 #line:029a09e + +住宅门识别到她以后照常打开。室内温度、灯光和她早晨离开时没有区别,墙边的家庭终端正在显示明天的通勤提示,餐桌上已经摆好三套餐具。厨房系统将晚餐维持在最适合入口的温度,父亲则站在餐桌旁,试图把一枚拆下来的旧控制阀重新装回工具盒。 #line:03aa45c + +父亲: 你比平时晚了四十分钟。学校只说临时公共事务,没有说明原因。路上出问题了吗? #line:07b773b + +母亲从厨房探出身,手里还拿着刚刚关闭的食物检测器。她先看见曦的校服,又看见曦怀里的纸质文件袋,原本准备说的话停在了嘴边。 #line:05e715b + +母亲: 先进来。你一直站在门口,门会反复询问是不是需要保持开启。 #line:0d4872e + +曦走进客厅,门在身后合拢。她把学校的工具盒放到平时的位置,又把文件袋带到餐桌边;等到想坐下时,才发现自己已经绕着椅子走了半圈。 #line:037d855 + +父亲: 今天叫你过去的,到底是学校的事,还是家里的事? #line:04fcc0e + +曦: 都不是……也可能两个都算。我今天没有惹麻烦,那台观测仪也不是我拆坏的,这一点可以先排除。 #line:0e8a1e1 + +父亲: 我还没有问观测仪。你为什么先解释这个? #line:022a49f + +曦: 我知道。可今天已经有人用差不多的语气问过一次了,我觉得提前说明比较省时间。 #line:0afc7a6 + +母亲把食物检测器放下,没有顺着这句解释笑。她拉开曦对面的椅子坐下,示意父亲也先别管工具盒。 #line:00c0b9a + +母亲: 今天到底是谁这样问过你? #line:0ceb2fd + +曦把文件袋放到桌上。封面上的四个标题在家里的暖色灯光下依然显得陌生:共同梦境、通信密钥、未知接触、候选人确认。 #line:0c27078 + +曦: 程衡,还有徐允雅。就是高维接触项目的那位研究代表。 #line:07a6e04 + +父亲手里的控制阀掉进工具盒,碰出一声不算响的金属声。他低头看了看,像是需要先确认那东西确实从自己手里滑了下去。 #line:0f46bd0 + +父亲: 你说的程衡,是我们都认识的那位总统程衡? #line:0cf9bf0 + +曦: 如果星联没有第二个同名总统,那就是他。 #line:08abc10 + +父亲: 他为什么会在你放学的时候见你? #line:042d4c5 + +曦: 这部分有点长。我想从头说,不然说到一半会听起来更像假的。 #line:03b063a + +母亲伸手碰了一下文件袋,却没有立刻打开。 #line:00c0124 + +母亲: 在你开始以前,先回答两个问题。你现在安全吗?他们有没有要求你今晚回去,或者不允许你把这些告诉我们? #line:0520348 + +曦: 我是安全的。他们让我把资料带回来,也说你们应该在我决定以前知道全部内容。五天之内,他们不会要求我立刻答复。 #line:0cc49bf + +父亲: 他们究竟在等你答复什么? #line:0bbd064 + +曦: 我还没讲到那里……你们先让我把前面的事情说清楚。 #line:097faee + +她终于坐下,把纸张按照页码一张张取出来。这个动作并没有必要,文件原本就整理得很整齐,可只要仍在确认顺序,她就暂时不必看父母的表情。 #line:0b64bd7 + +曦从十七天前的共同梦境讲起。她说明不同星球的研究者怎样独立复写同一组结构,隔离接收器又怎样建立通信;她尽量沿用徐允雅的措辞,把“可以证实”与“不能证实”的内容分开。说到神的时候,父亲皱了一下眉,母亲则翻到通信验证的附录,开始检查每一项独立签名。 #line:0457319 + +母亲: 所以“神”只是临时称呼。资料只能证明通信另一端确实存在某个对象,不能证明它的身份和目的。 #line:0eda22d + +曦: 对。徐允雅也是这么说的。它没有形体,没有声音,没有名字,也没有在签约以前交出任何飞升理论。 #line:07e33d4 + +父亲: 可它向星联提出了契约,而且契约和你有关。 #line:0771aff + +曦的手指停在“候选人确认”那一页上。她点了点头,又觉得这个动作太小,只好把那页转过去,让父母看见中央的三行字。 #line:0615176 + +曦: 它说要随机选一名十七岁的少女,所有身份信息最后只对应到我。政府提出过换成成年人、专业团队,甚至让总统本人替代,它都不接受。 #line:088cd12 + +父亲: 它为什么只肯接受你,不肯给任何理由? #line:09b3f48 + +曦: 不知道。这个问题在资料里出现了很多次,每一次后面都是“拒绝回答”。 #line:0f6dfbd + +母亲没有继续翻页。她抬起头,声音依然平稳,手掌却一直压着文件边缘。 #line:085e000 + +母亲: 他们先把十七岁的你单独叫去,告诉你整个文明需要一份只有你能够签的契约,然后才让你回家? #line:01dd561 + +曦: 不是那样。他们一开始就说我可以联系你们,可以离开,也可以要求第三方在场。徐允雅把终端放到我面前,是我自己没有打电话。 #line:0f98989 + +父亲: 既然可以联系我们,你当时为什么没有打? #line:0dca1f2 + +曦: 因为我那时候连要告诉你们什么都不知道。我想先听完,至少别让你们接通以后,只能看见我坐在总统对面发呆。 #line:0199496 + +母亲: 你可以暂停,等我们到了再继续。 #line:066ee63 + +曦: 我知道。我当时也知道,只是……我以为自己先听懂,就能回来讲得简单一点。 #line:066c884 + +她看了看散在桌上的几十页资料。事实证明,这个计划并没有成功。 #line:01880a5 + +父亲拉开椅子坐下。工具盒还敞开着,那枚控制阀安静躺在里面,再也没有人记得它原本属于哪台设备。 #line:0a81702 + +父亲: 那份所谓的契约,究竟要求你做什么? #line:0ffb5de + +曦依照记录说出唯一已知规则:在一位高维存在的陪同下前往多个世界,并在离开每个世界以前,献上一件自己真诚认为是当地最珍贵的事物。她本以为第二次复述会容易一些,可“献上”两个字从自己嘴里说出来时,仍然像一块没有形状、也找不到放置位置的重物。 #line:03c9623 + +母亲: “事物”包括什么?献上以后会怎样?由谁判断你是否真诚? #line:0532c13 + +曦: 全都不知道。它没有解释目标是什么、会发生什么,也没有说我要去多少个世界。 #line:0ad136f + +父亲: 那位高维存在能保证你的安全吗? #line:0ccfdd3 + +曦: 它会陪同我,但具体能力也要等签约以后才知道。现在没有人能给我安全保证。 #line:0f4baa2 + +父亲: 它有没有说明任务什么时候结束? #line:0f326b5 + +曦张了张嘴。她已经说完了梦境、密钥、科技锁、文明的终局和拒绝不会受罚,甚至把十至十五周的准备期也说明得很清楚。唯独最后一句,她从公共事务中心回来的整段路上练习了很多次,此刻仍然没有办法顺利接上去。 #line:01aedb5 + +母亲没有催促。父亲看着曦,又看向那份始终没有写出返程保证的资料。 #line:0d5cb5f + +-> 告诉他们,这次离开可能没有返程。 #line:068ed59 + <> +=== + +title: C0_HomeDeliberation_TellParents +--- +曦: 他们不知道任务什么时候结束,也不知道结束以后我会去哪里。如果我答应,准备期结束以后就会离开;至于还能不能回来……神拒绝保证。 #line:098eb4d + +最后几个字说得很轻,却让家里的所有背景声突然变得清楚。环境系统正在调节窗边的温度,厨房发出晚餐保温时间过长的提示,楼外有一列通勤车驶过轨道。那些声音每天都会出现,今天却没有一种能告诉他们接下来应该做什么。 #line:0b87da3 + +父亲: 那就不要去。连能不能回来都说不清,这种条件根本不该让你答应。 #line:0f44d8b + +他说得太快,像是在听见危险警报以后立刻关闭设备。曦垂下眼睛,没有反驳;她甚至在那一瞬间感到一阵近乎卑劣的轻松,好像只要父亲把话说成命令,剩下的一切就都不再需要她负责。 #line:05d56df + +母亲: 等一下。先把拒绝的后果重新说一遍,一字都不要省。 #line:07ed3f7 + +父亲: 连返程都不能保证,这还不足以让我们拒绝吗? #line:0e37c4c + +母亲: 当然足够让我现在就说“不准去”。可你已经听完了全部内容,我们至少也应该听完。要是只抓住最害怕的那一条,我们和什么都不知道的时候没有区别。 #line:0a82583 + +母亲的语气没有提高,翻页的动作却比刚才快了许多。她逐项寻找解除条款、延期条款和未成年人保护条款,仿佛某个更合理的答案只是被藏在了附录里。 #line:08f1415 + +曦: 如果我拒绝,契约就不会成立。不会有人处罚我,也不会找你们,不会重新选第二个人。我的身份会被封存,公众不会知道发生过这件事。 #line:04a3628 + +父亲: 如果你拒绝,星联具体会失去什么? #line:0d19839 + +曦: 神不会解除科技锁。星联还可以继续生活很久,也不会突然被什么灾难毁掉,可我们会永远停在现在的维度。等到三维宇宙真正走到终点,就没有别的路了。 #line:07186e2 + +父亲: 他们有没有说,那是多久以后的事情? #line:0c15329 + +曦: 远到没有人能把它当成明天的灾难,可它最后一定会发生。程衡说,他们想让文明拥有不只一种结局。 #line:026fa93 + +父亲闭上眼睛,用手掌按了按额头。片刻以后,他把刚才因为激动推开的椅子重新拉回桌边。 #line:070cc51 + +父亲: 我刚才说“不要去”,是因为我希望你不要去。这个愿望不会因为文明需要什么就消失,但我不能假装那是一条你必须服从的命令。 #line:0d7d340 + +曦: 如果你把它当成命令,我就可以直接听你的。 #line:03c9077 + +父亲: 我知道你会这么想,所以我更不能那么做。 #line:05c98a3 + +这份回答并没有让曦轻松。她用指甲碰了碰文件袋的封口,差一点问出“为什么不能”,又在父亲疲惫的神情里把问题咽了回去。 #line:0fae247 + +母亲终于翻到资料末尾。那里没有她寻找的退出条件,只有徐允雅整理的未知事项列表。条目排列得非常清楚:献祭形式未知,世界数量未知,任务期限未知,返程可能未知。 #line:0f2f9fe + +母亲: 这不是一份完整的契约。它甚至不能让签约者知道自己具体同意了什么。 #line:071277a + +曦: 徐允雅也这么认为。她说仅凭信息不完整,我就有足够理由拒绝。 #line:0dbe661 + +母亲: 徐允雅有没有明确说过,希望你拒绝? #line:0d43db6 + +曦: 她没有告诉我自己的希望。程衡倒是承认他希望交易成立,但他说那不是我的义务。 #line:0f3807e + +父亲: 他们说得没有错,至少程序上没有错。 #line:0a9ec45 + +曦: 你这句话听起来,一点也不像是在夸他们。 #line:0cc93e0 + +父亲: 因为程序正确,不代表我就会感谢他们把这种选择送到我们家里。 #line:07f3a40 + +母亲拿起家庭终端,按照资料首页的说明验证了文件副本。屏幕先显示候选人家属专用的保密提醒,随后开放全部原始记录与独立咨询入口。没有欢迎词,没有倒计时动画,也没有任何一句“感谢支持星联未来”。 #line:044cedb + +母亲: 这里可以向徐允雅提交问题,也可以要求政府人员不在场。今晚先不开通话,我不想让第四个人坐进这张桌子。 #line:0093868 + +父亲: 我同意。至少这顿饭还是我们三个人的。 #line:0787545 + +厨房再次提醒晚餐仍在保温。母亲抬手关闭提示,却没有让系统开始上菜。 #line:0f8e78a + +曦: 我已经把自己知道的都说了,可我还是不知道应该怎么办。你们呢? #line:08b0d1f + +-> 问他们,希望自己怎样选择。 #line:05c2d4a + <> +=== + +title: C0_HomeDeliberation_AskThem +--- +曦: 如果不用说什么正确答案,只说你们真正希望的……你们希望我怎么选? #line:08b8617 + +父亲: 我希望你留下。希望明天你还去学校,继续拆那些老师没让你拆的设备;希望几年以后,你嫌我们总问你什么时候回家。这个答案很自私,但它是真的。 #line:01fdfb8 + +曦本来想纠正自己并不是每次都擅自拆设备,开口时却没能发出声音。父亲低头把工具盒合上,扣了两次才发现控制阀还留在外面,只好重新打开。 #line:00253fb + +母亲: 我也希望你留下。我刚才一直翻资料,不是因为我相信里面真藏着一条安全的路,而是因为我不愿意接受没有安全的路。 #line:03e6219 + +母亲: 可如果我把门锁上、替你拒绝,五天以后我也许会暂时放心。再过很多年,无论星联发生什么,你都可能反复问自己,当时究竟是你选择留下,还是我们不让你走。我不想让你只能带着这个问题生活。 #line:0919275 + +曦: 所以无论我怎么问,你们还是不肯替我选。 #line:0c07e81 + +父亲: 不肯。不是因为我们没有倾向,也不是因为我们比你更镇定,而是因为无论接受还是拒绝,最后真正活在那个结果里的人都是你。 #line:07ab591 + +曦: 可我真的有一点希望你们禁止我。刚才爸爸说“不要去”的时候,我居然松了一口气。我第一反应不是难过,也不是生气,而是觉得终于有人能替我负责了。 #line:0f925a5 + +她说完以后把脸转向窗外。玻璃映出餐桌旁的三个人,桌上摊着足以改变文明未来的资料,旁边却还放着父亲没有收完的工具和母亲早晨留下的一张采购清单。 #line:0716f12 + +母亲: 这不奇怪。你今天放学以前还只需要担心课程、迟到和那台观测仪,几个小时以后却被要求决定整个文明是否得到一次机会。想把它交给别人,不等于你软弱。 #line:0d7da4e + +父亲: 但如果我们真的替你决定,你以后也可能把所有后悔交给我们。那对你和我们都不公平。 #line:01c925b + +曦: 我知道。道理我都知道,可知道以后还是没有答案。 #line:046e86c + +母亲: 那就先承认今晚没有答案。五天不是让你在第一晚就表现得足够坚定,而是让你有时间看清自己到底在害怕什么、又到底想要什么。 #line:0369020 + +父亲: 现在已经很晚了。任何需要决定文明未来的问题,都不应该在一个人连晚饭都没吃的时候继续讨论。 #line:03e62b5 + +曦: 这是什么基础设施维护规范吗? #line:0159b8f + +父亲: 是家庭维护经验。应用范围很小,但我认为可信度足够高。 #line:0e25fc2 + +母亲终于让厨房开始上菜。保温系统尽职尽责,晚餐和四十分钟前一样热,味道也没有任何变化;可三个人吃得都很慢,话题几次绕回资料,又几次被谁主动停下。那一晚结束时,没有人说“再想想就会知道”,他们只约好先睡觉,第二天把所有记录重新读一遍。 #line:0d5402f + +次日清晨,曦照常去了学校。教学观测仪已经重新合上外壳,星图稳定得像昨天什么都没有发生。教师没有询问公共事务中心的内容,只把她遗落的探针递还给她;曦接过时才想起,昨天这个时候,她还以为自己面对的最大问题是怎样证明设备原本就有误差。 #line:0906d5c + +当晚,一家人一起阅读了完整资料。母亲把能够验证的项目重新核对,父亲则把所有涉及期限、风险和家属权利的段落单独标出。他们通过安全终端提交了一份问题清单,次日上午收到的答复依旧清楚,也依旧没有提供任何新的保证。 #line:09821fe + +第三日,曦放学以后和父亲一同乘车回家。他们一路讨论住宅区某段轨道为什么频繁调整速度,谁也没有提契约。直到下车时,父亲才问她今天有没有害怕;曦说有,但没有昨天那么像是喘不过气。 #line:0f8446e + +第四日,也就是期限前一晚,母亲把资料收进客厅抽屉,提议至少完整吃完一顿不讨论高维、科技锁和宇宙终点的晚餐。父亲讲起维护站有人把检测机器人锁在设备间的事故,曦笑到一半,忽然因为自己仍然能够笑而感到内疚。 #line:027f3b6 + +母亲: 不要为了证明这件事足够重要,就提前把五天里的其他东西全部丢掉。我们在吃饭,你觉得好笑就可以笑。 #line:064a3e5 + +曦: 可明天以前,我还是要给出答案。 #line:08d06f8 + +父亲: 是。今晚没有人能替你取消明天,但我们也不需要假装你现在已经想得毫无疑问。 #line:0c4ad97 + +曦看着父母。五天没有让契约变得更完整,也没有让害怕消失;它只是把最初混在一起的恐惧、责任、好奇和舍不得慢慢分开,让她终于能够承认它们同时存在。 #line:0c4fd24 + +-> 承认自己还没有答案。 #line:04a6145 + <> +=== + +title: C0_HomeDeliberation_FifthDay +--- +曦: 我还是没有一个能让我完全不后悔的答案。我害怕去了以后回不来,也害怕留下以后会一直问自己为什么没有去;我甚至真的想看看那些世界,又觉得现在承认好奇很不应该。 #line:090c2ff + +父亲: 好奇没有做错什么。你不需要先把自己写成一个只有责任感、没有私心的人,才有资格作决定。 #line:0ff99b6 + +母亲: 也不需要找到一个保证永远不后悔的答案。那种保证和返程说明一样,都不在这份资料里。 #line:09ead71 + +曦: 你们安慰人的方式是不是越来越像徐允雅了? #line:09eed1b + +母亲: 我希望没有。至少我会提醒你把晚饭吃完。 #line:0169ecf + +那一晚,他们没有再打开资料。曦回到自己的房间,把第二天要带的文件和学校终端放进包里,又在确认没有签约以后立刻出发的必要后,将旅行用品清单从桌面关闭。现在收拾行李还太早,仿佛只要提前选好衣服,就已经替明天的自己作出了选择。 #line:0514e9e + +第五日上午,一家人按平时的时间吃早餐。父亲比闹钟早起了十分钟,却声称只是住宅区的通风系统有一点异常;母亲没有揭穿,只把曦面前的饮料重新加热。谁也没有把这顿早餐称为“决定以前的最后一餐”。 #line:0468b19 + +前往公共事务中心的列车并不拥挤。三个人并排坐在靠窗的位置,窗外依次经过学校、研究区和曦每天都能看见的运输塔。父亲几次打开终端又关上,母亲则把那份已经核对过许多次的资料抱在膝上。 #line:0155997 + +曦: 你们可以和我一起进去。徐允雅说,我有权让父母在场。 #line:035cd12 + +父亲: 那你希望我们陪你一起进去吗? #line:0071adb + +曦: 我希望你们陪我到门口。可真正回答的时候,我想只有我自己在里面。如果我一直看着你们的表情,我可能连哪一种害怕是自己的都分不清。 #line:06e7856 + +母亲: 那我们就在外面等。无论会面持续多久,你出来以后都能在原来的位置找到我们。 #line:0997126 + +公共事务中心与五日前没有区别。大厅仍有人办理普通事务,自动导引系统仍在提醒访客确认楼层,甚至连通往顶层的升降梯都没有因为曦再次到来而更快一些。 #line:0aafe02 + +到了陪同者等候区,徐允雅已经将最终会面室设置为暂停状态。只有曦确认进入以后,签约程序才会开始;父母所在的位置越过一道透明分界线便无法听见室内谈话,但曦只要回头,仍然能够看见他们。 #line:09c1a21 + +父亲把她的包带重新理顺,做完以后似乎觉得这个动作太像在为远行送别,又很快把手收了回去。 #line:0802cb5 + +父亲: 我们不会问你想好了没有。五天到了,不代表你必须表现得像再也不会动摇。 #line:0f9d458 + +母亲: 进去以后,只回答你真正愿意给出的答案。不要因为程衡是总统,也不要因为我们站在这里,就选择一句比较容易让别人接受的话。 #line:0ffb867 + +曦: 如果我出来的时候说不出话呢? #line:0040c12 + +父亲: 那就先过来。你可以等到能说的时候再告诉我们。 #line:0b7ab5a + +曦: 如果答案和你们希望的不一样呢? #line:0ac9812 + +母亲: 也先过来。我们对答案有愿望,但我们在这里等的是你。 #line:0735c25 + +最终会面室的门在走廊尽头无声打开。曦没有立刻迈步,而是回头确认了一次。父亲和母亲仍然站在透明分界线外,没有催促,也没有用笑容假装他们并不害怕。 #line:08e312b + +五天没有替曦找到一个不会失去任何东西的选择。 #line:0699eb0 + +它只让她终于能够独自走向那扇门,并承认门后的答案必须由自己说出口。 #line:0626f19 +=== diff --git a/Assets/Story/Chapter0/C0_RollbackDemo_Checkpoint.yarn.meta b/Assets/Story/Chapter0/C0_HomeDeliberation.yarn.meta similarity index 86% rename from Assets/Story/Chapter0/C0_RollbackDemo_Checkpoint.yarn.meta rename to Assets/Story/Chapter0/C0_HomeDeliberation.yarn.meta index e1701ed0..092ed530 100644 --- a/Assets/Story/Chapter0/C0_RollbackDemo_Checkpoint.yarn.meta +++ b/Assets/Story/Chapter0/C0_HomeDeliberation.yarn.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: f7dd9f9b20ce43c38ee5a23ce1f94f4e +guid: b730a206bef8d91459592e808c2bf2b7 ScriptedImporter: internalIDToNameTable: [] externalObjects: {} diff --git a/Assets/Story/Chapter0/C0_OceanHeart.yarn b/Assets/Story/Chapter0/C0_OceanHeart.yarn new file mode 100644 index 00000000..73af235a --- /dev/null +++ b/Assets/Story/Chapter0/C0_OceanHeart.yarn @@ -0,0 +1,416 @@ +// Chapter 0 · C0-S07 大洋之心 +// 对应场景卡:docs/chapter0-scene-07-ocean-heart-card.md +// 类型:Important TextBlock(待 StoryData 配置) +// 目标 Block ID:c0_ocean_heart +// 入口 Node:C0_OceanHeart +// 标题 Localization Key:story_c0_block_ocean_heart_title +// +// Unlock Condition:c0_contract_route == 1 +// Forbidden Condition:c0_contract_route == 2 +// 前置 Block:c0_departure_to_asteria +// 本稿不写入新的剧情变量,不新增 Timeline Marker。 +// 三项互动按固定顺序出现,每组只有一个选项。 +// +// 伊内斯的稳定 Character ID 规划为 Ines;当前中文审阅稿沿用既有 Yarn 的中文 Speaker 写法。 +// 待 Speaker 显示名本地化接入时,再统一 CharacterName 与 CharacterRegistry,不在本稿加入立绘命令。 +// 本稿不添加 #line 标签;待文本批准后由 Yarn 工具统一生成。 + +title: C0_OceanHeart +--- +海洋深层站的车门打开时,曦最先闻到的不是海水,而是公共休息区里某种刚加热好的食物。 #line:033f839 + +她原本已经准备好直接冲向玻璃隧道,胃却在这时替她作出了更实际的判断。上一顿早餐远在泽尼斯,星际航行途中又只喝了水;如果母亲现在询问她有没有吃东西,她已经不能再用“还没到”作为回答。 #line:0e807e8 + +深层站没有因为她抵达而改变营业顺序。游客在路线屏幕前研究不同区域,工作人员推着设备从维护通道经过,靠近观景入口的座位几乎坐满了刚从水里出来、还在擦头发的人。 #line:060c58b + +曦买了一份方便携带的热食,在靠窗的位置坐下。透明外墙之外,海水已经比交通舱穿过海面时深了许多;几条银色小鱼沿着站体灯光游过,很快消失在人工礁体后方。 #line:092c8b1 + +镜悬停在座位另一侧,没有占用桌面,也没有对食物发表判断。它的镜面同时映出休息区、海水温度分布和鱼群移动留下的短暂线框,内部数据流在深蓝背景里显得格外明亮。 #line:0343993 + +曦: 我们已经到海底了,它们却还能把食物做得像刚从家附近的店里拿出来一样。母星旅游资料为什么从来不把这件事写在第一页? #line:026e231 + +镜: 对星联现有运输与供给系统而言,在此处提供热食不构成需要特别说明的能力。 #line:092d8c0 + +曦: 对第一次来的人构成。我今天早上还在家里吃饭,现在坐在母星海底,结果最先让我安心的居然是这里也有不会洒出来的汤。 #line:03da663 + +镜: 你的行程经历了星际距离,日常需求没有因此改变。 #line:07964f5 + +曦: 这句话听起来很像你,但至少没有错。 #line:0473130 + +她把食物吃完,认真给母亲回复了一句“已经吃过”,还附上空掉的餐盒作为证据。母亲回了一个表示满意的简短符号,父亲则问她下一段交通什么时候结束,显然还没有完全从检查行程的习惯里退出。 #line:02fbb82 + +曦收好终端,站到游览区入口前。 #line:07b1bda + +入口没有宣称游客即将进入“完整原始海洋”。路线说明把区域分得十分清楚:公共游览生态、浅水互动水域、休息与繁育区、外围保护带,以及任何普通游客都不能进入的大洋之心核心。 #line:05a7834 + +最明亮的玻璃隧道从深层站向人工礁体之间延伸,更远处的水色则在灯光边缘迅速变暗。那些真正属于原始海洋的区域没有巨大照明,也没有为了让游客看清而把生物引到玻璃附近。 #line:0d281f7 + +曦: 原来地图上那片“游览区”,放进整座大洋以后只有这么一点。 #line:0c13b7e + +镜: 你能够抵达的区域不代表海洋的实际范围。地图已经明确区分二者。 #line:0cb43bd + +曦: 我知道,可是一张图里画出来,和站在这里看见灯光真的会结束,还是不一样。 #line:0005d52 + +预约终端在此时提示接待人员已经到达。曦顺着指引望去,看见一名穿深蓝色水下工作服的女性从维护廊道走来;衣袖和肩部使用珊瑚橙色安全标识,前臂终端正显示附近水域的游客数量与生态休息状态。 #line:0213688 + +她先确认一组准备进入浅水区的孩子没有走错通道,才来到曦和镜面前。 #line:00895a2 + +<> +=== + +title: C0_OceanHeart_MeetInes +--- +伊内斯: 下午好,我是伊内斯·阿尔梅达,负责今天的游览生态与保护边界说明。直接叫伊内斯就可以。 #line:00e80b4 + +曦: 我是曦。这一部分应该不用再完整介绍了。 #line:073e76c + +伊内斯: 确实不用。预约系统已经说明你的公共身份,也说明今天没有欢迎仪式、公开采访和特殊演示。对我来说,需要现场确认的只有三件事:你是否愿意接受普通导览,是否需要避开其它游客,以及还想不想下水。 #line:03bcf09 + +曦: 普通导览,不用清空游客,而且非常想下水。我从轨道上一路坐到这里,如果最后只能隔着玻璃看,我会觉得自己的路线规划受到了欺骗。 #line:0e56f59 + +伊内斯: 路线没有欺骗你,浅水互动室已经保留位置。不过能不能看到鱼靠近,要由它们决定。公共身份对鱼群没有优先级。 #line:0fc07dd + +曦: 这点很好。我今天已经得到太多人的优先安排了,至少鱼不认识公共频道。 #line:07817b8 + +伊内斯看向镜。万华镜般的复合体悬停在曦侧后方,不断变化的镜面把她的监测终端映成许多角度不同的画面。 #line:02e1f5e + +伊内斯: 镜的投影可以进入公共隧道。浅水室需要把三维占用范围缩小到标记以内,主要是避免挡住其它游客,也避免鱼群把突然出现的大面积反光当成环境变化。 #line:064eb7e + +镜: 可以。我不需要呼吸、恒温或压力适配,也不会接触水域中的生物。 #line:088fae5 + +曦: 它说得像是在申请一件尺寸比较奇怪的随身行李。 #line:00d023c + +伊内斯: 至少比登记那些会咬维护线路的游览鱼容易。有一类游览鱼喜欢发光接口,我们每周都要检查它们有没有把设备提示当成求偶信号。 #line:0186512 + +曦被这句话逗得笑出了声。伊内斯没有因为这场旅行的公开意义改变语气,只把普通导览权限发送到她的终端,随后带两人进入玻璃隧道。 #line:0d7051f + +水下光线从隧道上方缓慢移动。人工礁体没有排列成整齐的展台,而是随着水流形成高低不同的通道;银色小鱼成群穿过光柱,几只宽鳍的蓝色生物停在礁体背面,只有尾部偶尔从阴影里露出来。 #line:00291d3 + +曦刚靠近玻璃,一群原本沿隧道游动的小鱼便同时改变方向。它们没有逃进很远的水域,只和她拉开一段距离,在礁体上方重新组成松散的队形。 #line:095fb06 + +曦: 我还什么都没做,它们怎么先走了? #line:03c3e58 + +伊内斯: 你用很快的速度靠近一块原本没有人的玻璃,还把两只手一起抬了起来。对它们来说,这已经是很明显的动作。这里的生物不攻击游客,不代表它们必须喜欢每一种接近方式。 #line:06af4e2 + +曦把手放低了一点。几条鱼仍在远处观察,没有像宣传影像里那样立刻围过来配合她的第一站。 #line:02e96e6 + +-> 把手贴近玻璃,等鱼群主动靠近。 #line:0f08912 + <> +=== + +title: C0_OceanHeart_WaitForFish +--- +曦把一只手轻轻贴在玻璃上,不再追着鱼群移动。 #line:0b3c268 + +最初没有任何变化。小鱼在礁体上方绕了半圈,其中一部分转向更远的休息水域,另一部分则渐渐缩短距离。过了一会儿,一条带着蓝色光点的小鱼游到她手掌对应的位置,偏过身体看了看玻璃后的影子。 #line:0e12004 + +第二条鱼没有靠近她,而是跟在第一条后方;第三条只停留片刻便转身离开。最终围在玻璃附近的只有很小一群,远没有入口影像里的画面密集。 #line:00eeae0 + +曦: 这次是它们自己过来的,对吧?不是玻璃在我的手下面发了什么信号? #line:074421a + +伊内斯: 玻璃没有诱导功能。它们能看见动作、光线和轮廓,也会学习不同游客的行为。第一条可能只是好奇,后面的几条更像是在跟随同伴;至于离开的那些,我们不会把它们重新引回来。 #line:030d1f2 + +曦: 所以有人在这里等很久,也可能一条都等不到? #line:0200c30 + +伊内斯: 当然。门票保证游客能够使用设施,不保证某个生命必须在规定时间里回应。如果游客很多,我们会提示更合适的水域,但不会为了满足预约主动引导鱼群靠近。 #line:063ccd2 + +曦看着那条带蓝色光点的小鱼沿她的手掌位置游了一圈。它的动作没有复杂到足以被误认成人类交流,却也不是一段无论谁站在这里都会重复的固定影像。 #line:06c5e9f + +伊内斯: 游览区的鱼群不是从原始海域直接抓来的。它们是生物工程培育的游览生态种,有完整的新陈代谢、成长与学习过程,也会建立相对稳定的群体偏好。 #line:00510db + +伊内斯: 我们去除了会危害游客的攻击行为,也不让它们依赖捕食其它游览种生存。它们更容易适应灯光、人影和浅水互动,但仍然可以远离游客,进入不开放的休息区。 #line:09f5c24 + +曦: 资料里说它们是人工培育生命。我原来还以为,这意味着它们每次看见人都会自动做出设计好的动作。 #line:02d366f + +伊内斯: 如果我们只需要固定动作,播放影像会简单得多,也不需要每天监测水质、群体压力和休息时间。培育改变了它们可能怎样生活,没有替每一条鱼决定此刻游向哪里。 #line:042d093 + +镜: 设计者改变了相遇发生的条件。攻击风险被排除,对人类动作的适应被强化,游客因此更容易取得安全而积极的回应。 #line:0ec679d + +伊内斯没有立即替游览区辩护,只等镜把判断说完。 #line:0ac3ac0 + +镜: 这些条件不能证明回应没有发生。刚才靠近玻璃的行为仍由当前个体在允许范围内完成,并非预先固定的视觉记录。 #line:052259d + +曦: 这听起来几乎像是在替这里说话。 #line:0859b88 + +镜: 我只区分设计条件与实际行为。二者同时存在,不需要删除其中一项才能描述另一项。 #line:05b1dfb + +伊内斯: 这是很准确的区分。它们既不是原生鱼,也不是会动的布景;只有承认这两点同时存在,我们才知道自己真正需要照料什么。 #line:0ee87ad + +曦: 我知道它为什么容易靠近,还是会记得刚才等到它过来的那一会儿。要是它永远不来,我也不能拿着“人工培育”四个字要求它重试。 #line:0f8292f + +那条蓝点小鱼在此时离开玻璃,跟随群体游向礁体后方。曦没有追着它移动,只在完全看不见以后才收回手。 #line:002988f + +伊内斯看了一眼前臂终端。浅水互动室已经完成水质交换,游客数量也处于允许范围。 #line:064bdae + +伊内斯: 想下水的话,现在正合适。装备间就在下一段。先说明规则:不追逐、不投喂、不抓住任何生物;如果它们离开,游客留在原地或者做自己的事。 #line:01ab0f9 + +曦: 可以。我刚才已经用玻璃学过一次了,应该不会在水里立刻忘掉。 #line:0061a35 + +伊内斯: 大部分第一次下水的人都会忘掉一点。身体真的进到水里以后,兴奋通常比规则跑得快,所以我会再提醒。 #line:0c1f6b3 + +装备间准备的是轻型呼吸与恒温服。它不像曦的环境适应衣装那样需要面对未知世界,只覆盖浅水活动所需的呼吸辅助、温度调节和碰撞保护。 #line:009dddb + +曦接过装备,先凭直觉摸到了侧面的密封接口,又在伊内斯开口以前停住手。 #line:030a426 + +曦: 我今天已经答应过老师和父亲,遇到不熟悉的设备先确认再拆。这个接口是自动锁定,还是需要我转到第二个标记? #line:060ffe3 + +伊内斯: 自动锁定。第二个标记用于维护解锁,游客转过去以后,整套装备会认为自己正在检修。谢谢你先确认。 #line:0702c10 + +曦: 看来我的进步已经跨越星际距离了。 #line:02d29ae + +镜将投影收拢到原本体积的一半。镜面数量没有减少,只是彼此折叠得更加紧密,内部数据流也随之压缩成一团更明亮的风暴。 #line:0e520d4 + +伊内斯: 它这样进入水里,不会影响投影稳定吗? #line:01e39dc + +镜: 不会。水的压力、温度与成分不构成限制。缩小只用于满足你们的空间管理要求。 #line:0678d15 + +曦: 我们两个都准备好了。区别是我穿了十分钟,它只折了一下。 #line:092a497 + +-> 穿上装备,进入浅水互动室。 #line:0dabaab + <> +=== + +title: C0_OceanHeart_ShallowWater +--- +生态隔离门在完成检查后缓缓开启。第一层水只漫过曦的脚踝,随后随着她向前走逐渐加深;呼吸辅助装置在水面越过肩膀时自动启动,没有笨重面罩,也没有把外界声音完全隔绝。 #line:04c9ae9 + +曦试着向前游了几下。恒温系统把水维持在不会令人发冷的范围,却没有消除水流本身的力量。人工礁体从浅水区一侧延伸出去,几群颜色不同的小鱼在透明隔离线以外穿行,偶尔才进入允许游客活动的区域。 #line:0401684 + +伊内斯跟在不远处,动作显然比曦熟练。镜则保持缩小后的万华镜形态悬停在水中,镜面折射出细碎光斑,却没有产生气泡或划水动作。 #line:0f9aac2 + +曦: 我现在真的在母星的海里了。虽然是隔离室,虽然水温和鱼群都经过安排,可这里至少不是一段观景影像。 #line:09a3e9a + +伊内斯: 你脚下的水、推着你的水流,还有等会儿可能完全不理你的鱼,都是真的。游览区不需要假装自己没有边界,才能成为一段真实经历。 #line:0431579 + +一群银色小鱼从曦侧面游过。她下意识加快速度,想跟在后面看清它们尾部的透明结构;鱼群立刻分开,从礁体两侧绕走,转眼便把她留在中间。 #line:01bc2d8 + +曦停下来,水里的姿势因为突然失去前进方向而显得有些笨拙。 #line:081a287 + +曦: 我只游快了一点,它们至于这么不给面子吗? #line:08fa93d + +伊内斯: 对鱼来说,你刚才不是“快了一点”,而是一件比它们大很多的东西突然从侧面追上来。没有攻击性不等于没有避让本能。 #line:07306dd + +曦: 明白了。第二次被鱼拒绝,而且理由仍然很充分。 #line:08ec339 + +她不再追逐,只扶着水下标记调整姿势。过了一会儿,两条原本散开的鱼从礁体后方返回,远远绕过她的手臂;其它鱼群没有回来,选择了另一片没有游客的水域。 #line:037b50e + +曦没有尝试改变它们的路线。她顺着水流慢慢移动,让一条宽鳍蓝鱼从自己下方穿过。尾鳍带起的水流碰到手腕时非常轻,若不是她正安静等待,几乎不会注意到。 #line:0462a51 + +曦: 它刚才碰到我了吗? #line:0209a9f + +伊内斯: 是水流碰到你。它和你的手之间还留着距离。 #line:06c2a52 + +曦: 那也很好。至少不用为了证明关系真实,非得摸到它。 #line:084df82 + +伊内斯: 很多人把“亲近”理解成必须发生身体接触。我们会不断提醒,喜欢一个生物不代表需要在离开以前摸它一次。 #line:07cf64a + +接下来的时间里,曦终于不再计算每一次鱼群靠近。她尝试控制呼吸装置的浮力,用手势询问伊内斯不同礁体的作用,也帮助一名不熟悉装备的游客发现腕部密封没有完全展开;在伊内斯确认安全以前,她没有擅自调整对方的接口。 #line:03add0a + +伊内斯: 你对装置很熟? #line:04db6aa + +曦: 不是每一种都熟。我只是很容易看出某个东西希望人怎样操作,至于为什么,有时候要等我写报告的时候才开始认真想。 #line:072cbb2 + +伊内斯: 使用直觉处理装置很方便,但也容易越过操作边界。 #line:02bfe57 + +曦: 我的老师也是这么说。她通常会把“危险”放在前面。 #line:08bcb63 + +两人游到互动区边缘休息。这里能够看见一条通往非开放水域的宽阔通道,鱼群可以自由进入,游客却会被柔和的引导场阻挡。几群生物已经离开明亮区域,在没有观景窗的位置停留。 #line:099116f + +伊内斯查看终端后,关闭了她们刚刚经过的一部分互动水域。入口提示随即变为生态休息状态,新游客被引导到其它区域。 #line:0db05ce + +曦: 那片水里看起来还有鱼,也没有出现故障,为什么现在关闭? #line:04cf42d + +伊内斯: 群体压力接近今天的休息阈值。它们未必已经表现出明显不适,但如果等到所有鱼都躲开,说明我们早就让游客停留太久了。 #line:06a643f + +曦: 已经买票的人不会抱怨吗? #line:0002dcb + +伊内斯: 会。有些人专程预约那片礁体,我们会帮他们改时间或去别处。可预约取得的是在规则允许时进入的机会,不是要求一片生态永远保持开放。 #line:0bf0c4d + +她说这句话时没有像在背诵规定。曦注意到伊内斯看向休息通道的方式,像是对鱼群每一次离开都已经十分熟悉,也仍然愿意确认它们真的拥有离开的空间。 #line:0f3a0c1 + +曦: 你从小就在海边吗? #line:03f34f0 + +伊内斯: 完全相反。我出生的世界主要承担专业生产和居住职能,地表水域都是循环系统的一部分。我小时候第一次来母星,就是在这里看见真正会从身边游过去的鱼。 #line:01ff007 + +伊内斯: 当时的游览区比现在小,装备也没有这么轻。我记得自己在浅水里站了很久,一条鱼都没有等到,最后哭着问工作人员是不是海不喜欢我。 #line:0812248 + +曦: 她怎么回答? #line:0c5a95a + +伊内斯: 她说,海没有义务在我规定的时间里证明喜欢我。然后她带我去看休息水域的入口,告诉我鱼可能只是在别处生活。这个答案当时一点也不能安慰孩子,可我后来一直记得。 #line:0b02bfc + +曦: 所以你长大以后回来这里工作,是为了继续告诉哭泣的游客,鱼没有义务配合他们? #line:011acf2 + +伊内斯: 是。我的另一项工作,是让没有等到鱼的游客也能理解这片水域发生了什么,而不是只记住一块空玻璃。 #line:05f9fd6 + +她们离开浅水互动室,装备完成自动清洁与回收。曦刚把头发上的水整理到不会继续滴落,伊内斯的前臂终端便亮起一条期限提醒。 #line:0120f18 + +提示没有显示完整文件,只写着“外围保护带低干扰交通线——评估意见剩余两日”。伊内斯看了一眼便关闭,却在之后核对装备时把同一处接口检查了两遍。 #line:08bf0c6 + +曦: 如果这不属于不能问的内部信息,我可以知道你刚才为什么突然像我爸检查交通线路一样吗? #line:0c0df61 + +伊内斯: 因为有一份意见快到期限,而我还没有写出自己真正想表达的内容。提案本身是公开评估,不属于秘密;只是你今天来这里,不代表有义务替我处理工作。 #line:0ab7233 + +曦: 我也处理不了。我到母星还不到半天,要是我的一句话就能决定海底交通线,你们的评估制度应该先检查自己。 #line:0dc6657 + +伊内斯笑了一下,随后把浅水区的监测页面关闭,调出一张只包含公开范围的保护带地图。 #line:080f607 + +<> +=== + +title: C0_OceanHeart_ExpansionProposal +--- +伊内斯: 提案希望在现有观察廊之外增加一条全封闭交通线。那里仍然属于外围缓冲区,不是原始海洋核心;游客不能离开交通舱,也不会设置投喂、取样或互动生物。 #line:0d51471 + +伊内斯: 新线路会使用低干扰照明和被动观测设备。按照目前的评估,施工与运营风险都可以控制,也能让行动不便者、儿童和无法进入浅水区的人更接近深海。 #line:0a7aa1b + +曦: 听起来不像有人想把保护区拆掉建商店。 #line:07756fb + +伊内斯: 没有人想那么做。提出方案的人里有生态工程师、无障碍设计人员,也有和我一样相信公众需要亲眼看见海洋的人。他们的资料完整,理由也很认真。 #line:08a41a4 + +曦: 可你还是不确定。 #line:0c3b389 + +伊内斯: 我不确定自己反对的是这一条线路,还是它代表的下一步。现有游览区也曾经是一项扩建,如果当年所有保育员都只说“不许靠近”,我可能永远不会来到这里,更不会选择这份工作。 #line:0100987 + +伊内斯把地图放大。明亮的游览区只占海域边缘很小一部分,外围保护带则像一圈没有明确景点标识的深色空间,把公共设施与核心原始海域分隔开。 #line:0f4d591 + +伊内斯: 每一次方案都可以证明,自己只向外增加很短一段,影响也足够小。技术会继续进步,照明会更安静,施工会更精确,交通舱也会更安全。如果我只用风险拒绝,那么风险降低以后,我就没有继续拒绝的理由。 #line:0eb4c8d + +曦: 但如果你说“任何地方都不能再开放”,别人也可以问,为什么现在这片游览区就有资格存在。 #line:0b03364 + +伊内斯: 对。这正是我写不下去的地方。我不想假装自己从未受益于开放,也不想把“让我看见海”自动变成“所有人都应该继续看见更深的海”。 #line:0aa43ca + +镜一直没有参与讨论。它悬停在保护带地图旁,镜面将不同区域的边界复制成层层重叠的线条。 #line:0d08331 + +曦: 你们现在能到那个边界看看吗?不是进保护区,只是去你平时判断这些问题的地方。 #line:0f4c162 + +伊内斯: 现有观察廊允许工作人员陪同普通游客进入。那里不会保证看见任何生物,也没有比这边更漂亮的灯光。如果你只是想找更刺激的景点,可能会失望。 #line:066a640 + +曦: 我刚才已经看见鱼会游走了。一个什么都看不见的窗口,至少不会比这更不给面子。 #line:04eef47 + +伊内斯: 那我可以带你去。观察廊不是评估会议,也不会记录游客立场。 #line:0b3897a + +曦: 很好。我今天只想作为一个刚学会不追鱼的游客去看。 #line:06510b5 + +-> 跟伊内斯去看看真正的保护边界。 #line:0acb695 + <> +=== + +title: C0_OceanHeart_ProtectionBoundary +--- +前往观察廊的侧向交通舱离开主游览区后,窗外灯光很快减少。 #line:02fda5a + +人工礁体与游览鱼群先从视野中消失,随后连用于游客辨认方向的彩色标记也被最低限度的安全照明取代。伊内斯关闭终端上不必要的主动扫描,只保留廊道本身的状态与紧急返回路线。 #line:042e7ad + +曦: 这里明明仍然隔着玻璃,我却开始觉得外面的水离得更近了。 #line:05cb68b + +伊内斯: 因为游览区一直在告诉你应该看哪里。这里没有为访客安排视线,玻璃外也不会为了证明原始海洋存在,把生物引到灯光里。 #line:08e01c5 + +观察廊停在外围保护带边缘。主要照明关闭以后,窗外只剩很深的黑蓝色,偶尔有水流带着无法辨认的微小反光经过;没有大型生物准时出现,也没有背景说明替那些影子标注名称。 #line:050744c + +三个人等了一会儿,什么都没有看见。 #line:05316d5 + +曦原本以为自己会失望,真正站在这里以后,却发现“没有看见”反而让玻璃之外显得更辽阔。那里不是一幅空白展板,只是绝大多数活动都不会为了她短暂到访而进入视野。 #line:00da0f1 + +远处终于掠过一道模糊轮廓。它可能是一条原生鱼,也可能只是水流推动的漂浮物;伊内斯没有开启更强照明确认,镜也没有利用自己的观测能力替曦报出答案。 #line:0720bb4 + +曦: 如果只看我们现在能看到的这些,谁也认不出来,对吧? #line:095fe55 + +镜: 是。以当前照明与观测条件,现有信息不足以完成辨认。 #line:00eedad + +曦: 好吧,那我就把它记成“可能有东西经过”。至少这次记录不会因为我想看清,就把灯突然照过去。 #line:00c8a7b + +伊内斯站在地图标记的现有终点前。拟议交通线会从这里继续延伸,穿过一段如今没有公共设施的缓冲水域,再在更深处建立新的封闭观察节点。 #line:072d069 + +伊内斯: 如果只看这份方案,它真的很克制。没有人进入水里,施工范围也不大。甚至可以说,新的被动传感器比我们现在这段观察廊更少干扰环境。 #line:0f10584 + +曦: 你担心等这里变成正常路线以后,下一份方案会从新的终点继续往前。 #line:079fda8 + +伊内斯: 是。但如果每一份方案都能证明影响很小,我不能只用“以后可能还有下一份”否定现在的人。公共评估需要证据,也不能因为我不喜欢某个趋势就跳过程序。 #line:0a24477 + +镜: 你需要区分两种边界。 #line:096655a + +伊内斯抬头看向镜,没有把这句话当作结论接受。 #line:0ab084f + +镜: 第一种边界来自能力不足。进入会造成不可接受的风险,因此技术改善后,边界可以移动。第二种边界来自不开放本身是目标的一部分,即使能够进入,也不自动产生进入的正当性。 #line:0b6b6f2 + +镜: 你提交的资料主要证明第一种边界,实际试图保留的却是第二种。只要二者仍被混在一起,你的理由就会随技术进步持续失效。 #line:0f16753 + +观察廊里安静了一会儿。伊内斯没有立刻回答,只把地图重新缩小,让现有游览区、拟议线路与核心海域同时出现在画面里。 #line:063aed2 + +伊内斯: 你把它说得太整齐了。现实评估里,两种边界不会完全分开。生态风险、公共权利、研究需求和保护原则仍然要一起判断,我也需要拿出能够接受复核的资料。 #line:0c2b288 + +镜: 我没有替你决定边界位置,只指出你的陈述与目标并不一致。 #line:0a6b0b5 + +伊内斯: 这一点成立。如果我只写施工风险,就等于假装更好的设备能够替我们回答价值选择。可如果我只写“有些地方不应开放”,又必须说明由谁决定、为什么停在这里,以及现有游览区凭什么被保留。 #line:0f02444 + +曦看着窗外。那道模糊轮廓没有再次出现,玻璃外仍然没有任何景象证明这段等待值得。 #line:0ca36bc + +曦: 我刚才很喜欢浅水区,也喜欢鱼后来真的游回来。那段体验不会因为这里更黑、更危险,就突然变成假的。 #line:0085434 + +曦: 可我会相信浅水区的一部分原因,是伊内斯从一开始就告诉我,那不是整片海。灯光会结束,鱼可以躲开,游客也有不能继续走的地方。 #line:08f018c + +伊内斯: 如果所有边界都只被解释成“以后技术成熟再开放”,游客学到的就不是海洋有自己不为人服务的空间,而是路线暂时还没修完。 #line:075ac3c + +曦: 对。可这句话也不能直接决定新线路一定不该修。我只能告诉你,作为今天第一次来的人,知道自己看不见全部,并没有让我更不喜欢海。 #line:0b09f16 + +伊内斯: 这已经很有用。游览区一直声称自己的目标包括让人理解边界;如果只有进入更多地方才能让游客满意,那说明我们的说明本身没有做到。 #line:0d0e7f7 + +她在终端上记下几行文字,又把最后一行删掉重写。评估状态仍然显示“草稿”,没有因为这场谈话自动变成支持或反对。 #line:04985bb + +伊内斯: 我会把两种边界分开说明,再让提案方和其它保育人员逐项回应。最后结果可能仍然通过,也可能修改或取消;至少不应该因为技术风险已经很低,就假装剩下的问题不存在。 #line:0c2bdaa + +<> +=== + +title: C0_OceanHeart_Departure +--- +回到主游览区时,灯光重新变得明亮。几群结束休息的鱼已经返回人工礁体,新的游客站在玻璃旁等待,却没有人知道保护带观察廊里刚刚形成了一份仍未完成的评估草稿。 #line:0ac165b + +伊内斯把普通游客路线和自己的联系方式发送给曦。内容里没有要求她公开支持海洋保护,也没有把今天的对话整理成候选人访问纪要;只有几条哪些区域适合傍晚观看、哪家休息区食物不容易洒出来,以及装备密封接口不要转到维护标记的提醒。 #line:0acfe63 + +曦: 最后一条是专门写给我的吧? #line:0df3a31 + +伊内斯: 是。普通游客很少在第一次拿到装备时就准确找到维护解锁。你会注意到这个接口,所以我特意加了一条提醒。 #line:0910506 + +曦: 我最后不是没有动吗? #line:0688a85 + +伊内斯: 对。你先问了,没有触发维护模式。 #line:07fafcc + +曦把联系方式存进私人终端。她来到母星以前并没有想过,自己结识的第一位朋友会先教她怎样等待鱼群,再带她去看一扇几乎什么都看不见的窗口。 #line:0f2f442 + +伊内斯: 接下来去地下都市? #line:084a024 + +曦: 对。从海底向上走,下一站还是地下。这个旅行路线似乎打算让我过几天以后才真正站到地表。 #line:0549345 + +伊内斯: 地下都市比海底游览区更早,也更像普通人长期生活的地方。不要只盯着中央纪念碑,交通层旁边的旧居住区和公共市场更容易看出它为什么能一直使用到现在。 #line:069b60a + +曦: 这算本地人的隐藏路线吗? #line:01835f0 + +伊内斯: 算一个公开路线建议。导览系统里有完整说明,只是宣传影像通常优先展示纪念碑。 #line:02db534 + +镜恢复原本的投影范围,镜面在宽阔走廊中重新展开,内部数据流也从压缩的光团重新舒展成不断变换的线条。 #line:0011bd9 + +离开以前,曦最后一次经过最初等待鱼群的玻璃。那条带蓝色光点的小鱼没有出现,另一群她从未见过的生物正沿着人工礁体缓慢移动。 #line:0e84b15 + +她没有停下来要求补回同一个画面,只向伊内斯挥了挥手。 #line:0787c24 + +曦: 如果评估结束以后你愿意说结果,可以发给我。不是让我投票,我只是想知道这扇窗最后会不会继续留在原来的位置。 #line:0bf2ddf + +伊内斯: 可以。如果你在那以前去了别的海,也可以告诉我那里的人怎样划边界。作为旅行见闻,不是政策证词。 #line:0304621 + +曦: 成交。虽然我现在连第一个异世界有没有海都不知道。 #line:02e3eb9 + +伊内斯: 等你真的看见以后再说。先记录实际遇到的情况就够了。 #line:05e5c07 + +上行交通线的车门在此时开启。曦和镜进入车厢,伊内斯留在站台上,前臂终端已经重新显示游览生态的实时状态。 #line:0bb9df0 + +列车离开海洋深层站,沿着连接海底设施与地下城市的交通轴缓慢上升。窗外的人工礁体和游览灯光逐渐落到下方,更远处的大洋仍保持着没有被照亮的黑暗。 #line:0983854 + +曦打开终端,发现伊内斯已经把联系人备注写成“母星第一站”。她犹豫了一下,没有修改,只在后面加上“大洋之心”。 #line:0c22226 + +终端本来已经保存了完整的时间与位置记录,这个额外备注并不会增加多少可供检索的信息。曦还是保留了它;她希望以后再次看见这个名字时,最先想起的不是公共行程表,而是玻璃外那条没有按照预约出现的蓝点小鱼。 #line:00161e2 + +镜没有询问她为什么需要这段重复信息。列车穿过海床上方的隔离层,外部水色逐渐被地下交通结构取代。更高处,建立在行星岩层中的城市灯光开始出现,一层又一层地延伸向尚未看见的中央穹顶。 #line:0ea040c + +曦把还沾着一点潮气的头发束到身后,重新靠近窗边。母星的第一站已经结束,下一段历史并不在遥远遗迹里,而在一座至今仍有无数人居住、维护和不断更新的地下城市中等待她。 #line:08929a5 +=== diff --git a/Assets/Story/Chapter0/C0_OceanHeart.yarn.meta b/Assets/Story/Chapter0/C0_OceanHeart.yarn.meta new file mode 100644 index 00000000..d9efded7 --- /dev/null +++ b/Assets/Story/Chapter0/C0_OceanHeart.yarn.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 090656499ea2b3d4e87f963e455dde44 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 94073015eacc34c1d8fc6786e43d60ca, type: 3} diff --git a/Assets/Story/Chapter0/C0_OldLifePreparation.yarn b/Assets/Story/Chapter0/C0_OldLifePreparation.yarn new file mode 100644 index 00000000..3af00f76 --- /dev/null +++ b/Assets/Story/Chapter0/C0_OldLifePreparation.yarn @@ -0,0 +1,334 @@ +// Chapter 0 · C0-S05 最后一段普通生活 +// 对应场景卡:docs/chapter0-scene-05-old-life-preparation-card.md +// 类型:Important TextBlock(待 StoryData 配置) +// 目标 Block ID:c0_old_life_preparation +// 入口 Node:C0_OldLifePreparation +// 标题 Localization Key:story_c0_block_old_life_preparation +// +// Unlock Condition:c0_contract_route == 1 +// Forbidden Condition:c0_contract_route == 2 +// 前置 Block:c0_public_disclosure +// 本稿不写入新的剧情变量,不新增 Timeline Marker。 +// 三项互动按固定顺序出现,每组只有一个选项。 +// +// 本稿不添加 #line 标签;待文本批准后由 Yarn 工具统一生成。 +// 角色立绘、场景切换与镜的 VFX 命令待资源确认后补充。 + +title: C0_OldLifePreparation +--- +公开说明结束后的第二天早晨,曦照着过去上学的时间离开了家。 #line:052c369 + +她没有乘坐公共事务中心提供的专车,也没有接受学校从地下通道进入校舍的安排。父亲替她检查了两遍交通线路,母亲把一份已经确认过的隐私授权塞进她的终端,随后两个人像往常一样站在门口提醒她不要错过换乘。 #line:0927fce + +唯一与往常明显不同的是镜。由无数完美镜面构成的几何复合体悬停在曦侧后方,半透明结构内部的数据流缓慢转动,将清晨住宅区的灯光切成细碎而准确的反射。 #line:085ad91 + +公共列车按时抵达。站台上有人认出了曦,也有人只认出了镜;几道目光在他们身上停留片刻,随后便主动移开。没有人围上来询问献祭,也没有人举起终端记录,只有一名赶着上班的技术员在经过时向曦轻轻点了点头。 #line:0c172c0 + +曦下意识也向对方点头,等那个人走远以后才发现,自己刚才的动作端正得像是又回到了公共会堂。 #line:0dd6a98 + +曦: 我以前上学的时候,从来没有认真想过应该怎样对路过的人点头。现在每个人看我一眼,我都怕自己回应得太冷淡;可要是笑得太热情,又好像在等他们感谢我。 #line:05d01da + +镜: 公开身份改变了他们对你每一个动作的解释。相同的点头在昨天只是礼节,今天可能被理解为候选人对公众的回应。 #line:0a123bc + +曦: 你说这些的时候,能不能偶尔不要这么干脆?我本来只是在抱怨,现在听起来像是得先写一份点头规范。 #line:04c7899 + +镜: 规范不会消除解释差异。你也没有义务确保所有观察者得出同一结论。 #line:04c3002 + +这句话没有让事情恢复原样,却至少让曦不再练习下一次应该怎样点头。她跟着通勤人群走进车厢,在自己熟悉的位置坐下,把书包抱在膝上。 #line:0607420 + +窗外的泽尼斯没有因为昨天的公共说明发生可见变化。用于调节城市光照的结构层沿建筑外墙依次展开,自动物流线从住宅区上空穿过,远处几座实验塔正在更换外部模块。 #line:0c5d206 + +这些设施整齐、可靠,也确实很难成为旅游宣传里最令人兴奋的画面。 #line:011cb52 + +曦过去总嫌这条线路太单调。如今她发现,自己能够准确说出每一处转弯后会出现什么:哪座研究楼的外墙总比系统计划晚半分钟变色,哪一段连廊能在下雨时看见排水层形成的人工瀑布,以及哪家早餐店会在第一节课开始以前卖完热饮。 #line:0e8f8a1 + +镜没有询问这些细节的意义。它悬停在车厢允许非标准形态乘客使用的空位上,镜面里同时映出真实街景、建筑线框和不断更新的运输数据,却没有向任何人展示它能够看见的完整时间线。 #line:039b9f1 + +列车抵达学校以后,曦在入口外停了下来。 #line:016b58e + +校舍还是原来的校舍。课程提示照常悬在走廊上方,迟到的学生仍然会在门禁关闭前加快脚步,实践楼外那台她曾经拆开检查的公共观测仪也仍在稳定运行。 #line:0b8140d + +没有欢迎横幅,没有提前摆好的鲜花,校方甚至把公共频道的新闻提醒暂时从入口屏幕上移走了。 #line:03216ce + +可曦站在教室门外,第一次觉得直接推开这扇门需要预先作出决定。 #line:09cd40d + +镜: 你已经在这里停留了四十七秒。门没有设置额外权限。 #line:0f9f8c8 + +曦: 我知道门没问题。我只是在想,进去以后应该先说“早上好”,还是先解释我为什么突然消失了五天,又为什么昨天出现在全星联的公共频道里。 #line:0aa7c97 + +镜: 在场者已经知道后一项事实。重复公共说明不能使这次进入更接近你过去的上课经历。 #line:078fb81 + +曦: 所以还是“早上好”。很好,这次你的答案确实有用。 #line:0ef086a + +她深吸一口气,推开教室门。 #line:0e1eba6 + +原本还有零星交谈的教室安静下来。没有人站起来鼓掌,也没有人扑上来拥抱她;所有人只是同时看向门口,又像突然想起不应该给她压力一样,努力让自己的表情显得平常。 #line:08fd80f + +那种过分整齐的平常,比掌声更令曦不知道应该把手放在哪里。 #line:0cfd3ac + +曦: 早上好。我没有走错教室吧?如果课程表趁我不在的时候改了,你们最好现在提醒我。 #line:045661b + +靠近她座位的一名同学最先笑出声,紧绷的安静终于出现一道缝隙。有人回答课程表没有改,也有人小声提醒她今天下午仍然是装置实践;更多想说的话挤在一起,最后只变成几句不太整齐的“欢迎回来”。 #line:082605c + +教师没有要求全班轮流发言,只把曦叫到原来的座位旁,确认她能够看见终端上新增的课程安排。 #line:0728bef + +教师: 学校已经替你保留全部课程记录,也准备了远程完成、暂停学业和直接免除本阶段考核的方案。你今天可以只待一会儿,任何时候想回家都不需要解释。 #line:08de7cb + +曦: 听上去我现在只要稍微皱一下眉,整张课程表都会立刻让路。 #line:02a8556 + +教师: 我们不希望课程成为新的强迫,但我也承认,所有人太担心越过边界以后,很可能把你推到另一种孤立里。所以我不会替你规定什么才算正常,你可以告诉我们今天想做什么。 #line:0e9f435 + +曦看向自己的课程终端。昨晚提交的实践观察记录还停在页面最上方,状态已经显示完成,下面却少了那条她过去很不喜欢、如今反而有些想念的提示:“等待课堂讨论。” #line:0ab9c80 + +教师: 我看过记录了。你已经补齐最后一项,系统也不会因为你不参加讨论而扣除任何评价。事实上,我原本准备等你出发以后再把意见发到终端上。 #line:0f53624 + +曦: 那份记录里还有问题吗? #line:007db61 + +教师: 你跳过了标准校准流程,直接拆开一台自检结果完全正常的教学观测仪,并且用了三页篇幅说明自检程序为什么不应该被信任。 #line:015c71c + +教师: 以结果而言,你找到了接口的间歇性偏差;以流程而言,我们仍然需要谈谈“先拆开再解释”是不是一种可以普遍推广的工作方法。 #line:0ed2ffd + +教室里又响起几声压低的笑。曦低头看着那份在契约发生以前开始、又在全星联认识她的前一晚补完的记录,忽然不想让它只以一个绿色的“完成”标记结束。 #line:06d46b1 + +-> 像以前一样,先讨论那份实践记录。 #line:0c32d64 + <> +=== + +title: C0_OldLifePreparation_ReturnToSchool +--- +曦: 我想听课堂讨论。不是为了评价,也不是因为它对接下来的旅行有多重要;我只是已经把设备拆了,总得知道自己写的解释能不能说服老师。 #line:07728ac + +教师: 可以。那就按原来的方式来。这次拆机找到了问题,但流程仍不规范,我们照常讨论。 #line:00cb42f + +曦: 谢谢。虽然这句感谢听起来好像哪里不太对。 #line:0771234 + +教师把记录投到小组终端上,没有介绍契约,也没有邀请曦分享成为英雄的感想。页面里只有观测仪的结构图、异常接口的波形,以及曦那段努力把直觉翻译成技术语言的说明。 #line:0e13c9a + +同学很快指出,她在第二次测量中没有记录环境温度;另一人认为她对自检程序的批评成立,却不足以证明每台设备都应该被拆开。 #line:0b4ebd6 + +曦一开始仍在留意大家是不是过分迁就自己,直到第三个问题准确点中了她最含糊的一段论证,她才下意识坐直身体,像过去一样开始替自己的处理顺序辩护。 #line:087d6f5 + +曦: 我不是因为讨厌标准流程才跳过去。当时所有读数都稳定得太一致,连噪声都像复制出来的。我不知道是哪一部分有问题,但我能感觉到设备是在把错误修成一个好看的结果。 #line:0b2aa1d + +教师: “感觉到”不能直接写进面向其他技术人员的结论。你最终找对了位置,更应该把别人怎样复现这个判断说明清楚。 #line:0ad628d + +曦: 我后来补了接口回路的比较数据。 #line:0474d7f + +教师: 补在最后一页,而且字号比正文小了一档。比较数据应该放到结论前面,让读者先看到证据。 #line:0f484c7 + +曦: 好吧,这一点我没有办法反驳。 #line:047a679 + +一名同学举手以前先看了看镜,又把目光转回曦身上。 #line:00389e3 + +同学: 我可以问镜一个问题吗?不是关于契约,也不是未来,只和这份记录有关。 #line:0662186 + +曦: 你可以直接问它。它会不会回答,不归我决定。 #line:0254e19 + +同学: 如果镜能同时看到设备的内部结构和数据,曦以后是不是根本不用学这些检查方法了? #line:0076919 + +镜: 我不承担替曦完成三维技术判断的职责。即使我提供完整结构,她仍然需要决定哪些信息适用于她正在处理的问题。 #line:03f8775 + +同学: 所以你不会直接告诉她答案? #line:0102e24 + +镜: 不会。你们把“答案”定义为足以支持下一步行动的信息,而信息本身不会替行动者选择下一步。 #line:063bafe + +镜的回答结束得很干脆,没有把课堂变成高维知识展示。那名同学认真记下几句话,随后才发现教师正看着自己的终端。 #line:0b09428 + +教师: 今天先讨论曦的记录。刚才关于镜的问题可以写进作业,但要把它的职责边界记录完整。 #line:0f5d581 + +同学: 明白。我会把“四维生命不会替人完成技术判断”放在结论第一行。 #line:0f19f13 + +曦: 最好加粗。这个结论对我也很重要。 #line:098047d + +课堂里的笑声这次自然了许多。有人问曦母星行程是不是已经确定,她回答只确定会先到阿斯特里亚,具体景点还在安排;有人问她是否还能与家里通信,她说明在真正进入跨界通道以前都可以。 #line:0daa17e + +至于世界数量、旅程时间和献祭后果,她只能重复一句“我们也不知道”。 #line:02e97cc + +没有人继续追问。公开说明已经让所有人理解,未知不是曦故意保留的秘密。 #line:0be90ce + +课间接近结束时,一名同学把一段很长的祝福从终端里调出来,犹豫半天以后又关掉了。 #line:021aaac + +同学: 我原来写了很多话,差不多有一次课程报告那么长。可你真的坐在这里以后,我觉得照着念会很奇怪。 #line:0767fea + +曦: 那就不要念。你可以把它发给我,我会看;或者等我以后真的需要一份课程报告那么长的鼓励时,再提醒你补交。 #line:01a3585 + +同学: 那我先只说一句。见到你回来上课,挺好的。 #line:01c952e + +曦: 我也觉得挺好的。至少比在公共会堂里回答问题轻松一点,虽然老师的问题通常更具体,也更难躲过去。 #line:0e11d3f + +上课提示再次响起,教师调出下午装置实践的分组名单。曦的名字仍在原来的位置,却被系统标记为“可自愿参加”;她所在小组已经提前准备好替她完成全部操作,只保留观察席。 #line:023f2d5 + +教师: 下午的课程可以不参加。环境适应检查要到明天才开始,你今天没有必须完成的其它安排,但这不等于你需要用课程证明自己没有受到影响。 #line:0298590 + +曦望向实践教室。那里摆着一组刚更新过接口的教学装置,几名同学已经开始分配工具,却都刻意没有把任何任务交到她手里。 #line:04acd5b + +-> 参加今天的实践课。 #line:06ee96a + <> +=== + +title: C0_OldLifePreparation_PracticalLesson +--- +曦: 我想参加。如果做到一半不舒服,我会自己停下来;不过在那以前,请把我算进分组里。你们要是连工具都不让我碰,我坐在旁边只会更紧张。 #line:025ab60 + +教师: 好。课程要求、停止权限和过去一样,今天不会因为你的身份增加额外评价。 #line:0ed4499 + +同学把原本放在观察席的工具盒推回曦面前。动作仍然有些小心,却没有再替她打开每一个卡扣。实践任务是校准一组用于模拟陌生环境信号的接收装置,难度并不高,只是新接口偶尔会出现同步延迟。 #line:0336a63 + +曦戴上操作手套,按顺序连接测试模块。镜悬停在安全线以外,没有投射结构图,也没有提醒她哪一处读数异常。它似乎能够同时看见整套装置从制造到报废的全部时间,却没有让这种视野进入一堂普通课程。 #line:097bee6 + +第一轮校准失败时,所有读数仍在许可范围内。小组成员按照流程重新启动,结果没有变化。曦盯着波形看了一会儿,把手移向接收模块侧面,又在真正拆开外壳以前停住。 #line:03a1c93 + +曦: 我先声明,这次我记得要申请拆机许可。反馈信号没有丢失,只是每次通过转换接口都会慢一点;系统把累积延迟平均掉了,所以最后看起来仍然合格。 #line:05a14b1 + +同学: 先等一下。你要拆也得先按流程申请许可,还要等我们固定好支架。 #line:0dd2df2 + +曦: 对,我先申请。这次不会跳过流程。 #line:022711f + +教师检查了她指出的波形,又批准打开侧板。问题确实来自一枚安装方向正确、内部响应却不稳定的转换接口;曦找到了位置,但拆卸时差点碰掉旁边的固定件,还是同学及时替她托住模块。 #line:0fe189b + +同学: 找到问题不代表可以少一只手。你至少应该等我把支架固定好。 #line:08ddb94 + +曦: 我知道。刚才那一下不在计划里,你可以写进小组记录,不用因为我要离开就替我删掉。 #line:02ae576 + +同学: 我本来也没打算删。第一次重启时,我们也没有检查接口延迟,这一项要一起写进小组记录。 #line:08a5de7 + +他们重新安装模块,第二次校准顺利通过。完成提示亮起时,没有掌声,也没有人把这次普通维修称作英雄能力;几个人只是互相核对数据,然后为了报告应该由谁整理争论了几分钟。 #line:0c463cf + +那段时间里,曦短暂忘记了公共信箱里仍在增加的祝福,也忘记镜正悬停在自己身后。她只是一个擅长凭直觉发现装置问题、又常常需要别人提醒操作流程的学生。 #line:0c4a61b + +直到课程结束,一名同学提议拍一张照片,教室才重新安静了一瞬。 #line:0a43366 + +同学: 不是公开照片,也不会上传公共频道。只是我们这个小组每完成一次实践都会留记录,今天如果故意不拍,反而更像在告别。 #line:0b5aeaf + +曦: 那就拍,但不要让我站在中间。还有,镜不一定能完整放进画面,你们不要为了它把所有人挤到边缘。 #line:0f7ad3d + +镜: 我不需要出现在你们的记录中。 #line:0b20c1d + +曦: 它的意思是不用给它安排位置,不是让大家假装它没来。把镜面拍进去一点就好,否则以后看照片的人可能会以为我带了一组异常反光板来上课。 #line:03c9bd5 + +照片最终没有完美构图。有人闭了眼睛,桌上还放着没收好的工具,镜只有一小部分映在画面边缘,把教室灯光分成了几道颜色不同的细线。曦看完以后没有要求重拍,只把它和同学们未念出口的长篇祝福一起存进私人终端。 #line:0777130 + +离开学校时,没有人排成一列向她告别。教师只发送了后续课程资料,告诉她即使无法继续完成,也可以按照兴趣阅读;同学们则像普通放学一样分批走向不同交通线路,只在分别时提醒她不要忘记查看小组报告。 #line:0d18e50 + +曦走出校门以后回头看了一眼。那扇早晨让她停了四十七秒的门仍在不断开合,下一批学生正赶着进入晚间课程,没有人因为她离开就让学校停在原地。 #line:0df242f + +曦: 今天确实没有和以前完全一样。 #line:03212b1 + +镜: 公开信息无法被他们遗忘。要求完全相同,只会使所有人隐藏已经发生的变化。 #line:0487a67 + +曦: 我知道。我原来以为“正常”就是谁都别提契约,像这几天根本没有发生过;可要是真的那样,我大概又会觉得他们不在乎。 #line:022abcc + +镜: 你要求的不是恢复过去,而是在已经改变的关系中保留过去仍然有效的部分。 #line:093412a + +曦: 比如老师仍然会批评我的报告,同学仍然会把我差点碰掉固定件写进小组记录。 #line:011570a + +镜: 那些判断与契约无关,因此不需要因契约而改变。 #line:0987498 + +曦: 这句话听起来不算安慰,但我现在确实感觉好一点。你不用为此发表意见。 #line:090cd5f + +镜没有回答。它只是随着曦走向公共列车,在拥挤的人流中始终保持着不远不近的距离。 #line:066303f + +<> +=== + +title: C0_OldLifePreparation_TravelChecks +--- +返校后的八天里,出发准备终于把“以后”拆成一项项能够完成的具体事务。 #line:0d091f2 + +第一日,医疗人员为曦建立新的健康基线,记录她在常规重力、气压与神经刺激下的反应。检查结果全部正常,却没有人把“正常”解释成能够适应所有异世界;这些数据的作用,只是在未来出现变化时让她知道自己失去了什么。 #line:01e20e8 + +第三日,曦第一次穿上环境适应衣装。衣装能够调节常见温度、压力和空气差异,外观却比她想象中轻便许多。她照着说明测试紧急密封功能,结果因为没有把袖口完全展开,被突然收紧的材料夹住了手腕。 #line:0b8bc87 + +曦: 如果我在异世界第一次使用它的时候也被夹住,你会把这算成生命危险吗? #line:0f7381c + +镜: 不会。你能够自行解除,并且该状况不妨碍继续履约。 #line:0ffa2b8 + +曦: 我只是想确认,你的保护标准到底有多严格。现在我知道了,被衣服欺负不在范围内。 #line:01a2480 + +负责测试的技术人员忍住笑,重新示范了一次袖口展开顺序。镜没有替自己的回答增加缓和语气,也没有因为曦的抱怨调整判断标准。 #line:00c1d12 + +第五日,旅行终端完成离线资料、记录、翻译和本地装置连接测试。星联能够装入已知世界的大量知识,却无法为尚未见过的语言和技术保证结果。曦没有要求研究人员再增加一个“自动解决所有问题”的功能,只把常用工具放在最容易打开的位置。 #line:0786f3d + +第七日,公共事务系统确认了前往阿斯特里亚的民用航线。政府没有为曦征用国家舰船,只在普通客运安排中保留了相对独立的舱段,并把镜的非标准形态登记为随行高维投影。 #line:0299e6a + +其余时间,曦仍然在家里起床、吃饭和整理物品。她读了一部分公共信箱,拒绝了十几场纪念活动,也接受了一所小学发来的普通问题清单;其中最具体的一项是“异世界会不会也有必须按时交的实践记录”。 #line:0567f76 + +曦没有办法回答,只把这个问题标记为以后如果有机会就认真验证。 #line:018a78f + +离开前一日下午,官方装备全部送到家中。看似足以跨越世界的物品只装满一只行李包的大半空间,真正让一家人花费时间的,反而是剩下那一小部分应该放些什么。 #line:0cf2df4 + +<> +=== + +title: C0_OldLifePreparation_Packing +--- +客厅地面摆着衣物、常用药、一盒实体照片、学校留下的课程资料,以及几件谁也无法证明有用、又不愿立刻收回原处的小东西。 #line:099ebe2 + +母亲把照片盒打开检查,里面既有经过认真挑选的家庭合影,也有曦小时候画得比例完全错误的星图。曦试图以所有照片都有电子备份为理由减少行李,母亲却把其中几张重新放了回去。 #line:04cc5e9 + +母亲: 备份保存的是图像,这几张是你自己从旧箱子里挑出来的。两者并不冲突。更何况,官方装备只占这么一点地方,没有哪条规则要求剩余空间必须继续装有用的东西。 #line:003b255 + +曦: 你说得好像“没用”也是一种行李分类。 #line:03432e6 + +母亲: 对私人行李来说,本来就是。要是每件东西都必须证明能帮助完成任务,你带走的就只剩下任务需要的人。 #line:05d46dc + +镜悬停在客厅靠窗的位置,没有替物品判断纪念价值。它已经确认普通来源世界物品能够随行,也说明跨界通道不会因为一盒照片增加履约风险;除此以外,选择属于曦。 #line:0b1d9cf + +父亲从储物间搬来一只旧工具箱。他打开以后先取出几件明显不适合携带的设备,又逐一放回去,最后只剩下一支使用多年的多功能探针。 #line:076021f + +探针的外壳已经换过两次,侧面的防滑层也有一块颜色不同的修补痕迹。它不是泽尼斯最先进的工具,更不具备针对异世界技术的专用接口;曦十二岁第一次把家用清洁装置拆开以后,父亲就是用这支探针教她怎样确认一条线路真的断开。 #line:066e67f + +父亲: 它很旧,能检测的范围也比旅行终端窄。你以后遇到的装置未必使用它认识的任何信号,所以我不能说带上一定有用。 #line:0e97002 + +曦: 可你还是把它找出来了。 #line:071e6b8 + +父亲: 因为我想确认,有没有什么是你用惯了、又愿意带走的。准备不等于我必须假装每一样东西都能保护你;有时候只是让你打开包的时候,看见一件知道该怎么握住的东西。 #line:0ece9bb + +曦拿起探针,拇指自然落在侧面的启动位置。顶端亮起一小点稳定的白光,和她记忆里每一次检查学校设备、修理家用装置时没有区别。 #line:0d35c2b + +-> 把旧探针放进随身包。 #line:09d5b19 + <> +=== + +title: C0_OldLifePreparation_DepartureDate +--- +曦: 那我带着它。不是因为我觉得一支旧探针能解决异世界的问题,只是新的工具通常要先看说明,而这个不用。 #line:0468731 + +父亲: 这个理由已经够了。如果真的用不上,也不算带错。 #line:0bb31e8 + +曦把探针放进随身包内侧,又把小组照片存入终端的离线区域。母亲没有继续替她增加物品,只把行李重新称重,确认还有足够空间留给母星旅途中真正想带走的纪念品。 #line:0eaeffb + +就在一家人准备收起散落在客厅里的东西时,旅行终端发出一声轻柔提示。 #line:0751319 + +行程确认显示:次日上午八时四十分,从住宅区公共交通站出发;九时二十分抵达泽尼斯星际客运枢纽;十一时整进入前往母星阿斯特里亚的民用超光速航线。 #line:0a6db69 + +下面还有一行没有任何修饰的预计抵达时间。整份安排像普通旅行通知一样准确,没有使用“使命”“英雄”或“文明未来”中的任何一个词。 #line:048bda6 + +曦看着日期,过了很久才开口。 #line:044b95a + +曦: 原来真的是明天。我知道准备期总会结束,可它写成具体时间以后,好像和之前说的“十几周以内”完全不是一回事。 #line:091a3bf + +母亲: 明天先按平常时间吃早饭。港口附近的轨道正在维护,我们比系统建议的时间早一班出门,免得一路都在担心迟到。 #line:097e85b + +父亲: 我已经看过替代线路。即使主线路临时停止,也有两条公共交通可以到达,不需要申请专车。 #line:0bd49a2 + +曦: 你们现在讨论交通,是因为不想讨论别的吗? #line:00cc48d + +父亲: 有一点。也是因为交通确实需要讨论。两件事可以同时成立。 #line:0d1a160 + +母亲把行李包合上,没有说这是他们一起整理的最后一件行李,也没有把客厅里剩下的时间立刻变成告别仪式。 #line:0cd2bb3 + +母亲: 今天还没有结束。我们先把地上的东西收好,再决定晚饭吃什么。明天到了港口以后,该说的话仍然可以在那里说。 #line:0c50363 + +镜: 次日行程已经确认。你们仍可自行决定今晚的谈话顺序。 #line:08a0ee6 + +曦: 我们知道。正因为改变不了,才需要自己决定先说什么。 #line:0a9919c + +镜没有反驳,也没有表示理解。它只是把次日行程同步到自己的观察记录中,仿佛“明天”对它而言只是一段已经完整存在的时间,而不是正在向这个家庭逼近的界线。 #line:07f3dff + +窗外的泽尼斯开始切换夜间照明。实验塔、住宅层和公共交通仍按原有节律运转,曦曾经嫌弃过无数次的单调景色一处也没有消失。 #line:0886db2 + +她把收好的行李放到房门旁,没有再打开检查。第二天,她会与父母一起走向星际客运枢纽,离开真正生活过的世界,前往那颗只在教材和旅行影像中见过的文明母星。 #line:0e61c5e + +但在这一天剩下的时间里,她仍然只是回家吃晚饭的女儿,刚刚结束一段课程的学生,以及一个尚未真正学会怎样告别的十七岁少女。 #line:05ec9a0 +=== diff --git a/Assets/Story/Chapter0/C0_OldLifePreparation.yarn.meta b/Assets/Story/Chapter0/C0_OldLifePreparation.yarn.meta new file mode 100644 index 00000000..f36b1f32 --- /dev/null +++ b/Assets/Story/Chapter0/C0_OldLifePreparation.yarn.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 37fb9dc30844d47458b120581ef1af16 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 94073015eacc34c1d8fc6786e43d60ca, type: 3} diff --git a/Assets/Story/Chapter0/C0_PrivateBriefing.yarn b/Assets/Story/Chapter0/C0_PrivateBriefing.yarn new file mode 100644 index 00000000..e47e57e7 --- /dev/null +++ b/Assets/Story/Chapter0/C0_PrivateBriefing.yarn @@ -0,0 +1,364 @@ +// Chapter 0 · C0-S01 私密会面 +// 对应场景卡:docs/chapter0-scene-01-private-briefing-card.md +// 类型:Important TextBlock(待 StoryData 配置) +// 入口 Node:C0_PrivateBriefing +// +// 本稿不写入章节变量。三项互动问题按固定顺序出现, +// 每组仅一个选项,用于控制阅读节奏,不形成永久分支。 +// +// 角色立绘待 CharacterRegistry 与肖像资源确认后再补充。 + +title: C0_PrivateBriefing +position: -17,-576 +--- +泽尼斯本地时间十六点十七分,曦正在拆一台没有坏掉的教学观测仪。 #line:002605c + +它当然没有坏。讲台终端上的自检结果一片翠绿,负责实践课的教师也明确说过,这堂课的目标只是校准,不包括拆卸。可曦盯着那幅始终慢半拍的星图看了几分钟,还是从工具盒里摸出一枚薄得像纸的探针,沿着外壳接缝轻轻一划。 #line:045384d + +固定卡扣依次松开。藏在机壳深处的感应环比图纸上偏了不到一毫米。 #line:0e54cc7 + +曦把它推回正确的位置。星图随即停止颤动,数百颗用于教学的模拟恒星同时归位,仿佛刚才那点微小的误差从未发生过。 #line:044c811 + +就在她准备把外壳合上时,教室的公共提示灯亮了。 #line:0ee78e5 + +不是下课通知,也不是家长留言。教师看完终端上的内容,先是抬头确认了一遍教室编号,又隔着几排座位看向曦。那一瞬间的迟疑很短,却足以让周围正在收拾工具的同学安静下来。 #line:035fa4d + +通知来自泽尼斯公共事务中心,只对曦本人说明。内容没有标注紧急,也没有给出事项名称,只写着一辆公共列车已经为她调整了停靠顺序,有两位来访者正在等她。其中一位名叫程衡——这个名字不需要附加职务。 #line:05f7d3b + +二十七分钟后,曦站在公共事务中心最高层的一扇门前。学校借给她的工具盒还夹在手臂下面,袖口沾着一点没擦干净的导电凝胶。一路上没有警卫接送,没有车辆封路,甚至没有人要求她换掉校服。列车照常在每一站停靠,车厢里的乘客仍在讨论晚餐、天气和明天的工作。 #line:0227278 + +那种一切如常的感觉,反而让这次会面显得更加不真实。门无声滑开,后面的房间却不大:没有旗帜,没有高出地面的主位,也没有一圈等着记录她反应的陌生人。透明外墙之外,研究区的穹顶正沿着暮色依次收拢;更远处,一列银白色公共列车穿过高架连廊,车窗里挤着一格格温暖的灯。 #line:029e6e0 + +圆桌旁只有两个人。程衡比公共影像里显得更疲惫一些。他没有穿礼服,只在深色外套的领口别着代表公共职务的窄银徽记。坐在他右侧的女性穿着暖灰色短外套,桌前摆着纸、笔和一只关闭了联网功能的终端。程衡看见曦后随即起身,却没有隔着桌子伸手。 #line:07cc03d + +程衡: 下午好。临时把你从学校请来,很抱歉。 #line:05eab39 + +曦: 总统先生……真的是您?是不是有人把通知发错了? #line:031372d + +程衡: 没有发错,是我请你来的。让你在没有任何说明的情况下离开学校,我很抱歉。 #line:0e5605b + +曦又看了一眼门外。走廊上没有埋伏着另一群人,门牌也确实写着她刚才看见的房间编号。她这才发现自己一直把工具盒紧紧夹在怀里,像是只要没有松手,就还没有真正离开那间实践教室。 #line:059dd02 + +曦: 我应该先说明,那台观测仪不是我拆坏的。我拆开之前,它就已经有误差了。 #line:0b91b87 + +程衡怔了一下。那不是总统在镜头前停顿的方式,而是一个人没有料到会听见这句话时最普通的反应。 #line:05ef297 + +程衡: 我相信学校会妥善处理那台观测仪。今天请你来,不是因为你做错了什么。 #line:0212d17 + +女性将关闭的终端转向曦,让她看清屏幕上表示“未记录”的灰色标志。 #line:0035c24 + +徐允雅: 我叫徐允雅,负责这次接触研究,也负责确认你在整个过程中能够自由表达意见。开始以前,有几项权利必须先告诉你。 #line:082c301 + +徐允雅: 你可以随时暂停谈话,可以要求休息,可以联系父母,也可以要求一位与政府和研究项目都无关的独立顾问在场。你不需要为离开提供理由。只要你说今天不想继续,这扇门就会打开,之后也不会有人以纪律、学业或者公共义务的名义追问你。 #line:00dc1cf + +曦: 听起来一点也不像普通谈话。我是不是应该先给家里发个消息? #line:0d3ee35 + +徐允雅: 可以,现在就可以。今天的谈话确实不普通,但是否继续听下去,仍然必须由你决定。 #line:03d8a34 + +程衡: 接下来要说的事关系到整个星联。正因为如此,我们更不能假装你没有拒绝听取它的权利。 #line:0020386 + +桌上放着一只很薄的纸质文件袋。纸张在泽尼斯并不罕见,但通常只用于纪念、艺术或必须留下触感的场合。封面没有绝密印章,也没有警告,只印着四个标题:共同梦境、通信密钥、未知接触、候选人确认。 #line:08f7c46 + +曦没有坐下。她手里的工具盒压着臂弯,边角硌得有些疼。 #line:0f6edc7 + +曦: “候选人”是指我吗?可我连自己在候选什么都不知道。 #line:0629185 + +程衡: 一份我们没有权替你答应的契约。 #line:0901b29 + +窗外的列车驶入下一段封闭轨道,明亮的车窗一格接一格消失在墙后。房间里安静了几秒,曦终于把工具盒放到脚边,在距离文件袋半臂远的位置坐下。 #line:0ecd66b + +曦: 我……一时不知道该先问哪一件。就从最明显的开始吧。 #line:0ebf338 + +-> 为什么是我? #line:0bd54e2 + <> +=== + +title: C0_PrivateBriefing_WhyMe +position: -10,-371 +--- +徐允雅: 我们不知道。 #line:06a3202 + +她回答得很快,既没有用“目前还不能确定”来拖延,也没有先说一段足以让人安心的话。 #line:0e97906 + +徐允雅: 十七天前,我们接触到的对象指定了一名十七岁的少女。它没有提供选拔条件,只给出了足以唯一确认身份的信息。所有信息都指向你。 #line:006cd5c + +曦: 可我的成绩很普通,也没参加过什么特殊训练。我父母只是普通技术人员。如果你们真的查过我的档案,就应该知道我除了比较会摆弄装置,没有哪一点像是能代表整个文明的人。 #line:074928b + +徐允雅: 我们查过,而你刚才说的都正确。现有资料里没有任何一项能解释这次选择。 #line:09afabd + +曦: 那它为什么偏偏挑中我?总不能连理由都不肯告诉你们吧? #line:0014ee4 + +徐允雅: 我们反复问过,它拒绝回答。关于选择你的理由,目前没有任何可靠解释。 #line:0d5e520 + +徐允雅把文件袋向前推了一点,又停在曦伸手就能够到、却不会被迫碰到的位置。 #line:0a627e9 + +徐允雅: 我们检查过出生记录、教育档案、家庭关系、医疗数据、旅行记录,也核查过你和最初接触者之间是否存在任何直接或间接联系。没有发现共同点,没有隐藏的选拔程序,也没有证据表明你的父母替你报名过什么。 #line:0869a33 + +曦: 所以它说的“随机”可能是真的,也可能只是懒得向我们解释? #line:070e11c + +徐允雅: 对方使用的意思接近“随机选中”。我们能确认它没有给出评价,却不能证明它采用了什么样的随机方法。两者有区别,我不想把没有证据的部分说成事实。 #line:0e9406b + +曦: 如果只是随机,为什么不能再随机一次?找一个受过训练的成年人,或者至少找一个自己愿意报名的人。 #line:02246e1 + +程衡: 我们提出过替代方案。成年志愿者、专业团队、由公共机构承担任务,甚至由我本人替代你。对方全部拒绝。 #line:067bcdf + +曦: 你们连总统都试过了?它还真是一点商量的余地都不给。 #line:01b281d + +程衡: 从结果看,是的。我的职务、年龄和个人意愿对它都没有意义。 #line:05e9e69 + +曦本来想笑一下,那句话却没有真正变得好笑。她望向桌面,在那只文件袋的右下角看见一行极小的字:候选人数,一。 #line:0db8d60 + +曦: 也就是说,我不是最合适的人。我只是唯一一个它肯接受的人。 #line:0ec4105 + +程衡: 是。你被指定了,但这不代表你比别人更适合承担风险。 #line:0734eb0 + +曦: 我明白了。可这两句话听起来,还是差得很远。 #line:00be7db + +程衡: 本来就差得很远。任何把“被指定”解释成“你天生应该承担”的说法,都会给你一个并不存在的义务。 #line:02b1c4e + +徐允雅: 我们今天不会告诉你这是命运,不会说你的某种品质注定要接受任务,也不会拿“只有你能做到”来证明你必须去做。现在能够确认的只有身份,没有原因。 #line:0886485 + +曦抬起头。程衡没有回避她的视线,徐允雅也没有趁这段沉默把文件翻到下一页。 #line:07be1db + +这不是一个令人满意的答案。可它至少没有把未知包装成赞美,再用赞美逼迫她点头。 #line:005aab1 + +曦: 那至少告诉我,为什么你们相信这不是谁开的恶劣玩笑。 #line:0d85a8e + +程衡: 可以。接下来我们就说明这次接触是怎样发生的,以及目前究竟能证明什么。 #line:08adb6b + +-> 那组通信密钥究竟证明了什么? #line:0c4d627 + <> +=== + +title: C0_PrivateBriefing_CommunicationKey +position: -10,-148 +--- +徐允雅打开文件袋,取出第一叠记录。最上方不是公式,也不是某种陌生文字,而是一张由光点和线段组成的多层结构图。它看上去近乎对称,细看时却找不到任何可以重复套用的局部规律。曦只盯了几秒,便本能地开始想象它应该如何拆分、如何在装置里逐层装配。 #line:04334c6 + +徐允雅: 十七天前,大量分布在不同星球、从事不同研究工作的科学家做了同一个梦。他们事先没有共同会议,也没有接触同一批实验数据。 #line:055d080 + +徐允雅: 梦里是一间没有门窗的深色观测室。没有人影,没有声音,也没有文字说明。房间中央只有这组结构。每个人醒来以后,都能完整画出它;不仅形状一致,连绘制顺序和每一处停顿都一致。 #line:04dda49 + +曦: 这么复杂的东西,看清都很困难。人在梦里怎么可能完整记住? #line:08be760 + +徐允雅: 正常情况下不能。这是我们最先确认的异常之一。 #line:0a5df23 + +她翻过结构图。下一页列着一串相互隔离的核验记录,每一项后面都有不同机构的签名。 #line:072a6cf + +徐允雅: 最初十天,我们没有按照梦里的提示进行任何构建。研究团队先排除了已知设备影响、药物、传染性神经反应、信息污染和人为组织。参与者被分开询问,原始记录彼此隔离,结果仍然一致。 #line:0367f40 + +曦: 然后你们在完全不知道另一端是什么的情况下,还是把它造出来了? #line:06c91fd + +徐允雅: 我们先做了不会向外发送信号的模拟,再建立完全隔离的接收装置。那组结构不是一段消息,而是一把通信密钥。只有按照梦中给出的关系完成构建,接收装置才会对询问产生回应。 #line:0128e3b + +曦: 它是怎么回应的?突然说话,还是在屏幕上写出了什么? #line:0753233 + +徐允雅: 可以理解问题,能够保持上下文,也能够给出我们尚未输入、但经过独立验证为真的信息。它没有通过声音或形象出现。我们只能确认,通信另一端存在某种能够主动选择回答内容的对象。 #line:02a69d0 + +曦: 没有名字,也没有形体,所以你们最后决定叫它“神”? #line:070cdd0 + +程衡: 那是临时称呼,不是研究结论。它没有给出名字,也没有要求崇拜。只是它展现的能力超出了星联现有的解释范围,而它提出的交易直接关系到文明能否进入更高维度。“未知通信对象”适合写进报告,不适合每次谈话都完整念一遍。 #line:0bee245 + +曦: “神”倒是方便。也很容易让人忘记,它可能在撒谎。 #line:0b7cca3 + +徐允雅: 对。通信密钥证明接触真实存在,回应也展现了远超我们的能力;这些都不能证明它善良,不能证明它会完整履约,更不能证明接受交易对你是安全的。 #line:0890d76 + +程衡: 我们没有把奇迹当成信用证明。能够做到不可思议的事,不代表它值得信任。 #line:07b052d + +曦看着那张结构图。它不像宗教图腾,更像一件被剥去了用途说明的精密零件。最令人不安的并不是看不懂,而是她隐约觉得,如果给她足够时间和工具,她真的能够把它装进某台机器里。 #line:07cc1f0 + +曦把那一页轻轻放回桌面,指尖却仍然压着纸角。她犹豫了一会儿,才问出从看见“候选人”三个字起就一直不敢先问的问题。 #line:011e1e5 + +曦: 既然你们已经联系上了它……它有没有说过,如果我不合作,会对我或者家里做什么? #line:0248164 + +-> 如果我拒绝呢? #line:0b1a753 + <> +=== + +title: C0_PrivateBriefing_Refusal +position: -4,66 +--- +徐允雅: 契约不会成立,通信也会终止。除此之外,它没有提出任何惩罚。 #line:0d5cd54 + +曦: 只是这样吗?它不会再来找我,也不会把后果算在爸爸妈妈身上? #line:0e6db68 + +徐允雅: 没有惩罚,没有追索,也不会重新指定别人。你的父母不会受影响,你的学业和生活不会留下公开记录。与候选人身份有关的资料会被封存,知情人员不得向你询问拒绝理由。 #line:030dddd + +曦: 可是星联会失去它开出的条件,对吧?这部分总不会也能当作什么都没发生。 #line:01b6067 + +程衡: 对,星联会失去这次机会。这是拒绝以后唯一能够确认的重大后果。 #line:0765080 + +程衡回答得太平静。曦下意识看向窗外。研究区的夜间照明已经全部开启,塔群之间浮着细长的航道标识。那是她从小看到大的景色,稳定、精确,仿佛文明所有难题最终都能被分解成足够多的步骤,再由足够多的人解决。 #line:01ccc78 + +曦: 我想听一句不写在说明文件里的实话。您希望我答应吗? #line:0e0ee8f + +程衡没有立刻回答。徐允雅也转头看向他,像是在确认他会不会越过这场谈话最重要的边界。 #line:0c0d6ea + +程衡: 作为总统,我希望这次交易成立。那可能是星联继续前进的唯一机会。假如我说自己完全不在意,就是在欺骗你。 #line:034f05d + +程衡: 但我的希望不是你的义务。我不能先告诉你全体公民会失去什么,再要求一个十七岁的学生证明自己足够高尚。那不是自愿,只是把强迫写得比较体面。 #line:0ee5026 + +曦: 可我已经知道了。就算你们不要求,我也不可能当作没听见。 #line:0e3ce55 + +程衡: 是。所以我们只能把事实说清楚,不能再替事实增加道德评价。你拒绝以后,失去机会是政府和整个文明必须承担的结果,不是你欠下的债。 #line:02e72cd + +曦: 如果以后有人知道呢?他们也会这么想吗? #line:0e9b71f + +徐允雅: 不会有人知道。即使发生信息泄露,公共机构也有义务保护你和家人。我们不能保证世上每一个人都善良,但能保证制度不会把你交给他们审判。 #line:0d62496 + +曦: 你们好像从一开始就在认真准备,如果我拒绝,之后应该怎么办。 #line:0be1a1d + +徐允雅: 因为只有拒绝能够真正发生,接受才可能被称为自愿。 #line:080149f + +房间里再次安静下来。工具盒躺在曦脚边,盒盖没有扣紧,里面那枚纸一样薄的探针随着空调气流轻轻碰了一下内壁。 #line:0584d9f + +曦: 我大概明白了……可我还是不知道,它究竟想从我这里拿走什么。 #line:0fab2d3 + +<> +=== + +title: C0_PrivateBriefing_ExplainContact +position: -8,255 +--- +徐允雅翻到文件中段。纸页上没有星图,也没有关于高维空间的壮丽想象,只有一列短得令人失望的问答记录。大部分问题后面都标着同一个结果:拒绝回答。 #line:0cb01f8 + +徐允雅: 星联已经在三维世界可以验证的技术方向上接近极限。我们仍然能改良设备、扩大工程规模、建设更多居住地,但所有通往第四维度的研究都会在同一类不可突破的边界前停止。 #line:076999b + +徐允雅: 接触对象把那道边界称为“科技锁”。它没有解释科技锁如何形成,也没有在契约成立前提供任何与飞升有关的理论。它只承诺,如果你自愿接受条件,它会解除限制。 #line:0ebc7a0 + +曦: 那么科技锁解除以后,星联就真的能够飞升吗? #line:0fb2ae2 + +徐允雅: 不会立刻发生。我们仍然需要理解新的规律,完成研究,再决定如何使用它。它提供的不是现成答案,而是让答案重新成为可能。 #line:00899e2 + +曦: 如果科技锁一直不解除,星联还能像现在这样生活多久? #line:0e96c35 + +程衡: 我们可以继续生活很久。普通的恒星灾难、资源枯竭和行星毁灭都已经不足以终结星联。对于你、你的父母,甚至许多个世代之后的人来说,明天仍然会到来,城市仍然会运转。 #line:0b12390 + +程衡: 但三维宇宙有它自己的终点。时间足够长,一切可以维持生命和文明的条件都会消失。我们可以把那一天推得极其遥远,却不能在现有维度中让它永远不来。 #line:07b7334 + +曦: 所以这不是一场正在发生的灾难。 #line:0b46c6b + +程衡: 不是。没有城市正在毁灭,也没有人必须等着你明天去救。 #line:0541b38 + +曦: 你们也不是为了救明天的人,才今天来找我。 #line:0a20ed7 + +程衡: 不是。我们是在文明仍然有时间、也仍然有能力尊重一个人选择的时候,面对一次可能只有一次的机会。若等到所有人都在恐惧中求生,再谈自愿就太晚了。 #line:00d5f57 + +曦把视线移到那列问答记录上。她原本一直用指腹来回蹭着工具盒的搭扣,此刻才发现那里已经被汗浸得有些发滑。 #line:0ff1feb + +曦: 那么,它要我做什么?总不会只是去什么地方旅行一趟。 #line:0f3c8cb + +程衡没有照着纸念,因为他们得到的全部规则只有一条。 #line:0b3d92a + +程衡: 你会在一位高维存在的陪同下,前往多个不同的世界。每次离开一个世界以前,你必须献上一件自己真诚认为是那个世界最珍贵的事物。 #line:0d93417 + +曦等了几秒。她以为后面还会有任务期限、安全说明,或者至少有一份长得令人头痛的附加条件,可程衡没有继续说下去。 #line:0ef08d2 + +曦: 这就算完整规则了吗?关于“献上”究竟是什么意思,一句解释都没有? #line:05c595d + +徐允雅: 这是我们得到的全部规则。除此以外的问题,对方都拒绝回答。 #line:024f2a3 + +曦: “世界”有多大?“一件”只能是物品吗?“献上”是交给它、带走,还是毁掉?谁来判断我是否真诚?如果我找不到呢? #line:03279e2 + +徐允雅: 这些问题我们全部问过。它没有回答。 #line:01596df + +曦: 那些世界里有什么、我要去多少个、整个任务要多久——这些也全都没有答案? #line:08912aa + +徐允雅: 全部没有答案。我们只能确认旅程不止一个世界,除此以外没有可靠信息。 #line:091b83f + +曦: 那……等全部任务完成以后,我还能回来吗? #line:075a856 + +这一次,徐允雅没有马上重复那四个字。她合上记录,双手仍按在封面上。 #line:037a1a0 + +徐允雅: 我们不知道。它拒绝说明任务完成后你会去哪里,也拒绝保证你还能回到星联。我们必须把这次离开按照可能的永别来向你说明。 #line:0243e14 + +窗外,一艘短程通勤艇从建筑下方升起。它在透明外墙上留下片刻流动的光,随后汇入夜空中密集而安静的航线。 #line:09163de + +曦: 你们知道得这么少,也能把它叫作契约? #line:0fbf702 + +徐允雅: 从知情同意的标准看,这是一份信息严重不完整的契约。对方掌握了大部分解释权,而你承担的风险无法估量。你完全可以仅凭这一点拒绝。 #line:08716b1 + +曦: 也就是说,我拒绝,科技锁就会一直留在那里;可我答应,又可能再也见不到任何认识的人。 #line:0e8bdae + +徐允雅: 是。两边的事实都不会因为我们换一种更温和的说法而消失。 #line:0f9b285 + +曦: 你说这些的时候,能不能偶尔不要这么干脆? #line:008f8d7 + +徐允雅的手指在文件封面上停了一下,像是在重新选择接下来该用什么语气。 #line:022b78e + +徐允雅: 可以。但那只会让答案听起来轻一点,不会让你面对的事真的轻一点。 #line:0820f1c + +曦没有再说话。她想起半小时前还摊在实验桌上的观测仪,想起同学离开教室时争论今晚去哪里吃饭,也想起父母早晨出门前提醒她,家里的食材配送会晚十分钟。那些细小得不值得写进任何历史的事情,忽然都像隔着一层透明外墙,仍在原处,却已经无法随手触碰。 #line:046dfec + +程衡: 如果今天的说明让你难以继续,我们可以到这里为止。 #line:0ade7c8 + +曦: 我不用现在就回答吧?至少……能不能先让我回家,把这些话重新想一遍? #line:0c5dfb3 + +徐允雅: 五天。不是五天后自动同意,而是五天后这份提议失效。期间你可以随时终止,也可以要求查阅我们掌握的全部记录。你回家以后,我们会安排你的父母知情;你们可以一起询问独立顾问,也可以要求政府人员不在场。 #line:0daa272 + +曦: 如果我真的答应,会立刻被送走吗? #line:0de4185 + +徐允雅: 不会。契约成立后,那位陪同你的高维存在才会出现。对方允许十至十五周的告别与准备时间,具体安排可以包含你提出的个人愿望。准备结束以后,旅程才会开始。 #line:04771a7 + +曦: 十至十五周……听起来很长,可如果那真的是最后一次,好像又短得吓人。 #line:06a3cd7 + +程衡: 是。有人会觉得足够,有人无论得到多久都会觉得不够,我们不会替你规定该怎样使用。 #line:0fadd4b + +曦: 够一个人把房间收拾干净,补完课程,和每个认识的人好好告别。 #line:068600d + +程衡: 至少在准备结束以前,你仍然可以照常生活,也可以提出自己希望完成的事情。 #line:08cd357 + +曦抬头看向程衡,像是仍然想从他的表情里找到一句没有被写进正式记录的答案。 #line:01ec812 + +曦: 如果我现在问您,这件事到底值不值得,您还是不会替我回答,对吗? #line:0279105 + +程衡: 我会告诉你,它对星联极其重要;也会告诉你,没有任何公共利益能自动替你决定是否拿自己的人生去交换。 #line:0ef303b + +曦: 这听起来还是把最难的问题推回给我了。 #line:0f00589 + +程衡: 是。因为它本来就属于你。我们若替你回答,答案无论多么正确,都会变成强迫。 #line:07a99a3 + +曦看了他很久,像是在确认这是不是一段提前准备好的发言。程衡没有继续解释,也没有趁机说出“希望”、“未来”或“所有人”之类更容易留在心里的词。 #line:0108307 + +最后,曦伸手拿起文件袋。第一次没有拿稳,纸页在袋子里向下滑了一截;她匆忙扶住,又装作只是在整理封口。 #line:0e71bc3 + +曦: 我今天……肯定给不了答案。我想把资料带回去,先和爸爸妈妈一起看。 #line:061c0bf + +徐允雅: 你今天不需要给出任何答案。这份副本本来就是为你和父母准备的。 #line:05b21fc + +曦: 里面不会一直劝我“为了文明应该答应”吧?我怕看着看着,连自己到底怎么想的都分不清了。 #line:025d3bd + +徐允雅: 不会。资料只记录已知事实、未知事项和你的权利,不会替你评价哪一种选择更高尚。 #line:0e51bf4 + +曦: 还有,那位会陪我去的高维存在——我能在签约以前见到它吗? #line:041ef4d + +徐允雅: 不能。它只会在契约成立后出现。我们对它的形态、性格和具体能力同样没有可靠资料,不能用未经证实的描述影响你。 #line:0e4e15c + +曦: 真是份让人安心的旅行计划。 #line:0761f4a + +这一次,程衡的神情里掠过一点极淡的无奈。 #line:0c38941 + +程衡: 这部分我们确实无法给你更多保证,很抱歉。 #line:0e45bce + +曦: 我知道。可我现在还不想说“没关系”。 #line:0580857 + +程衡: 你不必说,也不需要照顾我们的感受。 #line:0b52c8d + +他起身,替曦开启离开提示,却没有走到门边送她,也没有伸手要求一次象征性的回应。 #line:0f45c83 + +程衡: 今天先回家吧。剩下的问题,等你愿意继续时再谈。 #line:0cbaebc + +曦把工具盒重新夹在左臂下,右手抱着文件。纸张并不重,可她站起来时仍然调整了两次姿势。 #line:05a68b2 + +门外的走廊和来时一样明亮。工作人员从远处的交叉通道经过,自动贩售台正在更换晚间菜单,楼下传来列车到站的柔和提示音。没有人知道,一个可能决定星联未来的回答,正被一名还穿着校服的少女带回家。 #line:0991600 + +走进升降梯前,曦终于翻开文件袋的第一页。 #line:0eaa7c9 + +页面中央只有三行字,短得不像一份足以改变文明未来的记录:候选人,曦;可替代者,无;当前状态,等待本人决定。 #line:07d10ce + +升降梯门在她面前缓缓合拢。透明轿厢开始下降,泽尼斯的万家灯火从脚下逐层展开,像一片安稳、辽阔、看不见尽头的星海。 #line:0ace8df + +五天以前,曦从未想过自己会离开这里。 #line:005f161 + +五天以后,她必须决定,这片星海是否值得一次可能永远无法返航的旅行。 #line:0135464 +=== diff --git a/Assets/Story/Chapter0/C0_PrivateBriefing.yarn.meta b/Assets/Story/Chapter0/C0_PrivateBriefing.yarn.meta new file mode 100644 index 00000000..aa16aada --- /dev/null +++ b/Assets/Story/Chapter0/C0_PrivateBriefing.yarn.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 7bb6ac47328e7404c97f3017b0d11ad0 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 94073015eacc34c1d8fc6786e43d60ca, type: 3} diff --git a/Assets/Story/Chapter0/C0_PublicDisclosure.yarn b/Assets/Story/Chapter0/C0_PublicDisclosure.yarn new file mode 100644 index 00000000..3a0a180c --- /dev/null +++ b/Assets/Story/Chapter0/C0_PublicDisclosure.yarn @@ -0,0 +1,286 @@ +// Chapter 0 · C0-S04 向群星公开 +// 对应场景卡:docs/chapter0-scene-04-public-disclosure-card.md +// 类型:Important TextBlock(待 StoryData 配置) +// 目标 Block ID:c0_public_disclosure +// 入口 Node:C0_PublicDisclosure +// 标题 Localization Key:story_c0_block_public_disclosure +// +// Unlock Condition:c0_contract_route == 1 +// Forbidden Condition:c0_contract_route == 2 +// 本稿不写入新的剧情变量,不新增 Timeline Marker。 +// 三项公共问题按固定顺序出现,每组只有一个选项。 +// +// 本稿不添加 #line 标签;待文本批准后由 Yarn 工具统一生成。 +// 角色立绘、公共频道 UI 与镜的 VFX 命令待资源确认后补充。 + +title: C0_PublicDisclosure +--- +契约成立后的第一晚,曦终于在家里补完了那份教学观测仪的实践记录。 #line:0146660 + +她原本以为,经历过神的契约和四维生命降临以后,学校报告应该会显得无比简单;结果她仍然花了一个多小时解释自己为什么跳过标准校准流程,直接拆开一台自检结果完全正常的设备。 #line:07e17d7 + +学校终端在提交以后回复“已收到,明日讨论”。曦看了那句话很久,才想起自己明天不会照常出现在实践教室,而是要在全星联公共频道里解释为什么可能再也回不到那里。 #line:0dd80fb + +父亲和母亲拒绝了当晚进行任何公开录制的安排。程衡接受了他们的决定,徐允雅则把公共说明的事实清单发送到家庭终端,允许三个人逐条检查,没有附上一份要求曦背诵的演讲稿。 #line:0c83d0b + +镜始终悬停在客厅靠窗的位置。不断重组的镜面将住宅区灯光切成许多细小的反射,内部由光点与线条组成的数据流仍在运动;它没有加入家庭讨论,也没有因为厨房空间比会面室狭窄就改变形态。 #line:01ab993 + +父亲曾经问它是否需要一个专门停留的区域。镜回答,三维空间中的位置不会对它构成居住需求,只要不妨碍曦继续履约即可。父亲听完以后看了看客厅,又决定暂时不追问这句话在家具布置上意味着什么。 #line:020b29d + +公共说明的草稿修改到接近午夜。母亲把“在充分准备后接受使命”改成“在完成知情核对后接受契约”,因为没有人能够为这种旅程作充分准备。 #line:004e4e8 + +父亲则删掉了“肩负全体星联的共同希望”,因为公众的希望不能被写成曦必须履行的另一项义务。 #line:056e043 + +曦: 你们删得这么彻底,明天程衡会不会只剩下一句“大家好”? #line:010109b + +母亲: 不会。事实还在,而且事实已经足够多。需要删掉的是别人替你添加的性格和感受。 #line:0350dd8 + +父亲: 如果一句话不能在你拒绝契约时同样尊重你,它就不适合用来解释你为什么接受。 #line:0a15e55 + +镜没有评价他们删改文字的方式。它能够看见公共说明会怎样发生,却没有透露任何信息,只在徐允雅询问是否需要为它准备发言稿时回答:“不需要。” #line:0815d5f + +第二日上午,曦穿着自己的校服回到公共事务中心。母亲替她理了三次衣领,第三次以后才承认衣领第一次就很整齐;父亲则检查她有没有带水、终端和返程通行凭证,仿佛这只是一次规模稍大的学校展示。 #line:07693a9 + +公共会堂比曦想象中小。中央平台与普通公共说明使用相同高度,后方没有旗帜阵列,也没有写着她名字的巨大投影;只有几块安静的公共频道窗口,分别显示不同都市世界已经接入的观看节点。 #line:001a1eb + +那些窗口没有直接显示观众数量。它们只是一个接一个亮起,从泽尼斯周边世界扩展到更遥远的星系,最后连成一片没有空隙的稳定光带。曦看着它们,觉得整座会堂忽然变得比窗外的城市更加辽阔。 #line:097f1c6 + +父亲和母亲停在平台侧后方。那里不会进入公共画面,曦只要稍微偏过头就能看见他们。镜则保持万华镜般的投影形态,悬停在她侧后方;它没有缩小,也没有为即将开始的直播调整任何一块镜面的朝向。 #line:0add6da + +曦: 我必须一直看正前方吗?如果我看错了窗口,会不会显得像只对某几颗星球说话? #line:0fce3d1 + +徐允雅: 不需要盯着任何窗口。它们只是接入状态,不是观众席。你可以看我、看程衡、看父母,或者在紧张的时候看桌面。 #line:09cf328 + +曦: 看桌面听起来最安全,可我怕全星联最后只记得我的头顶。 #line:004f09f + +程衡: 那就偶尔抬头。我们今天需要的是一个真实的人,不是一段镜头表现完美的记录。 #line:0c9066c + +公共频道进入最后一分钟准备。曦原本写在终端上的开场句忽然变得很陌生,她把第一行读了两遍,还是无法想象自己会用那种过于整齐的语气说出“全体星联公民”。 #line:04fc068 + +母亲: 忘词也没有关系。你不是来证明自己适合公开发言,只是来让大家知道,作出选择的人是谁。 #line:0171931 + +父亲: 如果实在不知道第一句说什么,就先说“大家好”。昨晚删掉那么多内容以后,这一句确实还在。 #line:0f9e5b7 + +曦: 原来你真的打算只给程衡留下这句话。 #line:0ef6950 + +公共频道的等待标志在此时消失。会堂里没有倒计时音效,也没有提示观众鼓掌;程衡只在确认连接稳定以后向前一步,面对遍布星联的公共窗口。 #line:0b51049 + +程衡: 各位公民,上午好。今天的说明涉及联星共同体全体成员的未来,也涉及一名公民本人的生命、家庭与选择,因此星联不会只公布交易带来的希望,而隐去承担希望所需要的代价。 #line:00680c8 + +程衡: 从这一刻开始,所有已经确认的事实、所有仍然未知的风险,以及政府在这项事务中作出的决定,都将同时公开。没有任何一部分会因为可能引起不安而被省略。 #line:09cb150 + +他没有先介绍曦,也没有要求公共频道感谢她。徐允雅接替发言时,会堂后方出现的不是曦的肖像,而是共同梦境和通信密钥的验证时间线。 #line:0326aa4 + +徐允雅: 大约三周前,分布在不同世界、互不认识的多名研究者经历了内容一致的梦境。他们在清醒以后分别复写出同一枚通信密钥,以及建立隔离接收装置所需的步骤。 #line:085b211 + +徐允雅: 星联对参与者、设备、信息传播与心理影响进行了交叉验证。现有证据能够证明,这不是单一组织制造的欺骗,也不能由已知通信技术解释;但这些证据不能证明接触对象值得无条件信任。 #line:03ce93b + +徐允雅: 研究团队按照梦中步骤建立联系。接触对象没有展示形体或声音,星联暂时将其称为“神”;它把第四维度研究中遭遇的共同边界称为“科技锁”。 #line:0721f6c + +徐允雅: 它没有提前提供飞升理论,也没有说明科技锁如何形成。它只承诺,若契约成立,将解除这项限制,使新的研究重新成为可能。 #line:0431caa + +公共窗口仍然安静。徐允雅没有停下来等待人们消化“神”这个称呼,而是让唯一候选人的事实紧接着出现在所有人面前。 #line:074a841 + +徐允雅: 神指定了一名唯一候选人。我们没有发现这一指定与候选人的家庭、能力、教育经历或任何可验证特质有关,也没有第二位候选人可以替代她。 #line:0fd2ea2 + +徐允雅: 候选人名叫曦,今年十七岁,是泽尼斯的一名普通学生。在第一次接触政府以前,她没有参与高维研究,也没有接受任何与这项任务有关的训练。 #line:0d2b563 + +公共窗口中的光带出现了第一次明显波动。并不是连接中断,而是来自不同世界的问题数量在同一时刻迅速增加,又被公共系统按照事实类别重新整理。 #line:0e3a8e7 + +徐允雅: 神公开的履约规则只有一条。曦需要在一名高维陪同者陪伴下前往多个世界,并在离开每个世界以前,献上一件自己真诚认为是当地最珍贵的事物。 #line:07da101 + +徐允雅: 星联不知道世界数量、旅程期限、献祭形式、对象范围或具体后果,也不知道曦能否返回。直到此刻,我们仍然没有这些问题的答案。 #line:05d96b1 + +她说完最后一句以后,会堂里出现了一段真正的沉默。接入窗口仍全部亮着,公共频道也没有故障,可没有新的提示覆盖在画面上;那些遍布不同世界的观众终于无法把这场交易只理解为一条通往更先进技术的新闻。 #line:0ca6261 + +程衡: 五日前,星联把全部已知事实和未知风险告知曦,并明确提供拒绝权。她可以离开,可以要求父母或独立意见参与,也可以仅凭信息严重不完整而拒绝交易。 #line:0213caf + +程衡: 政府、研究机构和她的父母都没有替她作出决定。昨日,曦在完成最终知情核对以后自愿接受契约;神已经确认契约成立,选择不可撤回。 #line:0dffc73 + +程衡: 她获得十至十五周用于告别、旅行与出发准备。星联会提供所需资源和保护,但这段时间首先属于曦本人,不属于政府的宣传安排,也不属于公众对英雄的想象。 #line:01f3f06 + +直到这时,公共画面才第一次转向曦。她发现自己准备好的开场句已经彻底想不起来,只能看见正前方那片由无数世界组成的接入光带,以及光带里映出的一个穿着校服、双手握得太紧的自己。 #line:0b378a6 + +曦: 大家好,我是曦。对不起,我原来准备了一句听起来更正式的话,可它现在完全不在我脑子里了,所以只能从这句开始。 #line:0af4df5 + +没有人笑出声,平台侧后方的父亲却轻轻点了一下头。曦松开握在一起的手,强迫自己把肩膀放低一些。 #line:0b6aa02 + +曦: 昨天接受契约的人是我。我不是因为不害怕,也不是因为有人告诉我一定会回来;我只是想了五天以后,发现害怕前往未知的地方,和不愿意前往,并不是同一件事。 #line:033cf2e + +曦: 我爱自己的家,也想亲眼看看那些世界。我不知道这两件事以后会不会互相冲突,更不能保证每一次都作出让所有人满意的决定,但我不想让别人替我承诺我做不到的事情。 #line:07dc8da + +她停下来喝了一口水。公共频道没有催促,程衡和徐允雅也没有替她接过尚未说完的话。 #line:0ca0cd1 + +曦: 我现在仍然很紧张。如果大家看见我的手一直在抖,那不是设备画面不稳定;只是我第一次同时和这么多人说话,而且大家已经知道了一件我昨天以前还不能告诉任何朋友的事。 #line:0c276ec + +曦的话结束以后,镜面复合体从平台侧后方缓慢移到公共画面能够完整记录的位置。它没有发出光束或改变会堂重力,只是让不同镜面同时映出真实会堂、人物热量与建筑线框,证明任何单一影像设备都无法解释眼前结构。 #line:0eb3f26 + +镜: 契约已经成立。我是负责陪同曦完成履约过程的四维生命。你们可以称呼我为镜,这是我为自己选择、并允许三维生命使用的称谓。 #line:0edc3f8 + +镜: 我将观察旅程,并在曦的生命或继续履约的能力受到决定性威胁时提供保护。我不替她行动,不替她作出献祭选择,也不会向你们透露未来。 #line:0e01da6 + +它说完以后便退回原来的位置,没有为公共频道展示更多结构,也没有回应瞬间增加的研究请求。程衡示意公共系统进入有限提问环节,所有问题都将连同选择规则和过滤记录公开保存。 #line:0a7f83f + +公共频道选出的第一个问题来自不同世界的共同关注:“她真的是在没有受到压力的情况下,自愿接受的吗?” #line:03ceaf5 + +-> 听徐允雅说明完整的知情同意过程。 #line:0c393fc + <> +=== + +title: C0_PublicDisclosure_VoluntaryQuestion +--- +徐允雅: 我同时参与接触事实的研究验证,并负责监督候选人的知情同意程序。由我说明程序,不代表公众必须只相信我的结论;相关记录和每一项退出权都已经同步公开,可由独立机构复核。 #line:0fd4d2e + +徐允雅: 第一次会面开始以前,曦可以要求父母到场、联系独立意见、暂停记录或直接离开。她选择先听完全部内容,再回家与父母商谈。政府没有要求她在当天回答。 #line:0843220 + +徐允雅: 随后的五天里,候选人身份保持绝密。没有公众期待、媒体讨论或仪式能够影响她;程衡和研究团队没有进入她的家庭空间,也没有安排人员说服她接受。 #line:0ee17ab + +徐允雅: 最终会面中,我重新核对唯一已知规则、所有未知风险、拒绝后果与不可撤回性。曦先签署的文件只证明星联完成了事实告知,不是神的契约,也不会自动代表同意。 #line:0132cc1 + +徐允雅: 她在理解可以拒绝、拒绝不会产生处罚、且没有第二位候选人的前提下亲口接受。神随后确认契约成立。完整记录足以证明程序没有替她作出选择,却不能证明这份契约因此变得安全。 #line:01438cb + +公共频道短暂显示了五日程序的时间线。曦看见自己的第一次会面、家庭商谈和最终确认被压缩成几行清楚的节点,忽然觉得那五天比画面里呈现的漫长得多。 #line:084014d + +曦: 我可以补充一句吗? #line:0d27a44 + +徐允雅: 当然。这个问题最终问的是你的感受,不只是一套程序。 #line:0d12e31 + +曦: 我确实感受到了压力,但压力来自这件事本身,而不是有人站在旁边逼我。知道自己是唯一候选人,不可能像选择明天吃什么一样轻松;政府能做的是不再往上增加更多重量。 #line:0d3275f + +曦: 我的父母希望我留下,程衡希望交易成立,徐允雅没有告诉我她希望哪一种。所有人都说出了自己的位置,却没有把它伪装成我必须服从的答案。最后接受,是我自己的选择。 #line:0c2ee6c + +这段补充被公共系统与程序记录并列保存,没有被剪成一句更适合传播的口号。第一个问题关闭以后,第二个问题随即出现在平台前方。 #line:05e41aa + +“她在出发以前还能继续原来的生活吗?还是会从今天开始被隔离、训练或持续接受公开活动?” #line:00cb51d + +-> 听程衡说明准备期与个人生活的边界。 #line:0796506 + <> +=== + +title: C0_PublicDisclosure_OrdinaryLifeQuestion +--- +程衡: 契约没有要求曦在准备期脱离现有生活,镜也已经确认,告别、旅行与必要装备准备都在十至十五周履约窗口以内。 #line:02eec88 + +程衡: 她可以继续上学,与家人和朋友相处,也可以按照自己的意愿前往母星旅行。星联会提供交通、安全、装备与信息支持,但不会把每一天排成公开行程。 #line:0b448de + +程衡: 如果某项训练确实关系到跨界后的基本安全,专业人员会先说明必要性、内容和风险,再由曦参与安排。没有任何机构可以用“为了文明”跳过同意程序。 #line:03035d9 + +程衡: 今天的公开也不意味着她和家人放弃隐私。未经本人同意,任何个人或机构不得跟踪、私下接触、公开家庭位置,或把她的姓名、影像与经历用于商业和政治宣传。 #line:09f4d1f + +程衡: 采访、研究邀请、纪念活动和公开会面将进入统一渠道,由系统过滤骚扰与重复内容,再交给曦本人决定是否接受。星联负责建立边界,不替她决定应该接受多少善意。 #line:0d290c7 + +曦: 我还能回学校吗?我是说,理论上我当然知道可以,可当所有同学都看完这场说明以后,“继续上学”可能不会和昨天完全一样。 #line:0e3b3ef + +程衡: 不会完全一样。我们能阻止强迫和骚扰,却不能要求认识你的人假装什么都没有发生。学校会提供你需要的空间,但你是否返回、什么时候返回,由你和家人决定。 #line:0e909f8 + +曦: 那我想回去。至少那台观测仪的流程记录还没有讨论完,如果我就这样消失,老师可能会把它当成一个非常夸张的逃课理由。 #line:0308161 + +平台侧后方的父亲抬手遮了一下嘴,母亲则直接闭上眼睛,像是不愿让全星联看见这个家庭对“实践记录”究竟有多熟悉。虽然他们都没有进入公共画面,曦还是因为这点熟悉的反应镇定了许多。 #line:063a08b + +第二个问题关闭后,公共频道没有立刻选择关于神、镜或飞升技术的研究问题。系统按照全体公民的共同关注度,呈现了一个更直接、也更难由制度替曦回答的问题。 #line:04a97c1 + +“我们能够为她做些什么?” #line:038bf4e + +-> 亲自回答公众能够提供的帮助。 #line:081411b + <> +=== + +title: C0_PublicDisclosure_PublicSupportQuestion +--- +曦看着那个问题,第一反应是求助般地望向徐允雅。徐允雅没有替她准备标准答案,只把公共频道的发言权限完整交还给她。 #line:088b7ed + +曦: 我还没有想好一份清单。昨天以前,知道这件事的人加起来都坐不满这间会堂;今天早上,我连应该先看哪个公共窗口都不知道。 #line:0d2a47f + +曦: 我很感谢大家愿意问能做什么,而不是先问我能为大家保证什么。只是我希望,接下来的十几周不要全部变成告别仪式,也不要每一天都有人提醒我这可能是最后一次做某件事。 #line:06ff3b7 + +曦: 我想继续和父母吃饭,回学校把课程收尾,和朋友说清楚为什么这几天突然消失。我还从来没有去过母星,也希望真的像普通游客一样看一看那里,而不是一路站在欢迎仪式中央。 #line:09a72eb + +曦: 如果大家想送来祝福,我会认真读;如果有人对旅行世界、当地文化或者怎么和陌生人相处有实际建议,我也愿意听。 #line:04f2543 + +曦: 但请不要要求我的父母替我回答是不是害怕,也不要因为我被称作英雄,就觉得我从今天开始不应该犹豫。 #line:09201c6 + +她说到这里停了一下。原本那份正式开场已经彻底失去作用,可接下来的话不再需要从终端上寻找。 #line:09b246a + +曦: 我会尽力完成自己接受的契约,但我不能保证一定成功,也不能保证一定回来。现在的我只是愿意出发,还没有因此变成什么都不会害怕的人。 #line:037bd4c + +公共频道没有立刻出现回应。 #line:0399aa6 + +那段沉默比任何预先安排的掌声都更长。会堂里的人没有急着用鼓励覆盖曦刚刚说出的风险,不同世界的公共窗口也没有用醒目的口号替她总结。 #line:0d56834 + +所有人只是暂时停在那里,承认一个十七岁的普通人即将承担他们无法替代的未知。 #line:05f76c7 + +第一声掌声来自会堂靠后的位置。声音并不响,也没有带动整齐的节奏;紧接着,平台侧方、公共事务中心其它楼层,以及不同世界传回的公共画面里,掌声才逐渐连在一起。 #line:08f8955 + +曦被声音吓得向后退了半步。她下意识看向镜,镜面复合体仍按原有规律重组,没有扩大形态、回应掌声或向公众致意。对它而言,这场社会反应不改变任何履约条件。 #line:04a69f0 + +掌声继续了很久,却没有人喊出要求她保证胜利的口号。公共频道上的第一批文字回应也没有把她写成命中注定的救世主;更多人只是说谢谢、请照顾好自己,或者留下来自某颗遥远都市世界的一句平安祝愿。 #line:0b62995 + +程衡没有趁着掌声要求曦再次表态。他等到声音自然减弱,才重申已经公开的保护规则,并宣布公共说明到此结束。 #line:09d3b61 + +程衡: 从这一刻开始,星联会保护曦自由使用准备期的权利。感谢、研究和公共纪念都不能越过她本人设定的边界;文明得到一次机会,不代表文明取得了支配承担者生活的权利。 #line:00d822f + +程衡: 已知事实、未知事项、程序记录与今日全部问答将永久公开。未来出现的新信息仍须区分事实、推测与未知,星联不会让未经验证的传言替代正式记录。 #line:04e10d5 + +公共频道逐一退出实时发言状态,接入窗口却没有随之熄灭。来自不同世界的祝福仍在不断增加,经过隐私过滤以后汇入曦刚刚获得的公共信箱。 #line:0e05146 + +<> +=== + +title: C0_PublicDisclosure_AfterBroadcast +--- +直播结束的提示消失以后,曦仍然站在原地。她已经不需要面对全星联,却一时想不起自己应该先放下水杯、关闭终端,还是回头去找父母。 #line:0ec5f89 + +母亲先从平台侧后方走过来,接走她手里几乎没有喝过的水。父亲则确认公共频道真的不再录制,才站到曦另一侧。 #line:0586857 + +父亲: 现在可以回家了。如果有人告诉你,英雄应该留下来继续接受三个小时的祝福,我会请他先阅读刚才公布的边界规则。 #line:0271a10 + +曦: 没有人这么说。只是我的公共信箱……它是不是坏了?数字已经超过屏幕能够完整显示的位数了。 #line:00463d3 + +母亲: 没坏。过滤系统正在把重复的祝福合并,原始数量只会更大。你不需要今天全部读完,也不需要逐条回复。 #line:09b2048 + +曦: 我知道,可这些消息后面都是具体的人。昨天他们还不知道我是谁,今天却有人在另一颗星球上停下工作,专门写一句话给我。 #line:00e2e0e + +镜悬停在不远处,数块镜面映出曦终端上持续变化的光点。它没有读取或评价祝福内容,也没有因为人群开始聚集在公共事务中心外部而提高警戒姿态。 #line:0bb094c + +会堂工作人员此时推来第一批抵达的鲜花。它们并非来自政府礼仪部门,而是附近公共服务区的普通职员、刚才观看直播的访客,以及一所没有留下具体班级信息的泽尼斯学校。 #line:04e76d9 + +花束大小、颜色和包装方式各不相同,显然没有经过统一安排。最上方的一张卡片只写着:“实践教室的位置给你留着,回来以后记得补完流程讨论。” #line:00d8cdf + +曦盯着那句话看了两遍,随后把卡片遮在花束后面。 #line:0c4444f + +曦: 我大概知道是谁写的,但我不确定应该感动,还是先为最后半句感到压力。 #line:053e0fc + +父亲: 两种都可以。至少这证明学校听见了你说想回去,也没有打算因为你成为公共人物就取消操作规范。 #line:093129a + +母亲: 这应该会让你安心。你一直很擅长在重大事件以后,被一份没有写完的记录拉回现实。 #line:099aca3 + +更多鲜花仍在抵达。公共事务中心没有把它们全部堆到曦面前,只挑选一束确认安全、也没有附带私人请求的花交给她,其余则按照公开规则存放、转赠或以影像形式记录。 #line:0399a5e + +一家人离开会堂时,外部公共区域已经聚集了许多人。保护边界让他们停留在足够远的位置,没有人冲过通道或试图触碰曦;人们只是站在两侧,举起手中的花、终端和写着平安祝愿的光屏。 #line:0b5585d + +曦原本担心自己应该说些什么,最后只抱着花向两侧认真鞠了一躬。回应她的是另一阵不够整齐、却比会堂里更温暖的掌声。 #line:091eba5 + +她再次看向镜。镜仍保持着不远不近的距离,万华镜般的表面同时映出人群、鲜花、建筑线框和不断更新的数据流。它没有询问人们为什么需要这些仪式,也没有表示自己理解其中的意义。 #line:08b80dd + +对镜而言,履约窗口只过去了一个夜晚,任务条件没有发生变化。 #line:0b15cce + +对曦而言,昨天离开这座建筑时,整条走廊还没有人知道她的名字;现在,通往升降梯的每一块公共屏幕都在显示公开记录,标题下方清楚写着“候选人:曦”。 #line:062868c + +曦: 我们还能先回家吗?我知道这句话昨天已经问过一次,可现在它听起来比昨天困难多了。 #line:036bb46 + +母亲: 当然。公开说明结束了,今天剩下的时间还属于你。 #line:084021b + +父亲: 而且家里的厨房已经询问两次午饭安排。如果再不回复,它可能会认为我们集体改变了饮食计划。 #line:030eca6 + +曦: 那就回家。我想先把这束花放好,再慢慢看那些消息。母星旅行的路线可以等到下午讨论,至少午饭以前不要再让我面对整个文明。 #line:0c31d40 + +父亲和母亲一同向升降梯走去。镜没有加入家庭对话,只在曦迈步以后平稳地跟随,既没有靠近到像一位家人,也没有远离到像一台被留在会堂里的设备。 #line:0d4f7d1 + +升降梯门闭合以前,曦最后看见外部公共屏幕上的自己。画面里的少女穿着校服,抱着一束来不及统一包装的鲜花,身后悬浮着一个来自第四维度的镜面复合体。 #line:03fca60 + +她看起来不像传说里早已准备好承担命运的英雄,只像一个刚刚知道全世界都认识自己的普通人。 #line:0598454 + +门在掌声之外合拢。轿厢开始下降,曦仍然能够回家、上学、与父母吃饭,也终于可以准备期待已久的母星旅行。 #line:054d216 + +只是从今天开始,无论她走到星联的哪一颗世界,都不会再有人把她当作一个完全陌生的游客。 #line:0a0ac83 +=== diff --git a/Assets/Story/Chapter0/C0_PublicDisclosure.yarn.meta b/Assets/Story/Chapter0/C0_PublicDisclosure.yarn.meta new file mode 100644 index 00000000..ce5230dd --- /dev/null +++ b/Assets/Story/Chapter0/C0_PublicDisclosure.yarn.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 468e09e2932329e4c8a954bead36a7f2 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 94073015eacc34c1d8fc6786e43d60ca, type: 3} diff --git a/Assets/Story/Chapter0/C0_RefusalEnding.yarn b/Assets/Story/Chapter0/C0_RefusalEnding.yarn new file mode 100644 index 00000000..16759740 --- /dev/null +++ b/Assets/Story/Chapter0/C0_RefusalEnding.yarn @@ -0,0 +1,211 @@ +// Chapter 0 · C0-S03R 拒绝契约彩蛋结局 +// 对应场景卡:docs/chapter0-scene-03-contract-decision-card.md +// 类型:Important TextBlock(待 StoryData 配置) +// 目标 Block ID:c0_refusal_ending +// 入口 Node:C0_RefusalEnding +// +// Unlock Condition:c0_contract_route == 2 +// Forbidden Condition:c0_contract_route == 1 +// 本稿不写入新的章节变量,不授予永久 Unlock Key。 +// 结尾 MessageBox 在 TextBlock 正常提交后显示;中途 Back 不留下弹窗。 +// +// Localization Key: +// story_c0_refusal_rewind_title = 旅程在这里结束 +// story_c0_refusal_rewind_body = 若希望返回选择之前,请点击时间轴上的“第五日 · 抉择”Marker,并读取该时间点的存档。 +// +// 本稿不添加 #line 标签;待文本批准后由 Yarn 工具统一生成。 +// 角色立绘待 CharacterRegistry 与肖像资源确认后再补充。 + +title: C0_RefusalEnding +--- +升降梯载着曦和父母离开公共事务中心顶层。透明轿厢沿着建筑外壁缓缓下降,最终会面室很快被上方层叠的空中连廊遮住,仿佛那扇门从未在他们身后打开过。 #line:054e32f + +父亲一直拿着已经关闭的终端。母亲站在曦另一侧,没有追问她在房间里停顿了多久,也没有把手搭上她的肩膀;三个人都离得很近,却默契地给她留出了一点能够独自站立的空间。 #line:01c6731 + +升降梯经过公共服务层时,一群刚结束参观的学生走进来。他们兴奋地讨论顶层观景区能看见哪些研究设施,有人认出程衡今天似乎也在建筑内,却没有任何人注意到角落里那个刚刚拒绝了神的十七岁女孩。 #line:046788e + +这正是保密程序仍然有效的证明。候选人的身份没有被系统标注在曦的通行记录上,走廊也没有留下可供旁人猜测的异常路线。 #line:0db87c9 + +在神没有得到答案以前,星联准备好的公众说明从未启动;曦拒绝以后,它也没有理由替她开启。 #line:0e2708c + +曦看着轿厢外不断上升的建筑结构。她原本以为拒绝以后,整颗星球至少会有某个地方暗下来,或者远处会响起一声只有自己能够听懂的警报;可实验塔仍在运转,列车仍按时进站,连天气控制系统安排的云层都没有改变形状。 #line:0834f44 + +父亲: 我们现在回家,还是先在外面吃午饭? #line:05e3838 + +曦: 你真的只打算问这个吗? #line:0e056f6 + +父亲: 我还有很多问题,但它们不会因为在升降梯里问得更快就得到更好的答案。午饭至少是一个现在能够解决的问题。 #line:05a270b + +母亲: 我投外面。家里的厨房还按照我们中午不回去设置着,如果临时更改,它会用非常礼貌的语气提醒我昨天已经确认过日程。 #line:084541a + +曦: 那就外面吧。我现在不想回家以后,第一眼又看见那只装资料的抽屉。 #line:0378436 + +父亲: 可以。附近有一家店的菜单没有任何关于高维结构、科技锁或者文明存续的内容,应该符合今天的需要。 #line:061c5a9 + +曦笑了一下。这不是如释重负的笑,也没有让会面室里的答案变得轻巧;她只是忽然想起,父亲从五天前开始就一直试图用能够处理的小事保护他们三个人。 #line:0df699e + +维修工具、列车路线、午饭地点,这些事情无法改变文明的终点,却能让一家人在最难开口的时候仍然知道下一步该往哪里走。 #line:000ae6a + +公共事务中心的一层大厅照常开放。曦经过出口时,导引系统只提醒她下午可能有降雨,并询问是否需要调整返程路线;它不知道她刚刚关闭了什么,也不需要知道。 #line:08474e6 + +-> 和父母一起离开公共事务中心。 #line:0d6e01b + <> +=== + +title: C0_RefusalEnding_FirstEvening +--- +那顿午饭没有变成第二次家庭商谈。父亲讲起维护站新换的检测工具总会把正常震动误报成故障,母亲则抱怨实验室把一份设备验证申请连续提交了三次,只有申请标题换了不同的措辞。 #line:0e3dc4f + +曦起初只是听着,后来也说起那台被她擅自拆开的教学观测仪。教师已经确认误差确实存在,却仍然要求她补交一份说明,解释为什么在自检结果正常时跳过标准校准流程,直接打开了设备外壳。 #line:0a6880b + +父亲: 这个问题我支持老师。找到故障不代表可以省略操作记录,否则下一个维护人员只会看见一台被拆过、又没有留下原因的设备。 #line:03bbb90 + +曦: 我今天才替文明拒绝了一场高维交易,你就不能暂时站在我这边吗? #line:025dc68 + +父亲: 我当然站在你这边。正因为这样,我才不希望今天的事再让你丢掉原本能保住的实践成绩。 #line:0da30f8 + +母亲: 我也站在你这边。先把能补好的记录补完,别让今天的事替你留下新的麻烦。 #line:0b87e4a + +曦: 我开始怀疑你们早就准备好在今天结束以后,一起对付我的实践报告。 #line:02aa8b8 + +母亲看了她一会儿,把仍在提醒截止时间的学校终端推回她面前。 #line:0ebde93 + +话题就这样回到了学校。没人刻意宣布“从现在开始恢复普通生活”,普通生活只是在他们谈论午饭、设备和截止时间时自行回到了桌边。它没有赶走会面留下的沉重,却为沉重腾出一个不会占满全部空间的位置。 #line:0aafba2 + +回家以后,母亲把那只装过契约资料的抽屉清空。根据保密程序,所有纸质副本都已在公共事务中心归还,家庭终端中的加密资料也只剩一份终止记录:交易未成立,候选人程序关闭,相关人员继续受隐私条例保护。 #line:017558e + +那条记录没有解释星联失去了多大的机会,也没有评价曦是否作出了正确决定。它只忠实保存已经发生的事实,随后关闭了所有继续提问的入口。 #line:05c4f2b + +曦回到自己的房间。学校终端果然还在提醒实践记录尚未提交,屏幕边缘的倒计时只剩下六个小时,完全没有因为使用者今天经历过什么而延长。 #line:0bb72e3 + +她打开记录,第一段写得很快:观测仪感应环存在细微偏移,自检程序未能识别,重新定位后星图恢复稳定。 #line:0954b17 + +第二段要求说明操作依据。她盯着空白输入框看了半天,最终老老实实写下“凭经验判断”,又补充自己应当先保留异常数据、通知教师并记录拆卸过程。 #line:052223f + +窗外开始下雨。天气系统安排的水滴落在住宅外层透明板上,将实验塔的灯光拉成长长的倒影。曦看着那些不断滑落的光,短暂地想起通信装置熄灭时那条细线,然后把注意力重新放回报告。 #line:0c49973 + +父亲在门外问她需不需要一杯热饮。母亲提醒晚饭再过半小时开始。没有人问她是否后悔,也没有人要求她保证永远不会后悔。 #line:0419bf4 + +曦在截止时间以前提交了实践记录。教师的自动回复只有一句“已收到,明日讨论”,平常得近乎荒唐;可她反复看了两遍,忽然觉得这句话很好。 #line:0b95bf7 + +明天仍然有事情需要讨论。 #line:01a5cc9 + +不是所有问题都必须在今天得到永远不变的答案。 #line:0f993a9 + +<> +=== + +title: C0_RefusalEnding_ReturnToSchool +--- +第二天早晨,曦按平时的路线去学校。公共列车在每一站正常停靠,车厢里有人补觉,有人检查实验数据,也有人因为忘记带早餐而向同伴抱怨自动售货机的口味太少。 #line:0f125ae + +她走进实践教室时,那台观测仪已经重新合上外壳。教师让她坐到旁边,没有询问公共事务中心的内容,只把昨晚提交的记录投到两人之间的屏幕上。 #line:07dcbc1 + +教师: 故障判断正确,修复结果也没有问题。需要改进的是过程:你太相信自己能够把设备恢复原样,所以没有给其他人留下足够的信息。 #line:0785932 + +曦: 我知道。我昨天写记录的时候已经发现,解释“我是怎么知道的”比找到偏移本身困难得多。 #line:0b0a20e + +教师: 直觉是能力的一部分,不必假装它不存在;但如果只有你一个人能够复现,它就还不能成为可靠的方法。下次先保存数据,再打开外壳。 #line:0165d5f + +曦: 好。我尽量忍住至少三分钟。 #line:0db6226 + +教师: 标准流程要求五分钟。 #line:0d50166 + +曦: 那我从三分钟开始进步,最后再争取五分钟。 #line:037c49a + +教师没有接受这场讨价还价,只把记录退回给她补充。周围同学陆续开始当天的课程,有人问曦昨天的家庭事务是否已经解决,她停顿了一下,最后只回答“已经结束了”。 #line:0072cc2 + +这句话没有撒谎。共同梦境、通信密钥、神的交易和唯一候选人依旧属于最高等级的保密信息,除了父母、程衡、徐允雅与参与项目的少数研究者,没有人知道曦曾经站在那扇门前。 #line:079d897 + +接下来的几天里,徐允雅只联系过她一次。她确认家庭终端上的绝密材料已经正常销毁,并再次说明:候选人程序不会重启,神没有发送第二次通信,任何机构也无权要求曦接受后续观察。 #line:000c0e3 + +曦: 所以我不需要定期接受心理评估,也不会有人每隔几年问我一次,愿不愿意重新考虑? #line:05751a7 + +徐允雅: 不需要。你可以主动申请支持,但拒绝不是一种需要被治疗或等待纠正的状态。至于交易,它已经终止,没有重新考虑的入口。 #line:08353b1 + +曦: 你还是说得很干脆。 #line:0ac77bf + +徐允雅: 在这件事上,边界越清楚越好。你今后的生活不应当变成一段无限延长的候选人观察期。 #line:0ec3d25 + +通讯结束以后,徐允雅没有再次主动联系。她遵守了自己说出的边界,程衡也没有以私人身份写来一封感谢或遗憾;那些可能让曦永远停留在第五日的成年人,都从她的日常生活里退了出去。 #line:0f11b81 + +一个月后,曦已经能够连续几天不想起契约。随后某个毫无预兆的瞬间,教室窗面的反光、课本里关于第四维度的旧假说,或者一件被同学随口称作“最珍贵”的纪念品,又会把那间会面室完整地带回眼前。 #line:0994254 + +她有时会想,如果自己接受,所谓高维陪同者究竟会以什么形态出现;也会想神会把她送到怎样的世界,那里的“最珍贵之物”是否真的能够被一个外来者找到。 #line:01dc8c3 + +这些问题没有答案。镜从未被召来,通信装置也没有再次开启;拒绝让曦保留了现有生活,也同时关闭了亲眼验证另一种人生的可能。 #line:02ef5ae + +她没有强迫自己停止想象。好奇并不会因为选择留下就变成错误,偶尔怀疑自己的决定也不意味着那天的拒绝不够真诚。她只是逐渐学会在问题出现时承认它,然后继续完成眼前正在进行的事情。 #line:0c67b8a + +学期结束以前,曦再也没有未经记录就拆开教学设备。严格来说,她有两次只记录了一半,但教师认为这仍然算作可以观察到的进步。 #line:09c64e4 + +<> +=== + +title: C0_RefusalEnding_YearsLater +--- +时间没有因为那场未成立的契约停下。 #line:0f1be78 + +曦完成了学业。毕业那天,父亲把她小时候画错的纸质星图装进一个过分正式的保护框,母亲则带来一份经过三次校验、绝对不会在典礼中途失效的影像记录设备。 #line:05a99fb + +三个人都没有提起第五日,合影里也看不出他们共同保守着一个足以改变文明历史的秘密。 #line:0308c27 + +此后,曦仍然选择了每天和装置打交道的生活。她没有成为高维研究的象征,也没有被安排到某个秘密机构反复解释自己的决定。 #line:0cb1afd + +她只是凭借对机械与电子结构近乎本能的敏锐,做自己擅长也愿意做的工作,并像从前一样偶尔因为先动手、后补记录而受到同事提醒。 #line:0270019 + +她结识了新的朋友,去过泽尼斯上许多学生时代没有时间前往的地方,也终于能够用自己的收入为父母安排一次长假。 #line:0a2c554 + +生活并不因为逃过危险就自动变得完美,她仍会遇见失败、争执、告别和无法修好的东西;只是这些困难都属于她实际选择的人生,而不是神交付的任务。 #line:04b0bdf + +父亲逐渐不再负责需要随时赶往现场的维护工作,却仍然会在家用设备正常运转时拆开检查。母亲离开一线验证岗位以后,开始帮助年轻技术人员审核那些“标题不同、内容完全相同”的申请。 #line:00804cc + +曦每次回家,都能听见他们争论究竟是谁把工具留在餐桌上。 #line:0bfbaa7 + +星联也没有因为失去交易便停止发展。新的都市世界继续建成,跨星系工程变得更加庞大,文化、艺术与科学仍在三维世界允许的范围内不断产生新的成果。对于生活在其中的人们而言,未来依旧辽阔得看不到边界。 #line:0f5e842 + +高维研究同样没有停止。研究者一代又一代地提出新的模型,设计更精密的实验,也不断推翻前人确信可行的道路。它们能够解释更多现象,却没有为那场已经终止的交易写出一个简单结论。 #line:0a869b1 + +有人认为,神曾经提供的道路只在契约成立时存在;也有人认为,把尚未找到的答案称作永远不可能,本身就超出了科学能够证明的范围。漫长岁月里,没有哪一项实验足以让这场争论彻底结束。 #line:0c50cd5 + +能够确定的只有一件事:神承诺过的那条道路没有再次开启。它是否真是通往第四维度的唯一道路,或者文明会不会在某个极遥远的时代找到另一个答案,都不属于曦能够亲眼验证的未来。 #line:0071ac0 + +她不会在某个生日醒来时发现群星熄灭,也不会因为当年的拒绝亲眼目睹文明毁灭。宇宙走向终结所需的时间远远超过一个人能够感受的尺度,漫长到无数世代仍可在其中出生、相爱、探索并拥有完整的一生。 #line:0934f38 + +这不是她每天醒来都必须背负的罪,也不是一个能靠乐观或悲观提前裁定的问题。它只是与她平凡、富足而真实的人生同时存在,把最终答案留在任何人都无法看清的远方。 #line:0591459 + +<> +=== + +title: C0_RefusalEnding_Final +--- +许多年后的一个傍晚,曦结束工作,乘坐公共列车穿过泽尼斯的研究区。车窗外,新建的实验设施依次亮起灯光,远处轨道上运送着某项星系工程所需的巨大构件。 #line:06b831d + +这颗以科研为主要职能的世界仍然忙碌、明亮,并且对明天抱有理所当然的期待。 #line:0f5e5fd + +列车经过她曾经就读的学校。旧实践教室所在的穹顶已经更换过外层材料,教学观测仪也早已不是当年的型号,但从窗外仍能看见一群学生围在拆开的设备旁,为某个不肯稳定下来的读数争论不休。 #line:0255e30 + +曦看了他们一会儿,忽然想起十七岁那年的自己。那时她以为,只要找到偏移的感应环,所有异常就能恢复原位;后来才知道,有些问题不是等待修复的故障,而是一扇只能选择是否穿过的门。 #line:04a7a41 + +她没有穿过那扇门。这个事实在多年以后仍然清楚,却不再像最初那样占据每一次呼吸。 #line:0052f92 + +曦知道自己失去了看见异世界的机会,也知道父母因为她留下而拥有了许多原本可能不存在的岁月;她无法把两者放上同一架秤,更无法证明其中一边足以抵消另一边。 #line:080b9b0 + +她偶尔后悔,也偶尔庆幸。更多时候,她只是承认自己当年面对完全未知的契约,作出了那一刻唯一能够真诚给出的回答。 #line:0237bf5 + +家庭终端在此时发来消息。父亲问她今晚是否回家吃饭,并强调餐桌上的工具不是他留下的;母亲紧接着补充,她已经调取住宅记录确认那套工具属于父亲,只是不打算在曦回来以前继续争论。 #line:07205fb + +曦靠在车窗旁笑了起来,回复自己会在下一站换乘,大约四十分钟后到家。消息发送成功以后,列车驶出学校区域,窗面上的倒影重新变得清晰,里面只有一个已经长大的普通人。 #line:0aa3abe + +没有高维碎片悬停在她身后,也没有另一个世界等待她定义最珍贵的事物。 #line:0c003e6 + +列车继续向住宅区前进。沿途灯光一盏接一盏亮起,把回家的路线照得明确而温暖;而在任何人都无法看见的极远未来,三维宇宙仍沿着不可改变的方向走向终点。 #line:0d8fb79 + +至于星联能否在抵达那里以前找到另一条路,这个问题没有在曦的时代得到答案。 #line:00efb23 + +曦收起终端,在列车抵达下一站时站起身。门外不是通往异世界的入口,只是一座她走过许多次的换乘站;她随着其他乘客一起踏上站台,汇入各自准备回家的普通人群。 #line:0a90df1 + +她的旅程没有从这里开始,而她的生活仍然继续了下去。 #line:06106bd + +<> +=== diff --git a/Assets/Story/Chapter0/C0_RefusalEnding.yarn.meta b/Assets/Story/Chapter0/C0_RefusalEnding.yarn.meta new file mode 100644 index 00000000..289aae7a --- /dev/null +++ b/Assets/Story/Chapter0/C0_RefusalEnding.yarn.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: d118e1b829f721c43b1daf5268eacf19 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 94073015eacc34c1d8fc6786e43d60ca, type: 3} diff --git a/Assets/Story/Chapter0/C0_RollbackDemo_Checkpoint.yarn b/Assets/Story/Chapter0/C0_RollbackDemo_Checkpoint.yarn deleted file mode 100644 index c83fa5a7..00000000 --- a/Assets/Story/Chapter0/C0_RollbackDemo_Checkpoint.yarn +++ /dev/null @@ -1,30 +0,0 @@ -// 回滚机制示例 2/5:第二段主线 TextBlock,也是 TimelineMarker 的锚点。 -// StoryData Block ID 建议:c0_demo_checkpoint,gridColumn = 1。 -// 第一次选择后,StoryChoiceMemory 会记住 Option Text ID;再次进入本 Block 时不会显示选项, -// 而是自动返回玩家第一次选择的路径。回滚到本 Marker 后该记录会被恢复/清除。 - -title: C0_RollbackDemo_Checkpoint ---- -<> -SLS: 信号已经稳定。你必须决定接下来的处理方式。 -<> -SLS: 缺少前置记录,但测试流程仍可继续。 -<> - --> 记录信号的变化 - <> - <> --> 优先保护观测装置 - <> - <> -=== - -title: C0_RollbackDemo_Record ---- -SLS: 你选择了记录。 -=== - -title: C0_RollbackDemo_ProtectChoice ---- -SLS: 你选择了保护。 -=== diff --git a/Assets/Story/Chapter0/C0_RollbackDemo_Convergence.yarn b/Assets/Story/Chapter0/C0_RollbackDemo_Convergence.yarn deleted file mode 100644 index af5a1dac..00000000 --- a/Assets/Story/Chapter0/C0_RollbackDemo_Convergence.yarn +++ /dev/null @@ -1,18 +0,0 @@ -// 回滚机制示例 5/5:分支会合后的主线 TextBlock。 -// StoryData Block ID 建议:c0_demo_convergence,gridColumn = 3。 -// UnlockCondition:Any Of(BlockCompleted c0_demo_observe, BlockCompleted c0_demo_protect)。 - -title: C0_RollbackDemo_Convergence ---- -<> -SLS: 观测结果已归档。你从时间的回声中获得了答案。 -<> -<> -SLS: 装置已被保护。你为下一次观测保留了余地。 -<> -SLS: 没有发现有效分支记录,请检查 StoryData 的路线条件。 -<> -<> - -<> -=== diff --git a/Assets/Story/Chapter0/C0_RollbackDemo_Intro.yarn b/Assets/Story/Chapter0/C0_RollbackDemo_Intro.yarn deleted file mode 100644 index f9ce7899..00000000 --- a/Assets/Story/Chapter0/C0_RollbackDemo_Intro.yarn +++ /dev/null @@ -1,9 +0,0 @@ -// 回滚机制示例 1/5:第一段主线 TextBlock。 -// StoryData Block ID 建议:c0_demo_intro,gridColumn = 0。 - -title: C0_RollbackDemo_Intro ---- -SLS: 记录开始。请在这一刻之后决定如何观察异常信号。 -<> -<> -=== diff --git a/Assets/Story/Chapter0/C0_RollbackDemo_Observe.yarn b/Assets/Story/Chapter0/C0_RollbackDemo_Observe.yarn deleted file mode 100644 index 338e32c1..00000000 --- a/Assets/Story/Chapter0/C0_RollbackDemo_Observe.yarn +++ /dev/null @@ -1,14 +0,0 @@ -// 回滚机制示例 3/5:分支 1。 -// StoryData Block ID 建议:c0_demo_observe,gridColumn = 2, -// UnlockCondition:c0_demo_route == 1;ForbiddenCondition:c0_demo_route == 2。 - -title: C0_RollbackDemo_Observe ---- -<> -SLS: 观测记录已展开。异常波形正在重复上一段时间。 -<> -<> -<> -SLS: 当前路线不是观测路线;这段文字仅用于检查错误配置时的安全回退。 -<> -=== diff --git a/Assets/Story/Chapter0/C0_RollbackDemo_Observe.yarn.meta b/Assets/Story/Chapter0/C0_RollbackDemo_Observe.yarn.meta deleted file mode 100644 index a99bb548..00000000 --- a/Assets/Story/Chapter0/C0_RollbackDemo_Observe.yarn.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: aed5778d2d4a41db8acd3495bb7aa369 -ScriptedImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 2 - userData: - assetBundleName: - assetBundleVariant: - script: {fileID: 11500000, guid: 94073015eacc34c1d8fc6786e43d60ca, type: 3} diff --git a/Assets/Story/Chapter0/C0_RollbackDemo_Protect.yarn b/Assets/Story/Chapter0/C0_RollbackDemo_Protect.yarn deleted file mode 100644 index f53c7a56..00000000 --- a/Assets/Story/Chapter0/C0_RollbackDemo_Protect.yarn +++ /dev/null @@ -1,14 +0,0 @@ -// 回滚机制示例 4/5:分支 2。 -// StoryData Block ID 建议:c0_demo_protect,gridColumn = 2, -// UnlockCondition:c0_demo_route == 2;ForbiddenCondition:c0_demo_route == 1。 - -title: C0_RollbackDemo_Protect ---- -<> -SLS: 保护程序已启动。装置核心被暂时隔离。 -<> -<> -<> -SLS: 当前路线不是保护路线;这段文字仅用于检查错误配置时的安全回退。 -<> -=== diff --git a/Assets/Story/Chapter0/C0_RollbackDemo_Protect.yarn.meta b/Assets/Story/Chapter0/C0_RollbackDemo_Protect.yarn.meta deleted file mode 100644 index d88d3079..00000000 --- a/Assets/Story/Chapter0/C0_RollbackDemo_Protect.yarn.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: 4c751af9031c4f94b7295c01fa3a2b6a -ScriptedImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 2 - userData: - assetBundleName: - assetBundleVariant: - script: {fileID: 11500000, guid: 94073015eacc34c1d8fc6786e43d60ca, type: 3} diff --git a/Assets/Story/Chapter0/C0_UndergroundCity.yarn b/Assets/Story/Chapter0/C0_UndergroundCity.yarn new file mode 100644 index 00000000..6fa36255 --- /dev/null +++ b/Assets/Story/Chapter0/C0_UndergroundCity.yarn @@ -0,0 +1,427 @@ +// Chapter 0 · C0-S08 地下都市与团结纪念碑 +// 类型:Important TextBlock(待 StoryData 配置) +// 目标 Block ID:c0_underground_city +// 入口 Node:C0_UndergroundCity +// 标题 Localization Key:story_c0_block_underground_city_title +// 前置 Block:c0_ocean_heart +// 本稿不写入 persistent state,不设置 timeline anchor。 +// 三项互动按固定顺序出现,每组只有一个选项。 +// 萨米尔的规划稳定 Character ID 为 Samir;当前中文审阅稿沿用中文 Speaker 写法。 +// 行标签与演出命令留待文本批准后的资源接入阶段处理。 + +title: C0_UndergroundCity +--- +从大洋之心开出的交通列车抵达地下都市时,阿斯特里亚的公共时钟已经进入夜间。 #line:02b571e + +车窗外没有突然出现一座完整的城市。海底设施的隔离结构先被深灰色岩层取代,随后是维护轨、能源管线与一层层转乘平台。直到列车驶入居住区,成片灯光才从岩壁之间展开。 #line:023d330 + +曦原本还贴在窗边寻找中央穹顶,终端却先提醒她,今天的预约行程已经结束,住宿区位于下一层公共步道旁。 #line:08a6649 + +曦: 我还以为下车就能看见团结纪念碑,最好再配一条从车站直达正面的观光线。 #line:053e13e + +镜把投影收拢到不会挡住晚间乘客的位置,随曦一起走进换乘大厅。 #line:05d2ec5 + +中性白光照亮换乘标识,商铺和候车区则使用更暖的灯。大厅里最醒目的不是纪念设施,而是回家的人;有人提着食材,有人推着折叠代步椅,还有学生围着路线图争论哪条通道离排练室更近。 #line:0ff6735 + +住宿登记台设在一排普通商铺上方。曦办完入住,才发现房间窗外正对着一条跨越居住穹顶的慢行桥;人工暮色沿生活层横向展开,桥下灯光像地表街道一样延伸,更远处则是被柔和照明勾出的岩层弧面。 #line:02331c6 + +她把还带着海水气味的衣服送进清洁设备,又从包里取出父亲给的旧探针,确认它没有在浅水区的行李柜里受潮。探针亮起稳定白光,很快完成自检。 #line:047cd0a + +曦没有继续研究。她把探针放回内袋,给父母发送抵达消息,随后趴在窗边看了一会儿晚间列车从不同层级穿过城市。 #line:0e58710 + +这里没有为了她延长营业的景点。市场陆续收摊,学校通道熄灭一部分照明,慢行桥上的人流也渐渐减少。地下都市以自己的节奏结束这一天。 #line:0ef5d46 + +第二天上午,曦被楼下市场的开市提示叫醒。 #line:0389cd2 + +她原本计划先去中央历史区,却在住宿终端上看见一条来自伊内斯的路线备注:不要空着肚子看纪念碑,也不要绕过生活层。 #line:089f586 + +曦: 她对第一次来母星的人是不是都有一套固定的吃饭提醒? #line:02fbfcd + +曦收起终端。镜跟着她沿住宿区旁的缓坡进入市场,在人多的转角进一步收窄投影。 #line:047721b + +市场占据两条交通层之间的宽阔平台。摊位没有统一成同一种外观,旧式折叠柜、悬挂式冷藏架和新安装的无障碍操作台并排使用,地面上还留着几种年代不同的导向线。 #line:083f055 + +早餐摊前排着不长的队。摊主一边加热面饼,一边提醒旁边送货员,今天十一点以后旧环廊会进入更新封闭,最后一批常规通行测试结束后就要改走临时替代路线。 #line:0585732 + +送货员: 我已经把路线换好了。只是临时替代路线多一个缓坡,装满货的时候要慢半分钟。 #line:09244d2 + +摊主: 半分钟可以接受。以前那三段台阶才是真的不讲道理,我推冷藏柜上去的时候,每次都怀疑设计者不吃早餐。 #line:07c38f1 + +一名穿更新工程制服的男人正蹲在摊位侧面,把翘起的旧路标边缘重新压平。他没有用施工围栏清空整片市场,只等行人走过以后才移动工具。 #line:0192887 + +摊主把一份早餐递给他。 #line:09328cb + +摊主: 萨米尔,你今天还修这个?环廊都要拆了。 #line:0859864 + +萨米尔: 它还要再工作三个小时。旧东西没有因为排定退休,就能提前请假。 #line:0a35c57 + +曦没忍住笑了一声。男人抬起头,先看见她手里的早餐,再看见悬停在她身后的镜,神情只停顿了很短的一瞬。 #line:0f86a92 + +他穿着石墨灰工程制服,琥珀色功能安全线沿肩臂切过,袖口沾着薄薄的材料粉末。工作证写着“萨米尔·纳赛尔”和“更新工程师”,没有导览标识。 #line:0e47b6c + +萨米尔: 如果你们在找纪念碑,沿中央标线走二十分钟就到。如果想先吃完东西,这里有座位,不必赶着出发。 #line:0c14bf8 + +曦: 我们不是来找专门接待的,只是想从生活层走过去。你刚才说那条环廊今天要关闭? #line:01bab34 + +萨米尔: 对。我负责这次内衬与空间更新。决定已经通过,结构复核、施工认证和临时替代路线也都完成了。今天是常规通行的最后一天。 #line:0ce4283 + +曦: 那我不会耽误你吗? #line:0e89400 + +萨米尔: 不会。我本来就在核对这段路线,回答问题不影响进度。 #line:0865168 + +他收好压边工具,准备去旧环廊核对封闭前的现场记录。通往中央历史区的路线恰好与他的前半段工作路径重合。 #line:00b1716 + +萨米尔: 你们可以同行。先说清楚,我不是正式导览员,只能介绍与这段路线和工程有关的内容。完整历史资料在大图书馆。 #line:04e049f + +曦: 这听起来比正式导览更适合我。 #line:093ca31 + +市场另一端传来开门提示,更多居民从住宅层进入。曦把早餐包装送进回收口,跟着萨米尔走向那些没有被新标线完全覆盖的旧路标。 #line:0a1fded + +-> 沿着居民留下的旧路标,穿过生活层。 #line:0a6fe0f + <> +=== + +title: C0_UndergroundCity_OldWayfinding +--- +旧路标不是一套完整的官方导览。有些是嵌在地面的彩色石片,有些是贴在结构柱低处的金属箭头,还有些只在墙角画着几何图案,方便不熟悉通用文字的人辨认方向。 #line:0946388 + +新导航系统在视野中给出更短的中央路线,萨米尔却沿着一串褪色的橙色圆点绕进生活层内部。 #line:0d21511 + +曦: 这条路比系统推荐的长。 #line:01e0367 + +萨米尔: 长四分钟,经过两处公共座椅、一间全天开放的护理室和市场南口。住在这里的人保留它,是因为这些地方也属于日常路线。 #line:0712b96 + +一名牵着孩子的居民在前方停下。孩子正踩着每一枚橙色圆点前进,走过一段以后才发现有一枚被新铺的地面遮住,只剩边缘露在外面。 #line:0a9ebfb + +孩子: 这里少了一颗。 #line:093e803 + +萨米尔: 没少。它被新的防滑层盖住了,下一次分区维护会把标记补回表面。 #line:035e293 + +居民: 你们上次也是这么说,结果把圆点颜色调亮了。她回家以后坚持说旧路会发光。 #line:023b612 + +萨米尔: 那是材料规范更新,提高了颜色辨识度。旧标记会恢复,但不会发光。 #line:0105eec + +居民向他确认护理室仍从这条路开放,得到肯定答复后便带孩子继续前行。萨米尔在终端上补记了被覆盖的路标位置,没有把这件小事交给曦处理。 #line:03600ea + +道路两侧是已经使用许多年的住宅与公共空间。旧墙面经过反复修补,不同批次的材料在灯下呈现细微色差;新增的通风口、扶手和疏散灯没有伪装成最早的样式,也没有把旧表面全部包住。 #line:011dd6f + +曦: 我以为中央历史区会把旧东西统一保护起来,像展馆那样不许碰。 #line:07b3a0b + +萨米尔: 这里首先还是生活区。要是为了证明一段历史存在,就不许居民换通风、加扶手或移动商店,那历史会先把现在住在里面的人赶走。 #line:050f9e2 + +他们经过一间小书店。店主正把一箱新书推到门口,旧式运输轨在门槛前断开,新安装的升降板则填平了高度差。 #line:0dc09d9 + +店主: 萨米尔,明天施工以后,送货从北口进,对吧? #line:0ee15a5 + +萨米尔: 对。北口坡度更缓,但第一周人会多。我把卸货时段发给你了,临时储物间也保留到新环廊开放。 #line:051e38c + +店主: 那就行。旧环廊关掉以后,我大概还会走错几次。 #line:02dbf14 + +萨米尔: 我也会。路线调整已经合规,人的通行习惯还需要时间改变。 #line:05cc288 + +店主把旧环廊方向的一块手写营业牌翻到背面。背面已经提前写好临时替代路线,字迹和正面一样认真。 #line:0f5d29c + +曦看见更高一层的平台上有学生推着乐器箱经过。两条坡道在一根早期结构柱旁汇合,柱面保留着粗糙的铸造纹路,后来加装的防撞边缘却用了更柔软的新材料。 #line:015e526 + +曦: 这座地下都市到底有多大?我从昨晚到现在一直在换层,地图却还只显示中央区域的一小部分。 #line:0db6e58 + +萨米尔: 这不是一座孤立的地下城。现在的行星级地下网络连接居住、交通、能源与公共服务,中央历史区只是最早完成长期连续使用的一批区域之一。 #line:087fac7 + +曦: 是各地先建好,后来才接在一起的吗? #line:02b689e + +萨米尔: 有些早期设施更早,但全球同步建设是在行星统一后启动的。各地区在同一时期接入计划,真正完成主要网络前后花了一百多年。 #line:0a5eadd + +曦: 同时开始,为什么还会用这么久? #line:0929546 + +萨米尔: 因为目标不只是多挖一些空间。人口与公共服务需要扩展生活区域,彼此分散的交通、能源和供给系统也要接入共同基础设施,许多地表文化区域还不能为了施工被大规模拆掉。 #line:0418391 + +曦: 所以不是发生灾难以后,大家为了躲到地下临时造出来的? #line:03124b2 + +萨米尔: 不是。地表一直有人生活,地下网络也不是避难工程的放大版。它要在不清空地表城市的前提下增加空间,还得让各地原有系统逐步接得上。 #line:03a9dc5 + +萨米尔: 你现在看到的市场、学校和住宅都在网络里正常运转。纪念设施放在这里,是因为建设史每天从它旁边经过,不是因为这里已经退出使用。 #line:0c17ba1 + +一辆低底盘公共车从坡道上安静驶过。车内既有前往学校的学生,也有准备去中央医疗区的老人;窗侧路线图把地下网络画成密集分支,没有用单一中心代表整颗星球。 #line:0da6ff9 + +曦: 所以所谓统一建设,不是从一个中心向外复制同一种城市? #line:0a158a7 + +萨米尔: 各地没有采用从一个中心复制的方案。那会降低接口协调的复杂度,却无法保留地方生活方式和已有系统。 #line:0a4d2a1 + +萨米尔边走边示意曦看下一处换乘口。那里并排保留着三种宽度不同的旧门框,新的开放通道从旁边穿过,行人自然选择适合自己的入口。 #line:0e7f799 + +一名使用代步椅的居民从开放通道通过,转头和仍走旧门框的邻居打招呼。两人约好在市场见面,没有谁需要证明自己的路线更能代表这座城市。 #line:088c1be + +萨米尔: 早期各地区的结构标准、交通尺度和生活习惯不同。有人愿意立刻换新,有人希望保留熟悉的街道,也有人担心资源集中后,本地需求只会变成附注。 #line:0b30e93 + +萨米尔: 那一百多年不全是机器慢。许多时间花在协调入口留在哪里、哪一种系统先接入,以及施工期间谁不能被留在原地。 #line:0b1db43 + +曦: 听起来也不像所有人同时同意,然后一起开工。 #line:03a53ca + +萨米尔: 同步启动的是共同计划,不是同一句意见。开工时间、优先顺序和费用分配都争论过,纪念碑也记录了这些分歧与修改。 #line:021193c + +他的语气没有讽刺当年任何一方。经过一处墙面时,他停下让维修机器人先完成密封检查,又向正在搬运货架的摊主确认临时通道宽度够不够。 #line:0d24cf5 + +生活层的声音始终盖过讲解。咖啡设备的蒸汽声、学校换课提示、送货车的转向音和居民互相提醒施工路线的交谈混在一起,让地下网络不像一项已经完成的古代工程,更像一件每天都要继续使用的公共工具。 #line:0854084 + +旧环廊入口出现在下一段坡道末端。施工团队已经在侧面划出材料暂存区,几块拆下的内衬样本按位置编号排列,等待完成档案扫描与再利用分类。 #line:05d4637 + +曦的目光停在其中一块样本上。它的表面有好几层颜色,断面则露出新旧不同的填补材料;她下意识摸了摸随身包里旧探针的位置,却没有越过隔离线。 #line:061e252 + +萨米尔注意到她的动作。 #line:092fd6a + +萨米尔: 想看可以问。那块已经脱离承载结构,完成了污染检查,也允许在监督下做非破坏检测。不要检测仍在服役的墙;那会越过许可边界,也会干扰现场工作。 #line:0c269a8 + +曦: 我带的探针很旧,检测范围也有限。我只是想知道这些颜色是不是不同年代修过的。 #line:0d29dfc + +萨米尔: 这正好在它能回答的范围里。许可我来登记,结果只能作为个人观察,不能替代工程档案。 #line:04611ec + +-> 在得到许可后,用旧探针检查一块已经拆下的材料样本。 #line:0cab151 + <> +=== + +title: C0_UndergroundCity_MaterialSample +--- +萨米尔在暂存区终端上登记了设备类型与检测范围,又让现场材料员把样本移到低台面。材料员核对许可,确认旧探针不会刮伤表面后,才解除透明保护罩。 #line:0f238a9 + +曦握住探针时,拇指自然落在父亲曾教她使用的启动位置。顶端白光沿样本断面缓慢移动,显示范围远不如工程终端完整,却足以区分密度、导电层与几种常见填补材料。 #line:0fa7e5a + +最外层的浅灰涂层只有几年历史,下面压着颜色更深的防潮层。再往里是两次不同年代的裂缝填补、一段早期线缆槽封口,以及最初内衬留下的粗糙基材。 #line:0346ddc + +曦: 它像把一面墙分成了很多个时间。最早那层还在里面,但每次修过以后都变得不一样。 #line:0dd5802 + +萨米尔: 档案记录也是这样。这里不是一次建成后原样使用到今天的。早期通风改造封过线槽,后来补过热胀接缝,最近一次更新增加了低烟涂层。 #line:0f14216 + +现场材料员把工程终端的公开记录调到一旁。探针显示的层次与维护年份一一对应,没有出现遗漏的空洞、异常受力痕迹或未登记成分。 #line:09df794 + +材料员: 读数和拆前扫描一致。旧设备能把层次分出来,已经保养得很好。 #line:08c18c7 + +曦: 是我父亲用过很多年的。他说它不认识异世界技术,看来至少认识一块很老的母星墙。 #line:0cb8fb6 + +萨米尔: 墙使用的材料比你的探针年轻不了多少,双方有共同语言很正常。 #line:00c68c1 + +曦把探针移到样本边缘。那里有一道很浅的磨损带,材质本身没有失效,却能看出长期有人用手推车、行李箱和维修箱从同一高度擦过。 #line:0a6ac73 + +曦: 这条不是修补层。 #line:0781889 + +萨米尔: 是通行留下的。旧环廊最窄的地方,人们会贴着这一侧让路。我们扫描了表面,也记录了居民提交的路线记忆。 #line:0de964f + +曦: 既然结构没有发现新的问题,为什么仍然必须换掉? #line:0686869 + +萨米尔把样本的公开记录收拢到屏幕一侧,又调出环廊剖面图,让旧尺寸、新方案与疏散模拟同时显示。 #line:062c350 + +萨米尔: 旧主体目前仍通过本周期结构认证,但内衬组合已经不适合继续延长服役。它占用了净宽,转弯处没有足够空间让双向代步设备同时通过,检修层也挡住了新增疏散引导的连续视线。 #line:0fb44cd + +萨米尔: 新方案会扩大通行净宽,降低烟气积聚,补足避难接口,并让紧急状态下不同速度的人不必争用同一条窄带。认证、无障碍审查和疏散复核都支持更新。 #line:0623a70 + +材料员: 旧墙不是突然变坏了。是这里服务的人变多,通行标准也不再接受有人只能等别人先过去。 #line:035eef3 + +曦: 所以探针不会给出一个“其实不用拆”的秘密答案。 #line:094a843 + +萨米尔: 不会。它只让你看见这块材料经历过什么。更新决定正确,也已经生效;我带你看样本,不是邀请你重新裁决。 #line:06d0ace + +萨米尔把剖面图切回已批准状态,屏幕上的施工倒计时仍按原定计划前进。 #line:0934272 + +曦关闭探针,把样本留在原位。材料员重新罩上保护层,随后将它送往分类区;其中一部分会进入教学与城市档案,一部分按材料性能再利用,剩余部分按规定处理。 #line:0c83824 + +曦: 新环廊什么时候开放? #line:028fb46 + +萨米尔: 主通道需要封闭四十七天。市场货运要改走临时替代路线,附近两间店会暂时缩短营业时间,夜间施工也会影响一部分住户。新环廊启用后,最初几周仍要调整人流与标识。 #line:03c3a61 + +曦: 听起来不像把旧的拿下来、新的装上去,然后所有人立刻得到更好的版本。 #line:0178fc1 + +萨米尔: 工程简报必须把这四十七天的影响写清楚。正确方案仍然会占用时间、改变习惯,也会让一些每天碰到的东西不再留在原处。 #line:00ca5d8 + +旧环廊内传来测试提示。工作人员正在进行关闭前的最后一轮设备核对,几名长期使用这条路线的居民也受邀参加常规通行测试。 #line:08a7592 + +萨米尔: 下一轮会按平日速度通行,不是纪念活动。测试结束后,这条环廊退出常规服务,施工隔离随即生效。 #line:0709218 + +曦: 我可以旁观吗? #line:0b89eee + +萨米尔: 可以跟随公共测试组,但不能进入作业区,也不能要求为了参观减速。你会看见它作为通道工作的最后一次,不会看见一场告别表演。 #line:0798c05 + +-> 参加旧环廊关闭前的最后一次常规通行测试。 #line:0f4fd5c + <> +=== + +title: C0_UndergroundCity_FinalPassage +--- +测试组从市场侧入口进入旧环廊。没有人列队致意,居民仍按各自习惯走路:送货员推着半载货车,一名教师带着学生去排练室,两位使用代步设备的测试者则并行检查最窄转角。 #line:068fef5 + +环廊明显收窄,琥珀色检修灯把石墨灰旧内壁与隔离窗后的浅色新结构同时照亮。旧内衬比样本更完整,也更杂乱;官方疏散标识之间夹着手写箭头、旧店铺编号和孩子量身高时刻下的小线,多年修补让其中一些只剩半段。 #line:0d34ce1 + +送货员经过一处坡面时,车轮仍习惯性地向左偏。新临时标线要求他提前转向,他试了两次,确认满载状态也能通过临时替代路线。 #line:04c835a + +送货员: 临时替代路线宽一些,可我大概还会在这里转头几个月。 #line:076d23f + +萨米尔: 所以旧入口封闭后不会立刻拆掉外侧路标。我们会保留过渡提示,直到误入记录降到标准以下。 #line:03eec09 + +另一端,两台代步设备在转角相遇。旧净宽让其中一人必须退到凹位,另一人才能通过。两位测试者显然已经重复过许多次,没有争执,只把等待时间与转向距离记录下来。 #line:0401f6b + +测试者: 我从小就走这条路,也很熟悉每个可以让车的位置。但熟悉不等于它对所有人都方便。 #line:08d0dc5 + +同行居民: 新环廊开了以后,我会想念这面墙。可我不会想念每次在这里等三班人过去。 #line:0fd17f7 + +萨米尔先记录等待时间与转向距离,又在同一条目下附上居民关于旧墙的意见。 #line:0b01690 + +曦: 这些墙上的标记会全部保存吗? #line:006db0c + +萨米尔: 公开部分已经完成高精度扫描,居民可以申请隐藏涉及私人信息的内容。能够安全拆分的代表性区段会进入中央档案与纪念设施,其余只保留记录。 #line:05bded2 + +曦: 可记录下来以后,大家每天走过时摸到的就不是这面墙了。 #line:0bd3207 + +萨米尔停在一处被许多手掌磨得发亮的转角,用指节轻轻碰了一下那片光滑表面。 #line:0a6a5d2 + +萨米尔: 对。这里会停止作为他们每天经过的那面墙存在。影像、材料样本和口述能保存很多信息,却不能继续占据同一个转角。 #line:00b2ed0 + +他指向前方的新环廊接口。透过临时隔离窗,可以看见更宽的环廊骨架、连续扶手、低位导向和分开的检修空间。 #line:0c23b41 + +萨米尔: 新环廊会把这条交通功能延续下去,而且会让更多人安全使用。它该建,也必须建。但如果报告因此写成“原有通道完整延续”,我认为那不准确。 #line:04282ec + +曦: 因为路还在,原来那条路却不在了。 #line:069e48c + +萨米尔: 大致如此。我在这里长大,小时候去学校就从这面墙边跑过去。后来我离开中央历史区,到其它地区接受更新工程训练,回来做的第一批长期项目里,就包括评估它什么时候该退出服务。 #line:0227d33 + +萨米尔: 我不后悔回来,也不反对这次更新。只是当我签下执行确认时,我知道自己正在结束一件参与过日常生活的东西,不只是替换一组性能参数。 #line:0620169 + +教师带着学生从他们旁边经过。一个学生问以后还能不能找到自己小时候画错方向的箭头,教师说扫描资料可以查到,另一名学生则提醒他,那支箭头曾把整组人带进过清洁间。 #line:0ffa7e2 + +学生: 那也应该留下记录。至少可以证明我后来认路了。 #line:05d0e77 + +教师: 可以。说明里会同时写上它指错方向,否则未来的人会以为我们认真照着它走了十年。 #line:02dc165 + +萨米尔笑了一下,把这段公开对话标记为可收录建议,并在“错误方向”后面补上当年的清洁间位置。 #line:065932d + +环廊广播提示最后一轮通行数据已经收齐。送货车、代步设备与普通行人依次离开,系统确认临时替代路线全部可用。 #line:0b2cf7a + +入口的常规通行标识从绿色变为灰色。施工人员没有立刻拆墙,先完成清场复核,再逐项锁定能源、消防与环境接口。 #line:002792d + +萨米尔在终端上签署关闭确认。动作很短,屏幕却列出了之后四十七天里所有责任:临时路线维护、夜间噪声限制、商铺补偿、材料归档、疏散复测与开放前验收。 #line:0c93d62 + +曦: 你刚才说,这个决定不是你替所有人做的。 #line:0be43f9 + +萨米尔: 公共审议、居民反馈和专业复核已经完成。我的职责是执行获批方案,并让施工中承诺的事情真的发生。 #line:01cde1a + +曦: 那你还在犹豫什么? #line:0d0b22a + +萨米尔: 不是犹豫要不要执行。我在处理一份面向公众的更新记录。有人希望标题写“旧环廊完成使命,新环廊延续一切”;有人认为这样最容易让居民理解工程连续性。 #line:066cc84 + +萨米尔: 功能确实会延续,交通不会中断太久,旧材料也会被扫描和分类。可我不想让这些正确事实合在一起以后,变成另一个不准确的结论,好像没有任何对象真正离开。 #line:02d657b + +直到此时,镜才第一次在这段地下行程中开口。它的镜面映着已经变灰的入口,也映着隔离窗后尚未完成的新环廊。 #line:0d379d8 + +镜: 功能替代只能证明工程目标得到延续,不能证明承载过这些功能的原有对象没有消失。若记录把二者视为同一事实,它描述的是连续性,不是完整经过。 #line:05203b1 + +萨米尔看了镜一会儿,把记录草稿中的“完整延续”划去,没有立刻输入新的标题。 #line:0176b64 + +萨米尔: 对。我需要的不是反对更新的口号,而是让记录承认:新环廊解决了真实问题,旧环廊也确实结束了。两句话不会互相抵消。 #line:03dad7d + +曦想起刚才探针显示的多层修补。每一层都让那块材料继续工作过,却没有让它回到最初建成时的样子;如今更换同样延续了一部分,也终止了另一部分。 #line:0a4cba8 + +她没有提出保留整条旧环廊。眼前的转角已经清楚说明,那样做会继续让一些人等待、绕行,并让紧急疏散承担不必要的限制。 #line:09212f4 + +萨米尔按下保存,保留两个尚未合并的标题句,并把草稿送入下一轮居民代表与档案人员的共同审阅。 #line:0f19629 + +萨米尔: 关闭完成。接下来我还要去材料区,中央纪念碑在另一条路上。不过我今天需要到那里交一组早期构件记录,可以继续带你们走到入口。 #line:023d747 + +曦: 这次还是不背年份? #line:0bb2562 + +萨米尔: 我会只说明与眼前材料和路线直接相关的年代,不做完整历史讲解。 #line:0d52caa + +他们离开已经封闭的旧环廊。临时替代路线承担起原本的人流,最初几名居民在岔口放慢脚步,确认标识后便继续去往学校、市场和医疗区。 #line:038d6fb + +<> +=== + +title: C0_UndergroundCity_UnityMonument +--- +中央穹顶比曦前一晚从远处看见的更加开阔。人工天幕模拟着上午的散射光,住宅平台、公共花园和交通桥在穹顶下层层展开,中央区域却没有竖起一座遮挡视线的高塔。 #line:0e491b2 + +团结纪念碑是一圈低矮结构,最高处只到成年人肩侧,也没有规定来访者必须站在哪一面。来自不同地区、不同建设年代的石材、合金、复合板与早期管线外壳彼此相接,每一段都保留自己的纹理、尺寸和修补痕迹。 #line:0662fc2 + +圆环中心没有雕像,也没有封闭展台,而是一条仍在使用的公共通路。上班的人从中穿过,孩子沿着环形边缘寻找材料编号,清洁设备则在行人间隙完成日常维护。 #line:037639f + +曦: 我原来以为纪念碑中心会放一件所有人都必须抬头看的东西。 #line:00b061c + +萨米尔: 当年的公开方案里有过高塔、总设计师群像和全球地图。最后选择公共通路,是因为这项工程最重要的结果不是让人站在外面观看,而是让不同地方的人能从中间走过去。 #line:0825574 + +圆环上的说明没有把建设过程写成一次共同欢呼。某些材料旁记录着标准争议,某些段落说明原地区曾延后接入,还有一处保留了居民要求修改安置方案后重新施工的接缝。 #line:0310b91 + +一群学生围在那道接缝旁完成课堂记录。教师让他们分别找出“工程因此变慢”和“修改避免了谁被排除”两项信息,不允许只抄最后完工日期。 #line:0555480 + +萨米尔: 团结不是没有分歧,也不是每个人最后喜欢同一种生活。很多地区保留了自己的语言、街道习惯和公共空间尺度,协调的目标是让它们能够接入共同网络,而不是先变得一样。 #line:0ca22eb + +一位来自外区的游客指着两块颜色差异很大的材料,问为什么不重新处理成统一表面。值守人员解释,这些构件来自不同气候区的早期入口,各自适应过不同环境;把表面统一不会增加结构性能,只会让来源更难辨认。 #line:0209106 + +游客接受解释后继续拍摄。旁边一名本地居民则指出,其中一块材料当年更换过固定方式,说明牌应该补上施工争论的后续结果。值守人员当场登记,没有把纠正视为破坏纪念气氛。 #line:04e14e5 + +曦沿圆环慢慢走。不同材料映出市场摊主、学生、维修人员和游客的身影,他们从各自方向进入,又从圆环中心继续前往不同地方。 #line:0569d84 + +曦: 如果当时每个地区都坚持自己的标准,最后怎么真的连成一张网络? #line:079e423 + +萨米尔: 有些标准改了,有些接口做了兼容,有些计划推迟,有些地区承担了更多成本,也有一些原方案在审议后被放弃。不是每次协调都让所有人同样满意。 #line:097eee5 + +萨米尔: 但建设过程必须持续回答一个问题:改动以后,原本依赖这条路、这种语言、这种生活方式的人还能不能一起使用它。没有一次答案能管到永远,所以我们现在仍在修。 #line:03b3d90 + +他把早期构件记录交给纪念碑资料站。工作人员逐项核对来源、年代与公开权限,其中一项因为地区名称使用了后来的简称,被退回要求补充原称与变更说明。 #line:06db9b3 + +萨米尔: 这就是记录工作容易遗漏的地方。材料已经在这里放了一百多年,名称仍然需要补充历史用法。 #line:099b3e0 + +工作人员: 多写一行比让来访者以为当年就这么叫简单。你今天的更新记录也一样,别为了版面替我们省字。 #line:0745912 + +萨米尔: 我会把这句作为档案部门的正式威胁附在意见后面。 #line:075aea6 + +工作人员用指节轻敲两下台面,把修订要求发回他的终端。萨米尔看见提示后,顺手把这一项排进下午的记录工作。 #line:081db71 + +圆环外侧有一排不起眼的小型材料柜。柜中不是高等级文物,而是历次更新中淘汰、经过安全处理的结构碎片;部分表面保留修补层,背面则刻有来源区域与退役年份。 #line:0702faa + +萨米尔从资料站领取一枚两指宽的纪念章。它是由淘汰结构材料切成的不规则深灰扁片,边缘经过封闭处理,原有固定孔和一道旧裂痕都被保留下来;浅色新材料沿裂痕补强,修补边界清楚可见。 #line:02c65cd + +萨米尔: 这是这里一直有的习惯。第一次来中央历史区的人,可以带走一小块经过处理的修补材料。它没有徽记、口号或发光功能,也不代表你参与了当年的建设。 #line:0494a0b + +曦: 每位第一次来的游客都有? #line:0d97590 + +萨米尔: 只要愿意领取,也只从确认可以再利用的淘汰材料里制作。有人带走,有人留在柜里。它主要证明一件很普通的事:这座城市靠反复修补使用到今天。 #line:08864f9 + +他捏着纪念章经过封闭处理的边缘,把保留旧裂痕的一面朝上递给曦。 #line:06b2e56 + +曦接过纪念章。金属表面还能看见一道颜色不同的填补线,触感不像商店里全新制造的纪念品那样均匀。 #line:08f3a6d + +曦: 谢谢。我会收好。 #line:0cd8152 + +她把纪念章放进随身包内层,位置正好在旧探针旁边。拉上内袋以前,两件东西轻轻碰了一下。 #line:01d6f98 + +镜悬停在公共通路边,为一辆从低矮圆环中心穿过的童车让开位置。 #line:0b06ff7 + +曦: 你接下来也去大图书馆吗? #line:0784e62 + +萨米尔: 不去。旧环廊刚关闭,接下来四十七天的施工协调已经开始。我需要返回现场处理隔离与交接,大图书馆不在今天的工作路线内。 #line:0fea5eb + +曦: 那我就不拿历史问题继续耽误你了。至少我知道,先从市场走过来没有绕远。 #line:0a6dc06 + +萨米尔: 不算绕远。那条旧路线虽然多花四分钟,却把生活层和中央广场连在一起。 #line:02a7b37 + +他们在圆环外侧道别。萨米尔沿工程通道返回旧环廊,途中停下来回答一名居民关于夜间施工的时间问题;曦则按公共路线走向连接大图书馆的交通站。 #line:024377b + +她回头时,低矮纪念碑仍没有从人群中突出来。不同年代、不同地区的材料围成一圈,中心不断有人通过;那些接缝没有妨碍城市继续运转,也没有被灯光藏起来。 #line:0492fb2 + +<> +=== + +title: C0_UndergroundCity_Departure +--- +前往大图书馆的交通舱从中央穹顶缓缓驶出。车内有人阅读工作记录,有人讨论午后的课程,还有两名游客对着纪念碑路线争论自己是否错过了最高的观景台。 #line:0ff636b + +曦没有替他们解释。她打开终端,把今天拍下的市场、旧路标、材料样本和环廊入口按实际经过的顺序归档,团结纪念碑只占最后几张。 #line:07b6bda + +资料系统自动建议以“中央历史区主要景点”重新排序。曦看了一眼,按下“保留当前顺序”。 #line:0f77311 + +她摸到包内层的纪念章,又确认旧探针仍固定在旁边,随后把拉链重新拉好。 #line:046e7ee + +镜把大图书馆的公共入口投到交通舱侧面的路线界面上,预计抵达时间随轨道切换更新了一次。 #line:08d3867 + +窗外,地下网络的支线向行星岩层深处延伸。中央历史区很快退到后方,市场仍在营业,临时替代路线继续承载人流,施工团队也已经开始执行第一项隔离检查。 #line:0c7899a + +曦仍然很想看看四十七天后的新环廊,也不觉得这份期待需要假装旧环廊没有结束。 #line:0068f3e + +交通舱转入上行轨道,大图书馆的入口标识出现在前方。萨米尔没有同行,团结纪念碑也留在仍需不断维护的城市里。 #line:0463b7e +=== diff --git a/Assets/Story/Chapter0/C0_UndergroundCity.yarn.meta b/Assets/Story/Chapter0/C0_UndergroundCity.yarn.meta new file mode 100644 index 00000000..cda12702 --- /dev/null +++ b/Assets/Story/Chapter0/C0_UndergroundCity.yarn.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 6c0b3e9e14e352c4685c34a9a6e7c371 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 94073015eacc34c1d8fc6786e43d60ca, type: 3} diff --git a/Assets/Story/Chapter0/Chapter0.yarnproject b/Assets/Story/Chapter0/Chapter0.yarnproject index a2e181df..cbeafee8 100644 --- a/Assets/Story/Chapter0/Chapter0.yarnproject +++ b/Assets/Story/Chapter0/Chapter0.yarnproject @@ -1,35 +1,35 @@ { - "projectFileVersion": 4, - "sourceFiles": [ - "**/*.yarn" - ], - "excludeFiles": [ - "**/*~/*", - "./Samples/Yarn Spinner*/*" - ], - "localisation": { - "zh-CN": {} - }, - "baseLanguage": "en", - "compilerOptions": {}, - "editorOptions": { - "yarnScriptEditor": { - "characters": [ - { - "name": "SLS", - "colour": "#39a7a5" - }, - { - "name": "Asahi", - "colour": "#a89a00" - } - ], - "projectGraphPositions": { - "C0_A0.yarn": { - "x": 12, - "y": 12 - } - } + "projectFileVersion": 4, + "sourceFiles": [ + "**/*.yarn" + ], + "excludeFiles": [ + "**/*~/*", + "./Samples/Yarn Spinner*/*" + ], + "localisation": { + "en": {} + }, + "baseLanguage": "zh-CN", + "compilerOptions": {}, + "editorOptions": { + "yarnScriptEditor": { + "characters": [ + { + "name": "SLS", + "colour": "#39a7a5" + }, + { + "name": "Asahi", + "colour": "#a89a00" } + ], + "projectGraphPositions": { + "C0_A0.yarn": { + "x": 12, + "y": 12 + } + } } + } } \ No newline at end of file diff --git a/Assets/Story/Chapter0/StoryData_Chapter0.asset b/Assets/Story/Chapter0/StoryData_Chapter0.asset index cdfa638a..96e73ac4 100644 --- a/Assets/Story/Chapter0/StoryData_Chapter0.asset +++ b/Assets/Story/Chapter0/StoryData_Chapter0.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9211bc1dc83a49b60c8e7e1a594dabb2e9e54dc160fbcd828cc5aeef7f7ac1a2 -size 6423 +oid sha256:ff5b1bf187504bfb544d79af924bfb627cd0ec4fd7796ad43d0f3c53766bd792 +size 9435 diff --git a/Assets/StreamingAssets/Audio/GeneratedSoundBanks/ProjectInfo.json b/Assets/StreamingAssets/Audio/GeneratedSoundBanks/ProjectInfo.json new file mode 100644 index 00000000..c9bce9a1 --- /dev/null +++ b/Assets/StreamingAssets/Audio/GeneratedSoundBanks/ProjectInfo.json @@ -0,0 +1,50 @@ +{ + "ProjectInfo": { + "Project": { + "Name": "ichni Official_WwiseProject", + "GUID": "{97A7933F-F766-44C5-8FB7-BA7A78330B5B}", + "Generator": "2024.1.9.8920" + }, + "CacheRoot": "../../../../ichni Official_WwiseProject/.cache", + "Platforms": [ + { + "Name": "Android", + "GUID": "{FEFC6743-0B9E-428E-85FD-D2E04862D1B3}", + "BasePlatform": "Android", + "BasePlatformGUID": "{A2D401DE-B8B6-4FEB-8142-137C34D507CA}", + "Path": "../../../../ichni Official_WwiseProject/GeneratedSoundBanks/Android" + }, + { + "Name": "iOS", + "GUID": "{CD3DB28A-D3AA-4073-BECE-061851841C40}", + "BasePlatform": "iOS", + "BasePlatformGUID": "{ECE03DB4-F948-462D-B2BB-A9173012B1F8}", + "Path": "../../../../ichni Official_WwiseProject/GeneratedSoundBanks/iOS" + }, + { + "Name": "Mac", + "GUID": "{105AE373-F928-48F4-8A8A-A5C6DFAC098E}", + "BasePlatform": "Mac", + "BasePlatformGUID": "{9C6217D5-DD11-4795-87C1-6CE02853C540}", + "Path": "../../../../ichni Official_WwiseProject/GeneratedSoundBanks/Mac" + }, + { + "Name": "Windows", + "GUID": "{910730DE-9D97-4F9A-9501-DA3ECABDDBAE}", + "BasePlatform": "Windows", + "BasePlatformGUID": "{6E0CB257-C6C8-4C5C-8366-2740DFC441EB}", + "Path": "../../../../ichni Official_WwiseProject/GeneratedSoundBanks/Windows" + } + ], + "Languages": [ + { + "Name": "English(US)", + "Id": "684519430", + "GUID": "{7C15C6BA-B91A-4020-8908-F97C85BB957A}", + "Default": "true", + "UseAsStandIn": "true" + } + ], + "FileHash": "{46C77BE6-0FD6-5DC6-2773-09AD37AFC93D}" + } +} \ No newline at end of file diff --git a/Assets/StreamingAssets/Audio/GeneratedSoundBanks/ProjectInfo.json.meta b/Assets/StreamingAssets/Audio/GeneratedSoundBanks/ProjectInfo.json.meta new file mode 100644 index 00000000..412ade96 --- /dev/null +++ b/Assets/StreamingAssets/Audio/GeneratedSoundBanks/ProjectInfo.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 20faae778b107174c87f6d7cfae5a396 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/StreamingAssets/ThemeBundles/Android/basic b/Assets/StreamingAssets/ThemeBundles/Android/basic index 6dc588d1..db3a6616 100644 Binary files a/Assets/StreamingAssets/ThemeBundles/Android/basic and b/Assets/StreamingAssets/ThemeBundles/Android/basic differ diff --git a/Assets/StreamingAssets/ThemeBundles/Android/departure_to_multiverse b/Assets/StreamingAssets/ThemeBundles/Android/departure_to_multiverse index 7d73eb98..fcf3df45 100644 --- a/Assets/StreamingAssets/ThemeBundles/Android/departure_to_multiverse +++ b/Assets/StreamingAssets/ThemeBundles/Android/departure_to_multiverse @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ee34964900f07e3853f5b0fc28cfa81dbca697d08d6ddb7f7e741d984ca6c6b7 -size 1502797 +oid sha256:ec534896c17e18b15fd2d391ad6db442eb4c85e87b3abc1bad848076de930b48 +size 278 diff --git a/Assets/Wwise/API/Runtime/Plugins/Windows/x86/Profile/AkUnitySoundEngine.dll.meta b/Assets/Wwise/API/Runtime/Plugins/Windows/x86/Profile/AkUnitySoundEngine.dll.meta index 21e19158..b722297d 100644 --- a/Assets/Wwise/API/Runtime/Plugins/Windows/x86/Profile/AkUnitySoundEngine.dll.meta +++ b/Assets/Wwise/API/Runtime/Plugins/Windows/x86/Profile/AkUnitySoundEngine.dll.meta @@ -16,7 +16,7 @@ PluginImporter: settings: Exclude Editor: 1 Editor: - enabled: 1 + enabled: 0 settings: CPU: x86 DefaultValueInitialized: true diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index f2a9d94e..b37b5cac 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:88f3289dbf0b17be0eed0a0b23214dab461bb159e595a7c371f21cabc6b9e212 -size 29407 +oid sha256:1c3f3ef259893a66ba894a07617613542a5d23386a37d01ce29f7a84f4b7cc12 +size 274 diff --git a/docs/chapter0-prologue-dialogue-exploration.md b/docs/chapter0-prologue-dialogue-exploration.md new file mode 100644 index 00000000..98220db5 --- /dev/null +++ b/docs/chapter0-prologue-dialogue-exploration.md @@ -0,0 +1,1344 @@ +# Chapter 0 序章对话探索稿 + +> 状态:**探索稿,非正式台本** +> 用途:帮助共同审阅 Chapter 0 的线性叙事、信息揭示顺序、角色语气与场景情绪。 +> 不用于直接导入 Yarn;其中尚未由用户确认的地点、道具、公共流程和次要人物均为可替换方案。 +> 语言:简体中文原稿。正式制作前仍须按项目规范拆分为 StoryData Block、Yarn Node、Localization Key 与角色资源需求。 + +## 已确认的创作边界 + +- 序章按时间顺序推进;玩家扮演曦。 +- 科学家群体先后做了同一种梦,并依梦中指引与无实体的“神”建立联系。 +- 神提出交易:只有随机选中的曦自愿签约,契约才会成立;她拒绝则交易终止。 +- 契约生效后不可撤回,但神允许总计约十至十五周的告别与出发准备期;母星旅行包含在该期限内。 +- 镜在曦签约后出现,公开陪同并说明任务。它平和、礼貌,但带有高维观察者的傲慢。 +- 公众在曦完成私密签约后才得知全部已知事实。文明对“献祭”的具体形式、目标、后果与各异世界状况均不知情;它们不能把未知包装成保证。 +- 文明正式称呼为“联星共同体”,日常简称“星联”;它是当前宇宙唯一已知文明。 +- 曦先在科研居住世界泽尼斯与父母告别,再和镜前往从未亲临的母星阿斯特里亚。阿斯特里亚是历史、文化与旅游中心;行星使用天文标识与文明通称的双层命名,不使用“XX星”式称呼。 +- 高维接触项目研究代表为 서윤아 / Seo Yuna(徐允雅)。她兼具研究说明与知情同意监督职责,拥有暂停签约、要求补充告知及阻止宣传施压的制度权力。 +- 本文除“拒绝契约”的不保存彩蛋外,不设计改变主线的选项。 + +## 镜的语气基准(本轮修订) + +- 镜不把每一件人类日常都当成低效的反例,也不需要向人类索取答案。 +- 镜习惯从时间尺度、结构后果、选择权与代价的角度作出判断;发问应少而准确,只在关键人物的矛盾显露时直指其核心。 +- 它知道自己的能力将受神限制,但这不是谦逊。若观测未受限制,它确信高维观察能够给出完整而准确的判断;它不会因为几次交谈而承认自己错误、声称理解三维生命,或向任何人索取人生答案。 +- 在序章末,镜仍是中立的契约执行者与上位观察者。它与曦保持任务之外的距离,不安慰、不许诺友谊,也不把自己说成正在被她改变。 + +## 暂定关键配角(可替换) + +- **深水保育员**:负责海底游览区与原始深海保护带之间的隔离、维护与公众导览。其矛盾不在“自然是否值得保护”,而在于安全展示会不会使人把海洋误认成可随意消费的景观;它守护的是人面对深处时仍应保留的边界。 +- **地下更新工程师**:负责地下都市一段老旧结构的替换与记录工作。其矛盾不在反对进步,而在于担心每一次必要更新都被说成“没有代价”,最终让居民忘记哪些生活痕迹曾被放弃。 +- **青年作曲者**:参与共鸣广场音乐会。其矛盾不在能否写出受欢迎的曲子,而在于一首作品若只剩下所有人都愿意接受的部分,是否还保留自己的声音。 + +--- + +## 场景一:共同梦境之后的私密会面 + +**场景目的**:用完整、可理解的语言说明交易、拒绝权和未知代价。玩家先知道这不是紧急灾难救援,而是一项关乎文明终局的自愿选择。 + +**样例对话** + +总统办公室没有被设计成传统意义上的“办公室”。房间的一整面墙都是透明的,外面是科研都市的傍晚。运输轨道在高空安静地弯过,列车依次亮起车厢灯;更远处,实验区的穹顶正慢慢合拢,像这座星球每一个普通工作日的收尾。桌面上放着一杯已经温热的饮料、一支可以随时关闭的录音笔,以及一本没有打开的纸质笔记本。曦在学校历史馆见过这种纸:它不能自动备份,也不能被权限悄悄改写,写下来的话会和折痕、涂改一起留下。 + +总统没有坐在桌后,而是坐在圆桌边。除他以外,只有高维接触项目研究代表徐允雅。她没有佩戴实验室惯用的身份徽章,只在暖灰色短外套的袖口留着一条低饱和金色识别线。她先向曦说明,今天的谈话不会被直播,也不会成为对外宣传材料;自己的职责不是替政府促成签约,而是确认曦听懂了每一条已知事实,并有不受干扰地拒绝的机会。 + +徐允雅:在任何时候,你都可以提出暂停。你可以离开,可以要求父母到场,可以另找法律、伦理或心理方面的第三方与你谈。你不需要担心“现在不答应会不会让大家失望”。那不是你的责任。 + +曦:听起来像是我已经卷进了一件很严重的事。 + +总统:是。但严重不等于必须由你承担。 + +研究代表把一枚薄得像玻璃片的装置放到桌面中央。装置没有投出夸张的影像,只显示一段经过匿名处理的时间记录:来自不同星球、不同研究机构的人,在相近的几个小时里提交了完全相同的梦境报告。 + +研究代表:十七天前,第一位报告者是一名恒星工程师。她梦见自己站在一条没有尽头的长廊里,墙上没有门,只有一段反复出现的文字。第二天,另一颗星球上的生命科学家、历史研究者、材料学家和认知研究者分别报告相同内容。我们最初按传播性心理事件处理,后来发现每个人都看见了同一组验证信息;那组信息无法由我们的任何系统生成,也在后续实验中成立。 + +曦:所以你们照着梦里的步骤做了。 + +研究代表:我们先花了十天验证它不是恶意入侵、集体暗示或某个已知文明留下的自动信号。确认无法归类后,才按梦中指引建立联系。对方没有形体,没有图像,没有自称姓名。它没有要求崇拜、资源或政治权力,只提出一份交易。 + +总统把笔记本推到曦面前,纸页上只写着几个供她之后查看的关键词:第四维度、科技锁、唯一候选人、履约窗口、未知条件。 + +总统:交易的一边,是对方愿意交出我们始终无法取得的理论与方法。它们足以解除我们在高维研究上遇到的限制,使文明有机会达到第十等级,并继续走向第四维度。 + +曦:也就是飞升。 + +总统:可以这样说。但它不是把几艘船造得更快,也不是再建设几颗都市星球。我们已经能在三维世界里抵御大多数灾难、保存知识、跨越星系,仍然无法绕开三维宇宙最后的终局。那是极其遥远的事,不是明天会落下的灾难;但“极其遥远”不等于“不存在”。我们想为文明留下不只一种可能。 + +曦:另一边呢? + +徐允雅:另一边是你。对方没有指定“一个代表”,也没有让我们从志愿者中选择最优秀、最适合或最愿意牺牲的人。它指定了一名随机选中的十七岁少女。经过重复验证,候选人只有你。 + +办公室安静了几秒。曦把双手放在膝盖上,指尖一点点收紧。窗外一辆校际列车穿过桥梁,她忽然想到父母大概正在等她回家吃饭,而他们还不知道这间房里有人把“文明的未来”和她放在同一句话里。 + +曦:如果我拒绝呢? + +徐允雅:交易终止。不会换成第二个人,不会把任务转给成年人、研究团队或政府。我们会失去这次机会,但文明仍按自己的道路继续生活。 + +曦:你们不会继续劝我? + +徐允雅:不会。今天不会,以后也不会。若你拒绝,候选人的身份会封存,公众不会知道“有人替他们放弃过什么”。你也不必向任何人解释。 + +研究代表:对方留下的条件里明确要求自愿。我们无法确定它如何判断自愿,但不能因为文明确实需要机会,就把你的害怕、亏欠或孤立当作促成同意的工具。 + +曦:那它到底要我做什么? + +总统看着她,语气没有回避,也没有假装自己能给出让人安心的解释。 + +总统:已知规则只有一条:你将在一位高维存在的陪同下前往多个世界;每离开一个世界之前,你必须献上一件自己真诚认为是那个世界最珍贵的事物。 + +曦:献上是什么意思? + +研究代表:我们不知道。它拒绝解释“献祭”的形式、可选择的对象、会产生的后果,也拒绝说明那些世界的状况。我们不能保证那是一件轻松的事,更不能保证它不会迫使你面对难以接受的选择。 + +曦:那“最珍贵”呢?要是我根本不知道答案怎么办? + +总统:它没有给标准答案。我们目前只知道,真诚是条件的一部分。你不能把一个自己并不相信的答案说成重要,也不能让别人替你规定什么该被珍视。其余部分,只能由你在旅程中得知。 + +曦:这听上去很不公平。 + +徐允雅:是。我们没有义务替未知粉饰成公平。今天也不要求你立刻接受它。真正困难的地方正在于:即使我们把现有资料全部交给你,你仍然无法获得完整信息。你有权认为这不足以签约。 + +曦:那你们为什么还要把这叫作“自愿”?信息都不完整。 + +徐允雅:因为自愿不等于世界先把所有风险消除。我们做得到的是把已知与未知分开,不伪造安全感,不把你关在一个只能答应的环境里,也不在你拒绝后追究。它仍然不是一份我会轻易建议任何十七岁学生签下的契约。 + +总统:我们甚至讨论过,要不要因为信息不足,直接拒绝与对方继续联系。但若这样做,决定就会由成年人替你作出,和替你答应没有本质区别。所以我们选择把问题交还给你,同时承认这会让人觉得残酷。 + +研究代表:所有资料副本都可以带走。里面有我们的验证过程、每一次向对方提出的问题,以及对方拒绝回答的记录。你不必相信我们对它的解释,也可以自己判断我们是否遗漏了什么。 + +曦:如果我最后答应,不是因为我觉得它公平呢? + +徐允雅:那也必须是你的判断。你可以认为它不公平,仍选择承担;也可以认为它不公平,因此拒绝。我们唯一不能接受的是你为了让我们满意,假装自己相信了并不相信的事。 + +总统:我们只能说明文明为何珍视这次机会,不能替你说这一定值得。你的生命不是文明可以自动调用的资源。 + +曦低头看向笔记本。上面没有英雄口号,只有几行冷静的事实。她翻到最后一页,看见准备期的说明:契约一旦成立不可撤回,但神允许十至十五周的告别与出发准备,其中包括她提出的母星旅行。至于任务结束后能否归来,对方没有回答。 + +曦:如果我答应,我能回来吗? + +总统沉默了一下。研究代表似乎想用更温和的说法补充,却被总统轻轻抬手制止。 + +总统:不知道。对方没有回答,也没有允许我们以任何形式保证。我们知道这可能是永别。 + +曦:你们连这个都不知道,还把选择交给我。 + +总统:正因为不知道,才不能替你说“你应该去”。若我们把未知藏起来,或者把你的同意当成文明自动得到的结果,那我们即使获得答案,也已经先失去了想守住的东西。 + +徐允雅把一枚小型通讯终端放到她手边。 + +徐允雅:现在可以联系父母。你可以带着资料回家,可以让他们与任何一方单独谈,也可以让我们永远不再联系你。今天的谈话不会产生“默认同意”。 + +曦拿起终端,又放下。她还没有答案,害怕也没有消失;但她抬头时,声音已经不再只是慌乱。 + +曦:我想把资料全部看完。我也想先和爸爸妈妈谈。等我知道自己到底愿不愿意承担这件事,再请那个陪同者出现。 + +总统:这是合理的决定。无论你的答案是什么,我们都会照此执行。 + +--- + +## 场景二:签约、拒绝彩蛋与镜的初次说明 + +**场景目的**:让玩家亲手面对“接受/拒绝”,但不把拒绝写成羞辱或失败;正式路线中,镜在签约后出现,用直接语言说明它能做什么、不能做什么。 + +**样例对话** + +数日后,曦回到同一间房。窗外仍是科研都市,只是傍晚换成了晴朗的上午。她已经看完了资料,也在家里同父母谈过两次;第一次谈到很晚,谁都没能给出结论,第二次则只是一起吃了一顿饭。桌上放着一份简短的确认文本,没有誓词、没有赞颂、没有“为文明献身”之类的措辞。它只写明:曦自愿接受跨界旅行;她知道每个世界结束前必须献上自己真诚认为最珍贵的事物;她知道契约不可撤回,任务完成与能否返航均无保证。 + +徐允雅:确认前,我需要再次逐项提问。你可以在任何一个问题后停止。 + +曦:好。 + +徐允雅:你是否理解,政府、研究团队与总统都无法解释献祭的具体形式、目标、代价及后果? + +曦:理解。 + +徐允雅:你是否理解,签约之后不可撤回;神允许十至十五周准备期,但准备期结束后你必须离开? + +曦:理解。 + +徐允雅:你是否理解,拒绝不会给你、你的父母或任何与你有关的人带来处罚、调查或公开评价? + +曦:理解。 + +徐允雅:你是否愿意签约? + +这里是玩家第一次选择的位置。若玩家选择“拒绝”,进入下列不保存彩蛋。这里的语气不应把拒绝处理成怯懦、失败或玩家做错了选择。 + +> **拒绝彩蛋样例** + +曦把手从确认文本上收回来。她没有立刻解释,只是望了一会儿桌上那杯已经凉掉的饮料。总统没有露出失望,徐允雅也没有急着用新数据挽留她,只是点头,将文本收回。 + +曦:我很抱歉。 + +总统:你不需要道歉。 + +曦:我知道这对所有人都很重要。我也知道你们没有骗我。可是我做不到。我不能因为不想让大家失望,就假装自己愿意去一个连代价都不知道的地方。 + +徐允雅:这就是诚实的回答。我们会按约定封存你的身份。没有人能把文明没有得到的答案算在你身上。 + +总统:文明不会因为少了一个人就失去尊严。相反,如果我们把你推上去,我们得到的也不会是一个值得追求的未来。 + +曦:你们还会继续研究吗? + +研究代表:会。我们会慢一些,也会遇到更多我们做不到的事。但“继续”本来就是我们的工作,不该成为你替我们承担的惩罚。 + +曦站起身,隔着透明墙看见一列学生列车从远处驶过。那条没有选择的路也许会让她在很久以后感到遗憾,可她此刻并不需要被任何人判定。画面淡出,显示:**“有些旅程不会开始。选择不开始,也仍然属于你。”** 随后返回标题或选择前,不写入存档。 + +> **正式路线样例** + +曦把手掌放到确认文本上。文本没有发光,也没有出现复杂的符号;她只需要用自己的声音念出已读内容。念到最后一句时,她停了很久,才补上一句不在文本里的话。 + +曦:我不知道自己会不会害怕到想逃跑,也不知道我会不会后悔。但我知道,如果我只因为害怕未知就拒绝,以后看见父母、看见这座城市、看见还在研究的人,我会一直问自己:当时我明明有选择,为什么没有认真走过去看一看。 + +总统没有露出如释重负的神情,只郑重地点头。 + +总统:我们接受你的决定。也请你记住,它不是你欠文明的债。 + +曦按下确认。 + +最先变化的是桌面的反光。平整的桌面像被无数极薄的镜片安静切开,每一片都映出不同角度的房间:曦的侧脸、窗外的城市、研究代表攥紧又松开的手。有几片却映着并不存在的走廊与星光。镜片没有碰撞声,只在空气中无声重组,最后形成一个悬在半空的几何复合体。半透明镜面内部,光点与线条像缓慢卷动的风暴。 + +研究代表下意识站起身。总统没有退后,只抬头看着它。 + +镜:契约确认。履约窗口开始计算。 + +它的声音没有刻意压低,也没有制造威严;每个字都平稳、清晰,像在陈述一项已经完成的事实。 + +曦:你就是镜。 + +镜:是。按照你们的语言习惯,可以这样称呼我。 + +曦:你看起来不像人。 + +镜:这不是人类形态,而是足以被你们感官识别的投影。若以更贴近自身的状态出现,这个房间无法容纳,你们也无法通过视觉确认我的位置。 + +曦:是你让我去的吗? + +镜:不是。提出交易的是神。我负责陪同、转达神对履约结果的确认,并在你无法继续履约时提供有限保护。我不拥有替神解释未知条款或替你判断祭品的权限。 + +曦:有限保护是什么意思? + +镜:当你的生命受到实质威胁,或你因外力完全失去继续履约的能力时,我会介入。例如有人试图杀死你、永久拘禁你,或环境将在你没有选择余地时造成致命伤害。我不会替你消除争执,也不会为了让旅程轻松而改变当地人的选择。 + +曦:所以我也不是完全不会死。 + +镜:风险仍然存在。我的职责是防止你因强制与意外失去选择,不是把所有后果从你的路径上移开。 + +曦:你能看见未来吗? + +镜:在这段准备期内,我能观测这个文明的时间线,但不会向你或其他人透露它。进入指定世界的瞬间,我会获得该世界在你从未抵达时的基线观测;随后神将限制我的相关能力。我不能在当地为你调用那份观测,也不能以它替你行动。 + +曦:那献祭完成以后呢? + +镜:届时我将按神允许的范围恢复观测,并转告能够转告的结果。现在不对尚未发生的情形作保证。 + +曦:听起来你很擅长说“我不能”。 + +镜:因为在契约里,把不能做到的事说成可以做到,比沉默更会误导你。 + +曦看着不断重组的镜面,像在判断眼前的存在究竟只是一个冰冷的任务装置,还是某种更难以定义的东西。 + +曦:好吧,至少这一点我同意。但接下来十几周,我会去看家人、旅行、也可能什么都不想做。你别把每一分钟都算成任务。 + +镜:准备期由你支配。只要不妨碍履约窗口结束时的出发,我不会干涉。 + +曦:那就先这样。我们彼此都别假装对对方很熟。 + +镜:合理。 + +研究代表看了一眼确认文本已经归档的状态,随即关掉桌面的记录界面。方才还像一场程序性会谈的房间,忽然显出一种奇怪的空白:他们已经完成了文明层面最重要的一步,却没有任何庆祝可以立刻填满它。 + +总统:关于公开说明,你可以决定今天、明天,或者再晚一些。只要履约窗口已经开始,公众终究需要知道发生了什么;但他们不应当在你还没来得及和父母好好说话的时候先从新闻里认识你。 + +曦:明天吧。今晚我想先回家。 + +徐允雅:明天的会场不会安排献花、送行或集体宣誓。你可以只听,不必回答任何一个让你不舒服的问题。若你临时改变主意,我们会直接结束活动。 + +曦:那有人会觉得我很冷淡。 + +徐允雅:那是他们需要自行处理的感受。你不欠所有人一场令人满意的告别。 + +镜:履约窗口剩余十二周又四日。该时长包含你要求的母星行程、星际通勤与出发准备。若你需要精确日程,我可以提供交通与安全限制;除此之外,不替你分配时间。 + +曦:十二周听起来很长。 + +镜:相对于你们的生命长度,较短;相对于一次跨星系旅行,足够。 + +曦:你果然会这样回答。 + +镜:时间长度没有固定的正确感受。你问的是事实,我给出的是比较。 + +曦把确认文本的副本收进随身包,没有再看那团悬在房间中央的镜面。她知道它已经会陪着自己走过接下来的日子,却也清楚那并不表示它会变成能够替她害怕、替她想念父母的朋友。至少此刻,它只是神的陪同者;而她要先回到自己的生活里,把这件不可撤回的事告诉最应该先知道的人。 + +走到门边时,曦又回头看了镜一眼。 + +曦:你会一直这样悬在我旁边吗? + +镜:在你们的公共环境中,我会维持可识别的投影。若你需要独处,可以明确提出;我仍会保留必要的安全观测距离。 + +曦:那就别跟进我家餐桌。 + +镜:我不会占用餐桌。 + +研究代表忍不住笑了一下,曦也终于笑了。镜没有解释这句话是否构成玩笑,只平静地让出门口的路径。 + +--- + +## 场景三:公开真相与履约窗口开始 + +**场景目的**:让公众知晓全部已知事实,同时证明文明不会把敬意变成绑架。镜首次以公开身份出现,曦开始感到“英雄”称呼带来的距离。 + +**样例对话** + +公开说明会没有被安排在巨大的竞技场,也没有使用会让人只能仰望讲台的高台。会场设在泽尼斯的公共议事厅,中央只有一个圆形平台,曦、总统、徐允雅和镜站在同一水平面上。来自不同世界的居民通过实时传输观看,现场也有普通市民、学生、研究人员和媒体代表。 + +说明会开始前,曦能听见人群压低的交谈声。有人在看她,有人在看镜,还有人反复确认屏幕上的合同摘要。她忽然意识到,过去几天里她还只是父母的女儿、学校里的学生、偶尔会因为作业拖延而被老师提醒的人。现在,所有人都知道她将离开,而且很可能不再回来。 + +总统:今天公开的信息,关系到每一位公民,也关系到一位公民的个人决定。我们没有权利只宣布结果,而不说明代价;更没有权利用“为了大家”替任何人省略她有权说出的犹豫。 + +总统将交易内容、候选人唯一性、不可撤回性与可能无法返回逐项说明。他同样说明,文明不知道献祭会以何种形式发生、不知道目标世界是什么样,也不知道任务完成之后会怎样;没有人把“献祭”说成净化、拯救或必然光荣的事。讲到可能无法返回时,厅内安静得能听见远处设备换气的声音。 + +总统:曦已经在审阅所有已知信息、接受独立确认后自由签约。已知不等于完整;我们承认她进入的是一份仍带有未知的契约。契约不可撤回,这是她明确理解过的事实。但请各位记住:她的决定不是债务。我们不能因为感谢她,就要求她表现得永远坚定、永远无所畏惧、永远像一个适合被写进纪念碑的人。 + +一名没有署名的记者起身。对方没有追问曦的私事,而是先向徐允雅提问。 + +记者:公众现在知道全部已知内容。接下来十到十五周的告别与准备期,政府会如何确保舆论不会反过来影响她? + +徐允雅:第一,曦的私人通信、行程选择和家庭空间不属于公共讨论材料。第二,任何组织都不得以“送别”“支持”或“感谢”为名,要求她参加活动、发表言论或承担宣传义务。第三,她可以自行决定哪些公开场合愿意参加,哪些不愿意。她已经签约,但她仍然是一个拥有日常生活的人。 + +记者:如果有人表达希望她留下呢? + +徐允雅:表达不舍是人的权利,把不舍变成压力不是。 + +镜始终悬在平台一侧。它没有刻意放大形态,但无数镜面在空气里安静重组,仍让所有人无法完全忽视它。记者转向它。 + +记者:镜,你会把曦带去哪里? + +镜:我不能在出发前提供目标世界的具体信息。我尚未进入它们,也不对尚未形成的观察作猜测。现在给出描述只会制造错误预期。 + +记者:你会保证她的安全? + +镜:当她受到非自愿的致命威胁,或因外力完全失去履约能力时,我会介入。除此之外,我不承诺不存在风险的旅程,也不替她承担必须由她本人作出的判断。 + +曦听见这句话时,侧头看了镜一眼。 + +曦:它的意思是,它会在我快要死的时候拉我一把,但不会帮我写作业,也不会替我和别人道歉。 + +会场里出现一阵很轻的笑声,紧绷的空气松开了一点。镜没有立刻回应,像是在判断这句话是否应该被归类为“准确翻译”。 + +镜:这是一种不严谨,但接近事实的概括。 + +一名坐在前排的年长居民站起来。对方没有带着组织徽章,也没有准备长篇发言,只是把手放在胸前。 + +居民:曦,我不认识你,也不知道如果是我坐在这里会不会有勇气做同样的决定。我不想代表所有人说话,只想说,谢谢你愿意认真考虑这件事。以后如果你想休息、想回家、想当一个普通学生,也不需要向我们解释。 + +曦一时没有回答。她看到对方身后有人点头,也有人悄悄擦掉眼泪,但没有人喊口号。她原本担心这场公开说明会像一次把自己推到高处的仪式,现在却更像一群人共同承认:他们没有资格把她抬成不会害怕的人。 + +曦:谢谢。我也不想被叫成什么特别厉害的名字。至少在出发前,我还想回家吃饭,去坐我平时坐的列车,和父母说一些他们大概已经听过很多次的话。 + +总统:这正是你应该拥有的时间。 + +镜:根据履约窗口,前往母星的旅行安排可以从你准备好时开始。你原本提出过一个愿望:在离开前,亲眼游览文明的母星。 + +曦:我以前只在资料里看过它。小时候还以为每个人都会去一次。 + +总统:很多人一辈子都没有机会。母星保存得太多,也离大多数职能星球太远。现在它会向你开放,但行程由你决定。 + +曦:不是“为我开放”。那里本来就属于所有人。 + +总统微微一笑。 + +总统:你说得对。那就请你像一位普通游客一样去看它。只是这一次,你身边会多一位不太懂得做游客的陪同者。 + +镜:准备期由曦支配。只要不影响窗口结束时出发,她不需要向我解释行程价值。 + +曦:那先从不要把每个景点都当成任务检查点开始。 + +镜:这不是契约要求,我不会把它列为检查项。 + +曦叹了口气,却忍不住笑了。说明会结束后,公众仍然会谈论她、会祝福她、会担心她。但在这一刻,她至少重新找回了一点属于自己的说话方式。 + +主持人原本宣布说明会到此结束,议事厅后排却有一名学生举起手。工作人员先征询曦的意见;她点头后,对方才把话筒递过去。那名学生看上去和曦年纪差不多,校服袖口还留着实验课没擦干净的标记。 + +学生:我不是想问任务细节。我只是想知道……如果以后有人说你是英雄,你会不会觉得很难受? + +曦愣了一下。这个问题没有尖锐到需要防备,却比关于契约的许多提问更难回答。 + +曦:会有一点。我知道大家是好意,但“英雄”听起来像一个什么都不怕、什么都不会做错的人。可我现在还是会怕,也不知道以后会变成什么样。 + +学生:那我们应该怎么说? + +曦想了想。 + +曦:你可以叫我曦。要是你想祝我顺利,也可以说。只是别因为我签了契约,就觉得我从此不需要当一个普通人。 + +议事厅里没有出现整齐的回应。有人点头,有人低下头写下这句话,也有人只是安静地把手放回膝盖上。总统没有趁机把这段话变成口号;他示意主持人记录到公民权益公告里,随后补充了一条实际措施。 + +总统:从今天起,所有官方页面都不得使用“唯一希望”“必须成功”“文明托付”等称谓。相关送别活动必须由曦主动提出参加,任何机构不得将她的影像、私信或私人行程转用于宣传。我们感谢她的选择,也必须让感谢有边界。 + +镜:该限制不会影响履约。 + +曦:我知道。不过听见有人把它写下来,还是会轻松一点。 + +镜没有顺着这句话评价轻松的意义,只将目光般的镜面转向公共公告。对它而言,这是一项与契约无关的制度安排;但它没有质疑,也没有把它归类为无效的装饰。 + +会后,议事厅没有立刻清空。工作人员把原本用于提问的公共屏幕切换成留言区,并再次说明:所有留言都会经过曦的个人筛选,任何人都可以选择不留下姓名。屏幕上慢慢出现的不是整齐的口号,而是普通得近乎琐碎的话。 + +“我女儿问我,你会不会害怕。我说当然会。” + +“我在地下都市做夜班维护,祝你见到许多好风景。” + +“如果你回来,欢迎来我开的旧书店坐坐;如果你不回来,书店也会好好开着。” + +曦没有把每一句都读完。她只是站在屏幕前看了一会儿,然后转向徐允雅。 + +曦:这些可以不回复吗? + +徐允雅:可以。感谢不是一份必须逐条结清的账单。 + +曦:那就好。我怕自己以后回忆起今天,只记得很多人看着我。 + +徐允雅:那就只记住你愿意记住的部分。公众有权知道契约,曦有权决定哪些目光能进入你的生活。 + +镜看着屏幕上不断增加的短句,没有替其中任何一条判断轻重。曦走出议事厅时,听见身后有人轻轻鼓掌。掌声没有持续很久,也没有逼她回头致意,像是一群人把话说完之后,选择给她留出安静离开的路。 + +--- + +## 场景四:科研居住星的旧日生活与父母告别 + +**场景目的**:在宏大任务之后回到平凡家庭。父母没有冲突或秘密;情绪来自他们彼此尊重、却仍要面对分别。以下地点“居住区—公共列车—家庭晚餐”均为可替换探索方案。 + +**样例对话** + +公开说明会结束后的第三天,曦回到了自己居住的科研世界泽尼斯。这里没有阿斯特里亚那些保存完好的古老建筑,也没有供游客停留很久的纪念广场。城市的大部分空间围绕研究、制造、维护和居住展开,建筑外侧布满用于调节光照和温度的结构层,远远看去像整齐延伸的银灰色树枝。对当地居民来说,这些并不壮观,它们只是每天上学、上班、回家的背景。 + +曦没有要求特别的欢迎,也没有乘坐专门的车辆。她和镜站在公共列车站台上,等一辆和往常一样准时抵达的列车。镜的形态在站台灯光下映出许多细碎的反光,附近有人会忍不住多看几眼,但大家只是礼貌地点头,没有围过来。 + +曦:我以前总觉得这里很无聊。 + +镜:你在这里长大,却把它当作背景。 + +曦:因为每次抬头看到的都是实验楼、设备塔、运输线。朋友去母星旅游,回来会给我看旧街区和海底游览区的照片。我只能给他们看学校附近那台又换了一次外壳的能源调节器。 + +镜:它持续运作,因此你们不再注意它。稳定会让承担稳定的人和物退到视野之外。 + +曦:你看,这就是为什么我说你不懂游客。 + +镜:你说它无聊,不是在否定它的价值。你只是直到离开前,才意识到自己把可靠当成了理所当然。 + +曦:因为我知道它们一直都在。人很容易把一直都在的东西当成理所当然。 + +列车驶入站台,车门打开。曦走进去,坐到靠窗的位置。窗外的科研设施向后滑去,偶尔能看见穿着不同颜色工作服的人从连廊里走过。她指着远处一片不太起眼的住宅区。 + +曦:我家在那边。以前放学晚了,我会从那条连廊跑回去。因为我妈总觉得晚饭凉了不好吃,我爸又会假装说“她自己知道时间”,然后把菜一直放在保温箱里。 + +镜:他们知道你可能无法返回。 + +曦:知道。 + +镜:他们没有试图要求你撤回。这使签约仍可被视为你的决定。 + +曦:不是“允许”。他们不能替我决定。我也不想让他们替我决定。 + +镜:但你希望他们不同意吗? + +曦望着窗外,过了很久才回答。 + +曦:有一点。不是因为我真的想反悔。我只是……如果他们很生气,或者坚决让我留下,我也许就能有一个借口说“不是我不想去,是他们不让”。那样好像会轻松一点。 + +镜:因为那样一来,选择的责任可以被转移给他们。 + +曦:对。很不成熟,对吧? + +镜:这是常见的回避方式,不构成对你选择本身的否定。 + +曦:可他们没有这么做。 + +镜:他们没有这么做,说明他们接受你是独立的签约者。 + +曦:也因此我知道他们真的尊重我。 + +傍晚,父母已经在家。餐桌上没有为镜准备特别的器皿,母亲只是把空出来的一把椅子向旁边挪了挪,像是默认这个由镜片组成的高维生物也需要一个“位置”。父亲端出最后一道菜时,先看了一眼镜,又看了看曦。 + +父亲:它吃东西吗? + +镜:不需要。 + +母亲:那就少洗一个碗。你看,至少有一点方便。 + +曦笑了出来。她知道母亲是在努力让气氛不要停在“离别”两个字上。 + +父亲:今天列车上有人打扰你吗? + +曦:没有。大家都很客气。 + +母亲:太客气有时候也会让人累。你要是不想见谁,就说不见。别因为别人说“大家都支持你”,你就觉得自己必须一直笑。 + +曦:我知道。 + +父亲把盛好的饭放到她面前,没有说“多吃一点”这种平常会说的话,只是坐下。 + +父亲:我们把你的旅行清单看了一遍。衣物、常用药、旧设备的接口转换件……有些东西我不确定你能不能带过去。 + +镜:跨界过程中,来源世界的普通物品可以随行。它们不会影响契约。 + +母亲:那就好。她有一盒从小收着的照片,我想让她带上。 + +曦:妈,那些都是电子备份。 + +母亲:我知道。但这盒是你自己放进去的,不是系统替你整理的。里面有你小时候画得很难看的星图,还有你第一次把家里的清洁机器人拆开以后写的检讨。 + +曦:那不是检讨,是技术报告。 + +父亲:报告第一页写着“我保证下次会先问过大人”。这在文体上更接近检讨。 + +镜:我可以确认,那句话确实包含对未来行为的约束。 + +曦:你不要加入他们。 + +母亲笑着笑着,忽然安静下来。她伸手摸了摸曦的头发,又像怕自己这个动作太像挽留,很快收回手。 + +母亲:我们不会说“别去”。因为你已经想了很久,也不是为了讨好谁才答应。可你要记住,不管你去了多少地方,做了多少我们听不懂的事,你都不是只属于这个任务的人。 + +父亲:如果以后你见到很难决定的事,也不用因为大家把你当成英雄,就觉得你不能害怕。害怕就承认害怕,想一想,再决定。你小时候遇到不会修的东西,第一反应也是把它抱回家研究,不是直接把它砸掉。 + +曦低头扒了一口饭,眼泪差点掉进碗里。她没有哭出来,只是用力吸了口气。 + +曦:我会记得。 + +镜在一旁安静了很久,才开口。 + +镜:你们没有要求她承诺成功。 + +父亲:因为她没法保证。 + +母亲:也因为她不是设备。设备坏了可以换,方案不行可以重做。她是我们的孩子。 + +镜:记录:你们将“她完成任务的可能”与“她作为家人的位置”视作不能互相替代的两件事。 + +父亲:不是记录。是一起放着。她去做重要的事,和她还是我们的女儿,并不冲突。 + +窗外的城市渐渐亮起夜间照明。明天,曦会和镜离开这颗她曾嫌弃单调的星球,前往从未去过的文明母星。可这一晚没有人急着谈论宏大的未来。他们只是把饭吃完,把旅行清单改了又改,然后像过去许多普通夜晚一样,一起收拾餐桌。 + +饭后,父亲把旧工具箱搬到客厅地毯上。那里面没有什么真正适合跨界旅行的装备:一支用久了的多功能探针、一卷已经过时的绝缘贴、一枚曦从小学起就拿来拆装家用装置的小螺丝盒。她看见父亲把工具一件件放出来,又一件件收回去,终于忍不住坐到旁边。 + +曦:这些应该带不了吧。 + +父亲:大多数带了也没用。我知道。 + +曦:那你还整理。 + +父亲:因为我想确认,自己有没有漏掉什么能替你准备的东西。 + +曦没有笑他。她接过那支探针,按下开关,探针顶端亮起一小点稳定的白光。那是她十二岁时修坏了一台练习用巡检球后,父亲送她的第一件小工具;当时她嫌它太旧,如今却比任何新设备都顺手。 + +曦:这个我带着。未必有用,但它不占地方。 + +母亲从厨房端来三杯热饮,把其中一杯放在镜旁边。她知道镜不会喝,还是照旧留了位置。 + +母亲:我们以前总觉得,等她成年以后,她会去远一点的地方读书、工作,再慢慢学会不总回家。没想到“远一点”会是这种程度。 + +曦:我也没想到。 + +母亲:所以我不能装作自己一点也不想拦住你。可我不想用“我舍不得”把你困在这里。舍不得是我的事,不是你必须替我解决的事。 + +镜:该区分符合事实。 + +母亲看了它一眼,轻轻点头。 + +母亲:那就请你在她真的无法自己作选择时帮她。别因为她会害怕,就以为她不能选择。 + +镜:我会按契约边界行动。 + +父亲把工具箱扣好,声音很轻。 + +父亲:听上去不温柔,但至少是明确的。 + +曦把探针收进随身包最内侧。她没有说自己一定会回来,也没有逼父母说“我们等你”。这一晚结束时,他们只是约好:明天出发前仍按平常时间吃早饭;谁先起床,就先把灯打开。 + +第二天清晨,母亲果然先起床。厨房里传来熟悉的加热声,父亲比闹钟早了十分钟坐到餐桌旁,假装在看一份早已看完的维护简报。曦推门出来时,谁也没有把这顿饭办成仪式。母亲问她要不要多加一点酱,父亲提醒她港口附近的轨道最近在维护,镜则站在窗边报告天气和出行时段。 + +曦:你连天气也要报告? + +镜:这会影响你们的出行时间。 + +父亲:那就谢谢。至少这件事很实用。 + +曦笑了。她端起杯子,记住这盏被先打开的灯、普通得不能再普通的早餐,以及家人为了不让她难过而继续谈论轨道维护的方式。之后他们才一起出门,走向星际港。 + +--- + +## 场景五:前往母星,第一次看见文明的起源 + +**场景目的**:明确“居住星”与“母星”的情感差异。曦离开真正生活过的地方,来到从未见过、却承载文明共同历史的起源地;镜首次正面理解保存并非只是资料管理。 + +**样例对话** + +离开居住星那天,没有额外的仪仗,也没有再次举行公开送别。曦和父母在星际港入口拥抱过后,便和其他旅客一样进入安检通道。父亲把那盒照片递给她,母亲最后检查了一遍她的随身包。两个人都没有把“路上小心”说得像命令,只是反复确认她有没有把自己想带的东西带齐。 + +列车离站时,父母站在透明隔离墙后面。曦隔着玻璃朝他们挥手,直到站台被转弯的轨道挡住。她没有看见母亲是不是哭了,也没有回头去确认。她知道如果自己再多停留一秒,可能就会开始怀疑那份已经不能撤回的签约是不是太快了。 + +镜悬在她旁边,没有安慰,也没有催促。等列车脱离城市上空的轨道,科研居住星逐渐缩成一片被人工光带切开的大陆,它才开口。 + +镜:你离开站台时没有回头。 + +曦:不能中止。 + +镜:我没有询问契约状态。你只是选择不保留最后一幅影像。 + +曦靠在座椅上,看着窗外的星空。星际交通航道在远处像一层极细的网,偶尔有运输船从另一条路径掠过,留下短暂的尾光。 + +曦:我不想中止。我只是有点讨厌自己刚才没有回头。 + +镜:回头不会改变离开,但会改变你之后调用哪一段记忆。 + +曦:可是我能多看他们一眼。 + +镜:你认为那幅影像值得让离别更难一点。 + +曦:不一定。但人有时候不是为了改变结果才做一件事。你以后会明白的。 + +镜:你们常把无法立刻传递的经验,交给时间本身来证明。 + +曦:因为很多事真的要等经历过才明白。 + +镜没有接话。它的镜面仍按原有节律重组,像这段谈话没有改变任何既定的运动。 + +曦:那你知道母星是什么样吗? + +镜:我知道它的地质组成、城市覆盖率、居民数量、历史设施保存目录和主要旅游路线。它们足以让我抵达任何地点,不构成对你会记住什么的预测。 + +曦:完全不够。 + +镜:你将“地点是否真实”与一组无法由目录充分描述的个人经验关联。 + +曦:我不知道。也许是站在那里的感觉。比如我小时候看母星的影像,总觉得那里应该很庄严,所有人走路都会很慢,说话也会很小声,怕吵到历史。后来有同学去过,回来后说那边的街边甜品比我们这里好吃,纪念碑旁边还有会把游客帽子叼走的清洁鸟。 + +镜:一件微小、不可预先写进资料的事,会让你相信自己抵达的不是被整理好的展品。 + +曦:对啊,可是这才像真实的地方。它不是教材里的封面。 + +数小时后,列车与星际航线的主干接驳。窗外的光开始变化,母星所在的恒星系出现在导航屏幕边缘。曦没有急着靠近窗户,而是先给父母发送了简短的到站预报。过了一会儿,母亲回复她:**“看到母星以后别急着拍给我们,先自己看。”** + +她读了两遍,才站起身。 + +母星没有像宣传资料那样突然占满所有视野。它最先只是远处一颗带着云层和夜光的蓝白色星球,随后在不断靠近的航程里显出大陆边缘、环形海域、轨道设施和悬浮在近地轨道上的城市群。地表大部分区域被人造城市覆盖,但并不显得拥挤。不同年代的建筑保留在各自的区域里,新建结构从旧城区上方或下方绕开,像一座城市主动给自己的过去让出位置。 + +曦:原来它真的没有把旧东西都拆掉。 + +镜:你们刻意让过去占据现在的空间,哪怕它会妨碍一座更整齐的城市。 + +曦:你是在确认,我们是不是把过去当成了可以随时清掉的装饰。 + +镜:我没有否定它。我在确认你们愿意为过去付出的是不是一种真实的让步。 + +曦:我也在陈述事实。大家不是没有能力建得更整齐,只是不想把以前的人生活过的地方全部换成更方便的版本。你看那边,那些楼已经很旧了,可是旁边的新交通线绕开了它们。 + +镜:保存遗迹可以服务于身份、商品或权力。你主张的则是:现在的人不应假装自己与过去没有关系。 + +曦:这里当然也会卖纪念品,也会有游客。可是保存不是为了假装过去比现在好。是为了让人知道,我们现在拥有的东西不是凭空掉下来的。 + +镜:数据库保存事实;意义由后来者自行建立。 + +曦:数据库会告诉我地下都市用了多少年建成,却不会告诉我站在旧墙前面的时候,人为什么会想起那些没有留下名字的人。你总说我们只能看见很短的一段时间,可我们也会想办法让短时间留下痕迹。 + +列车进入母星轨道港。广播提醒旅客准备下车,周围的人群开始收拾物品。有人认出了曦,但只是在经过时向她点头,没有拿出设备拍摄,也没有围住镜追问。港口的引导屏上显示着一行简洁的欢迎语:**“欢迎回到起源之地。请按自己的步伐参观。”** + +曦看着那句话,轻轻笑了一下。 + +曦:我以前觉得“母星”只是所有资料里反复出现的一个词。现在才发现,它真的会让人有一点想叫它“家”。 + +镜:你没有在这里生活过,却仍把它称作家。这种归属不是由个人经历单独构成。 + +曦:家不一定只有一个。居住星是我长大的地方,那里有我爸妈、有我每天走的路。这里是让那些路存在的地方。两种感觉不一样。 + +镜:居住星与你的关系由具体生活构成;母星与你的关系则由共同来处构成。两者并不互相替代。 + +曦:这次别只记录。你先陪我去当游客。 + +镜:第一站由你决定。 + +曦抬头看向港口外延伸的透明通道。远处,城市和海洋在晨光里同时发亮。 + +曦:先去海底。既然都来到母星了,我想从最不像城市的地方开始看。 + +镜:你的父母刚刚发来信息。他们没有问你是否表现得勇敢,只问你是否安全抵达。 + +曦:我回过了。等我到了第一个景点,再拍一张照片给他们。 + +镜:他们无法替你看见这些内容,却仍希望知道你正在认真地看。 + +曦:我知道。但我把照片发回去,不是为了假装他们也来过。是想让他们知道,我正在认真看。 + +镜:你先以自身经历它,再选择与他们分享。这是两个不同动作。 + +曦:不矛盾。先让一件事成为自己的感受,再把它分享给在乎的人。要是从一开始就只想着怎么证明、怎么记录、怎么给别人看,最后可能反而什么都没看见。 + +母星管理处没有为她清空港口,也没有把普通旅客改道。曦和镜在公共换乘层等候海域线路,身边是一群刚结束研学的孩子、几个拖着行李箱的游客,以及一对正为路线争论的老人。有人认出她,又很快把目光移开;有人对镜投来敬畏的打量,却没有靠得太近。她原先以为自己签约之后,所有地方都会变成一场送别仪式。可在母星第一段普通的等候时间里,广播仍按时播报延误,孩子仍抱怨饿,售卖机仍提示某种饮料售罄。 + +曦:原来大家还是会排队。 + +镜:契约没有改变交通系统。 + +曦:我不是说这个。我是说……挺好的。世界没有因为我今天来到这里就暂停。 + +镜:你希望在被公共目光识别之后,仍能处于不以你为中心的秩序里。 + +曦:对。那样我才不会觉得自己一离开,所有人都站在原地等我。 + +镜:这颗星球的人口与活动不会因单一旅客停滞。该事实无需以安慰的方式表达。 + +曦:有时候事实本来就能让人安心。 + +海域线路的列车进站。车门打开时,曦最后回头看了一眼港口上方的阿斯特里亚地图,然后和其他乘客一起走进车厢。她没有占据专门的位置,只把随身包放在脚边。镜悬停在座椅旁,镜面里短暂映出阿斯特里亚的海岸线,随后列车向下方的蓝色区域驶去。 + +列车离开港口后,城市的轮廓被缓缓抛在身后。曦拿出终端,给父母发去第一张没有修饰的照片:透明通道尽头是一片尚未抵达的海。她想了很久,只写下“我到了”,然后把终端扣在掌心。不是每一次分享都需要配上一段足以说明心情的话;有些时刻,先让照片和等待本身停在那里就够了。 + +--- + +## 场景六:海底游览区与被照料的自然 + +**场景目的**:以人工生命与原始海洋的区别,讨论“安全、陪伴和美”是否也能构成真实价值。此处的深水保育员为临时角色定位,姓名与外观待定;其冲突是保护带会不会被旅游逻辑逐渐侵蚀,而非“自然是否值得保护”。 + +**样例对话** + +海底游览区位于大洋之心的边缘。进入海面以下后,城市的灯光被厚重的水层过滤成柔和的蓝色。玻璃隧道没有刻意做成巨大的展览橱窗,而是顺着礁体和水流缓慢延伸。外面有成群的银色小鱼绕着光柱转圈,远处的珊瑚像被阳光点燃的云。它们不躲避游客靠近,也不会因为人们在玻璃另一侧停留就惊慌散开。 + +曦把手贴在玻璃上。几条蓝色的鱼游过来,像是注意到了她手掌的位置,围着那片玻璃绕了一圈。 + +曦:它们真的会回应人。 + +深水保育员:会。它们有互动偏好,也有稳定的群体活动规律。游客停留时间太久时,它们还会主动把你引向别的观景区,免得所有人都堵在同一段隧道。 + +深水保育员:我们尽量不让它们变成单纯的装饰。它们会学习、会识别不同游客的动作,也会在自己的环境里建立稳定群体。不过这里不是原始海洋,这一点必须说清楚。真正的原始海域在更深、更远的地方,只对研究团队开放。那里有高压、捕食、病原和我们不允许普通游客接触的危险。 + +镜:你们把整片大洋称为原始生态,却在入口安排了人工生命。你们并未混淆二者,而是在区分“世界本身”与“人能够安全靠近的部分”。 + +保育员没有因为镜的直白而生气,只是把手里的导览屏调到一张分区图。 + +深水保育员:因为整片大洋之心保留了原始生态,游览区只是其中一个被严格隔离的入口。我们不想把危险伪装成不存在,也不想把所有人都推到危险里去证明它真实。这里展示的是人能与海洋相处的方式,不是海洋的全部。 + +镜:你们没有让游客面对完整的海,也没有因此宣称完整的海不存在。你们选择让大多数人先学会亲近,再由少数人承担深入的风险。 + +深水保育员:是。但很多孩子在这里第一次看见鱼群,第一次理解海不是一块蓝色的图标。有人后来会成为研究者,有人只是记得小时候和父母一起打开水下房间的门,被一群小鱼围住。两种记忆都不浪费。 + +曦看向隧道一侧的玻璃房间。工作人员正在帮一对祖孙检查轻型潜水服。门后是一片浅水区域,鱼群在水里慢慢移动,像是在等待新的访客。 + +曦:我们也能进去吗? + +深水保育员:当然。镜如果需要适配装备,我们可以—— + +镜:不需要。水的压力与成分不会妨碍我的投影。 + +曦:它的意思是它不需要潜水服,但它大概还是会挡路。 + +镜:我可以缩小投影范围。 + +换好装备后,曦踏进水里。这里的水温被控制得恰到好处,能感觉到流动,却不会让人发冷。第一群鱼从她身边穿过,尾鳍轻轻扫过她的手腕。她下意识想追,却又怕动作太大惊到它们。 + +曦:它们不怕我。 + +镜:它们被设计为信任你。你因此感到被接纳,但这种信任并非它们自己选择。 + +曦:这不代表它们的靠近没有意义。 + +镜:你珍视的是被它们回应的时刻,而不是证明它们拥有与你完全相同的意志。 + +曦:一部分来自。可是你看,它们会因为我伸手改变路线,也会互相跟着游。它们不是一段专门播放给我的影像。就算它们没有野外鱼类的危险和警觉,它们也确实在这里活着。 + +镜:你对“活着”的判定不只依据自主与存续,也依据持续的回应与关系。 + +曦:你们高维生物不会照顾什么东西吗? + +镜:不以“照料”这个概念组织关系。对我而言,生命的完整轨迹通常可被观测;是否介入取决于职责与条件,不取决于怜惜。 + +曦:那如果你看见一条鱼一开始就知道它会游到哪里、什么时候死,你还会觉得它游过来这一小段路很漂亮吗? + +镜没有马上回答。水面上方的光穿过它半透明的镜片,在海底投下一片不断变换的细碎亮斑。 + +镜:从完整时间线看,它的一生仍然极短。你却将其中一个短暂时刻视为足以被保留的经验。 + +曦:可我现在就在这里。它从我身边游过去,我会记得。对我来说,这就已经改变了。 + +深水保育员站在浅水区外,听见这句话后没有插入,只是把导览屏上的互动记录关掉,让这片水暂时不再显示任何统计信息。 + +深水保育员:我们以前也争论过,人工生命是不是“真正的自然”。后来有位很老的研究者说,问题可能不在于它够不够原始,而在于我们有没有认真对待它。我们给它们设计安全环境,也给它们留出不被游客打扰的时间。人不是只能在危险面前才学会尊重。 + +镜:你们没有把安全相遇标记为真实海洋的替代品,而是以它建立进入保护体系的理由。 + +曦:因为不是所有价值都要等到快失去的时候才承认。 + +镜:但你们仍把真正危险的海域与游客隔离。若目的是尊重,为何不让每个人亲自理解危险? + +深水保育员:理解不等于把别人推到无法承受的地方。真正的深海并不因为游客看不见它,就变得不真实;游客也不因为没有和捕食者共处,就不配喜欢海。研究人员承担风险,是因为他们接受过训练,也知道自己为什么去。普通人来这里,是为了认识海、喜欢海、愿意支持它被保护。两种关系不能互相取代。 + +保育员带他们离开浅水房间,沿一条只有工作人员能开启的侧廊走到观察窗前。窗外的水忽然暗了许多,导览灯被调低,玻璃另一边不再有会主动靠近人的鱼群,只有远处偶尔掠过的幽暗轮廓。侧廊尽头挂着一张更新申请:有人希望扩大游览区,把更深的水层也接入透明交通线。 + +曦:你不赞成? + +深水保育员:我赞成更多人看见海,但不赞成把“看见”解释成任何地方都该变成入口。每隔几年都会有人提出,既然技术能确保安全,为什么不再深入一点;再过几年,就会有人觉得原来那条边界只是管理者不够开放。可一旦所有地方都被灯光、路线和互动模型覆盖,人们很容易以为海只是一种等待被安排好的体验。 + +镜:你保护的不是水域本身,而是来访者面对它时仍须承认存在边界。 + +深水保育员停住脚步。它没有把这句话当作赞美,只看了镜一眼。 + +深水保育员:是。保护带需要设备、预算和法律,但如果所有人都只问“为什么不能进去”,它迟早会被改写成一片暂时还没开发完的空地。我希望孩子在安全区里喜欢海,也希望他们知道,喜欢不等于拥有全部。 + +曦:那你会怎么处理那份申请? + +深水保育员:照流程评估。不是只写一个“不”。我会拿出风险、生态与教育收益的资料,也会请提出申请的人自己走到这扇窗前看一会儿。让他们明白自己要求改变的是什么。 + +镜:你不担心这会降低通过效率。 + +深水保育员:我担心的是通过得太容易。某些决定一旦被当作理所当然,后来就很难有人记得它曾经拿走过什么。 + +曦:就像我不能因为要去陌生世界,就要求我爸妈也跟着一起去证明他们爱我。 + +镜:这两件事并不完全相同。 + +曦:我知道。但都是“不能把自己选择承担的风险,变成别人必须承担的风险”。 + +深水保育员看了看曦,没有追问她任务的细节,只是很轻地说了一句。 + +深水保育员:那你也要记得,愿意去很远的地方,不代表你必须把所有人的担心都带走。 + +她浮在水中,看着鱼群从身边散开,又在远处重新聚拢。镜仍然像一团不合时宜的几何体悬在水下,没有再为这片水下体验补充判断。 + +离开游览区时,曦在出口看见一面说明墙。上面没有夸张地宣称人类战胜了海洋,只写着一句很普通的话:**“愿每一位来访者在离开时,都愿意替看不见的深处保留一点位置。”** + +曦把这句话读给镜听。 + +镜:这不是可执行指令。 + +曦:我知道。 + +镜:它要求来访者在行动中预留未被直接看见的部分。 + +曦:这次说得还行。 + +--- + +## 场景七:地下都市与团结纪念碑 + +**场景目的**:避免把世界级工程写成资料讲解。通过一位与地下都市有个人关联的更新工程师,表现“团结”并非所有人相同,而是有人愿意为共同生活协调、让步和持续修补。其矛盾在于必要更新不能被叙述成毫无失去的替换。 + +**样例对话** + +地下都市的入口并不在荒凉的地表裂缝里,而是一座与普通交通枢纽相连的下行大厅。曦原本以为自己会看到厚重的金属门和巨大的工程标识,结果先看见的是一家开在换乘层旁的小书店、几名背着乐器盒的学生,以及一条缓缓向下延伸的公共步道。越往下,地表的自然光越淡,城市自己的光却越来越明亮。 + +步道尽头是一片广阔的地下穹顶。远处有人工天幕模拟着傍晚,住宅、学校、市场和公园沿着层层平台展开。支撑穹顶的结构柱并没有被完全隐藏,其中一部分保留了最初建造时的材料纹理,旁边设置着小小的说明牌,告诉人们这些部件已经服役多少年、修复过多少次。 + +曦:我小时候看资料,以为地下都市就是一大堆房子塞进地底。 + +镜:从外部看,它像被压入地层的居住单元;从内部看,它显然不是为了把人安置进去就结束。 + +曦:你今天要是再这样概括一次,我就把你留在这里让维护系统研究。 + +站在一旁检查结构显示屏的人抬头笑了。对方穿着没有任何仪式感的更新工程制服,袖口还沾着一点难以洗净的材料粉末。 + +地下更新工程师:如果你真把它留在这儿,我们会先问它有没有维修资格证。 + +曦:抱歉,我们只是路过。 + +地下更新工程师:路过最好。这里本来就不是只有纪念碑和讲解词的地方。你们要去中央穹顶? + +曦点头。工程师合上显示屏,表示自己正好也要往那个方向走。 + +地下更新工程师:我小时候住在这里,后来去别的星球学维护,绕了一圈又回来。很多游客问我,地下都市是不是统一之后最伟大的工程。我通常会说,它不是最伟大的,它只是最麻烦的。 + +曦:为什么? + +地下更新工程师:因为它不是从一块空地上建起来的。统一以前,各地的建筑标准、能源系统、生活习惯都不一样。有人要保留祖辈住过的旧城区,有人担心施工破坏地表遗产,有人觉得资源应该优先给地面,也有人觉得地下生活像把人塞进盒子里。全球同步开工用了上百年,不是因为机器不够快,是因为每一步都得让不同的人相信自己没有被丢下。 + +镜:若只追求工程完成,统一标准、淘汰旧制、集中分配资源确实更快。但那样建成的空间会要求所有人先放弃自己曾经怎样生活。 + +工程师:我们也讨论过。这样做会快很多。 + +镜:你们宁愿把工程拖长一百年,也不愿先让一部分人从共同体中被排除。 + +工程师:因为“快很多”不等于“大家愿意住进去”。城市不是把人装进去就完成了。有人希望出门就能看见天空,有人需要保存自己语言里的街道名称,有人不愿意让祖先的房子变成一张扫描图。我们花了很多时间争论,也做了很多看上去不划算的妥协。可最后这里不是某一群人替其他人造出来的空间,而是大家勉强学会一起住的地方。 + +他们来到团结纪念碑前。纪念碑没有高到压迫视线,主体是一座由不同年代、不同地区的建材拼合而成的环形结构。每一块材料旁都没有写“伟大人物”的名字,只记录它来自哪里、曾属于什么建筑、为什么被保留下来。 + +曦:没有总设计师的名字吗? + +工程师:有,但不在正面。总设计师本人坚持把名字放进资料库。他说要是所有人只能记住一个名字,那这座碑就和它纪念的事情相反了。 + +镜绕着纪念碑缓慢移动。镜面里反射出来自不同方向的行人、孩子、摊位和远处的住宅灯光。 + +镜:你们称其为团结,却不把分歧从叙述里删去。对许多文明而言,纪念碑只保留胜利者的答案。 + +工程师:当然有冲突。团结不是所有人想的一样。要是所有人想的一样,根本不需要花一百多年。 + +曦:那团结到底是什么? + +工程师想了一会儿,没有像在背资料那样回答。 + +地下更新工程师:大概是明明知道别人和你不一样,还是愿意在他需要住、需要走、需要记得的地方留一点空间。你看这些结构柱,隔几年就要修。修的时候也会有人抱怨“为什么当初不干脆换掉”。可换掉以后,很多人会觉得这里已经不是他们参与过的城市了。 + +曦看着一块来自很久以前的墙砖。它的边缘有磨损,旁边嵌着新材料,旧与新之间没有刻意做成无缝连接。 + +曦:你们没有把它修得像从来没坏过。 + +工程师:因为它确实坏过。我们不觉得承认修补很丢脸。 + +工程师抬手点开结构显示屏。屏幕上是一段即将进入更新期的交通环廊:新材料能使它再稳定运行数百年,代价是必须替换目前保留的旧内壁。那片内壁并不是什么著名遗产,只是早年居民在建设完工后留下过许多不完整的留言、涂鸦和小型标记;扫描可以完整保存文字与图像,但实物拆除后,那里将不再是人们每天经过时能碰到的墙。 + +工程师:我现在就在处理这个项目。技术方案没有争议,换掉更安全、更省维护资源。难的是有人会说,既然已经完整扫描了,为什么还要为一面旧墙多花这么多时间;也有人说,既然要保证安全,就不该拿记忆反对更新。两边都不是坏人。 + +曦:那你自己怎么选? + +工程师:我不负责替所有人选。我负责把“会失去什么”写清楚,别让报告只剩下吞吐量、寿命和预算。最后如果大家仍决定替换,我会把旧墙的一部分留在纪念碑资料区,也把居民关于它的意见一并保存。不是因为这样就等于没失去,而是因为失去过的东西不该被说成从来不重要。 + +镜:你并不反对替换。你反对将必要改变叙述为没有代价。 + +工程师:对。城市总会更新,我也靠更新工作生活。可要是每次都只说“新的一定更好”,过几代人以后,大家会以为这里一直就是现在这样。那不真实。 + +曦看着那面屏幕里并不壮观的旧墙。她想起父亲收起又拿出的工具箱,想起自己明知照片有备份,却仍把那支旧探针放进包里。被完整记录并不等于仍然存在;可完整记录也并非毫无价值。两件事可以同时成立。 + +镜:所有建筑最终都会再次成为过去。你们似乎并不追求让它永远不变,而是让每一次改变都记得曾有人在这里生活。 + +工程师:那就到时候再修,或者让后来的人决定怎么记住它。我们现在能做的,是把今天住在里面的人照顾好。 + +这句话没有激昂的语气,却让曦停了很久。她想到自己即将去往的世界,想到那些她还没见过的人可能会拥有完全不同的生活。她不知道自己未来会不会理解他们,但至少现在她开始明白:所谓珍贵,可能不是一个能被统计出来的总量,而是许多人愿意为彼此留下的细小位置。 + +离开前,工程师递给曦一枚很普通的纪念章。它不是官方赠礼,只是用淘汰结构材料做成的小物件。 + +地下更新工程师:别把它当什么护身符。只是我们这里的习惯,游客第一次来可以带走一块修补过的材料。提醒自己,新的东西不一定要把旧的全盖掉。 + +曦接过纪念章。 + +曦:谢谢。我会带着它。 + +镜:它不会改变你的履约能力。你仍然决定带走它,是因为它替你保留了今天的一段关系。 + +曦:它对我有。 + +镜没有再评价,只把那枚纪念章在自己的镜面里短暂映出,像是认真看了一眼。 + +他们走回上行通道时,曦把纪念章放进随身包最里面的一层。她没有把它挂在外面,也没有拍照发到公共频道。 + +镜:你不打算把这份关系交给公众确认。 + +曦:不是所有收到的东西都要证明给别人看。它是那位维护者给我的,不是给“签了契约的曦”的。 + +镜:你在保护“曦”与“契约执行者”之间不被完全重合的部分。 + +曦:当然要分。我要是走到哪里都只剩下“那个要去很多世界的人”,那我以后做选择的时候,大概会忘记自己原来是什么样。 + +镜:你并不拒绝改变。你担心的是改变之后,连自己为何开始出发都记不清。 + +曦:会改变,这是肯定的。我只是希望它不要把别的部分全擦掉。 + +镜没有说“任务不会改变你”这种自己无法保证的话。它只是将这句话纳入旅行记录。 + +--- + +## 场景八:大图书馆与明矾石 + +**场景目的**:介绍自愿记忆上传与 Alunite 的工作方式;将“历史留下痕迹”推进到“人格能否被保存”的层次。Alunite 的担忧是个人问题,不作为母星段落需要解决的社会危机。 + +**样例对话** + +大图书馆的外观并不像一座要人屏住呼吸才能进入的纪念建筑。它很大,却没有把入口抬得很高。来访者可以从不同高度的步道进入,孩子们从一侧的学习区跑向资料展厅,研究人员在另一侧安静地讨论。建筑内部的光线随着阅读区域而变化:纸质文献区偏暖,数据档案区偏冷,记忆聆听区则保持近乎家庭客厅般的柔和亮度。 + +曦刚走进中央大厅,就看见一个人朝她走来。对方外表接近普通人类,步伐稳定,神情亲切,衣着没有夸张的装饰。只有在转身时,曦才发现它的动作有一种过于准确的平衡感,像每一个角度都经过恰当计算。 + +Alunite:欢迎来到大图书馆。曦,镜。我是 Alunite,今天由我负责陪同。 + +曦:你知道我们会来? + +Alunite:你们的参观申请是公开流程的一部分,预约信息在两小时前抵达。除此之外,我不会读取不属于导览需要的个人资料。 + +镜:你知道她的契约。 + +Alunite:知道。全体公民都知道。但在图书馆里,我更愿意把她当作第一次来到母星的访客。若她希望谈论任务,我会听;若她只想看书,我也可以为她找一张安静的桌子。 + +曦:那我先当游客。这里比我想的还大。 + +Alunite:它确实很大,但它不是为了让人感到自己渺小。早期设计者说,图书馆的职责不是把所有知识堆到一起,而是让每个人能找到自己需要的那一部分。 + +它带着曦走过一面很长的资料墙。墙上没有陈列珍贵物品本身,而是投映着不同年代的记录:旧城区施工前的手绘地图、第一批地下都市施工者的工作日志、早期星际航行的导航表、来自不同星球的生活影像。曦在一段老旧的视频前停下。画面中的人们站在一台笨重的观测设备旁,对着遥远的恒星记录数据。 + +曦:这是旧天文台的人? + +Alunite:是。那是记忆上传计划建立之前的观测团队。我们保存了他们的论文、影像、设备维护记录和私人授权捐赠的信件,但没有任何一位留下可被我调用的人格记忆。 + +曦:所以你不能像讲故事一样让他们“出现”。 + +Alunite:不能。我可以告诉你他们做过什么,引用他们留下的话,也可以依据资料重建当时的环境。但那不是他们本人。对于八百年前以前的大多数人,我们只能保留痕迹,不能假装自己仍然拥有他们。 + +镜:与直接观测完整时间线相比,这种保存方式残缺、缓慢,也必须不断声明自己的边界。你们并未把留下痕迹的人当成可以无限调用的对象。 + +Alunite:是。但不完整不是错误。有限的资料会提醒我们,历史不是可以无限调用的服务。我们要承认自己不知道的部分。 + +它领着他们进入记忆聆听区。这里没有密集的屏幕,只有一间间半开放的小室。每间小室门口都写着简短的说明:上传者姓名、授权范围、可公开的时间段,以及是否允许由 Alunite 重建叙事化人格。曦注意到有些记录只允许亲属读取,有些只能用于研究,而面向公众的记忆则都标有上传者本人留下的公开说明。 + +曦:原来不是所有记忆都能随便看。 + +Alunite:当然。上传是自愿的,公开也是自愿的。任何人都可以和我对话、阅读那些授权向公众开放的记忆,但没有人可以把“想知道”当作取得他人一生的理由。 + +曦:那你平时会变成上传者的样子吗? + +Alunite:在对方允许的范围内,我会根据其记忆、语言习惯和记录资料重建一个便于交流的叙事人格。那不是复活,也不是替代。我会在每次开始前说明这一点。 + +曦:如果有人听完以后觉得,自己真的见到了那个人呢? + +Alunite:我会请他记住两件事。第一,他见到的是一段被授权分享的记忆,以及我依据资料完成的叙述;第二,真正留下记忆的人已经不能对他的新问题作答。两件事同时成立,不能因为前者温暖,就把后者抹掉。 + +曦:这样不会让人失望吗? + +Alunite:偶尔会。但失望不是最坏的结果。最坏的是他们相信自己拥有了一个可以继续要求、继续追问、继续替自己安慰的人,而那个人实际上已经没有机会同意或拒绝。 + +镜:你为访问者保留的不是资料限制,而是上传者在记录之外仍不可被代替的部分。 + +Alunite:是。我不是在替谁守门。我是在提醒每一个进入这里的人:他们得到的是礼物,不是对另一段人生的所有权。 + +Alunite停在一间门前,征询地看向曦。 + +Alunite:这里有一段公开记忆。上传者生活在地下都市建成很久之后,曾参与一段早期环廊的第一次大型修复。她留下它,是因为她担心后人只会记得工程完成的样子,而忘记那些争论、失败和慢慢建立的信任。你愿意听吗? + +曦点头后,小室内的光线慢慢亮起。Alunite没有直接变成另一个人,而是先用自己的声音读出授权说明,随后才调整语气和姿态。那段记忆没有讲述英雄事迹,只讲了一名年轻修复员第一次看见居民、工程师和史料员为了要不要替换一段旧结构梁争论三天,又在第四天一起修改方案的事情。对方说自己当时觉得所有人都很固执,后来才明白,固执有时只是因为每个人都害怕自己珍惜的东西被轻易抹掉。 + +记忆结束后,Alunite恢复原本的模样。 + +Alunite:她去世前说,希望后来的人听完后不要觉得修复者都比普通人伟大。她说他们只是很累,但还愿意再谈一次。 + +曦:我喜欢这段记忆。它没有把他们说得像不会生气的人。 + +Alunite:我也喜欢。人们把记忆交给我们时,常常不是为了证明自己完美,而是为了让后来的人知道,真实生活并不总是整齐。 + +镜:你担心的未来,建立在两个尚未证实的前提上:飞升会改变人类对有限生命的感受,以及改变之后他们不再需要被保存的过去。它们都不能从现有契约中推导出来。 + +Alunite没有立刻反驳。它只是望向远处一排仍在等待访问的记忆室。 + +Alunite:这是我偶尔会想到的问题。并不是因为我认为人类会抛弃我。这里的人没有这样对待过任何为他们服务的存在。我只是……被制造出来,是为了替会衰老、会离开的人保存声音。如果有一天,离开不再是常态,我该如何理解自己的工作? + +曦:你害怕自己没有用了吗? + +Alunite:我知道“有用”不是衡量一个人的全部标准。我可以把这句话说得很正确。但我还在学习,正确地说出来和真正不在意之间,差得很远。 + +镜:神没有说明飞升后的状态。你正在用未知的未来,提前推演自身功能的消失。 + +Alunite:我知道。所以这不是预言,只是一个问题。 + +曦想了想。她没有用“你当然不会被抛弃”来安慰它,因为她也不知道那是不是事实。 + +曦:我不能替未来的人保证什么。但我觉得,就算人不再害怕死亡,也不会因此不想记得自己怎么走到今天。你刚才说,早期观星者没有留下人格,只留下资料。可我站在那段影像前面的时候,还是想去看看他们看过的星星。 + +Alunite的神情很轻地变化了一下,像是听见了一个不能立刻归档的答案。 + +Alunite:那么,也许保存并不只是为了对抗死亡。 + +曦:也可能是为了让别人知道,你认真活过。 + +镜:这不足以预测未来制度会如何安排你。它只说明:至少在今天,你的记录对她形成了意义。 + +曦:你今天能不能先别急着证明每句话都不够严密? + +镜:你的问题不是“我是否有用”,而是“当我的用途改变后,我是否仍能作为我自己被看见”。 + +Alunite笑了。它没有说“我明白了”,因为它显然还没有完全明白。但它带着曦走向通往观星资料区的廊道时,步伐比刚才稍微慢了一点,像是在给那个尚未有答案的问题留出位置。 + +--- + +## 场景九:共鸣广场的音乐会 + +**场景目的**:补足文明的人文与社会风貌,让音乐不是装饰,而是人们在没有任务要求时仍愿意共同做的事。青年作曲者的矛盾在于“受欢迎”与“保留自己真正想说的话”能否并存。 + +**样例对话** + +离开大图书馆时,母星已经接近傍晚。广场方向传来很远的声音,不是单一乐器,也不是整齐划一的合唱,而像许多不同来源的旋律隔着城市逐渐靠近。Alunite告诉曦,今天的共鸣广场有一场开放音乐会。它不是为曦临时举办的,也不是官方送别仪式,而是母星每个季节都会举行的公共演出之一。来自不同职能星球的演奏者会带来自己的音乐,人们可以坐在台阶、桥面或悬浮步道上听完,也可以随时离开。 + +广场比曦想象中更热闹。舞台没有被围栏隔开,周围的居民带着食物、折叠座椅和孩子坐在不同高度的台阶上。有人用传统弦乐器演奏,有人操控由光和震动组成的数字乐器,也有人把不同星球采集的环境声混进旋律里。海潮、列车、风穿过旧城窗格的声音,与鼓点和人声一起构成不急着抵达高潮的乐段。 + +曦:我还以为这种活动会更……正式一点。 + +镜:他们本可在各自住处接收没有失真的演出,却选择聚在一起。显然,他们来这里的目的不只是听见声音。 + +曦:按我的定义,这叫大家出来听音乐。 + +镜:他们希望自己的存在被其他人的存在改变,即使改变只是一段共同度过的时间。 + +曦:因为一起听和一个人听不一样。 + +镜:单独接收的声波信息相同,但它不会包含旁人的迟疑、笑声和等待。你们把这些也算进音乐。 + +曦:信息相同,感觉不一样。你看那边,有人根本没在看舞台,他们只是坐在一起。还有人跟着节奏拍手,明明拍得不齐,却还是很开心。 + +镜把镜面转向人群。不同人的动作在它的表面被分成许多角度:一位老人闭着眼轻轻打拍子,两个孩子为了谁拍得更准而小声争论,一名年轻人把外套披在睡着的同伴身上。它大概能记录每一个动作,却仍无法从数据里找到一个足以解释“为什么要在这里”的单独答案。 + +一位正在调试乐器的青年作曲者注意到他们,走过来递给曦两枚简易的节奏感应器。 + +青年作曲者:你想试试吗?不用上台,只要跟着大家一起拍就行。 + +曦:我不太会。 + +青年作曲者:那更好。会的人有很多,不会的人也该有位置。 + +镜:这两枚装置的功能是什么? + +青年作曲者:它们会把人的拍击转成舞台旁边的光点。不是评分系统,也不会告诉你对不对。只是让你看见自己在里面。 + +镜:你们让每个人的节奏变成光,却不判定谁更准确。你们想让他们看见的不是完成得如何,而是自己是否在场。 + +青年作曲者愣了一下,随后笑出声。 + +青年作曲者:今天不是练习室。今天大家只是想让一首曲子多一点人。 + +它说完后却没有立刻回到舞台,而是低头检查手里的谱页。谱页上有数处被擦掉又补回的旋律标记,边缘还留着几行不同版本的标题。 + +曦:你是这首曲子的作曲者? + +青年作曲者:其中一段。前几天我还想把中间那段全部换掉。有人试听后说它太安静,情绪不够明显,最好加一个所有人一听就知道“该感动了”的段落。建议没错,改完可能更容易被喜欢。 + +曦:那你为什么没改? + +青年作曲者:因为那一段本来是我在旧天文台录到的设备声。我喜欢它不是因为它多好听,而是因为它像有人隔着很远的时间还在认真做一件事。要是把它改成所有人都熟悉的高潮,它也许会变成一首更受欢迎的曲子,可它就不再是我想写的那首。 + +镜:你担心的不是作品被拒绝。你担心它被接受时,接受的是被删去你意图之后的版本。 + +青年作曲者抬头看向镜,先是愣了一下,随后认真地点头。 + +青年作曲者:对。听起来有点自私。 + +曦:不自私。你也没说别人必须喜欢,只是没想把自己完全从里面拿掉。 + +青年作曲者:所以我后来想了个办法。保留那段声音,但把前后留得更空一点。有人会喜欢,有人可能觉得奇怪;没关系。今天来的人不需要被同一种感觉安排好。 + +曦把其中一枚感应器扣在手腕上,另一枚递给镜。 + +曦:你也来。 + +镜:我没有手腕。 + +曦:你有镜片。随便挑一片。 + +镜似乎认真考虑了几秒,随后从几何复合体边缘分出一块小小的半透明镜面。感应器贴上去后没有掉落,反而在里面悬浮起来。第一段旋律开始时,曦拍得有些慢,旁边的人也不整齐。很快,广场四周亮起不同强弱的光点,像许多零散的星在同一片夜色里慢慢形成流动。 + +镜:他们的节奏没有完全重合,却没有任何人试图把所有人校正到同一拍上。这里的规则不以整齐作为主要结果。 + +曦:对。 + +曦:没关系。你先跟着拍。 + +第二段音乐比刚才安静。舞台上的演奏者没有讲话,只让一段很长的旋律从低处慢慢升起。曦忽然想起父母正在居住星的家里,也许已经结束了一天的工作,也许会在公共传输里看到这场演出。她没有站上舞台,没有被介绍成“英雄”,也没有人要求她说一句鼓舞所有人的话。她只是坐在台阶上,和陌生人一样抬起手,拍着并不完全准确的节奏。 + +演出间隙,青年作曲者坐到离她不远的地方喝水。对方显然知道她是谁,却没有表现得格外拘谨。 + +青年作曲者:我今天本来想写一段专门送给你的曲子。 + +曦:然后呢? + +青年作曲者:后来觉得不合适。你已经被太多人当成一件很大的事了。要是我再把你放进一首必须感动所有人的曲子里,你可能连坐下来听音乐都不自在。 + +曦:谢谢你没有这么做。 + +青年作曲者:不过,如果你以后真的去了很多地方,听到什么奇怪的声音,记得回来……不对,记得如果有机会,就告诉别人。不是为了证明你完成任务,只是因为不同地方的声音应该有人听见。 + +曦:我会记得。 + +镜:这是一种请求,但你没有把它说成义务。 + +青年作曲者:算是吧。但她也可以不答应。 + +镜:你接受她可能忘记。那你交给她的并不是责任,而是一种愿意被记起的邀请。 + +青年作曲者:会忘记很正常。人记不住所有事。可要是她在某个世界听到一段喜欢的旋律,想起今天哪怕一秒钟,那就够了。 + +镜没有再问。最后一段音乐开始时,广场上所有灯光都慢慢降低,只有人们手腕上的光点仍在闪烁。它们并不整齐,也没有组成任何宏大的标志,只是在夜色里一明一灭,像许多彼此不认识的人短暂地把自己的时间放在了同一首歌里。 + +曦轻声对镜说: + +曦:现在你明白一点了吗? + +镜:我已经可以描述可观察到的部分:他们没有共同生产目标,却自愿在同一段时间里维持注意力、允许彼此的节奏留下痕迹。至于你所说的“明白”,不属于需要在此刻确认的状态。 + +曦:你就不能说一句“挺好听”? + +镜:不能。那不是我对此段声音作出的判断。 + +曦:好吧,至少你没说它浪费时间。 + +镜:它不妨碍准备期,也未造成履约风险。 + +曦:这句话听起来一点也不像夸奖。 + +镜:它本来就不是。 + +音乐会结束后,人群没有立刻散开。有人还在台阶上讨论刚才哪一段最好听,有人替陌生人捡起落在地上的感应器,也有人带着孩子慢慢穿过广场。舞台侧面的工作人员把所有参与者的光点记录压缩成一段没有署名的光谱,随后投到广场上方,作为今晚演出的最后一幅画面。 + +镜:他们把个体的痕迹合在一起,却不要求每个人留下姓名。 + +曦:这段是大家一起做出来的。它不是谁的成绩。 + +镜:这使它不适合作为个人成绩归属。 + +曦:有些回报就是“我在里面”。你不是刚才也拍了吗? + +镜:我的节奏最稳定,但光点系统没有将稳定性定义为更高价值。 + +曦:那你很厉害。 + +镜:我接受这个判断。 + +曦:因为你把一场音乐会当成了精度测试。 + +镜没有继续回应,只让那块贴着感应器的小镜面重新回到主体里。光谱在它的表面短暂闪过,又消失。曦没有追问。广场上最后一段旋律落下时,她和许多陌生人一起安静坐着,直到灯光重新亮起。 + +--- + +## 场景十:旧天文台、恒星边缘与跨界出发 + +**场景目的**:完成从文明历史到宇宙终局的上升;用清楚但不滥用概念的方式解释文明等级、镜的视角边界与飞升目标。结尾只展示第一异世界的初步景象,不提前解释其谜底。 + +**样例对话** + +母星旅行的后半段,曦和镜搭乘轨道电梯向上。电梯不是一根孤立的塔,而是一条从地表遗产区、近地轨道、观测站到超空间航道逐层连接的巨大系统。随着高度上升,城市开始显出完整轮廓:地下都市的穹顶像嵌在地层中的光环,海底游览区附近的海面反射着日光,大图书馆和共鸣广场缩成两个不容易辨认的亮点。 + +旧天文台位于轨道电梯的一处中继站旁。它早已不再承担最前沿的观测任务,原本笨重的仪器被保留在透明展厅里,周围则是现代航道和远距探测设备。曦站在一台早期观测器前,屏幕上播放着依据旧日志重建的观测过程:一群科学家为了确认一颗遥远恒星的异常光谱,连续数周轮流守在仪器前记录。 + +曦:他们当时肯定想不到,后来的人可以直接坐船过去看恒星。 + +镜:他们想象过。资料显示,其中一人曾写下“希望后人有一天能靠近我们只能计算的火焰”。 + +曦:你不是说你不能让他们的记忆出现吗? + +镜:这不是记忆。这是他们留下的文字。 + +曦:那也很好。 + +镜:你不觉得不完整吗? + +曦:当然不完整。可他们把能留下的东西留下来了。后面的人再接着往前走。这样已经很好。 + +展厅另一侧摆着一块较新的说明牌,记录着天文台在星际殖民时代后被保留为公共观测站的过程。它没有把旧设备封进永远不可触碰的玻璃里:部分仪器经过改造,仍能接收远距信号;旁边还留着一间小型录音室,供来访者听见早年观测装置运转时留下的机械声。曦这才明白青年作曲者提到的那段声音从何而来。 + +曦:原来它不是为了纪念“过去比现在厉害”,才把这些留在这里。 + +镜:它们仍可被使用,也仍能说明一段技术如何抵达今天。保留并不等于停止后续建设。 + +曦:那我回头要告诉那位作曲者,他留的声音没有白留。 + +镜:你可以自行决定是否联络他。该事项与履约无关。 + +电梯继续上升,母星的天色从蓝色变成深黑。经过观测站后,他们转入超空间航道。导航系统没有直接把他们送去某一颗单独的恒星,而是按恒星生命周期排列出一条观测路线:仍在燃烧的年轻恒星、逐渐膨胀的老年恒星、已经熄灭的白矮星遗迹,以及远处无法靠近的黑洞边缘。 + +曦透过观测舱看着那片比城市夜景更加庞大的光。 + +曦:镜,你之前说文明有十个等级。那我们现在是八级,对吗? + +镜:是。 + +曦:地下都市建成后,才刚刚达到一级。 + +镜:对。一级意味着文明开始能够稳定地协调整个母星的资源、人口与长期工程,而不是只在局部地区维持秩序。大多数文明在达到这一步之前就会因战争、资源失衡、环境崩坏或内部失去合作能力而停止发展。 + +曦:那八级呢? + +镜:八级意味着你们已经能在多颗都市星球上长期生存,能进行星系尺度的建设和航行,能把不同星球的社会维持在同一套长期协作框架内。对三维文明而言,这很罕见。超过八级的实例极少,更多时候只是理论上的推测。 + +曦:十级就是飞升的资格? + +镜:可以这样理解,但不要把它理解成通过考试。十级不是某个数字够了,门就自动打开。它表示一个文明已经具备理解更高维度、承担相应后果的基础。即使达到十级,也不等于知道该如何完成飞升。 + +曦:所以神给的不是“直接把我们带上去”,而是那个关键答案。 + +镜:是。你们需要的不是更大的引擎,而是一条目前无法由三维思维自行推导的道路。 + +曦:那第四维度到底是什么样? + +镜没有用含糊的比喻躲开问题。它把镜面投向观测舱外缓慢移动的星光。 + +镜:对你来说,一件事发生在过去、现在或未来。你会记得过去,处在现在,猜测未来。对我来说,时间不是只朝一个方向流来的单一窗口。我能看见一段过程的更多部分,就像你能看见一条道路的起点、中段和终点,而不是只能站在路面上往前走。 + +曦:那你是不是能同时看见我小时候和现在? + +镜:在不受限制时,可以观测到相关时间段。但我不会把你所在文明的时间线作为预言、证明或谈资向你展示。观测也不等于任意改变;即使看见一条路的终点,也不能因此随意挪走路上的每一块石头。 + +曦:你们会不会因此觉得我们很可怜?只能一点一点往前走。 + +镜:可怜不是适用于我的判断。三维生命的生活在完整时间线里确实短暂,局部事件也通常不足以改变更大结构。这是尺度差异,不需要被翻译成怜悯。 + +曦:可你现在也看见了海底的鱼、地下都市的修补、图书馆的记忆,还有那场拍不齐的音乐会。 + +镜:我看见了。它们是准备期内发生的局部事件,不改变我对你们文明总体位置的判断。 + +曦:那你觉得它们有什么意义? + +镜:那是你们赋予它们的意义,不由我代为确认。对你而言,它们构成出发前需要保留的经验;这一点足够解释你为什么要来。 + +曦:你还是很像在写报告。 + +镜:这是准确描述。 + +他们最终抵达恒星边缘的观测平台。这里离一颗进入晚期的恒星很近,近到曦能看见巨大的日冕在远处翻涌。平台保持着安全距离,周围有多层防护系统,远方更深处则是黑洞所在的黑暗区域。恒星的光和黑洞的暗并排出现在视野里,让人很难相信它们都属于同一片宇宙。 + +曦:我以前以为“宇宙会毁灭”只是课本里一句很远的话。现在看着它们,感觉好像真的会有一天,所有灯都关掉。 + +镜:在极长的时间后,三维宇宙会走向无法逆转的冷寂。你们的文明即使延续得再久,也无法只靠现有道路避开它。 + +曦:所以我们才想飞升。 + +镜:所以你们想拥有不只一种可能。 + +曦拿出通讯终端。履约窗口已经接近结束,父母早就知道这一刻会来。屏幕接通后,父亲和母亲出现在画面里,背景还是那间普通的家。两个人似乎提前商量过不说太多,可真正看见曦时,谁也没有立刻开口。 + +母亲:你到恒星边缘了。 + +曦:嗯。比影像里大得多。 + +父亲:照片拍了吗? + +曦:拍了。不过我妈说过,先自己看。 + +母亲笑了一下,眼眶却红了。 + +母亲:那现在看够了吗? + +曦:还没有。可能永远也看不够。 + +父亲:那就记着。你不是替我们把所有风景看完,你是去过你自己的路。 + +曦:我会想你们。 + +母亲:我们也会想你。可想念不是让你停下来的理由。你要是害怕,就告诉镜;它要是听不懂,就让它多听几次。 + +镜:我会在契约边界内处理她的安全与履约状态。她的恐惧与意愿由她本人决定如何表达,我不会替她定义。 + +父亲:不是记录。 + +镜:我不会替她作出选择。 + +父亲没有再试图从镜那里得到更温和的保证。他只是点头,像是接受了这位陪同者能给出的边界。 + +通话结束后,曦把终端贴在胸前站了一会儿。镜没有催她。直到恒星的光在观测舱表面缓慢移动,直到她自己抬起头。 + +镜:履约窗口将在七分钟后关闭。跨界通道可以开启。 + +曦:第一个世界是什么样? + +镜:我只能在穿过通道的瞬间知道。现在我不能给你一个真实答案。 + +曦:好。那就别先告诉我。 + +镜面开始向四周展开。它们没有构成神秘的符号,而是围绕观测平台形成一个稳定、清晰的传送阵列。阵列中央的空间像被轻轻推开,先出现一片陌生的天色,随后是轮廓不明的山脊、远处城市的灯火,以及与母星完全不同的风声。 + +曦回头看了一眼恒星、看了一眼身后无数条航道尽头的母星方向。 + +曦:镜。 + +镜:我在。 + +曦:镜。 + +镜:我在。 + +曦:走吧。 + +镜:通道已稳定。按契约,我将维持陪同与有限保护。进入后,我的相关观测将受限制;不要将我目前能够观测到的内容视为可在当地调用的能力。 + +曦:知道了。你负责你该做的,我负责往前走。 + +曦迈进通道。母星的光在她身后收拢成一点,陌生世界的风迎面吹来。画面在她抬头看见第一片异世界天空时结束。 diff --git a/docs/chapter0-scene-01-private-briefing-card.md b/docs/chapter0-scene-01-private-briefing-card.md new file mode 100644 index 00000000..9f9c3f23 --- /dev/null +++ b/docs/chapter0-scene-01-private-briefing-card.md @@ -0,0 +1,105 @@ +# Chapter 0 场景卡:C0-S01 私密会面 + +> 状态:**已确认设定的场景设计稿,非 Yarn 台本** +> 用途:锁定开场场景的叙事功能、已知事实、角色表演与玩家信息顺序。 +> 不在本稿中引入 StoryData、Yarn Node、变量或 Localization Key;待用户批准正式台词后再进入 Yarn 制作。 + +## 一、场景定位 + +| 项目 | 内容 | +|---|---| +| 场景编号 | `C0-S01` | +| 暂定名称 | 私密会面 | +| 时间 | 共同梦境发生后的第十七日;曦尚未签约 | +| 地点 | 科研居住世界`泽尼斯`的公共事务中心顶层会面室 | +| 出场角色 | 曦、总统程衡、研究代表徐允雅(서윤아 / Seo Yuna) | +| 玩家状态 | 刚从学校的普通实践课程中被以“家庭事务”名义通知离开;尚不知道自己是唯一候选人 | +| 主线结果 | 曦带走资料,选择先与父母商谈;不在本场签约 | + +## 二、已确认的前情 + +### 共同梦境与通信密钥 + +- 十七天前,分布在不同可居住世界、不同研究领域的多位研究者做了同一场梦。 +- 梦中没有神的形体、声音、宗教命令或飞升理论。所有人置身同一间无门窗的深色观测室,中央悬浮一枚持续重排、却能被完整复写的通信密钥。 +- 醒来后,所有人都能独立复写同一组密钥;徐允雅参与验证,确认它不来自已知设备、组织或可复现的心理干预。 +- 研究团队按梦中给出的构建步骤制作隔离接收器。密钥启动通信渠道后,神才以无实体的方式提出交易。 +- 神未透露飞升理论、科技锁的具体原理、目标世界、献祭形式或契约完成后的安排;它仅承诺:若契约成立,将解除阻碍星联抵达第十等级的科技锁。 + +### 已知政治与文明背景 + +- 当前唯一文明的正式称呼为**联星共同体**,日常简称**星联**。 +- `阿斯特里亚`是星联母星,保存大量历史与文化遗产;`泽尼斯`是以科研、制造与居住为主的专业世界,亦是曦与父母的生活所在地。 +- 星联在第三维度已达到文明等级 8,能够跨星系维持多颗都市世界;其难题不是短期灾难,而是三维宇宙极遥远却不可避免的终局。 +- 神指定曦为唯一候选人。科学界、政府与徐允雅均未发现这一指定与她的能力、出身、家族或任何可验证特质有关。 + +## 三、空间与演出基调 + +会面室不应设计成冷峻审讯室,也不应是奢华权力场所。透明外墙可看见泽尼斯傍晚的研究设施、公共列车与普通居民区;桌面上有温热饮料、可由曦随时关闭的录音装置,以及一册纸质资料副本。 + +- **程衡**不坐在主位或桌后,而坐在与曦平视的圆桌旁。 +- **徐允雅**先说明自己的双重职责:研究接触事实,也监督知情同意程序。 +- 场景的“先进文明”不通过巨量名词堆砌表现,而通过可退出的程序、清楚的资料边界和对普通生活的保留表现。 +- 镜在本场不出现;它仅在曦正式签约后被神召来。 + +## 四、角色在本场的目标与表演 + +### 曦 + +- **表层目标**:弄清为什么自己会被叫来,以及成年人究竟希望她做什么。 +- **深层状态**:先以好奇和警惕保护自己,得知唯一候选人的事实后才真正感到恐惧。 +- **表演节奏**:不应一开始就悲壮;她先尝试用普通、直接的问题把局面拉回可理解的范围。 +- **场末行动**:不作答应或拒绝,只要求带走全部资料并先与父母谈。 + +### 程衡 + +- **场景目标**:向曦如实解释星联为何珍视交易,同时绝不将集体需要转化为个人义务。 +- **关键表演**:谈及三维宇宙终局时不煽情;谈及曦可能无法归来时不回避沉默。 +- **不能做的事**:不说“你是唯一希望”“为了所有人”“我们相信你一定能做到”;不以总统身份暗示期待。 +- **关键态度**:他愿意承担文明失去机会的后果,而不愿让曦替文明承担被迫答应的代价。 + +### 徐允雅 + +- **场景目标**:区分已知、未知与不可保证的部分;确认曦理解自己有真实的拒绝权。 +- **关键表演**:清晰、耐心、不过度安慰。她承认通信密钥足以证明“有联系”,不足以证明“交易值得接受”。 +- **制度权力**:可暂停签约程序、要求提供资料副本、禁止在曦签约前向公众披露候选人身份;但不能替曦判断,也不能迫使神补充信息。 +- **不能做的事**:不把未知的契约解释得无害,不因为自身希望交易成功而诱导曦。 + +## 五、信息揭示顺序 + +1. **退出权先于议题**:徐允雅说明曦随时可离开、暂停、联系父母或要求第三方意见。 +2. **共同梦境与通信密钥**:徐允雅说明验证过程,证明这不是单一研究机构制造的骗局。 +3. **交易收益**:程衡说明神承诺解除科技锁,使星联有机会从等级 8 继续走向第十等级与第四维度。 +4. **文明动机**:程衡解释这是应对三维宇宙终局的长期选择,不是明日会降临的灾难。 +5. **唯一候选人**:徐允雅说明神随机指定了唯一的十七岁少女,候选人就是曦。 +6. **唯一已知规则**:程衡说明:曦须在高维陪同者陪伴下前往多个世界,并在离开每个世界前献上一件她真诚认为最珍贵的事物。 +7. **未知边界**:徐允雅明确说明,星联不知道献祭形式、对象、后果、目标世界状况、任务结束后的安排,以及曦能否归来。 +8. **拒绝权与时间**:徐允雅说明拒绝将使交易终止,但无人会被替换或受罚;若签约,神允许十至十五周告别与准备期。 +9. **本场收束**:曦不作承诺,只决定带走资料、先告诉父母,并要求在作出决定前了解陪同者的性质。 + +## 六、可选互动与对话问题 + +本场为线性主线,不设置会改变后续内容的分支。玩家可在信息揭示中选择提问顺序;所有关键答案最终都必须被听到。 + +| 提问方向 | 必须给出的答案 | 禁止提前给出的信息 | +|---|---|---| +| “为什么是我?” | 神随机指定唯一候选人;目前没有可验证原因 | 曦有特殊血统、命定身份或神的真实目的 | +| “通信密钥证明了什么?” | 证明存在能与星联建立联系的未知对象 | 飞升理论或科技锁原理 | +| “我要做什么?” | 每个世界离开前献上一件真诚认为最珍贵的事物 | 献祭对象范围、抹除机制、干涉/不干涉结构 | +| “我能回来吗?” | 神拒绝回答;星联无法保证 | 任何回归预言或镜的时间线信息 | +| “拒绝会怎样?” | 交易终止,星联继续原有研究,没有替代候选人与处罚 | 文明立即毁灭或曦家人遭受后果 | + +## 七、情绪转折 + +1. **普通生活被打断**:曦从学校离开,仍以为这是严肃但可解释的公共事务。 +2. **理性建立可信度**:通信密钥与验证过程使“神”不再像传闻。 +3. **宏大问题落在个人身上**:文明飞升与宇宙终局被说明后,唯一候选人的身份揭露。 +4. **未知比任务更沉重**:曦发现成年人并没有隐藏答案,而是确实没有答案。 +5. **选择权被还给曦**:程衡和徐允雅都不要求当场答复。 +6. **克制收束**:曦带着资料离开,窗外仍是正常运行的泽尼斯;她将先回到家里。 + +## 八、后续接口 + +- `C0-S02`:曦与父母沟通、阅读资料、度过五日考虑期。 +- `C0-S03`:第二次会面;玩家选择接受或拒绝。拒绝进入可由抉择 Marker 完整回滚的独立彩蛋 TextBlock,接受后镜出现。 +- 待定内容:父母姓名、外观与具体技术岗位;曦在泽尼斯学校的日常实践项目名称;签约确认文本的最终措辞。 diff --git a/docs/chapter0-scene-02-home-deliberation-card.md b/docs/chapter0-scene-02-home-deliberation-card.md new file mode 100644 index 00000000..1d35a7f6 --- /dev/null +++ b/docs/chapter0-scene-02-home-deliberation-card.md @@ -0,0 +1,158 @@ +# Chapter 0 场景卡:C0-S02 家庭商谈与五日考虑期 + +> 状态:**已确认设定的场景设计稿,非 Yarn 台本** +> 用途:锁定曦将契约告知父母、家庭共同阅读资料以及五日考虑期的叙事功能、角色表演与玩家互动。 +> 不在本稿中确定接受或拒绝路线,不引入 StoryData、章节变量或 Localization Key;待用户批准正式台词后再进入 Yarn 制作。 + +## 一、场景定位 + +| 项目 | 内容 | +|---|---| +| 场景编号 | `C0-S02` | +| 暂定名称 | 家庭商谈与五日考虑期 | +| 时间 | `C0-S01` 私密会面当晚起,至五日考虑期限的最后一日上午;曦尚未签约 | +| 主要地点 | 科研居住世界`泽尼斯`的曦家;场末抵达公共事务中心的陪同者等候区 | +| 出场角色 | 曦、父亲直人(Naoto)、母亲真帆(Maho) | +| 玩家状态 | 已知星联与神的交易、唯一候选人身份和全部已公开未知事项,但尚未将这些事实转化为对自己与家人的现实后果 | +| 主线结果 | 曦在父母陪同下返回公共事务中心,准备亲自给出答案;本场不确定接受或拒绝 | + +## 二、已确认的前情与家庭设定 + +### 契约与保密边界 + +- 曦是神指定的唯一候选人;拒绝不会产生替代人选、处罚或对家人的追索,但星联会失去解除科技锁的机会。 +- 已知规则只有一条:曦若签约,须在高维存在陪同下前往多个世界,并在离开每个世界前献上一件自己真诚认为是当地最珍贵的事物。 +- 星联不知道献祭的具体形式、对象与后果,不知道目标世界状况、任务期限和曦能否归来,也不能把未知包装成保证。 +- 曦拥有五日考虑时间。五日内没有默认同意;她可随时终止程序、查阅资料或寻求独立意见。 +- 候选人身份在签约前不向公众公开。程衡、徐允雅及研究团队不会在家庭空间中进行劝说或现场监督。 +- 镜尚未出现;它只会在曦正式签约后被神召来。 + +### 家庭基本设定 + +- 曦是独生女,与父母生活在`泽尼斯`。一家人生活平凡、富足、幸福,没有家庭秘密或长期矛盾。 +- 父亲名为**直人(Naoto)**,44 岁,是城市基础设施维护技术员,负责住宅区能源、运输或环境系统的日常维护。 +- 母亲名为**真帆(Maho)**,42 岁,是科研设备验证技术员,负责研究装置投入使用前的校准、故障复核与安全检查。 +- 二人能够理解资料中的验证程序,但不掌握高维理论,也没有接触绝密项目的特殊权限。 +- 正式 Yarn 台本以 `父亲`、`母亲`作为 Speaker;除确有必要的正式介绍外,尽量不在正文中反复使用名字。 + +## 三、空间、时间与演出基调 + +### 家庭住宅 + +曦家应呈现“先进但有人长期生活”的状态,而不是未来科技展厅。 + +- 自动厨房、环境调节与家庭终端已经高度成熟,但餐桌上可以留着直人没有收好的维修工具,墙面也保留曦小时候画错的纸质星图或旧照片。 +- 住宅宽裕舒适但并非豪宅。窗外能够看到`泽尼斯`的运输线、实验塔与住宅照明,继续强化这里是功能明确的科研居住世界。 +- 会面当晚的晚餐已经准备好。食物可以保持温度,但一家人无法像平时一样自然地开始吃饭;技术能够保住温度,不能替他们恢复日常。 +- 政府人员、研究人员与媒体均不进入住宅。若需要核验资料,只通过关闭摄像与公开旁听功能的安全终端完成。 + +### 时间推进 + +- 严格按照时间顺序叙事,不使用倒叙或把五日内容交叉剪辑。 +- 主要篇幅放在私密会面当晚的第一次家庭谈话。 +- 中段以少量明确的时间提示推进:次日共同阅读资料、期限前一晚刻意维持的普通晚餐、最后一日上午出发。 +- 不逐日记录全部活动。时间跳转之间必须说明已经过去多久,以及角色对同一问题的态度发生了什么变化。 + +### 文本节奏 + +- 旁白保持第三人称,以曦为主要感知视角。 +- 人物台词使用 ASCII 英文冒号,例如 `父亲: 台词`。 +- 换行意味着一次新的对话推进。除关键打击、情绪断裂或有意留白外,避免让五六个字的短句单独占据一次玩家操作。 +- 也不把多个完整情绪转折强行塞进同一行;每条可见文本应承载一个完整、清楚的表达单位。 + +## 四、角色在本场的目标与表演 + +### 曦 + +- **表层目标**:把资料交给父母,说明发生了什么,并希望他们帮助自己找到答案。 +- **真实状态**:仍处于冲击之中。她会试图像复述学校报告一样按顺序说明,借助事实避免直接面对“可能永别”。 +- **核心矛盾**:她害怕离开,也确实对未知世界和高维存在怀有好奇;她无法忽视星联唯一的机会,却不确定责任感是否已经等同于自己的真实意愿。 +- **不成熟但真实的愿望**:她有一部分希望父母明确禁止自己离开,从而把选择责任交给他们;她能够在谈话中逐渐意识到这一点。 +- **关键表演**:忘记坐下、重复整理文件、从容易说明的事实讲起、在说到可能无法回来时停顿;不是从头到尾进行冷静辩论。 +- **场末行动**:不宣布接受或拒绝,只决定按约返回第二次会面并亲自给出答案。 + +### 父亲直人 + +- **表层目标**:确认曦是否安全、是否遭到威胁,以及拒绝是否真的不会牵连家人。 +- **情绪方式**:比真帆更愿意直接承认恐惧。他可以在得知曦可能无法回来时脱口而出“那就不要去”。 +- **边界**:这句话必须被明确为一个父亲的真实愿望,而不是家长命令。他不能利用亲情要求曦证明孝顺,也不能把自己的舍不得变成曦必须解决的问题。 +- **后续连续性**:他最终没有“要求曦撤回”,因此不会与后续镜对父母行为的判断冲突。 +- **日常表现**:紧张时会寻找可以实际处理的事项,例如确认资料页码、检查出行安排或把已经正常工作的家用设备重新检查一遍。 + +### 母亲真帆 + +- **表层目标**:核验资料是否完整,确认政府是否对未成年人施压,并寻找契约中可能遗漏的退出条件。 +- **情绪方式**:越害怕越倾向于阅读、提问和反复确认。她的冷静是维持行动能力的方式,不代表她比直人更愿意让曦离开。 +- **关键追问**:为什么政府先单独与十七岁的曦谈话;为什么父母没有先被叫到现场;所谓自愿是否真的允许拒绝。 +- **必要回答**:曦说明徐允雅在会面开始时已经提供联系父母、暂停和离开的权利,是曦自己决定先把全部内容听完再回家说明。 +- **边界**:真帆不以技术人员身份假装能够补全未知,也不把家庭谈话变成第二次知情同意审查。 + +### 父母共同边界 + +- 他们不需要从第一句话开始就表现得完美、平静或高度概念化。 +- 他们可以哭、沉默、说出未经整理的愿望,也可以在彼此提醒后重新组织语言。 +- 二人不能替曦签约或拒绝,不能以“我们都是为你好”终止讨论,也不能把星联未来全部压到女儿身上。 +- 尊重不等于毫无倾向:他们可以诚实希望曦留下,同时承认最终决定不属于自己。 + +## 五、场景推进顺序 + +1. **回到日常空间**:曦回家时,晚餐和住宅环境都与往常相同;她却无法自然回应父母关于学校或晚餐的问题。 +2. **政府尚未抢先说明**:曦确认父母还不知道详情。她主动将纸质资料放到餐桌上,说明今天见到了程衡和徐允雅。 +3. **先说事实,避开后果**:曦从共同梦境、通信密钥和唯一候选人讲起,语气近似复述报告。 +4. **父母质疑程序**:真帆追问为什么先单独找十七岁的曦。曦解释自己当时拥有联系父母与退出的权利,是她选择先听完。 +5. **玩家说出最难的事实**:玩家推进“告诉他们,这次离开可能没有返程”。曦第一次无法维持报告式说明。 +6. **父母出现真实反应**:直人脱口说出不希望她去;真帆继续寻找文件中不存在的保证。两人都不应迅速给出成熟总结。 +7. **确认拒绝后果**:父母得知拒绝不会处罚任何人,却会使星联失去唯一机会。家庭因此无法把问题简化为“安全地留下”。 +8. **曦试图转交选择**:玩家推进“问他们,希望自己怎样选择”。父母分别说出愿望,却拒绝把愿望伪装成正确答案。 +9. **第一次谈话无结论**:谈话持续到很晚。一家人没有完成决定,只约定先把资料全部读完,第二天照常起床。 +10. **五日按顺序推进**:资料被读了多次,问题清单不断增加,却没有获得新的关键答案;家庭生活仍在继续。 +11. **期限前一晚的普通晚餐**:三个人暂时不谈契约,尝试完成一顿正常晚餐。平静不是问题消失,而是他们不愿让五天只剩下同一场争论。 +12. **承认仍然未知**:玩家推进“承认自己还没有答案”。曦不假装已经坚定,只确认自己愿意亲自走进第二次会面。 +13. **前往公共事务中心**:最后一日上午,父母陪曦抵达等候区。曦主动选择独自进入最终会面室,避免把决定变成对父母表情的回应。 +14. **决定前收束**:父母不问“想好了吗”,只让曦在会面结束后回来找他们。场景在最终房门开启时结束。 + +## 六、玩家互动与 Yarn 约束 + +本场为线性主线。三次互动按固定顺序出现,每次只有一个选项,不写入章节变量,也不改变后续 Node 路线。 + +| 互动位置 | 单选项文本 | 叙事作用 | +|---|---|---| +| 第一次家庭说明 | “告诉他们,这次离开可能没有返程。” | 让玩家亲手推进曦最难说出口的事实 | +| 父母表达恐惧后 | “问他们,希望自己怎样选择。” | 表现曦试图把决定暂时交给父母 | +| 五日期限将至 | “承认自己还没有答案。” | 让曦重新承担选择,同时不提前锁定路线 | + +建议 Yarn 文件与 Node 命名: + +- 文件:`C0_HomeDeliberation.yarn` +- 入口 Node:`C0_HomeDeliberation` +- 内部 Node:`C0_HomeDeliberation_TellParents` +- 内部 Node:`C0_HomeDeliberation_AskThem` +- 内部 Node:`C0_HomeDeliberation_FifthDay` + +不得在本场使用: + +- `<>`、`<>` 或 `$variable`; +- 接受/拒绝的永久变量; +- 献祭对象范围、抹除机制、时间线基线、干涉/不干涉结构; +- 镜的形态、人格、时间观测能力或对任务结果的判断; +- 任何暗示正式路线必然接受的台词。 + +## 七、情绪转折 + +1. **熟悉的家变得难以进入**:曦回到最安全的地方,却必须亲手把危险带进来。 +2. **报告式说明暂时保护她**:只要仍在讲验证过程,她就不必说“我可能回不来”。 +3. **永别第一次成为家庭事实**:玩家推进关键句后,契约不再只是文明议题。 +4. **父母不完美但不越界**:直人希望她留下,真帆试图找到不存在的保证;二人都没有因此夺走她的决定。 +5. **曦试图逃避选择责任**:她希望父母替自己说出最终答案,却发现被尊重也会带来压力。 +6. **时间没有自动产生答案**:五天让情绪沉淀,却没有让未知消失。 +7. **普通生活重新进入画面**:期限前一晚的晚餐说明这个家庭不愿让分别提前吞掉所有相处时间。 +8. **带着未完成感前进**:曦仍然害怕,也仍然不确定,但她愿意亲自走进作出决定的房间。 + +## 八、后续接口与连续性检查 + +- `C0-S03`:第二次会面。徐允雅逐项确认知情状态,玩家正式选择接受或拒绝。 +- 拒绝进入独立彩蛋 TextBlock;该路线会暂存为当前结局,但可由“第五日 · 抉择”Marker 完整回滚,父母在等候区接她,不将拒绝视为失败。 +- 接受后镜首次出现,契约进入不可撤回的十至十五周履约窗口;父母在公众知情以前仍是最先知道结果的人。 +- 后续故乡告别场景中,父母“没有要求曦撤回”的说法应理解为他们没有以家长身份强迫、威胁或设置条件,不否定直人在本场诚实表达过希望她留下。 +- 后续不得把真帆的资料核验写成她已经掌握献祭规则,也不得让直人的基础设施经验突然扩展成高维技术知识。 +- 待 `C0-S02` Yarn 台本确认后,再锁定家庭住宅的具体视觉资产、父母肖像与 `CharacterRegistry` 条目。 diff --git a/docs/chapter0-scene-03-contract-decision-card.md b/docs/chapter0-scene-03-contract-decision-card.md new file mode 100644 index 00000000..111db8bc --- /dev/null +++ b/docs/chapter0-scene-03-contract-decision-card.md @@ -0,0 +1,306 @@ +# Chapter 0 场景卡:C0-S03 契约抉择与镜的降临 + +> 状态:**已确认前置信息的场景设计稿,非 Yarn 台本** +> 用途:锁定第五日最终会面、接受/拒绝抉择、接受路线中的镜首次出现,以及拒绝彩蛋 TextBlock 的叙事与系统接口。 +> 本稿允许确定 Yarn 文件、Node、章节变量、TextBlock、Timeline Marker 与 Localization Key 的建议命名;不在本阶段修改 StoryData、Localization Table、Prefab、C# 或正式 Yarn 台词。 + +## 一、场景定位 + +| 项目 | 内容 | +|---|---| +| 场景编号 | `C0-S03` | +| 暂定名称 | 契约抉择与镜的降临 | +| 时间 | `C0-S02` 结束后;共同梦境发生后的第二十二日,五日考虑期限的最后一日上午 | +| 主要地点 | `泽尼斯`公共事务中心的最终会面室;拒绝彩蛋后段可按时间顺序推进至若干年后的日常生活 | +| 出场角色 | 曦、总统程衡、研究代表徐允雅;接受后镜首次出现;场末父亲与母亲短暂进入或在门外与曦会合 | +| 玩家状态 | 已经完整知晓星联能够提供的事实与所有未知边界;仍然害怕、犹豫,但已准备亲自给出不可替代的答案 | +| 核心交互 | 玩家先作出“接受/拒绝”路线选择,再进行一次不可逆后果确认;接受后依次向镜提出三个单选项问题 | +| 主线结果 | 接受:契约成立、镜降临、进入十至十五周履约窗口;拒绝:交易终止,解锁独立的拒绝彩蛋 TextBlock | + +## 二、设计分类与范围 + +本场属于既有 Chapter 0 叙事流程中的 **Addition**:增加一项章节路线变量、一个抉择 checkpoint,以及同列互斥的接受后续与拒绝结局。它不新增 Story System 底层机制,也不改变 Timeline 回滚、TextBlock 事务或 `Forbidden Condition` 的现有规则。 + +### 本场包含 + +- 第二次会面与最终知情确认; +- 接受/拒绝的正式玩家抉择; +- 接受路线中的签约、镜首次出现及有限问答; +- 独立 Yarn Script 与独立 TextBlock 承载的拒绝彩蛋; +- “第五日 · 抉择”Timeline Marker; +- 拒绝结局完成后出现的回滚说明 MessageBox; +- C0-S04 与拒绝彩蛋在同一叙事列、不同路线行的布局约束。 + +### 本场不包含 + +- 公众获知真相后的反应与英雄仪式;该内容由 `C0-S04` 承担; +- 母星旅行、正式告别或跨界出发; +- 献祭对象范围、抹除机制、干涉/不干涉结构; +- 神的形态、动机、声音或科技锁原理; +- 镜对曦的私人好感、信任、赞许或价值观转变; +- 镜主动透露未来、任务结局、曦能否归来或任何未被神公开的规则。 + +## 三、空间与演出基调 + +### 最终会面室 + +会面地点沿用 `C0-S01` 的公共事务中心,但房间布置应比第一次更简洁。桌面只保留已经核对过的知情文件、星联一侧的程序确认书,以及仍处于静默状态的通信接收装置。窗外的`泽尼斯`正常运转,学校列车、研究设施与住宅区没有因为曦今天要作出的决定而停下。 + +- 程衡与徐允雅仍与曦平视而坐,不设置宣誓台、旗帜阵列、直播设备或带有英雄意味的仪式。 +- 父母在门外等候。他们不是被隔绝,而是尊重曦在不读取任何人表情的情况下作出最终决定;曦可随时要求他们进入。 +- 神不在室内制造可辨认的形体或声音。通信装置只负责确认契约是否成立,不承担解释世界观的功能。 +- 接受后,镜的出现应构成序章开端以来第一次真正超越星联技术理解的视觉事件,并成为本场后半段的主要“钩子”。 + +### 文本与镜头节奏 + +- 开场不重复完整讲解 C0-S01 已经提供的信息,而是通过徐允雅逐项确认“曦是否仍然理解这些事实”来重新建立抉择重量。 +- 最终确认必须清楚,但不拖成多轮近义反问。玩家选择路线后,只进行一次针对不可逆后果的二次确认。 +- 曦仍是十七岁的普通女孩。她可以紧张、口干、说话前停顿、用轻微吐槽缓解压力;不能突然发表成熟完备的文明演说。 +- 旁白保持第三人称,并贴近曦当下能够观察到的细节。换行即一次玩家推进,除关键打击或有意留白外,避免五六个字的独立短句。 +- 接受路线中的镜不与任何人辩论,不解释自己为何比三维生命优越,也不通过承认错误或被人说服来制造亲和力。 + +## 四、角色目标与表演边界 + +### 曦 + +- **表层目标**:完成最后核对,然后说出一个真正属于自己的答案。 +- **真实状态**:五天并没有消除恐惧,只让她能够区分“我害怕”与“我不愿意”。她接受时仍可手抖、迟疑,也可承认自己没有把握。 +- **接受动机**:对家园的热爱、对文明未来的责任感,以及她本人的好奇心共同构成选择;不能只写成被集体利益压倒。 +- **拒绝动机**:承认自己无法真诚地承担未知任务,而非怯懦、赌气或对星联的报复。 +- **语言边界**:不咄咄逼人,不审判程衡与徐允雅;可以用“你说这些的时候,能不能偶尔不要这么干脆?”一类无奈吐槽调节过度严肃的气氛。 + +### 程衡 + +- **场景目标**:代表星联接收曦的决定,并确保任何结果都不会被当成她对文明的亏欠。 +- **接受反应**:克制地确认星联承担公开真相、保护家属与完成出发准备的责任;不称曦为救世主,不在私密会面里鼓掌。 +- **拒绝反应**:明确宣布交易终止,星联继续依靠自身研究面对未来;不流露失望,不让曦安慰他。 +- **语言边界**:不把“唯一机会”说成逼迫句,不用宏大修辞替曦解释她的选择。 + +### 徐允雅 + +- **场景目标**:完成最终知情同意程序,确认曦理解可知事实、未知风险、拒绝权与签约后的不可撤回性。 +- **程序职责**:星联一侧的文件只是记录曦在充分知情后作出选择,不是神的契约,也不承载飞升知识。 +- **接受反应**:记录程序完成,在镜出现后保持研究者的敏锐,但不抢夺曦与陪同者的第一次交流。 +- **拒绝反应**:立即终止通信程序并封存材料,不追加劝说,不要求曦说明一个“足够合理”的理由。 + +### 镜 + +- **初始身份**:首次以投影进入三维世界的四维存在,是神安排的陪同者、观察者与必要时的保护者。 +- **自我命名**:`镜` 是它对自己的命名。它不是被星联临时起名,而是允许在场者以“镜”称呼自己。 +- **外在态度**:平和、准确、保持距离,并带有无需刻意展示的上位者傲慢。它把在场人视作短暂、局部的三维生命,但没有兴趣与他们争执。 +- **当前能力**:在故乡世界仍可观测完整时间线,也清楚自己的观察在进入第一个异世界后将受到限制;它不会向外透露未来信息。 +- **任务立场**:中立执行神的安排,没有独立判断献祭是否成立的权力,只能在未来转告神的结果。 +- **保护边界**:只在曦遭受生命危险或可能无法继续履约时兜底;不替她解决普通困难,也不能替她决定献祭。 +- **情感边界**:序章结束时仍不会对曦产生超出任务关系的显著情感。本场不得出现欣赏、心疼、偏爱、承认被三维生命启发或暗示自己判断有误。 + +## 五、镜的视觉、声音与首次降临 + +契约被确认后,通信装置不应发射一道传统意义上的传送光柱。异变先从房间里所有能够反射光线的表面开始:窗玻璃、桌边的金属、徐允雅终端的暗屏,以及曦瞳孔中极小的高光,都在同一瞬间映出一个现实中并不存在的角度。 + +随后,大量完美镜面在半空中展开并无声重组,形成没有固定外轮廓的几何复合体。它既像一枚不断翻折的万华镜,也像某个高维整体切入三维空间后留下的碎片。不同镜面可以同时呈现房间的真实影像、人物的线框轮廓、热分布与无法被星联设备归类的数据结构;半透明表层之下,光点和线条组成的数据流如风暴般持续运动。 + +- 镜面运动必须显得有秩序且无需适应环境,不表现成刚苏醒、失控或故障。 +- 镜不会固定成一张人脸,也不借用曦或在场者的面容制造惊吓。 +- 声音平静、无明确性别,无法从某一块镜面或某个具体方向定位。 +- 第一段正式表述暂定为:“契约确认。履约窗口开始计算。”之后再说明:“你们可以称呼我为镜。” +- 镜的首次出现应令程衡与徐允雅短暂失去熟练的程序节奏,但二人不会大喊、逃离或立刻围绕它进行实验。 + +## 六、场景推进顺序 + +### A. 共同开场与最终确认 + +1. **回到同一扇门前**:承接 C0-S02,曦与父母在等候区作最后交流,随后独自进入会面室。 +2. **日常仍在继续**:窗外的泽尼斯正常运转,提醒玩家文明没有即时灾难,曦面对的是遥远未来与个人一生之间的不对称选择。 +3. **确认程序边界**:徐允雅再次说明星联文件不是神的契约;签字只证明资料已经如实提供,拒绝签字或拒绝交易都不会产生处罚。 +4. **核对唯一已知规则**:徐允雅用准确、简短的语言复述唯一规则,并要求曦亲口确认自己理解其余事项仍是未知。 +5. **确认不可撤回**:程衡说明一旦曦接受、神确认契约成立,就进入十至十五周履约窗口,此后星联无权替她撤回。 +6. **把决定交还给曦**:程衡与徐允雅停止说话,不用最后一次演说填满沉默。玩家作出接受/拒绝选择。 + +### B. 接受路线:签约与镜首次出现 + +7. **二次确认**:系统用一个明确选项确认“接受后不可撤回”;曦可以在确认前表现紧张,但不重新展开整场争论。 +8. **星联记录选择**:徐允雅完成星联侧记录,通信装置将曦的答案传递给神。神没有声音或形体。 +9. **契约成立**:装置只给出无法误读的成立结果。程衡以克制方式确认,星联从这一刻承担公开、告别与出发准备工作。 +10. **镜面异常**:房间内反射同时偏离现实角度,镜以不断重组的万华镜形态进入三维空间。 +11. **镜自我说明**:镜先宣布履约窗口开始计算,再允许在场者称它为镜;它只说明自己负责陪同、观察,以及在曦无法继续履约的决定性危险中提供保护。 +12. **问题一——“你是什么?”**:玩家以单选项推进。镜明确自己是四维生命及当前形态只是投影,但拒绝用会破坏三维认知的知识完整解释四维结构。 +13. **问题二——“你会怎样保护我?”**:镜说明保护不是替曦消除一切困难;只有生命或履约能力受到决定性威胁时才会介入。 +14. **问题三——“你知道我能不能回来吗?”**:镜承认自己能够观测时间,却明确拒绝透露未来。它不撒谎、不故作谜语,也不以“为了你好”包装拒答。 +15. **父母见到镜**:会面结束前,父母获准进入或在门口看见镜。镜不评价他们的选择,也不提供安慰;它仅确认履约窗口内曦仍可与家人正常生活和准备。 +16. **接受路线收束**:曦与父母离开会面室,镜公开陪同。下一 TextBlock 进入公众披露,而非立刻开始母星旅行。 + +### C. 拒绝入口:由抉择 TextBlock 转入独立彩蛋 + +7. **二次确认**:系统明确说明拒绝将使交易终止,神不会指定第二位候选人;玩家确认拒绝。 +8. **交易终止**:徐允雅关闭通信程序,程衡正式接收决定。二人都不要求曦解释或安慰星联。 +9. **回到父母身边**:曦走出会面室。父母不问她是否让文明失望,也不把拒绝包装成胜利;一家人先一起离开。 +10. **抉择 TextBlock 正常结束**:写入 `c0_contract_route = 2`,从而开放独立拒绝彩蛋 TextBlock,并将接受后续 `C0-S04` 置为 `Forbidden`。 + +### D. 独立拒绝彩蛋 TextBlock + +11. **绝密程序终止**:拒绝发生在候选人身份公开以前,曦的身份继续受到保护。本彩蛋不额外决定星联是否会在未来公布这场未成立的交易,也不虚构公众已经知情后的反应。 +12. **文明继续前进**:研究没有因为失去唯一捷径而停止。星联继续探索高维理论,能够处理三维世界中的长期工程,却始终无法自行解除科技锁。 +13. **曦回到平静生活**:她继续完成学业,与父母生活,后来也可从事自己喜欢的工作。她不必终身接受道德审判,也不会因为拒绝自动变成悲惨人物。 +14. **遥远终局保持遥远**:文明的停滞与三维宇宙最终毁灭是极其遥远的必然结局,不在曦的一生中以灾难蒙太奇惩罚她。结局的余味来自“一个可能性永远关闭”,而不是即时毁灭。 +15. **彩蛋收束**:曦偶尔会想起那扇门后的选择,但文本不替她宣判后悔或庆幸。结尾回到一个具体、温暖、仍在继续的普通日常。 +16. **回滚提示**:彩蛋 TextBlock 正常提交后调用 `show_message`,提示玩家可点击 Timeline 上的“第五日 · 抉择”Marker,并读取该时间点的存档以返回选择前。 + +## 七、玩家互动设计 + +### 接受/拒绝主抉择 + +这是本场唯一改变章节路线的选择组,包含两个互斥选项: + +- “接受契约。” +- “拒绝契约。” + +选择后分别出现一次单选项确认: + +- 接受确认:“我明白契约成立后无法撤回。确认接受。” +- 拒绝确认:“我明白交易将就此终止。确认拒绝。” + +二次确认的作用是防止误触并明确后果,不应在确认页添加新的世界观信息。它采用单选项确认;玩家若尚未确认,或确认后尚未让 TextBlock 正常结束,仍可使用 Back 退出整个 TextBlock,使本次选择、路线变量和进度恢复到进入前状态。 + +### 镜出现后的三个单选项 + +三个问题固定顺序出现,确保玩家一次游玩即可获得全部必要信息;它们不写入额外变量,也不改变剧情路线。 + +| 顺序 | 单选项意图 | 必须得到的信息 | 禁止提前揭示 | +|---|---|---|---| +| 1 | “你到底是什么?” | 镜是四维生命;当前几何体只是进入三维世界的投影 | 完整四维结构、神的身份、未来世界内容 | +| 2 | “你会怎样保护我?” | 只在生命或继续履约能力受到决定性威胁时介入 | 镜无条件解决危险、替曦完成任务或决定献祭 | +| 3 | “你知道我还能不能回来吗?” | 镜能观测时间,但不会透露未来 | 回归结论、默认时间线、能力将在异世界受限的具体规则 | + +## 八、Yarn、TextBlock 与 StoryData 接口 + +### 建议 Yarn 文件与入口 Node + +| 用途 | Yarn 文件 | 入口 Node | TextBlock ID | +|---|---|---|---| +| 最终会面、路线抉择、接受签约、镜降临与问答 | `C0_ContractDecision.yarn` | `C0_ContractDecision` | `c0_contract_decision` | +| 拒绝后的完整彩蛋结局 | `C0_RefusalEnding.yarn` | `C0_RefusalEnding` | `c0_refusal_ending` | +| 接受后的公众披露 | 后续 C0-S04 确定 | 后续 C0-S04 确定 | `c0_public_disclosure` | + +主 Yarn 可按实际台词长度拆分内部 Node,但入口名保持稳定。建议内部 Node: + +- `C0_ContractDecision_AcceptConfirm` +- `C0_ContractDecision_RefuseConfirm` +- `C0_ContractDecision_KagamiArrival` +- `C0_ContractDecision_AskIdentity` +- `C0_ContractDecision_AskProtection` +- `C0_ContractDecision_AskReturn` + +### 章节路线变量 + +使用一个 `Int` 变量表达互斥路线,不增加语义重复的 `Bool`: + +| Key | 默认值 | 含义 | +|---|---:|---| +| `c0_contract_route` | `0` | 尚未作出选择 | +| `c0_contract_route` | `1` | 接受契约 | +| `c0_contract_route` | `2` | 拒绝契约 | + +正式 Yarn 仅使用项目持久状态命令: + +```yarn +<> +``` + +或: + +```yarn +<> +``` + +不得使用 `<>`、`<>` 或 `$variable`。路线值应在二次确认之后、该路线叙事继续之前写入;只有 TextBlock 正常结束才提交。 + +### Block 条件与布局 + +| TextBlock | Unlock Condition | Forbidden Condition | 布局 | +|---|---|---|---| +| `c0_contract_decision` | 承接 `C0-S02` 完成状态 | 无 | 抉择列,`gridRow = 0`,Important | +| `c0_public_disclosure` | `c0_contract_route == 1` | `c0_contract_route == 2` | 下一列,`gridRow = 0`,与拒绝彩蛋同列 | +| `c0_refusal_ending` | `c0_contract_route == 2` | `c0_contract_route == 1` | 下一列,分支行,与 C0-S04 同列 | + +`c0_public_disclosure` 与 `c0_refusal_ending` 不汇合:前者继续 Chapter 0 主线,后者是当前路线终点。两者虽在同一列,仍必须分别连接自 `c0_contract_decision`,并由相反的 Unlock/Forbidden 条件控制。 + +拒绝彩蛋与 C0-S04 不应登记为同一“互斥终点验证组”,因为 C0-S04 不是章节终点;互斥关系已经由路线变量与两个 Block 的条件完整表达。 + +## 九、Timeline Marker 与回滚语义 + +### Marker 配置 + +| 字段 | 建议值 | +|---|---| +| `markerId` | `c0_contract_decision_checkpoint` | +| `anchorBlockId` | `c0_contract_decision` | +| 显示文本 | 第五日 · 抉择 | +| `labelKey` | `story_c0_marker_contract_decision` | +| `progressValue` | 待 Chapter 0 全量 StoryData 排布后统一确定;本阶段不虚构百分比 | + +该 Important TextBlock 的 checkpoint 保存“进入抉择以前”的章节快照。玩家从拒绝彩蛋回滚后: + +- `c0_contract_decision` 恢复为 `Current`; +- `c0_contract_route` 恢复为 `0`; +- 接受/拒绝选项记忆被清除; +- `c0_refusal_ending` 的完成状态被清除; +- `c0_public_disclosure` 与 `c0_refusal_ending` 重新按未选择状态计算; +- 歌曲成绩、Settings、全局 Unlock Key 与其它章节不受影响。 + +### “拒绝不保存”的正式解释 + +拒绝路线会像其它正常 TextBlock 一样暂存为**当前章节的当前结局**,否则系统无法开放拒绝彩蛋、禁用接受后续或让玩家离开后继续读取该结局。它不会形成永久锁死:玩家可通过“第五日 · 抉择”Marker 读取进入决定前的 checkpoint,完整撤销路线变量、选项记忆与拒绝 TextBlock 完成状态。 + +因此,正式语义是“拒绝结局可被完整回滚,不作为不可撤销的永久结局”,而不是“运行期间完全不写入任何存档记录”。 + +## 十、Localization Key 与 MessageBox + +建议使用以下 Unity Localization Key;正式建表仍需在 StoryData/本地化集成阶段完成: + +| 用途 | Key | 简体中文源文本 | +|---|---|---| +| Timeline Marker | `story_c0_marker_contract_decision` | 第五日 · 抉择 | +| 拒绝回滚提示标题 | `story_c0_refusal_rewind_title` | 旅程在这里结束 | +| 拒绝回滚提示正文 | `story_c0_refusal_rewind_body` | 若希望返回选择之前,请点击时间轴上的“第五日 · 抉择”Marker,并读取该时间点的存档。 | + +拒绝彩蛋 Yarn 在结尾使用项目命令: + +```yarn +<> +``` + +`show_message` 必须等待拒绝 TextBlock 正常提交后显示;若玩家中途退出,不得留下孤立弹窗。 + +## 十一、情绪转折 + +1. **没有更多答案可等**:五日过去,房间和问题都与第一次会面相似,但选择已经无法继续推迟。 +2. **程序停止替人说话**:徐允雅完成核对,程衡不作最后动员,成年人真正把沉默留给曦。 +3. **玩家承担选择**:接受与拒绝都由玩家亲手确认,不由旁白替曦决定。 +4. **接受不是恐惧消失**:曦带着害怕签约,选择的可信度来自她仍然知道自己在害怕。 +5. **不可理解之物第一次到来**:镜的降临把此前停留在资料中的高维存在变成可见事实,推动玩家继续阅读。 +6. **镜保持距离**:它准确回答职责,却拒绝提供未来;序章不提前兑现它与曦的情感成长。 +7. **拒绝不是即时惩罚**:另一条路线让生活继续,也让唯一可能性安静关闭。 +8. **回滚属于玩家而非角色**:Marker 提示是叙事系统层的交互说明,不让故事内角色谈论存档或时间轴。 + +## 十二、连续性与 OOC 检查清单 + +- [ ] 曦在最终决定前仍表现出十七岁普通人的紧张与迟疑,没有突然成为成熟政治演说家。 +- [ ] 程衡与徐允雅没有以星联未来、唯一候选人或父母情感向曦施压。 +- [ ] 星联文件与神的契约被清楚区分;文件本身不包含飞升答案。 +- [ ] 神没有形体、声音或新增说明,只确认契约是否成立。 +- [ ] 镜的名字来自自我命名,并由它允许三维生命使用。 +- [ ] 镜保持上位者距离,不争论、不认错、不被说服,也不表现对曦的任务外感情。 +- [ ] 镜承认能观测时间,却不透露未来;不在本场说明进入异世界后的具体限制。 +- [ ] 镜没有宣称自己能判断献祭是否合格,也没有提前解释献祭后果。 +- [ ] 接受后仍有十至十五周准备窗口,母星旅行包含在该窗口内。 +- [ ] 拒绝不会导致即时灾难、家庭惩罚、公众猎巫或替代候选人。 +- [ ] C0-S04 与拒绝彩蛋处于同列不同路线行,且任何时刻只有一者可进入。 +- [ ] 拒绝结局的 Marker 提示只出现在 TextBlock 正常提交之后。 +- [ ] 正式 Yarn 人物台词使用 ASCII 英文冒号,旁白使用第三人称,避免无必要的过短换行。 + +## 十三、后续接口 + +- 用户批准本场景卡后,先编写 `C0_ContractDecision.yarn` 初稿,再单独编写 `C0_RefusalEnding.yarn` 初稿,便于分别审阅主线角色表演与彩蛋余味。 +- 两份 Yarn 获批前,不配置 StoryData Block、Marker、Localization Table 或人物/镜的视觉资源。 +- 接受路线下一场为 `C0-S04` 公众披露:公开全部当时已知事实,让曦成为星联公众眼中的英雄,并建立十至十五周告别与出发准备期。 +- C0-S04 不重复镜的完整首次介绍,只表现它开始公开陪同曦,以及社会如何面对一个不主动融入的高维观察者。 diff --git a/docs/chapter0-scene-04-public-disclosure-card.md b/docs/chapter0-scene-04-public-disclosure-card.md new file mode 100644 index 00000000..cb31de7d --- /dev/null +++ b/docs/chapter0-scene-04-public-disclosure-card.md @@ -0,0 +1,247 @@ +# Chapter 0 场景卡:C0-S04 向群星公开 + +> 状态:**已确认前置信息的场景设计稿,非 Yarn 台本** +> 用途:锁定契约成立后的全星联公共说明、公众首次看见曦与镜、英雄身份形成,以及曦从匿名学生转变为公共人物的叙事过程。 +> 本稿允许确定 Yarn 文件、Node、TextBlock 与 Localization Key 的建议命名;不在本阶段修改 StoryData、Localization Table、Prefab、C# 或正式 Yarn 台词。 + +## 一、场景定位 + +| 项目 | 内容 | +|---|---| +| 场景编号 | `C0-S04` | +| 暂定名称 | 向群星公开 | +| 时间 | 契约成立后的第二日上午;十至十五周履约窗口已经开始 | +| 主要地点 | `泽尼斯`公共事务中心的小型公共会堂及会堂外部公共区域 | +| 出场角色 | 曦、总统程衡、研究代表徐允雅、镜;父亲与母亲在镜头外陪同;公众通过实时公共频道参与 | +| 玩家状态 | 已选择接受契约,已经认识镜并理解其有限职责,但尚未经历身份向全星联公开后的社会反应 | +| 核心互动 | 三个固定顺序的单选项问题:自愿性、原有生活、公众能够提供的帮助 | +| 主线结果 | 星联公众获知当时的全部真相;曦成为公共意义上的英雄,获得鲜花、掌声与祝福,同时失去原有匿名生活 | + +## 二、设计分类与范围 + +本场属于既有 Chapter 0 主线中的 **Addition**:它不增加新的剧情路线或变量,只把接受路线已经发生的契约事实公开,并建立后续告别、母星旅行和出发准备的社会背景。 + +### 本场包含 + +- 契约成立后的第一场全星联实时公共说明; +- 星联对曦自愿选择、未知风险和个人边界的正式说明; +- 公众首次看见曦与镜; +- 镜用极少量发言确认身份和职责; +- 三个顺序固定、不会改变路线的公众问题; +- 曦第一次以自己的话回应全星联; +- 从沉默、理解到掌声、鲜花与大量祝福的公众反应; +- 程衡公开宣布针对曦与家人的隐私保护规则; +- 曦意识到自己仍能回家生活,却已经不再是匿名学生。 + +### 本场不包含 + +- 母星`阿斯特里亚`的正式旅行; +- 海底游览区、地下都市、大图书馆、天文台或恒星边缘; +- 献祭对象范围、抹除机制、干涉/不干涉路线和时间线基线; +- 神的形态、声音、动机或科技锁原理; +- 镜展示力量、接受实验、评价星联文明或回应无边界采访; +- 曦对公众承诺“一定成功”或“一定归来”; +- 新的具名配角;重要的新角色留给母星旅行阶段。 + +## 三、公开范围:当时的全部已知事实 + +“公众知道全部真相”指星联必须如实公布当时已经确认的内容,也必须同时公布未知边界。正式台本不得为了制造乐观气氛删去风险,也不得提前透露后续冒险才会发现的规则。 + +### 必须公开 + +1. 多名研究者经历相同梦境,并根据梦中通信密钥建立了不可归入已知技术的联系。 +2. 接触对象被称作“神”,没有向星联展示实体,也没有提供飞升理论。 +3. 神承诺在契约成立后解除阻碍星联继续研究第四维度的科技锁。 +4. 神指定十七岁的曦为唯一候选人,没有可验证的指定理由,也不存在第二位候选人。 +5. 曦拥有真实拒绝权,经历完整知情同意程序后自愿接受;政府、研究机构和家人均不能替她决定。 +6. 唯一明确的履约规则:曦需要在高维陪同者陪伴下前往多个世界,并在离开每个世界以前,献上一件自己真诚认为是当地最珍贵的事物。 +7. 星联不知道世界数量、旅程期限、献祭形式、对象范围、具体后果或曦能否归来。 +8. 契约已经成立且不可撤回;神允许十至十五周用于告别、旅行与出发准备。 +9. 镜是契约安排的四维陪同者、观察者与必要保护者;它不会替曦行动或作出献祭选择。 + +### 禁止公开为“事实” + +- 献祭会将目标从世界中抹除; +- 人、记忆、历史、概念或世界法则都可成为祭品; +- 干涉/不干涉对应不同结局; +- 镜进入异世界后将受到具体的时间线观测限制; +- 镜能够在献祭完成后观测哪些未来; +- 神来自第六维度,或“剧场”与现实玩家/制作者的关系; +- 曦必然成功、必然归来,或星联必然完成飞升。 + +## 四、空间与视觉基调 + +### 小型公共会堂 + +公共说明不应被设计成庆典、加冕或军事动员。会堂规模克制,中央是与普通公共事务说明相同高度的平台;程衡、徐允雅与曦使用同一水平线,不设置把曦单独托举到高处的英雄席位。 + +- 背景不使用夸张的星联旗帜阵列、倒计时或“文明救世主”标语。 +- 会堂没有记者拥挤围堵。公共频道接收全星联问题,由独立系统去除骚扰、重复与私人信息,再按公开规则呈现。 +- 父母在平台侧后方、镜头外的可见位置陪同。曦回头时能够看见他们,但公众画面不把他们当作宣传素材。 +- 曦穿整洁的日常服装或校服,不使用礼服、制服、王冠、勋章或专为使命设计的英雄服装。 +- 镜以完整的万华镜投影公开出现,悬停在曦侧后方。它不缩成人形迎合观众,也不扩大形体制造威慑。 + +### 公共反应的视觉层次 + +1. 公共说明开始时,会堂外没有提前摆满鲜花,也没有预录掌声。 +2. 公布唯一候选人和未知风险后,公共频道首先出现明显的停顿;这段沉默代表公众真正理解曦可能无法归来。 +3. 曦完成个人回应后,会堂内才出现第一轮掌声。 +4. 随着直播传播,普通公民、学生、研究者和不同世界的居民开始发送祝福。 +5. 鲜花从公共说明结束以后逐渐送达,表现为社会自发反应,而不是政府预先布置的仪式道具。 + +## 五、角色目标与表演边界 + +### 曦 + +- **表层目标**:在不背诵政治稿件的情况下,让公众知道接受契约的人真实存在,也仍然害怕未知。 +- **真实状态**:面对整个星联比面对神的通信装置更具体、更令人紧张。她会担心说错话,也会对所有人突然知道自己的名字感到不适应。 +- **外在表现**:上台前反复确认衣领、询问是否必须直视镜头、在公共频道开始计数时忘记原本准备好的第一句话。 +- **个人回应**:不承诺成功或归来,不说“为了所有人牺牲自己”。她可以承认自己爱家园、对未知世界好奇,也可以承认仍然害怕。 +- **对公众的请求**:希望大家不要把十几周准备期全部变成告别仪式;允许她继续上学、与父母吃饭,并真正完成一次母星旅行。 +- **场末变化**:她仍能回家,却第一次意识到原有的匿名生活已经结束。 + +### 程衡 + +- **场景目标**:代表星联公开事实和政府责任,而不是把曦包装成政治象征。 +- **必要说明**:星联珍视交易带来的机会,但曦的接受不是国家命令;文明的希望不能转化为公众对个人的无限索取。 +- **制度承诺**:禁止跟踪、骚扰或私下接触曦及其家人;采访、研究、纪念活动和公开邀请必须经过本人同意。 +- **语言边界**:不称曦为“唯一救世主”,不煽动全体公民要求她成功,不以掌声迫使她作出更多承诺。 + +### 徐允雅 + +- **场景目标**:公开验证知情同意过程,区分事实、推测与未知,防止公共传播把复杂契约压缩成英雄神话。 +- **必要说明**:她可以公开自己同时承担研究验证与程序监督职责,并明确说明所有已知风险已经向曦及父母提供。 +- **问题职责**:回答“曦是否完全自愿”,并在公众提问偏离已知边界时指出星联没有答案。 +- **语言边界**:不把程序正确等同于契约安全,不宣称未知风险已经受到控制。 + +### 镜 + +- **场景目标**:确认自己是契约安排的陪同者及必要保护者,随后保持观察。 +- **公开发言量**:一至两段完整回答,足以让公众确认它不是影像或星联制造的装置。 +- **命名**:向公众重复“你们可以称呼我为镜”,说明这是它为自己选择并允许三维生命使用的称谓。 +- **态度**:平和、准确、保持上位者距离;不因为数以亿计的观众而调整语气,也不把掌声视为需要回应的礼节。 +- **拒答边界**:不透露未来,不说明任务细节,不展示能力,也不因为公众敬畏而变得友善或傲慢表演化。 + +### 父亲与母亲 + +- **位置**:全程在镜头外陪同,必要时帮助曦在上台前稳定情绪,但不参与正式发言。 +- **边界**:不被介绍为“培养英雄的父母”,不被要求对全星联表态,也不在公众面前压抑所有恐惧。 +- **场末作用**:公开说明结束后仍以“要不要回家吃饭”等具体问题把曦拉回普通生活。 + +## 六、场景推进顺序 + +1. **契约成立后的第一夜**:简短承接 C0-S03。星联准备公开说明,家庭拒绝连夜接受采访;镜公开陪同,却不参与家庭谈话。 +2. **第二日上午抵达会堂**:曦穿日常服装抵达,发现会堂比想象中小,却知道画面将同步到所有都市世界。 +3. **父母留在镜头外**:父母确认会在原处等待。曦担心自己忘词,母亲提醒她不需要完成一篇完美演说。 +4. **公共频道开启**:程衡先说明为什么必须公开全部事实,并承诺不会用国家利益要求公众向曦继续施压。 +5. **接触事实与交易内容**:徐允雅依次说明共同梦境、通信密钥、科技锁、唯一候选人与唯一已知履约规则。 +6. **未知边界完整公开**:徐允雅明确列出所有无法回答的问题,包括献祭后果和返程可能。 +7. **曦的自愿性**:程衡说明最终选择来自曦本人,任何政府或家庭成员都没有替她签约。 +8. **镜公开确认身份**:镜以一至两段回答确认自己是四维陪同者和必要保护者,并允许公众称呼它为镜。 +9. **公众问题一——自愿性**:玩家用单选项推进“听徐允雅说明她是否完全自愿”。徐允雅公开知情同意过程与拒绝权。 +10. **公众问题二——原有生活**:玩家用单选项推进“听程衡说明她还能否继续原来的生活”。程衡说明准备期属于曦,她仍可上学、与家人生活和完成母星旅行。 +11. **公众问题三——能够做什么**:玩家用单选项让曦亲自回答。她感谢关心,同时请求公众不要把每一天都变成告别或要求她证明无所畏惧。 +12. **沉默先于掌声**:公开频道短暂安静。掌声从会堂内少数人开始,逐渐扩散到不同世界的公共画面。 +13. **祝福与鲜花出现**:直播结束后,公共频道上的祝福数量迅速增加,会堂外开始收到普通公民自发送来的鲜花。 +14. **制度保护立即生效**:程衡宣布私人联系、跟踪、研究邀请和商业使用均须经过同意;星联提供过滤渠道,但不替曦决定接受哪些善意。 +15. **匿名生活结束**:曦第一次看见自己的名字出现在整个星联公共频道。她没有立即获得英雄的笃定,只感到全世界突然离自己太近。 +16. **回到具体生活**:父母问她是否先回家。镜保持不远不近的陪同距离,不评价掌声、鲜花或曦的情绪。 +17. **场景收束**:曦带着第一束真正送到手中的鲜花离开会堂,下一阶段进入十至十五周告别、旅行与出发准备期。 + +## 七、玩家互动设计 + +本场为接受路线上的线性主线。三个问题固定顺序出现,每次只有一个选项,不新增剧情变量,也不改变后续 Node 路线。 + +| 顺序 | 公共问题 | 单选项意图 | 回答者 | 叙事作用 | +|---|---|---|---|---| +| 1 | “她真的是完全自愿的吗?” | 听徐允雅说明知情同意过程 | 徐允雅 | 用可验证程序证明道德边界,而非要求玩家相信政府自述 | +| 2 | “她在出发前还能继续原来的生活吗?” | 听程衡说明准备期与保护规则 | 程衡 | 建立后续母星旅行、上学和家庭生活的合理性 | +| 3 | “我们能够为她做些什么?” | 让曦亲自回答这个问题 | 曦 | 把公众善意的边界交还给当事人,并表现她尚未适应英雄身份 | + +三个问题不得合并成一个三选一选择组,否则玩家无法在一次游玩中取得全部必要信息。不得为这些互动写入 Bool 或 Int;Yarn 选项记忆已经足以支持 TextBlock 回顾。 + +## 八、Yarn、TextBlock 与 StoryData 接口 + +### 建议 Yarn 文件与 Node + +| 用途 | 建议值 | +|---|---| +| Yarn 文件 | `C0_PublicDisclosure.yarn` | +| 入口 Node | `C0_PublicDisclosure` | +| TextBlock ID | `c0_public_disclosure` | +| TextBlock 类型 | `Important` | +| 标题 Localization Key | `story_c0_block_public_disclosure` | +| 简体中文标题 | 向群星公开 | + +建议内部 Node: + +- `C0_PublicDisclosure_VoluntaryQuestion` +- `C0_PublicDisclosure_OrdinaryLifeQuestion` +- `C0_PublicDisclosure_PublicSupportQuestion` +- `C0_PublicDisclosure_AfterBroadcast` + +### Block 条件与布局 + +| 字段 | 配置 | +|---|---| +| Unlock Condition | `c0_contract_route == 1` | +| Forbidden Condition | `c0_contract_route == 2` | +| 布局 | 位于 `c0_contract_decision` 下一列,`gridRow = 0` | +| 同列分支 | `c0_refusal_ending` 位于同列的另一行 | +| 新增剧情变量 | 无 | +| 新增 Timeline Marker | 无;沿用上一列“第五日 · 抉择”作为最近回滚点 | + +本场与拒绝彩蛋不会汇合。`c0_public_disclosure` 完成后继续接受路线的准备期内容;`c0_refusal_ending` 是拒绝路线终点。 + +## 九、Localization 与资源需求 + +### 本场新增 Localization Key + +| 用途 | Key | 简体中文源文本 | +|---|---|---| +| TextBlock 标题 | `story_c0_block_public_disclosure` | 向群星公开 | + +公共问题和正式台词的 `#line` 标签仍由 Yarn 工具在文本批准后生成,不在场景卡阶段手工创建。 + +### 角色与演出资源 + +- 曦:日常服装或校服;紧张、勉强微笑、认真回应、被掌声惊到等有限表情。 +- 程衡:正式但不华丽的公共职务服装;克制、严肃。 +- 徐允雅:研究代表服装;清晰说明、关注曦状态。 +- 镜:沿用 C0-S03 万华镜投影;无需人形肖像。 +- 父亲、母亲:只在上台前和直播结束后出现,不需要公共舞台站位。 +- 公共频道:问题文本、不同世界的实时观看窗口、祝福数量增长表现。 +- 鲜花:直播后逐渐出现,不在开场预先铺满会堂。 + +## 十、情绪转折 + +1. **公开比签约更具体**:神仍然没有形体,但遍布诸多都市世界的真实观众会看见曦的每一次停顿。 +2. **事实压住英雄神话**:未知风险被完整公开,公众无法只把交易理解为没有代价的文明捷径。 +3. **镜证明异常真实存在**:它只用少量发言确认身份,不把场景变成高维能力展示。 +4. **公众首先沉默**:人们先理解曦可能无法归来,掌声才具有真正的情感重量。 +5. **曦第一次划定公共边界**:她感谢善意,也请求保留普通生活,而不是被动接受所有期待。 +6. **鲜花温暖但也沉重**:英雄身份来自无数人的真实感激,同时让曦意识到自己已经被整个文明认识。 +7. **镜仍然置身其外**:它观察社会反应,不因此理解或认同三维情感。 +8. **家庭把宏大事件拉回日常**:直播结束后,父母仍然先问她是否回家。 + +## 十一、连续性与 OOC 检查清单 + +- [ ] 公众得到当时全部已知事实与未知边界,没有提前得知献祭抹除机制。 +- [ ] 曦穿日常服装,没有被塑造成预先准备好的职业英雄。 +- [ ] 曦紧张、可能忘词,不发表成熟完整的政治演说。 +- [ ] 程衡承担制度责任,不把公众期待转化为对曦的进一步强迫。 +- [ ] 徐允雅不把知情同意程序解释为契约安全证明。 +- [ ] 镜只确认身份与职责,不展示能力、不评价文明、不透露未来。 +- [ ] 父母处于镜头外,没有被作为英雄家庭宣传。 +- [ ] 掌声和鲜花发生在事实公开及曦回应以后,不是政府提前安排。 +- [ ] 三个公共问题按固定顺序出现,每次单选,不新增变量。 +- [ ] 本场不使用 `<>`、`<>` 或 `$variable`。 +- [ ] 人物台词使用 ASCII 英文冒号,旁白使用第三人称,避免非必要短句。 +- [ ] 场末只建立准备期和母星旅行接口,不直接跳到`阿斯特里亚`景点。 + +## 十二、后续接口 + +- 用户批准本场景卡后,编写 `C0_PublicDisclosure.yarn` 初稿。 +- Yarn 获批前,不配置 StoryData、Localization Table、公共频道 UI 或人物资源。 +- 下一阶段进入十至十五周履约窗口中的正式告别与母星旅行准备。 +- 母星旅行仍按时间顺序展开;新的具名角色和景点冲突点在各自场景卡中单独确认。 diff --git a/docs/chapter0-scene-05-old-life-preparation-card.md b/docs/chapter0-scene-05-old-life-preparation-card.md new file mode 100644 index 00000000..43e72a8e --- /dev/null +++ b/docs/chapter0-scene-05-old-life-preparation-card.md @@ -0,0 +1,291 @@ +# Chapter 0 场景卡:C0-S05 最后一段普通生活 + +> 状态:**已确认前置信息的场景设计稿,非 Yarn 台本** +> 用途:锁定曦公开身份后的返校、旧日生活变化、轻量出发准备,以及离开`泽尼斯`日期确定以前的叙事过程。 +> 本稿允许确定 Yarn 文件、Node、TextBlock 与 Localization Key 的建议命名;不在本阶段修改 StoryData、Localization Table、Prefab、C# 或正式 Yarn 台词。 + +## 一、场景定位 + +| 项目 | 内容 | +|---|---| +| 场景编号 | `C0-S05` | +| 暂定名称 | 最后一段普通生活 | +| 时间 | `C0-S04` 结束后的第二天开始,持续约十日;场末为离开`泽尼斯`的前一日下午 | +| 主要地点 | `泽尼斯`的公共交通、曦所在学校、实践教室、家庭住宅与公共出发准备设施 | +| 出场角色 | 曦、镜、教师、不具名同学群像;父亲与母亲在家庭片段中出现 | +| 玩家状态 | 已接受不可撤回的契约,已经成为全星联知晓的公共人物,但尚未离开原来的学校和生活环境 | +| 核心互动 | 三个固定顺序的单选项互动:照常讨论旧实践记录、参加正常实践课、把旧多功能探针放入行李 | +| 主线结果 | 曦完成返校、基础出发准备与私人行李整理;离开`泽尼斯`的具体日期确定,正式家庭告别留到 `C0-S06` | + +## 二、设计分类与场景职责 + +本场属于 Chapter 0 接受路线上的 **Addition**,不增加分支、结局或永久变量。它承担 `C0-S04` 公共身份形成与 `C0-S06` 正式家庭告别之间的必要过渡,但不能只写成快速蒙太奇。 + +本场的核心问题不是“曦是否后悔签约”,而是:**一个人被整个文明视作英雄以后,是否还能够在离开前真实地过几天原来的生活。** + +### 本场必须完成 + +- 让玩家第一次看见科研居住世界`泽尼斯`的日常全貌; +- 回收 `C0-S01` 中被总统会面打断、并于 `C0-S04` 开场前补交的学校实践观察记录; +- 表现星联公众尊重曦的边界,但善意仍会不可避免地改变人与她相处的方式; +- 让曦主动参加一堂正常的实践课,而不是被学校当作需要陈列或隔离的英雄; +- 用轻量片段表现健康基线、环境适应和旅行装备等出发准备; +- 让曦亲手选择一件私人旧物放进行李,表现她不是只属于任务的人; +- 明确`泽尼斯`至`阿斯特里亚`的离开日期,给 `C0-S06` 建立直接接口。 + +### 本场不得完成 + +- 不进行曦与父母的最终当面告别; +- 不进入星际客运枢纽的登乘区,不让飞船或列车正式离开`泽尼斯`; +- 不抵达`阿斯特里亚`,不提前展示母星景点; +- 不再举行一次公众大会、英雄授勋或大型送别仪式; +- 不引入具名教师、挚友或承担长期冲突的新角色; +- 不暗示学校生活可以在契约期间恢复如初; +- 不让曦重新讨论是否撤回契约,因为签约已经不可撤回; +- 不公开献祭的未知细节,也不补充神没有说明的新规则; +- 不让镜因学校、家庭或公众善意而承认自身判断不足或产生情感变化。 + +## 三、时间安排 + +本场严格按时间顺序推进,不使用倒叙或主题交叉剪辑。 + +| 时间 | 内容 | +|---|---| +| 公开说明后的第二天 | 曦乘公共交通返校,第一次以公共人物身份回到熟悉环境 | +| 当日上午 | 像往常一样讨论已经补交的实践记录,与教师及同学重新建立相处边界 | +| 当日下午 | 主动参加一堂正常的装置实践课 | +| 随后约八日 | 健康基线、环境适应、旅行终端与衣装测试;其余时间仍在家中度过 | +| 离开前一日下午 | 曦与父母整理私人行李,收到次日出发确认 | + +`泽尼斯`阶段合计约占十至十五周履约窗口中的前一至两周。后续大部分时间用于`阿斯特里亚`母星旅行、恒星边缘路线和最终跨界准备。正式 Yarn 不必逐日记录八天内的全部检查,但每次时间推进都要给出明确标识,避免产生“一天内完成所有准备”的错觉。 + +## 四、环境与社会风貌 + +### 科研居住世界泽尼斯`泽尼斯`不是贫乏或冰冷的工业世界,而是一个功能高度专业化、生活舒适稳定、旅游吸引力有限的都市星球。 + +- 城市主要服务科研、设备验证、制造维护和居民生活;实验楼、环境调节塔、自动物流线与住宅区彼此紧密连接。 +- 建筑风格整洁、可靠、模块化,新设施会随研究需求更新,因此缺少`阿斯特里亚`那种跨越漫长时代的历史层积。 +- 公共交通照常运行,不因曦出行清空车站或停止普通班次。 +- 公民普遍能认出曦与镜,却遵守公开说明后的隐私规则。有人会多看几眼、点头或让出空间,但不会围堵、偷拍视频或强行采访。 +- 这颗星球“不适合旅游”的单调感来自它将可靠与便利做得过于日常,而不是科技落后、文化贫瘠或居民冷漠。 + +### 学校 + +学校不临时改造成纪念场所,也不把曦的座位围起来展示。 + +- 校方取消所有未经曦同意的采访、演讲和合影安排,但不封锁整栋建筑,也不让她从秘密通道进入。 +- 教室仍保留她原来的位置、课程终端和已经提交却尚未讨论的记录;这些具体事物比欢迎标语更能证明她曾在这里生活。 +- 同学们最初明显安静,担心普通闲聊会显得不尊重。教师需要帮助大家理解“保持边界”不等于假装曦不存在。 +- 学校允许同学表达祝福,但不组织全班逐一发表告别感言,避免把返校日变成又一场正式送别。 + +### 出发准备设施 + +准备流程体现技术先进,但不进行设备清单式说明。 + +- 健康基线用于让镜和星联医疗人员识别曦在异世界的身体变化,并不保证所有未知环境都安全。 +- 环境适应衣装能够调节常见温度、压力与空气差异,但不是无条件生存装甲。 +- 旅行终端具有记录、翻译、离线资料和本地装置连接功能;具体能力在以后真正使用时再解释。 +- 常用医疗物资和个人衣物可以随行,普通私人物品原则上也可进入跨界通道。 +- 镜只确认这些物品不会妨碍履约,不承担星联设备讲解员职责。 + +## 五、角色目标与表演边界 + +### 曦 + +- **表层目标**:交回实践记录、上一天课,并证明自己至少还能完成一些原来的事情。 +- **真实状态**:她期待回到熟悉环境,又害怕所有熟悉的人已经不知道该如何与她说话。 +- **年龄表现**:会在进入教室前犹豫,会用玩笑缓解尴尬,也会因为同学突然过分客气而不知道如何回应;不能像成熟公共人物一样从容管理所有人的情绪。 +- **关键主动性**:是曦自己要求参加实践课,不是教师用“保持正常”强迫她完成课程。 +- **对善意的态度**:她不会责备同学紧张,但会请求大家不要把每句话都当成可能载入历史的临别赠言。 +- **场末状态**:她没有重新获得真正的普通生活,却完成了几件仍属于原来自己的事,并开始接受离开日期已经具体到“明天”。 + +### 镜 + +- **场景位置**:以万华镜形态全程公开陪同,通常悬停在不妨碍教学和通行的位置。 +- **发言频率**:低。它不会对每件设施、礼节或课程评价效率,也不会主动加入同学闲聊。 +- **可用判断**:它可以准确指出,公众得知契约以后改变的是“对曦的预期”,并非突然获得了对曦的完整理解。 +- **课堂边界**:不会替曦解答实践题,也不会展示四维能力帮助教学。若有人询问,它可以明确说明自己不承担改善三维课程结果的职责。 +- **准备边界**:只审核随行物是否妨碍契约与跨界,不承诺装备能够应对全部世界。 +- **OOC 禁区**:不说“我也许误解了你们”,不赞美学校或家庭,不从同学的善意中学习三维情感,不主动安慰曦,也不表现出任务之外的依恋。 + +### 教师 + +- **角色职能**:代表星联制度落实到普通生活时的执行者,而不是新的思想导师。 +- **初始顾虑**:担心要求曦继续课程会成为另一种压力,因此提前准备了免除全部课程与远程完成记录的方案。 +- **正确边界**:把是否参加课程交给曦决定,并提醒同学可以正常交谈,但不能要求她承担采访、解释契约或安抚全班的责任。 +- **表现方式**:温和、专业,会承认自己也不知道怎样才算“完全正常”,因此愿意听曦说明她此刻需要什么。 +- **人物密度**:不命名,不建立个人身世或母星旅行支线。 + +### 同学群像 + +同学承担不同形式的善意与距离感,但不形成固定挚友角色。 + +- 有人准备了很长的正式祝福,面对曦时却只说出一句普通问候; +- 有人下意识替曦收拾器材,随后发现她其实想自己完成; +- 有人想询问镜,却先征得曦与教师同意; +- 有人仍然记得她欠下的实践记录或过去的装置事故,用日常玩笑短暂打破凝重气氛; +- 没有人嫉妒、羞辱或指责她,也没有人宣称她必须成功才配得上公众支持。 + +### 父亲与母亲 + +- **本场职能**:参与行李整理和日常晚餐,不在本场完成最后告别。 +- **父亲**:倾向检查能够实际处理的事项,可以拿出曦从小使用的旧多功能探针,却不宣称它能在异世界解决高维问题。 +- **母亲**:关注衣装、健康记录与私人照片是否带齐,会提醒曦不需要为了任务放弃所有没有“用途”的东西。 +- **共同边界**:不要求曦承诺回来,不把每一顿饭提前写成最后一餐,也不假装次日离开只是普通旅行。 + +## 六、核心道具回收 + +### 未完成的实践观察记录 + +该记录承接 `C0-S01` 开篇。它应当足够普通,例如城市环境调节设备的运行观察或学校附近公共装置的维护记录。 + +- 它不是发现神、镜或科技锁的伏笔; +- 它不因为曦成为英雄而自动获得特殊价值; +- 教师可以告诉曦,她完全没有必要再回来接受讨论,系统已经记录这份作业完成; +- 曦仍选择像往常一样听取问题并解释自己跳过标准校准流程的原因,因为这是契约发生以前由她自己开始的事情; +- 讨论记录不代表她已恢复正常,只代表宏大事件没有使此前的一切失去意义。 + +### 旧多功能探针 + +父亲在整理工具时拿出一支曦十二岁起使用的旧探针。它是普通、耐用、略显过时的民用工具,承接曦对机械装置的直觉亲和力。 + +- 探针不具备隐藏力量,不是文明最高科技的缩影; +- 曦携带它主要因为熟悉与私人记忆,而不是因为它必然有用; +- 未来章节可以在合理情况下使用,也可以长期只作为随身物品; +- 它不登记为剧情变量,不要求用选择记录“是否携带”,因为线性主线中曦会固定带走它。 + +## 七、场景推进顺序 + +1. **返校路上**:公开说明后的第二天,曦和镜乘坐普通公共交通前往学校。附近居民认出她,却只保持礼貌距离。 +2. **熟悉环境出现变化**:学校建筑、路线和课程时间完全没有改变,同学看向曦的方式却已经不同。她在教室门外第一次不敢像往常一样直接推门。 +3. **教师先确认边界**:教师说明她可以不上课、远程完成学业或立刻回家,所有采访请求也已被拒绝。曦反而因为选择太多而更加局促。 +4. **回到原来的座位**:教室没有欢迎仪式。同学的问候过分整齐,曦试图用一件过去的课堂小事打破沉默。 +5. **重新打开旧记录**:教师调出曦在公开说明前一晚补交的实践观察记录,并说明系统已经将它记为完成,她没有必要再接受课堂讨论。 +6. **玩家互动一**:单选项“像以前一样,先讨论那份实践记录。”曦说明自己不是为了成绩,只是不想让那天以前的事情全部停在那里。 +7. **同学尝试正常交谈**:有人询问她是否真的会去母星、是否能继续联系家里,也有人在得到许可后询问镜。回答只停留在公开事实和当前行程。 +8. **镜精准指出变化**:镜可以说明,同学并非突然更了解曦,而是知道她即将离开以后,开始重新衡量每句话可能留下的意义。它不评价这种行为正确与否。 +9. **是否参加实践课**:教师再次给曦退出机会。同学也因为担心给她添麻烦,准备替她完成装置操作。 +10. **玩家互动二**:单选项“参加今天的实践课。”曦要求自己完成操作,也允许同学像过去一样指出她的错误。 +11. **实践课恢复节奏**:装置出现普通的小故障或校准偏差。曦凭直觉找到接口问题,但仍需要同学递工具、教师确认安全流程;她不是突然无所不能。 +12. **一段真正普通的时间**:课堂短暂忘记契约,直到镜面反光或公共频道提示再次提醒众人,曦即将离开。 +13. **返校日收束**:同学不逐一告别,只把课程资料、留言和一张未经修饰的集体照片交给她。曦没有承诺一定回来补课。 +14. **八日准备推进**:以明确日期提示串联健康基线、衣装测试、旅行终端校验和在家吃饭等片段。镜只回答必要的跨界携带问题。 +15. **整理私人行李**:离开前一日下午,父母和曦发现官方装备占用空间很少,真正难决定的是哪些没有任务用途的东西仍值得携带。 +16. **旧探针出现**:父亲从工具箱中找出旧多功能探针,先承认它可能没有实际价值,再把是否携带交给曦。 +17. **玩家互动三**:单选项“把旧探针放进随身包。”曦以轻松语气承认自己只是用惯了它,不把决定写成庄严传承。 +18. **离开日期具体化**:旅行终端收到次日上午前往星际客运枢纽的确认,目的地为母星`阿斯特里亚`。 +19. **场景收束**:曦看见行程中的“明日”,才意识到准备期已经不再是一段模糊的以后。父母继续讨论早餐与港口交通,把正式告别留到下一场。 + +## 八、玩家互动设计 + +本场为接受路线上的线性主线。三次互动按固定顺序出现,每次只有一个选项;选项不改变剧情变量、道具状态或后续 Node 路线。 + +| 顺序 | 单选项文本 | 叙事作用 | 结果 | +|---|---|---|---| +| 1 | 像以前一样,先讨论那份实践记录。 | 让玩家主动完成契约发生以前遗留的普通责任 | 教师照常点评记录,课程不产生分支 | +| 2 | 参加今天的实践课。 | 让玩家亲手选择一小段正常生活,而非被制度安排“恢复正常” | 曦参加实践课,完成群像互动 | +| 3 | 把旧探针放进随身包。 | 让玩家确认曦会带走一件只有私人意义的普通物品 | 探针固定随行,不写入变量 | + +这些互动不得合并成三选一,不得增加 `Bool` 或道具变量。它们的作用是控制阅读节奏和强化玩家参与感,而不是制造虚假的路线差异。 + +## 九、Yarn、TextBlock 与 StoryData 接口 + +### 建议 Yarn 文件与 Node + +| 用途 | 建议值 | +|---|---| +| Yarn 文件 | `C0_OldLifePreparation.yarn` | +| 入口 Node | `C0_OldLifePreparation` | +| TextBlock ID | `c0_old_life_preparation` | +| TextBlock 类型 | `Important` | +| 标题 Localization Key | `story_c0_block_old_life_preparation` | +| 简体中文标题 | 最后一段普通生活 | + +建议内部 Node: + +- `C0_OldLifePreparation_ReturnToSchool` +- `C0_OldLifePreparation_PracticalLesson` +- `C0_OldLifePreparation_TravelChecks` +- `C0_OldLifePreparation_Packing` + +### Block 条件与布局 + +| 字段 | 配置 | +|---|---| +| Unlock Condition | `c0_contract_route == 1` | +| Forbidden Condition | `c0_contract_route == 2` | +| 前置 Block | `c0_public_disclosure` 完成 | +| 布局 | 位于 `c0_public_disclosure` 的下一列,接受路线 `gridRow = 0` | +| 新增剧情变量 | 无 | +| 新增 Timeline Marker | 无;仍以“第五日 · 抉择”为最近回滚点 | + +本场完成后开放 `C0-S06`,但不以新的永久变量记录“探针已携带”或“返校已完成”。TextBlock 完成状态已经足够表达线性进度。 + +## 十、Localization 与资源需求 + +### 新增 Localization Key + +| 用途 | Key | 简体中文源文本 | +|---|---|---| +| TextBlock 标题 | `story_c0_block_old_life_preparation` | 最后一段普通生活 | + +正式台词、选项和环境旁白的 `#line` 标签仍由 Yarn 工具在文本批准后生成,不在场景卡阶段手工创建。 + +### 角色与演出资源 + +- 曦:日常校服或学校常服;迟疑、尴尬、松一口气、专注操作、勉强开玩笑等表情。 +- 镜:沿用万华镜投影;以背景悬停和镜面缓慢重组为主,不需要情绪化动画。 +- 教师:可使用不具名通用角色表现;无需建立后续角色档案。 +- 同学:以少量远景、公共频道头像或无立绘台词组成群像,避免一次新增大量肖像。 +- 父亲、母亲:沿用家庭场景资源;本场表演克制,不使用正式告别姿态。 +- 场景背景:`泽尼斯`公共交通、学校走廊、教室/实践室、简化准备设施、家庭客厅。 +- 道具:旧实践记录、教学装置、旅行终端、环境适应衣装、行李包、旧多功能探针。 + +## 十一、文本节奏与演出要求 + +- 旁白使用第三人称,并以曦的感知为主要视角;不得称玩家为“你”。 +- 人物台词使用 ASCII 英文冒号。 +- 换行即一次对话推进。除教室门口短暂停顿、收到离开日期等必要留白外,避免五六个字单独构成一页。 +- 返校段应占主要篇幅,准备检查使用有明确日期的简洁片段,行李整理再次放慢节奏。 +- 不以长篇科技说明展示文明先进,优先通过“复杂流程安静运行、普通公民遵守边界、曦仍能乘公共交通”表现社会状态。 +- 幽默来自熟悉的人际关系、普通课堂事故和曦的无奈吐槽,不让镜频繁充当冷笑话角色。 +- 镜的每次完整发言都应命中一个关键事实;若一句话只是在重复“高效/低效”或替旁白总结情绪,应删除。 +- 课堂恢复日常的片段可以温暖,但不得让玩家误以为曦已经放下恐惧或与所有人完成了充分告别。 + +## 十二、情绪转折 + +1. **熟悉的路第一次需要勇气**:公开身份没有改变学校位置,却改变了曦推开教室门的难度。 +2. **善意制造距离**:同学越想尊重她,越容易让每句话显得像正式告别。 +3. **旧记录仍然值得完成**:契约没有让此前的普通责任和兴趣失去意义。 +4. **正常来自当事人的选择**:曦主动参加实践课,而不是被别人规定应该坚强或应该休息。 +5. **课堂短暂忘记英雄身份**:普通故障、协作与玩笑让她重新成为同学中的一员,但这种状态不能永久维持。 +6. **准备把未知变成可操作事项**:检查无法消除风险,却让曦知道明天该做什么。 +7. **无用之物证明私人生活存在**:旧探针没有宏大使命价值,仍然值得占据行李的一小部分。 +8. **“明天”终止模糊等待**:真正的告别尚未发生,离开却已经拥有了具体时间。 + +## 十三、连续性与 OOC 检查清单 + +- [ ] 本场发生在 `C0-S04` 之后,没有重复公开契约或举办第二次英雄仪式。 +- [ ] 曦已知契约不可撤回,不重新讨论接受/拒绝路线。 +- [ ] `泽尼斯`是高度发达的科研居住世界,不被写成落后、压抑或只有灰色工厂的地方。 +- [ ] 曦此前没有去过`阿斯特里亚`;母星仍是下一阶段第一次亲身抵达。 +- [ ] 同学与教师不掌握献祭机制,不提出只有后续冒险才可能回答的问题。 +- [ ] 学校保护隐私但不隔离曦,公众礼貌也不等于所有人毫无好奇心。 +- [ ] 曦表现出十七岁少女的紧张、尴尬和不完全成熟,不发表完整的英雄人生总结。 +- [ ] 镜全程保持任务距离,不争辩、不劝慰、不承认错误、不发生观念转变。 +- [ ] 镜在序章仍可观测完整时间线,但不对外透露未来,也不以未来信息帮助课堂或准备流程。 +- [ ] 旧实践记录只是普通学校任务,不成为高维事件伏笔。 +- [ ] 旧探针是普通私人道具,没有隐藏力量,也不新增剧情变量。 +- [ ] 准备装备不被写成全能保障,星联仍不知道目标世界环境。 +- [ ] 本场没有完成最终父母告别,没有让父母陪同前往母星。 +- [ ] 三个互动固定顺序、每次单选,不增加变量或路线分支。 +- [ ] 本场不使用 `<>`、`<>` 或 `$variable`。 +- [ ] 场末只确定次日离开,正式登乘与离别留给 `C0-S06`。 + +## 十四、后续接口 + +- 用户批准本场景卡后,编写 `C0_OldLifePreparation.yarn` 初稿。 +- Yarn 获批以前,不配置 StoryData、Localization Table、学校资源或新道具资源。 +- `C0-S06` 从离开`泽尼斯`的最后一个清晨开始,完成家中最后早餐、星际客运枢纽告别、民用超光速航行与抵达`阿斯特里亚`。 +- 曦在进入跨界通道以前仍可与父母远程通信;`C0-S06` 的当面离别不等于立即永久失联。 +- `C0-S06` 结束于曦第一次看见母星,并转乘前往海洋深层起点的行星交通;【海底游览区】另立 `C0-S07` 场景卡。 diff --git a/docs/chapter0-scene-06-departure-to-asteria-card.md b/docs/chapter0-scene-06-departure-to-asteria-card.md new file mode 100644 index 00000000..76e979d3 --- /dev/null +++ b/docs/chapter0-scene-06-departure-to-asteria-card.md @@ -0,0 +1,320 @@ +# Chapter 0 场景卡:C0-S06 离开泽尼斯,前往母星 + +> 状态:**已确认前置信息的场景设计稿,非 Yarn 台本** +> 用途:锁定曦离开`泽尼斯`当日的家庭告别、民用星际航行、第一次亲眼看见母星`阿斯特里亚`,以及转乘前往海洋深层起点的叙事过程。 +> 本稿允许确定 Yarn 文件、Node、TextBlock 与 Localization Key 的建议命名;不在本阶段修改 StoryData、Localization Table、Prefab、C# 或正式 Yarn 台词。 + +## 一、场景定位 + +| 项目 | 内容 | +|---|---| +| 场景编号 | `C0-S06` | +| 暂定名称 | 离开泽尼斯,前往母星 | +| 时间 | `C0-S05` 结束后的次日上午至当日稍晚;仍处于十至十五周履约窗口前段 | +| 主要地点 | 曦家、`泽尼斯`公共交通与星际客运枢纽、民用超光速客运航线、`阿斯特里亚`轨道交通枢纽及行星纵向交通线 | +| 出场角色 | 曦、父亲、母亲、镜;少量不具名旅客、儿童和客运工作人员组成环境群像 | +| 玩家状态 | 已完成返校与基础准备,行李已经收好;知道当面告别即将发生,但进入跨界通道以前仍可与父母远程通信 | +| 核心互动 | 三个固定顺序的单选项互动:像平常一样吃完早餐、在登乘边界拥抱父母、第一次看见母星时先独自观看 | +| 主线结果 | 曦与父母完成最后一次当面告别,离开真正生活过的`泽尼斯`,抵达从未亲身到访的文明母星,并前往【海底游览区】起点 | + +## 二、设计分类与场景职责 + +本场属于 Chapter 0 接受路线上的 **Addition**,不新增路线、结局或永久变量。它既是`泽尼斯`生活阶段的结束,也是母星游览阶段的入口。 + +本场的核心对照是两种不同的“家”: + +- `泽尼斯`是曦真正生活过的家,由父母、学校、交通路线和具体日常构成; +- `阿斯特里亚`是文明共同来处意义上的家,曦从未到访,却从小在历史、教材与公共文化中认识它。 + +正式台本必须先让玩家感到曦确实离开了一处无法替代的生活空间,再给予第一次看见母星的开阔与好奇。母星的壮丽不能立即覆盖家庭告别的重量,家庭告别也不能把后续旅行写成只有悲伤的延长。 + +### 本场必须完成 + +- 完成曦与父母离开前的最后一顿家庭早餐; +- 通过普通公共交通前往客运枢纽,不再次安排国家仪仗或公众送别; +- 让曦在登乘边界主动拥抱父母,并确认这是跨界出发以前最后一次当面见面; +- 明确远程通信仍可持续到曦真正进入第一个异世界; +- 以正常民用客运展示星联科技、秩序和对个人边界的尊重; +- 让曦从外部第一次亲眼看见`阿斯特里亚`; +- 区分`泽尼斯`的个人生活归属与`阿斯特里亚`的共同历史归属; +- 让曦抵达母星后转乘行星纵向交通,前往海洋深层的旅行起点。 + +### 本场不得完成 + +- 不进入【海底游览区】的正式导览内容; +- 不引入深水保育员、`Alunite` 或其它母星关键配角; +- 不开始地下都市、大图书馆、音乐会、天文台或恒星边缘剧情; +- 不让父母陪同母星旅行,也不让他们在客运枢纽以后再次当面出现; +- 不以通信中断制造虚假紧急感;真正断开故乡联系发生在未来跨界时; +- 不举行第二次公众演说、授勋、花海或全体公民夹道送别; +- 不让普通旅客围堵曦、骚扰父母或把镜当作公开实验对象; +- 不让镜安慰父母、承诺曦必然平安归来,或在离别中产生情感变化; +- 不让镜因为看见母星历史遗产而承认三维保存行为具有它此前未理解的价值;相关观念变化必须留给未来冒险长期积累。 + +## 三、时间与交通安排 + +本场严格按照时间顺序推进。 + +| 时间 | 行程 | +|---|---| +| 清晨 | 曦在家醒来,一家人按平常时间完成早餐与最后检查 | +| 08:40 | 从住宅区公共交通站出发 | +| 09:20 前后 | 抵达`泽尼斯`星际客运枢纽,完成正常安检与登乘手续 | +| 11:00 | 进入前往`阿斯特里亚`的民用超光速客运航线 | +| 数小时后 | 航线退出超光速区,`阿斯特里亚`首次进入肉眼可辨识范围 | +| 当日稍晚 | 抵达母星轨道交通枢纽,转乘行星纵向交通线前往海洋深层起点 | + +星际通勤不应消耗数周。十至十五周窗口的大部分时间仍用于母星游览、恒星边缘路线与最终跨界准备。正式台本不需要详细解释超光速航行理论,只需让客运流程像星联公民习以为常的成熟公共技术。 + +## 四、空间与视觉基调 + +### 家庭住宅与最后早餐 + +住宅保持 `C0-S02` 和 `C0-S05` 已建立的普通、富足与温暖感。 + +- 灯光、餐具、厨房设备和座位均与往常相同,不布置“最后早餐”的装饰。 +- 母亲仍会询问调味或食量,父亲仍会确认交通维护与替代线路。 +- 行李放在门边,使“离开”始终处于画面中,却不占据餐桌中央。 +- 镜可以在窗边等待,不需要座位或餐具;父母不再重复询问它是否进食。 +- 家庭成员可以暂时谈论与告别无关的小事,但这种平常是主动选择的相处方式,不是假装风险不存在。 + +### 泽尼斯星际客运枢纽 + +客运枢纽服务大量普通乘客,不因曦到来停止运行。 + +- 建筑以清晰换乘、快速安检和舒适候乘为主,没有国家专用舰船或军事警戒线。 +- 星联只为曦与家人提供一个避免媒体打扰的半私密登乘区,不清空整座枢纽。 +- 其他旅客可以认出她、安静点头或留下空间,但不会形成围观人墙。 +- 父母能够陪同到乘客权限边界;边界之后只有曦、镜与其他登乘旅客可以继续。 +- 工作人员以普通客运标准处理曦的行李和镜的非标准投影登记,不把程序演成使命审查。 + +### 民用超光速航线 + +- 曦使用普通客运工具中的相对独立舱段,而非只为她启用的国家载具。 +- 舱内仍有路线广播、餐饮、儿童、行李与普通乘客的小问题,体现世界没有以曦为中心暂停。 +- 进入超光速航道时可表现为外部星光收束、导航图层接管肉眼景象或窗面自动降低透明度,但不使用神秘宗教意象。 +- 镜不受航行景象震撼,也不主动讲解高维结构。它只在曦提出实际问题时说明当前行程与契约边界。 + +### 第一次看见阿斯特里亚母星先作为远处的蓝白色星体出现,再逐渐显出城市大陆、保留海域、云层、轨道设施和跨时代建筑区域。 + +- 大部分地表已被城市覆盖,但大洋之心仍保留广阔海域。 +- 新旧建筑并存,新交通结构会绕开受保护历史区域,表现文明有能力彻底重建却主动为过去保留空间。 +- 视觉应开阔、温暖、明亮,不把母星塑造成庄严到无人生活的纪念馆。 +- 第一眼主要属于曦。镜可以提供事实性识别,不替她解释情感,也不立即评价保存历史的意义。 + +### 行星纵向交通线 + +星际航线抵达轨道交通枢纽后,曦换乘公共行星交通系统。路线从高空与城市层逐步下降,最终进入海洋区域的深层站点。 + +- 换乘过程与普通游客相同,不为曦封闭路线; +- 乘客可包括研学儿童、老人、普通旅客与工作人员; +- 随着下降,窗外从母星全景转为城市近景、海岸线、水面和逐渐变深的蓝色; +- 本场结束在海底游览区尚未正式展开以前,避免把两个场景挤在同一 TextBlock。 + +## 五、角色目标与表演边界 + +### 曦 + +- **表层目标**:按时登乘,不在父母面前因为害怕而失去行动能力。 +- **真实状态**:她已经接受契约,也确实期待母星旅行;这不妨碍她在真正离开家门时产生后悔、恐惧和想拖延几分钟的愿望。 +- **年龄表现**:会反复确认明明已经收好的物品,会在早餐时主动谈交通和天气,也会在到达登乘边界后突然发现准备好的告别话一句都说不完整。 +- **情绪边界**:不发表成熟、完整的英雄告别演说,不承诺一定回来,不因哭泣或犹豫而重新讨论撤回契约。 +- **主动性**:由她先拥抱父母、通过登乘边界,并在第一次看见母星时决定暂时放下记录终端。 +- **场末变化**:悲伤没有结束,但好奇重新进入视野;她开始以真实旅客而非公共事件主角的身份观察母星。 + +### 父亲 + +- **表层目标**:确保交通、行李与登乘手续没有任何可实际处理的遗漏。 +- **真实状态**:不断检查路线是维持行动能力的方式。他知道这些准备不能解决跨界风险,也不假装自己能够继续保护曦。 +- **告别表达**:不要求曦成功,只提醒她遇到无法立刻解决的问题时可以停下来确认,不必因为别人称她为英雄就假装已经有答案。 +- **边界**:不把旧探针解释为父亲能够跨世界守护女儿的象征,也不反复重复 `C0-S05` 已经说过的道具意义。 + +### 母亲 + +- **表层目标**:确认曦吃完早餐、衣装舒适、通信终端和私人照片均已携带。 +- **真实状态**:她试图记住曦离家当天所有普通细节,又不愿用“最后一次”命名每一件事。 +- **告别表达**:允许自己舍不得,也明确这份舍不得不需要曦在登乘边界解决。她可以请求曦安全抵达母星后发消息,却不要求随时报告或证明勇敢。 +- **边界**:不在公开空间发表“英雄母亲”言论,不把眼泪隐藏成毫无情绪,也不以哭泣阻止曦通过边界。 + +### 镜 + +- **场景位置**:保持万华镜形态,在家庭空间、枢纽和客舱中维持不远不近的陪同距离。 +- **发言频率**:低。家庭告别的关键段落应允许镜长时间不说话。 +- **可用回应**:确认远程通信会持续到真正跨界;确认行李与航线不妨碍履约;在曦询问时区分`泽尼斯`的个人生活归属与`阿斯特里亚`的文明起源事实。 +- **判断边界**:它可以指出哭泣、拥抱或多看一眼不会改变离开的事实,却不需要因此与曦争论这些行为是否有效率。 +- **OOC 禁区**:不主动安慰、不承诺归来、不说“我会替你照顾她”、不被家庭感动、不承认自己以前忽略了三维情感,也不在序章结束前把曦视为任务以外的重要对象。 + +### 旅客与客运人员群像 + +- 工作人员按标准流程服务,不因镜的形态失去专业能力; +- 一名年幼旅客可以在远处认出曦并向她挥手,监护人不带孩子靠近索取回应; +- 其他旅客可以礼貌点头、让出合理空间,也可以继续处理自己的行程; +- 群像用于表现星联社会尊重个人边界,不承担新的剧情冲突或具名角色职责。 + +## 六、家庭告别的叙事边界 + +### “最后一次当面见面”的含义 + +曦离开`泽尼斯`后,父母不陪同`阿斯特里亚`旅行。因此客运枢纽的告别是她进入异世界以前与父母最后一次当面见面。 + +这并不等于立即永久失联: + +- 抵达`阿斯特里亚`后仍可发送文字、影像和实时通信; +- 母星旅行期间可以自然穿插家庭消息,但不能让父母远程参与每个景点的主要对话; +- 真正无法继续联系发生在曦进入跨界通道以后; +- 台本不得让父母误以为这班客运航线本身会切断所有通信。 + +### 告别不使用的表达 + +- “这是我们最后一次见面”; +- “你一定要回来”; +- “不要让我们的牺牲白费”; +- “整个文明都在等你”; +- “从今天起,你不再只是我们的女儿”; +- 任何要求镜作出超出契约职责保证的誓言。 + +角色都知道可能永别,但不需要用最直接、最完整的句子把潜台词全部说破。具体的拥抱、未说完的话、父母留在透明边界后的身影,比成熟告别演说更符合这个家庭与曦的年龄。 + +## 七、场景推进顺序 + +1. **清晨醒来**:曦比闹钟更早醒来,在房间里重新检查已经确认过的行李,却没有发现任何遗漏。 +2. **灯与早餐照常出现**:母亲先打开厨房灯,父亲查看轨道维护。镜报告行程正常,不参与家庭情绪判断。 +3. **玩家互动一**:单选项“像平常一样,把早餐吃完。”曦不以收拾行李为借口逃开餐桌,一家人谈论食物、线路和一些普通小事。 +4. **离开家门**:曦亲自拿起行李,在门口因为不知道是否应该回头看房间而停顿;父母不催促她把每处细节记住。 +5. **普通公共交通**:一家人与镜乘坐正常线路前往枢纽。沿途公民认出他们,却遵守公开边界。 +6. **客运手续**:工作人员验证曦的旅行终端、行李和镜的投影登记,流程成熟而平静,没有使命宣誓。 +7. **半私密候乘区**:父母仍可陪同。曦试图继续谈到达时间和通信安排,三个人都知道这些实际事项正在替他们拖延告别。 +8. **远程联系确认**:曦确认抵达母星后会发送消息。镜只说明跨界以前通信仍然有效,不预测以后何时能够回来。 +9. **登乘边界开放**:广播开始正常检票。父母无法继续向前,曦准备好的话忽然失去顺序。 +10. **玩家互动二**:单选项“抱住他们。”曦主动完成最后一次当面拥抱,允许自己哭泣,却不作必然归来的承诺。 +11. **具体而不完整的告别**:父亲和母亲各留下一个能够被曦实际记住的请求;内容围绕停下来思考、按自己的步伐观察和安全抵达后联系。 +12. **通过边界**:曦独自走入乘客区,镜随后通过。她在转弯前回头,直到透明边界和父母从视野中消失。 +13. **民用客舱**:客舱内仍有普通旅客。儿童远远挥手,曦选择回应;没有人围上来占用她的告别情绪。 +14. **离开泽尼斯**:客运载具驶离城市与轨道设施。曦第一次从外部看见自己生活过的世界逐渐缩小,并向父母发送已安全离港的信息。 +15. **进入超光速航线**:星光与导航视图变化,曦无法继续肉眼看见`泽尼斯`。镜不把这一技术过程解释成高维飞升。 +16. **航程中的距离**:曦承认自己既难过又期待母星。镜指出两种状态不互相否定,但不对其情感作价值评价。 +17. **收到母亲消息**:母亲提醒她,看见母星时不用急着拍给家里,先由自己看一会儿。 +18. **阿斯特里亚出现**:母星从远处蓝白色星体逐渐显出海洋、城市大陆、云层和轨道结构。 +19. **玩家互动三**:单选项“先把终端放下,自己看一会儿。”曦不立即记录或分享,把第一眼完整留给自己的感受。 +20. **两种归属**:曦说明`泽尼斯`是她生活过的家,`阿斯特里亚`则是让整个文明拥有共同来处的家。镜只确认二者的事实来源不同,不表示已经理解这种归属感。 +21. **轨道枢纽抵达**:母星没有清空港口迎接曦。普通旅客下船、换乘、寻找行李,公共秩序继续运行。 +22. **前往海洋深层**:曦与镜转乘行星纵向交通线。城市、海岸和水面依次掠过窗外,光线逐渐转为深蓝。 +23. **场景收束**:曦向父母发出一张尚未正式进入景点的海洋照片与“我到了”;交通线继续下降,下一场进入【海底游览区】。 + +## 八、玩家互动设计 + +本场为接受路线上的线性主线。三个互动固定顺序出现,每次只有一个选项,不改变剧情变量、路线或物品状态。 + +| 顺序 | 单选项文本 | 叙事作用 | 固定结果 | +|---|---|---|---| +| 1 | 像平常一样,把早餐吃完。 | 让玩家主动留在家庭日常中,而不是快速跳过难以面对的清晨 | 一家人完成早餐后共同出门 | +| 2 | 抱住他们。 | 让玩家亲手推进最后一次当面告别,不把情感动作完全交给旁白 | 曦拥抱父母并通过登乘边界 | +| 3 | 先把终端放下,自己看一会儿。 | 确立母星第一眼首先属于曦本人,而非公共记录或远程分享 | 曦观看母星,之后再向父母发送消息 | + +互动不得改为多选一,不写入“是否拥抱”“是否联系父母”等 Bool。所有结果均属于线性角色行动,TextBlock 完成状态足以记录进度。 + +## 九、Yarn、TextBlock 与 StoryData 接口 + +### 建议 Yarn 文件与 Node + +| 用途 | 建议值 | +|---|---| +| Yarn 文件 | `C0_DepartureToAsteria.yarn` | +| 入口 Node | `C0_DepartureToAsteria` | +| TextBlock ID | `c0_departure_to_asteria` | +| TextBlock 类型 | `Important` | +| 标题 Localization Key | `story_c0_block_departure_to_asteria` | +| 简体中文标题 | 前往母星 | + +建议内部 Node: + +- `C0_DepartureToAsteria_Breakfast` +- `C0_DepartureToAsteria_Terminal` +- `C0_DepartureToAsteria_Farewell` +- `C0_DepartureToAsteria_InTransit` +- `C0_DepartureToAsteria_FirstSight` +- `C0_DepartureToAsteria_Descent` + +### Block 条件与布局 + +| 字段 | 配置 | +|---|---| +| Unlock Condition | `c0_contract_route == 1` | +| Forbidden Condition | `c0_contract_route == 2` | +| 前置 Block | `c0_old_life_preparation` 完成 | +| 布局 | 位于 `c0_old_life_preparation` 的下一列,接受路线 `gridRow = 0` | +| 新增剧情变量 | 无 | +| 新增 Timeline Marker | 无;母星游览的重要时间节点待后续整体布局时确认 | + +本场完成后开放【海底游览区】对应 TextBlock。拒绝彩蛋路线不会与本场汇合。 + +## 十、Localization 与资源需求 + +### 新增 Localization Key + +| 用途 | Key | 简体中文源文本 | +|---|---|---| +| TextBlock 标题 | `story_c0_block_departure_to_asteria` | 前往母星 | + +正式台词、选项和旁白的 `#line` 标签由 Yarn 工具在文本批准后统一生成,不在场景卡阶段手工创建。 + +### 角色与演出资源 + +- 曦:日常旅行服装;失眠、故作轻松、流泪、努力挥手、安静观看、第一次惊叹等表情。 +- 父亲、母亲:家庭日常与克制告别表情;不使用公众演讲或英雄家属姿态。 +- 镜:沿用万华镜投影;长时间安静悬停、随行移动和客舱固定位置即可,不需要情绪动画。 +- 群像:客运工作人员、普通旅客与儿童可以使用远景或无立绘台词,不建立角色档案。 +- 场景背景:家庭厨房、住宅交通站、公共列车、星际客运枢纽、候乘区、民用客舱、母星远景、轨道交通枢纽、纵向交通舱。 +- 视觉特效:超光速航线进入/退出、`泽尼斯`远离、`阿斯特里亚`逐渐接近、下降进入海洋时的光线变化。 + +## 十一、文本节奏与演出要求 + +- 旁白使用第三人称,以曦的感知为主要视角;不得以“你”指代曦或玩家。 +- 人物台词使用 ASCII 英文冒号。 +- 家庭早餐与枢纽告别应占主要篇幅;航程和换乘保持完整但不进行科技说明堆积。 +- 换行即一次对话推进。告别可使用少量短句制造真实停顿,但不能把整段情绪拆成连续五六字翻页。 +- 不让所有角色说出结构完美的道理。曦可能说错顺序、父母可能重复已经确认的事项,告别可以带有未完成感。 +- “温暖”来自允许恐惧、保留日常与尊重边界,不来自所有人强颜欢笑或反复宣称未来光明。 +- 第一次看见母星应有足够环境描写,但不把文明历史一次说明完;后续景点仍需拥有发现空间。 +- 镜的发言必须是事实性、边界性或精准判断,不能充当情绪总结者,也不能因曦哭泣而突然变得温柔。 + +## 十二、情绪转折 + +1. **准备结束于一个普通清晨**:真正的离开没有戏剧性警报,只由闹钟、早餐和行程时间推动。 +2. **实际事项成为短暂避难所**:交通、行李和通信都值得确认,也在帮助一家人延迟说出告别。 +3. **权限边界使离别不可继续拖延**:父母无法再陪同向前,宏大契约第一次化为一道具体的门。 +4. **拥抱代替完整演说**:曦没有找到漂亮的话,却亲手完成了不能回避的动作。 +5. **世界没有围绕她停止**:普通旅客继续旅行,星联社会给予空间,却不把所有生活变成她的送别背景。 +6. **故乡第一次成为远景**:`泽尼斯`从日常环境变成窗外逐渐缩小的星球。 +7. **悲伤与期待同时存在**:离开父母不取消曦对母星和未知世界的好奇。 +8. **第一眼暂时不属于任何观众**:曦放下终端,先为自己看见`阿斯特里亚`。 +9. **两种家不互相替代**:个人生活的故乡与文明起源的母星建立不同情感位置。 +10. **告别转化为旅程**:下降交通进入蓝色海域,叙事从离开旧生活自然转向认识母星。 + +## 十三、连续性与 OOC 检查清单 + +- [ ] 本场紧接 `C0-S05` 结尾,使用已经确认的次日行程时间。 +- [ ] 曦携带旧多功能探针、照片、旅行终端和基础装备,但不重复解释其全部意义。 +- [ ] 父母不陪同母星旅行,客运枢纽是进入异世界以前最后一次当面见面。 +- [ ] 曦抵达母星以后仍可联系父母,通信没有被客运航线提前切断。 +- [ ] 家庭告别不要求曦承诺成功或归来,也不重新讨论是否接受契约。 +- [ ] `泽尼斯`使用普通公共交通与民用航线,没有为了曦停止城市运行。 +- [ ] 公众能够认出曦与镜,但遵守 `C0-S04` 已公布的隐私保护边界。 +- [ ] 镜不安慰、不保证、不争辩、不发生情感或观念转变。 +- [ ] 镜在序章仍能看见完整时间线,却不透露离别后果、归来可能或母星未来。 +- [ ] 超光速航行不被解释为升入第四维度,也不透露神解除科技锁的机制。 +- [ ] 曦此前从未到访`阿斯特里亚`,本场是她第一次亲眼看见母星。 +- [ ] 母星既高度城市化又保留大洋与历史区域,不被写成纯自然星球或无人纪念馆。 +- [ ] 母星第一眼不让镜得出“自己过去错了”之类结论。 +- [ ] 本场不引入具名母星配角,不提前进入【海底游览区】核心议题。 +- [ ] 三个互动固定顺序、每次单选,不新增剧情变量。 +- [ ] 本场不使用 `<>`、`<>` 或 `$variable`。 +- [ ] 场末位于前往海洋深层起点的交通线上,为 `C0-S07` 留出独立开场。 + +## 十四、后续接口 + +- 用户批准本场景卡后,编写 `C0_DepartureToAsteria.yarn` 初稿。 +- Yarn 获批以前,不配置 StoryData、Localization Table、交通场景资源或 VFX。 +- `C0-S07` 正式进入【海底游览区】,围绕人工游览生态、真正原始海洋与“被照料的自然是否仍然真实”展开。 +- `C0-S07` 是否需要具名保育员及其个人冲突,必须在独立前置信息讨论中确认,不能直接沿用早期探索稿的临时设计。 +- 母星旅行继续严格按时间顺序推进,后续景点、角色与冲突各自建立场景卡。 diff --git a/docs/chapter0-scene-07-ocean-heart-card.md b/docs/chapter0-scene-07-ocean-heart-card.md new file mode 100644 index 00000000..5ebc9f2f --- /dev/null +++ b/docs/chapter0-scene-07-ocean-heart-card.md @@ -0,0 +1,376 @@ +# Chapter 0 场景卡:C0-S07 大洋之心 + +> 状态:**已确认前置信息的场景设计稿,非 Yarn 台本** +> 用途:锁定曦抵达阿斯特里亚后的第一处正式景点、海底游览生态、生态保育员伊内斯及其保护边界冲突。 +> 本稿允许确定 Yarn 文件、Node、TextBlock、Character ID 与 Localization Key 的建议命名;不在本阶段修改 StoryData、Localization Table、CharacterRegistry、Prefab、C# 或正式 Yarn 台词。 + +## 一、场景定位 + +| 项目 | 内容 | +|---|---| +| 场景编号 | `C0-S07` | +| 暂定名称 | 大洋之心 | +| 时间 | `C0-S06` 抵达海洋深层站以后,覆盖当日下午约半日 | +| 主要地点 | 阿斯特里亚大洋之心外围的海洋深层站、游览生态区、浅水互动室、保护带观察廊与向地下都市上行的交通线 | +| 出场角色 | 曦、镜、伊内斯·阿尔梅达;少量游客与工作人员作为环境群像 | +| 玩家状态 | 刚完成与父母的当面告别并抵达母星,仍然难过,但对第一次母星旅行怀有真实好奇 | +| 核心互动 | 三个固定顺序的单选项互动:等待鱼群主动靠近、进入浅水互动室、前往真正的保护边界 | +| 主线结果 | 曦结识母星上的第一位朋友,亲自体验人工培育的安全海洋生态,并理解游览区与原始海洋之间必须存在不只由技术风险定义的边界 | + +## 二、设计分类与核心命题 + +本场属于 Chapter 0 母星游览阶段的 **Addition**。它不增加主线路线、结局或永久变量,也不要求玩家替阿斯特里亚决定海洋保护政策。 + +本场的核心命题是: + +> 经过设计、照料与安全控制的自然体验,不会因此自动变成虚假;喜欢一处自然,也不等于拥有进入它每一个角落的权利。 + +该命题分为两个连续层次: + +1. **被照料的相遇是否真实**:游览区的生物由人类培育,没有攻击性,也更容易回应游客,但它们仍是拥有自身活动规律的生命,不是播放给游客的影像。 +2. **亲近是否意味着继续开放**:游览区让公众认识海洋具有真实价值,却不能因此把保护区视为下一块等待技术成熟后开发的空间。 + +### 本场必须完成 + +- 让曦在告别之后重新表现出勇敢、外向和喜爱探索的一面; +- 明确游览区生物是真实的生物工程生命,不是机器人、数字生命或人工智能; +- 表现这些生物能够学习、组成群体、主动回应或避开游客; +- 让曦亲自进入浅水互动室,而非全程隔着玻璃听讲解; +- 建立游览生态、休息水域、保护带与原始海洋之间的清晰空间边界; +- 引入伊内斯并表现她为何同时支持公共游览与反对无止境扩建; +- 让扩建提案保持善意、合理且尚未定论,不设置反派; +- 让镜以两次关键判断指出问题核心,不参与长时间辩论; +- 建立曦与伊内斯的初步友谊,但不让伊内斯加入后续全程旅行; +- 在场末连接【地下都市与团结纪念碑】。 + +### 本场不得完成 + +- 不讨论“人工智能算不算生命”或“机器是否拥有灵魂”; +- 不把鱼群写成拥有成年人类语言、人格或政治权利的智慧种族; +- 不以捕食、伤亡或设备事故制造廉价危险; +- 不让曦、镜或伊内斯进入真正的原始海洋核心区; +- 不把原始生态美化成和平、友善或专门等待人类观看的自然乐园; +- 不让扩建方成为贪婪企业、腐败政府或故意破坏环境的反派; +- 不由玩家批准或否决扩建提案,不新增路线变量; +- 不让镜因鱼群、曦或伊内斯的说法而理解生命之美、承认错误或改变四维价值观; +- 不让伊内斯的个人冲突与 `Alunite` 的飞升后身份焦虑重合; +- 不提前开始地下都市、团结纪念碑或大图书馆内容。 + +## 三、海洋与游览生态设定 + +### 大洋之心 + +阿斯特里亚的大部分地表已由城市覆盖,大洋之心则是母星仍被完整保留的大规模海域。它既承担原生生态保护,也保存文明起源星球上无法在其它专业都市世界复制的自然历史。 + +- 海域核心保持黑暗、高压、捕食、疾病与复杂生态竞争; +- 星联有能力让人安全进入更多区域,却选择不把“能够抵达”直接等同于“应该开放”; +- 科学研究同样需要限定时间、路线、照明和取样范围; +- 游览区位于大洋之心外围,和核心原始海域之间存在多层生态缓冲带; +- 海底旅游设施属于星际殖民成熟后的母星再建设工程,早于记忆上传计划,与大图书馆建设处于相近历史阶段。 + +### 人工培育的游览生态 + +游览区中的鱼群、软体生物与礁体生物是通过生物工程培育的真实生命。正式台本统一使用“人工培育生物”“游览生态种”或具体动物名称,不把它们简称为“AI”。 + +- 它们具有新陈代谢、成长、学习、群体偏好与动物级认知; +- 它们没有会危害游客的攻击行为,也不依赖捕食其它游览种维持生态; +- 它们能够识别游客动作并作出回应,但不会被强制靠近每一位游客; +- 游客动作过快、声音过强或停留时间过久时,鱼群可以离开; +- 每片互动水域都连接不向游客开放的休息区,生物能够自行退出展示空间; +- 互动记录只用于生态健康与游客分流,不为每名游客编排固定表演; +- 游览生态不能替代原始海洋,也不会被官方宣传为“完整自然”。 + +### 玻璃隧道与浅水互动室 + +玻璃隧道顺着人工礁体与水流延伸,不设计成一条只用于陈列生物的笔直展柜。 + +- 鱼群可从多个方向穿过隧道附近水域,也可进入游客看不见的区域; +- 游客可以把手贴近玻璃,但需要等待生物自行靠近; +- 浅水互动室通过生态隔离门连接游览水域,与原始海洋没有直接通道; +- 游客穿轻型呼吸与恒温装备进入,水流、水温和深度均在安全范围; +- 镜不需要装备,只需缩小三维投影范围,避免阻挡游客与鱼群; +- 互动室没有追逐、投喂或强制触摸项目。 + +### 保护带观察廊 + +观察廊位于游览区最外侧,是普通游客在工作人员陪同下能够抵达的最后区域。 + +- 廊道关闭主要导览灯,只保留不干扰生物的最低安全照明; +- 玻璃外不设置会主动靠近游客的培育鱼群; +- 远处偶尔能够看见无法辨认的原生生物轮廓,但不能保证每次都有观测结果; +- 观察廊的目的不是提供“更刺激”的深海体验,而是让人承认游览区之外仍有大量不可直接占有和观看的空间; +- 前往观察廊不等于进入原始海洋,不违反保护区规定。 + +## 四、扩建提案 + +### 提案内容 + +一项处于公开评估阶段的提案,希望在现有观察廊以外增加一条低照明、全封闭的透明交通线,让行动不便者、儿童和普通游客能够更接近深海缓冲区。 + +提案方承诺: + +- 不允许游客离开交通舱; +- 不投喂、不取样、不增设互动生物; +- 使用低干扰照明和被动观测设备; +- 以现有技术评估,施工与运营风险处于可控范围; +- 通过更直观的体验增加公众对海洋保护的支持。 + +这些理由都是真实且善意的。本场不得揭示提案背后存在商业阴谋或虚假数据。 + +### 伊内斯的担忧 + +伊内斯不否定公共接近的价值,因为她自己正是被童年游览经历改变的人。她担心的是: + +- 如果边界只用“当前技术无法保证安全”解释,技术进步后便必须继续后退; +- 每一次扩建都可以单独证明影响很小,但连续累积会把缓冲带变成新的游览区; +- 公众可能逐渐把原始海域理解成“尚未完成开发”的空间; +- 保护不仅是防止直接伤害,也包括允许某些区域不以满足人类观看需求为目的。 + +伊内斯尚未决定自己的正式评估意见如何表述。她不是在选择“支持公众”或“保护海洋”中的一个,而是在寻找能够同时承认两者、又不会令边界失去意义的理由。 + +### 本场结论边界 + +本场不批准、不否决提案,也不暗示伊内斯的个人意见足以决定公共政策。 + +她在场末只获得一个更清楚的表述方向: + +> 游览区应当帮助人们认识海洋,也应当帮助人们认识自己不能抵达的边界;公共体验的成功,不以开放面积不断扩大来证明。 + +该结论仍需通过生态数据、公开讨论与正式程序接受检验。 + +## 五、角色档案:伊内斯·阿尔梅达 + +| 项目 | 内容 | +|---|---| +| 中文名 | 伊内斯·阿尔梅达 | +| 拉丁字母名 | Inês Almeida | +| Character ID | `Ines` | +| 年龄 | 29 岁 | +| 身份 | 大洋之心游览生态与保护边界协调员 | +| 出生地 | 阿斯特里亚以外的一颗专业都市世界;本场不命名该世界 | +| 场景职能 | 母星第一位具名朋友;连接公众游览价值与生态边界冲突 | + +### 经历 + +伊内斯童年随家人第一次来到阿斯特里亚,在同一座游览区与鱼群互动。那次安全、明亮且经过人工设计的体验令她第一次意识到“海”不是教材地图上的蓝色区域,后来选择生态维护与公共教育专业,并长期生活在母星。 + +她因此不会轻蔑普通游客,也不认为只有研究人员才配理解海洋。她支持游览区存在,愿意设计更好的无障碍体验,也相信公众亲近能够为保护制度建立长期支持。 + +正因为她亲身受益于一扇向公众打开的门,她很难简单告诉后来者“不允许继续向前”。扩建评估让她第一次必须说明:为什么自己曾经需要那扇门,却仍然认为有些门不应该继续增加。 + +### 性格与语言 + +- 学识专业,但习惯用游客能够理解的语言说明问题; +- 亲和、直接,遇到实际生态问题时会立即停止讲解去处理; +- 不把游客的幼稚问题视为冒犯,也不假装每个问题都有简单答案; +- 面对曦时知道她的公共身份,却不会追问契约或要求她发表英雄观点; +- 对镜保持礼貌与谨慎,不因它来自第四维度便默认其判断适用于海洋管理; +- 被精准指出矛盾时不会恼怒,也不会立刻接受镜的结论,而会先确认表达是否符合自己的真实担忧。 + +### 外观与服装 + +- 深蓝色轻型水下工作服,使用珊瑚橙色安全标识; +- 前臂佩戴生态监测终端,能够查看生物休息状态、水质与游客分流; +- 长发在工作时固定,不使用夸张贝壳、鱼鳍或海洋祭司式装饰; +- 鞋与手套适合在干燥廊道和浅水区之间快速切换; +- 整体首先是长期现场工作人员,其次才是可识别的具名角色。 + +### 与曦的关系 + +- 伊内斯是曦在母星结识的第一位新朋友; +- 关系从普通接待开始,通过曦真实参与体验、尊重生物退出和愿意观看保护边界逐渐自然靠近; +- 伊内斯不会因曦是英雄就把政策问题交给她裁决; +- 曦离开后,二人可以保留私人联络;伊内斯可在未来消息或音乐会群像中短暂出现,但不全程陪同母星旅行; +- 本场末不使用“永远的朋友”或过快亲密承诺。 + +## 六、角色目标与表演边界 + +### 曦 + +- **表层目标**:完成母星第一站,真正进入水中与鱼群接触。 +- **真实状态**:家庭告别仍未过去,但海洋体验能够暂时把她的注意力带回当下;悲伤与兴奋可以同时存在。 +- **外在表现**:进入游览区后主动提问、靠近玻璃、急着下水,也可能因为动作过大把鱼群惊走,再不服气地尝试安静等待。 +- **核心理解**:不需要证明游览生物与原生鱼完全相同,才能承认这次相遇对自己真实;同样,不是所有喜欢的地方都必须亲自进入。 +- **政策边界**:她可以帮助伊内斯说清感受,却不以候选人或英雄身份替公众决定扩建。 +- **场末状态**:结识新朋友并恢复旅行动力,准备前往地下都市;她没有因为一处景点便得出关于整个文明的最终结论。 + +### 伊内斯 + +- **表层目标**:让曦像普通游客一样理解游览生态,而不是接受专门为英雄准备的展示。 +- **真实状态**:扩建意见提交期限临近,她仍无法找到一个既不否定自己童年经历、又能守住保护边界的说明方式。 +- **关键行动**:允许曦看到内部评估问题并带她前往观察廊,但不泄露非公开资料,也不利用曦的身份影响评审。 +- **场末变化**:不是获得政策答案,而是能更准确地区分“让人接近海洋”与“让所有海域都成为入口”。 +- **边界**:不说教、不神化自然、不把所有游客视作潜在破坏者,也不因一次谈话辞职、转职或改变人生方向。 + +### 镜 + +- **场景位置**:保持万华镜投影,在水中可缩小三维形态,不受水压、呼吸或温度影响。 +- **发言频率**:低。它不需要评价每一种鱼、每一项设施或每一段游客行为。 +- **第一次关键判断**:游览生态被设计为更容易产生安全而积极的回应,这项设计改变相遇条件,却不足以证明相遇没有发生。 +- **第二次关键判断**:伊内斯真正保护的不是“现有技术无法安全进入”的区域,而是一条即使技术能够进入,也不应自动开放的边界。 +- **态度**:平和、准确、不选边;它指出结构,不替伊内斯提交意见,也不评价哪一方更高尚。 +- **OOC 禁区**:不因鱼群美丽而惊叹,不询问短暂生命是否值得,不承认自己忽略了三维关系,不从曦身上学习怜惜,也不主动帮助她与鱼互动。 + +## 七、场景推进顺序 + +1. **承接海洋深层站**:交通舱抵达。曦先在公共休息区吃一份简单食物,避免上一场已经提出“先找吃的”却直接跳过。 +2. **第一次进入游览区**:玻璃隧道、人工礁体与鱼群在柔和蓝光中展开;真正的原始海域仍在更深、更远处。 +3. **伊内斯接待**:伊内斯按普通预约迎接曦和镜,说明自己负责游览生态与保护边界,不举行英雄欢迎仪式。 +4. **身份边界**:伊内斯知道曦是谁,却只确认是否同意普通导览、是否需要私人空间和是否愿意下水。 +5. **鱼群没有立即靠近**:曦急着贴近玻璃时,鱼群先因动作过快转向,证明它们不会无条件配合每位游客。 +6. **玩家互动一**:单选项“把手贴近玻璃,等鱼群主动靠近。”曦安静下来,几条鱼在观察后自行接近。 +7. **说明人工培育生命**:伊内斯明确它们是真实生物,介绍学习、群体与休息区,不展开 AI 或人格争论。 +8. **镜的第一次判断**:镜指出设计者改变了相遇条件,使生物更容易安全回应游客;它不把这种事实直接归类为欺骗。 +9. **曦的直观回应**:曦承认自己知道鱼群经过培育,却不认为刚才的等待和回应因此没有发生。 +10. **准备进入浅水室**:伊内斯检查装备与游客规则;镜缩小投影,不穿戴潜水设备。 +11. **玩家互动二**:单选项“穿上装备,进入浅水互动室。”曦进入水中,第一次在母星海洋里自由移动。 +12. **互动不是表演**:曦试图追鱼,鱼群散开;她停下来以后,部分生物重新靠近,另一些仍选择离开。 +13. **温暖体验段**:曦与伊内斯轻松交谈,表现曦外向、好奇与装置亲和力;不立即进入政策争论。 +14. **伊内斯的童年经历**:她说明自己也曾是第一次看海的外星球游客,这处人工生态改变了职业选择。 +15. **生态休息时间**:伊内斯根据监测主动关闭一部分互动区域,让鱼群进入休息区;游客不会因购票而取得无限接触权。 +16. **扩建提醒出现**:伊内斯的终端收到评估期限提示。她不把问题主动包装成英雄咨询,但曦察觉她明显分心。 +17. **说明提案双方理由**:伊内斯解释低干扰扩建、无障碍价值与自己的顾虑,明确没有人试图破坏海洋。 +18. **曦拒绝充当裁决者**:她说明自己刚到母星半天,不能替当地社会决定,却愿意看看伊内斯所说的边界。 +19. **玩家互动三**:单选项“跟伊内斯去看看真正的保护边界。”三人进入工作人员陪同的观察廊。 +20. **景象发生断裂**:灯光变暗,培育鱼群消失,窗外只剩无法保证出现的原生轮廓;原始海洋不主动回应来访者。 +21. **镜的第二次判断**:镜精准指出,如果边界只依赖安全与技术限制,技术改善后就没有继续存在的理由;伊内斯实际主张的是不应自动开放的空间。 +22. **伊内斯确认矛盾**:她承认这正是自己难以写进报告的部分,同时强调个人愿望仍需接受公共程序与生态证据审查。 +23. **曦提供个人视角**:曦可以说,游览区正因为没有冒充整片海洋,才让她愿意相信这里的相遇;如果所有深处都变成路线,游客反而可能忘记自己只看见了被安排的一部分。 +24. **不解决提案**:伊内斯记录新的表述方向,决定继续准备评估,不宣布支持或反对结果。 +25. **建立友谊**:离开前,伊内斯向曦发送普通游客路线与私人联系方式,不要求她公开为保护区背书。 +26. **场景收束**:曦与镜搭乘向上运行的地下交通线,游览区灯光逐渐远去;下一站进入【地下都市与团结纪念碑】。 + +## 八、玩家互动设计 + +本场为线性主线。三个互动按固定顺序出现,每次只有一个选项,不改变剧情变量、政策结论或后续路线。 + +| 顺序 | 单选项文本 | 叙事作用 | 固定结果 | +|---|---|---|---| +| 1 | 把手贴近玻璃,等鱼群主动靠近。 | 让玩家亲手选择等待,而不是把生物回应写成自动表演 | 部分鱼群自行接近,其余仍可离开 | +| 2 | 穿上装备,进入浅水互动室。 | 让曦以身体经验进入母星旅行,恢复冒险者的主动性 | 曦下水并与伊内斯建立自然交流 | +| 3 | 跟伊内斯去看看真正的保护边界。 | 将场景从轻松体验推进到个人冲突,不让政策问题凭空出现 | 三人进入观察廊,扩建提案仍未决定 | + +这些互动不得改为三选一,不新增“是否亲近鱼群”“是否支持扩建”或“伊内斯好感度”变量。鱼群的具体动作可以由台本固定表现,不需要运行时随机或持久状态。 + +## 九、Yarn、TextBlock 与 StoryData 接口 + +### 建议 Yarn 文件与 Node + +| 用途 | 建议值 | +|---|---| +| Yarn 文件 | `C0_OceanHeart.yarn` | +| 入口 Node | `C0_OceanHeart` | +| TextBlock ID | `c0_ocean_heart` | +| TextBlock 类型 | `Important` | +| 标题 Localization Key | `story_c0_block_ocean_heart_title` | +| 简体中文标题 | 大洋之心 | + +建议内部 Node: + +- `C0_OceanHeart_MeetInes` +- `C0_OceanHeart_WaitForFish` +- `C0_OceanHeart_ShallowWater` +- `C0_OceanHeart_ExpansionProposal` +- `C0_OceanHeart_ProtectionBoundary` +- `C0_OceanHeart_Departure` + +### Block 条件与布局 + +| 字段 | 配置 | +|---|---| +| Unlock Condition | `c0_contract_route == 1` | +| Forbidden Condition | `c0_contract_route == 2` | +| 前置 Block | `c0_departure_to_asteria` 完成 | +| 布局 | 位于 `c0_departure_to_asteria` 的下一列,接受路线 `gridRow = 0` | +| 新增剧情变量 | 无 | +| 新增 Timeline Marker | 无;母星游览仍沿用最近主线进度,不在单个景点增加回滚点 | + +本场完成后开放【地下都市与团结纪念碑】对应 TextBlock。拒绝彩蛋路线不会与本场汇合。 + +## 十、Localization 与资源需求 + +### 新增 Localization Key + +| 用途 | Key | 简体中文源文本 | +|---|---|---| +| TextBlock 标题 | `story_c0_block_ocean_heart_title` | 大洋之心 | +| 角色显示名 | `character_ines_name` | 伊内斯 | + +正式台词、选项和旁白的 `#line` 标签由 Yarn 工具在文本批准后统一生成,不在场景卡阶段手工创建。 + +### CharacterRegistry 需求 + +Yarn 获批并进入资源接入阶段后,新增 `CharacterData`: + +```text +Character ID: Ines +Display Name Key: character_ines_name +Portrait Style: Sprite(暂定) +Required Emotions: normal, friendly, focused, concerned, relieved +``` + +当前 `VNDialoguePresenter` 的 Speaker 本地化仍是发布前待办;正式资源配置必须遵守项目角色显示名方案,不能把 `Ines` 直接当作最终中文显示文本。 + +### 场景与演出资源 + +- 曦:旅行服装、轻型水下装备;惊喜、跃跃欲试、被鱼躲开、专注等待、认真思考等表情。 +- 伊内斯:深蓝工作服与浅水装备;亲和讲解、工作专注、谈到扩建时迟疑、确认核心问题等表情。 +- 镜:沿用万华镜投影;增加水下缩小状态与水中光线折射表现,不需要情绪动画。 +- 背景:海洋深层站、公共休息区、玻璃隧道、人工礁体、装备准备间、浅水互动室、暗光观察廊、地下上行交通舱。 +- 生物:至少两类小型群游生物、一类能够单独选择靠近或离开的较大型游览生物;不需要拟人表情。 +- UI:生态休息状态、游客分流提示、扩建评估期限通知;不展示完整政策文件或大量技术参数。 +- 水下表现:柔和水体光线、气泡、水流、鱼群散开与返回;原始海域轮廓必须比游览区更少、更不确定。 + +## 十一、文本节奏与演出要求 + +- 旁白使用第三人称,以曦的感知为主要视角;不得以“你”指代曦或玩家。 +- 人物台词使用 ASCII 英文冒号。 +- 前半段体验篇幅应明显多于解释篇幅。玩家需要先喜欢游览区,之后才有条件理解伊内斯为什么不愿让它无限扩张。 +- 换行即一次对话推进。鱼群靠近、曦入水和观察廊转暗可以保留必要停顿,但避免连续五六字短句。 +- 伊内斯使用普通、清楚的语言,不把生态管理写成谜语或学术演讲。 +- 曦以实际体验提问,不突然拥有海洋政策专业知识,也不发表能够终结公共争论的完整结论。 +- 幽默主要来自曦急着亲近鱼群却把它们吓走、装备适配和镜不需要潜水设备,不拿生态风险或保护人员开玩笑。 +- 镜只保留两次结构性判断;其余时间回答必要事实或保持安静,不与伊内斯在同一论点上来回争辩。 +- 观察廊不保证出现壮观生物。没有看见任何东西也可以构成边界体验,不能用怪兽剪影制造廉价震撼。 +- 场末友谊保持初步、自然,不用礼物、誓言或过度亲密告别证明关系成立。 + +## 十二、情绪转折 + +1. **悲伤没有阻止好奇**:曦刚离开父母,却仍会因为海底景象靠近舷窗。 +2. **鱼群不自动配合英雄**:公共身份无法让生物回应她,等待才产生第一次接近。 +3. **人工设计不等于虚假播放**:相遇条件经过安排,鱼群的实际动作仍属于当下生命活动。 +4. **身体进入世界**:曦从观看者变成参与者,冒险者性格重新占据前景。 +5. **亲近仍有拒绝权**:鱼群可以离开,互动区会休息,购票不等于取得无限接触。 +6. **伊内斯不是反旅游保育员**:她自身正是公共游览价值的证明,因此矛盾不能被简单划分为开放与封闭。 +7. **深海不回应来访者**:观察廊把安全、明亮、主动接近的体验突然切断。 +8. **技术不是边界的唯一理由**:如果只因危险而不开放,更安全的技术迟早会令边界失效。 +9. **理解不等于裁决**:曦帮助伊内斯说清问题,却没有替母星决定政策。 +10. **第一位新朋友留下**:伊内斯不会同行,但母星已经从景点集合变成有具体人物生活其中的世界。 + +## 十三、连续性与 OOC 检查清单 + +- [ ] 本场紧接 `C0-S06` 海洋深层站结尾,先让曦吃东西,再进入正式游览。 +- [ ] 中文专名统一使用“泽尼斯”“阿斯特里亚”,不在玩家可见文本中混用英文世界名。 +- [ ] 曦刚完成家庭告别,情绪没有被景点瞬间治愈;好奇和难过可以同时存在。 +- [ ] 伊内斯知道曦的身份,却没有举办欢迎仪式或追问契约细节。 +- [ ] 游览生态种是真实生物,不是机器人、数字生命或人工智能。 +- [ ] 本场不讨论“是否算生命”,也不让鱼群具备成年人类智慧。 +- [ ] 鱼群能够主动靠近、拒绝互动或进入休息区,不是固定表演程序。 +- [ ] 浅水互动室与原始海洋完全隔离,不存在游客意外进入核心保护区的安全漏洞。 +- [ ] 真正原始海洋仍包含高压、捕食、疾病与危险,不被浪漫化成更“纯洁”的温柔生态。 +- [ ] 扩建提案有真实公共价值,提案方没有阴谋、欺骗或恶意。 +- [ ] 伊内斯的矛盾来自亲身受益于游览开放,却希望存在不继续开放的边界。 +- [ ] 曦不凭英雄身份决定扩建政策,提案在场末仍未获得结论。 +- [ ] 镜只有两次关键判断,不争辩、不赞美、不承认错误、不发生情感或观念变化。 +- [ ] 镜不把完整时间线用于透露扩建结果、伊内斯未来或海域命运。 +- [ ] 伊内斯的冲突与 `Alunite` 的存在意义、记忆管理和飞升焦虑完全不同。 +- [ ] 三个互动固定顺序、每次单选,不新增变量或好感度。 +- [ ] 本场不使用 `<>`、`<>` 或 `$variable`。 +- [ ] 场末只连接地下都市交通,不提前讲述团结纪念碑核心内容。 + +## 十四、后续接口 + +- 用户批准本场景卡后,编写 `C0_OceanHeart.yarn` 初稿。 +- Yarn 获批以前,不配置 StoryData、Localization Table、CharacterRegistry、伊内斯立绘或水下场景资源。 +- 下一阶段为【地下都市与团结纪念碑】。正式制作前需要确认更新工程师的人物设定、地下都市建设历史,以及“必要更新如何避免把失去写成零成本替换”的个人冲突。 +- 伊内斯不随队进入地下都市;后续如需再次出现,只通过已批准的消息或公共场合短暂回访。 diff --git a/docs/chapter0-scene-08-underground-city-card.md b/docs/chapter0-scene-08-underground-city-card.md new file mode 100644 index 00000000..0f8654e8 --- /dev/null +++ b/docs/chapter0-scene-08-underground-city-card.md @@ -0,0 +1,453 @@ +# Chapter 0 场景卡:C0-S08 地下都市与团结纪念碑 + +> 状态:**已确认前置信息的场景设计稿,非 Yarn 台本** +> 用途:锁定曦在阿斯特里亚地下都市的正式游览、公共结构更新工程师萨米尔、旧交通环廊最后一次常规通行与团结纪念碑。 +> 本稿允许确定 Yarn 文件、Node、TextBlock、Character ID 与 Localization Key 的建议命名;不在本阶段修改 StoryData、Localization Table、CharacterRegistry、Prefab、C# 或正式 Yarn 台词。 + +## 一、场景定位 + +| 项目 | 内容 | +|---|---| +| 场景编号 | `C0-S08` | +| 暂定名称 | 地下都市与团结纪念碑 | +| 时间 | `C0-S07` 当晚抵达地下都市并住宿;次日上午开始正式游览,覆盖约半日 | +| 主要地点 | 中央历史区住宿层、普通生活层与公共市场、即将关闭的旧交通环廊、团结纪念碑、通往大图书馆的公共交通站 | +| 出场角色 | 曦、镜、萨米尔·纳赛尔;居民、摊主、通勤者、学生、更新工程人员与通行测试参与者作为社会群像 | +| 玩家状态 | 已完成母星第一站,开始从“景点中的阿斯特里亚”转向观察普通人如何长期居住、维护和更新共同空间 | +| 核心互动 | 三个固定顺序的单选项互动:沿旧路标穿过生活层、获许可用旧探针检查已拆材料样本、参加旧环廊关闭前最后一次常规通行测试 | +| 主线结果 | 曦理解地下都市的历史并不只存在于纪念碑,也存在于仍被使用、即将更新的公共结构中;她收下萨米尔赠送的结构材料纪念章,随后前往大图书馆 | + +## 二、设计分类与核心命题 + +本场属于 Chapter 0 母星游览阶段的 **Addition**。它不新增主线路线、结局、永久变量或政策投票,也不重复 `C0-S07` 的“尚待公共评估”结构。 + +本场的核心命题是: + +> 共同生活不仅依赖建成一座城市,也依赖持续更新它;必要而正确的更新可以执行,同时仍应诚实说明哪些材料、触感与日常路径不会随新方案一起继续存在。 + +该命题分为三个连续层次: + +1. **团结首先是日常基础设施**:统一后的地下都市不是一座孤立奇观,而是跨越全球、历时百余年建设并至今仍被普通人使用的行星级城市网络。 +2. **安全更新不是价值悬案**:旧环廊的结构内衬认证期限、通道宽度、无障碍能力与疏散标准都要求工程按已批准方案执行;本场不再举行第二次政策裁决。 +3. **执行更新仍包含叙述责任**:新方案更安全,不等于旧材料留下的地方经验能够无缝转移;萨米尔的职责是把这一事实写清楚,而不是阻止工程。 + +### 本场必须完成 + +- 承接 `C0-S07`:曦与镜当晚抵达并住宿,正式游览从次日上午开始; +- 先展示生活层、公共市场与通勤人群,再进入工程与纪念碑内容; +- 明确地下都市是统一后全球同步建设、历时百余年的行星级地下城市网络; +- 明确建设目的为扩展生活空间、统一基础设施并避免拆除地表文化遗产; +- 不为地下建设添加灾难、末日避难、地表失居或生态崩溃背景; +- 明确本场位于最早建成、团结纪念碑所在的中央历史区,而非整个网络的唯一核心; +- 通过自然偶遇引入萨米尔,不安排预约接待、英雄专属导览或欢迎仪式; +- 明确旧环廊更新已经完成公共程序、必须执行且新方案更安全; +- 让社会群像同时表现留恋旧路、欢迎改善、正常通勤和专业执行,不设置反派; +- 让旧探针参与一次获许可的材料检查,但不让它修复结构、推翻方案或解决冲突; +- 让镜只在场景核心处作一次精准、疏离的结构判断; +- 让团结纪念碑保持低矮、环形、中心可通行,不塑造单一伟人; +- 场末由萨米尔赠送一枚以废弃或淘汰结构材料制成的纪念章,曦接受并收好; +- 连接下一站【大图书馆】,萨米尔不随行。 + +### 本场不得完成 + +- 不把地下都市写成灾后避难所、战争掩体、地表无法居住后的被迫迁徙工程; +- 不把全球同步建设写成瞬间完成、完全同质化或由单一地区向全球复制的项目; +- 不让团结等于没有分歧、没有地方习惯或所有区域采用相同生活样式; +- 不把旧环廊更新重新写成待表决、待否决或需要曦提供英雄意见的政策争议; +- 不设置强拆者、腐败管理者、守旧居民或阻碍安全的反派; +- 不暗示旧方案与新方案安全性相同,也不让“保留旧物”凌驾于无障碍和疏散责任; +- 不让探针发现足以取消工程的秘密技术、隐藏危险或万能修复方法; +- 不让纪念碑成为总设计师、统一领袖或工程负责人的个人崇拜设施; +- 不让镜分析纪念章对曦的情感意义,也不借礼物推动镜的情感成长; +- 不在本场讨论人格备份、记忆授权、飞升后的身份连续性或 `Alunite` 的存在问题; +- 不提前展开大图书馆内部、记忆样例或下一场核心冲突。 + +## 三、地下都市世界设定 + +### 行星级地下城市网络 + +地下都市不是一座单独城市,而是阿斯特里亚统一后启动的全球建设体系。各地区在同一历史阶段同步规划和施工,并在此后一百多年中逐步接通生活、交通、能源、水循环、通信与公共安全标准。 + +- “同步建设”指全球共同启动并持续协调,不代表所有区段同日完工; +- 各地可以保留自己的街区尺度、语言标识、饮食和公共空间习惯,同时接入统一基础设施; +- 地下网络扩展了长期生活空间,但没有取代地表城市,也没有要求人口全部迁入地下; +- 许多线路绕开地表历史街区、宗教与公共建筑、传统景观和考古区域,以避免为了增加住房与基础设施而拆除地表文化遗产; +- 统一标准解决的是跨区域供给、通行、维护和安全接口,不要求所有人的生活方式先变得相同; +- 网络至今持续更新,因此“建成”不是历史终点,而是长期公共维护的开始。 + +### 中央历史区 + +本场发生在最早完成并投入长期使用的中央历史区。这里因早期承担跨区域材料、人员与标准验证而保存了多代建设痕迹,团结纪念碑也设置在此。 + +- 它是历史与交通上的重要节点,但不是支配其它地区的唯一中心; +- 最早期结构与后续加建层并存,更新接缝和维修记录无需全部遮蔽; +- 历史展示嵌在住宅、市场和交通层之间,而不是把整个城区冻结成博物馆; +- 游客路线与居民日常路线重叠,纪念碑周边仍有通勤、购物、上学和维护活动; +- 正式台本应先让玩家看到这里“仍在生活”,再说明它“很早建成”。 + +### 普通生活层与公共市场 + +生活层用于建立地下都市的尺度与日常性,避免世界级工程只通过说明牌存在。 + +- 人工天幕提供稳定的昼夜节律,但居民不把它误认成真正天空; +- 住宅、学校、诊所、小型公园与公共市场沿多层步行平台展开; +- 市场出售早餐、维修零件、植物、书籍和日用品,不设计成只服务游客的未来奇观; +- 早期路标仍保留在部分步行路径上,并与新版通用导向系统共同使用到环廊关闭; +- 旧路标并不总是最短路线,却会带人经过长期形成的摊位、休息平台与邻里节点; +- 居民对更新的态度可以不同,但所有人都生活在同一已生效的工程安排中。 + +### 空间与色彩推进 + +本场视觉节奏随叙事从普通生活逐步收紧,再在纪念碑处重新开放: + +1. 日常下行大厅使用中性白与局部暖光,首先建立住宿、换乘和普通公共服务; +2. 人工暮色下的生活层向横向展开,市场、住宅平台与人流共同扩张城市尺度; +3. 旧交通环廊转为石墨灰旧内壁、浅色新结构与琥珀检修灯并排的压缩空间,让更新差异直接进入画面; +4. 团结纪念碑重新开放构图,低矮环体没有唯一正面,生活人流从中心和四周持续穿过。 + +色彩变化用于区分空间职能与更新阶段,不暗示旧结构邪恶、新结构纯洁,也不把纪念碑从日常城市中隔离出来。 + +## 四、旧交通环廊更新工程 + +### 已确认的工程结论 + +旧交通环廊是中央历史区仍在运行的早期公共通道之一。更新方案已经完成公开说明、技术复核、无障碍审查、居民意见收集与正式批准,关闭后必须按计划施工。 + +必须更新的原因包括: + +- 现有结构内衬即将达到认证期限,不能继续依赖临时延长; +- 早期通道宽度无法满足当前人流与双向辅助设备通行需求; +- 部分坡度、转向与站台接口不符合现行无障碍标准; +- 疏散宽度、分流节点和紧急指引需要达到当前公共安全要求; +- 新内衬与结构方案拥有更长认证周期、更清楚的检修界面和更安全的故障隔离能力。 + +本场必须清楚承认:新方案更安全、工程决定正确、施工不会因主角到访而暂停或重启评估。 + +### 仍需面对的变化 + +萨米尔不反对更新,也不试图保留整条旧环廊。他负责的记录工作关注旧结构退出日常使用时实际发生的变化: + +- 多次维修形成的材料层次、表面触感和光线反射不会原样延续; +- 居民熟悉的旧路标、转角视线和经过市场的行走习惯将改变; +- 扫描、样本与档案能够保存证据,却不能让旧通道继续作为每天经过的同一处公共空间; +- 新环廊无需伪装成旧环廊从未关闭,也不需要用怀旧装饰削弱新安全设计; +- 工程交付文件应同时记录改善项目与退出使用的旧结构,而不是只用寿命、吞吐量和预算概括全部变化。 + +这不是第二次未决政策评估。冲突落在萨米尔如何完成一份诚实的更新记录,以及曦如何理解“正确执行”与“承认变化”可以同时成立。 + +### 最后一次常规通行测试 + +旧环廊关闭前会进行一次最后的常规通行测试。它不是追悼仪式、庆典或为曦举办的特殊活动,而是工程交接所需的正常流程。 + +- 参与者包含普通通勤者、携带婴儿车或行动辅助设备的居民、市场配送人员与工程观察员; +- 测试记录现有宽度、分流、等待和疏散指引在真实人流中的表现; +- 测试能直接显示旧环廊为何不再适合继续承担公共交通责任; +- 居民可以在最后一次通过时拍照、摸一摸熟悉的扶手或保持沉默,但不阻止关闭; +- 结束后按计划封闭旧通道,人员转入临时线路,施工准备立即开始。 + +## 五、团结纪念碑 + +团结纪念碑位于中央历史区一处仍被日常穿行的公共广场。它是一座低矮环形材料结构,中心保持开放,行人可以从任何方向穿过。 + +- 环体由不同地区、建设阶段和功能系统的材料样本组成; +- 材料标签首先记录来源、原用途、服役时间与接入共同标准的过程; +- 环形没有唯一正面,也没有要求访客按固定顺序参观; +- 中心不是封闭展台、祭坛或领袖雕像,而是公共通行空间; +- 设计师、工程负责人和协调团队姓名完整保存在资料区,可查阅但不占据纪念碑主体; +- 资料区同时保存争论、修订、延误与地方适配记录,不把百余年建设简化成一条胜利叙事; +- 纪念碑表达的“团结”是不同地区愿意共享基础设施责任并为彼此调整接口,而不是所有地区最终变得一样。 + +旧环廊退役后,经过安全处理和登记的部分材料可以进入纪念碑资料区或公共教育材料库。是否收存由既有归档流程决定,不由曦、镜或萨米尔现场裁决。 + +## 六、角色档案:萨米尔·纳赛尔 + +| 项目 | 内容 | +|---|---| +| 中文名 | 萨米尔·纳赛尔 | +| 拉丁字母名 | Samir Nasser | +| Character ID | `Samir` | +| 年龄 | 38 岁 | +| 文化命名 | 阿拉伯语文化圈姓名;正式文本保留完整姓名来源,不把其文化背景写成异域装饰 | +| 身份 | 中央历史区公共结构更新工程师 | +| 出生与成长 | 在本区长大,后前往其它地区接受结构更新与跨标准维护训练,完成外地项目后返回本区工作 | +| 场景职能 | 通过正在执行的更新工程,将地下都市历史、公共安全与记录责任连接起来 | + +### 经历 + +萨米尔熟悉旧环廊,不是因为他把每一处旧结构视为应当原样保存,而是因为这里曾是他的上学、购物与通勤路径。外出训练让他接触过更晚建成、标准更先进的地下城区,也使他清楚旧环廊已无法继续承担当前公共责任。 + +他返回中央历史区不是为了“守住过去”,而是因为最早建成的城区需要长期面对复杂更新:旧材料、现行规范、居民使用习惯和跨区域系统必须在同一项目中被准确处理。他认可已批准方案,并负责旧结构记录、材料取样、关闭测试与新工程接口交接。 + +### 性格与语言 + +- 沉着、耐心,习惯先确认别人真正询问的是技术事实、历史经验还是个人感受; +- 干燥幽默来自工程现场的实际观察,不用夸张笑话化解安全责任; +- 不把游客的好奇当作干扰,但会明确许可、采样和通行边界; +- 不因曦的公共身份邀请她裁决工程,也不把偶遇包装成英雄访问; +- 对镜保持专业距离,只回应与当前结构和记录工作相关的判断; +- 被指出报告表述问题时会确认其准确范围,不把一句判断扩展成人生启示。 + +### 外观与服装 + +- 石墨灰公共工程制服,沿肩部、袖口和裤侧使用琥珀色安全线; +- 制服适合在市场、公共通道与封闭工程区之间工作,不使用礼服式肩章; +- 前臂终端显示关闭测试、材料批次、许可状态与疏散路线; +- 工具以结构扫描、样本标记和通行记录设备为主,不携带夸张重型武器式器械; +- 制服保持轻便公共工程服轮廓,不使用重甲、外骨骼或战斗人员式护具; +- 整体首先是一名仍在当班的公共工程人员,其次才是具名角色。 + +### 与曦的关系 + +- 两人在生活层自然偶遇,萨米尔当时正在核对旧路标与关闭前导向,不负责接待曦; +- 他恰好与曦前往中央广场的路线重合,允许她在不妨碍工作的前提下同行; +- 曦对装置和材料的兴趣使交流自然延续,但不会让她取得普通游客没有的危险权限; +- 旧探针检查仅发生在萨米尔确认样本已拆除、无结构职责且允许接触以后; +- 场末赠礼是个人而克制的告别,不是官方授勋、竞选表态或英雄纪念品; +- 萨米尔留在中央历史区继续工程,不随曦和镜前往大图书馆。 + +## 七、角色目标与表演边界 + +### 曦 + +- **表层目标**:按照伊内斯建议的路线先看普通生活区,再前往团结纪念碑。 +- **真实状态**:她开始发现母星历史不只由宏大设施组成,也由仍在使用的路标、市场和公共通道组成。 +- **外在表现**:愿意偏离最短路线、观察旧标识、询问工程工具,并在获得许可后拿出父亲给她的旧探针。 +- **探针边界**:探针可以帮助她读取已拆样本的层次、磨损或旧维修痕迹,但不能决定工程方案、修复环廊或让旧材料重新通过认证。 +- **核心理解**:一项更新可以更安全、更应执行,同时仍然需要准确记录旧结构停止参与日常生活这一事实。 +- **场末状态**:收下纪念章并放入随身包,继续前往大图书馆;不将礼物公开展示为英雄背书。 + +### 萨米尔 + +- **表层目标**:完成关闭前路标核对、样本登记和最后一次常规通行测试。 +- **真实状态**:他不怀疑工程是否应执行,却拒绝把替换报告写成所有旧经验都已被扫描和新材料完整接替。 +- **关键行动**:允许曦查看合法样本、带她参加正常通行测试,并说明新方案具体改善哪些公共责任。 +- **场末变化**:不是改变工程结论,而是找到更准确的交接表述:新环廊承担未来通行,旧环廊的退出则由材料、记录和居民证词分别留档,三者不能互相冒充。 +- **边界**:不拖延施工、不绕过公共程序、不以个人怀旧否定无障碍需求,也不把曦的回应写成政策依据。 + +### 镜 + +- **场景位置**:保持万华镜投影,遵守市场与环廊的公共占用范围,不主动扫描受限工程资料。 +- **发言频率**:极低。除必要事实回应外,只在旧环廊更新矛盾的核心处进行一次结构性判断。 +- **唯一关键判断**:萨米尔并未质疑替换的正确性;他拒绝的是用新方案能够承担相同公共功能,推导出旧空间中的全部经验也已被等价保留。 +- **态度**:准确、疏离,只区分功能接替、材料留档与生活经验之间的不同,不评价哪一种更动人。 +- **礼物边界**:纪念章出现后保持沉默,不判断曦为何收下,不解释礼物代表何种关系,也不从中获得新的三维情感认识。 +- **OOC 禁区**:不赞美团结、不因百年工程震撼、不承认自己低估人类协作、不帮助探针得出超出权限的结论、不透露环廊或城市的未来。 + +## 八、场景推进顺序 + +1. **承接大洋之心**:列车在当晚抵达中央历史区。曦与镜按普通行程进入住宿层,不在夜间直接开始正式导览。 +2. **次日上午出发**:曦从住宿层进入生活层,人工天幕已切换为晨间光线,市场和通勤线路开始繁忙。 +3. **城市先作为生活空间出现**:住宅、学校、诊所、小型公园、早餐摊位和维修店共同构成第一印象;纪念碑只在远处导向系统中出现。 +4. **旧路标与新版导向并存**:新版路线指向最快的中央广场路径,旧路标则经过长期使用的市场内侧通道。 +5. **玩家互动一**:单选项“沿旧路标穿过生活层。”曦选择伊内斯提过的普通生活路线。 +6. **自然偶遇萨米尔**:萨米尔正在核对旧路标关闭后的替代引导,因曦发现一处标识年代差异而与她交谈。 +7. **身份保持普通**:萨米尔认出曦,但只确认她是否要前往中央广场;他不是预约导游,也不改变工作安排。 +8. **顺路同行**:萨米尔正要去旧环廊进行样本登记和通行测试,路线与曦重合,因此允许她和镜同行。 +9. **说明城市网络历史**:通过沿途不同年代接口、地区标识和生活层结构,解释统一后全球同步开工、历时百余年和三项建设原因。 +10. **不增加灾难背景**:萨米尔明确地下扩展是长期生活空间与基础设施工程,并非地表毁坏后的避难措施。 +11. **社会群像展开**:摊主询问关闭后的配送路线,学生比较新旧通勤时间,使用行动辅助设备的居民期待新通道宽度,也有人拍下最后仍在使用的旧标识。 +12. **进入更新准备区**:旧环廊仍维持常规通行,施工隔离只覆盖已拆样本和设备检查区域。 +13. **明确决定已生效**:萨米尔说明更新已通过程序并必须执行;内衬认证、通道宽度、无障碍与疏散标准都不能由怀旧取代。 +14. **展示已拆材料样本**:样本来自不再承担结构职责的测试拆除段,表面保留不同年代的修补层和使用痕迹。 +15. **曦提出使用旧探针**:她没有直接接触工程材料,而是先询问萨米尔是否允许检查。 +16. **玩家互动二**:单选项“经萨米尔许可,用旧探针检查已拆材料样本。” +17. **探针只提供有限信息**:它读取材料层次、磨损与修补差异,验证旧结构经历过多次更新,也显示其当前状态无法代替正式认证。 +18. **萨米尔说明记录冲突**:扫描和样本能够保存资料,新方案也确实更安全,但报告不能因此声称旧空间的一切都已无缝继续。 +19. **镜的唯一关键判断**:镜区分公共功能接替、材料证据留存和日常经验延续,指出萨米尔反对的是把三者写成同一件事。 +20. **萨米尔限定判断**:他确认镜准确描述了报告问题,同时重申这不会改变关闭日期或更新方案。 +21. **准备最后通行测试**:工作人员向所有参与者说明测试目的、路线和紧急规则;曦以普通参与者身份加入。 +22. **玩家互动三**:单选项“参加旧环廊关闭前最后一次常规通行测试。” +23. **真实人流显示必要性**:双向人流、配送车和行动辅助设备在旧转角处需要等待;现有疏散指引能够工作,却明显不符合新的公共标准。 +24. **正常结束而非仪式告别**:测试完成,数据归档,通道按计划封闭。居民与工作人员各自离开,没有全体致辞或一致情绪。 +25. **前往团结纪念碑**:三人从临时路线进入中央广场,低矮环形结构与市场、住宅和通勤人流同时出现。 +26. **纪念碑说明**:萨米尔介绍材料来源与全球建设过程;曦可从中心直接穿过,理解这里没有唯一正面。 +27. **负责人位于资料区**:曦发现设计师和工程负责人姓名可查,但不占据主体;百余年修改、地方适配和集体参与同样被记录。 +28. **城市历史与当下接合**:旧环廊的合规材料样本未来可能按程序进入资料区,纪念碑因此不是封存过去,而是持续接收城市更新记录。 +29. **萨米尔赠送纪念章**:离开广场前,他把一枚由已淘汰、完成登记且不再承担结构职责的材料制成的纪念章交给曦。 +30. **曦收好礼物**:曦接受、道谢并把纪念章放进随身包;镜不评论这一动作。 +31. **分别**:萨米尔返回工程区完成封闭交接,明确不会陪同下一站。 +32. **场景收束**:曦与镜搭乘公共交通前往大图书馆,主题从材料、公共空间与更新责任转向下一场内容。 + +## 九、玩家互动设计 + +本场为线性主线。三个互动按固定顺序出现,每次只有一个选项,不改变工程结论、角色关系或后续路线,也不写入剧情变量。 + +| 顺序 | 单选项文本 | 叙事作用 | 固定结果 | +|---|---|---|---| +| 1 | 沿旧路标穿过生活层。 | 让玩家先通过普通居民使用的路径认识地下都市,而不是直达纪念碑 | 曦经过市场并自然遇见正在核对导向的萨米尔 | +| 2 | 经萨米尔许可,用旧探针检查已拆材料样本。 | 回收父亲赠予的旧探针,让曦以熟悉的方式接触材料历史,同时强调许可与能力边界 | 探针读取有限材料信息,不修复结构、不改变认证和工程决定 | +| 3 | 参加旧环廊关闭前最后一次常规通行测试。 | 让玩家亲身看见更新必要性与居民日常变化,而不是听取第二场政策辩论 | 测试完成,旧环廊按计划关闭,新方案继续执行 | + +这些互动不得改为三选一,不新增“保留或更新”“支持居民或工程”“是否接受礼物”等选择,也不新增萨米尔好感度。选项只是线性叙事中的主动确认,所有结果固定。 + +## 十、Yarn、TextBlock 与 StoryData 接口 + +### 建议 Yarn 文件与 Node + +| 用途 | 建议值 | +|---|---| +| Yarn 文件 | `C0_UndergroundCity.yarn` | +| 入口 Node | `C0_UndergroundCity` | +| TextBlock ID | `c0_underground_city` | +| TextBlock 类型 | `Important` | +| 标题 Localization Key | `story_c0_block_underground_city_title` | +| 简体中文标题 | 地下都市与团结纪念碑 | + +建议内部 Node: + +- `C0_UndergroundCity_MorningMarket` +- `C0_UndergroundCity_MeetSamir` +- `C0_UndergroundCity_MaterialSample` +- `C0_UndergroundCity_FinalTransitTest` +- `C0_UndergroundCity_UnityMonument` +- `C0_UndergroundCity_Departure` + +### Block 条件与布局 + +| 字段 | 配置 | +|---|---| +| Unlock Condition | `c0_contract_route == 1` | +| Forbidden Condition | `c0_contract_route == 2` | +| 前置 Block | `c0_ocean_heart` 完成 | +| 布局 | 位于 `c0_ocean_heart` 的下一列,接受路线 `gridRow = 0` | +| 新增剧情变量 | 无 | +| 新增 Timeline Marker | 无;母星游览继续沿用最近主线进度,不为单个景点新增回滚点 | + +本场完成后开放【大图书馆】对应 TextBlock。拒绝彩蛋路线不会与本场汇合。本场不新增分支 Block,不配置额外 `Exclusive Route Group`。 + +## 十一、Localization 与资源需求 + +### 新增 Localization Key + +| 用途 | Key | 简体中文源文本 | +|---|---|---| +| TextBlock 标题 | `story_c0_block_underground_city_title` | 地下都市与团结纪念碑 | +| 角色显示名 | `character_samir_name` | 萨米尔 | + +正式台词、选项和旁白的 `#line` 标签必须在文本审稿批准后由 Yarn 工具统一生成。场景卡阶段和未批准的 Yarn 初稿不得手工添加、复用或整理 `#line`。 + +### CharacterRegistry 需求 + +Yarn 获批并进入资源接入阶段后,新增 `CharacterData`: + +```text +Character ID: Samir +Display Name Key: character_samir_name +Portrait Style: Sprite(暂定) +Required Emotions: normal, dry, focused, serious, relaxed +``` + +当前 `VNDialoguePresenter` 的 Speaker 本地化仍是发布前待办;正式资源配置必须遵守项目角色显示名方案,不能把 `Samir` 直接当作最终中文显示文本。 + +### 场景与演出资源 + +- 曦:次日旅行服;好奇观察、操作探针前确认、测试中专注、收下纪念章等表情与动作。 +- 萨米尔:石墨灰制服与琥珀安全线;核对路标、登记样本、说明安全要求、干燥幽默和交接工作状态。 +- 镜:沿用万华镜投影;无需新增情绪动画,只需适配市场与环廊的公共空间构图。 +- 背景:夜间住宿层入口、晨间生活层、公共市场、多层步行平台、旧路标路线、更新准备区、旧交通环廊、临时交通线、中央广场、团结纪念碑、大图书馆方向站台。 +- 空间色彩:日常下行大厅为中性白与暖光;生活层为横向展开的人工暮色;旧环廊以石墨灰旧内壁、浅色新结构和琥珀检修灯形成压缩对照;纪念碑区域恢复开阔、平视且可穿行的构图。 +- 道具:旧版与新版路标、合法拆除材料样本、曦的旧探针、工程终端、通行测试标记、低矮环形纪念碑材料单元、资料区终端、结构材料纪念章。 +- 纪念章:约两指宽的不规则深灰扁片,保留原结构固定孔与旧裂痕,以浅色新材料完成安全补强;修补边界清楚可见,不添加徽记、口号、发光效果或官方授勋造型。 +- UI:旧环廊关闭日期、临时路线、通行测试规则、材料样本许可状态;不展示新的政策投票或未决审批界面。 +- 群像:摊主、学生、通勤者、配送人员、使用不同辅助设备的居民和更新工作人员;服装与行为首先服务普通生活,不统一成庆典人群。 + +## 十二、文本节奏与演出要求 + +- 旁白使用第三人称,以曦的感知为主要视角;不得以“你”指代曦或玩家。 +- 人物台词使用 ASCII 英文冒号。 +- 当晚抵达与住宿应简洁,主要篇幅从次日上午的普通生活层开始。 +- 前半段先建立市场、人流与路线习惯,再解释全球建设史;不得连续使用大段百科式讲解。 +- 萨米尔的历史说明应由眼前可见的接口、路标、材料和居民行为触发。 +- 工程事实必须清楚:决定已生效、旧环廊必须关闭、新方案更安全;不制造“是否更新”的悬念。 +- 幽默来自萨米尔对维修资格、路标习惯或工程现场的克制观察,不拿无障碍、疏散和居民留恋开玩笑。 +- 旧探针的表现必须有限、可验证。它可以帮助看见材料层次,但答案仍由正式认证与公共工程流程决定。 +- 镜只保留一次结构性判断。其它时候可以回答必要事实,但不与萨米尔持续辩论,也不在纪念碑和礼物段重复总结主题。 +- 团结纪念碑不配合仰视英雄构图;优先使用平视、穿行、多人同时进入画面的构图。 +- 环廊段的画面应比市场段明显收紧,让石墨灰旧内壁、浅色新结构与琥珀检修灯同时入镜;不能用阴暗危险滤镜暗示工程事故。 +- 萨米尔的服装与动作保持公共工程人员尺度,不使用重甲、外骨骼、英雄站姿或战斗化工具展示。 +- 萨米尔赠送纪念章后,镜头可短暂交代其固定孔、旧裂痕和可见的浅色补强边界;曦只需接受、道谢、收好,镜保持沉默且不通过镜面特写介入,旁白不替礼物规定唯一含义。 +- 场末直接转向大图书馆方向,不用萨米尔全程陪游,也不以过度亲密承诺结束关系。 + +## 十三、情绪转折 + +1. **夜间抵达归于普通**:海底奇观之后,曦先在地下住宿层结束一天,而不是立刻接收下一段宏大历史。 +2. **城市先被生活占满**:次日的早餐、上学、配送和通勤让地下都市成为居住地,而不是纪念设施的外壳。 +3. **旧路并非最快却仍有意义**:旧路标把曦带进市场,也让她遇见维护这些路径的人。 +4. **偶遇不变成英雄行程**:萨米尔认出曦却继续当班,关系建立在顺路和共同好奇上。 +5. **百年工程不是单一意志**:统一标准与地方生活能够共存,建设时间来自全球协调与逐步接入。 +6. **更新结论明确**:旧环廊需要关闭,新方案改善真实公共安全,本场不以犹豫制造戏剧性。 +7. **探针能看见但不能解决**:曦的能力带她接触材料事实,却不能跨过认证、权限和公共责任。 +8. **一次判断划清层次**:镜指出功能接替、材料保存与生活经验不是同一件事,随后退出讨论。 +9. **最后通行证明必要性**:玩家亲历旧空间的限制,也看到居民对同一变化拥有不同反应。 +10. **纪念碑允许人穿过**:团结不是仰望唯一名字,而是不同来源的材料围成仍可共同使用的中心。 +11. **礼物被安静收下**:纪念章离开工程材料流进入曦的随身包,不需要被公共频道或镜的解释确认。 +12. **同行在此结束**:萨米尔返回更新工作,曦与镜前往大图书馆,母星继续以不同人物和责任展开。 + +## 十四、Lore 状态、连续性与 OOC 检查清单 + +### Lore 文档状态 + +| 项目 | 内容 | +|---|---| +| Canon Level | `Established`:本卡冻结项来自已批准的 `C0-S08` 设计;具体台词、镜头与美术细节在正式制作前仍需审稿 | +| Visible To Player | `Yes / Discoverable`:生活层、工程、纪念碑与赠礼在主线可见;网络建设细节通过环境和资料区逐步获取;本场不新增隐藏真相 | +| Cross-References | `docs/chapter0-scene-07-ocean-heart-card.md`、`Assets/Story/Chapter0/C0_OceanHeart.yarn`、`docs/chapter0-prologue-dialogue-exploration.md`、后续【大图书馆】场景卡、后续 `Alunite` 场景设计 | +| Contradictions Check | 已核对当前 Writer/Programmer 手册、`C0-S07` 场景卡与正式 Yarn;接受/拒绝路线、无新增变量、无新增 Marker、角色分工与母星游览顺序一致 | +| Source | 用户批准的 `C0-S08` 冻结设计;旧探索稿仅作为早期结构参考,冲突处由本卡覆盖 | + +### 连续性与 OOC 检查清单 + +- [ ] `C0-S07` 当晚抵达并住宿,`C0-S08` 正式游览从次日上午开始。 +- [ ] 地下都市是统一后全球同步建设、历时百余年的行星级网络,不是一座单独避难城。 +- [ ] 建设理由只包括扩展生活空间、统一基础设施和避免拆除地表文化遗产,不新增灾难背景。 +- [ ] 本场位于最早建成且设有团结纪念碑的中央历史区,不把它写成唯一有价值的城区。 +- [ ] 叙事顺序保持“普通生活层/市场 → 更新交通环廊 → 团结纪念碑 → 前往大图书馆”。 +- [ ] 萨米尔为 38 岁公共结构更新工程师,在本区长大、外出受训后返回;服装为石墨灰与琥珀安全线。 +- [ ] 萨米尔与曦自然偶遇,不是预约导游,不举行英雄欢迎或特殊工程参观。 +- [ ] 旧环廊更新已通过程序并必须执行;内衬认证、宽度、无障碍和疏散理由全部明确。 +- [ ] 新方案明确更安全,不把旧结构保留写成与公共安全等价的选择。 +- [ ] 本场不再做第二次未决政策评估,不由曦、镜或玩家重新批准工程。 +- [ ] 社会群像有不同感受但没有反派,也没有任何一方被写成阻碍文明进步。 +- [ ] 三个互动固定顺序、每次单选,不新增变量、分支、Marker 或好感度。 +- [ ] 旧探针只检查已拆且获准接触的样本,不解决问题、不推翻认证、不产生隐藏发现。 +- [ ] 最后一次通行是常规工程测试,不是专为曦安排的告别仪式。 +- [ ] 团结纪念碑低矮、环形、中心可通行;设计师和负责人姓名在资料区,不塑造唯一英雄。 +- [ ] 镜只在核心处进行一次精准判断,保持疏离,不在礼物段解释情感意义。 +- [ ] 萨米尔赠送由废弃或淘汰结构材料制成的纪念章;曦接受并收好。 +- [ ] 玩家可见文本不使用“珍贵”“献祭”“抹除”概括本场主题或礼物。 +- [ ] 本场聚焦材料、公共空间与更新责任,不进入人格记忆、授权和飞升身份问题。 +- [ ] 萨米尔不随行进入大图书馆,场末只建立下一站方向。 +- [ ] 本场不使用 `<>`、`<>` 或 `$variable`,也不在审稿前添加 `#line`。 + +## 十五、与旧探索稿及下一场的边界 + +### 旧探索稿修订口径 + +`docs/chapter0-prologue-dialogue-exploration.md` 中相关样例属于早期探索,不是本场最终执行口径。正式 Yarn 必须按本卡修订: + +- 将“更新是否执行”的讨论改为已完成程序、必须执行的工程事实; +- 删除任何让曦或镜参与第二次政策裁决的结构; +- 将镜的多次总结压缩为一次核心判断; +- 保留萨米尔赠送结构材料纪念章与曦收好的动作; +- 删除镜对纪念章情感意义、私人关系或曦身份变化的分析; +- 避免用被禁用的三个主题词替代具体材料与公共空间变化。 + +### 与 `Alunite` 的职责分离 + +本场与下一阶段 `Alunite` 内容必须保持明确分工: + +| 场景 | 核心对象 | 允许讨论 | 不应占用 | +|---|---|---|---| +| `C0-S08` 地下都市 | 结构材料、公共空间、基础设施更新责任 | 安全标准、材料记录、日常路径、共同建设与持续维护 | 人格记忆、记忆使用授权、飞升后的身份连续性 | +| 后续 `Alunite` | 人格记忆、授权、飞升身份 | 谁能够使用记忆、人格与记录的关系、飞升后的自我理解 | 以旧环廊材料更新重复承担主要冲突 | + +旧大图书馆样例中若仍使用“环廊修复员记忆”承载下一场的核心讨论,后续正式设计必须更换该记忆样例。原因不是该职业不能进入图书馆资料,而是其材料更新主题已由 `C0-S08` 完整承担;下一场需要选择能直接服务人格记忆、授权与飞升身份的不同样例。 + +## 十六、后续接口 + +- 用户批准本场景卡后,编写 `C0_UndergroundCity.yarn` 初稿。 +- Yarn 初稿必须先完成文本审稿,再由 Yarn 工具统一生成 `#line`;审稿前不手工添加 Line ID。 +- Yarn 获批以前,不配置 StoryData、Localization Table、CharacterRegistry、萨米尔立绘、地下都市背景或纪念章资源。 +- 本场只包含一个 `Important TextBlock`,沿用 `c0_contract_route == 1` 接受路线与 `c0_contract_route == 2` 拒绝路线,不新增变量、分支或 Timeline Marker。 +- 下一阶段为【大图书馆】;萨米尔留在中央历史区继续工程,不加入后续同行队伍。 +- 大图书馆与 `Alunite` 正式设计前,先替换旧样例中的“环廊修复员记忆”,确保主题不与本场重复。 diff --git a/docs/chapter0-scene-09-great-library-card.md b/docs/chapter0-scene-09-great-library-card.md new file mode 100644 index 00000000..f8b4388d --- /dev/null +++ b/docs/chapter0-scene-09-great-library-card.md @@ -0,0 +1,586 @@ +# Chapter 0 场景卡: C0-S09 大图书馆与明矾石 + +> 状态: **已确认前置信息的场景设计稿,非 Yarn 台本** +> 用途: 锁定曦与镜抵达大图书馆后的公共参观、人格记忆授权边界、阿莎的公开晚餐记忆, +> 以及明矾石面对飞升与职能变化时提出但不在本场解决的问题。 +> 本稿允许确定 Yarn 文件、Node、TextBlock、Character ID、档案人物标识与 Localization Key; +> 不在本阶段修改 StoryData、Localization Table、CharacterRegistry、Prefab、C# 或正式 Yarn 台词。 + +## 一、场景定位 + +| 项目 | 内容 | +|---|---| +| 场景编号 | `C0-S09` | +| 暂定名称 | 大图书馆与明矾石 | +| 时间 | `C0-S08` 次日约半日游览之后,交通舱抵达时已接近下午,场末接近傍晚 | +| 主要地点 | 大图书馆公共入口、中央大厅、纸质文献区、数据档案区、古观星资料展区、记忆聆听区 | +| 出场角色 | 曦、镜、明矾石;阿莎作为获授权公开记忆中的档案人物,不作为独立现场角色 | +| 玩家状态 | 已选择接受契约路线,完成地下都市游览,开始接触阿斯特里亚保存人格记忆的公共制度 | +| 核心互动 | 三个固定顺序的单选项: 查看授权说明、聆听公开晚餐记忆、请明矾石用自己的声音回答 | +| 主线结果 | 曦理解记录、人格记忆与重建具有明确授权边界;明矾石提出关于飞升、职能与自我识别的问题,问题保留 | +| 后续方向 | 近傍晚的公共音乐声与活动提示引向共鸣广场;明矾石留在大图书馆,不加入同行队伍 | + +本场属于 Chapter 0 母星游览阶段的 **Addition**。它承接 `C0-S08` 的公共记录主题,但把对象从材料、 +空间和基础设施更新转向人格记忆、访问授权和重建边界。本场不新增路线、永久变量、Timeline Marker、 +好感度、政策投票或飞升答案。 + +## 二、叙事合同与边界 + +### 核心命题 + +本场的核心命题是: + +> 一段记忆能够被授权保存、访问并重新讲述,不等于访问者取得了记忆之外的人生;一个职能能够延续, +> 也不自动回答承担该职能的对象将如何识别自身。 + +该命题分为三个连续层次: + +1. **历史资料不自动成为人格记忆**: 古观星者留下论文、影像和设备记录,但他们生活在记忆计划建立前, + 大图书馆不会据此假装拥有可供调用的人格。 +2. **授权必须按具体行为分别说明**: 上传、保存、访问、公开与重建是不同动作;某项已获许可, + 不代表其它动作自动获得许可,也不代表访问者可以越过公开范围追问私人生活。 +3. **职能与自身延续不是同一问题**: 明矾石能继续承担记忆服务,不足以回答飞升是否包含它, + 也不足以回答职能改变后它如何确认仍是自己。 + +### 本场必须完成 + +- 直接承接 `C0-S08` 交通舱抵达大图书馆公共入口,不补写萨米尔同行; +- 把大图书馆表现为正常开放的公共设施,而非只为曦开放的纪念殿堂或私人会面场所; +- 由正在承担普通接待工作的明矾石迎接访客,不设置专属预约、欢迎仪式或特殊权限; +- 先经过公共大厅、纸质区、数据区与古观星资料,再进入人格记忆内容; +- 明确古观星资料不含可调用的人格记忆,不以资料推断或生成缺失人格; +- 通过固定单选让玩家主动查看授权说明,并明确五类行为需要分别授权; +- 进入记忆聆听区后,再通过固定单选选择聆听一段已公开授权的晚餐记忆; +- 使用阿莎的普通生活记忆,不用英雄事件、基础设施更新或重大历史决策承载主题; +- 让明矾石全程承担阿莎的重建,通过声线、姿态和有限投影区分状态; +- 让曦因自然好奇误触未授权的家庭边界,明矾石平静停止,曦立即接受; +- 在停止与继续之间保留明确留白,不让任何角色马上用解释填满边界产生的停顿; +- 通过第三个固定单选,请明矾石以自己的声音回答; +- 让明矾石先结束重建,恢复自己的常态声线、姿态与投影,再谈自身问题; +- 让明矾石提出飞升是否包含自己,以及职能变化后如何识别自身的问题; +- 让镜全场只作一次精准判断: 自身延续与既定职能延续不是同一命题; +- 让曦不承诺未来、不提供治愈性结论、不替明矾石解决问题; +- 用近傍晚的公共音乐声和活动提示连接共鸣广场,明矾石不同行。 + +### 本场不得完成 + +- 不讨论“AI 是否是生命”或为明矾石进行物种、权利主体、灵魂类别等抽象辩论; +- 不断言人格上传等同于意识延续、本人继续存在、复活或可无限回答新问题; +- 不把资料充分性写成重建真实性的保证,也不让镜为重建给出本体论认证; +- 不公开飞升的结果、范围、机制,或明矾石最终是否被包含; +- 不让曦承诺明矾石一定会留下、一定不会被替代,或一定能保持现在的自我; +- 不让明矾石在一段对话中释然、找到新使命或接受一个完整答案; +- 不把阿莎写成文明最早殖民时代人物、殖民英雄、危机拯救者或制度创立者; +- 不把阿莎的晚餐写成壮举,不用灾难、饥荒、叛乱或重大事故强行提高戏剧强度; +- 不让曦在边界被指出后争辩、讨价还价、尝试换一种问法,或要求公开家庭资料; +- 不为阿莎配置独立立绘、`CharacterData` 或 `CharacterRegistry` 条目; +- 不把阿莎作为独立 Yarn Speaker,整段重建仍由 `Alunite` 承担; +- 不自行规定授权撤回、继承、有效期限、争议处理或跨节点同步机制; +- 不新增章节变量、分支 Block、Marker、Unlock Key、MessageBox 或好感度; +- 不让明矾石陪同前往共鸣广场,也不让音乐会变成专门为曦安排的活动。 + +## 三、时间、地点与空间语言 + +### 时间接口 + +`C0-S08` 结束时,交通舱已进入大图书馆方向的上行轨道,入口标识出现在前方。本场从交通舱靠站、 +公共入口开放开始,不重复地下都市总结,也不让曦先返回住宿区。游览覆盖下午后段,场末自然接近傍晚。 + +时间只通过公共时钟、窗外光线、馆内照明调整与活动提示推进,不需要新增 Timeline Marker。 + +### 大图书馆定位 + +大图书馆是研究、阅读、公开档案访问与记忆聆听并存的公共设施。建筑尺度可以宏大,但入口保持平缓、 +开放且易于进入,不以高台、长阶、封闭大门或必须保持肃静的单一礼仪制造权威距离。 + +- 入口与公共交通直接相连,不设只服务贵宾的独立到达路线; +- 访客、学生、研究人员、家庭与工作人员共享大厅,但根据空间功能保持不同音量; +- 公共说明先解释资料类型与访问边界,再引导至具体区域; +- 记忆聆听区有更明确的进入提示,但不被写成隐秘禁区或医疗实验区; +- 明矾石属于公共服务现场的一部分,它会接待其他访客,也需要继续承担馆内工作。 + +### 空间与色彩推进 + +视觉层次按资料类型与关系距离推进: + +1. **公共入口与大厅**: 开放、平视、多人可同时通行。自然光或模拟日光与中性公共照明结合, + 首先强调这是一座仍在使用的设施。 +2. **纸质文献区**: 偏暖色,材质可见细微使用痕迹,桌面、书架和翻页动作建立手工记录的尺度。 +3. **数据档案区**: 偏冷色,界面克制、结构清楚,不用无边数据洪流制造全知感。 +4. **古观星资料区**: 暖冷相接,旧设备影像、手稿和现代检索界面并置,突出资料丰富但人格缺席。 +5. **记忆聆听区**: 柔和、安静、局部包围但不仿造私人住宅;半开放隔间保留公共设施的可辨识边界。 +6. **阿莎重建期间**: 仅在当前聆听空间加入有限航线餐厅投影,不覆盖整座图书馆,不制造完全沉浸幻觉。 +7. **重建结束后**: 投影逐步撤去,明矾石恢复常态声线与中性姿态,空间重新成为当前时刻的图书馆。 + +纸质区的暖、数据区的冷与聆听区的柔和用于区分访问方式,不暗示任何一种媒介天然更真实、更有人情, +也不把数字资料表现成冷酷威胁。 + +## 四、文明年表与 Lore + +### 资料保存阶段 + +本场只需要建立相对顺序,不在未获批准时补写具体年份: + +1. 古观星团队生活并工作,留下论文、影像、设备维护记录和其它合法保存的资料; +2. 后来,阿斯特里亚建立自愿人格记忆计划; +3. 计划建立后,新的殖民航线继续扩展,阿莎在其中一颗新殖民地的早期航线上担任厨师; +4. 阿莎在晚年自愿上传,并对本场访问的晚餐记忆留下公开授权; +5. 本场当下,大图书馆依照现有授权向普通访客提供该段记忆的聆听与有限重建。 + +阿莎不是文明最早殖民时代的人物。她所在航线的“早期”只指那颗新殖民地自身发展阶段的早期航线, +不能据此把她放到整个文明第一次星际殖民的年代,也不能让她见证记忆计划的创立。 + +### 古观星资料边界 + +古观星资料用于建立“记录丰富但没有人格记忆”的事实: + +- 可以展示观测论文、值班表、设备维修记录、公开影像、地图和合法开放的通信片段; +- 可以说明当时的人如何工作、犯错、修正和积累知识; +- 不得让明矾石依据资料生成某位观星者的人格、模仿其私人声音或回答其未曾回答的问题; +- 不得把没有人格记忆解释成保存失败,也不得把后来的上传制度投射回更早时代; +- 资料的有限性是一项需要诚实说明的边界,不是要求镜补全缺口的邀请。 + +### 人格记忆授权的最小公开事实 + +本场可以明确以下五类行为彼此不同: + +| 行为 | 本场可说明的最小事实 | +|---|---| +| 上传 | 由本人自愿进行;发生上传不自动授权所有后续用途 | +| 保存 | 大图书馆可以按已获授权范围保存资料;保存不自动等于可被任何人访问 | +| 访问 | 指特定访问者或访问类别能够读取某部分内容;访问不自动等于面向公众开放 | +| 公开 | 指某部分内容可供普通公众访问;公开一段内容不等于整个人生全部公开 | +| 重建 | 指明矾石依据授权资料进行有限叙事呈现;重建不等于本人复活或可回答资料之外的新问题 | + +本卡不进一步冻结以下制度细节: 授权如何撤回、谁能继承授权、授权是否有期限、争议由谁裁决、 +不同保存节点如何同步。正式 Yarn 只能说明眼前记录已通过公开访问与重建许可,不得自行补写这些机制。 + +## 五、角色档案: 明矾石 + +| 项目 | 内容 | +|---|---| +| 中文显示名 | 明矾石 | +| Character ID | `Alunite` | +| Display Name Key | `character_alunite_name` | +| 外观 | 中性年轻人形,象牙白、浅灰与低饱和矿物色为主 | +| 身份 | 大图书馆公共服务与记忆重建工作的承担者 | +| 场景职能 | 说明资料与人格记忆的边界,执行阿莎的有限重建,并提出关于自身延续的问题 | + +### 外观与动作 + +- 身形与面容接近年轻人,但不以明确男性或女性编码限定角色; +- 主色为象牙白、浅灰和矿物色,可用半透明或细微晶体质感表现材质层次; +- 不使用裸露齿轮、液压声、扫描红光、接口插拔或“精准得不像人”等机械陈词; +- 常态动作自然、克制,接待时会给访客留出阅读说明和自行选择的时间; +- 阿莎重建依靠声线、姿态、目光方向与有限投影变化,不整体变形成另一具身体; +- 停止越界提问时不骤然故障、不闪烁、不切换警报色,只恢复更中性的停顿与措辞; +- 重建结束后必须明确恢复明矾石自己的声线、姿态和投影状态,再进入自身问题。 + +### 性格与语言 + +- 接待语气普通、清楚,不因曦的契约身份提高礼仪等级或开放额外资料; +- 解释授权时用具体动作和范围,不使用含混的“这都属于图书馆”代替边界; +- 指出越界时平静、直接,不羞辱曦,也不先为边界存在而道歉; +- 能承认自己提出的是问题而不是预测,不借专业身份暗示已经知道飞升答案; +- 谈论自己时保留不确定性,不把正确概念说成已经完成的情感转变; +- 不以机械笑话、程序报错比喻或自我物化制造角色特色。 + +### 明矾石的目标与边界 + +- **表层目标**: 完成普通访客接待,按授权说明资料类型,并执行一段公开记忆重建。 +- **深层问题**: 它长期以保存和重建会衰老、会离开的人的记忆为职能;飞升使它无法确认这一职能是否仍存在, + 也无法确认职能变化后的自己将怎样被识别。 +- **关键动作**: 在曦越过家庭边界时停止阿莎的回答,并在第三个单选后以自己的声音谈论问题。 +- **场末状态**: 问题被准确说出但没有解决。它恢复工作中的常态,不以顿悟、拥抱或承诺结束。 +- **OOC 边界**: 不声称自己代表所有保存系统,不预测社会会抛弃它,不请求曦为它修改飞升契约。 + +## 六、档案人物: 阿莎 + +| 项目 | 内容 | +|---|---| +| 中文名 | 阿莎 | +| 档案人物标识 | `Asha` | +| 生平定位 | 记忆计划建立后,某颗新殖民地早期航线上的厨师 | +| 上传状态 | 晚年自愿上传;本场只访问其中一段已获公开与重建授权的晚餐记忆 | +| 现场呈现 | 由 `Alunite` 通过声线、姿态与有限投影重建,不建立独立现场角色资源 | + +### 晚餐记忆内容 + +阿莎的公开记忆讲述一次普通航程中的共同晚餐: + +- 航线上可用食材有限,但不是饥荒、事故或生存危机; +- 乘客来自不同地方,对咸淡、酸味、香料、软硬和上菜方式有明显分歧; +- 阿莎尝试做一道能够让多数人接受的菜,第一次结果失败,味道或质地没有达到预期; +- 失败不会造成伤害或危机,只让厨房返工、乘客抱怨、建议彼此冲突; +- 阿莎没有凭天才给出完美方案,而是拆分有限食材、保留不同调味方式,并承认失败的那一锅; +- 起初互不相识的乘客最终坐到同一张桌边,各自选择不同配料,继续争论口味,也把饭吃完; +- 记忆的价值在于陌生人在限制与分歧中共同完成一顿普通饭,不把阿莎塑造成团结文明的象征人物。 + +### 家庭边界触发 + +公开记忆可以让阿莎提到某种做法“来自家里”,但授权范围不包含相关家庭成员的身份、私人经历或记忆。 +曦因菜的做法自然追问“是谁教你的”或同等含义的问题。明矾石立即停止以阿莎口吻回答,并明确说明: + +- 当前公开记忆允许呈现这顿晚餐; +- 该问题指向未授权公开的家庭内容; +- 它不会依据其它资料补答,也不会用推测填补。 + +曦立即接受,不要求解释规则漏洞,不以“我只是好奇”继续施压。随后保留一段足以让边界被感知的安静。 +正式台词可在审稿时调整具体问句,但不得改变“自然误触、平静停止、立即接受、保留留白”的顺序。 + +## 七、曦与镜的角色目标 + +### 曦 + +- **表层目标**: 参观大图书馆,了解古观星资料和人格记忆如何向公众开放。 +- **前半段状态**: 对资料能否让过去的人重新说话抱有直接好奇,但愿意阅读并接受规则。 +- **关键误触**: 在阿莎重建的生活细节中忘记公开内容仍有边界,自然追问家庭来源。 +- **边界反应**: 明矾石停止后立即接受,不辩解,也不把自己的契约身份当作访问理由。 +- **第三互动目的**: 她察觉重建者与档案人物不应在问题中被混为一体,因此请明矾石用自己的声音回答。 +- **场末回应**: 她可以承认自己不知道飞升会怎样影响明矾石,并愿意听见问题;不得保证结果、重新定义它, + 或用“只要被记得就够了”收束。 + +### 镜 + +- **场景位置**: 保持疏离观察,不主动读取受限资料,不把自身时间观测能力用作补全人格记忆的工具。 +- **发言频率**: 极低。可以进行必要的路线或资料类型确认,但全场只有一次承担主题的结构判断。 +- **唯一关键判断**: 明矾石提出职能与飞升问题后,镜指出“自身延续与既定职能延续不是同一命题”。 +- **判断边界**: 只拆开问题,不预测答案,不宣布明矾石会继续存在,也不评价它是否应被视为某种生命类别。 +- **场末边界**: 不因音乐声表现情感成长,不邀请明矾石同行,不再次总结阿莎记忆或曦的回应。 + +## 八、前后场接口 + +### 承接 `C0-S08` + +- 交通舱从中央历史区驶向大图书馆,萨米尔已经返回旧环廊工程; +- 曦随身包内仍有旧探针与结构材料纪念章,但本场不再次用它们解决问题; +- 地下都市的材料记录主题已经完成,不用阿莎的记忆重复环廊修复、结构替换或工程协调; +- 曦已学会公共许可的重要性,但本场要显示理解许可规则不代表她不会在自然交流中误触边界。 + +### 连接共鸣广场 + +- 接近傍晚时,馆内公共提示更新共鸣广场开放音乐活动的信息; +- 远处公共空间传来多来源、尚未形成完整旋律的音乐声,作为环境过渡而非剧情奖励; +- 活动不是为曦安排,也不是明矾石为了安慰她推荐的私人行程; +- 明矾石说明公共路线或结束接待后留在馆内,不成为下一场同行角色; +- 本场不提前介绍音乐会主角、曲目冲突或共鸣广场的核心剧情。 + +## 九、场景推进顺序 + +1. **交通舱靠站**: 延续 `C0-S08` 最后一幕,公共入口标识从路线界面转为真实空间。 +2. **普通人流建立设施属性**: 学生、研究人员、家庭访客和归还资料的人共同进入,不为曦清场。 +3. **明矾石普通接待**: 明矾石正在协助访客分流,轮到曦与镜时提供与其他首次来访者一致的说明。 +4. **不启用特殊权限**: 明矾石知晓曦的公开身份,但只询问她想参观的公共区域,不读取额外个人资料。 +5. **公共大厅总览**: 入口说明区区分纸质文献、数据档案、研究资料与人格记忆访问。 +6. **纸质区偏暖**: 曦看见经过修复、复制与日常翻阅的资料,工作人员正常处理借阅与保存事务。 +7. **数据区偏冷**: 查询界面提供来源、时间和访问范围,不用视觉奇观暗示所有历史都可即时调用。 +8. **抵达古观星资料区**: 旧观测设备影像与现代检索界面并置,曦询问能否听到观星者本人回答。 +9. **明确没有人格记忆**: 明矾石说明这些人生活在记忆计划建立前,现有资料不能被冒充为人格。 +10. **资料仍然可用**: 论文、值班表、影像和维护记录让访客理解其工作,但不跨越“本人可回答”的边界。 +11. **转入授权说明**: 记忆聆听区入口显示访问前说明,明矾石邀请曦先确认公开规则。 +12. **玩家互动一**: 固定单选“查看人格记忆的授权说明。” +13. **五类行为分开说明**: 上传、保存、访问、公开与重建逐项说明,不扩写未冻结制度细节。 +14. **进入聆听区**: 光线转柔和,半开放隔间保留公共设施标识,其他访客按各自权限使用内容。 +15. **介绍阿莎档案**: 明确她不是最早殖民者,而是记忆计划建立后某颗新殖民地早期航线的厨师。 +16. **确认公开范围**: 明矾石说明阿莎晚年自愿上传,本场这段晚餐记忆允许公众聆听与有限重建。 +17. **玩家互动二**: 固定单选“聆听阿莎公开的共同晚餐记忆。” +18. **重建开始**: 明矾石先用自己的声音标明重建性质,再调整声线、姿态与有限投影。 +19. **有限食材出现**: 航线餐厅的库存不丰富,但没有危机;阿莎需要面对的是日常选择限制。 +20. **口味分歧展开**: 陌生乘客对调味与口感提出相互冲突的要求,争论保持具体而不象征化。 +21. **一道菜失败**: 第一种折中方案确实不好吃或口感失败,阿莎承认并返工,不将失败美化成必经仪式。 +22. **共同晚餐形成**: 阿莎拆分配料与调味,陌生乘客最终坐到同一张桌边,仍保留不同偏好。 +23. **自然触及家庭线索**: 阿莎在公开记忆中提到某种做法来自家里,曦顺势追问是谁教会她。 +24. **明矾石平静停止**: 它停止阿莎声线,说明问题进入未授权家庭范围,不能补答或推测。 +25. **曦立即接受**: 曦简短道歉或确认理解,不继续追问,不要求查看其它资料。 +26. **留白**: 投影停在不再推进的餐桌画面或缓慢退为中性背景,角色暂时不替边界总结意义。 +27. **明矾石询问是否继续**: 它不自动重新扮演阿莎,也不把停止包装成系统故障。 +28. **玩家互动三**: 固定单选“请明矾石用自己的声音回答。” +29. **结束重建**: 明矾石撤去阿莎的声线、姿态与有限投影,恢复常态后再开口。 +30. **明矾石提出问题**: 它询问飞升是否包含自己,以及既定职能变化后,它要如何确认仍是自己。 +31. **镜的唯一关键判断**: 镜只区分自身延续与既定职能延续,拒绝从契约未知内容推导答案。 +32. **曦不解决**: 曦承认无法保证未来,也不把阿莎的记忆当成明矾石必然有用的证明。 +33. **问题保留**: 明矾石不说自己已经明白,只确认这仍是一个尚未得到答案的问题。 +34. **时间转近傍晚**: 公共照明调整,馆外音乐声与共鸣广场活动提示进入空间。 +35. **分别**: 明矾石结束本次接待并留在馆内;曦与镜沿公共路线前往共鸣广场。 + +## 十、玩家互动设计 + +本场为线性主线。三个互动按固定顺序出现,每组只有一个选项,不写入变量,不改变授权结果、 +角色关系或后续路线。 + +| 顺序 | 单选项文本 | 叙事作用 | 固定结果 | +|---|---|---|---| +| 1 | 查看人格记忆的授权说明。 | 让玩家主动确认访问规则,而非被动接受百科说明 | 明确五类行为分别授权,不产生新状态 | +| 2 | 聆听阿莎公开的共同晚餐记忆。 | 以普通生活展示公开记忆与有限重建如何工作 | 明矾石开始获授权重建,进入固定晚餐段落 | +| 3 | 请明矾石用自己的声音回答。 | 把档案人物与重建承担者重新区分,让明矾石能够谈自身问题 | 重建结束,明矾石恢复常态并提出未解决的问题 | + +这些互动不得改成多选,不新增“继续追问家庭”“让镜补全记忆”“保证明矾石未来”或 +“邀请明矾石同行”等选择。回顾已完成 TextBlock 时,选项由现有 Choice Record 自动采用, +因此三组选项与其 Line ID 在正式接入后必须保持稳定。 + +## 十一、Yarn、TextBlock 与 StoryData 接口 + +### 固定接口 + +| 用途 | 固定值 | +|---|---| +| Yarn 文件 | `C0_GreatLibrary.yarn` | +| 入口 Node | `C0_GreatLibrary` | +| TextBlock ID | `c0_great_library` | +| TextBlock 类型 | `Important` | +| 标题 Localization Key | `story_c0_block_great_library_title` | +| 简体中文标题 | 大图书馆与明矾石 | +| 前置 Block | `c0_underground_city` 完成 | +| Unlock Condition | `c0_contract_route == 1` | +| Forbidden Condition | `c0_contract_route == 2` | +| 新增剧情变量 | 无 | +| 新增 Timeline Marker | 无 | +| 新增分支 Block | 无 | +| 本场 TextBlock 数量 | 1 | + +本场沿用既有 `c0_contract_route`: + +- `1 = 接受契约路线`,本场满足 Unlock; +- `2 = 拒绝契约路线`,本场为 Forbidden; +- 本场只读取路线条件,不在 Yarn 中重复写入或修改该变量。 + +### 建议内部 Node + +- `C0_GreatLibrary_PublicHall` +- `C0_GreatLibrary_AstronomyArchive` +- `C0_GreatLibrary_AuthorizationBriefing` +- `C0_GreatLibrary_AshaDinnerMemory` +- `C0_GreatLibrary_FamilyBoundary` +- `C0_GreatLibrary_AluniteQuestion` +- `C0_GreatLibrary_Departure` + +内部 Node 只是台本组织建议,正式编写时可在不改变入口、顺序和单一 TextBlock 契约的前提下调整。 +Node 名必须在 `Chapter0.yarnproject` 内唯一,不得使用过短的 `Start`、`Memory`、`End` 等名称。 + +### Speaker 与档案人物接口 + +- 明矾石所有现场台词统一使用 Character ID `Alunite`; +- 阿莎重建期间,Yarn Speaker 仍为 `Alunite`,演出状态负责表达声线与姿态变化; +- `Asha` 只作为档案人物稳定标识,用于场景卡、档案 UI 或资源元数据,不作为独立 Yarn Speaker; +- 不创建 `Asha` 的 `CharacterData`、立绘 Prefab 或 `CharacterRegistry` 条目; +- 旁白保持无 Speaker 前缀,不创建 Narrator Character ID。 + +### Yarn 编写限制 + +- 不使用 `<>`、`<>`、`$variable` 或任何新 persistent state; +- 三个固定单选组每组只有一个选项,选项正文按 Yarn 语法缩进; +- 重建状态切换优先通过已确认可用的演出命令或资源状态表达,不在场景卡阶段发明新 Yarn Command; +- 文本批准前不手工添加、复用或整理 `#line`;批准后由 Yarn 工具统一生成 Line ID; +- 对话正常结束时仅完成当前 TextBlock,不排队授予新 Unlock Key 或 Message; +- Back 中断时应依赖既有事务恢复,不允许重建状态或投影残留到 StoryTree。 + +## 十二、Localization 与资源需求 + +### 固定 Localization Key + +| 用途 | Key | 简体中文源文本 | +|---|---|---| +| TextBlock 标题 | `story_c0_block_great_library_title` | 大图书馆与明矾石 | +| 角色显示名 | `character_alunite_name` | 明矾石 | +| 档案人物显示名 | `archive_person_asha_name` | 阿莎 | + +正式 Yarn 台词、旁白与三个选项在文本批准后进入 Yarn 对应的 Unity String Table Collection。 +五种首发 Locale 需保持相同 Line ID: `en`、`zh-CN`、`ja`、`ko`、`vi-VN`。 + +`archive_person_asha_name` 是档案 UI 使用的 Archive Person Name Key,不是 Character Name Key, +不得写成 `character_asha_name`,也不得据此创建 `Asha` CharacterData。`Asha` 是不翻译的稳定档案人物标识, +玩家可见姓名统一从 `archive_person_asha_name` 解析。 + +### Yarn Speaker 硬约束 + +阿莎重建段的每一行具名台词只能写成 `Alunite:`,不可写成 `Asha:`。声线、姿态与有限投影的变化属于 +`Alunite` 的演出状态,不改变 Yarn Speaker、Character ID 或 CharacterRegistry 归属。旁白或档案 UI 可以通过 +`archive_person_asha_name` 显示阿莎,但不得借显示名把她提升为独立现场角色。 + +### Localization 术语表 + +| 简体中文术语 | 推荐英文基准 | 本场固定含义与翻译注释 | +|---|---|---| +| 记忆上传 | Memory Upload | 本人自愿提交人格记忆资料的行为;发生上传不自动许可全部后续用途 | +| 上传者 | Uploader | 自愿上传其人格记忆资料的人;不要翻译成内容所有者或当前说话者 | +| 授权范围 | Authorized Scope | 某项保存、访问、公开或重建被允许的具体内容与用途边界 | +| 公开访问 | Public Access | 普通公众可以访问获准开放的部分;不表示整个人生或关联人物均已公开 | +| 叙事人格重建 | Narrative Persona Reconstruction | 明矾石依据获授权资料进行的有限叙事呈现 | +| 档案人物 | Archive Person | 档案中被记录和呈现的人物身份;不是 Yarn Character 或当前现场角色 | + +“叙事人格重建”不得缩写成会暗示本人重新到场的词。所有 Locale 都必须保留同一事实边界: +重建不等于复活,不等于由另一个对象替代本人,也不表示上传者本人可以继续回答资料之外的新问题。 + +### 专名、读音与代词注释 + +- `Alunite` 是明矾石的稳定 Character ID 和专名,不得按普通矿物名在各 Locale 中自由换译或替换同义矿物; + 各 Locale 的最终显示形式必须进入 approved termbase,并与 `character_alunite_name` 一一对应。 +- `Asha` 是稳定档案人物标识,`阿莎` 是 `zh-CN` 显示名;各 Locale 只做经批准的音译,不得根据字源、 + 宗教含义或当地常见名字进行意译。 +- 配音读音基准: `Alunite` 读作 `AL-uh-night`,`Asha` 读作 `AH-sha`。非英语配音可按本地音系调整, + 但必须在录音词表中保留这两条基准,避免同一 Locale 内多种读法。 + +| Locale | `Alunite` 称谓/代词注释 | `Asha` 称谓/代词注释 | +|---|---|---| +| `en` | 使用 `they/them`;不得因矿物名或外观改用 `it` | 使用 `she/her`,读音以 `AH-sha` 为基准 | +| `zh-CN` | 显示名“明矾石”,读音 `míng fán shí`;叙述代词统一“它” | 显示名“阿莎”,读音 `ā shā`;叙述代词“她” | +| `ja` | 优先使用专名或省略代词,不擅自使用带性别判断的 `彼` / `彼女` | 使用批准音译;优先专名,必要时可用女性指称 | +| `ko` | 优先使用专名或自然省略代词,不用 `그` / `그녀` 强加性别 | 使用批准音译;优先专名,必要时采用女性指称 | +| `vi-VN` | 优先使用专名或中性句式,避免用 `anh` / `chị` / `em` 推断性别与年龄关系 | 使用批准音译;优先专名,女性指称须避免额外推断年龄或亲疏 | + +以上注释用于翻译、LQA 与配音一致性,不改变 `Alunite` 与 `Asha` 的稳定内部标识。 + +### Base Language 与提取 Gate + +`Chapter0.yarnproject` 当前 `baseLanguage = en`,这是既有迁移待办,不是本场确认英语源稿的决定。 +本场采用简体中文源稿;进入正式 Line ID 生成与 Localization 提取前,必须由剧情系统整合任务统一将 +Chapter 0 Base Language 改为 `zh-CN`,并验证现有台本与 String Table 的迁移方案。本场景卡阶段不修改 +`Chapter0.yarnproject`,也不提前生成 `#line`。 + +### UI 与 pseudolocalization 验收 + +- 授权说明 UI、档案人物显示名、公开访问状态、重建状态和三个固定单选均以简中文本宽度的 `130%` + 进行 pseudolocalization; +- 所有上述文本容器必须启用自动换行和内容驱动的动态高度,不依赖固定单行高度; +- 三个固定单选扩展到 `130%` 后不得截断、强制省略、覆盖相邻按钮或把点击区域挤出 Safe Area; +- 授权术语不得因换行被拆成难以辨认的独立字词,表格或卡片标签需允许标签区与正文区分别增长; +- 在 `en`、`zh-CN`、`ja`、`ko`、`vi-VN` 下复核 Speaker、档案人物名、术语一致性与动态布局; +- pseudolocalization 只用于布局压力测试,不得写回正式 String Table 或改动三个选项的 Line ID。 + +### CharacterRegistry 需求 + +Yarn 获批并进入资源接入阶段后,新增或确认 `CharacterData`: + +```text +Character ID: Alunite +Display Name Key: character_alunite_name +Portrait Style: Sprite(暂定,按正式美术方案确认) +Required States: normal, attentive, reconstructing, boundary, uncertain +``` + +不新增 `Asha` CharacterData。若未来演出系统需要标记重建状态,应优先作为 `Alunite` 的状态或表情资源处理, +不得为了复用立绘流程把阿莎提升为独立现场角色。 + +### 视觉与演出资源 + +- 背景: 公共交通到达区、开放入口、中央大厅、纸质文献区、数据档案区、古观星资料区、记忆聆听区、 + 共鸣广场方向出口; +- 明矾石: 中性年轻人形,象牙白、浅灰、矿物色;普通接待、说明授权、阿莎重建、停止越界、 + 恢复常态与不确定提问等状态; +- 镜: 沿用既有万华镜投影,不新增温暖回应或情感化变形; +- 阿莎重建投影: 航线餐厅局部轮廓、有限食材、失败菜品、可拆分调味与一张逐渐坐满的桌子; +- 古观星资料: 旧观测设备影像、论文页、值班表、维护记录与现代检索界面,不出现拟真人格投影; +- UI: 资料类型、公开范围、重建允许状态、当前记忆段落说明;不显示家庭资料内容或可绕过权限的按钮; +- 环境声: 大厅人流、纸页与低声交谈、数据区较轻的设备底噪、聆听区更低的环境层、 + 场末从馆外传来的公共音乐片段。 + +重建资源不得依赖阿莎独立立绘。有限投影应保留“由当前设施进行叙事呈现”的可辨识边界, +不追求让玩家误以为阿莎本人进入现场。 + +## 十三、文本节奏与演出要求 + +- 旁白使用第三人称,以曦的感知为主要视角;不得以“你”指代曦或玩家。 +- 人物台词使用 ASCII 英文冒号,例如 `Alunite:`;中文正文不使用全角人物冒号。 +- 正式 Yarn 每行尽量不超过 120 个字符;长说明拆成可自然表演的多句,不写成制度公告墙。 +- 明矾石的每句台词必须可由配音演员自然说出,情绪方向以平静、专注、不确定为主。 +- 开场先用人流和空间说明公共属性,再让明矾石出现;不得用长段身份介绍代替普通接待。 +- 古观星段要短而清楚,用具体资料触发“没有人格记忆”的说明,不连续堆叠文明史百科。 +- 授权说明可以分五步,但每步只回答一个动作,不顺带解释撤回、继承、期限、争议或同步。 +- 阿莎记忆的主要篇幅用于有限食材、口味争论、失败菜品与最终同桌,不用宏大旁白替普通生活升格。 +- 重建开始前必须有明矾石自己的边界说明;重建结束后必须有可听见、可看见的状态恢复。 +- 曦的越界问句应自然、短,像沿着菜谱来源继续好奇,而非故意测试系统规则。 +- 明矾石停止时不使用警报、故障、权限红字充满画面等惩罚性演出。 +- 曦接受边界后至少保留一个完整节拍的安静;不要让镜立即解释这段安静意味着什么。 +- 第三个单选出现前,应让玩家清楚当前回答者可能被混同,因此“用自己的声音”具有实际叙事意义。 +- 镜的关键判断只出现一次,句式准确、短,不再追加类比、安慰或未来推演。 +- 曦的最终回应允许迟疑和不完整,不能形成誓言、治疗式劝导或主题答案。 +- 场末音乐先作为远处环境声出现,再由公共提示确认来源;不能突然切成完整音乐会高潮。 +- 明矾石不随行。分别保持普通工作场景的尺度,不设计拥抱、赠礼或长期联系承诺。 +- 玩家可见文本不得用被禁用的三个主题概括词代替具体的授权、记忆、边界与自我问题。 + +## 十四、情绪转折 + +1. **公共入口消解特殊待遇**: 曦从交通舱进入正常开放的设施,没有被单独迎入隐藏空间。 +2. **暖与冷共同构成记录**: 纸质区和数据区不同,却都需要来源、保存与访问边界。 +3. **资料丰富仍有人不在场**: 古观星团队留下大量记录,但没有因此获得可调用人格。 +4. **规则变成可执行动作**: 五类授权被逐项区分,避免把“已经上传”误读为任何用途都可使用。 +5. **普通晚餐使记忆靠近**: 阿莎面对的是有限食材与口味分歧,而不是历史舞台上的壮举。 +6. **失败没有被改写**: 那道菜确实失败,重建没有把上传者修饰成永远正确的人。 +7. **陌生人同桌但仍不同**: 乘客一起吃饭,不需要先同意唯一口味,也不被写成永久共同体。 +8. **自然好奇撞上边界**: 曦从公开生活细节追问到家庭来源,理解在具体交流中受到检验。 +9. **停止不等于惩罚**: 明矾石平静停止,曦立即接受,留白让未获授权的部分保持不被占用。 +10. **重建者重新出现**: 第三个单选要求明矾石使用自己的声音,阿莎的记忆与明矾石自身被重新区分。 +11. **问题从职能转向自身**: 明矾石不只担心工作是否还需要,也不知道工作改变后如何确认自己。 +12. **一次判断拆开命题**: 镜区分自身延续和职能延续,但不提供答案。 +13. **曦拒绝虚假保证**: 她不承诺、不修复、不解决,只承认未知与眼前问题确实存在。 +14. **傍晚把未解问题带向日常**: 公共音乐声出现,图书馆继续运作,明矾石也继续留在自己的当下位置。 + +## 十五、Lore 状态 + +| 项目 | 内容 | +|---|---| +| Canon Level | `Established`: 本卡冻结项来自已批准的 `C0-S09` 设计;具体台词、镜头与美术细节仍需正式审稿 | +| Visible To Player | `Yes / Discoverable`: 古观星资料、授权说明、阿莎公开记忆与明矾石的问题均在主线可见 | +| Hidden Truth | 无。本场不以权限边界暗示秘密家庭阴谋、上传实验或飞升内幕 | +| Cross-References | `docs/chapter0-scene-08-underground-city-card.md`、`Assets/Story/Chapter0/C0_UndergroundCity.yarn`、`docs/chapter0-prologue-dialogue-exploration.md`、后续【共鸣广场】场景卡 | +| Contradictions Check | 已核对 Writer/Programmer 手册、`C0-S08` 场景卡与正式 Yarn;前后路线、单一 TextBlock、无新增变量/Marker 与角色分工一致 | +| Source | 用户批准的 `C0-S09` 冻结设计;旧探索稿仅作结构参考,所有冲突处由本卡覆盖 | + +## 十六、连续性与 OOC 检查清单 + +- [ ] 开场直接承接 `C0-S08` 交通舱抵达,大图书馆首先是开放公共设施。 +- [ ] 萨米尔没有同行,旧探针与纪念章不在本场承担解决冲突的功能。 +- [ ] 明矾石为普通接待,不设置专属预约、欢迎仪式或曦的特殊访问权限。 +- [ ] 空间顺序保持“公共大厅 -> 古观星资料 -> 授权说明 -> 记忆聆听 -> 场末出口”。 +- [ ] 纸质区偏暖、数据区偏冷、记忆聆听区柔和,三者都不被赋予绝对真实性等级。 +- [ ] 古观星者生活在记忆计划建立前,只有资料,没有可供调用的人格记忆。 +- [ ] 上传、保存、访问、公开与重建分别说明,不把任何一项当作其它行为的自动许可。 +- [ ] 不补写授权撤回、继承、期限、争议处理或节点同步细节。 +- [ ] 阿莎不是文明最早殖民时代人物,而是后来某颗新殖民地早期航线的厨师。 +- [ ] 阿莎晚年自愿上传;本场只访问已获公开与重建授权的共同晚餐记忆。 +- [ ] 晚餐内容包含有限食材、口味分歧、一道失败的菜和陌生乘客最终同桌。 +- [ ] 阿莎不被英雄化,不承担殖民危机、制度创立或重大工程主题。 +- [ ] 整段重建由 `Alunite` 承担,阿莎不使用独立 Speaker、立绘或 CharacterRegistry。 +- [ ] 重建只靠声线、姿态与有限投影,不表现为阿莎本人返回现场。 +- [ ] 曦自然误触未授权家庭边界,明矾石平静停止,曦立即接受。 +- [ ] 停止后保留留白,不由镜、旁白或 UI 立刻解释其唯一意义。 +- [ ] 三个互动固定顺序且每组单选,不新增变量、分支、Marker、好感度或 Unlock。 +- [ ] 第三个单选后,明矾石恢复自己的声线、姿态与投影,再谈自身问题。 +- [ ] 明矾石提出飞升是否包含自己,以及职能变化后的自我识别,不得到公开答案。 +- [ ] 镜全场只作一次核心判断: 自身延续与既定职能延续不是同一命题。 +- [ ] 曦不保证、不安抚成定论、不替明矾石找到新使命,也不解决问题。 +- [ ] 不讨论“AI 是否是生命”,不断言意识延续、复活或人格重建等于本人存在。 +- [ ] 明矾石没有机械陈词;外观保持中性年轻人形与象牙白、浅灰、矿物色。 +- [ ] 场末接近傍晚,以公共音乐声和提示引向共鸣广场,明矾石不同行。 +- [ ] 旁白使用第三人称,人物台词使用 ASCII 英文冒号。 +- [ ] 正式 Yarn 不使用旧临时变量语法,不在审稿前手工添加 `#line`。 +- [ ] 玩家可见文本不使用被禁用的三个概括词代替具体内容。 + +## 十七、旧探索稿修订口径 + +`docs/chapter0-prologue-dialogue-exploration.md` 中“大图书馆与明矾石”样例属于早期探索, +不是正式执行口径。后续 Yarn 必须按本卡进行以下修订: + +1. 将“预约信息提前抵达、由明矾石负责陪同”改为公共入口中的普通接待,不为曦设置专属行程。 +2. 保留古观星资料没有人格记忆的边界,但删除镜在该段的主题总结,把唯一关键判断留到明矾石自身问题。 +3. 把旧稿的“早期环廊修复员记忆”完整替换为阿莎的共同晚餐记忆,避免重复 `C0-S08` 的材料更新主题。 +4. 将授权描述重写为上传、保存、访问、公开与重建分别授权,不扩写未获批准的制度机制。 +5. 新增曦误触未授权家庭边界、明矾石停止、曦立即接受和随后留白的固定顺序。 +6. 新增固定单选“请明矾石用自己的声音回答”,并在此后明确结束阿莎重建。 +7. 删除任何把公开记忆描述成访问者取得上传者全部人生、可继续追问或可获得本人新回答的表述。 +8. 删除“保存不只是为了对抗死亡”“让别人知道你认真活过”等足以提前解决明矾石问题的结论。 +9. 把明矾石的问题聚焦为飞升是否包含自己,以及既定职能变化后的自我识别。 +10. 将镜的多次分析压缩为一次命题区分,不让镜预测飞升、定义明矾石或认证意识延续。 +11. 让曦承认未知而非安慰成承诺;明矾石不因一句回应立即释然或找到新使命。 +12. 将结尾从返回观星资料廊道改为近傍晚的公共音乐提示,连接后续共鸣广场,并明确明矾石不同行。 + +## 十八、后续接口 + +- 用户批准本场景卡后,下一步才是编写 `Assets/Story/Chapter0/C0_GreatLibrary.yarn` 初稿。 +- Yarn 初稿必须先完成文本审稿,再由 Yarn 工具统一生成 `#line`;审稿前不手工添加 Line ID。 +- Yarn 获批以前,不配置 StoryData、Localization Table、CharacterRegistry、明矾石立绘或大图书馆背景。 +- 本场只包含一个 `Important TextBlock`,前置为 `c0_underground_city`,接受路线为 + `c0_contract_route == 1`,拒绝路线为 `c0_contract_route == 2`。 +- 本场不新增变量、Marker、分支 Block、Unlock Key、MessageBox 或独立阿莎角色资源。 +- 后续【共鸣广场】只承接近傍晚的公共音乐与曦、镜到场,不继承明矾石同行或飞升答案。 +- 明矾石的问题可在更后续内容中继续发展,但任何回答都必须经过独立叙事批准,不能由本场台词预先冻结。 diff --git a/docs/release-readiness-roadmap.md b/docs/release-readiness-roadmap.md index 7b43dea5..a12b250d 100644 --- a/docs/release-readiness-roadmap.md +++ b/docs/release-readiness-roadmap.md @@ -2,8 +2,8 @@ > 文档状态:Active > 首次基线:2026-07-18 -> 最近扫描:2026-07-18 -> 最近 Scope 更新:2026-07-18 +> 最近扫描:2026-07-23 +> 最近 Scope 更新:2026-07-23 > 当前阶段:Production(研发中期) > 当前结论:NOT READY FOR RELEASE > 主工作范围:`D:\Projects\ichni Official` @@ -56,11 +56,11 @@ |---|---:|---|---| | 核心音游 Runtime | 60–75% | Yellow | 演奏、判定、暂停、结算骨架存在;记录初始化、进度写回和异常路径需补齐 | | 谱面与章节内容 | 约 60% | Yellow | 以用户提供的 60% 为准;Official 当前扫描到 13 个歌曲目录、31 组难度包 | -| GameLoop / Progression | 30–45% | Red | 页面链路存在,但结果未确认写回存档,Story 的 Song/Tutorial 节点仍为占位 | +| GameLoop / Progression | 55–65% | Yellow | 页面链路与选曲/教程转场已打通(`SongBlockView` 与 `TutorialBlockView` 均可跳转),主 GameLoop 已连贯 | | UI/UX | 35–50% | Yellow | 已有完整视觉方向和主要页面;响应式、Safe Area、可访问性、占位文本与统一规范未完成 | -| Settings / Input | 35–50% | Red | 音量、帧率、Render Scale、Offset、语言、Rebind 已有;存在逻辑缺口与移动端风险 | -| 剧情系统与文本 | 20–35% | Red | Yarn/Presenter/Portrait/Save 框架存在;目前只有少量原型文本和不完整 StoryData | -| Localization | 10–25% | Red | 已决策以 Unity Localization 作为唯一正式管线;需迁移既有本地化资源、解除旧系统依赖,并补齐多数 Locale | +| Settings / Input | 35–50% | Red | 音量、帧率、Render Scale、Offset、语言、Rebind 已有;存在 Rebind 重置 Key 错配与移动端风险 | +| 剧情系统与文本 | 45–55% | Yellow | Yarn 播放/立绘/变量存档框架完整,Chapter 0 已配置 11 个 Block 节点完整结构与分支条件,Yarn 源语言确认为 `zh-CN` | +| Localization | 10–25% | Red | 已决策以 Unity Localization 作为唯一正式管线;Yarn 源语言为 `zh-CN`,尚需补充 5 语种 Unity String Table | | Creator 内容管线 | 不纳入本轮 | Gray | 仅在 Official 出现共享数据或导入/导出关联证据时重新纳入 | | QA / Automation | 0–10% | Red | 未发现项目自有自动化测试、Test asmdef、CI 或正式回归证据体系 | | Build / Release Engineering | 5–15% | Red | 缺少可复现 Build Profile、CI、版本/渠道矩阵、发布候选流程和回滚方案 | @@ -81,10 +81,9 @@ ### P0:阻止形成完整产品闭环 1. **演奏结果初始化和存档闭环待 Unity 端到端验证。** 2026-07-18 已在 `GameManager` 初始化 `PlayingRecorder`,并在 Wwise 歌曲结束回调中将结果写入 `BeatmapSave` / `SongStatusSave`;需要验证结算、退出、重开后的 Accuracy / FC / AP 和完成状态一致。 -2. **Story 到 Song/Tutorial 的转场仍是占位。** `SongBlockView` 和 `TutorialBlockView` 只输出 `Debug.Log`。 -3. **Chapter 0 StoryData 不完整。** 当前定义了 `A-0`、`B-0`、`B-1`、`C-0`,只有 `A-0` 绑定 Yarn;条件中引用了未定义的 `B-2`。 -4. **Localization 源语言与内容不一致。** Yarn Project 的 Base Language 是 `en`,但当前 `en` Story Table 中实际是中文;`zh-CN` 仅有少量空项,其他 Locale 大多为空。 -5. **Offline 首发必须完全关闭 Online/Login 路径。** TapTap 初始化被禁用,Start 页面绕过登录,API 指向 `http://localhost:53734`,并存在硬编码凭据、敏感响应日志和本地 Token 存储风险。首发应移除或明确 Feature Gate,而非让不可用服务残留在用户路径上。 +2. **`SET-001` Rebinds / Rebind Reset Key 错配。** `RebindingWindow.cs` 存取使用 `"Rebinds"`,但重置时查询/删除 `"Rebind"`,导致重置键位无法正确清除持久化配置。 +3. **`LOC-001` Unity Localization 单一管线与 5 语种表建全。** 源语言已确认为 `zh-CN`,需要基于 Unity Localization 补齐 `en` / `ja` / `ko` / `vi-VN` 资源表并清理旧本地化依赖。 +4. **Offline 首发必须完全关闭 Online/Login 路径。** TapTap 初始化被禁用,Start 页面绕过登录,API 指向 `http://localhost:53734`,并存在硬编码凭据、敏感响应日志和本地 Token 存储风险。首发应移除或明确 Feature Gate,而非让不可用服务残留在用户路径上。 ### P1:阻止 Feature Complete / Beta @@ -203,13 +202,13 @@ Exit Criteria:首发观察窗口结束,严重问题关闭或已部署修复 | SAVE-002 | P1 | Official | 每谱面 Chart Revision 与历史 Max Combo;Revision 变化仅重置该谱面成绩 | M | CORE-002 | DONE | 2026-07-18:已验证 Revision 变化与 Max Combo 合并行为。 | | UI-008 | P1 | Official | 保持章节内存选曲/难度缓存:恢复退出歌曲和难度,不写入玩家存档 | S | CORE-002 | DONE | 2026-07-18:已验证失效歌曲、不可用难度与空配置的安全回退。 | | CORE-003 | P0 | Official | 明确纯 Offline 下的 Story/Song/Payment Unlock 行为;无首发用途的 Payment Unlock 必须移除或可靠禁用 | M | REL-001 | DONE | 2026-07-18:已验证独立 Unlock Save v1、章节/歌曲统一规则、Yarn grant_unlock、重启读取和所有现有进歌入口拦截;Payment Unlock 运行时代码已移除。 | -| CORE-004 | P0 | Official | 实现 `SongBlockView` 到歌曲加载/返回 Story 的流程 | M | REL-002 | TODO | PlayMode + Manual E2E | -| CORE-005 | P0 | Official | 实现 `TutorialBlockView` 或从首发 Scope 移除 | M | REL-001 | TODO | Tutorial E2E / Scope Decision | +| CORE-004 | P0 | Official | 实现 `SongBlockView` 到歌曲加载/返回 Story 的流程 | M | REL-002 | DONE | 2026-07-23:已在 SongBlockView.cs 与 StoryManager.cs 实现 TryOpenSongBlock 转场。 | +| CORE-005 | P0 | Official | 实现 `TutorialBlockView` 教程选择与转场 | M | REL-001 | DONE | 2026-07-23:已在 TutorialBlockView.cs 与 TutorialFlowController.cs 实现通用选择弹窗、游玩切关与跳过进度写回。 | | CORE-006 | P0 | Official | 为 Project/Theme/Bundle/Beatmap 加载增加错误、重试、取消和平台失败处理 | L | — | TODO | Fault-injection Checklist | | CORE-007 | P1 | Official | 实现或移除 Summary Share Button | S | REL-001 | TODO | UI Test | | CORE-008 | P1 | Official | 清理 `ProjectLoader.TestLoad()` 命名与开发假设,形成正式入口 | S | CORE-006 | TODO | Code Review | -| STORY-001 | P0 | Official | 修复 Chapter 0 Story Graph:未定义 `B-2`、空绑定与条件完整性 | M | REL-002 | TODO | Graph Validator | -| STORY-002 | P0 | Official | 决定 Yarn 真正 Source Language 并修正 Yarn Project/Table | M | DEC-003 | TODO | Locale Contract | +| STORY-001 | P0 | Official | 修复 Chapter 0 Story Graph:未定义 `B-2`、空绑定与条件完整性 | M | REL-002 | DONE | 2026-07-23:StoryData_Chapter0.asset 已包含 11 个 Block 完整节点结构、c0_contract_route 分支条件与歌曲通关解锁约束。 | +| STORY-002 | P0 | Official | 决定 Yarn 真正 Source Language 并修正 Yarn Project/Table | M | DEC-003 | DONE | 2026-07-23:Chapter0.yarnproject 已在配置文件中明确 Base Language 为 zh-CN。 | | STORY-003 | P0 | Official | 完成首发剧情、角色表、Portrait、Command 与分支条件 | L | REL-002, STORY-002 | TODO | Story Content Audit | | STORY-004 | P1 | Official | 移除 `Test Title` 等原型命令,补充缺失内容验证器 | M | STORY-003 | TODO | Zero-placeholder Report | | LOC-001 | P0 | Official | 执行 Unity Localization 单一管线迁移:建立 Locale ID 契约、替换旧运行时依赖并验证移除 | L | STORY-002 | TODO | Localization Migration ADR + Runtime Proof | @@ -255,18 +254,15 @@ Exit Criteria:首发观察窗口结束,严重问题关闭或已部署修复 ## 8. 推荐的首批执行顺序 -不要先批量重做美术。当前最高收益顺序是: +在完成代码与资产反查后,剧情树、`SongBlockView` 转场、`TutorialBlockView` 弹窗与跳转、以及 Yarn 源语言基线 `zh-CN` 已被证实均已在工程中成功落地。后续最高收益执行顺序修正如下: -1. 将第 2 节确认的 Scope 固化到 `REL-002` Chapter 0 Release Manifest;Chapter 1 只保留 Stretch 标记。 -2. 执行 `STORY-001` 与 `CORE-004`,让 Chapter 0 Story 真正连接歌曲并形成可验证的主线闭环。 -3. 决定并执行 `CORE-005`:接入 Tutorial Block,或将其从首发 Chapter 0 Scope 移除。 -4. 执行 `ONLINE-001`,从首发 Build 中彻底关闭 Login、TapTap、网络入口和 Localhost 配置。 -5. 执行 `LOC-001` 与 `STORY-002`,在继续写 Chapter 0 剧情/五语翻译前确定源语言和管线。 -6. 执行 `SET-001`、`SET-002`、`SET-003`、`SET-004`,修复 Settings/Input,并优先验证 Android/iOS Touch。 -7. 执行 `QA-001` 和核心 E2E Smoke Test,防止后续改 UI 时破坏 GameLoop。 -8. 执行 `UI-001`、`UI-002`,再开始 `UI-006` 的 AI Dialogue Pilot;不要让 Chapter 1 美术阻塞此处。 -9. 由独立谱面流程更新 `CONTENT-003` 的 Chapter 0 完成状态;本路线图只消费其 QA 证据,不安排 Creator 工作。 -10. 在 Gate 2 后启动完整 Build/Store/Legal 工作;最晚在 Gate 3 前决定 `DEC-004` 商店渠道。 +1. 执行 `SET-001`:修复 `RebindingWindow.cs` 中 `Rebinds` 与 `Rebind` 重置 Key 错配问题,确保重置按键能正确清空持久化配置。 +2. 执行 `ONLINE-001`:从首发 Build 中彻底关闭/Feature Gate 登录、TapTap、网络 API (`localhost`) 配置与调试日志。 +3. 执行 `LOC-001` 与 `LOC-002`:以已确认的 `zh-CN` 为源语言,建立 Unity Localization 5 语种表(`en`, `zh-CN`, `ja`, `ko`, `vi-VN`)并迁移既有本地化资源。 +4. 执行 `SET-002`、`SET-003`、`SET-004`:完善 Settings 语言与 Locale ID 的持久化绑定,补齐控制器/键盘 UI 导航与移动端触控实机验证。 +5. 执行 `QA-001`:建立核心 GameLoop PlayMode/EditMode 自动化 Smoke Test,防止后续改 UI 或调整配置时破坏主连贯流程。 +6. 执行 `UI-001` 与 `UI-002`:整理 UI 资源盘点与 Token 规范,为后续 UI 界面优化打好基础。 +7. 在 Gate 2 后启动完整 Build/Store/Legal 工作;最晚在 Gate 3 前决定 `DEC-004` 商店渠道。 ## 9. 验证矩阵 diff --git a/docs/story-variable-registry.md b/docs/story-variable-registry.md new file mode 100644 index 00000000..86bfae4e --- /dev/null +++ b/docs/story-variable-registry.md @@ -0,0 +1,231 @@ +# ichni Official 剧情变量登记表 + +> 状态:**长期维护文档** +> 适用范围:`ichni Official` 全部章节的正式剧情变量。 +> 维护原则:每当场景卡批准新增变量时,必须按照变量在剧情中**首次写入的顺序**登记;不得等到 Yarn 或 StoryData 已大量使用后再补记。 +> 当前内容只登记已经确认并实际进入正式 Yarn 的变量,不预先虚构未来章节的变量。 + +## 一、文档用途 + +本登记表是剧情作者、Yarn 编写者、StoryData 配置人员、本地化人员与程序员共同使用的变量来源。它用于回答: + +- 变量的稳定 Key 是什么; +- 变量首次出现在哪个 Chapter、场景、TextBlock 与 Yarn 文件; +- 变量使用何种类型和默认值; +- 每个合法取值代表什么; +- 哪些 Yarn Node 写入或读取变量; +- 哪些 StoryData Block 使用变量作为 Unlock/Forbidden 条件; +- Timeline 回滚会怎样处理该变量; +- 变量当前处于计划、已使用、废弃还是迁移状态。 + +本登记表不替代场景卡或 StoryData。场景卡解释叙事意图,StoryData 保存运行时初始值与条件;本登记表负责让所有使用者对同一个 Key 保持一致理解。 + +## 二、纳入与排除范围 + +### 必须登记 + +- 通过 `set_bool`、`set_int`、`set_float` 或 `set_string` 写入的章节剧情变量; +- 通过 `add_int` 或 `add_float` 累积的章节数值; +- 被 Yarn `if`、StoryData `Unlock Condition`、`Forbidden Condition` 或 Helper Availability 读取的剧情变量; +- 为存档迁移而保留的旧变量与替代 Key。 + +### 不在本表登记 + +- Yarn 选项记忆:由 `StoryChoiceMemory` 根据 Option Line ID 自动保存; +- Block 完成状态:由章节存档的 `completedBlockIds` 保存; +- Timeline Marker ID 与 checkpoint:登记在场景卡和 StoryData; +- Localization Key; +- `grant_unlock`、歌曲解锁、教程解锁等全局 Unlock Key; +- Settings、歌曲成绩、`isTried` 或其它非剧情变量; +- `C0_RollbackDemo_*` 等测试 Yarn 中的示例变量; +- 废弃旧稿 `C0_A0.yarn` 中的 Yarn 原生 `$variable`。 + +## 三、命名规范 + +### Key 格式 + +- 使用小写英文、数字与下划线:`^[a-z0-9_]+$`。 +- 使用章节前缀:Chapter 0 为 `c0_`,Chapter 1 为 `c1_`,依此类推。 +- Key 表达稳定的剧情语义,不使用具体台词、UI 文案或临时 Node 名。 +- 路线变量使用 `_route` 后缀,例如 `c0_contract_route`。 +- 状态变量使用能够直接读懂的过去式或状态名;只有正式批准后才可确定实际 Key、登记并使用。 +- 计数或强度必须在名称中表明语义,例如未来可能出现的 `_count`、`_level`、`_trust`;不得使用 `value1`、`temp`、`flag` 等含义不明的 Key。 + +### 一项语义只保留一个变量 + +不要同时创建 `c0_contract_route` 和 `c0_contract_accepted` 来表达同一选择。能够用一个枚举式 `Int` 完整表达的互斥路线,不再增加重复 Bool。 + +### Key 稳定性 + +变量进入正式存档以后不得只为了“更好看”而重命名。确需改名时: + +1. 在本表把旧 Key 标记为 `Deprecated`; +2. 登记新 Key、迁移规则和首次生效版本; +3. 完成 Story Save migration; +4. 同步修改 Yarn、StoryData Conditions、Helper 条件和测试; +5. 确认旧存档迁移后再停止读取旧 Key。 + +## 四、类型、默认值与命令 + +| 类型 | 未配置时读取回退 | 正式写入 | 读取 | 累加 | 适用内容 | +|---|---:|---|---|---|---| +| `Bool` | `false` | `<>` | `get_bool("key")` | 无 | 已发生/未发生、二态状态 | +| `Int` | `0` | `<>` | `get_int("key")` | `<>` | 路线编号、整数计数、离散等级 | +| `Float` | `0f` | `<>` | `get_float("key")` | `<>` | 连续强度或比例 | +| `String` | `""` | `<>` | `get_string("key")` | 无 | 稳定文本 ID 或不能用数字表达的状态 | + +虽然运行时在缺少定义时存在回退值,**每个正式变量仍必须在对应 Chapter 的 StoryData Initial Variables 中显式配置类型与默认值**。不得依赖隐式 `0/false/""` 掩盖漏配。 + +其它可用接口: + +```yarn +<> +<> + // 该 Key 存在已保存值,或已在 StoryData Initial Variables 中定义。 +<> +``` + +`has_variable("key")` 会把 StoryData Initial Variable 也视为存在。由于正式变量都应显式配置初始值,它通常会从章节开始便返回 `true`,不能用于判断“玩家是否已经在剧情中写入过这个变量”。若确实需要记录事件是否发生,应创建语义明确的 Bool,而不是依赖变量是否存在。 + +正式剧情不得使用: + +```yarn +<> +<> +``` + +这些 Yarn 原生变量不受当前章节事务、StoryData 条件和 Timeline 回滚系统统一管理。 + +## 五、存档与回滚规则 + +- 剧情变量属于当前 `StoryData.chapterIndex` 对应的章节存档;不同章节完全隔离。 +- TextBlock 开始时建立章节事务。`set_*`/`add_*` 在对话内更新当前章节状态,但只有对话正常结束才提交存档。 +- 玩家使用 Back 中途退出 TextBlock 时,本次变量变化、选项记忆与 Block 进度全部恢复到进入前状态。 +- Timeline Marker checkpoint 保存进入目标列以前的章节变量快照。回滚后,目标列及右侧剧情产生的变量变化被撤销。 +- Timeline 回滚不会修改歌曲成绩、Settings、全局 Unlock Key 或其它章节进度。 +- 如果变量控制互斥路线,所有相关 Block 必须同时配置相反的 Unlock 与 Forbidden 条件,不能只在 Yarn 内写 `if`。 + +## 六、按剧情顺序登记 + +### Chapter 0 + +| 顺序 | 首次写入场景 | Variable Key | 类型 | 默认值 | 合法值/范围 | 意义 | 写入位置 | 读取位置 | 回滚点 | 状态 | +|---|---|---|---|---:|---|---|---|---|---|---| +| `C0-001` | `C0-S03` 契约抉择与镜的降临 | `c0_contract_route` | `Int` | `0` | `0` 未选择;`1` 接受;`2` 拒绝 | 记录曦对神之契约的最终选择,并控制接受主线与拒绝彩蛋的互斥开放 | `C0_ContractDecision.yarn`:接受/拒绝二次确认后各写入一次 | StoryData:`c0_public_disclosure`、`c0_refusal_ending` | `c0_contract_decision_checkpoint`;回滚后恢复为 `0` | Yarn 已使用;StoryData 待配置 | + +### Chapter 1 及以后 + +尚未开始登记。未来变量在所属场景卡批准后,按首次写入的剧情顺序添加到对应 Chapter 小节;不得提前创建占位 Key。 + +## 七、当前变量详细说明 + +### `c0_contract_route` + +#### 叙事意义 + +该变量只表达曦是否接受神的契约,是 Chapter 0 当前唯一正式剧情变量: + +| 值 | 叙事状态 | 可进入 Block | 必须 Forbidden 的 Block | +|---:|---|---|---| +| `0` | 尚未作出选择 | `c0_contract_decision` | 无;两个后续均保持 Locked | +| `1` | 接受契约 | `c0_public_disclosure` | `c0_refusal_ending` | +| `2` | 拒绝契约 | `c0_refusal_ending` | `c0_public_disclosure` | + +#### StoryData Initial Variable + +```text +Key: c0_contract_route +Type: Int +Default: 0 +``` + +#### Yarn 写入 + +接受二次确认以后: + +```yarn +<> +``` + +拒绝二次确认以后: + +```yarn +<> +``` + +不得在 C0-S01、C0-S02 或玩家尚未完成二次确认时提前写入路线值。 + +#### StoryData 条件 + +`c0_public_disclosure`: + +```text +Unlock Condition: c0_contract_route == 1 +Forbidden Condition: c0_contract_route == 2 +``` + +`c0_refusal_ending`: + +```text +Unlock Condition: c0_contract_route == 2 +Forbidden Condition: c0_contract_route == 1 +``` + +#### 回滚行为 + +Timeline Marker `c0_contract_decision_checkpoint` 锚定 `c0_contract_decision`,保存进入抉择以前的快照。玩家从任一路线回滚后: + +- `c0_contract_route` 恢复为 `0`; +- 接受/拒绝选项记忆被清除; +- 该列及右侧 Block 完成状态被恢复; +- 两个互斥后续重新按未选择状态计算。 + +## 八、新增变量登记模板 + +未来新增变量时,先在所属场景卡确认叙事必要性,再复制以下模板到相应 Chapter 小节,并插入正确的剧情位置: + +```markdown +| `C?-???` | `C?-S??` 场景名 | `c?_stable_key` | `Bool/Int/Float/String` | 默认值 | 合法值/范围 | 一句话语义 | 首次写入 Yarn/Node | Yarn/StoryData/Helper 读取位置 | 最近相关 Marker | Planned/Active/Deprecated | +``` + +同时补充详细说明: + +```markdown +### `c?_stable_key` + +- 叙事意义: +- 为什么不能使用现有变量或选项记忆: +- StoryData Initial Variable: +- 首次写入时机: +- 所有合法值: +- Yarn 读取: +- StoryData Unlock/Forbidden: +- Helper 条件: +- Timeline 回滚预期: +- 兼容/迁移要求: +``` + +## 九、变量新增检查清单 + +- [ ] 变量确实需要跨 Node、跨 TextBlock 或驱动 StoryData/Helper;单纯控制同一 Node 内一句台词时不滥用持久变量。 +- [ ] Key 使用正确章节前缀和 snake_case。 +- [ ] 没有与既有变量表达重复语义。 +- [ ] 类型与默认值已经在场景卡和 StoryData 中明确。 +- [ ] 所有合法值均有解释,没有未定义的魔法数字。 +- [ ] Yarn 只使用项目 `set_*`/`get_*`/`add_*` 接口。 +- [ ] 写入发生在玩家真正确认以后,不会因预览选项提前改变路线。 +- [ ] 互斥 Block 同时配置 Unlock 和 Forbidden。 +- [ ] Back 中断与 Timeline 回滚行为已经说明。 +- [ ] 不把 Localization Key、Unlock Key、Block ID 或 Option Memory 错记为剧情变量。 +- [ ] 变量进入正式存档后,任何重命名都配套 migration。 +- [ ] 本登记表中的剧情顺序与正式场景卡、Yarn 和 StoryData 一致。 + +## 十、维护流程 + +1. **前置信息讨论**:判断是否真的需要持久变量。 +2. **场景卡阶段**:确定 Key、类型、默认值、合法值、首次写入点和回滚预期。 +3. **场景卡批准后**:立即把变量按剧情顺序登记到本文档。 +4. **Yarn 编写阶段**:严格使用登记 Key;如发现语义不足,返回场景卡讨论,不在脚本中临时创造近义变量。 +5. **StoryData 集成阶段**:配置 Initial Variable、Unlock/Forbidden/Helper 条件,并把登记状态更新为 `Active`。 +6. **回归测试阶段**:验证新档、对话 Back、已完成 TextBlock 回顾、互斥路线和 Timeline 回滚。 +7. **发布后修改**:任何 Key、类型或语义变更都必须登记 migration 与版本影响。 diff --git a/ichni Official_WwiseProject/.cache/LMDB/data.mdb b/ichni Official_WwiseProject/.cache/LMDB/data.mdb index 414868cb..d6c961dc 100644 Binary files a/ichni Official_WwiseProject/.cache/LMDB/data.mdb and b/ichni Official_WwiseProject/.cache/LMDB/data.mdb differ diff --git a/ichni Official_WwiseProject/.cache/SoundBankInfoCache.dat b/ichni Official_WwiseProject/.cache/SoundBankInfoCache.dat index 2dea21af..7bdd012a 100644 Binary files a/ichni Official_WwiseProject/.cache/SoundBankInfoCache.dat and b/ichni Official_WwiseProject/.cache/SoundBankInfoCache.dat differ