带上你的酒馆卡
把你的酒馆卡带过来
你手里存着一堆角色卡和世界书。这一页讲清楚它们丢进 Loreweaver 之后会发生什么:什么能导入、什么真的能跑,以及哪些地方会和酒馆里不一样——因为卡现在活在一个掷真骰子的游戏引擎里。这是写给卡作者和卡玩家的;背后面向贡献者的完整契约在 plugins.md。
一句话总结:卡和世界书原样导入,不需要转换;卡里依赖的变量、模板、触发机制都能跑——跑在一个掷真骰、校验每个数值的引擎里。
先记住一个概念:Loreweaver 会拆卡。酒馆的「重卡」把角色和一整个世界捏在一张卡里——钩子脚本、变量架构、可执行模板——那是单人架构下没地方放的无奈。在这里它们是两个工件:人物半(人设、记忆、能力、一张车卡),任何玩家都能导入;世界半(那些机制),只有房间的守秘人能导入,因为它重编程的是整桌人的游戏。两种情况你的卡都不会被拒——只是被拆开。
什么能导入
- 角色卡——SillyTavern V2/V3(
chara_card_v2/chara_card_v3),JSON 或内嵌chara块的 PNG 都行。会读取的字段:name、description、personality、scenario、first_mes、mes_example、system_prompt、post_history_instructions、alternate_greetings、tags、creator、character_version、character_book、extensions。不认识的字段忽略、不报错——新版本酒馆导出的卡照样能进。 - 世界书——卡内嵌的
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 之后生效;人物导入不携带其中任何一项。)
- 世界书触发语义。 主
keys;secondary_keys的全部四种选择逻辑(AND ANY / AND ALL / NOT ANY / NOT ALL);probability——由真代码掷出来,不是嘴上说说;大小写敏感与整词匹配;scan_depth窗口;position排序桶;计时效果——sticky、cooldown、delay——挂在按房间的回合计数器上;分组抽选(按权重,每组每回合只出一个);带预算的插入。 - MVU 协议端到端。 卡自带的脚手架条目按普通 lore 导入,模型输出
<UpdateVariable>块,引擎用真代码解析——五种操作(set/insert/delete/add/move)全支持——应用到变量树,并把这些块从玩家可见的叙事里剥掉。带 schema 校验的工具调用(set_stat/adjust_stat/get_stat)是通往同一棵树的首选通道。 - 完整 EJS——真 JavaScript。 装了
ejsextra(默认开启)后,世界书和卡内容经官方 EJS 库 + lodash 在内嵌 QuickJS 沙箱里渲染:循环、函数、await、lodash 链、任意 JS 的@@if条件、setvar/incvar(先缓冲,渲染后由引擎代码统一应用)、getwi/activewi、injectPrompt、execvar。信任模型和酒馆本身一致:你的机器,你的卡。 - 宏。
{{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——在真实客户端里画进度条、徽章和选项按钮。 - 没装
ejsextra 时(或设了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。