100 lines
5.6 KiB
Markdown
100 lines
5.6 KiB
Markdown
# Ninelands: a daily strategy puzzle for Reddit
|
||
|
||
**Ninelands** is a bite-sized strategy game that lives inside a Reddit post. Every day brings a fresh 9×9 map that is
|
||
the same for everyone. Build your realm piece by piece, claim lands and gold, chase three stars and climb today's
|
||
leaderboard, then compare your realm with the community in the comments.
|
||
|
||
It is a port of [Ninelands](https://ninelands.stackteam.at), a strategy board game by StackTeam that runs on the web,
|
||
desktop, Android and itch.io. The Reddit edition is a new, focused daily mode built on Devvit Web for the
|
||
_Reddit Game of the Day 2026_ hackathon.
|
||
|
||
## How to play
|
||
|
||
1. **Open today's post** and press **Play**.
|
||
2. **Place your castle.** It is free and founds your realm. It claims land in straight lines (up to 5 cells);
|
||
nothing can be built on claimed land afterwards.
|
||
3. **Grow your realm.** Every new piece must connect to the land you already hold:
|
||
|
||
| Piece | Cost | Claims | Rules |
|
||
| :--------- | :--: | :------------------------------------------------ | :--------------------------------------------------- |
|
||
| **Castle** | free | straight lines, reach 5, crosses borders | only one, placed first, not in the moor |
|
||
| **Farmer** | free | the 8 surrounding cells in its own land | must border your land directly, in the same land |
|
||
| **Knight** | 10 | straight lines, reach 2, stops at the land border | must touch your land in the same land · **2× yield** |
|
||
| **Bishop** | 15 | diagonal lines, reach 2, crosses borders | must touch your land |
|
||
|
||
4. **Earn gold.** Each piece earns gold for the cell it stands on: ore (mountains) and herbs (moor) 20, pasture 5 (7 in
|
||
a land with a lake).
|
||
Knights pay double. Building costs are deducted.
|
||
5. **Rule lands.** The board is split into 9 lands; you rule a land once you claim at least half of it.
|
||
6. **Finish.** The game ends when no move is left, or whenever you press **End game** (tap twice). If no remaining
|
||
move earns gold, the game suggests ending.
|
||
|
||
Every map has one **law of the realm** that changes the rules a little (e.g. _Costly knights_, _One farm per land_).
|
||
Hover or tap a cell to preview what a piece would claim and how much gold it brings; the line below the board
|
||
explains why a cell does or doesn't fit.
|
||
|
||
### Stars, leaderboard and streaks
|
||
|
||
- **Three stars per map:** reach the gold target, rule the lands target, and both in the same game. Targets are
|
||
computed from computer games on that very map, so every day and every law is fair.
|
||
- **Only your first game counts.** You may play again for practice; it won't change your result.
|
||
- **Leaderboard:** more stars first, then more gold; on a tie the earlier submission wins. The server replays every
|
||
submitted game with the same engine and computes gold and stars itself, so results cannot be faked.
|
||
- **Streak:** play the map of the day on consecutive days. Older posts can still be played, but only today's map
|
||
keeps your streak alive.
|
||
- **Share** your result line (`Ninelands #12 ★★☆ · 8/9 lands · 85 gold`) and discuss strategies in the comments.
|
||
|
||
## Features
|
||
|
||
- A new post every day at 00:01 UTC (Devvit scheduler) with its own map, leaderboard and comment thread.
|
||
- Inline start screen in the feed (map preview, law of the day, goals or your result, streak, top 3) and the full
|
||
board in expanded mode.
|
||
- Mobile first: tap once to preview, tap again to place. Music starts only after your first tap and can be muted.
|
||
- Devvit Journeys: app ready, journey start when the castle is placed, a progress event per star, end with gold as
|
||
score.
|
||
|
||
## For moderators: setup
|
||
|
||
1. **Install the app** in your subreddit from its page on developers.reddit.com.
|
||
2. **That's it.** On installation the app creates today's post. After that it posts a new map automatically every day
|
||
at 00:01 UTC. No manual work needed.
|
||
3. If a daily post is ever missing, open the subreddit's mod menu (⋯) and choose
|
||
**“Ninelands: create today's post”**. It never creates a duplicate.
|
||
|
||
Each subreddit has its own leaderboards and streaks. There is nothing to configure.
|
||
|
||
## Privacy
|
||
|
||
The app stores only what the game needs: your Reddit user ID and name with your first result per day (for the
|
||
leaderboard) and your streak statistics. All of it expires automatically **30 days** after your last game. No data
|
||
leaves Reddit.
|
||
|
||
## Development
|
||
|
||
Built from the Devvit template _Bare_: TypeScript, esbuild, Biome, `node --test`.
|
||
|
||
```sh
|
||
npm install
|
||
npm run test # types, lint, unit tests, build
|
||
npm run playtest # build, upload and install in the test subreddit
|
||
npm run capture # record the catalog assets (video, GIF, stills) into dist/marketing/
|
||
```
|
||
|
||
- `src/client/`: start screen (`splash`) and game (`game`)
|
||
- `src/server/`: endpoints: day state, verified submission, leaderboard, streak, daily post, journeys
|
||
- `src/shared/`: API types and the daily map (seed from the UTC date)
|
||
- `src/engine/`: the Ninelands engine and board renderer, copied unchanged from a tagged release by
|
||
`scripts/sync-engine.sh` (see `src/engine/VERSION`)
|
||
|
||
## Credits
|
||
|
||
- Music: “Dreamscape (part I)” by Vee Ray, CC BY-SA 4.0 (re-encoded)
|
||
- Graphics: “Mini World Sprites” by Shade and octoshrimpy, CC0
|
||
- Font: Pixelify Sans, SIL Open Font License 1.1
|
||
- Project skeleton: Devvit template “Bare” © Reddit Inc., BSD-3-Clause
|
||
|
||
Details in [CREDITS.md](CREDITS.md).
|
||
|
||
## License
|
||
|
||
GPL-3.0, see [LICENSE](LICENSE). The template parts remain under BSD-3-Clause ([LICENSE-TEMPLATE.md](LICENSE-TEMPLATE.md)).
|