M11: oändligt läge och New Game+
All checks were successful
release / build-release (push) Successful in 1m34s

internal/endless lottar mål ur en seed: en av storyns nätkopplade
stationer (aldrig samma två gånger i rad) med ett resmål som minst ett
tåg går rakt till men inte alla; banan kopieras, bedöms om mot nätet,
sällskapet växer var tredje mål och tidsgränsen krymper. O på bankartan
(eller -endless) startar en omgång; klarade mål ger poäng och XP, Enter
ger nästa mål, förlust eller Esc avslutar och omgången hamnar i
sparfilens poänglista (fem bästa). G två gånger startar New Game+: items,
banresultat, pengar och debuffar nollställs, skills, XP och japanskan
behålls, sällskapet är en person större per varv. Docs, wiki, tester och
skärmdumpar uppdaterade.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-10-24 23:20:12 +02:00
parent 46bd330dfc
commit 36a45563ec
22 changed files with 556 additions and 19 deletions

View File

@@ -25,7 +25,8 @@ type Progress struct {
Items map[string]bool `json:"items"`
Equipped map[string]string `json:"equipped"` // slot -> item-id
Levels map[string]*LevelResult `json:"levels"`
StoryCleared bool `json:"storyCleared"` // sista huvudbanan klarad: slutet har visats, oändligt läge/NG+ (M11) låses upp
StoryCleared bool `json:"storyCleared"` // sista huvudbanan klarad: slutet har visats, oändligt läge/NG+ låses upp
NGPlus int `json:"ngPlus"` // antal New Game+ som startats (svårighetspåslag)
}
// New börjar från noll.
@@ -253,6 +254,18 @@ func (p *Progress) Unlocked(all []*level.Level, id string) bool {
return false
}
// NewGamePlus börjar om storyn med skills och XP kvar: banresultat, items
// och det man har på sig nollställs. Storyn förblir "klar" så att oändligt
// läge är kvar. Returnerar det nya NG+-numret.
func (p *Progress) NewGamePlus() int {
p.ensure()
p.Levels = map[string]*LevelResult{}
p.Items = map[string]bool{}
p.Equipped = map[string]string{}
p.NGPlus++
return p.NGPlus
}
// TotalStars är summan av bästa stjärnor.
func (p *Progress) TotalStars() int {
n := 0