Files
metro-puzzle-jp/internal/minigame/carpick.go
claude de61568e44
All checks were successful
release / build-release (push) Successful in 1m33s
M9b: folk, filer, reklam, sorl och vagnval
Folk på stationen (NPC:er som vandrar, kliver av tåg och går mot
utgången, blockerar spelaren men inte varandra), vänster-/högerfiler
som bromsar på fel sida, bredare gångar, reklamaffischer (clutter),
japanskt sorl i loop (noise), vagnval med kvinnovagn (stort avdrag med
man i sällskapet, tidsstyrd), kömarkeringar på perrongen, trängsel per
vagn (bonus för tom vagn, svettig-debuff och svårare resa i full vagn,
släpp förbi passagerare) och att folk kliver av innan man får gå på.
Ny bana 005 Ueno. Skärmdumpsverktyget kan filtrera på bana/skript.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-24 12:33:44 +02:00

85 lines
2.0 KiB
Go

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.<n>").
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
}
}