From c4f94fb543d5202a6031154a953371a9afbd170e Mon Sep 17 00:00:00 2001 From: megaproxy Date: Tue, 12 May 2026 15:23:28 +0100 Subject: [PATCH] =?UTF-8?q?Workbench=20sprites=20=E2=80=94=20swap=20proced?= =?UTF-8?q?ural=20draw=20for=20tileset=20art=20per=20variant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Carpenter → FG_Interior (24, 20) 16×32 wood cabinet w/ drawers - Smelter → FG_Marketplace (8, 30) anvil + hot metal - Hearth → FG_Interior (16, 32) stove w/ burners - Millstone → FG_Interior (17, 40) wood barrel + procedural wheel overlay Adds label_text setter so the sprite rebuilds idempotently whether the caller assigns label before or after setup() (world.gd assigns after, SaveSystem after). Setter also calls _maybe_build_light() to fix a pre-existing Phase 11 bug where Hearth never built its PointLight2D (label_text was still default when _ready fired). Unrecognised label_texts fall through to _draw_generic so ad-hoc workbench variants keep rendering. Co-Authored-By: Claude Opus 4.7 (1M context) --- art/tiles/FG_Marketplace.png | Bin 0 -> 65071 bytes art/tiles/FG_Marketplace.png.import | 40 +++++ scenes/entities/workbench.gd | 248 +++++++++++++++------------- 3 files changed, 170 insertions(+), 118 deletions(-) create mode 100644 art/tiles/FG_Marketplace.png create mode 100644 art/tiles/FG_Marketplace.png.import diff --git a/art/tiles/FG_Marketplace.png b/art/tiles/FG_Marketplace.png new file mode 100644 index 0000000000000000000000000000000000000000..6893f8b2c2ec767fde5112d4424b9a17f89dd1c1 GIT binary patch literal 65071 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 z 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 Q0Qh(Ru8u~zx<%;!0pMQc>i_@% literal 0 HcmV?d00001 diff --git a/art/tiles/FG_Marketplace.png.import b/art/tiles/FG_Marketplace.png.import new file mode 100644 index 0000000..8182d25 --- /dev/null +++ b/art/tiles/FG_Marketplace.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d24k3glxf7xt4" +path="res://.godot/imported/FG_Marketplace.png-44bb1301a91d0a5f6f9519ce316c9fed.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/tiles/FG_Marketplace.png" +dest_files=["res://.godot/imported/FG_Marketplace.png-44bb1301a91d0a5f6f9519ce316c9fed.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/scenes/entities/workbench.gd b/scenes/entities/workbench.gd index b294b34..76dc924 100644 --- a/scenes/entities/workbench.gd +++ b/scenes/entities/workbench.gd @@ -42,14 +42,64 @@ const HEARTH_LIGHT_RADIUS: int = 5 ## Pixel size of the procedural radial gradient used for PointLight2D. const LIGHT_TEXTURE_SIZE: int = 64 +# ── sprite atlas (replaces procedural _draw for the four named variants) ───── +## Variant → (texture, atlas top-left coord, height in tiles). Selected from +## the ElvGames House Interior + Marketplace tilesets in the 2026-05-12 visual +## pass; see /tmp/workbench_candidates_v2.png from that session for the diff. +## +## h_tiles = 2 sprites bottom-anchor and extend UP into the tile above (Bed +## pattern) so the carpenter's tall cabinet reads as a piece of furniture +## standing in the room rather than a flat decal. h_tiles = 1 sprites stay +## within the workbench tile (anvil, stove top, barrel — squat shapes). +## +## Unrecognised label_texts fall through to procedural _draw_generic, so +## ad-hoc workbench variants keep rendering until a sprite is picked for them. +const _INTERIOR_TEX: Texture2D = preload("res://art/tiles/FG_Interior.png") +const _MARKETPLACE_TEX: Texture2D = preload("res://art/tiles/FG_Marketplace.png") +const _VARIANT_SPRITES: Dictionary = { + "Carpenter": {"tex": _INTERIOR_TEX, "coord": Vector2i(24, 20), "h_tiles": 2}, + "Smelter": {"tex": _MARKETPLACE_TEX, "coord": Vector2i(8, 30), "h_tiles": 1}, + "Hearth": {"tex": _INTERIOR_TEX, "coord": Vector2i(16, 32), "h_tiles": 1}, + "Millstone": {"tex": _INTERIOR_TEX, "coord": Vector2i(17, 40), "h_tiles": 1}, +} + # ── exports ─────────────────────────────────────────────────────────────────── ## Tile position of this workbench in world-tile coordinates. @export var tile: Vector2i = Vector2i.ZERO -## Player-visible label. Also drives the _draw() variant. -## Recognised values: "Carpenter", "Smelter", "Hearth", "Millstone". Others render generic. -@export var label_text: String = "Workbench" +## Player-visible label. Also drives the sprite variant (see _VARIANT_SPRITES) +## and procedural _draw fallback for unrecognised values. +## Setter rebuilds the sprite child idempotently — callers can assign +## label_text either before OR after setup() and end up with the right sprite. +## (World.gd assigns it after setup(); SaveSystem._spawn_workbench too.) +@export var label_text: String = "Workbench": + set(value): + label_text = value + # Setter fires from .tscn property initialisation BEFORE _ready, so + # guard the rebuild until the node is actually in the tree (children + # can't be added safely before then). + if is_inside_tree(): + _build_sprite() + # Hearth-light catch-up: _ready() builds the PointLight2D only when + # label_text is already "Hearth", but the project's call pattern + # (add_child first, then set label_text) means _ready always saw the + # default "Workbench" and skipped the light. Build it lazily here + # so Hearth workbenches actually glow. Pre-existing bug since Phase 11. + _maybe_build_light() + + +## Build the PointLight2D for light-emitting workbenches if it doesn't exist +## yet. Idempotent — safe to call from both _ready() and the label_text setter. +## Enabled state is decided by is_on() (false until _complete fires). +func _maybe_build_light() -> void: + if _light != null: + return + if not label_text in LIGHT_EMITTING_LABELS: + return + _light = _build_point_light_2d() + add_child(_light) + _light.enabled = is_on() ## Which skill category this bench accepts. ## CraftingProvider filters by this before assigning a pawn. @@ -98,10 +148,12 @@ func _ready() -> void: # All workbenches register; non-emitters return false from is_on() so # World.is_tile_lit() skips them at zero cost. World.register_light_source(self) - if label_text in LIGHT_EMITTING_LABELS: - _light = _build_point_light_2d() - add_child(_light) - _light.enabled = false # dark until built + # Builds the PointLight2D for light-emitting workbenches. Usually a no-op + # here because the standard call pattern is add_child → setup → set label + # AFTER _ready, so label_text is still the default. The label_text setter + # calls _maybe_build_light() again when the real label lands — that's the + # one that actually wires the light. Idempotent. + _maybe_build_light() queue_redraw() @@ -111,15 +163,61 @@ func _exit_tree() -> void: ## One-shot initialiser. Call after add_child() so _ready() has fired. +## Builds the variant sprite using the current label_text — if the caller +## hasn't assigned label_text yet, the setter rebuilds the sprite on assignment. +## Idempotent (safe under save-load's instantiate → setup → from_dict → setup chain). func setup(p_tile: Vector2i) -> void: tile = p_tile position = Vector2( tile.x * TILE_SIZE_PX + TILE_SIZE_PX / 2.0, tile.y * TILE_SIZE_PX + TILE_SIZE_PX ) + # Y-sort so a 16×32 Carpenter sprite (which rises into the tile north of + # the bench) occludes pawns standing behind it. Matches Bed / Wall. + y_sort_enabled = true + _build_sprite() queue_redraw() +## Build the variant Sprite2D child (or no-op when label_text isn't in the +## sprite table — those fall through to procedural _draw rendering). +## Idempotent: frees any previous Sprite child first. Called from setup() AND +## from the label_text setter, so the sprite always matches the current variant. +func _build_sprite() -> void: + var prev := get_node_or_null("Sprite") + if prev != null: + prev.queue_free() + var data = _VARIANT_SPRITES.get(label_text) + if data == null: + # Generic / unknown variants keep procedural rendering. _draw_generic + # fires through the existing match in _draw(). + return + var sprite := Sprite2D.new() + sprite.name = "Sprite" + sprite.texture = data["tex"] + sprite.region_enabled = true + var coord: Vector2i = data["coord"] + var h_tiles: int = data["h_tiles"] + var pixels_h: int = TILE_SIZE_PX * h_tiles + sprite.region_rect = Rect2( + coord.x * TILE_SIZE_PX, + coord.y * TILE_SIZE_PX, + TILE_SIZE_PX, + pixels_h, + ) + sprite.centered = true + # Parent position.y is at the BOTTOM of the workbench tile (see setup()). + # Bottom-anchor the sprite by offsetting it up by half its height, so a + # 16×16 sprite spans local y −16..0 (within the bench tile) and a 16×32 + # sprite spans local y −32..0 (bench tile + the tile above it, like Bed + # but extending UPWARD — workbenches don't have a "foot tile"). + sprite.offset = Vector2(0.0, -float(pixels_h) / 2.0) + sprite.z_index = 0 + # Ghost state — translucent until built. Solidified in _complete(). + sprite.modulate.a = 1.0 if _completed else 0.4 + add_child(sprite) + + # ── BuildJob interface ──────────────────────────────────────────────────────── ## True while the workbench still needs construction work. @@ -267,120 +365,29 @@ func from_dict(d: Dictionary) -> void: # ── render ───────────────────────────────────────────────────────────────────── func _draw() -> void: - # 3/4-perspective bench rendering — fits within the tile (16×16 local box). - # Origin (0,0) = tile bottom-centre. Tile spans local Y: -16 to 0. - # Two-band look (matches Wall): lit top band + shaded front face. - # Ghost (not yet built) draws at 0.4 alpha. + # Sprite-backed variants (Carpenter / Smelter / Hearth) render entirely + # through their Sprite2D child — no procedural fallback needed. Millstone + # also has a sprite but keeps a small dark-grey wheel overlay so the + # wood barrel below reads as "grinding station" rather than a plain barrel. + # Unrecognised label_texts fall through to _draw_generic so ad-hoc + # benches still render until a sprite is picked for them. var alpha: float = 1.0 if _completed else 0.4 - - match label_text: - "Carpenter": - _draw_carpenter(alpha) - "Smelter": - _draw_smelter(alpha) - "Hearth": - _draw_hearth(alpha) - "Millstone": - _draw_millstone(alpha) - _: - _draw_generic(alpha) + if label_text == "Millstone": + _draw_millstone_overlay(alpha) + return + if _VARIANT_SPRITES.has(label_text): + return + _draw_generic(alpha) -func _draw_carpenter(alpha: float) -> void: - # Warm-brown wood bench. Top band lit, front face darker. - # Vise/saw detail: a small darker square at the top-right corner of the - # front face to suggest a mounted tool. - var top_face := Color(0.62, 0.45, 0.25, alpha) - var front_face := Color(0.52, 0.36, 0.18, alpha) - var plank := Color(0.34, 0.22, 0.10, alpha) - var vise := Color(0.28, 0.18, 0.08, alpha) - var outline := Color(0.20, 0.12, 0.04, 0.7 * alpha) - - # Top face — lit strip at upper-third of tile. - draw_rect(Rect2(Vector2(-8.0, -16.0), Vector2(16.0, 5.0)), top_face) - # Front face — lower body. - draw_rect(Rect2(Vector2(-8.0, -11.0), Vector2(16.0, 11.0)), front_face) - # Horizontal plank seam across the front face. - draw_line(Vector2(-8.0, -6.0), Vector2(8.0, -6.0), plank, 1.0) - # Vise detail: 4×4 px darker square at top-right of front face. - draw_rect(Rect2(Vector2(3.0, -11.0), Vector2(4.0, 4.0)), vise) - # Top/front edge horizon line. - draw_line(Vector2(-8.0, -11.0), Vector2(8.0, -11.0), plank, 1.0) - # Tile outline. - draw_rect(Rect2(Vector2(-8.0, -16.0), Vector2(16.0, 16.0)), outline, false, 1.0) - - -func _draw_smelter(alpha: float) -> void: - # Dark grey stone block. Top band slightly lighter. - # Ember glow: orange rect centred at the bottom of the front face. - var top_face := Color(0.42, 0.42, 0.40, alpha) - var front_face := Color(0.32, 0.32, 0.30, alpha) - var mortar := Color(0.20, 0.20, 0.18, alpha) - var ember := Color(0.95, 0.45, 0.10, alpha) - var outline := Color(0.14, 0.14, 0.12, 0.7 * alpha) - - # Top face. - draw_rect(Rect2(Vector2(-8.0, -16.0), Vector2(16.0, 5.0)), top_face) - # Front face. - draw_rect(Rect2(Vector2(-8.0, -11.0), Vector2(16.0, 11.0)), front_face) - # Mortar line. - draw_line(Vector2(-8.0, -6.0), Vector2(8.0, -6.0), mortar, 1.0) - # Ember glow: 6×3 px orange rect, horizontally centred, at bottom of front face. - draw_rect(Rect2(Vector2(-3.0, -3.0), Vector2(6.0, 3.0)), ember) - # Top/front edge horizon line. - draw_line(Vector2(-8.0, -11.0), Vector2(8.0, -11.0), mortar, 1.0) - # Tile outline. - draw_rect(Rect2(Vector2(-8.0, -16.0), Vector2(16.0, 16.0)), outline, false, 1.0) - - -func _draw_hearth(alpha: float) -> void: - # Dark grey stone block with a large orange flame at centre of front face and - # a thin smoke wisp poking above the top face. Visually heavier than the - # Smelter (which has a small ember) to signal open-fire cooking. - var top_face := Color(0.35, 0.30, 0.25, alpha) - var front_face := Color(0.28, 0.24, 0.20, alpha) - var mortar := Color(0.18, 0.14, 0.12, alpha) - var flame := Color(0.95, 0.55, 0.10, alpha) - var smoke := Color(0.72, 0.70, 0.68, alpha * 0.6) - var outline := Color(0.14, 0.10, 0.08, 0.7 * alpha) - - # Top face. - draw_rect(Rect2(Vector2(-8.0, -16.0), Vector2(16.0, 5.0)), top_face) - # Front face. - draw_rect(Rect2(Vector2(-8.0, -11.0), Vector2(16.0, 11.0)), front_face) - # Mortar seam. - draw_line(Vector2(-8.0, -6.0), Vector2(8.0, -6.0), mortar, 1.0) - # Flame: 6×4 px orange rect, horizontally centred in the front face. - draw_rect(Rect2(Vector2(-3.0, -8.0), Vector2(6.0, 4.0)), flame) - # Smoke wisp: 1×2 px vertical light-grey rect rising above the top face. - draw_rect(Rect2(Vector2(-0.5, -18.0), Vector2(1.0, 2.0)), smoke) - # Top/front edge horizon line. - draw_line(Vector2(-8.0, -11.0), Vector2(8.0, -11.0), mortar, 1.0) - # Tile outline. - draw_rect(Rect2(Vector2(-8.0, -16.0), Vector2(16.0, 16.0)), outline, false, 1.0) - - -func _draw_millstone(alpha: float) -> void: - # Very light grey stone block with a circular dark-grey stone wheel inset - # at the centre of the front face. Suggests a grinding wheel. - var top_face := Color(0.78, 0.78, 0.72, alpha) - var front_face := Color(0.65, 0.65, 0.60, alpha) - var seam := Color(0.45, 0.45, 0.42, alpha) - var wheel := Color(0.40, 0.40, 0.36, alpha) - var outline := Color(0.28, 0.28, 0.26, 0.7 * alpha) - - # Top face. - draw_rect(Rect2(Vector2(-8.0, -16.0), Vector2(16.0, 5.0)), top_face) - # Front face. - draw_rect(Rect2(Vector2(-8.0, -11.0), Vector2(16.0, 11.0)), front_face) - # Seam. - draw_line(Vector2(-8.0, -6.0), Vector2(8.0, -6.0), seam, 1.0) - # Stone wheel: filled circle radius 5 px, centred on the front face. - draw_circle(Vector2(0.0, -5.5), 5.0, wheel) - # Top/front edge horizon line. - draw_line(Vector2(-8.0, -11.0), Vector2(8.0, -11.0), seam, 1.0) - # Tile outline. - draw_rect(Rect2(Vector2(-8.0, -16.0), Vector2(16.0, 16.0)), outline, false, 1.0) +## Stone-wheel overlay drawn on top of the Millstone barrel sprite. Without +## this, the barrel reads as "water/grain storage" rather than a millstone. +## The circle sits inside the top half of the barrel's tile. +func _draw_millstone_overlay(alpha: float) -> void: + var wheel := Color(0.40, 0.40, 0.36, alpha) + var rim := Color(0.22, 0.22, 0.20, alpha) + draw_circle(Vector2(0.0, -10.0), 4.5, wheel) + draw_arc(Vector2(0.0, -10.0), 4.5, 0.0, TAU, 12, rim, 1.0) func _draw_generic(alpha: float) -> void: @@ -401,6 +408,11 @@ func _draw_generic(alpha: float) -> void: func _complete() -> void: _completed = true + # Solidify the ghost: sprite child (if any) goes from 40% to full opacity. + # Procedural-only variants reread alpha through _draw() via queue_redraw. + var sprite: Sprite2D = get_node_or_null("Sprite") + if sprite != null: + sprite.modulate.a = 1.0 # Phase 11: enable PointLight2D for light-emitting workbenches on completion. if _light != null: _light.enabled = is_on()