Files
metro-puzzle-jp/internal/sim/wallet.go
claude b2995d4ca9
All checks were successful
release / build-release (push) Successful in 1m37s
M7: svårighet, tid, poäng, debuffar, egna kort och sittplatsval
- 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>
2026-10-24 10:18:17 +02:00

69 lines
2.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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