301 lines
6.9 KiB
Markdown
301 lines
6.9 KiB
Markdown
# Ashen Realms – Playable Slice 0.6.6
|
||
|
||
## English Game Content Foundation
|
||
|
||
**Status:** Implementation Specification
|
||
**Depends on:** Slice 0.6.5 – Reputation / Renown Foundation
|
||
**Purpose:** Convert all currently implemented player-facing game content to English before the next major content expansion.
|
||
|
||
---
|
||
|
||
## 1. Goal
|
||
|
||
From this slice onward, **all player-facing game content is written in English**.
|
||
|
||
Development documentation may remain German. Internal technical names may remain unchanged when they are already stable, but new data keys should be language-neutral English slugs.
|
||
|
||
This slice is deliberately a cleanup and convention slice. It must not introduce a large localization framework.
|
||
|
||
> Project rule after this slice: **All player-facing game content is English. Development documentation may remain German.**
|
||
|
||
---
|
||
|
||
## 2. Why this slice exists now
|
||
|
||
The project is about to add significantly more content:
|
||
|
||
- more monsters
|
||
- trade goods
|
||
- loot bags
|
||
- merchants
|
||
- reputation-gated offers
|
||
- NPC dialogue
|
||
- quests
|
||
- the Abandoned Watchpost
|
||
- the Ash Pit
|
||
- the first area boss
|
||
|
||
Translating later would touch much more persisted content, UI copy, seed data and tests. Therefore the language switch happens before Slice 0.7 V2.
|
||
|
||
---
|
||
|
||
## 3. Scope
|
||
|
||
Convert every **currently visible** German string in the playable loop:
|
||
|
||
- navigation
|
||
- locations
|
||
- monsters
|
||
- items
|
||
- combat actions
|
||
- combat log
|
||
- hunt screen
|
||
- travel screen
|
||
- loot screen
|
||
- inventory
|
||
- character screen
|
||
- system messages
|
||
- danger labels
|
||
- error messages visible to the player
|
||
|
||
Do **not** translate German development documentation in `/docs` unless it is itself rendered in the game.
|
||
|
||
---
|
||
|
||
## 4. Naming convention
|
||
|
||
Technical identity must not depend on display language.
|
||
|
||
Preferred pattern:
|
||
|
||
```ts
|
||
{
|
||
key: 'ash-rat',
|
||
name: 'Ash Rat'
|
||
}
|
||
```
|
||
|
||
Avoid new language-specific identifiers such as:
|
||
|
||
```ts
|
||
key: 'aschenratte'
|
||
```
|
||
|
||
Existing UUIDs must never change because of the language conversion.
|
||
|
||
---
|
||
|
||
## 5. Initial terminology
|
||
|
||
Use the following English terminology consistently for the currently relevant content.
|
||
|
||
### Locations
|
||
|
||
| German / Previous Label | English Player-Facing Label | Suggested Key |
|
||
|---|---|---|
|
||
| Graufurt | Graufurt | `graufurt` |
|
||
| Südtor von Graufurt | Graufurt South Gate | `graufurt-south-gate` |
|
||
| Verbrannte Straße | Burned Road | `burned-road` |
|
||
| Verlassener Wachtposten | Abandoned Watchpost | `abandoned-watchpost` |
|
||
| Aschengrube | Ash Pit | `ash-pit` |
|
||
| Aschenfelder | Ashen Fields | `ashen-fields` |
|
||
|
||
`Graufurt` is treated as a proper place name and remains unchanged for now.
|
||
|
||
### Monsters
|
||
|
||
| German / Previous Label | English Label | Suggested Key |
|
||
|---|---|---|
|
||
| Aschenratte | Ash Rat | `ash-rat` |
|
||
| Verwilderter Straßenhund | Feral Road Hound | `feral-road-hound` |
|
||
| Straßenräuber | Road Bandit | `road-bandit` |
|
||
| Verkohlter Plünderer | Charred Raider | `charred-raider` |
|
||
| Plünderer-Späher | Raider Scout | `raider-scout` |
|
||
| Plünderer-Veteran | Raider Veteran | `raider-veteran` |
|
||
| Aschenwühler | Ash Burrower | `ash-burrower` |
|
||
| Verbrannter Jagdhund | Burned Hound | `burned-hound` |
|
||
| Hauptmann der Aschenbande | Captain of the Ashen Band | `ashen-band-captain` |
|
||
|
||
### Core combat actions
|
||
|
||
- Attack
|
||
- Heavy Strike
|
||
- Shield Bash
|
||
- Defend
|
||
- Potion
|
||
- Flee
|
||
|
||
### Navigation
|
||
|
||
- Map
|
||
- Hunt
|
||
- Quests
|
||
- Inventory
|
||
- Character
|
||
- Shop
|
||
|
||
### Common UI
|
||
|
||
- Current Location
|
||
- Travel
|
||
- Begin Travel
|
||
- Begin Hunt
|
||
- Search Again
|
||
- Attack
|
||
- Back
|
||
- Loot
|
||
- Equip
|
||
- Unequip
|
||
- Reputation
|
||
- World Renown
|
||
- Silver
|
||
- Required Reputation
|
||
- Bag Capacity
|
||
|
||
### Danger labels
|
||
|
||
- Weak
|
||
- Suitable
|
||
- Strong
|
||
- Very Dangerous
|
||
- Deadly
|
||
|
||
---
|
||
|
||
## 6. Existing item names
|
||
|
||
At minimum, currently seeded or visible Tier-1 items should use English display names.
|
||
|
||
Recommended names:
|
||
|
||
- Worn Shortsword
|
||
- Bandit Blade
|
||
- Ashen Blade
|
||
- Bandit Hood
|
||
- Reinforced Leather Jacket
|
||
- Plunderer Gloves
|
||
- Watchman's Leggings
|
||
- Ashen Boots
|
||
- Mark of the Border Watch
|
||
- Charred Captain's Pendant
|
||
|
||
Do not rename stable item keys merely to make them prettier. Only display values should be changed unless the old key is clearly temporary and no persisted references depend on it.
|
||
|
||
---
|
||
|
||
## 7. Combat log language
|
||
|
||
All newly generated combat events must resolve to English text.
|
||
|
||
Examples:
|
||
|
||
```text
|
||
Round 2
|
||
You use Shield Bash.
|
||
Road Bandit takes 12 damage.
|
||
Road Bandit's Heavy Strike is interrupted.
|
||
```
|
||
|
||
```text
|
||
Feral Road Hound bites you for 9 damage.
|
||
You are Bleeding for 2 rounds.
|
||
```
|
||
|
||
Combat event persistence should continue to prefer structured event data over storing fully rendered localized strings wherever possible.
|
||
|
||
---
|
||
|
||
## 8. UI text architecture
|
||
|
||
Do not build a full translation database in this slice.
|
||
|
||
For static Angular UI text, it is acceptable to use centralized constants or a lightweight text map where useful.
|
||
|
||
For persisted game content, keep:
|
||
|
||
```text
|
||
key
|
||
name
|
||
shortDescription / description
|
||
```
|
||
|
||
with English values.
|
||
|
||
A future localization layer may introduce translations without changing the content key.
|
||
|
||
---
|
||
|
||
## 9. Error messages
|
||
|
||
Domain error `code` values remain technical and stable.
|
||
|
||
Example:
|
||
|
||
```json
|
||
{
|
||
"code": "BAG_CAPACITY_EXCEEDED",
|
||
"message": "You cannot carry any more hides."
|
||
}
|
||
```
|
||
|
||
The player-facing `message` is English.
|
||
|
||
---
|
||
|
||
## 10. Migration / seed behavior
|
||
|
||
If names and descriptions are stored in PostgreSQL:
|
||
|
||
- update existing rows by stable `key`
|
||
- do not delete and recreate content rows unnecessarily
|
||
- preserve UUIDs
|
||
- preserve character inventory references
|
||
- keep migrations idempotent where appropriate
|
||
|
||
If seed files own the content, update both the seed definitions and the existing database through a controlled migration/update step.
|
||
|
||
---
|
||
|
||
## 11. Tests
|
||
|
||
Add or update tests so that:
|
||
|
||
- current location API returns English names
|
||
- hunt encounters return English monster names
|
||
- combat UI renders English action labels
|
||
- combat log contains English player-facing text
|
||
- inventory uses English item names
|
||
- no existing test expects German display text
|
||
|
||
A simple development-only grep may be used to identify obvious German UI remnants, but it is not a substitute for actual runtime verification.
|
||
|
||
---
|
||
|
||
## 12. Acceptance Criteria
|
||
|
||
This slice is complete when:
|
||
|
||
- [ ] The complete currently playable flow contains no intentional German player-facing text.
|
||
- [ ] Existing content IDs and player state remain valid.
|
||
- [ ] Locations, monsters and items use English display names.
|
||
- [ ] Combat actions and combat log are English.
|
||
- [ ] Navigation and common system messages are English.
|
||
- [ ] New stable content keys follow English/language-neutral slug conventions.
|
||
- [ ] No large localization framework was introduced.
|
||
- [ ] All existing tests pass.
|
||
|
||
---
|
||
|
||
## 13. Explicitly Out of Scope
|
||
|
||
Do not implement yet:
|
||
|
||
- German/English language switch
|
||
- browser language detection
|
||
- translation management UI
|
||
- translation tables for every content entity
|
||
- Crowdin / Phrase / Lokalise integration
|
||
- automatic machine translation
|
||
|
||
The only required runtime language after this slice is **English**.
|