焦点除魔升级

基本信息

属性 值
源文件 common/DisenchantFocusUpgrade.java(147 行)
基类 thaumcraft.api.wands.FocusUpgradeType
研究 key salisarcana:FOCUS_DISENCHANTING
图标 salisarcana:textures/foci/disenchant.png
升级 ID FocusUpgradeType.types.length(运行时分配,见 DisenchantFocusUpgrade.java:35)
主开关 enhancements.enableFocusDisenchanting(默认开启)
返还比例 enhancements.focusDisenchantingRefundPercentage,默认 75

功能

Thaumcraft 4 的焦点操纵器(Focal Manipulator)原本只能给焦点加附魔,无法拆。 本升级类型让玩家可以把焦点上的附魔取下来,并按比例返还投入的经验。

DisenchantFocusUpgrade 是注册进 FocusUpgradeType.types 数组的一个新升级类型。 它有两种存在形态:

  • baseInstance(DisenchantFocusUpgrade.java:36)——通用实例,tooltip 只说返还比例
  • createSpecific(short[]) 产出的实例——针对具体某个焦点,tooltip 里点名要拆的 附魔名称、等级与可得经验

注册流程

分两步,且两步分别由不同开关把关(DisenchantFocusUpgrade.java:34-37、 DisenchantFocusUpgrade.java:59-61):

步骤 入口 触发条件 时机
① 分配升级 ID DisenchantFocusUpgrade.initialize() enableFocusDisenchanting CommonProxy.java:72-74,preInit
② 注册研究条目 DisenchantFocusUpgrade.registerResearch() enableFocusDisenchanting CustomResearch.java:59-61,postInit

两步用的是同一个开关 enableFocusDisenchanting,因此不存在 「升级类型已注册但研究没注册」的半开状态。upgradeID 取自 FocusUpgradeType.types.length(DisenchantFocusUpgrade.java:35), 即追加到 Thaumcraft 4 已有的升级类型之后,不覆盖任何既有 ID。

按「类存在 ≠ 其 init() 被调用」的检查要求,这两点已逐条确认: initialize() 的调用点在 CommonProxy.java:72-74, registerResearch() 的调用点在 CustomResearch.java:59-61, 两者都在真实的事件处理路径内,非死代码。

数值

经验点

getXpPoints()(DisenchantFocusUpgrade.java:139-142):

经验点 = RANK_TO_XP_POINTS[min(lastRank, 5) - 1] * 返还比例 / 100

RANK_TO_XP_POINTS(DisenchantFocusUpgrade.java:21)是定长 5 元素数组, 源码注释直接给出了对应的附魔等级:

数组下标 lastRank 附魔等级 基础经验点
0 1 8L 136
1 2 16L 272
2 3 24L 516
3 4 32L 956
4 5 40L 1760

lastRank 由焦点附魔数组中「连续已占用槽位」的长度推出 (DisenchantFocusUpgrade.java:107-109)。等级超过 40L 时 Math.min(this.lastRank, 5) 把它夹到 5,经验点不再增长。

以默认返还比例 75 计算,各等级的返还经验点为 102 / 204 / 387 / 717 / 1320 (由上表数值乘 75 再整除 100 得出,源码为整数除法)。

魔力

getVisPoints()(DisenchantFocusUpgrade.java:144-146):

vis = Aspect.ENTROPY (湮灭) × (100 << lastRank)
lastRank 100 << rank 湮灭需求
1 200 200
2 400 400
3 800 800
4 1600 1600
5 3200 3200

lastRank 为 0(无已占用槽位)时 getVisPoints() 会得到 100 << 0 = 100, 而 getXpPoints() 会在 RANK_TO_XP_POINTS[-1] 上越界。该方法在 lastRank 为 0 时不会被调用——焦点必然至少有一个附魔才谈得上「拆除」—— 但源码中未见显式守卫。此处仅记录源码事实,不断言为缺陷。

要素价格

ASPECT_VALUE = Aspect.ENTROPY × 1(DisenchantFocusUpgrade.java:29), 即研究本身只消耗 1 点湮灭。

研究条目

registerResearch()(DisenchantFocusUpgrade.java:39-70)创建的 ResearchItem:

属性 值 来源
页签 THAUMATURGY 配置 focusDisenchantingResearchCategory
位置 col -2, row -8 配置 focusDisenchantingResearchCol / ...Row
难度 2 配置 focusDisenchantingResearchDifficulty
要素 auram:4、praecantatio:6、vacuos:8、perditio:4 配置 ...Aspects
前置 FOCALMANIPULATION 配置 ...Parents
可购买 是 配置 ...Purchasable
研究页 2 页 DisenchantFocusUpgrade.java:51-53
标记 .setConcealed().setSecondary() DisenchantFocusUpgrade.java:54-55

研究页 0 使用 FormattedResearchPage 把返还比例格式化进文本 (new Object[] { percentXP },DisenchantFocusUpgrade.java:52), 因此修改配置里的返还比例会自动反映到研究页文本上。

若配置了 ...Warp > 0,还会调 ThaumcraftApi.addWarpToResearch(...) (DisenchantFocusUpgrade.java:59-61);若配置了 ...AutoUnlock, 则 setStub() 并把本条研究追加到每个父研究的 siblings (DisenchantFocusUpgrade.java:63-69)。

DisenchantFocusUpgrade.java:81 有一条带情绪的注释 // This is stupid, but the only other solution is ASM., 说明 createSpecific() 临时把 types[upgradeID] 置空再构造实例 这一手法是刻意为之的绕行方案(DisenchantFocusUpgrade.java:80-86)。 这是有明确意图证据的注释,不是缺陷。

交互

  1. 研究解锁后,在焦点操纵器中选择本升级类型
  2. 放入已附魔的焦点
  3. 扣除上表对应的湮灭要素与经验点
  4. 焦点附魔被清除,返还按比例折算的经验

无附魔的焦点不会进入本升级路径(lastUpgradeLevel 为 -1 时 tooltip 走 GENERIC_TOOLTIP_KEY 分支,DisenchantFocusUpgrade.java:133-136)。

合成配方

无。本升级类型不是物品,不参与合成。

相关条目