主题(Theme)
基本信息
| 属性 | 值 |
|---|---|
| 枚举 | greymerk.roguelike.theme.Theme(theme/Theme.java:5) |
| 常量数 | 34 |
| 工厂方法 | Theme.getTheme(Theme)(theme/Theme.java:42),switch 覆盖全部 34 个常量 |
| 实现类数 | 34 个 ThemeXxx extends ThemeBase(theme/ThemeBase.java:6)+ 1 个 ThemeBase 包装类 |
| 接口 | ITheme(theme/ITheme.java:6),暴露 primary/secondary 各 2 组 floor/wall/stair/pillar |
| 容器 | BlockSet(theme/BlockSet.java:11),字段 floor / walls / stair / pillar(:13-16) |
| JSON 构造 | Theme.create(JsonObject)(theme/Theme.java:156),读 primary / secondary / base 三个键 |
| 随机可达性 | 全部 34 个主题都可达:CityGrounds.java:69 用 Theme.values()[rand.nextInt(...)] 随机取 |
功能
主题(Theme)决定一座地牢的全部材质外观:地板、墙、楼梯、柱子各有 primary 与 secondary 两套。每个主题是 ThemeBase 的子类,在构造器里装配两个 BlockSet。
BlockSet 有两个构造器(theme/BlockSet.java:18、:25);三参重载把 walls 同时用作 floor 与 walls:
public BlockSet(IBlockFactory walls, IStair stair, IBlockFactory pillar) {
this(walls, walls, stair, pillar);
}
Theme.getTheme 的 switch 对每个常量 return new ThemeXxx(),末尾 default: return null(theme/Theme.java:149-150)——但因为 34 个常量全部有 case,default 实际不可达。
主题可被 7 个内置地牢设置直接指定(如 SettingsMountainTheme.java:29 的 Theme.getTheme(Theme.OAK)),也可由 JSON 设置包用 base 键 + primary/secondary 覆盖块集来派生(theme/Theme.java:174-180)。
主题表
下表 34 行的实现类、this.primary = new BlockSet(...) 行号与主墙材质均可用下述命令一次性复现(逐文件、单文件行号,非拼接输出):
cd src/main/java/greymerk/roguelike/theme
for f in Theme*.java; do grep -n 'this.primary = new BlockSet' "$f"; done
| 常量 | 实现类 | primary 组装于 | 楼梯类型 | 主要墙体材质(权重) |
|---|---|---|---|---|
OAK |
ThemeOak |
ThemeOak.java:24 |
STONEBRICK |
STONE_BRICK:30、STONE_BRICK_CRACKED:20、COBBLESTONE:5、GRAVEL:1 |
SPRUCE |
ThemeSpruce |
ThemeSpruce.java:26 |
STONEBRICK |
STONE_BRICK:20、STONE_BRICK_CRACKED:10、COBBLESTONE:5、GRAVEL:1 |
CRYPT |
ThemeCrypt |
ThemeCrypt.java:31 |
STONEBRICK |
BlockJumble(砖石/裂纹/苔石):100、COBBLESTONE:10、GRAVEL:5 |
MOSSY |
ThemeMossy |
ThemeMossy.java:42 |
COBBLE |
COBBLESTONE:60、STONE_BRICK_MOSSY:30、COBBLESTONE_MOSSY:10、GRAVEL:15、蠹鱼块乱序:5 |
MUDDY |
ThemeMuddy |
ThemeMuddy.java:36 |
COBBLE |
COBBLESTONE:50、COBBLESTONE_MOSSY:30、CLAY:30、DIRT:15、GRAVEL:15、STONE_BRICK_CRACKED:10 |
NETHER |
ThemeNether |
ThemeNether.java:32 |
NETHERBRICK |
NETHERBRICK:200、REDSTONE_BLOCK:50、NETHERRACK:20、ORE_QUARTZ:20、SOUL_SAND:15、COAL_BLOCK:5 |
SANDSTONE |
ThemeSandstone |
ThemeSandstone.java:21 |
SANDSTONE |
SANDSTONE:100、SAND:5 |
QUARTZ |
ThemeQuartz |
ThemeQuartz.java:18 |
QUARTZ |
QUARTZ |
BLING |
ThemeBling |
ThemeBling.java:21 |
QUARTZ |
DIAMOND_BLOCK:20、IRON_BLOCK:10、EMERALD_BLOCK:10、GOLD_BLOCK:3 |
CHECKER |
ThemeChecker |
ThemeChecker.java:21 |
QUARTZ |
BlockCheckers(OBSIDIAN,QUARTZ) 棋盘格 |
RAINBOW |
ThemeRainbow |
ThemeRainbow.java:26 |
ACACIA |
BlockStripes:遍历 DyeColor.values() 的彩色粘土条纹 |
SNOW |
ThemeSnow |
ThemeSnow.java:26 |
STONEBRICK |
STONE_BRICK:10、STONE_BRICK_CRACKED:1、STONE_BRICK_MOSSY:1 |
JUNGLE |
ThemeJungle |
ThemeJungle.java:42 |
COBBLE |
COBBLESTONE_MOSSY:50、STONE_BRICK_MOSSY:30、STONE_BRICK_CRACKED:20、STONE_BRICK_CHISELED:15 |
BRICK |
ThemeBrick |
ThemeBrick.java:20 |
BRICK |
BRICK |
DARKOAK |
ThemeDarkOak |
ThemeDarkOak.java:18 |
DARKOAK |
深色橡木木板,柱子为深色橡木原木 |
ICE |
ThemeIce |
ThemeIce.java:16 |
QUARTZ |
SNOW,柱子 ICE_PACKED |
ENIKO |
ThemeEniko |
ThemeEniko.java:29 |
STONEBRICK |
STONE_BRICK:100、STONE_BRICK_MOSSY:5、STONE_BRICK_CRACKED:1 |
ENIKO2 |
ThemeEniko2 |
ThemeEniko2.java:31 |
STONEBRICK |
STONE_BRICK:20、STONE_BRICK_CRACKED:10、STONE_BRICK_MOSSY:5、COBBLESTONE:3、GRAVEL:1 |
ENIQUARTZ |
ThemeEniQuartz |
ThemeEniQuartz.java:31 |
BRICK |
墙 BRICK;地板 BlockStripes(红粘土:100+WATER_FLOWING:5+REDSTONE_BLOCK:1, OBSIDIAN) |
ENIICE |
ThemeEniIce |
ThemeEniIce.java:39 |
QUARTZ |
地板 BlockStripes(紫粘土:100+WATER_FLOWING:5+LAPIS_BLOCK:1, OBSIDIAN:100+LAVA_FLOWING:5+REDSTONE_BLOCK:1) |
TOWER |
ThemeTower |
ThemeTower.java:28 |
STONEBRICK |
BlockJumble:30、COBBLESTONE:10、AIR:5、GRAVEL:5 |
ETHO |
ThemeEtho |
ThemeEtho.java:21 |
OAK |
地板 GRASS,墙橡木木板 |
CAVE |
ThemeCave |
ThemeCave.java:34 |
COBBLE |
STONE_SMOOTH:1000、DIRT:100、GRAVEL:50、COBBLESTONE:20、ORE_COAL:10、ORE_IRON:5 |
SEWER |
ThemeSewer |
ThemeSewer.java:25 |
STONEBRICK |
STONE_BRICK:10、STONE_BRICK_MOSSY:4、STONE_BRICK_CRACKED:1 |
ENDER |
ThemeEnder |
ThemeEnder.java:22 |
SANDSTONE |
地板 BlockStripes(OBSIDIAN,END_STONE),墙 SANDSTONE,柱 OBSIDIAN |
MINESHAFT |
ThemeMineShaft |
ThemeMineShaft.java:29 |
COBBLE |
STONE_SMOOTH:50、COBBLESTONE:15、ORE_REDSTONE:1 |
ETHOTOWER |
ThemeEthoTower |
ThemeEthoTower.java:18 |
SANDSTONE |
primary 全为青色粘土,secondary 为 SANDSTONE_SMOOTH |
PYRAMID |
ThemePyramid |
ThemePyramid.java:22 |
SANDSTONE |
SANDSTONE_SMOOTH:100、SANDSTONE:10、SANDSTONE_CHISELED:5 |
DARKHALL |
ThemeDarkHall |
ThemeDarkHall.java:30 |
STONEBRICK |
COBBLESTONE:30、STONE_BRICK:20、COBBLESTONE_MOSSY:10、GRAVEL:5 |
TEMPLE |
ThemeTemple |
ThemeTemple.java:25 |
QUARTZ |
PRISMARINE_DARK:10、PRISMARINE:5、PRISMITE:5、SEA_LANTERN:3 |
SANDSTONERED |
ThemeSandstoneRed |
ThemeSandstoneRed.java:21 |
RED_SANDSTONE |
SANDSTONE_RED:100、SAND_RED:5 |
HOUSE |
ThemeHouse |
ThemeHouse.java:20 |
BRICK |
墙 BRICK,地板/柱 GRANITE_POLISHED |
GREY |
ThemeGrey |
ThemeGrey.java:17 |
STONEBRICK |
ANDESITE 与 ANDESITE_POLISHED 双色 |
PURPUR |
ThemePurpur |
ThemePurpur.java:17 |
PURPUR |
墙 PURPUR_BLOCK,柱 PURPUR_PILLAR,secondary 墙 ENDER_BRICK |
数值
| 数值名 | 值 | 来源 |
|---|---|---|
| 主题常量数 | 34 | theme/Theme.java:5-39 |
switch 分支数 |
34 | theme/Theme.java:43-154 |
new Theme*() 语句数 |
34 | 同上 |
| primary / secondary 块集组 | 2 | theme/ThemeBase.java:8-9 |
| 每块集暴露的材质位 | 4(floor/walls/stair/pillar) | theme/BlockSet.java:13-16 |
ITheme 抽象方法数 |
8 | theme/ITheme.java:8-22 |
| 权重最大值(单主题内) | CAVE 的 STONE_SMOOTH:1000 |
theme/ThemeCave.java |
交互
主题不面向玩家直接交互,只能通过以下途径生效:
| 途径 | 说明 |
|---|---|
| 内置地牢设置 | SettingsMountainTheme.java:29 等 7 个内置设置在构造器里 Theme.getTheme(...) |
| 塔基主题 | DungeonSettings.java:189 缺省为 Tower.ROGUE + Theme.TOWER |
| JSON 设置包 | Theme.create() 读 base / primary / secondary(theme/Theme.java:163-180) |
/roguelike citadel |
Citadel.java:21 用 Theme.OAK;CityGrounds.java:65-69 随机取任意塔与任意主题 |
相关条目
- 地牢房间(Room) - 房间按
getSize()占用 4×4 至 12×12 的格位 - 房间段(Segment) - 段是房间与房间之间的连接件,同样读取主题材质
- 塔(Tower) - 每座地牢顶部必建一座塔,塔自带主题
- 内置地牢设置 - 主题的选取由地牢设置决定
- 战利品表 - 主题不影响战利品