M7: svårighet, tid, poäng, debuffar, egna kort och sittplatsval
All checks were successful
release / build-release (push) Successful in 1m37s

- sim/stats.go: Stats (fart, törst, fokus, toalett, tur), debuffar som
  multiplikatorer, Profile som följer med mellan banor och räknar ned
- sim.Run: tidsgräns och maxantal missade tåg förlorar banan; poängformel
  (tid mot par, pengar, sällskapets mätare, utforskat, avdrag); debuffar
  tjänas av många steg, lång tid, tom matmätare och seedad otur vid
  kiosken; stats påverkar fart, mätartakter, läsning och hjälptid
- egna kort (individualCards): Member.Card, spärren kräver allas saldo och
  drar från alla, automaten frågar vems kort, biljetter köps åt alla
- sittplatsval (seatSelection): Ticket får ett sittplatssteg med seedade
  önskemål (fönster/gång/sida/bredvid); missnöjda ger mätar- och poängavdrag
- level: maxMissedTrains, individualCards, seatSelection; bana 003 Shibuya
  (svårighet 3, fyra i sällskapet) och 002 med tidsgräns och sittplatser;
  ordboken utökad; generatorn är spec-driven
- game: tid kvar/missade i HUD, debuffar i meny/HUD/resultat, poäng och
  förlustorsaker på resultatet, vyer för personval och vagn, skript-pick,
  flaggan -debuffs; HUD och resultat komprimerade för fyra i sällskapet
- plan (Björn 2026-10-24): flera våningar med trappor som M9a, egna kort
  och sittplatsval som svårighetsinställningar i M7 – i spelbeskrivning,
  roadmap, testplan
- docs/README/wiki med sittplatsbilden

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-10-24 10:18:17 +02:00
parent 9fc7e94074
commit b2995d4ca9
44 changed files with 1567 additions and 177 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

BIN
doc/img/seats.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -34,7 +34,7 @@ att bygga på Linux som på Windows.
| Inkrementellt debug-bygge | < 10 s | 4,7 s |
| Release-binär | < 20 MB | 10,2 MB (Linux), 10,8 MB (Windows) |
| Testsviten | `go test ./...` grön på < 30 s | ~0,1 s |
| Banor | 100 % passerar det automatiska lösbarhetstestet | 2 av 2 |
| Banor | 100 % passerar det automatiska lösbarhetstestet | 3 av 3 |
| Windows-korsbygge från Linux | fungerar utan extra verktyg | ✓ (CGO_ENABLED=0) |
| Linux-binärens länkade bibliotek | bara libc | ✓ (GL/X11 laddas dynamiskt vid körning) |
| Bildfrekvens | 60 fps vid 4× skala på integrerad grafik | ej mätt |
@@ -111,6 +111,11 @@ att bygga på Linux som på Windows.
| `internal/sim` | `TestWalletPayTopUpAndPhone` | Kort, kontanter, påfyllning, spenderat, batteri gör kortet i telefonen oanvändbart |
| `internal/sim` | `TestTopUpFlowAtMachine`, `TestTicketLevelFlow`, `TestCrowdFailureMissesTrain` | Tomt kort → automaten → påfyllning → spärren släpper; **hela bana 002 headless** med fel/rätt biljett, trängsel och resa; två bom = missat tåg |
| `internal/sim` | `TestPhoneSpeedRescanAndBattery`, `TestRideWrongOrMissedStopLoses` | Fartbuff, seedad omskanning som fryser spelaren, dött batteri stoppar spärren; fel station / åka förbi förlorar |
| `internal/sim` | `TestDebuffEffectsAndProfile` | **M7:** varje debuff påverkar något, kombineras multiplikativt, profilen förlänger i stället för dubblerar och räknar ned per bana |
| `internal/sim` | `TestTimeLimitAndMissedTrainsLose`, `TestScoreBreakdown` | Tidsgräns och maxantal missade tåg förlorar banan (001 har inga gränser); poängformeln och avdragen |
| `internal/sim` | `TestDebuffsAffectRunAndAreEarned` | Skoskav/matförgiftning/hunger sänker fart, snabbar mätare och förlänger hjälptiden; många steg, lång tid och tom matmätare ger debuffar |
| `internal/sim` | `TestIndividualCardsAtGateAndMachine`, `TestLevel003Flow` | Egna kort: spärren kräver allas saldo, automaten frågar vems kort, spärren drar från alla; **hela bana 003 headless** med biljetter åt alla, sittplatser, trängsel och resa |
| `internal/minigame` | `TestTopUpPicksMemberWithIndividualCards`, `TestSeatSelectionPreferences` | Personval och 2×2-rutnät; seedade önskemål, upptagna platser, missnöje, fönster/gång/sida/bredvid, Esc avbryter köpet |
| `internal/archtest` | `TestOnlyPresentationPackagesImportEbitengine` | Beroenderegeln ovan |
### Planerade tester per milstolpe
@@ -123,9 +128,10 @@ att bygga på Linux som på Windows.
| ~~M4 Lämmeltåget~~ ✓ | Mätare, händelsefrekvens efter gruppstorlek, seedade händelser – finns, se tabellen ovan |
| ~~M5 Minikarta~~ ✓ | Upptäckta rutor, nollställning per bana, avgångar från start – finns, se tabellen ovan |
| ~~M6 Kort/biljetter/minispel~~ ✓ | Saldo, automat, biljetter, omskanning, batteri – finns, se tabellen ovan |
| M7 Svårighet/poäng/debuffs | Poängformeln (tid, pengar, mätare, läge); tidsgräns och maxantal missade tåg; varje debuff ändrar rätt stat; temporära debuffar räknar ned 1–4 banor |
| ~~M7 Svårighet/poäng/debuffs~~ ✓ | Poäng, tidsgräns, debuffar, egna kort, sittplatsval – finns, se tabellen ovan |
| M7b Tåg som kommer och går | `TrainPhase(t)` ger approaching/arriving/dwelling/departing/away med rätt fas ur tidtabellen; indikatorn aktiv bara inom N rutor från rälsen; vindzonen = rutor längs perrongkanten |
| M8 Progression & sparfil | Sparfil round-trip (skriv → läs ger samma tillstånd inkl. seed); skill tree-krav; upplåsningar efter rätt bana; "< 33 %"-regeln kontrolleras mot itemlistan |
| M9a Flera våningar | Trappa byter våning för Mover och följare; `Path` över våningar; lösbarhetstest med trappor; dimma/minikarta per våning; gamla banor = en våning |
| M9 Navigeringslägen | Listläge genererar rätt ordning av tåg; skyltläge: 1–4 giltiga vägar; fel-riktnings-förlust triggar vid rätt slutstation |
| M10 Story-innehåll | Alla banor lösbara (redan automatiskt); flerbytesbanor har sammanhängande byten; sista banan slutar på flygplatsen |
| M11 Oändligt läge & NG+ | Målsekvens deterministisk per seed; NG+ behåller skills men nollställer items |

View File

@@ -34,8 +34,8 @@ brasse-linux01-runnern, inte Pi5:n.
M0 skelett ✓ → M1 rörelse/kamera ✓ → M2 tåg/spärrar/vinst ✓ → M3 japanska/skyltar ✓
→ M4 lämmeltåget ✓ → M5 minikarta ✓ → M6 kort/biljetter/minispel ✓ → M7
svårighet/poäng/debuffar → M7b tåg som kommer och går (vind, indikator,
animation) → M8 progression/sparfiler → M9 navigeringslägen →
svårighet/poäng/debuffar ✓ → M7b tåg som kommer och går (vind, indikator,
animation) → M8 progression/sparfiler → M9a flera våningar → M9 navigeringslägen →
M10 story-innehåll → M11 oändligt läge/NG+ → M12 ljud/polish/release.
Innehåll per milstolpe: [roadmap.md › Milstolpar](roadmap.md#milstolpar).
Vad som ska vara testat per milstolpe: [mal-och-tester.md](mal-och-tester.md).

View File

@@ -287,15 +287,46 @@ på **brasse-linux01-runnern** (label `linux-amd64`), aldrig på Pi5:n.
spelbart; `TestTicketLevelFlow` spelar hela 002 headless: fel biljett
stoppas, rätt biljett, spärr, trängsel, resa, vinst. ✓
### M7 – Svårighet, tid, poäng och debuffar
### M7 – Svårighet, tid, poäng och debuffar ✓ (klar 2026-10-24)
- **Mål:** banor som kan misslyckas och poäng att jaga.
- Tidsgräns och maxantal missade tåg på svåra banor; lätta banor obegränsade.
- Poängformel: tid, pengar/påfyllningar, mätarnas status, navigeringsläge.
- Stats (speed, törst, fokus, toalett, tur) och debuffar (onda fötter,
trötthet, hunger/irritation, matförgiftning); temporära debuffar 1–4 banor.
- Svårighetsprofil per bana i JSON.
- **Teknik:** `internal/score`, `internal/sim/stats`.
- Tidsgräns och maxantal missade tåg på svåra banor; lätta banor
obegränsade.
- Poängformel: tid mot par, pengar spenderade, sällskapets mätare vid
målgång, utforskat, avdrag för missade tåg och omskanningar;
navigeringsläge ger multiplikator i M9.
- Stats (speed, törst, fokus, toalett, tur) som multiplikatorer och
**debuffar** som påverkar dem: onda fötter (många steg), trötthet (lång
bana), hunger/irritation (tom matmätare), matförgiftning (seedad chans
vid kioskköp, snabbare toamätare). De temporära debuffarna från
sidouppdrag (träningsvärk, skoskav, tungt köp, proppmätt, svettig) finns
i systemet med varaktighet 1–4 banor; sidouppdragen som ger dem kommer i
M10.
- **Svårighetsinställningar per bana** (Björns tillägg 2026-10-24):
- **Egna kort** (`individualCards`): varje person i sällskapet har sitt
eget tågkort; spärren kräver att alla har pengar, biljettbanor att alla
har biljett. Påfyllningsautomaten frågar vems kort.
- **Sittplatsval** (`seatSelection`, kräver biljettbana): efter resmålet
väljer man platser i vagnen (fönster/gång, vänster/höger, bredvid
någon) efter sällskapets seedade önskemål. Missnöjda i sällskapet blir
sura: mätaravdrag och poängavdrag.
- Våningar (`floors`) är också en svårighetsvariabel men byggs i M9a.
- **Teknik:** `sim/stats.go` (Stats, Debuff, Profile – ren Go),
`Run.Score()`, `level` får `maxMissedTrains`, `individualCards`,
`seatSelection`; `minigame.TopUp` får personval, `minigame.Ticket` får
sittplatssteg.
- **Poängformeln som byggdes:** tid 500 × min(1, par/tid) + pengar
(300 − spenderat/10) + mätare (200 × sällskapets medel) + utforskat
(100 × andel) − avdrag (50/missat tåg, 10/omskanning, 30/missnöjd).
- **Bana 003 Shibuya** (svårighet 3, fyra i sällskapet): biljettbana med
egna kort, sittplatsval, fullt tåg, fem stopp, 6 min tidsgräns, max ett
missat tåg. Bana 002 fick tidsgräns, maxantal missade tåg och
sittplatsval. Generatorn är nu spec-driven (JSON) så fler banor går fort.
- **Klar när:** poängformeln, tidsgränsen, debuffarna och de två
inställningarna är testade (`TestScoreBreakdown`,
`TestTimeLimitAndMissedTrainsLose`, `TestDebuffsAffectRunAndAreEarned`,
`TestIndividualCardsAtGateAndMachine`, `TestLevel003Flow`,
`TestSeatSelectionPreferences`); bana 003 använder dem. ✓
### M7b – Tåg som kommer och går (Björns tillägg 2026-10-24)
@@ -329,6 +360,23 @@ på **brasse-linux01-runnern** (label `linux-amd64`), aldrig på Pi5:n.
- **Klar när:** sparfil round-trip-test grön; "< 33 % per omgång" går att
räkna ut från datan.
### M9a – Flera våningar (Björns tillägg 2026-10-24)
- **Mål:** stationer i flera plan – ännu en svårighetsvariabel.
- Banformatet får **flera rutnät** (`floors`), ett per våning, med
**trappor** (och rulltrappor/hissar) som kopplar en ruta på en våning
till en ruta på en annan. Start kan ligga på en trappa upp eller ner:
under mark, ovan mark eller marknivå.
- Kamera, dimma, minikarta (en flik per våning eller stapel) och BFS-vägar
(`level.Path`, lösbarhetstestet, botarna) blir våningsmedvetna; skyltar
kan peka "↑ 2F / ↓ B1".
- **Teknik:** `level.Level.Floors []Grid` med `Stairs []Link`, `Point`
får `Z`; `sim.Mover` byter våning vid trappa; `tools/genart` får
trappruta; generatorn placerar trappor som flaskhalsar.
- **Klar när:** en bana med två våningar går att klara av boten headless,
minikartan visar rätt våning, och alla gamla banor fungerar oförändrat
(en våning).
### M9 – Navigeringslägen: lista och skyltläge
- **Mål:** de två sätten att spela story.
@@ -341,7 +389,9 @@ på **brasse-linux01-runnern** (label `linux-amd64`), aldrig på Pi5:n.
### M10 – Story-innehåll och flerbytesbanor
- **Mål:** hela resan från flygplats till flygplats.
- Alla huvudbanor och sidobanor; banor med flera stopp och byten; buss.
- Alla huvudbanor och sidobanor; banor med flera stopp och byten; buss;
stationer i flera våningar (M9a) och svårighetsinställningarna från M7
i stigande kombinationer.
- Slutanimation (karaktärerna flyger iväg, items och poäng visas) och
eftertexter.
- Överstimulerande UI/banor som extra svårighet.

View File

@@ -78,6 +78,14 @@ otydligt står tolkningen i [§15](#15-tolkningar-av-originalet).
- **Tåg och bussar har animationer** när de kör in till och ut från sina
stationer och hållplatser, i stället för att bara dyka upp och försvinna.
**Flera våningar** (tillägg 2026-10-24):
- Banor och stationer kan ha **flera våningar**. Trappor (och rulltrappor/
hissar) tar dig upp och ner mellan dem – ännu ett sätt att justera
svårigheten på en bana.
- En bana kan **börja med en trappa** upp eller ner, eftersom en station kan
ligga under mark, ovan mark eller i marknivå.
## 5. Sällskapet – lämmeltåget
- Dina polare följer efter dig i en rad – därav *lämmeltåget*.
@@ -136,6 +144,11 @@ otydligt står tolkningen i [§15](#15-tolkningar-av-originalet).
påfyllning.
- Telefonen har **batteri**. Dör det måste du köpa biljett i stället. Detta
ska nästan bara kunna hända på **långa banor**.
- **Sittplatser** (tillägg 2026-10-24): som svårighet i biljettminispelet
kan sällskapet ha önskemål om platser – någon vill sitta **bredvid en
viss person**, någon vill sitta vid **gången eller fönstret**, någon på
**höger eller vänster sida** av tåget. Du måste placera alla så att det
stämmer.
## 9. Svårighet och tid
@@ -145,7 +158,12 @@ otydligt står tolkningen i [§15](#15-tolkningar-av-originalet).
- **Extra svårigheter:** överstimulerande UI och banor byggda för att förvirra
spelaren räknas som egna, extra svårigheter.
- Variabler som styr svårighet: antal i sällskapet, andel engelska på
skyltar, kort-/biljettkrav, tidsgräns, antal byten, UI-störningar.
skyltar, kort-/biljettkrav, tidsgräns, antal byten, UI-störningar, antal
våningar, egna kort, sittplatsönskemål.
- **Egna kort** (tillägg 2026-10-24): som svårighetsinställning har varje
person i sällskapet **sitt eget tågkort**. Alla måste ha pengar på kortet
för att komma igenom spärren – och på biljettbanor måste alla ha en
biljett.
## 10. Poäng