Files
90CNServer/pvf/docs/skill-tree.md
T
hanfuit 645b64fe21 DNF90 服务端与启动器完整源码(含 GM 工具功能增强)
服务端(Go):
- GM 塞背包/带属性装备发放:在线角色推送 op14 增量物品行,背包实时刷新,无需回角色选择界面
- GM 改金币/改等级:去掉在线拒绝,落库后推送 op14 钱包/op37 等级状态,在线实时刷新
- 等级端点统一切换到新版 GMSetCharacterLevel(自带在线刷新)
- 无限/锁死疲劳模式 + 燃烧疲劳:每房间消耗 2 点、打怪与通关经验双倍
- 燃烧疲劳开关时给所有在线角色推送系统提示(op12 mode 0)
- 深渊史诗掉率:GM 全局倍率 + 城镇增益药剂窗口倍率,真实接入掉落结算

启动器(Python/JS):
- 标题栏自绘、窗口 1204x717、禁止拖拽改大小、仅最小化/关闭
- GM 工具:疲劳与燃烧、深渊史诗掉率、拍卖行上架(单一定价对齐)
- 拍卖行上架前端对齐服务端单一价格语义,修复 400 报错
2026-11-04 14:31:55 +08:00

58 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 技能树工具
入口:打开 PVF 后,在“工具”菜单末尾选择“技能树”。选择职业、转职及 SP / TP;顶部显示该职业的通用技能,点击技能可查看其 `[explain]` 描述(解析字符串引用并保留换行),或打开技能文件。同一坐标的技能合为一个图标,角标标出数量,默认显示文件中靠后的技能,点击后通过右侧列表切换。每个位置的选择在当前归档会话中独立保留,切换技能树或关闭弹窗后仍有效,保留原位置与文件顺序。支持画布缩放,图标复用现有 NPK 图片索引。未配置客户端资源时显示占位图标。
## 数据来源
- `clientonly/skillshoptreespindex.co`、`clientonly/skillshoptreetpindex.co` 的 `[skill tree]` 按职业 token / 相对路径读取,路径相对于 `clientonly/`。
- 树文件中的每个 `[character job]` 独立保留,第二个值 `none` 表示未转职;不将未转职树合并进已转职树。
- 技能定义从 `skill/skilllist.lst` 注册的职业列表查找。ID 属于职业上下文,通用技能也必须通过当前职业的列表解析,不能共用全局 ID 索引。
- `clientonly/commonskilllist.co` 的 `[common skill]` 保留顺序;合并所有匹配职业的 `[except skill info]/[info]` 排除项。
- `[next skill]` 允许重复出现,每个值依源顺序保留。连线只连接同一分支存在的目标;缺失目标显示数据提示,不推断服务器学习条件。
## 坐标
使用 `testdata/110US.pvf` 检查了全部 17 个职业的 34 个 SP / TP 注册及所有转职分支。样例中的 `[cell pos]` 是列、行,换算为 `x = 列 × 47`、`y = 行 × 67`;`[icon pos]` 是直接像素坐标。两种写法可在同一分支混用,缔造者还使用 23、117 等半格横向偏移,不能先取整成网格坐标。
这些间距来自真实数据的规律,尚未通过客户端代码验证;未来遇到不同版本的布局参数时应独立扩展换算策略。SP 画布左侧显示该行最左侧技能的 `[required level]`,同位置按文件顺序取第一个;缺失等级或空行不显示数值。TP 不显示等级标注。技能卡片下方显示技能名,不模拟玩家学习等级。
技能卡片在 47×67 网格内居中显示,连线及拖拽预览跟随显示偏移,不修改文件中的坐标;原有半格偏移仍保留。
关闭弹窗后,在本次应用会话中保留职业、转职及 SP / TP 选择;重开时重新读取所选技能树,若归档不再包含该选项则回退到首个可用选项。Cmd / Ctrl + 单击左下角路径可在编辑器打开技能树源文件。
浏览优先使用当前编辑器草稿;尚无草稿时读取归档覆盖层。拖拽只修改草稿,关闭弹窗仍保留。点击“保存到工作区”将当前技能树草稿应用到覆盖层,主工具栏的保存/另存为才写入 PVF 文件。未知转职 token 原样显示。拖拽保留原始坐标种类、技能顺序和后继关系,只替换坐标数字。
## 点击空白格添加技能
点击空白网格,在选择框中按技能名或 ID 搜索当前职业的已注册技能,确认后添加到当前转职分支。候选项排除该分支已有的技能 ID;不会创建新的技能定义文件。空分支也可直接点击网格添加。
新增记录使用 `[cell pos]`,插在当前 `[character job]` 的结束标签前,不改变其他分支及已有记录。修改进入同一份编辑器草稿,沿用“保存到工作区”和 PVF 保存流程。选择期间切换归档、分支或修改文本会取消该次操作。
## 拖拽编辑
- 同位置技能整组移动,包含当前隐藏的技能记录。
- 落点吸附到 47×67 网格,必须位于当前画布内,且不能与其他技能卡片交叠;半格位置的卡片也参与碰撞校验。画布末尾始终保留一行空白落点,拖入后自动补出下一行,可继续向下扩展。
- 绿色预览表示允许放置,红色表示无效;无效放置、取消拖拽或归档/文本发生变化时,不应用该次移动。
- 保留 `cell pos` / `icon pos` 各自的写法,移动一组混合坐标时分别换算。通用技能栏不参与拖拽。
- 草稿与文本编辑器共用。打开源文件可以继续编辑;文本更新后重新解析,避免用旧坐标覆盖新改动。
## 删除技能
右键技能选择“从技能树删除当前技能”,或在右侧信息面板点击同名按钮,可移除当前分支中选中的一条技能记录;同位置其他技能保留。删除同时移除当前分支指向它的全部 `[next skill]` 数值,其他分支及技能定义文件不变。通用技能栏不提供删除。修改进入草稿,沿用现有保存流程。当前树内的拖拽、添加、删除和保存均保留画布,避免重新解析时滚动条跳回顶部。
## 画布关联编辑
- 选中技能,拖动卡片右侧的绿色圆点到目标技能,新增一条有方向的 `[next skill]` 关联。
- 点击已有连线,拖动箭头端的绿色圆点到其他技能,可替换该条关联的目标,原有顺序保持不变。
- 右键连线可“修改关联目标”或“删除这条关联”;右键技能可“添加后继关联”,随后点击目标技能。Esc 或点击空白处取消连线。
- 目标来自当前分支,不能指向自身或新增重复目标;原文件已有的重复关联保留,按条目分别编辑。新增关联追加在该技能记录末尾,修改和删除只操作对应的数值,保留其他字段、注释及换行。重叠技能之间的关联以绕过卡片的折线展示。
- 修改先进入共享草稿,保存方式与技能移动相同,画布滚动位置保持不变。
## 验证
```sh
go test ./...
PVF_TESTFILE="$PWD/testdata/110US.pvf" go test ./services -run 'TestSkillTree|TestCommonSkillsJobExclusions' -v
cd frontend && npm test && npm run build
```