A public, reviewed, searchable edition of the Land Game rules of The Campaign for North Africa (SPI, 1979), written in our own words, precise enough to build a rules-enforcing engine from, with SPI's September 1979 errata folded in and every ambiguity we resolve recorded as a disputable ruling.
This is sub-project 1 of an open-source, self-hostable digital CNA. No
engine, server or UI lives here. Design: docs/designs/2026-09-18-cna-living-rules-design.md.
| Directory | Contents | Licence |
|---|---|---|
rules/ |
The restated rules, one file per game system; rules/logistics/ holds the Logistics Game (§48–58), an optional module over the Land Game |
CC-BY-SA-4.0 |
rulings/ |
One file per ruling: problem, options, decision, rationale | CC-BY-SA-4.0 |
data/ |
Tables as JSON (CRTs, terrain, weather, map, …) with schemas and provenance | CC0-1.0 |
tools/ |
Fetch, generate and check scripts | MIT |
site/ |
VitePress site that renders rules/ and data/, plus the published Learn primer, Parts A–D (site/learn.md, generated by tools/learn_page.py --site; Part D draws on our own Map C render) |
MIT |
docs/ |
Designs, plans; the standalone primer build (tools/learn_page.py, with chart crops and the Map C scan, git-ignored) stays local for comparison only |
CC-BY-SA-4.0 |
- Game mechanics are not copyrightable. This project restates them in its own words and organisation. It is intended to be independent expression; no legal review has been obtained.
- No SPI rule text, map art or counter art is in this repository or in the built site, and no SPI text is quoted. The optional "show original" toggle fetches the community transcription (tonicebrian/TheCampaignForNorthAfrica) into your browser at page-view time; it is never part of our build or search index.
- Third-party text reproduced under its own licence (currently NJHarman's
house rules, CC-BY-SA 4.0, quoted in
rulings/) is listed inATTRIBUTION.mdwith its source and licence. - Licences are granted to the extent the project holds rights. See
LICENSE. - The game's name is used nominatively. This is not marketed as a substitute edition and reproduces no trade dress.
- Map.
data/map/records game facts only (terrain per hex, features and the higher side per hexside, named places). It is read bytools/map_extract.pyfrom the community VASSAL module's redraw of the map (cached locally, never committed) and checked against the archive.org scan of SPI's map. Every change to what the extractor read is a correction file indata/map/corrections/that cites the scan page and a crop. A second community database is used only to find disagreements; nothing is copied from it, andEXTRACTION.mdgives counts only. The/mappage shows our own SVG render of that data. No scan, redraw image or other map art is committed or published. EXTRACTION.mdlogs, per rules file, which source cases were read, what mechanic was identified, and how we expressed it.
python3 -m venv .venv && .venv/bin/pip install -r requirements-dev.txt
.venv/bin/python -m pytest # unit tests
.venv/bin/python tools/fetch.py sections # source text → ~/.cache/cna-scans (for the overlap gate)
.venv/bin/python tools/check_data.py # gate
.venv/bin/python tools/check_overlap.py # gate
.venv/bin/python tools/check_coverage.py --sections 1-32 # report
npm ci && npm run site:build # site → site/.vitepress/distPropose rule wording changes as PRs against rules/; propose or dispute a
ruling in GitHub Discussions first (see rulings/README.md). Every rules PR
must pass the overlap and data gates and include an EXTRACTION.md entry.