Files
claude f04d6a88f9
All checks were successful
release / build-release (push) Successful in 2m7s
M10c: vem betalar i kiosken och spärrar utan återvändo
Björns tillägg 2026-10-24. Med egna kort och fler i sällskapet frågar
kiosken vem som betalar (minigame.Payer: kontant, spelarens kort eller en
följares kort; den som inte har råd nekas, Esc avbryter). Avgiften dras
nu när man passerar spärren in i det betalda området (level.InsideGates),
inte på spärrrutan. Banflaggan oneWayGates: incheckad släpps inte ut igen
förrän man åkt; Enter vid spärren kallar på personal (10 s) som låser upp
korten; ny inpassering kostar igen. På i 005, 007/007b och 008/008b.
Skriptkommandon urge och push. Docs, wiki och skärmdumpar uppdaterade.

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

62 lines
1.6 KiB
Go

package minigame
// Payer är frågan "vem betalar?" vid kiosken när alla i sällskapet har egna
// kort: kontant, spelarens kort eller en följares kort. Pilarna väljer,
// Enter betalar (bara om det räcker), Esc avbryter köpet. Poängen är att
// kunna vara strategisk så att alla har kvar pengar till spärrarna.
type PayOption struct {
Name string // vem (tom för kontant)
Cash bool // kontanter i plånboken
Member int // 0 = spelarens kort, annars följarens index i sällskapet
Yen int // tillgängligt belopp
}
// Payer är väljaren.
type Payer struct {
base
Price int
Options []PayOption
Cursor int
Chosen *PayOption // vald källa när det lyckats
Refused bool // försökte betala med något som inte räcker
}
// NewPayer skapar väljaren med markören på första källan som har råd.
func NewPayer(price int, options []PayOption) *Payer {
g := &Payer{Price: price, Options: append([]PayOption(nil), options...)}
for i, o := range g.Options {
if o.Yen >= price {
g.Cursor = i
break
}
}
return g
}
// CanAfford rapporterar om källan i räcker till priset.
func (g *Payer) CanAfford(i int) bool { return g.Options[i].Yen >= g.Price }
// Update flyttar markören och tar emot betala/avbryt.
func (g *Payer) Update(in Input, dt float64) {
if g.done || len(g.Options) == 0 {
return
}
if in.Cancel {
g.done = true
return
}
if mv := in.MoveX + in.Move; mv != 0 {
g.Cursor = wrap(g.Cursor+mv, len(g.Options))
g.Refused = false
}
if in.Confirm {
if !g.CanAfford(g.Cursor) {
g.Refused = true
return
}
o := g.Options[g.Cursor]
g.Chosen = &o
g.done, g.success = true, true
}
}