Changelog — RPG98
All notable changes to RPG98 are documented here. Format follows Keep a Changelog. Versioning follows phase-tied semver — see CLAUDE.md for the full versioning rules.
[Unreleased]
[v0.2.4] — 2026-04-10
Added
- Floating damage numbers: world-space position, random upward drift direction, alpha fade over 1.4 seconds — foundation for in-game combat feedback
- Camera clamped to map bounds: viewport never scrolls past the dungeon edge; player moves off-centre when near a boundary
Changed
blit_spriteoptimised: row-invariantsyanddst_rowhoisted out of the inner column loop; column clip range computed once per blit so no per-pixel bounds check is needed in the hot path
Fixed
- Screen tearing:
FBIO_WAITFORVSYNCioctl was using0x4600(FBIOGET_VSCREENINFO) instead of the correct0x40044620 - Screen tearing: framebuffer write direction now matches display scan direction (forward through mmap), keeping the write ahead of the scan line
[v0.2.3] — 2026-04-09
Added
- Autotile engine (
client/src/tile_engine.rs): full tileset tile selection for every dungeon cell based on north depth, face rows (3 depths), side-wall strips, cap tiles, diagonal edge detection, and side-wall transition tiles - Peninsula cleanup pass in dungeon generator: wall tiles with 3+ cardinal floor neighbours are converted to floor (catches wall stubs the excess-intersection pass misses when their only wall neighbour is pure void)
- Config-driven tile rendering:
TilesetConfigstruct loaded from JSON at startup; all tile roles (floor base, variations, bridges, 14 wall roles) are now data-driven rather than hardcoded - Floor variation hash in client matches tile mapper tool (Murmur-style: same seed → same variation pattern on both)
- Collision mode in tile mapper tool (P cycles to it): yellow outlines show collision cells, left-click adds, right-click removes, Ctrl+S saves override JSON
- Wall config section in tile mapper config panel: caps, side walls, face rows 1–3 all assignable per tileset
Changed
- Excess intersection and peninsula cleanup passes now run inside a shared outer loop until both are quiescent — prevents peninsula conversions from leaving new excess tiles behind
- Server dungeon seed restored to nanosecond-timestamp random seed (was hardcoded to a test value)
- Collision rule: wall tiles are solid only if no cardinal neighbour is floor (void walls only). Border walls — caps, face rows, side-wall strips — are now passable, letting the player walk up to the visual wall face
- Player hitbox tuned to 18×22 px (source) — wider and taller than before, better fitting the sprite's body
- Dungeon Base Generation design doc updated to reflect current 64×64 grid, room parameters, and the full 5-pass cleanup pipeline
Fixed
- Orange (excess) wall tiles occasionally surviving generation when the peninsula pass ran first and created new excess conditions that the already-completed excess pass never saw
- Floor variation hash changed from XOR to Murmur-style mixing — eliminates visible grid pattern in floor tile distribution
[v0.2.1] — 2026-04-08
Added
- On-screen FPS counter in bottom-right corner using embedded 5×7 bitmap font (no extra dependencies)
- Bitmap font extended to full uppercase A–Z for UI text rendering
- In-game menu overlay (Start button): translucent panel with EXIT GAME / CANCEL options, game continues running behind it
- 30 FPS framelock with hybrid sleep + spin-wait to work around Miyoo kernel's 10ms scheduler granularity (HZ=100)
Changed
- Dungeon corridors widened from 2 to 3 tiles; doors removed entirely
- Added sliver wall cleanup pass: 1-tile-wide wall columns/rows between open spaces are converted to floor
- Dungeon size set to 64×64 tiles for Unstable mode
- Player walk cycle changed to 4-step sequence (0→1→2→1) for smoother animation
- Horizontal walk frames now play in reverse (2→1→0→1) to match sprite sheet layout
fill_rectrewritten to fill first row thencopy_withinsubsequent rows — faster on ARM- Removed redundant
clear()call each frame;draw_mapcovers the full viewport already
Fixed
- Corrected horizontal walk animation direction (was moonwalking left and right)
[v0.2.0] — 2026-04-08
Added
- Procedural dungeon generator: random rooms + L-shaped corridors + door placement on a 64×64 tile grid
shared:Tileenum (Wall/Floor/Door),DungeonMapstruct with spawn point- Server generates a fresh dungeon on each client connect and sends the full map
- Client renders dungeon with solid colored tiles (wall, floor, door, red border walls)
- Smooth sub-tile scrolling camera centered on the player
- Debug grid overlay
- Walking animation using
character_1_base.pngspritesheet (3 cols × 4 rows, 8 FPS) - 8-directional free pixel movement with wall-sliding collision
- Hitbox tuned to lower portion of sprite for natural top-down feel
- Direct
/dev/fb0mmap renderer — bypasses SDL2 renderer pipeline entirely - 180° framebuffer flip to compensate for Miyoo's physically rotated screen
- Confirmed running at ~50 FPS on Miyoo Mini Plus hardware in release mode
- Cross-compilation via
armv7-unknown-linux-gnueabihftarget +cargo-zigbuildtargeting glibc 2.17 (compatible with Miyoo's glibc 2.28) - Onion OS app structure with
launch.sh,config.json, and icon placeholder
[v0.1.0] — 2026-04-05
Added
- Development plan (Phases 0–5) as HTML documentation
CLAUDE.md— project instructions, game design rules, and versioning policyCHANGELOG.md— this file- Cargo workspace with
server,client, andsharedcrates - Core dependencies:
tokio,serde,bincodeacross all crates shared:ClientMessageandServerMessageenums — typed network contract between server and clientserver: TCP listener on port 9876; deserializesConnect, replies withConnectedclient: TCP client; sendsConnect { username }, receives and printsConnectedwelcome message- ARM cross-compilation via
armv7-unknown-linux-musleabihftarget with musl libc (statically linked — no glibc dependency) - First successful server ↔ client handshake over WiFi from real Miyoo Mini Plus hardware