Skip to content

内容包维护工具使用说明

面向策划。日常改卡、改状态、改职业和装备,只用这一份。
积木「能表达什么」的白话对照见 Docs/策划能力词典.md。程序核对用的英文合同见 Docs/内容能力词典.md

当前正式工具是 Electron + Vue 3 + Element Plus 桌面程序。旧的 .NET / WPF 工具已废弃,不要再用。


1. 工具在整条流水线里干什么

策划改的永远是 内容数据库,不是 Unity 场景里的 JSON。

位置是什么谁改
ContentSource/lof-content.db唯一权威编辑源(SQLite)本工具保存时写入
ContentSource/Backups/每次保存 / 删除 / 发布的时间戳备份工具自动
Assets/StreamingAssets/Content/编译后的只读包(catalog.json 等)发布到 Unity 才更新
Assets/Resources/CardArt/卡面图片文件工具导入卡图时复制

不要用手改 catalog.json。改了也不会进数据库,下次发布还会被覆盖;校验哈希对不上时游戏会拒绝加载。

工作顺序永远是:

  1. 在工具里改
  2. 保存(写入数据库)
  3. 验证整库(零 ERROR
  4. 发布到 Unity
  5. 回 Unity 等资源刷新,进战斗点一遍

只保存、不发布:游戏里还是旧包。


2. 怎么打开

本机有完整工程时,任选一种:

  • 双击 Tools/启动卡牌维护工具.cmd
  • Unity 菜单:Tools → Legends Of Furry → 打开卡牌维护工具

要给没有工程的电脑体验:在开发机双击 Tools/打包内容编辑器给策划.cmd,把生成的整个 Tools/PlannerOfflineKit 文件夹拷走,双击其中的 StartEditor.cmd。脱机包可以改库并保存;验证 / 发布仍需要完整工程。打包时请先关掉正在运行的编辑器,否则 app.asar 会被占用。

开发调试:Tools/CardEditor.Vue 下执行 pnpm installpnpm dev

窗口标题:Legends of Furry · 内容包编辑器。不要用浏览器打开页面,必须走 Electron。


3. 窗口总览

从上到下四层:

  1. 系统菜单栏(窗口最顶,Windows 原生菜单)
  2. 工具栏(深蓝条:新建 / 保存 / 验证 / 发布 / 版本号)
  3. 内容分区菜单(白底横条:卡牌、状态、职业……)
  4. 工作区(左列表 + 中间属性 + 右面积木/源码)
  5. 状态栏(最底:未保存提示、最近一次操作结果)

3.1 系统菜单

菜单快捷键作用
文件保存Ctrl+S保存当前分区正在编辑的那一条
文件刷新Ctrl+R从数据库重新加载(未保存的改动会丢)
文件退出关闭程序
内容卡牌 / 状态 / 职业 / 角色 / 装备 / 卡池 / 牌库 / 稀有度 / 资源 / 战斗规则切换分区,与横条菜单相同
编辑新建Ctrl+N当前分区新建一条
编辑复制Ctrl+D复制当前条(ID 会加 _copy
编辑删除删除已保存条目;被引用时可能失败
编辑撤销 / 剪切 / 复制文本 / 粘贴针对输入框的系统编辑,不是「撤销整张卡」
发布验证整库跑内容编译器,问题出现在「校验问题」页
发布发布到 Unity校验通过后写入 StreamingAssets

3.2 工具栏按钮

按钮作用
新建当前分区新建。卡牌会带安全默认值;稀有度一般不要随便新建
复制深复制当前条,并改写行为里的 ID,避免撞车
保存写入 SQLite。若停在「源码」页,会先尝试把源码应用到积木
删除已保存的才能删。外键挡住时先取消牌库引用或先删引用方
验证整库用权威编译器扫全库
发布到 Unity左边输入框填版本名,默认 development
回退版本右边输入框填已经发布过的版本名,只改 current.json 指针
刷新放弃界面未保存改动,从数据库重读

版本名只能用字母、数字、点、横线、下划线。

状态栏出现 「● 未保存」 表示当前卡牌(或当前分区对象)改过还没点保存。


4. 稳定 ID 规则(所有分区通用)

稳定 ID 是程序认的名字,保存后不能改。要换 ID 就「复制」再删旧的。

必须:

  • 以小写英文字母开头
  • 只含小写字母、数字、._-
  • 例如:sword_thrustsharpwarrior

不要用中文、空格、大写。显示给玩家看的字写在「名称」「描述」里。


5. 分区:卡牌

横条点「卡牌」。这是最常用的一页。

5.1 左侧列表

  • 搜索:按 ID 或中文名过滤。
  • 分组方式:
    • 按类别分组:用卡上的「类别/家族」字段(familyId)。常见值见下表。
    • 按卡池分组:用「卡池 ID」;空的进「未入卡池」。
    • 按稀有度分组:灰 / 蓝 / 紫 / 金 / 红。

分组可以折叠。点一条进入编辑。

类别/家族常用值(填英文键,列表里显示中文):

列表里怎么显示典型用途
none基础爪击、疾走、格挡、包扎
sword武器从属
shield副手从属
bow
staff法杖
scepter手杖
dagger匕首
necklace / crystal / crystal_ball / cross / cloak对应饰品装备从属
equipment装备泛装备
test测试临时试验

可以写尚未出现在上表的新家族,列表会原样显示键名。

5.2 基础属性

字段说明
稳定 ID见第 4 节。已保存后锁定
卡牌名称战斗和选牌里显示的中文名
描述给玩家看的规则说明。这里写人话;真正结算看积木,不要只改描述指望游戏变效果
稀有度gray 灰、blue 蓝、purple 紫、gold 金、red 红。红多用于诅咒
类别/家族见上表,用于分组和查询
卡池 ID加入哪个抽取池。空 = 不进任何池。武器从属一般填 swordbow 等与武器对应的池
标签可多选、可手打新标签。常用 attack(攻击牌)。查询积木「卡有标签」会读这里
卡图资源 Key一般导入图片后自动填,形如 card.sword_thrust.artwork
加入策划测试牌库勾选后这张会出现在固定牌库 planner_test,方便进战斗全卡测试

卡图:

  • 把一张 PNG / JPG / JPEG 拖进虚线框,或点「选择 / 更换卡面…」
  • 建议竖版、最长边不超过 2048、透明用 PNG
  • 文件复制到 Assets/Resources/CardArt,旧图备份到 ContentSource/Backups/Artwork
  • 一次只能拖一张。导入后仍要点 保存,发布后 Unity 才会用新图
  • 不要在资源管理器里重命名已导入的图

5.3 费用

字段说明
行动力打出时扣的行动力,整数 ≥ 0
魔力打出时扣的魔力
消耗全部行动力打出时把当前剩余行动力花光(连斩类)
消耗全部魔力同上,针对魔力

「积木里的数值」和「费用」是两件事:费用在打出前扣;积木里「这次花掉的行动力」读的是本次实际支付。

5.4 卡牌标记(勾选)

勾选含义
攻击牌记为攻击;部分被动/问询只对攻击生效
打出后消耗打出进消耗库,本场不洗回抽牌库
临时牌战斗结束不回总牌库
诅咒诅咒标记
无法打出不能主动打出(纯触发/诅咒常用)
启用关掉等于这张不进发布内容(仍留在库里)

5.5 主目标(打出时玩家怎么点)

这是卡面点选规则,不是积木里「挨个」找人。

字段选项含义
选择模式none 不用点打出即结算,目标多用「自己」
self 自己目标锁定出牌者
unit 单位玩家点一个单位
cell 格子玩家点棋盘一格
direction 方向玩家选一个方向(劈砍、穿云)
距离整数格能点多远。0 通常配合自己
阵营any 任意 / ally 友方 / enemy 敌方谁能被点
生死any / alive 活着 / dead 已死复活牌用 dead
需要视线勾选则中间不能被挡
允许自己点选单位时能不能点自己

劈砍这类「面前一排」:选择模式用 direction,积木里再用「挨个 → 面前一片」,效果目标选「当前这个」。不要指望在「造成伤害」的「对谁」里直接选所有敌人。


6. 积木画布(卡牌 / 状态 / 职业 / 角色 / 装备共用)

右侧三个页签:积木源码校验问题

旧界面里的「简易效果 / 高级行为树」已经合并成这一套 Scratch 式积木。有「如果 / 重复 / 挨个」直接拖结构积木,不必换页。

6.1 积木盒(左)

四类,全部只能拖现成积木,不能写脚本。

时机(帽子)
拖到画布空白处,新建一条脚本。一条内容可以有多条时机。

结构
顺序、如果、重复、挨个。拖进某条脚本的蓝色凹槽。

效果
真正改生命、护甲、手牌的那一步。

判断
给「如果」用的条件。拖进去会变成一块「如果:某某」。

搜索框按中文名或英文键过滤。

6.2 画布(中)

  • 黄帽子 = 时机。点帽子可以在右侧改时机种类。
  • 蓝条 = 这条时机下面要做的事。把积木拖进「拖到这里」。
  • 点积木选中(白边),右侧改参数。
  • 已有积木可以拖到别的凹槽里排序或换父节点。不能拖进自己的内部(会成环)。
  • 帽子(根顺序)不能拖到空白处丢掉。
  • 「删除这块积木」会连子积木一起删。

每条时机最外面必须是一个顺序(工具会自动建根顺序,一般不用单独拖「顺序」,除非要在里面再套一层)。

「如果」有两个嘴:

  • :条件成立
  • 否则:不成立;可以空着

「重复」「挨个」只有一个嘴,里面的事会对每一次循环执行。

6.3 积木属性(右)

点不同积木,右侧字段会变。

积木类型右侧主要填什么
帽子(根)时机
效果做什么、对谁、数值;伤害还有伤害类型;上状态要填状态 ID
如果判断种类
重复重复次数(目前属性面板按固定整数编辑)
挨个找出哪一群人/牌、范围(格)

属性面板覆盖不了的复杂参数(动态公式、多条件 JSON)到 源码 页改嵌套 JSON,再点「应用到积木」。

常见伤害类型:normal 普通、fire 火、ice 冰、lightning 雷、light 光、dark 暗、poison 毒、true 真实。暗、毒、真实穿护甲。

效果上「对谁」目前下拉只有三种:self 自己、selected_unit 点选单位、current_graph_target 当前这个(挨个循环里正在处理的那一个)。一片人请用「挨个」,不要在单次伤害上选全场。


7. 时机一览

可打出的卡至少要有一条启用的「打出时」,否则验证会报没有入口。

7.1 事件类(做完一件事)

界面名称英文键什么时候跑典型用途
打出时on_play费用扣完、牌打出绝大多数卡
抽到时on_draw从抽牌库进手的瞬间反噬
加入手牌时on_added_to_hand抽到、生成到手都算入手提示
留在手牌且回合结束时on_turn_end_in_hand回合结束这张还在手上碎裂类诅咒
单位回合开始时on_unit_turn_start这个单位回合刚开始回魔、上buff跳字
单位回合结束时on_unit_turn_end这个单位回合结束中毒跳伤、盾牌加甲
状态层数变化时on_status_changed某状态加上或去掉职业「受到负面获得锋利」
使用职业主动技时on_activated_ability点了职业主动按钮牧师祈福

合同里还规划过弃牌时、消耗时、击杀时、战斗开始时等,当前游戏未接线。积木盒里没有就不要造;硬写源码也会在验证时报尚未实现。

7.2 问询类(游戏正在问一个数字或能不能做)

状态、职业、装备的被动常用。帽子选「问询:……」,里面用「修改问询数值」或「取消这次问询」。

界面名称英文键游戏在问什么
问询:打出的攻击伤害query_outgoing_attack_damage我打出去的攻击伤害是多少
问询:受到的伤害query_incoming_damage我挨的这下是多少
问询:攻击之后query_after_attack打完这一下之后(例如锋利掉一层)
问询:攻击段数query_attack_hit_count这一次攻击打几下
问询:获得护甲query_armor_gain这次加多少护甲
问询:护甲是否保留query_armor_retention护甲留不留到下回合
问询:行动力上限query_maximum_action_points本回合行动力上限
问询:可走步数query_move_steps能走几格
问询:回魔query_mana_gain这次回多少魔
问询:能否打出这张牌query_can_play_card这张能不能打
问询:能否行动query_can_take_turn这个单位这回合能不能动

8. 结构积木

界面名称英文键干什么
顺序sequence从上到下做完里面所有事
如果condition判断成立走「则」,否则走「否则」
重复repeat里面的事做 N 次。N 在右侧填整数;要「花掉的行动力次」请改源码里的 count 表达式
挨个foreach先找出一群,对每一个执行里面的事
效果effect真正改数值的一步

连斩正确拼法:打出时 → 重复(次数 = 已花行动力,源码)→ 造成伤害。
刺击:顺序 → 伤害 4 → 如果「目标有护甲」则再伤害 2。
劈砍:打出时 → 挨个「面前一片」→ 伤害,目标「当前这个」。


9. 效果积木

右侧「做什么」下拉。键名也会显示在源码里。

9.1 打和奶

名称要点
造成伤害damage填数值、伤害类型、对谁
治疗heal不超过生命上限
获得护甲gain_armor
复活revive目标应能点到死者
击退knock_back往远离你的方向推一格

9.2 状态(卡上只负责上/改/摘,状态怎么跳伤害在「状态」分区配)

名称要点
添加状态add_status填状态 ID、层数
设置状态set_status层数改成指定值
减少状态reduce_status
移除状态remove_status去掉这一种
清除状态clear_statuses按正面/负面/全部清一批(复杂参数走源码 mode
消耗自己的状态consume_owner_status结算时吃掉自己身上某状态
转化自己的状态transform_owner_status一种变成另一种

状态 ID 必须是「状态」分区里已有的,例如 poisonsharp。填错会在验证时报引用不存在。

9.3 行动力与魔力

名称
修改行动力modify_action_points(正加负扣)
修改行动力上限modify_max_action_points
修改魔力modify_mana
消耗资源spend_resource
开始免费移动begin_free_move
结束回合end_turn

9.4 牌

名称注意
抽牌draw_cards
生成卡牌generate_card条件、放到哪个牌区,多在源码里配
移动卡牌move_cards
按条件移除卡牌remove_cards_by_query
修改卡牌数值modify_card_runtime_value给这张卡记一个临时数
查看牌顶并弃牌reveal_top_cards_and_choose_discard会暂停战斗等玩家点
免费打出牌顶play_top_cards_for_free同上,必须进游戏点一遍

9.5 改规则(被动)

名称
修改问询数值modify_query_value
取消这次问询cancel_query

必须挂在对应的「问询:……」帽子下,否则改的不是那一次提问。

9.6 表现

名称
播放特效play_vfx
播放音效play_sfx
无操作no_op

表现失败不影响结算。占位卡可以用无操作。


10. 判断积木(给「如果」用)

名称说明
全部成立all组合多条,复杂结构走源码
任一成立any
不成立not把结果取反
目标活着target_is_alive
目标已死target_is_dead复活
目标是自己target_is_self
目标阵营是target_team_is源码里补阵营参数
目标有护甲target_has_armor刺击
目标有状态target_has_status右侧填状态 ID
卡有标签card_has_tag
卡在卡池card_in_pool
卡稀有度是card_rarity_is
这张卡击杀了目标target_killed_by_this_card必须写在伤害之后
造成了伤害damage_was_applied没被完全免疫
生命伤害大于health_damage_greater_than
资源 / 生命 / 护甲比较resource_compare比较符和阈值走源码
已花行动力 / 魔力比较spent_action_compare
随机概率random_chance0~100,10 = 一成

「目标有某单位标签」游戏侧未接完,先不要当正式规则。


11. 「挨个」选谁

拖「挨个」后,右侧「挨个选谁」:

名称说明
自己self
点选单位selected_unit
点选格子selected_cell
点选周围单位units_around_selected方形范围,含对角线
曼哈顿范围内单位units_in_manhattan_range上下左右走几步;右侧「范围」
该方向上的单位units_in_direction直线,穿云箭
面前一片单位units_in_front_area劈砍 1×3,会友伤
全部友方 / 敌方 / 单位all_allies / all_enemies / all_units
当前这张卡current_card对牌自己动手
手牌 / 抽牌库 / 弃牌堆 / 消耗堆cards_in_hand挪牌、删牌

循环里的效果,「对谁」选 当前这个


12. 源码页

给会看 JSON 的人,或属性面板填不下的公式。

  • 行为脚本:嵌套数组,和积木一一对应。改完点「应用到积木」。
  • 整卡 JSON(仅卡牌页):基础字段 + behaviors。不要删 cardId
  • 非法 JSON 会显示红字,不会写进数据库。
  • 数字公式示例(连斩次数):
json
"params": {
  "count": { "kind": "spent_action_points" }
}

固定数字:

json
"amount": { "kind": "constant", "value": 4 }

表达式种类的完整清单见能力词典第 8 节(constantspent_action_pointsadd 等)。不要在描述里写公式当数据。


13. 分区:状态

状态是「挂在单位身上的层数」,卡牌只负责上/改/摘。中毒怎么跳伤害、锋利怎么加伤,配在状态自己的积木上。

字段说明
稳定 ID卡牌「状态 ID」必须填这个
名称 / 描述给玩家看
类别neutral 中性、positive 正面、negative 负面。驱散「清负面」看这个
最大层数0 表示不限制。寒冷叠满变冻结时会用到上限
叠层规则add 加上去、set 改成指定值、ignore 已有则不再加
持续规则none 不按回合掉、turns 按回合、combat 打完这场清
启用关掉则发布时不算这状态
积木通常用「单位回合开始/结束」或「问询:……」

例子:锋利 = 问询打出的攻击伤害 → 修改问询数值 +1,再在「问询:攻击之后」减一层。


14. 分区:职业

字段说明
稳定 IDwarriormage
初始生命 / 初始魔力 / 魔力上限开战数值
排序选职业界面顺序
起始牌库配方每一行:从哪个卡池抽几张;固定卡 ID 可空。当前战斗开局还会根据装备特性往牌库塞武器从属(见工程内牌库规则文档)
特性键值对,程序按键读取

常用特性键(值按现有职业填写):

含义示例值
equipment_weapon_id默认主手装备 IDsword 或具体装备 id
equipment_offhand_id副手
equipment_armor_id护甲槽
equipment_accessory_id饰品
equipment_treasure_id宝物
artwork_key职业立绘资源
uses_mana是否用魔力true / false
activated_ability_id主动技内容 ID
activated_ability_name主动技显示名
activated_ability_description主动技说明
activated_ability_target_range主动技距离整数

职业被动积木:和状态类似,用问询或回合时机,不要写成「打出时」(职业不是一张牌)。


15. 分区:角色

数据驱动的战斗单位模板(玩家/敌人),和场景里的模型是分开的。

字段说明
生命 / 基础伤害 / 移动步数开战底数;战斗规则里还可以再改全局基础移动
标签查询用
积木单位级被动

战斗规则页的「玩家角色 ID / 敌人角色 ID」要指向这里的稳定 ID。


16. 分区:装备与槽位

一件装备 = 一个槽位 + 一个从属卡池 + 可选被动积木。

字段说明
槽位见下表,必须用英文键
关联卡池这件装备的从属牌从哪个池抽。没有这个池时保存会自动登记一个同名空池,但仍应去「卡池」分区把显示名写好,并把从属牌的「卡池 ID」设成同一个
标签查询用

槽位(插槽)

含义设计对应
weapon主手武器单手占主手;双手是否占副手由设计规则解释,程序槽位仍是 weapon
offhand副手盾等
accessory饰品项链等
armor护甲
treasure宝物水晶球等
boot鞋靴

不要自造 mainhand 这类键,验证会当非法槽位。

牌库层面:武器从属进总牌库;非武器装备发鉴定、鉴定产物为临时——这是设计规则。工具里把装备的 cardPoolId 和从属卡的池对齐即可。完整规则表见 Docs/Design/牌库与装备规则表.md


17. 分区:卡池、牌库、稀有度、资源、战斗规则

17.1 卡池

字段说明
稳定 ID卡牌「卡池 ID」、装备「关联卡池」都填这个
名称给策划看
启用 / 排序关掉则不应再被抽到

有卡牌或装备还在引用时,删除会被数据库拦住。

17.2 牌库

固定列表,不是随机池。

字段说明
策划测试牌库勾选表示这是 is_test_deck。卡牌上的「加入策划测试牌库」写入的就是 planner_test 这条
条目每行一张卡 ID + 张数。卡必须已存在

17.3 稀有度

一般只改显示名、颜色、默认权重、排序。
权重与鉴定抽品质有关(灰 0.55、蓝 0.25、紫 0.15、金 0.05;红是另一次独立判定)。不要轻易删 gray 等内置 ID,卡牌外键会挡住。

颜色为十六进制,可带透明度,如 #474C57FF

17.4 资源

登记图片/音效的 Key、类型、相对路径、SHA-256。卡图请优先用卡牌页的拖入导入,让工具写路径和哈希。这里适合核对或修损坏的登记,不负责从磁盘拷文件。

17.5 战斗规则

字段默认理解
手牌上限10
起始手牌5
每回合抽牌5
基础行动力3
基础移动步数2
玩家角色 ID / 敌人角色 ID必须是「角色」分区里的 ID

改完保存,发布后战斗才读新值。


18. 验证、发布、回退、备份

验证整库会列出 [ERROR] / [WARNING] / [INFO]。只有 ERROR 会挡住发布。缺卡图通常是 WARNING,战斗用占位图。

常见 ERROR:

信息里常见片段含义怎么处理
card_has_no_entry_point能打出的卡没有启用的打出时拖一个「打出时」帽子并放效果
unknown_*_reference状态 / 卡 / 池 / 资源 ID 不存在先建状态或改拼写
*_not_executable / 尚未实现选了游戏没接线的能力换已有积木,或找程序加通用积木
invalid_json源码不是合法 JSON 对象用「从积木重新生成」对照
外键 / 仍被引用删不掉先从牌库条目、装备卡池里拿掉引用

发布到 Unity:版本默认 development。成功后去 Assets/StreamingAssets/Content/current.json 看当前指针。回 Unity 等导入完成再进战斗。

回退版本:只切换指针,不删历史目录,也不改数据库。数据库想回去用 ContentSource/Backups 里对应时间的库(让程序操作,不要随手覆盖正在开着的 db)。

保存 / 删除 / 发布都会在 ContentSource/Backups 留备份。


19. 推荐工作习惯

  1. 先写人话:什么时候、对谁、做什么、有没有如果。
  2. 能用顺序效果就不要套三层如果。
  3. 新机制优先复用已有状态(中毒、锋利),不要为了一张卡发明只给它用的程序。
  4. 积木盒没有的效果,找程序加通用积木,加完所有卡都能用。不要为单卡写 C# switch
  5. 勾选测试牌库或放进池,验证零 ERROR,发布,进战斗点一遍。会暂停的效果(看牌顶、免费打出牌顶)必须实机点。
  6. 描述和积木不一致时,以积木为准;记得改描述以免玩家被骗。

20. 和旧说明的差异

  • 没有「简易效果 / 高级行为树」两个设计器了,统一用积木 + 源码。
  • 可以维护状态、职业、角色、装备、卡池、牌库、稀有度、资源、战斗规则,不只是卡。
  • 窗口有系统菜单栏和内容横条。
  • WPF 工具不要用于日常维护。

更短的积木对照表仍在 Docs/策划能力词典.md。本说明以工具界面字段为准。