<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های محمد حسین صادقی زاده</title><link>https://virgool.ir/feed/@m_83681521</link><description></description><language>fa</language><pubDate>2026-11-12 09:19:19</pubDate><image><url>https://virgool.ir/images/default-avatar.jpg</url><title>محمد حسین صادقی زاده</title><link>https://virgool.ir/@m_83681521</link></image><item><title>بازی زوبا</title><link>https://virgool.ir/@m_83681521/بازی-زوبا-w9jk3vtfpxxm</link><description>&lt;!DOCTYPE html&gt;&lt;html lang=&#34;fa&#34; dir=&#34;rtl&#34;&gt;&lt;head&gt;    &lt;meta charset=&#34;UTF-8&#34;&gt;    &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover&#34;&gt;    &lt;title&gt;🐾 زوبا ایرانی | نبرد قهرمانان | تمام لمسی&lt;/title&gt;    &lt;style&gt;        *{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent;}        body{            background:#0a0f08;            display:flex;justify-content:center;align-items:center;            height:100vh;overflow:hidden;            font-family:&#39;Segoe UI&#39;,Tahoma,sans-serif;            touch-action:manipulation;            user-select:none;-webkit-user-select:none;            position:fixed;width:100%;        }        #game-wrapper{            position:relative;            width:100%;max-width:450px;            aspect-ratio:9/16;max-height:100vh;            border:3px solid #ffb020;            border-radius:20px;overflow:hidden;            box-shadow:0 0 50px rgba(255,140,0,0.5);            background:#2d5a1e;        }        canvas{display:block;width:100%;height:100%;}                #ui-layer{            position:absolute;top:8px;left:8px;right:8px;            display:flex;justify-content:space-between;            pointer-events:none;z-index:10;gap:6px;        }        .ui-box{            background:rgba(0,0,0,0.7);border:2px solid #e6a817;            border-radius:12px;padding:5px 10px;color:#ffd966;            font-weight:bold;font-size:13px;backdrop-filter:blur(4px);            text-align:center;min-width:65px;        }        .hp-outer{width:100%;height:6px;background:#331111;border-radius:8px;margin-top:3px;overflow:hidden;border:1px solid #a33;}        .hp-inner{height:100%;width:100%;background:linear-gradient(90deg,#f22,#f77);border-radius:8px;transition:width 0.2s;}                #hero-select{            position:absolute;top:0;left:0;width:100%;height:100%;            background:rgba(0,0,0,0.93);z-index:50;            display:flex;flex-direction:column;align-items:center;            justify-content:center;color:#ffcc44;overflow-y:auto;padding:20px;        }        #hero-select h2{font-size:22px;margin-bottom:4px;text-shadow:0 0 20px #ff8800;}        .hero-grid{display:flex;flex-wrap:wrap;gap:10px;justify-content:center;max-width:380px;margin-top:8px;}        .hero-card{            width:110px;height:140px;background:rgba(20,20,20,0.85);            border:3px solid #5a4a2a;border-radius:20px;            display:flex;flex-direction:column;align-items:center;            justify-content:center;cursor:pointer;transition:all 0.2s;            color:#ddd;font-weight:bold;font-size:12px;gap:5px;        }        .hero-card.selected{border-color:#ffcc00;box-shadow:0 0 30px #ffaa00;background:rgba(40,30,10,0.9);transform:scale(1.05);}        .hero-emoji{font-size:38px;}        .hero-stats{font-size:8px;color:#aaa;line-height:1.3;text-align:center;}        #start-btn{            margin-top:15px;padding:10px 40px;font-size:17px;            background:#ffaa00;border:none;border-radius:30px;            color:#0a0a0a;font-weight:bold;cursor:pointer;            box-shadow:0 0 25px #ff8800;        }                #mobile-controls{            position:absolute;bottom:20px;left:0;right:0;            z-index:20;display:flex;justify-content:space-between;            padding:0 15px;pointer-events:none;        }        #joystick-container{            width:90px;height:90px;pointer-events:auto;            position:relative;        }        #joystick-base{            width:90px;height:90px;border-radius:50%;            background:rgba(255,255,255,0.2);border:3px solid #ffbb44;            position:relative;backdrop-filter:blur(5px);        }        #joystick-thumb{            width:40px;height:40px;border-radius:50%;            background:rgba(255,200,80,0.8);            position:absolute;top:25px;left:25px;            transition:0.05s;pointer-events:none;        }        #right-buttons{            display:flex;flex-direction:column;gap:12px;pointer-events:auto;align-items:center;        }        #btn-special{            width:60px;height:60px;border-radius:50%;            background:rgba(138,43,226,0.5);border:3px solid #bb88ff;            font-size:26px;display:flex;align-items:center;justify-content:center;            backdrop-filter:blur(5px);color:white;        }        #btn-shoot{            width:70px;height:70px;border-radius:50%;            background:rgba(255,80,20,0.5);border:3px solid #ff8844;            font-size:30px;display:flex;align-items:center;justify-content:center;            backdrop-filter:blur(5px);color:white;        }        .cooldown-indicator{            position:absolute;font-size:20px;color:#fff;text-shadow:0 0 10px #000;            pointer-events:none;        }                #gameover-screen{            position:absolute;top:0;left:0;width:100%;height:100%;            background:rgba(0,0,0,0.85);z-index:40;            display:none;flex-direction:column;align-items:center;            justify-content:center;color:#ffd966;font-size:24px;font-weight:bold;        }        #gameover-screen button{            margin-top:18px;padding:10px 30px;font-size:17px;            background:#ffaa00;border:none;border-radius:30px;            font-weight:bold;cursor:pointer;        }    &lt;/style&gt;&lt;/head&gt;&lt;body&gt;&lt;div id=&#34;game-wrapper&#34;&gt;    &lt;canvas id=&#34;gameCanvas&#34;&gt;&lt;/canvas&gt;        &lt;div id=&#34;ui-layer&#34;&gt;        &lt;div class=&#34;ui-box&#34;&gt;⭐ &lt;span id=&#34;scoreDisp&#34;&gt;0&lt;/span&gt;&lt;br&gt;💀 &lt;span id=&#34;killDisp&#34;&gt;0&lt;/span&gt;&lt;/div&gt;        &lt;div class=&#34;ui-box&#34; style=&#34;width:115px;&#34;&gt;❤️ &lt;span id=&#34;hpText&#34;&gt;120&lt;/span&gt;            &lt;div class=&#34;hp-outer&#34;&gt;&lt;div class=&#34;hp-inner&#34; id=&#34;hpFill&#34;&gt;&lt;/div&gt;&lt;/div&gt;        &lt;/div&gt;        &lt;div class=&#34;ui-box&#34;&gt;⚡ &lt;span id=&#34;specialDisp&#34;&gt;آماده&lt;/span&gt;&lt;/div&gt;    &lt;/div&gt;    &lt;div id=&#34;hero-select&#34;&gt;        &lt;h2&gt;🐾 قهرمانت رو انتخاب کن&lt;/h2&gt;        &lt;div style=&#34;font-size:11px;color:#cca;margin-bottom:6px;&#34;&gt;هر قهرمان قدرت منحصربهفرد داره&lt;/div&gt;        &lt;div class=&#34;hero-grid&#34; id=&#34;heroGrid&#34;&gt;&lt;/div&gt;        &lt;button id=&#34;start-btn&#34;&gt;🎮 شروع نبرد!&lt;/button&gt;    &lt;/div&gt;    &lt;div id=&#34;mobile-controls&#34;&gt;        &lt;div id=&#34;joystick-container&#34;&gt;            &lt;div id=&#34;joystick-base&#34;&gt;                &lt;div id=&#34;joystick-thumb&#34;&gt;&lt;/div&gt;            &lt;/div&gt;        &lt;/div&gt;        &lt;div id=&#34;right-buttons&#34;&gt;            &lt;div id=&#34;btn-special&#34;&gt;⚡&lt;/div&gt;            &lt;div id=&#34;btn-shoot&#34;&gt;🔫&lt;/div&gt;        &lt;/div&gt;    &lt;/div&gt;    &lt;div id=&#34;gameover-screen&#34;&gt;        &lt;span&gt;💔 شکست خوردی!&lt;/span&gt;        &lt;span style=&#34;font-size:14px;margin-top:5px;&#34; id=&#34;finalScore&#34;&gt;&lt;/span&gt;        &lt;button id=&#34;restartBtn&#34;&gt;🔄 دوباره&lt;/button&gt;    &lt;/div&gt;&lt;/div&gt;(function(){    const canvas=document.getElementById(&#39;gameCanvas&#39;);    const ctx=canvas.getContext(&#39;2d&#39;);    const W=450,H=800;    canvas.width=W;canvas.height=H;    const scoreDisp=document.getElementById(&#39;scoreDisp&#39;);    const killDisp=document.getElementById(&#39;killDisp&#39;);    const hpFill=document.getElementById(&#39;hpFill&#39;);    const hpText=document.getElementById(&#39;hpText&#39;);    const specialDisp=document.getElementById(&#39;specialDisp&#39;);    const heroSelectDiv=document.getElementById(&#39;hero-select&#39;);    const heroGrid=document.getElementById(&#39;heroGrid&#39;);    const startBtn=document.getElementById(&#39;start-btn&#39;);    const gameoverScreen=document.getElementById(&#39;gameover-screen&#39;);    const finalScoreSpan=document.getElementById(&#39;finalScore&#39;);    const restartBtn=document.getElementById(&#39;restartBtn&#39;);    const joyThumb=document.getElementById(&#39;joystick-thumb&#39;);    const joyBase=document.getElementById(&#39;joystick-base&#39;);    const btnSpecial=document.getElementById(&#39;btn-special&#39;);    const btnShoot=document.getElementById(&#39;btn-shoot&#39;);    let gameRunning=false,gameOver=false;    let score=0,kills=0;    let player,enemies=[],bullets=[],enemyBullets=[];    let enemySpawnTimer=0;    const MAP_W=2000,MAP_H=2000;    let bushes=[],walls=[],waters=[];    // Generate map    for(let i=0;i&lt;120;i++) bushes.push({x:Math.random()*MAP_W,y:Math.random()*MAP_H,r:25+Math.random()*35});    for(let i=0;i&lt;50;i++) walls.push({x:Math.random()*MAP_W,y:Math.random()*MAP_H,w:50+Math.random()*80,h:25+Math.random()*35});    for(let i=0;i&lt;15;i++) waters.push({x:Math.random()*MAP_W,y:Math.random()*MAP_H,r:60+Math.random()*90});    const ALL_HEROES={        lion:{name:&#39;شیر&#39;,emoji:&#39;🦁&#39;,hp:130,speed:3.5,fireRate:15,damage:20,color:&#39;#e6a817&#39;,              special:&#39;غرش&#39;,specialCD:180,specialDesc:&#39;دشمنان نزدیک میلرزند و کند میشوند&#39;},        cheetah:{name:&#39;یوزپلنگ&#39;,emoji:&#39;🐆&#39;,hp:90,speed:6.2,fireRate:10,damage:14,color:&#39;#e6b800&#39;,                special:&#39;دوی سریع&#39;,specialCD:120,specialDesc:&#39;سرعت ۲ برابر برای ۳ ثانیه&#39;},        fox:{name:&#39;روباه&#39;,emoji:&#39;🦊&#39;,hp:100,speed:5.0,fireRate:9,damage:13,color:&#39;#ff8844&#39;,             special:&#39;فریب&#39;,specialCD:150,specialDesc:&#39;دشمنان ۲ ثانیه گیج میشوند&#39;},        turtle:{name:&#39;لاکپشت&#39;,emoji:&#39;🐢&#39;,hp:200,speed:2.0,fireRate:20,damage:25,color:&#39;#66aa44&#39;,                special:&#39;سپر لاکی&#39;,specialCD:200,specialDesc:&#39;۳ ثانیه آسیب نمیبینی&#39;},        monkey:{name:&#39;میمون&#39;,emoji:&#39;🐵&#39;,hp:95,speed:5.5,fireRate:8,damage:12,color:&#39;#cc8844&#39;,                special:&#39;موز پرتاب&#39;,specialCD:100,specialDesc:&#39;پرتاب ۳ موز انفجاری&#39;},        deer:{name:&#39;گوزن&#39;,emoji:&#39;🦌&#39;,hp:110,speed:4.8,fireRate:11,damage:16,color:&#39;#bb7733&#39;,              special:&#39;ضربه شاخ&#39;,specialCD:140,specialDesc:&#39;پرتاب دشمنان نزدیک به عقب&#39;},        eagle:{name:&#39;عقاب&#39;,emoji:&#39;🦅&#39;,hp:85,speed:5.8,fireRate:10,damage:18,color:&#39;#ddcc88&#39;,               special:&#39;پرواز&#39;,specialCD:160,specialDesc:&#39;از روی موانع میپری&#39;},        croc:{name:&#39;تمساح&#39;,emoji:&#39;🐊&#39;,hp:150,speed:3.0,fireRate:16,damage:28,color:&#39;#558844&#39;,              special:&#39;آرواره مرگ&#39;,specialCD:190,specialDesc:&#39;گاز مرگبار به نزدیکترین دشمن&#39;},        gorilla:{name:&#39;گوریل&#39;,emoji:&#39;🦍&#39;,hp:140,speed:3.8,fireRate:14,damage:22,color:&#39;#776655&#39;,                 special:&#39;مشت زمین&#39;,specialCD:170,specialDesc:&#39;ضربه به همه دشمنان اطراف&#39;}    };    let selectedHero=&#39;lion&#39;;    let heroData=ALL_HEROES[selectedHero];    let specialCooldown=0;    function buildHeroCards(){        heroGrid=&#39;&#39;;        Object.entries(ALL_HEROES).forEach(([key,h])=&gt;{            const card=document.createElement(&#39;div&#39;);            card.className=&#39;hero-card&#39;+(key===selectedHero?&#39; selected&#39;:&#39;&#39;);            card=`&lt;div class=&#34;hero-emoji&#34;&gt;${h.emoji}&lt;/div&gt;&lt;div&gt;${h.name}&lt;/div&gt;            &lt;div class=&#34;hero-stats&#34;&gt;❤️${h.hp} ⚡${h.speed} 💥${h.damage}&lt;br&gt;✨${h.special}&lt;/div&gt;`;            card.addEventListener(&#39;click&#39;,()=&gt;{                document.querySelectorAll(&#39;.hero-card&#39;).forEach(c=&gt;c.classList.remove(&#39;selected&#39;));                card.classList.add(&#39;selected&#39;);                selectedHero=key;                heroData=ALL_HEROES[key];            });            heroGrid(card);        });    }    buildHeroCards();    // Joystick handling    let joystick={dx:0,dy:0,active:false};    let joyId=null;    joyBase.addEventListener(&#39;touchstart&#39;,(e)=&gt;{        e.preventDefault();joyId=e.changedTouches[0].identifier;joystick.active=true;    });    joyBase.addEventListener(&#39;touchmove&#39;,(e)=&gt;{        e.preventDefault();        for(let t of e.changedTouches){            if(t.identifier===joyId){                const rect=joyBase.getBoundingClientRect();                const cx=rect.left+rect.width/2,cy=rect.top+rect.height/2;                let dx=t.clientX-cx,dy=t.clientY-cy;                const dist=Math.sqrt(dx*dx+dy*dy);                const maxDist=35;                if(dist&gt;maxDist){dx=dx/dist*maxDist;dy=dy/dist*maxDist;}                joystick.dx=dx/maxDist;joystick.dy=dy/maxDist;                joyThumb.style.left=(25+dx)+&#39;px&#39;;joyThumb.style.top=(25+dy)+&#39;px&#39;;            }        }    });    joyBase.addEventListener(&#39;touchend&#39;,(e)=&gt;{        for(let t of e.changedTouches){            if(t.identifier===joyId){joystick.active=false;joystick.dx=0;joystick.dy=0;                joyThumb.style.left=&#39;25px&#39;;joyThumb.style.top=&#39;25px&#39;;joyId=null;}        }    });    let shootDown=false;    btnShoot.addEventListener(&#39;touchstart&#39;,(e)=&gt;{e.preventDefault();shootDown=true;});    btnShoot.addEventListener(&#39;touchend&#39;,()=&gt;shootDown=false);    btnShoot.addEventListener(&#39;touchcancel&#39;,()=&gt;shootDown=false);    btnSpecial.addEventListener(&#39;touchstart&#39;,(e)=&gt;{        e.preventDefault();        if(specialCooldown&lt;=0 &amp;&amp; gameRunning &amp;&amp; !gameOver) activateSpecial();    });    function activateSpecial(){        specialCooldown=heroData.specialCD;        const p=player;        switch(selectedHero){            case &#39;lion&#39;: // غرش - کند کردن دشمنان نزدیک                enemies.forEach(e=&gt;{                    const d=Math.hypot(e.x-p.x,e.y-p.y);                    if(d&lt;180){e.slowed=60;e.speed*=0.4;}                });                break;            case &#39;cheetah&#39;: // دوی سریع                p.speedBoost=60;p.speed*=2.2;                break;            case &#39;fox&#39;: // فریب - گیج کردن                enemies.forEach(e=&gt;{                    if(Math.hypot(e.x-p.x,e.y-p.y)&lt;200)e.confused=60;                });                break;            case &#39;turtle&#39;: // سپر                p.shield=90;                break;            case &#39;monkey&#39;: // موز انفجاری                for(let i=0;i&lt;3;i++){                    setTimeout(()=&gt;{                        const t=enemies[Math.floor(Math.random()*enemies.length)];                        if(t){t.hp-=25;if(t.hp&lt;=0)killEnemy(t);}                    },i*150);                }                break;            case &#39;deer&#39;: // پرتاب                enemies.forEach(e=&gt;{                    if(Math.hypot(e.x-p.x,e.y-p.y)&lt;150){                        const a=Math.atan2(e.y-p.y,e.x-p.x);                        e.x+=Math.cos(a)*120;e.y+=Math.sin(a)*120;                        e.hp-=15;if(e.hp&lt;=0)killEnemy(e);                    }                });                break;            case &#39;eagle&#39;: // پرش                p.zJump=30;p.zVel=-8;                break;            case &#39;croc&#39;:                const closest=enemies.reduce((a,b)=&gt;Math.hypot(a.x-p.x,a.y-p.y)&lt;Math.hypot(b.x-p.x,b.y-p.y)?a:b,enemies[0]);                if(closest&amp;&amp;Math.hypot(closest.x-p.x,closest.y-p.y)&lt;130){closest.hp-=40;if(closest.hp&lt;=0)killEnemy(closest);}                break;            case &#39;gorilla&#39;:                enemies.forEach(e=&gt;{if(Math.hypot(e.x-p.x,e.y-p.y)&lt;170){e.hp-=20;if(e.hp&lt;=0)killEnemy(e);}});                break;        }    }    function initGame(){        heroData=ALL_HEROES[selectedHero];        player={            x:MAP_W/2,y:MAP_H/2,radius:18,            hp:heroData.hp,maxHp:heroData.hp,            speed:heroData.speed,fireRate:heroData.fireRate,            damage:heroData.damage,fireCooldown:0,            speedBoost:0,shield:0,zJump:0,zVel:0        };        enemies=[];bullets=[];enemyBullets=[];        score=0;kills=0;specialCooldown=0;        enemySpawnTimer=0;gameOver=false;gameRunning=true;        gameoverScreen.style.display=&#39;none&#39;;heroSelectDiv.style.display=&#39;none&#39;;        updateUI();    }    function spawnEnemy(){        const a=Math.random()*Math.PI*2,d=450+Math.random()*350;        let ex=player.x+Math.cos(a)*d,ey=player.y+Math.sin(a)*d;        ex=Math.max(40,Math.min(MAP_W-40,ex));        ey=Math.max(40,Math.min(MAP_H-40,ey));        const types=[&#39;gorilla&#39;,&#39;croc&#39;,&#39;fox_bot&#39;,&#39;deer_bot&#39;];        const t=types[Math.floor(Math.random()*types.length)];        const stats={gorilla:{hp:70,sp:1.5,dmg:12,rad:18},croc:{hp:55,sp:2.2,dmg:9,rad:16},                     fox_bot:{hp:45,sp:2.8,dmg:7,rad:15},deer_bot:{hp:50,sp:2.5,dmg:8,rad:17}};        enemies.push({            x:ex,y:ey,radius:stats[t].rad,hp:stats[t].hp,maxHp:stats[t].hp,            speed:stats[t].sp,damage:stats[t].dmg,type:t,fireCooldown:0,            slowed:0,confused:0        });    }    function killEnemy(e){        const idx=enemies.indexOf(e);        if(idx&gt;-1)enemies.splice(idx,1);        kills++;score+=10;    }    function updateUI(){        scoreDisp.textContent=score;killDisp.textContent=kills;        hpFill.style.width=(player.hp/player.maxHp*100)+&#39;%&#39;;        hpText.textContent=Math.ceil(player.hp);        specialDisp.textContent=specialCooldown&gt;0?Math.ceil(specialCooldown/60)+&#39;s&#39;:&#39;⚡آماده&#39;;    }    function update(){        if(!gameRunning||gameOver)return;        // Player movement        let mx=joystick.dx*heroData.speed*(player.speedBoost&gt;0?2.2:1);        let my=joystick.dy*heroData.speed*(player.speedBoost&gt;0?2.2:1);        if(player.zJump&gt;0){my-=4;player.zJump--;}        player.x=Math.max(20,Math.min(MAP_W-20,player.x+mx));        player.y=Math.max(20,Math.min(MAP_H-20,player.y+my));        if(player.speedBoost&gt;0)player.speedBoost--;        if(player.shield&gt;0)player.shield--;        if(specialCooldown&gt;0)specialCooldown--;        // Auto-target nearest enemy for shooting        let nearestEnemy=null,nearestDist=250;        enemies.forEach(e=&gt;{            const d=Math.hypot(e.x-player.x,e.y-player.y);            if(d&lt;nearestDist){nearestDist=d;nearestEnemy=e;}        });        // Shooting        if(player.fireCooldown&gt;0)player.fireCooldown--;        if(shootDown &amp;&amp; player.fireCooldown&lt;=0 &amp;&amp; nearestEnemy){            const a=Math.atan2(nearestEnemy.y-player.y,nearestEnemy.x-player.x);            bullets.push({x:player.x,y:player.y,vx:Math.cos(a)*9,vy:Math.sin(a)*9,damage:heroData.damage});            player.fireCooldown=heroData.fireRate;        }        // Bullets        bullets.forEach(b=&gt;{b.x+=b.vx;b.y+=b.vy;});        bullets=bullets.filter(b=&gt;b.x&gt;0&amp;&amp;b.x&lt;MAP_W&amp;&amp;b.y&gt;0&amp;&amp;b.y&lt;MAP_H);        enemyBullets.forEach(b=&gt;{b.x+=b.vx;b.y+=b.vy;});        enemyBullets=enemyBullets.filter(b=&gt;b.x&gt;0&amp;&amp;b.x&lt;MAP_W&amp;&amp;b.y&gt;0&amp;&amp;b.y&lt;MAP_H);        // Bullet-enemy collision        bullets.forEach(b=&gt;{            enemies.forEach(e=&gt;{                if(Math.hypot(b.x-e.x,b.y-e.y)&lt;e.radius+5){                    e.hp-=b.damage;b.hit=true;                    if(e.hp&lt;=0)killEnemy(e);                }            });        });        bullets=bullets.filter(b=&gt;!b.hit);        // Enemy bullet-player collision        enemyBullets.forEach(b=&gt;{            if(Math.hypot(b.x-player.x,b.y-player.y)&lt;player.radius+5){                if(player.shield&lt;=0)player.hp-=b.damage||8;                b.hit=true;            }        });        enemyBullets=enemyBullets.filter(b=&gt;!b.hit);        // Enemy AI        enemies.forEach(e=&gt;{            if(e.slowed&gt;0){e.slowed--;if(e.slowed===0)e.speed*=2.5;}            if(e.confused&gt;0){e.confused--;return;}            const dx=player.x-e.x,dy=player.y-e.y,dist=Math.hypot(dx,dy);            if(dist&gt;5){e.x+=dx/dist*e.speed;e.y+=dy/dist*e.speed;}            if(e.fireCooldown&gt;0)e.fireCooldown--;            if(dist&lt;300 &amp;&amp; e.fireCooldown&lt;=0 &amp;&amp; Math.random()&lt;0.02){                const a=Math.atan2(player.y-e.y,player.x-e.x);                enemyBullets.push({x:e.x,y:e.y,vx:Math.cos(a)*7,vy:Math.sin(a)*7,damage:e.damage});                e.fireCooldown=25;            }        });        // Spawn        enemySpawnTimer--;        if(enemySpawnTimer&lt;=0 &amp;&amp; enemies.length&lt;12){            spawnEnemy();enemySpawnTimer=70+Math.random()*50;        }        if(player.hp&lt;=0){gameOver=true;gameRunning=false;gameoverScreen.style.display=&#39;flex&#39;;            finalScoreSpan.textContent=&#39;⭐ &#39;+score+&#39;  💀 &#39;+kills;}        updateUI();    }    function draw(){        ctx.clearRect(0,0,W,H);        const camX=player.x-W/2,camY=player.y-H/2;        ctx.save();ctx.translate(-camX,-camY);        // Grass bg        ctx.fillStyle=&#39;#4a8c3f&#39;;ctx.fillRect(0,0,MAP_W,MAP_H);        // Grid        ctx.strokeStyle=&#39;#3a7030&#39;;ctx.lineWidth=1;        for(let i=0;i&lt;MAP_W;i+=80){ctx.beginPath();ctx.moveTo(i,0);ctx.lineTo(i,MAP_H);ctx.stroke();}        for(let i=0;i&lt;MAP_H;i</description><category>محمد حسین صادقی زاده</category><author>محمد حسین صادقی زاده</author><pubDate>Sun, 03 May 2026 15:20:32 +0330</pubDate></item></channel></rss>