docs: Ich-Form und keine langen Gedankenstriche in allen englischen Texten

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Lukas Müllner 2026-11-14 12:05:33 +01:00
parent ec23700e14
commit b7383e075a
12 changed files with 79 additions and 71 deletions

View file

@ -5,16 +5,16 @@ Code: GPL-3.0 (see `LICENSE`).
## Devvit template
The project skeleton comes from Reddit's Devvit template "Bare", © 2025 Reddit Inc., BSD-3-Clause – see
The project skeleton comes from Reddit's Devvit template "Bare", © 2025 Reddit Inc., BSD-3-Clause; see
`LICENSE-TEMPLATE.md`.
## Music
**"Dreamscape (part I)"** by **Vee Ray** – <https://vee-ray.itch.io/dreamscape-part-i>
**"Dreamscape (part I)"** by **Vee Ray**: <https://vee-ray.itch.io/dreamscape-part-i>
Licensed under [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/). The modified files (loudness evened
out, re-encoded) are licensed under CC BY-SA 4.0 as well.
## Graphics
**"Mini World Sprites"** by **Shade** and **octoshrimpy** – <https://merchant-shade.itch.io/16x16-mini-world-sprites>
**"Mini World Sprites"** by **Shade** and **octoshrimpy**: <https://merchant-shade.itch.io/16x16-mini-world-sprites>
Released under [CC0 1.0](https://creativecommons.org/publicdomain/zero/1.0/) (public domain).

View file

@ -325,3 +325,11 @@ Abgabe: **9. Dezember 2026, 03:00 MEZ**. Eingereicht wird in „Best Daily Game
Tageswechsel lief also ohne Ausnahme. Sonst nur „Telemetry event dropped: event was valid, but Journey telemetry is
not recorded for playtest app versions.“ → **Journeys werden gültig gesendet, aber nur für installierte
(Nicht-Playtest-)Versionen gezählt.** Auswertung also erst nach Upload + Installation in r/Ninelands sichtbar.
### 2026-11-14 – Ich-Form, keine langen Gedankenstriche
- Entscheidung Besitzer: Alle englischen Texte (Devpost, Community-Posts, README, CREDITS, Spiel, Bilder, Trailer) in
der **Ich-Form** und **ohne „–“/„—“**: stattdessen Punkt, Komma, Doppelpunkt oder Semikolon; Datumsbereiche als
„Dec 1 to Jan 6“. Die Devpost-Überschriften („How we built it“ usw.) sind fest vorgegeben und bleiben.
- Deutsche interne Doku und Code-Kommentare bleiben unverändert. Prüfen:
`grep -rn '[–—]' src/client src/shared src/server scripts/capture | grep -vE ':\s*(//|\*)'` muss leer sein.

View file

@ -1,8 +1,8 @@
# Ninelands – a daily strategy puzzle for Reddit
# 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.
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
@ -11,7 +11,7 @@ _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) –
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:
@ -25,7 +25,7 @@ _Reddit Game of the Day 2026_ hackathon.
4. **Earn gold.** Ore (mountains) and herbs (moor) pay 20 gold, every claimed pasture cell 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
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_).
@ -38,7 +38,7 @@ explains why a cell does or doesn't fit.
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 – results cannot be faked.
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.
@ -56,7 +56,7 @@ explains why a cell does or doesn't fit.
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.
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.
@ -79,21 +79,21 @@ 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
- `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
- 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)).
GPL-3.0, see [LICENSE](LICENSE). The template parts remain under BSD-3-Clause ([LICENSE-TEMPLATE.md](LICENSE-TEMPLATE.md)).

View file

@ -10,13 +10,13 @@ installieren – das legt sofort den Tagespost #1 an. Bilder erzeugen: `npm run
Titel: `How to play Ninelands`
```text
Every day at 00:00 UTC a new 9×9 map appears as a post here. Everyone plays the same map.
Every day at 00:01 UTC a new 9×9 map appears as a post here. Everyone plays the same map.
**Goal:** earn gold and rule the nine lands.
- **Castle** (free, once): claims up to 5 cells in straight lines.
- **Farmer** (free): claims the 8 cells around it, inside its own land. Must border your domain.
- **Knight** (10 gold): 2 cells straight, stays in its land – pays double.
- **Knight** (10 gold): 2 cells straight, stays in its land, pays double.
- **Bishop** (15 gold): 2 cells diagonally, also across borders.
Claimed cells pay gold: ore and herbs 20, pasture 5 (7 next to a lake). Nothing can be built on claimed land, so
@ -26,7 +26,7 @@ plan where you build. You rule a land when you claim at least half of it.
**Law of the day:** each map has one special rule, e.g. "Costly knights".
**End game:** when no move earns gold anymore, end the game to keep your gold.
Only your **first game** counts for the leaderboard – after that you can practice. Play daily for a 🔥 streak;
Only your **first game** counts for the leaderboard. After that you can practice. Play daily for a 🔥 streak;
yesterday's winner wears the 👑 flair.
```
@ -37,13 +37,13 @@ Titel: `Choose your faction: Kingdom, Orcs and Pirates`
```text
Your realm, your look. Tap 🎨 Realm on the daily post:
- **Colours** – red, cyan, green, purple – free for everyone
- **Factions** – Kingdom, Orcs (20 ★), Pirates (40 ★)
- **Boards** – Autumn (3-day streak), Winter (7), Night (14)
- **Banners** – a new one every 10 stars
- **Winterfest** (Dec 1 – Jan 6): snowy board and snowflake banner for everyone
- **Colours**: red, cyan, green and purple, free for everyone
- **Factions**: Kingdom, Orcs (20 ★), Pirates (40 ★)
- **Boards**: Autumn (3-day streak), Winter (7), Night (14)
- **Banners**: a new one every 10 stars
- **Winterfest** (Dec 1 to Jan 6): snowy board and snowflake banner for everyone
Same rules for all – it's just about looking good while you win. Which faction are you playing?
Same rules for all. It's just about looking good while you win. Which faction are you playing?
```
## 3 – Go-live (Bildpost: `vimeo-cover.png`, Video als Link)
@ -51,15 +51,15 @@ Same rules for all – it's just about looking good while you win. Which faction
In r/Ninelands sind Video-Posts aus (so gewollt). Deshalb das Cover als Bild und den Vimeo-Link zum Trailer in den Text
(oder `fallback.gif` aus `npm run capture` als bewegtes Bild).
Titel: `Ninelands is live – a new 9×9 map every day`
Titel: `Ninelands is live: a new 9×9 map every day`
```text
Ninelands is a small strategy game I've been building – and now there's a daily version right here on Reddit.
Ninelands is a small strategy game I've been building, and now there's a daily version right here on Reddit.
Every day: one new map, one leaderboard, one first try. Play it in the daily post, compare your realm in the
comments, keep your streak going.
Today's map is #1 – good luck, rulers!
Today's map is #1. Good luck, rulers!
New here? Read "How to play" (pinned). Bugs, ideas or feedback: comment below.
@ -68,8 +68,8 @@ Original game: ninelands.stackteam.at
Music: "Dreamscape (part I)" by Vee Ray (CC BY-SA 4.0) · Sprites: "Mini World Sprites" by Shade & octoshrimpy (CC0)
```
Hinweise: Kosten in Post 1 sind die normalen (einzelne Gesetze ändern sie). „I've been building“ ist persönlich
gemeint – als StackTeam „we“ schreiben. Ändern sich Kosten oder Freischaltungen, Bilder neu erzeugen und Texte
Hinweise: Kosten in Post 1 sind die normalen (einzelne Gesetze ändern sie). Alle englischen Texte in der Ich-Form und ohne lange
Gedankenstriche (Entscheidung Besitzer 2026-11-14). Ändern sich Kosten oder Freischaltungen, Bilder neu erzeugen und Texte
anpassen.
Entscheidung Besitzer (2026-11-13): **keine Post-Flairs** in r/Ninelands, auch nicht für die Tagesposts. Die drei

View file

@ -9,7 +9,7 @@ App: developers.reddit.com → `ninelands-game` → Developer Settings → In-ap
| Feld | Text | Zeichen |
| :-------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------- | :------ |
| Tile tagline | Claim the nine lands – a new map every day. | 43 |
| Tile tagline | Claim the nine lands. A new map every day. | 42 |
| 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 | – |
@ -40,10 +40,10 @@ Empfehlung (176 Zeichen):
Alternativen:
- (181) A daily port of the strategy game Ninelands: everyone gets the same 9×9 map each day – build your realm, chase
- (179) 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.
leaderboard, right inside a Reddit post.
### About the project (Markdown, LaTeX erlaubt)
@ -56,18 +56,18 @@ Alternativen:
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
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
talk about it: _Where did you put your castle? How did you get 9/9 lands?_ So I 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.
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
@ -81,39 +81,39 @@ focused, bite-sized daily edition that lives inside a post, with the comment thr
- **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
`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
score, I 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
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.
- **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.
- **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
under the law _One farm per land_, where only costly knights remain. I 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
- **Platform details:** a template workflow my 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.
that expects Express while my server has no framework, so I 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
- A daily game lives from **one shared moment**: same map, same day, one first attempt. Every feature I 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.
@ -121,7 +121,7 @@ focused, bite-sized daily edition that lives inside a post, with the comment thr
## 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.
- 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.
```
@ -157,8 +157,8 @@ und Freischaltung, 05 Realm, 06 Schluss. Ergänzen lassen sich echte Reddit-Scre
| Bild | Caption |
| :------------------- | :--------------------------------------------------------------------------------------------------------- |
| `00-cover.png` | Ninelands – a daily strategy game on Reddit. One 9×9 map a day, the same for everyone. |
| `01-daily-post.png` | The daily post: today's map, its law, three goals, your streak and today's best – one tap to play. |
| `00-cover.png` | Ninelands: a daily strategy game on Reddit. One 9×9 map a day, the same for everyone. |
| `01-daily-post.png` | The daily post: today's map, its law, three goals, your streak and today's best. One tap to play. |
| `02-claim-land.png` | Place castle, knights, farmers and bishops to mine gold. A live preview shows what each move earns. |
| `03-three-stars.png` | One star each for the gold goal, for ruling all nine lands, and for doing both in one game. |
| `04-result.png` | The result card: stars, rank, streak and new unlocks. Post your result to the comments with one tap. |
@ -173,7 +173,7 @@ Handy an passender Stelle. Keine aktuelle Tageskarte zeigen (Spoiler) und keine
**Vimeo-Beschreibung** (Musik ist CC BY-SA 4.0, Nennung nötig):
```text
Ninelands – a daily strategy game on Reddit (Devvit Web). A new 9×9 map every day, one shared leaderboard per
Ninelands: a daily strategy game on Reddit (Devvit Web). A new 9×9 map every day, one shared leaderboard per
subreddit, streaks, unlockable realms and your result in the comments. Port of Ninelands (ninelands.stackteam.at).
Music: "Dreamscape (part I)" by Vee Ray, CC BY-SA 4.0 (re-encoded).

View file

@ -124,7 +124,7 @@ function howto(): void {
),
h(
'p',
'Claimed land can’t be built on – plan ahead. Claim half of a land to rule it.',
'Claimed land can’t be built on, so plan ahead. Claim half of a land to rule it.',
),
),
h(
@ -214,7 +214,7 @@ function realms(): void {
),
h(
'p.foot',
'It’s all about looking good while you win – which faction are you playing?',
'It’s all about looking good while you win. Which faction are you playing?',
),
)
}

View file

@ -244,7 +244,7 @@ async function scenes(page, o) {
await stage(
'caption',
'One map for the whole subreddit',
'Every day a fresh post – everyone plays the same map.',
'A fresh post every day. Everyone plays the same map.',
)
await wait(1800)
if (clips.feed && !o.fast) {
@ -278,7 +278,7 @@ async function scenes(page, o) {
await stage(
'caption',
'Every piece claims land',
'Claimed land is gone – plan where you build.',
'Claimed land is gone, so plan where you build.',
)
if (i === 13)
await stage(
@ -300,7 +300,7 @@ async function scenes(page, o) {
await stage(
'caption',
'Three goals, three stars',
'Reach the gold goal, rule the lands – or both.',
'Reach the gold goal, rule the lands, or both.',
)
await wait(1600)
await o.snap('03-three-stars')

View file

@ -182,8 +182,8 @@ function render(): void {
? h(
'p.practice',
day.loggedIn
? 'Practice – only your first game counts.'
: 'Playing as guest – log in to join the leaderboard.',
? 'Practice: only your first game counts.'
: 'Playing as guest. Log in to join the leaderboard.',
)
: null,
law,
@ -385,7 +385,7 @@ async function finish(): Promise<void> {
disarmEnd()
update()
setHint(
game.isGameOver() ? 'No move left – the realm is complete!' : 'Game ended.',
game.isGameOver() ? 'No move left. The realm is complete!' : 'Game ended.',
'good',
)
const moves = encodeMoves(game.moves) as EncodedMove[]
@ -495,7 +495,7 @@ function showResult(
unlocked.length
? h(
'p.unlocked',
`🎁 Unlocked: ${unlocked.join(', ')} – choose it under 🎨 Realm`,
`🎁 Unlocked: ${unlocked.join(', ')}. Choose it under 🎨 Realm`,
)
: null,
rsp ? leaderTable(rsp.top, rsp.result.rank) : null,
@ -517,7 +517,7 @@ function showRules(): void {
h('h2', 'How to play'),
h(
'p',
'Place pieces to earn as much gold as possible. Every piece claims land around it – nothing can be built on claimed land. The game ends when no move is left.',
'Place pieces to earn as much gold as possible. Every piece claims land around it. Nothing can be built on claimed land. The game ends when no move is left.',
),
h(
'ul',
@ -535,13 +535,13 @@ function showRules(): void {
),
h(
'p',
h('b', `Law of the realm – ${lawName(game.trait as WorldTrait)}: `),
h('b', `Law of the realm: ${lawName(game.trait as WorldTrait)}. `),
lawText(game.trait as WorldTrait),
),
h(
'p',
h('b', 'Stars: '),
`reach ${day.goals.gold} gold, rule ${day.goals.lands} lands, or both in one game. Same map for everyone today – only your first game counts.`,
`reach ${day.goals.gold} gold, rule ${day.goals.lands} lands, or both in one game. Same map for everyone today, and only your first game counts.`,
),
h('div.row.end', close),
),

View file

@ -7,7 +7,7 @@ export {shareLine} from '../shared/format.ts'
export function leaderTable(rows: LeaderRow[], myRank = 0): HTMLElement {
if (rows.length === 0)
return h('p.muted', 'No one has played yet – be the first!')
return h('p.muted', 'No one has played yet. Be the first!')
const table = h('table.leaders')
for (const r of rows) {
const tr = h(

View file

@ -119,7 +119,7 @@ function showCredits(): void {
h('h2', 'Credits'),
h(
'p',
'Ninelands by StackTeam – a daily port of the strategy game Ninelands.',
'Ninelands by StackTeam: a daily port of the strategy game Ninelands.',
),
h(
'p',

View file

@ -89,9 +89,9 @@ export function placementError(
case 'ZONE_UNIT_LIMIT':
return 'Law of the realm: this land already has a farmer.'
case 'NO_MOTHER':
return 'Place your castle first – it founds your realm.'
return 'Place your castle first. It founds your realm.'
case 'IN_ZOI':
return 'This land is already claimed – nothing may be built here.'
return 'This land is already claimed. Nothing may be built here.'
case 'DOCK_OTHER_ZONE':
return `The ${UNIT_NAME[unit].toLowerCase()} cannot connect here: the neighbouring domain lies in another land.`
case 'NOT_DOCKED':
@ -108,15 +108,15 @@ export function placementError(
/** Kurze Hinweise im Spiel statt einer Textwand (Jury: „contextual hints“) */
export const HINTS = {
castle:
'Tap a cell to place your castle. It claims land in straight lines – nothing can be built on claimed land later.',
'Tap a cell to place your castle. It claims land in straight lines. Nothing can be built on claimed land later.',
farmer:
'Farmers are free: place one right next to your claimed land, in the same land. Pasture pays 5 gold per cell.',
general:
'Ore ⛰ and herbs 🌿 pay 20 gold. Knights pay double. Keep going until no move is left.',
touch: 'Tap again to place.',
noGain:
'None of your remaining moves earns gold – end the game to keep your gold.',
allStars: 'All 3 stars! Keep going for more gold – or end the game.',
'None of your remaining moves earns gold. End the game to keep your gold.',
allStars: 'All 3 stars! Keep going for more gold, or end the game.',
} as const
export {starsLine} from '../shared/format.ts'

View file

@ -95,7 +95,7 @@ export function unlockText(u: Unlock): string {
case 'stars':
return `${u.stars} ★`
case 'winterfest':
return 'Dec 1 – Jan 6'
return 'Dec 1 to Jan 6'
}
}