Files
Papay-Shooter/scenes/maps/sakura_palette.gd
T
2026-08-02 02:20:02 -04:00

229 lines
11 KiB
GDScript

extends Object
class_name SakuraPalette
## The palette, ported from the Sakura Crossing reference (MIT).
##
## Kept as hex strings rather than float triples so every value can be checked
## against the source line by line. `Color(hex)` parses sRGB, which is what the
## reference authors in and what a `source_color` shader uniform expects.
##
## ── The discipline, which matters more than any individual value ─────────────
##
## The palette is deliberately NARROW, and it is narrow in a specific way:
##
## * The masses are pale. Walls, paving, plaster, concrete and sky are all
## high-value and low-saturation. A cel image is read from its dark end, so
## the large areas have to stay out of the way or there is nothing left for
## the ink line and the shadow bands to be read against.
## * The greens lean TEAL, never yellow. A yellow-green mass at this scale
## goes sour and fights the pink.
## * There are exactly four saturated accents — red, yellow, blue, teal — and
## they are reserved for FOCAL objects: the crossing gear, the vending
## machines, a shop awning, the torii. If a saturated colour is spread over
## a large area it becomes the loudest thing in the frame and the eye stops
## going where the level designer wants it to.
## * Shadow is a HUE, not a value. Nothing here has a "dark version"; the cel
## shader swings every shadow band toward a cool violet instead. That is why
## there are so few dark entries in this table — the darks are made by the
## light, not by the paint.
##
## Deviating from those four rules is what makes a cel scene look like a
## low-poly 3D scene with a filter on it.
# ── Sky & atmosphere ─────────────────────────────────────────────────────────
const SKY_TOP := Color("8fbdea")
const SKY_MID := Color("d4e8fa")
const SKY_HAZE := Color("fbe7e9")
const CLOUD := Color("fdfaf8")
const CLOUD_SHADE := Color("e6e6f2")
const FOG := Color("e6ecf7")
const HILL := Color("c6cfe6")
const HILL_FAR := Color("d8dded")
# ── Light ────────────────────────────────────────────────────────────────────
const SUN := Color("fff1d8")
const FILL := Color("a9bdf5")
const HEMI_SKY := Color("dcecff")
const HEMI_GROUND := Color("b6a6c6")
# ── Ink ──────────────────────────────────────────────────────────────────────
const INK := Color("39324f")
const INK_SOFT := Color("4a4468")
# ── Ground ───────────────────────────────────────────────────────────────────
const ROAD := Color("8e8a9c")
const ROAD_WORN := Color("9a95a6")
const ROAD_DARK := Color("7b7689")
const LINE_WHITE := Color("f4f2f6")
const LINE_YELLOW := Color("f0c341")
const TACTILE := Color("f2c53d")
const SIDEWALK := Color("dcd8e2")
const SIDEWALK_ALT := Color("e7e2e6")
const CURB := Color("c7c2d0")
const CONCRETE := Color("d9d5dd")
const CONCRETE_MID := Color("c2bdc8")
const CONCRETE_DARK := Color("a7a2b0")
const GUTTER := Color("bdb8c4")
const DRAIN := Color("6d687a")
const DIRT := Color("c9bfae")
const GRAVEL := Color("a9a3ab")
const BALLAST := Color("7d7686")
# ── Buildings ────────────────────────────────────────────────────────────────
const WALL_WHITE := Color("faf6ef")
const WALL_CREAM := Color("f2e7d3")
const WALL_BLUE := Color("d6e3ee")
const WALL_BEIGE := Color("e7dbc4")
const WALL_GRAY := Color("dedee6")
const WALL_PINK := Color("f0dcda")
const WALL_TEA := Color("dccdb6")
const WALL_SAGE := Color("dde2d6")
const ROOF_SLATE := Color("59617a")
const ROOF_BLUE := Color("4d5c78")
const ROOF_BROWN := Color("6b585c")
const ROOF_TEAL := Color("4f6b70")
const TRIM := Color("8b8496")
const GLASS := Color("9dc0d4")
const GLASS_DARK := Color("53627a")
const SHUTTER := Color("6e6a7a")
const SHUTTER_LIGHT := Color("847f92")
## The wall tones, as a list, for generators that want variety by index.
const WALLS: Array[Color] = [
WALL_WHITE, WALL_CREAM, WALL_BLUE, WALL_BEIGE,
WALL_GRAY, WALL_PINK, WALL_TEA, WALL_SAGE,
]
const ROOFS: Array[Color] = [ROOF_SLATE, ROOF_BLUE, ROOF_BROWN, ROOF_TEAL]
# ── Accents ──────────────────────────────────────────────────────────────────
# The four saturated colours, plus their deep variants. Focal objects only.
const RED := Color("e0453f")
const RED_DEEP := Color("b5322f")
const RED_SOFT := Color("ef6a60")
const YELLOW := Color("f4c033")
const YELLOW_DEEP := Color("d39c1f")
const BLACK := Color("322e3b")
const BLACK_SOFT := Color("453f4f")
const TEAL := Color("2f9c9a")
const TEAL_DEEP := Color("22736f")
const BLUE := Color("3d6ec4")
const BLUE_DEEP := Color("2a4f97")
const ORANGE := Color("ef8a3c")
const PURPLE := Color("8f6fb5")
# ── Vegetation ───────────────────────────────────────────────────────────────
const LEAF := Color("5aa578")
const LEAF_DEEP := Color("3f7f60")
const LEAF_PALE := Color("84bd97")
const GRASS := Color("86ab84")
const TRUNK := Color("9a8082")
const TRUNK_DARK := Color("765f62")
const MOSS := Color("7d9c74")
const BAMBOO := Color("94b06b")
const CEDAR := Color("3f6b52")
# ── Cherry blossom ───────────────────────────────────────────────────────────
const BLOSSOM := Color("fbc6d8")
const BLOSSOM_LIGHT := Color("fff0f4")
const BLOSSOM_WARM := Color("fedde2")
const BLOSSOM_DEEP := Color("f0a3c0")
const PETAL := Color("fcd9e4")
const PETAL_DEEP := Color("f6bccf")
# ── Railway ──────────────────────────────────────────────────────────────────
const RAIL_METAL := Color("6b6472")
const RAIL_HEAD := Color("c2bcc4")
const SLEEPER := Color("6d6576")
const SLEEPER_LIGHT := Color("847b8c")
const GATE_YELLOW := Color("f4c033")
const GATE_BLACK := Color("322e3b")
const SIGNAL_RED := Color("f2453c")
const SIGNAL_OFF := Color("6a3b44")
const CABINET := Color("d8d5da")
const CABINET_TOP := Color("b6b2bc")
# ── Train ────────────────────────────────────────────────────────────────────
const TRAIN_BODY := Color("f7f2e6")
const TRAIN_BODY_SHADE := Color("e6dfd0")
const TRAIN_STRIPE := Color("2f7fd0")
const TRAIN_STRIPE2 := Color("3fae9a")
const TRAIN_WINDOW := Color("3a4258")
const TRAIN_SKIRT := Color("9aa0ad")
const TRAIN_ROOF := Color("bdb8bd")
const TRAIN_DOOR := Color("eae4d8")
# ── Metal & props ────────────────────────────────────────────────────────────
const METAL := Color("b8bcc6")
const METAL_DARK := Color("878b96")
const METAL_WARM := Color("c9c0b4")
const MIRROR_BACK := Color("e4a83c")
const MIRROR_FACE := Color("c8d8e4")
const VEND_WHITE := Color("f8f5f0")
const VEND_RED := Color("db4038")
const VEND_TEAL := Color("2e9a98")
const CRATE := Color("3f7fbf")
const CRATE_ALT := Color("e25a4a")
const BASKET := Color("db5a4a")
const BIN := Color("5d8fb8")
## Bright can/bottle colours for vending machine shelves.
const DRINKS: Array[Color] = [
Color("e0453f"), Color("f4c033"), Color("3d6ec4"), Color("2f9c9a"),
Color("ef8a3c"), Color("8f6fb5"), Color("5aa578"), Color("f4f2f6"),
Color("e86f9c"), Color("44b4d8"), Color("c94f7a"), Color("9dbb3c"),
]
# ── Shopping street ──────────────────────────────────────────────────────────
const AWNING_GREEN := Color("4f8f6a")
const AWNING_ORANGE := Color("e08a3c")
const AWNING_BLUE := Color("4a7fae")
const AWNING_CREAM := Color("efe0c2")
const LANTERN := Color("f6e2c0")
const LANTERN_LIT := Color("ffd9a0")
const NOREN := Color("2f4a72")
const NOREN_RED := Color("b5322f")
const NOREN_CREAM := Color("f2e8d6")
const AWNINGS: Array[Color] = [
AWNING_GREEN, AWNING_ORANGE, AWNING_BLUE, AWNING_CREAM,
NOREN, NOREN_RED,
]
# ── Shrine ───────────────────────────────────────────────────────────────────
const TORII := Color("d8412f")
const TORII_DEEP := Color("a72f23")
const SHRINE_WOOD := Color("a9744f")
const SHRINE_WOOD_DARK := Color("8a604a")
const SHRINE_ROOF := Color("69707e")
const SHRINE_STONE := Color("cfcad2")
const ROPE := Color("f0e5ca")
const EMA := Color("e9d9b6")
# ── Stone & water ────────────────────────────────────────────────────────────
const STONE := Color("c6c0cb")
const STONE_DARK := Color("a39daf")
const STONE_WARM := Color("cfc6bc")
const WATER := Color("93b8ce")
const WATER_DEEP := Color("6d90ad")
const WATER_SKY := Color("cadff0")
const WATER_PETAL := Color("f3cada")
## ── Shadow tints ─────────────────────────────────────────────────────────────
##
## The cool violet each material's shadow bands swing toward. The reference's
## default is 0x6c5f8c and most things take it; the departures are all the same
## kind of decision, which is that a shadow keeps a memory of what the surface is
## MADE of:
##
## TINT_WARM timber, blossom, clay, lantern paper. Pushing these the full
## way to violet turns cedar grey and turns a cherry canopy into a
## storm cloud, which is the one thing it may never do.
## TINT_COOL metal, glass, water, rail. These genuinely are cooler in shade
## than anything else in the frame, and letting them go further
## than the default is most of what makes metal read as metal
## without a specular highlight.
const TINT := Color("6c5f8c")
const TINT_WARM := Color("8a7286")
const TINT_COOL := Color("5a5a8c")
const TINT_FOLIAGE := Color("6a7a8c")