diff --git a/app/src/main/assets/story/modules/main_chapter_1.story b/app/src/main/assets/story/modules/main_chapter_1.story index 1ba0b53..1585a8b 100644 --- a/app/src/main/assets/story/modules/main_chapter_1.story +++ b/app/src/main/assets/story/modules/main_chapter_1.story @@ -9,37 +9,46 @@ @end // =========================================================================================== -// 📖 故事结构总览 (Story Structure Overview) +// 📖 故事结构总览 (Story Structure Overview) - 更新于 2025-09-19 // =========================================================================================== // +// 📊 剧情统计数据 (Story Statistics): +// • 总节点数: 198 个故事节点 +// • 总选择数: 387 个互动选择 +// • 隐藏分支: 6 个秘密路径 +// • 秘密发现: 9 个隐藏秘密 +// • 地点探索: 8 个可发现地点 +// • 结局发现度: 23 个结局节点(循环重置点) +// • 音频资源: 12 个背景音乐文件 +// // 🔍 第一部分:初始调查分支 (Initial Investigation Branch) -// ├── 🕵️ 隐秘观察路径 - 潜行调查线 +// ├── 🕵️ 隐秘观察路径 - 潜行调查线 [stealth_observation] // ├── 🗣️ 直接对峙路径 - 主动接触线 -// └── 👂 偷听信息路径 - 情报收集线 +// └── 👂 偷听信息路径 - 情报收集线 [eavesdropping] // // 💾 第二部分:数据挖掘分支 (Data Mining Branch) -// ├── 🔐 数据提取路径 - 真相挖掘线 +// ├── 🔐 数据提取路径 - 真相挖掘线 [data_extraction] // ├── 🌍 地球真相揭示 - 灾难真相线 -// └── 🧬 意识进化发现 - 科学探索线 +// └── 🧬 意识进化发现 - 科学探索线 [system_sabotage] // // 🌱 第三部分:花园治愈分支 (Garden Healing Branch) -// ├── 🌿 花园合作路径 - 治愈成长线 +// ├── 🌿 花园合作路径 - 治愈成长线 [garden_cooperation] // ├── 🧘 哲学思辨路径 - 内心探索线 // └── 🤝 伙伴关系路径 - 协作发展线 // // 🧠 第四部分:记忆重建分支 (Memory Reconstruction Branch) // ├── 🔬 记忆重建路径 - 实验风险线 // ├── 📸 照片反应路径 - 情感触发线 -// └── 😢 私人悲伤路径 - 内心治愈线 +// └── 😢 私人悲伤路径 - 内心治愈线 [hidden_marks_discovery] // // 🎭 第五部分:多重结局分支 (Multiple Endings Branch) -// ├── 🕊️ 自由结局 - 重获新生 -// ├── 🛡️ 守护者结局 - 永恒使命 -// ├── 🦸 英雄结局 - 拯救世界 -// └── 🌟 完美结局 - 理想世界 +// ├── 🕊️ 自由结局 - 重获新生 [ending_freedom] +// ├── 🛡️ 守护者结局 - 永恒使命 [ending_guardian] +// ├── 🦸 英雄结局 - 拯救世界 [ending_heroic] +// └── 🌟 完美结局 - 理想世界 [ending_perfect] // // 🔄 第六部分:循环与觉醒分支 (Loop & Awakening Branch) -// ├── ⏰ 循环觉醒路径 - 时间重置线 +// ├── ⏰ 循环觉醒路径 - 时间重置线 [first_awakening] // ├── 🔍 神秘纸条路径 - 隐藏线索线 // └── 🎵 录音设备路径 - 自我警告线 // @@ -54,6 +63,11 @@ // ├── health >= 40 & stamina >= 30: 解锁身体恢复任务 // └── trust_level >= 10: 解锁完美时间线创造 // +// 🎯 结局发现度说明 (Ending Discovery Explanation): +// 结局发现度统计所有能够跳转回 first_awakening 的节点数量, +// 代表玩家可以体验到的不同结局和循环重置点的总数。 +// 当前版本包含 23 个不同的结局体验点。 +// // =========================================================================================== // =========================================================================================== // 🔍 第一部分:初始调查分支 (Initial Investigation Branch) diff --git a/app/src/main/java/com/osglab/gameofmoon/presentation/ui/components/GameStatusPanel.kt b/app/src/main/java/com/osglab/gameofmoon/presentation/ui/components/GameStatusPanel.kt index 79a92e1..f72ad76 100644 --- a/app/src/main/java/com/osglab/gameofmoon/presentation/ui/components/GameStatusPanel.kt +++ b/app/src/main/java/com/osglab/gameofmoon/presentation/ui/components/GameStatusPanel.kt @@ -38,14 +38,13 @@ fun GameStatusPanel( val total = s.totalNodeCount.coerceAtLeast(1) val progress = (explored.toFloat() / total.toFloat()) - // 隐藏分支目录(7项) + // 隐藏分支目录(6项 - 根据最新分析结果更新) val hiddenBranches = listOf( "stealth_observation" to "隐秘观察", "eavesdropping" to "偷听", - "system_sabotage" to "系统破坏", + "system_sabotage" to "系统破坏", "data_extraction" to "访问机密数据库", "garden_cooperation" to "秘密花园", - "hidden_records_discovery" to "隐藏记录发现", "hidden_marks_discovery" to "隐藏标记的发现" ) val discovered = hiddenBranches.count { (id, _) -> s.nodesVisitedLifetime.contains(id) } @@ -123,13 +122,24 @@ fun GameStatusPanel( 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()) { 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()) { - 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)) } // 高级信息(精简) diff --git a/app/src/main/java/com/osglab/gameofmoon/story/engine/StoryDataModels.kt b/app/src/main/java/com/osglab/gameofmoon/story/engine/StoryDataModels.kt index fa624ab..e9c2541 100644 --- a/app/src/main/java/com/osglab/gameofmoon/story/engine/StoryDataModels.kt +++ b/app/src/main/java/com/osglab/gameofmoon/story/engine/StoryDataModels.kt @@ -279,7 +279,9 @@ data class StoryStatusSnapshot( val flags: Set, val choicesMade: Map, val variables: Map, - val totalNodeCount: Int + val totalNodeCount: Int, + val endingNodesDiscovered: Set = emptySet(), // 结局发现度:已发现的结局节点 + val totalEndingNodes: Int = 23 // 总结局节点数 ) diff --git a/app/src/main/java/com/osglab/gameofmoon/story/engine/StoryManager.kt b/app/src/main/java/com/osglab/gameofmoon/story/engine/StoryManager.kt index a8c1485..faaaf05 100644 --- a/app/src/main/java/com/osglab/gameofmoon/story/engine/StoryManager.kt +++ b/app/src/main/java/com/osglab/gameofmoon/story/engine/StoryManager.kt @@ -81,6 +81,19 @@ class StoryManager( */ fun captureStatusSnapshot(): StoryStatusSnapshot { 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( currentNodeId = gs.currentNodeId, health = gs.health, @@ -94,7 +107,9 @@ class StoryManager( flags = gs.flags.toSet(), choicesMade = gs.choicesMade.toMap(), variables = gs.variables.mapValues { it.value.toString() }, - totalNodeCount = getAllNodeIds().size + totalNodeCount = getAllNodeIds().size, + endingNodesDiscovered = discoveredEndingNodes, + totalEndingNodes = endingNodeIds.size ) } diff --git a/app/src/main/res/raw/Celestial Care.mp3 b/app/src/main/res/raw/celestial_care.mp3 similarity index 100% rename from app/src/main/res/raw/Celestial Care.mp3 rename to app/src/main/res/raw/celestial_care.mp3 diff --git a/app/src/main/res/raw/Celestial Care (1).mp3 b/app/src/main/res/raw/celestial_care_1.mp3 similarity index 100% rename from app/src/main/res/raw/Celestial Care (1).mp3 rename to app/src/main/res/raw/celestial_care_1.mp3 diff --git a/app/src/main/res/raw/Celestial Drift.mp3 b/app/src/main/res/raw/celestial_drift.mp3 similarity index 100% rename from app/src/main/res/raw/Celestial Drift.mp3 rename to app/src/main/res/raw/celestial_drift.mp3 diff --git a/app/src/main/res/raw/Celestial Drift (1).mp3 b/app/src/main/res/raw/celestial_drift_1.mp3 similarity index 100% rename from app/src/main/res/raw/Celestial Drift (1).mp3 rename to app/src/main/res/raw/celestial_drift_1.mp3