From 6e5178a10bef055a61b240dc05cf66873ab37bba Mon Sep 17 00:00:00 2001 From: Stephanie Gredell Date: Mon, 1 Sep 2025 11:54:50 -0700 Subject: [PATCH] add card swipe sound --- assets/sounds/swipe.mp3 | Bin 0 -> 5015 bytes src/ui/render.js | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 assets/sounds/swipe.mp3 diff --git a/assets/sounds/swipe.mp3 b/assets/sounds/swipe.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..4136cb800b42e5e68a70941bfea6599eb71eb5cc GIT binary patch literal 5015 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 literal 0 HcmV?d00001 diff --git a/src/ui/render.js b/src/ui/render.js index bfeead3..a79bf98 100644 --- a/src/ui/render.js +++ b/src/ui/render.js @@ -1,4 +1,15 @@ +// Simple audio utility +function playSound(soundFile) { + try { + const audio = new Audio(`assets/sounds/${soundFile}`); + audio.volume = 0.3; + audio.play().catch(e => {}); // Silently fail if no audio + } catch (e) { + // Silently fail if audio not available + } +} + export function showDamageNumber(damage, target, isPlayer = false) { const targetElement = isPlayer ? document.querySelector('.player-battle-zone') : @@ -225,6 +236,12 @@ export async function renderBattle(root) { `; app.querySelectorAll("[data-play]").forEach(btn => { + btn.addEventListener("mouseenter", () => { + if (btn.classList.contains('playable')) { + playSound('swipe.mp3'); + } + }); + btn.addEventListener("click", () => { const index = parseInt(btn.dataset.play, 10); const card = p.hand[index]; @@ -280,6 +297,7 @@ export async function renderBattle(root) { // First press or different key - select the card root.selectedCardIndex = cardIndex; updateCardSelection(root); + playSound('swipe.mp3'); // Play swipe sound on keyboard selection } } };