// Sound effect keys — must match the keys loaded in PreloadScene. export const SFX = { CARD_DEAL: 'sfx-card-deal', CARD_PLACE: 'sfx-card-place', CARD_SHOW: 'sfx-card-show', CARD_SHUFFLE: 'sfx-card-shuffle', COINS: 'sfx-coins', PURCHASE: 'sfx-purchase', CASINO_BLACKJACK: 'sfx-casino-blackjack', CASINO_LOSE: 'sfx-casino-lose', CASINO_WIN: 'sfx-casino-win', CHIP_BET: 'sfx-chip-bet', DICE_ROLL: 'sfx-dice-roll', PENCIL_WRITE: 'sfx-pencil-write', BINGO_BALLS: 'sfx-bingo-balls', PIECE_CLICK: 'sfx-piece-click', ROULETTE: 'sfx-roulette', BATTLESHIP_HIT: 'sfx-battleship-hit', BATTLESHIP_MISS: 'sfx-battleship-miss', BATTLESHIP_LAUNCH: 'sfx-battleship-launch', MASTERMIND_GLITCH_1: 'sfx-mastermind-glitch-1', MASTERMIND_GLITCH_2: 'sfx-mastermind-glitch-2', MASTERMIND_PLACE: 'sfx-mastermind-place', MASTERMIND_GRANTED: 'sfx-mastermind-access-granted', MASTERMIND_DENIED: 'sfx-mastermind-access-denied', MASTERMIND_COLOR: 'sfx-mastermind-color', MASTERMIND_MATCH: 'sfx-mastermind-match', MASTERMIND_CALCULATE: 'sfx-mastermind-calculate', VICTORY_SHORT: 'sfx-victory-short', SCIFI_LAUNCH: 'sfx-scifi-launch', SCIFI_EXPLODE: 'sfx-scifi-explode', SCIFI_RISER: 'sfx-scifi-riser', SCIFI_REVEAL: 'sfx-scifi-reveal', SCIFI_WOOSH: 'sfx-scifi-woosh', SCIFI_PLINK: 'sfx-scifi-plink', SCIFI_PLONK: 'sfx-scifi-plonk', SWORD_HIT: 'sfx-sword-hit', SWORD_SLICE: 'sfx-sword-slice', MONOPOLY_PURCHASE: 'sfx-monopoly-purchase', MONOPOLY_EXPENSE: 'sfx-monopoly-expense', MONOPAY: 'sfx-monopoly-pay', MONOPOLY_PAID: 'sfx-monopoly-paid', EIGHTBIT_SELECT: 'sfx-8bit-select', EIGHTBIT_ACTIVATE: 'sfx-8bit-activate', EIGHTBIT_ACTION: 'sfx-8bit-action', EIGHTBIT_MOVE: 'sfx-8bit-move', SQUISH: 'sfx-squish', SQUASH: 'sfx-squash', WOOSH: 'sfx-woosh', JELLO_MONSTERS: 'sfx-jello-monsters', COUNTDOWN_TICK: 'sfx-countdown-tick', COUNTDOWN_GO: 'sfx-countdown-go', UI_PICK: 'sfx-ui-pick', UI_ACTIVATE: 'sfx-ui-activate', UI_FLIP: 'sfx-ui-flip', UI_PLACE: 'sfx-ui-place', UI_CHIME: 'sfx-ui-chime', GEM_MATCH_1: 'sfx-gem-match-1', GEM_MATCH_2: 'sfx-gem-match-2', GEM_MATCH_4: 'sfx-gem-match-4', GEM_MATCH_5: 'sfx-gem-match-5', GEM_CHAIN: 'sfx-gem-chain', GEM_DROP: 'sfx-gem-drop', GEM_BIG_DROP: 'sfx-gem-big-drop', FIREWORK: 'sfx-firework', SW_LIGHT_1: 'sfx-sw-light-1', SW_LIGHT_2: 'sfx-sw-light-2', SW_LIGHT_3: 'sfx-sw-light-3', SW_DARK_1: 'sfx-sw-dark-1', SW_DARK_2: 'sfx-sw-dark-2', SW_DARK_3: 'sfx-sw-dark-3', ENERGY_HUM: 'sfx-energy-hum', }; export function playSound(scene, key) { try { scene.sound.play(key); } catch (_) {} } // Picks and plays one of several keys at random (e.g. variations of the same cue). export function playRandomSound(scene, keys) { playSound(scene, keys[Math.floor(Math.random() * keys.length)]); } const SW_LIGHT_KEYS = [SFX.SW_LIGHT_1, SFX.SW_LIGHT_2, SFX.SW_LIGHT_3]; const SW_DARK_KEYS = [SFX.SW_DARK_1, SFX.SW_DARK_2, SFX.SW_DARK_3]; // SWDBG: Force track shifting toward the Rebel (light) or Empire (dark) side. export function playForceMove(scene, towardLight) { playRandomSound(scene, towardLight ? SW_LIGHT_KEYS : SW_DARK_KEYS); } // chip-bet is limited to one simultaneous instance. let _chipBetSound = null; export function playChipBet(scene) { if (_chipBetSound?.isPlaying) return; _chipBetSound?.destroy(); _chipBetSound = scene.sound.add(SFX.CHIP_BET); _chipBetSound.play(); } // Each plays at most one simultaneous instance (tie battles would otherwise double up). let _scifiLaunchSound = null; export function playScifiLaunch(scene) { if (_scifiLaunchSound?.isPlaying) return; _scifiLaunchSound?.destroy(); _scifiLaunchSound = scene.sound.add(SFX.SCIFI_LAUNCH); _scifiLaunchSound.play(); } let _scifiExplodeSound = null; export function playScifiExplode(scene) { if (_scifiExplodeSound?.isPlaying) return; _scifiExplodeSound?.destroy(); _scifiExplodeSound = scene.sound.add(SFX.SCIFI_EXPLODE); _scifiExplodeSound.play(); } let _scifiRiserSound = null; export function playScifiRiser(scene) { if (_scifiRiserSound?.isPlaying) return; _scifiRiserSound?.destroy(); _scifiRiserSound = scene.sound.add(SFX.SCIFI_RISER); _scifiRiserSound.play(); } let _scifiRevealSound = null; export function playScifiReveal(scene) { if (_scifiRevealSound?.isPlaying) return; _scifiRevealSound?.destroy(); _scifiRevealSound = scene.sound.add(SFX.SCIFI_REVEAL); _scifiRevealSound.play(); } let _scifiWooshSound = null; export function playScifiWoosh(scene) { if (_scifiWooshSound?.isPlaying) return; _scifiWooshSound?.destroy(); _scifiWooshSound = scene.sound.add(SFX.SCIFI_WOOSH); _scifiWooshSound.play(); } // Dot Link: plink/plonk with adjustable rate — even colour index → plink, odd → plonk export function playDotLinkSound(scene, colorIdx, pathLength) { const soundKey = colorIdx % 2 === 0 ? SFX.SCIFI_PLINK : SFX.SCIFI_PLONK; const rate = 1 + (pathLength - 1) * 0.5; const sound = scene.sound.add(soundKey); sound.setRate(rate); sound.play(); }