JSON 地牢设置包
基本信息
| 属性 | 值 |
|---|---|
| 加载器 | greymerk.roguelike.dungeon.settings.SettingsResolver(dungeon/settings/SettingsResolver.java:42) |
| 设置目录 | config/roguelike_dungeons/settings(SettingsResolver.java:44) |
| 文件格式 | 每文件一个 JSON 对象,文件名即继承键 |
| 内置设置数 | 7(SettingsResolver.java:63-69) |
| 设置分区枚举 | SettingsType,8 个值(dungeon/settings/SettingsType.java:3-11) |
| 入口 | Dungeon.initResolver(),由 /roguelike settings reload 触发 |
功能
除 7 个内置设置外,玩家可以在 config/roguelike_dungeons/settings/ 放入任意数量的 JSON 文件来自定义地牢。加载分三步:
- 读取:
readDungeonJsonSettings逐文件new JsonParser().parse(...);单个文件出错只打印System.err并跳过(SettingsResolver.java:81-92) - 排序:按文件名的
Arrays.sort保证加载顺序稳定(:75) - 按依赖顺序加载:
loadDungeonsInDependencyOrder反复扫描,直到没有新设置成功为止(:121-131)。若某设置依赖始终无法满足,会打印 “Dungeon X not loaded because of unmet dependencies”(:161-166)
每个 JSON 里的 name 是地牢的显示名,其余键按 SettingsType 分区,未指定的分区会由 SettingsCustomBase 逐个补上默认值(SettingsResolver.java:181-209 与 :257-285,两段逻辑相同)。
设置分区表
SettingsType 的 8 个常量(dungeon/settings/SettingsType.java:3-11)与补默认值的实现类一一对应:
| 分区 | 补默认值用的类 | 来源 |
|---|---|---|
LOOT |
无(case LOOT: break; 空实现) |
SettingsResolver.java:185-186 |
LOOTRULES |
SettingsLootRules |
SettingsResolver.java:187-189 |
SECRETS |
SettingsSecrets |
SettingsResolver.java:190-192 |
ROOMS |
SettingsRooms |
SettingsResolver.java:193-195 |
THEMES |
SettingsTheme |
SettingsResolver.java:196-198 |
SEGMENTS |
SettingsSegments |
SettingsResolver.java:199-201 |
SIZE |
SettingsSize |
SettingsResolver.java:202-204 |
GENERATORS |
SettingsGenerator |
SettingsResolver.java:205-207 |
SettingsResolver 的 base 链(SettingsResolver.java:51-59)按同样顺序叠加 7 个类:空白 → 房间 → 密室 → 段 → 尺寸 → 主题 → 生成器 → 战利品规则。
7 个内置设置表
| 内置设置 | 类 | 行数 | 塔 | 备注 |
|---|---|---|---|---|
| 沙漠 | SettingsDesertTheme |
94 | PYRAMID |
SettingsDesertTheme.java:33 |
| 草原 | SettingsGrasslandTheme |
68 | ROGUE |
SettingsGrasslandTheme.java:27 |
| 丛林 | SettingsJungleTheme |
62 | JUNGLE |
SettingsJungleTheme.java:29 |
| 沼泽 | SettingsSwampTheme |
94 | WITCH |
SettingsSwampTheme.java:33 |
| 山地 | SettingsMountainTheme |
109 | ENIKO |
SettingsMountainTheme.java:29 |
| 森林 | SettingsForestTheme |
65 | HOUSE |
SettingsForestTheme.java:27 |
| 台地 | SettingsMesaTheme |
33 | ETHO |
SettingsMesaTheme.java:24 |
builtin/ 目录另有 SettingsCustomBase(自定义地牢的基类,SettingsResolver.java:181/:257 使用),它不在 7 个内置之列。
选取优先级
SettingsResolver.getSettings(:174-221)的判定顺序:
- 自定义包优先:若某个 JSON 设置在当前位置有效,直接用它,完全绕过内置设置
- 内置设置:
if (builtin != null && RogueConfig.getBoolean(RogueConfig.DONOVELTYSPAWN))——doNoveltySpawn为false时内置主题一个都不生效 - 回落到 base:仅当
this.base.isValid(editor, pos)为真时返回new DungeonSettings(this.base) - 否则返回
null
内置与自定义都用 WeightedRandomizer 按 criteria.weight 加权随机(getBuiltin :223-233、getCustom :235-246),即多个有效设置之间是权重竞争而非轮询。
数值
| 数值名 | 值 | 来源 |
|---|---|---|
| 内置设置数 | 7 | SettingsResolver.java:63-69 |
| 设置分区数 | 8 | dungeon/settings/SettingsType.java:3-11 |
| base 链叠加层数 | 8(SettingsBlank + 7 个 Settings*) |
SettingsResolver.java:51-58 |
builtin/ 目录下类数 |
15 | dungeon/settings/builtin/ |
builtin/ 中参与 base 链的类 |
7 | 同上基类链 |
builtin/ 中仅作自定义基类的类 |
1(SettingsCustomBase) |
SettingsResolver.java:181 |
缺省 SpawnCriteria 权重 |
1 | SpawnCriteria.java:26 |
交互
| 操作 | 效果 |
|---|---|
/roguelike settings list |
打印已加载的自定义设置名(util/CommandSpawnDungeon.java:88-92) |
/roguelike settings reload |
Dungeon.initResolver() 重建整个 SettingsResolver,重读 settings/ 目录(util/CommandSpawnDungeon.java:82-87) |
/roguelike dungeon {X Z} <name> |
强制用名为 <name> 的自定义设置生成;找不到则回报 “Failed: <name> not found.”(util/CommandSpawnDungeon.java:240-249) |
放入新的 .json 文件 |
需 /roguelike settings reload 才会被读取 |
JSON 可覆盖的字段
DungeonSettings / LevelSettings / TowerSettings / SpawnCriteria 的 JSON 键(各自构造器内读取):
| 类 | 读取的 JSON 键 | 来源 |
|---|---|---|
SpawnCriteria |
weight、biomes、biomeTypes、dimensionBL、dimensionWL |
dungeon/settings/SpawnCriteria.java:30,32,41,50,59 |
LevelSettings |
numRooms、range、scatter、theme |
dungeon/settings/LevelSettings.java:87,88,90,94 |
TowerSettings |
theme |
dungeon/settings/TowerSettings.java:25 |
BlockSet |
walls、floor(可省)、stair、pillar |
theme/BlockSet.java:31,33,39,43 |
⚠️ SpawnCriteria 的 dimensionBL 键虽然能被 JSON 正确读入(SpawnCriteria.java:50-57),但后续从未被使用 —— 原因见 生成条件。