package minigame import "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/rng" // CarPick är vagnvalet på perrongen: folk kliver av först, sedan väljer man // vagn. Varje vagn har en seedad trängselnivå; en vagn kan vara kvinnovagn. type CarPick struct { base Cars []Car Cursor int Alighting float64 // sekunder kvar innan man får kliva på (folk kliver av) Early int // för tidiga försök Chosen *Car } // Car är en vagn. type Car struct { Index int // 1-baserat vagnnummer Crowd int // 0 lite folk, 1 mellan, 2 mycket WomenOnly bool // kvinnovagn (just nu) } // AlightSec är hur länge folk kliver av innan man får gå på. const AlightSec = 1.5 // Trängselnivåernas namn (textnycklar "car.crowd."). var CrowdNames = []string{"low", "mid", "high"} // NewCarPick seedar vagnarnas trängsel. womenOnly är 1-baserat vagnnummer // (0 = ingen). Minst en vagn har lite folk när tåget har tre eller fler. func NewCarPick(seed rng.Seed, cars int, womenOnly int, alightSec float64) *CarPick { r := newRand(seed, "carpick") g := &CarPick{Alighting: alightSec} cars = max(1, cars) for i := 1; i <= cars; i++ { c := Car{Index: i, WomenOnly: i == womenOnly} switch x := r.float(); { case x < 0.35: c.Crowd = 0 case x < 0.75: c.Crowd = 1 default: c.Crowd = 2 } g.Cars = append(g.Cars, c) } if cars >= 3 { hasLow := false for _, c := range g.Cars { if c.Crowd == 0 { hasLow = true } } if !hasLow { g.Cars[r.intn(cars)].Crowd = 0 } } g.Cursor = cars / 2 return g } // Update låter folk kliva av, flyttar markören och väljer. func (g *CarPick) Update(in Input, dt float64) { if g.done { return } if in.Cancel { g.done = true return } if g.Alighting > 0 { g.Alighting -= dt if in.Confirm { g.Early++ // man ska låta folk kliva av först } return } g.Cursor = wrap(g.Cursor+in.MoveX, len(g.Cars)) if in.Confirm { c := g.Cars[g.Cursor] g.Chosen = &c g.done, g.success = true, true } }