This commit is contained in:
SoulliesOfficial
2026-07-24 03:43:11 -04:00
parent 48e7364981
commit fe00ecfcc7
90 changed files with 9610 additions and 461 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -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}

View File

@@ -19,17 +19,42 @@ namespace Ichni
public IntReactiveProperty waitingBundleAmount;
// 只记录本 Manager 通过 AssetBundle.LoadFromFileAsync 加载的 Theme Bundle。
// Addressables包括 Unity Localization拥有自己的 Bundle 引用计数,绝不能通过
// AssetBundle.UnloadAllAssetBundles 代替各系统分别释放资源。
private readonly List<AssetBundle> loadedAssetBundles = new List<AssetBundle>();
private void Awake()
{
instance = this;
loadedThemeBundleList = new List<ThemeBundle>();
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<Object>();
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<Object>();
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;
}
}
}
}

View File

@@ -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;
/// <summary>
/// 当前 MenuScene 是否已经完成 GameScene 预加载且尚未处于切场中
/// TutorialFlowController 在写入“已处理”剧情变量前使用此状态进行最后一次启动前检查
/// 是否已经接受了某个进入游戏的请求
/// 从确认进入开始便保持为 true用于阻止按钮连点和多个入口同时发起场景切换
/// </summary>
public bool CanBeginGame => !isEnteringGame && asyncOperation != null;
public bool isEnteringGame { get; private set; }
/// <summary>
/// 当前是否可以接受新的 GameScene 进入请求。
/// GameScene 改为玩家确认后按需加载,因此不再依赖菜单启动阶段的预加载句柄。
/// </summary>
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);
}
/// <summary>
/// 激活已预加载 GameScene并写入唯一的菜单返回目标。
/// 按需加载 GameScene并写入唯一的菜单返回目标。
/// 普通选曲使用 <see cref="MenuReturnDestination.SongSelection"/>,教程使用
/// <see cref="MenuReturnDestination.Story"/>。
/// </summary>
public void EnterGame(MenuReturnDestination returnDestination)
{
InformationTransistor.instance?.SetMenuReturnDestination(returnDestination);
EnterGameScene();
ScheduleGameSceneLoad(returnDestination, 0f);
}
/// <summary>
@@ -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);
}
/// <summary>
/// 在进入动画开始前预占本次场景切换。
/// 标准 Play、快速进入和 TutorialBlock 都必须通过这里防止同一帧的重复点击。
/// </summary>
public bool TryReserveGameEntry()
{
if (!CanBeginGame)
return false;
isEnteringGame = true;
return true;
}
public void EnterGameScene()
/// <summary>
/// 为已经完成自定义入场动画的入口安排 GameScene 加载。
/// 延迟使用 realtime确保暂停或修改 timeScale 时仍能正常进入游戏。
/// </summary>
public bool ScheduleCurrentGameSceneLoad(float delay = DefaultTransitionDelay)
{
if (asyncOperation == null)
return ScheduleGameSceneLoad(ResolveCurrentReturnDestination(), delay);
}
/// <summary>
/// 在指定转场延迟后启动 GameScene 的异步加载。
/// 这里绝不把 allowSceneActivation 设为 false场景开始加载后会自然完成并自动激活
/// 避免阻塞 Localization、Addressables 和其它 Unity AsyncOperation。
/// </summary>
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;
}
/// <summary>
/// 保留给既有 UnityEvent 和旧调用点的立即加载入口。
/// 新代码通常应使用 <see cref="ScheduleCurrentGameSceneLoad"/>,把转场延迟也交给 MenuManager。
/// </summary>
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;
}
}
}

View File

@@ -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

View File

@@ -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;
/// <summary>
/// 本章节永久剧情变量的默认值。它们只属于本章节,且不会直接写入存档;
/// 玩家第一次通过 Yarn 或其它剧情入口写入同名变量后,存档值才会覆盖这里的默认值。

View File

@@ -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;
/// <summary>
/// 对话结束后依次执行并清空的回调队列。供 <c>unlock_song</c> 等 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;
/// <summary>
/// 当前对话对应的 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));
}
/// <summary>
/// 以受保护方式启动 Yarn。缺失 Provider、Presenter 等启动级异常不应让 StorySave 的事务永久处于活动状态,
/// 因而会被转换为 Failed 流程并完整恢复进入对话前的章节快照。
/// 使用 Unity Localization 的公开 API 加载当前章节台词表。
/// <para>
/// <see cref="UnityLocalisedLineProvider.PrepareForLinesAsync"/> 在 Yarn Spinner 3.2.1 中是 no-op
/// 不能用来预载 String Table因此这里直接等待 <see cref="UnityEngine.Localization.LocalizedStringTable.GetTableAsync"/>。
/// </para>
/// </summary>
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 ?? "<null>"}' 未配置 Yarn Line String Table。");
yield break;
}
AsyncOperationHandle<StringTable> 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 ?? "<null>"}");
tableOperation = storyData.yarnLineStringTable.GetTableAsync();
}
catch (System.Exception exception)
{
Debug.LogException(exception, dialogueRunner);
// 启动阶段可能已经让部分 Presenter 进入展示状态;先请求停止,再立即清理事务。
// 后续若收到 Runner 的完成事件,会因 activeBlockId 已被清空而被安全忽略。
if (dialogueRunner != null && dialogueRunner.IsDialogueRunning)
{
dialogueRunner.GetComponent<VNDialoguePresenter>()?.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 ?? "<null>"}");
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();
}
/// <summary>
/// 调用 Yarn Spinner 的公开 <see cref="DialogueRunner.StartDialogue"/> API。
/// 返回时表示所有 Presenter 已完成 OnDialogueStartedAsync且 Runner 已调用 Dialogue.Continue。
/// </summary>
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<VNDialoguePresenter>()?.CancelCurrentPresentation();
dialogueRunner.Stop().Forget();
}
RestoreInterruptedDialogue(reason);
}
/// <summary>
@@ -202,12 +313,22 @@ namespace Ichni.Story.Dialogue
/// </summary>
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<VNDialoguePresenter>()?.CancelCurrentPresentation();
@@ -246,44 +367,29 @@ namespace Ichni.Story.Dialogue
}
/// <summary>
/// DialogueRunner.lineProvider 为 [SerializeReference] internal 字段
/// Inspector 的 "Use Unity Localised Line Provider" 按钮有时无法将 MonoBehaviour
/// 引用正确持久化到该字段;此方法在运行时用反射补救,确保使用正确的 Provider。
/// 验证 DialogueRunner 序列化的 LineProvider 是否为 UnityLocalisedLineProvider
/// <para>
/// LineProvider 应通过 Yarn Spinner Inspector 持久化配置;运行时不使用反射修改 Package 内部字段,
/// 这样 Editor、Mono 与 IL2CPP Build 使用完全相同的装配结果。
/// </para>
/// </summary>
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<UnityLocalisedLineProvider>();
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()

View File

@@ -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<bool>();
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()

View File

@@ -326,7 +326,7 @@ namespace Ichni.Story
/// <summary>本地化失败时显示 Key确保测试阶段仍能定位缺失条目而不是得到空白气泡。</summary>
private string GetLocalizedText(StoryHelperData helperData, string key, string fallback)
{
if (string.IsNullOrEmpty(key))
if (string.IsNullOrEmpty(key) || helperData == null)
return fallback;
try

View File

@@ -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;
}

View File

@@ -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 更新完成。");
}
/// <summary>

View File

@@ -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}' 的对话。");

View File

@@ -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()

View File

@@ -0,0 +1,158 @@
using System;
using System.Collections;
using Ichni.Diagnostics;
using UnityEngine;
using UnityEngine.Localization.Settings;
using UnityEngine.ResourceManagement.AsyncOperations;
namespace Ichni
{
/// <summary>
/// Unity Localization 的统一启动入口。
/// <para>
/// 本类只包装 Unity 官方提供的 <see cref="LocalizationSettings.InitializationOperation"/>
/// 不自行初始化 Addressables、不查询 Locale Label也不复制 Localization Package 的内部加载流程。
/// 因此 Settings、Yarn 与其它本地化消费者始终等待同一个由 Unity 管理的初始化操作。
/// </para>
/// </summary>
public static class LocalizationBootstrap
{
public enum InitializationState
{
NotStarted,
Initializing,
Ready,
Failed
}
private static AsyncOperationHandle<LocalizationSettings> _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; }
/// <summary>
/// Unity Localization 官方初始化 Handle。
/// 获取该属性会以幂等方式启动初始化,但不会同步阻塞主线程。
/// </summary>
public static AsyncOperationHandle<LocalizationSettings> InitializationOperation
{
get
{
BeginInitialization();
return _initializationOperation;
}
}
/// <summary>
/// 在关闭 Domain Reload 的 Editor 配置下,清理上一次 Play Mode 留下的项目侧状态。
/// Localization Package 会自行重建其内部 Handle本类不持有也不释放 Package 的资源。
/// </summary>
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
private static void ResetState()
{
_initializationOperation = default;
State = InitializationState.NotStarted;
FailureReason = null;
}
/// <summary>
/// 按 Unity 官方流程获取唯一的 Localization 初始化操作。
/// 可以由多个系统重复调用;已经启动后不会创建第二条加载链。
/// </summary>
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);
}
}
/// <summary>
/// 刷新初始化结果。供 YarnTask 等不能直接 yield AsyncOperationHandle 的异步流程调用。
/// </summary>
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();
}
/// <summary>
/// 供 MonoBehaviour 协程等待 Unity Localization 初始化。
/// 此处直接 yield 官方 Handle不使用轮询超时或自建 Addressables 状态机。
/// </summary>
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
: "<null>";
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);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7a3bb067e72f4b1ca56834f12479b841
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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";
/// <summary>
/// 与设置界面 Dropdown 顺序严格一致的 Locale Code。
/// 不使用 AvailableLocales.Locales 的返回顺序,因为 Addressables Catalog 的条目顺序不属于稳定存档契约。
/// </summary>
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<int, bool> postProcessingCameraStates = new Dictionary<int, bool>();
// 语言切换请求统一由一个协程串行处理。协程运行期间的新请求只覆盖目标索引。
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();
}
/// <summary>
@@ -92,10 +126,10 @@ namespace Ichni
/// </summary>
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
}
/// <summary>
/// 将当前语言索引应用到既有的 I2 与 Unity Localization 管线。
/// 语言将于 Localization 重构时改为稳定的 Locale ID本阶段只迁移数据承载方式
/// 将当前语言索引应用到 Unity Localization 管线。
/// 本方法只等待 Unity 官方 InitializationOperation并在其完成后应用玩家最新一次语言选择
/// </summary>
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 ?? "<null>"}");
// 处理流程运行期间收到的最新请求。
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 ?? "<null>"} -> " +
$"{targetLocale?.Identifier.Code ?? "<null>"}");
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 ?? "<null>"}");
}
}
}
finally
{
applyLanguageSettingsCoroutine = null;
isLanguageRoutineRunning = false;
BuildHangTracer.Log(
"SETTINGS_COROUTINE",
$"[Coroutine] 语言切换流程结束。PendingIndex={pendingLanguageIndex}");
}
}
/// <summary>

View File

@@ -35,6 +35,8 @@ namespace Ichni.UI
if (action == null)
{
Debug.LogError($"在InputActionAsset中未找到名为 '{actionName}' 的Action。");
inputActions.Enable();
waitingForInputCover.SetActive(false);
return;
}

View File

@@ -48,12 +48,20 @@ namespace Ichni.UI
this.title = title;
this.subTitle = subTitle;
titleText.gameObject.SetActive(true);
titleText.GetComponent<Localize>().SetTerm(title);
var titleLoc = titleText.GetComponent<Localize>();
if (titleLoc != null)
titleLoc.SetTerm(title);
else
titleText.text = title;
if (subTitle != "")
{
subTitleText.gameObject.SetActive(true);
subTitleText.GetComponent<Localize>().SetTerm(subTitle);
var subLoc = subTitleText.GetComponent<Localize>();
if (subLoc != null)
subLoc.SetTerm(subTitle);
else
subTitleText.text = subTitle;
}
else
{

View File

@@ -15,7 +15,15 @@ namespace Ichni.UI
{
base.SetUp(title, subTitle);
buttonText.GetComponent<Localize>().SetTerm(textContent);
var localize = buttonText.GetComponent<Localize>();
if (localize != null)
{
localize.SetTerm(textContent);
}
else
{
buttonText.text = textContent;
}
button.onClick.AddListener(() =>
{

View File

@@ -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() 调用完成返回");
};
}

View File

@@ -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<string>("Rebinds", rebindsFilePath);
string rebindsJson = ES3.Load<string>(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("所有键位已重置为默认值。");

View File

@@ -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();

View File

@@ -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
{

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: a5cdb3053b7ba374db5ab1b00a409bf7
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,64 @@
using System;
using System.IO;
using UnityEngine;
namespace Ichni.Diagnostics
{
/// <summary>
/// 专用于 Standalone Build 的实时落盘诊断日志工具。
/// 绕过 Unity 默认日志缓冲区,直接将日志强行追加写入独立文本文件,
/// 确保即使游戏卡死(未响应),卡死前最后一条日志也能 100% 写入磁盘。
/// </summary>
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;
}
}
/// <summary>
/// 强行立即追加一行日志到磁盘独立文件
/// </summary>
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
{
// 静默忽略日志写入本身的异常
}
}
/// <summary>
/// 清空之前的日志文件并记录初始化标志
/// </summary>
public static void ClearLog()
{
try
{
if (File.Exists(LogFilePath))
{
File.Delete(LogFilePath);
}
Log("INIT", $"--- 诊断日志已重置。日志存储路径:{LogFilePath} ---");
}
catch
{
// 静默忽略
}
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: bebb1ee94395f2648b7cf5892a16c9fd

Binary file not shown.

View File

@@ -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 存有存档值时会自动覆盖)
<<declare $asahi_knows_the_truth = false>>
<<declare $asahi_remembers_origin = false>>
SLS: 勇士,你终于来了。我们等待你很久了。 #line:0c2e7ae
<<set_portrait "Asahi" 33 0>>
Asahi: ……这就是那个传说中的地方吗? #line:0871a99
<<jump C0_A0_first_meeting>>
===
title: C0_A0_first_meeting
position: -150,250
---
<<move_portrait "Asahi" -33 0 1.5>>
SLS: 这里曾是一场被时间掩埋的战争的终结之地。 #line:0cdce7d
SLS: 我们称之为"遗忘之地"。 #line:0fe1e57
<<jump_portrait "Asahi" 5 2 0.8>>
Asahi: 为什么叫这个名字? #line:068875f
SLS: 因为死去的人希望被遗忘—— #line:04a17d7
<<shake_portrait "Asahi" 1.0 2 10>>
SLS: ——而活下来的人,却永远无法忘记。 #line:03e5d89
Asahi: …… #line:0a4b2fc
// 玩家选择:决定是否对朝日如实相告
-> 让朝日知道全部真相 #line:019f988
<<set $asahi_knows_the_truth = true>>
<<jump C0_A0_reveal>>
-> 暂时不告诉朝日 #line:02b0524
<<jump C0_A0_conceal>>
-> 聊聊朝日的过去 <<if $asahi_remembers_origin>> #line:0e8d4c1
Asahi: 那段记忆……我终于能开口谈了。 #line:0a3f9b7
<<jump C0_A0_end>>
===
title: C0_A0_reveal
position: -250,500
---
SLS: 勇士,你选择了如实相告。这需要勇气。 #line:0f8c24f
SLS: 朝日,你所在的这个世界,从未真正平静过。 #line:0b9f3b6
SLS: 那场战争留下的烙印,至今仍深藏在每一片土地之下。 #line:0e67923
Asahi: 我……我需要时间来接受这一切。 #line:0365430
SLS: 我们等你。 #line:081f185
<<set $asahi_remembers_origin = true>>
<<jump C0_A0_end>>
===
title: C0_A0_conceal
position: -50,500
---
SLS: 有些事,时机未到,不必强求。 #line:0a8fa30
SLS: 今天先让朝日了解这里的历史就够了。 #line:09b7cff
Asahi: 谢谢你。我会记住的。 #line:097c353
<<jump C0_A0_end>>
===
title: C0_A0_truth_known
position: 150,250
---
SLS: 既然朝日已知晓实情,接下来的路会更加艰难。 #line:09fe68f
SLS: 但你所拥有的力量,也会随觉悟的深入而增长。 #line:06154cb
Asahi: 我已经准备好了。 #line:04617a4
<<set $asahi_remembers_origin = true>>
<<jump C0_A0_end>>
===
title: C0_A0_end
position: 0,750
---
<<show_message "Test Title" "这是一条测试自定义信息的留言!">>
SLS: 无论你作何选择,这段旅途都只属于你。 #line:00bf206
SLS: 去吧,勇士。前方还有很长的路。 #line:03c5112
Asahi: 我会一直陪着你的,不管去哪里。 #line:06d2a12
===

View File

@@ -0,0 +1,364 @@
// Chapter 0 · C0-S03 契约抉择与镜的降临
// 对应场景卡docs/chapter0-scene-03-contract-decision-card.md
// 类型Important TextBlock待 StoryData 配置)
// 目标 Block IDc0_contract_decision
// 入口 NodeC0_ContractDecision
// Timeline Markerc0_contract_decision_checkpoint“第五日 · 抉择”)
//
// 章节变量c0_contract_routeInt默认值 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
<<jump C0_ContractDecision_AcceptConfirm>>
-> 拒绝契约。 #line:0790643
<<jump C0_ContractDecision_RefuseConfirm>>
===
title: C0_ContractDecision_AcceptConfirm
---
曦张开嘴,却发现准备过很多遍的回答仍然卡在喉咙里。她端起水杯喝了一口,杯沿碰到牙齿,发出一声过分清楚的轻响。 #line:05e9d36
曦: 我想接受。等一下,我知道这句话应该说得更确定一点,可我现在确实很紧张。你们能让我先把后半句说完吗? #line:08c73ba
徐允雅: 可以。通信装置尚未开启,你现在说的任何内容都不会被视为最终确认。 #line:04051a9
曦: 我还是害怕,也没有突然觉得自己一定能完成所有事情。我只是想了五天以后,发现“害怕去”和“不愿意去”不是一回事。 #line:0a8012a
曦: 我爱自己的家,也真的想知道那些世界是什么样子;如果我因为害怕就把这扇门关上,我以后大概会一直记得今天。 #line:0d4614c
程衡没有接着她的话赞许或致谢,只把手放在桌面上,等待她自己决定是否继续。徐允雅则将通信装置的待机权限交给曦,黑色表面浮现一行简单的确认文字:契约一旦成立,无法撤回。 #line:0a23d2d
-> 我明白契约成立后无法撤回。确认接受。 #line:0973dad
<<set_int "c0_contract_route" 1>>
<<jump C0_ContractDecision_KagamiArrival>>
===
title: C0_ContractDecision_RefuseConfirm
---
曦看着桌面上的通信装置,过了很久才把双手从膝上松开。她没有感觉到轻松,也没有像自己想象中那样立刻后悔;两种结果都没有到来,只有一句必须由她亲口说出的答案。 #line:044fb56
曦: 我想拒绝。我知道星联会因此失去唯一的机会,也知道没有第二个人可以替代我,但我不能真诚地答应一场连自己要承担什么都不知道的旅程。 #line:037392d
徐允雅: 你的理由不需要接受审核。最后确认只说明结果:一旦拒绝,通信程序将关闭,交易终止,神不会指定第二位候选人。 #line:0d61cf2
-> 我明白交易将就此终止。确认拒绝。 #line:0d743c2
<<set_int "c0_contract_route" 2>>
<<jump C0_ContractDecision_RefusalExit>>
===
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
<<jump C0_ContractDecision_AskIdentity>>
===
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
<<jump C0_ContractDecision_AskProtection>>
===
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
<<jump C0_ContractDecision_AskReturn>>
===
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
===

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 786552bb2c0e45cb89f7e9f67beeb6b3
guid: cbec2b9f936308a41aa4c8b67d21e7c1
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}

View File

@@ -0,0 +1,429 @@
// Chapter 0 · C0-S06 离开泽尼斯,前往母星
// 对应场景卡docs/chapter0-scene-06-departure-to-asteria-card.md
// 类型Important TextBlock待 StoryData 配置)
// 目标 Block IDc0_departure_to_asteria
// 入口 NodeC0_DepartureToAsteria
// 标题 Localization Keystory_c0_block_departure_to_asteria
//
// Unlock Conditionc0_contract_route == 1
// Forbidden Conditionc0_contract_route == 2
// 前置 Blockc0_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
<<jump C0_DepartureToAsteria_Breakfast>>
===
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
<<jump C0_DepartureToAsteria_Terminal>>
===
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
<<jump C0_DepartureToAsteria_Farewell>>
===
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
<<jump C0_DepartureToAsteria_InTransit>>
===
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
<<jump C0_DepartureToAsteria_FirstSight>>
===
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
<<jump C0_DepartureToAsteria_Descent>>
===
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
===

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 57b4030fd503c24439e83f05fc370cba
guid: ef78301810d1df143a413b526e9e0d92
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}

View File

@@ -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
<<jump C0_GreatLibrary_PublicCollections>>
===
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
<<jump C0_GreatLibrary_AuthorizationBriefing>>
===
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
<<jump C0_GreatLibrary_AshaIntroduction>>
===
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
<<jump C0_GreatLibrary_AshaDinnerMemory>>
===
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
<<jump C0_GreatLibrary_FamilyBoundary>>
===
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
<<jump C0_GreatLibrary_明矾石Question>>
===
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
<<jump C0_GreatLibrary_Departure>>
===
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
===

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 51dc31a3841a4b0892d3e4753ffde3bc
guid: c977f73f3a91a7c4f90bb9c8157cdf2b
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}

View File

@@ -0,0 +1,294 @@
// Chapter 0 · C0-S02 家庭商谈与五日考虑期
// 对应场景卡docs/chapter0-scene-02-home-deliberation-card.md
// 类型Important TextBlock待 StoryData 配置)
// 入口 NodeC0_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
<<jump C0_HomeDeliberation_TellParents>>
===
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
<<jump C0_HomeDeliberation_AskThem>>
===
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
<<jump C0_HomeDeliberation_FifthDay>>
===
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
===

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: f7dd9f9b20ce43c38ee5a23ce1f94f4e
guid: b730a206bef8d91459592e808c2bf2b7
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}

View File

@@ -0,0 +1,416 @@
// Chapter 0 · C0-S07 大洋之心
// 对应场景卡docs/chapter0-scene-07-ocean-heart-card.md
// 类型Important TextBlock待 StoryData 配置)
// 目标 Block IDc0_ocean_heart
// 入口 NodeC0_OceanHeart
// 标题 Localization Keystory_c0_block_ocean_heart_title
//
// Unlock Conditionc0_contract_route == 1
// Forbidden Conditionc0_contract_route == 2
// 前置 Blockc0_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
<<jump C0_OceanHeart_MeetInes>>
===
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
<<jump C0_OceanHeart_WaitForFish>>
===
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
<<jump C0_OceanHeart_ShallowWater>>
===
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
<<jump C0_OceanHeart_ExpansionProposal>>
===
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
<<jump C0_OceanHeart_ProtectionBoundary>>
===
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
<<jump C0_OceanHeart_Departure>>
===
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
===

View File

@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 090656499ea2b3d4e87f963e455dde44
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: 94073015eacc34c1d8fc6786e43d60ca, type: 3}

View File

@@ -0,0 +1,334 @@
// Chapter 0 · C0-S05 最后一段普通生活
// 对应场景卡docs/chapter0-scene-05-old-life-preparation-card.md
// 类型Important TextBlock待 StoryData 配置)
// 目标 Block IDc0_old_life_preparation
// 入口 NodeC0_OldLifePreparation
// 标题 Localization Keystory_c0_block_old_life_preparation
//
// Unlock Conditionc0_contract_route == 1
// Forbidden Conditionc0_contract_route == 2
// 前置 Blockc0_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
<<jump C0_OldLifePreparation_ReturnToSchool>>
===
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
<<jump C0_OldLifePreparation_PracticalLesson>>
===
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
<<jump C0_OldLifePreparation_TravelChecks>>
===
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
<<jump C0_OldLifePreparation_Packing>>
===
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
<<jump C0_OldLifePreparation_DepartureDate>>
===
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
===

View File

@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 37fb9dc30844d47458b120581ef1af16
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: 94073015eacc34c1d8fc6786e43d60ca, type: 3}

View File

@@ -0,0 +1,364 @@
// Chapter 0 · C0-S01 私密会面
// 对应场景卡docs/chapter0-scene-01-private-briefing-card.md
// 类型Important TextBlock待 StoryData 配置)
// 入口 NodeC0_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
<<jump C0_PrivateBriefing_WhyMe>>
===
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
<<jump C0_PrivateBriefing_CommunicationKey>>
===
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
<<jump C0_PrivateBriefing_Refusal>>
===
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
<<jump C0_PrivateBriefing_ExplainContact>>
===
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
===

View File

@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 7bb6ac47328e7404c97f3017b0d11ad0
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: 94073015eacc34c1d8fc6786e43d60ca, type: 3}

View File

@@ -0,0 +1,286 @@
// Chapter 0 · C0-S04 向群星公开
// 对应场景卡docs/chapter0-scene-04-public-disclosure-card.md
// 类型Important TextBlock待 StoryData 配置)
// 目标 Block IDc0_public_disclosure
// 入口 NodeC0_PublicDisclosure
// 标题 Localization Keystory_c0_block_public_disclosure
//
// Unlock Conditionc0_contract_route == 1
// Forbidden Conditionc0_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
<<jump C0_PublicDisclosure_VoluntaryQuestion>>
===
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
<<jump C0_PublicDisclosure_OrdinaryLifeQuestion>>
===
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
<<jump C0_PublicDisclosure_PublicSupportQuestion>>
===
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
<<jump C0_PublicDisclosure_AfterBroadcast>>
===
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
===

View File

@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 468e09e2932329e4c8a954bead36a7f2
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: 94073015eacc34c1d8fc6786e43d60ca, type: 3}

View File

@@ -0,0 +1,211 @@
// Chapter 0 · C0-S03R 拒绝契约彩蛋结局
// 对应场景卡docs/chapter0-scene-03-contract-decision-card.md
// 类型Important TextBlock待 StoryData 配置)
// 目标 Block IDc0_refusal_ending
// 入口 NodeC0_RefusalEnding
//
// Unlock Conditionc0_contract_route == 2
// Forbidden Conditionc0_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
<<jump C0_RefusalEnding_FirstEvening>>
===
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
<<jump C0_RefusalEnding_ReturnToSchool>>
===
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
<<jump C0_RefusalEnding_YearsLater>>
===
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
<<jump C0_RefusalEnding_Final>>
===
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
<<show_message "story_c0_refusal_rewind_title" "story_c0_refusal_rewind_body" "Message">>
===

View File

@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: d118e1b829f721c43b1daf5268eacf19
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: 94073015eacc34c1d8fc6786e43d60ca, type: 3}

View File

@@ -1,30 +0,0 @@
// 回滚机制示例 2/5第二段主线 TextBlock也是 TimelineMarker 的锚点。
// StoryData Block ID 建议c0_demo_checkpointgridColumn = 1。
// 第一次选择后StoryChoiceMemory 会记住 Option Text ID再次进入本 Block 时不会显示选项,
// 而是自动返回玩家第一次选择的路径。回滚到本 Marker 后该记录会被恢复/清除。
title: C0_RollbackDemo_Checkpoint
---
<<if get_bool("c0_demo_intro_read")>>
SLS: 信号已经稳定。你必须决定接下来的处理方式。
<<else>>
SLS: 缺少前置记录,但测试流程仍可继续。
<<endif>>
-> 记录信号的变化
<<set_int "c0_demo_route" 1>>
<<jump C0_RollbackDemo_Record>>
-> 优先保护观测装置
<<set_int "c0_demo_route" 2>>
<<jump C0_RollbackDemo_ProtectChoice>>
===
title: C0_RollbackDemo_Record
---
SLS: 你选择了记录。
===
title: C0_RollbackDemo_ProtectChoice
---
SLS: 你选择了保护。
===

View File

@@ -1,18 +0,0 @@
// 回滚机制示例 5/5分支会合后的主线 TextBlock。
// StoryData Block ID 建议c0_demo_convergencegridColumn = 3。
// UnlockConditionAny Of(BlockCompleted c0_demo_observe, BlockCompleted c0_demo_protect)。
title: C0_RollbackDemo_Convergence
---
<<if get_bool("c0_demo_observed")>>
SLS: 观测结果已归档。你从时间的回声中获得了答案。
<<else>>
<<if get_bool("c0_demo_protected")>>
SLS: 装置已被保护。你为下一次观测保留了余地。
<<else>>
SLS: 没有发现有效分支记录,请检查 StoryData 的路线条件。
<<endif>>
<<endif>>
<<set_bool "c0_demo_convergence_read" true>>
===

View File

@@ -1,9 +0,0 @@
// 回滚机制示例 1/5第一段主线 TextBlock。
// StoryData Block ID 建议c0_demo_introgridColumn = 0。
title: C0_RollbackDemo_Intro
---
SLS: 记录开始。请在这一刻之后决定如何观察异常信号。
<<set_bool "c0_demo_intro_read" true>>
<<add_int "c0_demo_resonance" 1>>
===

View File

@@ -1,14 +0,0 @@
// 回滚机制示例 3/5分支 1。
// StoryData Block ID 建议c0_demo_observegridColumn = 2
// UnlockConditionc0_demo_route == 1ForbiddenConditionc0_demo_route == 2。
title: C0_RollbackDemo_Observe
---
<<if get_int("c0_demo_route") == 1>>
SLS: 观测记录已展开。异常波形正在重复上一段时间。
<<set_bool "c0_demo_observed" true>>
<<add_int "c0_demo_resonance" 2>>
<<else>>
SLS: 当前路线不是观测路线;这段文字仅用于检查错误配置时的安全回退。
<<endif>>
===

View File

@@ -1,10 +0,0 @@
fileFormatVersion: 2
guid: aed5778d2d4a41db8acd3495bb7aa369
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: 94073015eacc34c1d8fc6786e43d60ca, type: 3}

View File

@@ -1,14 +0,0 @@
// 回滚机制示例 4/5分支 2。
// StoryData Block ID 建议c0_demo_protectgridColumn = 2
// UnlockConditionc0_demo_route == 2ForbiddenConditionc0_demo_route == 1。
title: C0_RollbackDemo_Protect
---
<<if get_int("c0_demo_route") == 2>>
SLS: 保护程序已启动。装置核心被暂时隔离。
<<set_bool "c0_demo_protected" true>>
<<add_int "c0_demo_resonance" 1>>
<<else>>
SLS: 当前路线不是保护路线;这段文字仅用于检查错误配置时的安全回退。
<<endif>>
===

View File

@@ -1,10 +0,0 @@
fileFormatVersion: 2
guid: 4c751af9031c4f94b7295c01fa3a2b6a
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: 94073015eacc34c1d8fc6786e43d60ca, type: 3}

View File

@@ -0,0 +1,427 @@
// Chapter 0 · C0-S08 地下都市与团结纪念碑
// 类型Important TextBlock待 StoryData 配置)
// 目标 Block IDc0_underground_city
// 入口 NodeC0_UndergroundCity
// 标题 Localization Keystory_c0_block_underground_city_title
// 前置 Blockc0_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
<<jump C0_UndergroundCity_OldWayfinding>>
===
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
<<jump C0_UndergroundCity_MaterialSample>>
===
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
<<jump C0_UndergroundCity_FinalPassage>>
===
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
<<jump C0_UndergroundCity_UnityMonument>>
===
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
<<jump C0_UndergroundCity_Departure>>
===
title: C0_UndergroundCity_Departure
---
前往大图书馆的交通舱从中央穹顶缓缓驶出。车内有人阅读工作记录,有人讨论午后的课程,还有两名游客对着纪念碑路线争论自己是否错过了最高的观景台。 #line:0ff636b
曦没有替他们解释。她打开终端,把今天拍下的市场、旧路标、材料样本和环廊入口按实际经过的顺序归档,团结纪念碑只占最后几张。 #line:07b6bda
资料系统自动建议以“中央历史区主要景点”重新排序。曦看了一眼,按下“保留当前顺序”。 #line:0f77311
她摸到包内层的纪念章,又确认旧探针仍固定在旁边,随后把拉链重新拉好。 #line:046e7ee
镜把大图书馆的公共入口投到交通舱侧面的路线界面上,预计抵达时间随轨道切换更新了一次。 #line:08d3867
窗外,地下网络的支线向行星岩层深处延伸。中央历史区很快退到后方,市场仍在营业,临时替代路线继续承载人流,施工团队也已经开始执行第一项隔离检查。 #line:0c7899a
曦仍然很想看看四十七天后的新环廊,也不觉得这份期待需要假装旧环廊没有结束。 #line:0068f3e
交通舱转入上行轨道,大图书馆的入口标识出现在前方。萨米尔没有同行,团结纪念碑也留在仍需不断维护的城市里。 #line:0463b7e
===

View File

@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 6c0b3e9e14e352c4685c34a9a6e7c371
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: 94073015eacc34c1d8fc6786e43d60ca, type: 3}

View File

@@ -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
}
}
}
}
}

View File

@@ -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}"
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 20faae778b107174c87f6d7cfae5a396
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -16,7 +16,7 @@ PluginImporter:
settings:
Exclude Editor: 1
Editor:
enabled: 1
enabled: 0
settings:
CPU: x86
DefaultValueInitialized: true