{"id":10054,"date":"2025-06-10T22:47:11","date_gmt":"2025-06-10T20:47:11","guid":{"rendered":"https:\/\/retrofixer.it\/?page_id=10054"},"modified":"2025-06-12T11:45:40","modified_gmt":"2025-06-12T09:45:40","slug":"arcade","status":"publish","type":"page","link":"https:\/\/retrofixer.it\/en\/arcade\/","title":{"rendered":"Arcade"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"10054\" class=\"elementor elementor-10054\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-00ceaf9 elementor-hidden-tablet elementor-hidden-mobile e-flex e-con-boxed e-con e-parent\" data-id=\"00ceaf9\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1fe68c1 elementor-widget elementor-widget-html\" data-id=\"1fe68c1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<span class=\"title\"><h1 style=\"padding-left:310px;\">Retro-Submarine<\/h1><\/span>\n    <div id=\"ui-container\">\n        <div id=\"score\">SCORE: 0<\/div>\n        <div id=\"level\">LEVEL: 1<\/div>\n        <div id=\"lives\">LIVES: 3<\/div>\n        <div id=\"bombs-total\">BOMBS: 20<\/div>\n    <\/div>\n    <div id=\"game-container\">\n        <canvas id=\"gameCanvas\" width=800 height=600><\/canvas>\n        <div id=\"graphiclayer\" class=\"overlay\">\n            <img decoding=\"async\" src=\"https:\/\/retrofixer.it\/wp-content\/uploads\/2025\/06\/game600.jpg\">\n            <\/div>\n        <div id=\"leaderboardScreen\" class=\"overlay\">\n            <h2>TOP SCORES<\/h2>\n            <ol id=\"leaderboard-list\"><\/ol>\n            <p>Premi 'INVIO' per iniziare<\/p>\n        <\/div>\n        <div id=\"enterScoreScreen\" class=\"overlay hidden\">\n            <h2>NEW HIGH SCORE!<\/h2>\n            <p id=\"finalScoreText\"><\/p>\n            <p class=\"subtitle\">Inserisci le tue iniziali<\/p>\n            <input type=\"text\" id=\"nameInput\" maxlength=\"3\">\n            <p class=\"subtitle\" style=\"margin-top: 20px;\">Premi 'INVIO' per salvare<\/p>\n        <\/div>\n        <div id=\"gameOverScreen\" class=\"overlay hidden\">\n            <h1>GAME OVER<\/h1>\n            <p>Premi 'R' per tornare alla classifica<\/p>\n        <\/div>\n        <div id=\"levelUpScreen\" class=\"overlay hidden\">\n            <h1 id=\"levelUpText\">LEVEL UP!<\/h1>\n        <\/div>\n    <\/div>\n    <div id=\"instructions\">\n        Usa <span class=\"key\">\u2190<\/span> e <span class=\"key\">\u2192<\/span> per muoverti.\n        <span class=\"key\">A<\/span>-Lancia Sinistra, <span class=\"key\">S<\/span>-Lancia Destra.\n    <\/div>\n\n    <script>\n        const graphic = document.getElementById('graphiclayer');\n        const canvas = document.getElementById('gameCanvas'), ctx = canvas.getContext('2d');\n        const scoreEl = document.getElementById('score'), livesEl = document.getElementById('lives');\n        const levelEl = document.getElementById('level'), bombsTotalEl = document.getElementById('bombs-total');\n        const gameOverScreen = document.getElementById('gameOverScreen'), levelUpScreen = document.getElementById('levelUpScreen');\n        const levelUpText = document.getElementById('levelUpText'), leaderboardScreen = document.getElementById('leaderboardScreen');\n        const leaderboardList = document.getElementById('leaderboard-list'), enterScoreScreen = document.getElementById('enterScoreScreen');\n        const nameInput = document.getElementById('nameInput'), finalScoreText = document.getElementById('finalScoreText');\n\n        ctx.imageSmoothingEnabled = false;\n        const SEA_LEVEL = 60;\n\n        let score, lives, level, bombsTotal, subsDestroyedThisLevel;\n        let gameState = 'leaderboard'; \n        let highScores = [];\n        const MAX_ACTIVE_BOMBS = 6, SUBS_PER_LEVEL = 10;\n        \n        let player, bombs, submarines, mines, risingMines, floatingMines, explosions;\n        let playerImage = new Image();\n\t\tlet subImage = new Image();\n        let imageLoaded = false;\n        playerImage.src = 'https:\/\/retrofixer.it\/wp-content\/uploads\/2025\/06\/sheep.png';\n\t\tsubImage.src = 'https:\/\/retrofixer.it\/wp-content\/uploads\/2025\/06\/sub.png';\n        playerImage.onload = () => { imageLoaded = true; };\n\t\tsubImage.onload = () => { subImageLoaded = true; };\n\n        let bombRegenTimer = 0;\nconst apiUrl = 'https:\/\/retrofixer.it\/download\/highscore.php'; \n\nasync function fetchHighScoresFromLocalStorage() {\n    leaderboardList.innerHTML = \"<li>Caricamento...<\/li>\";\n    try {\n        const response = await fetch(apiUrl);\n        if (!response.ok) throw new Error('Errore di rete.');\n        \n        highScores = await response.json();\n        displayHighScores();\n    } catch (error) {\n        console.error(\"Errore nel caricare i punteggi:\", error);\n        leaderboardList.innerHTML = \"<li>Impossibile caricare i punteggi.<\/li>\";\n        highScores = [];\n    }\n}\n\nasync function addScore(name, score) {\n    try {\n        const response = await fetch(apiUrl, {\n            method: 'POST',\n            headers: { 'Content-Type': 'application\/json' },\n            body: JSON.stringify({ name, score }),\n        });\n        if (!response.ok) throw new Error('Errore durante il salvataggio.');\n        \n        highScores = await response.json();\n        displayHighScores();\n    } catch (error) {\n        console.error(\"Errore nel salvare il punteggio:\", error);\n    }\n}\n\nfunction displayHighScores() {\n    leaderboardList.innerHTML = '';\n    if (highScores.length === 0) {\n        leaderboardList.innerHTML = \"<li>Nessun punteggio.<br>Sii il primo!<\/li>\";\n    } else {\n        highScores.forEach(s => {\n            const li = document.createElement('li');\n            li.innerHTML = `<span>${s.name.toUpperCase()}<\/span><span>${s.score}<\/span>`;\n            leaderboardList.appendChild(li);\n        });\n    }\n}\n\n        function initGame() {\n            score = 0; lives = 3; level = 1; bombsTotal = 20;\n            subsDestroyedThisLevel = 0;\n            player = new Player();\n            bombs = []; submarines = []; mines = []; risingMines = [];\n            floatingMines = []; explosions = [];\n            submarineSpawnTimer = 0;\n            bombRegenTimer = 0;\n            updateUI();\n            gameOverScreen.classList.add('hidden');\n            enterScoreScreen.classList.add('hidden');\n            graphic.classList.add('hidden');\n        }\n\n        let audioCtx;\n        function initAudio() { if (!audioCtx) audioCtx = new (window.AudioContext || window.webkitAudioContext)(); }\n        document.body.addEventListener('keydown', initAudio, { once: true });\n        function playSound(type, freq1, freq2, duration, gainVal = 0.3) { if (!audioCtx) return; const osc = audioCtx.createOscillator(); const gain = audioCtx.createGain(); osc.connect(gain).connect(audioCtx.destination); osc.type = type; osc.frequency.setValueAtTime(freq1, audioCtx.currentTime); osc.frequency.exponentialRampToValueAtTime(freq2, audioCtx.currentTime + duration); gain.gain.setValueAtTime(gainVal, audioCtx.currentTime); gain.gain.exponentialRampToValueAtTime(0.001, audioCtx.currentTime + duration); osc.start(); osc.stop(audioCtx.currentTime + duration); }\n        function playNoise(duration, startFreq, endFreq, gainVal = 0.5) { if (!audioCtx) return; const noise = audioCtx.createBufferSource(); const buffer = audioCtx.createBuffer(1, audioCtx.sampleRate * duration, audioCtx.sampleRate); const data = buffer.getChannelData(0); for (let i = 0; i < data.length; i++) data[i] = Math.random() * 2 - 1; noise.buffer = buffer; const filter = audioCtx.createBiquadFilter(); filter.type = 'lowpass'; filter.frequency.setValueAtTime(startFreq, audioCtx.currentTime); filter.frequency.exponentialRampToValueAtTime(endFreq, audioCtx.currentTime + duration); const gain = audioCtx.createGain(); gain.gain.setValueAtTime(gainVal, audioCtx.currentTime); gain.gain.exponentialRampToValueAtTime(0.001, audioCtx.currentTime + duration); noise.connect(filter).connect(gain).connect(audioCtx.destination); noise.start(); noise.stop(audioCtx.currentTime + duration); }\n\n        class Player {\n            constructor() {\n                this.image = playerImage;\n                this.width = 111; this.height = 36;\n                this.x = canvas.width \/ 2 - this.width \/ 2;\n                this.y = SEA_LEVEL - this.height;\n                this.speed = 2; \n                this.invincible = false;\n                this.invincibilityTime = 120;\n                this.flashTimer = 0;\n            }\n            draw() {\n                if (!imageLoaded) return;\n                if (this.invincible && (this.flashTimer++ % 10 < 5)) return;\n                ctx.drawImage(this.image, this.x, this.y, this.width, this.height);\n            }\n            update() {\n                this.speed = (bombsTotal > 0) ? 2 : 1;\n\n                if (keys['ArrowRight'] && this.x < canvas.width - this.width) this.x += this.speed;\n                if (keys['ArrowLeft'] && this.x > 0) this.x -= this.speed;\n                if (this.invincible) {\n                    this.invincibilityTime--;\n                    if(this.invincibilityTime <= 0) this.invincible = false;\n                }\n            }\n            hit() {\n                if (this.invincible) return;\n                lives--;\n                playNoise(0.8, 1000, 200, 0.7);\n                if (lives <= 0) {\n                    goToGameOver();\n                } else {\n                    this.invincible = true;\n                    this.invincibilityTime = 120;\n                    this.flashTimer = 0;\n                }\n            }\n        }\n\n        class Bomb {\n            constructor(x, y) {\n                this.baseX = x;\n                this.y = y;\n                this.width = 12;\n                this.height = 6;\n                this.speed = 1.0;\n                this.color = '#222222';\n                this.oscillationAngle = Math.random() * Math.PI * 2;\n                this.oscillationSpeed = 0.08 + Math.random() * 0.05;\n                this.oscillationMagnitude = 5 + Math.random() * 4;\n                this.x = this.baseX;\n            }\n            draw() {\n                ctx.fillStyle = this.color;\n                ctx.fillRect(this.x, this.y, this.width, this.height);\n            }\n            update() {\n                this.y += this.speed;\n                this.oscillationAngle += this.oscillationSpeed;\n                this.x = this.baseX + Math.sin(this.oscillationAngle) * this.oscillationMagnitude;\n            }\n        }\n        \n        class Mine { \n             constructor(x, y) { this.x = x; this.y = y; this.width = 6; this.height = 6; this.speed = 2.5; this.color = '#ff0000'; }\n            draw() { ctx.fillStyle = this.color; ctx.fillRect(this.x, this.y, this.width, this.height); }\n            update() { this.y -= this.speed; }\n        }\n        \n        class RisingMine {\n            constructor(x, startY) { this.x = x; this.y = startY; this.speed = 2.0; this.targetY = SEA_LEVEL - 5; this.color = '#ffa500'; this.size = 8; }\n            update() { this.y -= this.speed; return this.y <= this.targetY; }\n            draw() { ctx.fillStyle = this.color; ctx.beginPath(); ctx.arc(this.x, this.y, this.size \/ 2, 0, Math.PI * 2); ctx.fill(); }\n        }\n\n        class FloatingMine { \n            constructor(x) { this.x = x; this.y = SEA_LEVEL - 5; this.size = 10; this.life = 180; this.flashTimer = 0; this.color = '#ff9900'; }\n            update() { this.life--; this.flashTimer++; }\n            draw() { if (this.flashTimer % 20 < 10) { ctx.fillStyle = this.color; ctx.beginPath(); ctx.arc(this.x, this.y, this.size \/ 2, 0, Math.PI * 2); ctx.fill(); } }\n        }\n\n        class Submarine {\n            constructor(level) {\n                this.width = 103; this.height = 40;\n                this.direction = Math.random() < 0.5 ? 1 : -1;\n                this.x = this.direction === 1 ? -this.width : canvas.width;\n                this.y = this.getSafeY();\n                this.speed = (0.8 + Math.random() * 1.5) * (1 + (level - 1) * 0.15);\n                this.points = Math.floor(this.speed * 50);\n                this.shootInterval = Math.max(80, 250 - level * 20);\n                this.shootTimer = Math.random() * this.shootInterval;\n\t\t\t\tthis.color = `hsl(230, 80%, ${Math.random() * 50}%)`;\n                this.createTintedImage();\n            }\n\n            createTintedImage() {\n                if (!subImageLoaded) return;\n                this.tintedCanvas = document.createElement('canvas');\n                this.tintedCanvas.width = this.width;\n                this.tintedCanvas.height = this.height;\n                const tintCtx = this.tintedCanvas.getContext('2d');\n                \n                tintCtx.drawImage(subImage, 0, 0, this.width, this.height);\n                tintCtx.globalCompositeOperation = 'source-in';\n                tintCtx.fillStyle = this.color;\n                tintCtx.fillRect(0, 0, this.width, this.height);\n            }\n\n            getSafeY() { let y; let isSafe = false; let attempts = 0; while (!isSafe && attempts < 20) { y = SEA_LEVEL + 50 + Math.random() * (canvas.height - (SEA_LEVEL + 100)); isSafe = true; for (const sub of submarines) { if (Math.abs(y - sub.y) < this.height * 1.5) { isSafe = false; break; } } attempts++; } return y; }\n            \n            draw() {\n                if (this.tintedCanvas) {\n                    if (this.direction === 1) {\n                        ctx.save();\n                        ctx.translate(this.x + this.width, this.y);\n                        ctx.scale(-1, 1);\n                        ctx.drawImage(this.tintedCanvas, 0, 0, this.width, this.height);\n                        ctx.restore();\n                    } else { \n                        ctx.drawImage(this.tintedCanvas, this.x, this.y, this.width, this.height);\n                    }\n                } else {\n                    ctx.fillStyle = this.color;\n                    ctx.fillRect(this.x, this.y, this.width, this.height);\n                }\n            }\n\n            update() { this.x += this.speed * this.direction; this.shootTimer++; if(this.shootTimer >= this.shootInterval) { this.shoot(); this.shootTimer = 0; } }\n            \n            shoot() { if (level >= 3 && Math.random() < 0.3) { risingMines.push(new RisingMine(this.x + this.width \/ 2, this.y)); playSound('sine', 300, 500, 0.3, 0.2); } else { mines.push(new Mine(this.x + this.width \/ 2, this.y)); playSound('square', 200, 100, 0.2, 0.2); } }\n        }\n        \n        class Explosion {\n            constructor(x, y, size) { this.x = x; this.y = y; this.radius = 5; this.maxRadius = size; this.life = 30; }\n            update() { this.life--; this.radius += (this.maxRadius - this.radius) * 0.1; }\n            draw() { const colors = ['white', 'yellow', 'orange', 'red']; const color = colors[Math.floor(this.life \/ 7.5)]; ctx.fillStyle = color; ctx.globalAlpha = this.life \/ 30; for(let i = 0; i < 3; i++) { const r = this.radius * (1 - i*0.2) * (Math.random() * 0.4 + 0.8); ctx.fillRect(this.x - r\/2 + (Math.random()-0.5)*10, this.y - r\/2 + (Math.random()-0.5)*10, r, r); } ctx.globalAlpha = 1.0; }\n        }\n\n        const keys = {};\n        window.addEventListener('keydown', (e) => {\n            keys[e.key] = true;\n            \n            if (gameState === 'leaderboard' && e.key === 'Enter') { leaderboardScreen.classList.add('hidden'); initGame(); gameState = 'running'; } \n            else if (gameState === 'running' && bombs.length < MAX_ACTIVE_BOMBS && bombsTotal > 0) {\n                if (e.key.toLowerCase() === 'a') { bombs.push(new Bomb(player.x, player.y + player.height)); bombsTotal--; playSound('triangle', 400, 100, 0.3); } \n                else if (e.key.toLowerCase() === 's') { bombs.push(new Bomb(player.x + player.width - 12, player.y + player.height)); bombsTotal--; playSound('triangle', 400, 100, 0.3); }\n            } \n            else if (gameState === 'gameOver' && e.key.toLowerCase() === 'r') { gameOverScreen.classList.add('hidden'); leaderboardScreen.classList.remove('hidden'); fetchHighScoresFromLocalStorage(); gameState = 'leaderboard'; } \n            else if (gameState === 'enteringScore' && e.key === 'Enter') {\n                const name = nameInput.value.trim();\n                if (name) { addScore(name, score); enterScoreScreen.classList.add('hidden'); leaderboardScreen.classList.remove('hidden'); displayHighScores(); gameState = 'leaderboard'; }\n            }\n        });\n        window.addEventListener('keyup', (e) => { keys[e.key] = false; });\n        \n        function goToGameOver() { \n             playNoise(1.5, 500, 50, 1.0);\n             graphic.classList.toggle('hidden');\n             const worstScore = highScores.length < 10 ? 0 : highScores[highScores.length - 1].score;\n            if (score > worstScore) { gameState = 'enteringScore'; finalScoreText.textContent = `SCORE: ${score}`; nameInput.value = ''; nameInput.focus(); } \n            else { gameState = 'gameOver'; }\n        }\n        \n        function updateUI() {\n            scoreEl.textContent = `SCORE: ${score}`;\n            levelEl.textContent = `LEVEL: ${level}`;\n            livesEl.textContent = `LIVES: ${lives}`;\n            bombsTotalEl.textContent = `BOMBS: ${bombsTotal}`;\n            bombsTotalEl.classList.toggle('reloading', bombsTotal === 0);\n        }\n        \n        let submarineSpawnTimer = 0;\n        \n        function handleRunningState() {\n            player.update();\n            \n            let submarineSpawnInterval = Math.max(40, 120 - level * 10);\n            if(++submarineSpawnTimer > submarineSpawnInterval) { submarines.push(new Submarine(level)); submarineSpawnTimer = 0; }\n            \n            bombs.forEach((b, i) => { b.update(); if (b.y > canvas.height) bombs.splice(i, 1); });\n            submarines.forEach((s, i) => { s.update(); if ((s.direction === 1 && s.x > canvas.width) || (s.direction === -1 && s.x < -s.width)) submarines.splice(i, 1); });\n            explosions.forEach((e, i) => { e.update(); if (e.life <= 0) explosions.splice(i, 1); });\n            \n            risingMines.forEach((rm, i) => { if (rm.update()) { risingMines.splice(i, 1); floatingMines.push(new FloatingMine(rm.x)); } });\n            floatingMines.forEach((fm, i) => {\n                fm.update();\n                if (fm.life <= 0) {\n                    explosions.push(new Explosion(fm.x, fm.y, 40));\n                    playNoise(0.6, 1500, 150, 0.6);\n                    floatingMines.splice(i, 1);\n                }\n            });\n\n            for (let i = mines.length - 1; i >= 0; i--) {\n                const mine = mines[i];\n                mine.update();\n                if (mine.y <= SEA_LEVEL + mine.height-10) {\n                    explosions.push(new Explosion(mine.x, SEA_LEVEL, 40));\n                    playNoise(0.6, 1500, 150, 0.6);\n                    mines.splice(i, 1);\n                    continue; \n                }\n\n                if (mine.x < player.x + player.width && mine.x + mine.width > player.x &&\n                    mine.y < player.y + player.height && mine.y + mine.height > player.y) {\n                    player.hit();\n                    mines.splice(i, 1);\n                    explosions.push(new Explosion(player.x + player.width\/2, player.y + player.height\/2, 40));\n                    break;\n                }\n            }\n            \n            for (let i = floatingMines.length - 1; i >= 0; i--) { \n                 const fm = floatingMines[i];\n                 if (fm.x - fm.size \/ 2 < player.x + player.width &&\n                    fm.x + fm.size \/ 2 > player.x &&\n                    fm.y - fm.size \/ 2 < player.y + player.height &&\n                    fm.y + fm.size \/ 2 > player.y) {\n                    player.hit();\n                    floatingMines.splice(i, 1);\n                    explosions.push(new Explosion(player.x + player.width\/2, player.y, 40));\n                    break;\n                }\n            }\n\n            for (let i = bombs.length - 1; i >= 0; i--) {\n                for (let j = submarines.length - 1; j >= 0; j--) {\n                    const bomb = bombs[i]; const sub = submarines[j];\n                    if (bomb.x < sub.x + sub.width && bomb.x + bomb.width > sub.x &&\n                        bomb.y < sub.y + sub.height && bomb.y + bomb.height > sub.y) {\n                        score += sub.points; subsDestroyedThisLevel++;\n                        explosions.push(new Explosion(sub.x + sub.width\/2, sub.y + sub.height\/2, 50));\n                        playNoise(0.5, 2000, 100);\n                        bombs.splice(i, 1); submarines.splice(j, 1);\n                        if(subsDestroyedThisLevel >= SUBS_PER_LEVEL) {\n                            level++; bombsTotal += 15; \n                            if (bombsTotal > 30) {bombsTotal = 30;}\n                            subsDestroyedThisLevel = 0;\n                            gameState = 'levelUp'; levelUpText.textContent = `LEVEL ${level}!`;\n                            playSound('sawtooth', 200, 800, 1.0, 0.4);\n                            setTimeout(() => gameState = 'running', 2000);\n                        }\n                        break; \n                    }\n                }\n            }\n            \n            if (bombsTotal === 0 && bombs.length === 0) {\n                bombRegenTimer++;\n                const REGEN_TIME_IN_FRAMES = 200; \n                if (bombRegenTimer >= REGEN_TIME_IN_FRAMES) {\n                    bombsTotal += 1;\n                    bombRegenTimer = 0;\n                }\n            } else {\n                 bombRegenTimer = 0;\n            }\n\n            updateUI();\n        }\n\n        function drawGame() {\n            ctx.fillStyle = '#d0e8f0'; ctx.fillRect(0, 0, canvas.width, SEA_LEVEL);\n            const seaGradient = ctx.createLinearGradient(0, SEA_LEVEL, 0, canvas.height);\n            seaGradient.addColorStop(0, '#3399ff'); seaGradient.addColorStop(0.3, '#0066cc'); seaGradient.addColorStop(1, '#000033');\n            ctx.fillStyle = seaGradient;\n            ctx.fillRect(0, SEA_LEVEL, canvas.width, canvas.height - SEA_LEVEL);\n            player.draw(); bombs.forEach(b => b.draw()); submarines.forEach(s => s.draw());\n            mines.forEach(m => m.draw()); risingMines.forEach(rm => rm.draw());\n            floatingMines.forEach(fm => fm.draw()); explosions.forEach(e => e.draw());\n        }\n\n        function gameLoop() { \n            ctx.clearRect(0, 0, canvas.width, canvas.height);\n            if (gameState === 'running' || gameState === 'levelUp') { if (gameState === 'running') handleRunningState(); drawGame(); } \n            else { ctx.fillStyle = 'black'; ctx.fillRect(0, 0, canvas.width, canvas.height); }\n            leaderboardScreen.classList.toggle('hidden', gameState !== 'leaderboard');\n            enterScoreScreen.classList.toggle('hidden', gameState !== 'enteringScore');\n            gameOverScreen.classList.toggle('hidden', gameState !== 'gameOver');\n            levelUpScreen.classList.toggle('hidden', gameState !== 'levelUp');\n            requestAnimationFrame(gameLoop);\n        }\n        \n        fetchHighScoresFromLocalStorage();\n        gameLoop();\n    <\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-efb0a33 elementor-hidden-desktop e-flex e-con-boxed e-con e-parent\" data-id=\"efb0a33\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-afbdb53 elementor-widget elementor-widget-text-editor\" data-id=\"afbdb53\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"text-align: center;\">Per poter provare questo gioco \u00e8 necessario usare un computer dotato di tastiera ed una risoluzione minima di 800&#215;600<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f198bf2 elementor-widget elementor-widget-image\" data-id=\"f198bf2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"820\" height=\"712\" src=\"https:\/\/retrofixer.it\/wp-content\/uploads\/2025\/06\/game_arcade.jpg\" class=\"attachment-large size-large wp-image-10164\" alt=\"\" srcset=\"https:\/\/retrofixer.it\/wp-content\/uploads\/2025\/06\/game_arcade.jpg 820w, https:\/\/retrofixer.it\/wp-content\/uploads\/2025\/06\/game_arcade-300x260.jpg 300w, https:\/\/retrofixer.it\/wp-content\/uploads\/2025\/06\/game_arcade-768x667.jpg 768w, https:\/\/retrofixer.it\/wp-content\/uploads\/2025\/06\/game_arcade-14x12.jpg 14w, https:\/\/retrofixer.it\/wp-content\/uploads\/2025\/06\/game_arcade-86x75.jpg 86w, https:\/\/retrofixer.it\/wp-content\/uploads\/2025\/06\/game_arcade-480x417.jpg 480w\" sizes=\"(max-width:767px) 480px, (max-width:820px) 100vw, 820px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-7bc4aa3 e-flex e-con-boxed e-con e-parent\" data-id=\"7bc4aa3\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9cf8884 elementor-widget elementor-widget-heading\" data-id=\"9cf8884\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Istruzioni<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f2ac184 elementor-widget elementor-widget-text-editor\" data-id=\"f2ac184\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Colpisci i sottomarini con le bombe ad immersione per guadagnare punti e salire di livello.<br \/>Dopo 10 sottomarini distrutti si passa al livello successivo con un bonus di 15 bombe (fino ad un massimo di 30).<br \/>Ad ogni livello aumenta la difficolt\u00e0 e dal terzo livello i sottomarini possono lanciare mine galleggianti che rimangono in superficie per qualche secondo.<br \/>Se finisci le bombe la nave si muover\u00e0 pi\u00f9 lentamente e si ricaricher\u00e0 di una bomba dopo circa 6 secondi.<br \/>Usa i tasti frecce direzionali per spostarti e i tasti &#8220;A&#8221; per lanciare una bomba a sinistra o &#8220;S&#8221; per lanciarla a destra.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Retro-Submarine SCORE: 0 LEVEL: 1 LIVES: 3 BOMBS: 20 TOP SCORES Premi &#8216;INVIO&#8217; per iniziare NEW HIGH SCORE! Inserisci le tue iniziali Premi &#8216;INVIO&#8217; per salvare<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-10054","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/pages\/10054","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/comments?post=10054"}],"version-history":[{"count":151,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/pages\/10054\/revisions"}],"predecessor-version":[{"id":10283,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/pages\/10054\/revisions\/10283"}],"wp:attachment":[{"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/media?parent=10054"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/categories?post=10054"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/tags?post=10054"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}