战利品表(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 自己的正确表相互矛盾,详见 药水与药剂。