Jianghu · 三门门人 · 十八职业与人物形象设计 v1
三门门人 · 十八职业与形象
十八般兵器 → 十八职业 → 属性定位 → 装备与技能匹配 → 人物形象
v1 · 2026-10-07 · 承接《装备系统设计方案》《equip-impl-spec.md》
🔴 数值与状态核对(2026-10-10)
本文是 2026-10-07 的设计稿,实现后以下口径已变,职业名 / 定位 / 技能数一律以 server/jobs.mjs 与 server/skills.mjs 为准:
- 职业名:棍师 / 锤客 / 鞭师 / 钩客(不是棍僧 / 锤伯 / 鞭姬 / 钩叟)
- 定位:6 类(近战输出 4 / 近战敏捷 3 / 坦克 3 / 控制 3 / 远程 3 / 辅助 2),不是 5 类
- 编队:单队 3 人(前 / 中 / 后各 1),不是 5 人
- 本命兵器专精:×1.25(+25%),不是 +15%
- 技能:每兵器 12 式、全表 220 条(不是每门派 3 式 / 共 67 条);招募时的通用起手池只有轻功 2 式,多数职业实际最多抽 3 个
- 武器槽硬绑定本职业兵器大类(不符返回 409),不是"不做硬性职业限定"
- §0「现状盘点」是 2026-10-07 的历史快照,勿当现状读
本文件要解决两件事
- 人是有差别的 —— 现在招募出来的门人只有资质高低,没有"是个什么样的人"。加上 18 职业后,每个人有归属、有主武器、有本命技能树、有属性倾向。
- 人是能看见的 —— 头像 / 半身像 / 正侧背三视图,落到人物信息界面与装备穿戴。
目录
00 · 现状盘点 —— 改动的起点 01 · 十八职业总表 02 · 属性划分:四属性 → 六定位 03 · 职业 × 装备匹配 04 · 门派技能体系 05 · 接入现有系统的 6 个改动点 06 · 人物形象设定规范 07 · 十八人物 · 形象设定详表 08 · 素材制作规格 09 · 人物信息界面(半身像 + 装备格) 10 · 装备穿戴交互 11 · 落地分阶段 12 · 需要老大拍板的事
00 · 现状盘点 —— 改动的起点
先看清楚现在手里有什么。下面每一条都是代码里读出来的事实,不是设想。
| 项目 | 现状(代码事实) | 位置 | 本方案怎么动 |
|---|---|---|---|
| 门人属性 | 6 项:hp / mp / agi / str / con / int。 招募时按资质档位 roll,每项再叠加 ±35% 个体差异,没有倾向性 | server/heroes.mjs rollAttrs() | 属性 roll 前先定职业,职业给四维权重(见 §2) |
| 资质 | 甲乙丙丁戊己庚辛 8 档,目前只开放「辛」(甲拿不到) | heroes.mjs RANKS | 不动。资质决定数值高低,职业决定数值分布,两者正交 |
| 装备槽 | 8 格:武器 / 头盔 / 衣服 / 裤子 / 鞋子 / 戒指×2 / 项链 | EQUIP_SLOTS | 不改。18 种兵器共占「武器」这一格 |
| 武器模板 | 只有 5 种:断云剑 / 流月刀 / 伏魔棍 / 铁掌套 / 流星镖 | equipDefs.mjs BASE_DEFS | 扩到 18 种(每兵器 1 种,见 §3.1) |
| 图标推导 | iconBase() 里已经预留了 bow / spear / halberd / dart / saber / staff 分支 | equipDefs.mjs | 代码早就想到这一步了,只是素材和模板没跟上 |
| 技能门派 | school 只有 8 个:剑/刀/棍/拳掌/暗器 + 轻功/内功/外功 | server/skills.mjs | 扩到 18 兵器系 + 3 通用系(见 §4) |
| 技能数量 | 21 个(12 入门 + 9 高阶技能书) | SKILLS | 扩到 67 个(18 门派 × 3 + 9 通用) |
| 头像 | 从 d:/3d-game 借的 23 张通用图(12 男 11 女),按性别随机 | PORTRAITS | 改为按职业取图,新做 18 套(见 §7 / §8) |
| 已有可用头像 | 文件名里已带职业语义:p_jianke 剑客 / p_daoke 刀客 / p_anqi 暗器 / p_gongshou 弓手 | PORTRAITS | 4 张可直接复用,其余 14 个职业需新做 |
| 战斗站位 | 编队 members 数组顺序 = 上场顺序,第一人最靠前 | squads.json | 职业带推荐站位,前端编队时给排序建议(不强制) |
一句话总结:装备系统的骨架(8 槽 / 三层属性 / 词条 / 套装 / 威能)已经搭好了,缺的是"人"这一层。 18 职业不是推翻重做,而是给现有的随机门人装上"身份" —— 所有改动都是加法。
01 · 十八职业总表
取名原则:兵器是实体,职业是身份。老大举的「镖客」不是兵器名而是身份名,所以这一版统一走「兵器 → 职业名」的路子,职业名尽量一望可知其兵器。
| # | 兵器 | 职业 | 定位 | 站位 | 主 / 副属性 | 一句话特征 |
|---|---|---|---|---|---|---|
| 1 | 剑 | 剑侠 | 近战·均衡 | 前排 | 力 / 敏 | 攻守有度,单体高伤,万金油 |
| 2 | 刀 | 刀客 | 近战·多段 | 前排 | 力 / 敏 | 连劈两记,越打越快 |
| 3 | 枪 | 枪客 | 近战·贯穿 | 前排 | 力 / 敏 | 长兵一寸长一寸强,可打两排 |
| 4 | 戟 | 戟将 | 近战·范围 | 前排 | 力 / 根 | 横扫一片,站得住的输出 |
| 5 | 斧 | 斧手 | 近战·重击 | 前排 | 力 / 根 | 出手慢但一刀顶三刀 |
| 6 | 锏 | 锏侠 | 近战·破防 | 前排 | 力 / 敏 | 钝器破甲,专治硬壳 |
| 7 | 拳掌 | 拳师 | 近战·连击 | 前排 | 敏 / 力 | 贴身短打,点穴定身 |
| 8 | 棍 | 棍师 | 坦克·横扫 | 前排 | 根 / 力 | 长棍圈地,抗住并拉住一群 |
| 9 | 锤 | 锤客 | 坦克·破甲 | 前排 | 根 / 力 | 双锤砸防,越硬越打得动 |
| 10 | 拐 | 拐师 | 坦克·格挡 | 前排 | 根 / 敏 | 铁拐格挡反击,最难打死 |
| 11 | 鞭 | 鞭师 | 控制·群伤 | 中排 | 敏 / 悟 | 长鞭扫一圈,被打的都变慢 |
| 12 | 钩 | 钩客 | 控制·拉拽 | 中排 | 敏 / 悟 | 把敌人钩到跟前,定住 |
| 13 | 流星 | 流星客 | 控制·范围 | 中排 | 力 / 敏 | 链锤抡出去,一击震晕 |
| 14 | 弓 | 弓手 | 远程·单体 | 后排 | 敏 / 悟 | 蓄力一箭,秒最脆的 |
| 15 | 弩 | 弩手 | 远程·穿甲 | 后排 | 敏 / 悟 | 连弩不停,无视一半护甲 |
| 16 | 暗器 | 镖客 | 远程·多目标 | 后排 | 敏 / 悟 | 袖中飞镖,随机打一圈 |
| 17 | 药 | 药师 | 辅助·治疗 | 后排 | 悟 / 根 | 银针药囊,全队回血解毒 |
| 18 | 扇 | 扇士 | 辅助·增益 | 后排 | 悟 / 敏 | 折扇一挥,增强队友削弱敌人 |
定位分布(刻意做成金字塔)
近战输出7
剑侠 刀客 枪客 戟将 斧手 锏侠 拳师
近战坦克3
棍师 锤客 拐师
控制3
鞭师 钩客 流星客
远程输出3
弓手 弩手 镖客
为什么输出多、坦克少?
- 挂机作品里 3 人编队(前/中/后各 1),通常 1 坦 + 1 辅 + 1 输出 —— 输出职业多才抽得到想要的。
- 坦克只有 3 个,但每个都能"打",不会出现"抽到坦就浪费一个位置"。
- 辅助只放 2 个(治疗 / 增益),是最稀缺的两个位置,抽到会有惊喜感。
关于「钺、叉、抓、镗、槊、棒」这 6 件传统兵器的取舍
它们与已选的兵器功能高度重叠(钺≈斧、槊≈枪、棒≈棍、抓≈钩、镗≈锤、叉≈戟)。 强行凑齐会让 18 个职业里有 6 个是"换皮的"。所以用弓 / 弩 / 暗器 / 药 / 扇替换, 补齐"远程"和"辅助"两个必须存在的维度 —— 这是十八般兵器的精神,不是名录。
02 · 属性划分:四属性 → 六定位
现有 6 项属性里,hp 和 mp 是结果池,真正的"性格旋钮"是四个:力量 / 敏捷 / 根骨 / 悟性。 职业的本质,就是把这四个旋钮拧到不同的刻度。
2.1 四个旋钮各自管什么(读自 statsFor() 的实际公式)
| 属性 | 影响的战斗属性 | 公式(现有代码) | 流派名 |
|---|---|---|---|
| 力量 str | 攻击、生命 | atk = 8 + str×1.8 + agi×0.6 maxHp = 90 + con×6 + str×2 | 力士 —— 每点力量给 1.8 攻 + 2 血,最直接的输出 |
| 敏捷 agi | 攻击、暴击、攻速、闪避 | crit = 0.05 + agi×0.004 atkInterval = 1.15 / (1 + agi×0.012) dodge = 0.02 + agi×0.002 | 快手 —— 单点收益低,但四项一起吃,堆到高等量变 |
| 根骨 con | 生命、防御、回血 | maxHp = 90 + con×6 + str×2 def = 2 + con×0.7 hpRegen = 2 + con×0.12 | 硬骨头 —— 每点 6 血 + 0.7 防,坦克的唯一正解 |
| 悟性 int | 内力、暴伤、回蓝 | maxMp = 40 + int×4 + con×1 critDmg = 1.5 + int×0.012 mpRegen = 1.5 + int×0.10 | 内家 —— 不直接给攻,但暴伤与续航是技能流的命脉 |
关键结论:四属性天然对应「力 / 敏 / 根 / 悟」四系,不需要新增属性字段 —— 零改动就能支撑 18 职业的差异。这也是本方案不去动 heroes.mjs 公式的原因。
2.2 六定位的属性权重表(招募时按此 roll)
现在 rollAttrs() 是四项各 roll 各的,占比约 25/25/25/25。 改为:先按职业取一张权重表,再按权重分配总点数。总点数仍由资质档位决定(资质管高低),权重只管分布。
| 定位 | 力量 | 敏捷 | 根骨 | 悟性 | 战斗倾向 | 典型职业 |
|---|---|---|---|---|---|---|
| 近战·力系 | 50 | 25 | 15 | 10 | 高攻 · 中血 · 中暴击 | 刀客 戟将 斧手 锏侠 |
| 近战·敏系 | 30 | 45 | 10 | 15 | 高攻速 · 高闪避 · 耗血快 | 剑侠 枪客 拳师 |
| 坦克 | 25 | 10 | 50 | 15 | 高血 · 高防 · 低攻速 | 棍师 锤客 拐师 |
| 控制 | 15 | 35 | 15 | 35 | 高内力 · 高暴伤 · 中生存 | 鞭师 钩客 流星客 |
| 远程 | 15 | 55 | 10 | 20 | 高暴击 · 高攻速 · 极脆 | 弓手 弩手 镖客 |
| 辅助 | 10 | 15 | 30 | 45 | 高内力 · 中血 · 输出低 | 药师 扇士 |
⚠️ 与资质的关系必须说清楚
- 资质(辛~甲)决定 总点数池的大小 —— 辛级门人四个属性加起来就是比甲级少。
- 职业决定 这些点数怎么分 —— 同样总点数,力系给 50% 到力量,敏系给 45% 到敏捷。
- 两者正交:辛级斧手 vs 甲级药师,前者力量仍高于后者,但后者总点数碾压。
- 这保住了"资质分档"的意义,也保住了"职业有性格"。
2.3 单体差异保留
现有代码每项有 0.65 ~ 1.35 的 jitter。保留,但幅度从 ±35% 收缩到 ±12% (0.88 ~ 1.12)。理由:职业权重已经把分布拉开了,再叠 ±35% 会让"斧手的力量"有时低于"药师的力量", 职业特征就糊掉了。小幅度 jitter 保证同职业的两个人也不完全一样。
03 · 职业 × 装备匹配
这一节是把 18 职业"焊"到已有的装备系统上。核心原则:不做硬性职业限定,只做软性专精 —— 否则掉落池里大半东西没人能穿,仓库会变成垃圾场。
⚠️ 这一条当夜就改了 —— 老大在另一条线上明确要求硬绑定
老大原话:「职业只能用本职业的武器,不能装备其它职业的武器」。 现在 server/equips.mjs 的 equip() 已按 kind 比对职业的 weaponKind 硬卡(只卡武器槽,头盔/衣甲/鞋/戒指/项链不限)。
改得对:软性专精给不出"身份感" —— "全队都配斧头"的最优解会一直在,职业的辨识度就散了。
⇒ 连带两处补偿:1 掉落按队伍职业加权(_weaponBias, 队里没人用的形制降权到 1/4);2 招募时自带本职业白武器。
下面 §3.3 保留的是当时的推导过程(为什么一开始选软性),实现以其后的 §13 为准。
3.1 十八种武器模板(扩 BASE_DEFS 的武器部分)
基准档位统一按 tier 3(growth 1.045),与现有 sword_duanyun 同档。 下表 base 是 ilvl=1 的种子值,实际值由公式 base × growth^(ilvl-1) 推出。
| # | 职业 | defId | 名称 | base(ilvl 1) | 词条池(优先 roll) | 状态 |
|---|---|---|---|---|---|---|
| 1 | 剑侠 | sword_duanyun | 断云剑 | {atk:26} | atk str crit spd armorPen | 已有 |
| 2 | 刀客 | dao_liuyue | 流月刀 | {atk:28} | atk str critDmg killheal dmgPct | 已有 |
| 3 | 枪客 | spear_chuanxin | 穿心枪 | {atk:27, armorPen:0.05} | atk str armorPen spd crit | 新增 |
| 4 | 戟将 | halberd_fangtian | 方天戟 | {atk:30, maxHp:80} | atk str maxHp critDmg dmgPct | 新增 |
| 5 | 斧手 | axe_kaishan | 开山斧 | {atk:34} | atk str critDmg dmgPct maxHp | 新增 |
| 6 | 锏侠 | mace_sileng | 四棱锏 | {atk:25, armorPen:0.06} | atk str armorPen crit def | 新增 |
| 7 | 拳师 | quan_tiezhang | 铁掌套 | {atk:22, def:6} | atk agi spd crit dodge | 已有 |
| 8 | 棍师 | gun_fumo | 伏魔棍 | {atk:30, maxHp:120} | atk con maxHp armorPen reduce | 已有 |
| 9 | 锤客 | hammer_zhentian | 震天锤 | {atk:33, def:8} | atk con armorPen maxHp reduce | 新增 |
| 10 | 拐师 | crutch_tieguai | 铁拐 | {atk:20, def:12} | def con dodge reduce hpregen | 新增 |
| 11 | 鞭师 | whip_jiaolong | 蛟龙鞭 | {atk:24, maxMp:40} | atk agi spd dmgPct maxMp | 新增 |
| 12 | 钩客 | hook_duanhun | 断魂钩 | {atk:25, crit:0.02} | atk agi crit armorPen spd | 新增 |
| 13 | 流星客 | meteor_suohun | 锁魂锤 | {atk:29, maxHp:60} | atk str dmgPct maxHp critDmg | 新增 |
| 14 | 弓手 | bow_luori | 落日弓 | {atk:31} | atk agi crit critDmg spd | 新增 |
| 15 | 弩手 | crossbow_liannu | 连弩 | {atk:26, armorPen:0.07} | atk agi armorPen spd crit | 新增 |
| 16 | 镖客 | anqi_liuxing | 流星镖 | {atk:24} | atk agi crit armorPen beast | 已有 |
| 17 | 药师 | yao_yaonang | 药囊银针 | {atk:16, maxMp:80} | int maxMp mpregen hpregen skillDmg | 新增 |
| 18 | 扇士 | fan_yushan | 玉骨折扇 | {atk:20, maxMp:60} | int maxMp skillDmg mpcost critDmg | 新增 |
⚠️ 上表的数值已在实现时调整过一次,最终以 server/equipDefs.mjs 为准
设计稿写的是"每兵器 1 件、攻击 24~34",落地时发现两个问题:
1 裸攻击差 30% 会把"本命"淹掉 —— 斧 34 给剑侠用,比本命剑 26×1.15 还强, 玩家的最优解变成"全队都配斧头"。
2 每兵器只有 1 件,某些职业在高等级场景永远掉不到本命武器 (t1 与 t5 在 ilvl 70 的攻击差 5 倍),18 职业的差异到后期就崩了。
所以改成:每种兵器 × 3 档(t1 粗制 / t3 常制 / t5 名器,共 54 件), 裸攻击收敛到 24~30,专精倍率提到 1.25 ⇒ 同档同品质下「本命永远不亏」(tools/verify_jobs.mjs 有硬断言)。 兵器的个性改由副属性 + 词条池表达。
净新增 49 种武器模板(18 兵器 × 3 档 = 54 件,其中 5 件是原有的)。 每种兵器还需要一张图标素材,见 §8.3。
3.2 防具体系扩展:轻 / 中 / 重三系
现有防具(头盔/衣服/裤子/鞋子)各只有 3 个模板,且全部偏向"防御 + 生命"。 按职业定位,把每个部位扩成三类:
| 甲系 | base 倾向 | 适合定位 | 适合职业 |
|---|---|---|---|
| 轻甲 | {def:低, maxHp:中, agi:有} | 远程 / 敏系近战 / 控制 / 辅助 | 剑侠 枪客 拳师 鞭师 钩客 弓手 弩手 镖客 药师 扇士 |
| 中甲 | {def:中, maxHp:中, 均衡} | 均衡近战 | 刀客 锏侠 戟将 流星客 |
| 重甲 | {def:高, maxHp:高, 减攻速} | 坦克 / 重兵 | 斧手 棍师 锤客 拐师 |
落地方式(最小改动):不新增槽位、不新增品质逻辑,只在 BASE_DEFS 的防具部分 每个部位从 3 个模板扩到 6 个模板(轻 ×2 / 中 ×2 / 重 ×2,覆盖不同 tier), 词条池按甲系区分(轻甲池带 agi/dodge,重甲池带 con/reduce)。装备本身不绑定职业,谁都能穿。
3.3 武器专精(原方案是软性绑定 → 已改为硬绑定,见上一节的提示)
| 规则 | 内容 |
|---|---|
| 本命武器 | 每个职业有 1 个本命 defId 前缀。穿本命武器时,武器基础属性 ×1.25(专精加成) |
| 非本命武器 | 照样能穿,只是没有专精加成 —— 一把高 ilvl 的斧头给剑侠穿,仍然可能比低 ilvl 的本命剑强 |
| 为什么不做硬限定 | 挂机掉落是随机的。硬限定会让 7/8 的武器掉落变成"没人能用",仓库瞬间塞满废品, 而且老大要的"从仓库拖装备到人身上"会因为大部分拖不动而失去手感 |
| 实现成本 | statsFor() 里加一个 if (itemDef.kind === job.weaponKind) mul = 1.25,十行内 |
| 界面提示 | 装备格上给本命武器打一个金色小角标「本命」,鼠标悬停显示"+25% 专精" |
3.4 掉落池加权(P2 可选)
后端 rollItem() 抽武器时,按当前队伍里各职业的人数加权武器类型 (队里有 2 个剑侠 → 剑的权重 ×1.6)。这样挂机越久越容易掉出"能用"的东西。 注意:rollItem() 目前是无状态函数,要做这个需要把队伍信息传进去 —— 列入 P2,不阻塞主线。
04 · 门派技能体系
现有 21 个技能只有一个 school 字段标识门派,且只有 8 个门派。扩到 18 兵器系 + 3 通用系, 每兵器 12 式(起手 3 / 良品 3 / 精品 3 / 宝器 2 / 传奇 1)+ 轻功 4,全表 220 条。
4.1 门派 school 命名(兼容现有存档)
🔴 现有 5 个兵器 school 的 key 必须保留 —— 老存档里 skills 是技能 id 数组, 改 key 会让"剑侠身上的基础剑法"查不到定义。
现用:jian 剑 / dao 刀 / gun 棍 / quan 拳掌 / anqi 暗器 · 通用:qinggong 轻功 / neigong 内功 / waigong 外功
| # | 职业 | school | # | 职业 | school |
|---|---|---|---|---|---|
| 1 | 剑侠 | jian 已有 | 10 | 拐师 | guai 新增 |
| 2 | 刀客 | dao 已有 | 11 | 鞭师 | bian 新增 |
| 3 | 枪客 | qiang 新增 | 12 | 钩客 | gou 新增 |
| 4 | 戟将 | ji 新增 | 13 | 流星客 | liuxing 新增 |
| 5 | 斧手 | fu 新增 | 14 | 弓手 | gong 新增 |
| 6 | 锏侠 | mace 新增 | 15 | 弩手 | nu 新增 |
| 7 | 拳师 | quan 已有 | 16 | 镖客 | anqi 已有 |
| 8 | 棍师 | gun 已有 | 17 | 药师 | yao 新增 |
| 9 | 锤客 | chui 新增 | 18 | 扇士 | shan 新增 |
通用系保留 3 个:qinggong 轻功 / neigong 内功 / waigong 外功 —— 任何职业都能学,是技能书的通用池。
4.2 门派技能设计公式
每个门派 3 个技能,按统一套路产出,保证 18 个门派"手感一致、数值对齐":
| 档位 | 品质 | 定位 | 倍率区间 | CD | 耗蓝 | 获得方式 |
|---|---|---|---|---|---|---|
| 起手式 | common 普通 | 该门派的基础用法,体现职业特色 | 1.0 – 1.6 | 3.5 – 7 | 6 – 16 | 招募时随机 1–5 个(从本门派池抽) |
| 进阶技 | rare 珍稀 | 放大门派特征,带 1 个附加效果 | 1.4 – 3.1 | 6 – 9 | 16 – 30 | 技能书掉落(7%) |
| 绝学 | epic 绝世 | 门派招牌,全场/单体核爆 | 1.1 – 4.2 | 11 – 13 | 36 – 42 | 技能书掉落(1%) |
⚠️ 招募时的技能抽取规则要改
现在是 STARTER_SKILL_IDS(12 个入门技能)里无条件随机抽 —— 结果会出现"弓手身上带着刀法入门"。 改为:本门派起手式必抽 1 个,其余从「本门派起手式 + 通用轻功 2 式」里随机抽 0–4 个。 这样每人至少会一个本命技能,职业特征立刻立住。
4.3 十八门派技能名一览
只列名字与定位,具体数值在实现阶段填(填法照 §4.2 的区间)。⭐ = 现有技能可复用改归属。
1 · 剑侠 jian 近战·均衡
- ⭐基础剑法 · 起手 · 单体 1.35
- ⭐剑气纵横 · 进阶 · 前排 3 · 1.60
- 万剑归宗 · 绝学 · 全体 · 1.40
2 · 刀客 dao 近战·多段
- ⭐刀法入门 · 起手 · 单体 2 段 · 1.15
- 狂刀三叠 · 进阶 · 单体 3 段 · 1.05/段
- ⭐血战八荒 · 绝学 · 全体 · 吸血 20%
3 · 枪客 qiang 近战·贯穿
- 拦拿扎 · 起手 · 单体 1.30 · 破防 10%
- 回马枪 · 进阶 · 后排 2 · 1.70(越过前排打后排)
- 百鸟朝凤 · 绝学 · 前排 3 · 5 段 · 0.55/段
4 · 戟将 ji 近战·范围
- 横戟立马 · 起手 · 前排 2 · 1.10
- 横扫千军 · 进阶 · 全体 · 1.15
- 破军 · 绝学 · 全体 · 1.30 · 自身防御 30% 转攻击
5 · 斧手 fu 近战·重击
- 力劈华山 · 起手 · 单体 1.60 · 攻速慢
- 旋风斩 · 进阶 · 前排 3 · 1.25
- 开天辟地 · 绝学 · 单体 4.00 · 若目标生命 <30% 直接斩杀
6 · 锏侠 mace 近战·破防
- 双锏点打 · 起手 · 单体 2 段 · 1.00/段
- 断筋锏 · 进阶 · 单体 1.80 · 破防 35% / 6s
- 碎甲 · 绝学 · 前排 2 · 1.90 · 无视 50% 防御
7 · 拳师 quan 近战·连击
- ⭐长拳 · 起手 · 单体 1.50 · 破防 15%
- ⭐点穴术 · 进阶 · 定身 1.5s
- ⭐亢龙有悔 · 绝学 · 单体 4.20 · 破防 30%
8 · 棍师 gun 坦克·横扫
- ⭐棍法 · 起手 · 前排 2 · 1.05
- 韦陀护法 · 进阶 · 自身 · 减伤 45% / 8s · 受击回内力
- ⭐罗汉伏魔 · 绝学 · 全体 · 击晕 30%
9 · 锤客 chui 坦克·破甲
- 双锤交击 · 起手 · 单体 1.20 · 破防 20%
- 地裂 · 进阶 · 前排 2 · 1.35 · 击晕 25%
- 擂鼓瓮金 · 绝学 · 全体 · 1.00 · 全体破防 30%
10 · 拐师 guai 坦克·格挡
- 铁拐横挡 · 起手 · 自身 · 减伤 30% / 5s
- 拐打连环 · 进阶 · 单体 1.40 · 闪避 +20% / 6s
- 不动明王 · 绝学 · 自身 · 8s 内反弹 100% 伤害
11 · 鞭师 bian 控制·群伤
- 软鞭缠腕 · 起手 · 单体 1.20 · 减速 20%
- 长鞭扫堂 · 进阶 · 前排 3 · 1.00 · 全体减速 25%
- 天罗地网 · 绝学 · 全体 · 0.90 · 全体定身 2s
12 · 钩客 gou 控制·拉拽
- 擒拿钩 · 起手 · 单体 1.15 · 拉近
- 锁喉 · 进阶 · 单体 1.60 · 定身 1.5s
- 勾魂夺魄 · 绝学 · 单体 2.60 · 定身 3s · 被盗取 20% 攻击 8s
13 · 流星客 liuxing 控制·范围
- 流星追月 · 起手 · 随机 2 · 1.05
- 锁链连击 · 进阶 · 随机 3 · 0.95 · 击晕 20%
- 陨星落 · 绝学 · 全体 · 1.10 · 击晕 35% / 1.5s
14 · 弓手 gong 远程·单体
- 引弓射月 · 起手 · 最远一只 · 1.45
- 连珠箭 · 进阶 · 单体 3 段 · 1.00/段
- 落日神射 · 绝学 · 单体 3.60 · 对满血目标 +50%
15 · 弩手 nu 远程·穿甲
- 平射 · 起手 · 单体 1.25 · 破防 15%
- 连环弩 · 进阶 · 前排 3 · 0.85 · 破防 20%
- 穿云裂石 · 绝学 · 单体 2.80 · 无视 60% 防御
16 · 镖客 anqi 远程·多目标
- ⭐暗器手法 · 起手 · 随机 3 · 0.85
- 满天花雨 · 进阶 · 随机 4 · 0.90
- ⭐暴雨梨花 · 绝学 · 随机 5 · 0.90 · 每命中一次暴击率 +2%
17 · 药师 yao 辅助·治疗
- 金针渡厄 · 起手 · 单体治疗 12%
- 清心散 · 进阶 · 全队解除减益 + 回血 18%
- 起死回生 · 绝学 · 全队回血 35% · 3s 内减伤 50%
18 · 扇士 shan 辅助·增益
- 清风徐来 · 起手 · 全队攻速 +15% / 8s
- 指点江山 · 进阶 · 全队攻击 +20% / 8s;敌全体攻击 −15%
- 谈笑风生 · 绝学 · 全队暴击 +25%、暴伤 +40% / 10s;敌全体减速 30%
4.4 与通用系的搭配
技能位上限仍是 5 个(MAX_SKILLS)。典型配置: 本门派 3 个 + 通用 2 个(如轻功「御风步」+ 内功「龟息功」)。 通用技能通过技能书掉落到通用池,任何职业学到都会立刻有用 —— 这是技能书的"保底价值"。
05 · 接入现有系统的 6 个改动点
这一节是给开发看的:每个改动点都标了文件和函数,可以照单执行。
| # | 改动点 | 文件 / 函数 | 改动内容 | 风险 |
|---|---|---|---|---|
| 1 | 职业定义表 | server/jobs.mjs(新文件) | 18 职业的 {jobId, name, weapon, school, role, slotRow, attrWeight, portraitPool, desc};导出 JOBS / ROLL_FOR 权重换算函数 | 新增 |
| 2 | 招募时定职业 | heroes.mjs makeHero() | 先 pickJob() → 按职业取 attrWeight 分配点数 → 技能从本门派池抽。 性别 / 名字 / 头像按性别+职业取 | 核心 |
| 3 | 老存档迁移 | heroes.mjs _migrate() | 没有 job 字段的老门人:按现有 skills[0] 的 school 反推职业; 查不到就按属性最高项推(力→斧手 / 敏→弓手 / 根→棍师 / 悟→药师) | 必做 |
| 4 | 技能表扩展 | skills.mjs SKILLS | 21 → 67 个(见顶部核对块);新增 STARTER_BY_SCHOOL 映射(门派 → 起手式池) | 增量 |
| 5 | 武器 / 防具模板 | equipDefs.mjs BASE_DEFS | 武器 5 → 18 种;防具每部位 3 → 6 个(轻/中/重) | 增量 |
| 6 | 武器专精加成 | heroes.mjs statsFor() | 汇总装备时,判定 defn.kind === job.weaponKind → 该件 base ×1.25 | 10 行 |
接口层几乎不用动
GET /api/heroes 的返回里多带一个 job 字段和 jobDefs 表; GET /api/game/meta 的 skills 自动变大,equipDefs 自动变多 —— 都是既有结构,前端无需改协议。
06 · 人物形象设定规范
18 个人物要能一眼分辨。在做素材之前,先把「怎么描述一个人」这件事标准化 —— 否则生图时每次写法不一样,出来的 18 个人会像 18 个不同作品里的角色。
6.1 六层描述法(每个人物都按这六层写)
| 层 | 描述什么 | 为什么要写死 |
|---|---|---|
| 1 气质关键词 | 3 个字以内的性格标签,如「冷峻」「憨厚」「风流」 | 决定整体神态,是其他五层的总纲 |
| 2 面容与发型 | 脸型 / 眉眼 / 胡须(男)/ 发髻样式 | 头像的核心识别点 —— 招募列表里只有一张脸 |
| 3 服饰与时色 | 主色 + works式(长衫 / 短打 / 僧袍 / 劲装) | 18 个人站在一起时,颜色是第一分辨维度 |
| 4 配饰 | 发冠 / 抹额 / 护腕 / 腰带 / 披风 / 挂件 | 老大点名要的部分,也是半身像的细节密度来源 |
| 5 兵器形制 | 长度 / 刃形 / 材质 / 握法 | 决定装备图标怎么画,也决定战斗动画的动作幅度 |
| 6 体态与站姿 | 身高体形 + 待机姿态 | 三视图与半身像的构图基准 |
6.2 全局风格约束(所有 18 人共用)
画风:水墨武侠 · 折纸/剪纸质感(与现有 _gen_panorama_origami、大殿折纸楼阁同一套视觉语言)
- 线条:硬边、少渐变,边缘像剪纸剪出来
- 上色:平涂为主 + 单层暗部,不用写实光源
- 描边:外轮廓保留 1–2px 深色边(缩到 128px 时仍能看清剪影)
- 禁用:照片写实、厚涂、赛博/日系萌化、3D 渲染质感
- 背景:一律透明(Alpha 通道),不画场景
🔴 生成透明底素材必须走的链路(本机实测有效,别绕)
文生图(白底)→ 粗抠 → 再喂给 Seedream 做图生图精修,请求里带 background:"transparent" + output_format:"png" + 1 张自带 Alpha 的输入图。 没有"文生图直接出透明"这条路,且不能一次多张(sequential_image_generation 会 400)。 脚本用 tools/ark2.py(不用 3d-game 的 ArkClient,它没暴露这两个参数)。
6.3 十八职业的主色板
每人一个主色,用于服饰主调与素材标签色。色相尽量分散,保证 18 个人的缩略图排成一行时不会糊成一片。
| # | 职业 | 主色 | 色值 | # | 职业 | 主色 | 色值 |
|---|---|---|---|---|---|---|---|
| 1 | 剑侠 | 青蓝 | #4a7c9b | 10 | 拐师 | 苍青 | #3f5a5f |
| 2 | 刀客 | 赤褐 | #a8432f | 11 | 鞭师 | 绛紫 | #7a3f6a |
| 3 | 枪客 | 墨绿 | #3f6b4f | 12 | 钩客 | 墨青 | #37474f |
| 4 | 戟将 | 深金 | #b8860b | 13 | 流星客 | 铜橙 | #a05a2c |
| 5 | 斧手 | 铁灰 | #5a5f63 | 14 | 弓手 | 草绿 | #4f7a3a |
| 6 | 锏侠 | 玄铁 | #4a4a52 | 15 | 弩手 | 靛蓝 | #3a5a8c |
| 7 | 拳师 | 赭石 | #b06f3a | 16 | 镖客 | 藏蓝 | #2f4a6b |
| 8 | 棍师 | 僧褐 | #8a6a3f | 17 | 药师 | 药绿 | #5f8a5a |
| 9 | 锤客 | 石青 | #51707a | 18 | 扇士 | 月白 | #8a9bb0 |
07 · 十八人物 · 形象设定详表
每个职业给出男女两版(性别是招募时随机 roll 的),形象差异主要落在发型、体型与服饰收腰上,配饰与兵器完全一致。
01剑侠剑 · 青蓝近战·均衡
气质清朗 · 端方 · 有分寸
面容剑眉星目,鼻梁挺直,下颌线干净。男:束高马尾,两缕垂发;女:单侧玉簪绾发,余发过肩
服饰青蓝直裰长衫,衣摆开高衩,束袖口(方便拔剑);内衬月白中衣
配饰束发银环 · 左腕窄皮护腕 · 腰间玉扣革带 · 背后斜挎剑鞘(鞘身缠青绳)
兵器三尺单手长剑,剑身窄直,剑格为素面铜盘,剑穗青
体态中等身高,站姿侧身半立,右手虚按剑柄
02刀客刀 · 赤褐近战·多段
气质粗豪 · 直爽 · 一点Jianghu气
面容浓眉阔口,颧骨高;男:络腮短须、乱束发;女:高马尾、额前一道红抹额
服饰赤褐短打劲装,外罩半臂皮坎肩,腰缠宽布带
配饰红抹额 · 双腕牛皮护臂(右边磨得发亮)· 腰后挂酒葫芦 · 布带打结处坠一枚铜钱
兵器宽刃单刀,刀背厚、刀尖上挑,刀柄缠麻绳,无刀穗
体态肩宽胸厚,站姿开腿下盘沉,刀扛在肩上
03枪客枪 · 墨绿近战·贯穿
气质沉稳 · 有杀气但不外露
面容方脸,眼神平视锐利,眉尾下垂显沉静;男:短发束巾;女:低马尾,耳后别一支短翎
服饰墨绿战袍配窄袖,身前一块护心镜软甲,下摆扎进裤腰
配饰深色头巾 · 护心镜 · 双肩皮绦 · 枪杆斜背时用的肩垫
兵器丈八长枪,枪头窄长柳叶形,红缨一束,杆为白蜡木
体态高瘦挺拔,站姿双脚前后错开,枪尾点地
04戟将戟 · 深金近战·范围
气质威严 · 军伍气 · 不苟言笑
面容国字脸,浓须(男)/ 眉峰英挺(女),眼神直视前方
服饰深金鱼鳞软甲罩深红战袍,肩覆兽首肩吞,臂缚护甲片
配饰铁胄(可执于臂下)· 兽首肩吞 · 宽腰间甲带 · 背后短披风(金边)
兵器方天画戟,月牙双枝,戟尖鎏金,杆身缠深红缨
体态高壮,站姿正面直立,戟立于侧
05斧手斧 · 铁灰近战·重击
气质憨猛 · 少言 · 力气大
面容圆脸厚唇,眉毛粗短;男:寸头 + 下巴短须;女:粗辫盘头、额宽
服饰铁灰粗布短褂,只系一条斜襟带,双肩赤裸(女款加短袖)
配饰磨刀石(挂腰)· 粗麻护腕 · 磨破的布缠小腿 · 无多余装饰
兵器双刃开山斧,斧面厚重有缺口,木柄末端缠布
体态矮壮敦实,两臂张开,斧扛肩
06锏侠锏 · 玄铁近战·破防
气质冷硬 · 寡言 · 一板一眼
面容瘦长脸,颧骨线条硬,薄唇紧抿;男:短髻包头;女:束发无饰、鬓角利落
服饰玄铁色窄袖劲装,胸前交叉绑带,无任何纹样
配饰黑色束发带 · 双腕窄铁护手 · 腰间素铁扣 · 背后双锏交叉插鞘
兵器四棱铁锏一对,棱面有细槽,无刃,柄尾有配重球
体态精瘦结实,站姿正面,双手各执一锏垂身侧
07拳师拳掌 · 赭石近战·连击
气质精悍 · 沉静 · 内敛的爆发
面容方脸薄须(男)/ 圆润但有筋骨(女),眼神落在对手身上
服饰赭石短打对襟褂,深色束腰,裤脚紧扎,胸口敞开半幅露出内衬
配饰双腕缠布绑带(缠到掌根)· 腰间布囊装药膏 · 布鞋薄底
兵器无兵刃。双拳缠布,指节包一层薄铁片(虎指)
体态中等偏矮,紧凑,站姿双拳一前一后,微沉膝
08棍师棍 · 僧褐坦克·横扫
气质宽厚 · 木讷 · 佛气
面容圆脸垂耳,光头(男)/ 光头(女,同样剃度),眉目下垂显得温和
服饰僧褐短僧袍 + 深灰偏衫,右肩袒露(女款加内衬),腰束布带
配饰108 颗木念珠(挂颈)· 左腕一串小念珠 · 腰间布袋 · 背后斗笠
兵器齐眉长棍,棍身素木,两端包铁箍,无装饰
体态壮硕宽肩,站姿如松,单掌立胸前(合十半式)
09锤客锤 · 石青坦克·破甲
气质老练 · 慢条斯理 · 有威慑感
面容国字脸,花白短须(男)/ 眼尾有细纹(女),神态不紧不慢
服饰石青厚布袄(外罩)配宽皮腰带,袖口扎紧,下摆过膝方便发力
配饰皮护肩 · 双腕厚皮护手 · 腰间铁环挂钩(挂锤用)· 腿绑护膝
兵器一对短柄重锤,锤头方形带棱,柄尾系短链可绕腕
体态不高但极厚,站姿重心极低,两锤垂在身侧
10拐师拐 · 苍青坦克·格挡
气质沉默 · 坚韧 · 有点孤僻
面容瘦削脸,颧骨高,眼神向下(不与人直视);男:乱发束带;女:紧贴头皮的编发
服饰苍青旧袍,多处打补丁,外罩一件破边披风(挡兵器用)
配饰破边披风 · 双腕铁环护腕 · 腿绑(左右不对称,一边高一边低)
兵器铁拐一对,上端为横握柄,下端包铁尖,拐身有缠布握位
体态中等身高,习惯性佝偻,站姿双拐交叉在身前(防御式)
11鞭师鞭 · 绛紫控制·群伤
气质妖娆 · 危险 · 笑里藏刀
面容凤眼上挑,唇角带笑;女:高挽髻 + 步摇;男:长发半披 + 耳坠
服饰绛紫窄袖长裙(高开衩方便舞鞭),上襦贴身,肩披薄纱
配饰金步摇 · 耳坠 · 细腰链(挂小铃)· 臂钏 · 薄纱披帛
兵器九节软鞭,鞭身紫黑皮革,鞭梢一节包铜,缠于左臂
体态高挑,S 形站姿,一手叉腰一手垂鞭尾
12钩客钩 · 墨青控制·拉拽
气质阴鸷 · 精于算计 · 手快
面容瘦长脸,三角眼,山羊胡(男)/ 眼线细长(女),嘴角微撇
服饰墨青紧身夜行衣,外罩深灰罩衫,袖口扎得极高(露小臂)
配饰抹额(深灰)· 双腕细铁爪套 · 腰间工具袋(装钩索)· 背后短披
兵器双钩,钩身弧形带倒刺,柄尾有短链可甩出
体态偏矮精瘦,站姿含胸,双手钩在袖中半露
13流星客流星锤 · 铜橙控制·范围
气质豪迈 · 张扬 · 爱显摆
面容阔面大眼,笑起来露齿;男:卷发短须;女:卷发扎高、单耳大环
服饰铜橙短打配深棕短罩衫,胸襟敞开,肩挂铁链斜带
配饰铁链斜肩带(挂锤用)· 双腕铜环 · 腰间铜扣宽皮带 · 单耳大环(女)
兵器流星锤(长链双头),两端瓜形铁锤带尖刺,链长约五尺
体态高大,站姿岔腿,铁链缠在右臂上
14弓手弓 · 草绿远程·单体
气质专注 · 寡言 · 耐得住性子
面容细长眼,单眼皮,视线很沉;男:短发贴额;女:低马尾 + 额发
服饰草绿猎装,短款上衣便于拉弦,右肩加厚护布,下装为束腿猎裤
配饰右臂及右胸皮革护弦板 · 腰间箭囊 · 左腕护腕 · 背后备用弓弦
兵器长梢反曲弓,弓身缠藤,弓弦为白牛筋
体态中等偏瘦,站姿侧身,弓提在左手
15弩手弩 · 靛蓝远程·穿甲
气质冷静 · 机械感 · 一丝不苟
面容面无表情,眉平眼直;男女都束紧发(避免挂到弩机)
服饰靛蓝工装式劲装,多口袋,腰带挂工具,右肩铁质肩甲
配饰护目皮镜(挂额上)· 腰间箭匣 · 工具小袋 · 双腕铁护手
兵器连弩,木臂 + 青铜弩机,上弦处有齿条,可挂三支短矢
体态中等身高,站姿正面平举弩(瞄准姿态)
16镖客暗器 · 藏蓝远程·多目标
气质机敏 · 圆滑 · 眼观六路
面容小圆脸,眼珠灵活,爱笑;男:束髻 + 短髭;女:双髻
服饰藏蓝行商装(像走镖的),外面套一件多暗袋的半臂背心
配饰双腕袖箭机 · 腰间三排镖袋 · 领口插一把小折扇 · 背后包袱
兵器飞镖(柳叶形,尾带红绸),另配袖箭筒两支(绑小臂内侧)
体态中等身高,站姿放松,右手两指夹一枚镖
17药师药 · 药绿辅助·治疗
气质温和 · 耐心 · 有点唠叨
面容圆润脸型,眉眼柔和,嘴角自然上翘;男:束发戴方巾;女:低髻 + 木簪
服饰药绿长袍(开襟,方便取药),外面系一条深色围裙式前襟,袖口宽大
配饰方巾 / 木簪 · 腰间药囊(大小两个)· 背后藤编药箱 · 手腕挂一串小铜铃
兵器不持长兵。右手执银针(三寸、见于指间),左手按药囊
体态中等身高,站姿放松,微微前倾(照看伤者)
18扇士扇 · 月白辅助·增益
气质风流 · 从容 · 一切尽在掌中
面容眉目疏朗,唇角微扬,眼神带一点笑意;男:高束发 + 玉冠;女:男装束发或高马尾(飒)
服饰月白广袖长衫,外罩浅灰半臂,衣襟绣竹叶暗纹,下摆垂感强
配饰玉冠 / 玉簪 · 腰间玉佩(系长穗)· 折扇挂坠 · 广袖口内衬深色
兵器玉骨折扇,扇面绘水墨山水,扇骨末端包铜
体态清瘦挺拔,站姿从容,扇半开遮在下颌前
08 · 素材制作规格
8.1 三类人物素材
| 素材 | 尺寸 | 格式 | 用量 | 用在哪 |
|---|---|---|---|---|
| 头像(bust 头肩) | 512 × 512 | WebP(带 Alpha) | 18 职业 × 2 性别 = 36 张 | 招募候选卡 / 编队列表 / 门人名册 / 战斗条带小图标 |
| 半身像(腰以上) | 768 × 1152(2:3) | WebP(带 Alpha) | 18 × 2 = 36 张 | 人物信息界面主视觉;仓库装配面板 |
| 三视图(正 / 侧 / 背) | 各 1024 × 1024 | PNG(可白底) | 18 × 3 = 54 张 | 设定图存档;后续做 3D 或战斗精灵表时的唯一依据 |
为什么半身像用 2:3 而不是方形
人物信息界面里,半身像要和人身边的 8 个装备格共存。2:3 的竖构图在 1080p 上大约是 420×630, 两侧各留 ~180px 放装备格刚好。方图会让人物显得太矮胖,装备格也没地方摆。
8.2 生图工作流(按本机实测的坑排好序)
| 步 | 做什么 | 要点 |
|---|---|---|
| 1 | 写提示词 | 按 §6.1 的六层结构写;不要用 ASCII 双引号包裹中文(会截断字符串) |
| 2 | 文生图出白底初稿 | 先出 1:1 或 2:3,不要出宽幅(模型按输入比例输出,宽幅会浪费有效像素) |
| 3 | 粗抠成带 Alpha 的 PNG | 用 rembg 或阈值法,边缘粗糙没关系 |
| 4 | Seedream 图生图精修 | background:"transparent" + output_format:"png",只喂 1 张 |
| 5 | 人工挑图 | 同一人出 3–4 版备选,取 mtime 最新的那批(按文件名排序会拿到旧版) |
| 6 | 后处理归一 | 统一画布尺寸、统一人物头顶留白、统一基线(照抄 tools/install_action_sheets.py 的对齐思路) |
| 7 | 转 WebP 交付 | 无损 PNG 动辄 9MB,交付一律 WebP |
8.3 附带要做的图标素材
| 素材 | 尺寸 | 数量 | 说明 |
|---|---|---|---|
| 武器图标 | 128 × 128 | 18 兵器 × 5 品质 = 90 张 | 前端拼 ./assets/equips/weapon__.png; iconBase() 已给出 kind 推导规则 |
| 职业徽记 | 64 × 64 | 18 张 | 招募卡与门人名册上的小角标,用一个简化的兵器剪影 + 主色圆底 |
| 门派技能图标 | 96 × 96 | 67 个技能 ≈ 67 张(见顶部核对块) | 现有技能用的是 emoji 占位(⚔🗡🔪),可先沿用,后续替换 |
🔴 精灵表总宽红线
挂机战斗用的动作精灵表:每格宽 × 帧数 不能超 GPU 纹理上限(常见 8192)。 实测 10 帧 × 920px = 9200px 已超;把帧高从 720 降到 480 → 6200px 才安全。 18 个职业如果都做全套动作(跑/打/技能/受击),素材量会非常大 —— 见 §11 的分期建议。
09 · 人物信息界面(半身像 + 装备格)
老大要的核心交互:点开一个人,看见他的样子,看见他身上穿什么,能当场给他换装备。 下面这个线框按 1920×1080 的浮窗画(实际弹窗约 1180×720)。
门人 · 详情 刀客 · 流月刀 · 资质辛 · Lv 12 ✕
半身像 768×1152(透明底)
人物半身像
头盔 铁札盔 +3
项链 玉佩
武器 流月刀 +5 本命
衣服 皮甲
戒指 1 铜环
戒指 2 空
裤子 皮裤
鞋子 皮靴
装备格共 8 个,环绕在人物各部位对应的位置;本命武器格加金色描边
属性 本体属性(招募时定,永不改)
生命682 内力176 敏捷31 力量44 根骨18 悟性15
装备加成(仅作用于战斗属性)
攻击 +74 防御 +38 暴击 +6.4% 破防 +11% 专精 ×1.25
战斗属性(1 × 公式 × 3)
攻击287 防御62 暴击18.4% 生命1,204 闪避8.2% 攻速1.28s
技能 3 / 5 刀法入门 普通 · 2 段
狂刀三叠 珍稀 · 3 段
御风步 通用 · 增益
- 空位
- 空位
操作 装备仓库
一键最强
学习技能书
加入编队
战力 3,842 · 所在小队 第一小队
9.1 布局的四条规矩
| 规矩 | 说明 |
|---|---|
| 左人右数 | 左侧 40% 放半身像 + 装备格,右侧 60% 放属性 / 技能 / 操作。不要上下分 —— 半身像是 2:3 竖图,上下分会把它压扁 |
| 装备格贴部位 | 头盔在头顶、鞋子在脚边、武器在手侧 —— 老大要的"在人物形象各部位及周边"。位置固定不随装备变动,空槽显示虚线框 |
| 属性分两段 | 「本体属性」和「战斗属性」分开画,中间用一行灰字标出"装备加成"—— 让玩家看得见"穿上装备之后强了多少" |
| 本命有强调 | 武器格若是本命武器,加金色描边 + 右上角「本命」小字 + 属性面板显示「专精 ×1.25」 |
9.2 从战斗条带到信息界面的入口
挂机条带上的人物本来就能点(现有 idleBand.js 有命中检测)。加一条: 点条带上的我方角色 → 打开该门人的详情浮窗。另外门人名册(现无,需新做)里点任意一行也开这个窗。
10 · 装备穿戴交互
老大原话:「可以从仓库里,将装备拖动或选择,穿戴到人物身上」。 拖拽和点选两种都要有 —— 桌面玩家爱拖拽,但拖拽在移动端很别扭,点选是保底。
10.1 两种交互的完整流程
方式 A · 拖拽(桌面优先)
- 人物详情窗里点「装备仓库」→ 右侧滑出仓库侧栏(不遮挡人物区)
- 仓库侧栏默认按可穿过滤:已按此人的槽位空闲情况高亮可选装备
- 按住一件装备 → 该装备跟随光标(半透明浮层)
- 光标进入可放置的槽位 → 该槽位金色描边 + 轻微放大;不可放置的槽位变灰
- 松手 → 落位;原装备自动回仓库;数字变化用滚动动画表现
方式 B · 点选(移动端 / 键盘)
- 点仓库里一件装备 → 选中(高亮 + 底部出现操作条)
- 底部操作条显示:「装备给 当前门人」「装备给…」(选人)「锁定」「销毁」
- 点「装备给 当前门人」→ 直接落位
- 也可以在人物窗里点某个装备格 → 弹出"该槽位的可用装备"列表 → 点一件穿上
10.2 后端只管一件事:校验
拖拽是纯前端表现,落位那一刻才发请求
POST /api/equips/equip { itemId, heroId } —— 这个接口已经存在(规格 §5.3), 已有的校验:槽位匹配 / 等级 reqLv / 原装备回仓库。武器槽硬卡本命兵器大类(equips.mjs 的 kind 校验,不符返回 409),前端需提前预判。 前端只需要在拖拽时预判一下会不会被拒,避免"拖过去又弹回来"的挫败感。
10.3 前端预判规则(照抄后端校验,别自己发明)
| 情况 | 表现 |
|---|---|
| 槽位不匹配(把头盔拖到武器格) | 目标格 永不变金,光标显示禁止符号 |
| 门人等级 |
关于 P5 的战斗动作精灵表 —— 建议先不做全
18 职业 × 5 个动作(跑/攻击/技能/受击/待机)× 每动作 6–10 帧 = 540–900 帧。 按本机实测的产能和精灵表宽度红线,这是好几天的活儿,而且挂机条带里人物只有 ~83px 高,细节根本看不出来。
建议:先全职业共用现有的 hero 动作表,把精力放在"头像 + 半身像"上(那才是玩家真正会盯着看的地方)。 真要做动作时,优先做武器手感差异最大的几个:斧手(重击)、弓手(拉弓)、镖客(甩镖)、扇士(开扇)。
12 · 需要老大拍板的事
| # | 事项 | 我的建议 | 备选 |
|---|---|---|---|
| 1 | 18 般兵器的取舍 去哪 6 个、补哪 6 个 | 去掉 钺/叉/抓/镗/槊/棒(与斧/戟/钩/锤/枪/棍 重复),补 弓/弩/暗器/药/扇 | 严格按传统名录做 18 件,但会有 6 个职业手感重复 |
| 2 | 职业名风格 「剑侠/刀客」还是一字名「剑/刀」 | 两字身份名(剑侠/刀客/棍师),更像"人"而不像"装备" | 一字名更简洁,但列表里分不清人和兵器 |
| 3 | 武器是否硬限定职业 | 硬限(老大后改)—— 只卡武器槽,按 kind 比对 | 软限给不出身份感;垃圾场问题靠"掉落按队伍加权 + 招募自带本命武器"兜住 |
| 4 | 是否保留原 jitter 幅度 | 从 ±35% 收缩到 ±12%(§2.3),否则职业特征被随机性冲掉 | 保留 ±35%:同职业差异更大,但"药师力量比斧手高"也会出现 |
| 5 | 先做哪一步 | P0 先落地(职业数据)—— 后面所有东西都挂在它上面 | 先做形象(P3),能快速看到效果,但数据结构还得返工 |
| 6 | 半身像的性别 18 职业 × 2 性别 = 72 张全做吗 | 先做 36 张(每职业一男一女,头像 + 半身像共 72 张图) | 只做一版(36 张图),但招募时"有男有女"就只剩一个样子 |
一句话:这一版设计没有推翻任何现有系统 —— 8 个装备槽、三层属性、词条/套装/威能、技能书掉落、前端战斗,全部原样保留。 18 职业是贴在"门人"这一层纸上的标签,撕掉也能跑,贴上就活了。
13 · 落地记录(P0→P5 实施后回填)
老大 2026-10-07 拍板「从 P0 做到 P5,半身像都要做满,在生成设定素材时就要有半身像」。 下面记录实际做出来的样子,以及与设计稿的差异 —— 差异都是有理由的,不回头改设计稿,在这里说清楚。
13.1 各阶段产出
| 阶段 | 产出 | 验收 |
|---|---|---|
| P0 职业数据 | server/jobs.mjs(新,18 职业 + 6 类定位 + 属性分配 + 专精判定) heroes.mjs:先定职业 → 按权重分属性 → 按门派抽技能 → 按职业取形象; _migrate() 给老存档推断职业(技能门派 → 属性最高项 → 随机) | node tools/verify_jobs.mjs |
| P1 装备 | 武器 5 → 54(18 兵器 × 3 档);防具每部位 3 → 6(轻/中/重各 2); 装备加 kind 形制字段;sumEquipStats 支持本命专精; 掉落按 ilvl 加权挑档位(否则高等级场景会掉出木剑) | 同上 |
| P2 技能 | 技能 21 → 220(每兵器 12 式:起手 3 / 良品 3 / 精品 3 / 宝器 2 / 传奇 1;+ 轻功 4); 新增 4 种效果(execute 斩杀 / atkDown / atkUp / cleanse); 新增目标模式 ally(治最需要的队友)与 single+pick(打最远/最残) | node tools/verify_skills.mjs |
| P3 形象素材 | tools/gen_portraits.py:白底文生图 → 粗抠 → 图生图精修(透明底)= 半身像; 再拿半身像当参考图出头肩特写 = 头像。共 36 组 / 72 张 | 人眼验收(见 §13.3) |
| P4 界面 | 新建 HeroPanel(继承 HallPanel):左半身像 + 八格环绕 / 右属性技能; 装备格支持点选换装与从仓库拖拽穿戴;大殿名册点人即打开 | node tools/verify_hero_panel.mjs |
| P5 设定与动作 | 三视图 18 张(tools/gen_turnaround.py,拿半身像当参考图); 职业动作表 90 个(18 职业 × 5 动作,tools/gen_all_job_actions.py); 掉落按场景等级挑档位 + 按队伍职业加权 | node tools/verify_job_actions.mjs |
13.2 与设计稿的差异(都改了数)
| 项 | 设计稿 | 实现 | 为什么 |
|---|---|---|---|
| 武器件数 | 18 种 | 54 种标准 + 3 把传奇专属 = 57 件 | 只有 1 件时,某职业在高等级场景永远掉不到本命武器(t1 与 t5 后期差 5 倍) |
| 武器裸攻击 | 24 ~ 34 | 24 ~ 30 | 差 30% 会把"本命"淹掉 —— 玩家的最优解会变成"全队配斧头" |
| 专精倍率 | ×1.15 | ×1.25 | 配合上面两条,保证"同档同品质下本命永远不亏" |
| 专精判定依据 | school | kind | 装备该按"形制"认亲,不该按"门派"—— 门派是技能的属性,形制才是装备的属性 |
| 属性 jitter | ±12% | ±12% ✓ | — |
| 技能总数 | 63 | 220 | 每兵器 12 式(起手 3 / 良品 3 / 精品 3 / 宝器 2 / 传奇 1)+ 轻功 4; 原保留技能(liuyun 是传奇威能的目标、zhangfa 是老存档在用)并入 12 式 |
| 界面归属 | 仓库面板内 | 独立浮窗 | 老大原话是「点开每一个人物,会有单独的界面」——侧栏塞不下半身像 + 环绕格 |
13.3 素材生成链路(可复用)
顺序:先半身像,头像从它派生
- 文生图(白底,1024×1536 = 2:3):按 §07 的六层描述法写提示词
- 粗抠白底(亮度阈值 + 饱和度保护,见
knockout_white)——
阈值 hi=246/lo=232:切到 250 会把白袍、白纸边一起抠穿
- 图生图精修:
background:"transparent"+output_format:"png"+ 只喂 1 张带 Alpha 的图
→ 得到透明底半身像
- 头像:拿半身像当参考图,让模型出"同一个人的头肩特写"
—— 🔴 两段各自文生图出来的不会是同一个人
- 裁齐 + 补白边(
trim_and_pad):统一描边、统一留白,36 张摆一起才不参差
- 交付 WebP:半身像 768×1152 / 头像 512×512
约 55 秒 / 组(4 张图),36 组 ≈ 33 分钟。断点续传:已存在的产物跳过, 中断了不必重跑(一张图要花钱)。
13.4 P5 · 三视图与动作
三视图:tools/gen_turnaround.py —— 18 张, public/assets/portraits/turn_<jobId>.webp(1536×1024,正 / 侧 / 背并排)。 拿半身像当参考图生成,所以三视图里的那个人就是作品里的立绘(同一张脸、同一套配饰)。
🔴 为什么按「职业」出三视图、不按「职业 × 性别」
三视图的用途是「给后续做 3D 或重做动作时对齐比例」—— 同一个职业的身体比例、装备轮廓、配饰完全一样(男女的差别只在发型与收腰)。 按性别各出一份等于把预算翻倍,换来的只是发型的差别。 头像与半身像才是要按性别做满的(那个玩家天天看)。
动作精灵表:十八职业 × 5 个动作(站 / 跑 / 攻击 / 技能 / 挨打)= 90 个动作全部做完, 共 90 张精灵表落在 public/assets/idle/idle_job_<jobId>_<action>.webp, actions.json 里 18 个 job_* 键齐备。
🔴 用「措辞表 + 生成」而不是手写 90 段提示词
这 90 段的骨架完全一样,只有兵器这一处要换。手写既写不对也改不动 —— 以后要调"攻击别做成挥剑",得改 18 遍。 所以 gen_action_sheet.py 里只维护 JOB_WEAPONS(18 组): 每组给「兵器英文名 / 站立怎么拿 / 攻击动作 / 技能动作」,由 _build_jobs() 展开成 CHARACTERS / MATRIX / CHAR_PROMPTS 三张表。
每一项都必须点名兵器 —— ACTIONS 里的通用措辞写的是 "quick sword strike", 不覆写的话模型会照着它把拿斧头的人画成在挥剑(兵器是立绘唯一的辨识点)。 人称一律用中性表达(每个职业都有男女两版立绘)。
接入方式:逐职业灰度,不用改代码
actions.json 里出现 job_<jobId> 这个键,那个职业就自动用上专属动作; 没有就退回主角那套(idleBand._setKeyOf)。 ⇒ 以后加新职业,只要补一条 JOB_WEAPONS 再跑一次装配就生效。
⚠️ 循环质量的判据对 idle 不适用(实测)
loop_check 给的是 score = seam / baseline。 站立呼吸的幅度天然小 ⇒ baseline 小 ⇒ 比值必然大。 18 个职业的 idle 里有 14 个 score > 1.0,看着像"全都要重做"—— 但一直在用的 hero_idle 自己就是 2.066,按这个判是误报。
⇒ idle 要看的是 baseline 的绝对值:< 1.0 才是真的"几乎没动"。 枪客第一版 idle 是 0.94(长枪拄地在措辞里没点名"枪身会晃",模型把整张画成了静物), 补一句 the long spear rocks slightly against the shoulder 后回到 1.32。
单动作约 45~60 秒(本地 H3 出片 + 抽帧 + 对齐 + 选窗 + 拼表),84 个动作合计 71.6 分钟。 驱动脚本 tools/gen_all_job_actions.py 以「meta 是否存在」为断点,中断了直接重跑。
另外两项也一并落了:掉落按场景等级挑档位(idealTier 加权, 否则 ilvl 70 的场景会掉出木剑)、掉落按队伍职业加权(_weaponBias, 队里 3 个用剑的 → 剑的掉落率 7.5% → 16%)。