The Hub Comes Alive
The overworld used to be the game's loading screen with a person on
it. Procedural canvas tiles in five flavours of green, props painted
with fillRect, and a shopkeeper outpost that was nothing more than
an [E] prompt floating in empty grass. This week the hub got a
texture pass and the merchant actually showed up.
Each biome zone now skins itself with the matching dungeon theme's PNG floor pack — forest tiles in the meadow and woods, dungeon stone in the ruined zone, crypt withering in the north, void cracks in the east, and cave scorch in the southeast. Four 32×32 variants per theme rotate per tile by xy hash, so the surface looks varied instead of repeating in obvious rows. Prop scatter pulls from the same packs: mushrooms / logs / vines in the forest, barrels and dropped swords in the ruins, coffins and skullpiles in the crypt, runes and spikes in the void, crystals and stalagmites in the hellpit. Trees stay canvas-painted (no PNG art for them) and layer in front of the PNG ground props for canopy depth.
The shopkeeper outpost now has a building. Closed wood door in the middle, hand-lettered sign hanging above, two flanking brass lanterns flickering on a 3-frame loop, and a softly breathing additive halo behind each lantern so the shop reads as warm even from across the meadow. The merchant himself stands in front of the door with the same idle animation his dungeon counterpart uses, and the [E] prompt now hangs over him instead of the door so the approach feels like greeting a person, not opening a building.
Pressing [E] opens the actual shop UI — Buy / Sell / Identify tabs, gold bar, the same per-floor stock generator the dungeon merchant uses. Floor 0 stock is mostly potions and low-tier gear, which fits "hub merchant" perfectly. Sell and Identify tabs work against your full inventory, so the hub is now where you offload junk between runs.
Water and lava picked up some atmosphere. The river drifts white sparkles westward at 90ms cadence, additive-blended so they catch against the dark water. The hellpit lava strip exhales orange-to-red embers rising at 70ms cadence with random horizontal sway. Two particle emitters total — single GameObjects, GPU-accelerated, no per-tile sprite churn.
Lanterns no longer pulse in lockstep — every animated prop (path lanterns, magma vents, void shards, shop lanterns) carries a per-sprite phase offset so a row reads as separate flames instead of one ticking metronome.
All five dungeons unlock by default. The unlock-on-clear chain (Forest → Ruined → Crypt → Void → Hellpit) is gone — pick whichever gate matches the run you're in the mood for.
What landed
- Asset-driven overworld bake —
bakeOverworldMap(scene)reads PNG floor + prop textures from the scene's cache. Biome → theme map: meadow/forest = forest, ruined = dungeon, crypt = crypt, void = void, hellpit = cave. Water / mountain / shore stay procedural (no PNG art). - Shop outpost dressing — door (frame 0, closed) + sign tile +
two
prop_shop_lanternsheets (3-frame flicker, 6fps, per-sprite phase offset) + twoprop_shop_lantern_glowhalos (additive blend, alpha-tween 0.55↔0.85 over 1.2s). - Overworld shopkeeper NPC —
npc_shopkeepersprite with a 4-frame idle-down animation, positioned 1.1 tiles in front of the door so the player approaches him head-on. - Shop UI hooked up — pressing [E] near the merchant calls
setShopOpen(true)directly, opening the same Buy / Sell / Identify modal the dungeon shopkeeper uses. Closing the modal emitsgate-card-closedso the proximity lock releases for the next [E] press. - Ambient particles — single river-spanning sparkle emitter (90ms drift west) + single lava-strip ember emitter (70ms rise with horizontal sway, tint cycle yellow→orange→red). Both additive-blended.
- Lantern desync — every animated prop carries a
phasedata value derived from its position; the update-loop frame index uses(time + phase) * fps. Path lanterns, magma vents, void shards, shop lanterns all desync independently. - All dungeons unlocked by default — every entry in
DUNGEON_TYPESnow hasunlockRule: { kind: "default" }. The cleared-prerequisite chain is removed.
Bugs killed
- Shopkeeper missing from Crypt / Void / Hellpit — the spawn
gate read
level.bossLevelfrom the LEVELS theme table, where Cave / Crypt / Void are flaggedbossLevel: truefor the legacy 17-floor rotation. Themed dungeons gate-skipped on every floor. Replaced withisCurrentFloorBossLevel()which readsdungeon.floorCount - 1from the active dungeon definition. - Trees disappeared in the forest — the texture-pass swap replaced canvas-painted trees with PNG mushroom / log / vines, but the PNG pack ships no tree art so the canopy went flat. Trees come back via the canvas painters; PNG props layer underneath as ground-level dressing.
- Shop tile was empty — the shop position only rendered the [E] prompt floating in air; no door, no sign, no merchant. Replaced with the full outpost dressing + NPC sprite.
- "Coming soon" stub on shop press — the shop variant of HubFurnitureModal showed placeholder copy. Replaced with a short-circuit that opens the real shop modal directly.