Jianghu · 装备系统设计方案 v1
🔴 数值与实现核对(2026-10-10)
本文是 v1 设计稿,落地后以下条目已过时或未实现。数值一律以 server/equipDefs.mjs 与 server/equips.mjs 为准:
- 接口路由已改名:
/api/equips/meta→/api/game/meta;/api/equips→/api/warehouse;/api/equips/hero/:id→/api/warehouse/hero/:id
- 挂机上报字段:
{stageIdx, waveKills, isBoss, bossCleared, waveSeq}(不是 kills / bossDown)
- 萃取出的威能不存在独立文件 souls.json,存在 equips.json 的
souls数组里
- 未实现(规划):铭刻的「强度折算」、加工 +5 解锁第 4 条词条、+10 解锁铭文位、保底「护符」道具
- 套装实为:玄铁 / 流云 / 赤炎 / 药师各 4 件,玄冰 / 御风各 3 件(后两套只有 3 个部位)
- 灵玉从场景等级 36 起即可掉落(不是 45 关以后)
- Boss 没有品质保底(只有游历首通必蓝、关底头目必金)
Jianghu · 装备系统设计方案
等级品质 · 套装 · 传奇威能 · 加工 · 鉴定 · 仓库建筑
v1.1 · 2026-10-07 · 主体已落地并通过端到端验证 | 范围:山门场景 + 挂机战斗
目录
00现状盘点:有什么、缺什么 01四个地基缺口(必须先补) 02装备体系总览 · 品质五档 03数据模型 04属性体系:本体 → 战斗 → 装备 05词条系统 06套装系统 07传奇威能(可改技能玩法) 08加工(强化)系统 09鉴定系统 10仓库建筑与仓库浮窗 11掉落与产出 12接口设计(后端权威) 13落地分阶段 P0–P4 14需要老大拍板的 5 件事 A附录 · 技能体系(群攻还是单体) B附录 · 编队与技能书 C附录 · 挂机掉落的表现与收集动画
00 · 现状盘点
先把家底摊开。装备系统不是从零起,人物那套已经留好了槽位,但真正要让装备"生效",中间还差几层。
| 模块 | 状态 | 现状 | 与装备的关系 |
|---|---|---|---|
| 人物 / 门人 | 已有 | server/heroes.mjs:资质甲乙丙丁戊己庚辛、6 项本体属性(生命/内力/敏捷/力量/根骨/悟性)、8 个装备槽已就位且全为 null、最多 5 个技能 | 装备的穿戴对象,槽位现成,不用改结构 |
| 技能 | 缺口 | 技能只是一个中文名字字符串(["棍法","掌法"])。真正带数值的技能写死在 idleWorld.js 的 HERO_BASE.skills 里(剑气纵横 / 流云剑法两条) | 传奇要"改技能属性、单体变群体",技能必须先有数据 |
| 战斗 | 缺口 | src/idle/idleBattle.js 是纯前端内存里跑的:主角写死 HERO_BASE「少侠」,等级/经验/金币刷新即丢,与招募来的门人完全不通 | 装备要影响战斗,必须打通这里(见 01) |
| 建筑 | 已有 | 前后端各持一份 BUILDING_DEFS;点面板按钮 → 点地块落位;点已建建筑目前只有大殿有反应(开招募浮窗) | 仓库照这个模式加一座,点击开仓库浮窗 |
| 资源 | 已有 | 铁 / 石 / 木 / 粮,后端权威,按 gameSec 推导,前端 5 秒对账 | 加工(铁/石)的消耗出口,销毁的产出入口; 纸 / 玄铁 / 玄晶碎片 / 灵玉 四种材料只从战斗掉落,专供鉴定(传奇)与高档位加工 |
| 装备本体 | 缺口 | 不存在 | 本次要建 |
| 仓库建筑 | 缺口 | 不存在。模型已有:d:/3d-game/game/assets/models/bld_cangku_01.glb | 本次要建 |
好消息:8 个装备槽、资源体系、建筑投放与存档、浮窗交互这四套"基础设施"都已经跑通, 装备系统是接上去而不是重造。模型素材也齐(仓库 / 武器铺 / 练功坊 / 演武场 / 藏经阁都在库里)。
01 · 四个地基缺口
这四条不解决,装备做出来也是"挂在墙上看的"。按重要性排序,也是我建议的实现顺序。
缺口 1 · 人是割裂的
现在有两套人:
- 招募来的门人(后端
heroes.json)—— 有资质、有 8 个装备槽,但不参与任何战斗,只是躺在大殿里看。
- 挂机战斗的主角(前端
HERO_BASE)—— 一个写死的「少侠」,没有装备槽,刷新页面就重置。
装备如果真的穿在门人身上,而挂机战斗用的是另一个「少侠」,那装备就是纯装饰。 我的建议:把挂机战斗的主角改成门人出战——大殿里指定一位「出战门人」, 他的 6 项本体属性 + 8 件装备 + 5 个技能,就是条带里那个人的实际战斗数据。
招募门人大殿 · 抽卡
→
指定出战新增:出战位
→
穿戴 8 件装备装配面板
→
合成战斗属性属性换算层
→
挂机条带实战掉落回流仓库
缺口 2 · 战斗不落库
IdleBattle 全在前端内存里:等级、经验、金币、击杀数,刷新页面全没。 装备掉落如果要真的存进仓库,战斗结果必须上报后端。
建议分两步走,不要一上来就做全量服务端战斗(体感会变卡):
- 掉落上报(必做):前端算出掉了什么 → POST 给后端 → 后端用同一个掉落表校验(防篡改)→ 写进仓库。
- 结算锚点(建议做):把「等级 / 经验 / 出战门人」也存后端,前端只是拿基准值本地插值 —— 沿用项目现有的「后端权威 + 前端插值」铁律。
缺口 3 · 技能没有数据
传奇威能的核心卖点是「把技能从单体改成多体」。但技能现在只是名字,没有倍率、没有目标数、没有冷却,改无可改。
必须先建一张技能表(后面 07 章会用到它的字段):
// 技能表(后端持有,前端拉取) { id: "liuyun", // 流云剑法 name: "流云剑法", school: "jian", // 剑/刀/棍/掌/暗器/内功/轻功 cost: 30, cd: 9.0, mult: 3.1, targets: 1, // ★ 单体=1 —— 传奇威能就是改这个 reqAttr: { str: 14 }, // 属性门槛:不达标不生效 effects: [], // 附加效果:dot / 减速 / 破防 / 吸血… desc: "以剑气化流云,一斩破势。" } 门人那 12 个技能名(棍法 / 掌法 / 御风步 / 龟息功…)现在只是装饰标签, 这张表建好后它们才真正"能用"。
缺口 4 · 金币没有出口
战斗里黄金在累加(hero.gold += mob.gold),但不落库、也没地方花。 鉴定和加工是天然的消耗口 —— 顺势把黄金接进资源体系(第 5 种资源)即可。
02 · 装备体系总览
品质五档
按老大定的白 → 绿 → 蓝 → 金 → 传奇。品质决定「有几个词条 + 有没有威能」,也决定强化上限。
白装 COMMON
只有基础属性 无词条、无套装
+0 词条 · 强化上限 +5
绿装 FINE
基础 + 1 条随机词条
+1 词条 · 上限 +6
蓝装 RARE
基础 + 2 条随机词条 可属于套装
+2 词条 · 上限 +8
金装 EPIC
基础 + 3 条随机词条 套装主力,可铭刻威能
+3 词条 · 上限 +10
传奇 LEGENDARY
基础 + 3 词条
- 1 条传奇威能(改变技能玩法)
固定名字、世界里只有它一个
+3 词条 +1 威能 · 上限 +10
一件装备的完整构成
基础属性槽位 × 装等 × 品质
+
词条 ×0–3传奇鉴定后揭晓 其余品质当场可见
+
套装归属2/3/4 件效果
+
传奇威能仅传奇
+
加工 +N十炼
装备总览表(示例:同一件武器,不同品质)
穿戴等级需求(reqLv)—— 2026-10-14 整体下调
老大:「所有装备等级的穿戴等级需求进行下调,整体按比例下调, 最高穿戴等级要求不超过 30 级」。
口径:reqLv = clamp(round((ilvl − 4) × 0.5), 1, 30) —— 整体减半 + 30 级封顶(ilvl 63 起恒为 30)。旧口径 max(1, ilvl−4) 会让第 71 关掉落的装备要 69 级才穿得上,而门人 30 级往后每级都是 1.23 倍的指数墙 (heroes.expToNext)—— 表现就是"越往后打,掉的东西越穿不上"。
🔴 不倒挂:reqLv 是 ilvl 的纯函数 —— 装等越高门槛只升不降;同装等下凡品与传奇门槛相同;星级 / 加工不参与 (不会"我加工完反而穿不上")。老存档按同一公式重算(不是"取小"), 否则个别人身上留着一件"高装等低门槛"的装备就会把单调性断掉。
验收扫描:node tools/verify_mats.mjs 的 ⑧ 节 (单调 / 封顶 / 按比例下调 / 品质无关 / 存档一致 / 真门还在,共 8 条)。
| 品质 | 名字 | 基础属性 | 词条 | 套装 | 威能 |
|---|---|---|---|---|---|
| 白 | 铁剑 | 攻击 +28 | — | — | — |
| 绿 | 精铁剑 | 攻击 +34 | 力量 +6 | — | — |
| 蓝 | 断云剑 | 攻击 +42 | 力量 +8 暴击 +3.5% | 流云轻装 | — |
| 金 | 断云·惊鸿 | 攻击 +56 | 力量 +12 暴击 +5% 破防 +18 | 流云轻装 | — |
| 传奇 | 承影 | 攻击 +74 | 力量 +15 暴击 +6% 攻速 +7% | 流云轻装 | 流云化雨 「流云剑法」改为攻击全体 |
03 · 数据模型
3.1 装备实例(存在后端,一个账号一份)
{ id: "it_k3f9a2", // 实例唯一 id(每件都不一样) defId: "sword_duanyun", // 指向装备模板(静态表) slot: "weapon", // 8 槽之一,与门人的槽位同名 quality: "legend", // white | green | blue | gold | legend ilvl: 42, // 物品等级:决定基础属性与词条强度 reqLv: 19, // 需求人物等级(越级穿不上)= clamp(round((ilvl−4)×0.5),1,30) refine: 5, // ★ 加工等级 +0 ~ +10 base: { atk: 74 }, // 已算好的基础属性(落库,避免每次重算漂移) affixes: [ // ★ 词条:鉴定前 value 对前端隐藏 { id: "aff_str", value: 15, tier: 4 }, { id: "aff_crit", value: 6.0, tier: 3 }, { id: "aff_spd", value: 7.0, tier: 3 } ], identified: false, // ★ 鉴定状态 soulId: "soul_liuyun_multi", // 传奇威能(非传奇为 null) soulImprinted: false, // 威能是「铭刻上来的」还是原生 setId: "set_liuyun", // 套装归属(可空) locked: false, // ★ 玩家锁定:锁定后禁止销毁/分解 wornBy: "hmuwl17853go", // 穿在哪个门人身上(在仓库则为 null) pin: 3, // 仓库排序优先级(可选,拖拽排序用) from: { stage: 42, mob: "bandit" }, // 出处,详情卡里显示 ts: 1791300000000 }
为什么 base 要落库而不是每次重算? 因为公式一旦调整(比如某天改倍率),老装备全会跟着变 —— 玩家会发现自己昨天那件神装今天缩水了。 落库 = 出厂即定型,之后的平衡调整只影响新掉落的装备。
3.2 静态表(模板 / 词条 / 套装 / 威能 / 技能)
这五张表是"作品规则",不是玩家数据。建议放在后端,前端启动时拉一次。
这里我改了一下现有约定:建筑定义目前是前后端各写一份(src/buildings.js 与 server/buildings.mjs), 代码注释里也明确写了「改动要同步」—— 这是个人为的坑。装备的静态表体量比建筑大得多 (模板几十件 × 词条几十条 × 套装 × 威能 × 技能),各写两份迟早会漂。 建议装备走后端单一来源,前端 fetch('/api/game/meta') 拉取。 建筑那两份要不要一并收敛,听老大的。
// 装备模板(Def)—— 图纸,不含随机词条 { defId: "sword_duanyun", name: "断云剑", slot: "weapon", icon: "sword_duanyun", // 对应 public/assets/equips/*.webp school: "jian", // 武器门派:只影响外观描述与词条池 tier: 3, // 档位 1–5,决定基础属性的成长斜率 baseAttrs: { atk: 26 }, // 基准值(ilvl=1 时) growth: 1.62, // 每级装等的倍率 affixPool: ["atk","str","crit","spd","armorPen"], // 可出的词条池 allowedQuality: ["white","green","blue","gold"], soulId: null // 传奇模板才填 }
04 · 属性体系(三层分离)
这是整套设计里最容易埋雷的地方,我把它单独拎出来讲清楚。
不能把装备加成直接加到本体属性上。 门人的 6 项属性(生命/内力/敏捷/力量/根骨/悟性)是招募时按资质 roll 出来的, 甲乙丙丁的差别就体现在这组数字上。如果装备一穿、敏捷 +10 直接把 attrs.agi 改掉, 那资质分档就失去意义了 —— 一个「辛」级门人穿上神装,属性面板看起来比「甲」级还漂亮。 所以必须分三层。
1 本体属性Attr 招募时定型 · 永不改
→
2 战斗属性Stat 由本体换算而来
→
3 装备 / 套装 / 威能加成叠加在 Stat 上
→
最终战斗数值进 idleBattle
4.1 本体 → 战斗 的换算公式
// 本体属性(招募时 roll,6 项)→ 战斗属性(战斗真正用的) maxHp = 90 + con 6 + str 2 maxMp = 40 + int 4 + con 1 atk = 8 + str 1.8 + agi 0.6 // 力量主攻、敏捷副攻 def = 2 + con 0.7 crit = 0.05 + agi 0.004 // 敏捷 → 暴击率 critDmg = 1.5 + int 0.012 // 悟性 → 暴击伤害 atkInterval = 1.15 / (1 + agi 0.012) // 敏捷 → 出手速度 hpRegen = 2 + con 0.12 // 停战回复 mpRegen = 1.5 + int 0.10
4.2 叠加规则(顺序不能乱)
step1 base = 换算(本体属性, 门人等级) // 等级成长曲线 step2 flat = Σ 装备固定加成 + Σ 词条固定值 + Σ 套装固定值 // 加法区 step3 pct = Σ 百分比词条(+3% 攻击 等) // 乘法区,同项相加 step4 final = (base + flat) × (1 + pct) × 威能系数 step5 取整 → 交给 idleBattle
// 例:某门人 base.atk=42,装备固定 +96,词条 "+8%攻击"、"+5%攻击", // 威能 "技能倍率 ×1.8"(不影响 atk 面板,作用于伤害公式) // → (42 + 96) × 1.13 = 155.9 → 156
为什么固定值先加、百分比后乘? 这是通行的做法:固定值吃百分比,才能让"多堆几件装备"有复利感; 反过来(百分比先算)会让后期装备收益塌陷,玩家感觉"越换越没用"。
05 · 词条系统
词条 = 随机附加属性,是刷装备的核心动力。分四类,共约 30 条。
| 类别 | 词条 | 数值区间(ilvl 40 蓝装基准) | 出现槽位 |
|---|---|---|---|
| 主属性 | 力量 / 敏捷 / 根骨 / 悟性 / 最大生命 / 最大内力 | +8 ~ +22 生命 +80 ~ +260 | 全槽位 |
| 攻击 | 攻击力 / 攻击力% / 暴击率 / 暴击伤害 / 攻速 / 破防 | 攻击 +12~+40 攻击 +3%~+9% 暴击 +2.5%~+7% | 武器 · 戒指 · 项链 |
| 防御 | 防御 / 闪避 / 受击回内力 / 生命回复 | 防御 +10~+34 闪避 +2%~+6% | 头 · 衣 · 裤 · 鞋 |
| 特殊 | 对野兽伤害 +% 击杀回血 % 内力消耗 −% 经验获取 +% 金币获取 +% | 10% ~ 25% | 全槽位(低概率) |
词条强度与装等、档次的关系
value = 基准值 × tier倍率 × (1 + ilvl × 0.035) × rand(0.85, 1.15)
tier 倍率: T1 ×1.00 / T2 ×1.35 / T3 ×1.80 / T4 ×2.40 / T5 ×3.20 品质决定 tier 上限: 绿 ≤T2 / 蓝 ≤T3 / 金 ≤T4 / 传奇 ≤T5
也就是说:低装等也能出好词条(T5),但数值被 ilvl 压住。 反过来高装等保底数值,但 tier 随机。两条路都有人追,装备才有"要不要换"的纠结。
06 · 套装系统
套装 = 一组同名装备(通常 3–4 件),穿够件数解锁效果。只统计已穿戴的件数,仓库里的不算。
套装数据
{ setId: "set_xuantie", name: "玄铁重甲", theme: "tank", slots: ["helmet", "armor", "pants", "boots"], bonus: { 2: { desc: "最大生命 +180", stats: { maxHp: 180 } }, 3: { desc: "受到攻击时反弹 8% 伤害", special: "thorns", v: 0.08 }, 4: { desc: "根骨 +20;致命伤害时保留 1 点生命(每场 1 次)", stats: { con: 20 }, special: "lastStand" } } }
先做 6 套
| 套装 | 部位 | 定位 | 2 件 | 3 件 | 4 件 |
|---|---|---|---|---|---|
| 玄铁重甲 | 头 · 衣 · 裤 · 鞋 | 坦克 | 最大生命 +180 | 反弹 8% 伤害 | 根骨 +20;致命伤保留 1 点血(每场 1 次) |
| 流云轻装 | 头 · 衣 · 裤 · 鞋 | 速度 | 敏捷 +14 | 攻速 +9% | 每 3 次攻击追加一次 60% 追击 |
| 赤炎战甲 | 头 · 衣 · 裤 · 鞋 | 爆发 | 攻击 +24 | 暴击率 +7% | 暴击时对相邻敌人溅射 40% 伤害 |
| 药师布衣 | 头 · 衣 · 裤 · 鞋 | 续航 | 最大内力 +90 | 内力回复 +2.5/s | 每秒回复最大生命 1.2% |
| 玄冰戒链 | 戒 · 戒 · 链 | 控制 | 攻击 +18 | 3 件:命中使敌减速 15%;每 10 秒冰冻目标 2 秒 (本套只有 3 个部位 —— 减速与冰冻都在第 3 件一起触发,没有 4 件档) | |
| 御风靴链 | 鞋 · 链 · 戒 | 机动 | 破防 +22% | 3 件:闪避 +6%;闪避成功后立刻反击一次(80% 攻击) (本套只有 3 个部位 —— 闪避反击在第 3 件触发,没有 4 件档) |
套装件数刻意压在 3–4 件、并且不覆盖全部 8 槽,是为了留出"混搭"空间: 玄铁 4 件 + 玄冰 3 件 + 1 件传奇武器,就是一个有取舍的 build。全 8 槽同一套反而没有选择。
07 · 传奇威能(重点)
老大原话:「传奇装备可以改变一些技能的属性和攻击力玩法,比如把技能从单体变成多体等特殊属性。」
这一条是整套系统的灵魂,也是唯一实质改变战斗过程的部分。前六章都是数值加法,这里是新玩法。
7.1 威能的六种类型
| 类型 | 代号 | 作用 | 实例 |
|---|---|---|---|
| 技能改型 | skillMod | 改技能的目标数 / 倍率 / CD / 耗蓝 —— 单体变群体就在这一类 | 流云化雨:「流云剑法」改为攻击全体敌人,单次伤害降为 65% |
| 技能触发 | skillProc | 满足条件时额外释放技能(不耗内力) | 剑心通明:普通攻击有 25% 机率追加一次「剑气纵横」 |
| 技能强化 | skillBoost | 直接加强某个技能的数值 | 断岳:「剑气纵横」倍率 +80%,冷却 −25% |
| 常驻被动 | passive | 无条件持续生效 | 嗜血:每击杀 1 名敌人,本场永久 +2 攻击(上限 +60) |
| 战斗机制 | mechanic | 改变战斗规则的一次性 / 条件效果 | 龟息:内力低于 30% 时,本场所有技能不再消耗内力(每场 1 次) |
| 属性转向 | conversion | 把一项属性按系数折算成另一项 | 以意驭剑:悟性的 150% 转化为攻击力 |
7.2 数据结构
{ soulId: "soul_liuyun_multi", name: "流云化雨", type: "skillMod", slot: "weapon", // 只能铭刻到武器上 desc: "「流云剑法」改为攻击全体敌人,单次伤害降为 65%", effect: { skillId: "liuyun", patch: { targets: "all", multMul: 0.65 } // ★ 目标数变为全体,倍率 ×0.65 }, tier: "legend" // 分传奇 / 珍品两级强度 // ⚠️ 未实现(见顶部核对块):原有 powerCurve「铭刻时的强度折算系数」未落地 —— // 现行铭刻只写入 soulId,原装备属性不变 }
7.3 战斗里怎么落地(关键)
idleBattle 现在只有单体 _pickTarget()。要让「单体变全体」真正生效,改动很集中:
// 改造前:永远打一只 const target = this._pickTarget(); this._heroStrike(target, usable.mult, usable.name);
// 改造后:技能自带 targets,威能可以把它改成 "all" const targets = resolveTargets(usable, this.mobs); // ← 新函数 for (const t of targets) { this._heroStrike(t, usable.mult, usable.name + (targets.length > 1 ? "·群" : "")); } this._emit('multiHit', { n: targets.length }); // 渲染层做同时命中的特效
// resolveTargets 的规则 targets = 1 → 最靠近的那一只 targets = 3 → 最靠前的三只 targets = "all" → 场上所有活怪 配套要动的地方:技能的 targets 字段、伤害数字同时弹出、怪物同时受击闪红。 动作层面只要渲染层给所有命中目标加一个 0.15 秒的闪光即可,不用新素材。
7.4 萃取与铭刻(长期玩法)
获得传奇装备掉落
→
萃取销毁该传奇 得到「传承之魂」
→
铭刻打到任意 金装 / 传奇上
→
威能生效铭刻只写入 soulId*(强度折算未实现,见顶部核对块)*
这条链条解决了一个经典问题:好不容易掉到一把传奇,但它装等太低、属性跟不上。 萃取之后威能可以永远带走,玩家不会觉得"白刷了"。
萃取 = 永久销毁那件装备(所以必须先解锁 + 二次确认,见 10.4)。 铭刻成本:玄晶 ×8 + 灵玉 ×2 + 金币 ×3000。 ⚠️ 强度折算未实现(见顶部核对块):铭刻只写入 soulId,原装备属性不变。
08 · 加工(强化)系统
俗称「十炼」,把装备从 +0 提到 +10。
8.1 数值收益
// 每级加成:基础属性 ×(1 + 0.08 × refine),但要过得去 —— 所以给阶段性陡点 +1 ~ +3 每级 +8% 累计 +24% +4 ~ +6 每级 +11% 累计 +57% +7 ~ +9 每级 +14% 累计 +99% +10 一次性 +20% 累计 +119%
// ⚠️ 额外奖励未实现(见顶部核对块):「+5 解锁第 4 条词条」「+10 解锁铭文位」都未落地 —— // 现行词条数上限为 3,也没有铭文位。
8.2 消耗与成功率
| 等级 | 铁 | 石 | 金币 | 成功率 | 失败后果 |
|---|---|---|---|---|---|
| +1 → +3 | 3 / 5 / 8 | 2 / 3 / 5 | 60 / 110 / 180 | 100% | — |
| +4 → +6 | 12 / 18 / 26 | 8 / 12 / 18 | 280 / 420 / 620 | 75% / 65% / 55% | 只掉材料,等级不变 |
| +7 → +9 | 36 / 50 / 68 | 26 / 36 / 48 | 900 / 1300 / 1800 | 45% / 38% / 30% | 25% 概率 掉 1 级 |
| +10 | 95 | 70 | 2600 | 25% | 35% 概率 掉 1 级 |
保底设计:+4 ~ +6 只掉材料、不掉级 —— 挂机作品里让玩家"一夜回到解放前"是劝退第一名。 高风险只放在 +7 以上,并且提供「护符」道具(消耗后本次失败不掉级),护符从 Boss 掉落或分解金装获得。
⚠️ 护符未实现(见顶部核对块):当前只有失败掉级 roll,无护符掉落。
强化不改变品质、不影响词条数值,只作用于基础属性 —— 这样 +10 的白装也不会强过 +0 的金装,档次分明的底线保住了。
09 · 鉴定系统
掉落的装备默认未鉴定:词条与威能全部遮住,显示成「???」。鉴定 = 开盲盒。
🔴 只有传奇(橙装)需要鉴定(老大 2026-10-14 定:「什么都要鉴定,好麻烦 —— 设置橙装以上才鉴定」)。
凡品 / 良品 / 精品 / 宝器 出生即已鉴定:掉落当场就能穿、能比、能分解, 词条值也直接可见(绿/蓝/金本来就有词条,只是不再设卡)。 只有最深的那一档传奇保留"开盲盒"这一步 —— 它是唯一值得先花钱开的东西。
⇒ 判据收在出生的那一刻(equipDefs.rollItem), 名单只有一处:equipDefs.IDENTIFY_QUALITIES = ['legend'] → identified = !needsIdentify(quality)。 另外 identify() 里留了一道显式拦截(低四档 → 409「不需要鉴定,直接就能用(只有传奇要鉴定)」), 并把老存档里残留的未鉴定低档装备一次性补正 —— 不然那些「?」会永远挂着。
沿革:2026-10-08 先豁免白装(它 affixes = 0,鉴定对它是纯空操作), 2026-10-14 整条门槛抬到"只有传奇"。
掉落 · 未鉴定只有传奇 词条遮蔽 显示 ???
→
鉴定*消耗金币
- 纸 / 玄铁 / 玄晶碎片 / 灵玉*
→
揭晓词条展开 威能显形 有结果动画
| 品质 | 鉴定消耗 | 说明 |
|---|---|---|
| 白 / 绿 / 蓝 / 金 | 不需要鉴定(出生即已鉴定) | 掉落当场就能穿、词条当场可见 —— 表里那几档的消耗已作废(2026-10-14) |
| 传奇(橙装) | 金币 2000 × ilvl系数 + 纸 ×16 + 玄铁 ×8 + 玄晶碎片 ×4 + 灵玉 ×1 | 开出来才知道是什么威能,全作品唯一保留的赌博感 |
ilvl系数 = 1 + ilvl × 0.02。四种材料全部来自战斗掉落(纸 / 玄铁 / 玄晶碎片 / 灵玉), 按场景等级分档:纸从第 1 关就有,玄铁约第 16 关起常见,玄晶碎片中盘才多,灵玉从场景等级 36 起即可掉落(第三档权重 6%)。 所以「打到传奇却鉴定不起、先压箱底」是设计内的节奏,不是卡点。
重铸(后期开放)
对已鉴定的装备重 roll 全部词条,消耗大量材料。可「锁词条」:每锁 1 条,成本 ×2.2。 金装最多锁 1 条,传奇最多锁 2 条。
10 · 仓库建筑
10.1 建筑定义
// src/buildings.js + server/buildings.mjs(两处同步) { id: "cangku", name: "仓库", icon: "🏦", file: "cangku.glb", // ← 从 bld_cangku_01.glb 复制到 public/assets/buildings/ cells: "quad", target: 4.6, limit: 1, desc: "占 4 格", } 与大殿同级:占 4 格、限 1 座。落位后点它打开仓库浮窗(照 main.js:580 里大殿那行的写法加一条分支)。
10.2 浮窗布局(线框)
仓 库 全部 128 武器 12 防具 34 饰品 21 未鉴定 6
品质 ▾排序 ▾🔒 只看锁定
⚔+7🔒
🛡+5套
🥋+2套
👢+1
👖
💍🔒
📿+10
🪖套
⚔
?
?
🥋
💍
点击装备查看详情 · 右键 = 锁定 · 拖拽到人物面板穿戴
一键分解(白/绿)强化鉴定
图示标记含义:+N 加工等级 · 🔒 已锁定 · 套 属于某套装 · ? 未鉴定。
10.3 三个核心功能
| 功能 | 行为 | 细节 |
|---|---|---|
| 展示 | 网格排列,每格显示图标 + 品质色描边 + 加工等级 + 锁定/套装标记。点击开详情卡 | 默认按「品质降序 → 装等降序」。筛选:槽位 / 品质 / 是否锁定 / 是否未鉴定 |
| 锁定 | 切换 locked。锁定的装备不能被销毁、不能分解、不会出现在"一键分解"里,也不能被萃取 | 两个入口:格子上右键 / 详情卡上的锁按钮。锁上时给一条轻微的金边提示 |
| 销毁 | 单件销毁 或 按品质批量销毁,产出材料进背包(资源体系) | 见下方产出表。锁定的会直接跳过并提示 |
10.4 销毁产出表
| 品质 | 铁 | 石 | 玄晶碎片 | 灵玉 | 备注 |
|---|---|---|---|---|---|
| 白 | 1 ~ 2 | — | — | — | — |
| 绿 | 2 ~ 4 | 1 ~ 2 | — | — | — |
| 蓝 | 4 ~ 7 | 3 ~ 5 | 30% 概率 ×1 | — | 顺带返还部分加工材料 |
| 金 | 8 ~ 14 | 6 ~ 10 | 60% 概率 ×2 | 25% 概率 ×1 | — |
| 传奇 | 不可直接销毁 —— 需二次确认并输入装备名,产出「传承之魂」(保留威能) | 防手滑的最高一档 |
加工过的装备销毁时,按 50% × refine 的比例返还铁石 —— 强化过的装备不至于一文不值。
已穿戴的装备不能销毁。 必须先脱下(回仓库)才能操作。 另外「一键分解」默认只勾选白装与绿装,蓝装以上必须手动勾选 —— 蓝装已经开始有套装与好词条了。
10.5 人物装配面板
大殿的门人详情里,现有那 8 个灰方块(.d-equips)升级成可交互:
- 点槽位 → 弹出「该槽位可用装备」列表(按净值排序,并显示换上之后战斗力涨多少)
- 点已穿的装备 → 详情卡 + 「卸下」按钮
- 面板底部加一行「战斗力」总评(一个把攻击/防御/血量/暴击折算成单值的公式,方便比装备好坏)
- 已激活的套装效果在装备区下方高亮列出(如「玄铁重甲 3/4:反弹 8% 伤害」)
11 · 掉落与产出
11.1 掉落来源
| 来源 | 规则 |
|---|---|
| 野猪(普通小怪) | 3% 掉 1 件,品质以白/绿为主 |
| 山贼(Boss) | 100% 掉 1 件,品质按场景等级 roll,首杀必出蓝以上 |
| 游历节点首通 | 固定给 1 件(可设计成某件固定装备,给"收藏"感) |
| 武器铺(打造) | 用铁 + 石 + 金币保底打造基础装备。不出传奇,但能稳定产出绿/蓝,防"运气太差卡关" |
⚠️ 本节两处已过时(2026-10-10 标注)
1 「武器铺打造」是规划、未实现:现行武器铺只提供装备加工折扣(−5% / 级,见 建筑与等级),没有打造功能。
2 §11.1 / §11.2 的掉落概率与品质权重是 v1 设计值,与现行实现已漂移: 普通怪实为 20% 掉 1 件、Boss 最多 3 件、关底头目必 4 件且必出金以上、 游历首通必出蓝以上;品质权重按场景等级四档演进(≤15 白 42% … >55 传奇 16%)。 现行数值请以 装备强化与加工 与 server/equipDefs.mjs 的 DROP_TABLE 为准。
3 Boss 无品质保底(§11.1「首杀必出蓝以上」不成立):品质保底只有游历首通必蓝、 关底头目必金;山贼(Boss)掉落品质照常按场景等级 roll。
11.2 品质概率(按场景等级)
| 场景等级 | 白 | 绿 | 蓝 | 金 | 传奇 |
|---|---|---|---|---|---|
| 1 – 15(青石村 → 落霞镇) | 60% | 30% | 9% | 1% | — |
| 16 – 35(黑风岭 → 苍梧山) | 38% | 36% | 20% | 5.5% | 0.5% |
| 36 – 55(碧云涧 → 落星谷) | 20% | 33% | 30% | 14% | 3% |
| 56 – 71(孤云城 → 黄泉道) | 8% | 24% | 34% | 26% | 8% |
装等 ilvl 直接取当前场景等级 ± 2,掉出来的装备正好是"这个阶段该穿的"。
掉落必须在后端 roll。 如果前端算掉落再上报,改一行 JS 就能刷神装。 正确做法:前端打完怪只上报「在场景 N 击杀了 Boss」这个事实, 由后端用同一张掉落表 roll 出结果并写进仓库,再把"掉了什么"返回前端播动画。
12 · 接口设计
沿用项目现有铁律:除 health / config / auth 外全部要 token,数据落 server/worlds/<userId>/equips.json。
| Method | 路径 | 作用 | 落库文件 |
|---|---|---|---|
| GET | /api/game/meta | 静态表一次拉全:模板 / 词条 / 套装 / 威能 / 技能 | 无(代码内置) |
| GET | /api/warehouse | 仓库列表(带筛选参数 ?slot=&quality=&locked=) | equips.json |
| GET | /api/warehouse/hero/:heroId | 某个门人的装备 + 合成后的战斗属性 + 已激活套装 | equips.json |
| POST | /api/equips/identify {id} | 鉴定:扣金币 + 纸/玄铁/玄晶碎片/灵玉(按品质)→ 揭晓词条 | equips + resources |
| POST | /api/equips/refine {id} | 加工 +1:扣铁/石/金币 ×品质系数,高档位再叠纸/玄铁/玄晶/灵玉 → roll 成功率 | equips + resources |
| POST | /api/equips/lock {id, locked} | 锁定 / 解锁 | equips.json |
| POST | /api/equips/destroy {ids:[]} | 销毁 → 返回产出材料。锁定的会被拒绝并列出 | equips + resources |
| POST | /api/equips/equip {itemId, heroId, slot} | 穿戴(自动处理原装备返回仓库、等级校验、槽位校验) | equips + heroes |
| POST | /api/equips/unequip {heroId, slot} | 卸下 | equips + heroes |
| POST | /api/equips/extract {id} | 萃取威能 → 得「传承之魂」 | equips.json |
| POST | /api/equips/imprint {soulId, itemId} | 铭刻威能 | equips.json |
| POST | /api/idle/report {stageIdx, waveKills, isBoss, bossCleared, waveSeq} | 挂机战果上报 → 后端 roll 掉落(装备 / 技能书 / 材料 / 金币)并返回 | equips + resources |
三条必须在后端校验的事(否则可以改前端白嫖): 1 鉴定/加工/销毁的材料是否够;2 销毁的装备是否被锁定 / 是否已穿戴; 3 掉落 roll 结果 —— 绝不能由前端上报"我掉了传奇"。
存档新文件
server/worlds/<userId>/ state.json // 时间(已有) buildings.json // 建筑(已有,新增 cangku) heroes.json // 门人(已有,equips 槽开始有值) resources.json // 资源(已有,新增 金币 / 纸 / 玄晶 / 灵玉) upkeep.json // 口粮(已有) equips.json // ★ 新增:仓库 + 每件装备的实例数据;萃取出的威能册(souls 数组)也在本文件
13 · 落地分阶段
按依赖关系排的,每一步都能单独跑通、单独验收,不用等全部做完才看到东西。
P0 · 补地基 不做则装备无处可挂
- 技能数据化:建技能表(12 个技能名 → 真实数值),门人的技能从"标签"变成"能用的招"
- 属性换算层
statsFor(hero, equips):本体 6 属性 → 战斗属性
- 门人加
level / exp,挂机战斗的主角 = 出战门人(大殿里选)
- 战果上报接口 + 掉落 roll 落库
P1 · 装备本体 + 仓库 老大这次点名要的三个功能
- 数据模型 + 静态表(模板 / 词条)后端落地
- 仓库建筑
cangku(模型复制 + 前后端 defs + 点击开窗)
- 仓库浮窗:装备展示 / 锁定 / 销毁分解 —— 三个功能一次做完
- 人物装配面板(8 槽可点,穿脱 + 战力对比)
- 资源体系加 金币 / 纸 / 玄晶 / 灵玉
P2 · 加工与鉴定
- 强化 +1~+10(含成功率、护符保底、分段收益)
- 鉴定(未鉴定状态、消耗、揭晓动画)
- 详情卡:把基础/词条/套装/加工 全展示清楚
P3 · 套装 + 传奇威能 玩法质变
- 6 套套装 + 件数激活判定 + 3 件/4 件的特殊效果接入战斗
- 传奇威能 6 类效果 + 战斗内的多目标结算(单体变群体)
- 萃取 / 铭刻(威能册)
P4 · 掉落与平衡
- 掉落表接入挂机战斗、Boss 必掉、首通奖励
- 武器铺打造(保底产出)
- 用
tools/loop_check.py同类思路写一个数值模拟脚本,跑 1000 场验证"不会卡关也不会太轻松"
14 · 需要老大拍板的 5 件事
这几条会影响整体架构,我按推荐写了方案,但得你点头再动手。
装备穿在谁身上?
推荐 A:穿在招募的门人身上(8 槽已就位),并新增「出战门人」,挂机战斗的主角换成出战的那位门人。
选项 B:装备只给固定主角「少侠」用,门人只是招募收藏。
差别很大:A 会让挂机战斗的数值完全跟着装备走(我建议这个);B 更简单,但门人的 8 个槽位就永远空着。
挂机战斗要不要接入后端结算?
推荐:只把「战果 + 掉落 + 等级经验」落库,战斗过程仍在前端跑(保持现在的流畅度,也不用改服务端成实时战斗)。
全量服务端战斗不建议 —— 挂机条带是每帧渲染的,走网络会明显卡顿。
静态表放哪:后端单一来源,还是照旧前后端各一份?
推荐:装备的静态表放后端,前端拉 /api/game/meta(表太大了,两份必漂)。
建筑那两份要不要顺手收敛,你定 —— 那是既有代码,不动也能跑。
金币 / 纸 / 玄晶 / 灵玉 这 4 种新资源,加进现有资源条吗?
推荐:金币上资源条(每天都要看);纸 / 玄晶 / 灵玉只进仓库的「材料」分页,不占顶部条位。
顶部条现在 4 项,再加 4 项会挤爆;而且纸/玄晶是低频消耗品,不需要一直盯着。
先做哪一阶段?
推荐:先 P0 + P1(地基 + 装备本体 + 仓库三功能),让你能在作品里真的打开仓库、看到装备、锁它、分解它。
P2(加工鉴定)、P3(套装传奇)等看到实物之后再排。
如果更想先看到"传奇改技能"的爽点,也可以 P0 + P3 里威能那部分先做一个样板,代价是中间几层是空的。
附录 A · 技能体系
每个技能除了倍率与冷却,还有一个关键字段 —— 目标模式。它同时决定三件事: 1 这一招打几个(单体还是群攻);2 传奇威能能不能改它(单体 / 前排的可以改成全体,自身 / 全队的改不了); 3 战斗里怎么表现(打一个还是同时命中一片)。
单体 最靠近的一只 可被威能改成全体
前排 N / 随机 N 2~5 只 可被威能改数量或改全体
全体 / 自身 / 全队 范围或增益 威能不改
A-1 · 入门技能(12 个 · 招募时随机 1–5 个)
| 技能 | 门派 | 类型 | 打几个 | 倍率 | 耗蓝 | 冷却 | 附加效果 |
|---|---|---|---|---|---|---|---|
| 基础剑法 | 剑 | 攻击 | 单体 | 1.35 | 6 | 3.5s | — |
| 刀法入门 | 刀 | 攻击 | 单体(2 段) | 1.15×2 | 8 | 4.5s | — |
| 棍法 | 棍 | 攻击 | 前排 2 只 | 1.05 | 12 | 6.0s | — |
| 长拳 | 拳掌 | 攻击 | 单体 | 1.50 | 8 | 4.0s | 破防 15% / 4s |
| 掌法 | 拳掌 | 攻击 | 单体 | 1.60 | 14 | 6.5s | 15% 概率击晕 1s |
| 点穴术 | 拳掌 | 控制 | 单体 | 0.70 | 10 | 8.0s | 定身 1.5s |
| 暗器手法 | 暗器 | 攻击 | 随机 3 只 | 0.85 | 16 | 7.0s | — |
| 轻身术 | 轻功 | 增益 | 自身 | — | 12 | 14s | 闪避 +25% / 8s |
| 御风步 | 轻功 | 增益 | 自身 | — | 14 | 15s | 攻速 +30% / 6s |
| 内功心法 | 内功 | 恢复 | 自身 | — | 0 | 20s | 回复内力 35% |
| 龟息功 | 内功 | 恢复 | 自身 | — | 18 | 22s | 每秒回血 1.5% / 8s |
| 铁布衫 | 外功 | 增益 | 自身 | — | 16 | 20s | 减伤 40% / 8s |
A-2 · 高阶技能(9 个 · 只能靠技能书学到)
| 技能 | 门派 | 类型 | 打几个 | 倍率 | 耗蓝 | 冷却 | 附加效果 | 档次 |
|---|---|---|---|---|---|---|---|---|
| 剑气纵横 | 剑 | 攻击 | 前排 3 只 | 1.60 | 16 | 6.0s | — | 珍稀 |
| 流云剑法 | 剑 | 攻击 | 单体(高倍率) | 3.10 | 30 | 9.0s | — | 珍稀 |
| 万剑归宗 | 剑 | 攻击 | 全体 | 1.40 | 42 | 13.0s | — | 绝世 |
| 血战八荒 | 刀 | 攻击 | 全体 | 1.20 | 38 | 12.0s | 吸血 20% | 绝世 |
| 罗汉伏魔 | 棍 | 攻击 | 全体 | 1.10 | 36 | 11.0s | 30% 概率击晕 1.2s | 绝世 |
| 亢龙有悔 | 拳掌 | 攻击 | 单体(最高倍率) | 4.20 | 40 | 12.0s | 破防 30% / 6s | 绝世 |
| 暴雨梨花 | 暗器 | 攻击 | 随机 5 只 | 0.90 | 28 | 8.5s | — | 珍稀 |
| 金钟罩 | 外功 | 增益 | 全队 | — | 30 | 22s | 全队减伤 30% / 10s | 珍稀 |
| 回春术 | 内功 | 恢复 | 全队 | — | 34 | 18s | 全队回血 25% | 珍稀 |
为什么这样分? 入门技全是小范围(单体 / 前排 2 / 随机 3),高阶技才有全体与全队增益 —— 这样编队才有多样性: 上 5 个人的时候,"谁带群攻清场、谁带金钟罩保后排"是有取舍的; 如果人人都有全体技,编队就退化成"挑攻击力最高的 5 个"。
与传奇威能的接点:威能里的 skillMod 改的就是上表「打几个」那一列。 例如「流云化雨」把 单体的「流云剑法」改成 全体(伤害降为 65%)—— 一件装备就把一个技能换了玩法,这正是老大学《暗黑》要的那种感觉。
附录 B · 编队与技能书
B-1 · 编队(老大 2026-10-07 定)
- 招募来的门人都能参战,一次最多上阵 5 人。
- 当前只有一个小队(「第一小队」)—— 多小队是后续扩展,数据结构已经预留(
squads[]+activeSquadId)。
- 上阵顺序 = 战斗站位:排第一个的在最前面、离敌人最近;越往后越靠后排。
- 编队入口在大殿浮窗的「编队」区:点门人即上阵 / 再点即下阵,显示每人战力便于比较。
- 同一人不能重复上阵;未招募的人不能上阵(后端校验)。
大殿招募抽人
→
编队选最多 5 人 排序即站位
→
穿装备8 槽 · 套装激活
→
挂机条带5 人各自出手
→
战果上报掉落由后端结算
战斗里的表现
我方 5 人并排站在条带左侧(第 1 位最前、往左依次是后排),怪物从右侧进场。每个门人有:
- 自己的生命 / 内力 / 攻击 / 防御 / 暴击(全部来自本体属性 + 装备加成)
- 自己的出手节奏与技能冷却 —— 五个人各打各的,不会同步
- 自己的血条;被打到 0 就倒下不再出手,全队倒下则原地休整(挂机不惩罚)
- 群攻技能一次命中多只怪,伤害数字同时弹出
🔴 一个必须守住的技术细节:战斗内门人升级时要重算战斗属性, 这次重算要用「本体属性 + 身上装备」。如果只把后端算好的战斗属性传进战斗、 没把本体属性和装备一起传,那么一升级,装备加成就全部蒸发 (表现是:全队三个人的属性突然变得一模一样)。这个坑在Test时真实踩到过,已修。
B-2 · 技能书
| 来源 | 规则 |
|---|---|
| 山贼(Boss) | 8% 掉 1 本(其中 1% 是绝世技能书、7% 是珍稀) |
| 游历节点首通 | 固定给 1 本(每个节点只给一次) |
- 技能书存在仓库的「技能书」分页,是可堆叠的物品(同一本技能书多本会合并计数)。
- 学习:把技能书交给某个门人 → 该门人获得这个技能;同一技能不能重复学。
- 技能位上限 5 个:位满时会拒绝并提示"要先遗忘一个",由玩家决定丢掉哪个。
- 遗忘不返还技能书 —— 否则可以反复遗忘/学习来刷。
已实现并实测通过(2026-10-07):21 个技能全部带数值、5 人编队参战、群攻同时命中多目标、 技能书掉落与学习、仓库三个分页(装备 / 材料 / 技能书)、装备穿脱、鉴定、加工、锁定、销毁分解。 端到端验证脚本 tools/verify_equip_ui.mjs,后端回归测试 tools/test_equips.mjs。
附录 C · 挂机掉落的表现与收集动画
老大 2026-10-07:「干掉一个怪物之后,掉落的装备、金币等东西会平铺在地面上。装备用它的图标来显示, 排版为上面是名字,下面是图标,名字颜色根据属性有不同区分。物品落地后过两秒会自动飞到资源框内被收集 —— 虽然是自动捡拾,但必须要有这样一个动画过程的显示。」
C-1 · 一帧里的三层
1 落地怪物倒下的位置 弹跳出场 0.38s
→
2 停留 2 秒并排铺开 名字在上、图标在下
→
3 飞行收集抛弧线 → 目标 位移+缩小+淡出 0.78s
C-2 · 长什么样
| 元素 | 规则 |
|---|---|
| 排版 | 名字在上、图标在下(老大指定的顺序),整件东西以底部中点"站"在路面上 |
| 图标 | 真素材 public/assets/equips/_.png,武器还按门派细分(剑/刀/棍/暗器) |
| 底托 | 图标必须带浅色圆角底托 + 品质色描边。水墨线稿是浅色勾线,直接摆在浅色土路上几乎看不见 |
| 名字颜色 | 按品质上色:白 #8d8674 · 绿 #3f7a2c · 蓝 #245f9e · 金 #96690a · 传奇 #b23a0b,并带白色描边保证在任何背景上都可读 |
| 金币 / 技能书 | 没有专属素材,用 💰 / 📜 + 同样的底托与配色;技能书名字只写「技能书」,具体是哪本回仓库看 |
| 并排间距 | 94px,名字超长截断加省略号(套装名如「玄铁重甲·头盔」比较长) |
C-3 · 飞向哪里
| 掉落物 | 收集目标 |
|---|---|
| 金币 | 顶栏的金币格(到达时该格闪一下) |
| 装备 / 技能书 | 「仓库」按钮(到达时按钮闪一下)—— 东西最终就是进仓库 |
飞的是抛物线而不是直线:先略微上抛再落向目标。直线飞看着像"被吸走",不好看。
C-4 · 两个必须守住的技术点
1 用 DOM 层,不要画进条带的 canvas。 条带 canvas 只占屏幕底部 26%,而"飞向顶栏资源框"要横跨到屏幕顶部 —— 超出 canvas 的地方根本画不出来。 DOM 层(position:fixed 全屏 + pointer-events:none)天然能跨全屏, 还直接吃 CSS 过渡动画。项目里资源田的圆圈徽标就是同一套路。
2 落点只能在击杀那一刻记下来。 掉落是后端算的、异步返回 —— 等它回来时战斗早推进到下一波了。 所以 idleBattle._killMob() 里就要把 _lastKillX 存下来, 由 onReport 的第二个参数交给掉落层。位置也不能在掉落层里自己算: 地面在哪儿由条带的 groundPoint() 说了算(两处各写一份必漂)。
Jianghu · 山门 | 装备系统设计方案 v1 | 2026-10-07 | 确认后进入实现阶段