Decorated interiors — pass 1 (#28, #29) - #38
Merged
Conversation
Design for the first pass of decorated interiors: a per-cell Cell record carrying decor + NE-corner colour end-to-end (server DeckGrid, wire, client), a 16-colour palette in colors.json applied as a greyscale-multiply tint, the simple aesthetic tiles (rug/seat/bed/window), and cargo pallets deriving breakbulk capacity. Neighbour-aware/rule-bearing tiles deferred to #36. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Landed early so hulls can be authored against it while the render pipeline is built. Centres r/e/d rug/seat/bed + p cargo_pallet (all walkable floor); edge w window; v viewscreen now covers any wall screen. colors.json holds the 16 Minecraft-dye palette (slot 0-f, greyscale-multiply tint). Additive and fallback-safe: unknown glyphs still parse as floor. Nothing renders these distinctly yet — that is the pass-1 pipeline work. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirrors deckplan.gleam's Cell(tile, edges, decor, color): ship_class_data.gd's Deck now stores an inner Cell per tile instead of parallel tiles/edges arrays, with decor (centre glyph, is-decor per the welcome-time GlyphRegistry) and NE-corner colour (hex 0-f -> 0-15) parsed alongside geometry. Adds GlyphRegistry.is_decor (needed here since decor resolution depends on it) and decor_at/color_at accessors on both Deck and ShipClassData. interior_parse_probe asserts geometry + decor + colour against a synthetic grid; it runs as a Node scene (interior_parse_probe.tscn) rather than via --script, because a --script main-loop override compiles its full dependency graph (including ship_class_data.gd's NetworkClient.glyphs reference) before autoload singletons are registered as global identifiers in this Godot version, which fails compilation. Running as a real scene goes through the normal boot order, matching how the client actually runs.
_draw_decor draws each floor tile's decor glyph tinted by its NE-corner palette colour, falling back to a centred tinted swatch when the sprite art doesn't exist yet (T7 of the decorated-interiors plan) - so authored decor + colour is visible ahead of the art. _draw_structure now resolves a sprite for FIXTURE edges (window/viewscreen) via the glyph registry and draws it on the wall strip, falling back to the plain wall plate when no sprite is mapped; collision is unchanged. Adds a headless render probe (interior_render_probe.gd/.tscn) exercising both draw paths against a small decorated deck.
…lyphs before parsing ship_class; + tests composite.cell() hardcoded decor:None, color:None instead of reading the whole Cell via deckplan.cell_at_xy, stripping decor/colour from every docked ship (and the concourse) in the stitched composite. network_client.gd parsed the welcome message's ship_class before glyphs/palette were set, so Deck.from_grid's decor lookup against NetworkClient.glyphs always missed for the aboard ship. Adds regression coverage for both: a composite test that a decor+colour tile survives mooring/rotation, and deckplan tests that a '#' or non-hex letter in the NE colour corner parses to None. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The new Mockingbird exercises the pass-1 pipeline end to end: 26 seats (e), 17 beds (d), windows (w), and 60 cargo pallets (p) whose count DERIVES the breakbulk capacity (60, overriding the authored 40). Applied the author's two fixes: the 25 spawn (s) tiles were meant as seats (-> e; a ship's spawn still derives from its west-facing mooring Q, so no s tile is needed), and the second helm (-> e) since multi-helm login-seating isn't supported yet (a repeated console kind namespaces to helm0/helm1, which breaks find_console "...:helm"). Updated the capacity test (40 -> 60) and the derived-capacity doc. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… ports The 4 Lower-deck Q tiles were the "front big door" but Q means a side-on mooring airlock (the Mockingbird moors on its west flank via the Mezzanine Q's). Replaced them with a 4-wide run of = door edges across the bow wall, opening onto plain hold floor behind — no phantom docking ports. Lower deck now has 0 Q; the 2 Mezzanine mooring ports are unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
From play-testing PR #38: one bed retuned to a seat, and the wide bow door made airlock-style — an outer door run (to void) and an inner door run (to the hold) with a floor chamber between, rather than a single opening. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This was referenced Jul 21, 2026
Closed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
First pass of decorated interiors: interiors can now carry per-tile decoration + colour end to end, and cargo pallets derive breakbulk capacity. Closes the pass-1 scope of #28 and #29; neighbour-aware / rule-bearing tiles are deferred to #36.
The glyph vocabulary (
r/e/d/p/w+colors.json) already landed onmainto unblock hull authoring; this PR is the pipeline + rendering that makes it live.What's here
Cell.DeckGridgoes from paralleltiles/edgeslists to a single grid ofCell(tile, edges, decor, color)(composite.gleamalready worked in cell units, so this simplified it). Walkability/collision logic is untouched — field access only — so client-side movement prediction stays bit-for-bit identical.0–f) in the tile's NE corner parse into the cell and re-emit throughdeck_to_rows. The client re-parses the same rows, so no new wire fields.server/colors.json(Minecraft dye order) is forwarded onwelcomelike the glyph registry; sprites are greyscale and multiply-tinted by the slot colour, so retuning a hex recolours every tile using that slot with zero re-authoring.pcargo-pallet tiles (map-is-truth, like consoles/berths); the authored number is the zero-pallet fallback.interior_view.gddraws decor tinted; a placeholder swatch shows authored decor+colour now, before any sprite art exists. Wall fixtures (wwindow,vscreen) draw their sprite with a plain-wall fallback.Verification
gleam formatclean.harness/test_m2_interior.pyhas 4 failures, but the identical 4 fail on the base commit (stale M2 harness vs the M3/M3.5 station-composite evolution) — this branch adds zero new failures.Notes for review
Qtiles on the Lower deck currently model the "big front door" as 4 docking ports. They validate and break nothing, butQsemantically means a side-on mooring airlock (the Mockingbird moors on its west flank via the MezzanineQs). I'd model a wide bow door as a run of=door edges across the bow wall of the hold instead — no extra mooring ports. Left as-is pending your call; happy to convert."capacity": 40, now overridden by the 60 pallets. Left your value untouched — draw fewer pallets if you want less capacity, or I can sync the number.tiles_edgesvar name, alet assertintile_block, a doubleglyphs.centerlookup,pallet_countfold shape, apalettedecode split,_fixture_texper-edge_deck().🤖 Generated with Claude Code