All checks were successful
release / build-release (push) Successful in 1m33s
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>
85 lines
2.0 KiB
Go
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
|
|
}
|
|
}
|