护符与符文
基本信息
| 属性 | 值 |
|---|---|
| 护符种类 | 21 种(CharmType 枚举常量) |
| 符文种类 | 6 种(RuneType 枚举常量) |
| 护符物品 | charm(ItemCharm),栈上限 1 |
| 护符袋 | charm_pouch(ItemCharmPouch),栈上限 1 |
| 数据源 | mechanics/charms/CharmType.java:12-21x、mechanics/charms/RuneType.java:5-10 |
功能
护符系统是本模组的装备强化线:符文(Rune) 是基础材料,护符(Charm) 是由符文组合而成的效果载体。护符装在护符袋里,护符袋可通过 Baubles 槽位佩戴(见 工具与功能物品)。
每个 CharmType 常量由 4 个构造参数定义(mechanics/charms/CharmType.java:281-286):
CharmType(int backIcon, int foregroundIcon, CharmRecipe[] recipes, String[] tooltipArgs)
两个前导参数都是图标索引(0–16),都不是符文类型 —— 源码中不存在把它们映射到 RuneType 的逻辑。CharmType 的全部实例字段只有 4 个:recipes、backIcon、foregroundIcon、tooltipArgs(CharmType.java:276-279),没有任何字段引用 RuneType。
数值
RuneType(6 种,mechanics/charms/RuneType.java:5-10)
| 常量 | 序号 | lang key |
|---|---|---|
POWER |
0 | power |
AGILITY |
1 | agility |
VIGOR |
2 | vigor |
DEFENSE |
3 | defense |
MAGIC |
4 | magic |
VOID |
5 | void |
CharmType(21 种)
| 常量 | backIcon | foregroundIcon | 配方数 | 可堆叠 |
|---|---|---|---|---|
BASIC_POWER |
15 | 0 | 3 | 是 |
BASIC_AGILITY |
2 | 1 | 3 | 是 |
BASIC_VIGOR |
4 | 2 | 3 | 是 |
BASIC_DEFENSE |
8 | 3 | 3 | 是 |
BASIC_MAGIC |
11 | 7 | 3 | 是 |
EQUALITY |
16 | 9 | 1 | 是 |
BLOCKING |
0 | 10 | 3 | 是 |
BLOCKING_REFLECTION |
1 | 10 | 3 | 是 |
BLOCKING_REPULSION |
2 | 10 | 3 | 是 |
DIGESTIVE_RECOVER |
3 | 5 | 3 | 是 |
LIFE_STEAL |
5 | 11 | 2 | 否 |
DAMAGE_REDIRECTION |
14 | 3 | 6 | 是 |
MAGIC_PENETRATION |
13 | 4 | 7 | 是 |
WITCHERY_HARM |
12 | 4 | 3 | 是 |
MAGIC_DEFENSE |
10 | 3 | 3 | 是 |
FALLING_PROTECTION |
10 | 6 | 2 | 是 |
HASTE |
1 | 8 | 3 | 是 |
CRITICAL_STRIKE |
14 | 12 | 6 | 是 |
SECOND_DURABILITY |
12 | 8 | 5 | 是 |
SLAUGHTER_IMPACT |
15 | 12 | 6 | 是 |
LAST_RESORT |
9 | 7 | 3 | 否 |
各常量所在行号(mechanics/charms/CharmType.java):14 / 20 / 26 / 32 / 38 / 44 / 50 / 56 / 66 / 76 / 82 / 92 / 103 / 113 / 130 / 136 / 141 / 147 / 156 / 175 / 185。
只有 LIFE_STEAL 与 LAST_RESORT 不可堆叠,判定逻辑为 return this != LIFE_STEAL && this != LAST_RESORT;(CharmType.java:288-290),GUI 在 !type.canBeStacked() 时追加 item.charm.cannotstack 提示(CharmType.java:265-266)。
护符合成匹配
findRecipe(RuneType[] runes) 要求符文数量在 3–5 之间,否则直接返回 null(CharmType.java:208-209);随后对每个 CharmType 的每个 CharmRecipe 调 checkRunes(CharmType.java:208-218)。checkRunes 先比对数量 runes.length != runeAmount(mechanics/charms/CharmRecipe.java:44),再按 TObjectByteIterator 逐个扣除所需符文并要求剩余列表为空(CharmRecipe.java:49-57)。
护符物品的伤害值就是 CharmRecipe.id:getFromDamage(int damage) 遍历所有配方匹配 recipe.id(CharmType.java:198-206),item/ItemCharm.java:30 用 CharmType.getFromDamage(is.getItemDamage()).getLeft() 取回类型。
Tooltip 格式串
tooltipArgs 的每一项形如 "<格式>,<属性键>",由 getTooltip 的 switch 解析(CharmType.java:220-263):
| 格式关键字 | 输出 | 位置 |
|---|---|---|
float |
DragonUtil.formatTwoPlaces 两位小数 |
CharmType.java:235-237 |
floatnf |
String.valueOf 原始浮点 |
238-240 |
flopb |
<1 用 formatOnePlace,否则取整 |
241-245 |
perc |
round(100 × v)% |
246-248 |
perc1- |
round(100 × (1 − v))% |
249-251 |
perc-1 |
round(100 × (v − 1))% |
252-254 |
int |
round(v) |
255-257 |
BASIC_POWER / BASIC_AGILITY / BASIC_MAGIC 用 perc-1(显示增益百分比),BASIC_VIGOR / BASIC_DEFENSE 用 perc(显示削减百分比)。
5 个基础护符的属性阶梯
| 护符 | 属性键 | 3 档数值 | 位置 |
|---|---|---|---|
BASIC_POWER |
dmg |
1.25 / 1.45 / 1.60 | CharmType.java:15-17 |
BASIC_AGILITY |
spd |
1.15 / 1.28 / 1.40 | CharmType.java:21-23 |
BASIC_VIGOR |
regenspd |
0.20 / 0.40 / 0.55 | CharmType.java:27-29 |
BASIC_DEFENSE |
reducedmg |
0.10 / 0.20 / 0.30 | CharmType.java:33-35 |
BASIC_MAGIC |
exp |
1.10 / 1.20 / 1.30 | CharmType.java:39-41 |
每档消耗对应符文 3 / 4 / 5 个(CharmType.java:15、21、27、33、39)。EQUALITY 同时提供 5 条属性,是唯一单配方覆盖全部 5 属性的护符(CharmType.java:45-48):dmg 1.08、spd 1.05、regenspd 0.06、reducedmg 0.03、exp 1.03。
交互
| 触发 | 行为 |
|---|---|
| 护符袋右键 | 打开 GuiCharmPouch(gui/GuiCharmPouch.java:16) |
| 护符合成 | 消耗符文,生成带 CharmType 伤害值的 charm 物品 |
| 护符佩戴 | 通过 Baubles IBauble 接口(item/ItemCharmPouch.java:36-37);baublesExpandedLoaded 标志在 system/integration/ModIntegrationManager.java:24 赋值 |
| 事件 | CharmEvents(服务端)/ CharmEventsClient(客户端),注册于 HardcoreEnderExpansion.java:140 |
| 数据 | CharmPouchInfo(mechanics/charms/CharmPouchInfo.java)保存护符袋内容 |
| 知识书 | 护符有专门的 KnowledgeFragmentCharm 碎片(mechanics/compendium/content/fragments/KnowledgeFragmentCharm.java) |
rune 栈上限 16(init/ItemList.java:186),是护符袋合成与 charm_pouch 配方("PLP"/"LRL"/"PLP",R 为任意 meta rune,mechanics/RecipeList.java:188-198)的共用材料。
合成配方
charm 本身没有 GameRegistry 合成配方 —— 护符由护符袋 GUI 内的符文合成逻辑(mechanics/charms/CharmRecipe.java + CharmPouchHandlerClient)产出。可用的 GameRegistry 配方只有:
| 产物 | 配方 | 位置 |
|---|---|---|
charm_pouch |
"PLP" / "LRL" / "PLP",R 为 rune WILDCARD |
mechanics/RecipeList.java:188-198 |