v1.0.0 — first verified-working release
First end-to-end working release of gomoku-rm on reMarkable 2.
What works
- 19×19 board with Go-style coordinate labels and 9 star points
- Play vs AI (3 difficulties: Easy / Medium / Hard)
- Local 2-player on the same device
- Touch-driven move placement
- Win detection + winner banner + tap-to-restart
- Save & Quit returns to main menu; auto-saves on every move; "Continue" resumes
- Undo (single move in PvP, full round in PvAI)
- Bilingual UI scaffolding (English / 中文 — labels switchable in Settings)
Engine
~1000 lines of Rust covering pattern recognition (five, open/closed four,
open/closed three, two), full-board evaluation summing across rows/cols/
diagonals, and negamax + alpha-beta + iterative deepening with candidate
pruning to empty cells within Chebyshev radius 2 of any stone. 3-second
time budget per move; depth 2 / 4 / 6 by difficulty.
Engine is a trait, so future versions can swap in mintaka or rapfi via
IPC without touching the rest of the codebase.
Vendored upstream patches (~10 lines each, see README §Vendored upstream fixes)
- evdev 0.12.2 — silences
got a key event despite not supporting keys
panic from rM2's pt_mt BTN_TOUCH events - libremarkable 0.7.0 — derives
finger.pressedfromABS_MT_TRACKING_ID
since rM2's pt_mt does not emitABS_MT_PRESSURE
Build & deploy
brew install zig
cargo install cargo-zigbuild
rustup target add armv7-unknown-linux-gnueabihf
cargo zigbuild --target armv7-unknown-linux-gnueabihf --release
RM_PASS='<device password>' ./packaging/deploy.shKnown limitations
- CJK glyphs render as missing-glyph boxes (libremarkable ships a Latin-only
embedded font; switching language updates label semantics but proper CJK
rendering is future work) - AI ceiling is amateur 1-3 dan (depth 6 with the budget); stronger play
needs transposition tables / killer moves / mintaka or rapfi via the
Engine trait