The watergrass inner corner tiles (rows 0-1) show mostly water with a
tiny grass patch — they're designed for water tiles at concave corners,
not for grass tiles. Removing them eliminates the reddish-brown artifacts
at diagonal water-grass boundaries.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Dirt tiles (dirt-on-transparent) must be applied to DIRT tiles checking
for non-dirt neighbors, not to GRASS tiles. The previous approach had
dirt edges facing the wrong direction because the dirt island's edges
point inward from the center, not outward from the grass.
Water edges (watergrass = grass-on-water) remain applied to GRASS tiles
since the grass portion aligns correctly with the base grass layer.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace the 16x16 tileset with LPC Base Assets (32x32 tiles, 1.5x scale).
Uses a 4-layer rendering approach:
- Layer 0: solid grass base (grass.png)
- Layer 1: water transitions (watergrass.png) with LPC autotile edges
- Layer 2: dirt transitions (dirt.png) with LPC autotile edges
- Layer 3: tree canopy decorations (treetop.png)
LPC autotile format: 3x6 grid with inner/outer corners, edges, and fill
tiles. Edge tiles are selected based on 8-neighbor terrain analysis.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace colored-rectangle world rendering with a proper tilemap system
using a 16x16 RPG tileset scaled 3x. Server generates terrain via seeded
procedural generation (river, ponds, dirt patches, tree decorations) and
sends it to clients. Client renders 3-layer Phaser tilemap with
8-neighbor autotiling for water/dirt edges.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
12-task TDD plan covering bond registry, proposal interactions,
classification rework, config additions, and client display updates.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Separates feelings (asymmetric sentiment values) from formal
relationship statuses (mutual bonds in a central registry).
Introduces proposal interaction protocol for partnership formation
with acceptance/rejection mechanics.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Two bugs caused accessories to render independently of their NPC:
1. spawnEntities ran concurrently with state updates, allowing duplicate
sprites to be created for the same entity. The orphaned sprite would
animate in place but never move. Fixed by deferring onStateUpdate
registration until initial spawn completes.
2. CharacterCompositor tracked load intent (Set) rather than load
completion (Promise), so concurrent preloads could composite before
shared textures finished loading — producing sprites with missing
skin layers. Fixed by using a Map<string, Promise> so concurrent
callers await the same per-file load promise.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The updateRelationships method rebuilds DOM every broadcast tick,
which reset expand/collapse state. Now tracks expanded tiers in a
Set that persists across re-renders.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>