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:
53
internal/minigame/ticket.go
Normal file
53
internal/minigame/ticket.go
Normal file
@@ -0,0 +1,53 @@
|
||||
package minigame
|
||||
|
||||
import "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/rng"
|
||||
|
||||
// Ticket är biljettautomaten: en taxetavla med resmål (på japanska) i seedad
|
||||
// ordning. Spelaren väljer ett resmål och betalar – om det var rätt avgör
|
||||
// spärren/tåget senare.
|
||||
type Ticket struct {
|
||||
base
|
||||
Options []TicketOption
|
||||
Cursor int
|
||||
Chosen *TicketOption
|
||||
Cash int
|
||||
}
|
||||
|
||||
// TicketOption är ett resmål på tavlan.
|
||||
type TicketOption struct {
|
||||
Dest string // resmålets namn på japanska
|
||||
Fare int
|
||||
}
|
||||
|
||||
// NewTicket bygger tavlan: rätt resmål + lockande alternativ, blandade.
|
||||
// Taxan är seedad per resmål (140–620 yen i steg om 10).
|
||||
func NewTicket(seed rng.Seed, correct string, others []string, cash int) *Ticket {
|
||||
r := newRand(seed, "ticket")
|
||||
g := &Ticket{Cash: cash}
|
||||
names := append([]string{correct}, others...)
|
||||
for _, n := range names {
|
||||
g.Options = append(g.Options, TicketOption{Dest: n, Fare: 140 + 10*r.intn(49)})
|
||||
}
|
||||
r.shuffle(len(g.Options), func(i, j int) { g.Options[i], g.Options[j] = g.Options[j], g.Options[i] })
|
||||
return g
|
||||
}
|
||||
|
||||
// Update flyttar markören och köper.
|
||||
func (g *Ticket) Update(in Input, dt float64) {
|
||||
if g.done {
|
||||
return
|
||||
}
|
||||
if in.Cancel {
|
||||
g.done = true
|
||||
return
|
||||
}
|
||||
g.Cursor = wrap(g.Cursor+in.Move, len(g.Options))
|
||||
if in.Confirm {
|
||||
opt := g.Options[g.Cursor]
|
||||
if opt.Fare > g.Cash {
|
||||
return // har inte råd: välj annat eller avbryt
|
||||
}
|
||||
g.Chosen = &opt
|
||||
g.done, g.success = true, true
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user