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

View File

@@ -0,0 +1,45 @@
package sim
import "testing"
func TestDebuffEffectsAndProfile(t *testing.T) {
if DefaultStats() != (Stats{1, 1, 1, 1, 1}) {
t.Fatal("default")
}
for kind, e := range DebuffEffects {
changed := false
for i := range e {
if e[i] != 1 {
changed = true
}
}
if !changed {
t.Errorf("%s påverkar inget", kind)
}
}
st := CombinedStats([]Debuff{{SoreFeet, 1}, {Blisters, 1}})
if st[StatSpeed] < 0.67 || st[StatSpeed] > 0.69 || st[StatThirst] != 1 {
t.Fatalf("kombinerad fart %.3f", st[StatSpeed])
}
var p Profile
p.Add(Tired, 1)
p.Add(DOMS, 3)
p.Add(Tired, 2) // förlängs, inte dubbleras
if len(p.Debuffs) != 2 || !p.Has(Tired) || p.Debuffs[0].LevelsLeft != 2 {
t.Fatalf("debuffs=%v", p.Debuffs)
}
if p.Stats()[StatSpeed] != 0.9*0.9 {
t.Fatalf("stats=%v", p.Stats())
}
if exp := p.EndLevel(); len(exp) != 0 || len(p.Debuffs) != 2 {
t.Fatalf("efter bana 1: exp=%v debuffs=%v", exp, p.Debuffs)
}
if exp := p.EndLevel(); len(exp) != 1 || exp[0] != Tired || len(p.Debuffs) != 1 || p.Debuffs[0].Kind != DOMS {
t.Fatalf("efter bana 2: exp=%v debuffs=%v", exp, p.Debuffs)
}
p.EndLevel()
if len(p.Debuffs) != 0 || p.Has(DOMS) {
t.Fatal("DOMS ska ha gått ut efter tre banor")
}
}