Skip to content

制作分阶段人设

旧版存档

数据库制作分阶段人设

⚠️ 声明: 本教程仅适用于数据库 星河璀璨 版本及以上

观前提示:电脑端若看不清图片可以使用Ctrl加滚轮放大

返回目录请点击下面蓝色字体点我返回目录

一、什么是分阶段

以人物 好感度 为例:

大模型对好感度的理解只是一个单纯的数值。它无法判定这个数值背后角色该抱有何种感情——

  • -10 是仇恨还是有点厌恶?
  • +50 是只可以拥抱还是能够进行更亲密的互动?

对模型来说,它只是一个数字,它不懂。

解决方案:加入条件触发 。

简单来说:

  • 当 好感度 < 10 → 人物呈现 阶段1 的性格
  • 当 好感度 10~30 → 人物呈现 阶段2 的性格
  • 以此类推……

你可以尽情发挥想象力!

二、我该怎么做

核心两步:

  • 修改数据库表格
  • 写不同阶段的设定

这跟 MVU 和 EJS 的逻辑一样,数据库只是提供另一个制作分阶段人设的工具,感谢社区各位大佬的开创性与思路分析!

步骤①:修改数据库表格

  • 通常建议 新建一个属性表,有能力的话也可以修改已有表格。
  • 《数据库》本体 → 《数据管理》 → 《可视化表格编辑器》
1. 表格位置

2. 新建表格
  • 表格名字叫啥都行,但是 你要记住这个名字(后面写条件时要用到)。

3. 构建表格
3.1 基本信息与表头
  • 为了方便理解,这里多加了一个财富值。如果你只想做恋爱向,只需要写 角色名 和 好感度 即可。

3.2 自动化参数

  • 推荐填 1,即每楼层更新一次
  • 如果有其他想法,填其他数字也可以
  • 其他设置沿用全局默认即可

3.3 提示词编写
  • 数值可以写 负数

3.4 保存

  • 普通保存=当前窗口
  • 通用模板=每个窗口

3.5 分享表格

《数据库》本体 → 《数据管理》 → 《表格模板预设》

✅ 至此,表格部分就完成了!

步骤②:写不同阶段的设定

1. 在世界书中新建条目
  • 条目名字不重要,自己知道是啥就行

2. 编写条件语法
示例 A:最简单的两阶段人设(好感度分段)
<if cell="属性表/苏苏/好感度 <= 10"> 阶段一_一般路过小师妹: 【核心设定】 外在状态: 可爱小师妹 内在状态: 木头吐槽役 <else> <if cell="属性表/苏苏/好感度 <= 30"> 阶段二_开窍阶段: 外在状态: 别扭小猫 内在状态: 傲娇 核心变化: 咦,他怎么有点……不对不对,我是不是…… </if> </if>

格式要点:

  • 绿色部分(<if cell="...">):按照表头名称填写判定条件,需严格遵守格式
  • 灰色部分(阶段人设内容):按照一般世界书写法写人设即可
示例 B:更完整的多阶段人设
<if cell="属性表/苏苏/好感度 <= 10"> 阶段一:陌生人 态度: 礼貌但疏离 称呼玩家: "你"、"那个人" 行为: 保持社交距离,不会主动找你 <else> <if cell="属性表/苏苏/好感度 <= 30"> 阶段二:熟悉的人 态度: 愿意聊天,偶尔主动搭话 称呼玩家: 名字 行为: 会帮小忙,分享零食 <else> <if cell="属性表/苏苏/好感度 <= 60"> 阶段三:暧昧期 态度: 在意你的看法,容易脸红 称呼玩家: 昵称 行为: 找借口靠近,吃醋但嘴硬 <else> 阶段四:恋人 态度: 甜蜜依赖,撒娇 称呼玩家: 专属昵称 行为: 主动牵手、拥抱,会说"我想你" </if> </if> </if>

⚠️ 注意嵌套结构: 三个 <if> 条件并列最后都要有对应的 </if>,<else> 写在中间。

示例 C:多条件组合(好感度 + 其他属性)
<if cell="关系表/苏苏/好感度 > 50"> <if cell="资产表/苏苏/财富值 > 1000"> 苏苏对你有好感且富有,会主动送你礼物。 <else> 苏苏对你有好感但经济拮据,会用手工礼物表达心意。 </if> <else> 苏苏对你态度冷淡。 </if>

⚠️ 注意嵌套结构: 这部分有点绕(推荐看示例D)

  • 外层:先判定好感度,>50 苏苏有好感,否则对你冷淡。
  • 里层:在好感度 >50 的情况下,再判定财富值是否 >1000 ,是则苏苏有好感并主动送你礼物,否则有好感但只送手工礼物。
示例 D:用 cond 统一表达式(不用嵌套的更简洁的写法)
<if cond="cell:属性表/苏苏/好感度 > 10 & cell:属性表/苏苏/好感度 <= 30"> 阶段二:熟悉的人 态度: 愿意聊天,偶尔主动搭话 称呼玩家: 名字 行为: 会帮小忙,分享零食 </if> <if cond="cell:属性表/苏苏/好感度 > 30 & cell:属性表/苏苏/好感度 <= 60"> 阶段三:暧昧期 苏苏开始在意你,容易脸红,找借口靠近你。 </if>
<if cond="cell:关系表/苏苏/好感度 > 50 & cell:资产表/苏苏/财富值 > 1000"> 苏苏对你有好感且富有,会主动送你礼物。 </if> <if cond="cell:关系表/苏苏/好感度 > 50 & cell:资产表/苏苏/财富值 <= 1000"> 苏苏对你有好感但经济拮据,会用手工礼物表达心意。 </if> <if cond="cell:关系表/苏苏/好感度 <= 50"> 苏苏对你态度冷淡。 </if>
<if cond="cell:属性表/苏苏/好感度 > 60 & seed:约会"> 特殊状态:约会中的恋人 苏苏今天格外开心,主动挽着你的手臂。 </if>

⚠️ 非嵌套结构:

  • 同时判定多个条件。
  • Seed:关键词,苏苏好感度 >50 ,而且 上一轮正文 或 用户输入 中出现关键词 “约会” 则触发特殊状态。
模板一:嵌套型
<if cell="你的表格名/角色名/属性名 <= 数值1"> 阶段一:阶段名称 在这里写阶段一的人设内容…… <else> <if cell="你的表格名/角色名/属性名 <= 数值2"> 阶段二:阶段名称 在这里写阶段二的人设内容…… <else> <if cell="你的表格名/角色名/属性名 <= 数值3"> 阶段三:阶段名称 在这里写阶段三的人设内容…… <else> 最终阶段:阶段名称 在这里写最终阶段的人设内容…… </if> </if> </if>
模板二:非嵌套型
<!-- 阶段一:小于等于数值1 --> <if cond="cell:你的表格名/角色名/属性名 <= 数值1"> 阶段一:阶段名称 在这里写阶段一的人设内容…… </if> <!-- 阶段二:大于数值1 且 小于等于数值2 --> <if cond="cell:你的表格名/角色名/属性名 > 数值1 & cell:你的表格名/角色名/属性名 <= 数值2"> 阶段二:阶段名称 在这里写阶段二的人设内容…… </if> <!-- 阶段三:大于数值2 且 小于等于数值3 --> <if cond="cell:你的表格名/角色名/属性名 > 数值2 & cell:你的表格名/角色名/属性名 <= 数值3"> 阶段三:阶段名称 在这里写阶段三的人设内容…… </if> <!-- 最终阶段:大于数值3 --> <if cond="cell:你的表格名/角色名/属性名 > 数值3"> 最终阶段:阶段名称 在这里写最终阶段的人设内容…… </if>

替换规则:

  • 你的表格名 → 你在步骤①创建的表格名字
  • 角色名 → 表格里的行名(角色名)
  • 属性名 → 表格里的列名(如"好感度")
  • 数值1/2/3 → 你自己定义的阶段分界点

\3. 其他设置说明

  • 蓝绿灯:都可以。语法写正确后,只有数据库能读取,不会占用正文 Token数,绿灯记得写关键词。跟 MVU 不同,不需要关条目
  • 角色定义前后、深度等:参照一般世界书写法

✅ 至此,你就可以开始游玩了!

三、条件模板语法完整参考

功能开关

  • 在 《数据库》本体《更新》设置区域,勾选 《启用条件模板功能》复选框即可开启。
数据库条件模板语法说明 (不会有人真的认真看吧,复制给AI吧……)
数据库条件模板语法说明 概述 数据库插件提供了条件模板功能,允许根据条件动态显示或隐藏提示词内容。该功能通过 <if> 标签实现,支持关键词匹配、表格数值比较以及统一条件表达式三种条件类型。此外,还提供随机数生成功能。 功能开关 在"数据库更新"设置区域,勾选"启用条件模板功能"复选框即可开启此功能。 基本语法 1. 关键词匹配 (seed) 根据数据库表格内容(除纪要表外)和 $6(上轮剧情规划数据)中是否包含指定关键词来决定是否显示内容。 <if seed="关键词表达式">条件内容</if> 2. 表格数值比较 (cell) 根据数据库表格中的数值来决定是否显示内容。 <if cell="表格名/行名/列名 比较运算符 数值">条件内容</if> 3. 统一条件表达式 (cond) 【新增】 支持多条件组合和括号分组,可以混合使用 seed: 和 cell: 条件。 <if cond="条件表达式">条件内容</if> 4. 随机数生成 (random) 在提示词中生成指定范围内的随机整数。 <random min="最小值" max="最大值" /> 示例: ``` 🎲 本轮随机数: 🎲 骰子结果: ``` 关键词匹配详解 基本用法 <if seed="战斗">这里的内容只有在消息中包含"战斗"时才会显示</if> 逻辑运算符 组合示例 ``` 你正在施展战斗魔法! 场景变得紧张起来。 危险潜伏在四周。 这是一场追逐战! ``` 模糊匹配 关键词匹配支持模糊匹配,会自动匹配包含该词的更长词语: 关键词 战斗 可以匹配 战斗中、战斗开始、激烈战斗 等 匹配不区分大小写 表格数值比较详解 基本语法 <if cell="表格名/行名/列名 比较运算符 数值">条件内容</if> 比较运算符 示例 ``` <if cell="关系表/陈默/好感度 <= 30"> 陈默对你保持警惕。 恭喜你达到了10级! 当前处于战斗状态! 当前不是战斗状态。 ``` 行列颠倒自动匹配 如果指定的"行名/列名"找不到,系统会自动尝试颠倒查找: ``` ``` 单行表格支持 对于只有一行数据的表格(如「全局数据表」),系统会自动识别并支持直接用列名获取值: ``` 当前处于战斗状态! 当前处于战斗状态! ``` 字符串比较说明 字符串比较支持 ==(相等)和 !=(不等)运算符 字符串比较是精确匹配,区分大小写 如果单元格值是数字类型,比较值也是数字,则进行数值比较 否则进行字符串比较 统一条件表达式详解 (cond) 【新增】 基本语法 统一条件表达式支持在单个 <if> 标签中组合多个条件,使用 seed: 和 cell: 前缀指定条件类型。 <if cond="条件表达式"> 条件满足时显示的内容 <else> 条件不满足时显示的内容 </if> 子条件类型 逻辑运算符 注意:! 可以对单个条件或括号表达式整体取反: - !seed:安全 - 不包含"安全" - !(seed:战斗 & cell:魔力 > 30) - 不是(战斗且魔力充足) 运算优先级 括号 () - 最高优先级,先计算括号内 ! (NOT) - 次高优先级 & (AND) - 再次 , (OR) - 最低优先级 示例 多个表格条件组合 ``` ``` seed 和 cell 混合条件 ``` <if cond="!seed:安全 & cell:状态表/主角/生命值 <= 30"> 危险!你的生命值很低! ``` 括号分组控制优先级 ``` ``` 取反条件 ``` <if cond="!seed:安全 & cell:生命值 <= 30"> 危险!不在安全区域且生命值很低! 既不在战斗中,也不在休息。 ``` else 的含义 else 表示整个条件表达式不满足时显示的内容: 计算变量功能 【新增】 概述 计算变量功能允许对表格数值进行四则运算和多值比较,结果存储为临时变量,可在后续条件判断或文本中引用。 语法 1. 计算变量(calc) 对多个数值进行四则运算。 <calc id="变量名" expr="计算表达式" /> 支持的运算符: | 运算符 | 说明 | 示例 | |--------|------|------| | + | 加法 | cell:A + cell:B | | - | 减法 | cell:A - cell:B | | * | 乘法 | cell:A * 2 | | / | 除法 | cell:A / 10 | | % | 取模 | cell:A % 100 | | () | 括号 | (cell:A + cell:B) * 2 | 示例: ``` 好感度差额:$calc:好感差额 ``` 2. 最大值变量(max) 取多个值中的最大值。 <max id="变量名" values="值1, 值2, 值3, ..." /> 示例: ``` 最高好感度:$max:最高好感 ``` 3. 最小值变量(min) 取多个值中的最小值。 <min id="变量名" values="值1, 值2, 值3, ..." /> 示例: ``` 最低属性值:$min:最低属性 <if cond="min:最低属性 < 10"> 你有一项属性过低,需要加强训练。 ``` 引用方式 values 支持的引用类型 <max> 和 <min> 的 values 属性支持以下引用: 示例: ``` ``` 失效处理 当变量定义失败时(如引用的单元格不存在),该变量不会被定义。引用该变量的条件块会被整体屏蔽,AI 不会看到该内容。 ``` ``` 完整示例 ``` 📊 属性分析 - 力量差额:$calc:力量差额 - 最高属性:$max:最高属性 - 最低属性:$min:最低属性 你的力量不如敌人,需要智取。 ``` 与原有语法的对比 之前(繁琐的嵌套写法): <if seed="战斗"> <if cell="状态表/主角/魔力值 > 30"> <if cell="关系表/陈默/好感度 > 50"> 战斗中,魔力充足,陈默愿意帮助你。 <else> 战斗中,魔力充足,但陈默对你冷淡。 </if> <else> 战斗中,魔力不足。 </if> </if> 之后(简洁的单行写法): <if cond="seed:战斗 & cell:状态表/主角/魔力值 > 30 & cell:关系表/陈默/好感度 > 50"> 战斗中,魔力充足,陈默愿意帮助你。 </if> <if cond="seed:战斗 & cell:状态表/主角/魔力值 > 30 & cell:关系表/陈默/好感度 <= 50"> 战斗中,魔力充足,但陈默对你冷淡。 </if> <if cond="seed:战斗 & cell:状态表/主角/魔力值 <= 30"> 战斗中,魔力不足。 </if> else 分支 当条件不满足时,可以显示备选内容: <if seed="战斗"> 战斗场景内容 <else> 非战斗场景内容 </if> <if cell="状态表/主角/魔力值 > 30"> 魔力充足,可以施放高级魔法。 <else> 魔力不足,只能使用普通攻击。 </if> 嵌套条件 条件可以嵌套使用,实现更复杂的逻辑: <if seed="战斗"> <if cell="状态表/主角/魔力值 > 30"> 你施放了一个强大的魔法攻击! <else> 魔力不足,你只能使用普通攻击。 </if> <else> <if seed="休息"> 你找了一个安静的地方休息。 <else> 你继续探索这个区域。 </if> </if> 注意:嵌套深度有限制,建议不超过 5 层。 完整示例 示例1:根据场景类型显示不同内容 ``` 场景描述 ## 战斗场景 当前处于战斗状态,请描述你的战斗行动。 <if cell="状态表/主角/生命值 <= 30"> ⚠️ 警告:你的生命值较低! ## 商店场景 你可以购买或出售物品。 ## 探索场景 你正在探索这个区域。 ``` 示例2:根据角色状态显示人设 ``` 角色状态 <if cell="属性表/陈默/堕落值 <= 10"> ## 阶段1:迷茫的旁观者 陈默保持着纯真的心态,对世界充满好奇。 <if cell="属性表/陈默/堕落值 <= 30"> ## 阶段2:初涉黑暗 陈默开始感受到内心的变化。 <if cell="属性表/陈默/堕落值 <= 60"> ## 阶段3:黑暗觉醒 陈默的内心逐渐被黑暗侵蚀。 ## 阶段4:堕落完成 陈默已经完全堕入黑暗。 ``` 示例3:复杂条件组合 ``` 剧情分支 你尝试施放魔法,但魔力不足,效果大打折扣。 敌人追上了你,战斗无法避免。 平静的时光流逝... ``` 与 st-prompt-template 的关系 数据库插件的条件模板功能与酒馆的 st-prompt-template 插件协同工作: 处理顺序:提示词先经过 st-prompt-template 处理(EJS 语法),再由数据库的条件模板处理(<if> 语法) 功能互补: st-prompt-template:处理 <% %> EJS 语法,可访问酒馆变量系统 数据库条件模板:处理 <if> 语法,可访问数据库表格数据 示例:两者配合使用 ``` <%# 先由 st-prompt-template 处理 EJS 语法 %> <% if (getvar("some_var") === "value") { %> 这里的内容会先被 EJS 处理 <% } %> <%# 再由数据库条件模板处理 %> 这里的内容会被条件模板处理 ``` 注意事项 标签闭合:所有 <if> 标签必须正确闭合 </if> 大小写敏感:关键词匹配不区分大小写,表格名/行名/列名区分大小写 数值类型:表格数值比较时,非数值内容会被视为 0 性能考虑:复杂的嵌套条件可能影响处理速度,建议控制嵌套深度 错误处理:语法错误时,整个 <if> 块会被保留原样输出 调试技巧 检查控制台日志,查看条件匹配结果 使用简单的测试条件验证功能是否正常 逐步添加复杂条件,确保每一步都正确工作 随机数生成详解 基本语法 <random min="最小值" max="最大值" /> 功能说明 在提示词处理时生成一个指定范围内的随机整数 生成的随机数会替换整个 <random> 标签 随机数在每次剧情推进时重新生成 新增:支持 id 属性存储随机数变量,可在条件中引用 随机数变量(id 属性)【新增】 使用 id 属性可以将随机数存储为变量,在后续文本或条件中引用: ``` 🎲 事件随机数:$random:event ⚔️ 攻击骰子:$random:dice ``` 注意:带 id 的 <random> 标签不会在原位置显示随机数,需要用 $random:id 引用。 随机数条件判断(random: 前缀)【新增】 在统一条件表达式中,可以使用 random: 前缀进行随机数条件判断。 格式1:引用随机数变量 ``` ❌ 骰子点数不大于4,攻击失败。 ``` 格式2:内联随机数 直接在条件中生成随机数并判断,无需预先定义: ``` <if cond="random:1-100 <= 10"> ⚠️ 触发重大意外事件! ✨ 平稳推进。 ``` 使用场景 1. 随机事件判定 ``` 随机事件判定 🎲 本轮随机数:$random:event <if cond="random:event <= 10"> ⚠️ 触发重大意外事件(如敌人突袭、自然灾害) <if cond="random:event <= 30"> 📊 触发小波折(如物品损坏、NPC拒绝) ✨ 平稳推进,无特殊事件 ``` 2. 骰子模拟 ``` 🎲 D20: 🎲 3D6: + + ⚔️ 攻击检定:$random:attack ❌ 未命中。 ``` 3. 随机选择 ``` 随机选项编号: 随机选项:$random:choice 选项A:前往森林 选项B:前往城镇 选项C:留在原地 选项D:返回营地 ``` 4. 与其他条件组合 ``` ❌ 战斗中,骰子点数低,攻击失败。 ⚔️ 不在战斗中。 ``` 处理顺序 提示词处理的完整顺序: EJS 渲染(st-prompt-template) 占位符替换($变量) 随机数生成(<random> 标签,存储变量) 随机数变量替换($random:id 引用) 条件模板解析(<if> 标签,支持 random: 条件) 示例:完整的随机事件系统 ``` 📜 第X幕:[场景名] 【随机事件判定】 🎲 本轮随机数:$random:event <if cond="random:event <= 10"> ⚠️ 建议触发重大意外(如敌人突袭、自然灾害) <if cond="random:event <= 30"> 📊 建议触发小波折(如物品损坏、NPC拒绝) ✨ 平稳推进,无特殊事件 ```

说明补充:

1.中途加的分阶段怎么办?

  • 确认处理完上面内容后,在《数据库》第一页 单独、从头 更新该表格。
  • 不会的话 中途用数据库 (点击)

② 我可不可以用预设和推进功能加强效果?(超级进阶)

  • 可以的,可以在酒馆预设条目把<IF>语法整个放进去,也可以修改推进思维链更契合你的作品

(建议直接复制黏贴修改作者 @Albus 的角色卡自带的思维链)

ST《数据库》教程