This commit is contained in:
2026-04-26 14:27:48 +08:00
parent f68f4914ec
commit ea33413187
155 changed files with 8130 additions and 1740 deletions

View File

@@ -0,0 +1,32 @@
# 创作页场景世界地图面板修复设计2026-04-25
## 背景
创作结果页进入“场景”编辑面板后,底部“查看世界地图”弹出的面板存在两个问题:
1. 面板仍使用偏运行时的深色地图容器,放在浅色创作页主题下时配色割裂,节点文字与背景层次也不稳定。
2. 地图只按传入的地标列表渲染,普通场景编辑时容易漏掉开局场景,无法形成完整“世界地图”视角。
## 落地范围
- `src/components/rpg-creation-editor/RpgCreationEntityEditorShared.tsx`
- `src/components/CustomWorldEntityEditorModal.test.tsx`
## 设计约束
1. 不新增说明类大段 UI 文案,只保留必要的节点名、方向标签和空状态。
2. 地图面板继续作为独立弹窗,不在当前场景连接面板下方展开。
3. 地图数据必须使用当前编辑中的草稿状态:
- 普通场景编辑:开局场景 + 已保存场景列表,并用当前 `draft` 替换正在编辑的场景。
- 新增普通场景:开局场景 + 已保存场景列表 + 当前 `draft`
- 开局场景编辑:当前 `draft` 开局场景 + 已保存场景列表。
4. 地图节点要标记当前编辑场景,连接线要展示方向短标签,避免用户只能看到无语义的线。
5. 配色使用 `platform-*` 主题变量,适配浅色与深色创作页主题。
## 验收点
1. 在普通场景编辑器点击“查看世界地图”后,弹窗中能同时看到开局场景和当前场景。
2. 未保存的场景连接关系会立刻体现在地图弹窗里。
3. 当前编辑场景节点有明确高亮。
4. 地图容器和节点不再固定为深色运行时风格。
5. 相关前端测试覆盖普通场景与开局场景两条入口。

View File

@@ -41,6 +41,7 @@
- 角色主图:`server-rs/crates/api-server/src/custom_world_asset_prompts.rs`
- `build_character_visual_prompt`
- 内部使用 `build_master_prompt`
- 只拼入用户可见的 `promptText` / `visualPromptText`,不再拼入 `characterBriefText` 或角色摘要字段。
- 角色动作视频:`server-rs/crates/api-server/src/custom_world_asset_prompts.rs`
- `build_character_animation_prompt`
- 图生视频分支使用 `build_video_action_prompt`

View File

@@ -20,6 +20,7 @@
- `eventDescription: string`
- 描述当前幕正在发生的事件。
- 必须强绑定 `oppositeNpcId` / `primaryNpcId` 所指角色,写清该角色的行动、阻碍、试探、求助或冲突。
- 三幕默认遵循戏剧曲线:第一幕铺垫并露出异常,第二幕让阻碍或立场冲突升级,第三幕进入高潮、关键抉择或直接后果。
- 默认生成兜底规则:`第N幕中玩家在当前场景遭遇/处理与某角色直接相关的事件,并推动当前场景问题升级或转向。`
兼容字段:
@@ -43,12 +44,33 @@
- `camp.sceneTaskDescription` 默认生成开局场景核心任务。
- `landmarks[*].sceneTaskDescription` 默认生成关键场景核心任务。
- `actEventDescriptions` 恰好 3 条,对应每一幕事件。
- `actEventDescriptions[0] / [1] / [2]` 必须分别承担铺垫、冲突、高潮,不允许三条只是同一事件的近义复述。
- `actBackgroundPromptTexts[n]` 必须基于同序号幕事件和相关角色写出画面主体、站位空间、冲突痕迹与氛围,不能只用场景名或幕标题拼接。
3. 后端合成 `sceneChapterBlueprints` 时把这些源字段落到:
- `sceneChapterBlueprints[*].sceneTaskDescription`
- `sceneChapterBlueprints[*].acts[*].oppositeNpcId`
- `sceneChapterBlueprints[*].acts[*].eventDescription`
4. 若 LLM 遗漏字段,归一化阶段用场景描述、入口钩子、角色名单生成中文默认值,保证草稿阶段字段非空。
5. 前端类型与归一化逻辑必须允许读取这些字段,旧草稿缺字段时仍自动补默认值。
6. 幕信息编辑界面必须直接展示 `eventDescription`,并在保存时保留 `sceneTaskDescription / oppositeNpcId / eventDescription / backgroundPromptText`,避免旧草稿经前端编辑后丢失后端生成字段。
## 幕配置预览标识
1. 幕配置预览图里只保留简洁角色点位标识,不新增说明类文案。
2. 主角固定在画面左侧可站立区域,对面角色槽位固定在画面右侧可站立区域:
- 主角色槽位位于画面中右侧,作为当前幕的主要对峙对象。
- 第二、第三角色槽位位于右侧上、下两个辅助位置,形成清晰的纵向层次。
3. 每个槽位使用圆形短标识表达序号:`主 / 2 / 3`,旁边只展示角色名或“添加角色”。
4. 标识必须有高对比底色、描边和轻微阴影,避免在浅色天空、地面纹理或深色背景上丢失。
5. 空槽位仍然可点击,但只能显示 `+` 与短标签,不能显示大段规则说明。
## 对话选项差异要求
运行时 NPC 聊天每轮生成的 3 个对话选项必须导向不同氛围和好感结果:
1. 第一条为温和共情或愿意倾听,通常让气氛缓和并更容易带来好感上升。
2. 第二条为冷静追问或试探,通常保持中性但推进情报。
3. 第三条为施压、质疑或立场冲突,通常让气氛变紧,可能带来好感下降或代价。
## 非目标

View File

@@ -88,13 +88,13 @@ Rust Stage 2 不再使用“LLM 先摘要再拼 SVG”的链路。
新的生成 prompt 口径:
1. 以请求里的 `promptText + characterBriefText` 组装正式主图 prompt
1. 以请求里的 `promptText` 组装正式主图 prompt;主形象不再拼入 `characterBriefText`,避免角色名、身份摘要、参考模板等非形象描述干扰体型、视角和风格约束
2. 约束必须覆盖:
1. 单人
2. 右向斜侧身
3. 1:1 正方形画布
4. 纯绿色绿幕
5. 34 头身
5. 11.5 头身
6. 像素动作角色
7. 不要扩写复杂背景
3. 主目标是与旧 Node `buildNpcVisualPrompt` 生成出的正式约束保持同方向

View File

@@ -64,6 +64,13 @@
返回绑定后的邀请中心状态与本次奖励发放结果。
## 落地状态
- `server-rs/crates/spacetime-module` 已新增邀请码与邀请关系表,邀请中心读取和填码绑定均通过 SpacetimeDB procedure 执行。
- `server-rs/crates/api-server` 已挂接 `/api/runtime/profile/referrals/*``/api/profile/referrals/*` 两组路由。
- 前端“我的”Tab 三个快捷入口均打开独立弹窗,玩家社区先使用空白二维码占位。
- 复制邀请会复制邀请码和邀请链接;填码成功后刷新个人看板积分。
## 前端交互
- 三个入口继续放在“我的”Tab 常用功能区,不新增页面。

View File

@@ -0,0 +1,52 @@
# RPG Agent 单字段锚点结构重构方案
## 背景
当前 RPG 创作 Agent 的 `anchorContent` 把每个锚点继续拆成多个子字段,例如 `worldPromise.hook / differentiator / desiredExperience``playerFantasy.playerRole / corePursuit / fearOfLoss`。这些子字段在语义上会互相重叠,后续基础设定展示又会把子字段用分隔符连接成“标签”,导致同一内容在一个锚点内或跨锚点重复出现。
本次重构将 `anchorContent` 收束为“每个锚点一个字段”。子字段不再作为数据结构保存,只保留为 prompt 中的生成关注点。
## 新数据结构
`anchorContent` 保留原有 8 个键,便于上下游和旧存档兼容,但每个键的值统一为 `string | null`
```ts
type RpgCreationAnchorContent = {
worldPromise: string | null;
playerFantasy: string | null;
themeBoundary: string | null;
playerEntryPoint: string | null;
coreConflict: string | null;
keyRelationships: string | null;
hiddenLines: string | null;
iconicElements: string | null;
};
```
## 生成口径
1. Agent 每轮仍然输出完整 `nextAnchorContent`,并覆盖上一版。
2. 每个锚点只输出一段凝练中文,不再输出对象或数组。
3. 旧的子字段关注点进入 prompt 约束:
- `worldPromise` 关注世界钩子、差异点、玩家体验。
- `playerFantasy` 关注玩家身份、核心追求、失去风险。
- `themeBoundary` 关注主题气质、美术方向、禁用方向。
- `playerEntryPoint` 关注开局身份、开局问题、行动动机。
- `coreConflict` 关注表层冲突、隐藏危机、首次触发点。
- `keyRelationships` 关注关键人物关系、关系类型、代价或秘密。
- `hiddenLines` 关注隐藏真相、误导线索、揭示节奏。
- `iconicElements` 关注标志意象、组织/物件、硬规则。
## 兼容策略
1. 后端读取旧 `anchorContent` 时,允许把旧对象/数组压缩成字符串。
2. 后端新写回永远写单字段字符串结构。
3. 前端契约和展示只按字符串字段读取,不再把子字段连接成标签。
4. 草稿生成、`creatorIntent``anchorPack` 均从单字段锚点派生。
## 验收点
1. Agent 对话后 `anchorContent` 的 8 个锚点值均为字符串或 `null`
2. 基础设定面板不再因为子字段连接产生重复标签。
3. 旧存档中的对象结构仍可被读取并压缩展示。
4. `draft_foundation` 生成种子直接使用 8 个单字段锚点。

View File

@@ -90,6 +90,9 @@
前排主角色与玩家角色保持同一 y 轴后排两个角色改为同一列、x 轴对齐并上下分布,且后排整体 y 轴中点与前排主角色一致
9. 新增幕默认只带 1 个主角色,后续槽位由创作者按需补充
10. 小预览里的名字已移动到角色头顶,角色渲染不再带方形底板,避免遮挡场景背景
11. 幕预览复用真实游戏壳时隐藏左上角角色等级徽标,退出入口固定在上方画面区域底部居中,并使用“结束预览”作为操作文案
12. 创作侧场景列表封面、多幕配置卡片、配置背景弹层统一读取同一张场景显示图;在任一幕保存背景时同步回全部幕背景字段和场景兼容图,避免同一场景在不同层级出现不同预览图
13. 场景角色预览图背景改用平台主题变量,亮色主题下不再保留深色预览底
## 2.6 负好感主角色有限聊天闭环