feat(稱呼): 害羞時叫不出名字,節點可設羞怯稱呼

既有的 except(anger>=40 → 退回全名)走的是生氣方向:規則被暫停、退回查表的
更正式講法。害羞是反方向——不是更正式,是叫不出來:改口、講到一半換稱呼、
把名字吞掉。所以另開一條路,不硬塞進 except。

shyAddress():羞恥度過 SHY_ADDRESS_AT(60)就換稱呼。節點設了新的 羞怯稱呼
facet 就用它,沒設就吞掉名字改用「你」——不叫名字本身就是訊號,這是預設值
而不是缺省行為。

門檻取 60,跟破口、標點、嘴硬那一級同一條線。女性預設 70 因此本來就落在這條線上,
那是 G3 要的效果,不是副作用。

羞怯稱呼不列進「他要求過的語氣規則」那一行:它只在過門檻時生效,兩邊都列會讓
人格同時看到「叫他⋯那個」跟「平常叫他⋯那個」。relation style 的清單裡照樣看得到。

toneDirective 改吃 opts,才拿得到這一輪的 state/prev/tone 去算羞恥度。

selftest 728 → 735。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-03 08:33:19 +00:00
co-authored by Claude Opus 5
parent b5a5f0a6bf
commit fe17b20010
3 changed files with 77 additions and 7 deletions
+28
View File
@@ -2026,6 +2026,34 @@ check("relation speaker 設定後,context 會注入語氣層與稱呼規則",
return res.status === 0 && pl.loadConfig("alpha").speaker_node === pl.slugify("伴侶甲") &&
ctx.includes("語氣層:老夫老妻") && ctx.includes("親愛的");
})());
// 稱呼隨情緒偏移:生氣走 except(退回全名),害羞是反方向(叫不出來)
check("羞怯稱呼是 STYLE_FACETS 的一格", pl.STYLE_FACETS.includes(pl.SHY_FACET));
check("羞恥度不到門檻就不換稱呼",
pl.shyAddress("alpha", { style: {} }, pl.SHY_ADDRESS_AT - 1) === null);
check("到門檻、沒設專屬叫法 → 吞掉名字(不叫名字本身就是訊號)", (() => {
const s = pl.shyAddress("alpha", { style: {} }, 70);
return s !== null && s.own === false && s.value === null;
})(), JSON.stringify(pl.shyAddress("alpha", { style: {} }, 70)));
check("節點設了羞怯稱呼就用它", (() => {
const s = pl.shyAddress("alpha", { style: { 羞怯稱呼: { value: "⋯那個" } } }, 70);
return s !== null && s.own === true && s.value === "⋯那個";
})(), JSON.stringify(pl.shyAddress("alpha", { style: { 羞怯稱呼: { value: "⋯那個" } } }, 70)));
check("害羞時的語氣指示叫他把名字吞掉(女性預設 70 就落在這條線上)", (() => {
cli(["relation", "speaker", "--session", S_HOST, "--name", "伴侶甲"]);
return pl.modestyState("alpha", {}).value >= pl.SHY_ADDRESS_AT &&
pl.toneDirective("alpha", {}).includes("把名字吞掉");
})(), `${pl.modestyState("alpha", {}).value}${pl.toneDirective("alpha", {})}`);
check("設了羞怯稱呼之後改成叫那個,而且不重複列在「他要求過的規則」裡", (() => {
cli(["relation", "style", "--session", S_HOST, "--name", "伴侶甲",
"--facet", "羞怯稱呼", "--value", "⋯那個"]);
const d = pl.toneDirective("alpha", {});
return d.includes("叫他「⋯那個」") && !d.includes("把名字吞掉") &&
!d.includes("羞怯稱呼→");
})(), pl.toneDirective("alpha", {}));
check("羞怯稱呼在 relation style 的清單裡還是查得到(那裡該看得見全部)", (() => {
const out = cli(["relation", "style", "--session", S_HOST, "--name", "伴侶甲"]).stdout;
return out.includes("羞怯稱呼");
})());
check("relation speaker --clear 之後就不再注入語氣指示", (() => {
cli(["relation", "speaker", "--session", S_HOST, "--clear"]);
return !pl.loadConfig("alpha").speaker_node &&