M10c: vem betalar i kiosken och spärrar utan återvändo
All checks were successful
release / build-release (push) Successful in 2m7s
All checks were successful
release / build-release (push) Successful in 2m7s
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>
This commit is contained in:
61
internal/minigame/payer.go
Normal file
61
internal/minigame/payer.go
Normal file
@@ -0,0 +1,61 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user