No description
  • Emacs Lisp 52.6%
  • Python 46.1%
  • Makefile 1.2%
  • Shell 0.1%
Find a file
Kinneyzhang f7055190e1
Some checks failed
Repository structure / structure (push) Has been cancelled
docs(solitaire): install the OpenSpiel runtime from the package
The README told users to build the runtime with a make target in the
framework checkout, which an archive installation cannot run. It now names
M-x etaf-gamekit-install-openspiel, which installs the pinned environment
under ~/.cache/emacs-taf/game-engines.

Validation: make check passes (structure, byte compilation, 7 of 7
acceptance scenarios, 6 API declarations).
2026-11-06 17:27:21 +08:00
.githooks feat(solitaire): add the standalone K+ Klondike application 2026-10-11 14:20:23 +08:00
.github/workflows chore(scripts): sync shared workspace tooling 2026-10-19 12:49:36 +08:00
benchmarks perf(solitaire): register card table workloads 2026-10-12 01:58:14 +08:00
docs fix(solitaire): release Escape after clearing card selection 2026-10-16 15:04:31 +08:00
examples docs(solitaire): document installation, controls and screenshots 2026-10-13 00:35:23 +08:00
lisp refactor: resolve the game appearance through etaf-appearance-mode 2026-10-24 11:24:45 +08:00
scripts chore(scripts): sync shared workspace tooling 2026-10-22 13:16:14 +08:00
tests fix(solitaire): wait for the deal before mounting the embedded scenario 2026-10-19 13:15:00 +08:00
.editorconfig feat(solitaire): add the standalone K+ Klondike application 2026-10-11 14:20:23 +08:00
.gitignore feat(solitaire): add the standalone K+ Klondike application 2026-10-11 14:20:23 +08:00
etaf-solitaire.el feat(etaf-solitaire): declare direct dependencies only 2026-10-22 21:14:26 +08:00
LICENSE feat(solitaire): add the standalone K+ Klondike application 2026-10-11 14:20:23 +08:00
Makefile perf(solitaire): register card table workloads 2026-10-12 01:58:14 +08:00
README.md docs(solitaire): install the OpenSpiel runtime from the package 2026-11-06 17:27:21 +08:00

Verdant Solitaire

A native ETAF card table for K+ Klondike, built as an independent GameKit application. OpenSpiel owns the rules, legal moves, chance outcomes and undo/redo history; this application owns the presentation, selection and the launch command.

K+ Klondike folds repeated draws into the currently available waste-card choices. It is not a Windows Klondike rules emulator.

The Klondike table in the ivory and sage light theme

The same table in the graphite dark theme

Capabilities

  • One Klondike table whose rules, hints and undo/redo history come from the OpenSpiel engine, not from a local rule reimplementation.
  • Ivory/sage and graphite palettes; switching themes preserves the deal.
  • New deal, save, load and help from the toolbar; the table adapts to the window it is displayed in.

Prerequisites

Requirement Why Check
Emacs 29.1 or newer the ETAF runtime emacs --version
ecss, ebox, etaf, etaf-ui the framework and the etaf-playing-card component every root entry is on load-path
etaf-gamekit and its OpenSpiel backend rule engine, game instance and state publication M-x etaf-gamekit-install-openspiel
Python 3.11 or newer the OpenSpiel runtime python3.11 --version

Installation

git clone https://github.com/emacs-taf/ecss.git
git clone https://github.com/emacs-taf/ebox.git
git clone https://github.com/emacs-taf/etaf.git
git clone https://github.com/emacs-taf/etaf-ui.git
git clone https://github.com/emacs-taf/etaf-gamekit.git
git clone https://github.com/emacs-taf/etaf-solitaire.git

Then install the OpenSpiel runtime once from the package itself with M-x etaf-gamekit-install-openspiel; it writes only under ~/.cache/emacs-taf/game-engines.

Add every provider root and this repository to load-path:

(add-to-list 'load-path "/path/to/ecss")
(add-to-list 'load-path "/path/to/ebox")
(add-to-list 'load-path "/path/to/etaf")
(add-to-list 'load-path "/path/to/etaf-ui")
(add-to-list 'load-path "/path/to/etaf-gamekit")
(add-to-list 'load-path "/path/to/etaf-solitaire")
(require 'etaf-solitaire)

(global-set-key (kbd "C-c s") #'etaf-solitaire-open)

M-x etaf-solitaire-open deals a table in the current window.

Keys

Key Action
Click pick a face-up card, then a highlighted destination
Tab, arrows, RET move the focus and activate the focused control
D browse the available waste cards
H select a legal move's source; it is not a solver or an optimal-move promise
U / Y undo / redo the preceding or following native action
N start a new seeded deal; save first to retain the current one
C-s / C-o (or Save / Load) save or load an explicit local snapshot
T switch between the light and dark palettes
F1 / ? / 说明 searchable rules and effective controls in the current buffer
Escape clear the selection or dismiss the innermost dialog
Q close the game without an implicit save

The toolbar also offers new deal, save, load and help. Legal moves can be shown beside the table, and etaf-solitaire-appearance selects the opening palette: auto, light or dark.

Checks

make check   # structure, compilation, public behavior scenarios and API boundary

GUI appearance and performance are separate acceptance requirements; the manual describes the maintained GUI workflow.

Documentation

  • Playing Verdant — rules, controls, appearance, save and recovery.
  • Package entry — the supported API inventory.
  • GameKit — the shared game framework, its adapters and backend installation.

License

GPL-3.0-or-later; see LICENSE.