{"id":65,"date":"2026-05-17T18:27:01","date_gmt":"2026-05-17T09:27:01","guid":{"rendered":"https:\/\/game.lightsalt2.com\/?post_type=game&amp;p=65"},"modified":"2026-05-17T18:27:01","modified_gmt":"2026-05-17T09:27:01","slug":"%eb%aa%a8%eb%b0%94%ec%9d%bc-%ed%92%8d%ec%84%a0-%ed%84%b0%eb%9c%a8%eb%a6%ac%ea%b8%b0-%ea%b2%8c%ec%9e%84","status":"publish","type":"game","link":"https:\/\/game.lightsaltsound.com\/?game=%eb%aa%a8%eb%b0%94%ec%9d%bc-%ed%92%8d%ec%84%a0-%ed%84%b0%eb%9c%a8%eb%a6%ac%ea%b8%b0-%ea%b2%8c%ec%9e%84","title":{"rendered":"\ubaa8\ubc14\uc77c \ud48d\uc120 \ud130\ub728\ub9ac\uae30 \uac8c\uc784"},"content":{"rendered":"\n<!--\ubaa8\ubc14\uc77c \ud48d\uc120 \ud130\ub728\ub9ac\uae30 \uac8c\uc784 -->\n<div id=\"balloonGameWp\">\n<style>\n\n  #balloonGameWp *{\n    box-sizing:border-box;\n    margin:0;\n    padding:0;\n  }\n\n  #balloonGameWp{width:100%;min-height:100svh;overflow:hidden;font-family:Arial, \"Apple SD Gothic Neo\", \"Malgun Gothic\", sans-serif;background:#8fd3ff;touch-action:none;-webkit-tap-highlight-color:transparent;position:relative;}\n\n  \n\n  #balloonGameWp .game-wrap{\n    position:relative;\n    width:100%;\n    height:100vh;\n    overflow:hidden;\n    background:linear-gradient(to bottom, #8fd3ff 0%, #dff4ff 56%, #f7fcff 100%);\n  }\n\n  #balloonGameWp #gameCanvas{\n    display:block;\n    width:100%;\n    height:100%;\n  }\n\n  #balloonGameWp .hud{\n    position:absolute;\n    top:12px;\n    left:12px;\n    right:12px;\n    z-index:20;\n    display:flex;\n    justify-content:space-between;\n    align-items:flex-start;\n    gap:12px;\n    pointer-events:none;\n  }\n\n  #balloonGameWp .hud-left{\n    display:flex;\n    flex-direction:column;\n    gap:10px;\n    min-width:160px;\n  }\n\n  #balloonGameWp .hud-card{\n    background:rgba(255,255,255,0.9);\n    border-radius:18px;\n    padding:12px 14px;\n    box-shadow:0 6px 18px rgba(0,0,0,0.14);\n    pointer-events:auto;\n  }\n\n  #balloonGameWp .hud-card div{\n    font-size:14px;\n    line-height:1.6;\n    color:#17314f;\n    font-weight:800;\n  }\n\n  #balloonGameWp .hud-right{\n    display:flex;\n    flex-direction:column;\n    gap:8px;\n    pointer-events:auto;\n  }\n\n  #balloonGameWp .top-btn{\n    width:58px;\n    height:52px;\n    border:none;\n    border-radius:14px;\n    background:#1c2a44;\n    color:#fff;\n    font-size:20px;\n    font-weight:800;\n    box-shadow:0 6px 18px rgba(0,0,0,0.18);\n    cursor:pointer;\n  }\n\n  #balloonGameWp .top-btn:active{\n    transform:scale(0.96);\n  }\n\n  #balloonGameWp .guide-bar{\n    position:absolute;\n    left:50%;\n    bottom:16px;\n    transform:translateX(-50%);\n    z-index:18;\n    background:rgba(255,255,255,0.92);\n    color:#17314f;\n    font-size:13px;\n    font-weight:800;\n    padding:10px 16px calc(10px + env(safe-area-inset-bottom));\n    border-radius:999px;\n    box-shadow:0 6px 18px rgba(0,0,0,0.12);\n    white-space:nowrap;\n    max-width:calc(100% - 24px);\n    overflow:hidden;\n    text-overflow:ellipsis;\n  }\n\n  #balloonGameWp .touch-burst{\n    position:absolute;\n    width:68px;\n    height:68px;\n    border:3px solid rgba(255,59,48,0.95);\n    border-radius:50%;\n    transform:translate(-50%, -50%);\n    pointer-events:none;\n    z-index:15;\n    animation:burst .35s ease-out forwards;\n  }\n\n  @keyframes burst{\n    0%{\n      opacity:0.9;\n      transform:translate(-50%, -50%) scale(0.35);\n    }\n    100%{\n      opacity:0;\n      transform:translate(-50%, -50%) scale(1.35);\n    }\n  }\n\n  #balloonGameWp .screen-layer{\n    position:absolute;\n    inset:0;\n    z-index:30;\n    display:flex;\n    align-items:center;\n    justify-content:center;\n    padding:24px;\n    background:rgba(11,22,39,0.48);\n  }\n\n  #balloonGameWp .screen-layer.hidden{\n    display:none;\n  }\n\n  #balloonGameWp .panel{\n    width:100%;\n    max-width:340px;\n    background:#fff;\n    border-radius:26px;\n    padding:26px 22px;\n    text-align:center;\n    box-shadow:0 18px 50px rgba(0,0,0,0.22);\n  }\n\n  #balloonGameWp .panel h1,\n  #balloonGameWp .panel h2{\n    font-size:28px;\n    line-height:1.3;\n    color:#132a45;\n    margin-bottom:12px;\n    font-weight:900;\n  }\n\n  #balloonGameWp .panel p{\n    font-size:15px;\n    line-height:1.7;\n    color:#35506c;\n    margin-bottom:18px;\n  }\n\n  #balloonGameWp .panel strong{\n    color:#0f2741;\n  }\n\n  #balloonGameWp .panel .sub{\n    font-size:13px;\n    line-height:1.6;\n    color:#5a7087;\n    margin-top:4px;\n  }\n\n  #balloonGameWp .primary-btn,\n  #balloonGameWp .secondary-btn{\n    width:100%;\n    height:54px;\n    border:none;\n    border-radius:16px;\n    font-size:17px;\n    font-weight:900;\n    margin-top:10px;\n    cursor:pointer;\n  }\n\n  #balloonGameWp .primary-btn{\n    background:#1c2a44;\n    color:#fff;\n  }\n\n  #balloonGameWp .secondary-btn{\n    background:#eef3f8;\n    color:#18314f;\n  }\n\n  #balloonGameWp .primary-btn:active,\n  #balloonGameWp .secondary-btn:active{\n    transform:scale(0.98);\n  }\n\n  #balloonGameWp .pause-badge{\n    position:absolute;\n    left:50%;\n    top:50%;\n    transform:translate(-50%, -50%);\n    z-index:19;\n    background:rgba(28,42,68,0.9);\n    color:#fff;\n    font-size:18px;\n    font-weight:900;\n    padding:14px 18px;\n    border-radius:999px;\n    box-shadow:0 10px 28px rgba(0,0,0,0.18);\n    display:none;\n  }\n\n  #balloonGameWp .pause-badge.show{\n    display:block;\n  }\n\n\n  #balloonGameWp .stage-ad-layer{\n    position:absolute;\n    inset:0;\n    z-index:40;\n    display:none;\n    align-items:center;\n    justify-content:center;\n    padding:20px;\n    background:rgba(4,12,24,0.72);\n    backdrop-filter:blur(4px);\n  }\n\n  #balloonGameWp .stage-ad-layer.show{\n    display:flex;\n  }\n\n  #balloonGameWp .stage-ad-panel{\n    width:100%;\n    max-width:360px;\n    border-radius:24px;\n    padding:18px;\n    background:#ffffff;\n    box-shadow:0 18px 55px rgba(0,0,0,0.28);\n    text-align:center;\n  }\n\n  #balloonGameWp .stage-ad-title{\n    font-size:21px;\n    font-weight:900;\n    color:#132a45;\n    margin-bottom:8px;\n  }\n\n  #balloonGameWp .stage-ad-desc{\n    font-size:14px;\n    font-weight:800;\n    color:#52687f;\n    margin-bottom:12px;\n  }\n\n  #balloonGameWp .stage-ad-box{\n    min-height:250px;\n    display:flex;\n    align-items:center;\n    justify-content:center;\n    border-radius:18px;\n    background:#f3f6fa;\n    overflow:hidden;\n  }\n\n  #balloonGameWp .stage-ad-count{\n    margin-top:12px;\n    font-size:15px;\n    font-weight:900;\n    color:#e11d48;\n  }\n\n  @media (max-width:390px){\n    #balloonGameWp .hud-card div{\n      font-size:13px;\n    }\n\n    #balloonGameWp .top-btn{\n      width:54px;\n      height:48px;\n      font-size:18px;\n    }\n\n    #balloonGameWp .panel h1,\n    .panel h2{\n      font-size:25px;\n    }\n\n    #balloonGameWp .guide-bar{\n      font-size:12px;\n      bottom:12px;\n    }\n  }\n\n<\/style>\n\n<div class=\"game-wrap\">\n  <canvas id=\"gameCanvas\"><\/canvas>\n\n  <div class=\"hud\">\n    <div class=\"hud-left\">\n      <div class=\"hud-card\">\n        <div>\ub2e8\uacc4: <span id=\"stageText\">1<\/span> \/ 10<\/div>\n        <div>\ub0a8\uc740 \uc2dc\uac04: <span id=\"stageTimeText\">60<\/span>\ucd08<\/div>\n        <div>\uc810\uc218: <span id=\"score\">0<\/span><\/div>\n        <div>\uc0dd\uba85: <span id=\"lives\">5<\/span><\/div>\n        <div>\ucd5c\uace0 \uc810\uc218: <span id=\"bestScore\">0<\/span><\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"hud-right\">\n      <button id=\"btnRefresh\" class=\"top-btn\" type=\"button\">\u21bb<\/button>\n      <button id=\"btnPause\" class=\"top-btn\" type=\"button\">\u2161<\/button>\n      <button id=\"btnSound\" class=\"top-btn\" type=\"button\">\u266a<\/button>\n    <\/div>\n  <\/div>\n\n  <div id=\"pauseBadge\" class=\"pause-badge\">\uc77c\uc2dc\uc815\uc9c0<\/div>\n\n  <div id=\"stageAdLayer\" class=\"stage-ad-layer\" aria-live=\"polite\">\n    <div class=\"stage-ad-panel\">\n      <div id=\"stageAdTitle\" class=\"stage-ad-title\">2\ub2e8\uacc4 \ub3c4\uc804 \uc804 \uad11\uace0<\/div>\n      <div class=\"stage-ad-desc\">\uc9dd\uc218 \ub2e8\uacc4 \uc9c4\uc785 \uc2dc 3\ucd08 \ub4a4 \uc790\ub3d9\uc73c\ub85c \uac8c\uc784\uc774 \uc774\uc5b4\uc9d1\ub2c8\ub2e4.<\/div>\n      <div class=\"stage-ad-box\">\n        <!-- \ub514\uc2a4\ud50c\ub808\uc774\/\uc911\uac04\/\ubc18\uc751\ud615\/20241120 -->\n        <ins class=\"adsbygoogle\"\n             style=\"display:block;width:100%;min-height:250px;\"\n             data-ad-client=\"ca-pub-4434429177994128\"\n             data-ad-slot=\"8565857550\"\n             data-ad-format=\"auto\"\n             data-full-width-responsive=\"true\"><\/ins>\n      <\/div>\n      <div id=\"stageAdCount\" class=\"stage-ad-count\">3\ucd08 \ub0a8\uc74c<\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"guide-bar\">\ud654\uba74\uc744 \ud130\uce58\ud574 \ud48d\uc120\uc744 \ud130\ub728\ub9ac\uc138\uc694. \uac01 \ub2e8\uacc4\ub294 1\ubd84\uc529 \uc9c4\ud589\ub429\ub2c8\ub2e4.<\/div>\n\n  <div id=\"startLayer\" class=\"screen-layer\">\n    <div class=\"panel\">\n      <h1>\ud48d\uc120 \ud130\ub728\ub9ac\uae30<\/h1>\n      <p>\n        \ud654\uba74\uc744 \ud130\uce58\ud55c \uc704\uce58\uc758 \ud48d\uc120\uc744 \ubc14\ub85c \ud130\ub728\ub9ac\ub294 \uac8c\uc784\uc785\ub2c8\ub2e4.\n        <strong>\uc791\uace0 \ube60\ub978 \ud48d\uc120<\/strong>\uc77c\uc218\ub85d \ub354 \ub192\uc740 \uc810\uc218\ub97c \ubc1b\uc2b5\ub2c8\ub2e4.\n        \uac00\ub054 \ub098\uc624\ub294 <strong>\ub3d9\ubb3c \ubcf4\ub108\uc2a4<\/strong>\ub97c \ub9de\ud788\uba74 \uc0dd\uba85 \ub610\ub294 \ud070 \uc810\uc218\ub97c \uc5bb\uc2b5\ub2c8\ub2e4.\n      <\/p>\n      <p class=\"sub\">\n        \uac01 \ub2e8\uacc4\ub294 \uc57d 1\ubd84 \ub3d9\uc548 \uc9c4\ud589\ub418\uba70, \ucd1d 10\ub2e8\uacc4\uae4c\uc9c0 \ub3c4\uc804\ud569\ub2c8\ub2e4.\n        \uc9dd\uc218 \ub2e8\uacc4\uc5d0\uc11c\ub294 3\ucd08 \uad11\uace0 \ub4a4 \uc790\ub3d9\uc73c\ub85c \uac8c\uc784\uc774 \uc774\uc5b4\uc9d1\ub2c8\ub2e4.\n      <\/p>\n      <button id=\"startBtn\" class=\"primary-btn\" type=\"button\">\uac8c\uc784 \uc2dc\uc791<\/button>\n    <\/div>\n  <\/div>\n\n  <div id=\"gameOverLayer\" class=\"screen-layer hidden\">\n    <div class=\"panel\">\n      <h2>\uac8c\uc784 \uc624\ubc84<\/h2>\n      <p>\ucd5c\uc885 \uc810\uc218\ub294 <strong id=\"finalScore\">0<\/strong>\uc810\uc785\ub2c8\ub2e4.<\/p>\n      <p id=\"bonusResultText\" class=\"sub\">\ucd5c\uace0 \uc810\uc218\ub97c \uac31\uc2e0\ud574 \ubcf4\uc138\uc694.<\/p>\n      <button id=\"restartBtn\" class=\"primary-btn\" type=\"button\">\ub2e4\uc2dc \uc2dc\uc791<\/button>\n      <button id=\"closeBtn\" class=\"secondary-btn\" type=\"button\">\ucc98\uc74c \ud654\uba74\uc73c\ub85c<\/button>\n    <\/div>\n  <\/div>\n\n  <audio id=\"bgm\" loop preload=\"auto\">\n    <source src=\"\/bgm.mp3\" type=\"audio\/mpeg\" \/>\n  <\/audio>\n<\/div>\n\n<script>\n(function(){\n  const canvas = document.getElementById(\"gameCanvas\");\n  const ctx = canvas.getContext(\"2d\");\n\n  const scoreEl = document.getElementById(\"score\");\n  const stageTextEl = document.getElementById(\"stageText\");\n  const stageTimeTextEl = document.getElementById(\"stageTimeText\");\n  const livesEl = document.getElementById(\"lives\");\n  const bestScoreEl = document.getElementById(\"bestScore\");\n  const finalScoreEl = document.getElementById(\"finalScore\");\n  const bonusResultText = document.getElementById(\"bonusResultText\");\n\n  const btnRefresh = document.getElementById(\"btnRefresh\");\n  const btnPause = document.getElementById(\"btnPause\");\n  const btnSound = document.getElementById(\"btnSound\");\n  const pauseBadge = document.getElementById(\"pauseBadge\");\n\n  const stageAdLayer = document.getElementById(\"stageAdLayer\");\n  const stageAdTitle = document.getElementById(\"stageAdTitle\");\n  const stageAdCount = document.getElementById(\"stageAdCount\");\n\n  const startLayer = document.getElementById(\"startLayer\");\n  const gameOverLayer = document.getElementById(\"gameOverLayer\");\n  const startBtn = document.getElementById(\"startBtn\");\n  const restartBtn = document.getElementById(\"restartBtn\");\n  const closeBtn = document.getElementById(\"closeBtn\");\n\n  const bgm = document.getElementById(\"bgm\");\n\n  let w = 0;\n  let h = 0;\n  let score = 0;\n  let lives = 5;\n  let bestScore = Number(localStorage.getItem(\"balloon_touch_best_score\") || 0);\n  let paused = false;\n  let gameStarted = false;\n  let gameOver = false;\n  let lastTime = 0;\n  let spawnTimer = 0;\n  let playTime = 0;\n  let soundOn = true;\n\n  const MAX_STAGE = 10;\n  const STAGE_DURATION = 60;\n  let currentStage = 1;\n  let stageElapsed = 0;\n  let adShowing = false;\n  let adTimerId = null;\n  let adCloseTimerId = null;\n  let pausedBeforeAd = false;\n  const shownAdStages = new Set();\n\n  const balloons = [];\n  const particles = [];\n  const tapEffects = [];\n  const floatingTexts = [];\n\n  bestScoreEl.textContent = bestScore;\n\n  function resizeCanvas(){\n    w = window.innerWidth;\n    h = window.innerHeight;\n    canvas.width = w * devicePixelRatio;\n    canvas.height = h * devicePixelRatio;\n    canvas.style.width = w + \"px\";\n    canvas.style.height = h + \"px\";\n    ctx.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0);\n  }\n\n  function random(min, max){\n    return Math.random() * (max - min) + min;\n  }\n\n  function pick(arr){\n    return arr[Math.floor(Math.random() * arr.length)];\n  }\n\n  function clamp(value, min, max){\n    return Math.max(min, Math.min(max, value));\n  }\n\n  function updateStageUI(){\n    const remain = Math.max(0, Math.ceil(STAGE_DURATION - stageElapsed));\n    stageTextEl.textContent = currentStage;\n    stageTimeTextEl.textContent = remain;\n  }\n\n  function safePushAdsense(){\n    try{\n      (window.adsbygoogle = window.adsbygoogle || []).push({});\n    } catch(err){\n      \/\/ \uad11\uace0 \ub85c\ub4dc \uc608\uc678\uac00 \ub098\ub3c4 \uac8c\uc784 \ud750\ub984\uc740 \uc720\uc9c0\ud569\ub2c8\ub2e4.\n    }\n  }\n\n  function showStageAd(stage){\n    if(adShowing || shownAdStages.has(stage)) return;\n\n    shownAdStages.add(stage);\n    adShowing = true;\n    pausedBeforeAd = paused;\n    paused = true;\n    stopBgm();\n    btnPause.textContent = \"\u25b6\";\n    pauseBadge.classList.remove(\"show\");\n\n    stageAdTitle.textContent = `${stage}\ub2e8\uacc4 \uc2dc\uc791 \uc804 \uad11\uace0`;\n    stageAdLayer.classList.add(\"show\");\n\n    let remain = 3;\n    stageAdCount.textContent = `${remain}\ucd08 \ub0a8\uc74c`;\n    safePushAdsense();\n\n    clearInterval(adTimerId);\n    clearTimeout(adCloseTimerId);\n\n    adTimerId = setInterval(() => {\n      remain -= 1;\n      stageAdCount.textContent = remain > 0 ? `${remain}\ucd08 \ub0a8\uc74c` : \"\uace7 \uac8c\uc784\uc774 \uc774\uc5b4\uc9d1\ub2c8\ub2e4.\";\n      if(remain <= 0){\n        clearInterval(adTimerId);\n      }\n    }, 1000);\n\n    adCloseTimerId = setTimeout(() => {\n      stageAdLayer.classList.remove(\"show\");\n      adShowing = false;\n      paused = pausedBeforeAd;\n      btnPause.textContent = paused ? \"\u25b6\" : \"\u2161\";\n      pauseBadge.classList.toggle(\"show\", paused);\n      if(!paused && gameStarted && !gameOver && soundOn){\n        playBgm();\n      }\n    }, 3000);\n  }\n\n  function advanceStage(){\n    if(currentStage >= MAX_STAGE){\n      stageElapsed = STAGE_DURATION;\n      updateStageUI();\n      endGame(true);\n      return;\n    }\n\n    currentStage += 1;\n    stageElapsed = 0;\n    updateStageUI();\n\n    if(currentStage % 2 === 0){\n      showStageAd(currentStage);\n    }\n  }\n\n\n  function playBgm(){\n    if(!bgm || !soundOn) return;\n    bgm.volume = 0.28;\n    const playPromise = bgm.play();\n    if(playPromise && typeof playPromise.then === \"function\"){\n      playPromise.catch(() => {});\n    }\n  }\n\n  function stopBgm(){\n    if(!bgm) return;\n    bgm.pause();\n  }\n\n  function updateSoundButton(){\n    btnSound.textContent = soundOn ? \"\u266a\" : \"\ud83d\udd07\";\n  }\n\n  function toggleSound(){\n    soundOn = !soundOn;\n    updateSoundButton();\n\n    if(soundOn && gameStarted && !paused && !gameOver){\n      playBgm();\n    } else {\n      stopBgm();\n    }\n  }\n\n  function createBalloon(){\n    const isBonus = Math.random() < 0.12;\n    const radius = isBonus ? random(26, 36) : random(18, 42);\n\n    let speedBase = isBonus ? random(64, 98) : random(44, 112);\n    speedBase += Math.min(playTime * 1.8, 60);\n\n    const colors = [\"#ff4d6d\", \"#ffa502\", \"#2ed573\", \"#1e90ff\", \"#a55eea\", \"#ff6b81\", \"#ff9f43\"];\n    const bonusAnimals = [\"\ud83d\udc36\", \"\ud83d\udc31\", \"\ud83d\udc30\", \"\ud83d\udc3b\", \"\ud83d\udc3c\", \"\ud83e\udd8a\"];\n\n    const balloon = {\n      type: isBonus ? \"bonus\" : \"normal\",\n      x: random(radius + 12, w - radius - 12),\n      y: h + radius + random(20, 140),\n      radius,\n      color: pick(colors),\n      speed: speedBase,\n      sway: random(0.7, 1.5),\n      swayWidth: random(6, 18),\n      offset: random(0, Math.PI * 2),\n      animal: isBonus ? pick(bonusAnimals) : \"\",\n      rewardType: isBonus ? (Math.random() < 0.45 ? \"life\" : \"score\") : \"\"\n    };\n\n    balloons.push(balloon);\n  }\n\n  function createPop(x, y, color, count = 14){\n    for(let i = 0; i < count; i++){\n      particles.push({\n        x,\n        y,\n        vx: random(-3.6, 3.6),\n        vy: random(-3.6, 3.6),\n        alpha: 1,\n        size: random(2.5, 6.5),\n        color\n      });\n    }\n  }\n\n  function addTapEffect(x, y){\n    tapEffects.push({\n      x,\n      y,\n      alpha: 0.85,\n      scale: 0.4\n    });\n\n    const el = document.createElement(\"div\");\n    el.className = \"touch-burst\";\n    el.style.left = x + \"px\";\n    el.style.top = y + \"px\";\n    document.querySelector(\".game-wrap\").appendChild(el);\n    setTimeout(() => el.remove(), 350);\n  }\n\n  function drawSky(){\n    ctx.fillStyle = \"rgba(255,255,255,0.55)\";\n    drawCloud(34, 84, 0.9);\n    drawCloud(w * 0.42, 108, 1.15);\n    drawCloud(w * 0.76, 72, 0.85);\n\n    ctx.fillStyle = \"rgba(255,255,255,0.28)\";\n    drawCloud(w * 0.2, 160, 0.65);\n    drawCloud(w * 0.82, 176, 0.72);\n  }\n\n  function drawCloud(x, y, scale){\n    ctx.beginPath();\n    ctx.arc(x, y, 20 * scale, 0, Math.PI * 2);\n    ctx.arc(x + 20 * scale, y - 10 * scale, 26 * scale, 0, Math.PI * 2);\n    ctx.arc(x + 44 * scale, y, 20 * scale, 0, Math.PI * 2);\n    ctx.arc(x + 22 * scale, y + 10 * scale, 24 * scale, 0, Math.PI * 2);\n    ctx.fill();\n  }\n\n  function drawBalloon(obj, time){\n    const swayX = Math.sin(time * 0.001 * obj.sway + obj.offset) * obj.swayWidth;\n    const bx = obj.x + swayX;\n    const by = obj.y;\n\n    obj.renderX = bx;\n    obj.renderY = by;\n\n    ctx.beginPath();\n    ctx.ellipse(bx, by, obj.radius * 0.92, obj.radius * 1.12, 0, 0, Math.PI * 2);\n    ctx.fillStyle = obj.color;\n    ctx.fill();\n\n    ctx.beginPath();\n    ctx.arc(bx - obj.radius * 0.22, by - obj.radius * 0.28, obj.radius * 0.18, 0, Math.PI * 2);\n    ctx.fillStyle = \"rgba(255,255,255,0.35)\";\n    ctx.fill();\n\n    ctx.beginPath();\n    ctx.moveTo(bx, by + obj.radius * 1.08);\n    ctx.lineTo(bx - 4, by + obj.radius * 1.32);\n    ctx.lineTo(bx + 4, by + obj.radius * 1.32);\n    ctx.closePath();\n    ctx.fillStyle = obj.color;\n    ctx.fill();\n\n    ctx.beginPath();\n    ctx.moveTo(bx, by + obj.radius * 1.32);\n    ctx.quadraticCurveTo(\n      bx + Math.sin(time * 0.003 + obj.offset) * 8,\n      by + obj.radius * 2.0,\n      bx - 4,\n      by + obj.radius * 2.75\n    );\n    ctx.strokeStyle = \"#6b7280\";\n    ctx.lineWidth = 1.4;\n    ctx.stroke();\n\n    if(obj.type === \"bonus\"){\n      ctx.font = `${Math.floor(obj.radius * 1.15)}px Arial`;\n      ctx.textAlign = \"center\";\n      ctx.textBaseline = \"middle\";\n      ctx.fillText(obj.animal, bx, by + 2);\n\n      ctx.beginPath();\n      ctx.arc(bx, by - obj.radius - 10, 12, 0, Math.PI * 2);\n      ctx.fillStyle = \"rgba(255,215,0,0.95)\";\n      ctx.fill();\n\n      ctx.fillStyle = \"#7a5200\";\n      ctx.font = \"bold 12px Arial\";\n      ctx.fillText(\"\u2605\", bx, by - obj.radius - 10);\n    }\n  }\n\n  function drawParticles(){\n    for(let i = particles.length - 1; i >= 0; i--){\n      const p = particles[i];\n      p.x += p.vx;\n      p.y += p.vy;\n      p.alpha -= 0.032;\n\n      if(p.alpha <= 0){\n        particles.splice(i, 1);\n        continue;\n      }\n\n      ctx.globalAlpha = p.alpha;\n      ctx.beginPath();\n      ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);\n      ctx.fillStyle = p.color;\n      ctx.fill();\n      ctx.globalAlpha = 1;\n    }\n  }\n\n  function drawTapEffects(){\n    for(let i = tapEffects.length - 1; i >= 0; i--){\n      const e = tapEffects[i];\n      e.alpha -= 0.05;\n      e.scale += 0.08;\n\n      if(e.alpha <= 0){\n        tapEffects.splice(i, 1);\n        continue;\n      }\n\n      ctx.globalAlpha = e.alpha;\n      ctx.beginPath();\n      ctx.arc(e.x, e.y, 24 * e.scale, 0, Math.PI * 2);\n      ctx.strokeStyle = \"#ff3b30\";\n      ctx.lineWidth = 3;\n      ctx.stroke();\n      ctx.globalAlpha = 1;\n    }\n  }\n\n  function drawFloatingTexts(){\n    for(let i = floatingTexts.length - 1; i >= 0; i--){\n      const t = floatingTexts[i];\n      t.y -= 0.7;\n      t.alpha -= 0.02;\n\n      if(t.alpha <= 0){\n        floatingTexts.splice(i, 1);\n        continue;\n      }\n\n      ctx.globalAlpha = t.alpha;\n      ctx.fillStyle = t.color;\n      ctx.font = \"bold 18px Arial\";\n      ctx.textAlign = \"center\";\n      ctx.textBaseline = \"middle\";\n      ctx.fillText(t.text, t.x, t.y);\n      ctx.globalAlpha = 1;\n    }\n  }\n\n  function showFloatingText(x, y, color, text){\n    floatingTexts.push({\n      x,\n      y,\n      color,\n      text,\n      alpha: 1\n    });\n  }\n\n  function computeNormalScore(balloon){\n    const sizeFactor = clamp((48 - balloon.radius) * 2.1, 8, 70);\n    const speedFactor = clamp(balloon.speed * 0.18, 8, 45);\n    return Math.round(sizeFactor + speedFactor);\n  }\n\n  function getBonusReward(balloon){\n    if(balloon.rewardType === \"life\"){\n      return {\n        type: \"life\",\n        value: 1,\n        text: \"\uc0dd\uba85 +1\"\n      };\n    }\n\n    const bonusScore = Math.round(120 + (110 - balloon.radius) + balloon.speed * 0.45);\n    return {\n      type: \"score\",\n      value: bonusScore,\n      text: `\ubcf4\ub108\uc2a4 +${bonusScore}`\n    };\n  }\n\n  function popBalloon(index){\n    const target = balloons[index];\n    if(!target) return;\n\n    createPop(target.renderX, target.renderY, target.color, target.type === \"bonus\" ? 22 : 14);\n    balloons.splice(index, 1);\n\n    if(target.type === \"bonus\"){\n      const reward = getBonusReward(target);\n\n      if(reward.type === \"life\"){\n        lives += reward.value;\n        livesEl.textContent = lives;\n        showFloatingText(target.renderX, target.renderY, \"#16a34a\", reward.text);\n      } else {\n        score += reward.value;\n        scoreEl.textContent = score;\n        showFloatingText(target.renderX, target.renderY, \"#d97706\", reward.text);\n      }\n    } else {\n      const gained = computeNormalScore(target);\n      score += gained;\n      scoreEl.textContent = score;\n      showFloatingText(target.renderX, target.renderY, \"#1d4ed8\", `+${gained}`);\n    }\n\n    if(score > bestScore){\n      bestScore = score;\n      localStorage.setItem(\"balloon_touch_best_score\", String(bestScore));\n      bestScoreEl.textContent = bestScore;\n    }\n  }\n\n  function tryPopAt(x, y){\n    if(!gameStarted || paused || gameOver || adShowing) return;\n\n    addTapEffect(x, y);\n\n    const hits = [];\n\n    for(let i = balloons.length - 1; i >= 0; i--){\n      const b = balloons[i];\n      const dx = x - b.renderX;\n      const dy = y - b.renderY;\n      const dist = Math.sqrt(dx * dx + dy * dy);\n\n      if(dist <= b.radius){\n        hits.push(i);\n      }\n    }\n\n    hits.sort((a, b) => b - a);\n\n    for(const i of hits){\n      popBalloon(i);\n    }\n  }\n\n  function update(dt){\n    if(!gameStarted || paused || gameOver || adShowing) return;\n\n    playTime += dt;\n    stageElapsed += dt;\n    if(stageElapsed >= STAGE_DURATION){\n      advanceStage();\n      return;\n    }\n    updateStageUI();\n    spawnTimer += dt;\n\n    const spawnInterval = Math.max(0.34, 0.95 - Math.min(playTime * 0.015, 0.42));\n\n    if(spawnTimer >= spawnInterval){\n      spawnTimer = 0;\n      createBalloon();\n      if(Math.random() < 0.35){\n        setTimeout(() => {\n          if(!paused && !gameOver && gameStarted && !adShowing){\n            createBalloon();\n          }\n        }, 140);\n      }\n    }\n\n    for(let i = balloons.length - 1; i >= 0; i--){\n      const b = balloons[i];\n      b.y -= b.speed * dt;\n\n      if(b.y < -70){\n        if(b.type === \"normal\"){\n          lives -= 1;\n          livesEl.textContent = lives;\n          showFloatingText(\n            clamp((b.renderX || b.x), 30, w - 30),\n            92,\n            \"#dc2626\",\n            \"\uc0dd\uba85 -1\"\n          );\n\n          if(lives <= 0){\n            endGame();\n          }\n        }\n        balloons.splice(i, 1);\n      }\n    }\n  }\n\n  function render(time){\n    ctx.clearRect(0, 0, w, h);\n    drawSky();\n\n    for(const b of balloons){\n      drawBalloon(b, time);\n    }\n\n    drawParticles();\n    drawTapEffects();\n    drawFloatingTexts();\n  }\n\n  function loop(timestamp){\n    const dt = Math.min((timestamp - lastTime) \/ 1000 || 0, 0.033);\n    lastTime = timestamp;\n\n    update(dt);\n    render(timestamp);\n\n    requestAnimationFrame(loop);\n  }\n\n  function resetState(){\n    score = 0;\n    lives = 5;\n    paused = false;\n    gameOver = false;\n    playTime = 0;\n    spawnTimer = 0;\n    currentStage = 1;\n    stageElapsed = 0;\n    adShowing = false;\n    shownAdStages.clear();\n    clearInterval(adTimerId);\n    clearTimeout(adCloseTimerId);\n    stageAdLayer.classList.remove(\"show\");\n    balloons.length = 0;\n    particles.length = 0;\n    tapEffects.length = 0;\n    floatingTexts.length = 0;\n\n    scoreEl.textContent = score;\n    livesEl.textContent = lives;\n    updateStageUI();\n    btnPause.textContent = \"\u2161\";\n    pauseBadge.classList.remove(\"show\");\n    gameOverLayer.classList.add(\"hidden\");\n    updateSoundButton();\n  }\n\n  function startGame(){\n    resetState();\n    gameStarted = true;\n    startLayer.classList.add(\"hidden\");\n    if(soundOn){\n      playBgm();\n    }\n  }\n\n  function restartGame(){\n    startGame();\n  }\n\n  function backToStart(){\n    resetState();\n    gameStarted = false;\n    startLayer.classList.remove(\"hidden\");\n    gameOverLayer.classList.add(\"hidden\");\n    stopBgm();\n  }\n\n  function togglePause(){\n    if(!gameStarted || gameOver) return;\n\n    paused = !paused;\n    btnPause.textContent = paused ? \"\u25b6\" : \"\u2161\";\n    pauseBadge.classList.toggle(\"show\", paused);\n\n    if(paused){\n      stopBgm();\n    } else if(soundOn){\n      playBgm();\n    }\n  }\n\n  function endGame(completed = false){\n    gameOver = true;\n    finalScoreEl.textContent = score;\n    bonusResultText.textContent = completed\n      ? \"10\ub2e8\uacc4\ub97c \ubaa8\ub450 \uc644\ub8cc\ud588\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \ub3c4\uc804\ud574 \ub354 \ub192\uc740 \uc810\uc218\ub97c \ub178\ub824\ubcf4\uc138\uc694.\"\n      : (score >= bestScore\n        ? \"\ucd5c\uace0 \uc810\uc218\ub97c \uc0c8\ub85c \uae30\ub85d\ud588\uc2b5\ub2c8\ub2e4.\"\n        : \"\uc791\uace0 \ube60\ub978 \ud48d\uc120\uc744 \ub354 \ub178\ub9ac\uba74 \uc810\uc218\ub97c \ub354 \uc62c\ub9b4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\");\n    gameOverLayer.classList.remove(\"hidden\");\n    stopBgm();\n  }\n\n  function handlePoint(clientX, clientY){\n    const rect = canvas.getBoundingClientRect();\n    const x = clientX - rect.left;\n    const y = clientY - rect.top;\n    tryPopAt(x, y);\n  }\n\n  canvas.addEventListener(\"pointerdown\", function(e){\n    e.preventDefault();\n    handlePoint(e.clientX, e.clientY);\n  });\n\n  canvas.addEventListener(\"pointermove\", function(e){\n    if(e.pressure > 0 || e.buttons === 1){\n      e.preventDefault();\n      handlePoint(e.clientX, e.clientY);\n    }\n  });\n\n  canvas.addEventListener(\"touchstart\", function(e){\n    e.preventDefault();\n    for(const touch of e.touches){\n      handlePoint(touch.clientX, touch.clientY);\n    }\n  }, { passive:false });\n\n  canvas.addEventListener(\"touchmove\", function(e){\n    e.preventDefault();\n    for(const touch of e.touches){\n      handlePoint(touch.clientX, touch.clientY);\n    }\n  }, { passive:false });\n\n  btnRefresh.addEventListener(\"click\", function(e){\n    e.preventDefault();\n    if(gameStarted){\n      restartGame();\n    } else {\n      startGame();\n    }\n  });\n\n  btnPause.addEventListener(\"click\", function(e){\n    e.preventDefault();\n    togglePause();\n  });\n\n  btnSound.addEventListener(\"click\", function(e){\n    e.preventDefault();\n    toggleSound();\n  });\n\n  startBtn.addEventListener(\"click\", function(){\n    startGame();\n  });\n\n  restartBtn.addEventListener(\"click\", function(){\n    restartGame();\n  });\n\n  closeBtn.addEventListener(\"click\", function(){\n    backToStart();\n  });\n\n  document.addEventListener(\"keydown\", function(e){\n    if(e.key === \"p\" || e.key === \"P\"){\n      togglePause();\n    }\n    if(e.key === \"r\" || e.key === \"R\"){\n      if(gameStarted){\n        restartGame();\n      } else {\n        startGame();\n      }\n    }\n  });\n\n  document.addEventListener(\"visibilitychange\", function(){\n    if(document.hidden && gameStarted && !gameOver){\n      paused = true;\n      btnPause.textContent = \"\u25b6\";\n      pauseBadge.classList.add(\"show\");\n      stopBgm();\n    }\n  });\n\n  window.addEventListener(\"resize\", resizeCanvas);\n\n  resizeCanvas();\n  updateSoundButton();\n  lastTime = performance.now();\n  requestAnimationFrame(loop);\n})();\n<\/script>\n\n<script async src=\"https:\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-4434429177994128\" crossorigin=\"anonymous\"><\/script>\n<script>\n(function(){\n  const root = document.getElementById(\"balloonGameWp\");\n  const canvas = root.querySelector(\"#gameCanvas\");\n  const ctx = canvas.getContext(\"2d\");\n\n  const scoreEl = root.querySelector(\"#score\");\n  const stageTextEl = root.querySelector(\"#stageText\");\n  const stageTimeTextEl = root.querySelector(\"#stageTimeText\");\n  const livesEl = root.querySelector(\"#lives\");\n  const bestScoreEl = root.querySelector(\"#bestScore\");\n  const finalScoreEl = root.querySelector(\"#finalScore\");\n  const bonusResultText = root.querySelector(\"#bonusResultText\");\n\n  const btnRefresh = root.querySelector(\"#btnRefresh\");\n  const btnPause = root.querySelector(\"#btnPause\");\n  const btnSound = root.querySelector(\"#btnSound\");\n  const pauseBadge = root.querySelector(\"#pauseBadge\");\n\n  const stageAdLayer = root.querySelector(\"#stageAdLayer\");\n  const stageAdTitle = root.querySelector(\"#stageAdTitle\");\n  const stageAdCount = root.querySelector(\"#stageAdCount\");\n\n  const startLayer = root.querySelector(\"#startLayer\");\n  const gameOverLayer = root.querySelector(\"#gameOverLayer\");\n  const startBtn = root.querySelector(\"#startBtn\");\n  const restartBtn = root.querySelector(\"#restartBtn\");\n  const closeBtn = root.querySelector(\"#closeBtn\");\n\n  const bgm = root.querySelector(\"#bgm\");\n\n  let w = 0;\n  let h = 0;\n  let score = 0;\n  let lives = 5;\n  let bestScore = Number(localStorage.getItem(\"balloon_touch_best_score\") || 0);\n  let paused = false;\n  let gameStarted = false;\n  let gameOver = false;\n  let lastTime = 0;\n  let spawnTimer = 0;\n  let playTime = 0;\n  let soundOn = true;\n\n  const MAX_STAGE = 10;\n  const STAGE_DURATION = 60;\n  let currentStage = 1;\n  let stageElapsed = 0;\n  let adShowing = false;\n  let adTimerId = null;\n  let adCloseTimerId = null;\n  let pausedBeforeAd = false;\n  const shownAdStages = new Set();\n\n  const balloons = [];\n  const particles = [];\n  const tapEffects = [];\n  const floatingTexts = [];\n\n  bestScoreEl.textContent = bestScore;\n\n  function resizeCanvas(){\n    const wrap = root.querySelector(\".game-wrap\");\n    const rect = wrap.getBoundingClientRect();\n    w = Math.max(320, rect.width || window.innerWidth);\n    h = Math.max(520, rect.height || window.innerHeight);\n    canvas.width = w * devicePixelRatio;\n    canvas.height = h * devicePixelRatio;\n    canvas.style.width = w + \"px\";\n    canvas.style.height = h + \"px\";\n    ctx.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0);\n  }\n\n  function random(min, max){\n    return Math.random() * (max - min) + min;\n  }\n\n  function pick(arr){\n    return arr[Math.floor(Math.random() * arr.length)];\n  }\n\n  function clamp(value, min, max){\n    return Math.max(min, Math.min(max, value));\n  }\n\n  function updateStageUI(){\n    const remain = Math.max(0, Math.ceil(STAGE_DURATION - stageElapsed));\n    stageTextEl.textContent = currentStage;\n    stageTimeTextEl.textContent = remain;\n  }\n\n  function safePushAdsense(){\n    try{\n      (window.adsbygoogle = window.adsbygoogle || []).push({});\n    } catch(err){\n      \/\/ \uad11\uace0 \ub85c\ub4dc \uc608\uc678\uac00 \ub098\ub3c4 \uac8c\uc784 \ud750\ub984\uc740 \uc720\uc9c0\ud569\ub2c8\ub2e4.\n    }\n  }\n\n  function showStageAd(stage){\n    if(adShowing || shownAdStages.has(stage)) return;\n\n    shownAdStages.add(stage);\n    adShowing = true;\n    pausedBeforeAd = paused;\n    paused = true;\n    stopBgm();\n    btnPause.textContent = \"\u25b6\";\n    pauseBadge.classList.remove(\"show\");\n\n    stageAdTitle.textContent = `${stage}\ub2e8\uacc4 \uc2dc\uc791 \uc804 \uad11\uace0`;\n    stageAdLayer.classList.add(\"show\");\n\n    let remain = 3;\n    stageAdCount.textContent = `${remain}\ucd08 \ub0a8\uc74c`;\n    safePushAdsense();\n\n    clearInterval(adTimerId);\n    clearTimeout(adCloseTimerId);\n\n    adTimerId = setInterval(() => {\n      remain -= 1;\n      stageAdCount.textContent = remain > 0 ? `${remain}\ucd08 \ub0a8\uc74c` : \"\uace7 \uac8c\uc784\uc774 \uc774\uc5b4\uc9d1\ub2c8\ub2e4.\";\n      if(remain <= 0){\n        clearInterval(adTimerId);\n      }\n    }, 1000);\n\n    adCloseTimerId = setTimeout(() => {\n      stageAdLayer.classList.remove(\"show\");\n      adShowing = false;\n      paused = pausedBeforeAd;\n      btnPause.textContent = paused ? \"\u25b6\" : \"\u2161\";\n      pauseBadge.classList.toggle(\"show\", paused);\n      if(!paused && gameStarted && !gameOver && soundOn){\n        playBgm();\n      }\n    }, 3000);\n  }\n\n  function advanceStage(){\n    if(currentStage >= MAX_STAGE){\n      stageElapsed = STAGE_DURATION;\n      updateStageUI();\n      endGame(true);\n      return;\n    }\n\n    currentStage += 1;\n    stageElapsed = 0;\n    updateStageUI();\n\n    if(currentStage % 2 === 0){\n      showStageAd(currentStage);\n    }\n  }\n\n\n  function playBgm(){\n    if(!bgm || !soundOn) return;\n    bgm.volume = 0.28;\n    const playPromise = bgm.play();\n    if(playPromise && typeof playPromise.then === \"function\"){\n      playPromise.catch(() => {});\n    }\n  }\n\n  function stopBgm(){\n    if(!bgm) return;\n    bgm.pause();\n  }\n\n  function updateSoundButton(){\n    btnSound.textContent = soundOn ? \"\u266a\" : \"\ud83d\udd07\";\n  }\n\n  function toggleSound(){\n    soundOn = !soundOn;\n    updateSoundButton();\n\n    if(soundOn && gameStarted && !paused && !gameOver){\n      playBgm();\n    } else {\n      stopBgm();\n    }\n  }\n\n  function createBalloon(){\n    const isBonus = Math.random() < 0.12;\n    const radius = isBonus ? random(26, 36) : random(18, 42);\n\n    let speedBase = isBonus ? random(64, 98) : random(44, 112);\n    speedBase += Math.min(playTime * 1.8, 60);\n\n    const colors = [\"#ff4d6d\", \"#ffa502\", \"#2ed573\", \"#1e90ff\", \"#a55eea\", \"#ff6b81\", \"#ff9f43\"];\n    const bonusAnimals = [\"\ud83d\udc36\", \"\ud83d\udc31\", \"\ud83d\udc30\", \"\ud83d\udc3b\", \"\ud83d\udc3c\", \"\ud83e\udd8a\"];\n\n    const balloon = {\n      type: isBonus ? \"bonus\" : \"normal\",\n      x: random(radius + 12, w - radius - 12),\n      y: h + radius + random(20, 140),\n      radius,\n      color: pick(colors),\n      speed: speedBase,\n      sway: random(0.7, 1.5),\n      swayWidth: random(6, 18),\n      offset: random(0, Math.PI * 2),\n      animal: isBonus ? pick(bonusAnimals) : \"\",\n      rewardType: isBonus ? (Math.random() < 0.45 ? \"life\" : \"score\") : \"\"\n    };\n\n    balloons.push(balloon);\n  }\n\n  function createPop(x, y, color, count = 14){\n    for(let i = 0; i < count; i++){\n      particles.push({\n        x,\n        y,\n        vx: random(-3.6, 3.6),\n        vy: random(-3.6, 3.6),\n        alpha: 1,\n        size: random(2.5, 6.5),\n        color\n      });\n    }\n  }\n\n  function addTapEffect(x, y){\n    tapEffects.push({\n      x,\n      y,\n      alpha: 0.85,\n      scale: 0.4\n    });\n\n    const el = document.createElement(\"div\");\n    el.className = \"touch-burst\";\n    el.style.left = x + \"px\";\n    el.style.top = y + \"px\";\n    root.querySelector(\".game-wrap\").appendChild(el);\n    setTimeout(() => el.remove(), 350);\n  }\n\n  function drawSky(){\n    ctx.fillStyle = \"rgba(255,255,255,0.55)\";\n    drawCloud(34, 84, 0.9);\n    drawCloud(w * 0.42, 108, 1.15);\n    drawCloud(w * 0.76, 72, 0.85);\n\n    ctx.fillStyle = \"rgba(255,255,255,0.28)\";\n    drawCloud(w * 0.2, 160, 0.65);\n    drawCloud(w * 0.82, 176, 0.72);\n  }\n\n  function drawCloud(x, y, scale){\n    ctx.beginPath();\n    ctx.arc(x, y, 20 * scale, 0, Math.PI * 2);\n    ctx.arc(x + 20 * scale, y - 10 * scale, 26 * scale, 0, Math.PI * 2);\n    ctx.arc(x + 44 * scale, y, 20 * scale, 0, Math.PI * 2);\n    ctx.arc(x + 22 * scale, y + 10 * scale, 24 * scale, 0, Math.PI * 2);\n    ctx.fill();\n  }\n\n  function drawBalloon(obj, time){\n    const swayX = Math.sin(time * 0.001 * obj.sway + obj.offset) * obj.swayWidth;\n    const bx = obj.x + swayX;\n    const by = obj.y;\n\n    obj.renderX = bx;\n    obj.renderY = by;\n\n    ctx.beginPath();\n    ctx.ellipse(bx, by, obj.radius * 0.92, obj.radius * 1.12, 0, 0, Math.PI * 2);\n    ctx.fillStyle = obj.color;\n    ctx.fill();\n\n    ctx.beginPath();\n    ctx.arc(bx - obj.radius * 0.22, by - obj.radius * 0.28, obj.radius * 0.18, 0, Math.PI * 2);\n    ctx.fillStyle = \"rgba(255,255,255,0.35)\";\n    ctx.fill();\n\n    ctx.beginPath();\n    ctx.moveTo(bx, by + obj.radius * 1.08);\n    ctx.lineTo(bx - 4, by + obj.radius * 1.32);\n    ctx.lineTo(bx + 4, by + obj.radius * 1.32);\n    ctx.closePath();\n    ctx.fillStyle = obj.color;\n    ctx.fill();\n\n    ctx.beginPath();\n    ctx.moveTo(bx, by + obj.radius * 1.32);\n    ctx.quadraticCurveTo(\n      bx + Math.sin(time * 0.003 + obj.offset) * 8,\n      by + obj.radius * 2.0,\n      bx - 4,\n      by + obj.radius * 2.75\n    );\n    ctx.strokeStyle = \"#6b7280\";\n    ctx.lineWidth = 1.4;\n    ctx.stroke();\n\n    if(obj.type === \"bonus\"){\n      ctx.font = `${Math.floor(obj.radius * 1.15)}px Arial`;\n      ctx.textAlign = \"center\";\n      ctx.textBaseline = \"middle\";\n      ctx.fillText(obj.animal, bx, by + 2);\n\n      ctx.beginPath();\n      ctx.arc(bx, by - obj.radius - 10, 12, 0, Math.PI * 2);\n      ctx.fillStyle = \"rgba(255,215,0,0.95)\";\n      ctx.fill();\n\n      ctx.fillStyle = \"#7a5200\";\n      ctx.font = \"bold 12px Arial\";\n      ctx.fillText(\"\u2605\", bx, by - obj.radius - 10);\n    }\n  }\n\n  function drawParticles(){\n    for(let i = particles.length - 1; i >= 0; i--){\n      const p = particles[i];\n      p.x += p.vx;\n      p.y += p.vy;\n      p.alpha -= 0.032;\n\n      if(p.alpha <= 0){\n        particles.splice(i, 1);\n        continue;\n      }\n\n      ctx.globalAlpha = p.alpha;\n      ctx.beginPath();\n      ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);\n      ctx.fillStyle = p.color;\n      ctx.fill();\n      ctx.globalAlpha = 1;\n    }\n  }\n\n  function drawTapEffects(){\n    for(let i = tapEffects.length - 1; i >= 0; i--){\n      const e = tapEffects[i];\n      e.alpha -= 0.05;\n      e.scale += 0.08;\n\n      if(e.alpha <= 0){\n        tapEffects.splice(i, 1);\n        continue;\n      }\n\n      ctx.globalAlpha = e.alpha;\n      ctx.beginPath();\n      ctx.arc(e.x, e.y, 24 * e.scale, 0, Math.PI * 2);\n      ctx.strokeStyle = \"#ff3b30\";\n      ctx.lineWidth = 3;\n      ctx.stroke();\n      ctx.globalAlpha = 1;\n    }\n  }\n\n  function drawFloatingTexts(){\n    for(let i = floatingTexts.length - 1; i >= 0; i--){\n      const t = floatingTexts[i];\n      t.y -= 0.7;\n      t.alpha -= 0.02;\n\n      if(t.alpha <= 0){\n        floatingTexts.splice(i, 1);\n        continue;\n      }\n\n      ctx.globalAlpha = t.alpha;\n      ctx.fillStyle = t.color;\n      ctx.font = \"bold 18px Arial\";\n      ctx.textAlign = \"center\";\n      ctx.textBaseline = \"middle\";\n      ctx.fillText(t.text, t.x, t.y);\n      ctx.globalAlpha = 1;\n    }\n  }\n\n  function showFloatingText(x, y, color, text){\n    floatingTexts.push({\n      x,\n      y,\n      color,\n      text,\n      alpha: 1\n    });\n  }\n\n  function computeNormalScore(balloon){\n    const sizeFactor = clamp((48 - balloon.radius) * 2.1, 8, 70);\n    const speedFactor = clamp(balloon.speed * 0.18, 8, 45);\n    return Math.round(sizeFactor + speedFactor);\n  }\n\n  function getBonusReward(balloon){\n    if(balloon.rewardType === \"life\"){\n      return {\n        type: \"life\",\n        value: 1,\n        text: \"\uc0dd\uba85 +1\"\n      };\n    }\n\n    const bonusScore = Math.round(120 + (110 - balloon.radius) + balloon.speed * 0.45);\n    return {\n      type: \"score\",\n      value: bonusScore,\n      text: `\ubcf4\ub108\uc2a4 +${bonusScore}`\n    };\n  }\n\n  function popBalloon(index){\n    const target = balloons[index];\n    if(!target) return;\n\n    createPop(target.renderX, target.renderY, target.color, target.type === \"bonus\" ? 22 : 14);\n    balloons.splice(index, 1);\n\n    if(target.type === \"bonus\"){\n      const reward = getBonusReward(target);\n\n      if(reward.type === \"life\"){\n        lives += reward.value;\n        livesEl.textContent = lives;\n        showFloatingText(target.renderX, target.renderY, \"#16a34a\", reward.text);\n      } else {\n        score += reward.value;\n        scoreEl.textContent = score;\n        showFloatingText(target.renderX, target.renderY, \"#d97706\", reward.text);\n      }\n    } else {\n      const gained = computeNormalScore(target);\n      score += gained;\n      scoreEl.textContent = score;\n      showFloatingText(target.renderX, target.renderY, \"#1d4ed8\", `+${gained}`);\n    }\n\n    if(score > bestScore){\n      bestScore = score;\n      localStorage.setItem(\"balloon_touch_best_score\", String(bestScore));\n      bestScoreEl.textContent = bestScore;\n    }\n  }\n\n  function tryPopAt(x, y){\n    if(!gameStarted || paused || gameOver || adShowing) return;\n\n    addTapEffect(x, y);\n\n    const hits = [];\n\n    for(let i = balloons.length - 1; i >= 0; i--){\n      const b = balloons[i];\n      const dx = x - b.renderX;\n      const dy = y - b.renderY;\n      const dist = Math.sqrt(dx * dx + dy * dy);\n\n      if(dist <= b.radius){\n        hits.push(i);\n      }\n    }\n\n    hits.sort((a, b) => b - a);\n\n    for(const i of hits){\n      popBalloon(i);\n    }\n  }\n\n  function update(dt){\n    if(!gameStarted || paused || gameOver || adShowing) return;\n\n    playTime += dt;\n    stageElapsed += dt;\n    if(stageElapsed >= STAGE_DURATION){\n      advanceStage();\n      return;\n    }\n    updateStageUI();\n    spawnTimer += dt;\n\n    const spawnInterval = Math.max(0.34, 0.95 - Math.min(playTime * 0.015, 0.42));\n\n    if(spawnTimer >= spawnInterval){\n      spawnTimer = 0;\n      createBalloon();\n      if(Math.random() < 0.35){\n        setTimeout(() => {\n          if(!paused && !gameOver && gameStarted && !adShowing){\n            createBalloon();\n          }\n        }, 140);\n      }\n    }\n\n    for(let i = balloons.length - 1; i >= 0; i--){\n      const b = balloons[i];\n      b.y -= b.speed * dt;\n\n      if(b.y < -70){\n        if(b.type === \"normal\"){\n          lives -= 1;\n          livesEl.textContent = lives;\n          showFloatingText(\n            clamp((b.renderX || b.x), 30, w - 30),\n            92,\n            \"#dc2626\",\n            \"\uc0dd\uba85 -1\"\n          );\n\n          if(lives <= 0){\n            endGame();\n          }\n        }\n        balloons.splice(i, 1);\n      }\n    }\n  }\n\n  function render(time){\n    ctx.clearRect(0, 0, w, h);\n    drawSky();\n\n    for(const b of balloons){\n      drawBalloon(b, time);\n    }\n\n    drawParticles();\n    drawTapEffects();\n    drawFloatingTexts();\n  }\n\n  function loop(timestamp){\n    const dt = Math.min((timestamp - lastTime) \/ 1000 || 0, 0.033);\n    lastTime = timestamp;\n\n    update(dt);\n    render(timestamp);\n\n    requestAnimationFrame(loop);\n  }\n\n  function resetState(){\n    score = 0;\n    lives = 5;\n    paused = false;\n    gameOver = false;\n    playTime = 0;\n    spawnTimer = 0;\n    currentStage = 1;\n    stageElapsed = 0;\n    adShowing = false;\n    shownAdStages.clear();\n    clearInterval(adTimerId);\n    clearTimeout(adCloseTimerId);\n    stageAdLayer.classList.remove(\"show\");\n    balloons.length = 0;\n    particles.length = 0;\n    tapEffects.length = 0;\n    floatingTexts.length = 0;\n\n    scoreEl.textContent = score;\n    livesEl.textContent = lives;\n    updateStageUI();\n    btnPause.textContent = \"\u2161\";\n    pauseBadge.classList.remove(\"show\");\n    gameOverLayer.classList.add(\"hidden\");\n    updateSoundButton();\n  }\n\n  function startGame(){\n    resetState();\n    gameStarted = true;\n    startLayer.classList.add(\"hidden\");\n    if(soundOn){\n      playBgm();\n    }\n  }\n\n  function restartGame(){\n    startGame();\n  }\n\n  function backToStart(){\n    resetState();\n    gameStarted = false;\n    startLayer.classList.remove(\"hidden\");\n    gameOverLayer.classList.add(\"hidden\");\n    stopBgm();\n  }\n\n  function togglePause(){\n    if(!gameStarted || gameOver) return;\n\n    paused = !paused;\n    btnPause.textContent = paused ? \"\u25b6\" : \"\u2161\";\n    pauseBadge.classList.toggle(\"show\", paused);\n\n    if(paused){\n      stopBgm();\n    } else if(soundOn){\n      playBgm();\n    }\n  }\n\n  function endGame(completed = false){\n    gameOver = true;\n    finalScoreEl.textContent = score;\n    bonusResultText.textContent = completed\n      ? \"10\ub2e8\uacc4\ub97c \ubaa8\ub450 \uc644\ub8cc\ud588\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \ub3c4\uc804\ud574 \ub354 \ub192\uc740 \uc810\uc218\ub97c \ub178\ub824\ubcf4\uc138\uc694.\"\n      : (score >= bestScore\n        ? \"\ucd5c\uace0 \uc810\uc218\ub97c \uc0c8\ub85c \uae30\ub85d\ud588\uc2b5\ub2c8\ub2e4.\"\n        : \"\uc791\uace0 \ube60\ub978 \ud48d\uc120\uc744 \ub354 \ub178\ub9ac\uba74 \uc810\uc218\ub97c \ub354 \uc62c\ub9b4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\");\n    gameOverLayer.classList.remove(\"hidden\");\n    stopBgm();\n  }\n\n  function handlePoint(clientX, clientY){\n    const rect = canvas.getBoundingClientRect();\n    const x = clientX - rect.left;\n    const y = clientY - rect.top;\n    tryPopAt(x, y);\n  }\n\n  canvas.addEventListener(\"pointerdown\", function(e){\n    e.preventDefault();\n    handlePoint(e.clientX, e.clientY);\n  });\n\n  canvas.addEventListener(\"pointermove\", function(e){\n    if(e.pressure > 0 || e.buttons === 1){\n      e.preventDefault();\n      handlePoint(e.clientX, e.clientY);\n    }\n  });\n\n  canvas.addEventListener(\"touchstart\", function(e){\n    e.preventDefault();\n    for(const touch of e.touches){\n      handlePoint(touch.clientX, touch.clientY);\n    }\n  }, { passive:false });\n\n  canvas.addEventListener(\"touchmove\", function(e){\n    e.preventDefault();\n    for(const touch of e.touches){\n      handlePoint(touch.clientX, touch.clientY);\n    }\n  }, { passive:false });\n\n  btnRefresh.addEventListener(\"click\", function(e){\n    e.preventDefault();\n    if(gameStarted){\n      restartGame();\n    } else {\n      startGame();\n    }\n  });\n\n  btnPause.addEventListener(\"click\", function(e){\n    e.preventDefault();\n    togglePause();\n  });\n\n  btnSound.addEventListener(\"click\", function(e){\n    e.preventDefault();\n    toggleSound();\n  });\n\n  startBtn.addEventListener(\"click\", function(){\n    startGame();\n  });\n\n  restartBtn.addEventListener(\"click\", function(){\n    restartGame();\n  });\n\n  closeBtn.addEventListener(\"click\", function(){\n    backToStart();\n  });\n\n  document.addEventListener(\"keydown\", function(e){\n    if(e.key === \"p\" || e.key === \"P\"){\n      togglePause();\n    }\n    if(e.key === \"r\" || e.key === \"R\"){\n      if(gameStarted){\n        restartGame();\n      } else {\n        startGame();\n      }\n    }\n  });\n\n  document.addEventListener(\"visibilitychange\", function(){\n    if(document.hidden && gameStarted && !gameOver){\n      paused = true;\n      btnPause.textContent = \"\u25b6\";\n      pauseBadge.classList.add(\"show\");\n      stopBgm();\n    }\n  });\n\n  window.addEventListener(\"resize\", resizeCanvas);\n\n  resizeCanvas();\n  updateSoundButton();\n  lastTime = performance.now();\n  requestAnimationFrame(loop);\n})();\n<\/script>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\ub2e8\uacc4: 1 \/ 10 \ub0a8\uc740 \uc2dc\uac04: 60\ucd08 \uc810\uc218: 0 \uc0dd\uba85: 5 \ucd5c\uace0 \uc810\uc218: 0 \u21bb \u2161 \u266a \uc77c\uc2dc\uc815\uc9c0 2\ub2e8\uacc4 \ub3c4\uc804 \uc804 \uad11\uace0 \uc9dd\uc218 \ub2e8\uacc4 \uc9c4\uc785 \uc2dc 3\ucd08 \ub4a4 \uc790\ub3d9\uc73c\ub85c \uac8c\uc784\uc774 \uc774\uc5b4\uc9d1\ub2c8\ub2e4. 3\ucd08 \ub0a8\uc74c \ud654\uba74\uc744 \ud130\uce58\ud574 \ud48d\uc120\uc744 \ud130\ub728\ub9ac\uc138\uc694. \uac01 \ub2e8\uacc4\ub294 1\ubd84\uc529 \uc9c4\ud589\ub429\ub2c8\ub2e4. \ud48d\uc120 \ud130\ub728\ub9ac\uae30 \ud654\uba74\uc744 \ud130\uce58\ud55c \uc704\uce58\uc758 \ud48d\uc120\uc744 \ubc14\ub85c \ud130\ub728\ub9ac\ub294 \uac8c\uc784\uc785\ub2c8\ub2e4. \uc791\uace0 \ube60\ub978 \ud48d\uc120\uc77c\uc218\ub85d \ub354 \ub192\uc740 [&hellip;]<\/p>\n","protected":false},"featured_media":66,"template":"","game_category":[],"class_list":["post-65","game","type-game","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\ubaa8\ubc14\uc77c \ud48d\uc120 \ud130\ub728\ub9ac\uae30 \uac8c\uc784 - My Store<\/title>\n<meta name=\"description\" content=\"\ubaa8\ubc14\uc77c \ud48d\uc120 \ud130\ub728\ub9ac\uae30 \uac8c\uc784\uc785\ub2c8\ub2e4. \ud654\uba74\uc744 \ud130\uce58\ud574 \ud48d\uc120\uc744 \ud130\ub728\ub9ac\uc138\uc694. \uac01 \ub2e8\uacc4\ub294 1\ubd84\uc529 \uc9c4\ud589\ub429\ub2c8\ub2e4. \uac01 \ub2e8\uacc4\ub294 \uc57d 1\ubd84 \ub3d9\uc548 \uc9c4\ud589\ub418\uba70, \ucd1d 10\ub2e8\uacc4\uae4c\uc9c0 \ub3c4\uc804\ud569\ub2c8\ub2e4. \uc9dd\uc218 \ub2e8\uacc4\uc5d0\uc11c\ub294 3\ucd08 \uad11\uace0 \ub4a4 \uc790\ub3d9\uc73c\ub85c \uac8c\uc784\uc774 \uc774\uc5b4\uc9d1\ub2c8\ub2e4.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/game.lightsaltsound.com\/?game=\ubaa8\ubc14\uc77c-\ud48d\uc120-\ud130\ub728\ub9ac\uae30-\uac8c\uc784\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\ubaa8\ubc14\uc77c \ud48d\uc120 \ud130\ub728\ub9ac\uae30 \uac8c\uc784 - My Store\" \/>\n<meta property=\"og:description\" content=\"\ubaa8\ubc14\uc77c \ud48d\uc120 \ud130\ub728\ub9ac\uae30 \uac8c\uc784\uc785\ub2c8\ub2e4. \ud654\uba74\uc744 \ud130\uce58\ud574 \ud48d\uc120\uc744 \ud130\ub728\ub9ac\uc138\uc694. \uac01 \ub2e8\uacc4\ub294 1\ubd84\uc529 \uc9c4\ud589\ub429\ub2c8\ub2e4. \uac01 \ub2e8\uacc4\ub294 \uc57d 1\ubd84 \ub3d9\uc548 \uc9c4\ud589\ub418\uba70, \ucd1d 10\ub2e8\uacc4\uae4c\uc9c0 \ub3c4\uc804\ud569\ub2c8\ub2e4. \uc9dd\uc218 \ub2e8\uacc4\uc5d0\uc11c\ub294 3\ucd08 \uad11\uace0 \ub4a4 \uc790\ub3d9\uc73c\ub85c \uac8c\uc784\uc774 \uc774\uc5b4\uc9d1\ub2c8\ub2e4.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/game.lightsaltsound.com\/?game=\ubaa8\ubc14\uc77c-\ud48d\uc120-\ud130\ub728\ub9ac\uae30-\uac8c\uc784\" \/>\n<meta property=\"og:site_name\" content=\"My Store\" \/>\n<meta property=\"og:image\" content=\"https:\/\/game.lightsaltsound.com\/wp-content\/uploads\/2026\/05\/\ud48d\uc120\uc544-\ud130\uc838\ub77c.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1504\" \/>\n\t<meta property=\"og:image:height\" content=\"741\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04\" \/>\n\t<meta name=\"twitter:data1\" content=\"1\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/game.lightsaltsound.com\\\/?game=%eb%aa%a8%eb%b0%94%ec%9d%bc-%ed%92%8d%ec%84%a0-%ed%84%b0%eb%9c%a8%eb%a6%ac%ea%b8%b0-%ea%b2%8c%ec%9e%84\",\"url\":\"https:\\\/\\\/game.lightsaltsound.com\\\/?game=%eb%aa%a8%eb%b0%94%ec%9d%bc-%ed%92%8d%ec%84%a0-%ed%84%b0%eb%9c%a8%eb%a6%ac%ea%b8%b0-%ea%b2%8c%ec%9e%84\",\"name\":\"\ubaa8\ubc14\uc77c \ud48d\uc120 \ud130\ub728\ub9ac\uae30 \uac8c\uc784 - My Store\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/game.lightsaltsound.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/game.lightsaltsound.com\\\/?game=%eb%aa%a8%eb%b0%94%ec%9d%bc-%ed%92%8d%ec%84%a0-%ed%84%b0%eb%9c%a8%eb%a6%ac%ea%b8%b0-%ea%b2%8c%ec%9e%84#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/game.lightsaltsound.com\\\/?game=%eb%aa%a8%eb%b0%94%ec%9d%bc-%ed%92%8d%ec%84%a0-%ed%84%b0%eb%9c%a8%eb%a6%ac%ea%b8%b0-%ea%b2%8c%ec%9e%84#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/game.lightsaltsound.com\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/\ud48d\uc120\uc544-\ud130\uc838\ub77c.webp\",\"datePublished\":\"2026-05-17T09:27:01+00:00\",\"description\":\"\ubaa8\ubc14\uc77c \ud48d\uc120 \ud130\ub728\ub9ac\uae30 \uac8c\uc784\uc785\ub2c8\ub2e4. \ud654\uba74\uc744 \ud130\uce58\ud574 \ud48d\uc120\uc744 \ud130\ub728\ub9ac\uc138\uc694. \uac01 \ub2e8\uacc4\ub294 1\ubd84\uc529 \uc9c4\ud589\ub429\ub2c8\ub2e4. \uac01 \ub2e8\uacc4\ub294 \uc57d 1\ubd84 \ub3d9\uc548 \uc9c4\ud589\ub418\uba70, \ucd1d 10\ub2e8\uacc4\uae4c\uc9c0 \ub3c4\uc804\ud569\ub2c8\ub2e4. \uc9dd\uc218 \ub2e8\uacc4\uc5d0\uc11c\ub294 3\ucd08 \uad11\uace0 \ub4a4 \uc790\ub3d9\uc73c\ub85c \uac8c\uc784\uc774 \uc774\uc5b4\uc9d1\ub2c8\ub2e4.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/game.lightsaltsound.com\\\/?game=%eb%aa%a8%eb%b0%94%ec%9d%bc-%ed%92%8d%ec%84%a0-%ed%84%b0%eb%9c%a8%eb%a6%ac%ea%b8%b0-%ea%b2%8c%ec%9e%84#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/game.lightsaltsound.com\\\/?game=%eb%aa%a8%eb%b0%94%ec%9d%bc-%ed%92%8d%ec%84%a0-%ed%84%b0%eb%9c%a8%eb%a6%ac%ea%b8%b0-%ea%b2%8c%ec%9e%84\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\\\/\\\/game.lightsaltsound.com\\\/?game=%eb%aa%a8%eb%b0%94%ec%9d%bc-%ed%92%8d%ec%84%a0-%ed%84%b0%eb%9c%a8%eb%a6%ac%ea%b8%b0-%ea%b2%8c%ec%9e%84#primaryimage\",\"url\":\"https:\\\/\\\/game.lightsaltsound.com\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/\ud48d\uc120\uc544-\ud130\uc838\ub77c.webp\",\"contentUrl\":\"https:\\\/\\\/game.lightsaltsound.com\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/\ud48d\uc120\uc544-\ud130\uc838\ub77c.webp\",\"width\":1504,\"height\":741,\"caption\":\"\ud48d\uc120\uc544 \ud130\uc838\ub77c\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/game.lightsaltsound.com\\\/?game=%eb%aa%a8%eb%b0%94%ec%9d%bc-%ed%92%8d%ec%84%a0-%ed%84%b0%eb%9c%a8%eb%a6%ac%ea%b8%b0-%ea%b2%8c%ec%9e%84#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\ud648\",\"item\":\"https:\\\/\\\/game.lightsaltsound.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\uac8c\uc784\",\"item\":\"https:\\\/\\\/game.lightsaltsound.com\\\/?post_type=game\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"\ubaa8\ubc14\uc77c \ud48d\uc120 \ud130\ub728\ub9ac\uae30 \uac8c\uc784\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/game.lightsaltsound.com\\\/#website\",\"url\":\"https:\\\/\\\/game.lightsaltsound.com\\\/\",\"name\":\"My Store\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/game.lightsaltsound.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\ubaa8\ubc14\uc77c \ud48d\uc120 \ud130\ub728\ub9ac\uae30 \uac8c\uc784 - My Store","description":"\ubaa8\ubc14\uc77c \ud48d\uc120 \ud130\ub728\ub9ac\uae30 \uac8c\uc784\uc785\ub2c8\ub2e4. \ud654\uba74\uc744 \ud130\uce58\ud574 \ud48d\uc120\uc744 \ud130\ub728\ub9ac\uc138\uc694. \uac01 \ub2e8\uacc4\ub294 1\ubd84\uc529 \uc9c4\ud589\ub429\ub2c8\ub2e4. \uac01 \ub2e8\uacc4\ub294 \uc57d 1\ubd84 \ub3d9\uc548 \uc9c4\ud589\ub418\uba70, \ucd1d 10\ub2e8\uacc4\uae4c\uc9c0 \ub3c4\uc804\ud569\ub2c8\ub2e4. \uc9dd\uc218 \ub2e8\uacc4\uc5d0\uc11c\ub294 3\ucd08 \uad11\uace0 \ub4a4 \uc790\ub3d9\uc73c\ub85c \uac8c\uc784\uc774 \uc774\uc5b4\uc9d1\ub2c8\ub2e4.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/game.lightsaltsound.com\/?game=\ubaa8\ubc14\uc77c-\ud48d\uc120-\ud130\ub728\ub9ac\uae30-\uac8c\uc784","og_locale":"ko_KR","og_type":"article","og_title":"\ubaa8\ubc14\uc77c \ud48d\uc120 \ud130\ub728\ub9ac\uae30 \uac8c\uc784 - My Store","og_description":"\ubaa8\ubc14\uc77c \ud48d\uc120 \ud130\ub728\ub9ac\uae30 \uac8c\uc784\uc785\ub2c8\ub2e4. \ud654\uba74\uc744 \ud130\uce58\ud574 \ud48d\uc120\uc744 \ud130\ub728\ub9ac\uc138\uc694. \uac01 \ub2e8\uacc4\ub294 1\ubd84\uc529 \uc9c4\ud589\ub429\ub2c8\ub2e4. \uac01 \ub2e8\uacc4\ub294 \uc57d 1\ubd84 \ub3d9\uc548 \uc9c4\ud589\ub418\uba70, \ucd1d 10\ub2e8\uacc4\uae4c\uc9c0 \ub3c4\uc804\ud569\ub2c8\ub2e4. \uc9dd\uc218 \ub2e8\uacc4\uc5d0\uc11c\ub294 3\ucd08 \uad11\uace0 \ub4a4 \uc790\ub3d9\uc73c\ub85c \uac8c\uc784\uc774 \uc774\uc5b4\uc9d1\ub2c8\ub2e4.","og_url":"https:\/\/game.lightsaltsound.com\/?game=\ubaa8\ubc14\uc77c-\ud48d\uc120-\ud130\ub728\ub9ac\uae30-\uac8c\uc784","og_site_name":"My Store","og_image":[{"width":1504,"height":741,"url":"https:\/\/game.lightsaltsound.com\/wp-content\/uploads\/2026\/05\/\ud48d\uc120\uc544-\ud130\uc838\ub77c.webp","type":"image\/webp"}],"twitter_card":"summary_large_image","twitter_misc":{"\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04":"1\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/game.lightsaltsound.com\/?game=%eb%aa%a8%eb%b0%94%ec%9d%bc-%ed%92%8d%ec%84%a0-%ed%84%b0%eb%9c%a8%eb%a6%ac%ea%b8%b0-%ea%b2%8c%ec%9e%84","url":"https:\/\/game.lightsaltsound.com\/?game=%eb%aa%a8%eb%b0%94%ec%9d%bc-%ed%92%8d%ec%84%a0-%ed%84%b0%eb%9c%a8%eb%a6%ac%ea%b8%b0-%ea%b2%8c%ec%9e%84","name":"\ubaa8\ubc14\uc77c \ud48d\uc120 \ud130\ub728\ub9ac\uae30 \uac8c\uc784 - My Store","isPartOf":{"@id":"https:\/\/game.lightsaltsound.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/game.lightsaltsound.com\/?game=%eb%aa%a8%eb%b0%94%ec%9d%bc-%ed%92%8d%ec%84%a0-%ed%84%b0%eb%9c%a8%eb%a6%ac%ea%b8%b0-%ea%b2%8c%ec%9e%84#primaryimage"},"image":{"@id":"https:\/\/game.lightsaltsound.com\/?game=%eb%aa%a8%eb%b0%94%ec%9d%bc-%ed%92%8d%ec%84%a0-%ed%84%b0%eb%9c%a8%eb%a6%ac%ea%b8%b0-%ea%b2%8c%ec%9e%84#primaryimage"},"thumbnailUrl":"https:\/\/game.lightsaltsound.com\/wp-content\/uploads\/2026\/05\/\ud48d\uc120\uc544-\ud130\uc838\ub77c.webp","datePublished":"2026-05-17T09:27:01+00:00","description":"\ubaa8\ubc14\uc77c \ud48d\uc120 \ud130\ub728\ub9ac\uae30 \uac8c\uc784\uc785\ub2c8\ub2e4. \ud654\uba74\uc744 \ud130\uce58\ud574 \ud48d\uc120\uc744 \ud130\ub728\ub9ac\uc138\uc694. \uac01 \ub2e8\uacc4\ub294 1\ubd84\uc529 \uc9c4\ud589\ub429\ub2c8\ub2e4. \uac01 \ub2e8\uacc4\ub294 \uc57d 1\ubd84 \ub3d9\uc548 \uc9c4\ud589\ub418\uba70, \ucd1d 10\ub2e8\uacc4\uae4c\uc9c0 \ub3c4\uc804\ud569\ub2c8\ub2e4. \uc9dd\uc218 \ub2e8\uacc4\uc5d0\uc11c\ub294 3\ucd08 \uad11\uace0 \ub4a4 \uc790\ub3d9\uc73c\ub85c \uac8c\uc784\uc774 \uc774\uc5b4\uc9d1\ub2c8\ub2e4.","breadcrumb":{"@id":"https:\/\/game.lightsaltsound.com\/?game=%eb%aa%a8%eb%b0%94%ec%9d%bc-%ed%92%8d%ec%84%a0-%ed%84%b0%eb%9c%a8%eb%a6%ac%ea%b8%b0-%ea%b2%8c%ec%9e%84#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/game.lightsaltsound.com\/?game=%eb%aa%a8%eb%b0%94%ec%9d%bc-%ed%92%8d%ec%84%a0-%ed%84%b0%eb%9c%a8%eb%a6%ac%ea%b8%b0-%ea%b2%8c%ec%9e%84"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/game.lightsaltsound.com\/?game=%eb%aa%a8%eb%b0%94%ec%9d%bc-%ed%92%8d%ec%84%a0-%ed%84%b0%eb%9c%a8%eb%a6%ac%ea%b8%b0-%ea%b2%8c%ec%9e%84#primaryimage","url":"https:\/\/game.lightsaltsound.com\/wp-content\/uploads\/2026\/05\/\ud48d\uc120\uc544-\ud130\uc838\ub77c.webp","contentUrl":"https:\/\/game.lightsaltsound.com\/wp-content\/uploads\/2026\/05\/\ud48d\uc120\uc544-\ud130\uc838\ub77c.webp","width":1504,"height":741,"caption":"\ud48d\uc120\uc544 \ud130\uc838\ub77c"},{"@type":"BreadcrumbList","@id":"https:\/\/game.lightsaltsound.com\/?game=%eb%aa%a8%eb%b0%94%ec%9d%bc-%ed%92%8d%ec%84%a0-%ed%84%b0%eb%9c%a8%eb%a6%ac%ea%b8%b0-%ea%b2%8c%ec%9e%84#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\ud648","item":"https:\/\/game.lightsaltsound.com\/"},{"@type":"ListItem","position":2,"name":"\uac8c\uc784","item":"https:\/\/game.lightsaltsound.com\/?post_type=game"},{"@type":"ListItem","position":3,"name":"\ubaa8\ubc14\uc77c \ud48d\uc120 \ud130\ub728\ub9ac\uae30 \uac8c\uc784"}]},{"@type":"WebSite","@id":"https:\/\/game.lightsaltsound.com\/#website","url":"https:\/\/game.lightsaltsound.com\/","name":"My Store","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/game.lightsaltsound.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"}]}},"_links":{"self":[{"href":"https:\/\/game.lightsaltsound.com\/index.php?rest_route=\/wp\/v2\/game\/65","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/game.lightsaltsound.com\/index.php?rest_route=\/wp\/v2\/game"}],"about":[{"href":"https:\/\/game.lightsaltsound.com\/index.php?rest_route=\/wp\/v2\/types\/game"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/game.lightsaltsound.com\/index.php?rest_route=\/wp\/v2\/media\/66"}],"wp:attachment":[{"href":"https:\/\/game.lightsaltsound.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=65"}],"wp:term":[{"taxonomy":"game_category","embeddable":true,"href":"https:\/\/game.lightsaltsound.com\/index.php?rest_route=%2Fwp%2Fv2%2Fgame_category&post=65"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}