前言

不知道各位是否好奇匠魂那些描述模糊不清的特性和强化之后藏着什么猫腻,笔者最近突然好奇这些特性的运作,翻了一波相关源码来看,给各位分享一些结论,让匠魂不再玄学。如果能对构建各种 build 有帮助那是再好不过。

本文的适合阅读对象应该是数据党或对特性具体数据有兴趣的朋友,新手玩家和对特性具体运作没什么兴趣的朋友可能不适合阅读此文。

本文的一大任务是将源代码逻辑以近乎等价的形式翻译成自然语言,让不便阅读源码但有兴趣的朋友能够了解其具体运作。阅读此文之后,应该能够计算出在给定属性和特性的情况下工具的耐久、速度、伤害等。转换过程中可能会存在与源代码逻辑有细微差异的情况,如果由于这些差异导致计算结果出现误差还请各位谅解指出,同时建议有条件阅读源码的朋友阅读源码。

源代码中与工具属性相关性不大的细节本文可能不会说明。

阅读本文之前需要注意两点,否则读者可能会在阅读过程中感到困惑:

  • 虽然特性和强化在匠魂2 里是不同的概念,但它们在内部运作时机理是十分相似的,因此本文大部分情况下会将匠魂2 中的特性和强化混为一谈,并统一用一个词 “特性” 来称呼。

  • 为行文方便,本文约定一个名词 “原始”:“原始”意味着这个值不受工具特性影响。比如一把不毁镐子挖一个方块,虽然实际上没有掉耐久,但本文认为原始损坏值为 1。当文中出现原始值时,笔者会特别指出这一点。

讨论的一些前提(除非有特殊说明):

  • 所有测试均基于匠魂版本 1.12.2-2.13.0.183,1.12.2 比较新的匠魂版本应该适用,其它 Minecraft 版本的匠魂 2 不能保证适用性

  • 在生存模式下使用工具

  • 工具直接位于玩家物品栏,盔甲和副手也算在内(但不能是位于是背包类的物品栏或扩展物品栏内)

  • 工具用在合适的场合中

  • 涉及到秒的计算,以 TPS=20 换算

  • 随机的分布类型默认为均匀分布,若有其他分布类型会特别说明

  • 没有匠魂外提供的增益效果

  • 本文认为状态效果 1 级 等价于 Amplifier+1

  • 被魔改过的匠魂本文不负责解释

  • 可能会有些因为笔者没注意到的条件而导致结果出现偏差的情况,欢迎补充

由于本文一直在更新,某些错误或考虑不周的内容过后会修正,在之前阅读了本文的朋友建议查看历史改动说明检查是否有修正的地方。

首次写教程,而且没学过 Java,凭着一点瘸腿的 C 和 C++ 经验就来看源码了,仅停留在看得懂高层代码的层面上,一些很底层的运作机理也不是特别清楚,难免有错误或不清晰之处,还请见谅,斧正。

欢迎擅长或喜欢读源码的朋友帮助完善。

如果有更好的排版建议也欢迎提出。

由于本教程日渐庞大,阅读体验可能下降,读者可考虑移步此处,善用大纲功能进行导航。

精力有限,可能不能及时更新,还请见谅。


匠魂2 强化

急速

源码传送门

对挖掘工具,每一颗红石能增加的基础速度为:

  1. 如果当前挖掘速度小于等于 15,增加 0.15 - 0.05 * 当前基础速度 / 15

  2. 如果当前挖掘速度大于 15 小于等于 25,增加 0.1 - 0.05 * (当前基础速度 - 15) / 10

  3. 如果当前挖掘速度大于 25,增加 0.05

对于每一级打满红石的急速,额外增加 0.5 的基础速度

这里所说的基础速度 是 NBT 上的速度,不是面板速度,如果读者对此感到困惑,建议阅读机制说明部分的属性修正部分

对近身武器,每一级急速增加 20% 攻击速度

对弓的增益暂不说明


锋利

锋利传送门

每一个石英增加的基础攻击伤害为:

  • 若当前基础攻击小于等于 10 点,增加 0.05 - 0.025 *  当前基础攻击 / 10

  • 若当前基础攻击大于 10 小于等于 20 点,增加 0.025 - 0.01 * 当前基础攻击 / 20

  • 若当前基础攻击大于 20 点,增加 0.015

每一级满级的锋利,额外增加 0.25 点基础攻击



匠魂2 特性

挖掘类

动力 (Momentum) (钴)

源码传送门

持有动力的工具挖掘方块之后,会给你上一个隐藏 buff,持续时间为 300/工具原始速度(即面板上的速度) 刻,每挖一个方块上升 1 级,最大 32 级;也可以喝牛奶消掉

动力为玩家提供的速度增益为 原始速度*(状态效果等级/80) 点

即最多提供 40% 的原始速度增益

假设玩家最终速度为原始速度的 k 倍,那么玩家挖掘的方块硬度应当小于 10k,否则在这个状态效果消失之前玩家根本无法破坏这个方块,这个增益就会断掉


轻便 (Lightweight) (钴)

源码传送门

提升挖掘速度 10%

增加 0.1 攻击速度系数

增加 10% 原始拉弦速度


石缚 (Stonebound) (阿迪特)

石缚源码传送门

速度增益为 In((最高耐久 - 当前耐久) / 72 + 1) * 2

感谢 @Sam0324 指正


喜水 (Aquadynamic) (海晶石)

喜水源码传送门

定义一个概念 “协同效果”

初始协同效果 = 1

  • 如果玩家正处于水中(接触到水都行,不一定头部浸水),协同效果增加 5.5

  • 如果玩家所处世界正在下雨,则协同效果增加 玩家所处生态群系降雨值 / 1.6 点

喜水使挖掘速度增加 原始速度*协同效果 点

原版生态群系的降雨值可以在这里找到

看了注释其实作者本意是想削弱水下挖掘的速度惩罚,但是现在只要泡水就行了,就。。。


超自然 (Unnatural) (骑士史莱姆)

超自然源码传送门

增加 工具挖掘等级 - 方块挖掘等级 点挖掘速度(不会负增加)


坍毁 (Crumbling) (骑士史莱姆)

坍毁源码传送门

当所挖掘的方块不需要用工具也能挖掘时,给予玩家 50% 原始速度增益


Depthdigger

Depthdigger 源码传送门

代码中出现的特性,但似乎未在游戏中实装,但是对这个特性有点熟悉,望知情朋友告知

增加 (72 - 挖掘方块的 y 坐标)/30 点挖掘速度


自动熔炼 (Autosmelt) (烈焰木)

自动熔炼源码传送门

一个令笔者感到郁闷的特性,笔者对这个特性没有准确答案,下面只是笔者对源码的理解

以下叙述仅在挖掘掉落物存在熔炉烧炼结果时成立:

1. 当破坏方块的时候,掉落其掉落物在熔炉的熔炼结果,数量与原本应掉落物品数量相等

2. 如果存在时运附魔(时运强化就是给工具上时运附魔),则掉落物数量为 {无时运时掉落数量 × [0, 时运等级] 的随机整数 + 1},可以看出这个公式与 Minecraft 的时运附魔公式是不同的。自动熔炼与时运的联动可以通过配置文件的 AutosmeltFortuneInteraction 项关闭。

3. 自动熔炼还会掉落经验,如果熔炉配方的经验小于 1(比如每个圆石烧炼为石头的经验为 0.1),那么有 (熔炉配方的经验) 的可能掉落一点经验,否则按照熔炉配方的经验数掉落

但是,笔者进行测试的时候发现结果与笔者的理解是不太符合的。笔者首先给镐子上了时运 I 和自动熔炼,然后用它来挖铁矿,有两种结果:掉一个铁锭和掉两个铁锭。但是掉两个铁锭的次数更多;笔者还用 CraftTweaker 给熔炉添加一个青金石烧炼变成一个钻石的配方,然后用上述镐子挖青金石矿石,结果发现挖掘同样数量的青金石矿,只有时运 I 镐子挖出的青金石数比用上述镐子挖出的钻石数要少得多。


战斗类

冷血 (Coldblooded) (玛玉灵)

源码传送门

官方对冷血的描述很简单,满血 1.5 倍伤嘛,然而这里头是有猫腻的,冷血这 1.5 伤害翻倍是哪部分伤害官方没说

这边阅读源码之后知道,这 1.5 倍翻的是原始伤害

举例来说,一把 4 点基础攻击的小木剑,带上炼狱和冷血打一只满血的"非下界生物",伤害是 4*1.5+4 = 10 点,而不是 (4+4)*1.5


贪心 (Insatiable) (玛玉灵)

源码传送门

持有贪心的工具击攻击生物之后,会给你上一个 5×20 刻的隐藏 debuff(它是这么规定的),每攻击一次这个状态效果升 1 级,最高 10 级。

这个 debuff 可以喝牛奶消掉,但你喝桶牛奶的时间跟它自己消失用时也没差多少。。。

伤害增加这个状态效果等级的 1/3

工具损坏增加这个状态效果等级的 1/3(向下取整)

结论:贪心最多增伤 10/3 点

所以如果你有穿着无尽套这种免疫 debuff 的效果,那么这个特性就无法生效


粗暴 (Crude) (燧石)

源码传送门

等级特性,最大等级 3

当目标防御点数不大于 0 时,对目标额外造成 5%×粗暴等级 的伤害(以原始伤害计算)

因此即使是对没有身着盔甲的正常僵尸也是没有增伤的


锯齿 (Jagged) (海晶石)

源码传送门

攻击增益为 In((最高耐久 - 当前耐久) / 72 + 1) * 2,和石缚一样的公式

感谢 @Sam0324 指正


碎裂 (Splintering) (骨)

碎裂源码传送门

每次攻击给目标上一个 40 刻的 debuff,每次攻击上升 1 级,最高 5 级

对该目标的攻击伤害增加这个 debuff 等级 * 0.3 点

所以最高增伤 1.5 点


碎骨 (Fracture) (骨)

源码传送门:

增加工具 NBT 攻击 1.5 点

源码上很没有存在感的特性,没有专门为它提供一个文件


炼狱 (Hellish) (地狱岩)

炼狱源码传送门

手册上的描述是对 “非下界生物” 造成额外伤害,这个描述是不准确的

实际上该特性的效果是对不免疫火的生物造成额外 4 点伤害


尖刺 (Prickly) (仙人掌)

尖刺源码传送门

对伤害源造成不会被状态效果和魔咒修饰的穿透护甲的伤害

伤害值为 0.5 + max(-0.5, 一个服从标准正态分布的随机数)


棘刺 (Spiky) (仙人掌)

棘刺源码传送门

对于这个特性,笔者同样没有得出准确的答案,写在这里希望和知情的朋友探讨

阅读源码之后,笔者对棘刺得到的结论是:

  • 当玩家受到伤害时,对攻击者造成面板伤害的一半,无视护甲和伤害免疫

  • 当玩家格挡时,对攻击者造成面板伤害,无视护甲和伤害免疫

  • 不会自我反伤,不反伤荆棘伤害

但是实测不然,一些实验数据如下:

测试对象为蜘蛛,使用大剑和战斗牌子两种武器进行测试,战斗牌子处于格挡状态

实验序号大剑面板伤害对蜘蛛反伤战斗牌子面板伤害对蜘蛛反伤(格挡状态)
143.547.0
265.5611.0
387.5815.0
4109.31018.6 (测试的蜘蛛生命上限为 20)

从这个表格反而能得出一个结论,满额反伤 = 面板伤害 * 2 - 1 (18.6 是伤害 19 临界伤害 15 的衰减后的伤害)

笔者对此感到非常郁闷,不知道哪里理解错了,甚至怀疑作者用私货代码来编译,望知情的朋友告知

PS:在 1.12 旧版匠魂,棘刺的公式是不一样的,伤害是工具面板伤害的 1/3


可燃 (Flammable) (熔岩史莱姆)

可燃源码传送门

受伤时点燃攻击者 3 秒

格挡时,若手持者受到火焰伤害,则对工具产生 3 点原始损伤并阻挡火焰伤害;若手持者受到来自其他生物的伤害,则点燃攻击者 3 秒


过热 (Superheat) (熔岩史莱姆)

过热源码传送门

当攻击的目标着火时,增加 30% 原始伤害


神圣 (Holy) (银)

神圣源码传送门

对亡灵生物额外造成 5 点伤害并给予其 虚弱 I 50 刻


剧毒 (Poisonous) (铅)

剧毒源码传送门

攻击一个生物后给其上 中毒I 101 刻


沉重 (Heavy) (铅)

沉重源码传送门

当玩家主手或副手持有工具带有该特性时,设置玩家 Attributes 的击退抗性设为 1,即不会被击退


锐利 (Sharp) (钢)

锐利源码传送门

成功攻击生物后,给生物上一个 1 级 debuff 121 刻

该 buff 效果为,每到效果剩余刻数为 15 的倍数时,对生物造成 状态效果等级/3 点的无视伤害免疫的伤害

因此生物受到效果之后立即攻击一次可以马上又受到一次流血效果


坚忍 (Stiff) (钢)

坚忍源码传送门

当玩家格挡时受到伤害,则减轻 1 点伤害,且减轻后的伤害至少为 1 点


耐久类

生态 (Ecological) (木)

源码传送门

每 1 刻进行一次判定,有 1/800 的可能回复工具的一点耐久

可近似理解为平均 40 秒回复 1 点耐久


吝啬 (Cheapskate) & 廉价 (Cheap) (圆石)

吝啬源码传送门廉价源码传送门

吝啬:工具制造出来之后最大耐久降低 20%,并且不会低于 1 点,该特性直接影响 NBT 上的数据

廉价:工具在恢复耐久的时候额外恢复原始恢复值的 5%


爱石 (Petramor) (阿迪特)

爱石源码传送门

挖 “石头” 时有 10% 的几率回复 5 点耐久

“石头” 不仅仅指石头,原版与石头共用命名空间的那些岩石也算在内,准确地说是 Material.ROCK

官方描述中提到了 “吸收” 这个词,实际上挖下来的东西并不会少

所以只要带个强化 3 就可以挖安山岩刷耐久??


持久 (Duritos) (黑曜石)

持久源码传送门

每次产生原始损坏值时,10% 的概率增加该原始损坏值的损坏(如果不考虑其他特性就是两倍损耗),40% 的概率减轻该原始损坏值的损坏(如果不考虑其他特性就是不损耗),否则正常进行损坏结算


致密 (Dense) (青铜)

致密源码传送门

每次产生原始损坏值时,有 (0.75 * (1 - 当前耐久/最大耐久))^3 的可能,使损伤值减小原损伤值的一半(向下取整)且至少减小 1 点


其他

异形 (Alien) (末地石)

异形源码传送门

异形的奖励一共是 800 次,工具在第一个更新刻时就已经决定了这 800 次在 3 个属性上的分配情况,并且它们是随机分配到 3 种属性奖励中的

异形每次奖励的可能有:

  • 1 点最大耐久

  • 0.007 点挖掘速度

  • 0.005 点攻击伤害

每 72 刻(3.6 秒)为一个奖励周期,每个周期轮流奖励一个以下属性,并立即生效到工具上:

  1. 耐久

  2. 挖掘速度

  3. 攻击伤害

有几点不太重要的额外说明:

  • 如果到达一个奖励周期但对应属性的奖励次数已用尽,则什么也不做跳过这个奖励周期,而不是应用下一个轮次的奖励,这使得奖励完毕时间有较大延长

  • 当到达奖励周期但玩家正在用这个工具挖掘方块时,则跳过这个奖励周期(轮次也被跳过),但不会消耗对应奖励的奖励剩余次数。举个例子,假如这个奖励周期要奖励挖掘速度结果玩家正在挖掘方块,这个奖励周期被跳过,挖掘速度的剩余奖励次数没有减少,但下次将奖励的是攻击伤害

  • 虽然说明时的单位是奖励次数,但实际上存储在 NBT 内的奖励池是各种属性的值,同时存储在 NBT 中的数据是各项已经分配的属性总额

总结:异形最少用 48 分钟奖励完毕;异形平均奖励 266.67 点耐久,1.867 点挖掘速度,1.333 点攻击伤害


抑影 (Enderference) (末地石)

抑影源码传送门

成功攻击生物时给生物上一个 100 刻 1 级 隐藏 debuff,这个 debuff 会取消 EnderTeleport 事件(在原版就是阻止末影人传送,对某些使用这个事件的模组生物应该也奏效)

末地石煎锅把小黑拍水里,计划通


好暑 (Aridiculous) (地狱岩)

好暑源码传送门

定义一个概念 ”暑气“

挖掘方块处的暑气=1.25^(3*(0.5+方块所处生态群系的温度-方块所处生态群系的降雨量))-1.25-rain

玩家处的暑气=1.25^(3*(0.5+玩家所处生态群系的温度-玩家所处生态群系的降雨量))-1.25-rain

若所处世界正在下雨,则 rain=该处生态群系的降雨量/2,否则 rain=0

好暑产生两种效果

  • 玩家挖掘速度增加原始挖掘速度的 挖掘方块处的暑气/10 倍

  • 玩家攻击额外造成 2*玩家处的暑气 点伤害

暑气有可能是负值,所以可能会对挖掘速度和攻击伤害产生负增益

原版生态群系的温度和降雨值可以在这里找到


磁力 (Magnetic) (铁)

磁力源码传送门

等级特性,最大等级 3

当玩家成功攻击一个生物或破坏一个方块之后,给玩家上一个持续 30 刻的隐藏 buff

状态效果生效期间吸引以玩家为中心的一个边长为 (1.8+状态效果等级×0.3)×2 的正方体范围内的掉落物品


美味培根 (Baconlicious) (生铁)

美味培根源码传送门

  • 破坏一个方块之后有 0.5 % 的概率获得一个培根

  • 击杀一个生物之后有 5 % 的概率获得一个培根


美味 (Tasty) (生铁)

美味源码传送门

玩家食用一次工具恢复 1 点食物水平,消耗工具 5 点耐久 (可被其他特性影响)

触发食用的条件:

  • 玩家必须手持该工具

  • 工具没有损坏并且有足够的耐久进行一次消耗

  • 玩家的食物水平未满

玩家食用的基础概率为 1%

  • 如果玩家已受伤,概率增加 2%

  • 如果玩家食物水平小于 10,概率增加 (10-食物水平)×0.25%-饱和度×0.5%

每刻有以上的累积概率使玩家触发食用


黏滑 (Slimey) (史莱姆)

黏滑源码传送门

每次破坏方块或杀死生物之后有 0.33% 的概率生成一只对应颜色种类的 1 级大小的史莱姆

具体生成位置为:

  • 破坏的方块的 x+0.5, y, z+0.5 处

  • 击杀生物的 x, y, z 处


infitool

Infitool 源码传送门

infitool 是 InfiTools 上的隐藏特性,故面板上看不到它

infitool 的效果如下:

  • 工具耐久设为 999999

  • 工具 NBT 攻击设为 999999

  • 工具 NBT 挖掘速度设为 999999

  • 工具强化槽设为 0

  • 不允许重命名工具

  • 当工具受到原始损伤时,将损伤值设为 0

but,这玩意没有优先级,所以说,你可以搞点事情,比如刻印个贪心上去,拿去拍人耐久一样会掉;刻印个铭刻上去一样有强化槽等等。个人感觉应该给这个特性上个低一点的优先级


柔和 (Squeaky) (海绵)

柔和源码传送门

两个效果

  • 给工具上精准采集附魔

  • 当玩家造成伤害时,设置伤害为 0

关于第二点,举个极端点的例子,假如有这么一把剑:玛玉灵剑刃 + 玛玉灵护手 + 海绵手柄,特性顺序是柔和 → 贪心 → 冷血,那么这把剑仍然能在触发贪心和冷血时打出伤害,满足你又想听橡皮鸭叫又想打出伤害的需求


尖刺 (Splinters) (木)

Splinters 源码传送门

曾经存在于木上的特性,作者说这个特性迷惑新人,已在 1.12 新版匠魂中移除

当成功攻击或破坏方块后,有 1/150 的几率对自己造成 0.1 点无视伤害免疫和穿甲的伤害


老成 (Established) (铜)

老成源码传送门

若玩家主手持有工具含有该特性:

  • 玩家击杀生物后,

    • 若原本不会掉落经验,则有 3% 的机会掉落 1 点经验

    • 若原本会掉落经验,设其为 exp,则最终掉落 1+四舍五入{1.25 × exp + 一个 0~1 随机小数 × 0.25} 点经验

  • 玩家挖掘一个方块后,

    • 若原本不会掉落经验,则有 3% 的机会增加 1 点经验掉落

    • 若原本会掉落经验,则有 33% 的机会增加 1 点经验掉落


震击 (Shocking) (琥珀金)

震击源码传送门

定义两个概念:

  • 充能:拥有该特性的工具将拥有一个能量值,一些行动会给工具充能,当能量值大于等于 100 时即工具充能完毕,能量值小于 100 即充能未完全。充能的方式有攻击、挖掘和移动

  • 释能:充能完毕并在攻击或挖掘触发效果后能量值归零

每次攻击成功,

  • 若已充能完毕,对目标额外造成 5 点无视伤害免疫的伤害,给玩家上 50 刻 速度VI,并释能

  • 若充能未完全,则充能 (15 * 攻击的冷却程度(最大为 1)) 点

每次挖掘完毕,

  • 若已充能完毕,给玩家上 50 刻 急迫 III,并释能

  • 若充能未完全,则充能 15 点

手持工具下每 5 刻,若充能未完全,

  • 若玩家前 5 刻内移动的距离,即 √(dx^2+dy^2+dz^2) 小于 0.1,则不进行充能

  • 若玩家前 5 刻内移动的距离大于 5,则充能 5 点

  • 否则充能 (玩家前 5 刻内移动的距离) 点

感谢 @QQ酱81960 指点


铭刻 (Writable) (纸)

铭刻源码传送门

等级特性,最大等级 3

增加 1 个强化位

没什么可讲的,但是为了完(qiang)整(po)性(zheng),还是随便提一下



部分匠魂2 扩充模组特性

Extra Utilities 2 (1.12-1.9.9)

魔法易碎 (魔法木)

源码传送门

首先阅读源码之后可以得出一个结论,99%(我不敢把话说绝对,但是目前那 1% 的特性我是没见过)跟减损或增损有关的匠魂特性或强化都不会影响到魔法易碎的表现,因为它的计算依据是原始损坏值。例如,即使你给你的工具打上 5 个强化,在做原本会对工具造成损坏的行为之后,魔法易碎照样有可能能够爆掉你的工具。

下面说明其工作机理:

  1. 如果工具最大耐久只有 1 点,对不起,掉一次耐久爆一次,没得商量

  2. 如果工具最大耐久大于 1 点,假如你的行为对工具造成 x 点损伤,那么进行 x 次判定(判定的次数最小为 1),每次判定有 1/(最大耐久的平方) (且这个值最小为 0.01)的可能爆掉你的工具


TAIGA (1.12.2-1.3.4)

噬魂者 (虚金)

源码传送门

每次击杀生物获得的 bonus = 一个从 0 ~ 1 的随机小数 × 生物最大生命值 × 0.004,并四舍五入到两位小数。

增加的伤害就是 bonus 值。


TwilightForest (1.12.2-3.11.1021)

同调 (钢叶)

源码传送门

定义一个概念 ”治愈能量“,初始治愈能量为 0,检查玩家的快捷栏:

  1. 每有一个钢叶增加 1 点治愈能量

  2. 每有一个钢叶块增加 9 点治愈能量

  3. 每有一把钢叶工具(应该只算暮色的钢叶工具,暂不确定)增加 1 点治愈能量

每刻进行一次如下操作:

  • 定义两个值,恢复值1 和 恢复值2

  • 有 ((治愈能量/256)的小数部分) 的可能 恢复值1 等于 1,否则 恢复值1 等于 0

  • 恢复值2 等于 (治愈能量/256) 的整数部分

  • 每刻恢复 (恢复值1 + 恢复值2) 点耐久

举例来说,假如你快捷栏有一组钢叶,每刻平均恢复 0.25+0=0.25 点耐久,每秒平均恢复 5 点耐久。


部分匠魂2 机制说明

关于这一部分的所有特殊名词均由笔者为方便说明捏造,并非官方说法

属性修正

镐和锤子,写在 stat NBT 里的挖掘速度是相同的,但 NBT 上的挖掘速度不是实际上的挖掘速度,实际上两者挖掘速度是不同的

实际挖掘速度 = NBT 上的速度 × 速度修正系数,这个速度就是写在面板上的挖掘速度,在本文中所有的原始挖掘速度都是指这个

举个例子,没有任何强化的纯木锤和纯木镐,它们头部挖掘速度都是木,为 2.0 点,写在 NBT 上都是 2.0,但是实际挖掘速度要各自乘上它们的挖掘速度修正系数,所以木镐实际挖掘速度是 2.0*1.0=2 点,木锤为 2.0*0.4=0.8 点,这就是写在面板上的挖掘速度

急速强化计算时依据的挖掘速度都是 NBT 上的挖掘速度,与实际挖掘速度没有任何关系

举个例子,上面的木镐和木锤在打满急速 3 之后写在 NBT 上的挖掘速度都是 20.311396。木镐的实际挖掘速度 20.311396*1.0=20.311396,舍入到两位小数写在面板 20.31;木锤实际挖掘速度 20.311396*0.4=8.1245584,舍入到两位小数写在面板 8.12

伤害与挖掘速度同理,锋利强化与急速强化也是同理,但是面板的伤害包括玩家 Attribute 的伤害,详见后面的伤害计算

攻击速度是每种工具各自的属性,每种工具的基础攻击速度不同


工具属性 NBT

一个匠魂工具的 Tag 有很多个键值对,重点讲几个

  • Traits:工具特性列表(特性唯一名称字符串列表)

  • Stat:工具属性当前的 NBT 数据,有些特性是在这里动刀子的比如急速、锋利、吝啬等。文中提到的 NBT 挖掘速度, NBT 攻击都是指这里的值

  • StatsOriginal:工具不计算任何特性时的属性,结构与 Stat 相同,平时使用工具时一般没这些数据什么事,但某些特性以这些数据为计算依据比如绿宝石

为什么要区分出来这个东西,因为它跟速度和攻击的计算方法有关,如果不区分一下就可能算不对了


伤害衰减

由于计算比较复杂,墙裂建议有阅读源码条件的朋友阅读源码

每种匠魂近身武器都有一个临界值,当你用这种近身武器造成的伤害超过这个临界值时,伤害就会衰减

为使公式看起来比较好看,定义如下运算:​匠魂2部分工具特性和强化的说明和计算(不适合新手)-第1张图片,二者运算优先级同乘除法,百科没有公式有点失望。。。

近似计算公式(源码不是这么算的):

  • 若 伤害/临界伤害 < 67,则匠魂2部分工具特性和强化的说明和计算(不适合新手)-第2张图片(第一项是等比数列求和)

  • 若 伤害/临界伤害 = 67,则匠魂2部分工具特性和强化的说明和计算(不适合新手)-第3张图片

  1. 若 伤害/临界伤害 > 67,则匠魂2部分工具特性和强化的说明和计算(不适合新手)-第4张图片

高伤害建议写脚本算,如果伤害比较小(小于 100),直接手工求和计算也还不算特别复杂,计算过程中记住三个值:系数 p,数值 d1,和数值 d2,这三个值在计算过程中会变化

  • 初始值:p=1, d1=计算衰减前的伤害, d2=0

  • 进行 floor(伤害/临界伤害​) 次如下计算:

    • d2 增加 p * 临界伤害

    • p 乘 0.9

    • d1 减去 临界伤害

  • 最终的伤害 = d2 + 最终的 p * 最终的 d1

举例,一把没有任何强化的纯精金大剑,进入野兽模式之后应该会对目标造成 4*8 = 32 点伤害,计算伤害衰减之后为 1*15 + 0.9*15 + 0.81*2 = 30.12

再举个高伤害的例子,来自 Tinkers' Evolution 的无强化纯无尽大剑,组装出来后伤害本来应该是 9003,然而被衰减到 15*(1-0.9^67)/(1-0.9)+0.9^66*15*((9003-15*66)//15-1)=157.506 点,这个伤害就是写在面板上的伤害了

总之,结论就是,伤害越高衰减越厉害;临界伤害越低越容易衰减,衰减也更大
构建一个 build 的时候可以考虑一下用其他性能换来的伤害被衰减之后是否值得


挖掘速度特性计算的顺序问题

我们来假设一个情景,假设有个熊孩子趁你不在家的时候在你家门口用大量圆石造了个刷怪塔,你回到家大怒觉得这玩意破坏风景打算拆掉,现在需要弄把镐子拆掉这个违章建筑,要求在最短时间内完成拆迁作业,经计算瞬间破坏圆石需要的速度为 2*30 = 60,因此你需要一把速度能飙到 60 以上的镐子。首先首选肯定要有精金(TAIGA),BERSERK 四倍速大法好,反正一次性的东西;然后圆石挖掘等级比较低,可以考虑骑士史莱姆;接着你希望选个又便宜速度又好的镐头,那就是钴了。

好了,现在我们的成品镐子有两种可能方案:

  1. 钴镐头 + 精金绑定结 + 骑士史莱姆手柄

  2. 钴镐头 + 骑士史莱姆绑定结 + 精金手柄

然后开 BERSERK 挖圆石速度也有两种可能:

  1. 非自然先 BERSERK 生效:(12+4) * 4 = 64 > 60,可以秒拆圆石

  2. 非自然后 BERSERK 生效:12 * 4 + 4 = 52 < 60,不可秒拆圆石

好,现在开始连连看

实验表明,第一把镐子(骑士史莱姆手柄)能瞬间破坏圆石,对应第一种速度,也就是非自然先生效了;第二把镐子(骑士史莱姆结)不能瞬间破坏圆石,对应第二种速度,非自然后生效

再举个例子:有两把镐,两者打满急速 3 后速度都是 28.65859(面板只显示两位小数,是 28.66,但用 28.66 算会有比较大的误差)

  1. 钴头+钴结+骑士史莱姆手柄+急速3

  2. 钴头+骑士史莱姆结+钴手柄+急速3

两把镐子都有瞬间破坏石头的能力,但是它们的时机是不一样的,第一把镐子只要挖  24 个石头之后就开始瞬间破坏石头,而第二把需要先挖 27 个石头,设 s=28.65859

  1. (s+4+(s*24/80))*1.1=45.3817837

  2. s+s*0.1+(s*27/80)+4=45.196723125

当然正常游戏的时候不会这么抠门去追究这 3 个石头的差距,举这个例子只是为了说明挖掘特性生效顺序,但在某些时候差这么一点还真的就很不一样

阅读源码之后总结出,挖掘速度特性生效顺序由两个因素决定:

  1. 首要因素是特性的优先级,绝大部分特性的优先级是相同的(至少原版的都相同),优先级高的先生效

  2. 其次的因素是特性在 Traits NBT 上的位置,在前面的先生效。面板上特性的顺序与 NBT 上是基本一致的,可简单据此做判断

判断特性的计算顺序基本上看在面板顺序就够了,优先级比较特别的特性比较少见,当发现计算结果不对的时候才会考虑到可能是有特性的优先级比较特殊

从这些我们可以看出,有时在构建一个 build 时可能还要考虑特性的生效顺序。在不知道一种工具哪个特性先生效的情况下,可以在组装一个工具之前先在组装台上多换一些组合从右边成品的面板看看特性的顺序,以确定最佳 build

最后再提一下一个匠魂挖掘工具真正挖掘速度(不是面板速度)的计算的大致流程:

  1. 计算实际挖掘速度(面板上的挖掘速度)= NBT 上保存的挖掘速度 * 挖掘速度修正系数

  2. 逐个按序结算工具上与挖掘速度有关的特性,在原始挖掘速度上的基础上提供增益

玩家最终的挖掘速度还是由多个因素组成:比如空中挖掘、水下挖掘速度惩罚,急迫等状态效果,甚至是用 NBT 手段为匠魂工具附上效率等魔咒产生增益,或是其他模组提供的增益,匠魂挖掘工具只是其中的一个作用因子而已。讨论其他因素带来的增益不在本文讨论的范围之内


工具伤害计算

计算流程:玩家基础伤害 → +工具实际伤害→ 按顺序结算与伤害有关的特性 → 计算暴击伤害 → 计算伤害衰减 → 由攻击冷却计算伤害 → 得到最终伤害

每一步的额外说明:

  1. 玩家基础伤害储存在玩家 NBT 的 Attributes 里 (generic.attackDamage),正常情况下是 1.0

  2. 工具实际伤害 = 工具 NBT 伤害 × 修正系数

  3. 同样有优先级,同样是按顺序结算

  4. 暴击伤害翻 1.5 倍

  5. 伤害衰减前面有提到了

  6. 匠魂工具攻击冷却伤害计算公式与原版相同,详见此处

布置一道计算题:求在下列条件下的两把工具每一击伤害和 DPS(DPS = 最终攻击伤害 × 攻击速度)

  1. 条件1:玩家基础伤害没有被其他模组修改

  2. 条件2:地狱岩顶端伤害 3 点;西洋剑伤害修正为 0.55,劈刀为 1.2

  3. 条件3:面板上工具特性的顺序是:噬魂者 → 好暑 → 炼狱 →  BERSERK;噬魂者的 bonus 为 10.0 点;在沙漠上挥动武器,沙漠温度 2.0,降水量 0.0;攻击非免疫火生物

  4. 条件4:打出暴击伤害

  5. 条件5:西洋剑临界伤害 13 点,劈刀是 25 点

  6. 条件6:攻击在冷却完毕后进行

  • 工具1 —— 西洋剑:地狱岩剑刃 + 精金十字柄 + 虚金手柄 + 锋利 3

  • 工具2 —— 劈刀:地狱岩宽剑刃 + 地狱岩大板 + 虚金手柄 1 + 精金手柄 2 + 锋利 3

解:

1. 西洋剑:

    1.1 玩家基础伤害:1 点

    1.2 计算真实伤害:

        1.2.1  裸工具基础伤害 3 点

        1.2.2  计算锋利 3 后为 10.830295(没具体研究怎么计算方便,脚本算的)

        1.2.3  真实伤害为 10.830295*0.55=5.956662。到这一步伤害为 6.956662

    1.3 计算特性带来的增益:

        1.3.1  噬魂者增加伤害 10.0 点。现在伤害为 16.956662

        1.3.2  好暑增加 (1.25^3*(0.5+2-0)-1.25-0)*2 = 8.162403。现在伤害为 25.119065

        1.3.3  炼狱增加 4 点。现在伤害为 29.119065

        1.3.4  BERSERK 直接将伤害翻 4 倍。现在伤害为 29.119065*4=116.476260

    1.4 计算暴击伤害:116.476260*1.5=174.714390

    1.5 计算伤害衰减:13*(1-0.9^13)/(1-0.9)+0.9^13*(174.714390-13*13)=98.408265

    1.6 计算冷却伤害:98.408265*1.0=98.408265,这个就是最终伤害

    1.7 DPS=98.408265*3=295.224795

2. 劈刀:

    2.1 玩家基础伤害:1 点

    2.2 计算真实伤害:

        2.2.1  裸工具基础伤害 3*1.3+3=6.9 点(劈刀基础伤害公式)

        2.2.2  计算锋利 3 后为 12.856173

        2.2.3  真实伤害为 12.856173*1.2=15.427408。到这一步伤害为 16.427408

    2.3 计算特性带来的增益:

        2.3.1  噬魂者增加伤害 10.0 点。现在伤害为 26.427408

        2.3.2  好暑增加 (1.25^3*(0.5+2-0)-1.25-0)*2 = 8.162403。现在伤害为 34.589811

        2.3.3  炼狱增加 4 点。现在伤害为 38.589811

        2.3.4  BERSERK 直接将伤害翻 4 倍。现在伤害为 38.589811*4=154.359244

    2.4 计算暴击伤害:154.359244*1.5=231.538866

    2.5 计算伤害衰减:25*(1-0.9^9)/(1-0.9)+0.9^9*(231.538866-25*9)=155.678168

    2.6 计算冷却伤害:155.678168*1.0=155.678168,这个就是最终伤害

    2.7 DPS=155.678168*0.7=108.974718

由于计算机浮点数计算会造成玄学误差,实际可能会有一点差异,实际游戏也不用去过于追究


匠魂2 部分数据

部分工具耐久计算公式

公式来自 reddit (需要科技),在此对原作者表示感谢

最终耐久向下取整

工具耐久公式
镐斧铲(顶端 + 绑定结) * 手柄系数 + 手柄耐久
大剑1.1 * (顶端 + 护手) * 手柄系数 + 手柄耐久
长剑1.05 * (顶端 + 护手) * 手柄系数 + 手柄耐久
西洋剑0.8 * (顶端 + 护手) * 手柄系数 + 手柄耐久
劈刀2 * (((头部 + 大板) / 2 + 手柄2额外耐久 ) * 手柄1系数 + 手柄1耐久) (实验验证在组装台上靠左的是手柄1)
鹤嘴锄((铲头 + 斧头) / 2) * 手柄系数 + 手柄耐久
锤子2.5 * ((头部 * 2 + 大板1 + 大板2) / 4 * 手柄系数 + 手柄耐久
开掘铲1.75 * (((头部 + 大板) / 2 + 绑定结) * 手柄系数 + 手柄耐久)
伐木斧2 * (((头部 + 大板) / 2 + 绑定结) * 手柄系数 + 手柄耐久)
镰刀2.2 * ((头部 + 绑定结) * (手柄1系数 + 手柄2系数) / 2 + (手柄1耐久 + 手柄2耐久) / 2)
煎锅头部 * 手柄系数 + 手柄耐久
战斗牌子头部 * 手柄系数 + 手柄耐久
短弓(弓臂1 + 弓臂2) / 2 * 弓弦系数
长弓1.4 * (弓臂1 + 弓臂2) / 2 + 大板额外耐久) * 弓弦系数
十字弓

((弓臂 + (绑定结 + 手柄额外耐久) / 2) * 手柄系数 + 手柄耐久) * 弓弦系数


工具属性数据

工具挖掘速度修正系数攻击伤害修正系数攻击速度击退值临界伤害
1.01.01.21.015.0
1.01.11.11.315.0
1.00.91.01.015.0
锤子0.41.20.81.015.0
开掘铲0.281.250.71.015.0
伐木斧0.351.20.81.515.0
鹤嘴锄0.950.91.10.915.0
镰刀1.00.750.91.015.0
大剑0.51.01.61.015.0
长剑0.51.11.41.018.0
西洋剑0.50.553.00.613.0
劈刀0.51.20.71.025.0
战斗牌子0.50.861.21.015.0
煎锅0.51.01.42.015.0