{"id":1175,"date":"2026-04-03T23:13:36","date_gmt":"2026-04-03T14:13:36","guid":{"rendered":"https:\/\/www.ima.okinawa\/?page_id=1175"},"modified":"2026-10-01T13:07:26","modified_gmt":"2026-10-01T04:07:26","slug":"starjump-game","status":"publish","type":"page","link":"https:\/\/ima.okinawa\/en\/starjump-game\/","title":{"rendered":"Okinawa mini-game"},"content":{"rendered":"<aside class=\"row veu_insertAds before\"><div class=\"col-md-12\"><div style=\"text-align: center;\">\r\n\u300cPR\u300d\r\n<\/div>\r\n<div style=\"text-align: center;\">\r\n<a href=\"https:\/\/px.a8.net\/svt\/ejp?a8mat=4B3GYI+6KD3XU+5R8A+601S1\" rel=\"nofollow\">\r\n<img loading=\"lazy\" decoding=\"async\" border=\"0\" width=\"250\" height=\"250\" alt=\"\" src=\"https:\/\/www21.a8.net\/svt\/bgt?aid=260502426397&wid=001&eno=01&mid=s00000026857001008000&mc=1\"><\/a>\r\n<img loading=\"lazy\" decoding=\"async\" border=\"0\" width=\"1\" height=\"1\" src=\"https:\/\/www17.a8.net\/0.gif?a8mat=4B3GYI+6KD3XU+5R8A+601S1\" alt=\"\">\r\n<\/div><\/div><\/aside>\n<h2 class=\"wp-block-heading\"><strong><span data-color=\"#fffd6b\" style=\"--vk-highlighter-color: rgba(255, 253, 107, 0.7);\" class=\"vk_highlighter\">\u30b9\u30bf\u30fc\u30b8\u30e3\u30f3\u30d7\u4eca\u6c96\u7e04<\/span><\/strong><\/h2>\n\n\n\n<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Star Runner<\/title>\n    <style>\n    body { \n        text-align: center; \n        background: #eee; \n        font-family: sans-serif; \n        margin: 0; \n        padding: 20px; \n        overflow-x: hidden;\n    }\n    canvas { \n        background: #fff; \n        border: 2px solid #333; \n        cursor: pointer;\n        max-width: 100%; \n        height: auto; \n        display: block;\n        margin: 0 auto;\n    }\n    .ui { font-size: 20px; font-weight: bold; margin: 10px; }\n    p { font-size: 14px; color: #666; }\n<\/style>\n<\/head>\n<body>\n    <div id=\"score-area\" class=\"ui\">Score: <span id=\"s\">0<\/span><\/div>\n    <canvas id=\"g\" width=\"400\" height=\"200\"><\/canvas>\n    <p id=\"instruction\">\u30af\u30ea\u30c3\u30af\u304b\u30b9\u30da\u30fc\u30b9\u3067\u30b8\u30e3\u30f3\u30d7\uff01<\/p>\n\n<div id=\"game-result-overlay\" style=\"display:none; position:fixed; top:0; left:0; width:100%; height:100%; background:rgba(0,0,0,0.8); z-index:9999; justify-content:center; align-items:center; flex-direction:column; color:white; font-family:sans-serif; text-align:center;\">\n    <div style=\"background: linear-gradient(135deg, #1a237e, #4a148c); padding: 40px; border-radius: 20px; border: 3px solid #ffd700; box-shadow: 0 0 30px rgba(255,215,0,0.5);\">\n        <h2 style=\"font-size: 2.5rem; margin-bottom: 10px; color: #ffd700;\">Game Over!<\/h2>\n        <p style=\"font-size: 1.2rem; margin-bottom: 5px;\">ima.okinawa \u30ea\u30b6\u30eb\u30c8<\/p>\n        <div id=\"final-score\" style=\"font-size: 5rem; font-weight: bold; margin: 10px 0;\">0<\/div>\n        <p id=\"score-rank\" style=\"font-size: 1.6rem; font-weight: bold; margin-bottom: 20px;\"><\/p>\n        <button onclick=\"location.reload()\" style=\"padding: 12px 40px; font-size: 1.2rem; background: #ffd700; border: none; border-radius: 50px; cursor: pointer; color: #1a237e; font-weight: bold;\">\u7d50\u679c\u3092\u6d88\u3057\u3066\u3082\u3046\u4e00\u5ea6\u6311\u6226\uff01\uff01<\/button>\n    <\/div>\n<\/div>\n\n<script>\n    const cvs = document.getElementById(\"g\");\n    const ctx = cvs.getContext(\"2d\");\n    const scoreText = document.getElementById(\"s\");\n    const scoreArea = document.getElementById(\"score-area\");\n    const instruction = document.getElementById(\"instruction\");\n\n    let player = { x: 50, y: 150, w: 20, h: 20, v: 0, grounded: true };\n    let obstacles = [];\n    let score = 0;\n    let active = false;\n\n    \/\/ \u2605\u661f\u3092\u63cf\u753b\u3059\u308b\u95a2\u6570\u3092\u8ffd\u52a0\n    function drawStar(ctx, cx, cy, spikes, outerRadius, innerRadius) {\n        let rot = Math.PI \/ 2 * 3;\n        let x = cx;\n        let y = cy;\n        let step = Math.PI \/ spikes;\n\n        ctx.beginPath();\n        ctx.moveTo(cx, cy - outerRadius);\n        for (let i = 0; i < spikes; i++) {\n            x = cx + Math.cos(rot) * outerRadius;\n            y = cy + Math.sin(rot) * outerRadius;\n            ctx.lineTo(x, y);\n            rot += step;\n\n            x = cx + Math.cos(rot) * innerRadius;\n            y = cy + Math.sin(rot) * innerRadius;\n            ctx.lineTo(x, y);\n            rot += step;\n        }\n        ctx.lineTo(cx, cy - outerRadius);\n        ctx.closePath();\n        \n        \/\/ \u8272\u306e\u8a2d\u5b9a\uff08\u30b0\u30e9\u30c7\u30fc\u30b7\u30e7\u30f3\u3063\u307d\u304f\u898b\u305b\u308b\u305f\u3081\u306b\u67a0\u7dda\u3082\u8ffd\u52a0\uff09\n        ctx.fillStyle = \"#FFD700\"; \/\/ \u30b4\u30fc\u30eb\u30c9\n        ctx.fill();\n        ctx.strokeStyle = \"#DAA520\"; \/\/ \u30c0\u30fc\u30af\u30b4\u30fc\u30eb\u30c7\u30f3\u30ed\u30c3\u30c9\n        ctx.lineWidth = 2;\n        ctx.stroke();\n    }\n\n    function draw() {\n        ctx.fillStyle = \"white\";\n        ctx.fillRect(0, 0, 400, 200);\n        ctx.strokeStyle = \"#ccc\";\n        ctx.strokeRect(0, 170, 400, 1);\n        \n        \/\/ \u2605\u30d7\u30ec\u30a4\u30e4\u30fc\u3092\u661f\u306b\u5909\u66f4\n        \/\/ \u661f\u306e\u4e2d\u5fc3\u5ea7\u6a19\u3092\u8a08\u7b97\u3057\u3066\u63cf\u753b\uff08\u5927\u304d\u3055\u306f\u5143\u306e20px\u306b\u5408\u308f\u305b\u3066\u8abf\u6574\uff09\n        drawStar(ctx, player.x + 10, player.y + 10, 5, 12, 6);\n\n        ctx.fillStyle = \"black\";\n        obstacles.forEach(o => ctx.fillRect(o.x, o.y, o.w, o.h));\n\n        if (!active && score === 0) {\n            ctx.fillStyle = \"black\";\n            ctx.font = \"20px sans-serif\";\n            ctx.fillText(\"CLICK TO START\", 120, 100);\n        }\n    }\n\n    function update() {\n        if (!active) return;\n\n        player.v += 0.5;\n        player.y += player.v;\n        if (player.y > 150) {\n            player.y = 150;\n            player.v = 0;\n            player.grounded = true;\n        }\n\n        if (Math.random() < 0.02) {\n            if (obstacles.length === 0 || obstacles[obstacles.length-1].x < 250) {\n                obstacles.push({ x: 400, y: 150, w: 20, h: 20 });\n            }\n        }\n\n        for (let i = obstacles.length - 1; i >= 0; i--) {\n            obstacles[i].x -= 5;\n            \n            if (player.x < obstacles[i].x + 20 && player.x + 20 > obstacles[i].x &&\n                player.y < obstacles[i].y + 20 && player.y + 20 > obstacles[i].y) {\n                \n                active = false;\n                showResult(score);\n                return;\n            }\n\n            if (obstacles[i].x < -20) {\n                obstacles.splice(i, 1);\n                score++;\n                scoreText.innerText = score;\n            }\n        }\n\n        draw();\n        requestAnimationFrame(update);\n    }\n\n    function jump() {\n        if (!active) {\n            active = true;\n            update();\n        } else if (player.grounded) {\n            player.v = -8;\n            player.grounded = false;\n        }\n    }\n\n    window.addEventListener(\"keydown\", e => { if(e.code === \"Space\") jump(); });\n    cvs.addEventListener(\"mousedown\", jump);\n    cvs.addEventListener(\"touchstart\", e => { e.preventDefault(); jump(); });\n\n    draw();\n\nfunction showResult(score) {\n    var overlay = document.getElementById('game-result-overlay');\n    var scoreDisp = document.getElementById('final-score');\n    var rankDisp = document.getElementById('score-rank');\n\n    if(overlay && scoreDisp && rankDisp){\n        if(scoreArea) scoreArea.style.display = 'none';\n        if(instruction) instruction.style.display = 'none';\n        if(cvs) cvs.style.display = 'none';\n\n        var rank = \"\";\n        var color = \"\";\n        if (score >= 100) { rank = \"SSS\u7d1a\uff1a\u661f\u7a7a\u306e\u5b88\u8b77\u8005\"; color = \"#ff00ff\"; }\n        else if (score >= 50) { rank = \"S\u7d1a\uff1aPC\u30b5\u30dd\u30fc\u30c8\u306e\u9054\u4eba\"; color = \"#00e5ff\"; }\n        else if (score >= 20) { rank = \"A\u7d1a\uff1aAI\u4f7f\u3044\u306e\u5375\"; color = \"#ccff00\"; }\n        else { rank = \"B\u7d1a\uff1a\u99c6\u3051\u51fa\u3057\u30a8\u30f3\u30b8\u30cb\u30a2\"; color = \"#ffffff\"; }\n        \n        scoreDisp.innerText = score;\n        rankDisp.innerText = rank;\n        rankDisp.style.color = color;\n        overlay.style.display = 'flex';\n    }\n}\n<\/script>\n<\/body>\n<\/html>\n\n\n\n<h2 class=\"wp-block-heading\">\u30c0\u30fc\u30c4DE\u4eca\u6c96\u7e04<\/h2>\n\n\n\n<meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\">\n    <title>\u6c96\u7e04\u30c0\u30fc\u30c4\u4eca\u6c96\u7e04 - ima.okinawa<\/title>\n    <!-- Tailwind CSS -->\n    <script src=\"https:\/\/cdn.tailwindcss.com\"><\/script>\n    <!-- FontAwesome Icons -->\n    <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.4.0\/css\/all.min.css\">\n    <!-- Google Fonts -->\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=M+PLUS+Rounded+1c:wght@400;700;800;900&amp;display=swap\" rel=\"stylesheet\">\n    \n    <style>\n        \/* Scoped styles to isolate from WordPress Theme overrides *\/\n        #okinawa-darts-game-root {\n            font-family: 'M PLUS Rounded 1c', -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n            touch-action: manipulation;\n            user-select: none;\n            -webkit-user-select: none;\n            background: linear-gradient(135deg, #021B29 0%, #074758 50%, #002B36 100%);\n            color: #ffffff;\n            width: 100%;\n            max-width: 480px;\n            margin: 0 auto;\n            border-radius: 24px;\n            overflow: hidden;\n            box-shadow: 0 12px 40px rgba(0,0,0,0.5);\n            box-sizing: border-box;\n            position: relative;\n            padding: 16px;\n        }\n\n        #okinawa-darts-game-root * {\n            box-sizing: border-box;\n        }\n\n        #okinawa-darts-game-root .glass-panel {\n            background: rgba(255, 255, 255, 0.12);\n            backdrop-filter: blur(10px);\n            -webkit-backdrop-filter: blur(10px);\n            border: 1px solid rgba(255, 255, 255, 0.2);\n        }\n\n        #okinawa-darts-game-root .glass-btn {\n            background: linear-gradient(135deg, rgba(255,255,255,0.25) 0%, rgba(255,255,255,0.08) 100%);\n            backdrop-filter: blur(6px);\n            border: 1px solid rgba(255,255,255,0.3);\n            transition: all 0.15s ease;\n        }\n\n        #okinawa-darts-game-root .glass-btn:active {\n            transform: scale(0.95);\n        }\n\n        \/* Power & Aim Indicator Gauges *\/\n        #okinawa-darts-game-root .gauge-bar {\n            height: 12px;\n            background: rgba(0, 0, 0, 0.5);\n            border: 1px solid rgba(255, 255, 255, 0.3);\n            border-radius: 6px;\n            position: relative;\n            overflow: hidden;\n        }\n\n        #okinawa-darts-game-root .gauge-fill {\n            height: 100%;\n            width: 50%;\n            background: linear-gradient(90deg, #00E676, #FFD700, #FF2E63);\n        }\n\n        \/* Floating Score Text Animation *\/\n        @keyframes wpDartsFloatUp {\n            0% { transform: translate(-50%, -50%) scale(0.5); opacity: 0; }\n            30% { transform: translate(-50%, -70%) scale(1.3); opacity: 1; }\n            100% { transform: translate(-50%, -120%) scale(1); opacity: 0; }\n        }\n\n        #okinawa-darts-game-root .score-popup {\n            position: absolute;\n            animation: wpDartsFloatUp 1.2s forwards cubic-bezier(0.1, 0.8, 0.3, 1);\n            pointer-events: none;\n            font-weight: 900;\n            text-shadow: 0 0 8px rgba(0,0,0,0.9), 2px 2px 0 #000;\n            z-index: 60;\n            white-space: nowrap;\n        }\n\n        \/* Screen Shake effect on Bull hit *\/\n        @keyframes wpDartsShake {\n            0%, 100% { transform: translate(0, 0); }\n            20% { transform: translate(-4px, 4px); }\n            40% { transform: translate(4px, -4px); }\n            60% { transform: translate(-3px, -2px); }\n            80% { transform: translate(3px, 2px); }\n        }\n\n        #okinawa-darts-game-root.shake-target {\n            animation: wpDartsShake 0.3s ease-in-out;\n        }\n    <\/style>\n\n\n\n\n<div id=\"okinawa-darts-game-root\">\n\n    <!-- Header Section -->\n    <header class=\"w-full text-center mb-2\">\n        <div class=\"flex items-center justify-center gap-2\">\n            <span class=\"text-2xl\">\ud83c\udf3a<\/span>\n            <h1 class=\"text-2xl sm:text-3xl font-black text-transparent bg-clip-text bg-gradient-to-r from-yellow-300 via-orange-300 to-pink-400 m-0\">\n                \u6c96\u7e04\u30c0\u30fc\u30c4 \u4eca\u6c96\u7e04\n            <\/h1>\n            <span class=\"text-2xl\">\ud83e\udd81<\/span>\n        <\/div>\n        <p class=\"text-[10px] sm:text-xs text-cyan-200 tracking-wider font-bold m-0 mt-0.5\">ima.okinawa MINI-GAME<\/p>\n    <\/header>\n\n    <!-- Score & Game Status Bar -->\n    <div class=\"w-full glass-panel rounded-2xl p-2.5 mb-2 flex justify-between items-center text-center\">\n        <!-- Round Indicator -->\n        <div class=\"w-1\/3 flex flex-col items-center\">\n            <span class=\"text-[10px] text-cyan-200 font-bold uppercase\">\u30e9\u30a6\u30f3\u30c9<\/span>\n            <span id=\"wp-round-text\" class=\"text-lg sm:text-xl font-black text-yellow-300\">1 \/ 5<\/span>\n        <\/div>\n\n        <!-- Darts Left Indicator -->\n        <div class=\"w-1\/3 flex flex-col items-center border-x border-white\/10 px-1\">\n            <span class=\"text-[10px] text-cyan-200 font-bold uppercase\">\u6b8b\u308a\u77e2<\/span>\n            <div id=\"wp-darts-icons\" class=\"flex gap-1 mt-1 text-pink-500 text-sm\">\n                <i class=\"fa-solid fa-location-arrow rotate-45\" aria-hidden=\"true\"><\/i>\n                <i class=\"fa-solid fa-location-arrow rotate-45\" aria-hidden=\"true\"><\/i>\n                <i class=\"fa-solid fa-location-arrow rotate-45\" aria-hidden=\"true\"><\/i>\n            <\/div>\n        <\/div>\n\n        <!-- Total Score -->\n        <div class=\"w-1\/3 flex flex-col items-center\">\n            <span class=\"text-[10px] text-cyan-200 font-bold uppercase\">\u30b9\u30b3\u30a2<\/span>\n            <span id=\"wp-score-text\" class=\"text-lg sm:text-xl font-black text-emerald-300\">0<\/span>\n        <\/div>\n    <\/div>\n\n    <!-- Aiming Guidance Status Banner -->\n    <div id=\"wp-status-banner\" class=\"w-full text-center py-1.5 px-3 bg-black\/50 rounded-xl border border-yellow-400\/30 mb-2\">\n        <span id=\"wp-status-text\" class=\"text-xs font-bold text-yellow-300 animate-pulse\">\n            \ud83d\udc46 \u30dc\u30bf\u30f3\u304b\u753b\u9762\u3092\u62bc\u3057\u3066\u300c\u5de6\u53f3 (X\u8ef8)\u300d\u3092\u6b62\u3081\u3088\u3046\uff01\n        <\/span>\n    <\/div>\n\n    <!-- Main Game Board Container using Fail-Safe Pure SVG -->\n    <div id=\"wp-game-card\" class=\"relative w-full aspect-square glass-panel rounded-3xl overflow-hidden p-2 flex items-center justify-center border-2 border-yellow-500\/30 cursor-pointer\">\n        \n        <!-- PURE INLINE SVG DARTBOARD: 100% Fail-Proof in WordPress -->\n        <svg id=\"wp-svg-dartboard\" viewBox=\"0 0 500 500\" class=\"w-full h-full rounded-2xl select-none\">\n            <defs>\n                <!-- Outer Shadow Gradient -->\n                <radialGradient id=\"bgGrad\" cx=\"50%\" cy=\"50%\" r=\"50%\">\n                    <stop offset=\"0%\" stop-color=\"#022B3A\"><\/stop>\n                    <stop offset=\"100%\" stop-color=\"#00131C\"><\/stop>\n                <\/radialGradient>\n                <!-- Bull Gradient -->\n                <radialGradient id=\"bullGrad\" cx=\"50%\" cy=\"50%\" r=\"50%\">\n                    <stop offset=\"0%\" stop-color=\"#FF5252\"><\/stop>\n                    <stop offset=\"100%\" stop-color=\"#D50000\"><\/stop>\n                <\/radialGradient>\n            <\/defs>\n\n            <!-- Outer Board Rim -->\n            <circle cx=\"250\" cy=\"250\" r=\"240\" fill=\"url(#bgGrad)\" stroke=\"#FFD700\" stroke-width=\"6\"><\/circle>\n            <circle cx=\"250\" cy=\"250\" r=\"230\" fill=\"none\" stroke=\"rgba(255,255,255,0.2)\" stroke-width=\"2\"><\/circle>\n\n            <!-- OUTER RING (DOUBLE Zone: 2x) -->\n            <circle cx=\"250\" cy=\"250\" r=\"200\" fill=\"#00B4D8\" stroke=\"#FFFFFF\" stroke-width=\"2\"><\/circle>\n            \n            <!-- MIDDLE RING (SINGLE Zone: 1x) -->\n            <circle cx=\"250\" cy=\"250\" r=\"145\" fill=\"#07575B\" stroke=\"#FFFFFF\" stroke-width=\"2\"><\/circle>\n\n            <!-- INNER RING (TRIPLE Zone: 3x) -->\n            <circle cx=\"250\" cy=\"250\" r=\"85\" fill=\"#00E676\" stroke=\"#FFFFFF\" stroke-width=\"2\"><\/circle>\n\n            <!-- BULL CENTER (50 pts) -->\n            <circle cx=\"250\" cy=\"250\" r=\"32\" fill=\"url(#bullGrad)\" stroke=\"#FFD700\" stroke-width=\"4\"><\/circle>\n\n            <!-- Target Area Labels (Embedded SVG Text) -->\n            <text x=\"250\" y=\"250\" fill=\"#FFFFFF\" font-size=\"12\" font-weight=\"900\" text-anchor=\"middle\" dominant-baseline=\"central\">\u4eca\u6c96\u7e04<\/text>\n            <text x=\"250\" y=\"250\" fill=\"#FFD700\" font-size=\"8\" font-weight=\"900\" text-anchor=\"middle\" dominant-baseline=\"central\" dy=\"13\">BULL<\/text>\n\n            <text x=\"250\" y=\"188\" fill=\"#FFFFFF\" font-size=\"11\" font-weight=\"800\" text-anchor=\"middle\">\u2728 \u4e07\u5ea7\u6bdb\u30fb\u9996\u91cc\u57ce (3x)<\/text>\n            <text x=\"250\" y=\"322\" fill=\"#FFFFFF\" font-size=\"11\" font-weight=\"800\" text-anchor=\"middle\">\u7f8e\u3089\u6d77\u30fb\u3084\u3093\u3070\u308b (3x)<\/text>\n\n            <text x=\"250\" y=\"120\" fill=\"#E0F7FA\" font-size=\"12\" font-weight=\"700\" text-anchor=\"middle\">\ud83c\udf3a \u6c96\u7e04\u672c\u5cf6\u30a8\u30ea\u30a2 (1x)<\/text>\n            <text x=\"250\" y=\"392\" fill=\"#E0F7FA\" font-size=\"12\" font-weight=\"700\" text-anchor=\"middle\">\ud83c\udf0a \u56fd\u969b\u901a\u308a\u30fb\u8aad\u8c37 (1x)<\/text>\n\n            <text x=\"250\" y=\"62\" fill=\"#FFFFFF\" font-size=\"11\" font-weight=\"800\" text-anchor=\"middle\">\ud83c\udf34 \u77f3\u57a3\u5cf6\u30fb\u5bae\u53e4\u5cf6 (2x)<\/text>\n            <text x=\"250\" y=\"448\" fill=\"#FFFFFF\" font-size=\"11\" font-weight=\"800\" text-anchor=\"middle\">\ud83d\udc22 \u7af9\u5bcc\u5cf6\u30fb\u897f\u8868\u5cf6 (2x)<\/text>\n\n            <!-- Decorative Star \/ Okinawa Accents -->\n            <text x=\"70\" y=\"255\" fill=\"#FFD700\" font-size=\"18\" text-anchor=\"middle\">\ud83c\udf3a<\/text>\n            <text x=\"430\" y=\"255\" fill=\"#FFD700\" font-size=\"18\" text-anchor=\"middle\">\ud83c\udf3a<\/text>\n\n            <!-- Crosshair Guides (Layered in SVG) -->\n            <line id=\"svg-crosshair-x\" x1=\"250\" y1=\"10\" x2=\"250\" y2=\"490\" stroke=\"#FFD700\" stroke-width=\"2.5\" stroke-dasharray=\"6,4\"><\/line>\n            <line id=\"svg-crosshair-y\" x1=\"10\" y1=\"250\" x2=\"490\" y2=\"250\" stroke=\"#FFD700\" stroke-width=\"2.5\" stroke-dasharray=\"6,4\" opacity=\"0.4\"><\/line>\n            <circle id=\"svg-target-point\" cx=\"250\" cy=\"250\" r=\"8\" fill=\"#FF2E63\" stroke=\"#FFFFFF\" stroke-width=\"2\"><\/circle>\n\n            <!-- Group Layer for Stuck Darts -->\n            <g id=\"svg-stuck-darts-layer\"><\/g>\n\n            <!-- Group Layer for Flying Animation Dart -->\n            <g id=\"svg-flying-dart-layer\"><\/g>\n        <\/svg>\n\n        <!-- Score Popups Layer -->\n        <div id=\"wp-popup-layer\" class=\"absolute inset-0 pointer-events-none overflow-hidden\"><\/div>\n    <\/div>\n\n    <!-- Timing Gauges (Horizontal & Vertical Aim Indicators) -->\n    <div class=\"w-full space-y-1.5 my-2.5 px-1\">\n        <div class=\"flex items-center gap-2\">\n            <span class=\"text-[10px] font-bold text-cyan-200 w-12 text-right\">\u5de6\u53f3 (X):<\/span>\n            <div class=\"gauge-bar flex-grow\">\n                <div id=\"wp-gauge-x\" class=\"gauge-fill\"><\/div>\n            <\/div>\n        <\/div>\n        <div class=\"flex items-center gap-2\">\n            <span class=\"text-[10px] font-bold text-cyan-200 w-12 text-right\">\u4e0a\u4e0b (Y):<\/span>\n            <div class=\"gauge-bar flex-grow\">\n                <div id=\"wp-gauge-y\" class=\"gauge-fill\"><\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <!-- Primary Trigger Button -->\n    <button id=\"wp-action-btn\" type=\"button\" class=\"w-full py-3.5 bg-gradient-to-r from-yellow-400 via-orange-400 to-pink-500 hover:brightness-110 active:scale-95 transition-all duration-150 rounded-2xl font-black text-gray-900 text-base shadow-xl border-2 border-white\/40 flex items-center justify-center gap-2 my-2 cursor-pointer\">\n        <i class=\"fa-solid fa-bullseye\" aria-hidden=\"true\"><\/i>\n        <span id=\"wp-action-btn-text\">\u30bf\u30c3\u30d7\u3057\u3066\u72d9\u3044\u3092\u5b9a\u3081\u308b\uff01<\/span>\n    <\/button>\n\n    <!-- Secondary Utility Controls Bar -->\n    <div class=\"w-full flex justify-between items-center text-xs px-1 my-1\">\n        <button id=\"wp-sound-btn\" type=\"button\" class=\"glass-btn px-3 py-1.5 rounded-full flex items-center gap-1 text-cyan-200 cursor-pointer\">\n            <i id=\"wp-sound-icon\" class=\"fa-solid fa-volume-high text-emerald-400\" aria-hidden=\"true\"><\/i>\n            <span id=\"wp-sound-text\">SOUND ON<\/span>\n        <\/button>\n        <span class=\"text-cyan-300\/80 text-[10px]\">\u6700\u9ad8\u8a18\u9332: <strong id=\"wp-highscore-text\" class=\"text-yellow-300\">0<\/strong>pt<\/span>\n        <button id=\"wp-how-btn\" type=\"button\" class=\"glass-btn px-3 py-1.5 rounded-full flex items-center gap-1 text-cyan-200 cursor-pointer\">\n            <i class=\"fa-solid fa-circle-question text-yellow-400\" aria-hidden=\"true\"><\/i>\n            <span>\u30eb\u30fc\u30eb<\/span>\n        <\/button>\n    <\/div>\n\n    <!-- Footer -->\n    <footer class=\"text-[10px] text-cyan-300\/60 text-center mt-2 mb-0\">\n        \u00a9 ima.okinawa | \u6c96\u7e04\u30df\u30cb\u30b2\u30fc\u30e0\u30b7\u30ea\u30fc\u30ba\n    <\/footer>\n\n    <!-- Modal: How to Play -->\n    <div id=\"wp-modal-how\" class=\"absolute inset-0 bg-black\/85 backdrop-blur-md z-50 flex items-center justify-center p-4 hidden\">\n        <div class=\"glass-panel w-full rounded-2xl p-5 text-white border border-yellow-500\/40 relative\">\n            <button id=\"wp-close-how\" type=\"button\" class=\"absolute top-3 right-3 text-cyan-200 text-lg hover:text-white cursor-pointer\">\n                <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"><\/i>\n            <\/button>\n            <h3 class=\"text-base font-black text-yellow-300 mb-3 flex items-center gap-1.5\">\n                <span>\ud83c\udfaf<\/span> \u6c96\u7e04\u30c0\u30fc\u30c4\u306e\u904a\u3073\u65b9\n            <\/h3>\n            <ul class=\"text-xs space-y-2 text-cyan-100 leading-relaxed mb-4 p-0 list-none\">\n                <li class=\"flex items-start gap-2\">\n                    <span class=\"bg-yellow-400\/30 text-yellow-300 font-black px-1.5 py-0.5 rounded text-[10px]\">1<\/span>\n                    <strong>1\u56de\u76ee\u306e\u30bf\u30c3\u30d7:<\/strong> \u5de6\u53f3\u306b\u52d5\u304f\u300c\u6a2a\u8ef8(X)\u300d\u3092\u6b62\u3081\u307e\u3059\u3002\n                <\/li>\n                <li class=\"flex items-start gap-2\">\n                    <span class=\"bg-yellow-400\/30 text-yellow-300 font-black px-1.5 py-0.5 rounded text-[10px]\">2<\/span>\n                    <strong>2\u56de\u76ee\u306e\u30bf\u30c3\u30d7:<\/strong> \u4e0a\u4e0b\u306b\u52d5\u304f\u300c\u7e26\u8ef8(Y)\u300d\u3092\u6b62\u3081\u3066\u30c0\u30fc\u30c4\u3092\u653e\u3061\u307e\u3059\uff01\n                <\/li>\n                <li class=\"flex items-start gap-2\">\n                    <span class=\"bg-yellow-400\/30 text-yellow-300 font-black px-1.5 py-0.5 rounded text-[10px]\">3<\/span>\n                    \ud83c\udfaf \u4e2d\u592e\u300c\u4eca\u6c96\u7e04 BULL (50pt)\u300d\u3084\u30c8\u30ea\u30d7\u30eb\u30be\u30fc\u30f3(3\u500d)\u3067\u9ad8\u5f97\u70b9\uff01\n                <\/li>\n                <li class=\"flex items-start gap-2\">\n                    <span class=\"bg-yellow-400\/30 text-yellow-300 font-black px-1.5 py-0.5 rounded text-[10px]\">4<\/span>\n                    \u51685\u30e9\u30a6\u30f3\u30c9\uff08\u8a0815\u6295\uff09\u306e\u5408\u8a08\u5f97\u70b9\u3067\u7409\u7403\u79f0\u53f7\u3092\u7372\u5f97\uff01\n                <\/li>\n            <\/ul>\n            <button id=\"wp-btn-start-modal\" type=\"button\" class=\"w-full py-2.5 bg-gradient-to-r from-yellow-400 to-orange-500 rounded-xl font-black text-gray-900 shadow-lg text-xs hover:brightness-110 cursor-pointer\">\n                \u7406\u89e3\u3057\u305f\uff01\u30b2\u30fc\u30e0\u3092\u306f\u3058\u3081\u308b\n            <\/button>\n        <\/div>\n    <\/div>\n\n    <!-- Modal: Result Screen -->\n    <div id=\"wp-modal-result\" class=\"absolute inset-0 bg-black\/90 backdrop-blur-md z-50 flex items-center justify-center p-4 hidden\">\n        <div class=\"glass-panel w-full rounded-2xl p-5 text-center text-white border-2 border-yellow-400\/50 shadow-2xl relative\">\n            <span class=\"text-[10px] font-bold text-cyan-300 tracking-widest uppercase\">RESULT \/ \u6700\u7d42\u7d50\u679c<\/span>\n            \n            <div class=\"my-2\">\n                <div id=\"wp-res-rank-badge\" class=\"inline-block px-3 py-0.5 rounded-full text-[10px] font-black bg-yellow-400 text-gray-900 shadow mb-1\">\n                    RANK\n                <\/div>\n                <h2 id=\"wp-res-rank-title\" class=\"text-xl font-black text-transparent bg-clip-text bg-gradient-to-r from-yellow-300 via-orange-300 to-pink-300 m-0\">\n                    \u7409\u7403\u30c0\u30fc\u30c4\u795e\n                <\/h2>\n            <\/div>\n\n            <div class=\"bg-black\/60 rounded-xl p-3 my-2 border border-white\/10\">\n                <div class=\"text-[10px] text-cyan-200\">\u7372\u5f97\u5408\u8a08\u30b9\u30b3\u30a2<\/div>\n                <div id=\"wp-res-score\" class=\"text-3xl font-black text-yellow-300 my-0.5\">520<\/div>\n                <div id=\"wp-res-comment\" class=\"text-xs text-emerald-300 font-bold\">\u300c\u30cf\u30a4\u30b5\u30a4\uff01\u5168\u77e2\u795e\u30d2\u30c3\u30c8\uff01\u300d<\/div>\n            <\/div>\n\n            <!-- Spot Recommendation -->\n            <div class=\"bg-teal-900\/50 rounded-xl p-2.5 my-2 text-left border border-teal-500\/30\">\n                <div class=\"flex items-center gap-1 text-[11px] font-bold text-yellow-400 mb-0.5\">\n                    <span>\ud83c\udf34<\/span> <span id=\"wp-res-spot-name\">\u672c\u65e5\u306e\u304a\u3059\u3059\u3081\u6c96\u7e04\u30b9\u30dd\u30c3\u30c8<\/span>\n                <\/div>\n                <p id=\"wp-res-spot-desc\" class=\"text-[10px] text-cyan-100 leading-relaxed m-0\">\n                    \u53e4\u5b87\u5229\u5cf6\uff1a\u7dba\u9e97\u306a\u6d77\u3068\u30cf\u30fc\u30c8\u30ed\u30c3\u30af\u304c\u4eba\u6c17\u306e\u30a8\u30e1\u30e9\u30eb\u30c9\u30b9\u30dd\u30c3\u30c8\uff01\n                <\/p>\n            <\/div>\n\n            <div class=\"space-y-2 mt-3\">\n                <button id=\"wp-btn-retry\" type=\"button\" class=\"w-full py-2.5 bg-gradient-to-r from-emerald-400 to-teal-500 text-gray-900 rounded-xl font-black shadow-lg text-xs hover:brightness-110 flex items-center justify-center gap-1.5 cursor-pointer\">\n                    <i class=\"fa-solid fa-rotate-right\" aria-hidden=\"true\"><\/i> \u3082\u3046\u4e00\u5ea6\u904a\u3076\uff01\n                <\/button>\n                <button id=\"wp-btn-share\" type=\"button\" class=\"w-full py-2 bg-sky-500\/30 hover:bg-sky-500\/50 text-sky-200 rounded-xl font-bold border border-sky-400\/40 text-xs transition flex items-center justify-center gap-1.5 cursor-pointer\">\n                    <i class=\"fa-brands fa-x-twitter\" aria-hidden=\"true\"><\/i> \u7d50\u679c\u3092SNS\u3067\u30b7\u30a7\u30a2\n                <\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n\n<\/div>\n\n<script>\n    (function() {\n        \/\/ ==========================================\n        \/\/ WEB AUDIO SYNTHESIZER (No External Files)\n        \/\/ ==========================================\n        class WpAudioSynth {\n            constructor() {\n                this.ctx = null;\n                this.enabled = true;\n            }\n\n            init() {\n                if (!this.ctx) {\n                    const AudioContext = window.AudioContext || window.webkitAudioContext;\n                    if (AudioContext) this.ctx = new AudioContext();\n                }\n                if (this.ctx && this.ctx.state === 'suspended') {\n                    this.ctx.resume();\n                }\n            }\n\n            playClick() {\n                if (!this.enabled || !this.ctx) return;\n                try {\n                    const osc = this.ctx.createOscillator();\n                    const gain = this.ctx.createGain();\n                    osc.type = 'sine';\n                    osc.frequency.setValueAtTime(600, this.ctx.currentTime);\n                    gain.gain.setValueAtTime(0.1, this.ctx.currentTime);\n                    gain.gain.exponentialRampToValueAtTime(0.01, this.ctx.currentTime + 0.05);\n                    osc.connect(gain);\n                    gain.connect(this.ctx.destination);\n                    osc.start();\n                    osc.stop(this.ctx.currentTime + 0.05);\n                } catch(e) {}\n            }\n\n            playHit(isBull = false) {\n                if (!this.enabled || !this.ctx) return;\n                try {\n                    const osc = this.ctx.createOscillator();\n                    const gain = this.ctx.createGain();\n                    osc.type = 'triangle';\n                    osc.frequency.setValueAtTime(isBull ? 240 : 160, this.ctx.currentTime);\n                    osc.frequency.exponentialRampToValueAtTime(40, this.ctx.currentTime + 0.15);\n                    gain.gain.setValueAtTime(0.25, this.ctx.currentTime);\n                    gain.gain.linearRampToValueAtTime(0.01, this.ctx.currentTime + 0.15);\n                    osc.connect(gain);\n                    gain.connect(this.ctx.destination);\n                    osc.start();\n                    osc.stop(this.ctx.currentTime + 0.15);\n\n                    if (isBull) {\n                        setTimeout(() => {\n                            const chime = this.ctx.createOscillator();\n                            const chimeGain = this.ctx.createGain();\n                            chime.type = 'sine';\n                            chime.frequency.setValueAtTime(880, this.ctx.currentTime);\n                            chime.frequency.exponentialRampToValueAtTime(1760, this.ctx.currentTime + 0.3);\n                            chimeGain.gain.setValueAtTime(0.2, this.ctx.currentTime);\n                            chimeGain.gain.linearRampToValueAtTime(0.01, this.ctx.currentTime + 0.3);\n                            chime.connect(chimeGain);\n                            chimeGain.connect(this.ctx.destination);\n                            chime.start();\n                            chime.stop(this.ctx.currentTime + 0.3);\n                        }, 50);\n                    }\n                } catch(e) {}\n            }\n\n            playFanfare() {\n                if (!this.enabled || !this.ctx) return;\n                const freqs = [523.25, 659.25, 783.99, 1046.50];\n                freqs.forEach((f, idx) => {\n                    setTimeout(() => {\n                        try {\n                            const osc = this.ctx.createOscillator();\n                            const gain = this.ctx.createGain();\n                            osc.type = 'triangle';\n                            osc.frequency.setValueAtTime(f, this.ctx.currentTime);\n                            gain.gain.setValueAtTime(0.2, this.ctx.currentTime);\n                            gain.gain.linearRampToValueAtTime(0.01, this.ctx.currentTime + 0.2);\n                            osc.connect(gain);\n                            gain.connect(this.ctx.destination);\n                            osc.start();\n                            osc.stop(this.ctx.currentTime + 0.2);\n                        } catch(e){}\n                    }, idx * 90);\n                });\n            }\n        }\n\n        const audio = new WpAudioSynth();\n\n        \/\/ ==========================================\n        \/\/ DATA & RECOMMENDATIONS\n        \/\/ ==========================================\n        const OKINAWA_SPOTS = [\n            { name: \"\u4e07\u5ea7\u6bdb (\u6069\u7d0d\u6751)\", desc: \"\u8c61\u306e\u9f3b\u306b\u4f3c\u305f\u7d76\u666f\u30b9\u30dd\u30c3\u30c8\uff01\u5915\u65e5\u306e\u7f8e\u3057\u3055\u306f\u6c96\u7e04\u968f\u4e00\u3067\u3059\u3002\" },\n            { name: \"\u5099\u702c\u306e\u30d5\u30af\u30ae\u4e26\u6728 (\u672c\u90e8\u753a)\", desc: \"\u6728\u6f0f\u308c\u65e5\u304c\u5fc3\u5730\u3088\u3044\u7652\u3057\u306e\u30d5\u30af\u30ae\u4e26\u6728\u3002\u6c96\u7e04\u306e\u539f\u98a8\u666f\u304c\u5e83\u304c\u308a\u307e\u3059\u3002\" },\n            { name: \"\u53e4\u5b87\u5229\u5927\u6a4b & \u30cf\u30fc\u30c8\u30ed\u30c3\u30af\", desc: \"\u30a8\u30e1\u30e9\u30eb\u30c9\u30b0\u30ea\u30fc\u30f3\u306e\u6d77\u3092\u6e21\u308b\u30c9\u30e9\u30a4\u30d6\u30b3\u30fc\u30b9\u306e\u6700\u9ad8\u5cf0\uff01\" },\n            { name: \"\u5ddd\u5e73\u6e7e (\u77f3\u57a3\u5cf6)\", desc: \"\u30b0\u30e9\u30b9\u30dc\u30fc\u30c8\u3067\u4e16\u754c\u6709\u6570\u306e\u900f\u660e\u5ea6\u306e\u6d77\u3068\u30b5\u30f3\u30b4\u7901\u3092\u6e80\u55ab\uff01\" },\n            { name: \"\u9996\u91cc\u57ce\u516c\u5712 (\u90a3\u8987\u5e02)\", desc: \"\u7409\u7403\u738b\u56fd\u306e\u6b74\u53f2\u3068\u6587\u5316\u3092\u611f\u3058\u308b\u8c61\u5fb4\u7684\u306a\u6b74\u53f2\u57ce\u90ed\u30b9\u30dd\u30c3\u30c8\u3002\" }\n        ];\n\n        function getRankData(score) {\n            if (score >= 450) {\n                return { badge: \"RANK S\", title: \"\ud83d\udc51 \u7409\u7403\u30c0\u30fc\u30c4\u306e\u795e\", comment: \"\u30cf\u30a4\u30b5\u30a4\uff01\u9a5a\u7570\u306e\u5168\u77e2\u795e\u30d2\u30c3\u30c8\uff01\u6c96\u7e04\u306e\u98a8\u304c\u5b8c\u5168\u306b\u5473\u65b9\u3057\u3066\u3044\u307e\u3059\uff01\" };\n            } else if (score >= 300) {\n                return { badge: \"RANK A\", title: \"\ud83c\udf3a \u6c96\u7e04\u901a\u30c0\u30fc\u30c4\u30d7\u30ed\", comment: \"\u898b\u4e8b\u306a\u8155\u524d\uff01BULL\u3068\u30c8\u30ea\u30d7\u30eb\u3092\u5c04\u629c\u304f\u59ff\u306f\u307e\u3055\u306b\u30b7\u30fc\u30b5\u30fc\u7d1a\uff01\" };\n            } else if (score >= 180) {\n                return { badge: \"RANK B\", title: \"\ud83d\udc22 \u3081\u3093\u305d\u30fc\u308c\u611b\u597d\u5bb6\", comment: \"\u30ca\u30a4\u30b9\u30b7\u30e7\u30c3\u30c8\uff01\u6c96\u7e04\u65c5\u884c\u306e\u5408\u9593\u306b\u7d20\u6674\u3089\u3057\u3044\u7cbe\u5ea6\u3067\u3059\uff01\" };\n            } else {\n                return { badge: \"RANK C\", title: \"\ud83c\udf34 \u3061\u3080\u3069\u3093\u3069\u3093\u521d\u5fc3\u8005\", comment: \"\u7126\u3089\u305a\u306e\u3093\u3073\u308a\uff01\u6c96\u7e04\u6642\u9593\u3067\u697d\u3057\u304f\u30ea\u30c8\u30e9\u30a4\u3057\u307e\u3057\u3087\u3046\uff5e\" };\n            }\n        }\n\n        \/\/ ==========================================\n        \/\/ GAME STATE & SVG ELEMENTS\n        \/\/ ==========================================\n        const SVG_CENTER = 250;\n        \n        let state = 'AIM_X'; \/\/ 'AIM_X', 'AIM_Y', 'ANIMATING', 'GAME_OVER'\n        let totalRounds = 5;\n        let currentRound = 1;\n        let dartsLeft = 3;\n        let totalScore = 0;\n        let highScore = parseInt(localStorage.getItem('wp_okinawa_darts_hi') || '0', 10);\n\n        let aimX = 0.5; \/\/ Normalized 0.0 - 1.0\n        let aimY = 0.5; \/\/ Normalized 0.0 - 1.0\n        let timeX = 0;\n        let timeY = 0;\n\n        let lockedSvgX = 250;\n        let lockedSvgY = 250;\n\n        let thrownDarts = []; \/\/ Array of {x, y} in SVG coordinates\n\n        \/\/ DOM Element Refs\n        const rootEl = document.getElementById('okinawa-darts-game-root');\n        const gameCard = document.getElementById('wp-game-card');\n        const actionBtn = document.getElementById('wp-action-btn');\n        const crosshairX = document.getElementById('svg-crosshair-x');\n        const crosshairY = document.getElementById('svg-crosshair-y');\n        const targetPoint = document.getElementById('svg-target-point');\n        const stuckLayer = document.getElementById('svg-stuck-darts-layer');\n        const flyingLayer = document.getElementById('svg-flying-dart-layer');\n        const popupLayer = document.getElementById('wp-popup-layer');\n\n        \/\/ ==========================================\n        \/\/ INPUT CONTROLLER\n        \/\/ ==========================================\n        function handleUserAction(e) {\n            if (e) {\n                e.preventDefault();\n                e.stopPropagation();\n            }\n\n            audio.init();\n\n            if (state === 'AIM_X') {\n                audio.playClick();\n                lockedSvgX = (0.1 + aimX * 0.8) * 500;\n                state = 'AIM_Y';\n                updateUI();\n            } else if (state === 'AIM_Y') {\n                audio.playClick();\n                lockedSvgY = (0.1 + aimY * 0.8) * 500;\n                state = 'ANIMATING';\n                startThrowAnimation(lockedSvgX, lockedSvgY);\n                updateUI();\n            }\n        }\n\n        gameCard.addEventListener('pointerdown', handleUserAction);\n        actionBtn.addEventListener('click', handleUserAction);\n\n        \/\/ ==========================================\n        \/\/ SCORING & ANIMATION LOGIC\n        \/\/ ==========================================\n        function calculateScore(svgX, svgY) {\n            const dist = Math.hypot(svgX - SVG_CENTER, svgY - SVG_CENTER);\n\n            if (dist <= 32)  return { pts: 50, label: \"\ud83d\udd25 \u4eca\u6c96\u7e04 BULL!\", color: \"#FFD700\" };\n            if (dist <= 85)  return { pts: 45, label: \"\u2728 \u30c8\u30ea\u30d7\u30eb(3x)\u30be\u30fc\u30f3!\", color: \"#00E676\" };\n            if (dist <= 145) return { pts: 20, label: \"\ud83c\udfaf \u6c96\u7e04\u672c\u5cf6 (1x)\", color: \"#00B4D8\" };\n            if (dist <= 200) return { pts: 30, label: \"\ud83c\udf34 \u96e2\u5cf6\u30c0\u30d6\u30eb(2x)!\", color: \"#FF6B4A\" };\n\n            return { pts: 0, label: \"\u30a2\u30a6\u30c8!\", color: \"#9E9E9E\" };\n        }\n\n        function startThrowAnimation(targetX, targetY) {\n            let progress = 0;\n            \n            \/\/ Clear flying layer\n            flyingLayer.innerHTML = '';\n\n            const flyingGroup = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'g');\n            flyingGroup.innerHTML = `\n                <ellipse cx=\"0\" cy=\"8\" rx=\"6\" ry=\"3\" fill=\"rgba(0,0,0,0.4)\" \/>\n                <path d=\"M 0 0 L -8 -20 L 0 -14 L 8 -20 Z\" fill=\"#FF2E63\" \/>\n                <circle cx=\"0\" cy=\"0\" r=\"4\" fill=\"#FFD700\" \/>\n            `;\n            flyingLayer.appendChild(flyingGroup);\n\n            function animateDart() {\n                progress += 0.08;\n                if (progress >= 1) {\n                    flyingLayer.innerHTML = '';\n                    onDartLanded(targetX, targetY);\n                } else {\n                    const curX = 250 + (targetX - 250) * progress;\n                    const curY = 520 + (targetY - 520) * progress;\n                    const scale = 2.2 - 1.2 * progress;\n\n                    flyingGroup.setAttribute('transform', `translate(${curX}, ${curY}) scale(${scale})`);\n                    requestAnimationFrame(animateDart);\n                }\n            }\n\n            requestAnimationFrame(animateDart);\n        }\n\n        function onDartLanded(x, y) {\n            const hit = calculateScore(x, y);\n            const isBull = hit.pts === 50;\n\n            audio.playHit(isBull);\n\n            thrownDarts.push({ x, y });\n            renderStuckDarts();\n\n            totalScore += hit.pts;\n\n            if (totalScore > highScore) {\n                highScore = totalScore;\n                localStorage.setItem('wp_okinawa_darts_hi', highScore.toString());\n            }\n\n            showScorePopup(x, y, hit);\n\n            if (isBull) {\n                rootEl.classList.add('shake-target');\n                setTimeout(() => rootEl.classList.remove('shake-target'), 300);\n            }\n\n            dartsLeft--;\n\n            setTimeout(() => {\n                if (dartsLeft > 0) {\n                    state = 'AIM_X';\n                } else {\n                    if (currentRound < totalRounds) {\n                        currentRound++;\n                        dartsLeft = 3;\n                        thrownDarts = [];\n                        renderStuckDarts();\n                        state = 'AIM_X';\n                    } else {\n                        finishGame();\n                        return;\n                    }\n                }\n                updateUI();\n            }, 600);\n        }\n\n        function renderStuckDarts() {\n            stuckLayer.innerHTML = '';\n            thrownDarts.forEach(d => {\n                const g = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'g');\n                g.setAttribute('transform', `translate(${d.x}, ${d.y})`);\n                g.innerHTML = `\n                    <ellipse cx=\"2\" cy=\"6\" rx=\"4\" ry=\"2\" fill=\"rgba(0,0,0,0.5)\" \/>\n                    <path d=\"M 0 0 L -6 -16 L 0 -11 L 6 -16 Z\" fill=\"#FF2E63\" \/>\n                    <circle cx=\"0\" cy=\"0\" r=\"3.5\" fill=\"#FFD700\" stroke=\"#FFFFFF\" stroke-width=\"1\" \/>\n                `;\n                stuckLayer.appendChild(g);\n            });\n        }\n\n        function showScorePopup(svgX, svgY, hit) {\n            const pop = document.createElement('div');\n            pop.className = 'score-popup text-xs sm:text-sm font-black';\n            pop.style.left = `${(svgX \/ 500) * 100}%`;\n            pop.style.top = `${(svgY \/ 500) * 100}%`;\n            pop.style.color = hit.color;\n            pop.innerHTML = `${hit.label}<br>+${hit.pts}pt`;\n\n            popupLayer.appendChild(pop);\n            setTimeout(() => pop.remove(), 1200);\n        }\n\n        function finishGame() {\n            state = 'GAME_OVER';\n            audio.playFanfare();\n\n            const r = getRankData(totalScore);\n            const spot = OKINAWA_SPOTS[Math.floor(Math.random() * OKINAWA_SPOTS.length)];\n\n            document.getElementById('wp-res-rank-badge').textContent = r.badge;\n            document.getElementById('wp-res-rank-title').textContent = r.title;\n            document.getElementById('wp-res-score').textContent = totalScore;\n            document.getElementById('wp-res-comment').textContent = r.comment;\n\n            document.getElementById('wp-res-spot-name').textContent = spot.name;\n            document.getElementById('wp-res-spot-desc').textContent = spot.desc;\n\n            document.getElementById('wp-modal-result').classList.remove('hidden');\n            updateUI();\n        }\n\n        function resetGame() {\n            currentRound = 1;\n            dartsLeft = 3;\n            totalScore = 0;\n            thrownDarts = [];\n            renderStuckDarts();\n            state = 'AIM_X';\n            document.getElementById('wp-modal-result').classList.add('hidden');\n            updateUI();\n        }\n\n        function updateUI() {\n            document.getElementById('wp-round-text').textContent = `${currentRound} \/ ${totalRounds}`;\n            document.getElementById('wp-score-text').textContent = totalScore;\n            document.getElementById('wp-highscore-text').textContent = highScore;\n\n            \/\/ Darts Icons\n            const dContainer = document.getElementById('wp-darts-icons');\n            dContainer.innerHTML = '';\n            for (let i = 0; i < dartsLeft; i++) {\n                dContainer.innerHTML += `<i class=\"fa-solid fa-location-arrow rotate-45\" aria-hidden=\"true\"><\/i>`;\n            }\n\n            \/\/ Banner & Button Text\n            const sBanner = document.getElementById('wp-status-text');\n            const btnText = document.getElementById('wp-action-btn-text');\n\n            if (state === 'AIM_X') {\n                sBanner.textContent = \"\u30b9\u30c6\u30c3\u30d7 1: \u30bf\u30c3\u30d7\u3067\u300c\u6a2a\u8ef8 (X)\u300d\u3092\u30b9\u30c8\u30c3\u30d7\uff01\";\n                btnText.textContent = \"\u6a2a\u8ef8(X)\u3092\u6b62\u3081\u308b\uff01\";\n            } else if (state === 'AIM_Y') {\n                sBanner.textContent = \"\u30b9\u30c6\u30c3\u30d7 2: \u30bf\u30c3\u30d7\u3067\u300c\u7e26\u8ef8 (Y)\u300d\u3092\u6b62\u3081\u3066\u6295\u3052\u308b\uff01\";\n                btnText.textContent = \"\u7e26\u8ef8(Y)\u3092\u6b62\u3081\u3066\u30c0\u30fc\u30c4\u3092\u653e\u3064\uff01\";\n            } else if (state === 'ANIMATING') {\n                sBanner.textContent = \"\u30c0\u30fc\u30c4\u98db\u884c\u4e2d...\uff01\";\n                btnText.textContent = \"\u72d9\u3044\u4e2d...\";\n            } else {\n                sBanner.textContent = \"\u30b2\u30fc\u30e0\u7d42\u4e86\uff01\";\n                btnText.textContent = \"\u7d50\u679c\u767a\u8868\uff01\";\n            }\n\n            \/\/ Gauge Fills\n            document.getElementById('wp-gauge-x').style.width = `${aimX * 100}%`;\n            document.getElementById('wp-gauge-y').style.width = `${aimY * 100}%`;\n        }\n\n        \/\/ ==========================================\n        \/\/ MAIN LOOP (SVG CROSSHAIR POSITIONING)\n        \/\/ ==========================================\n        function gameLoop() {\n            if (state === 'AIM_X') {\n                timeX += 0.035;\n                aimX = (Math.sin(timeX) + 1) \/ 2;\n            }\n            if (state === 'AIM_Y') {\n                timeY += 0.045;\n                aimY = (Math.sin(timeY) + 1) \/ 2;\n            }\n\n            const curSvgX = (state === 'AIM_X') ? (0.1 + aimX * 0.8) * 500 : lockedSvgX;\n            const curSvgY = (state === 'AIM_Y') ? (0.1 + aimY * 0.8) * 500 : (state === 'AIM_X' ? 250 : lockedSvgY);\n\n            \/\/ Update SVG Crosshairs\n            crosshairX.setAttribute('x1', curSvgX);\n            crosshairX.setAttribute('x2', curSvgX);\n\n            crosshairY.setAttribute('y1', curSvgY);\n            crosshairY.setAttribute('y2', curSvgY);\n            crosshairY.setAttribute('opacity', state === 'AIM_Y' ? '1' : '0.2');\n\n            targetPoint.setAttribute('cx', curSvgX);\n            targetPoint.setAttribute('cy', curSvgY);\n\n            requestAnimationFrame(gameLoop);\n        }\n\n        \/\/ Initialize Modals & Sound Event Listeners\n        document.getElementById('wp-how-btn').addEventListener('click', () => {\n            document.getElementById('wp-modal-how').classList.remove('hidden');\n        });\n        document.getElementById('wp-close-how').addEventListener('click', () => {\n            document.getElementById('wp-modal-how').classList.add('hidden');\n        });\n        document.getElementById('wp-btn-start-modal').addEventListener('click', () => {\n            audio.init();\n            document.getElementById('wp-modal-how').classList.add('hidden');\n        });\n\n        document.getElementById('wp-btn-retry').addEventListener('click', resetGame);\n\n        document.getElementById('wp-sound-btn').addEventListener('click', (e) => {\n            e.stopPropagation();\n            audio.init();\n            audio.enabled = !audio.enabled;\n            document.getElementById('wp-sound-icon').className = audio.enabled \n                ? 'fa-solid fa-volume-high text-emerald-400' \n                : 'fa-solid fa-volume-xmark text-gray-400';\n            document.getElementById('wp-sound-text').textContent = audio.enabled ? 'SOUND ON' : 'SOUND OFF';\n        });\n\n        document.getElementById('wp-btn-share').addEventListener('click', () => {\n            const r = getRankData(totalScore);\n            const txt = `\ud83c\udfaf\u3010\u6c96\u7e04\u30c0\u30fc\u30c4 \u4eca\u6c96\u7e04\u3011\u3067\u30b9\u30b3\u30a2 ${totalScore}\u70b9\uff08${r.title}\uff09\u3092\u7372\u5f97\uff01\\n\u6c96\u7e04\u306e\u98a8\u3092\u611f\u3058\u3066\u30c0\u30fc\u30c4\u52dd\u8ca0\uff01\ud83c\udf3a\u2728\\n#\u4eca\u6c96\u7e04 #imaokinawa #\u6c96\u7e04\u30c0\u30fc\u30c4`;\n            \n            const dummy = document.createElement('textarea');\n            document.body.appendChild(dummy);\n            dummy.value = txt;\n            dummy.select();\n            document.execCommand('copy');\n            document.body.removeChild(dummy);\n            alert('\u7d50\u679c\u3092\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc\u3057\u307e\u3057\u305f\uff01SNS\u306b\u6295\u7a3f\u3057\u3066\u306d\ud83c\udf3a');\n        });\n\n        updateUI();\n        requestAnimationFrame(gameLoop);\n    })();\n<\/script>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div id=\"okinawa-game-root\">\n    <style>\n        \/* CSS Encapsulation for WordPress Theme Compatibility *\/\n        #okinawa-game-root {\n            all: initial;\n            font-family: 'Hiragino Kaku Gothic ProN', '\u30e1\u30a4\u30ea\u30aa', sans-serif;\n            display: block;\n            width: 100%;\n            max-width: 680px;\n            margin: 0 auto;\n            position: relative;\n            box-sizing: border-box;\n            user-select: none;\n            -webkit-user-select: none;\n            touch-action: none;\n        }\n\n        #okinawa-game-root * {\n            box-sizing: border-box;\n            margin: 0;\n            padding: 0;\n        }\n\n        #okinawa-game-root .game-card {\n            background: linear-gradient(180deg, #0284c7 0%, #06b6d4 50%, #0d9488 100%);\n            border-radius: 20px;\n            border: 4px solid #f59e0b;\n            box-shadow: 0 10px 25px rgba(0, 0, 0, 0.3);\n            overflow: hidden;\n            position: relative;\n            padding: 12px;\n        }\n\n        #okinawa-game-root .header-bar {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            margin-bottom: 10px;\n            color: #ffffff;\n        }\n\n        #okinawa-game-root .title-text {\n            font-size: 18px;\n            font-weight: 900;\n            color: #fef08a;\n            text-shadow: 2px 2px 4px rgba(0,0,0,0.6);\n            display: flex;\n            align-items: center;\n            gap: 6px;\n        }\n\n        #okinawa-game-root .btn-sound {\n            background: #f59e0b;\n            color: #ffffff;\n            border: 2px solid #fff;\n            padding: 4px 12px;\n            border-radius: 20px;\n            font-weight: bold;\n            font-size: 12px;\n            cursor: pointer;\n            transition: transform 0.1s, background 0.2s;\n            box-shadow: 0 2px 5px rgba(0,0,0,0.2);\n        }\n\n        #okinawa-game-root .btn-sound:active {\n            transform: scale(0.95);\n        }\n\n        #okinawa-game-root .canvas-wrapper {\n            position: relative;\n            width: 100%;\n            aspect-ratio: 4 \/ 5;\n            background: #0284c7;\n            border-radius: 12px;\n            overflow: hidden;\n            border: 2px solid rgba(255, 255, 255, 0.4);\n            box-shadow: inset 0 0 20px rgba(0,0,0,0.3);\n        }\n\n        #okinawa-game-root canvas {\n            display: block;\n            width: 100%;\n            height: 100%;\n            touch-action: none;\n        }\n\n        \/* Overlay Views *\/\n        #okinawa-game-root .overlay {\n            position: absolute;\n            inset: 0;\n            background: rgba(3, 105, 161, 0.92);\n            display: flex;\n            flex-direction: column;\n            justify-content: center;\n            align-items: center;\n            padding: 20px;\n            text-align: center;\n            color: #ffffff;\n            z-index: 10;\n        }\n\n        #okinawa-game-root .overlay.hidden {\n            display: none !important;\n        }\n\n        #okinawa-game-root .overlay-title {\n            font-size: 26px;\n            font-weight: 900;\n            color: #fef08a;\n            margin-bottom: 8px;\n            text-shadow: 2px 2px 6px rgba(0,0,0,0.8);\n        }\n\n        #okinawa-game-root .overlay-desc {\n            font-size: 13px;\n            color: #e0f2fe;\n            margin-bottom: 18px;\n            line-height: 1.5;\n        }\n\n        #okinawa-game-root .item-grid {\n            display: grid;\n            grid-template-columns: 1fr 1fr;\n            gap: 8px;\n            background: rgba(255, 255, 255, 0.1);\n            padding: 10px;\n            border-radius: 10px;\n            margin-bottom: 20px;\n            font-size: 11px;\n            text-align: left;\n        }\n\n        #okinawa-game-root .btn-primary {\n            background: linear-gradient(135deg, #10b981 0%, #059669 100%);\n            color: #ffffff;\n            font-size: 18px;\n            font-weight: 900;\n            padding: 12px 32px;\n            border-radius: 30px;\n            border: 3px solid #a7f3d0;\n            box-shadow: 0 6px 15px rgba(0,0,0,0.3);\n            cursor: pointer;\n            transition: transform 0.15s, filter 0.15s;\n        }\n\n        #okinawa-game-root .btn-primary:hover {\n            filter: brightness(1.1);\n            transform: scale(1.03);\n        }\n\n        #okinawa-game-root .btn-primary:active {\n            transform: scale(0.96);\n        }\n\n        #okinawa-game-root .hud-panel {\n            position: absolute;\n            top: 8px;\n            left: 8px;\n            right: 8px;\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            background: rgba(15, 23, 42, 0.55);\n            backdrop-filter: blur(4px);\n            padding: 6px 12px;\n            border-radius: 8px;\n            font-weight: bold;\n            font-size: 13px;\n            color: #fff;\n            border: 1px solid rgba(255, 255, 255, 0.2);\n            pointer-events: none;\n            z-index: 5;\n        }\n\n        #okinawa-game-root .hud-val {\n            color: #fef08a;\n            font-size: 15px;\n        }\n    <\/style>\n\n    <div class=\"game-card\">\n        <div class=\"header-bar\">\n            <div class=\"title-text\">\n                <span>\ud83c\udf3a<\/span> \u3081\u3093\u305d\u30fc\u308c\uff01\u7409\u7403\u30d6\u30ed\u30c3\u30af\u30d0\u30b9\u30bf\u30fc\n            <\/div>\n            <button id=\"ok-sound-btn\" class=\"btn-sound\">\ud83d\udd0a BGM: ON<\/button>\n        <\/div>\n\n        <div class=\"canvas-wrapper\">\n            <canvas id=\"okBreakerCanvas\"><\/canvas>\n\n            <!-- HUD Overlay -->\n            <div class=\"hud-panel\">\n                <div>SCORE: <span id=\"ok-score\" class=\"hud-val\">0<\/span><\/div>\n                <div>STAGE: <span id=\"ok-stage\" class=\"hud-val\">1<\/span><\/div>\n                <div>LIFE: <span id=\"ok-lives\" class=\"hud-val\">\ud83e\udd81\ud83e\udd81\ud83e\udd81<\/span><\/div>\n            <\/div>\n\n            <!-- Start Screen Overlay -->\n            <div id=\"ok-start-screen\" class=\"overlay\">\n                <div style=\"font-size: 48px; margin-bottom: 6px;\">\ud83c\udf3a\ud83e\udd81\ud83c\udf4d<\/div>\n                <div class=\"overlay-title\">\u6c96\u7e04\u30d6\u30ed\u30c3\u30af\u5d29\u3057<\/div>\n                <div class=\"overlay-desc\">\n                    \u30b5\u30d0\u30cb\u8239\u30d1\u30c9\u30eb\u3067\u5357\u56fd\u306e\u30dc\u30fc\u30eb\u3092\u8df3\u306d\u8fd4\u305d\u3046\uff01<br>\n                    \u6c96\u7e04\u540d\u7269\u30d6\u30ed\u30c3\u30af\u3092\u7834\u58ca\u3057\u3066\u30b9\u30c6\u30fc\u30b8\u30af\u30ea\u30a2\u3092\u76ee\u6307\u305b\uff01\n                <\/div>\n                <div class=\"item-grid\">\n                    <div>\ud83c\udf7e \u6ce1\u76db: \u8cab\u901a\u30dc\u30fc\u30eb<\/div>\n                    <div>\ud83e\udeb8 \u30b5\u30f3\u30b4: \u5e95\u9762\u30d0\u30ea\u30a2<\/div>\n                    <div>\ud83e\udd6d \u30de\u30f3\u30b4\u30fc: \u30d1\u30c9\u30eb\u62e1\u5927<\/div>\n                    <div>\ud83c\udf6a \u3061\u3093\u3059\u3053\u3046: \u5206\u88c2\u30dc\u30fc\u30eb<\/div>\n                <\/div>\n                <button id=\"ok-start-btn\" class=\"btn-primary\">\u30b2\u30fc\u30e0\u30b9\u30bf\u30fc\u30c8\uff01<\/button>\n            <\/div>\n\n            <!-- Game Over \/ Clear Screen Overlay -->\n            <div id=\"ok-msg-screen\" class=\"overlay hidden\">\n                <div id=\"ok-msg-emoji\" style=\"font-size: 48px; margin-bottom: 6px;\">\ud83c\udfdd\ufe0f<\/div>\n                <div id=\"ok-msg-title\" class=\"overlay-title\">\u30b9\u30c6\u30fc\u30b8\u30af\u30ea\u30a2\uff01<\/div>\n                <div id=\"ok-msg-desc\" class=\"overlay-desc\">\u6700\u9ad8\u3084\u3055\u30fc\uff01\u6b21\u306e\u30b9\u30c6\u30fc\u30b8\u306b\u9032\u3082\u3046\uff01<\/div>\n                <div style=\"margin-bottom: 16px; font-weight: bold;\">\n                    \u6700\u7d42\u30b9\u30b3\u30a2: <span id=\"ok-final-score\" style=\"color: #fef08a; font-size: 20px;\">0<\/span>\n                <\/div>\n                <button id=\"ok-msg-btn\" class=\"btn-primary\">\u3064\u304e\u3078\u9032\u3080<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <script>\n        (function() {\n            \/\/ Scope everything to avoid WordPress global variable pollution\n            const root = document.getElementById('okinawa-game-root');\n            const canvas = root.querySelector('#okBreakerCanvas');\n            const ctx = canvas.getContext('2d');\n\n            \/\/ Virtual Internal Canvas Resolution\n            const CW = 480;\n            const CH = 600;\n\n            function resizeCanvas() {\n                canvas.width = CW;\n                canvas.height = CH;\n            }\n            resizeCanvas();\n\n            \/\/ --- Web Audio Synthesizer Engine (Sanshin & SE) ---\n            class SoundEngine {\n                constructor() {\n                    this.ctx = null;\n                    this.enabled = true;\n                    this.bgmTimer = null;\n                }\n\n                init() {\n                    if (!this.ctx) {\n                        const AudioContext = window.AudioContext || window.webkitAudioContext;\n                        this.ctx = new AudioContext();\n                    }\n                    if (this.ctx.state === 'suspended') {\n                        this.ctx.resume();\n                    }\n                }\n\n                playSanshin(freq) {\n                    if (!this.enabled || !this.ctx) return;\n                    try {\n                        const now = this.ctx.currentTime;\n                        const osc = this.ctx.createOscillator();\n                        const gain = this.ctx.createGain();\n\n                        osc.type = 'sawtooth';\n                        osc.frequency.setValueAtTime(freq, now);\n\n                        gain.gain.setValueAtTime(0.2, now);\n                        gain.gain.exponentialRampToValueAtTime(0.001, now + 0.35);\n\n                        osc.connect(gain);\n                        gain.connect(this.ctx.destination);\n\n                        osc.start(now);\n                        osc.stop(now + 0.35);\n                    } catch(e){}\n                }\n\n                playSE(type) {\n                    if (!this.enabled || !this.ctx) return;\n                    try {\n                        const now = this.ctx.currentTime;\n                        const osc = this.ctx.createOscillator();\n                        const gain = this.ctx.createGain();\n                        osc.connect(gain);\n                        gain.connect(this.ctx.destination);\n\n                        if (type === 'hit') {\n                            osc.type = 'sine';\n                            osc.frequency.setValueAtTime(440, now);\n                            gain.gain.setValueAtTime(0.15, now);\n                            gain.gain.exponentialRampToValueAtTime(0.01, now + 0.08);\n                            osc.start(now);\n                            osc.stop(now + 0.08);\n                        } else if (type === 'break') {\n                            osc.type = 'triangle';\n                            osc.frequency.setValueAtTime(659.25, now); \/\/ E5\n                            gain.gain.setValueAtTime(0.2, now);\n                            gain.gain.exponentialRampToValueAtTime(0.01, now + 0.12);\n                            osc.start(now);\n                            osc.stop(now + 0.12);\n                        } else if (type === 'powerup') {\n                            [523.25, 659.25, 783.99, 1046.50].forEach((f, i) => {\n                                setTimeout(() => this.playSanshin(f), i * 60);\n                            });\n                        } else if (type === 'lose') {\n                            osc.type = 'sawtooth';\n                            osc.frequency.setValueAtTime(180, now);\n                            gain.gain.setValueAtTime(0.2, now);\n                            gain.gain.exponentialRampToValueAtTime(0.01, now + 0.4);\n                            osc.start(now);\n                            osc.stop(now + 0.4);\n                        }\n                    } catch(e){}\n                }\n\n                startBGM() {\n                    if (this.bgmTimer) return;\n                    \/\/ Ryukyu Pentatonic Scale (C, E, F, G, B)\n                    const notes = [261.63, 329.63, 349.23, 392.00, 493.88, 523.25];\n                    const seq = [0, 2, 3, 3, 2, 0, 3, 4, 5, 4, 3, 2, 0, 2, 3, 0];\n                    let step = 0;\n\n                    this.bgmTimer = setInterval(() => {\n                        if (!this.enabled) return;\n                        if (Math.random() > 0.15) {\n                            this.playSanshin(notes[seq[step % seq.length]]);\n                        }\n                        step++;\n                    }, 240);\n                }\n\n                stopBGM() {\n                    if (this.bgmTimer) {\n                        clearInterval(this.bgmTimer);\n                        this.bgmTimer = null;\n                    }\n                }\n            }\n\n            const sound = new SoundEngine();\n\n            \/\/ --- STREAMING_CHUNK:Game entities and stage design... ---\n            const BRICK_TYPES = {\n                GOYA: { name: '\u30b4\u30fc\u30e4\u30fc', emoji: '\ud83e\udd52', color: '#15803d', hp: 1, score: 100 },\n                PINE: { name: '\u30d1\u30a4\u30f3', emoji: '\ud83c\udf4d', color: '#eab308', hp: 1, score: 120 },\n                SHURI: { name: '\u9996\u91cc\u57ce\u8d64\u74e6', emoji: '\ud83c\udfe0', color: '#dc2626', hp: 2, score: 200 },\n                BLUE: { name: '\u7f8e\u3089\u6d77', emoji: '\ud83c\udf0a', color: '#0284c7', hp: 1, score: 110 },\n                HIBISCUS: { name: '\u30cf\u30a4\u30d3\u30b9\u30ab\u30b9', emoji: '\ud83c\udf3a', color: '#ec4899', hp: 1, score: 150 }\n            };\n\n            const ITEM_TYPES = {\n                AWAMORI: { emoji: '\ud83c\udf7e', label: '\u8cab\u901a\u30dc\u30fc\u30eb', color: '#8b5cf6' },\n                CORAL: { emoji: '\ud83e\udeb8', label: '\u30b5\u30f3\u30b4\u30d0\u30ea\u30a2', color: '#06b6d4' },\n                MANGO: { emoji: '\ud83e\udd6d', label: '\u30d1\u30c9\u30eb\u62e1\u5927', color: '#f97316' },\n                CHINSUKO: { emoji: '\ud83c\udf6a', label: '\u30dc\u30fc\u30eb\u5206\u88c2', color: '#d97706' }\n            };\n\n            \/\/ Game State\n            let gameState = 'START'; \/\/ 'START', 'PLAYING', 'CLEAR', 'GAMEOVER'\n            let score = 0;\n            let level = 1;\n            let lives = 3;\n\n            let paddle = { x: 190, y: 540, w: 100, h: 18, color: '#f59e0b', isWide: false, wideTimer: null };\n            let balls = [];\n            let bricks = [];\n            let items = [];\n            let particles = [];\n            let floatTexts = [];\n            let coralBarrier = false;\n\n            \/\/ Touch & Drag state\n            let isDragging = false;\n\n            function createBall(x, y, vx, vy) {\n                return {\n                    x: x || 240,\n                    y: y || 520,\n                    radius: 10,\n                    vx: vx || (Math.random() > 0.5 ? 4 : -4),\n                    vy: vy || -5,\n                    isFire: false,\n                    fireTimer: null\n                };\n            }\n\n            \/\/ Build Level Layouts\n            function loadLevel(lvl) {\n                bricks = [];\n                const cols = 7;\n                const rows = lvl === 1 ? 4 : lvl === 2 ? 6 : 7;\n                const bw = 58;\n                const bh = 24;\n                const pad = 6;\n                const offsetLeft = 16;\n                const offsetTop = 60;\n\n                const keys = Object.keys(BRICK_TYPES);\n\n                for (let r = 0; r < rows; r++) {\n                    for (let c = 0; c < cols; c++) {\n                        \/\/ Level 2 Shisa arrangement pattern skip\n                        if (lvl === 2 && (r + c) % 2 === 0) continue;\n\n                        let typeKey = keys[(r + c) % keys.length];\n                        if (r === 0) typeKey = 'SHURI';\n\n                        const t = BRICK_TYPES[typeKey];\n                        bricks.push({\n                            x: offsetLeft + c * (bw + pad),\n                            y: offsetTop + r * (bh + pad),\n                            w: bw,\n                            h: bh,\n                            type: t,\n                            hp: t.hp,\n                            maxHp: t.hp\n                        });\n                    }\n                }\n            }\n\n            function spawnParticles(x, y, color, count = 10) {\n                for (let i = 0; i < count; i++) {\n                    const ang = Math.random() * Math.PI * 2;\n                    const spd = Math.random() * 4 + 1;\n                    particles.push({\n                        x, y,\n                        vx: Math.cos(ang) * spd,\n                        vy: Math.sin(ang) * spd,\n                        color,\n                        alpha: 1.0,\n                        size: Math.random() * 4 + 2\n                    });\n                }\n            }\n\n            function spawnFloatText(text, x, y) {\n                floatTexts.push({ text, x, y, vy: -1.2, alpha: 1.0 });\n            }\n\n            function triggerPowerup(typeKey) {\n                sound.playSE('powerup');\n                if (typeKey === 'AWAMORI') {\n                    spawnFloatText('\u6ce1\u76db\u8cab\u901a\u30d1\u30ef\u30fc\uff01\ud83c\udf7e', paddle.x + paddle.w\/2, paddle.y);\n                    balls.forEach(b => {\n                        b.isFire = true;\n                        clearTimeout(b.fireTimer);\n                        b.fireTimer = setTimeout(() => b.isFire = false, 7000);\n                    });\n                } else if (typeKey === 'CORAL') {\n                    spawnFloatText('\u30b5\u30f3\u30b4\u30d0\u30ea\u30a2\u767a\u52d5\uff01\ud83e\udeb8', CW\/2, CH - 20);\n                    coralBarrier = true;\n                } else if (typeKey === 'MANGO') {\n                    spawnFloatText('\u30de\u30f3\u30b4\u30fc\u5de8\u5927\u5316\uff01\ud83e\udd6d', paddle.x + paddle.w\/2, paddle.y);\n                    paddle.w = 150;\n                    clearTimeout(paddle.wideTimer);\n                    paddle.wideTimer = setTimeout(() => paddle.w = 100, 8000);\n                } else if (typeKey === 'CHINSUKO') {\n                    spawnFloatText('\u3061\u3093\u3059\u3053\u3046\u5206\u88c2\uff01\ud83c\udf6a', paddle.x + paddle.w\/2, paddle.y);\n                    const b = balls[0] || createBall();\n                    balls.push(createBall(b.x, b.y, -3, -5));\n                    balls.push(createBall(b.x, b.y, 3, -5));\n                }\n            }\n\n            function update() {\n                if (gameState !== 'PLAYING') return;\n\n                \/\/ Move Balls\n                for (let i = balls.length - 1; i >= 0; i--) {\n                    const b = balls[i];\n                    b.x += b.vx;\n                    b.y += b.vy;\n\n                    \/\/ Walls\n                    if (b.x - b.radius < 0) { b.x = b.radius; b.vx *= -1; sound.playSE('hit'); }\n                    if (b.x + b.radius > CW) { b.x = CW - b.radius; b.vx *= -1; sound.playSE('hit'); }\n                    if (b.y - b.radius < 0) { b.y = b.radius; b.vy *= -1; sound.playSE('hit'); }\n\n                    \/\/ Coral Wall Barrier\n                    if (coralBarrier && b.y + b.radius >= CH - 10) {\n                        b.vy = -Math.abs(b.vy);\n                        coralBarrier = false;\n                        sound.playSE('hit');\n                        spawnParticles(b.x, b.y, '#06b6d4', 12);\n                    }\n\n                    \/\/ Bottom Fall\n                    if (b.y - b.radius > CH) {\n                        balls.splice(i, 1);\n                        continue;\n                    }\n\n                    \/\/ Paddle Collision\n                    if (\n                        b.y + b.radius >= paddle.y &&\n                        b.y - b.radius <= paddle.y + paddle.h &&\n                        b.x >= paddle.x &&\n                        b.x <= paddle.x + paddle.w &&\n                        b.vy > 0\n                    ) {\n                        sound.playSE('hit');\n                        b.vy = -Math.abs(b.vy);\n                        const hitPos = (b.x - (paddle.x + paddle.w \/ 2)) \/ (paddle.w \/ 2);\n                        b.vx = hitPos * 6;\n                    }\n\n                    \/\/ Brick Collisions\n                    for (let j = bricks.length - 1; j >= 0; j--) {\n                        const bk = bricks[j];\n                        if (\n                            b.x + b.radius > bk.x &&\n                            b.x - b.radius < bk.x + bk.w &&\n                            b.y + b.radius > bk.y &&\n                            b.y - b.radius < bk.y + bk.h\n                        ) {\n                            if (!b.isFire) b.vy *= -1;\n\n                            bk.hp--;\n                            sound.playSE('hit');\n\n                            if (bk.hp <= 0) {\n                                sound.playSE('break');\n                                score += bk.type.score;\n                                spawnParticles(bk.x + bk.w\/2, bk.y + bk.h\/2, bk.type.color, 12);\n\n                                \/\/ Floating Dialect Combo Call\n                                if (Math.random() < 0.3) {\n                                    const dialects = ['\u30a4\u30fc\u30e4\u30fc\u30b5\u30fc\u30b5\u30fc\uff01', '\u30cf\u30fc\u30a4\u30fc\u30e4\uff01', '\u3061\u3085\u3089\u3055\u3093\uff01', '\u30cf\u30a4\u30b5\u30a4\uff01'];\n                                    spawnFloatText(dialects[Math.floor(Math.random()*dialects.length)], bk.x + bk.w\/2, bk.y);\n                                }\n\n                                \/\/ Item Drop (25% chance)\n                                if (Math.random() < 0.25) {\n                                    const ikeys = Object.keys(ITEM_TYPES);\n                                    const ik = ikeys[Math.floor(Math.random() * ikeys.length)];\n                                    items.push({ x: bk.x + bk.w\/2, y: bk.y + bk.h\/2, vy: 2, key: ik });\n                                }\n\n                                bricks.splice(j, 1);\n                            }\n                            updateHUD();\n                            break;\n                        }\n                    }\n                }\n\n                \/\/ Check lost ball \/ life\n                if (balls.length === 0) {\n                    lives--;\n                    sound.playSE('lose');\n                    updateHUD();\n                    if (lives <= 0) {\n                        gameState = 'GAMEOVER';\n                        showOverlay('\u30b2\u30fc\u30e0\u30aa\u30fc\u30d0\u30fc', '\u307e\u305f\u6311\u6226\u3057\u3066\u306d\uff01\ud83c\udf3a', '\ud83e\udd81', '\u3082\u3046\u4e00\u5ea6\u3042\u305d\u3076');\n                    } else {\n                        balls.push(createBall());\n                    }\n                }\n\n                \/\/ Check Stage Clear\n                if (bricks.length === 0) {\n                    gameState = 'CLEAR';\n                    sound.playSE('powerup');\n                    showOverlay(`\u30b9\u30c6\u30fc\u30b8 ${level} \u30af\u30ea\u30a2\uff01`, '\u3067\u30fc\u3058\u7d20\u6674\u3089\u3057\u3044\uff01\u2728', '\ud83c\udfdd\ufe0f', '\u6b21\u306e\u30b9\u30c6\u30fc\u30b8\u3078');\n                }\n\n                \/\/ Falling Items\n                for (let i = items.length - 1; i >= 0; i--) {\n                    const it = items[i];\n                    it.y += it.vy;\n\n                    if (\n                        it.y + 12 >= paddle.y &&\n                        it.y - 12 <= paddle.y + paddle.h &&\n                        it.x >= paddle.x &&\n                        it.x <= paddle.x + paddle.w\n                    ) {\n                        triggerPowerup(it.key);\n                        items.splice(i, 1);\n                        continue;\n                    }\n\n                    if (it.y > CH) items.splice(i, 1);\n                }\n\n                \/\/ FX update\n                particles.forEach((p, idx) => {\n                    p.x += p.vx; p.y += p.vy; p.alpha -= 0.03;\n                    if (p.alpha <= 0) particles.splice(idx, 1);\n                });\n\n                floatTexts.forEach((ft, idx) => {\n                    ft.y += ft.vy; ft.alpha -= 0.025;\n                    if (ft.alpha <= 0) floatTexts.splice(idx, 1);\n                });\n            }\n\n            function draw() {\n                \/\/ Ocean Background\n                const bg = ctx.createLinearGradient(0, 0, 0, CH);\n                bg.addColorStop(0, '#0284c7');\n                bg.addColorStop(0.7, '#06b6d4');\n                bg.addColorStop(1, '#0d9488');\n                ctx.fillStyle = bg;\n                ctx.fillRect(0, 0, CW, CH);\n\n                \/\/ Coral Bottom Barrier\n                if (coralBarrier) {\n                    ctx.fillStyle = '#06b6d4';\n                    ctx.shadowColor = '#67e8f9';\n                    ctx.shadowBlur = 10;\n                    ctx.fillRect(0, CH - 8, CW, 8);\n                    ctx.shadowBlur = 0;\n                }\n\n                \/\/ Paddle (Sabani Boat style)\n                ctx.save();\n                ctx.fillStyle = paddle.color;\n                ctx.shadowColor = 'rgba(0,0,0,0.3)';\n                ctx.shadowBlur = 6;\n                ctx.beginPath();\n                ctx.roundRect(paddle.x, paddle.y, paddle.w, paddle.h, 10);\n                ctx.fill();\n                \/\/ Sabani boat stripe detail\n                ctx.fillStyle = '#d97706';\n                ctx.fillRect(paddle.x + 10, paddle.y + 6, paddle.w - 20, 6);\n                ctx.restore();\n\n                \/\/ Bricks\n                bricks.forEach(bk => {\n                    ctx.save();\n                    ctx.fillStyle = bk.type.color;\n                    ctx.shadowColor = 'rgba(0,0,0,0.2)';\n                    ctx.shadowBlur = 4;\n                    ctx.beginPath();\n                    ctx.roundRect(bk.x, bk.y, bk.w, bk.h, 5);\n                    ctx.fill();\n\n                    \/\/ Emoji\n                    ctx.font = '13px sans-serif';\n                    ctx.textAlign = 'center';\n                    ctx.textBaseline = 'middle';\n                    ctx.fillText(bk.type.emoji, bk.x + bk.w\/2, bk.y + bk.h\/2 + 1);\n                    ctx.restore();\n                });\n\n                \/\/ Items\n                items.forEach(it => {\n                    const def = ITEM_TYPES[it.key];\n                    ctx.save();\n                    ctx.fillStyle = '#ffffff';\n                    ctx.shadowColor = def.color;\n                    ctx.shadowBlur = 8;\n                    ctx.beginPath();\n                    ctx.arc(it.x, it.y, 12, 0, Math.PI * 2);\n                    ctx.fill();\n\n                    ctx.font = '14px sans-serif';\n                    ctx.textAlign = 'center';\n                    ctx.textBaseline = 'middle';\n                    ctx.fillText(def.emoji, it.x, it.y + 1);\n                    ctx.restore();\n                });\n\n                \/\/ Balls\n                balls.forEach(b => {\n                    ctx.save();\n                    if (b.isFire) {\n                        ctx.shadowColor = '#a855f7';\n                        ctx.shadowBlur = 12;\n                    }\n                    ctx.fillStyle = b.isFire ? '#a855f7' : '#f43f5e';\n                    ctx.beginPath();\n                    ctx.arc(b.x, b.y, b.radius, 0, Math.PI * 2);\n                    ctx.fill();\n\n                    ctx.font = '12px sans-serif';\n                    ctx.textAlign = 'center';\n                    ctx.textBaseline = 'middle';\n                    ctx.fillText(b.isFire ? '\ud83c\udf7e' : '\ud83c\udf3a', b.x, b.y);\n                    ctx.restore();\n                });\n\n                \/\/ Particles\n                particles.forEach(p => {\n                    ctx.save();\n                    ctx.globalAlpha = p.alpha;\n                    ctx.fillStyle = p.color;\n                    ctx.beginPath();\n                    ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);\n                    ctx.fill();\n                    ctx.restore();\n                });\n\n                \/\/ Floating Text FX\n                floatTexts.forEach(ft => {\n                    ctx.save();\n                    ctx.globalAlpha = ft.alpha;\n                    ctx.font = 'bold 16px sans-serif';\n                    ctx.fillStyle = '#fef08a';\n                    ctx.strokeStyle = '#0284c7';\n                    ctx.lineWidth = 3;\n                    ctx.textAlign = 'center';\n                    ctx.strokeText(ft.text, ft.x, ft.y);\n                    ctx.fillText(ft.text, ft.x, ft.y);\n                    ctx.restore();\n                });\n            }\n\n            function gameLoop() {\n                update();\n                draw();\n                requestAnimationFrame(gameLoop);\n            }\n\n            function updateHUD() {\n                root.querySelector('#ok-score').innerText = score;\n                root.querySelector('#ok-stage').innerText = level;\n                let lstr = '';\n                for (let i = 0; i < lives; i++) lstr += '\ud83e\udd81';\n                root.querySelector('#ok-lives').innerText = lstr || '\ud83d\udc80';\n            }\n\n            function showOverlay(title, desc, emoji, btnText) {\n                root.querySelector('#ok-msg-title').innerText = title;\n                root.querySelector('#ok-msg-desc').innerText = desc;\n                root.querySelector('#ok-msg-emoji').innerText = emoji;\n                root.querySelector('#ok-msg-btn').innerText = btnText;\n                root.querySelector('#ok-final-score').innerText = score;\n                root.querySelector('#ok-msg-screen').classList.remove('hidden');\n            }\n\n            function startGame() {\n                score = 0;\n                level = 1;\n                lives = 3;\n                paddle.x = (CW - paddle.w) \/ 2;\n                balls = [createBall()];\n                loadLevel(level);\n                updateHUD();\n                gameState = 'PLAYING';\n                sound.startBGM();\n            }\n\n            function nextLevel() {\n                level++;\n                if (level > 3) {\n                    showOverlay('\u5168\u30b9\u30c6\u30fc\u30b8\u5236\u8987\uff01\ud83c\udf89', '\u7409\u7403\u30de\u30b9\u30bf\u30fc\u9054\u6210\u3055\u30fc\uff01', '\ud83c\udfc6', '\u6700\u521d\u304b\u3089\u904a\u3076');\n                    gameState = 'GAMEOVER';\n                    level = 1;\n                } else {\n                    paddle.x = (CW - paddle.w) \/ 2;\n                    balls = [createBall()];\n                    loadLevel(level);\n                    updateHUD();\n                    gameState = 'PLAYING';\n                    root.querySelector('#ok-msg-screen').classList.add('hidden');\n                }\n            }\n\n            \/\/ Touch \/ Pointer controls for WordPress Mobile compatibility\n            function handlePointer(e) {\n                const rect = canvas.getBoundingClientRect();\n                const clientX = e.touches ? e.touches[0].clientX : e.clientX;\n                const scale = CW \/ rect.width;\n                const canvasX = (clientX - rect.left) * scale;\n\n                paddle.x = canvasX - paddle.w \/ 2;\n                if (paddle.x < 0) paddle.x = 0;\n                if (paddle.x + paddle.w > CW) paddle.x = CW - paddle.w;\n            }\n\n            canvas.addEventListener('mousemove', handlePointer);\n            canvas.addEventListener('touchmove', e => {\n                handlePointer(e);\n                e.preventDefault();\n            }, { passive: false });\n\n            \/\/ Button Event Listeners\n            root.querySelector('#ok-start-btn').addEventListener('click', () => {\n                sound.init();\n                root.querySelector('#ok-start-screen').classList.add('hidden');\n                startGame();\n            });\n\n            root.querySelector('#ok-msg-btn').addEventListener('click', () => {\n                sound.init();\n                if (gameState === 'CLEAR') {\n                    nextLevel();\n                } else {\n                    root.querySelector('#ok-msg-screen').classList.add('hidden');\n                    startGame();\n                }\n            });\n\n            root.querySelector('#ok-sound-btn').addEventListener('click', (e) => {\n                sound.init();\n                sound.enabled = !sound.enabled;\n                e.target.innerText = sound.enabled ? '\ud83d\udd0a BGM: ON' : '\ud83d\udd07 BGM: OFF';\n                if (!sound.enabled) sound.stopBGM();\n                else if (gameState === 'PLAYING') sound.startBGM();\n            });\n\n            \/\/ Start loop\n            gameLoop();\n        })();\n    <\/script>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<style>\n    .okinawa-game-container {\n        text-align: center; \n        background: #e0f7fa; \n        font-family: 'Helvetica Neue', Arial, sans-serif; \n        margin: 0 auto; \n        padding: 20px; \n        max-width: 440px;\n        border-radius: 16px;\n        box-sizing: border-box;\n    }\n    .okinawa-game-container canvas { \n        background: #fff; \n        border: 3px solid #00838f; \n        border-radius: 12px;\n        cursor: pointer;\n        width: 100%; \n        max-width: 400px;\n        height: auto; \n        display: block;\n        margin: 0 auto;\n        box-shadow: 0 6px 12px rgba(0,0,0,0.15);\n        touch-action: manipulation;\n    }\n    .okinawa-game-ui { font-size: 20px; font-weight: bold; margin-bottom: 8px; color: #006064; }\n    .okinawa-game-info { font-size: 13px; color: #00838f; font-weight: bold; margin-top: 8px; }\n<\/style>\n\n<div class=\"okinawa-game-container\">\n    <div id=\"oki-score-area\" class=\"okinawa-game-ui\">SCORE: <span id=\"oki-s\">0<\/span><\/div>\n    <canvas id=\"oki-g\" width=\"400\" height=\"200\"><\/canvas>\n    <p id=\"oki-instruction\" class=\"okinawa-game-info\">\u30bf\u30c3\u30d7\u307e\u305f\u306f\u30b9\u30da\u30fc\u30b9\u30ad\u30fc\u3067\u30b7\u30fc\u30b5\u30fc\u304c\u30b8\u30e3\u30f3\u30d7\uff01<\/p>\n<\/div>\n\n<div id=\"oki-result-overlay\" style=\"display:none; position:fixed; top:0; left:0; width:100%; height:100%; background:rgba(0,40,60,0.85); z-index:99999; justify-content:center; align-items:center; flex-direction:column; color:white; font-family:sans-serif; text-align:center;\">\n    <div style=\"background: linear-gradient(135deg, #0288d1, #004d40); padding: 30px 20px; border-radius: 20px; border: 3px solid #ffe082; box-shadow: 0 0 30px rgba(255,224,130,0.5); max-width: 85%; width: 320px;\">\n        <h2 style=\"font-size: 1.8rem; margin: 0 0 5px 0; color: #ffe082;\">\u30b2\u30fc\u30e0\u30aa\u30fc\u30d0\u30fc\uff01<\/h2>\n        <p style=\"font-size: 1rem; margin: 0 0 5px 0; opacity: 0.9;\">ima.okinawa \u30ea\u30b6\u30eb\u30c8<\/p>\n        <div id=\"oki-final-score\" style=\"font-size: 4rem; font-weight: bold; margin: 5px 0; color: #fff;\">0<\/div>\n        <p id=\"oki-score-rank\" style=\"font-size: 1.3rem; font-weight: bold; margin-bottom: 20px;\"><\/p>\n        \n        <!-- \u30dc\u30bf\u30f3\u30a8\u30ea\u30a2\uff08\u7e26\u4e26\u3073\u914d\u7f6e\uff09 -->\n        <div style=\"display: flex; flex-direction: column; gap: 10px; align-items: center;\">\n            <button id=\"oki-retry-btn\" style=\"padding: 12px 28px; font-size: 1rem; background: #ffe082; border: none; border-radius: 50px; cursor: pointer; color: #004d40; font-weight: bold; box-shadow: 0 4px 10px rgba(0,0,0,0.2); width: 100%;\">\u3082\u3046\u4e00\u5ea6\u6311\u6226\u3059\u308b\u3055\u30fc\uff01<\/button>\n            <button id=\"oki-close-btn\" style=\"padding: 10px 24px; font-size: 0.9rem; background: rgba(255,255,255,0.2); border: 1.5px solid rgba(255,255,255,0.6); border-radius: 50px; cursor: pointer; color: #fff; font-weight: bold; width: 100%;\">\u3084\u3081\u3066\u304a\u304f<\/button>\n        <\/div>\n    <\/div>\n<\/div>\n\n<script>\n(function() {\n    window.addEventListener('DOMContentLoaded', function() {\n        const cvs = document.getElementById(\"oki-g\");\n        if (!cvs) return;\n        const ctx = cvs.getContext(\"2d\");\n        const scoreText = document.getElementById(\"oki-s\");\n        const scoreArea = document.getElementById(\"oki-score-area\");\n        const instruction = document.getElementById(\"oki-instruction\");\n        const overlay = document.getElementById('oki-result-overlay');\n        const scoreDisp = document.getElementById('oki-final-score');\n        const rankDisp = document.getElementById('oki-score-rank');\n        const retryBtn = document.getElementById('oki-retry-btn');\n        const closeBtn = document.getElementById('oki-close-btn');\n\n        let player = { x: 50, y: 140, w: 26, h: 26, v: 0, grounded: true };\n        let obstacles = [];\n        let score = 0;\n        let active = false;\n        let animId = null;\n\n        function drawShisa(ctx, x, y) {\n            ctx.fillStyle = \"#D32F2F\"; ctx.beginPath(); ctx.arc(x + 13, y + 15, 11, 0, Math.PI * 2); ctx.fill();\n            ctx.fillStyle = \"#B71C1C\"; ctx.beginPath(); ctx.arc(x + 3, y + 6, 4, 0, Math.PI * 2); ctx.arc(x + 23, y + 6, 4, 0, Math.PI * 2); ctx.fill();\n            ctx.fillStyle = \"#FFF\"; ctx.beginPath(); ctx.arc(x + 8, y + 12, 4, 0, Math.PI * 2); ctx.arc(x + 18, y + 12, 4, 0, Math.PI * 2); ctx.fill();\n            ctx.fillStyle = \"#000\"; ctx.beginPath(); ctx.arc(x + 9, y + 12, 2, 0, Math.PI * 2); ctx.arc(x + 17, y + 12, 2, 0, Math.PI * 2); ctx.fill();\n            ctx.fillStyle = \"#FBC02D\"; ctx.beginPath(); ctx.arc(x + 13, y + 16, 3, 0, Math.PI * 2); ctx.fill();\n            ctx.fillStyle = \"#FFB300\"; ctx.beginPath(); ctx.arc(x + 5, y + 4, 3, 0, Math.PI * 2); ctx.arc(x + 13, y + 2, 3, 0, Math.PI * 2); ctx.arc(x + 21, y + 4, 3, 0, Math.PI * 2); ctx.fill();\n            ctx.fillStyle = \"#FF4081\"; ctx.beginPath(); ctx.arc(x + 20, y + 2, 3, 0, Math.PI * 2); ctx.fill();\n        }\n\n        function drawObstacle(ctx, o) {\n            if (o.type === \"goya\") {\n                ctx.fillStyle = \"#2E7D32\"; ctx.beginPath(); ctx.roundRect(o.x, o.y + 2, o.w, o.h - 2, [8]); ctx.fill();\n                ctx.fillStyle = \"#1B5E20\"; ctx.beginPath(); ctx.arc(o.x + 5, o.y + 8, 2, 0, Math.PI * 2); ctx.arc(o.x + 13, o.y + 14, 2, 0, Math.PI * 2); ctx.arc(o.x + 7, o.y + 20, 2, 0, Math.PI * 2); ctx.fill();\n            } else {\n                ctx.fillStyle = \"#8D6E63\"; ctx.beginPath(); ctx.arc(o.x + o.w \/ 2, o.y + o.h \/ 2, o.w \/ 2, 0, Math.PI * 2); ctx.fill();\n                ctx.strokeStyle = \"#4E342E\"; ctx.lineWidth = 2; ctx.strokeRect(o.x + 4, o.y + 4, o.w - 8, o.h - 8);\n                ctx.fillStyle = \"#D50000\"; ctx.fillRect(o.x - 3, o.y + 12, 4, 2);\n            }\n        }\n\n        function draw() {\n            let skyGradient = ctx.createLinearGradient(0, 0, 0, 160);\n            skyGradient.addColorStop(0, '#80deea');\n            skyGradient.addColorStop(1, '#e0f7fa');\n            ctx.fillStyle = skyGradient;\n            ctx.fillRect(0, 0, 400, 160);\n\n            ctx.fillStyle = \"#26c6da\"; ctx.fillRect(0, 160, 400, 6);\n            ctx.fillStyle = \"#ffe0b2\"; ctx.fillRect(0, 166, 400, 34);\n\n            drawShisa(ctx, player.x, player.y);\n            obstacles.forEach(o => drawObstacle(ctx, o));\n\n            if (!active && score === 0) {\n                ctx.fillStyle = \"#006064\";\n                ctx.font = \"bold 18px sans-serif\";\n                ctx.fillText(\"\u30af\u30ea\u30c3\u30af \/ \u30bf\u30c3\u30d7\u3067\u30b9\u30bf\u30fc\u30c8\uff01\", 75, 90);\n            }\n        }\n\n        function update() {\n            if (!active) return;\n\n            player.v += 0.55;\n            player.y += player.v;\n\n            if (player.y > 140) {\n                player.y = 140;\n                player.v = 0;\n                player.grounded = true;\n            }\n\n            if (Math.random() < 0.02) {\n                if (obstacles.length === 0 || obstacles[obstacles.length - 1].x < 230) {\n                    let type = Math.random() > 0.5 ? \"goya\" : \"habu\";\n                    obstacles.push({ x: 400, y: 142, w: 22, h: 24, type: type });\n                }\n            }\n\n            for (let i = obstacles.length - 1; i >= 0; i--) {\n                obstacles[i].x -= 5.2;\n\n                if (player.x + 3 < obstacles[i].x + obstacles[i].w &&\n                    player.x + player.w - 3 > obstacles[i].x &&\n                    player.y + 3 < obstacles[i].y + obstacles[i].h &&\n                    player.y + player.h > obstacles[i].y) {\n                    \n                    active = false;\n                    showResult(score);\n                    return;\n                }\n\n                if (obstacles[i].x < -25) {\n                    obstacles.splice(i, 1);\n                    score++;\n                    scoreText.innerText = score;\n                }\n            }\n\n            draw();\n            animId = requestAnimationFrame(update);\n        }\n\n        function jump() {\n            if (!active) {\n                active = true;\n                update();\n            } else if (player.grounded) {\n                player.v = -8.5;\n                player.grounded = false;\n            }\n        }\n\n        function resetGame() {\n            score = 0;\n            obstacles = [];\n            player.y = 140;\n            player.v = 0;\n            player.grounded = true;\n            scoreText.innerText = \"0\";\n            overlay.style.display = 'none';\n            active = true;\n            draw();\n            update();\n        }\n\n        function closeOverlay() {\n            score = 0;\n            obstacles = [];\n            player.y = 140;\n            player.v = 0;\n            player.grounded = true;\n            scoreText.innerText = \"0\";\n            overlay.style.display = 'none';\n            active = false;\n            draw(); \/\/ \u30bf\u30a4\u30c8\u30eb\u753b\u9762\u306b\u623b\u3059\n        }\n\n        window.addEventListener(\"keydown\", function(e) { if(e.code === \"Space\") jump(); });\n        cvs.addEventListener(\"mousedown\", jump);\n        cvs.addEventListener(\"touchstart\", function(e) { e.preventDefault(); jump(); }, { passive: false });\n        retryBtn.addEventListener(\"click\", resetGame);\n        closeBtn.addEventListener(\"click\", closeOverlay);\n\n        draw();\n\n        function showResult(score) {\n            var rank = \"\";\n            var color = \"\";\n            if (score >= 100) { rank = \"\u4f1d\u8aac\u306e\u795e\u30b7\u30fc\u30b5\u30fc\u7d1a \ud83c\udf3a\"; color = \"#ffd54f\"; }\n            else if (score >= 50) { rank = \"\u30a6\u30c1\u30ca\u30fc\u3093\u3061\u3085\u7d1a \ud83c\udf0a\"; color = \"#80deea\"; }\n            else if (score >= 20) { rank = \"\u6d77\u4eba\uff08\u3046\u307f\u3093\u3061\u3085\uff09\u7d1a \ud83d\udc1f\"; color = \"#aed581\"; }\n            else { rank = \"\u89b3\u5149\u5ba2\u30ec\u30d9\u30eb \ud83c\udf34\"; color = \"#ffffff\"; }\n            \n            scoreDisp.innerText = score;\n            rankDisp.innerText = rank;\n            rankDisp.style.color = color;\n            overlay.style.display = 'flex';\n        }\n    });\n})();\n<\/script>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div id=\"ryukyu-minesweeper-app\" style=\"max-width: 500px; margin: 0 auto; background: #1a1a1a; color: #fff; padding: 15px; border-radius: 12px; font-family: sans-serif; box-sizing: border-box;\">\n  <!-- \u30d8\u30c3\u30c0\u30fc\u30fb\u30b9\u30c6\u30fc\u30bf\u30b9\u8868\u793a -->\n  <div style=\"text-align: center; margin-bottom: 10px;\">\n    <h3 style=\"color: #f59e0b; margin: 0 0 5px 0;\">\ud83c\udf3a \u7409\u7403\u5c01\u9b54\u9332 \ud83c\udf3a<\/h3>\n    <div id=\"game-status-text\" style=\"font-size: 14px; color: #ccc;\">\u90aa\u6c17\u3092\u6255\u3063\u3066\u5cf6\u3092\u6551\u3048\uff01<\/div>\n  <\/div>\n\n  <!-- \u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u30d0\u30fc -->\n  <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; background: #2a2a2a; padding: 8px 12px; border-radius: 8px; font-size: 13px;\">\n    <div>\u4f53\u529b: <span id=\"hp-display\">\u2764\ufe0f\u2764\ufe0f\u2764\ufe0f<\/span><\/div>\n    <div>\u77f3\u6562\u7576: <span id=\"flags-display\">0\/8<\/span><\/div>\n    <button id=\"bgm-btn\" onclick=\"toggleBGM()\" style=\"background: #3b82f6; color: #fff; border: none; padding: 4px 8px; border-radius: 4px; cursor: pointer; font-size: 12px;\">\ud83c\udfb5 BGM: OFF<\/button>\n  <\/div>\n\n  <!-- \u30b2\u30fc\u30e0\u76e4\u9762 -->\n  <div id=\"game-grid\" style=\"display: grid; grid-template-columns: repeat(8, 1fr); gap: 4px; background: #111; padding: 6px; border-radius: 8px;\"><\/div>\n\n  <!-- \u64cd\u4f5c\u30e2\u30fc\u30c9\u5207\u308a\u66ff\u3048 \uff06 \u30ea\u30bb\u30c3\u30c8 -->\n  <div style=\"display: flex; gap: 8px; margin-top: 12px;\">\n    <button id=\"mode-btn\" onclick=\"toggleMode()\" style=\"flex: 1; background: #2563eb; color: #fff; border: none; padding: 10px; border-radius: 6px; font-weight: bold; cursor: pointer;\">\ud83d\udd0d \u63a2\u7d22\uff08\u958b\u304f\uff09<\/button>\n    <button onclick=\"initGame()\" style=\"background: #4b5563; color: #fff; border: none; padding: 10px; border-radius: 6px; cursor: pointer;\">\u30ea\u30bb\u30c3\u30c8<\/button>\n  <\/div>\n\n  <!-- \u30af\u30ea\u30a2\/\u30b2\u30fc\u30e0\u30aa\u30fc\u30d0\u30fc \u30aa\u30fc\u30d0\u30fc\u30ec\u30a4 -->\n  <div id=\"overlay\" style=\"display: none; text-align: center; margin-top: 15px; padding: 12px; background: #d97706; border-radius: 8px; font-weight: bold; color: #fff; animation: pulse 1s infinite alternate;\">\n    <div id=\"overlay-title\" style=\"font-size: 18px;\">\u6d44\u5316\u5b8c\u4e86\uff01\u5c01\u9b54\u6210\u529f\uff01<\/div>\n    <div style=\"font-size: 12px; margin-top: 4px;\">\u30c1\u30f3\u30c0\u30df\u306e\u97f3\u304c\u5cf6\u306b\u97ff\u304d\u6e21\u308b...<\/div>\n  <\/div>\n<\/div>\n\n<script>\n(function() {\n  const GRID_SIZE = 8;\n  const MINES_COUNT = 8;\n  let grid = [];\n  let gameOver = false;\n  let gameWon = false;\n  let mode = 'reveal'; \/\/ 'reveal' or 'flag'\n  let hp = 3;\n  let flagsUsed = 0;\n\n  \/\/ Web Audio API\n  let audioCtx = null;\n  let bgmInterval = null;\n  let bgmOn = false;\n\n  function initAudio() {\n    if (!audioCtx) {\n      audioCtx = new (window.AudioContext || window.webkitAudioContext)();\n    }\n    if (audioCtx.state === 'suspended') {\n      audioCtx.resume();\n    }\n  }\n\n  \/\/ \u4e09\u7dda\u306e\u5408\u6210\u97f3\uff08\u30c1\u30f3\u30c0\u30df\uff09\n  function playNote(freq, duration = 0.3, type = 'triangle') {\n    if (!audioCtx) return;\n    try {\n      const osc = audioCtx.createOscillator();\n      const gain = audioCtx.createGain();\n      osc.type = type;\n      osc.frequency.setValueAtTime(freq, audioCtx.currentTime);\n      gain.gain.setValueAtTime(0.3, audioCtx.currentTime);\n      gain.gain.exponentialRampToValueAtTime(0.001, audioCtx.currentTime + duration);\n      osc.connect(gain);\n      gain.connect(audioCtx.destination);\n      osc.start();\n      osc.stop(audioCtx.currentTime + duration);\n    } catch(e) {}\n  }\n\n  \/\/ BGM (\u30c9\u30fb\u30d5\u30a1\u30fb\u30c9\u306e\u30ea\u30ba\u30e0)\n  window.toggleBGM = function() {\n    initAudio();\n    bgmOn = !bgmOn;\n    const btn = document.getElementById('bgm-btn');\n    if (bgmOn) {\n      btn.innerText = '\ud83c\udfb5 BGM: ON';\n      btn.style.background = '#10b981';\n      let step = 0;\n      const notes = [261.63, 349.23, 523.25]; \/\/ C4, F4, C5 (\u30c9\u30fb\u30d5\u30a1\u30fb\u30c9)\n      bgmInterval = setInterval(() => {\n        playNote(notes[step % 3], 0.2, 'sine');\n        step++;\n      }, 600);\n    } else {\n      btn.innerText = '\ud83c\udfb5 BGM: OFF';\n      btn.style.background = '#3b82f6';\n      clearInterval(bgmInterval);\n    }\n  };\n\n  \/\/ \u30d5\u30a1\u30f3\u30d5\u30a1\u30fc\u30ec\n  function playFanfare() {\n    if (!audioCtx) return;\n    const notes = [261.63, 329.63, 349.23, 392.00, 493.88, 523.25]; \/\/ \u7409\u7403\u98a8\u30b9\u30b1\u30fc\u30eb\n    notes.forEach((freq, idx) => {\n      setTimeout(() => playNote(freq, 0.4, 'triangle'), idx * 120);\n    });\n  }\n\n  window.toggleMode = function() {\n    mode = mode === 'reveal' ? 'flag' : 'reveal';\n    const btn = document.getElementById('mode-btn');\n    if (mode === 'reveal') {\n      btn.innerText = '\ud83d\udd0d \u63a2\u7d22\uff08\u958b\u304f\uff09';\n      btn.style.background = '#2563eb';\n    } else {\n      btn.innerText = '\ud83d\udea9 \u77f3\u6562\u7576\uff08\u5c01\u5370\uff09';\n      btn.style.background = '#dc2626';\n    }\n  };\n\n  window.initGame = function() {\n    gameOver = false;\n    gameWon = false;\n    hp = 3;\n    flagsUsed = 0;\n    document.getElementById('overlay').style.display = 'none';\n    document.getElementById('game-status-text').innerText = '\u90aa\u6c17\u3092\u6255\u3063\u3066\u5cf6\u3092\u6551\u3048\uff01';\n    updateStatus();\n\n    \/\/ \u76e4\u9762\u751f\u6210\n    grid = Array(GRID_SIZE).fill(null).map(() => Array(GRID_SIZE).fill(null).map(() => ({\n      isMine: false, revealed: false, flagged: false, count: 0\n    })));\n\n    \/\/ \u5730\u96f7\uff08\u30de\u30b8\u30e0\u30f3\uff09\u914d\u7f6e\n    let placed = 0;\n    while (placed < MINES_COUNT) {\n      let r = Math.floor(Math.random() * GRID_SIZE);\n      let c = Math.floor(Math.random() * GRID_SIZE);\n      if (!grid[r][c].isMine) {\n        grid[r][c].isMine = true;\n        placed++;\n      }\n    }\n\n    \/\/ \u5468\u56f2\u30ab\u30a6\u30f3\u30c8\u8a08\u7b97\n    for (let r = 0; r < GRID_SIZE; r++) {\n      for (let c = 0; c < GRID_SIZE; c++) {\n        if (!grid[r][c].isMine) {\n          let cnt = 0;\n          for (let dr = -1; dr <= 1; dr++) {\n            for (let dc = -1; dc <= 1; dc++) {\n              let nr = r + dr, nc = c + dc;\n              if (nr >= 0 && nr < GRID_SIZE && nc >= 0 && nc < GRID_SIZE && grid[nr][nc].isMine) {\n                cnt++;\n              }\n            }\n          }\n          grid[r][c].count = cnt;\n        }\n      }\n    }\n    renderGrid();\n  };\n\n  function updateStatus() {\n    document.getElementById('hp-display').innerText = '\u2764\ufe0f'.repeat(hp) + '\ud83d\udda4'.repeat(3 - hp);\n    document.getElementById('flags-display').innerText = `${flagsUsed}\/${MINES_COUNT}`;\n  }\n\n  function renderGrid() {\n    const container = document.getElementById('game-grid');\n    container.innerHTML = '';\n    for (let r = 0; r < GRID_SIZE; r++) {\n      for (let c = 0; c < GRID_SIZE; c++) {\n        const cell = grid[r][c];\n        const btn = document.createElement('button');\n        btn.style.height = '42px';\n        btn.style.border = 'none';\n        btn.style.borderRadius = '4px';\n        btn.style.fontWeight = 'bold';\n        btn.style.cursor = 'pointer';\n        btn.style.fontSize = '14px';\n\n        if (cell.revealed) {\n          btn.style.background = '#333';\n          if (cell.isMine) {\n            btn.innerText = '\u9b54';\n            btn.style.color = '#ef4444';\n            btn.style.background = '#7f1d1d';\n          } else {\n            btn.innerText = cell.count > 0 ? cell.count : '';\n            const colors = ['', '#60a5fa', '#34d399', '#f87171', '#818cf8', '#fbbf24'];\n            btn.style.color = colors[cell.count] || '#fff';\n          }\n        } else if (cell.flagged) {\n          btn.innerText = '\u77f3';\n          btn.style.background = '#b45309';\n          btn.style.color = '#fff';\n        } else {\n          btn.style.background = '#4b5563';\n        }\n\n        btn.onclick = () => handleCellClick(r, c);\n        container.appendChild(btn);\n      }\n    }\n  }\n\n  function handleCellClick(r, c) {\n    if (gameOver || gameWon) return;\n    initAudio();\n    const cell = grid[r][c];\n\n    if (mode === 'flag') {\n      if (!cell.revealed) {\n        cell.flagged = !cell.flagged;\n        flagsUsed += cell.flagged ? 1 : -1;\n        playNote(400, 0.1);\n      }\n    } else {\n      if (cell.flagged) return;\n      if (cell.isMine) {\n        cell.revealed = true;\n        hp--;\n        playNote(150, 0.4, 'sawtooth');\n        if (hp <= 0) {\n          gameOver = true;\n          document.getElementById('game-status-text').innerText = '\u7121\u5ff5...\u30de\u30b8\u30e0\u30f3\u306b\u6557\u5317\u3057\u305f';\n        }\n      } else {\n        revealCell(r, c);\n        playNote(523.25, 0.15);\n      }\n    }\n\n    updateStatus();\n    checkWin();\n    renderGrid();\n  }\n\n  function revealCell(r, c) {\n    if (r < 0 || r >= GRID_SIZE || c < 0 || c >= GRID_SIZE) return;\n    const cell = grid[r][c];\n    if (cell.revealed || cell.flagged || cell.isMine) return;\n    cell.revealed = true;\n    if (cell.count === 0) {\n      for (let dr = -1; dr <= 1; dr++) {\n        for (let dc = -1; dc <= 1; dc++) {\n          revealCell(r + dr, c + dc);\n        }\n      }\n    }\n  }\n\n  function checkWin() {\n    if (gameOver) return;\n    let unrevealedSafeCells = 0;\n    for (let r = 0; r < GRID_SIZE; r++) {\n      for (let c = 0; c < GRID_SIZE; c++) {\n        if (!grid[r][c].isMine && !grid[r][c].revealed) unrevealedSafeCells++;\n      }\n    }\n    if (unrevealedSafeCells === 0) {\n      gameWon = true;\n      document.getElementById('overlay').style.display = 'block';\n      document.getElementById('game-status-text').innerText = '\ud83c\udf89 \u30af\u30ea\u30a2\uff01\u5cf6\u306b\u5e73\u548c\u304c\u623b\u3063\u305f\uff01';\n      playFanfare();\n    }\n  }\n\n  initGame();\n})();\n<\/script>\n<aside class=\"row veu_insertAds after\"><div class=\"col-md-6\"><div style=\"text-align: center;\">\r\n\u300cPR\u300d\r\n<\/div>\r\n<div style=\"text-align: center;\">\r\n  <a href=\"https:\/\/px.a8.net\/svt\/ejp?a8mat=4B1D5J+1O4SVM+0K+11ALC1\" rel=\"nofollow\">\r\n<img loading=\"lazy\" decoding=\"async\" border=\"0\" width=\"300\" height=\"250\" alt=\"\" src=\"https:\/\/www26.a8.net\/svt\/bgt?aid=260404183101&wid=001&eno=01&mid=s00000000002006264000&mc=1\"><\/a>\r\n<img loading=\"lazy\" decoding=\"async\" border=\"0\" width=\"1\" height=\"1\" src=\"https:\/\/www15.a8.net\/0.gif?a8mat=4B1D5J+1O4SVM+0K+11ALC1\" alt=\"\">\r\n<\/div><\/div><div class=\"col-md-6\"><div style=\"text-align: center;\">\r\n\u300cPR\u300d\r\n<\/div>\r\n<div style=\"text-align: center;\">\r\n   <a href=\"https:\/\/px.a8.net\/svt\/ejp?a8mat=4B1D5J+3U4L4I+AD2+6BMG1\" rel=\"nofollow\">\r\n<img loading=\"lazy\" decoding=\"async\" border=\"0\" width=\"300\" height=\"250\" alt=\"\" src=\"https:\/\/www22.a8.net\/svt\/bgt?aid=260404183232&wid=001&eno=01&mid=s00000001343001062000&mc=1\"><\/a>\r\n<img loading=\"lazy\" decoding=\"async\" border=\"0\" width=\"1\" height=\"1\" src=\"https:\/\/www12.a8.net\/0.gif?a8mat=4B1D5J+3U4L4I+AD2+6BMG1\" alt=\"\">\r\n<\/div><\/div><\/aside>","protected":false},"excerpt":{"rendered":"<p>\u30b9\u30bf\u30fc\u30b8\u30e3\u30f3\u30d7\u4eca\u6c96\u7e04 Star Runner Score: 0 \u30af\u30ea\u30c3\u30af\u304b\u30b9\u30da\u30fc\u30b9\u3067\u30b8\u30e3\u30f3\u30d7\uff01 Game Ov [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":204,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","meta":{"sns_share_botton_hide":"","vkExUnit_sns_title":"","_vk_print_noindex":"","sitemap_hide":"","vkExUnit_sitemap":"","_veu_custom_css":"","veu_display_promotion_alert":"common","_exclude_from_list_pages":"","vkexunit_cta_each_option":"","vkExUnit_childPageIndex":"","vkExUnit_pageList_ancestor":"","vkExUnit_contact_enable":"","_lightning_design_setting":{"layout":"default"},"footnotes":""},"class_list":["post-1175","page","type-page","status-publish","has-post-thumbnail","hentry"],"veu_head_title_object":{"title":"","add_site_title":""},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\u4eca\u6c96\u7e04\u30df\u30cb\u30b2\u30fc\u30e0 - \u200b\u4eca\u6c96\u7e04\uff5c\u4eca\u306e\u5929\u6c17\u30fb\u670d\u88c5\u30fb\u30a4\u30d9\u30f3\u30c8\u60c5\u5831\u3092\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u767a\u4fe1<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ima.okinawa\/en\/starjump-game\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4eca\u6c96\u7e04\u30df\u30cb\u30b2\u30fc\u30e0 - \u200b\u4eca\u6c96\u7e04\uff5c\u4eca\u306e\u5929\u6c17\u30fb\u670d\u88c5\u30fb\u30a4\u30d9\u30f3\u30c8\u60c5\u5831\u3092\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u767a\u4fe1\" \/>\n<meta property=\"og:description\" content=\"\u30b9\u30bf\u30fc\u30b8\u30e3\u30f3\u30d7\u4eca\u6c96\u7e04 Star Runner Score: 0 \u30af\u30ea\u30c3\u30af\u304b\u30b9\u30da\u30fc\u30b9\u3067\u30b8\u30e3\u30f3\u30d7\uff01 Game Ov [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ima.okinawa\/en\/starjump-game\/\" \/>\n<meta property=\"og:site_name\" content=\"\u200b\u4eca\u6c96\u7e04\uff5c\u4eca\u306e\u5929\u6c17\u30fb\u670d\u88c5\u30fb\u30a4\u30d9\u30f3\u30c8\u60c5\u5831\u3092\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u767a\u4fe1\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-01T04:07:26+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ima.okinawa\/wp-content\/uploads\/2026\/03\/cropped-favicon-528\u00d7528-2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"512\" \/>\n\t<meta property=\"og:image:height\" content=\"512\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"80 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/ima.okinawa\\\/starjump-game\\\/\",\"url\":\"https:\\\/\\\/ima.okinawa\\\/starjump-game\\\/\",\"name\":\"\u4eca\u6c96\u7e04\u30df\u30cb\u30b2\u30fc\u30e0 - \u200b\u4eca\u6c96\u7e04\uff5c\u4eca\u306e\u5929\u6c17\u30fb\u670d\u88c5\u30fb\u30a4\u30d9\u30f3\u30c8\u60c5\u5831\u3092\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u767a\u4fe1\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ima.okinawa\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/ima.okinawa\\\/starjump-game\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/ima.okinawa\\\/starjump-game\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/ima.okinawa\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/cropped-favicon-528\u00d7528-2.png\",\"datePublished\":\"2026-04-03T14:13:36+00:00\",\"dateModified\":\"2026-10-01T04:07:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/ima.okinawa\\\/starjump-game\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/ima.okinawa\\\/starjump-game\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/ima.okinawa\\\/starjump-game\\\/#primaryimage\",\"url\":\"https:\\\/\\\/ima.okinawa\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/cropped-favicon-528\u00d7528-2.png\",\"contentUrl\":\"https:\\\/\\\/ima.okinawa\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/cropped-favicon-528\u00d7528-2.png\",\"width\":512,\"height\":512},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/ima.okinawa\\\/starjump-game\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u30db\u30fc\u30e0\",\"item\":\"https:\\\/\\\/ima.okinawa\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4eca\u6c96\u7e04\u30df\u30cb\u30b2\u30fc\u30e0\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/ima.okinawa\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/ima.okinawa\\\/en\\\/\",\"name\":\"\u200b\u4eca\u6c96\u7e04\uff5c\u4eca\u306e\u5929\u6c17\u30fb\u670d\u88c5\u30fb\u30a4\u30d9\u30f3\u30c8\u60c5\u5831\u3092\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u767a\u4fe1\",\"description\":\"\u6c96\u7e04\u306e\u300c\u4eca\u300d\u304c\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u306b\u308f\u304b\u308b\u60c5\u5831\u30e1\u30c7\u30a3\u30a2\",\"publisher\":{\"@id\":\"https:\\\/\\\/ima.okinawa\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/ima.okinawa\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/ima.okinawa\\\/en\\\/#organization\",\"name\":\"\u4eca\u6c96\u7e04\",\"alternateName\":\"ima.okinawa\",\"url\":\"https:\\\/\\\/ima.okinawa\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/ima.okinawa\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/ima.okinawa\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/ima-okinawa-banner-696square.png\",\"contentUrl\":\"https:\\\/\\\/ima.okinawa\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/ima-okinawa-banner-696square.png\",\"width\":696,\"height\":696,\"caption\":\"\u4eca\u6c96\u7e04\"},\"image\":{\"@id\":\"https:\\\/\\\/ima.okinawa\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.instagram.com\\\/ima.okinawa\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u4eca\u6c96\u7e04\u30df\u30cb\u30b2\u30fc\u30e0 - \u200b\u4eca\u6c96\u7e04\uff5c\u4eca\u306e\u5929\u6c17\u30fb\u670d\u88c5\u30fb\u30a4\u30d9\u30f3\u30c8\u60c5\u5831\u3092\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u767a\u4fe1","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:\/\/ima.okinawa\/en\/starjump-game\/","og_locale":"en_US","og_type":"article","og_title":"\u4eca\u6c96\u7e04\u30df\u30cb\u30b2\u30fc\u30e0 - \u200b\u4eca\u6c96\u7e04\uff5c\u4eca\u306e\u5929\u6c17\u30fb\u670d\u88c5\u30fb\u30a4\u30d9\u30f3\u30c8\u60c5\u5831\u3092\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u767a\u4fe1","og_description":"\u30b9\u30bf\u30fc\u30b8\u30e3\u30f3\u30d7\u4eca\u6c96\u7e04 Star Runner Score: 0 \u30af\u30ea\u30c3\u30af\u304b\u30b9\u30da\u30fc\u30b9\u3067\u30b8\u30e3\u30f3\u30d7\uff01 Game Ov [&hellip;]","og_url":"https:\/\/ima.okinawa\/en\/starjump-game\/","og_site_name":"\u200b\u4eca\u6c96\u7e04\uff5c\u4eca\u306e\u5929\u6c17\u30fb\u670d\u88c5\u30fb\u30a4\u30d9\u30f3\u30c8\u60c5\u5831\u3092\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u767a\u4fe1","article_modified_time":"2026-10-01T04:07:26+00:00","og_image":[{"width":512,"height":512,"url":"https:\/\/ima.okinawa\/wp-content\/uploads\/2026\/03\/cropped-favicon-528\u00d7528-2.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"80 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/ima.okinawa\/starjump-game\/","url":"https:\/\/ima.okinawa\/starjump-game\/","name":"\u4eca\u6c96\u7e04\u30df\u30cb\u30b2\u30fc\u30e0 - \u200b\u4eca\u6c96\u7e04\uff5c\u4eca\u306e\u5929\u6c17\u30fb\u670d\u88c5\u30fb\u30a4\u30d9\u30f3\u30c8\u60c5\u5831\u3092\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u767a\u4fe1","isPartOf":{"@id":"https:\/\/ima.okinawa\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/ima.okinawa\/starjump-game\/#primaryimage"},"image":{"@id":"https:\/\/ima.okinawa\/starjump-game\/#primaryimage"},"thumbnailUrl":"https:\/\/ima.okinawa\/wp-content\/uploads\/2026\/03\/cropped-favicon-528\u00d7528-2.png","datePublished":"2026-04-03T14:13:36+00:00","dateModified":"2026-10-01T04:07:26+00:00","breadcrumb":{"@id":"https:\/\/ima.okinawa\/starjump-game\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ima.okinawa\/starjump-game\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ima.okinawa\/starjump-game\/#primaryimage","url":"https:\/\/ima.okinawa\/wp-content\/uploads\/2026\/03\/cropped-favicon-528\u00d7528-2.png","contentUrl":"https:\/\/ima.okinawa\/wp-content\/uploads\/2026\/03\/cropped-favicon-528\u00d7528-2.png","width":512,"height":512},{"@type":"BreadcrumbList","@id":"https:\/\/ima.okinawa\/starjump-game\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u30db\u30fc\u30e0","item":"https:\/\/ima.okinawa\/"},{"@type":"ListItem","position":2,"name":"\u4eca\u6c96\u7e04\u30df\u30cb\u30b2\u30fc\u30e0"}]},{"@type":"WebSite","@id":"https:\/\/ima.okinawa\/en\/#website","url":"https:\/\/ima.okinawa\/en\/","name":"Okinawa Now | Real-time updates on current weather, clothing recommendations, and event information.","description":"An information media that provides real-time insights into what&#039;s happening in Okinawa right now.","publisher":{"@id":"https:\/\/ima.okinawa\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ima.okinawa\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/ima.okinawa\/en\/#organization","name":"Okinawa","alternateName":"ima.okinawa","url":"https:\/\/ima.okinawa\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ima.okinawa\/en\/#\/schema\/logo\/image\/","url":"https:\/\/ima.okinawa\/wp-content\/uploads\/2026\/03\/ima-okinawa-banner-696square.png","contentUrl":"https:\/\/ima.okinawa\/wp-content\/uploads\/2026\/03\/ima-okinawa-banner-696square.png","width":696,"height":696,"caption":"\u4eca\u6c96\u7e04"},"image":{"@id":"https:\/\/ima.okinawa\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.instagram.com\/ima.okinawa\/"]}]}},"_links":{"self":[{"href":"https:\/\/ima.okinawa\/en\/wp-json\/wp\/v2\/pages\/1175","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ima.okinawa\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ima.okinawa\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ima.okinawa\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ima.okinawa\/en\/wp-json\/wp\/v2\/comments?post=1175"}],"version-history":[{"count":15,"href":"https:\/\/ima.okinawa\/en\/wp-json\/wp\/v2\/pages\/1175\/revisions"}],"predecessor-version":[{"id":1384,"href":"https:\/\/ima.okinawa\/en\/wp-json\/wp\/v2\/pages\/1175\/revisions\/1384"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ima.okinawa\/en\/wp-json\/wp\/v2\/media\/204"}],"wp:attachment":[{"href":"https:\/\/ima.okinawa\/en\/wp-json\/wp\/v2\/media?parent=1175"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}