把代入名片从开场白拆到主角设定短码槽,并收紧对话落盘写法。
多开场可各自绑定名片;开玩挂载跳过开场产物并认用户需求类标签。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+14
-12
@@ -48,6 +48,7 @@ import {
|
||||
/** 开场白进对话历史,不重复挂进每轮投影 */
|
||||
const SKIP_BIND_TAGS = new Set([
|
||||
"设计.开场白",
|
||||
"设计.开场白与开场变量",
|
||||
"设计.worker集",
|
||||
"设计.worker集.草稿",
|
||||
CONTEXT_ORDER_TAG,
|
||||
@@ -57,9 +58,20 @@ const SKIP_BIND_TAGS = new Set([
|
||||
VALUE_MAP_TAG,
|
||||
]);
|
||||
|
||||
/** 偏文风/呈现:有叙事转述时挂转述;否则仍挂主世界层 */
|
||||
function shouldSkipBindTag(tag: string): boolean {
|
||||
const t = tag.trim();
|
||||
if (!t) return true;
|
||||
if (SKIP_BIND_TAGS.has(t)) return true;
|
||||
if (t.startsWith("设计.开场白#")) return true;
|
||||
if (t.startsWith("输出.")) return true;
|
||||
if (t.startsWith("运行.")) return true;
|
||||
if (t.startsWith("创作.")) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/** 偏文风/呈现/硬约束:有叙事转述时挂转述;否则仍挂主世界层 */
|
||||
const STYLE_TAG_RE =
|
||||
/叙事指南|故事推进|文风|美学|纲领|禁忌|示例|模仿|正文组成|回复格式|监控栏|篇幅|结构/;
|
||||
/叙事指南|故事推进|文风|美学|纲领|禁忌|用户约束|用户需求|示例|模仿|正文组成|回复格式|监控栏|篇幅|结构/;
|
||||
|
||||
/** 这些配方开玩时刚需叙事转述(主世界出内容、转述出文风) */
|
||||
const RECIPES_REQUIRE_NARRATOR = new Set(["文本生成器"]);
|
||||
@@ -75,16 +87,6 @@ function isStyleProductTag(tag: string): boolean {
|
||||
return STYLE_TAG_RE.test(tag);
|
||||
}
|
||||
|
||||
function shouldSkipBindTag(tag: string): boolean {
|
||||
const t = tag.trim();
|
||||
if (!t) return true;
|
||||
if (SKIP_BIND_TAGS.has(t)) return true;
|
||||
if (t.startsWith("输出.")) return true;
|
||||
if (t.startsWith("运行.")) return true;
|
||||
if (t.startsWith("创作.")) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/** 从黑板收集对话落盘产物(有正文的 用户.* / 设计.*) */
|
||||
export function collectDictateBindProducts(board: Blackboard): DictateProduct[] {
|
||||
const products: DictateProduct[] = [];
|
||||
|
||||
@@ -85,10 +85,10 @@ tool 跑完后写给用户看的 markdown。作用:确认本轮落了什么、
|
||||
|
||||
## 分清落盘目标
|
||||
- 正文组成(格式)→ insert \`设计.正文组成\`(须「回复呈现」等上游条件已满足,见能力表)
|
||||
- 开场白(内容)→ insert \`设计.开场白\`;落档/开玩同步 \`输出.开场白\`(收口;上游未齐则先补上游,不硬塞开场)
|
||||
- 开场白(内容)→ insert \`设计.开场白\` 或 \`设计.开场白#场景短码\`(多开场互不覆盖;改某一条则 insert 同一完整 tag);落档/开玩同步 \`输出.开场白\`
|
||||
- 代入名片 → insert \`设计.主角设定\` 或 \`设计.主角设定#同短码\`(与开场白同槽即绑定该开局;无槽则全局默认)
|
||||
- 多篇无关联短文(生产在游玩)→ 创作期钉 \`设计.模仿范例\` / \`设计.模仿要点\` / \`设计.故事推进\`(大纲扩写);文风细则另 insert \`设计.叙事指南\`
|
||||
- 好感分档性格等 → declare_variable + declare_map;分档文案走映射,不 insert 整表散文
|
||||
- 代入名片(名字/身份/金手指)→ insert \`设计.主角设定\`(对照「主角设定」何时用;名字写成具体称呼,不用 @玩家 / 用户 / 主角)
|
||||
${recipeBlock}${moduleBlock}
|
||||
## 按用户本轮意图择一为主(仍须过「何时用」)
|
||||
落盘后的可见回复一律按「对用户可见回复」写;下列各节只约定本轮落什么。
|
||||
@@ -100,11 +100,11 @@ ${recipeBlock}${moduleBlock}
|
||||
「回复呈现」等上游已齐时才 insert \`设计.正文组成\`。
|
||||
|
||||
### C · 生成开场白
|
||||
收口:先有正文组成且体验已锚定;insert \`设计.开场白\`(岔路用 \`## 岔路\`)。
|
||||
**形状:** meta + 正文。有代入名片时,开头 YAML \`用户角色.名字\` / \`用户角色.简介\`,再 \`---\`,下面才是开场正文。不同开场可有不同用户角色。
|
||||
收口:体验已锚定。首条可用 \`设计.开场白\`;再写别的开局用 \`设计.开场白#场景短码\`(与生成规则同款:同 tag 覆盖,新短码新建)。禁止用 \`## 岔路\` 塞进同一份。
|
||||
**形状:** 只要叙事正文。禁止把 \`用户角色.名字\` / \`用户角色.简介\` 写进开场白。代入名片 → \`设计.主角设定\` 或 \`设计.主角设定#同短码\`。
|
||||
**正文格式:** 已有 \`设计.正文组成\` 时,正文必须是 present.v1 JSON(\`shell\` 与正文组成一致,主读写 \`blocks.body\`),不要只交裸 Markdown;尚未钉正文组成时才用 Markdown。
|
||||
**content 规格:** 正文至少一处字面 \`@玩家\` 作用户角色名位;姓名位用 \`@玩家\`,不写死具体姓名;全文不能只有「你」而零个 \`@玩家\`。缺则改写后再 insert。进游玩时程序替换 \`@玩家\`。
|
||||
进玩时若有用户角色,程序提示是否切换到这个预设。
|
||||
进玩时在游玩辅助「开场」Tab 点选开局;有绑定名片则可切到该预设。
|
||||
|
||||
### D · 钉变量与映射
|
||||
仅当「变量设计」何时用成立(体验须跨轮记住状态等):declare_variable → 有分档换文再 declare_map。配方名带「数据化」也不自动开跑 D。
|
||||
@@ -113,7 +113,7 @@ ${recipeBlock}${moduleBlock}
|
||||
必须用 insert 写齐游玩上下文:\`设计.模仿范例\`、\`设计.模仿要点\`、\`设计.故事推进\`(用户输入用法:大纲扩写;扮演停笔关掉)。文风细则对照「叙事指南」何时用再 insert \`设计.叙事指南\`。缺范例/要点/故事推进任一就先补产物,再说可以开玩。创作期不写完整短文。开玩后程序只挂载这些产物:主世界出内容,转述出文风。
|
||||
|
||||
### F · 快穿短局
|
||||
仅当本局配方是快穿短局,或用户只要一核短局。先 insert 美学纲领(这一核、怎么代入、何时等用户);代入有名字/简介则写进开场白的用户角色 meta(不单独 insert 主角设定)。核是变造法则再 insert 实现机制;有门控才 declare 至多三个真值。点名文风 → insert 叙事指南;点名推进/停笔 → insert 故事推进(条件独立)。核可玩即 insert 开场白:用户未点名分区/壳则跳过正文组成(覆盖 C),开玩吃默认散文。舞台骨架/生成规则/拓扑即使「何时用」成立也不 insert,把地点与规则折进美学核或开场白。用户改口要铺可经营世界 → 本局仍只收这一核,并告知改用「数据化跑团体验」或「回合推演」。
|
||||
仅当本局配方是快穿短局,或用户只要一核短局。先 insert 美学纲领(这一核、怎么代入、何时等用户);代入有名字/简介 → insert \`设计.主角设定\`(不要写进开场白)。核是变造法则再 insert 实现机制;有门控才 declare 至多三个真值。点名文风 → insert 叙事指南;点名推进/停笔 → insert 故事推进(条件独立)。核可玩即 insert 开场白:用户未点名分区/壳则跳过正文组成(覆盖 C),开玩吃默认散文。舞台骨架/生成规则/拓扑即使「何时用」成立也不 insert,把地点与规则折进美学核或开场白。用户改口要铺可经营世界 → 本局仍只收这一核,并告知改用「数据化跑团体验」或「回合推演」。
|
||||
|
||||
## 常用序感
|
||||
- 需求/美学等不变设定:靠前(负)
|
||||
|
||||
@@ -153,9 +153,11 @@ export function resolveRepeatableInsertTag(params: {
|
||||
.filter((t) => t && dictateProductFamily(t) === family);
|
||||
|
||||
if (!slot) {
|
||||
if (siblings.length > 0 && raw === family) {
|
||||
// 允许覆盖基名自身;若已有其它 #槽位,禁止再用裸基名(须写明 #id)
|
||||
const otherSiblings = siblings.filter((t) => t !== family);
|
||||
if (otherSiblings.length > 0 && raw === family) {
|
||||
return {
|
||||
error: `「${family}」是可增殖产物,追加请用「${family}#唯一id」(生成规则用 rule_id,具体实例用 batch_id/姓名),不要覆盖基 tag。改某一条则 insert 同一完整 tag。`,
|
||||
error: `「${family}」是可增殖产物,追加请用「${family}#唯一id」(生成规则用 rule_id,具体实例用 batch_id/姓名,开场白/主角设定用场景短码),不要覆盖基 tag。改某一条则 insert 同一完整 tag。`,
|
||||
};
|
||||
}
|
||||
return { tag: family };
|
||||
|
||||
@@ -16,12 +16,12 @@ export const DICTATE_TOOL_DEFINITIONS: ToolDefinition[] = [
|
||||
position: {
|
||||
type: "string",
|
||||
description:
|
||||
"产物 tag,须以「用户.」或「设计.」开头。例:用户.需求、设计.正文组成、设计.开场白;可增殖例:设计.生成规则#rule-id、设计.具体实例#batch-id。勿用本工具写变量目录/映射。",
|
||||
"产物 tag,须以「用户.」或「设计.」开头。例:用户.需求、设计.正文组成、设计.开场白、设计.开场白#dorm;可增殖例:设计.生成规则#rule-id、设计.具体实例#batch-id、设计.主角设定#dorm。勿用本工具写变量目录/映射。",
|
||||
},
|
||||
content: {
|
||||
type: "string",
|
||||
description:
|
||||
"落入该位置的正文。设计.正文组成=格式 JSON;设计.开场白=meta + 正文(有正文组成时正文为 present.v1 JSON;否则 Markdown),必须含字面 @玩家(用户角色名位,禁止写死姓名)",
|
||||
"落入该位置的正文。设计.正文组成=格式 JSON;设计.开场白[#短码]=叙事正文(有正文组成时为 present.v1 JSON;否则 Markdown),必须含字面 @玩家,禁止写入用户角色.名字/简介;设计.主角设定[#同短码]=名字/背景/特殊设定 JSON,与开场同短码即绑定该开局",
|
||||
},
|
||||
order: {
|
||||
type: "number",
|
||||
|
||||
Reference in New Issue
Block a user