package sim // Wallet är spelarens pengar och biljetter. Följer med mellan banor // (sparas i M8). type Wallet struct { Card int `json:"card"` // IC-kortets saldo (yen) Cash int `json:"cash"` // kontanter (yen) Phone bool `json:"phone"` // kortet ligger i telefonen Battery float64 `json:"battery"` // telefonens batteri 0..100 Ticket string `json:"ticket"` // köpt pappersbiljett: resmålets namn (ja), "" = ingen TicketFare int `json:"ticketFare"` // vad biljetten kostade Spent int `json:"spent"` // totalt spenderat (poäng i M7) } // Pengar och telefon. const ( StartCardYen = 2000 StartCashYen = 5000 BatteryPerSec = 100.0 / 900 // telefonen håller 15 min – tar bara slut på långa banor PhoneSpeedFactor = 1.1 // kortet i telefonen: man slipper rota i plånboken PhoneRescanChance = 0.15 // ...men ibland måste man skanna igen RescanSec = 1.5 ) // NewWallet ger startkassan med kortet i plånboken (inte telefonen). func NewWallet() *Wallet { return &Wallet{Card: StartCardYen, Cash: StartCashYen, Battery: 100} } // CardUsable: kortet i telefonen går inte att använda med dött batteri. func (w *Wallet) CardUsable() bool { return !w.Phone || w.Battery > 0 } // PayCard drar från kortet om det går. func (w *Wallet) PayCard(yen int) bool { if !w.CardUsable() || w.Card < yen { return false } w.Card -= yen w.Spent += yen return true } // PayCash betalar kontant om det går. func (w *Wallet) PayCash(yen int) bool { if w.Cash < yen { return false } w.Cash -= yen w.Spent += yen return true } // TopUp flyttar kontanter till kortet (påfyllning räknas inte som spenderat // förrän kortet används). func (w *Wallet) TopUp(yen int) bool { if w.Cash < yen { return false } w.Cash -= yen w.Card += yen return true } // Drain laddar ur telefonen när kortet ligger i den. func (w *Wallet) Drain(dt float64) { if w.Phone { w.Battery = max(0, w.Battery-BatteryPerSec*dt) } }