summaryrefslogtreecommitdiff
path: root/docs/维护说明.md
diff options
context:
space:
mode:
authorSomhairle H. Marisol <[email protected]>2026-09-22 16:43:35 +0800
committerSomhairle H. Marisol <[email protected]>2026-09-22 16:43:35 +0800
commitb8f2a6850904f951cdf690ad23d52764f202966b (patch)
tree7966d7716c2e423d043776a5722bdf16cc7c71b5 /docs/维护说明.md
parent4f512323e521bf57dee7b2bd5e060b69b7b6d029 (diff)
downloadliving-village-b8f2a6850904f951cdf690ad23d52764f202966b.tar.gz
docs: P31 maintenance notes (dialogue bias + four storylines)
Change points, evidence commands, frozen gates restated: kernel 119 / desktop 160 green, digest 953775FAEB2F unchanged, 64x48/256x192 checksums pinned, M3 files untouched; art/ evidence kept out of the repo.
Diffstat (limited to 'docs/维护说明.md')
-rw-r--r--docs/维护说明.md47
1 files changed, 47 insertions, 0 deletions
diff --git a/docs/维护说明.md b/docs/维护说明.md
index e234283..202d3b2 100644
--- a/docs/维护说明.md
+++ b/docs/维护说明.md
@@ -603,6 +603,53 @@ dotnet src/LivingVillage.Headless/bin/Release/net8.0/LivingVillage.Headless.dll
- **遗留**:散落农舍与乡村树丛为纯布局/美术层,不与 NPC 数值、任务系统耦合;默认
64x48/256x192 判定不进入新分支、不消费额外 RNG,观感不变。
+## P31:职业系统 P-d——对话分支倾向 + 四条轻剧情线
+
+- **① 对话分支倾向(design §5)**:`Occupation.biasResponse (kind option) (intent) (personality)`
+ 是 `Sim.responseFor` 之上的纯函数重映射,无职业(None)逐字节等于原输出。规则各自只作用于
+ 签名意图:农夫 AskHelp `Refused->Helpful`;渔夫 SmallTalk `Reserved->Friendly`(聊天气鱼汛,
+ 冷场变热络);货郎 SmallTalk `Reserved->Bargaining`(三句不离买卖);书生 Joke **完全覆盖**
+ 为 `Reserved`(与 personality 相反时取完全覆盖语义而非概率偏向,禁随机,design §5 反差感)。
+ 接线:`Sim.responseFor` 改为公开(同一纯函数,原口径不变);新增
+ `Sim.chooseDialogueWith respond target intent world`(`chooseDialogue` 保留为 identity 包装,
+ 既有行为逐字节不变);Desktop `M5Interaction.chooseIntent` 按玩家职业传 `biasResponse`,
+ 偏差后的回应照常进 DialogueOutcome/双向记忆/年鉴(`Sim.appendAnnal` 改公开,语义不变)。
+- **② 轻剧情线状态机**:`Occupation.Story`,每职业三段式 接任务→走访→收束,`StoryStage`
+ 语义 `0 未开始 / 1 已接任务 / 2 走访中 / 3 已收束`(v3 occupation 段早已序列化该字段,
+ 读取路径原样恢复,存档段格式未动)。每次玩家对话至多推进一段:开线日
+ `startDayOf seed kind = hash(seed ^ storySeed, day 0) mod 3 + 2 ∈ [2,4]`(沿每日任务的
+ splitmix `(seed, profession, day)` 哈希模式,story 种子与任务种子两两不撞);`1→2`、`2→3`
+ 分别要求 `day >= startDay+1`、`startDay+2`。终局由 `relationMeanToPlayer`(与
+ `Sim.relationMatrix` 同口径的衰减 valence,只计认识玩家的村民;无一认识 = 0)过纯阈值
+ `≥0.3 Warm / [0,0.3) Plain / <0 Distant` 定格三种结局文案,写入年鉴快照后不再随关系衰减改变。
+ 四条线:农夫「雨水与年成」、渔夫「水位与收成」、货郎「新货的路子」、书生「庙前的争论」。
+ (设计稿 §5 的「药童」在 P-a 落地时以「农夫」为第四职业合入 main,故第四线写农夫题材,
+ 其余三线名照设计稿。)
+- **③ 年鉴条目**:`Sim.AnnalKind` 新增 `StoryAnnal`(文案落 `Summary`),v3 存档以新 token
+ `story` 序列化;v1/v2(无职业)永不产生该 token,字节口径不变;v3 存→读→存逐字节一致
+ (有测试)。§3「身份条目」此前未落地,本单补齐:带职业开局由 `StartNewGame` 写入
+ `以耕田为生 / 以打渔为生 / 以贩货为生 / 以读书为生`(年鉴短句风格,不带主语)。
+- **④ 显示层收口(最小展示)**:任务面板(T 键)在职业名/每日任务下新增一行
+ `剧情线:<线名>,<段名>`;职业选择页选中职业时提示 `剧情线:<线名>`;年鉴面板按既有
+ `annalLine` 渲染 `StoryAnnal.Summary` 原文。M5View 新增 `Seed` 字段(与开局种子同源),
+ 供剧情线开线日哈希。
+- **⑤ 中文图集**:新增文案(四线名、四段名、身份条目、接任务/走访/12 条结局文案)全部进入
+ `ChineseText.requiredUiLabels`;`cjk-glyphs.txt` 与 `CjkGlyphAtlas.characterTable` 同步
+ 238 -> **307** 字(384x480,行数 15 -> 20),`scripts/generate-cjk-glyph-atlas.sh` 确定性
+ 再生成 PNG;`CjkGlyphAtlasHasAStableCharacterTableAndGeometry` 计数/行数/尺寸断言同步更新。
+- **回归**:Kernel **92 -> 119**(偏差 9 + 剧情线 14 + 存档/身份 4)、Desktop **156 -> 160**
+ (面板剧情行 2、M5 对话接线 2)全绿;Release build 0 警告 0 错误;
+ `final_digest=953775FAEB2FDDE97289491AA260BD8D390C571E48A7A13AD2CB6FB7124F7F6C` 多次一致;
+ **64x48=6042052、256x192=1284656962 锁定不变**(`DefaultSizeChecksumsArePinned`)。
+ M3 相关文件零改动;无职业世界(Occupation=None)全部走 identity/原路径,模拟数值语义
+ 未触碰(Sim.fs 仅 visibility 公开 + chooseDialogue 重构为 identity 包装,行为逐字节等价)。
+- **取证** `/tmp/opencode/lv-p31/art/`(gitignore 不入库,真实 Xvfb 帧非概念图):
+ `p31-story-{farmer,fisher,peddler,scholar}-stage2.png`(1280x720 各 1 张,任务面板含
+ 剧情线行 + 年鉴身份条目)。复现命令:
+ `timeout 120 xvfb-run -a -s "-screen 0 1280x720x24" env LV_STORY_SHOT=1 LV_STORY_OCCUPATION=fisher LV_STORY_STAGE=2 LV_RECORD_DIR=/tmp/opencode/lv-p31/art dotnet src/LivingVillage.Desktop/bin/Release/net8.0/LivingVillage.Desktop.dll`。
+- **范围外**:设计稿 §5 的「视频证据」以 4 张真实渲染截图替代(本单验收清单口径);
+ 药童线以农夫线替代(见 ②);NPC 职业化、补选职业、剧情线多线并行仍为设计边界外。
+
## 已验证命令
```bash