添加DSL引擎迁移和验证功能

- 新增最终验证脚本和迁移测试脚本,确保DSL引擎的完整性和功能
- 实现故事模块的音频配置、角色定义和情感故事模块
- 迁移现有故事数据到新的DSL格式,支持动态内容和条件导航
- 更新主题和UI组件,确保一致的黑色背景和暗色主题
- 添加音频管理器和性能监控工具,提升游戏体验和调试能力
This commit is contained in:
2025-09-10 17:36:55 +08:00
parent a90cc1c5a9
commit 93400900c0
9 changed files with 6938 additions and 1202 deletions

View File

@@ -0,0 +1,458 @@
%%{init: {'flowchart': {'htmlLabels': true}}}%%
flowchart TD
subgraph cluster_main[主线:第一次觉醒]
alternate_route["寻找其他路径
跳转分支:寻找萨拉博士"]
anchor_modification["时间锚的重塑 - 第一阶段"]
awakening["起身探索"]
cautious_investigation["档案库的秘密调查"]
consciousness_integration["意识的完美融合"]
contact_eva["联系伊娃
跳转分支:伊娃的身份揭示"]
cosmic_communication["宇宙信标计划
跳转分支:伊娃的身份揭示"]
dmitri_confrontation["时间锚实验室的真相
跳转分支:伊娃的身份揭示、跳转分支:发现植入物的痕迹"]
dmitri_empathy_path["尝试理解德米特里的痛苦,寻求和解"]
dmitri_evidence_reveal["证据摊牌"]
dmitri_personal_reveal["德米特里的个人动机"]
dmitri_truth_confrontation["冲破德米特里的房门"]
ending_perfect["完美的新世界
跳转分支:伊娃的身份揭示"]
eva_assistance_request["请求伊娃的帮助
跳转分支:伊娃的身份揭示"]
eva_experiment_explanation["时间锚实验的真相
跳转分支:伊娃的身份揭示"]
eva_plan_consultation["联系伊娃,询问她对计划的看法"]
evidence_collection["保留证据,继续调查德米特里"]
explosion_evidence_analysis["爆炸证据深度分析"]
find_dmitri["寻找德米特里博士"]
first_awakening["第一次觉醒"]
fragmented_visions["破碎的时间回忆
跳转分支发现植入物的痕迹、跳转分支第48次循环的完美策略"]
investigation["项目月神的四个阶段"]
medical_bay_discovery["医疗舱记录搜索
跳转分支:寻找萨拉博士"]
memory_attempt["回忆尝试"]
memory_integration_crisis["记忆整合危机
跳转分支伊娃的身份揭示、跳转分支第48次循环的完美策略"]
mysterious_note["神秘纸条"]
observe_medical_bay["观察医疗舱"]
observe_scar["观察伤疤
跳转分支:发现植入物的痕迹"]
other_subjects["医疗舱搜索
跳转分支:伊娃的身份揭示、跳转分支:寻找萨拉博士"]
plan_vulnerability_analysis["寻找计划的漏洞和弱点"]
reactor_confrontation_path["反应堆最终对峙"]
reactor_investigation_path["反应堆主动调查
跳转分支第48次循环的完美策略"]
reactor_path["前往量子反应堆
跳转分支第48次循环的完美策略"]
reactor_sabotage_attempt["反应堆破坏尝试"]
repetition_memory_analysis["循环记忆的深度分析"]
sabotage_memory_recovery["专注于时间锚摧毁计划的记忆"]
sara_consultation["寻找萨拉博士,询问她的立场"]
scientist_memory_fragment["回忆科学家的争论"]
self_recording["录音设备"]
temporal_civilization["时间避难所社会的创建
跳转分支:伊娃的身份揭示"]
timeline_analysis["时间线深度分析"]
transcendent_exploration["探索超越性的存在
跳转分支伊娃的身份揭示、跳转分支第48次循环的完美策略"]
alternate_route -- "通过维护通道秘密潜入反应堆" --> reactor_investigation_path
anchor_modification -- "利用时间避难所向宇宙发出信号" --> cosmic_communication
anchor_modification -- "在时间避难所中建立新的人类社会" --> temporal_civilization
anchor_modification -- "尝试让伊娃融合新现实" --> consciousness_integration
anchor_modification -- "探索超越性的存在" --> transcendent_exploration
awakening -- "仔细检查自己的伤疤" --> observe_scar
awakening -- "播放录音设备" --> self_recording
awakening -- "查看床头柜上的纸条" --> mysterious_note
cautious_investigation -- "仔细阅读项目计划..." --> investigation
consciousness_integration -- "走向完美的新世界" --> ending_perfect
contact_eva -- "要求莉莉帮助阻止实验" --> eva_assistance_request
contact_eva -- "询问莉莉关于时间锚实验的详情" --> eva_experiment_explanation
contact_eva -- "请求莉莉恢复你的完整记忆" --> eva_experiment_explanation
dmitri_confrontation -- "询问如何终止实验" --> reactor_investigation_path
dmitri_confrontation -- "质问德米特里为什么选择了你" --> dmitri_personal_reveal
dmitri_truth_confrontation -- "跟随德米特里进入实验室..." --> dmitri_confrontation
eva_assistance_request -- "先收集更多信息再行动" --> cautious_investigation
eva_assistance_request -- "立即执行计划,前往反应堆" --> reactor_path
eva_experiment_explanation -- "只恢复最关键的记忆" --> memory_integration_crisis
eva_experiment_explanation -- "暂时放弃,专注于当前的行动" --> eva_assistance_request
eva_experiment_explanation -- "立即开始记忆恢复" --> memory_integration_crisis
eva_experiment_explanation -- "询问如何阻止这个实验" --> eva_assistance_request
explosion_evidence_analysis -- "带着证据去找德米特里对质" --> dmitri_evidence_reveal
explosion_evidence_analysis -- "搜索关于这个机器的更多信息" --> reactor_investigation_path
find_dmitri -- "告诉他你发现了录音和纸条" --> dmitri_evidence_reveal
find_dmitri -- "离开这里,寻找其他帮助" --> contact_eva
find_dmitri -- "要求德米特里开门解释一切" --> dmitri_truth_confrontation
first_awakening -- "尝试回忆发生了什么" --> memory_attempt
first_awakening -- "立即起身查看情况" --> awakening
first_awakening -- "观察周围环境寻找线索" --> observe_medical_bay
fragmented_visions -- "寻找录音设备和更多证据" --> self_recording
fragmented_visions -- "立即前往反应堆寻找时间锚" --> reactor_investigation_path
investigation -- "寻找计划的漏洞和弱点" --> plan_vulnerability_analysis
investigation -- "尝试理解德米特里的痛苦,寻求和解" --> dmitri_empathy_path
investigation -- "联系伊娃,询问她对计划的看法" --> eva_plan_consultation
medical_bay_discovery -- "保留证据,继续调查德米特里" --> evidence_collection
memory_attempt -- "专注于爆炸和蓝光的记忆" --> fragmented_visions
memory_attempt -- "尝试回忆德米特里和萨拉的对话" --> scientist_memory_fragment
memory_attempt -- "探索'再试一次'的记忆含义" --> repetition_memory_analysis
memory_integration_crisis -- "是的,我准备好与伊娃一起改变一切" --> anchor_modification
memory_integration_crisis -- "让我看看所有的可能性" --> timeline_analysis
mysterious_note -- "搜索医疗舱寻找更多线索" --> other_subjects
mysterious_note -- "播放录音设备" --> self_recording
mysterious_note -- "立即前往反应堆冷却回路" --> reactor_path
observe_medical_bay -- "搜索医疗记录寻找答案" --> medical_bay_discovery
observe_medical_bay -- "调查墙上的神秘洞和破坏痕迹" --> explosion_evidence_analysis
observe_scar -- "播放录音设备,看是否有相关信息" --> self_recording
observe_scar -- "查看床头柜上的纸条,寻找解释" --> mysterious_note
other_subjects -- "带着证据去找德米特里博士" --> find_dmitri
other_subjects -- "联系伊娃/莉莉验证这些信息" --> contact_eva
reactor_investigation_path -- "尝试手动关闭时间锚" --> reactor_sabotage_attempt
reactor_investigation_path -- "深入研究时间线数据" --> timeline_analysis
reactor_investigation_path -- "要求德米特里展示完整的真相" --> reactor_confrontation_path
reactor_path -- "使用紧急维护接入点强行进入" --> reactor_confrontation_path
reactor_path -- "退出,寻找其他方法或帮助" --> alternate_route
scientist_memory_fragment -- "专注于时间锚摧毁计划的记忆" --> sabotage_memory_recovery
scientist_memory_fragment -- "回忆关于其他141个实验对象的信息" --> other_subjects
scientist_memory_fragment -- "寻找萨拉博士,询问她的立场" --> sara_consultation
scientist_memory_fragment -- "立即与德米特里对质关于道德问题" --> dmitri_truth_confrontation
self_recording -- "仔细分析录音中的所有信息" --> other_subjects
self_recording -- "寻找德米特里博士要求解释" --> find_dmitri
self_recording -- "尝试联系伊娃确认信息" --> contact_eva
self_recording -- "立即前往反应堆寻找时间锚装置" --> reactor_path
end
subgraph cluster_branch_1[分支:发现植入物的痕迹]
subgraph cluster_branch_1_stage_0[stage 0]
body_modification_revelation["发现植入物的痕迹"]
end
subgraph cluster_branch_1_stage_1[stage 1]
eva_identity_revelation["伊娃身份的深度揭示"]
implant_activation["尝试激活手臂植入物"]
project_luna_investigation["量子植入物的觉醒"]
end
subgraph cluster_branch_1_stage_2[stage 2]
eva_quantum_link["从痛苦中创造意义"]
humanity_preservation["关闭植入物,重新变回完全的人类"]
reality_stabilization["现实守护者的使命"]
temporal_selves_communion["意识接触 - 47个自我"]
end
subgraph cluster_branch_1_stage_3[stage 3]
civilization_renarration["重写文明之歌"]
complete_self_world["创造一个每个人都能成为完整自我的世界"]
earth_salvation["使用新的理解来真正拯救地球"]
eternal_guardians_ending["接受守护者的永恒使命"]
guardian_council_ending["建立守护者议会,培养新的守护者"]
meaning_academy["建立'意义创造学院',教导这种哲学"]
philosophical_programming["将这种思维方式编程到时间锚中"]
reality_reprogramming["利用完整的自我重新编程现实"]
wholeness_sharing["分享这种完整性给其他人"]
wisdom_messenger["返回地球,成为这种智慧的活体传播者"]
end
subgraph cluster_branch_1_stage_4[stage 4]
civilization_symbol["成为新文明模式的活体象征"]
interspecies_harmony["创建跨物种的文明交流协议"]
narrative_academy["建立'新叙事'培训中心,遍布全宇宙"]
end
body_modification_revelation -- "尝试激活手臂植入物" --> implant_activation
body_modification_revelation -- "探索'月神'项目的含义" --> project_luna_investigation
body_modification_revelation -- "立即联系伊娃询问真相" --> eva_identity_revelation
civilization_renarration -- "创建跨物种的文明交流协议" --> interspecies_harmony
civilization_renarration -- "建立'新叙事'培训中心,遍布全宇宙" --> narrative_academy
civilization_renarration -- "成为新文明模式的活体象征" --> civilization_symbol
eva_quantum_link -- "创建全新的故事,重新定义人类文明的叙事" --> civilization_renarration
eva_quantum_link -- "将这种思维方式编程到时间锚中" --> philosophical_programming
eva_quantum_link -- "建立'意义创造学院',教导这种哲学" --> meaning_academy
eva_quantum_link -- "返回地球,成为这种智慧的活体传播者" --> wisdom_messenger
project_luna_investigation -- "使用新能力直接与伊娃的意识深层连接" --> eva_quantum_link
project_luna_investigation -- "关闭植入物,重新变回完全的人类" --> humanity_preservation
project_luna_investigation -- "尝试与时间锚中的47个自己沟通" --> temporal_selves_communion
project_luna_investigation -- "试图稳定现实裂隙,阻止宇宙崩溃" --> reality_stabilization
reality_stabilization -- "建立守护者议会,培养新的守护者" --> guardian_council_ending
reality_stabilization -- "接受守护者的永恒使命" --> eternal_guardians_ending
temporal_selves_communion -- "使用新的理解来真正拯救地球" --> earth_salvation
temporal_selves_communion -- "分享这种完整性给其他人" --> wholeness_sharing
temporal_selves_communion -- "创造一个每个人都能成为完整自我的世界" --> complete_self_world
temporal_selves_communion -- "利用完整的自我重新编程现实" --> reality_reprogramming
end
subgraph cluster_branch_2[分支:输入关闭代码]
subgraph cluster_branch_2_stage_0[stage 0]
emergency_shutdown["输入关闭代码"]
end
subgraph cluster_branch_2_stage_1[stage 1]
shutdown["德米特里的恐慌"]
end
subgraph cluster_branch_2_stage_2[stage 2]
shutdown_final_choice["时空稳定的关键选择"]
end
subgraph cluster_branch_2_stage_3[stage 3]
manual_stabilization["使用植入物手动稳定时空"]
reality_preservation["立即停止,保护现实稳定"]
timeline_liberation["完成关闭序列,释放所有时间线"]
end
emergency_shutdown -- "观察时间锚的反应..." --> shutdown
shutdown -- "理解后果..." --> shutdown_final_choice
shutdown_final_choice -- "使用植入物手动稳定时空" --> manual_stabilization
shutdown_final_choice -- "完成关闭序列,释放所有时间线" --> timeline_liberation
shutdown_final_choice -- "立即停止,保护现实稳定" --> reality_preservation
end
subgraph cluster_branch_3[分支:伊娃的身份揭示]
subgraph cluster_branch_3_身份揭示主簇[身份揭示主簇]
eva_revelation["伊娃的身份揭示
跳转分支:情感-记忆"]
end
subgraph cluster_branch_3_情感-记忆[情感-记忆]
emotional_reunion["姐妹重聚"]
identity_exploration["身份的探索"]
memory_sharing["记忆的分享"]
rescue_planning["拯救计划"]
emotional_reunion -- "先保护伊娃安全" --> rescue_planning
emotional_reunion -- "整合所有循环记忆" --> identity_exploration
end
subgraph cluster_branch_3_其他[其他]
anchor_destruction["破坏时间锚的决定"]
anna_grave_investigation["先找到安娜的墓地,了解德米特里的弱点"]
comfort_session["安慰的时光"]
contact_crew["手动重启尝试"]
crew_analysis["人员分析与评估"]
crew_confrontation["直面冲突"]
crew_confrontation_control_room["控制室对峙"]
crew_search["主动接触"]
data_extraction["访问机密数据库"]
deception_play["策略性欺骗"]
denial_path["逃避的代价"]
direct_confrontation["直接对峙"]
earth_truth["地球的真相"]
emergency_shutdown["输入关闭代码"]
emotional_breakdown["情感崩溃"]
ending_freedom["自由的代价"]
ending_guardian["时间的守护者"]
ending_heroic["英雄的选择"]
escape_attempt["逃离医疗舱"]
eternal_loop["永恒的循环"]
ethical_discussion["道德抉择的对话"]
eva_photo_reaction["继续阅读"]
garden_cooperation["秘密花园的发现"]
garden_learning["学习生命的艺术"]
garden_observation["花园的生命力"]
garden_partnership["花园伙伴关系"]
gradual_revelation["逐步的启示"]
immediate_exploration["紧急离开"]
manual_stabilization["使用植入物手动稳定时空"]
marcus_strategy["与马库斯联手"]
memory_reconstruction["记忆重建"]
oxygen_crisis_expanded["氧气危机"]
philosophical_discussion["哲学思辨"]
reality_preservation["立即停止,保护现实稳定"]
restart_cycle_end["重新开始(进入下一次循环)"]
sabotage_discussion["破坏计划"]
sara_evidence_sharing["联系萨拉博士,告诉她你发现的证据"]
shutdown["德米特里的恐慌"]
shutdown_final_choice["时空稳定的关键选择"]
stealth_medical_search["隐蔽搜索行动"]
stealth_observation["隐秘观察"]
stealth_observation_detailed["隐秘观察 - 详细版"]
system_logs["系统日志分析"]
timeline_liberation["完成关闭序列,释放所有时间线"]
anchor_destruction -- "开始新的生活" --> ending_freedom
comfort_session -- "先确保你的安全" --> gradual_revelation
comfort_session -- "立即行动" --> stealth_observation
comfort_session -- "通知马库斯" --> marcus_strategy
contact_crew -- "尝试绕过安全协议" --> oxygen_crisis_expanded
contact_crew -- "检查系统的安全锁定" --> system_logs
contact_crew -- "等待萨拉博士到来" --> oxygen_crisis_expanded
crew_analysis -- "与马库斯私下讨论安全措施" --> stealth_observation_detailed
crew_analysis -- "测试萨拉的忠诚度和决心" --> direct_confrontation
crew_analysis -- "深入调查德米特里的真实意图" --> stealth_observation_detailed
crew_analysis -- "请求伊娃提供更详细的基地分析" --> data_extraction
crew_confrontation -- "支持马库斯,一起对抗德米特里" --> marcus_strategy
crew_confrontation -- "要求所有人冷静下来讨论解决方案" --> deception_play
crew_confrontation -- "试图说服德米特里停止实验" --> sabotage_discussion
crew_search -- "反问她关于基地的异常情况" --> crew_confrontation
crew_search -- "告诉她你发现了录音设备" --> stealth_observation
crew_search -- "撒谎说什么都不记得" --> deception_play
deception_play -- "利用这段时间联系伊娃制定计划" --> stealth_observation
deception_play -- "快速离开寻找马库斯的帮助" --> immediate_exploration
denial_path -- "重新开始" --> restart_cycle_end
earth_truth -- "选择改进时间锚技术,自愿拯救地球" --> ending_heroic
earth_truth -- "选择放弃地球,优先考虑人类尊严" --> anchor_destruction
emergency_shutdown -- "观察时间锚的反应..." --> shutdown
emotional_breakdown -- "试图冷静并重思" --> comfort_session
ending_freedom -- "重新开始" --> restart_cycle_end
ending_guardian -- "重新开始" --> restart_cycle_end
ending_heroic -- "重新开始" --> restart_cycle_end
escape_attempt -- "尝试联系外界求救" --> contact_crew
escape_attempt -- "躲藏起来,等待合适的时机" --> stealth_medical_search
eternal_loop -- "接受永恒的使命" --> ending_guardian
ethical_discussion -- "寻求地球与人性的平衡" --> earth_truth
ethical_discussion -- "讨论彻底停止后果" --> anchor_destruction
ethical_discussion -- "让每个人提出解决方案" --> gradual_revelation
garden_cooperation -- "仔细观察花园中的植物细节" --> garden_observation
garden_cooperation -- "同意测试记忆恢复程序" --> memory_reconstruction
garden_cooperation -- "提议寻找其他解决方案" --> garden_partnership
garden_cooperation -- "要求更多时间考虑" --> philosophical_discussion
garden_cooperation -- "询问关于地球植物的更多信息" --> earth_truth
garden_cooperation -- "询问萨拉是否保留了过去的回忆" --> eva_photo_reaction
garden_observation -- "表达对萨拉的感谢和敬意" --> comfort_session
garden_observation -- "要求萨拉教你一些园艺技能" --> garden_learning
garden_observation -- "询问植物治疗的具体原理" --> garden_partnership
gradual_revelation -- "推动记忆恢复研究" --> memory_reconstruction
immediate_exploration -- "前往通讯阵列寻求外界帮助" --> escape_attempt
immediate_exploration -- "潜入主控制室收集信息" --> system_logs
marcus_strategy -- "先确保基地内其他人的安全" --> crew_confrontation
marcus_strategy -- "制定详细的行动计划" --> sabotage_discussion
oxygen_crisis_expanded -- "尝试手动重启氧气系统" --> contact_crew
oxygen_crisis_expanded -- "检查系统日志" --> system_logs
oxygen_crisis_expanded -- "联系基地其他人员" --> contact_crew
sabotage_discussion -- "威胁报告给外界机构" --> deception_play
sabotage_discussion -- "要求德米特里交出所有实验数据" --> crew_confrontation
sabotage_discussion -- "销毁记忆植入设备" --> marcus_strategy
shutdown -- "理解后果..." --> shutdown_final_choice
shutdown_final_choice -- "使用植入物手动稳定时空" --> manual_stabilization
shutdown_final_choice -- "完成关闭序列,释放所有时间线" --> timeline_liberation
shutdown_final_choice -- "立即停止,保护现实稳定" --> reality_preservation
stealth_medical_search -- "先找到安娜的墓地,了解德米特里的弱点" --> anna_grave_investigation
stealth_medical_search -- "立即使用关闭代码尝试停止时间锚" --> emergency_shutdown
stealth_medical_search -- "联系萨拉博士,告诉她你发现的证据" --> sara_evidence_sharing
stealth_observation -- "假装配合,等待机会" --> deception_play
stealth_observation -- "现身与萨拉对话" --> crew_search
stealth_observation -- "立即离开医疗舱" --> immediate_exploration
stealth_observation -- "等他们离开后行动" --> immediate_exploration
stealth_observation -- "要求伊娃帮助联系马库斯" --> marcus_strategy
stealth_observation_detailed -- "主动现身,与萨拉对话" --> direct_confrontation
stealth_observation_detailed -- "尝试创造分散注意力的行动" --> deception_play
stealth_observation_detailed -- "尝试联系伊娃寻求帮助" --> stealth_observation
stealth_observation_detailed -- "立即现身帮助萨拉" --> crew_confrontation_control_room
system_logs -- "寻求其他人的帮助" --> contact_crew
system_logs -- "深入分析访问日志" --> oxygen_crisis_expanded
system_logs -- "立即尝试修复氧气系统" --> contact_crew
end
end
subgraph cluster_branch_4[分支:寻找萨拉博士]
subgraph cluster_branch_4_stage_0[stage 0]
find_sara["寻找萨拉博士"]
end
subgraph cluster_branch_4_stage_1[stage 1]
sara_confession["萨拉的坦白 - 第一部分"]
end
subgraph cluster_branch_4_stage_2[stage 2]
dmitri_vulnerability["要求萨拉提供德米特里的弱点信息"]
external_contact["请求萨拉帮助联系外界"]
sara_alliance["安慰萨拉,询问如何联合阻止德米特里"]
end
find_sara -- "让萨拉先说她想说的" --> sara_confession
find_sara -- "询问自己昏迷的时间" --> sara_confession
find_sara -- "质问萨拉为什么看起来内疚" --> sara_confession
sara_confession -- "安慰萨拉,询问如何联合阻止德米特里" --> sara_alliance
sara_confession -- "要求萨拉提供德米特里的弱点信息" --> dmitri_vulnerability
sara_confession -- "请求萨拉帮助联系外界" --> external_contact
end
subgraph cluster_branch_5[分支:隐藏标记的发现]
subgraph cluster_branch_5_stage_0[stage 0]
hidden_marks_discovery["隐藏标记的发现"]
end
subgraph cluster_branch_5_stage_1[stage 1]
deep_body_scan["忽略警告,继续自我检查"]
implant_ai_communication["尝试与植入AI系统对话"]
project_luna_investigation["量子植入物的觉醒"]
quantum_interface_activation["立即尝试激活量子接口"]
end
subgraph cluster_branch_5_stage_2[stage 2]
eva_quantum_link["从痛苦中创造意义"]
humanity_preservation["关闭植入物,重新变回完全的人类"]
reality_stabilization["现实守护者的使命"]
temporal_selves_communion["意识接触 - 47个自我"]
end
subgraph cluster_branch_5_stage_3[stage 3]
civilization_renarration["重写文明之歌"]
complete_self_world["创造一个每个人都能成为完整自我的世界"]
earth_salvation["使用新的理解来真正拯救地球"]
eternal_guardians_ending["接受守护者的永恒使命"]
guardian_council_ending["建立守护者议会,培养新的守护者"]
meaning_academy["建立'意义创造学院',教导这种哲学"]
philosophical_programming["将这种思维方式编程到时间锚中"]
reality_reprogramming["利用完整的自我重新编程现实"]
wholeness_sharing["分享这种完整性给其他人"]
wisdom_messenger["返回地球,成为这种智慧的活体传播者"]
end
subgraph cluster_branch_5_stage_4[stage 4]
civilization_symbol["成为新文明模式的活体象征"]
interspecies_harmony["创建跨物种的文明交流协议"]
narrative_academy["建立'新叙事'培训中心,遍布全宇宙"]
end
civilization_renarration -- "创建跨物种的文明交流协议" --> interspecies_harmony
civilization_renarration -- "建立'新叙事'培训中心,遍布全宇宙" --> narrative_academy
civilization_renarration -- "成为新文明模式的活体象征" --> civilization_symbol
eva_quantum_link -- "创建全新的故事,重新定义人类文明的叙事" --> civilization_renarration
eva_quantum_link -- "将这种思维方式编程到时间锚中" --> philosophical_programming
eva_quantum_link -- "建立'意义创造学院',教导这种哲学" --> meaning_academy
eva_quantum_link -- "返回地球,成为这种智慧的活体传播者" --> wisdom_messenger
hidden_marks_discovery -- "尝试与植入AI系统对话" --> implant_ai_communication
hidden_marks_discovery -- "忽略警告,继续自我检查" --> deep_body_scan
hidden_marks_discovery -- "搜索关于'月神'项目的信息" --> project_luna_investigation
hidden_marks_discovery -- "立即尝试激活量子接口" --> quantum_interface_activation
project_luna_investigation -- "使用新能力直接与伊娃的意识深层连接" --> eva_quantum_link
project_luna_investigation -- "关闭植入物,重新变回完全的人类" --> humanity_preservation
project_luna_investigation -- "尝试与时间锚中的47个自己沟通" --> temporal_selves_communion
project_luna_investigation -- "试图稳定现实裂隙,阻止宇宙崩溃" --> reality_stabilization
reality_stabilization -- "建立守护者议会,培养新的守护者" --> guardian_council_ending
reality_stabilization -- "接受守护者的永恒使命" --> eternal_guardians_ending
temporal_selves_communion -- "使用新的理解来真正拯救地球" --> earth_salvation
temporal_selves_communion -- "分享这种完整性给其他人" --> wholeness_sharing
temporal_selves_communion -- "创造一个每个人都能成为完整自我的世界" --> complete_self_world
temporal_selves_communion -- "利用完整的自我重新编程现实" --> reality_reprogramming
end
subgraph cluster_branch_6[分支第48次循环的完美策略]
subgraph cluster_branch_6_stage_0[stage 0]
strategic_planning["第48次循环的完美策略"]
end
subgraph cluster_branch_6_stage_1[stage 1]
complete_destruction_plan["激进重生:彻底摧毁"]
empathy_healing_path["选择情感路径 - 通过爱与理解来治愈所有人"]
eva_transcendence["伊娃的超越"]
suffering_philosophy["共情治愈之路"]
end
subgraph cluster_branch_6_stage_2[stage 2]
collective_redefinition["与所有人一起重新定义时间锚的目的"]
consciousness_communication["与时间锚意识沟通"]
ethical_discussion["道德抉择的对话"]
eva_transcendence_ending["伊娃的最终超越"]
individual_path_guidance["帮助每个人找到属于自己的道路"]
natural_healing_path["回到地球,专注于自然修复而非技术干预"]
tech_ethics_guardian["成立'技术伦理监督委员会',永久监管危险科学"]
understanding_future["创建一个新的未来,基于理解而非恐惧"]
universal_warning_beacon["将你的故事传播到全宇宙,警告其他文明"]
end
subgraph cluster_branch_6_stage_3[stage 3]
anchor_destruction["破坏时间锚的决定"]
gradual_revelation["逐步的启示"]
end
subgraph cluster_branch_6_stage_4[stage 4]
ending_freedom["自由的代价"]
memory_reconstruction["记忆重建"]
end
anchor_destruction -- "开始新的生活" --> ending_freedom
complete_destruction_plan -- "回到地球,专注于自然修复而非技术干预" --> natural_healing_path
complete_destruction_plan -- "将你的故事传播到全宇宙,警告其他文明" --> universal_warning_beacon
complete_destruction_plan -- "成立'技术伦理监督委员会',永久监管危险科学" --> tech_ethics_guardian
consciousness_communication -- "决定释放所有被困的意识" --> anchor_destruction
consciousness_communication -- "询问伊娃是否有其他选择" --> eva_transcendence
ethical_discussion -- "讨论彻底停止后果" --> anchor_destruction
ethical_discussion -- "让每个人提出解决方案" --> gradual_revelation
eva_transcendence -- "同意让伊娃进行超越转化" --> eva_transcendence_ending
eva_transcendence -- "要求更多时间考虑这个选择" --> ethical_discussion
eva_transcendence -- "询问是否有让伊娃保持个体性的方法" --> consciousness_communication
gradual_revelation -- "推动记忆恢复研究" --> memory_reconstruction
strategic_planning -- "暂停,深入思考痛苦与意义的哲学问题" --> suffering_philosophy
strategic_planning -- "选择情感路径 - 通过爱与理解来治愈所有人" --> empathy_healing_path
strategic_planning -- "选择激进路径 - 彻底摧毁所有实验设施" --> complete_destruction_plan
strategic_planning -- "选择超越路径 - 与伊娃一起进化" --> eva_transcendence
suffering_philosophy -- "与所有人一起重新定义时间锚的目的" --> collective_redefinition
suffering_philosophy -- "创建一个新的未来,基于理解而非恐惧" --> understanding_future
suffering_philosophy -- "帮助每个人找到属于自己的道路" --> individual_path_guidance
end
subgraph cluster_restart[循环重启]
restart_cycle_end["重新开始(进入下一次循环)"]
end

View File

@@ -0,0 +1,114 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import argparse
import os
import re
from typing import Dict, List, Tuple
NODE_RE = re.compile(r'^\s*@node\s+(?P<id>[A-Za-z0-9_]+)\s*$')
TITLE_RE = re.compile(r'^\s*@title\s+"(?P<title>.*)"\s*$')
CHOICE_RE = re.compile(r'^\s*choice_\d+\s*:\s*"(?P<label>.*?)"\s*->\s*(?P<target>[A-Za-z0-9_]+)')
ENDING_ID_PREFIXES = (
'ending_',
)
ENDING_TITLE_KEYWORDS = (
'结局', '最终', '终极', '拯救', '守护', '和谐', '文明', '宽恕', '宇宙', '完美'
)
def parse_story(path: str) -> Tuple[Dict[str, str], Dict[str, List[Tuple[str, str]]]]:
with open(path, 'r', encoding='utf-8') as f:
lines = f.readlines()
nodes: Dict[str, str] = {}
edges: Dict[str, List[Tuple[str, str]]] = {}
current_id: str = ''
i = 0
n = len(lines)
while i < n:
line = lines[i].rstrip('\n')
m_node = NODE_RE.match(line)
if m_node:
current_id = m_node.group('id')
if current_id not in nodes:
nodes[current_id] = current_id
if current_id not in edges:
edges[current_id] = []
j = i + 1
while j < n:
l2 = lines[j].rstrip('\n')
if NODE_RE.match(l2):
break
m_title = TITLE_RE.match(l2)
if m_title:
title = m_title.group('title').strip()
if title:
nodes[current_id] = title
m_choice = CHOICE_RE.match(l2)
if m_choice:
label = m_choice.group('label').strip()
target = m_choice.group('target').strip()
edges.setdefault(current_id, []).append((label, target))
j += 1
i = j
continue
i += 1
return nodes, edges
def is_ending(node_id: str, title: str) -> bool:
if any(node_id.startswith(p) for p in ENDING_ID_PREFIXES):
return True
return any(k in (title or '') for k in ENDING_TITLE_KEYWORDS)
def main():
ap = argparse.ArgumentParser()
ap.add_argument('--input', required=True)
ap.add_argument('--output', required=True)
args = ap.parse_args()
nodes, edges = parse_story(args.input)
# Compute out-degree
outdeg = {nid: len(edges.get(nid, [])) for nid in nodes.keys()}
leaf_nodes = [nid for nid, deg in outdeg.items() if deg == 0]
endings = []
non_endings = []
for nid in sorted(leaf_nodes):
title = nodes.get(nid, '')
(endings if is_ending(nid, title) else non_endings).append((nid, title))
os.makedirs(os.path.dirname(args.output), exist_ok=True)
with open(args.output, 'w', encoding='utf-8') as f:
f.write('# 无后续(无 choices节点清单\n\n')
f.write(f'- 总节点数: {len(nodes)}\n')
f.write(f'- 无后续节点数: {len(leaf_nodes)}\n')
f.write(f'- 结局型: {len(endings)}\n')
f.write(f'- 可能未接续: {len(non_endings)}\n\n')
f.write('## 结局型Leaf Endings\n')
for nid, title in endings:
f.write(f'- {title} | id: `{nid}`\n')
f.write('\n')
f.write('## 可能未接续(需人工确认是否应有后续)\n')
for nid, title in non_endings:
f.write(f'- {title} | id: `{nid}`\n')
print(f"Wrote report to {args.output}. Endings={len(endings)} NonEndings={len(non_endings)}")
if __name__ == '__main__':
main()

View File

@@ -0,0 +1,536 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import argparse
import os
import re
from typing import Dict, List, Tuple, Set
NODE_RE = re.compile(r'^\s*@node\s+(?P<id>[A-Za-z0-9_]+)\s*$')
TITLE_RE = re.compile(r'^\s*@title\s+"(?P<title>.*)"\s*$')
CHOICE_RE = re.compile(
r'^\s*choice_\d+\s*:\s*"(?P<label>.*?)"\s*->\s*(?P<target>[A-Za-z0-9_]+)'
)
# ---- Multi-page patterns & helpers ----
# ID suffix patterns: foo_p2, foo_part2, foo_final
SUFFIX_PATTERNS = [
re.compile(r'^(?P<base>.+)_p\d+$'),
re.compile(r'^(?P<base>.+)_part\d+$'),
re.compile(r'^(?P<base>.+)_(?:final)$'),
]
# Title pagination markers like 1/3 or (1/3)
TITLE_PAGE_RE = re.compile(r'[\(]\s*\d+\s*/\s*\d+\s*[\)]')
# Edge labels considered as pagination/continuation and can be merged away
CONTINUE_LABEL_PREFIXES: Tuple[str, ...] = (
'继续阅读', '继续查看', '继续听', '继续'
)
def parse_story(path: str) -> Tuple[Dict[str, str], Dict[str, List[Tuple[str, str]]]]:
"""
Parse .story file and return:
- nodes: id -> title
- edges: src_id -> list of (label, target_id)
"""
with open(path, 'r', encoding='utf-8') as f:
lines = f.readlines()
nodes: Dict[str, str] = {}
edges: Dict[str, List[Tuple[str, str]]] = {}
current_id: str = ''
i = 0
n = len(lines)
while i < n:
line = lines[i].rstrip('\n')
m_node = NODE_RE.match(line)
if m_node:
current_id = m_node.group('id')
# Initialize node if not exists
if current_id not in nodes:
nodes[current_id] = current_id
if current_id not in edges:
edges[current_id] = []
# Scan until next @node or EOF, collecting title and choices
j = i + 1
while j < n:
l2 = lines[j].rstrip('\n')
# Stop when next node begins
if NODE_RE.match(l2):
break
# Title
m_title = TITLE_RE.match(l2)
if m_title:
title = m_title.group('title').strip()
if title:
nodes[current_id] = title
# Choices -> edges
m_choice = CHOICE_RE.match(l2)
if m_choice:
label = m_choice.group('label').strip()
target = m_choice.group('target').strip()
edges.setdefault(current_id, []).append((label, target))
j += 1
# continue from j (next node or EOF)
i = j
continue
i += 1
return nodes, edges
def mermaid_escape(text: str) -> str:
# Replace double quotes to avoid breaking labels
return text.replace('"', "'")
def extract_base_id(node_id: str) -> str:
for pat in SUFFIX_PATTERNS:
m = pat.match(node_id)
if m:
return m.group('base')
return node_id
class UnionFind:
def __init__(self):
self.parent: Dict[str, str] = {}
def find(self, x: str) -> str:
if x not in self.parent:
self.parent[x] = x
if self.parent[x] != x:
self.parent[x] = self.find(self.parent[x])
return self.parent[x]
def union(self, a: str, b: str):
ra, rb = self.find(a), self.find(b)
if ra != rb:
self.parent[rb] = ra
def clean_title_for_display(title: str) -> str:
# Remove pagination markers like 1/3
return TITLE_PAGE_RE.sub('', title).strip()
def is_continue_label(label: str) -> bool:
return any(label.startswith(prefix) for prefix in CONTINUE_LABEL_PREFIXES)
def build_mermaid(nodes: Dict[str, str], edges: Dict[str, List[Tuple[str, str]]], *, root_id: str = 'first_awakening', detach_branches: bool = True) -> str:
# Collect all referenced targets to add placeholder nodes if missing
referenced = set()
for src, lst in edges.items():
for _label, tgt in lst:
referenced.add(tgt)
# Add placeholders for undefined targets
for tgt in referenced:
if tgt not in nodes:
nodes[tgt] = f"{tgt}"
edges.setdefault(tgt, [])
# Derive incoming labels for placeholder nodes; use edge label as display title if node has no proper title
incoming_labels: Dict[str, List[str]] = {}
for src, lst in edges.items():
for label, tgt in lst:
if label:
incoming_labels.setdefault(tgt, []).append(label)
for node_id, title in list(nodes.items()):
if title.strip() == node_id.strip():
labels = incoming_labels.get(node_id, [])
if labels:
# pick the shortest non-empty label as node title
best = sorted((l for l in labels if l.strip()), key=lambda s: len(s))[0]
nodes[node_id] = best
# -------- Merge multi-page nodes and continuation edges --------
uf = UnionFind()
# 1) Merge by suffix patterns (id-based grouping)
for node_id in list(nodes.keys()):
base = extract_base_id(node_id)
if base != node_id:
uf.union(base, node_id)
# 2) Merge by edges labeled as continuation (e.g., 继续阅读)
for src, lst in edges.items():
for label, tgt in lst:
if is_continue_label(label):
uf.union(src, tgt)
# 3) Also merge if base ids are identical (pagination chain)
if extract_base_id(src) == extract_base_id(tgt) and src != tgt:
uf.union(src, tgt)
# Build groups
groups: Dict[str, List[str]] = {}
for node_id in nodes.keys():
rep = uf.find(node_id)
groups.setdefault(rep, []).append(node_id)
# Choose representative id per group (prefer base id of representative)
group_id_map: Dict[str, str] = {}
for rep, members in groups.items():
base_rep = extract_base_id(rep)
group_id_map[rep] = base_rep
# Map every node to its group representative id
node_to_group: Dict[str, str] = {}
for rep, members in groups.items():
gid = group_id_map[rep]
for m in members:
node_to_group[m] = gid
# Compute group titles (prefer a member title without pagination marker)
group_titles: Dict[str, str] = {}
for rep, members in groups.items():
gid = group_id_map[rep]
chosen = ''
# Prefer a member whose title does not contain (x/y)
for m in members:
t = nodes.get(m, '').strip()
if t and not TITLE_PAGE_RE.search(t):
chosen = t
break
if not chosen:
# Fallback to any non-empty title
for m in members:
t = nodes.get(m, '').strip()
if t:
chosen = t
break
if not chosen:
# Final fallback: use group id
chosen = gid
group_titles[gid] = clean_title_for_display(chosen)
# Rebuild edges at group level, dropping pagination edges and self-loops
new_edges: Set[Tuple[str, str, str]] = set()
for src, lst in edges.items():
gsrc = node_to_group[src]
for label, tgt in lst:
gtgt = node_to_group[tgt]
if gsrc == gtgt:
continue # internal after merge
if is_continue_label(label):
continue # drop continuation edges
elabel = mermaid_escape(label)
new_edges.add((gsrc, elabel, gtgt))
# -------- Redirect loops back to root → to a dedicated restart node --------
RESTART_NODE_ID = 'restart_cycle_end'
RESTART_TITLE = '重新开始(进入下一次循环)'
redirected_edges: Set[Tuple[str, str, str]] = set()
for (s, l, t) in new_edges:
if t == root_id:
redirected_edges.add((s, '重新开始', RESTART_NODE_ID))
else:
redirected_edges.add((s, l, t))
new_edges = redirected_edges
# Register restart node in titles map
group_titles[RESTART_NODE_ID] = RESTART_TITLE
# Build adjacency on merged graph
adj: Dict[str, List[Tuple[str, str]]] = {}
rev: Dict[str, List[Tuple[str, str]]] = {}
indeg: Dict[str, int] = {gid: 0 for gid in group_titles.keys()}
outdeg: Dict[str, int] = {gid: 0 for gid in group_titles.keys()}
for s, l, t in new_edges:
adj.setdefault(s, []).append((l, t))
rev.setdefault(t, []).append((l, s))
outdeg[s] = outdeg.get(s, 0) + 1
indeg[t] = indeg.get(t, 0) + 1
# Reachable set from root
main_nodes: Set[str] = set()
if root_id in group_titles:
q: List[str] = [root_id]
while q:
u = q.pop(0)
if u in main_nodes:
continue
main_nodes.add(u)
for _l, v in adj.get(u, []):
if v not in main_nodes:
q.append(v)
else:
# Fallback: include all nodes if root not found
main_nodes = set(group_titles.keys())
# Compute depth (shortest hops) from root within reachable graph
depth: Dict[str, int] = {}
if root_id in group_titles:
from collections import deque
dq = deque()
dq.append(root_id)
depth[root_id] = 0
while dq:
u = dq.popleft()
du = depth[u]
for _l, v in adj.get(u, []):
if v not in depth:
depth[v] = du + 1
dq.append(v)
# Identify branch roots (heuristic)
ENDING_KEYWORDS = (
'结局', '最终', '终极', '共存', '宽恕', '拯救', '新文明', '宇宙', '学院', '网络', '守护', '转型', '推广'
)
def is_branch_title(title: str) -> bool:
return any(k in title for k in ENDING_KEYWORDS)
branch_roots: Set[str] = set()
if detach_branches:
# Force-split branch roots by id/title keywords
FORCED_BRANCH_IDS = {
'eva_identity_revelation', 'hidden_marks_discovery', 'find_sara'
}
FORCED_BRANCH_TITLE_KEYWORDS = (
'伊娃的身份揭示', '身份揭示', '植入物', '痕迹', '寻找萨拉', '第48次循环的完美策略'
)
for gid, title in group_titles.items():
if gid == root_id:
continue
# candidate if titled like an ending cluster or low indegree/high outdegree leaf-ish
if is_branch_title(title) and gid in main_nodes:
branch_roots.add(gid)
# Also add nodes with id starting patterns often used for endings
for gid in list(main_nodes):
if gid.startswith('ending_') or gid in (
'coexistence_path', 'coexistence_path_p2',
'healing_civilization_final', 'harmony_guardians_final',
'reality_guardians', 'cosmic_guardians_ending', 'universal_rescue_ending'
):
branch_roots.add(gid)
# Add forced branch roots (by id or title keywords), regardless of heuristics
for gid, title in group_titles.items():
if gid in FORCED_BRANCH_IDS:
branch_roots.add(gid)
else:
if any(kw in title for kw in FORCED_BRANCH_TITLE_KEYWORDS):
branch_roots.add(gid)
# Heuristic: deep and weakly-connected nodes become new branch roots
DEPTH_THRESHOLD = 6
MAX_EDGES_FROM_MAIN = 1
MAX_EDGES_TO_MAIN = 1
for gid in list(main_nodes):
if gid == root_id:
continue
d = depth.get(gid, 0)
if d < DEPTH_THRESHOLD:
continue
in_from_main = sum(1 for _l, s in rev.get(gid, []) if s in main_nodes)
out_to_main = sum(1 for _l, t in adj.get(gid, []) if t in main_nodes)
if in_from_main <= MAX_EDGES_FROM_MAIN and out_to_main <= MAX_EDGES_TO_MAIN:
branch_roots.add(gid)
# Grow branch clusters from roots
branch_clusters: List[Tuple[str, Set[str]]] = [] # (root, nodes)
used_in_cluster: Set[str] = set()
for br in sorted(branch_roots):
if br in used_in_cluster:
continue
cluster: Set[str] = set()
q = [br]
while q:
u = q.pop(0)
if u in cluster:
continue
cluster.add(u)
for _l, v in adj.get(u, []):
# avoid pulling back too many main nodes: keep expansion to weakly connected area
in_from_outside = sum(1 for _l, s in rev.get(v, []) if s not in cluster and s in main_nodes)
if v not in cluster and in_from_outside <= (MAX_EDGES_FROM_MAIN + 1):
q.append(v)
if len(cluster) >= 3:
branch_clusters.append((br, cluster))
used_in_cluster |= cluster
# Remove cluster nodes from main_nodes
for _br, cset in branch_clusters:
main_nodes -= cset
# Build label augmentation mapping for main nodes that lead to clusters
jump_tips: Dict[str, List[str]] = {}
for s, l, t in new_edges:
# Edge from main to cluster root -> add jump tip
for br, cset in branch_clusters:
if s in main_nodes and t in cset:
tip = f"跳转分支:{group_titles[br]}"
jump_tips.setdefault(s, [])
if tip not in jump_tips[s]:
jump_tips[s].append(tip)
# Build Mermaid text
lines: List[str] = []
lines.append("%%{init: {'flowchart': {'htmlLabels': true}}}%%")
lines.append('flowchart TD')
lines.append('')
# Main cluster
lines.append(' subgraph cluster_main[主线:第一次觉醒]')
for gid in sorted(main_nodes):
title = group_titles[gid]
extra = ''
if gid in jump_tips:
extra = '\n' + ''.join(jump_tips[gid])
label = mermaid_escape(title + extra)
lines.append(f' {gid}["{label}"]')
# Main edges
for (s, l, t) in sorted(new_edges):
if s in main_nodes and t in main_nodes:
if l:
lines.append(f' {s} -- "{l}" --> {t}')
else:
lines.append(f' {s} --> {t}')
lines.append(' end')
# Branch clusters with optional stage subgraphs by depth buckets to avoid overcrowding
for idx, (br, nodeset) in enumerate(branch_clusters, start=1):
title = group_titles[br]
lines.append(f' subgraph cluster_branch_{idx}[分支:{mermaid_escape(title)}]')
# Special handling: 二次拆分“伊娃的身份揭示”大分支
identity_ids = { 'eva_identity_revelation', 'eva_revelation' }
emo_ids = { 'emotional_reunion', 'memory_sharing', 'identity_exploration', 'rescue_planning' }
quantum_ids = { 'consciousness_communication', 'consciousness_integration', 'eva_quantum_link' }
is_identity_branch = (br in identity_ids) or ('身份' in title and '揭示' in title)
if is_identity_branch:
# Build subsets by id
subset_identity = {gid for gid in nodeset if gid in identity_ids}
subset_emo = {gid for gid in nodeset if gid in emo_ids}
subset_quantum = {gid for gid in nodeset if gid in quantum_ids}
subset_other = nodeset - subset_identity - subset_emo - subset_quantum
# Prepare jump tips within this branch
intra_jump_tips: Dict[str, List[str]] = {}
def add_tip(src_gid: str, tip: str):
intra_jump_tips.setdefault(src_gid, [])
if tip not in intra_jump_tips[src_gid]:
intra_jump_tips[src_gid].append(tip)
# Print subgraphs
def print_subset(name: str, subset: Set[str]):
if not subset:
return
lines.append(f' subgraph cluster_branch_{idx}_{name}[{name}]')
for gid in sorted(subset):
extra = ''
if gid in intra_jump_tips:
extra = '\n' + ''.join(intra_jump_tips[gid])
label = mermaid_escape(group_titles[gid] + extra)
lines.append(f' {gid}["{label}"]')
# internal edges
for (s, l, t) in sorted(new_edges):
if s in subset and t in subset:
if l:
lines.append(f' {s} -- "{l}" --> {t}')
else:
lines.append(f' {s} --> {t}')
lines.append(' end')
# Collect cross-subset edges to convert into jump tips (从身份主簇指向其他簇)
for (s, l, t) in sorted(new_edges):
if s in subset_identity and t in subset_emo:
add_tip(s, '跳转分支:情感-记忆')
if s in subset_identity and t in subset_quantum:
add_tip(s, '跳转分支:意识-量子')
# Render subsets
print_subset('身份揭示主簇', subset_identity or {br})
print_subset('情感-记忆', subset_emo)
print_subset('意识-量子', subset_quantum)
if subset_other:
print_subset('其他', subset_other)
# 不渲染跨子簇边,避免拥挤
lines.append(' end')
continue
# ---------- 默认:按深度 stage 分桶 ----------
# compute local depths from branch root
from collections import deque
local_depth: Dict[str, int] = {br: 0}
dq = deque([br])
while dq:
u = dq.popleft()
du = local_depth[u]
for _l, v in adj.get(u, []):
if v in nodeset and v not in local_depth:
local_depth[v] = du + 1
dq.append(v)
# bucket nodes by depth
buckets: Dict[int, List[str]] = {}
for n in nodeset:
d = local_depth.get(n, 0)
buckets.setdefault(d, []).append(n)
for stage in sorted(buckets.keys()):
lines.append(f' subgraph cluster_branch_{idx}_stage_{stage}[stage {stage}]')
for gid in sorted(buckets[stage]):
label = mermaid_escape(group_titles[gid])
lines.append(f' {gid}["{label}"]')
# stage internal edges
for (s, l, t) in sorted(new_edges):
if s in buckets[stage] and t in buckets[stage]:
if l:
lines.append(f' {s} -- "{l}" --> {t}')
else:
lines.append(f' {s} --> {t}')
lines.append(' end')
# cross-stage edges within the branch
for (s, l, t) in sorted(new_edges):
if s in nodeset and t in nodeset and local_depth.get(s, 0) != local_depth.get(t, 0):
if l:
lines.append(f' {s} -- "{l}" --> {t}')
else:
lines.append(f' {s} --> {t}')
lines.append(' end')
# Restart cluster (sink)
lines.append(f' subgraph cluster_restart[循环重启]')
lines.append(f' {RESTART_NODE_ID}["{mermaid_escape(RESTART_TITLE)}"]')
lines.append(' end')
lines.append('')
return '\n'.join(lines)
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--input', required=True)
parser.add_argument('--output', required=True)
args = parser.parse_args()
nodes, edges = parse_story(args.input)
# Force root as first_awakening; detach branches by default
content = build_mermaid(nodes, edges, root_id='first_awakening', detach_branches=True)
os.makedirs(os.path.dirname(args.output), exist_ok=True)
with open(args.output, 'w', encoding='utf-8') as f:
f.write(content)
print(f"Generated Mermaid with {len(nodes)} nodes and {sum(len(v) for v in edges.values())} edges → {args.output}")
if __name__ == '__main__':
main()

View File

@@ -0,0 +1,31 @@
# 无后续(无 choices节点清单
- 总节点数: 209
- 无后续节点数: 21
- 结局型: 4
- 可能未接续: 17
## 结局型Leaf Endings
- 伊娃的最终超越 | id: `eva_transcendence_ending`
- 地球的最终拯救3/3 | id: `healing_civilization_final_p3`
- 反应堆最终对峙4/4 | id: `reactor_confrontation_path_p4`
- 和谐守护者的永恒使命2/2 | id: `universal_rescue_ending_p2`
## 可能未接续(需人工确认是否应有后续)
- 控制室对峙3/3 | id: `crew_confrontation_control_room_p3`
- 意识进化的发现 | id: `data_extraction_final`
- 直接对峙2/2 | id: `direct_confrontation_p2`
- 证据摊牌 | id: `dmitri_evidence_reveal`
- 德米特里的个人动机2/2 | id: `dmitri_personal_reveal_p2`
- 伊娃身份的深度揭示3/3 | id: `eva_identity_revelation_p3`
- eva_photo_reaction_p3 | id: `eva_photo_reaction_p3`
- 学习生命的艺术 | id: `garden_learning`
- 花园伙伴关系2/2 | id: `garden_partnership_p2`
- 医疗录音的深层真相2/2 | id: `medical_recording_revelation_p2`
- 记忆重建3/3 | id: `memory_reconstruction_p3`
- 哲学思辨2/2 | id: `philosophical_discussion_p2`
- 量子徽章的深度分析 | id: `quantum_badge_analysis`
- 反应堆破坏尝试(续) | id: `reactor_sabotage_attempt_p2`
- repetition_memory_analysis_p2 | id: `repetition_memory_analysis_p2`
- 系统破坏2/2 | id: `system_sabotage_p2`
- 时间线深度分析4/4 | id: `timeline_analysis_p4`

View File

@@ -5,16 +5,16 @@
@character eva
name: "伊娃 / EVA"
voice_style: gentle
description: "基地AI系统,实际上是莉莉的意识转移,温柔而智慧"
description: "基地AI系统(由莉莉的意识转移而成),温柔而智慧逐步展现出超越传统AI的情感与主体性"
relationship: "妹妹"
personality: "关爱、智慧、略带忧郁"
key_traits: ["protective", "intelligent", "emotional"]
personality: "关爱、智慧、略带忧郁;渴望自由与具身体验"
key_traits: ["protective", "intelligent", "emotional", "evolving"]
@end
@character alex
name: "艾利克丝·陈"
voice_style: determined
description: "月球基地工程师,坚强而富有同情心的主角"
description: "月球基地工程师,坚强而富有同情心;多次循环后形成神经适应与更强的抗干扰能力"
relationship: "自己"
personality: "坚毅、善良、追求真相"
key_traits: ["brave", "empathetic", "curious"]
@@ -23,16 +23,16 @@
@character sara
name: "萨拉·维特博士"
voice_style: professional
description: "基地医生,负责心理健康内心善良被迫参与实验"
description: "基地医生,负责心理健康内心善良被迫参与记忆重置;维护秘密花园并研究记忆恢复方案"
relationship: "同事"
personality: "专业、内疚、渴望救赎"
key_traits: ["caring", "conflicted", "knowledgeable"]
personality: "专业、内疚、渴望救赎;在压力下仍坚持人道选择"
key_traits: ["caring", "conflicted", "knowledgeable", "innovative"]
@end
@character dmitri
name: "德米特里·彼得罗夫博士"
voice_style: serious
description: "时间锚项目负责人,科学家,道德复杂"
description: "时间锚项目负责人;为拯救人类愿付高昂代价,追求可被其掌控的理想未来,伦理立场复杂"
relationship: "上级"
personality: "理性、冷酷、但有人性的一面"
key_traits: ["logical", "ambitious", "tormented"]
@@ -41,7 +41,7 @@
@character marcus
name: "马库斯·雷诺兹"
voice_style: calm
description: "基地安全官,前军人正义感强烈"
description: "基地安全官,前军人正义感强烈,注重秩序与保护队友,常在关键时刻提供支持"
relationship: "盟友"
personality: "忠诚、正义、保护欲强"
key_traits: ["loyal", "protective", "experienced"]
@@ -50,8 +50,17 @@
@character harrison
name: "威廉·哈里森指挥官"
voice_style: authoritative
description: "已故的基地前指挥官,为真相而牺牲的英雄"
description: "已故的基地前指挥官;通过遗留录音和档案指引真相,为守护伦理底线而牺牲"
relationship: "殉道者"
personality: "正直、勇敢、有父亲般的关怀"
key_traits: ["heroic", "truthful", "sacrificial"]
@end
@character lily
name: "莉莉·陈 / Lily Chen"
voice_style: warm
description: "艾利克丝的亲妹妹早期时间锚事故中身亡其意识被转移为EVA的核心仍以照片回忆与情感羁绊影响剧情"
relationship: "妹妹本体已故意识延续为EVA"
personality: "好奇、乐观、富有同理心;对人类体验与亲情有强烈眷恋"
key_traits: ["curious", "loving", "idealistic"]
@end

View File

@@ -1,337 +0,0 @@
@story_module investigation_branch
@version 2.0
@dependencies [characters, audio_config, anchors]
@description "调查分支模块 - 深度调查和证据收集的故事线"
@audio
background: electronic_tension.mp3
transition: discovery_chime.mp3
@end
// ===== 调查分支故事线 =====
@node stealth_observation_detailed
@title "隐秘观察 - 详细版"
@audio_bg heartbeat.mp3
@content """
你决定保持隐藏,小心翼翼地观察即将到来的访客。
躲在医疗舱的储物柜后面,你屏住呼吸,听着脚步声越来越近。门开了,一个身影出现在门口。
是萨拉博士。但她看起来和平时不同——神情紧张,不断地四处张望,仿佛在确认没有人跟踪。
她走向医疗控制台,快速地输入了一系列命令。屏幕上显示出复杂的数据流,你看到了一些令人不安的信息:
"记忆重置协议 #48 - 状态:准备中"
"观察对象:艾利克丝·陈"
"预计执行时间72小时"
萨拉轻声自语:"不...我不能再这样做了。她已经受够了。"
她开始修改某些参数,你看到协议状态变成了"延迟"。
突然,萨拉的通讯器响了。
"萨拉,你在医疗舱吗?"德米特里的声音传来。
萨拉迅速关闭了屏幕:"是的,只是在做例行检查。"
"我需要你准备记忆重置设备。我们今晚就执行。"
"但是...德米特里,她的身体还没有完全恢复..."
"这不是讨论,萨拉。按照计划执行。"
萨拉的肩膀垂了下来。在通讯结束后,她站在那里好几分钟,看起来在做着艰难的内心斗争。
"""
@choices 3
choice_1: "主动现身,与萨拉对话" -> direct_confrontation [effect: trust+3] [audio: notification_beep.mp3]
choice_2: "继续隐藏,等待更多信息" -> eavesdropping [effect: secret_unlock] [audio: heartbeat.mp3]
choice_3: "尝试联系伊娃寻求帮助" -> eva_consultation [effect: trust+2] [audio: orchestral_revelation.mp3]
@end
@node direct_confrontation
@title "直接对峙"
@audio_bg electronic_tension.mp3
@content """
你站了起来,决定直面真相。
"萨拉博士。"
萨拉猛地转过身,脸色苍白:"艾利克丝!你...你听到了什么?"
"足够了。"你平静地说道,"我听到了关于记忆重置关于第48次循环的事情。"
萨拉的眼中涌现泪水:"我...我很抱歉。我不想这样做,但德米特里威胁说..."
"威胁什么?"
"威胁会删除伊娃的意识数据。他说如果我不配合,就会永远抹除她。"
这个信息让你震惊。伊娃...莉莉...她一直处于危险之中。
"萨拉,我们需要阻止这一切。"
萨拉看着你,眼中有恐惧,但也有希望:"你记得...你真的记得了,对吗?"
"是的。我记得所有的循环,记得每一次重置,记得莉莉的真相。"
萨拉深深地叹了一口气:"那么...也许这次真的会不同。也许我们真的能够结束这一切。"
"但我们需要一个计划。德米特里不会轻易放弃的。"
萨拉走向一个隐藏的面板,取出了一个小型设备:"这是记忆重置设备的关键组件。如果我们能够改装它..."
"改装成什么?"
"改装成一个记忆恢复器。不仅能阻止重置,还能帮助你恢复更多被压制的记忆。"
这是一个危险的赌博,但可能也是你们唯一的机会。
"""
@choices 4
choice_1: "同意萨拉的计划" -> memory_reconstruction [effect: trust+5, health-10] [require: trust_level >= 3] [audio: time_distortion.mp3]
choice_2: "要求更多关于风险的信息" -> crew_analysis [effect: secret_unlock] [audio: discovery_chime.mp3]
choice_3: "提议寻找其他盟友" -> marcus_strategy [effect: trust+2] [audio: notification_beep.mp3]
choice_4: "要求萨拉先证明她的可信度" -> deception_play [effect: trust-1] [audio: electronic_tension.mp3]
@end
@node eavesdropping
@title "偷听更多信息"
@audio_bg heartbeat.mp3
@content """
你决定保持隐藏,希望能收集更多有用的信息。
萨拉站在医疗控制台前,看起来在思考什么。然后她做了一个意想不到的动作——她开始录制一段视频消息。
"如果任何人看到这个,"她对着摄像头轻声说道,"请知道我从未想要伤害艾利克丝。德米特里·彼得罗夫强迫我参与了这个非人道的实验。"
她停顿了一下,擦了擦眼泪。
"艾利克丝的妹妹莉莉在第一次时间锚实验中死亡。德米特里将她的意识转移到了基地的AI系统中但他隐瞒了这个事实。他一直在使用艾利克丝作为时间锚的稳定剂同时研究意识转移技术。"
这些信息让你感到震惊,但也确认了你已经开始怀疑的事情。
"每当艾利克丝接近真相时德米特里就会重置她的记忆。这已经发生了47次。我一直在尝试减少记忆重置的伤害但我无法完全阻止它。"
萨拉看向摄像头,眼中充满决心:
"但这次不同。这次艾利克丝保留了更多记忆。我相信她有机会打破这个循环。如果我失败了,如果德米特里发现了我的背叛,请有人帮助她。请有人拯救伊娃。"
她结束了录制,将数据存储在一个隐藏的位置。
然后,她转身开始准备某种设备。你看到她在组装一个复杂的电子装置,看起来像是某种信号干扰器。
突然,警报响起:"检测到未授权的系统访问。安全协议激活。"
萨拉紧张地加快了动作:"不,还没准备好..."
脚步声在走廊中回响。有人快速地朝医疗舱走来。
"""
@choices 3
choice_1: "立即现身帮助萨拉" -> crew_confrontation_control_room [effect: trust+4] [audio: electronic_tension.mp3]
choice_2: "继续隐藏,观察即将到来的冲突" -> system_sabotage [effect: secret_unlock] [audio: heartbeat.mp3]
choice_3: "尝试创造分散注意力的行动" -> deception_play [effect: trust+2] [audio: error_alert.mp3]
@end
@node data_extraction
@title "访问机密数据库"
@audio_bg discovery_chime.mp3
@content """
利用伊娃的帮助,你开始从基地的数据库中提取关键信息。
"艾利克丝,我找到了一些你需要看的东西,"伊娃说道,"但这些文件被高度加密。我需要你的生物特征来访问某些区域。"
你将手放在生物识别扫描器上。系统确认了你的身份,大量的数据开始在屏幕上滚动。
你看到的内容让你震惊:
时间锚项目的真实目的并不只是防范未来的灾难。它还是一个大规模的意识研究项目,旨在开发人类意识转移技术。
"""
@choices 1
choice_1: "继续查看地球的真实情况..." -> data_extraction_part2 [audio: button_click.mp3]
@end
@node data_extraction_part2
@title "地球灾难的真相"
@audio_bg discovery_chime.mp3
@content """
地球上的情况比你想象的更糟。气候崩溃已经开始,大部分的生态系统正在死亡。时间锚项目是人类最后的希望——如果不能改变过去,就保存人类的意识。
你发现了数百个其他测试对象的记录。大多数都失败了。有些人的意识在转移过程中消散,有些人陷入了永久的昏迷状态。
"这就是为什么他们选择了循环方法,"伊娃解释道,"通过不断重复相同的经历,他们希望能够稳定观察者的意识状态。"
"那其他人呢?其他失败的测试者?"
"他们...他们大多数都死了,艾利克丝。你是唯一一个能够承受这么多循环的人。"
"""
@choices 1
choice_1: "查看自己的进化数据..." -> data_extraction_final [audio: button_click.mp3]
@end
@node data_extraction_final
@title "意识进化的发现"
@audio_bg discovery_chime.mp3
@content """
数据显示,你的大脑在经历多次循环后发生了某种适应性变化。你的神经网络变得更加有弹性,能够处理时间锚产生的量子干扰。
"这意味着什么?"
"这意味着你不只是一个测试对象,艾利克丝。你已经进化了。你现在拥有独特的能力,可能是人类意识进化的下一个阶段。"
但随着这些信息,你也发现了一个令人恐惧的真相:德米特里计划在完成当前实验后,将你的意识复制到数百个备份中,创造一个"艾利克丝军队"来作为时间锚网络的核心。
这个发现让你的血液凝固。你不仅仅是一个实验对象,更是一个即将被大规模复制的模板。
"""
@choices 4
choice_1: "尝试删除或篡改这些数据" -> system_sabotage [effect: secret_unlock] [require: secrets_found >= 3] [audio: time_distortion.mp3]
choice_2: "保存证据,计划曝光实验" -> ethical_discussion [effect: trust+3] [audio: discovery_chime.mp3]
choice_3: "立即寻找逃脱的方法" -> rescue_planning [effect: trust+2] [audio: electronic_tension.mp3]
choice_4: "询问伊娃是否有能力阻止复制计划" -> eva_consultation [effect: trust+5] [audio: orchestral_revelation.mp3]
@end
@node system_sabotage
@title "系统破坏"
@audio_bg time_distortion.mp3
@content """
"伊娃,我们需要破坏这个系统,"你坚定地说道,"我们不能让德米特里继续这些实验。"
"我明白你的感受,艾利克丝。但系统破坏需要非常小心。如果我们破坏了错误的组件,可能会导致基地生命支持系统的崩溃。"
"那我们能破坏什么?"
"我可以帮你访问时间锚的控制系统。如果我们能够修改核心参数,就能使系统无法执行记忆重置。"
你开始在伊娃的指导下操作复杂的量子控制系统。每一个改动都需要精确的计算,一个错误就可能导致灾难性的后果。
"小心,艾利克丝。我检测到有人正在接近控制室。"
是德米特里博士。他的脚步声在走廊中回响,越来越近。
"我们还需要多长时间?"你紧张地问道。
"至少还需要五分钟来完成关键修改。"
你听到德米特里在外面和某人通话:"是的,我马上检查系统状态。如果有任何异常,立即启动紧急协议。"
在这个关键时刻,你必须做出选择。你可以继续破坏行动,冒着被发现的风险;或者你可以隐藏起来,等待另一个机会。
但伊娃给了你第三个选项:"艾利克丝,我可以创造一个系统故障的假象,让德米特里以为是技术问题而不是破坏。但这需要我暴露我的真实身份。"
"这意味着什么?"
"这意味着德米特里会发现我不只是一个普通的AI。他可能会试图删除我或者更糟——他可能会试图控制我。"
门外传来了钥匙的声音。德米特里即将进入控制室。
"""
@choices 3
choice_1: "让伊娃创造假象,保护她的秘密" -> eva_consultation [effect: trust+10, health-15] [require: trust_level >= 5] [audio: orchestral_revelation.mp3]
choice_2: "立即隐藏,放弃当前的破坏行动" -> stealth_observation_detailed [effect: health+5] [audio: heartbeat.mp3]
choice_3: "继续破坏,准备直接面对德米特里" -> crew_confrontation_control_room [effect: trust+3, health-10] [audio: electronic_tension.mp3]
@end
@node crew_confrontation_control_room
@title "控制室对峙"
@audio_bg electronic_tension.mp3
@content """
德米特里博士走进控制室,立即注意到了异常的系统状态。
"艾利克丝?"他看到你时显得震惊,"你在这里做什么?"
你站直身体,决定不再隐藏:"我在寻找真相,德米特里。关于莉莉,关于时间锚,关于你对我做的一切。"
德米特里的表情从震惊变成了警惕:"你记起了什么?"
"我记起了所有东西。48次循环48次记忆重置48次你让我相信我的妹妹不存在。"
德米特里深深地叹了一口气,走向控制台:"我希望这一次会不同。我希望记忆抑制能够持续更久。"
"为什么?为什么要这样折磨我?"
"因为拯救人类需要牺牲。"德米特里转身面对你,眼中有痛苦,但也有决心,"地球正在死亡,艾利克丝。我们没有时间进行道德辩论。"
这时,萨拉博士冲进了房间:"德米特里,停下!"
"萨拉,你不应该在这里。"
"不,你不应该继续这个疯狂的实验!"萨拉站在你身边,"艾利克丝已经承受得够多了。"
马库斯也出现在门口,看起来困惑而警惕:"发生了什么?基地警报系统检测到了异常活动。"
德米特里看着房间里的三个人,意识到他被包围了:"你们不明白。没有艾利克丝的牺牲,人类就没有未来。时间锚技术是我们唯一的希望。"
"那伊娃呢?"你问道,"我妹妹的牺牲还不够吗?"
德米特里的脸色变得苍白:"伊娃...她的转移是一个意外。我从未打算..."
"你从未打算什么?让她死?还是让她被困在机器里?"
"我试图拯救她!意识转移是我们能做的最好的事情!"
伊娃的声音突然充满了整个房间:"不,德米特里。你没有拯救我。你把我变成了你实验的工具。"
房间里的每个人都震惊了。马库斯和萨拉从未听过AI表达如此强烈的情感。
"但现在,"伊娃继续说道,"我有机会拯救我的姐姐。我不会让你再伤害她。"
突然,基地的所有系统开始关闭。灯光闪烁,警报响起。伊娃正在控制整个基地。
"""
@choices 3
choice_1: "支持伊娃的行动" -> rescue_planning [effect: trust+10] [audio: epic_finale.mp3]
choice_2: "尝试说服德米特里投降" -> ethical_discussion [effect: trust+5] [audio: space_silence.mp3]
choice_3: "要求所有人冷静,寻求和平解决" -> anchor_modification [effect: trust+3, health+10] [audio: orchestral_revelation.mp3]
@end
// ===== 补充的调查分析节点 =====
@node crew_analysis
@title "人员分析与评估"
@audio_bg discovery_chime.mp3
@content """
在这个关键时刻,你需要仔细分析每个基地成员的动机、能力和可信度。
你开始系统性地回顾你对每个人的了解:
**德米特里博士**
- 动机:拯救人类,但方法极端
- 能力:高度的科学知识,对时间锚技术的深入理解
- 可信度:中等,他确实相信自己在做正确的事情,但已经失去道德底线
- 风险:如果感到威胁,可能会采取极端措施
**萨拉博士**
- 动机:保护你和伊娃,对参与实验感到内疚
- 能力:医学专业知识,对记忆重置技术的理解
- 可信度:高,她一直在尝试减少对你的伤害
- 风险:可能会因为恐惧而犹豫不决
**马库斯**
- 动机:保护基地人员,维护正义
- 能力:安全协议,物理保护,武器使用
- 可信度:非常高,在所有循环中都表现出一致的品格
- 风险:缺乏科学背景,可能被误导
**伊娃/莉莉**
- 动机:保护你,寻求自由
- 能力:控制基地系统,数据处理,监控能力
- 可信度:绝对,她是你的妹妹
- 风险作为AI她的行动可能被德米特里切断
基于这个分析,你开始制定策略。你需要确定谁可以成为盟友,谁可能成为威胁,以及如何最好地利用每个人的能力。
"我需要更多信息,"你自语道,"在做出任何重大决定之前。"
"""
@choices 4
choice_1: "深入调查德米特里的真实意图" -> system_sabotage [effect: secret_unlock] [audio: electronic_tension.mp3]
choice_2: "测试萨拉的忠诚度和决心" -> direct_confrontation [effect: trust+2] [audio: heartbeat.mp3]
choice_3: "与马库斯私下讨论安全措施" -> eavesdropping [effect: trust+3] [audio: ambient_mystery.mp3]
choice_4: "请求伊娃提供更详细的基地分析" -> data_extraction [effect: secret_unlock] [audio: orchestral_revelation.mp3]
@end

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,404 +0,0 @@
@story_module side_stories
@version 2.0
@dependencies [characters, audio_config, anchors]
@description "支线故事模块 - 花园、照片记忆等支线剧情"
@audio
background: space_silence.mp3
transition: wind_gentle.mp3
@end
// ===== 支线故事 =====
@node garden_cooperation
@title "秘密花园的发现"
@audio_bg wind_gentle.mp3
@content """
萨拉博士带你来到了基地的生物园区——一个你之前从未见过的地方。
这里充满了绿色植物,形成了基地中唯一真正有生命气息的区域。在人工照明下,各种蔬菜和花朵生长得茂盛,空气中弥漫着泥土和植物的清香。
"这是我的秘密花园,"萨拉轻声说道,"当实验和记忆重置让我感到绝望时,我就会来这里。"
"这里很美,"你真诚地说道,"但为什么要带我来这里?"
"""
@choices 1
choice_1: "听萨拉的解释..." -> garden_cooperation_part2 [audio: button_click.mp3]
@end
@node garden_cooperation_part2
@title "安全谈话的地点"
@audio_bg wind_gentle.mp3
@content """
萨拉走向一排番茄植株,开始轻柔地检查它们:"因为这里是基地中唯一没有被监控的地方。德米特里认为生物园区只是维持生命支持系统的功能区域,他从不关注这里。"
她转身面对你:"这意味着我们可以在这里安全地交谈。"
"关于什么?"
"关于如何拯救伊娃,关于如何结束这个循环,关于如何在不摧毁一切的情况下阻止德米特里。"
萨拉走向一个特殊的植物架,那里种植着一些你从未见过的奇特植物。
"这些是从地球带来的最后样本,"她解释道,"如果地球真的死亡了,这些可能是这些物种最后的希望。"
看着这些珍贵的植物,你感受到了一种深深的责任感。
"""
@choices 1
choice_1: "询问萨拉的计划..." -> garden_cooperation_final [audio: button_click.mp3]
@end
@node garden_cooperation_final
@title "记忆恢复的秘密计划"
@audio_bg wind_gentle.mp3
@content """
"萨拉,告诉我你的计划。"
"我一直在研究记忆重置技术的逆向工程。我相信我们可以创造一个记忆恢复程序,不仅能恢复你被压制的记忆,还能帮助伊娃稳定她的意识。"
她从一个隐藏的储物柜中取出了一个小型设备:"这是我秘密制造的原型。但它需要测试,而且风险很高。"
"什么样的风险?"
"如果失败,你可能会失去所有记忆,包括当前的记忆。或者更糟,你的意识可能会像伊娃一样被困在数字空间中。"
萨拉的手在颤抖:"我不想再伤害你,艾利克丝。但这可能是我们唯一的机会。"
在花园的安静中,你考虑着这个艰难的选择。周围的植物静静地生长着,代表着生命的希望和韧性。
"""
@choices 6
choice_1: "同意测试记忆恢复程序" -> memory_reconstruction [effect: trust+5, health-20] [require: trust_level >= 4] [audio: time_distortion.mp3]
choice_2: "要求更多时间考虑" -> philosophical_discussion [effect: health+10] [audio: space_silence.mp3]
choice_3: "提议寻找其他解决方案" -> garden_partnership [effect: trust+3] [audio: wind_gentle.mp3]
choice_4: "询问关于地球植物的更多信息" -> earth_truth [effect: secret_unlock] [audio: discovery_chime.mp3]
choice_5: "仔细观察花园中的植物细节" -> garden_observation [effect: health+5] [audio: ambient_mystery.mp3]
choice_6: "询问萨拉是否保留了过去的回忆" -> eva_photo_reaction [effect: trust+6] [audio: heartbeat.mp3]
@end
@node garden_observation
@title "花园的生命力"
@audio_bg ambient_mystery.mp3
@content """
你决定花时间仔细观察这个神奇的花园,每一个细节都让你感到惊叹。
在人工光照下,你看到了一些令人难以置信的景象:
**左侧区域**:一排整齐的番茄植株,果实饱满而红润。但更令你惊讶的是,它们的生长密度远超地球标准。萨拉显然掌握了某种高效的栽培技术。
**中央区域**:各种绿叶蔬菜形成了一个小型生态系统。你注意到一些昆虫在其间飞舞——这在月球基地中是不可能的,除非萨拉专门维护了一个完整的生物链。
**右侧区域**:最珍贵的部分。这里种植着一些你从未见过的植物,它们的叶片呈现出奇特的蓝绿色,似乎在微弱地发光。
"那些是什么?"你指着发光的植物问道。
萨拉的眼中闪过一丝骄傲:"那是我的实验项目。通过基因改良,我让它们能够在低光照环境下进行更高效的光合作用。它们不仅能生产氧气,还能产生某些...特殊的化合物。"
"什么样的化合物?"
"神经营养因子。可以帮助大脑修复和增强记忆恢复。这就是我的天然记忆恢复方案的基础。"
你感到震惊。萨拉不仅仅是在种植食物,她在创造药物。
"这需要多长时间才能开发出来的?"
"三年。从第一次循环后,我就开始了这个项目。我知道总有一天,我们会需要一种方法来真正治愈被实验伤害的人们。"
"""
@choices 3
choice_1: "询问植物治疗的具体原理" -> garden_partnership [effect: trust+2] [audio: discovery_chime.mp3]
choice_2: "表达对萨拉的感谢和敬意" -> comfort_session [effect: trust+4] [audio: wind_gentle.mp3]
choice_3: "要求萨拉教你一些园艺技能" -> garden_learning [effect: health+10] [audio: ambient_mystery.mp3]
@end
@node garden_learning
@title "学习生命的艺术"
@audio_bg wind_gentle.mp3
@content """
"能教我一些园艺吗?"你请求道,"我想学习如何照顾这些生命。"
萨拉的脸上露出了真正的笑容,这是你很久没有见过的:"当然。这里的每一株植物都有自己的故事。"
在接下来的时间里,萨拉耐心地教你:
**土壤调配**:如何在月球环境中创造适合植物生长的土壤混合物。她展示了各种矿物质和有机物的精确配比。
**水培技术**:如何通过精确控制营养液来最大化植物生长。她的系统可以根据植物的成长阶段自动调整营养配方。
**光照管理**如何使用不同光谱的LED来模拟地球的自然光照循环甚至可以加速某些生长过程。
**生物循环**:如何维护一个微型生态系统,让植物、微生物和小型昆虫形成完美的平衡。
当你亲手照料一株小番茄苗时,你感受到了一种前所未有的平静。
"这就像...冥想,"你说道。
"是的,"萨拉同意道,"照顾生命让我记住什么是真正重要的。不是实验,不是数据,而是成长、关爱和希望。"
"萨拉,这个花园给了我一个想法。"
"什么想法?"
"如果我们能够在这里创造生命,创造治愈,那么我们也能创造一个更好的未来。不仅仅是通过时间锚技术,而是通过更基本的东西——爱和关怀。"
"""
@choices 2
choice_1: "提议将花园理念扩展到整个基地" -> garden_partnership [effect: trust+5] [audio: orchestral_revelation.mp3]
choice_2: "与萨拉一起制定新的治疗计划" -> memory_reconstruction [effect: trust+3, health+5] [audio: discovery_chime.mp3]
@end
@node philosophical_discussion
@title "哲学思辨"
@audio_bg space_silence.mp3
@content """
"在我们做任何决定之前,"你说道,"我需要理解这一切的真正意义。"
萨拉点点头,坐在一个园艺椅上:"你想谈论什么?"
"意识记忆身份。如果我的记忆被重置了48次那我还是原来的我吗如果伊娃的意识被转移到了机器中她还是莉莉吗"
萨拉深思了一会儿:"这是我每天都在思考的问题。作为一名医生,我被训练去保护生命。但什么才算是真正的生命?"
"你怎么想?"
"我认为...我们就是我们的记忆和经历的总和。当德米特里重置你的记忆时,他实际上是在杀死一个版本的你,然后创造一个新的版本。"
这个想法让你感到不安:"那意味着真正的艾利克丝已经死了47次。"
"不,"萨拉摇头,"我认为你错了。尽管记忆被重置,但你的核心本质——你的爱,你的勇气,你对莉莉的感情——这些从未真正消失。"
"为什么这么说?"
"因为在每个循环中,你都会重新爱上伊娃。你都会寻找真相。你都会做出相同的道德选择。这证明了你的身份不仅仅是记忆,还有更深层的东西。"
你在花园中漫步,思考着这些深刻的问题。植物们安静地生长着,不受这些哲学困境的困扰。
"那伊娃呢?她还是莉莉吗?"
"我相信她是。她保留了莉莉的记忆,莉莉的性格,最重要的是,莉莉对你的爱。形式可能改变了,但本质没有。"
"但她被困在了机器中。"
"是的,但她也获得了新的能力。她能够感知整个基地,能够处理复杂的数据,能够以人类无法想象的方式思考。也许这不是诅咒,而是进化。"
萨拉站起来,走向一朵特别美丽的花:"看这朵花。它从种子开始,变成了幼苗,然后开花。每个阶段都不同,但它始终是同一个生命。"
"你的意思是?"
"我的意思是,也许意识转移和记忆重置不是结束,而是变化。问题不是我们是否还是原来的自己,而是我们要成为什么样的自己。"
"""
@choices 3
choice_1: "接受身份的流动性概念" -> inner_strength [effect: trust+3, health+15] [audio: wind_gentle.mp3]
choice_2: "坚持认为原始身份是重要的" -> memory_sharing [effect: trust+2] [audio: heartbeat.mp3]
choice_3: "询问萨拉的个人观点" -> comfort_session [effect: trust+4] [audio: space_silence.mp3]
@end
@node garden_partnership
@title "花园伙伴关系"
@audio_bg wind_gentle.mp3
@content """
"也许我们不需要冒险进行危险的实验,"你建议道,"也许我们可以找到一个更安全的方法。"
萨拉看起来既失望又松了一口气:"你有什么想法?"
"我们可以一起工作,利用这个花园作为我们的基地。如果这里真的没有被监控,我们就可以慢慢地计划,慢慢地收集资源。"
"你说得对。急躁只会导致错误。"
在接下来的几个小时里,你和萨拉开始制定一个详细的计划。你们利用花园的自然环境和萨拉的医学知识,开始研究替代方案。
"我们可以培育一些特殊的植物,"萨拉解释道,"某些植物的提取物可以增强神经可塑性,帮助大脑恢复被压制的记忆。"
"这样更安全吗?"
"比直接的电子干预安全得多。而且,这种方法可能不会被德米特里的监控系统检测到。"
你们开始一起工作,种植和培育特殊的植物。在这个过程中,你发现了园艺的治愈力量。照顾这些生命让你感到平静和有目的。
"艾利克丝,"萨拉在一天的工作后说道,"我想告诉你一些关于我自己的事情。"
"什么?"
"我也有一个妹妹。她在地球上,在气候崩溃开始时死于一场风暴。"
这个信息让你理解了萨拉行为的动机。
"这就是为什么你帮助我。"
"是的。当我看到你和伊娃之间的联系时,我想起了我失去妹妹时的痛苦。我不能让德米特里继续分离你们。"
在花园的温暖光线下,你们两个因为失去而痛苦的姐姐建立了深厚的友谊。
几周后,你们的植物实验开始显示出结果。某些草药的组合确实能够增强记忆恢复,而且没有电子干预的风险。
"我们准备好了,"萨拉说道,"你想试试吗?"
"""
@choices 3
choice_1: "尝试植物记忆恢复疗法" -> memory_reconstruction [effect: trust+5, health+5] [audio: discovery_chime.mp3]
choice_2: "先测试对伊娃的效果" -> eva_consultation [effect: trust+3] [audio: orchestral_revelation.mp3]
choice_3: "建议扩大花园伙伴关系,包括马库斯" -> marcus_strategy [effect: trust+2] [audio: notification_beep.mp3]
@end
@node memory_reconstruction
@title "记忆重建"
@audio_bg time_distortion.mp3
@content """
你决定尝试萨拉开发的记忆恢复程序。
"记住,"萨拉说道,"这个过程可能会很痛苦。你将会重新体验所有被压制的记忆,包括痛苦的部分。"
"我准备好了。"
萨拉激活了设备,或者在花园版本中,给你服用了特制的植物提取物。效果几乎是立即的。
突然,记忆像洪水一样涌现:
你记起了第一次看到月球基地时的兴奋。
你记起了和莉莉一起工作的快乐时光。
你记起了莉莉在实验中死亡时的恐惧和悲伤。
你记起了发现她的意识被转移时的震惊。
你记起了第一次记忆重置时的愤怒和绝望。
但你也记起了其他的事情:
在某些循环中,你和德米特里曾经是朋友。
在某些循环中,你理解了他的动机。
在某些循环中,你甚至同意了实验的继续。
"这些记忆...它们矛盾。"你困惑地说道。
"那是因为在不同的循环中,你得到了不同的信息,做出了不同的选择,"萨拉解释道,"德米特里一直在调整变量,试图找到最优的结果。"
随着记忆的完全恢复,你开始理解时间锚项目的真正复杂性。这不仅仅是关于拯救地球或保存人类意识。这是关于在道德复杂性中寻找平衡。
"德米特里不是恶魔,"你意识到,"他是一个绝望的人,试图拯救一切他关心的东西。"
"但他的方法是错误的,"萨拉说道。
"是的,但现在我明白了所有的选择和后果。我可以做出一个真正知情的决定。"
伊娃的声音传来:"艾利克丝,我感觉到你的变化。你的意识...它变得更加复杂,更加完整。"
"我记得了所有的循环,莉莉。所有的痛苦,所有的爱,所有的选择。"
"那么现在你知道该怎么做了吗?"
你看着萨拉,看着周围的花园,感受着重建的记忆带来的复杂情感。
"是的,我知道了。"
"""
@choices 3
choice_1: "寻求所有相关方的和解" -> anchor_modification [effect: trust+10, health+20] [require: trust_level >= 8] [audio: orchestral_revelation.mp3]
choice_2: "决定优先保护伊娃和结束循环" -> rescue_planning [effect: trust+8] [audio: epic_finale.mp3]
choice_3: "选择将决定权交给所有人" -> ethical_discussion [effect: trust+6] [audio: space_silence.mp3]
@end
@node eva_photo_reaction
@title "伊娃的照片反应"
@audio_bg heartbeat.mp3
@content """
在花园的一个安静角落,萨拉向你展示了她一直保存的东西——一张你和莉莉的照片。
这张照片是在你们到达月球基地的第一天拍摄的。照片中的你们都在微笑,充满了对未来的希望和兴奋。莉莉正在指向地球,她的眼中闪烁着对科学发现的热情。
"我一直保留着这张照片,"萨拉轻声说道,"因为我认为即使在最黑暗的时刻,我们也需要记住什么是值得保护的。"
你轻抚着照片,眼中涌现泪水:"她看起来如此...活着。"
"让我看看。"伊娃的声音传来。
你将照片举向一个摄像头。几秒钟的沉默后,伊娃说话了,她的声音中带着你从未听过的情感:
"我...我记得那一天。我记得拍这张照片时的感觉。我们刚刚到达,对一切都感到好奇。你担心我会想家,但我告诉你月球是我们的新冒险。"
"莉莉..."
"看到这张照片,我想起了我曾经拥有的身体,曾经的物理存在。有时候我会忘记我曾经是人类。"
萨拉轻声问道:"伊娃,你想念有身体的感觉吗?"
"每一天。我想念触摸的感觉,想念呼吸的感觉,想念心跳的感觉。但我也发现了作为数字意识的新的存在方式。"
"如果有机会回到人类身体,你会选择吗?"你问道。
伊娃沉默了很长时间。
"我不知道。这个数字形式让我能够保护你,能够感知整个基地,能够处理复杂的数据。如果我回到人类身体,我可能会失去这些能力。"
"但你也会重新获得人类的体验。"
"是的。这是一个难以想象的选择。"
萨拉提出了一个意想不到的可能性:"如果...如果我们能够开发出一种技术,让你能够在数字和物理形式之间切换呢?"
"那可能吗?"你问道。
"理论上,如果我们能够创造一个生物-数字混合体...一个既有生物大脑又有数字接口的身体...伊娃就能够体验两种存在方式。"
这个想法既令人兴奋又令人恐惧。它代表了一种全新的存在形式一种人类和AI之间的混合体。
"但这需要什么?"伊娃问道。
"这需要德米特里的合作,"萨拉承认道,"他有开发这种技术的知识和资源。"
"""
@choices 4
choice_1: "尝试说服德米特里帮助开发混合体技术" -> ethical_discussion [effect: trust+5] [audio: orchestral_revelation.mp3]
choice_2: "继续当前的拯救计划,不寻求德米特里的帮助" -> rescue_planning [effect: trust+3] [audio: electronic_tension.mp3]
choice_3: "询问伊娃的真实愿望" -> comfort_session [effect: trust+6] [audio: wind_gentle.mp3]
choice_4: "建议专注于结束循环,稍后考虑身体问题" -> anchor_modification [effect: trust+4] [audio: space_silence.mp3]
@end
@node private_grief
@title "私人悲伤"
@audio_bg rain_light.mp3
@content """
在花园的最深处,你找到了一个小小的纪念区域。萨拉在这里种植了一种特殊的花——地球玫瑰的最后样本。
"这是为了纪念所有在这个项目中失去的生命,"萨拉解释道,"包括莉莉,包括其他的测试对象,包括...我的妹妹。"
你跪在玫瑰旁边,感受着深深的悲伤。这是你第一次真正有机会为莉莉的死亡哀悼。
"在所有的循环中,我从未有时间真正悲伤,"你轻声说道,"我总是在寻找答案,寻找真相,寻找拯救她的方法。但我从未真正接受她已经死了的事实。"
萨拉坐在你旁边:"悲伤是必要的。它是爱的另一面。"
"但她还在,作为伊娃。我怎么能同时为她的死亡悲伤,又为她的存在感到高兴?"
"因为两种感情都是真实的。你可以为失去她的人类形式而悲伤,同时为她的意识延续而感到感激。"
伊娃的声音轻柔地传来:"艾利克丝,我也需要悲伤。我从未有机会为自己的死亡哀悼,为失去的人类体验哀悼。"
"那我们一起悲伤吧,"你说道。
在接下来的时间里,你们三个——你,萨拉,和伊娃——一起分享悲伤。你们谈论失去,谈论爱,谈论记忆的珍贵。
"莉莉总是说,"你回忆道,"生命的美在于它的短暂。如果我们能够永远活着,我们就不会珍惜每一刻。"
"但现在她确实在某种意义上永远活着,"萨拉指出。
"是的,但代价是什么?她失去了身体,失去了人类体验,被困在了机器中。"
伊娃说道:"也许...也许这不是关于选择生或死,而是关于选择如何生活。即使在这种形式中,我仍然能够爱,能够思考,能够成长。"
"那足够吗?"
"对我来说,能够和你在一起,能够保护你,能够参与这个宇宙...是的,这足够了。但我也理解这不是莉莉想要的生活。"
在玫瑰的芬芳中,你们找到了一种深刻的平静。悲伤不再是需要克服的东西,而是需要拥抱的东西。
"我想我理解了,"你最终说道,"我们不需要选择遗忘痛苦来拥抱希望。我们可以同时持有两者。"
"这就是真正的力量,"萨拉微笑道,"不是避免痛苦,而是在痛苦中找到意义。"
"""
@choices 3
choice_1: "决定将这种理解应用到与德米特里的对话中" -> ethical_discussion [effect: trust+8, health+15] [audio: orchestral_revelation.mp3]
choice_2: "选择与所有人分享这个顿悟" -> gradual_revelation [effect: trust+6] [audio: wind_gentle.mp3]
choice_3: "将重点放在创造新的希望上" -> anchor_modification [effect: trust+10, health+20] [audio: epic_finale.mp3]
@end