焦点除魔升级
基本信息
| 属性 | 值 |
|---|---|
| 源文件 | 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)。 这是有明确意图证据的注释,不是缺陷。
交互
- 研究解锁后,在焦点操纵器中选择本升级类型
- 放入已附魔的焦点
- 扣除上表对应的湮灭要素与经验点
- 焦点附魔被清除,返还按比例折算的经验
无附魔的焦点不会进入本升级路径(lastUpgradeLevel 为 -1 时 tooltip
走 GENERIC_TOOLTIP_KEY 分支,DisenchantFocusUpgrade.java:133-136)。
合成配方
无。本升级类型不是物品,不参与合成。
相关条目
- 自定义研究 — 同组的 3 条
CustomResearchSetting研究 - 功能增强组 —
enableFocusDisenchanting与返还比例 - 网络消息 —
MessageExtendedEnchantItem等附魔相关数据包 - Salis Arcana — 模组总览