到底什么才让你变强

游戏给你一个战力数字和八项可加的资质,两样都没解释。这篇讲每一点加下去究竟做了什么、伤害公式实际读的 是哪几项,以及角色面板上哪些属性纯属摆设。

难度决定了一点加点值多少

游戏内置了两张不同的换算表,按游戏模式决定读哪一张,而没有一篇社区攻略提到过。

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,或者没有特技, 这项武学就只是一条门派要求,别无用处。

这五项到底怎么涨,以及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是分开的,这正是在前面几个窍穴上用好材料不亏的原因:

一件材料按自己的 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和那条效果行,没有直接观察到。要确认它们得在光环施加上挂钩子,而 这个钩子还没有。

仍然只是读代码、没有实测的:相合的环,战力,那十项无人读取的属性,以及兵器特技。命中 ≥ 闪避那条阈 值也没有实测——它需要一个闪避本来就高过你命中的敌人,而点数只能往上加,逼不出来。在逐项用同样的方法 核对之前,这些都只是代码的说法。