This commit is contained in:
2026-04-28 20:25:37 +08:00
parent f0471a4f8d
commit 0f013b6eee
45 changed files with 1117 additions and 1047 deletions

View File

@@ -162,3 +162,29 @@
5. `npm run test -- src/services/ai.test.ts src/hooks/rpg-runtime-story/storyRequestCoordinator.test.ts src/hooks/rpg-runtime-story/useRpgRuntimeStoryController.test.tsx`
6. `npm run test -- src/hooks/rpg-runtime-story/sessionActions.test.ts src/hooks/rpg-runtime-story/choiceActions.test.ts src/hooks/rpg-runtime-story/npcEncounterActions.test.ts`
7. `npx eslint src/hooks/rpg-runtime-story/sessionActions.ts src/hooks/rpg-runtime-story/sessionActions.test.ts src/hooks/rpg-runtime-story/useRpgRuntimeNpcInteraction.ts src/hooks/rpg-runtime-story/choiceActions.ts src/hooks/rpg-runtime-story/choiceActions.test.ts --max-warnings 0`
### 4.6 `camp_travel_home_scene` 后端收尾
本轮继续收口完成度核验中最后一个残留点:`camp_travel_home_scene` 不能再被前端 `runCampTravelHomeChoice(...)` 提前拦截并本地拼装正式状态。
落地规则:
1. 前端点击 `camp_travel_home_scene` 后统一进入 `runServerRuntimeChoiceAction(...)`,只提交 `sessionId / clientVersion / functionId / optionText / runtimePayload`
2. `server-rs/crates/api-server/src/runtime_story/compat.rs` 负责解析离营目标场景:
- 优先使用 action payload 中的 `targetSceneId`
- 内置世界按 `playerCharacter.id + worldType` 映射到角色主场景。
- 自定义世界优先找玩家角色在 `landmarks[].sceneNpcIds` 中绑定的地点,否则使用当前营地的 `forwardSceneId / connectedSceneIds` 或第一个 landmark。
3. 后端 resolver 写入完整离营状态:
- `currentScenePreset`
- `currentEncounter / sceneHostileNpcs / npcInteractionActive / inBattle`
- `runtimeStats.scenesTraveled`
- `playerX / playerFacing / animationState / playerActionMode / scrollWorld`
- `lastObserveSigns* / currentBattle* / spar* / activeCombatEffects`
4. 后端在目标场景上生成确定性的 encounter preview内置场景至少带一个可交互 NPC自定义场景复用 `build_custom_scene_preset(...)` 中的 NPC 投影。
5. 后端保存 `storyHistory``currentStory`,随后继续走 `project_story_engine_after_action(...)` 和持久化快照。
6. 前端保留 `camp_travel_home_scene` 作为 function id 与展示用 helper但不再保留正式状态构造函数。
验证新增:
1. 后端 route 测试覆盖 `camp_travel_home_scene` 点击后 hydrated snapshot 已进入角色主场景、生成 encounter preview、递增 `scenesTraveled` 并持久化。
2. 前端 `choiceActions.test.ts` 覆盖 `camp_travel_home_scene` 即使命中旧 helper 判定,也只调用 `runServerRuntimeChoiceAction(...)`