M9b: folk, filer, reklam, sorl och vagnval
All checks were successful
release / build-release (push) Successful in 1m33s
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>
This commit is contained in:
84
internal/minigame/carpick.go
Normal file
84
internal/minigame/carpick.go
Normal file
@@ -0,0 +1,84 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user