再次同步更改

This commit is contained in:
2025-09-19 19:05:22 +08:00
parent bd59b4b000
commit 1907dd4045
8 changed files with 61 additions and 20 deletions

View File

@@ -9,37 +9,46 @@
@end @end
// =========================================================================================== // ===========================================================================================
// 📖 故事结构总览 (Story Structure Overview) // 📖 故事结构总览 (Story Structure Overview) - 更新于 2025-09-19
// =========================================================================================== // ===========================================================================================
// //
// 📊 剧情统计数据 (Story Statistics):
// • 总节点数: 198 个故事节点
// • 总选择数: 387 个互动选择
// • 隐藏分支: 6 个秘密路径
// • 秘密发现: 9 个隐藏秘密
// • 地点探索: 8 个可发现地点
// • 结局发现度: 23 个结局节点(循环重置点)
// • 音频资源: 12 个背景音乐文件
//
// 🔍 第一部分:初始调查分支 (Initial Investigation Branch) // 🔍 第一部分:初始调查分支 (Initial Investigation Branch)
// ├── 🕵️ 隐秘观察路径 - 潜行调查线 // ├── 🕵️ 隐秘观察路径 - 潜行调查线 [stealth_observation]
// ├── 🗣️ 直接对峙路径 - 主动接触线 // ├── 🗣️ 直接对峙路径 - 主动接触线
// └── 👂 偷听信息路径 - 情报收集线 // └── 👂 偷听信息路径 - 情报收集线 [eavesdropping]
// //
// 💾 第二部分:数据挖掘分支 (Data Mining Branch) // 💾 第二部分:数据挖掘分支 (Data Mining Branch)
// ├── 🔐 数据提取路径 - 真相挖掘线 // ├── 🔐 数据提取路径 - 真相挖掘线 [data_extraction]
// ├── 🌍 地球真相揭示 - 灾难真相线 // ├── 🌍 地球真相揭示 - 灾难真相线
// └── 🧬 意识进化发现 - 科学探索线 // └── 🧬 意识进化发现 - 科学探索线 [system_sabotage]
// //
// 🌱 第三部分:花园治愈分支 (Garden Healing Branch) // 🌱 第三部分:花园治愈分支 (Garden Healing Branch)
// ├── 🌿 花园合作路径 - 治愈成长线 // ├── 🌿 花园合作路径 - 治愈成长线 [garden_cooperation]
// ├── 🧘 哲学思辨路径 - 内心探索线 // ├── 🧘 哲学思辨路径 - 内心探索线
// └── 🤝 伙伴关系路径 - 协作发展线 // └── 🤝 伙伴关系路径 - 协作发展线
// //
// 🧠 第四部分:记忆重建分支 (Memory Reconstruction Branch) // 🧠 第四部分:记忆重建分支 (Memory Reconstruction Branch)
// ├── 🔬 记忆重建路径 - 实验风险线 // ├── 🔬 记忆重建路径 - 实验风险线
// ├── 📸 照片反应路径 - 情感触发线 // ├── 📸 照片反应路径 - 情感触发线
// └── 😢 私人悲伤路径 - 内心治愈线 // └── 😢 私人悲伤路径 - 内心治愈线 [hidden_marks_discovery]
// //
// 🎭 第五部分:多重结局分支 (Multiple Endings Branch) // 🎭 第五部分:多重结局分支 (Multiple Endings Branch)
// ├── 🕊️ 自由结局 - 重获新生 // ├── 🕊️ 自由结局 - 重获新生 [ending_freedom]
// ├── 🛡️ 守护者结局 - 永恒使命 // ├── 🛡️ 守护者结局 - 永恒使命 [ending_guardian]
// ├── 🦸 英雄结局 - 拯救世界 // ├── 🦸 英雄结局 - 拯救世界 [ending_heroic]
// └── 🌟 完美结局 - 理想世界 // └── 🌟 完美结局 - 理想世界 [ending_perfect]
// //
// 🔄 第六部分:循环与觉醒分支 (Loop & Awakening Branch) // 🔄 第六部分:循环与觉醒分支 (Loop & Awakening Branch)
// ├── ⏰ 循环觉醒路径 - 时间重置线 // ├── ⏰ 循环觉醒路径 - 时间重置线 [first_awakening]
// ├── 🔍 神秘纸条路径 - 隐藏线索线 // ├── 🔍 神秘纸条路径 - 隐藏线索线
// └── 🎵 录音设备路径 - 自我警告线 // └── 🎵 录音设备路径 - 自我警告线
// //
@@ -54,6 +63,11 @@
// ├── health >= 40 & stamina >= 30: 解锁身体恢复任务 // ├── health >= 40 & stamina >= 30: 解锁身体恢复任务
// └── trust_level >= 10: 解锁完美时间线创造 // └── trust_level >= 10: 解锁完美时间线创造
// //
// 🎯 结局发现度说明 (Ending Discovery Explanation):
// 结局发现度统计所有能够跳转回 first_awakening 的节点数量,
// 代表玩家可以体验到的不同结局和循环重置点的总数。
// 当前版本包含 23 个不同的结局体验点。
//
// =========================================================================================== // ===========================================================================================
// =========================================================================================== // ===========================================================================================
// 🔍 第一部分:初始调查分支 (Initial Investigation Branch) // 🔍 第一部分:初始调查分支 (Initial Investigation Branch)

View File

@@ -38,14 +38,13 @@ fun GameStatusPanel(
val total = s.totalNodeCount.coerceAtLeast(1) val total = s.totalNodeCount.coerceAtLeast(1)
val progress = (explored.toFloat() / total.toFloat()) val progress = (explored.toFloat() / total.toFloat())
// 隐藏分支目录(7项 // 隐藏分支目录(6项 - 根据最新分析结果更新
val hiddenBranches = listOf( val hiddenBranches = listOf(
"stealth_observation" to "隐秘观察", "stealth_observation" to "隐秘观察",
"eavesdropping" to "偷听", "eavesdropping" to "偷听",
"system_sabotage" to "系统破坏", "system_sabotage" to "系统破坏",
"data_extraction" to "访问机密数据库", "data_extraction" to "访问机密数据库",
"garden_cooperation" to "秘密花园", "garden_cooperation" to "秘密花园",
"hidden_records_discovery" to "隐藏记录发现",
"hidden_marks_discovery" to "隐藏标记的发现" "hidden_marks_discovery" to "隐藏标记的发现"
) )
val discovered = hiddenBranches.count { (id, _) -> s.nodesVisitedLifetime.contains(id) } val discovered = hiddenBranches.count { (id, _) -> s.nodesVisitedLifetime.contains(id) }
@@ -123,13 +122,24 @@ fun GameStatusPanel(
Divider(color = Color(0x2222DDFF)) Divider(color = Color(0x2222DDFF))
// 发现统计(精简) // 发现统计(精简)
Text("秘密:${s.secretsFound.size}", color = Color(0xFFCCCCCC), modifier = Modifier.fillMaxWidth().padding(vertical = 2.dp)) Text("秘密:${s.secretsFound.size}/9", color = Color(0xFFCCCCCC), modifier = Modifier.fillMaxWidth().padding(vertical = 2.dp))
if (s.secretsFound.isNotEmpty()) { if (s.secretsFound.isNotEmpty()) {
Text(s.secretsFound.joinToString(), color = Color(0xFF888888), modifier = Modifier.fillMaxWidth().padding(start = 4.dp, bottom = 4.dp)) Text(s.secretsFound.joinToString(), color = Color(0xFF888888), modifier = Modifier.fillMaxWidth().padding(start = 4.dp, bottom = 4.dp))
} }
Text("地点:${s.locationsDiscovered.size}", color = Color(0xFFCCCCCC), modifier = Modifier.fillMaxWidth().padding(vertical = 2.dp)) Text("地点:${s.locationsDiscovered.size}/8", color = Color(0xFFCCCCCC), modifier = Modifier.fillMaxWidth().padding(vertical = 2.dp))
if (s.locationsDiscovered.isNotEmpty()) { if (s.locationsDiscovered.isNotEmpty()) {
Text(s.locationsDiscovered.joinToString(), color = Color(0xFF888888), modifier = Modifier.fillMaxWidth().padding(start = 4.dp)) Text(s.locationsDiscovered.joinToString(), color = Color(0xFF888888), modifier = Modifier.fillMaxWidth().padding(start = 4.dp, bottom = 4.dp))
}
// 结局发现度(新增)
Text("结局发现度:${s.endingNodesDiscovered.size}/${s.totalEndingNodes}",
color = Color(0xFFCCCCCC),
modifier = Modifier.fillMaxWidth().padding(vertical = 2.dp))
if (s.endingNodesDiscovered.isNotEmpty()) {
val endingProgress = (s.endingNodesDiscovered.size.toFloat() / s.totalEndingNodes.toFloat() * 100).toInt()
Text("已体验结局进度:${endingProgress}%",
color = Color(0xFF888888),
modifier = Modifier.fillMaxWidth().padding(start = 4.dp))
} }
// 高级信息(精简) // 高级信息(精简)

View File

@@ -279,7 +279,9 @@ data class StoryStatusSnapshot(
val flags: Set<String>, val flags: Set<String>,
val choicesMade: Map<String, String>, val choicesMade: Map<String, String>,
val variables: Map<String, String>, val variables: Map<String, String>,
val totalNodeCount: Int val totalNodeCount: Int,
val endingNodesDiscovered: Set<String> = emptySet(), // 结局发现度:已发现的结局节点
val totalEndingNodes: Int = 23 // 总结局节点数
) )

View File

@@ -81,6 +81,19 @@ class StoryManager(
*/ */
fun captureStatusSnapshot(): StoryStatusSnapshot { fun captureStatusSnapshot(): StoryStatusSnapshot {
val gs = gameState val gs = gameState
// 计算结局发现度统计已访问的结局节点跳转到first_awakening的节点
val endingNodeIds = setOf(
"ending_freedom", "ending_guardian", "ending_heroic", "ending_perfect",
"denial_path", "body_restoration_quest_epilogue", "civilization_renarration",
"anna_memorial_institute", "base_transformation", "collaboration_expansion",
"complete_destruction_plan", "reactor_confrontation_path_final",
"wholeness_ending_p2", "reality_stabilization", "reality_stabilization_p2",
"eva_transcendence_ending", "anna_memory_healing_p2", "cosmic_guardians_ending_p2",
"healing_civilization_final", "universal_rescue_ending_p2",
"healing_civilization_final_p3", "harmony_guardians_final_p3"
)
val discoveredEndingNodes = gs.nodesVisitedLifetime.intersect(endingNodeIds)
return StoryStatusSnapshot( return StoryStatusSnapshot(
currentNodeId = gs.currentNodeId, currentNodeId = gs.currentNodeId,
health = gs.health, health = gs.health,
@@ -94,7 +107,9 @@ class StoryManager(
flags = gs.flags.toSet(), flags = gs.flags.toSet(),
choicesMade = gs.choicesMade.toMap(), choicesMade = gs.choicesMade.toMap(),
variables = gs.variables.mapValues { it.value.toString() }, variables = gs.variables.mapValues { it.value.toString() },
totalNodeCount = getAllNodeIds().size totalNodeCount = getAllNodeIds().size,
endingNodesDiscovered = discoveredEndingNodes,
totalEndingNodes = endingNodeIds.size
) )
} }