package game import "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/sim" // sfxState är vad ljudlagret senast såg av omgången; skillnader mot nu ger // effekter (spärr, kiosk, toalett, lärt ord, byte, personal, vinst/förlust). type sfxState struct { init bool gatePasses int served int staffCalls int deniedAt float64 noExitAt float64 learnedAt float64 transferAt float64 flashAt float64 facility bool mini bool outcome sim.Outcome } // updateSfx spelar effekter för det som hänt sedan förra bildrutan. func (s *LevelScene) updateSfx(g *Game) { r := s.run x := &s.sfx if x.init { switch { case r.GatePasses > x.gatePasses: g.Audio.Play(SoundGateBeep, 0.7) case r.DeniedAt >= 0 && r.DeniedAt != x.deniedAt, r.NoExitAt >= 0 && r.NoExitAt != x.noExitAt: g.Audio.Play(SoundGateDeny, 0.7) } if r.Served > x.served { if x.facility && !r.Facility.Active { g.Audio.Play(SoundToilet, 0.6) } else { g.Audio.Play(SoundKiosk, 0.7) } } if r.LearnedAt >= 0 && r.LearnedAt != x.learnedAt { g.Audio.Play(SoundLearn, 0.8) } if r.TransferAt >= 0 && r.TransferAt != x.transferAt { g.Audio.Play(SoundTransfer, 0.8) } if r.StaffCalls > x.staffCalls { g.Audio.Play(SoundStaff, 0.7) } if r.Mini != nil && !x.mini { g.Audio.Play(SoundConfirm, 0.5) } if r.FlashAt >= 0 && r.FlashAt != x.flashAt && r.FlashKey != sim.FlashTransfer && r.FlashKey != sim.FlashStaff { g.Audio.Play(SoundCancel, 0.6) } if r.Outcome != x.outcome { switch r.Outcome { case sim.Won: g.Audio.Play(SoundWin, 0.9) case sim.Lost: g.Audio.Play(SoundLose, 0.9) } } } *x = sfxState{init: true, gatePasses: r.GatePasses, served: r.Served, staffCalls: r.StaffCalls, deniedAt: r.DeniedAt, noExitAt: r.NoExitAt, learnedAt: r.LearnedAt, transferAt: r.TransferAt, flashAt: r.FlashAt, facility: r.Facility.Active, mini: r.Mini != nil, outcome: r.Outcome} }