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 } }