sprites
BIN
art/sprites/player/female/attack/warrior_attack_000.png
Normal file
|
After Width: | Height: | Size: 339 KiB |
BIN
art/sprites/player/female/attack/warrior_attack_001.png
Normal file
|
After Width: | Height: | Size: 339 KiB |
BIN
art/sprites/player/female/attack/warrior_attack_002.png
Normal file
|
After Width: | Height: | Size: 353 KiB |
BIN
art/sprites/player/female/attack/warrior_attack_003.png
Normal file
|
After Width: | Height: | Size: 356 KiB |
BIN
art/sprites/player/female/attack/warrior_attack_004.png
Normal file
|
After Width: | Height: | Size: 360 KiB |
BIN
art/sprites/player/female/attack/warrior_attack_005.png
Normal file
|
After Width: | Height: | Size: 348 KiB |
BIN
art/sprites/player/female/hit/warrior_hit_000.png
Normal file
|
After Width: | Height: | Size: 385 KiB |
BIN
art/sprites/player/female/hit/warrior_hit_001.png
Normal file
|
After Width: | Height: | Size: 401 KiB |
BIN
art/sprites/player/female/hit/warrior_hit_002.png
Normal file
|
After Width: | Height: | Size: 416 KiB |
BIN
art/sprites/player/female/hit/warrior_hit_003.png
Normal file
|
After Width: | Height: | Size: 416 KiB |
BIN
art/sprites/player/female/hit/warrior_hit_004.png
Normal file
|
After Width: | Height: | Size: 404 KiB |
BIN
art/sprites/player/female/hit/warrior_hit_005.png
Normal file
|
After Width: | Height: | Size: 400 KiB |
BIN
art/sprites/player/male/attack/warrior_attack_000.png
Normal file
|
After Width: | Height: | Size: 324 KiB |
BIN
art/sprites/player/male/attack/warrior_attack_001.png
Normal file
|
After Width: | Height: | Size: 321 KiB |
BIN
art/sprites/player/male/attack/warrior_attack_002.png
Normal file
|
After Width: | Height: | Size: 321 KiB |
BIN
art/sprites/player/male/attack/warrior_attack_003.png
Normal file
|
After Width: | Height: | Size: 321 KiB |
BIN
art/sprites/player/male/attack/warrior_attack_004.png
Normal file
|
After Width: | Height: | Size: 318 KiB |
BIN
art/sprites/player/male/attack/warrior_attack_005.png
Normal file
|
After Width: | Height: | Size: 319 KiB |
BIN
art/sprites/player/male/hit/warrior_hit_000.png
Normal file
|
After Width: | Height: | Size: 366 KiB |
BIN
art/sprites/player/male/hit/warrior_hit_001.png
Normal file
|
After Width: | Height: | Size: 353 KiB |
BIN
art/sprites/player/male/hit/warrior_hit_002.png
Normal file
|
After Width: | Height: | Size: 375 KiB |
BIN
art/sprites/player/male/hit/warrior_hit_003.png
Normal file
|
After Width: | Height: | Size: 360 KiB |
BIN
art/sprites/player/male/hit/warrior_hit_004.png
Normal file
|
After Width: | Height: | Size: 340 KiB |
BIN
art/sprites/player/male/hit/warrior_hit_005.png
Normal file
|
After Width: | Height: | Size: 368 KiB |
@@ -0,0 +1,283 @@
|
||||
# Ashen Realms – Playable Slice 0.11: Grenzmarken & First Merchant
|
||||
|
||||
**Status:** Ready for implementation
|
||||
**Prerequisite:** Playable Slice 0.10 – First NPC & Quest
|
||||
**Scope:** First regional currency and targeted merchant progression
|
||||
**Currency:** Grenzmarken
|
||||
**Next Slice:** Playable Slice 0.12 – Aschenfelder Complete
|
||||
|
||||
## 1. Goal
|
||||
|
||||
Implement the first anti-frustration progression system.
|
||||
|
||||
The core philosophy is:
|
||||
|
||||
> Drops create excitement. Regional currency prevents frustration.
|
||||
|
||||
The player can earn Grenzmarken through normal progression and use them to buy targeted Tier-1 upgrades.
|
||||
|
||||
## 2. Grenzmarken
|
||||
|
||||
Implement persistent:
|
||||
|
||||
```text
|
||||
Grenzmarken
|
||||
```
|
||||
|
||||
Sources include existing configured rewards such as:
|
||||
|
||||
```text
|
||||
Quests
|
||||
rare enemies
|
||||
stronger enemies
|
||||
Elite
|
||||
Boss
|
||||
```
|
||||
|
||||
Use the current balancing/content definitions as the source of truth.
|
||||
|
||||
## 3. Currency model
|
||||
|
||||
At this stage a reusable currency model may become worthwhile.
|
||||
|
||||
Conceptually:
|
||||
|
||||
```text
|
||||
CurrencyDefinition
|
||||
CharacterCurrency
|
||||
```
|
||||
|
||||
Example stable keys:
|
||||
|
||||
```text
|
||||
silver
|
||||
border-marks
|
||||
```
|
||||
|
||||
If Silver is already safely represented directly on Character, do not force a risky large migration solely for architectural purity.
|
||||
|
||||
The important requirement is that Grenzmarken are persistent and server-authoritative.
|
||||
|
||||
## 4. Merchant
|
||||
|
||||
Introduce the first regional merchant at the appropriate existing NPC/location.
|
||||
|
||||
Use existing project content if a merchant NPC/location has already been defined.
|
||||
|
||||
Minimal merchant data:
|
||||
|
||||
```text
|
||||
ShopDefinition
|
||||
ShopOffer
|
||||
```
|
||||
|
||||
A ShopOffer should determine:
|
||||
|
||||
```text
|
||||
item
|
||||
currency
|
||||
price
|
||||
availability
|
||||
```
|
||||
|
||||
## 5. Grenzmarken offers
|
||||
|
||||
Use the established prices:
|
||||
|
||||
| Item | Price |
|
||||
|---|---:|
|
||||
| Räuberhaube | 5 Grenzmarken |
|
||||
| Plündererhandschuhe | 6 Grenzmarken |
|
||||
| Wachmannsbeinkleid | 8 Grenzmarken |
|
||||
| Verstärkte Lederjacke | 10 Grenzmarken |
|
||||
| Aschenklinge | 15 Grenzmarken |
|
||||
|
||||
Do not silently rebalance these prices in this implementation slice.
|
||||
|
||||
## 6. Shop API
|
||||
|
||||
Use the existing REST conventions.
|
||||
|
||||
Conceptually:
|
||||
|
||||
```http
|
||||
GET /api/shops/:shopId
|
||||
POST /api/shops/:shopId/purchases
|
||||
```
|
||||
|
||||
Purchase request:
|
||||
|
||||
```json
|
||||
{
|
||||
"offerId": "uuid"
|
||||
}
|
||||
```
|
||||
|
||||
Do not accept authoritative client values such as:
|
||||
|
||||
```text
|
||||
price
|
||||
itemId
|
||||
currency amount
|
||||
discount
|
||||
```
|
||||
|
||||
The server derives them from the persisted offer.
|
||||
|
||||
## 7. Purchase transaction
|
||||
|
||||
A purchase must be atomic:
|
||||
|
||||
```text
|
||||
load character currency
|
||||
↓
|
||||
load and validate offer
|
||||
↓
|
||||
validate balance
|
||||
↓
|
||||
subtract Grenzmarken
|
||||
↓
|
||||
create CharacterItem
|
||||
↓
|
||||
commit
|
||||
```
|
||||
|
||||
If the transaction fails, neither the currency deduction nor the item grant should remain partially applied.
|
||||
|
||||
## 8. Ownership and duplicate items
|
||||
|
||||
Purchased equipment becomes normal persistent CharacterItem data.
|
||||
|
||||
Duplicates are allowed.
|
||||
|
||||
Do not implement:
|
||||
|
||||
```text
|
||||
salvaging
|
||||
buyback
|
||||
duplicate conversion
|
||||
pity conversion
|
||||
```
|
||||
|
||||
## 9. Merchant UI
|
||||
|
||||
Show:
|
||||
|
||||
- merchant/NPC presentation
|
||||
- current Grenzmarken balance
|
||||
- available offers
|
||||
- item icon
|
||||
- item name
|
||||
- item stats
|
||||
- price
|
||||
- affordability
|
||||
- purchase action
|
||||
|
||||
Reuse the item display and comparison language from Inventory where possible.
|
||||
|
||||
## 10. Purchase feedback
|
||||
|
||||
After purchase:
|
||||
|
||||
```text
|
||||
Grenzmarken balance decreases
|
||||
↓
|
||||
item appears in inventory
|
||||
↓
|
||||
player may open inventory
|
||||
↓
|
||||
player may equip item
|
||||
```
|
||||
|
||||
Do not automatically equip purchased equipment.
|
||||
|
||||
## 11. Progression proof
|
||||
|
||||
The important flow is:
|
||||
|
||||
```text
|
||||
desired drop does not appear
|
||||
↓
|
||||
player keeps playing
|
||||
↓
|
||||
Grenzmarken accumulate
|
||||
↓
|
||||
merchant provides targeted upgrade
|
||||
```
|
||||
|
||||
The player should always feel that unlucky drops still produce progress.
|
||||
|
||||
## 12. Server authority
|
||||
|
||||
The server decides:
|
||||
|
||||
- currency balance
|
||||
- reward grants
|
||||
- offer availability
|
||||
- offer price
|
||||
- purchase validity
|
||||
- resulting item ownership
|
||||
|
||||
Angular only requests purchase of a valid server-provided `offerId`.
|
||||
|
||||
## 13. Explicit non-goals
|
||||
|
||||
Do not implement:
|
||||
|
||||
```text
|
||||
selling
|
||||
buyback
|
||||
dynamic prices
|
||||
limited stock
|
||||
shop refresh timers
|
||||
player trading
|
||||
auction house
|
||||
discount systems
|
||||
reputation
|
||||
crafting vendor
|
||||
```
|
||||
|
||||
## 14. Required tests
|
||||
|
||||
Verify:
|
||||
|
||||
- Grenzmarken rewards persist
|
||||
- current balance is server-authoritative
|
||||
- shop returns persisted offers
|
||||
- insufficient balance rejects purchase
|
||||
- valid purchase deducts exact configured cost
|
||||
- valid purchase grants the correct CharacterItem
|
||||
- purchase is transactional
|
||||
- repeated request cannot accidentally duplicate a single transaction through race conditions
|
||||
- item survives refresh
|
||||
- purchased item can be equipped using existing equipment flow
|
||||
|
||||
## 15. Definition of Done
|
||||
|
||||
The player can:
|
||||
|
||||
```text
|
||||
earn Grenzmarken
|
||||
↓
|
||||
see balance
|
||||
↓
|
||||
open merchant
|
||||
↓
|
||||
inspect offers
|
||||
↓
|
||||
buy targeted Tier-1 item
|
||||
↓
|
||||
item enters inventory
|
||||
↓
|
||||
equip item
|
||||
```
|
||||
|
||||
Random loot and guaranteed long-term progression are now connected.
|
||||
|
||||
## 16. Handoff
|
||||
|
||||
Next:
|
||||
|
||||
```text
|
||||
Playable Slice 0.12 – Aschenfelder Complete
|
||||
```
|
||||
@@ -0,0 +1,490 @@
|
||||
# Ashen Realms – Playable Slice 0.12: Aschenfelder Complete
|
||||
|
||||
**Status:** Final integration slice for the first region
|
||||
**Prerequisite:** Playable Slices 0.1–0.11
|
||||
**Scope:** Integration, balancing, content completion and polish for the Aschenfelder
|
||||
**Primary Goal:** Complete the first genuinely playable regional progression loop.
|
||||
|
||||
## 1. Goal
|
||||
|
||||
Playable Slice 0.12 does not introduce a large new system.
|
||||
|
||||
It integrates, verifies, balances, and polishes everything built so far into one coherent first region.
|
||||
|
||||
The full intended flow is:
|
||||
|
||||
```text
|
||||
Graufurt
|
||||
↓
|
||||
Südtor
|
||||
↓
|
||||
Verbrannte Straße
|
||||
↓
|
||||
first hunts
|
||||
↓
|
||||
first combat
|
||||
↓
|
||||
first loot
|
||||
↓
|
||||
first upgrades
|
||||
↓
|
||||
Verlassener Wachtposten
|
||||
↓
|
||||
NPC / Quest
|
||||
↓
|
||||
stronger enemies
|
||||
↓
|
||||
first Elite
|
||||
↓
|
||||
Grenzmarken
|
||||
↓
|
||||
targeted upgrades
|
||||
↓
|
||||
Aschengrube
|
||||
↓
|
||||
regional Boss
|
||||
↓
|
||||
guaranteed boss loot
|
||||
↓
|
||||
path toward Dämmerwald discovered
|
||||
```
|
||||
|
||||
## 2. Complete locations
|
||||
|
||||
The Aschenfelder progression contains:
|
||||
|
||||
```text
|
||||
Südtor von Graufurt
|
||||
Verbrannte Straße
|
||||
Verlassener Wachtposten
|
||||
Aschengrube
|
||||
```
|
||||
|
||||
Each location must have a clear purpose and correct travel connections.
|
||||
|
||||
## 3. Complete Tier-1 enemy set
|
||||
|
||||
The relevant first-region pool should now include the established enemies:
|
||||
|
||||
```text
|
||||
Aschenratte
|
||||
Verwilderter Straßenhund
|
||||
Straßenräuber
|
||||
Plünderer-Späher
|
||||
Plünderer-Veteran
|
||||
Verkohlter Plünderer
|
||||
Aschenwühler
|
||||
Verbrannter Jagdhund
|
||||
Plündererhauptmann / Elite
|
||||
Hauptmann der Aschenbande / Boss
|
||||
```
|
||||
|
||||
If final naming differs in existing project content, preserve the existing finalized names rather than creating duplicates.
|
||||
|
||||
## 4. Complete Tier-1 item set
|
||||
|
||||
The relevant Tier-1 pool should now include:
|
||||
|
||||
```text
|
||||
Abgenutztes Kurzschwert
|
||||
Räuberklinge
|
||||
Aschenklinge
|
||||
Räuberhaube
|
||||
Verstärkte Lederjacke
|
||||
Plündererhandschuhe
|
||||
Wachmannsbeinkleid
|
||||
Aschenstiefel
|
||||
Zeichen der Grenzwacht
|
||||
Anhänger des verbrannten Hauptmanns
|
||||
```
|
||||
|
||||
Not every item must be required for progression.
|
||||
|
||||
Prestige/special drops remain optional.
|
||||
|
||||
## 5. Combat duration targets
|
||||
|
||||
During the balancing pass, verify:
|
||||
|
||||
### Normal enemies
|
||||
|
||||
```text
|
||||
4–8 rounds
|
||||
```
|
||||
|
||||
### Elite
|
||||
|
||||
```text
|
||||
6–10 rounds
|
||||
```
|
||||
|
||||
### Boss
|
||||
|
||||
```text
|
||||
8–14 rounds
|
||||
```
|
||||
|
||||
These are balancing targets rather than hard rules.
|
||||
|
||||
## 6. Power progression targets
|
||||
|
||||
Use the established Combat Power progression as a reference:
|
||||
|
||||
### Start
|
||||
|
||||
```text
|
||||
approximately 47 CP
|
||||
```
|
||||
|
||||
### After first upgrades
|
||||
|
||||
```text
|
||||
approximately 60–70 CP
|
||||
```
|
||||
|
||||
### Wachtposten progression
|
||||
|
||||
```text
|
||||
approximately 80–90 CP
|
||||
```
|
||||
|
||||
### Aschengrube / boss-ready range
|
||||
|
||||
```text
|
||||
approximately 100–110 CP
|
||||
```
|
||||
|
||||
Combat Power is an internal balancing tool, not a hard access gate.
|
||||
|
||||
## 7. Progression pacing
|
||||
|
||||
A typical player should need roughly:
|
||||
|
||||
```text
|
||||
12–18 normal combats
|
||||
+
|
||||
quests
|
||||
+
|
||||
boss
|
||||
```
|
||||
|
||||
to progress meaningfully through the first region.
|
||||
|
||||
The intended experience must not require 50+ normal combats for basic progression.
|
||||
|
||||
## 8. First upgrade pacing
|
||||
|
||||
Verify that within approximately the first:
|
||||
|
||||
```text
|
||||
3–5 combats
|
||||
```
|
||||
|
||||
the player is very likely to see a meaningful equipment upgrade.
|
||||
|
||||
If this does not happen reliably enough, tune only the smallest necessary variables:
|
||||
|
||||
```text
|
||||
drop rate
|
||||
quest reward
|
||||
starter equipment
|
||||
```
|
||||
|
||||
Do not add unnecessary new reward systems.
|
||||
|
||||
## 9. Boss readiness
|
||||
|
||||
The regional boss should become reasonably beatable at approximately:
|
||||
|
||||
```text
|
||||
70–80% of maximum realistically obtainable regional power
|
||||
```
|
||||
|
||||
Best-in-slot equipment should provide comfort and completionist value, not be mandatory.
|
||||
|
||||
## 10. Soft-gate validation
|
||||
|
||||
The player should not be blocked primarily by arbitrary level errors.
|
||||
|
||||
Where possible:
|
||||
|
||||
```text
|
||||
actual world danger
|
||||
```
|
||||
|
||||
should communicate that the player is too weak.
|
||||
|
||||
A player may attempt difficult content early, but the game should make the risk clear.
|
||||
|
||||
## 11. Full UI consistency pass
|
||||
|
||||
Review all implemented screens together:
|
||||
|
||||
```text
|
||||
World
|
||||
Hunt
|
||||
Combat
|
||||
Loot
|
||||
Inventory
|
||||
Quests
|
||||
Merchant
|
||||
```
|
||||
|
||||
Verify consistency of:
|
||||
|
||||
```text
|
||||
Topbar
|
||||
SideNavigation
|
||||
Footer
|
||||
Context Panel
|
||||
Panel frames
|
||||
Buttons
|
||||
DangerBadges
|
||||
Item icons
|
||||
Combat actions
|
||||
Typography
|
||||
Spacing
|
||||
Design tokens
|
||||
```
|
||||
|
||||
No screen should feel like a separate web application.
|
||||
|
||||
## 12. Loading and error-state pass
|
||||
|
||||
All core player actions need intentional UI states:
|
||||
|
||||
```text
|
||||
loading
|
||||
success
|
||||
domain error
|
||||
network error
|
||||
retry
|
||||
```
|
||||
|
||||
Review at minimum:
|
||||
|
||||
```text
|
||||
Travel
|
||||
Hunt
|
||||
Combat Action
|
||||
Reward
|
||||
Equip
|
||||
Quest
|
||||
Purchase
|
||||
```
|
||||
|
||||
Do not use browser alerts.
|
||||
|
||||
## 13. Refresh and recovery pass
|
||||
|
||||
The following states must survive browser refresh through authoritative backend state:
|
||||
|
||||
```text
|
||||
active travel
|
||||
current hunt
|
||||
active combat
|
||||
finished combat/reward
|
||||
inventory
|
||||
equipment
|
||||
active quest
|
||||
Grenzmarken
|
||||
boss completion
|
||||
```
|
||||
|
||||
No critical gameplay state may exist only in Angular memory.
|
||||
|
||||
## 14. Full integration test
|
||||
|
||||
Where practical, automate the first complete progression flow:
|
||||
|
||||
```text
|
||||
character starts at Südtor
|
||||
↓
|
||||
travel to Verbrannte Straße
|
||||
↓
|
||||
hunt
|
||||
↓
|
||||
combat
|
||||
↓
|
||||
win
|
||||
↓
|
||||
receive loot
|
||||
↓
|
||||
equip upgrade
|
||||
↓
|
||||
travel to Wachtposten
|
||||
↓
|
||||
accept quest
|
||||
↓
|
||||
defeat relevant enemies
|
||||
↓
|
||||
progress quest
|
||||
↓
|
||||
earn Grenzmarken
|
||||
↓
|
||||
buy targeted item
|
||||
↓
|
||||
equip item
|
||||
↓
|
||||
travel to Aschengrube
|
||||
↓
|
||||
defeat boss
|
||||
↓
|
||||
receive guaranteed boss reward
|
||||
↓
|
||||
region completion persists
|
||||
```
|
||||
|
||||
## 15. Manual playtest – average RNG
|
||||
|
||||
Perform at least one normal playthrough and measure:
|
||||
|
||||
```text
|
||||
combat duration
|
||||
loot frequency
|
||||
upgrade frequency
|
||||
number of hunts
|
||||
travel flow
|
||||
quest pacing
|
||||
Grenzmarken income
|
||||
boss readiness
|
||||
total region time
|
||||
```
|
||||
|
||||
## 16. Manual playtest – bad RNG
|
||||
|
||||
Test a deliberately unlucky run.
|
||||
|
||||
Verify:
|
||||
|
||||
```text
|
||||
Grenzmarken still provide progress
|
||||
progression does not hard-block
|
||||
boss readiness remains achievable
|
||||
player does not require extreme grind
|
||||
```
|
||||
|
||||
## 17. Manual playtest – good RNG
|
||||
|
||||
Test a deliberately lucky run.
|
||||
|
||||
Verify:
|
||||
|
||||
```text
|
||||
region does not become instantly trivial
|
||||
progression cannot be skipped too aggressively
|
||||
boss remains meaningful
|
||||
```
|
||||
|
||||
## 18. Data/content validation
|
||||
|
||||
Verify:
|
||||
|
||||
- all locations use persisted content
|
||||
- all encounter pools use persisted relationships
|
||||
- all loot is data-driven
|
||||
- all shop offers are data-driven
|
||||
- quest definitions are persisted/data-driven
|
||||
- no core gameplay path depends on hardcoded Angular content
|
||||
- no server domain service contains unnecessary location-specific special cases
|
||||
|
||||
## 19. Server-authority validation
|
||||
|
||||
Confirm that the backend remains authoritative for:
|
||||
|
||||
```text
|
||||
travel
|
||||
hunt availability
|
||||
encounter generation
|
||||
danger rating
|
||||
combat
|
||||
loot
|
||||
XP
|
||||
Silver
|
||||
Grenzmarken
|
||||
inventory ownership
|
||||
equipment
|
||||
effective stats
|
||||
quest progress
|
||||
shop purchases
|
||||
boss completion
|
||||
```
|
||||
|
||||
## 20. Performance / technical cleanup
|
||||
|
||||
Review the accumulated implementation for:
|
||||
|
||||
- duplicate API calls
|
||||
- duplicated frontend state
|
||||
- duplicated domain validation
|
||||
- unused temporary placeholder logic
|
||||
- obsolete Slice 0.1–0.5 shortcuts
|
||||
- hardcoded demo combat stats that should now use CharacterStatsService
|
||||
- temporary combat placeholder routes
|
||||
- duplicated item definitions
|
||||
- migration quality
|
||||
- seed idempotency
|
||||
|
||||
Do not perform unrelated architectural rewrites.
|
||||
|
||||
## 21. Definition of Done
|
||||
|
||||
Playable Slice 0.12 / Aschenfelder Complete is complete when a fresh character can, without developer intervention:
|
||||
|
||||
```text
|
||||
start
|
||||
↓
|
||||
travel
|
||||
↓
|
||||
hunt
|
||||
↓
|
||||
fight
|
||||
↓
|
||||
receive loot
|
||||
↓
|
||||
improve equipment
|
||||
↓
|
||||
meet NPC
|
||||
↓
|
||||
complete quest
|
||||
↓
|
||||
fight Elite
|
||||
↓
|
||||
earn Grenzmarken
|
||||
↓
|
||||
buy targeted item
|
||||
↓
|
||||
reach Aschengrube
|
||||
↓
|
||||
defeat regional Boss
|
||||
↓
|
||||
receive guaranteed progression reward
|
||||
↓
|
||||
discover path toward Dämmerwald
|
||||
```
|
||||
|
||||
## 22. Final product test
|
||||
|
||||
The most important qualitative result is:
|
||||
|
||||
> After completing the Aschenfelder, the player should want to see what waits in the Dämmerwald.
|
||||
|
||||
If the loop is technically correct but does not create that motivation, the region still needs iteration.
|
||||
|
||||
## 23. After Slice 0.12
|
||||
|
||||
Do not immediately expand into the full Dämmerwald.
|
||||
|
||||
First:
|
||||
|
||||
```text
|
||||
playtest
|
||||
measure
|
||||
balance
|
||||
fix friction
|
||||
validate reward pacing
|
||||
validate combat decisions
|
||||
validate boss readiness
|
||||
```
|
||||
|
||||
Only after the first region loop works well should the same systems be expanded into the Dämmerwald and later the Vergessene Ruinen.
|
||||
@@ -0,0 +1,227 @@
|
||||
# Ashen Realms – Playable Slice 0.6: Full First Combat
|
||||
|
||||
**Status:** Ready for implementation
|
||||
**Prerequisite:** Playable Slice 0.5 – First Upgrade
|
||||
**Scope:** First complete tactical combat action set
|
||||
**Next Slice:** Playable Slice 0.7 – Complete Verbrannte Straße
|
||||
|
||||
## 1. Goal
|
||||
|
||||
Playable Slice 0.6 turns the technical `ATTACK`-only fight into the first real Ashen Realms combat with meaningful player decisions.
|
||||
|
||||
The player loop becomes:
|
||||
|
||||
```text
|
||||
Encounter
|
||||
→ Combat
|
||||
→ recognize enemy intent
|
||||
→ choose appropriate action
|
||||
→ attack / defend / interrupt / heal
|
||||
→ win or lose
|
||||
```
|
||||
|
||||
The slice must prove that combat is more than repeatedly pressing Attack.
|
||||
|
||||
## 2. Player actions
|
||||
|
||||
Implement:
|
||||
|
||||
```text
|
||||
ATTACK
|
||||
HEAVY_STRIKE
|
||||
SHIELD_BASH
|
||||
DEFEND
|
||||
POTION
|
||||
```
|
||||
|
||||
### ATTACK
|
||||
- 100% normal damage.
|
||||
|
||||
### HEAVY_STRIKE
|
||||
- 160% normal damage.
|
||||
|
||||
### SHIELD_BASH
|
||||
- 70% normal damage.
|
||||
- Interrupts a prepared interruptible enemy action.
|
||||
|
||||
### DEFEND
|
||||
- Reduces incoming damage by 50% for the current round.
|
||||
|
||||
### POTION
|
||||
- Heals 35% of maximum HP.
|
||||
- Uses the player's action for the round.
|
||||
- Cannot heal beyond max HP.
|
||||
|
||||
## 3. Combat bag
|
||||
|
||||
For V1, each combat starts with:
|
||||
|
||||
```text
|
||||
2 healing potions
|
||||
```
|
||||
|
||||
For this slice, the combat bag may remain part of the Combat snapshot if connecting it to persistent consumable inventory would unnecessarily expand scope.
|
||||
|
||||
Do not implement a complete consumable inventory economy yet.
|
||||
|
||||
## 4. Telegraphing
|
||||
|
||||
Enemies must be able to prepare dangerous actions.
|
||||
|
||||
Example:
|
||||
|
||||
```text
|
||||
Straßenräuber bereitet Schweren Hieb vor.
|
||||
```
|
||||
|
||||
The next player decision may be:
|
||||
|
||||
```text
|
||||
ATTACK
|
||||
DEFEND
|
||||
SHIELD_BASH
|
||||
HEAVY_STRIKE
|
||||
POTION
|
||||
```
|
||||
|
||||
A prepared action must be visible before the player chooses the next action.
|
||||
|
||||
## 5. Enemy intent
|
||||
|
||||
Extend combat state so the monster can expose a prepared intent.
|
||||
|
||||
Conceptually:
|
||||
|
||||
```ts
|
||||
monsterState: {
|
||||
pendingAction?: CombatIntent;
|
||||
}
|
||||
```
|
||||
|
||||
Initial intent types may include:
|
||||
|
||||
```text
|
||||
NORMAL_ATTACK
|
||||
HEAVY_ATTACK
|
||||
```
|
||||
|
||||
Keep the model extensible without implementing future mechanics prematurely.
|
||||
|
||||
## 6. Straßenräuber behavior
|
||||
|
||||
The Straßenräuber becomes the first real learning enemy.
|
||||
|
||||
Basic behavior:
|
||||
|
||||
```text
|
||||
normal attack
|
||||
↓
|
||||
occasionally prepare Heavy Attack
|
||||
↓
|
||||
resolve Heavy Attack on the following round
|
||||
```
|
||||
|
||||
`SHIELD_BASH` can interrupt the prepared Heavy Attack.
|
||||
|
||||
`DEFEND` can mitigate it.
|
||||
|
||||
The player may also intentionally accept the risk and attack.
|
||||
|
||||
## 7. Combat UI
|
||||
|
||||
The action bar should now show:
|
||||
|
||||
```text
|
||||
[ Angriff ]
|
||||
[ Schwerer Hieb ]
|
||||
[ Schildstoß ]
|
||||
[ Verteidigen ]
|
||||
[ Trank 2/2 ]
|
||||
```
|
||||
|
||||
The combat screen must clearly display:
|
||||
|
||||
- player HP
|
||||
- monster HP
|
||||
- current round
|
||||
- enemy intent / telegraph
|
||||
- combat log
|
||||
- available actions
|
||||
- disabled/loading action states
|
||||
|
||||
Telegraphing must be more visually prominent than a normal combat log line.
|
||||
|
||||
## 8. Server authority
|
||||
|
||||
The server decides:
|
||||
|
||||
- action validity
|
||||
- damage
|
||||
- healing
|
||||
- potion count
|
||||
- defend mitigation
|
||||
- interrupt success
|
||||
- enemy intent
|
||||
- monster action
|
||||
- combat result
|
||||
|
||||
The client sends only the selected action enum.
|
||||
|
||||
## 9. Explicit non-goals
|
||||
|
||||
Do not implement yet:
|
||||
|
||||
```text
|
||||
Bleeding
|
||||
Poison
|
||||
Mana
|
||||
Crit
|
||||
Dodge
|
||||
Block Chance
|
||||
Cooldown system
|
||||
Sets
|
||||
Boss phases
|
||||
Flee
|
||||
Elemental damage
|
||||
Resistances
|
||||
```
|
||||
|
||||
## 10. Required tests
|
||||
|
||||
At minimum verify:
|
||||
|
||||
- `ATTACK` uses 100% damage.
|
||||
- `HEAVY_STRIKE` uses 160% damage.
|
||||
- `SHIELD_BASH` uses 70% damage.
|
||||
- `SHIELD_BASH` interrupts a prepared interruptible action.
|
||||
- `DEFEND` halves incoming damage for the round.
|
||||
- `POTION` heals 35% max HP.
|
||||
- Potion healing cannot exceed max HP.
|
||||
- Only two potions are available in a combat.
|
||||
- A telegraphed attack resolves on the next round if not interrupted.
|
||||
- A killed monster does not resolve a pending attack.
|
||||
- Combat remains deterministic.
|
||||
|
||||
## 11. Definition of Done
|
||||
|
||||
The player can fight a Straßenräuber and encounter a situation such as:
|
||||
|
||||
```text
|
||||
Schwerer Angriff angekündigt
|
||||
↓
|
||||
Verteidigen
|
||||
or
|
||||
Schildstoß
|
||||
or
|
||||
Risiko eingehen
|
||||
```
|
||||
|
||||
The combat is no longer just repeated use of `ATTACK`.
|
||||
|
||||
## 12. Handoff
|
||||
|
||||
Next:
|
||||
|
||||
```text
|
||||
Playable Slice 0.7 – Complete Verbrannte Straße
|
||||
```
|
||||
@@ -0,0 +1,235 @@
|
||||
# Ashen Realms – Playable Slice 0.7: Complete Verbrannte Straße
|
||||
|
||||
**Status:** Ready for implementation
|
||||
**Prerequisite:** Playable Slice 0.6 – Full First Combat
|
||||
**Scope:** First fully playable hunting location
|
||||
**Primary Location:** Verbrannte Straße
|
||||
**Next Slice:** Playable Slice 0.8 – Wachtposten & First Elite
|
||||
|
||||
## 1. Goal
|
||||
|
||||
Turn the technical hunting location into the first complete gameplay location.
|
||||
|
||||
The Verbrannte Straße must support repeated hunting, multiple enemy archetypes, differentiated mechanics, meaningful loot, and the first visible progression through equipment.
|
||||
|
||||
## 2. Complete encounter pool
|
||||
|
||||
The hunting pool becomes:
|
||||
|
||||
```text
|
||||
Aschenratte
|
||||
Verwilderter Straßenhund
|
||||
Straßenräuber
|
||||
Verkohlter Plünderer – rare
|
||||
```
|
||||
|
||||
## 3. Aschenratte
|
||||
|
||||
Role:
|
||||
|
||||
- Level 1.
|
||||
- Basic enemy.
|
||||
- No special mechanic required.
|
||||
|
||||
Rewards:
|
||||
|
||||
```text
|
||||
4–7 Silver
|
||||
8 XP
|
||||
60% Aschenfell / trade material
|
||||
8% simple starter-slot equipment
|
||||
```
|
||||
|
||||
## 4. Verwilderter Straßenhund
|
||||
|
||||
Role:
|
||||
|
||||
- Level 1–2.
|
||||
- Introduces the first simple status effect.
|
||||
|
||||
Mechanic:
|
||||
|
||||
```text
|
||||
BLEED
|
||||
```
|
||||
|
||||
Keep Bleed deliberately simple:
|
||||
|
||||
- fixed duration
|
||||
- fixed damage
|
||||
- no complex stacking
|
||||
- server-authoritative
|
||||
- represented through structured combat state/events
|
||||
|
||||
Rewards:
|
||||
|
||||
```text
|
||||
6–10 Silver
|
||||
12 XP
|
||||
70% Zähes Fell
|
||||
8% Aschenstiefel
|
||||
5% Kleiner Heiltrank
|
||||
```
|
||||
|
||||
Do not implement the entire long-term consumable economy merely because a potion can drop.
|
||||
|
||||
## 5. Straßenräuber
|
||||
|
||||
Role:
|
||||
|
||||
- Level 2.
|
||||
- Reinforces Telegraphing.
|
||||
|
||||
Mechanic:
|
||||
|
||||
```text
|
||||
prepared Heavy Attack
|
||||
```
|
||||
|
||||
Rewards:
|
||||
|
||||
```text
|
||||
9–15 Silver
|
||||
16 XP
|
||||
18% Räuberklinge
|
||||
12% Räuberhaube
|
||||
8% Plündererhandschuhe
|
||||
10% Kleiner Heiltrank
|
||||
```
|
||||
|
||||
## 6. Verkohlter Plünderer
|
||||
|
||||
Role:
|
||||
|
||||
- Level 3.
|
||||
- Rare encounter.
|
||||
- Noticeably stronger.
|
||||
- Early long-term target.
|
||||
|
||||
Guaranteed:
|
||||
|
||||
```text
|
||||
25–35 Silver
|
||||
35 XP
|
||||
1 Grenzmarke
|
||||
```
|
||||
|
||||
Additional equipment drops use the existing balancing/content definitions.
|
||||
|
||||
The encounter should communicate:
|
||||
|
||||
> This enemy may be too strong right now, but the player can return later.
|
||||
|
||||
## 7. Encounter pool weights
|
||||
|
||||
All encounter probability belongs in persisted `LocationMonster` content.
|
||||
|
||||
Do not hardcode location-specific monster probabilities inside the HuntingService.
|
||||
|
||||
Conceptually:
|
||||
|
||||
```text
|
||||
Aschenratte common
|
||||
Straßenhund common
|
||||
Straßenräuber normal
|
||||
Verkohlter Plünderer rare
|
||||
```
|
||||
|
||||
Exact weights may be tuned later.
|
||||
|
||||
## 8. Grenzmarken
|
||||
|
||||
Slice 0.7 may begin persisting Grenzmarken as reward data because the rare enemy already grants one.
|
||||
|
||||
They do not need to be spendable yet.
|
||||
|
||||
Spending Grenzmarken belongs to Slice 0.11.
|
||||
|
||||
## 9. Progression target
|
||||
|
||||
Within approximately the first 3–5 combats, the player should have a high chance of seeing the first meaningful equipment upgrade.
|
||||
|
||||
The purpose is to prove:
|
||||
|
||||
```text
|
||||
hunt
|
||||
→ fight
|
||||
→ loot
|
||||
→ equip
|
||||
→ become stronger
|
||||
```
|
||||
|
||||
through repeated play at one location.
|
||||
|
||||
## 10. Hunt UI
|
||||
|
||||
The Hunt context panel should now communicate the broader enemy pool.
|
||||
|
||||
Example:
|
||||
|
||||
```text
|
||||
Mögliche Begegnungen
|
||||
|
||||
Aschenratte
|
||||
Verwilderter Straßenhund
|
||||
Straßenräuber
|
||||
???
|
||||
```
|
||||
|
||||
A rare enemy may remain hidden until first encountered.
|
||||
|
||||
Do not expose exact encounter percentages.
|
||||
|
||||
## 11. Explicit non-goals
|
||||
|
||||
Do not implement yet:
|
||||
|
||||
```text
|
||||
Quest
|
||||
NPC
|
||||
Wachtposten progression
|
||||
Boss
|
||||
Merchant
|
||||
Grenzmarken shop
|
||||
Area completion
|
||||
```
|
||||
|
||||
## 12. Required tests
|
||||
|
||||
Verify:
|
||||
|
||||
- all four monsters are persisted content
|
||||
- all four are assigned to `burned-road`
|
||||
- weighted selection remains deterministic in tests
|
||||
- rare encounter selection is supported
|
||||
- Bleed resolves correctly
|
||||
- Straßenräuber Telegraphing still works
|
||||
- loot tables match configured content
|
||||
- Grenzmarken can be persisted when granted
|
||||
- item upgrades remain persistent after reward flow
|
||||
|
||||
## 13. Definition of Done
|
||||
|
||||
The player can remain on the Verbrannte Straße and experience:
|
||||
|
||||
```text
|
||||
different encounters
|
||||
↓
|
||||
different mechanics
|
||||
↓
|
||||
different rewards
|
||||
↓
|
||||
first upgrades
|
||||
↓
|
||||
visibly increasing strength
|
||||
```
|
||||
|
||||
The location now feels like a real piece of the game rather than a technical test area.
|
||||
|
||||
## 14. Handoff
|
||||
|
||||
Next:
|
||||
|
||||
```text
|
||||
Playable Slice 0.8 – Wachtposten & First Elite
|
||||
```
|
||||
@@ -0,0 +1,238 @@
|
||||
# Ashen Realms – Playable Slice 0.8: Wachtposten & First Elite
|
||||
|
||||
**Status:** Ready for implementation
|
||||
**Prerequisite:** Playable Slice 0.7 – Complete Verbrannte Straße
|
||||
**Scope:** First progression inside a region and first elite challenge
|
||||
**Primary Location:** Verlassener Wachtposten
|
||||
**Next Slice:** Playable Slice 0.9 – Aschengrube & First Boss
|
||||
|
||||
## 1. Goal
|
||||
|
||||
Introduce the first meaningful progression from one dangerous location to another.
|
||||
|
||||
The player should reach a new location, encounter stronger enemies, discover an elite target, improve equipment, and return strong enough to defeat it.
|
||||
|
||||
## 2. New location
|
||||
|
||||
Add:
|
||||
|
||||
```text
|
||||
Verlassener Wachtposten
|
||||
```
|
||||
|
||||
Connection:
|
||||
|
||||
```text
|
||||
Verbrannte Straße
|
||||
↔
|
||||
Verlassener Wachtposten
|
||||
```
|
||||
|
||||
Travel duration:
|
||||
|
||||
```text
|
||||
approximately 15 seconds
|
||||
```
|
||||
|
||||
Travel remains server-authoritative.
|
||||
|
||||
## 3. Location functions
|
||||
|
||||
The Wachtposten should support:
|
||||
|
||||
```text
|
||||
Jagd beginnen
|
||||
Wachtposten untersuchen
|
||||
NPC visible
|
||||
travel back to Verbrannte Straße
|
||||
future travel toward Aschengrube
|
||||
```
|
||||
|
||||
The NPC may already be visually present, but full NPC/quest interaction is deferred to Slice 0.10.
|
||||
|
||||
## 4. Encounter pool
|
||||
|
||||
Use the existing world/content design as the source of truth.
|
||||
|
||||
Core enemies:
|
||||
|
||||
```text
|
||||
Straßenräuber
|
||||
Plünderer-Späher
|
||||
Plünderer-Veteran
|
||||
Plündererhauptmann
|
||||
```
|
||||
|
||||
## 5. Plünderer-Späher
|
||||
|
||||
Role:
|
||||
|
||||
- lighter humanoid enemy
|
||||
- familiar combat foundation
|
||||
- part of Wachtposten progression
|
||||
|
||||
Use persisted content and data-driven mechanics.
|
||||
|
||||
## 6. Plünderer-Veteran
|
||||
|
||||
Role:
|
||||
|
||||
- first clearly tougher regular humanoid
|
||||
- combines existing mechanics
|
||||
|
||||
Mechanics:
|
||||
|
||||
```text
|
||||
Heavy Attack
|
||||
+
|
||||
defensive stance
|
||||
```
|
||||
|
||||
The defensive stance may temporarily increase armor or otherwise use the established deterministic defensive mechanic.
|
||||
|
||||
Avoid adding a generic scripting engine.
|
||||
|
||||
## 7. Plündererhauptmann
|
||||
|
||||
Role:
|
||||
|
||||
```text
|
||||
ELITE
|
||||
```
|
||||
|
||||
The elite combines 2–3 already learned mechanics.
|
||||
|
||||
The elite should be:
|
||||
|
||||
- difficult or impractical for an unupgraded starting character
|
||||
- manageable after meaningful Tier-1 upgrades
|
||||
- farmable for a recognizable desirable reward
|
||||
|
||||
## 8. Elite combat duration
|
||||
|
||||
Target:
|
||||
|
||||
```text
|
||||
6–10 rounds
|
||||
```
|
||||
|
||||
This is a balancing goal, not a hard mechanical rule.
|
||||
|
||||
## 9. Elite loot
|
||||
|
||||
The elite must have a clear reason to be farmed.
|
||||
|
||||
Use the existing balancing/content data for its target rewards.
|
||||
|
||||
Do not invent a separate random loot pool if the project already defines the relevant Tier-1 upgrade source.
|
||||
|
||||
A desirable weapon such as the Aschenklinge may serve as a primary target where consistent with existing content.
|
||||
|
||||
## 10. Danger Rating
|
||||
|
||||
By this slice, danger ratings should use real effective player stats.
|
||||
|
||||
The backend should derive them from:
|
||||
|
||||
```text
|
||||
CharacterStatsService
|
||||
+
|
||||
enemy / encounter power
|
||||
```
|
||||
|
||||
Supported ratings:
|
||||
|
||||
```text
|
||||
WEAK
|
||||
MATCH
|
||||
STRONG
|
||||
VERY_DANGEROUS
|
||||
DEADLY
|
||||
```
|
||||
|
||||
Use the balancing thresholds as the initial calibration.
|
||||
|
||||
Do not calculate this in Angular.
|
||||
|
||||
## 11. Encounter UI
|
||||
|
||||
Elite encounters must remain part of the reusable EncounterCard system.
|
||||
|
||||
They may receive:
|
||||
|
||||
```text
|
||||
ELITE label
|
||||
stronger border treatment
|
||||
higher visual emphasis
|
||||
```
|
||||
|
||||
Do not create a completely separate elite hunting UI.
|
||||
|
||||
## 12. World UI
|
||||
|
||||
Add the Wachtposten as a real travel node.
|
||||
|
||||
The world screen should communicate:
|
||||
|
||||
- current location
|
||||
- Verbrannte Straße connection
|
||||
- Wachtposten connection
|
||||
- current danger/recommended range
|
||||
- future Aschengrube direction as appropriate
|
||||
|
||||
## 13. Explicit non-goals
|
||||
|
||||
Do not implement yet:
|
||||
|
||||
```text
|
||||
full quest flow
|
||||
merchant
|
||||
boss
|
||||
area completion
|
||||
Dämmerwald
|
||||
```
|
||||
|
||||
## 14. Required tests
|
||||
|
||||
Verify:
|
||||
|
||||
- location and connection persistence
|
||||
- travel works in both intended directions
|
||||
- encounter pool is location-driven
|
||||
- Plünderer-Veteran mechanics work
|
||||
- elite encounter classification is persisted
|
||||
- Danger Rating uses authoritative effective character stats
|
||||
- elite loot is server-generated
|
||||
- an undergeared character receives a stronger danger rating than an upgraded one where expected
|
||||
|
||||
## 15. Definition of Done
|
||||
|
||||
The player can experience:
|
||||
|
||||
```text
|
||||
reach Wachtposten
|
||||
↓
|
||||
see stronger enemies
|
||||
↓
|
||||
discover Elite
|
||||
↓
|
||||
struggle or fail
|
||||
↓
|
||||
farm upgrades
|
||||
↓
|
||||
return
|
||||
↓
|
||||
defeat Elite
|
||||
```
|
||||
|
||||
This is the first direct playable proof of:
|
||||
|
||||
> Become stronger and return.
|
||||
|
||||
## 16. Handoff
|
||||
|
||||
Next:
|
||||
|
||||
```text
|
||||
Playable Slice 0.9 – Aschengrube & First Boss
|
||||
```
|
||||
@@ -0,0 +1,245 @@
|
||||
# Ashen Realms – Playable Slice 0.9: Aschengrube & First Boss
|
||||
|
||||
**Status:** Ready for implementation
|
||||
**Prerequisite:** Playable Slice 0.8 – Wachtposten & First Elite
|
||||
**Scope:** First region climax and first boss
|
||||
**Primary Location:** Aschengrube
|
||||
**Boss:** Hauptmann der Aschenbande
|
||||
**Next Slice:** Playable Slice 0.10 – First NPC & Quest
|
||||
|
||||
## 1. Goal
|
||||
|
||||
Implement the first true regional progression check.
|
||||
|
||||
The player reaches the hardest Aschenfelder location, fights stronger enemies, challenges the first boss, receives guaranteed meaningful progress, and discovers the future path toward the Dämmerwald.
|
||||
|
||||
## 2. New location
|
||||
|
||||
Add:
|
||||
|
||||
```text
|
||||
Aschengrube
|
||||
```
|
||||
|
||||
Connection:
|
||||
|
||||
```text
|
||||
Verlassener Wachtposten
|
||||
↔
|
||||
Aschengrube
|
||||
```
|
||||
|
||||
Use the existing world/content design for travel duration, danger, artwork, and location metadata.
|
||||
|
||||
## 3. Regular encounter pool
|
||||
|
||||
Core encounters:
|
||||
|
||||
```text
|
||||
Aschenwühler
|
||||
Plünderer-Veteran
|
||||
Verbrannter Jagdhund
|
||||
```
|
||||
|
||||
Use the existing balancing and content definitions.
|
||||
|
||||
The location should feel more dangerous than the previous two hunting areas.
|
||||
|
||||
## 4. Boss access
|
||||
|
||||
The boss should not be rolled as a normal random hunt encounter.
|
||||
|
||||
The Aschengrube exposes a dedicated location action:
|
||||
|
||||
```text
|
||||
Hauptmann herausfordern
|
||||
```
|
||||
|
||||
This establishes the reusable concept of a boss/location action without creating a boss-specific one-off controller.
|
||||
|
||||
## 5. Boss
|
||||
|
||||
Implement:
|
||||
|
||||
```text
|
||||
Hauptmann der Aschenbande
|
||||
Level 3
|
||||
BOSS
|
||||
```
|
||||
|
||||
Mechanics:
|
||||
|
||||
```text
|
||||
normal attack
|
||||
|
||||
telegraphed Heavy Attack
|
||||
|
||||
defensive phase / armor increase
|
||||
|
||||
below 30% HP:
|
||||
more aggressive behavior
|
||||
```
|
||||
|
||||
Use reusable combat mechanics rather than a bespoke boss script framework.
|
||||
|
||||
## 6. Boss duration
|
||||
|
||||
Target:
|
||||
|
||||
```text
|
||||
8–14 rounds
|
||||
```
|
||||
|
||||
This is a balancing target.
|
||||
|
||||
The boss should not be realistically comfortable for a fresh character, but should become manageable through the Tier-1 progression available in the Aschenfelder.
|
||||
|
||||
## 7. Boss reward rule
|
||||
|
||||
Introduce the first boss guarantee system.
|
||||
|
||||
### Roll A – guaranteed progression
|
||||
|
||||
Always grant:
|
||||
|
||||
```text
|
||||
1 high-quality Tier-1 item
|
||||
```
|
||||
|
||||
Guaranteed pool:
|
||||
|
||||
```text
|
||||
Verstärkte Lederjacke
|
||||
Wachmannsbeinkleid
|
||||
Aschenstiefel
|
||||
Zeichen der Grenzwacht
|
||||
```
|
||||
|
||||
### Roll B – additional special drops
|
||||
|
||||
```text
|
||||
20% Aschenklinge
|
||||
8% Anhänger des verbrannten Hauptmanns
|
||||
```
|
||||
|
||||
Guaranteed additional rewards:
|
||||
|
||||
```text
|
||||
50–70 Silver
|
||||
80 XP
|
||||
5 Grenzmarken
|
||||
```
|
||||
|
||||
The guaranteed progression roll and special rolls are separate.
|
||||
|
||||
## 8. Loot architecture extension
|
||||
|
||||
Extend the existing loot system to support:
|
||||
|
||||
```text
|
||||
guaranteed item pool
|
||||
+
|
||||
independent optional rolls
|
||||
```
|
||||
|
||||
Do not implement the boss reward directly inside the controller.
|
||||
|
||||
The behavior must remain data-driven and reusable.
|
||||
|
||||
## 9. Boss completion persistence
|
||||
|
||||
Persist first boss completion / regional progression state.
|
||||
|
||||
The exact data structure should follow the existing project conventions.
|
||||
|
||||
At minimum, the server must know that the character has defeated the regional boss.
|
||||
|
||||
Do not rely on Angular state.
|
||||
|
||||
## 10. Future path discovery
|
||||
|
||||
After the first boss victory, expose the future progression hint:
|
||||
|
||||
```text
|
||||
Ein Pfad in Richtung Dämmerwald wurde entdeckt.
|
||||
```
|
||||
|
||||
The Dämmerwald itself does not need to be playable yet.
|
||||
|
||||
The world state may mark a future node/connection as discovered or unlocked according to the existing architecture.
|
||||
|
||||
## 11. Boss UI
|
||||
|
||||
The boss encounter should visually communicate that it is a major challenge.
|
||||
|
||||
Use:
|
||||
|
||||
- existing combat screen
|
||||
- boss label
|
||||
- stronger framing
|
||||
- clear Telegraphing
|
||||
- phase/status information
|
||||
- existing combat log/event system
|
||||
|
||||
Do not build a separate game mode.
|
||||
|
||||
## 12. Explicit non-goals
|
||||
|
||||
Do not implement yet:
|
||||
|
||||
```text
|
||||
Dämmerwald content
|
||||
complex boss scripting DSL
|
||||
multiple boss instances
|
||||
raid mechanics
|
||||
group combat
|
||||
boss matchmaking
|
||||
```
|
||||
|
||||
## 13. Required tests
|
||||
|
||||
Verify:
|
||||
|
||||
- boss can only be started through a valid server-side boss/location action
|
||||
- boss combat uses persisted authoritative stats
|
||||
- defensive phase changes combat behavior
|
||||
- low-HP aggression triggers correctly
|
||||
- boss victory persists
|
||||
- boss reward is granted exactly once
|
||||
- guaranteed Tier-1 item always appears
|
||||
- special drop rolls remain independent
|
||||
- XP, Silver and Grenzmarken match content rules
|
||||
- page refresh does not duplicate boss reward
|
||||
- future path discovery persists
|
||||
|
||||
## 14. Definition of Done
|
||||
|
||||
The player can:
|
||||
|
||||
```text
|
||||
reach Aschengrube
|
||||
↓
|
||||
fight regular encounters
|
||||
↓
|
||||
challenge boss
|
||||
↓
|
||||
read and react to mechanics
|
||||
↓
|
||||
win
|
||||
↓
|
||||
receive guaranteed progression item
|
||||
↓
|
||||
receive boss rewards
|
||||
↓
|
||||
discover route toward Dämmerwald
|
||||
```
|
||||
|
||||
A boss victory must never end without meaningful progress.
|
||||
|
||||
## 15. Handoff
|
||||
|
||||
Next:
|
||||
|
||||
```text
|
||||
Playable Slice 0.10 – First NPC & Quest
|
||||
```
|
||||