Skip to content

v1.0.0 — first verified-working release

Choose a tag to compare

@jiafans jiafans released this 08 May 09:59
· 3 commits to main since this 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.pressed from ABS_MT_TRACKING_ID
    since rM2's pt_mt does not emit ABS_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.sh

Known 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