ТапШар
by SuperOtter201029 lines46.3 KB
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
<title>ТапШар</title>
<style>
*{box-sizing:border-box;margin:0;padding:0;-webkit-tap-highlight-color:transparent;user-select:none;-webkit-user-select:none}
html,body{width:100%;height:100%;overflow:hidden;position:fixed;touch-action:none;font-family:-apple-system,'Segoe UI',Roboto,sans-serif;background:#0a0a1a;color:#fff}
#f{position:relative;width:100%;height:100%;overflow:hidden;background:radial-gradient(circle at 50% 0%,#1a1a3a,#0a0a1a);touch-action:none}
.b{position:absolute;bottom:40px;width:62px;height:62px;border-radius:50%;z-index:5;pointer-events:none;transition:left 0.05s linear}
.b.skin-default{background:radial-gradient(circle at 30% 30%,#fff,#ffd700 60%,#ff8c00);box-shadow:0 0 20px #ffd700,0 0 40px rgba(255,215,0,.5)}
.b.skin-blue{background:radial-gradient(circle at 30% 30%,#a5d8ff,#2196f3 60%,#0d47a1);box-shadow:0 0 25px #2196f3,0 0 50px rgba(33,150,243,.5);animation:neonBlue 1.2s infinite alternate}
@keyframes neonBlue{0%{box-shadow:0 0 20px #2196f3,0 0 40px rgba(33,150,243,.4)}100%{box-shadow:0 0 40px #64b5f6,0 0 70px rgba(100,181,246,.8)}}
.b.skin-green{background:radial-gradient(circle at 30% 30%,#a5ffa5,#4caf50 60%,#1b5e20);box-shadow:0 0 25px #4caf50,0 0 50px rgba(76,175,80,.5)}
.b.skin-fire{background:radial-gradient(circle at 30% 30%,#ffd699,#ff5722 60%,#b71c1c);box-shadow:0 0 30px #ff5722,0 0 60px rgba(255,87,34,.6);animation:fireGlow .5s infinite alternate}
@keyframes fireGlow{0%{box-shadow:0 0 25px #ff5722,0 0 50px rgba(255,87,34,.5)}100%{box-shadow:0 0 45px #ff9800,0 0 80px rgba(255,152,0,.9)}}
.b.skin-plasma{background:radial-gradient(circle at 30% 30%,#d6a5ff,#9c27b0 60%,#4a148c);box-shadow:0 0 30px #9c27b0,0 0 60px rgba(156,39,176,.5);animation:plasmaPulse 1.5s infinite}
@keyframes plasmaPulse{50%{box-shadow:0 0 50px #d6a5ff,0 0 90px rgba(214,165,255,.8)}}
.b.skin-rainbow{background:linear-gradient(45deg,#ff0000,#ff9800,#ffeb3b,#4caf50,#2196f3,#9c27b0,#ff0000);background-size:300% 300%;box-shadow:0 0 30px #fff,0 0 60px rgba(255,255,255,.5);animation:rainbow 3s linear infinite}
@keyframes rainbow{0%{background-position:0% 50%}50%{background-position:100% 50%}100%{background-position:0% 50%}}
.b.skin-black{background:radial-gradient(circle at 30% 30%,#444,#000 70%,#000);box-shadow:0 0 30px #9c27b0,0 0 60px rgba(156,39,176,.6)}
.b.skin-diamond{background:radial-gradient(circle at 30% 30%,#fff,#e3f2fd 40%,#64b5f6 70%,#1976d2);box-shadow:0 0 30px #fff,0 0 60px rgba(100,181,246,.7);animation:diamondShine 1.8s infinite}
@keyframes diamondShine{50%{box-shadow:0 0 55px #fff,0 0 100px rgba(255,255,255,.9)}}
.b.skin-toxic{background:radial-gradient(circle at 30% 30%,#c6ff00,#76ff03 50%,#33691e);box-shadow:0 0 30px #76ff03,0 0 60px rgba(118,255,3,.6)}
.b.skin-ice{background:radial-gradient(circle at 30% 30%,#e3f2fd,#81d4fa 50%,#0288d1);box-shadow:0 0 25px #81d4fa,0 0 50px rgba(129,212,250,.6);animation:iceFloat 2s infinite alternate}
@keyframes iceFloat{0%{transform:translateY(0)}100%{transform:translateY(-3px)}}
.b.skin-lava{background:radial-gradient(circle at 30% 30%,#ffcc80,#ff5722 40%,#d84315 70%,#3e2723);box-shadow:0 0 35px #ff5722,0 0 70px rgba(255,87,34,.8)}
.b.skin-gold{background:radial-gradient(circle at 30% 30%,#fff8e1,#ffd700 40%,#ff8f00 70%,#e65100);box-shadow:0 0 35px #ffd700,0 0 70px rgba(255,215,0,.9);animation:goldGlow 1s infinite alternate}
@keyframes goldGlow{0%{box-shadow:0 0 30px #ffd700,0 0 60px rgba(255,215,0,.7)}100%{box-shadow:0 0 50px #fff8e1,0 0 90px rgba(255,248,225,.9)}}
.b.skin-galaxy{background:radial-gradient(circle at 30% 30%,#ce93d8,#673ab7 40%,#311b92 70%,#000);box-shadow:0 0 35px #673ab7,0 0 70px rgba(103,58,183,.8);animation:galaxySpin 4s linear infinite}
@keyframes galaxySpin{0%{background-position:0% 50%}50%{background-position:100% 50%}100%{background-position:0% 50%}}
.b.skin-candy{background:linear-gradient(45deg,#ff4081,#ff80ab,#f8bbd0,#ff4081);background-size:300% 300%;box-shadow:0 0 25px #ff80ab,0 0 50px rgba(255,128,171,.6);animation:candy 2s linear infinite}
@keyframes candy{0%{background-position:0% 50%}50%{background-position:100% 50%}100%{background-position:0% 50%}}
.b.iv{animation:bl .3s infinite}
@keyframes bl{50%{opacity:.3}}
.d{position:absolute;top:-80px;width:68px;height:68px;border-radius:50%;z-index:3;display:flex;align-items:center;justify-content:center;font-size:26px;font-weight:bold;color:#fff;opacity:0;transition:opacity 0.3s ease-out}
.d.show{opacity:1}
.d.g{background:radial-gradient(circle at 30% 30%,#a5ffa5,#4caf50);box-shadow:0 0 20px #4caf50;border:2px solid rgba(255,255,255,.5)}
.d.r{background:radial-gradient(circle at 30% 30%,#ff9999,#f44336);box-shadow:0 0 20px #f44336;border:2px solid rgba(255,255,255,.5)}
.d.o{background:radial-gradient(circle at 30% 30%,#ffd699,#ff9800);box-shadow:0 0 20px #ff9800;border:2px solid rgba(255,255,255,.5)}
.d.bl{background:radial-gradient(circle at 30% 30%,#a5d8ff,#2196f3);box-shadow:0 0 25px #2196f3;border:2px solid rgba(255,255,255,.7)}
.d.pu{background:radial-gradient(circle at 30% 30%,#d6a5ff,#9c27b0);box-shadow:0 0 30px #9c27b0;border:2px solid #fff}
.d.bk{background:radial-gradient(circle at 30% 30%,#555,#000);box-shadow:0 0 35px #f00,0 0 70px #f00;border:2px solid #f00}
.d.bm{background:radial-gradient(circle at 30% 30%,#ffcc00,#ff6600,#8b0000);box-shadow:0 0 30px #ff6600;border:2px solid #fff}
.d.hp{background:radial-gradient(circle at 30% 30%,#ffb3c1,#ff3b5c);box-shadow:0 0 30px #ff3b5c;border:2px solid #fff;animation:hp 0.8s infinite alternate}
@keyframes hp{50%{box-shadow:0 0 50px #ff3b5c,0 0 80px rgba(255,59,92,.8)}}
.d.g::after{content:'+'}
.d.o::after{content:'+'}
.d.r::after{content:'X'}
.d.bl::after{content:'*'}
.d.pu::after{content:'!'}
.d.bk::after{content:'☠'}
.d.bm::after{content:'BOMB'}
.d.bm{font-size:13px}
.d.hp::after{content:'❤'}
.d.hp{font-size:30px}
.d.pu{font-size:34px}
.d.bk{font-size:34px}
@keyframes fl{to{transform:translateY(110vh)}}
.pr{position:absolute;width:30px;height:30px;border-radius:50%;background:radial-gradient(circle,#ff0,#f00);box-shadow:0 0 20px #f00;z-index:4}
.bs{position:absolute;top:90px;width:130px;height:130px;border-radius:25px;background:radial-gradient(circle at 30% 30%,#ff6b6b,#8b0000);box-shadow:0 0 30px #f00,0 0 60px rgba(255,0,0,.5);z-index:3;border:3px solid #ff0;display:flex;align-items:center;justify-content:center;font-size:16px;color:#fff;font-weight:bold;text-align:center;padding:5px}
.bs.h{animation:sh .2s}
@keyframes sh{0%,100%{transform:translateX(-50%)}25%{transform:translateX(calc(-50% - 10px))}75%{transform:translateX(calc(-50% + 10px))}}
#hud{position:absolute;top:0;left:0;right:0;padding:max(10px,env(safe-area-inset-top)) 10px 10px;display:flex;justify-content:space-between;align-items:center;z-index:10;pointer-events:none;font-size:.85rem;gap:4px}
.hi{background:rgba(0,0,0,.6);padding:5px 10px;border-radius:20px;border:1px solid rgba(255,255,255,.2);white-space:nowrap;display:flex;align-items:center;gap:3px}
#sc{color:#ffd700}#lv{color:#4fc3f7}#ur{color:#ff6b6b}#cb{color:#ff9800;font-weight:bold;display:none}#coins{color:#ffeb3b}
#lv-bar{position:absolute;top:max(45px,calc(env(safe-area-inset-top) + 35px));left:50%;transform:translateX(-50%);width:60%;max-width:300px;height:8px;background:rgba(0,0,0,.5);border-radius:4px;overflow:hidden;z-index:10;display:none}
#lv-bar-fill{height:100%;background:linear-gradient(90deg,#4caf50,#8bc34a);transition:width .3s;width:0%}
.hearts{display:flex;gap:3px;align-items:center}
.heart{width:16px;height:14px;position:relative;display:inline-block}
.heart::before,.heart::after{content:'';position:absolute;top:0;width:8px;height:12px;border-radius:8px 8px 0 0;background:#ff3b5c;box-shadow:0 0 6px #ff3b5c}
.heart::before{left:8px;transform:rotate(-45deg);transform-origin:0 100%}
.heart::after{left:0;transform:rotate(45deg);transform-origin:100% 100%}
.heart.lost::before,.heart.lost::after{background:#444;box-shadow:none}
#pb{position:absolute;bottom:max(20px,env(safe-area-inset-bottom));right:15px;width:56px;height:56px;border-radius:50%;background:rgba(0,0,0,.7);border:2px solid rgba(255,255,255,.3);color:#fff;font-size:18px;z-index:11;display:flex;align-items:center;justify-content:center;touch-action:manipulation;font-weight:bold}
#pb:active{background:rgba(255,255,255,.2);transform:scale(.95)}
#bh{position:absolute;top:max(70px,calc(env(safe-area-inset-top) + 60px));left:50%;transform:translateX(-50%);width:70%;max-width:400px;height:22px;background:rgba(0,0,0,.7);border-radius:12px;border:2px solid #ff0;overflow:hidden;z-index:10;display:none}
#bhf{height:100%;background:linear-gradient(90deg,#f44336,#ff9800,#ffeb3b);transition:width .2s;width:100%}
.ov{display:none;position:fixed;inset:0;z-index:100;background:rgba(0,0,0,.92);color:#fff;text-align:center;padding:8vh 15px 15px;overflow-y:auto}
.ov.s{display:block}
.ov h1{font-size:clamp(1.5rem,7vw,2.4rem);margin-bottom:10px;background:linear-gradient(90deg,#ffd700,#ff6b6b);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
.ov p{font-size:clamp(.9rem,3.5vw,1.1rem);margin:5px 0;line-height:1.4}
.btn{margin-top:14px;padding:14px 36px;font-size:1rem;background:linear-gradient(135deg,#ffd700,#ff8c00);color:#000;border:none;border-radius:40px;font-weight:bold;min-width:180px;touch-action:manipulation;display:inline-block;cursor:pointer}
.btn:active{transform:scale(.95)}
.btn.sec{background:linear-gradient(135deg,#4fc3f7,#1976d2);color:#fff;margin-top:8px}
.btn.dgr{background:linear-gradient(135deg,#f44336,#b71c1c);color:#fff;margin-top:8px;font-size:.9rem;padding:10px 24px;min-width:150px}
.btn.ad{background:linear-gradient(135deg,#ff9800,#f44336);color:#fff;margin-top:8px;font-size:.9rem;padding:10px 24px;min-width:150px}
#mn .logo{font-size:clamp(2.4rem,14vw,4rem);margin-bottom:6px;background:linear-gradient(90deg,#ffd700,#ff6b6b,#ffd700,#ff6b6b,#ffd700);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;font-weight:900;letter-spacing:3px}
#mn .sub{font-size:clamp(.8rem,3vw,.95rem);color:rgba(255,255,255,.6);margin-bottom:8px}
#mn .coins-menu{font-size:1.1rem;color:#ffeb3b;font-weight:bold;margin-bottom:12px}
#mn .mb{display:flex;flex-direction:column;align-items:center;gap:6px}
#mn .bst{font-size:.9rem;color:#ffd700;margin-top:12px}
#lmap{display:grid;grid-template-columns:repeat(5,1fr);gap:6px;max-width:400px;margin:12px auto 8px;padding:0 5px;max-height:40vh;overflow-y:auto}
.lc{aspect-ratio:1;border-radius:10px;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:.9rem;font-weight:bold;border:2px solid;cursor:pointer;position:relative;touch-action:manipulation;transition:transform .15s}
.lc:active{transform:scale(.92)}
.lc.done{background:linear-gradient(135deg,#2e7d32,#4caf50);border-color:#4caf50;color:#fff}
.lc.cur{background:linear-gradient(135deg,#1976d2,#4fc3f7);border-color:#4fc3f7;color:#fff}
.lc.lock{background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.15);color:rgba(255,255,255,.3);cursor:not-allowed}
.lc.lock:active{transform:none}
.lc .n{font-size:1rem}
.lc .i{font-size:.5rem;margin-top:1px}
.lc.boss.done{background:linear-gradient(135deg,#8b0000,#f44336);border-color:#f44336}
.lc.boss.cur{background:linear-gradient(135deg,#b71c1c,#ff6b6b);border-color:#ff6b6b}
#rl ul{list-style:none;text-align:left;display:inline-block;margin-top:10px}
#rl li{font-size:clamp(.85rem,3.5vw,1rem);margin:8px 0;padding-left:28px;position:relative;line-height:1.35}
#rl li::before{content:'*';position:absolute;left:8px;font-size:1.2rem;color:#ffd700;top:-2px}
#nt{position:fixed;top:40%;left:50%;transform:translate(-50%,-50%);font-size:clamp(1.6rem,9vw,3rem);font-weight:bold;color:#ffd700;text-shadow:0 0 30px #ffd700;z-index:300;opacity:0;pointer-events:none;transition:opacity .4s;text-align:center;width:90%}
#nt.s{opacity:1}
#ch{position:absolute;bottom:max(6px,env(safe-area-inset-bottom));left:50%;transform:translateX(-50%);font-size:.65rem;color:rgba(255,255,255,.3);z-index:9;text-align:center;white-space:nowrap;pointer-events:none;max-width:70%}
#cf{display:none;position:fixed;inset:0;z-index:200;background:rgba(0,0,0,.95);color:#fff;text-align:center;padding-top:35vh}
#cf.s{display:block}
#cf p{font-size:1.1rem;margin-bottom:16px}
#flash{position:fixed;inset:0;background:#f00;opacity:0;pointer-events:none;z-index:99;transition:opacity .2s}
#flash.on{opacity:.4;transition:opacity 0s}
#flash.pu{background:#9c27b0}
#fx-layer{position:fixed;inset:0;pointer-events:none;z-index:20;overflow:hidden}
#shop-list{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;max-width:420px;margin:15px auto;padding:0 8px}
.shop-item{background:rgba(255,255,255,.08);border:2px solid rgba(255,255,255,.15);border-radius:14px;padding:10px;cursor:pointer;text-align:center;transition:transform .15s}
.shop-item:active{transform:scale(.95)}
.shop-item.sel{border-color:#ffd700;background:rgba(255,215,0,.15)}
.shop-preview{width:60px;height:60px;border-radius:50%;margin:0 auto 8px;display:block;box-shadow:0 0 15px rgba(255,255,255,0.3)}
.shop-name{font-size:.85rem;font-weight:bold;color:#fff;margin-bottom:4px}
.shop-cost{font-size:.8rem;color:#ffd700}
.shop-cost.owned{color:#4caf50}
#rec-list{list-style:none;text-align:left;display:inline-block;margin-top:10px;min-width:200px}
#rec-list li{font-size:1rem;margin:5px 0;padding:5px 10px;background:rgba(255,255,255,.08);border-radius:8px;display:flex;justify-content:space-between}
#rec-list li.top{background:rgba(255,215,0,.2);color:#ffd700;font-weight:bold}
</style>
</head>
<body>
<div id="f">
<div id="hud">
<div class="hi" id="lv">Ур. 1</div>
<div class="hi" id="sc">0</div>
<div class="hi" id="coins">0</div>
<div class="hi" id="cb">x1</div>
<div class="hi" id="ur"><div class="hearts" id="hearts"></div></div>
</div>
<div id="lv-bar"><div id="lv-bar-fill"></div></div>
<div id="pb">||</div>
<div id="bh"><div id="bhf"></div></div>
<div id="ch">Води пальцем - двигай шар</div>
</div>
<div id="flash"></div>
<div id="fx-layer"></div>
<div class="ov s" id="mn">
<div class="logo">ТАПШАР</div>
<div class="sub">Лови точки • Побеждай боссов</div>
<div class="coins-menu">Монет: <span id="menu-coins">0</span></div>
<div id="lmap"></div>
<div class="mb">
<button class="btn sec" id="rbtn">Правила</button>
<button class="btn sec" id="shop-btn">Магазин</button>
<button class="btn sec" id="rec-btn">Рекорды</button>
<button class="btn ad" id="ad-btn">📺 +1 монета</button>
<button class="btn sec" id="sound-btn">🔊 Звук: вкл</button>
<button class="btn dgr" id="xbtn">Сбросить</button>
</div>
<div class="bst" id="bst"></div>
</div>
<div class="ov" id="rl">
<h1>Правила</h1>
<ul>
<li><b>Води пальцем</b> - шар двигается.</li>
<li><b>Зелёная</b> - +10 очков, серия даёт комбо.</li>
<li><b>Оранжевая</b> - +5 очков.</li>
<li><b>Красная</b> - -1 жизнь.</li>
<li><b>Синяя</b> - замедление шара 3 сек.</li>
<li><b>Фиолетовая</b> - -2 жизни! (с 5 ур.)</li>
<li><b>Чёрная SKULL</b> - -все жизни! Очень редкая (с 9 ур.)</li>
<li><b>Бомба</b> - взрывает все красные на экране!</li>
<li><b>Сердечко ❤</b> - +1 жизнь! (с 5 ур.)</li>
<li><b>Каждый 4-й</b> - БОСС. У каждого своя способность.</li>
<li><b>100 очков = 1 монета</b> в конце уровня.</li>
<li><b>Реклама</b> - +1 монета (до 10 в день).</li>
</ul>
<button class="btn" id="rbbtn">Назад</button>
</div>
<div class="ov" id="shop">
<h1>Магазин</h1>
<p style="color:#ffd700">Монет: <span id="shop-coins">0</span></p>
<div id="shop-list"></div>
<button class="btn" id="shop-back">Назад</button>
</div>
<div class="ov" id="rec">
<h1>Рекорды</h1>
<p style="color:#ffd700">Топ-10 лучших результатов</p>
<ul id="rec-list"></ul>
<button class="btn" id="rec-back">Назад</button>
</div>
<div class="ov" id="go">
<h1>Игра окончена</h1>
<p>Счёт: <span id="fs">0</span></p><p>Уровень: <span id="fl">1</span></p>
<p id="nr" style="color:#ffd700;font-weight:bold;display:none">Новый рекорд!</p>
<button class="btn" id="rsbtn">Повторить</button>
<button class="btn ad" id="ad-btn-go">📺 +1 монета</button>
<button class="btn sec" id="bmbtn">В меню</button>
</div>
<div class="ov" id="lc">
<h1>Уровень пройден!</h1>
<p>Очки: <span id="ls">0</span></p><p>Монет получено: <span id="lc-coins" style="color:#ffeb3b">0</span></p><p>Открыт: <span id="nl">2</span></p>
<button class="btn" id="nxbtn">Продолжить</button><button class="btn sec" id="lcmbtn">В меню</button>
</div>
<div class="ov" id="pz">
<h1>Пауза</h1>
<button class="btn" id="resbtn">Продолжить</button><button class="btn sec" id="pmbtn">В меню</button>
</div>
<div id="cf"><p>Сбросить весь прогресс?</p><button class="btn dgr" id="cyes">Да</button><button class="btn sec" id="cno">Отмена</button></div>
<div id="nt"></div>
<script type="text/javascript">(function(){
'use strict';
var g={play:0,pause:0,score:0,lives:3,level:1,ls:0,target:100,bossL:0,boss:null,bh:100,mbh:100,bp:50,ball:null,si:null,bsi:null,bmi:null,bmi2:null,ml:null,dots:[],prs:[],spawnRate:900,fmin:1.8,fmax:3.5,rc:.28,oc:.25,bc:.06,pc:0,kc:0,bmc:0,hc:0,curLvl:1,combo:1,comboTimer:null,lastTap:0,slow:0,freezeTimer:null,bossType:0,invulnTimer:null};
var tp=50,maxLevel=1,best=0,TOTAL=100;
var coins=0;
try{coins=parseInt(localStorage.getItem('top_coins')||'0',10)||0;}catch(e){}
var currentSkin='default';
try{currentSkin=localStorage.getItem('top_skin')||'default';}catch(e){}
var ownedSkins={default:1};
try{var os=localStorage.getItem('top_owned');if(os)ownedSkins=JSON.parse(os);}catch(e){}
var records=[];
try{var rs=localStorage.getItem('top_records');if(rs)records=JSON.parse(rs);}catch(e){}
try{maxLevel=parseInt(localStorage.getItem('top_max')||'1',10)||1;best=parseInt(localStorage.getItem('top_best')||'0',10)||0;}catch(e){}
var adCoinsToday=0;
var adDateToday='';
try{adDateToday=localStorage.getItem('top_ad_date')||'';adCoinsToday=parseInt(localStorage.getItem('top_ad_coins')||'0',10)||0;}catch(e){}
var soundOn=true;
try{var so=localStorage.getItem('top_sound');if(so==='0')soundOn=false;}catch(e){}
var audioCtx=null;
function initAudio(){
if(audioCtx)return;
try{audioCtx=new (window.AudioContext||window.webkitAudioContext)();}catch(e){audioCtx=null;}
}
function playTone(freq,dur,type,vol){
if(!soundOn||!audioCtx)return;
try{
var o=audioCtx.createOscillator();
var gn=audioCtx.createGain();
o.type=type||'sine';
o.frequency.value=freq;
gn.gain.value=vol||0.1;
o.connect(gn);
gn.connect(audioCtx.destination);
var now=audioCtx.currentTime;
gn.gain.setValueAtTime(gn.gain.value,now);
gn.gain.exponentialRampToValueAtTime(0.001,now+dur);
o.start(now);
o.stop(now+dur);
}catch(e){}
}
function playNoise(dur,vol){
if(!soundOn||!audioCtx)return;
try{
var bufferSize=audioCtx.sampleRate*dur;
var buffer=audioCtx.createBuffer(1,bufferSize,audioCtx.sampleRate);
var data=buffer.getChannelData(0);
for(var i=0;i<bufferSize;i++)data[i]=Math.random()*2-1;
var src=audioCtx.createBufferSource();
src.buffer=buffer;
var gn=audioCtx.createGain();
gn.gain.value=vol||0.1;
var now=audioCtx.currentTime;
gn.gain.exponentialRampToValueAtTime(0.001,now+dur);
src.connect(gn);
gn.connect(audioCtx.destination);
src.start(now);
}catch(e){}
}
function sndGreen(){playTone(880,0.08,'sine',0.08);}
function sndOrange(){playTone(660,0.08,'sine',0.08);}
function sndBlue(){playTone(440,0.15,'sine',0.08);setTimeout(function(){playTone(330,0.15,'sine',0.06);},60);}
function sndHeart(){playTone(523,0.1,'sine',0.1);setTimeout(function(){playTone(784,0.15,'sine',0.1);},80);}
function sndBomb(){playNoise(0.3,0.15);playTone(110,0.3,'sawtooth',0.1);}
function sndHurt(){playTone(150,0.2,'sawtooth',0.12);}
function sndDeath(){playTone(440,0.15,'sine',0.1);setTimeout(function(){playTone(330,0.15,'sine',0.1);},150);setTimeout(function(){playTone(220,0.3,'sine',0.1);},300);}
function sndBossDie(){playTone(523,0.1,'sine',0.1);setTimeout(function(){playTone(659,0.1,'sine',0.1);},100);setTimeout(function(){playTone(784,0.15,'sine',0.1);},200);setTimeout(function(){playTone(1047,0.3,'sine',0.1);},350);}
function sndLevelUp(){playTone(523,0.1,'sine',0.1);setTimeout(function(){playTone(659,0.1,'sine',0.1);},100);setTimeout(function(){playTone(784,0.2,'sine',0.1);},200);}
function sndBuy(){playTone(1047,0.1,'sine',0.1);setTimeout(function(){playTone(1319,0.15,'sine',0.1);},80);}
function sndAd(){playTone(880,0.08,'sine',0.1);setTimeout(function(){playTone(1109,0.08,'sine',0.1);},80);setTimeout(function(){playTone(1319,0.15,'sine',0.1);},160);}
function sndError(){playTone(200,0.1,'square',0.12);setTimeout(function(){playTone(150,0.15,'square',0.12);},100);setTimeout(function(){playTone(100,0.2,'square',0.12);},220);}
var SKINS={
default:{name:'Золотой',cost:0,cls:'skin-default',bg:'radial-gradient(circle at 30% 30%,#fff,#ffd700 60%,#ff8c00)'},
blue:{name:'Неон',cost:5,cls:'skin-blue',bg:'radial-gradient(circle at 30% 30%,#a5d8ff,#2196f3 60%,#0d47a1)'},
green:{name:'Матрица',cost:10,cls:'skin-green',bg:'radial-gradient(circle at 30% 30%,#a5ffa5,#4caf50 60%,#1b5e20)'},
fire:{name:'Огонь',cost:15,cls:'skin-fire',bg:'radial-gradient(circle at 30% 30%,#ffd699,#ff5722 60%,#b71c1c)'},
plasma:{name:'Плазма',cost:20,cls:'skin-plasma',bg:'radial-gradient(circle at 30% 30%,#d6a5ff,#9c27b0 60%,#4a148c)'},
rainbow:{name:'Радуга',cost:30,cls:'skin-rainbow',bg:'linear-gradient(45deg,#ff0000,#ff9800,#ffeb3b,#4caf50,#2196f3,#9c27b0,#ff0000)'},
black:{name:'Чёрная дыра',cost:50,cls:'skin-black',bg:'radial-gradient(circle at 30% 30%,#444,#000 70%,#000)'},
diamond:{name:'Алмаз',cost:70,cls:'skin-diamond',bg:'radial-gradient(circle at 30% 30%,#fff,#e3f2fd 40%,#64b5f6 70%,#1976d2)'},
toxic:{name:'Токсик',cost:100,cls:'skin-toxic',bg:'radial-gradient(circle at 30% 30%,#c6ff00,#76ff03 50%,#33691e)'},
ice:{name:'Лёд',cost:40,cls:'skin-ice',bg:'radial-gradient(circle at 30% 30%,#e3f2fd,#81d4fa 50%,#0288d1)'},
lava:{name:'Лава',cost:60,cls:'skin-lava',bg:'radial-gradient(circle at 30% 30%,#ffcc80,#ff5722 40%,#d84315 70%,#3e2723)'},
gold:{name:'Золото',cost:80,cls:'skin-gold',bg:'radial-gradient(circle at 30% 30%,#fff8e1,#ffd700 40%,#ff8f00 70%,#e65100)'},
galaxy:{name:'Галактика',cost:120,cls:'skin-galaxy',bg:'radial-gradient(circle at 30% 30%,#ce93d8,#673ab7 40%,#311b92 70%,#000)'},
candy:{name:'Конфета',cost:45,cls:'skin-candy',bg:'linear-gradient(45deg,#ff4081,#ff80ab,#f8bbd0,#ff4081)'}
};
var $=function(id){return document.getElementById(id);};
var f=$('f'),sc=$('sc'),ur=$('ur'),lv=$('lv'),cb=$('cb'),bh=$('bh'),bhf=$('bhf'),nt=$('nt'),go=$('go'),lc=$('lc'),pz=$('pz'),mn=$('mn'),rl=$('rl'),pb=$('pb'),lmap=$('lmap'),cf=$('cf'),flash=$('flash'),fxLayer=$('fx-layer'),coinsEl=$('coins'),heartsEl=$('hearts'),lvBar=$('lv-bar'),lvBarFill=$('lv-bar-fill'),menuCoins=$('menu-coins'),soundBtn=$('sound-btn');
function save(){try{localStorage.setItem('top_max',String(maxLevel));localStorage.setItem('top_best',String(best));localStorage.setItem('top_coins',String(coins));localStorage.setItem('top_skin',currentSkin);localStorage.setItem('top_owned',JSON.stringify(ownedSkins));localStorage.setItem('top_records',JSON.stringify(records));}catch(e){}}
function updBest(){var e=$('bst');if(e)e.textContent=best>0?'Рекорд: '+best:'';updCoins();}
function updCoins(){if(coinsEl)coinsEl.textContent=coins;var s=$('shop-coins');if(s)s.textContent=coins;if(menuCoins)menuCoins.textContent=coins;}
function updSoundBtn(){if(soundBtn)soundBtn.textContent=soundOn?'🔊 Звук: вкл':'🔇 Звук: выкл';}
function toggleSound(){soundOn=!soundOn;try{localStorage.setItem('top_sound',soundOn?'1':'0');}catch(e){}updSoundBtn();if(soundOn){initAudio();playTone(880,0.1,'sine',0.1);}}
function isBoss(n){return n%4===0;}
function ballClass(){return 'b '+SKINS[currentSkin].cls;}
function applySkin(){
if(g.ball&&g.ball.parentNode){
g.ball.className=ballClass()+(g.ball.className.indexOf('iv')>-1?' iv':'');
}
}
function addRecord(sc,ln){
records.push({s:sc,l:ln,t:Date.now()});
records.sort(function(a,b){return b.s-a.s;});
if(records.length>10)records=records.slice(0,10);
save();
}
function renderRecords(){
var list=$('rec-list');
if(!list)return;
list.innerHTML='';
if(records.length===0){
list.innerHTML='<li>Пока нет рекордов</li>';
return;
}
for(var i=0;i<records.length;i++){
var li=document.createElement('li');
if(i===0)li.className='top';
li.innerHTML='<span>'+(i+1)+'. Ур. '+records[i].l+'</span><span>'+records[i].s+'</span>';
list.appendChild(li);
}
}
function renderShop(){
var shop=$('shop-list');
if(!shop)return;
shop.innerHTML='';
for(var id in SKINS){
var s=SKINS[id];
var owned=ownedSkins[id];
var selected=currentSkin===id;
var item=document.createElement('div');
item.className='shop-item'+(selected?' sel':'');
var prev=document.createElement('div');
prev.className='shop-preview';
prev.style.cssText='width:60px;height:60px;border-radius:50%;margin:0 auto 8px;display:block;background:'+s.bg+';box-shadow:0 0 10px rgba(255,255,255,0.5);';
item.appendChild(prev);
var nm=document.createElement('div');
nm.className='shop-name';
nm.textContent=s.name;
item.appendChild(nm);
var co=document.createElement('div');
co.className='shop-cost'+(owned?' owned':'');
co.textContent=owned?(selected?'✓ Выбран':'✓ Куплено'):s.cost+' монет';
item.appendChild(co);
(function(sid,own,sel){
var handler=function(e){
e.preventDefault();
if(own){
if(!sel)selectSkin(sid);
}else{
buySkin(sid);
}
};
item.addEventListener('click',handler);
item.addEventListener('touchend',function(e){e.preventDefault();e.stopPropagation();handler(e);},{passive:false});
})(id,owned,selected);
shop.appendChild(item);
}
}
function buySkin(id){
var s=SKINS[id];
if(!s||ownedSkins[id])return;
if(coins<s.cost){
sndError();
if(navigator.vibrate)navigator.vibrate([100,50,100]);
notif('НЕ ХВАТАЕТ МОНЕТ!','#ff0000',2500);
return;
}
coins-=s.cost;
ownedSkins[id]=1;
currentSkin=id;
save();
updCoins();
renderShop();
applySkin();
sndBuy();
notif('Куплено: '+s.name,'#4caf50');
if(navigator.vibrate)navigator.vibrate(50);
}
function selectSkin(id){
if(!ownedSkins[id])return;
currentSkin=id;
save();
renderShop();
applySkin();
sndBuy();
notif('Выбран: '+SKINS[id].name,'#4caf50');
}
function renderMap(){
lmap.innerHTML='';
for(var i=1;i<=TOTAL;i++){
var c=document.createElement('div');
var cls='lc';
if(i<maxLevel)cls+=' done';else if(i===maxLevel)cls+=' cur';else cls+=' lock';
if(isBoss(i))cls+=' boss';
c.className=cls;
var n=document.createElement('div');n.className='n';n.textContent=i>maxLevel?'X':i;c.appendChild(n);
var ic=document.createElement('div');ic.className='i';ic.textContent=i>maxLevel?'LOCK':(isBoss(i)?'BOSS':(i<maxLevel?'OK':''));c.appendChild(ic);
(function(ln,lk){
c.addEventListener('click',function(e){e.preventDefault();if(lk)return;startFromMenu(ln);});
c.addEventListener('touchend',function(e){e.preventDefault();e.stopPropagation();if(lk)return;startFromMenu(ln);},{passive:false});
})(i,i>maxLevel);
lmap.appendChild(c);
}
}
function addCombo(){
var now=Date.now();
if(now-g.lastTap<1500){g.combo=Math.min(g.combo+1,5);}else{g.combo=1;}
g.lastTap=now;
cb.style.display='block';
cb.textContent='x'+g.combo;
if(g.comboTimer)clearTimeout(g.comboTimer);
g.comboTimer=setTimeout(function(){g.combo=1;cb.style.display='none';},2500);
}
function freeze(){
g.slow=1;
notif('ЗАМЕДЛЕНИЕ!','#2196f3');
sndBlue();
if(g.freezeTimer)clearTimeout(g.freezeTimer);
g.freezeTimer=setTimeout(function(){
g.slow=0;
notif('ОБЫЧНАЯ СКОРОСТЬ','#4caf50');
},3000);
}
function flashRed(color){
flash.className='on';
if(color==='pu')flash.className='on pu';
setTimeout(function(){flash.className='';},100);
}
function particles(x,y,color){
for(var i=0;i<12;i++){
(function(){
var p=document.createElement('div');
var size=6+Math.random()*8;
p.style.cssText='position:absolute;width:'+size+'px;height:'+size+'px;border-radius:50%;background:'+color+';left:'+x+'px;top:'+y+'px;pointer-events:none;transition:all .6s cubic-bezier(.2,.8,.4,1);box-shadow:0 0 10px '+color;
fxLayer.appendChild(p);
requestAnimationFrame(function(){
var ang=Math.random()*Math.PI*2;
var dist=50+Math.random()*100;
p.style.transform='translate('+(Math.cos(ang)*dist)+'px,'+(Math.sin(ang)*dist)+'px) scale(0)';
p.style.opacity='0';
});
setTimeout(function(){if(p&&p.parentNode){p.style.display='none';p.parentNode.removeChild(p);}},650);
})();
}
}
function starBurst(x,y,color){
for(var i=0;i<8;i++){
(function(){
var p=document.createElement('div');
p.style.cssText='position:absolute;width:4px;height:14px;background:'+color+';left:'+x+'px;top:'+y+'px;pointer-events:none;border-radius:2px;transition:all .5s ease-out;box-shadow:0 0 8px '+color;
fxLayer.appendChild(p);
var ang=(i/8)*Math.PI*2;
requestAnimationFrame(function(){
p.style.transform='rotate('+(ang*180/Math.PI)+'deg) translateY(-60px)';
p.style.opacity='0';
});
setTimeout(function(){if(p&&p.parentNode){p.style.display='none';p.parentNode.removeChild(p);}},550);
})();
}
}
function startFromMenu(ln){
mn.className='ov';
g.score=0;g.lives=3;g.curLvl=ln;g.combo=1;cb.style.display='none';
if(isBoss(ln))startBL(ln);else startL(ln);
}
function updT(cx){
if(!g.play||g.pause)return;
var r=f.getBoundingClientRect();
tp=Math.max(6,Math.min(94,((cx-r.left)/r.width)*100));
}
f.addEventListener('touchstart',function(e){if(!g.play||g.pause)return;initAudio();for(var i=0;i<e.changedTouches.length;i++)updT(e.changedTouches[i].clientX);},{passive:true});
f.addEventListener('touchmove',function(e){if(!g.play||g.pause)return;for(var i=0;i<e.changedTouches.length;i++)updT(e.changedTouches[i].clientX);},{passive:true});
var md=0;
f.addEventListener('mousedown',function(e){if(!g.play||g.pause)return;md=1;initAudio();updT(e.clientX);});
f.addEventListener('mousemove',function(e){if(md&&g.play&&!g.pause)updT(e.clientX);});
document.addEventListener('mouseup',function(){md=0;});
document.addEventListener('keydown',function(e){
if(!g.play)return;
if(e.keyCode===37||e.keyCode===65)tp=Math.max(6,tp-5);
if(e.keyCode===39||e.keyCode===68)tp=Math.min(94,tp+5);
if(e.keyCode===32){e.preventDefault();togP();}
});
function mvBall(){
if(g.ball&&g.play&&!g.pause){
var spd=g.slow?0.06:0.25;
var d=tp-g.bp;g.bp+=d*spd;
if(Math.abs(d)<.1)g.bp=tp;
var r=f.getBoundingClientRect(),w=g.ball.offsetWidth||62;
g.ball.style.left=((g.bp/100)*r.width-w/2)+'px';
}
g.ml=requestAnimationFrame(mvBall);
}
function clearInvuln(){
if(g.invulnTimer){clearTimeout(g.invulnTimer);g.invulnTimer=null;}
if(g.ball&&g.ball.parentNode){
g.ball.className=ballClass();
}
}
function updLvBar(){
if(!lvBar||!lvBarFill)return;
if(g.bossL){lvBar.style.display='none';return;}
lvBar.style.display='block';
var pct=Math.min(100,(g.ls/g.target)*100);
lvBarFill.style.width=pct+'%';
}
function checkAdLimit(){
var today=new Date().toDateString();
if(adDateToday!==today){
adDateToday=today;
adCoinsToday=0;
try{localStorage.setItem('top_ad_date',today);localStorage.setItem('top_ad_coins','0');}catch(e){}
}
return adCoinsToday<10;
}
function addAdCoin(){
if(!checkAdLimit()){
notif('Лимит рекламы на сегодня!','#f44336');
return;
}
adCoinsToday++;
coins++;
try{localStorage.setItem('top_ad_coins',String(adCoinsToday));localStorage.setItem('top_ad_date',adDateToday);}catch(e){}
save();
updCoins();
sndAd();
notif('+1 монета за рекламу!','#ff9800');
if(navigator.vibrate)navigator.vibrate([50,30,50]);
}
function showAd(){
if(!checkAdLimit()){
notif('Лимит рекламы на сегодня!','#f44336',2000);
return;
}
if(typeof AndroidAPI==='undefined'||!AndroidAPI.showRewardedAd){
notif('Реклама недоступна','#f44336',2000);
return;
}
notif('Загрузка рекламы...','#ff9800',3000);
try{
if(AndroidAPI.isRewardedAdLoaded&&!AndroidAPI.isRewardedAdLoaded()){
var waited=0;
var checkLoad=setInterval(function(){
waited+=300;
if(AndroidAPI.isRewardedAdLoaded()){
clearInterval(checkLoad);
notif('Реклама готова!','#4caf50',1000);
setTimeout(function(){AndroidAPI.showRewardedAd();},500);
}else if(waited>=5000){
clearInterval(checkLoad);
notif('Не удалось загрузить рекламу','#f44336',2500);
sndError();
if(navigator.vibrate)navigator.vibrate([100,50,100]);
}
},300);
}else{
AndroidAPI.showRewardedAd();
}
}catch(e){
notif('Не удалось загрузить рекламу','#f44336',2500);
sndError();
}
}window.addEventListener('rewardEarned',function(event){
var amount=1;
if(event&&event.detail&&event.detail.amount)amount=event.detail.amount;
for(var i=0;i<amount;i++)addAdCoin();
});
function mkDot(){
if(!g.play||g.pause)return;
var r=Math.random(),t;
if(g.level>=9&&r<g.kc)t='bk';
else if(g.level>=5&&r<g.kc+g.hc)t='hp';
else if(g.level>=5&&r<g.kc+g.hc+g.pc)t='pu';
else if(g.level>=2&&r<g.kc+g.hc+g.pc+g.bmc)t='bm';
else if(r<g.kc+g.hc+g.pc+g.bmc+g.rc)t='r';
else if(r<g.kc+g.hc+g.pc+g.bmc+g.rc+g.oc)t='o';
else if(r<g.kc+g.hc+g.pc+g.bmc+g.rc+g.oc+g.bc)t='bl';
else t='g';
var d=document.createElement('div');
d.className='d '+t;
var fw=f.clientWidth;
d.style.left=(10+Math.random()*Math.max(0,fw-88))+'px';
var dur=g.fmin+Math.random()*(g.fmax-g.fmin);
d.style.animation='fl '+dur+'s linear forwards';
var tap=0;
var h=function(e){
if(tap)return;
if(!g.play||g.pause||!d.parentNode)return;
e.preventDefault();e.stopPropagation();tap=1;
var rect=d.getBoundingClientRect();
var cx=rect.left+rect.width/2,cy=rect.top+rect.height/2;
d.style.transition='all .15s';
d.style.transform='scale(1.5)';
d.style.opacity='0';
if(t==='r'){
hitP(1);particles(cx,cy,'#f44336');setTimeout(function(){rmD(d);},150);
}
else if(t==='pu'){
hitP(2);particles(cx,cy,'#9c27b0');starBurst(cx,cy,'#9c27b0');flashRed('pu');setTimeout(function(){rmD(d);},150);
}
else if(t==='bk'){
hitP(99);particles(cx,cy,'#000');starBurst(cx,cy,'#f00');flashRed();setTimeout(function(){rmD(d);},150);
}
else if(t==='bm'){
explodeBombs(cx,cy);particles(cx,cy,'#ff6600');starBurst(cx,cy,'#ffcc00');setTimeout(function(){rmD(d);},150);
}
else if(t==='hp'){
healP();particles(cx,cy,'#ff3b5c');starBurst(cx,cy,'#ffb3c1');setTimeout(function(){rmD(d);},150);
}
else if(t==='g'){
addCombo();addS(10);sndGreen();particles(cx,cy,'#4caf50');starBurst(cx,cy,'#a5ffa5');setTimeout(function(){rmD(d);},150);
}
else if(t==='o'){
addS(5);sndOrange();particles(cx,cy,'#ff9800');setTimeout(function(){rmD(d);},150);
}
else if(t==='bl'){
freeze();particles(cx,cy,'#2196f3');starBurst(cx,cy,'#a5d8ff');setTimeout(function(){rmD(d);},150);
}
};
d.addEventListener('touchstart',h,{passive:false});
d.addEventListener('mousedown',h);
setTimeout(function(){if(d.parentNode)rmD(d);},dur*1000+200);
f.appendChild(d);
requestAnimationFrame(function(){ d.classList.add('show'); });
g.dots.push(d);
var cc=setInterval(function(){
if(!g.play||g.pause||!d.parentNode){clearInterval(cc);return;}
chk(d,t,cc);
},50);
}
function healP(){
sndHeart();
if(g.lives<3){
g.lives++;
updHUD();
notif('+1 ЖИЗНЬ!','#ff3b5c');
if(navigator.vibrate)navigator.vibrate([50,30,50]);
}else{
addS(20);
notif('+20 ОЧКОВ!','#ff3b5c');
}
}
function explodeBombs(cx,cy){
addS(20);
sndBomb();
var all=f.querySelectorAll('.d.r');
for(var i=0;i<all.length;i++){
(function(el){
var rect=el.getBoundingClientRect();
particles(rect.left+rect.width/2,rect.top+rect.height/2,'#f44336');
el.style.display='none';
rmD(el);
})(all[i]);
}
var all2=f.querySelectorAll('.d.pu');
for(var j=0;j<all2.length;j++){
(function(el){
var rect=el.getBoundingClientRect();
particles(rect.left+rect.width/2,rect.top+rect.height/2,'#9c27b0');
el.style.display='none';
rmD(el);
})(all2[j]);
}
notif('БОМБА!','#ff6600');
if(navigator.vibrate)navigator.vibrate([50,30,50]);
}
function animD(d){rmD(d);}
function rmD(d){
if(d&&d.parentNode){d.style.display='none';d.parentNode.removeChild(d);}
var i=g.dots.indexOf(d);
if(i>-1)g.dots.splice(i,1);
}
function chk(d,t,ci){
if(!g.ball||!d.parentNode){clearInterval(ci);return;}
var b=g.ball.getBoundingClientRect(),dr=d.getBoundingClientRect();
if(b.top<dr.bottom&&b.right>dr.left&&b.bottom>dr.top&&b.left<dr.right){
if(t==='r'){hitP(1);clearInterval(ci);}
else if(t==='pu'){hitP(2);flashRed('pu');clearInterval(ci);}
else if(t==='bk'){hitP(99);flashRed();clearInterval(ci);}
}
}
function addS(a){
var mult=g.combo>1?g.combo:1;
g.score+=a*mult;g.ls+=a*mult;
updHUD();
updLvBar();
if(!g.bossL&&g.ls>=g.target)completeL();
}
function hitP(n){
if(!g.play||g.pause)return;
if(g.ball&&g.ball.className.indexOf('iv')>-1)return;
g.lives-=n;
if(g.lives<0)g.lives=0;
g.combo=1;cb.style.display='none';updHUD();flashRed();sndHurt();
if(g.lives<=0){sndDeath();endG();return;}
if(g.ball){
g.ball.className=ballClass()+' iv';
if(g.invulnTimer)clearTimeout(g.invulnTimer);
g.invulnTimer=setTimeout(function(){
if(g.ball&&g.ball.parentNode){
g.ball.className=ballClass();
}
g.invulnTimer=null;
},1500);
}
if(navigator.vibrate)navigator.vibrate(100);
}
function spawnBoss(){
g.bossL=1;
g.bossType=Math.floor((g.level-1)/4)+1;
if(g.bossType>5)g.bossType=5;
var hpMult=1+(g.bossType-1)*0.5;
g.bh=Math.round((100+(g.level-1)*25)*hpMult);
g.mbh=g.bh;
createBossElement(g.bossType,50);
}
function createBossElement(type,pos){
var b=document.createElement('div');
b.className='bs';
b.textContent=type>=5?'BOSS 5':'BOSS '+type;
b.style.left=pos+'%';
b.style.transform='translateX(-50%)';
if(type===2){b.style.background='radial-gradient(circle at 30% 30%,#a5d8ff,#1976d2)';b.style.borderColor='#4fc3f7';}
else if(type===3){b.style.background='radial-gradient(circle at 30% 30%,#d6a5ff,#6a1b9a)';b.style.borderColor='#9c27b0';}
else if(type>=4){b.style.background='radial-gradient(circle at 30% 30%,#ff9800,#bf360c)';b.style.borderColor='#ff9800';}
f.appendChild(b);
g.boss=b;
bh.style.display='block';
updBH();
var h=function(e){
if(!g.play||g.pause||!g.boss)return;
e.preventDefault();e.stopPropagation();
var dmg=10*(g.combo>1?g.combo:1);
g.bh-=dmg;
b.className='bs h';
setTimeout(function(){if(b.parentNode)b.className='bs';},200);
updBH();
if(navigator.vibrate)navigator.vibrate(30);
if(g.bh<=0)defeatB();
};
b.addEventListener('touchstart',h,{passive:false});
b.addEventListener('mousedown',h);
var dir=1,localPos=pos;
var moveSpeed=g.bossType===3?1.0:(g.bossType>=4?1.3:0.6);
g.bmi=setInterval(function(){
if(!g.play||g.pause||!g.boss)return;
localPos+=dir*moveSpeed;
if(localPos>75)dir=-1;
if(localPos<25)dir=1;
if(g.boss)g.boss.style.left=localPos+'%';
},30);
if(g.bossType===2){
g.bmi2=setInterval(function(){
if(!g.play||g.pause||!g.boss)return;
var newPos=15+Math.random()*70;
if(g.boss)g.boss.style.left=newPos+'%';
},3500);
}
var sr=Math.max(600,1700-g.level*90);
if(g.bossType>=3)sr=Math.max(450,sr-200);
g.bsi=setInterval(function(){
if(!g.play||g.pause||!g.boss)return;
shootP();
},sr);
}
function shootP(){
if(!g.boss)return;
var count=1;
if(g.bossType===2)count=2;
else if(g.bossType===3)count=3;
else if(g.bossType===4)count=2;
else if(g.bossType>=5)count=4;
for(var k=0;k<count;k++){
(function(offset){
var p=document.createElement('div');
p.className='pr';
var br=g.boss.getBoundingClientRect(),fr=f.getBoundingClientRect();
var px=br.left-fr.left+br.width/2-15+offset;
p.style.left=px+'px';
p.style.top=(br.bottom-fr.top)+'px';
f.appendChild(p);
g.prs.push(p);
var sp=3.5+g.level*.3;
var y=br.bottom-fr.top;
var vx=offset*0.8;
var mi=setInterval(function(){
if(!g.play||g.pause||!p.parentNode){clearInterval(mi);return;}
y+=sp;
var curLeft=parseFloat(p.style.left)+vx;
p.style.left=curLeft+'px';
p.style.top=y+'px';
if(g.ball){
var blr=g.ball.getBoundingClientRect(),pr=p.getBoundingClientRect();
if(pr.top<blr.bottom&&pr.right>blr.left&&pr.bottom>blr.top&&pr.left<blr.right){
hitP(1);rmP(p);clearInterval(mi);return;
}
}
if(y>fr.height+50||curLeft<-50||curLeft>fr.width+50){rmP(p);clearInterval(mi);}
},16);
})((k-(count-1)/2)*40);
}
}
function rmP(p){
if(p&&p.parentNode){p.style.display='none';p.parentNode.removeChild(p);}
var i=g.prs.indexOf(p);
if(i>-1)g.prs.splice(i,1);
}
function updBH(){bhf.style.width=Math.max(0,(g.bh/g.mbh)*100)+'%';}
function defeatB(){
if(g.boss){
var br=g.boss.getBoundingClientRect(),fr=f.getBoundingClientRect();
var cx=br.left-fr.left+br.width/2,cy=br.top-fr.top+br.height/2;
particles(cx,cy,'#ff9800');
particles(cx,cy,'#ffd700');
particles(cx,cy,'#f44336');
starBurst(cx,cy,'#fff');
if(g.bossType===5&&g.bh<=0){
if(g.boss.parentNode){g.boss.style.display='none';g.boss.parentNode.removeChild(g.boss);}
g.boss=null;
if(g.bmi2)clearInterval(g.bmi2);
addS(50);
notif('БОСС ДЕЛИТСЯ!','#ff6600');
sndBossDie();
setTimeout(function(){
if(!g.play)return;
g.bossType=2;
g.bh=Math.round(g.mbh*0.4);
g.mbh=g.bh;
createBossElement(2,30);
},500);
setTimeout(function(){
if(!g.play)return;
createBossElement(2,70);
},700);
return;
}
if(g.boss.parentNode){g.boss.style.display='none';g.boss.parentNode.removeChild(g.boss);}
g.boss=null;
if(g.bmi2)clearInterval(g.bmi2);
}
if(navigator.vibrate)navigator.vibrate([100,50,100,50,200]);
sndBossDie();
addS(100);
completeL();
}
function startL(n){
g.level=n;g.curLvl=n;g.ls=0;g.bossL=0;g.play=1;g.pause=0;g.combo=1;cb.style.display='none';
resetF();
var bossesBeaten=Math.floor((n-1)/4);
g.target=100+Math.floor(bossesBeaten/10)*10;
g.spawnRate=Math.max(380,950-n*55);
g.fmin=Math.max(1,1.9-n*.09);
g.fmax=Math.max(2,3.6-n*.13);
g.rc=Math.min(0.35,0.28+n*0.005);
g.oc=Math.min(0.30,0.25+n*0.003);
g.bc=0.06;
g.bmc=n>=2?0.04:0;
g.pc=n>=5?Math.min(0.10,0.03+(n-4)*0.01):0;
g.kc=n>=9?0.03:0;
g.hc=n>=5?0.05:0;
bh.style.display='none';
g.ball=document.createElement('div');
g.ball.className=ballClass();
g.bp=50;tp=50;
f.appendChild(g.ball);
var r=f.getBoundingClientRect();
g.ball.style.left=(r.width/2-31)+'px';
g.ml=requestAnimationFrame(mvBall);
g.si=setInterval(mkDot,g.spawnRate);
notif('Уровень '+n);
updHUD();
updLvBar();
}
function completeL(){
g.play=0;
clrAll();
clearInvuln();
sndLevelUp();
var all=f.querySelectorAll('.d,.pr');
for(var i=0;i<all.length;i++){if(all[i].parentNode)all[i].parentNode.removeChild(all[i]);}
if(g.boss&&g.boss.parentNode)g.boss.parentNode.removeChild(g.boss);
g.boss=null;
bh.style.display='none';
if(lvBar)lvBar.style.display='none';
var earned=Math.floor(g.ls/100);
coins+=earned;
if(g.level>=maxLevel&&maxLevel<TOTAL)maxLevel=g.level+1;
if(maxLevel>TOTAL)maxLevel=TOTAL;
if(g.score>best)best=g.score;
save();updBest();renderMap();
addRecord(g.score,g.level);
$('ls').textContent=g.score;
$('lc-coins').textContent=earned;
$('nl').textContent=g.level+1;
lc.className='ov s';
}
function nextL(){
lc.className='ov';
var n=g.level+1;
if(n>maxLevel)n=maxLevel;
if(isBoss(n))startBL(n);else startL(n);
}
function startBL(n){
g.level=n;g.curLvl=n;g.bossL=1;g.play=1;g.pause=0;g.ls=0;g.combo=1;cb.style.display='none';
resetF();
g.ball=document.createElement('div');
g.ball.className=ballClass();
g.bp=50;tp=50;
f.appendChild(g.ball);
var r=f.getBoundingClientRect();
g.ball.style.left=(r.width/2-31)+'px';
g.ml=requestAnimationFrame(mvBall);
spawnBoss();
g.si=setInterval(mkDot,1600);
notif('БОСС '+g.bossType+'!','#ff6b6b');
updHUD();
if(lvBar)lvBar.style.display='none';
}
function resetF(){
clrAll();
clearInvuln();
var all=f.querySelectorAll('.d,.pr,.bs,.b');
for(var i=0;i<all.length;i++){if(all[i].parentNode)all[i].parentNode.removeChild(all[i]);}
if(fxLayer)fxLayer.innerHTML='';
g.dots=[];g.prs=[];g.boss=null;g.ball=null;
bh.style.display='none';
if(lvBar)lvBar.style.display='none';
g.slow=0;
if(g.freezeTimer)clearTimeout(g.freezeTimer);
}
function updHUD(){
sc.textContent=g.score;
lv.textContent='Ур. '+g.level+(g.bossL?' BOSS':'');
if(heartsEl){
heartsEl.innerHTML='';
for(var i=0;i<3;i++){
var h=document.createElement('div');
h.className='heart'+(i<g.lives?'':' lost');
heartsEl.appendChild(h);
}
}
}
function notif(t,c,dur){
c=c||'#ffd700';
dur=dur||1500;
nt.textContent=t;
nt.style.color=c;
nt.style.textShadow='0 0 40px '+c+', 0 0 80px '+c;
nt.style.fontSize='clamp(2rem,11vw,3.5rem)';
nt.style.fontWeight='900';
nt.className='s';
setTimeout(function(){nt.className='';},dur);
}
function clrAll(){
if(g.si)clearInterval(g.si);
if(g.bsi)clearInterval(g.bsi);
if(g.bmi)clearInterval(g.bmi);
if(g.bmi2)clearInterval(g.bmi2);
if(g.ml)cancelAnimationFrame(g.ml);
g.si=null;g.bsi=null;g.bmi=null;g.bmi2=null;g.ml=null;
}
function togP(){
if(!g.play)return;
g.pause=!g.pause;
if(g.pause)pz.className='ov s';
else{pz.className='ov';g.ml=requestAnimationFrame(mvBall);}
}
pb.addEventListener('touchstart',function(e){e.preventDefault();togP();},{passive:false});
pb.addEventListener('click',function(e){e.preventDefault();togP();});
function endG(){
g.play=0;
clrAll();
clearInvuln();
var nr=0;
if(g.score>best){best=g.score;nr=1;}
save();updBest();
addRecord(g.score,g.level);
$('fs').textContent=g.score;
$('fl').textContent=g.level;
$('nr').style.display=nr?'block':'none';
go.className='ov s';
var all=f.querySelectorAll('.d,.pr');
for(var i=0;i<all.length;i++){if(all[i].parentNode)all[i].parentNode.removeChild(all[i]);}
if(g.boss&&g.boss.parentNode)g.boss.parentNode.removeChild(g.boss);
if(fxLayer)fxLayer.innerHTML='';
g.boss=null;
if(lvBar)lvBar.style.display='none';
}
function bind(id,h){
var el=$(id);
if(!el)return;
el.addEventListener('click',function(e){e.preventDefault();h();});
el.addEventListener('touchend',function(e){e.preventDefault();e.stopPropagation();h();},{passive:false});
}
bind('rbtn',function(){mn.className='ov';rl.className='ov s';});
bind('rbbtn',function(){rl.className='ov';mn.className='ov s';renderMap();});
bind('shop-btn',function(){mn.className='ov';$('shop').className='ov s';updCoins();renderShop();});
bind('shop-back',function(){$('shop').className='ov';mn.className='ov s';renderMap();updBest();});
bind('rec-btn',function(){mn.className='ov';$('rec').className='ov s';renderRecords();});
bind('rec-back',function(){$('rec').className='ov';mn.className='ov s';});
bind('ad-btn',function(){showAd();});
bind('ad-btn-go',function(){showAd();});
bind('sound-btn',function(){toggleSound();});
bind('xbtn',function(){cf.className='s';});
bind('cyes',function(){maxLevel=1;best=0;coins=0;currentSkin='default';ownedSkins={default:1};records=[];adCoinsToday=0;adDateToday='';save();cf.className='';renderMap();updBest();});
bind('cno',function(){cf.className='';});
bind('rsbtn',function(){go.className='ov';g.score=0;g.lives=3;startFromMenu(g.curLvl);});
bind('bmbtn',function(){go.className='ov';mn.className='ov s';renderMap();updBest();});
bind('nxbtn',nextL);
bind('lcmbtn',function(){lc.className='ov';mn.className='ov s';renderMap();updBest();});
bind('resbtn',togP);
bind('pmbtn',function(){pz.className='ov';g.pause=0;g.play=0;clrAll();clearInvuln();resetF();mn.className='ov s';renderMap();updBest();});
renderMap();
updBest();
updCoins();
updSoundBtn();
})();
</script>
</body>
</html>Game Source: ТапШар
Creator: SuperOtter20
Libraries: none
Complexity: complex (1029 lines, 46.3 KB)
The full source code is displayed above on this page.
Remix Instructions
To remix this game, copy the source code above and modify it. Add a ARCADELAB header at the top with "remix_of: game-superotter20" to link back to the original. Then publish at arcadelab.ai/publish.