护符与符文

基本信息

属性 值
护符种类 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

相关条目