package com.tiedup.remake.worldgen;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.block.state.BlockState;
import org.jetbrains.annotations.Nullable;
/**
* Immutable data-driven room theme definition, replacing the old {@link RoomTheme} enum.
*
*
Loaded from {@code data//tiedup_room_themes/*.json} and stored
* in {@link RoomThemeRegistry}. Convenience methods mirror the old
* abstract API so that {@code HangingCagePiece} can swap with minimal changes.
*
* @param id unique identifier (e.g. "tiedup:oubliette")
* @param weight random selection weight (higher = more likely)
* @param wallPalette palette for wall blocks (supports "default" and "bottom_row")
* @param floorPalette palette for floor blocks (supports "default", "edge", "corner")
* @param ceilingPalette palette for ceiling blocks
* @param wallShellBlock single block used for the outer wall shell
* @param wallAccentBlock single accent block (e.g. for frames, trims)
* @param pillarPalette palette for pillars (supports "default" and "cap")
* @param scatterPalette optional palette for scatter decorations (cobwebs, etc.)
* @param decorations decoration configuration (corners, midpoints, furniture, etc.)
*/
public record RoomThemeDefinition(
ResourceLocation id,
int weight,
BlockPalette wallPalette,
BlockPalette floorPalette,
BlockPalette ceilingPalette,
BlockState wallShellBlock,
BlockState wallAccentBlock,
BlockPalette pillarPalette,
@Nullable BlockPalette scatterPalette,
DecorationConfig decorations
) {
/**
* Pick a wall block. Uses "bottom_row" condition for ry==1, "default" otherwise.
*/
public BlockState wallBlock(RandomSource random, int ry) {
return wallPalette.pick(random, ry == 1 ? "bottom_row" : "default");
}
/**
* Pick a floor block. Uses "corner" for corner positions, "edge" for edges,
* "default" for interior positions.
*/
public BlockState floorBlock(RandomSource random, int rx, int rz, boolean isEdge) {
boolean isCorner = (rx == 1 || rx == 11) && (rz == 1 || rz == 11);
return floorPalette.pick(
random, isCorner ? "corner" : isEdge ? "edge" : "default"
);
}
/**
* Pick a ceiling block (always "default" condition).
*/
public BlockState ceilingBlock(RandomSource random) {
return ceilingPalette.pick(random, "default");
}
/**
* Pick a pillar block. Uses "cap" for top/bottom rows, "default" for the shaft.
*/
public BlockState pillarBlock(RandomSource random, int ry) {
return pillarPalette.pick(random, (ry == 1 || ry == 10) ? "cap" : "default");
}
/**
* Pick a scatter block, or null if no scatter palette is defined.
*/
@Nullable
public BlockState scatterBlock(RandomSource random) {
return scatterPalette != null ? scatterPalette.pick(random, "default") : null;
}
}