战利品表(Loot)

基本信息

属性 值
枚举 greymerk.roguelike.treasure.loot.Loot(treasure/loot/Loot.java:25)
常量数 16
工厂方法 Loot.getLoot()(treasure/loot/Loot.java:44)
容器 LootProvider(HashMap<Loot, IWeighted<ItemStack>>)
分层构造 LootSettings(int level),level 0–4,与 Dungeon.getLevel(y) 对应
挂载点 战利品写入 TreasureManager,最终落入地牢内的箱子

Loot.getLoot() 建 5 层(level 0 到 4),每层一个 LootSettings(treasure/loot/Loot.java:46-49):

LootProvider loot = new LootProvider();
for (int i = 0; i < 5; ++i) {
    loot.put(i, new LootSettings(i));
}

真实调用点 2 处:dungeon/Dungeon.java:74(每座地牢生成后)与 dungeon/settings/builtin/SettingsLootRules.java:17(战利品规则设置)。

分类表

LootSettings 的默认构造把 15 个分类绑定到各自的 provider(treasure/loot/LootSettings.java:36-51):

分类常量 默认 provider 行数 说明
WEAPON ItemWeapon — 剑 / 弓,按 level 定品质
ARMOUR ItemArmour — 护甲
BLOCK ItemBlock — 方块
JUNK ItemJunk — 垃圾
ORE ItemOre — 矿物
TOOL ItemTool — 工具
POTION ItemPotion — 药水(走自建 ID 表,见下)
FOOD ItemFood — 食物
ENCHANTBOOK ItemEnchBook — 附魔书
ENCHANTBONUS ItemEnchBonus — 附魔加成
SUPPLY ItemSupply — 补给
MUSIC ItemRecord — 唱片
SMITHY ItemSmithy — 铁砧 / 锻造件
SPECIAL ItemSpecialty — 特殊装备
REWARD WeightedRandomLoot(Items.stick, 0, 1) — 固定为木棍
STARTER 不绑定 — 16 个分类中唯一没有默认 provider 的,仅用于地牢起始书

LootSettings 另外提供 getRandomLoot / put 等方法,允许 JSON 设置包按 Loot 分类覆盖 provider(treasure/loot/LootSettings.java:55-129)。

REWARD 与 STARTER 的差异

两者都不是「好 loot」,但用法不同:

  • REWARD 绑死了 WeightedRandomLoot(Items.stick, 0, 1),即一根木棍(LootSettings.java:51)
  • STARTER 不在默认表里;地牢生成完毕后单独塞入一本统计书:
Book book = new Book("Greymerk", "Statistics");
...
treasure.addItemToAll(rand, Treasure.STARTER, new WeightedChoice<ItemStack>(book.get(), 1), 1);

(dungeon/Dungeon.java:77-109)

数值

数值名 值 来源
分类常量数 16 treasure/loot/Loot.java:26-41
默认 provider 绑定数 15(STARTER 除外) treasure/loot/LootSettings.java:37-51
难度层数 5(level 0–4) treasure/loot/Loot.java:47
provider 实现类数 16(treasure/loot/provider/) 目录内 .java 计数
战利品掉落率 looting 配置,默认 0.085 config/RogueConfig.java:97;应用于 treasure/loot/Loot.java:184
起始书注入权重 1 dungeon/Dungeon.java:109

起始书的第二页固定写入版本与署名(dungeon/Dungeon.java:101-108):

Roguelike Dungeons v<Roguelike.version>
April 16th 2016

Credits
Author: Greymerk
Bits: Drainedsoul
Ideas: Eniko @enichan

第一页是「Architect’s Resource Notes」,统计本次生成用掉的 stonebrick / cobblestone / log / iron_bars / chest / mob_spawner / tnt 数量(dungeon/Dungeon.java:77-100)。

交互

触发 行为
地牢生成完毕 Loot.getLoot() 建 5 层池,settings.getLootRules().process(rand, loot, treasure) 填充战利品(dungeon/Dungeon.java:74-75)
玩家开箱 按分类权重从对应 level 层抽取
looting 配置 设定掉落实体的装备掉落概率(treasure/loot/Loot.java:182-185)

POTION 分类的 ID 问题

POTION 分类的 provider 是 ItemPotion,它只调 Potion.getRandom(rand)(treasure/loot/provider/ItemPotion.java:23),最终落到本 mod 自建的药水 ID 表。该表与本 mod 自己的正确表相互矛盾,详见 药水与药剂。

相关条目