游戏给你一个战力数字和八项可加的资质,两样都没解释。这篇讲每一点加下去究竟做了什么、伤害公式实际读的 是哪几项,以及角色面板上哪些属性纯属摆设。
游戏内置了两张不同的换算表,按游戏模式决定读哪一张,而没有一篇社区攻略提到过。
AttributeAdditionInfo.GetTableName()
=> "attribute_addition" + (AppGame.Instance.IsZhenShiJiangHu ? "_zhenshijianghu" : "");
这是一个二选一的开关。真实江湖读变体表;爽文江湖、险恶江湖、暗黑江湖都读默认表。 两张表 让同一个点加到不同的属性上。专注在一张表里是命中属性,在另一张表里是气血属性。
对着你存档所在的模式读对应的那张表。下面每一段都会标明是哪一张。
在运行中的角色上实测:一次只动一项资质,单独加,回读十一项战斗属性和四项上限,再回退,确认回退到位, 然后在+1000和+300各跑一遍。每一个实测值都和表里对应那行完全对得上。
| 资质 | 影响属性 | 每点 |
|---|---|---|
| 元气 | 气血上限 / 闪避 | 12 / 0.2 |
| 根骨 | 气血上限 / 闪避 | 12 / 0.2 |
| 精神 | 气血上限 / 闪避 | 12 / 0.2 |
| 专注 | 气血上限 / 闪避 | 12 / 0.2 |
| 力道 | 外攻 / 命中 | 1.25 / 0.2 |
| 内力 | 内攻 / 命中 | 1.25 / 0.2 |
| 体魄 | 外防 / 内防 | 1.0 / 1.0 |
| 身法 | 命中 / 闪避 | 0.8 / 0.6 |
其余一律不动。要害、诛心、御心、会心和真气上限在这张表里没有对应的行,唯一存在的那一行化解写
的是0。所以在真实江湖存档上,没有任何一点资质能提高暴击率、暴击伤害、暴击抵抗或真气。
未实测。这是直接读表的结果,也正是每一篇社区攻略在描述的那张表。
| 资质 | 影响属性 | 每点 |
|---|---|---|
| 根骨 | 气血上限 / 外防 | 40 / 2 |
| 体魄 | 外防 / 气血上限 | 7 / 5 |
| 力道 | 外攻 / 要害 | 5 / 1.5 |
| 内力 | 内攻 / 化解 | 5 / 1.5 |
| 元气 | 真气上限 / 内防 / 化解 | 9 / 2 / 1.5 |
| 精神 | 内防 / 真气上限 | 7 / 1.5 |
| 专注 | 命中 / 要害 | 4 / 1.5 |
| 身法 | 闪避 / 轻功点 | 4 / 1.5 |
社区常说的「42气血、9真气、7外防、5外攻、4命中」就是这几个数。它们是对的——对这三个模式而言。这些 公开的数字不是编出来的,是从默认存档所读的那张表上抄下来的,只是转述时没有带上模式这个前提。
表里最后一列的单位是百分之一,换算结果并不存下来,而是每次要用时现算:
其他 = Σ over rows where influenceAtt == this stat: source_stat × additionValue / 100
有两点后果值得知道。
换算读的是加过自身百分比加成之后的属性值。 一个带+10%内力的角色,每一点内力都按1.1点参与换算, 内力的两项产出同步放大。实测时就能看到:写入+1000点原始内力,显示值涨了+1100,内攻和命中都比表里的比 率高出10%。所以你的实际比率,是表里的比率乘上源属性身上挂着的百分比修正。
加的点落在基础里,在目标属性那边显示为其他。 游戏把每一项属性都拆成若干来源通道(基础、装备、 状态、秘籍、境界、经脉、词条、特技、连招),其中只有基础是角色自己实打实有的。加的点就进这里。换算 出来的结果不进任何一条通道:它以其他的名义追加在目标属性的明细末尾,每次弹出悬浮提示时重算。所以 资质的悬浮提示里那一大块基础,和命中的悬浮提示里那一大块其他,是同一批点从两头看的样子。
元气、根骨、精神、专注每点各给12气血上限和0.2闪避,再无其他。它们在表里的行完全相同。你能加的点有一 半只作用在同一对产出上,四项里选哪一项,结果没有任何差别。
名字暗示得最强烈的那两条换算,恰恰是这张表里不存在的两条;而它们在默认表里确实存在——社区的建议在这 个模式下会误导人,原因就在这里。
体魄是纯防御,1.0外防加1.0内防,气血为零。两项防御各自唯一的来源就是它。
专注完全不碰命中。 它是一项气血兼闪避的属性,和根骨没有任何区别;命中来自身法的0.8,外加力道和 内力各0.2。
0.8命中加0.6闪避,两者唯一像样的来源。命中和闪避都是阈值属性(见下文),所以一点身法值的就是它替你 补上的那段差距,多一分都不值:你的命中对他们的闪避,他们的命中对你的闪避。对那些你本来就从不打空、 他们也本来就很少打中你的敌人,它一文不值。
真实江湖下,元气、精神、专注不出现在角色面板上:游戏维护着一份正好就是这三项的名单
(AppGame.zhenShiJiangHuHideAttriType),只要存档是真实江湖,每次刷新面板都会把这三行置为不激活。
行本身存在,逻辑也是通的;是模式把它们关掉了。
这件事之所以要紧,是因为被藏起来的正是四项可互换属性中的三项:真实江湖的玩家看自己的面板只看得到 根骨,无从发现元气、精神、专注做的是完全一样的事。
修改器把这三项放了回去,见操作指南。
一个境界4的角色静止状态下的命中明细。前五项是从悬浮提示上读的;其他是表自己算出来的
和,⌊235×0.2⌋ + ⌊290×0.2⌋ + ⌊116×0.8⌋,分别来自力道、内力和身法:
基础+26, 装备+42, 境界+104, 词条+31, 连招+23, 其他+197 = 423
从运行中的角色读到的就是423,所以这个分解是对得上的。其中基础只占26。光境界一项就是104,而这个
数字本身也随模式变化:境界给属性的表拆成了四张
(formula_baseattri、_xianejianghu、_zhenshijianghu、_dangmojianghu)。加点是小杠杆;境界、
装备、词条和连招是大杠杆。
SpellCalculate.CalculateFormulaDamage,游戏里每一个真正的攻击效果都走这里:
外功 part = 外攻 × waiDamage% × (1 − 外防_target / (外防_target + 2000))
内功 part = 内攻 × neiDamage% × (1 − 内防_target / (内防_target + 2000))
相合 part = 相合 × extraDamage% (only when your 偏向 matches the move's)
damage = (外功 + 内功 + 相合) × crit × combo × the various ± modifiers
带有效外功百分比的攻击效果共783个,其中717个只按外攻缩放,别无其他;带内功百分比的826个
里,783个按内攻缩放。招式自己的waiDamage / neiDamage百分比就是那个倍率(中位数分别
是65%和75%,前10%分别是235%和280%)。
一个招式算外功还是内功,取决于它带的是这两个百分比里的哪一个;而你的两项攻击属性由两项不同的资质 (力道和内力)供给。把点分摊在两边,伤害的两半都被砍掉一半。选你的武学实际用的那一边。
威力类属性在这个百分比相乘之前以加法叠进去:法术威力两边都进,外功威力只进外功那一侧,内功威力只进 内功那一侧。它们是加在招式百分比上的百分点,所以本身百分比越大的招式,它们越值钱。
reduction = defence / (defence + 2000)
2000点防御把对应类型的伤害砍掉一半。4000点砍掉三分之二。6000点砍掉四分之三。它永远到不了1,所以没有 任何东西能免疫;而且每加2000都比上一个2000更不值——第一个2000买到50%,第二个买到17%,第三个买到8%。
实测过了。 把体魄分三档抬高,232 → 2232 → 6232——每点给1.0外防,也就是外防888 → 2888 → 6888——中间让同一个敌人反复用同样的两招打,每一次打中都记下它当时是按哪个外防算的。连击倍率除掉之 后的伤害,对上曲线以888为基准给出的预测:
| 外防 | 伤害,招式A | 伤害,招式B | 曲线给出 | 实测 |
|---|---|---|---|---|
| 888 | 258.0 | 390.0 | 1.0000 | 1.0000 |
| 2888 | 152.0 | 230.0 | 0.5908 | 0.5891 / 0.5897 |
| 6888 | 83.0 | 126.0 | 0.3249 | 0.3217 / 0.3231 |
两招都贴着曲线走,差距在0.6%以内,剩下那点是伤害数字太小时的取整。防御抬到将近八倍,还有32%的伤害照 样打进来;没有哪一档接近免疫。
有一段时间角色身上一个增益掉了,那期间挨的打没有算进去。它们读到的外防是821,但同一次掉落还改了伤害 结算里的别的东西,所以那是另一种状态,不是第四档。
没有哪项资质能买到破防类属性;唯一能削目标防御的是装备词条,按WORD_TARGET_WAI_FANG /
WORD_TARGET_NEI_FANG读取,在进曲线之前先做减法。
命中判定是最先跑的一步,而且会短路:
if (命中 − 闪避 >= 0) → never misses
otherwise, with d = 闪避 − 命中:
hit chance = 1 − d / (命中 + 30 + 1.35 d), floored at 1%
所以命中是阈值属性:加到对手闪避为止的每一点都有用,超过之后的每一点毫无作用。
压过这条线要靠哪一项,看你的难度,前面那道分岔在这里最要命。在爽文/险恶/暗黑是专注,每点4 命中;在真实江湖专注一点命中都不给,这活儿由身法接手,每点0.8。反过来同理:堆闪避是把对手压 到他自己的阈值以下,他的命中率随即落到上面那条曲线上——身法在前三个难度每点4闪避,在真实江湖是0.6。
会不会暴击看的是你的要害对他们的化解,外加会心这个固定百分比:
crit% = 会心 + 100 × 要害 / (1.25 × 化解_target + 2.5 × 要害^0.877)
会心是直接按百分比进去的。会心30就是30个百分点的暴击率。要害那一项自带收敛:对化解0的目标, 要害1000大约值94点,但指数决定了要害从这里再翻一倍也只多几点。对着有实际化解的目标它会崩 掉——化解500时,同样的要害1000只值59。
暴击打得多重是你的诛心对他们的御心:
multiplier = max(1.0, 0.5 + 诛心^1.32 / (2.5 × 诛心 + 御心_target))
max(1.0, …)这里有个坑。 没有诛心时,暴击把伤害乘以正好1——游戏照样播暴击动画,数字一模一样。对
御心200的目标,大约要诛心45,暴击才开始起作用;过了这条线增长很快:诛心100约×1.47,诛心500约×3.02,
诛心1000约×3.87。对御心只有100的目标,同样这三档是×1.75、×3.21、×4.01——做除数的是目标的御心,所以
同样的诛心打某些敌人比打另一些更值。
实测过了,就是这样。 把诛心写成0,对同一个目标用同样的招式反复打,于是有的一下暴了、有的没暴。 只取两次之间双方身上挂的增益都没变的那些配对:
| 招式 | 增益,己方 / 目标 | 普通 | 暴击 |
|---|---|---|---|
| 142 | 32 / 11 | 1251 | 1251 |
| 144 | 29 / 11 | 1069 | 1069 |
| 144 | 32 / 12 | 1097 | 1097 |
不是接近1的比值,是同一个整数。暴击触发了,动画照播,数字纹丝不动。还有第四招在几次打击之间上下飘了 约2%,两个方向都有,跟的是增益的上上下下而不是这一下有没有暴,所以比较只用配得上的那几组。
倍率本身也用同样的办法在下限以外核对过:诛心181对御心278,公式给出1.8077,同一招上两组互相独立的暴 击/普通配对,回来的都是1.8077。诛心77对御心278又有三组,1.1564、1.1583、1.1553,公式预测的是 1.1571。
不堆诛心而只堆要害和会心,堆出来的只有特效。暴击率和暴击伤害在这里不能互相替代:资质点买不到的那一 项,正好就是带下限的那一项。
气盾伤害路径(CalculateFormulaQidunDamage)用的是它自己的一行暴击计算:
crit = 会心 / 1000 + 要害 / (化解 + 2000)
第二个分式的分子分母都是整数,C#走的是整数除法——所以它在要害超过化解 + 2000之前一直是0,超过之后 直接跳到1(100%)。而会心除的是1000而不是100,只值它在别处的十分之一。在这一条攻击路径上,堆暴击几乎 没有意义。
AttriType里的95个条目逐个扫过一遍,找的是真正的读取(除枚举声明和单纯的case标签之外的任何使用,
外加数字形式的(AttriType)n强制转换)。八项一个读取都没有,另外两项只在一个地方被读到——某个招式效
果的加成系数——此外再无别处:
| id | 面板上有吗? | ||
|---|---|---|---|
| 38 | 暗器 | 有 | 无人读取 |
| 40 | 医道 | 有 | 有一个法术效果按它缩放 |
| 41 | 毒技 | 有 | 无人读取 |
| 64 | 打猎 | 有 | 无人读取 |
| 65 | 种植 | 有 | 无人读取 |
| 71 | 正邪 | 有 | 无人读取 |
| 77 | 反击 | 哪里都没有这一行 | 无人读取 |
| 78 | 连击 | 哪里都没有这一行 | 无人读取 |
| 79 | 追击 | 哪里都没有这一行 | 无人读取 |
| 80 | 连战 | 哪里都没有这一行 | 有两个法术效果按它缩放 |
这十项也没有被任何ECT_NPCATTRI条件引用
过,npc_interact、entrust_event_prototype和mailcondition三张表都查了,所以没有任务、门派要求或
书信卡在它们上面。
其中六项就在你的角色面板上,练了还会涨。 暗器、医道、毒技、打猎、种植、正邪都能显示、都能练;六 项里有五项完全没有代码去读,医道则只被那一个按它取加成的招式效果读到。练它们等于把时间花在一个数字 上。
另外四项完全不显示,只存在于枚举里。这一点要紧,是因为装备词条和经脉节点照样能洗出反击、连击、追击和 连战。洗出来的值存下了,但永远没人查。洗掉。
两个例外很单薄但确实存在:医道和连战各自出现在一两个法术效果的缩放属性位上,所以某个具体招式可以读到 它们,尽管别处都不读。
阴、阳、刚、柔、毒本身不加伤害。它们只做两件事。
它们决定你的偏向。 GetMaxPianXiangState取五项里最高的那一项,你就以那个偏向作战。原始数值的
其他方面在这里都不重要,只看谁最大。
它们决定相合加成,也就是伤害的第三项,而它是一个减法:
相合(X) = X − (the element after X) − (the element before X)
环的顺序是阳 → 阴 → 柔 → 刚 → 毒 → 阳。于是:
| 你的偏向 | 相合 |
|---|---|
| 阳 | 阳 − 阴 − 毒 |
| 阴 | 阴 − 柔 − 阳 |
| 柔 | 柔 − 刚 − 阴 |
| 刚 | 刚 − 毒 − 柔 |
| 毒 | 毒 − 阳 − 刚 |
五项平摊,相合就是负的。只有当你选定的那一项超过两个邻居之和时才有加成,而且只在招式自身偏向与你一 致时生效。
加相邻元素的词条或经脉节点不是小幅提升,是负收益:给阳流加阴,减的正是五行唯一供给的那一项。
NpcEntity.GetZhanLi全文:
战力 = 气血上限
+ 真气上限 × 3
+ (外攻 + 内攻) × 8
+ (外防 + 内防) × 7.2
+ (命中 + 闪避) × 10
+ (诛心 + 御心 + 要害 + 化解) × 10
+ (阴 + 阳 + 刚 + 柔 + 毒) × 4
+ 轻功上限 × 10
把它对着伤害公式读,能读出三件事:
用战力去比两个NPC,这是它的本职。别用它衡量自己这套配置。
刀法、剑术、搏击、枪棍显示在武学页上,也卡着门派入门,但没有任何伤害公式读它们。它们在整个程序集
里唯一的机制作用,是ReCalAttriEquip里的一个分支:
weapon base attributes × (1 + min(1.0, skill / 1000))
只有装上对应的特技才会生效,因为特技不在身上时GetStuntEffectValue返回0。每个兵器类别一件特技,各自
要求对应武学到700:
| 特技 | 兵器 | 要求 | 游戏给的线索 |
|---|---|---|---|
| 鹿门翠微 | 刀 | 刀法 ≥ 700 | 在(1552, 393)见到的一名刀绝 |
| 平明寻羽 | 剑 | 剑术 ≥ 700 | (901, 1400)的一名剑圣 |
| 气吞山河 | 拳/搏击 | 搏击 ≥ 700 | (200, 644)的一名千金王 |
| 空翠嶙峋 | 长兵/枪棍 | 枪棍 ≥ 700 | (1517, 1044)的一名飞槊 |
在刚好够拿到它的700上,等于武器给的一切属性+70%;到武学1000时封顶在+100%。低于700,或者没有特技, 这项武学就只是一条门派要求,别无用处。
不是靠打架涨。AddSkillProficiency——那套"用得多就涨、每个品阶有上限"的机制——只对垂钓、农学和生活
技能调用,从不对兵器武学调用。兵器武学走的是 ArtistrySystem,也就是读书、请教、比试、传授、领悟、
作画、题字背后的同一套东西,而全部加点只由一个函数发放:
public void GetAttriPoint(AttriType attri, int point) // 先 Tools.CalculateArtistryValue,再 ModAttriField
public static int GetPoint(bool success) => success ? Random.Range(3, 6) : 1;
成功3到5点,失败1点。整条武学就是由这个单位堆出来的。
| 交互 | 加点怎么定 |
|---|---|
| 请教 | 你的武学 ÷ 对方的武学。Random.value 大于这个比值才有收获,所以比你高很多的人几乎每次都给,只高一点的人很少给。比值到1或以上,整段直接跳过:不比你强的人教不了你任何东西 |
| 比试 | 表现好3到5点,否则1点。中途认输也给1点 |
| 传授 | 答对3到5点,答错1点 |
之后全部乘以 1 + floor(奇术 ÷ 100 × 4),取的是隐藏词条奇术,所以奇术是唯一能让每一次求学都更值钱
的属性。
书是第四条路,而"书"这个字底下是两样毫不相干的东西。不分开就会被书架骗:
下面说的只是第二种,它又分两条线:
| 书线 | 形态 | 谁有 |
|---|---|---|
| 分阶书库 | 道学·玄朴经·凡阶,往上一阶一阶 | 道学、佛学、儒学、墨学、魔法学、农学各70本;琴艺、棋艺、书法、画道、酒量、垂钓各42本 |
| 残卷 | 残篇、残页、断章 | 各14件:五项兵器武学、各项生活技能,以及兵道和诡辞 |
所以佛学那一批一直都能靠读书涨,走的是70本那条线,读书也确实是它们的主路。兵器武学同样没有分阶书库, 所以它们只能靠请教和比试——但它们至少各自握着几百本秘籍,能从另一条路把角色变强。
兵道和诡辞是两头都占不到。14件残卷,没有分阶书库,也没有自己的招式可学。这就是多数存档上这两项 贴着零、而儒学农学能爬到几百的结构性原因。
奇术、医道、毒技两条线都没有。读书对它们毫无作用。
品阶是 {100, 250, 450, 700, 1000},而700正好是最高那道边界——兵器特技要求你把第四个品阶走完。
从常见的中期126算起是574点,按每次4点算大约140次成功的请教。这就是多数存档上四项兵器武学停在原地的
真正原因,也是为什么一个按百来算、而不是按个位数算的来源会改变局面。
道学、佛学、儒学、兵学、墨学、鬼学、魔法学、农学,在面板上夹在兵器武学和生活技能之间,而它们自己 没有任何一处被读取。每一门带一条五级特技阶梯,门槛是 100、250、450、700、900,而这些特技无一 例外都写着同一句话:装备后根据对应属性点数占最大值比例——装备之后,效果按这门学识距离自己上限的 比例结算。学识是钥匙,特技是它开的锁,而装备才是让两者产生意义的动作。
| 学识 | 100 | 250 | 450 | 700 | 900 |
|---|---|---|---|---|---|
| 道学 | 真气上限 | 福气 | 元气 | 内攻 | 掉落高等级物品几率 |
| 佛学 | 生命上限 | 坚韧 | 根骨 | 内防外防 | 几率额外掉落一次 |
| 儒学 | 精力上限 | 修养 | 筋骨 | 外攻 | 感悟、修为几率额外获得一次 |
| 兵学 | 阴 | 阳 | 刚 | 柔 | 毒 |
| 墨学 | 轻功回复量 | 内息 | 轻功消耗 | 轻功值 | 几率不消耗精力 |
| 鬼学 | 生活技能精力 | 生活技能材料 | 诡辞 | 炼丹酿酒烹饪出彩蛋 | 锻造缝纫巧手成品属性 |
| 魔法学 | 点亮经脉成功率 | 体魄 | 几率不消耗修为 | 点经脉出高级词条 | 经脉固定属性按本门加成 |
| 农学 | 采集速度 | 精神 | 采集精力消耗 | 采集出高级物品 | 几率额外采集一次 |
这是面板从来不说的一段。跨过门槛拿到的是特技;而这门学识的数值,之后每一帧都在决定这个特技值多少。 凡是加属性的那种档位,算法是:
ratio = value1% × 该学识的基础值 / 1000 // 上限就是 value1%
change = ceil( 目标属性的基础值 × ratio )
ModAttri(NST_TEJI, target, change)
也就是说,它加的是目标属性自身基础值的一个百分比,而这个百分比等于学识除以1000。兵道五档的
value1 都是20,即每档最多给对应那一系 +20%,而且要兵道到1000才拿得满。
| 你的兵道 | 兵无常势实际给多少 |
|---|---|
| 18 | 20% × 18/1000 = 基础阴的 0.36% |
| 250 | 5% |
| 700 | 14% |
| 1000 | 20%,封顶 |
两个后果。在18和22上,这两门给的都是零——这不是bug,这就是公式。另外因为它乘的是目标属性的基础值, 你没堆的东西它乘不出来:一个阴属性为零的角色,兵道再高,兵无常势也是零。
诡辞只有一半是这么做的。它的一、二、四、五档走的是另一条完全不同的钩子——就是上表里那些生活技能减免和
制作掷骰;只有第三档秋毫之末用的是这套百分比机制,value1 = 50。它的数据写的是 47|87:源是诡辞,
目标是内功威力,最高+50%。而游戏自己给它的说明写的是"提升诡辞",把源当成了目标;它也是这两条阶梯里
唯一一个连背景故事都没有的档位。
因为每条线各占一个装备槽,兵道那一档和生活技能那一档如果加的是同一系,两个会同时生效。而生活技能 那边更强,最悬殊的地方差五倍:
| 系 | 兵道档位 | 需要 | 另一个 | 需要 | 上限 |
|---|---|---|---|---|---|
| 阴 | 兵无常势 | 100 | 书法 落纸云烟 | 700 | 50% |
| 阳 | 水无常形 | 250 | 画道 丹青画骨 | 700 | 50% |
| 刚 | 不动如山 | 450 | 酒量 劫邀酒星 | 700 | 100% |
| 柔 | 侵掠如火 | 700 | 垂钓 无机秋水 | 700 | 100% |
| 毒 | 军无百疾 | 900 | 缝纫 蒲苇时纫 | 700 | 50% |
兵道每一档都封顶在20%,每一个对手都比它强;而书法、画道、酒量、垂钓各有42本的分阶书库,兵道只有14件 残卷。所以想把某一系堆高,最便宜的路不是那门看起来最像战斗的学识:去喝酒、钓鱼、作画、练字。
兵道的档位顺序还反过来坑你。它按阴、阳、刚、柔、毒排在100到900上,于是你打哪一系,决定了这门学识对你 多贵——阴的build兵道100就够,毒的build要900才拿到同样的20%。
其中三行值得单拎出来。
兵学就是五行,一级一个:阴、阳、刚、柔、毒。考虑到五行是「要么专精要么白给」,这让它成为战斗 后果最锋利的一门;而它自己的说明写的正好相反——「兵道并不能直接提升个人作战能力」对属性成立,对 挂在它下面的那条阶梯不成立。
墨学是轻功那一门。五级里有四级是回复、消耗、上限和内息,这也是全部学识里唯一一门在自己的特技 之外还被程序集读取的:轻功消耗的减免就是直接按它算的。
鬼学和农学是生活与采集那两门,五级里没有一级碰战斗。鬼学买的是更便宜的生活技能和更好的成品, 农学买的是更快、更省、更肥的采集。
拿着一件兵器,你就有了一套任何界面都不显示的招式:不在你的武学页上,不在任何秘籍里,也不在敌人的属
性页上。npc_spell_container里装了79套,每个兵器类别一套,其余是特殊角色用的:
| 兵器 | 容器里给的 |
|---|---|
| 剑 | 江湖剑法 ×5,胁生双翼,疾风三击,固念守,蓄日破,追魂 |
| 刀 | 江湖刀法-二连击,云消雾散,烘云托月,怀中抱月,碎日,破釜沉舟 |
| 拳 | 江湖拳法-二连击,疾风骤雨,截拳,冲拳,猛虎裂石,雷音 |
| 枪 | 百转,飞云击,风平浪静,千军倒,银蛇刺喉 |
有实测,来自一场记了日志的切磋:玩家放出了141到145号,也就是剑招一式到五式,这正是剑的容器, 和真正装着的两门武学雁云式、蚀骨剑一起出手。那场架里出的招大约三分之二来自容器。
在敌人身上,容器的名字写在信息页上天赋那一行旁边的格子里:万相搏击就是枪的那一套。在你自己的面板 上,同一样东西哪里都没有名字。
风平浪静不造成伤害。它给自己挂一个持续一秒的格挡,而这个格挡写明了它用哪一招还手:
effect 130180000 effectType 1 (aura), effectSubType 32 (SpellAuraDefense)
duration 1000 一秒
odds 10000 100%
miscValue 13019 ← 它反打回来的那一招:千军倒
触发它的是你自己的攻击。在伤害结算里:
if (target.HasFlag(20) && target.IsFacing(attacker, 180f))
target.FightBack(attacker);
FightBack按odds过一次概率判定,10000就是必定触发;朝打它的人放miscValue那一招,然后把格挡撤
掉,一次格挡只换一次反击。敌人不需要在攻击,不需要做出反应,也不需要掐任何时机。是你自己打它才触发
的。
反击就是一招正常的伤害技能,不是反伤。千军倒和银蛇刺喉带的是waiDamage 40, neiDamage 40,也就是施放者外攻的
40%加内攻的40%。实测:千军倒两次打回来都正好是3378,中间玩家打出的伤害相差很大,任何按你自己伤害
缩放的东西都做不到这一点。
绕过它有两条路,都出自同一行代码。停手一秒,格挡到时间自己消失,白挂了。或者从正面180°之外出手,
那里根本不会调到FightBack。
它的提示是一个buff,也是你唯一能看到的提示。格挡会在敌人的buff栏放上反击,游戏自己的字符串表把 它写作在受到攻击时会释放反击技能,持续那一秒。
真正的伤害反弹是有的,但那是另一套机制:带标志4的光环SpellAuraDamageReflect,按baseValue的几率把你刚打出的伤害的miscValue%弹回来,还能按baseValue2%削掉这一下。兵器容器里
没有一套用到它。
ShowNpcSpell按角色不同读两个不同的地方:
if (IsRandomNpc() || IsChongWu() || IsNotRandomNpcRandomSpellAndNoNpcFight())
→ m_SpellManager.GetEquipSpell(type, curTaoluType) // 页面画的是这个
else
→ NpcFight.GetNpcSpell(npcFight, type) // 配好的战斗招式表
而一个没有配战斗数据的具名角色会撞上一句提前return,页面就什么都不画。
两半都会放出来。记录下的168次命中里,163次来自配表里预设的招式,5次来自运行时生成的,其中一个敌人在同一 场架里两边都用了。那个页签列出来的是准的,只是对容器那一半一字不提,而格挡和反击就在那一半里。读一 个敌人的页面,只能看到他会对你用的招式里的一部分。
生成出来的招式,名字不说明任何问题。它的name字段是一串字符串id的拼接模板,
0|-2234|1500045879|-2271|-2277,界面把它们拼起来显示。前缀池按角色五行里最高的那一项选:
spellName_Yin_1是寂韵,_4寒潜,_5隐梦,_7影密,_8遁玄。一个阴87、其余24、26、22、22的角色,
什么招都带阴的前缀。显示出来的名字因此永远对不上任何一招预设的招式,也说不出这一招是干什么的。
名字背后的招式是真的。npc_spell_dynamic每一行都写明一个protoSpellId,再按偏向、境界档、形状、范围和
命中次数做变化。是带参数的现成招式,配上拼出来的名字。
云别月沉不是一招。它是一个lianzhao_node:
id 1001, nextid 1002, taoluType 101, groupId 1, level 1
neigongValue 15, waigongValue 15, formulaAttri 331
28张图上共33个节点,相比之下招式有3,392个。neigongValue和waigongValue就是伤害公式拿来乘内攻和外攻的那两
个百分比,它的提示文字才和一招的提示文字用同一套文案。
对加点而言要紧的是后一半。连招是每一项属性由九个来源拼成时的其中一个,在前面命中的分解里看得见:
基础+26, 装备+42, 境界+104, 词条+31, 连招+23, 其他+197。万宗这棵树因此一边驱动连招,一边往面板里
加属性;在一个节点上洗练,洗的是一个属性来源,而不只是一招。
每个招式都有四个窍穴——入门、熟练、精通、化境。领悟一个窍穴给你两样东西,而这两样是从两条不同的 路到你身上的。
强化效果在你领悟的那一刻就写进了这一招本身(UpGradeNodeAddEffect 调
AddSpellEffectId(spellId, …)),从此留在那里。它改的是这一招打出去时的效果,所以除了把这招使出来
以外不需要你再做什么。
词条——就是那一块内攻攻击+30、化解+11、阴+8、外攻攻击+35——是全人物的属性,而每次重算只从一个 列表里收集它们:
foreach (long id in m_MiJiMgr.m_graphMgr.GetPlayerCurUseSpellNodeIdList()) // ReCalWordEntry
这个列表只由你当前套路里装备着的武学构成,别的一概不算:
GetEquipSpell(ST_ZHAOSHI, curTaoluType) // 4 个格子
GetEquipSpell(ST_AOYI, curTaoluType) // 3 个
GetEquipSpell(ST_GONGTI, curTaoluType) // 1 个
所以领悟是必要条件,不是充分条件。一招躺在秘籍里没装备,窍穴开得再多也一分不给,而给你看这块数字的 那个面板不会告诉你这件事。
套路跟着你手里的兵器走。curTaoluType 是按装备栏第0格那件兵器定的:剑、刀、枪和棍、拳、暗器。
把棍收起来换成剑,整套装备的武学就换了一套,原本在生效的窍穴词条也跟着换。一招的加成,只在你带着它
所属的那类兵器时才是活的。
心法是同一条规则,只是格子更窄。ReCalAttrMiJi 从 GetEquipSpell(ST_GONGTI, curTaoluType)[0] 读它
的属性块——功体只有一个格子,取的就是这一个——这个格子空着就直接返回。拥有而没有放进功体格的心法,
什么都不做。
这四个是四个互相独立的节点组,前后相连但各算各的,GetPlayerCurUseSpellNodeIdList 会把这个招式下
每一个已激活的节点都加进去,代码里没有任何地方偏爱最后一个。飞虹击涧是武学120300,四个组各一个
节点:
| 窍穴 | 节点 | 领悟耗感悟 | 洗练耗感悟 | 词条组 | 特技 |
|---|---|---|---|---|---|
| 入门 | 12030000 | 875 | 292 | 8221 & 8400 & 8400 & 8400 | |
| 熟练 | 12030010 | 1,575 | 525 | 8222 & 8400 & 8400 & 8400 | |
| 精通 | 12030020 | 2,835 | 945 | 8223 & 8400 & 8400 & 8400 | |
| 化境 | 12030030 | 5,103 | 1,701 | 8224 & 8400 & 8400 & 8400 | 406 |
这张表要横着读两遍。每个节点带的是四个词条组,不是一个。第一个是这个窍穴自己的,四个窍穴各不 相同;后三个是同一个公共池,而它们就是面板上那三个材料格——道具、丹药、密卷,顺序一致。一个窍穴你 领悟了却什么材料都不喂,它给你一条词条,而它本可以给四条。一个招式全开是十六条。
只有化境独有的东西是特技。四个节点里只有 12030030 带 tejiValue,那就是左页"强化属性"在等的
那个 AddSpellEffectId。另外三个只给词条,不给强化效果。所以最后一个窍穴改的是这一招的打法,四个
窍穴给的都是你的属性。
两种roll是分开的,这正是在前面几个窍穴上用好材料不亏的原因:
CreateOrWashWordEntry 只替换 list[0],列表里其余的原样保留,
所以你花材料换来的那三条不会没。一件材料按自己的 mijiNodeWordEntryWash 决定怎么roll:要么从节点的公共池里重roll并把当前这条带进去
参考,要么直接从这件物品自己的表里roll。类型3、子类19的密卷会按节点的 controlPianXiang 来roll,这
就是密卷能把结果往某一系上引、而不是给你池子里随便一条的原因。
SpellManager.LearnSpell 只做三件事:把id加进已学列表、如果这个武学声明了监听就注册一个、然后发那个
在屏幕上弹出名字的UI事件。没有属性,没有熟练度,没有任何计数。监听那一条几乎够不着什么——整个游戏的
listener_spell 一共五行,每一行都指定一个特定条件。
于是一个招式能给你回报的每一条通道,卡的都是同一件事:
| 通道 | 前提 |
|---|---|
| 窍穴词条 | 装备在当前套路里 |
| 心法属性块 | 放进当前套路那一个功体格 |
| 连招节点(万宗) | ReCalAttrLianZhao 读的是 GetEquipLianZhao(curTaoluType),当前套路、已装备 |
| 这一招自己的伤害 | 得使出来,所以还是要装备 |
而四项兵器武学的因果,和直觉正好相反。整个程序集里没有任何地方按名字写入刀法、剑术、搏击、枪棍, 十三处引用全是读。它们和别的属性一样靠书、奖励和加点涨,学一个招式不涨,挥一万次也不涨。游戏自己的 说明写得很清楚:刀法养成,学习高级刀法的条件,同时可以获得一定的特技——它是学更高阶武学的条件,也是 700那道特技门槛。是熟练度让你能学,不是学让你熟练。
实际的读法:只在你打算带着的招式上开窍穴。躺在秘籍里永远不装备的招式,是你花感悟买来看的。
熟练度是五门,不是四门——剑术、刀法、枪棍、搏击,还有暗器——五门的行为完全一样。修改器的 「学会的招式反哺兵器熟练度」开关(默认开启)就是对这个设计的回答:学会的招式和奥义按自己的品质档 反哺所属兵器的熟练度。它按你已经会的现算,不是学会时写进存档,所以秘籍里原有的全部算数,关掉数字 就退回去。
它不设上限,因为能学的招式本身就是上限。把带秘籍图谱的招式一个不落地全学完,给的是:
| 兵器 | 可修习的招式 | 全学完能给 |
|---|---|---|
| 搏击 | 130 | 372 |
| 剑 | 126 | 280 |
| 刀 | 61 | 147 |
| 枪棍 | 56 | 132 |
| 暗器 | 38 | 110 |
对着特技要的700看,把一门兵器的秘籍收一辈子,最多也就值一半左右;而各门之间的差距,就是每门武艺被 写了多少东西。暗器的书最少,给的也最少。
对照切游的加点攻略,以 及星界云和多多云在 传的那份总结逐条核对。
找到模式分表之后,总的结论变了。这些攻略描述的并不是一套已经不存在的加点。它们准确地描述 着爽文江湖,只是没说出来。
| 说法 | 结论 |
|---|---|
| 每一个「每点N」的数字——42气血、9真气、7外防、5外攻、4命中 | 对爽文 / 险恶 / 暗黑是对的,对真实江湖是错的。 它们就是attribute_addition里的数除以100,而那三个模式读的确实是这张表。真实江湖存档读的是attribute_addition_zhenshijianghu,同样的八项点喂的完全是另一批属性 |
| 任何地方都没提到这张表取决于游戏模式 | 正是这个缺口让其余内容变成误导。 一个开关IsZhenShiJiangHu在两张表之间二选一,社区材料里没有一处承认它 |
| 元气是内功的核心属性 | 在爽文是对的(9真气、2内防、1.5化解)。在真实江湖它对内功毫无帮助——它是一项与根骨完全相同的气血属性 |
| 专注是命中属性 | 在爽文是对的(4命中)。在真实江湖它给0命中——命中靠身法的0.8 |
| 体魄是气血属性 | 在爽文是对的(7外防之外还有5气血)。在真实江湖它给0气血 |
| 靠力道和专注来提要害 | 在爽文是对的(各1.5)。在真实江湖要害根本没有对应的行,怎么加都提不了 |
| 把属性叫作「筋骨」和「内息」 | 过时了。 这个版本里它们叫力道和内力 |
| 诛心=暴击伤害,要害=暴击率,化解=降低对方暴击率 | 三条都对,它们漏掉的第四项是御心——它是给你的诛心做除数的那一项 |
| 「经脉洗练建议使用阳+身法」 | 真实江湖里根本没有经脉洗练。那个模式的经脉页只有激活和加点,别的什么都没有;开发者对这处改动的原话是去除繁琐的经脉词条洗炼,改为加点模式。在还保留洗练的那几个模式里,除非阳是你最高的那一项而且你的招式是阳,否则它什么也不做;加到别的流派上是做减法 |
| 防具词条必须带闪避+4%、身法+5%、诛心+要害+4% | 站得住,而且理由比它自己说的更充分:闪避走的是阈值,诛心是那项带×1.0下限的属性 |
| 外功流→「筋骨」和根骨;内功流→元气和「内息」;肉盾流→体魄和精神 | 在爽文成立。 在真实江湖只有攻击那两半还站得住——元气对内功流除了气血什么也不给;肉盾流要的是体魄做防御,气血则用四项可互换属性中的任意一项 |
任何难度下都没有一个社区来源提到过的:模式分表本身、真实江湖里八项资质有四项可互换、身法的具体数值、 那十项无人读取的属性、相合的减法、诛心的下限,以及战力漏掉会心。
AttriManager.ReCalAttri / ReCalAttriEquip / GetAttriResultDes、AttributeAdditionInfo.LoadCSV
/ GetTableName、Tools.TransfromAttriDic、SpellCalculate.CalculateFormulaDamage /
CalculateFormulaQidunDamage /
CaculateDefenceRate、UnitController.GetXiangHe、NpcEntity.GetMaxPianXiangState /
GetZhanLi、StuntManager.GetStuntEffectValue、AttriPart.GetAttriTip /
RefreshZhenShiJiangHuAttri、UnitController.Defense / FightBack、
SpellCalculate.DoEffectDamage、NpcInformationView.ShowNpcSpell、NpcFight.GetSpellList /
GetNpcSpell,以及attribute_addition、attribute_addition_zhenshijianghu、spelleffect、
spellprotype、npc_spell_container、npc_spell_dynamic、lianzhao_node、pianxiang、
stunt_proto这几张表。
这些表的列序不是靠手数的,而是从各自的读取函数里提取出来的——tools/gamedb.py,按字段名读一行。
本页从数据表里引的每一个数字都是经它读出来的。
实测了什么。 真实江湖的比率取自一个运行中的角色,一次只动一项资质:单独加,等两次连续读数一致后
回读十一项战斗属性和四项上限,再回退,确认回退到位之后才动下一项。在+1000跑一遍,在+300再跑一遍,每
点比率完全相同。之后每一个实测值都和attribute_addition_zhenshijianghu里对应的行按单位对上,包括唯
一一处表面上的出入——那是测试角色身上一个+10%内力的修正,把内力的两项产出各抬高了正好10%。测试脚
本:tools/zizhi_sweep.py,对任何角色都能重跑。
爽文 / 险恶 / 暗黑的比率没有实测。 它们是直接读attribute_addition得来的。既然真实江湖那张表分
毫不差地预测了自己的实测结果,默认表大概同样可靠,但还没有在这几个模式的运行存档上验证过。
伤害公式是整条实测过的。 在CalculateFormulaDamage上挂了个钩子,把游戏每次读到的输入、它返回的
伤害,以及拿同一批输入按上面那条公式独立重算一遍的结果,全都记下来,一共记了405次普通游玩里的计算。
其中162次两边都没有光环生效——重算刻意不去重跑的就是这一条路径,因为它走的那几个方法是按引用改值
的——公式分毫不差地复现了游戏自己算出的伤害,162次里162次。 是同一个整数,不是接近;跨了许多攻击
者、目标和招式,暴击倍率从1.0000到3.2140,外防取到126个不同的值,从0到12,188。
这样一来,上面两节的两个结论就是实测而不是读代码了:防御曲线和暴击倍率都在这条对上了的计算里面,之后又
各自单独验过一遍。测试脚本:tools/damage_probe.py,走修改器的/damage接口。
要注意同一个函数还兼管治疗和真气回复,战斗之外它算的绝大部分都是这个;记录里做了标记,回血回气的那些 已经剔掉。
兵器容器实测过了,格挡是读代码。容器那一半真的会放出来、两半由同一个角色放出来,都来自同一份
日志:168次命中,163次预设招式,5次运行时生成的。反击的3378在前后伤害不同的两次里都出现,也是实
测。读出来而没有实测的是机制本身——格挡光环持续一秒、odds为100%、正面180°的条件、只用一次就消耗
掉,全都来自Defense / FightBack和那条效果行,没有直接观察到。要确认它们得在光环施加上挂钩子,而
这个钩子还没有。
仍然只是读代码、没有实测的:相合的环,战力,那十项无人读取的属性,以及兵器特技。命中 ≥ 闪避那条阈 值也没有实测——它需要一个闪避本来就高过你命中的敌人,而点数只能往上加,逼不出来。在逐项用同样的方法 核对之前,这些都只是代码的说法。