ninelands-reddit/docs/submission.md
Lukas Müllner e22073ca44 docs: Devpost-Text „About the project“, Tags und Links
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-13 18:34:33 +01:00

11 KiB
Raw Blame History

Einreichung – Texte und Checkliste

Sammelstelle für alle Texte und Assets rund um Devpost und das Developer Portal. Texte auf Englisch (Jam-Vorgabe), Erklärungen auf Deutsch. Stand: 2026-11-13.

Developer Portal – In-app catalog

App: developers.reddit.com → ninelands-game → Developer Settings → In-app catalog.

Feld Text Zeichen
Tile tagline Claim the nine lands – a new map every day. 43
Featuring description A fresh 9×9 map every day. Place your castle, farmers, knights and bishops, claim land and gold, earn three stars and climb today's leaderboard. 147
Description (15–200) Daily strategy puzzle: one 9×9 map for everyone. Build your realm piece by piece, claim lands and gold, chase three stars and keep your streak alive. 151
Game category Game → Strategy –
App icon Icon aus dem Hauptspiel (Ninelands) –

Assets

Erzeugen mit npm run capture → dist/marketing/ (nicht im Repo). Vor der Einreichung neu aufnehmen (z. B. mit Winter-Brett).

Datei Feld Vorgabe Portal Stand
featuring.mp4 Featuring asset MP4, 3:2, 1000–1500 px breit, 6–15 s, ≤ 30 fps, ≤ 3 MB 1500×1000, 11,3 s, 1,7 MB
fallback.gif Fallback (animiert) 3:2, 1000–1500 px, 3–10 s Schleife, Ziel ≤ 2 MB 1000×667, 6 s, 1,8 MB
fallback.png Fallback (Standbild) 1500×1000 empfohlen, ≤ 800 KB 52 KB
tile.png Tile image 560×256 empfohlen, ≤ 800 KB 58 KB

Nur die Spielfläche, keine Menüs (Wunsch Besitzer). Karte vom 2026-10-10 – läuft nie als Tageskarte (kein Spoiler).

Devpost – Project overview

Elevator pitch (≤ 200 Zeichen)

Empfehlung (176 Zeichen):

Ninelands is a daily strategy puzzle on Reddit: one 9×9 map for everyone, place castles, farmers and knights to claim lands and gold, earn three stars and climb the leaderboard.

Alternativen:

  • (181) A daily port of the strategy game Ninelands: everyone gets the same 9×9 map each day – build your realm, chase three stars, keep your streak and compare strategies in the comments.
  • (141) One map. Nine lands. Every day. Build your realm piece by piece, chase three stars and climb today's leaderboard – right inside a Reddit post.

About the project (Markdown, LaTeX erlaubt)

Abschnitt „Inspiration“ bei Bedarf persönlicher machen (eigene Worte des Besitzers). Ob die KI-Unterstützung erwähnt wird, entscheidet der Besitzer (die Regeln erlauben technische Hilfe, solange Ideen und Rechte beim Teilnehmer liegen).

## Inspiration

Ninelands started as a strategy board game on a 9×9 board split into nine lands: you place a castle, farmers,
knights and bishops, every piece claims land, and the goal is to rule the nine lands. It runs on the web, desktop,
Android and itch.io – and its most popular mode has always been the **map of the day**, where everyone plays the same
map and compares results.

Reddit felt like the natural home for that mode. A daily map is a shared puzzle, and a shared puzzle wants a place to
talk about it: _Where did you put your castle? How did you get 9/9 lands?_ So we built **Ninelands for Reddit** – a
focused, bite-sized daily edition that lives inside a post, with the comment thread as the place to compare realms.

## What it does

- **One 9×9 map per day, the same for everyone.** A new post appears automatically every day.
- **Easy to start, hard to master.** Tap to preview what a piece would claim and how much gold it brings; tap again to
  place it. The line below the board explains why a cell fits or not – no wall of rules.
- **Three stars per map:** reach the gold target, rule the lands target, and both in one game. Targets come from
  computer games on that very map, so every day is fair.
- **Leaderboard and streaks.** Only your first game counts. More stars first, then more gold, then the earlier
  submission.
- **Your realm.** Unlock board themes with your streak and new banners and peoples (orcs, pirates) with your stars.
- **Reddit-native.** Post your result to the comments with one tap, earn a 🔥 streak flair, and the best player of the
  day wears 👑 _Ruler of the day_ the next day.

## How we built it

- **Devvit Web** with plain TypeScript, bundled by esbuild; no UI framework. An inline start screen in the feed, the
  full board in expanded mode.
- **The original engine, untouched.** The Ninelands engine is pure TypeScript (seeded RNG, `legalMoves`,
  `applyMove`, replay). A sync script copies it – plus the SVG board renderer – from a tagged release, so the Reddit
  edition plays exactly like the original and fixes flow in one direction only.
- **A server that trusts nothing.** The client sends only its moves. The server replays them with the same engine and
  computes gold, lands and stars itself, so results cannot be faked.
- **Redis leaderboards.** Each day is a sorted set. To rank by stars, then gold, then submission time in a single
  score, we use

  $$\text{score} = 100\,000 \cdot \text{stars} + \text{gold} + \frac{1}{\text{seq} + 1}$$

  where $\text{seq}$ is the running number of the submission. The fraction lies in $(0, \tfrac12]$, so it only breaks
  ties – and it makes every score unique, which turns a player's rank into a simple
  $\text{rank} = \text{count} - \text{zRank}$.
- **First attempt only**, enforced atomically with `hSetNX` – two parallel submissions can never both count.
- **Daily posts** via the Devvit scheduler, **Devvit Journeys** for analytics (journey starts when the castle is
  placed, a progress event per star, the end carries the gold as score).
- **Privacy by design:** all user data expires 30 days after a player's last game.

## Challenges we ran into

- **Making the daily map unspoilable.** The website has a map of the day too – including a replay of the best game.
  The Reddit edition therefore uses its own seed, so its daily map can never be looked up elsewhere.
- **Knowing when to stop.** In the original, a game ends when no move is left. On a phone that can drag on, especially
  under the law _One farm per land_, where only costly knights remain. We added an _End game_ button, and the game now
  detects when no remaining move earns gold and suggests ending.
- **Fitting a strategy board into a post.** The board, the goals and nine piece costs have to be readable on a phone in
  portrait mode. Container queries keep the board as large as possible without pushing the hint line away.
- **Platform details:** a template workflow our CI runner didn't understand, Redis commands that are not enabled for
  every app, `localStorage` that is cleared on every app update (so all choices live in Redis), and an analytics router
  that expects Express while our server has no framework – we rebuilt its five endpoints by hand.

## What we learned

- A daily game lives from **one shared moment**: same map, same day, one first attempt. Every feature we kept serves
  that moment; menus and settings did not make the cut.
- Contextual hints beat tutorials. Showing _why_ a move doesn't fit teaches the rules faster than any rules screen.
- Porting is easiest when the game logic is pure: the engine moved to a new platform without a single change.

## What's next

- Seasonal events beyond the winter festival, and more unlockable banners and boards.
- A weekly challenge with a twist (fog of war, bandit camps) – both already exist in the original engine.
- An optional duel against the computer after the daily map.

Built with (Tags, max. 25)

typescript, javascript, html5, css3, svg, node.js, devvit, devvit-web, reddit, reddit-api, redis, devvit-scheduler, devvit-journeys, esbuild, biome, playwright, ffmpeg, pixel-art

  • App: https://developers.reddit.com/apps/ninelands-game
  • Spielen: https://www.reddit.com/r/Ninelands/ (sobald angelegt; bis dahin nicht eintragen)
  • Original-Spiel: https://ninelands.stackteam.at
  • Code: Repo ist privat – nur eintragen, wenn es öffentlich wird (optional)

Noch zu schreiben

  • Portierung angeben (Kategorie „Best Ported Daily Game“): Ninelands gehört StackTeam; erklären, was seit dem 11. Nov. neu entstanden ist (Pflicht für bestehende Projekte): neue Codebasis auf Devvit Web, neuer Tagesmodus mit eigenem Seed, serverseitig nachgespielte Bestenliste in Redis, Streak, Realm-Freischaltungen, Flair, Ergebnis als Kommentar, Devvit Journeys. Übernommen: Engine und Brett-Darstellung (Kopie mit festem Stand v0.11.0), Sprites, Musik.
  • Testanleitung für die Jury (kurz, Englisch).

Checkliste Einreichung (Abgabe 9. Dez. 2026, 03:00 MEZ)

Pflicht laut offiziellen Regeln:

  • Devpost: Text-Beschreibung (Funktionen)
  • App-Link: https://developers.reddit.com/apps/ninelands-game (entsteht beim Upload)
  • README.md im Repo-Wurzelverzeichnis (Spiel und Anleitung) – vorhanden, vor Abgabe prüfen
  • Demo: Link zum Subreddit (r/Ninelands, öffentlich, < 200 Mitglieder) und zu einem Post mit dem Spiel
  • Angabe „Portierung“ + was im Jam-Zeitraum neu entstanden ist

Optional:

  • Video < 1 min, öffentlich auf YouTube/Vimeo (die Jury darf allein danach urteilen)
  • Öffentliches Repo (Repo ist derzeit privat)
  • Developer-Platform-Feedback-Umfrage (eigener Preis)

Nicht tun:

  • Kein devvit publish – hochladen und playtesten reicht, die App darf privat bleiben.
  • Während der Bewertung (9.–16. Dez.) keine riskanten Uploads; Tagesposts müssen weiterlaufen.

Besitzer entscheidet bei der Anmeldung: Einzelperson oder Organisation (StackTeam) – betrifft Preisgeld und Steuerformulare (W-8BEN).