带上你的酒馆卡

把你的酒馆卡带过来

目录
  1. 什么能导入
  2. 怎么导入
  3. 什么真的能跑
  4. 这里有什么不一样(排查问题前先读这段)
  5. 导入信任边界

你手里存着一堆角色卡和世界书。这一页讲清楚它们丢进 Loreweaver 之后会发生什么:什么能导入、什么真的能跑,以及哪些地方会和酒馆里不一样——因为卡现在活在一个掷真骰子的游戏引擎里。这是写给卡作者和卡玩家的;背后面向贡献者的完整契约在 plugins.md

一句话总结:卡和世界书原样导入,不需要转换;卡里依赖的变量、模板、触发机制都能跑——跑在一个掷真骰、校验每个数值的引擎里。

先记住一个概念:Loreweaver 会拆卡。酒馆的「重卡」把角色和一整个世界捏在一张卡里——钩子脚本、变量架构、可执行模板——那是单人架构下没地方放的无奈。在这里它们是两个工件:人物半(人设、记忆、能力、一张车卡),任何玩家都能导入;世界半(那些机制),只有房间的守秘人能导入,因为它重编程的是整桌人的游戏。两种情况你的卡都不会被拒——只是被拆开。

什么能导入

  • 角色卡——SillyTavern V2/V3chara_card_v2 / chara_card_v3),JSON 或内嵌 chara 块的 PNG 都行。会读取的字段:namedescriptionpersonalityscenariofirst_mesmes_examplesystem_promptpost_history_instructionsalternate_greetingstagscreatorcharacter_versioncharacter_bookextensions。不认识的字段忽略、不报错——新版本酒馆导出的卡照样能进。
  • 世界书——卡内嵌的 character_book,或独立的世界书 JSON。V2 的 character_book 字段名和酒馆原生 world-info 字段名都认。
  • MVU 变量——[InitVar] / [InitialVariables] / @@initial_variables 条目在世界导入时被读进按房间隔离的变量树(容忍 JSON5、支持中文嵌套路径、[值, "说明"] 叶子)。它们按数据处理,不算 lore——不占提示词预算,而且重新导入同一张卡绝不会重置房间已有的变量进度
  • 钩子——卡可以带 extensions.loreweaver_hooks:挂在回合生命周期上的沙箱 JavaScript,在世界导入时安装。这是 Loreweaver 自己的扩展点(Tavern Helper 的思路,由引擎校验落地),见 hooks.zh.md

怎么导入

  • 在终端客户端里: 建卡有四条路——掷骰、手填、AI 起草、导入卡。不管走哪条,最后的卡面都要过当前规则系统的校验;数值不合规则包的卡会被修正,不会蒙混过关。
  • 用命令: .import <卡文件> [coc7|dnd5e] [pc|companion|world]
  • pc(任何玩家,走房间附件)和 companion(仅守秘人)取的是人物半。卡里如果还带着世界机制,导入会剥掉它们并逐项告诉你剥了什么——卡照样能当角色用,提示信息会给守秘人指向世界半。
  • world仅守秘人)一步导入整个模组:机制半——完整世界书按守秘人信任级进入、[InitVar] 注入变量树、钩子装进房间——加上人物半:它会进入房间的预设角色池,成为一张过了规则校验的待认领 PC。卡片的散文(简介、情境设定、原作开场及替代开场)会被拷贝进一份仅守秘人可见的模组简报,守秘人用 module_brief 工具随时读回——模组自己写的开场从此可以在桌上被引用,而不是在导入时蒸发。玩家用 .pc list / .pc claim <名字> 挑角色(认领互斥;.pc release 释放后下一位从净卡开始)。想要同一角色的 AI 扮演版,.import <文件> companion 依然可用。
  • 从服务器路径(而非房间附件)导入,任何模式都仅限守秘人。独立世界书用 .lore import <文件>(仅守秘人)。
  • 随内容包: 卡和世界书可以装进 .lwpack 内容包——python -m app --install gh:owner/repo——和技能、规则包、素材一起走(见 plugins.md)。

什么真的能跑

导入的卡不只是贡献文案——机制是真的在转,账由确定性代码来记。(本节说的全部是世界半,在守秘人 .import <文件> world 之后生效;人物导入不携带其中任何一项。)

  • 世界书触发语义。keyssecondary_keys 的全部四种选择逻辑(AND ANY / AND ALL / NOT ANY / NOT ALL);probability——由真代码掷出来,不是嘴上说说;大小写敏感与整词匹配;scan_depth 窗口;position 排序桶;计时效果——stickycooldowndelay——挂在按房间的回合计数器上;分组抽选(按权重,每组每回合只出一个);带预算的插入。
  • MVU 协议端到端。 卡自带的脚手架条目按普通 lore 导入,模型输出 <UpdateVariable> 块,引擎用真代码解析——五种操作(set / insert / delete / add / move)全支持——应用到变量树,并把这些块从玩家可见的叙事里剥掉。带 schema 校验的工具调用(set_stat / adjust_stat / get_stat)是通往同一棵树的首选通道。
  • 完整 EJS——真 JavaScript。 装了 ejs extra(默认开启)后,世界书和卡内容经官方 EJS 库 + lodash 在内嵌 QuickJS 沙箱里渲染:循环、函数、await、lodash 链、任意 JS 的 @@if 条件、setvar/incvar(先缓冲,渲染后由引擎代码统一应用)、getwi/activewiinjectPromptexecvar。信任模型和酒馆本身一致:你的机器,你的卡。
  • 宏。 {{user}}(当前 PC,渲染时解析)、{{char}}{{time}} / {{date}}{{roll:XdY}}{{random}}{{pick}}{{newline}}{{// 注释}}{{getvar::}} / {{var:}}。写给作者的注记:{{random}}/{{pick}}(以及 lore 的 probability 掷点)用真代码随机数,但按(房间,回合)播种——不同回合各自随机,重放同一回合(重试、撤销回放)会得到相同的选取,模型看到过什么永远可以复原。两类掷点用互不相干的流:多加一个 {{random}} 宏不会改变哪些概率条目触发。
  • 状态量面板由守秘人自己挑。 你卡里的变量树是模组状态,重卡在树里藏剧情暗标是常规操作——所以叶子默认不进任何玩家面板,直到守秘人公开它们:.var expose <前缀|*> 把一条路径(连同子树)放上队伍面板,.var hide 收回,.var list 看整棵树和可见性标记。守秘人自己的面板永远显示全部(隐藏叶子带标记)。记得告诉用户该公开哪些前缀——或者直接写进内容包里该卡的 notes

这里有什么不一样(排查问题前先读这段)

Loreweaver 是游戏引擎,不是聊天前端。所有差异都从这一点来:

  • 骰子是真的。 {{roll:XdY}} 由骰子引擎掷出;检定走规则代码结算。卡不能把结局预先写死(「这一击命中了」)——引擎先掷骰,模型只负责把结果讲成故事。
  • 角色数值要过校验。 导入的卡会变成当前规则系统(CoC 7 版或 D&D 5e SRD)里的一张真卡,由规则包钳位、校验。
  • {{char}} 在导入时绑定——卡的角色身份不会漂移。{{user}} 保持动态(渲染时是谁的 PC 就是谁)。
  • {{time}} / {{date}} 是游戏内时钟,不是现实时间。你写的「午夜」在故事里的午夜触发。
  • faker 是空实现(返回空字符串并记一条警告)——不确定的随机文案和可复现的跑团冲突,而且很少真正承重。
  • @INJECT 消息位置注入无效。 Loreweaver 用自己的 prompt builder 组装单一系统提示词,没有可以按下标插入的客户端消息数组。
  • 状态栏/渲染类条目导入后是禁用状态。 [RENDER:*]@@render_*@@iframe 是前端特性,在服务端没有意义;这些条目会保留但禁用,绝不进提示词。替代品是内置的状态量面板和钩子emitUI——在真实客户端里画进度条、徽章和选项按钮。
  • 没装 ejs extra 时(或设了 TRPG_ENABLE_FULL_EJS=false,或模板抛错时),渲染回退到安全的 EJS 子集:<% if / else %> 链、<%= %> 输出、getvar() / variables.路径 读取、{{getvar::}} 宏、@@if 条件。子集是只读的(模板里的 setvar 在那里不生效),而且两头都兜底:原始模板语法永远不会漏给模型。
  • 沙箱事实(完整模式):每回合一个全新解释器——没有跨回合、跨房间状态;硬内存上限和单次求值时限(死循环会超时,不会挂掉服务器);零宿主 I/O;每回合模板写入有上限。

导入信任边界

导入的文件没资格给自己挑权限:

  • 拆卡是结构性的。 玩家的人物导入装不了钩子、种不了变量树、落不下可执行模板——机制在触碰房间状态之前就被确定性代码剥掉,不是靠提示词过滤。只有守秘人的 world 导入能把它们带进来。
  • 只在导入它的那个房间里有效——卡写不了全局设定。
  • constant 一律强制关闭,对谁都一样。always-on 条目会让任何一张卡永久占据提示词;导入的 lore 和其他条目一样靠关键词和预算激活。
  • secret 只在守秘人亲自导入时生效——不受信的卡造不出「仅守秘人可见」的 lore。
  • 条目 id 重新生成,卡没法定位(进而覆盖)另一张卡的条目。
  • 重新导入是替换该卡的钩子和条目,不会叠加出重复——并且如上所述,绝不重置变量进度。(替换按导入出处匹配,出处自 2026-08-15 起落档:在此之前导入过 lore 的房间,第一次重导入会再叠一层,此后永远替换。仅限守秘人导入——玩家的卡导入永远是纯增量,伪造同名卡无法顶掉模组的 lore。)

开着完整 EJS 时,世界内容就是在上述沙箱里跑代码——这正是设计意图,也是知情后自己做的决定:「你的机器,你的卡」这句话的主语是守秘人,说的是守秘人自己的桌子——这正是世界半必须经守秘人之手的原因。想要纯数据姿态的话,设 TRPG_ENABLE_FULL_EJS=false 或不装 ejs extra。