M6: plånbok, biljetter, kortet i telefonen och seedade minispel
All checks were successful
release / build-release (push) Successful in 1m41s
All checks were successful
release / build-release (push) Successful in 1m41s
- sim.Wallet: IC-kort, kontanter, pappersbiljett, telefon med batteri, spenderat; följer med mellan banor (Game.Wallet) - internal/minigame: gemensamt Game-gränssnitt (Update/Done/Success), all slump från del-seeds: TopUp (hitta チャージ, belopp, mata sedlar), Ticket (taxetavla med resmål på japanska), Crowd (tidsfönster, två försök), Ride (stationerna passerar, kliv av vid resmålet) - sim.Run: spärren kräver biljett på biljettbanor annars användbart kort; telefonen ger ×1,1 fart men 15 % seedad omskanning (frysning 1,5 s), dött batteri gör kortet oanvändbart; automaten startar påfyllning eller biljettköp; tåget kontrollerar biljetten; fulla tåg kräver trängsel; resan avgör vinst/förlust (fel station, åkte förbi, fel tåg); StepMini låter klockan och sällskapet ticka medan rörelsen pausar - level: ticketRequired, rideStops, Train.Crowded; 002 är biljettbana med fullt tåg och fyra stopp; ordboken har stationer (kind) + sju nya namn - game: vyer för minispelen, plånbok i HUD, P i menyn = kort i telefonen, förlustorsaker och spenderat på resultatet, flaggor -phone/-card, skriptkommandon hold/waitstop; inforuta/minikarta döljs under minispel - plan: M7b (Björn) – tågvind, ankomstindikator nära rälsen, in-/utkörningsanimation för tåg och bussar – i spelbeskrivning, roadmap, testplan - docs/README/wiki med tre nya bilder (automat, biljettavla, tågresa) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
70
internal/minigame/ride.go
Normal file
70
internal/minigame/ride.go
Normal file
@@ -0,0 +1,70 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user