package minigame import "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/rng" // Ride är tågresan: stationerna passerar en i taget med "次は …"-utrop; // tryck Enter vid ditt resmål. Fel station eller att åka förbi är misslyckat. type Ride struct { base Stops []string // stationsnamn på japanska i ordning Dest int // index för resmålet, -1 om det inte finns på linjen (fel tåg) Index int // aktuell station Timer float64 // sekunder kvar vid aktuell station StopSec float64 GotOff int // index där spelaren klev av, -1 = inte än } const rideStopSec = 2.5 // NewRide bygger linjen: fillers är andra stationsnamn (blandas), dest läggs // på en seedad plats (aldrig först) om det är rätt tåg, annars utelämnas det. func NewRide(seed rng.Seed, dest string, fillers []string, stops int, correctTrain bool) *Ride { r := newRand(seed, "ride") f := append([]string(nil), fillers...) r.shuffle(len(f), func(i, j int) { f[i], f[j] = f[j], f[i] }) stops = max(2, stops) g := &Ride{StopSec: rideStopSec, Timer: rideStopSec, GotOff: -1, Dest: -1} if correctTrain { g.Dest = 1 + r.intn(stops-1) } for i := 0; i < stops; i++ { switch { case i == g.Dest: g.Stops = append(g.Stops, dest) case len(f) > 0: g.Stops = append(g.Stops, f[0]) f = f[1:] default: g.Stops = append(g.Stops, UnknownStop) // slut på namn: en namnlös station } } return g } // UnknownStop används när det inte finns fler stationsnamn att ta av. const UnknownStop = "・・・" // Current är stationen tåget står vid. func (g *Ride) Current() string { return g.Stops[g.Index] } // Update låter stationerna passera och tar emot "kliv av". func (g *Ride) Update(in Input, dt float64) { if g.done { return } if in.Confirm { g.GotOff = g.Index g.done = true g.success = g.Index == g.Dest return } g.Timer -= dt if g.Timer <= 0 { g.Index++ g.Timer = g.StopSec if g.Index >= len(g.Stops) { g.Index = len(g.Stops) - 1 g.done = true // åkte till slutstationen utan att kliva av } } }