All checks were successful
release / build-release (push) Successful in 1m37s
- sim/stats.go: Stats (fart, törst, fokus, toalett, tur), debuffar som multiplikatorer, Profile som följer med mellan banor och räknar ned - sim.Run: tidsgräns och maxantal missade tåg förlorar banan; poängformel (tid mot par, pengar, sällskapets mätare, utforskat, avdrag); debuffar tjänas av många steg, lång tid, tom matmätare och seedad otur vid kiosken; stats påverkar fart, mätartakter, läsning och hjälptid - egna kort (individualCards): Member.Card, spärren kräver allas saldo och drar från alla, automaten frågar vems kort, biljetter köps åt alla - sittplatsval (seatSelection): Ticket får ett sittplatssteg med seedade önskemål (fönster/gång/sida/bredvid); missnöjda ger mätar- och poängavdrag - level: maxMissedTrains, individualCards, seatSelection; bana 003 Shibuya (svårighet 3, fyra i sällskapet) och 002 med tidsgräns och sittplatser; ordboken utökad; generatorn är spec-driven - game: tid kvar/missade i HUD, debuffar i meny/HUD/resultat, poäng och förlustorsaker på resultatet, vyer för personval och vagn, skript-pick, flaggan -debuffs; HUD och resultat komprimerade för fyra i sällskapet - plan (Björn 2026-10-24): flera våningar med trappor som M9a, egna kort och sittplatsval som svårighetsinställningar i M7 – i spelbeskrivning, roadmap, testplan - docs/README/wiki med sittplatsbilden Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
69 lines
2.1 KiB
Go
69 lines
2.1 KiB
Go
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
|
||
TicketCount int `json:"ticketCount"` // antal biljetter (egna kort: en per person)
|
||
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)
|
||
}
|
||
}
|