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 文件来自定义地牢。加载分三步:

  1. 读取:readDungeonJsonSettings 逐文件 new JsonParser().parse(...);单个文件出错只打印 System.err 并跳过(SettingsResolver.java:81-92)
  2. 排序:按文件名的 Arrays.sort 保证加载顺序稳定(:75)
  3. 按依赖顺序加载: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)的判定顺序:

  1. 自定义包优先:若某个 JSON 设置在当前位置有效,直接用它,完全绕过内置设置
  2. 内置设置:if (builtin != null && RogueConfig.getBoolean(RogueConfig.DONOVELTYSPAWN)) —— doNoveltySpawn 为 false 时内置主题一个都不生效
  3. 回落到 base:仅当 this.base.isValid(editor, pos) 为真时返回 new DungeonSettings(this.base)
  4. 否则返回 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),但后续从未被使用 —— 原因见 生成条件。

相关条目

  • 配置项 - config/roguelike_dungeons/roguelike.cfg,与 settings/ 同目录
  • 生成条件 - biomes / biomeTypes / dimension* 的判定逻辑
  • 主题 - SettingsTheme 与 Theme.create 的联动
  • 塔 - towerSettings 决定塔型