<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="https://www.pandoraburo.ru/" xml:lang="ru">
  <id>https://www.pandoraburo.ru/tanki-modernizirovannye-igra</id>
  <link href="https://www.pandoraburo.ru/tanki-modernizirovannye-igra.xml" rel="self"/>
  <title>Танки модернизированые</title>
  <subtitle type="html">
&lt;div class="bron-game" id="bronGame"&gt;
&lt;div class="bron-monitor" id="bronMonitor"&gt;&lt;div class="bron-screen" id="bronScreen"&gt;
&lt;canvas class="bron-cv" id="bronCv"&gt;&lt;/canvas&gt;
&lt;div class="bron-arena-tag" id="bronArenaTag"&gt;НЕОН-СИТИ&lt;/div&gt;
&lt;div class="bron-hud"&gt;
  &lt;div class="bron-blk"&gt;❤ &lt;span class="bron-lives" id="bronLives"&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;div class="bron-blk"&gt;РАУНД &lt;span class="bron-b" id="bronRound"&gt;1&lt;/span&gt;&lt;/div&gt;
  &lt;div class="bron-blk"&gt;★ &lt;span class="bron-b" id="bronScore"&gt;0&lt;/span&gt;&lt;span class="bron-mult" id="bronMult" style="display:none!important;margin-left:6px!important"&gt;×2&lt;/span&gt;&lt;/div&gt;
  &lt;div class="bron-blk"&gt;☠ &lt;span class="bron-foes" id="bronFoes"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="bron-bossbar" id="bronBossbar"&gt;&lt;i class="bron-bossfill" id="bronBossfill"&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class="bron-minimap" id="bronMinimap"&gt;&lt;span class="bron-ml"&gt;ОЧЕРЕДЬ&lt;/span&gt;&lt;/div&gt;
&lt;div class="bron-combo" id="bronCombo"&gt;&lt;span class="bron-comboNum" id="bronComboNum"&gt;0&lt;/span&gt;&lt;br /&gt;&lt;span class="bron-comboLbl"&gt;СЕРИЯ&lt;/span&gt;&lt;/div&gt;
&lt;div class="bron-ach-wrap" id="bronAchWrap"&gt;&lt;/div&gt;
&lt;div class="bron-fxred" id="bronFxred"&gt;&lt;/div&gt;&lt;div class="bron-fxgold" id="bronFxgold"&gt;&lt;/div&gt;&lt;div class="bron-fxblue" id="bronFxblue"&gt;&lt;/div&gt;&lt;div class="bron-fxpickup" id="bronFxpickup"&gt;&lt;/div&gt;
&lt;div class="bron-fade" id="bronFade"&gt;&lt;/div&gt;

&lt;div class="bron-ov bron-show bron-menuOv" id="bronMenuOv"&gt;
  &lt;div class="bron-h1"&gt;БРОНЕНОСЕЦ&lt;/div&gt;
  &lt;div class="bron-h2 bron-sub"&gt;⚡ ЖИВАЯ СТАЛЬ · v10 ⚡&lt;/div&gt;
  &lt;div class="bron-p"&gt;Оружие: &lt;span class="bron-b"&gt;1&lt;/span&gt; пушка · &lt;span class="bron-b"&gt;2&lt;/span&gt; пулемёт · &lt;span class="bron-b"&gt;3&lt;/span&gt; лазер (перегрев).&lt;br /&gt;Ядро дрона → &lt;span class="bron-b"&gt;стрелок / щит&lt;/span&gt;.&lt;br /&gt;Враги: ? дроны · ? минёр · ? миномёт · ? щитовой · ? саппорт.&lt;/div&gt;
  &lt;div class="bron-keys"&gt;&lt;span&gt;WASD / Стрелки&lt;/span&gt;&lt;span&gt;Пробел / Кнопка&lt;/span&gt;&lt;span&gt;1 / 2 / 3 оружие&lt;/span&gt;&lt;span&gt;F11 / ⛶ полный экран&lt;/span&gt;&lt;/div&gt;
  &lt;div class="bron-toplist"&gt;&lt;div class="bron-topH3"&gt;★ РЕКОРДЫ&lt;/div&gt;&lt;div class="bron-toprows" id="bronToprows"&gt;&lt;/div&gt;&lt;/div&gt;
  &lt;div class="bron-btn bron-pulse" id="bronStartBtn" role="button" tabindex="0" onclick="window.bronStart &amp;amp;&amp;amp; window.bronStart()"&gt;▶ В БОЙ&lt;/div&gt;
  &lt;div class="bron-hint"&gt;НАЖМИ, ЧТОБЫ НАЧАТЬ&lt;/div&gt;
  &lt;div class="bron-btn bron-achBtn" id="bronAchBtn" role="button" tabindex="0" onclick="window.bronShowAch &amp;amp;&amp;amp; window.bronShowAch()"&gt;★ ДОСТИЖЕНИЯ&lt;/div&gt;
&lt;/div&gt;

&lt;div class="bron-ov bron-introOv" id="bronIntroOv"&gt;&lt;div class="bron-h2" id="bronIntroT"&gt;РАУНД 1&lt;/div&gt;&lt;div class="bron-p" id="bronIntroP"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="bron-ov bron-endOv" id="bronEndOv"&gt;&lt;div class="bron-h2" id="bronEndT"&gt;РАУНД ЗАЧИЩЕН ✦&lt;/div&gt;&lt;div class="bron-p" id="bronEndP"&gt;&lt;/div&gt;&lt;div class="bron-cd" id="bronCd"&gt;3&lt;/div&gt;&lt;/div&gt;

&lt;div class="bron-ov bron-overOv" id="bronOverOv"&gt;
  &lt;div class="bron-h2 bron-rd"&gt;☠ ТАНК ПОДБИТ&lt;/div&gt;
  &lt;div class="bron-stat"&gt;
    &lt;div&gt;&lt;span class="bron-statB" id="bronSK"&gt;0&lt;/span&gt;&lt;span&gt;убито&lt;/span&gt;&lt;/div&gt;
    &lt;div&gt;&lt;span class="bron-statB" id="bronSA"&gt;0%&lt;/span&gt;&lt;span&gt;точность&lt;/span&gt;&lt;/div&gt;
    &lt;div&gt;&lt;span class="bron-statB" id="bronSR"&gt;1&lt;/span&gt;&lt;span&gt;раунд&lt;/span&gt;&lt;/div&gt;
    &lt;div&gt;&lt;span class="bron-statB" id="bronSS"&gt;0&lt;/span&gt;&lt;span&gt;очки&lt;/span&gt;&lt;/div&gt;
    &lt;div&gt;&lt;span class="bron-statB" id="bronSB"&gt;0&lt;/span&gt;&lt;span&gt;рекорд&lt;/span&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="bron-overBtns"&gt;
    &lt;div class="bron-btn bron-alt" id="bronAgainBtn" role="button" tabindex="0" onclick="window.bronStart &amp;amp;&amp;amp; window.bronStart()"&gt;⟳ ЗАНОВО&lt;/div&gt;
    &lt;div class="bron-btn" id="bronMenuBtn" role="button" tabindex="0" onclick="window.bronMenu &amp;amp;&amp;amp; window.bronMenu()"&gt;МЕНЮ&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="bron-ov bron-pauseOv" id="bronPauseOv"&gt;&lt;div class="bron-h2"&gt;⏸ ПАУЗА&lt;/div&gt;&lt;div class="bron-btn bron-cy" id="bronResBtn" role="button" tabindex="0" onclick="window.bronResume &amp;amp;&amp;amp; window.bronResume()"&gt;▶ ПРОДОЛЖИТЬ&lt;/div&gt;&lt;/div&gt;

&lt;div class="bron-ov bron-achOv" id="bronAchOv"&gt;
  &lt;div class="bron-h2"&gt;★ ДОСТИЖЕНИЯ&lt;/div&gt;
  &lt;div class="bron-p"&gt;Открыто &lt;span class="bron-b" id="bronAchCnt"&gt;0&lt;/span&gt;/9&lt;/div&gt;
  &lt;div class="bron-achList" id="bronAchList"&gt;&lt;/div&gt;
  &lt;div class="bron-btn" id="bronAchClose" role="button" tabindex="0" onclick="window.bronCloseAch &amp;amp;&amp;amp; window.bronCloseAch()"&gt;✖ ЗАКРЫТЬ&lt;/div&gt;
&lt;/div&gt;

&lt;div class="bron-wbtns" id="bronWbtns"&gt;&lt;span class="bron-wl"&gt;ОРУЖИЕ&lt;/span&gt;
  &lt;div class="bron-wbtn bron-on bron-w1" id="bronW1" role="button" tabindex="0" onclick="window.bronSetW &amp;amp;&amp;amp; window.bronSetW('cannon')"&gt;1&lt;/div&gt;
  &lt;div class="bron-wbtn bron-w2" id="bronW2" role="button" tabindex="0" onclick="window.bronSetW &amp;amp;&amp;amp; window.bronSetW('mg')"&gt;2&lt;/div&gt;
  &lt;div class="bron-wbtn bron-w3" id="bronW3" role="button" tabindex="0" onclick="window.bronSetW &amp;amp;&amp;amp; window.bronSetW('laser')"&gt;3&lt;/div&gt;
&lt;/div&gt;
&lt;div class="bron-heatwrap" id="bronHeatwrap"&gt;&lt;div class="bron-heatfill" id="bronHeatfill"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="bron-joy" id="bronJoy"&gt;&lt;div class="bron-stick" id="bronStick"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="bron-fire" id="bronFire" role="button" tabindex="0"&gt;☠ ОГОНЬ&lt;/div&gt;
&lt;div class="bron-musbtn" id="bronMusbtn" role="button" tabindex="0" onclick="window.bronToggleMusic &amp;amp;&amp;amp; window.bronToggleMusic()"&gt;♫ ЗВУК&lt;/div&gt;
&lt;button class="bron-fsbtn" id="bronFsbtn" title="Полный экран (F11)"&gt;⛶&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;style&gt;
/* ═══════════ БРОНЕНОСЕЦ v10 · ВСЕ !important ═══════════ */
.bron-game { position: relative !important; width: 100% !important; max-width: 960px !important; margin: 20px auto !important; font-family: 'Courier New', monospace !important; color: #00f0ff !important; padding: 0 !important; border: 0 !important; outline: 0 !important; background: transparent !important; box-sizing: border-box !important; }
.bron-game * { margin: 0 !important; padding: 0 !important; box-sizing: border-box !important; -webkit-tap-highlight-color: transparent !important; font-family: 'Courier New', monospace !important; border: 0 !important; outline: 0 !important; text-transform: none !important; letter-spacing: normal !important; }
.bron-game div, .bron-game span { background: transparent !important; }

.bron-monitor { position: relative !important; width: 100% !important; aspect-ratio: 960/608 !important; background: #1a0030 !important; display: flex !important; align-items: center !important; justify-content: center !important; border-radius: 8px !important; overflow: hidden !important; box-shadow: 0 0 40px rgba(0,240,255,.25) !important; border: 0 !important; }
.bron-screen { position: relative !important; width: 100% !important; height: 100% !important; background: #02000a !important; overflow: hidden !important; }
.bron-cv { position: absolute !important; inset: 0 !important; width: 100% !important; height: 100% !important; display: block !important; touch-action: none !important; border: 0 !important; }

.bron-h1 { font-size: clamp(28px,8vw,54px) !important; color: #00f0ff !important; text-shadow: 0 0 18px #00f0ff, 0 0 40px #ff2d95 !important; letter-spacing: 3px !important; font-weight: 800 !important; margin: 0 !important; padding: 0 !important; text-transform: uppercase !important; }
.bron-h2 { font-size: clamp(18px,5vw,38px) !important; color: #00f0ff !important; text-shadow: 0 0 14px #00f0ff !important; letter-spacing: 2px !important; font-weight: 700 !important; margin: 0 !important; padding: 0 !important; }
.bron-sub { font-size: 16px !important; color: #ff2d95 !important; text-shadow: 0 0 10px #ff2d95 !important; }
.bron-p { color: #a0ffff !important; font-size: 14px !important; max-width: 90% !important; line-height: 1.6 !important; margin: 0 !important; padding: 0 !important; }
.bron-b { color: #ffd700 !important; text-shadow: 0 0 6px #ffd700 !important; font-weight: 800 !important; background: transparent !important; }
.bron-rd { color: #ff0040 !important; text-shadow: 0 0 18px #ff0040, 0 0 30px #ff2d95 !important; }

.bron-hud { position: absolute !important; top: 10px !important; left: 10px !important; right: 10px !important; z-index: 30 !important; display: flex !important; justify-content: space-between !important; align-items: center !important; gap: 8px !important; font-size: 12px !important; color: #00f0ff !important; text-shadow: 0 0 6px #00f0ff !important; pointer-events: none !important; flex-wrap: wrap !important; }
.bron-blk { border: 1px solid #003355 !important; padding: 5px 9px !important; border-radius: 4px !important; background: rgba(5,5,15,.85) !important; color: #00f0ff !important; }
.bron-lives { display: flex !important; gap: 4px !important; }
.bron-life { width: 18px !important; height: 12px !important; background: #00f0ff !important; box-shadow: 0 0 6px #00f0ff !important; clip-path: polygon(0 30%,30% 0,70% 0,100% 30%,100% 100%,70% 85%,50% 100%,30% 85%,0 100%) !important; display: inline-block !important; }
.bron-mult { color: #ffd700 !important; text-shadow: 0 0 6px #ffd700 !important; margin-left: 6px !important; }
.bron-foes { display: flex !important; gap: 2px !important; flex-wrap: wrap !important; max-width: 100px !important; }
.bron-foe { width: 6px !important; height: 6px !important; background: #ff0040 !important; box-shadow: 0 0 4px #ff0040 !important; display: inline-block !important; }

.bron-bossbar { position: absolute !important; top: 40px !important; left: 10% !important; right: 10% !important; height: 8px !important; border: 1px solid #003355 !important; border-radius: 4px !important; background: rgba(0,0,0,.6) !important; z-index: 30 !important; display: none !important; overflow: hidden !important; }
.bron-bossbar.bron-on { display: block !important; }
.bron-bossfill { display: block !important; height: 100% !important; background: linear-gradient(90deg,#ff0040,#ffd700,#00f0ff) !important; border-radius: 2px !important; transition: width .15s !important; box-shadow: 0 0 10px #ff0040 !important; }

.bron-minimap { position: absolute !important; top: 50px !important; right: 10px !important; z-index: 31 !important; background: rgba(5,5,15,.85) !important; border: 1px solid #003355 !important; border-radius: 6px !important; padding: 5px 7px !important; display: flex !important; gap: 4px !important; align-items: center !important; min-height: 26px !important; }
.bron-ml { font-size: 9px !important; color: #5a5f8a !important; margin-right: 5px !important; }
.bron-mi { width: 10px !important; height: 10px !important; border-radius: 2px !important; display: inline-block !important; }

.bron-ov { position: absolute !important; inset: 0 !important; z-index: 50 !important; display: none !important; align-items: center !important; justify-content: center !important; flex-direction: column !important; gap: 14px !important; text-align: center !important; padding: 20px !important; background: rgba(0,0,10,.9) !important; }
.bron-show { display: flex !important; }

.bron-btn { font-family: 'Courier New', monospace !important; font-size: 16px !important; background: transparent !important; color: #00f0ff !important; border: 2px solid #00f0ff !important; padding: 15px 30px !important; border-radius: 6px !important; cursor: pointer !important; text-shadow: 0 0 6px #00f0ff !important; box-shadow: 0 0 12px rgba(0,240,255,.5), 0 0 25px rgba(255,45,149,.2) !important; transition: all .2s !important; letter-spacing: 2px !important; margin-top: 10px !important; display: inline-block !important; text-transform: uppercase !important; font-weight: 700 !important; user-select: none !important; }
.bron-btn:hover { background: rgba(0,240,255,.15) !important; transform: scale(1.04) !important; box-shadow: 0 0 20px rgba(0,240,255,.7), 0 0 40px rgba(255,45,149,.3) !important; }
.bron-btn:active { transform: scale(0.95) !important; background: #00f0ff !important; color: #000 !important; }
.bron-alt { border-color: #ffd700 !important; color: #ffd700 !important; text-shadow: 0 0 6px #ffd700 !important; box-shadow: 0 0 12px rgba(255,215,0,.5) !important; }
.bron-alt:hover { background: rgba(255,215,0,.15) !important; box-shadow: 0 0 20px rgba(255,215,0,.7) !important; }
.bron-cy { border-color: #ff2d95 !important; color: #ff2d95 !important; text-shadow: 0 0 6px #ff2d95 !important; box-shadow: 0 0 12px rgba(255,45,149,.5) !important; }
.bron-cy:hover { background: rgba(255,45,149,.15) !important; box-shadow: 0 0 20px rgba(255,45,149,.7) !important; }

@keyframes bronPulse { 0%,100%{box-shadow:0 0 12px rgba(0,240,255,.4), 0 0 25px rgba(255,45,149,.2);transform:scale(1)} 50%{box-shadow:0 0 35px rgba(0,240,255,.95), 0 0 60px rgba(255,45,149,.6), 0 0 90px rgba(255,215,0,.3);transform:scale(1.06)} }
.bron-pulse { animation: bronPulse 1.2s infinite !important; }

.bron-keys { display: flex !important; gap: 6px !important; flex-wrap: wrap !important; justify-content: center !important; margin-bottom: 10px !important; }
.bron-keys span { border: 1px solid #003355 !important; padding: 6px 10px !important; border-radius: 4px !important; font-size: 10px !important; color: #a0ffff !important; background: rgba(5,5,15,.5) !important; }

.bron-stat { display: grid !important; grid-template-columns: repeat(2, 1fr) !important; gap: 8px !important; max-width: 300px !important; width: 100% !important; }
@media(min-width:600px) { .bron-stat { grid-template-columns: repeat(5, 1fr) !important; max-width: 500px !important; } }
.bron-stat div { border: 1px solid #003355 !important; padding: 10px !important; border-radius: 4px !important; background: rgba(5,5,15,.7) !important; }
.bron-statB { display: block !important; font-size: 18px !important; color: #ffd700 !important; text-shadow: 0 0 8px #ffd700 !important; font-weight: 800 !important; margin-bottom: 2px !important; }
.bron-stat span { font-size: 10px !important; color: #a0ffff !important; }
.bron-cd { font-size: 48px !important; color: #ffd700 !important; text-shadow: 0 0 18px #ffd700 !important; font-weight: 800 !important; }

.bron-fade { position: absolute !important; inset: 0 !important; background: #000 !important; opacity: 0 !important; pointer-events: none !important; z-index: 45 !important; transition: opacity .8s !important; }
.bron-fade.bron-on { opacity: 1 !important; }
.bron-fxred,.bron-fxgold,.bron-fxblue,.bron-fxpickup { position: absolute !important; inset: 0 !important; pointer-events: none !important; opacity: 0 !important; z-index: 42 !important; transition: opacity .2s !important; }
.bron-fxred { background: radial-gradient(ellipse at center,transparent 40%,rgba(255,0,64,.6)) !important; }
.bron-fxgold { background: radial-gradient(ellipse at center,transparent 40%,rgba(255,215,0,.55)) !important; }
.bron-fxblue { background: radial-gradient(ellipse at center,transparent 40%,rgba(0,240,255,.55)) !important; }
.bron-fxpickup { background: radial-gradient(ellipse at center,transparent 20%,rgba(255,255,255,.5)) !important; }

.bron-joy { position: absolute !important; left: 20px !important; bottom: 20px !important; width: 120px !important; height: 120px !important; border-radius: 50% !important; border: 2px solid rgba(0,240,255,.5) !important; background: rgba(0,240,255,.1) !important; z-index: 44 !important; display: none !important; touch-action: none !important; user-select: none !important; }
.bron-stick { position: absolute !important; left: 50% !important; top: 50% !important; width: 50px !important; height: 50px !important; margin: -25px 0 0 -25px !important; border-radius: 50% !important; background: rgba(0,240,255,.8) !important; box-shadow: 0 0 15px #00f0ff !important; pointer-events: none !important; transition: transform .1s !important; }
.bron-touch .bron-joy, .bron-touch .bron-fire { display: block !important; }
.bron-fire { position: absolute !important; right: 20px !important; bottom: 20px !important; width: 100px !important; height: 100px !important; border-radius: 50% !important; background: rgba(255,0,64,.25) !important; border: 2px solid #ff0040 !important; color: #ff0040 !important; font-size: 14px !important; z-index: 44 !important; display: none !important; text-shadow: 0 0 6px #ff0040 !important; box-shadow: 0 0 14px rgba(255,0,64,.6) !important; touch-action: none !important; user-select: none !important; cursor: pointer !important; font-family: 'Courier New', monospace !important; text-align: center !important; line-height: 100px !important; font-weight: 800 !important; }
.bron-fire:active { background: rgba(255,0,64,.55) !important; transform: scale(0.95) !important; }

.bron-wbtns { position: absolute !important; bottom: 24px !important; left: 50% !important; transform: translateX(-50%) !important; display: flex !important; gap: 8px !important; z-index: 44 !important; }
.bron-wbtn { width: 46px !important; height: 46px !important; border-radius: 10px !important; border: 2px solid #003355 !important; background: rgba(5,5,15,.85) !important; color: #a0ffff !important; font-size: 15px !important; font-weight: 700 !important; cursor: pointer !important; text-align: center !important; line-height: 42px !important; user-select: none !important; }
.bron-wbtn.bron-on { border-color: #00f0ff !important; color: #00f0ff !important; box-shadow: 0 0 10px rgba(0,240,255,.6) !important; background: rgba(0,240,255,.2) !important; }
.bron-wbtns .bron-wl { position: absolute !important; top: -16px !important; left: 0 !important; right: 0 !important; text-align: center !important; font-size: 9px !important; color: #5a5f8a !important; letter-spacing: 1px !important; }

.bron-heatwrap { position: absolute !important; bottom: 76px !important; left: 50% !important; transform: translateX(-50%) !important; width: 150px !important; height: 8px !important; border: 1px solid #003355 !important; border-radius: 4px !important; background: rgba(0,0,0,.6) !important; z-index: 44 !important; display: none !important; overflow: hidden !important; }
.bron-heatfill { height: 100% !important; width: 0 !important; background: linear-gradient(90deg,#3a86ff,#ffd700,#ff0040) !important; border-radius: 3px !important; transition: width .08s !important; }
@keyframes bronHot { from{filter:brightness(1)} to{filter:brightness(1.8)} }
.bron-heatwrap.bron-hot .bron-heatfill { animation: bronHot .3s infinite alternate !important; }

.bron-combo { position: absolute !important; bottom: 110px !important; left: 50% !important; transform: translateX(-50%) !important; z-index: 35 !important; font-size: 22px !important; font-weight: 800 !important; color: #ffd700 !important; text-shadow: 0 0 20px #ffd700 !important; pointer-events: none !important; opacity: 0 !important; transition: opacity .3s !important; text-align: center !important; }
.bron-combo.bron-show { opacity: 1 !important; }
.bron-comboNum { font-size: 36px !important; }
.bron-comboLbl { font-size: 14px !important; letter-spacing: 3px !important; color: #a0ffff !important; }

.bron-ach-wrap { position: absolute !important; top: 60px !important; left: 10px !important; z-index: 36 !important; display: flex !important; flex-direction: column !important; gap: 6px !important; pointer-events: none !important; max-width: 200px !important; }
.bron-ach { background: rgba(10,5,20,.95) !important; border: 1px solid #ffd700 !important; border-radius: 6px !important; padding: 8px 12px !important; color: #a0ffff !important; font-size: 11px !important; box-shadow: 0 0 14px rgba(255,215,0,.5) !important; display: flex !important; gap: 8px !important; align-items: center !important; animation: bronAchIn .4s ease-out !important; }
@keyframes bronAchIn { from{transform:translateX(-100%);opacity:0} to{transform:translateX(0);opacity:1} }
.bron-ach .bron-ico { font-size: 20px !important; }
.bron-ach .bron-tit { font-weight: 800 !important; color: #ffd700 !important; display: block !important; letter-spacing: 1px !important; }

.bron-toplist { margin-top: 16px !important; max-width: 90% !important; width: 100% !important; }
.bron-topH3 { font-size: 12px !important; color: #00f0ff !important; margin-bottom: 8px !important; letter-spacing: 2px !important; font-weight: 700 !important; text-transform: uppercase !important; text-shadow: 0 0 6px #00f0ff !important; }
.bron-toprow { display: flex !important; justify-content: space-between !important; padding: 6px 10px !important; border-bottom: 1px dashed #003355 !important; font-size: 12px !important; color: #a0ffff !important; }
.bron-toprow:first-child { color: #ffd700 !important; }
.bron-toprow span { font-weight: 600 !important; }

.bron-musbtn { position: absolute !important; bottom: 10px !important; left: 10px !important; z-index: 43 !important; font-size: 12px !important; padding: 8px 12px !important; background: rgba(5,5,15,.85) !important; border: 1px solid #003355 !important; color: #a0ffff !important; border-radius: 6px !important; cursor: pointer !important; letter-spacing: 1px !important; user-select: none !important; }
.bron-musbtn.bron-on { border-color: #ff2d95 !important; color: #ff2d95 !important; box-shadow: 0 0 10px rgba(255,45,149,.5) !important; }

.bron-arena-tag { position: absolute !important; top: 10px !important; left: 50% !important; transform: translateX(-50%) !important; z-index: 32 !important; font-size: 10px !important; padding: 4px 12px !important; border: 1px solid #003355 !important; border-radius: 4px !important; background: rgba(5,5,15,.85) !important; color: #a0ffff !important; letter-spacing: 2px !important; pointer-events: none !important; }

.bron-fsbtn { position: absolute !important; top: 8px !important; right: 8px !important; z-index: 45 !important; width: 42px !important; height: 42px !important; border-radius: 8px !important; background: rgba(5,5,15,.85) !important; border: 1px solid #003355 !important; color: #00f0ff !important; font-size: 20px !important; cursor: pointer !important; display: flex !important; align-items: center !important; justify-content: center !important; transition: all .2s !important; box-shadow: 0 0 10px rgba(0,240,255,.4) !important; user-select: none !important; }
.bron-fsbtn:hover { background: rgba(0,240,255,.2) !important; transform: scale(1.1) !important; box-shadow: 0 0 18px rgba(0,240,255,.8), 0 0 30px rgba(255,45,149,.4) !important; }
.bron-fsbtn:active { transform: scale(0.95) !important; }

.bron-hint { color: #a0ffff !important; font-size: 12px !important; margin-top: 10px !important; letter-spacing: 1px !important; }
.bron-achBtn { padding: 8px 16px !important; font-size: 10px !important; border-color: #b06cff !important; color: #b06cff !important; text-shadow: 0 0 6px #b06cff !important; box-shadow: 0 0 10px rgba(176,108,255,.4) !important; }
.bron-achList { display: grid !important; grid-template-columns: 1fr !important; gap: 8px !important; width: 90% !important; max-height: 60vh !important; overflow-y: auto !important; }
.bron-overBtns { display: flex !important; gap: 10px !important; flex-wrap: wrap !important; justify-content: center !important; margin-top: 15px !important; }

/* ═══════════ ПОЛНОЭКРАННЫЙ РЕЖИМ (по образцу v2) ═══════════ */
/* В игровом режиме прячем ВСЁ содержимое body кроме игры */
body.bron-game-mode { overflow: hidden !important; background: #000 !important; }
body.bron-game-mode &gt; *:not(.bron-game) { display: none !important; }
body.bron-game-mode &gt; *:not(.bron-game) * { display: none !important; }
/* Игра растягивается на весь экран поверх сайта */
body.bron-game-mode .bron-game {
  position: fixed !important; inset: 0 !important; z-index: 2147483647 !important;
  width: 100vw !important; height: 100vh !important; max-width: none !important; max-height: none !important; margin: 0 !important;
}
body.bron-game-mode .bron-monitor {
  position: fixed !important; inset: 0 !important;
  width: 100vw !important; height: 100vh !important;
  max-width: none !important; max-height: none !important;
  margin: 0 !important; z-index: 2147483647 !important;
  border-radius: 0 !important; aspect-ratio: auto !important;
}
body.bron-game-mode .bron-screen { width: 100% !important; height: 100% !important; }
/* Настоящий Fullscreen на самом мониторе */
.bron-monitor:fullscreen, .bron-monitor:-webkit-full-screen, .bron-monitor:-moz-full-screen, .bron-monitor:-ms-fullscreen {
  width: 100vw !important; height: 100vh !important;
  max-width: none !important; max-height: none !important;
  margin: 0 !important; padding: 0 !important; background: #000 !important;
  position: fixed !important; inset: 0 !important; z-index: 2147483647 !important;
  border-radius: 0 !important; aspect-ratio: auto !important;
}
&lt;/style&gt;

&lt;script&gt;
(function(){
"use strict";
console.log('? БРОНЕНОСЕЦ v10: загрузка...');
try {

var root = document.getElementById('bronGame');
if (!root) { alert('БРОНЕНОСЕЦ: контейнер #bronGame не найден!'); return; }
var $ = function(id) { return document.getElementById(id); };
var qAll = function(sel) { return Array.prototype.slice.call(root.querySelectorAll(sel)); };
if ('ontouchstart' in window || navigator.maxTouchPoints &gt; 0) root.classList.add('bron-touch');

var W = 960, H = 608;
var cv = $('bronCv'), ctx = cv.getContext('2d', { alpha: false });
function resize() {
  var parent = cv.parentElement;
  if (!parent) return;
  var rect = parent.getBoundingClientRect();
  if (rect.width &lt; 1 || rect.height &lt; 1) return;
  var dpr = Math.min(window.devicePixelRatio || 1, 2);
  cv.width = rect.width * dpr;
  cv.height = rect.height * dpr;
  ctx.setTransform(dpr * (rect.width / W), 0, 0, dpr * (rect.height / H), 0, 0);
}
addEventListener('resize', resize); resize();
setTimeout(resize, 100); setTimeout(resize, 300); setTimeout(resize, 800);

var R = function(a, b) { return a + Math.random() * (b - a); };
var RI = function(a, b) { return Math.floor(R(a, b + 1)); };
var clamp = function(v, a, b) { return v &lt; a ? a : v &gt; b ? b : v; };
var hyp = function(x, y) { return Math.sqrt(x * x + y * y); };
var angDiff = function(a, b) { var d = (b - a) % (Math.PI * 2); if (d &gt; Math.PI) d -= Math.PI * 2; if (d &lt; -Math.PI) d += Math.PI * 2; return d; };
function rr(x, y, w, h, r) { ctx.beginPath(); ctx.moveTo(x + r, y); ctx.arcTo(x + w, y, x + w, y + h, r); ctx.arcTo(x + w, y + h, x, y + h, r); ctx.arcTo(x, y + h, x, y, r); ctx.arcTo(x, y, x + w, y, r); ctx.closePath(); }

/* ═══ ARENAS ═══ */
var ARENAS = [
  { name: 'НЕОН-СИТИ', bg1: '#0a0025', bg2: '#02000a', gridC: 'rgba(0,240,255,.08)', brick: '#3a0050', brickBrd: '#ff2d95', steel: '#1a0030', steelBrd: '#ff006e', decoC: 'rgba(255,45,149,', dustC: '#3a0040', starC: '#ff80c0' },
  { name: 'ЗОЛОТАЯ ПУСТЫНЯ', bg1: '#2a1f0e', bg2: '#0f0a02', gridC: 'rgba(255,215,0,.08)', brick: '#6a4a10', brickBrd: '#ffd700', steel: '#3a2a08', steelBrd: '#c9a227', decoC: 'rgba(255,215,0,', dustC: '#5a3a10', starC: '#ffe850' },
  { name: 'РУБИНОВЫЙ КАНЬОН', bg1: '#250010', bg2: '#0a0005', gridC: 'rgba(255,0,64,.08)', brick: '#5a0020', brickBrd: '#ff0040', steel: '#2a0010', steelBrd: '#c41e3a', decoC: 'rgba(255,0,64,', dustC: '#4a0020', starC: '#ff6080' },
  { name: 'КИСЛОТНАЯ БАЗА', bg1: '#002530', bg2: '#000a10', gridC: 'rgba(0,240,255,.08)', brick: '#003a4a', brickBrd: '#00f0ff', steel: '#001a25', steelBrd: '#008aaa', decoC: 'rgba(0,240,255,', dustC: '#003040', starC: '#80ffff' }
];
var arenaIdx = 0, arena = ARENAS[0];
var CS = 32, GW = 30, GH = 19;

/* ═══ AUDIO ═══ */
var AC = null, muted = false, noiseBuf = null, musicOn = false, musicG = null, musicNodes = [], audioInit = false;
function initAudio() { if (audioInit) return; try { AC = new (window.AudioContext || window.webkitAudioContext)(); var b = AC.createBuffer(1, AC.sampleRate * 0.5, AC.sampleRate), d = b.getChannelData(0); for (var i = 0; i &lt; d.length; i++) d[i] = Math.random() * 2 - 1; noiseBuf = b; audioInit = true; if (AC.state === 'suspended') AC.resume(); } catch (e) {} }
function tone(f, d, type, v, f2, dl) { if (muted || !AC) return; try { var t = AC.currentTime + (dl || 0), o = AC.createOscillator(), g = AC.createGain(); o.type = type || 'square'; o.frequency.setValueAtTime(f, t); if (f2) o.frequency.exponentialRampToValueAtTime(Math.max(f2, 1), t + d); g.gain.setValueAtTime(v || .07, t); g.gain.exponentialRampToValueAtTime(.0001, t + d); o.connect(g); g.connect(AC.destination); o.start(t); o.stop(t + d); } catch (e) {} }
function noiz(d, v, fq, dl, tp) { if (muted || !AC || !noiseBuf) return; try { var t = AC.currentTime + (dl || 0), s = AC.createBufferSource(), g = AC.createGain(), f = AC.createBiquadFilter(); s.buffer = noiseBuf; f.type = tp || 'lowpass'; f.frequency.value = fq || 800; g.gain.setValueAtTime(v || .15, t); g.gain.exponentialRampToValueAtTime(.0001, t + d); s.connect(f); f.connect(g); g.connect(AC.destination); s.start(t); s.stop(t + d); } catch (e) {} }
var SFX = {
  shoot: function() { tone(300, .08, 'square', .05, 90); noiz(.05, .04, 3500); },
  mg: function() { tone(520, .05, 'square', .04, 140); },
  laser: function() { tone(900, .15, 'sawtooth', .05, 1800); },
  over: function() { noiz(.3, .12, 2000, 0, 'highpass'); },
  dshoot: function() { tone(700, .05, 'square', .03, 300); },
  eshoot: function() { tone(200, .09, 'square', .035, 70); },
  boom: function(s) { noiz(.45 * s, .22, 500); tone(100, .4, 'triangle', .16, 30); },
  brick: function() { noiz(.12, .1, 1200); },
  ping: function() { tone(1300, .05, 'square', .04, 900); },
  hurt: function() { noiz(.3, .2, 700); tone(160, .25, 'sawtooth', .12, 60); },
  life: function() { tone(660, .09, 'triangle', .08); tone(990, .12, 'triangle', .08, 0, .09); },
  pick: function() { tone(700, .07, 'square', .06); tone(1050, .09, 'square', .06, 0, .07); },
  laserAim: function() { tone(220, .8, 'sawtooth', .03, 1100); },
  mine: function() { tone(400, .1, 'square', .05, 200); },
  mortar: function() { tone(150, .5, 'sawtooth', .08, 60); noiz(.4, .15, 400); },
  heal: function() { tone(1200, .12, 'sine', .05); setTimeout(function() { tone(1600, .1, 'sine', .05); }, 80); },
  fanfare: function() { [523, 659, 784, 1047].forEach(function(f, i) { tone(f, .16, 'square', .08, 0, i * .12); }); },
  over2: function() { tone(300, .5, 'sawtooth', .1, 60); },
  bossAlert: function() { tone(180, .6, 'sawtooth', .08, 80); setTimeout(function() { tone(240, .6, 'sawtooth', .08, 80); }, 300); },
  ach: function() { tone(880, .08, 'triangle', .09); setTimeout(function() { tone(1320, .1, 'triangle', .09); }, 80); setTimeout(function() { tone(1760, .14, 'triangle', .09); }, 180); }
};
var BASS = [55, 55, 73.42, 73.42, 65.41, 65.41, 82.41, 82.41];
var ARP = [220, 330, 440, 660, 550, 440, 330, 220, 246, 370, 494, 740, 587, 494, 370, 246];
function startMusic() { if (musicOn || muted || !AC) return; musicG = AC.createGain(); musicG.gain.value = .07; musicG.connect(AC.destination); musicOn = true; var bpm = 108, beat = 60 / bpm, step = 0, t0 = AC.currentTime + .1; function sched() { if (!musicOn) return; var now = AC.currentTime; while (t0 &lt; now + 0.5) { var bs = step % 8, bo = AC.createOscillator(), bg = AC.createGain(); bo.type = 'sawtooth'; bo.frequency.value = BASS[bs]; bg.gain.setValueAtTime(0, t0); bg.gain.linearRampToValueAtTime(.18, t0 + .01); bg.gain.exponentialRampToValueAtTime(.001, t0 + beat * .9); var bf = AC.createBiquadFilter(); bf.type = 'lowpass'; bf.frequency.value = 300; bo.connect(bf); bf.connect(bg); bg.connect(musicG); bo.start(t0); bo.stop(t0 + beat); var as = step % 16, ao = AC.createOscillator(), ag = AC.createGain(); ao.type = 'triangle'; ao.frequency.value = ARP[as]; ag.gain.setValueAtTime(0, t0); ag.gain.linearRampToValueAtTime(.08, t0 + .005); ag.gain.exponentialRampToValueAtTime(.001, t0 + beat * .45); ao.connect(ag); ag.connect(musicG); ao.start(t0); ao.stop(t0 + beat * .5); t0 += beat / 2; step++; } musicNodes.push(setTimeout(sched, 80)); } sched(); }
function stopMusic() { musicOn = false; musicNodes.forEach(clearTimeout); musicNodes = []; if (musicG) { try { musicG.gain.exponentialRampToValueAtTime(.0001, AC.currentTime + .3); } catch (e) {} } }

/* ═══ ACH / TOP ═══ */
var ACHS = {
  firstBlood: { t: 'ПЕРВАЯ КРОВЬ', i: '★', d: 'Уничтожь первого врага' },
  bossKill: { t: 'ЦАРЕУБИЙЦА', i: '♛', d: 'Убей босса' },
  streak10: { t: 'ЖНЕЦ', i: '☠', d: 'Серия из 10 убийств' },
  nineLives: { t: 'КОШАЧИЙ ЦАРЬ', i: '♥', d: 'Накопи 9 жизней' },
  accuracy80: { t: 'СНАЙПЕР', i: '◎', d: 'Точность 80%+ за игру' },
  round10: { t: 'МАРАФОНЕЦ', i: '⚑', d: 'Дойди до 10 раунда' },
  round20: { t: 'ЛЕГЕНДА', i: '★', d: 'Дойди до 20 раунда' },
  score5k: { t: '5000', i: '◆', d: 'Набери 5000 очков' },
  allArenas: { t: 'СТРАННИК', i: '⚑', d: 'Побывай на всех 4 аренах' }
};
var achUnlocked = {}; try { achUnlocked = JSON.parse(localStorage.getItem('bron_ach_v10') || '{}'); } catch (e) { achUnlocked = {}; }
function saveAch() { try { localStorage.setItem('bron_ach_v10', JSON.stringify(achUnlocked)); } catch (e) {} }
function unlockAch(id) { if (achUnlocked[id]) return; achUnlocked[id] = Date.now(); saveAch(); var a = ACHS[id], el = document.createElement('div'); el.className = 'bron-ach'; el.innerHTML = '&lt;span class="bron-ico"&gt;' + a.i + '&lt;/span&gt;&lt;div&gt;&lt;span class="bron-tit"&gt;' + a.t + '&lt;/span&gt;&lt;span&gt;' + a.d + '&lt;/span&gt;&lt;/div&gt;'; $('bronAchWrap').appendChild(el); SFX.ach(); setTimeout(function() { el.remove(); }, 4000); renderAchList(); }
function renderAchList() { var list = $('bronAchList'); list.innerHTML = ''; var cnt = 0; Object.keys(ACHS).forEach(function(id) { var a = ACHS[id], on = !!achUnlocked[id]; if (on) cnt++; var d = document.createElement('div'); d.style.cssText = 'border:1px solid ' + (on ? '#ffd700' : '#003355') + '; padding:8px; border-radius:6px; background:rgba(5,5,15,.7); display:flex; gap:8px; align-items:center; color:' + (on ? '#a0ffff' : '#5a5f8a'); d.innerHTML = '&lt;span style="font-size:18px"&gt;' + (on ? a.i : '?') + '&lt;/span&gt;&lt;div&gt;&lt;span style="color:' + (on ? '#ffd700' : '#5a5f8a') + '; font-weight:800"&gt;' + a.t + '&lt;/span&gt;&lt;br&gt;&lt;span style="font-size:10px"&gt;' + a.d + '&lt;/span&gt;&lt;/div&gt;'; list.appendChild(d); }); $('bronAchCnt').textContent = cnt; }
window.bronShowAch = function() { initAudio(); renderAchList(); $('bronMenuOv').classList.remove('bron-show'); $('bronAchOv').classList.add('bron-show'); };
window.bronCloseAch = function() { $('bronAchOv').classList.remove('bron-show'); $('bronMenuOv').classList.add('bron-show'); };
var topScores = []; try { topScores = JSON.parse(localStorage.getItem('bron_top_v10') || '[]'); } catch (e) { topScores = []; }
function saveTop() { try { localStorage.setItem('bron_top_v10', JSON.stringify(topScores)); } catch (e) {} }
function addTopScore(s, k, r) { topScores.push({ s: s, k: k, r: r, d: new Date().toLocaleDateString('ru-RU', { day: '2-digit', month: '2-digit' }) }); topScores.sort(function(a, b) { return b.s - a.s; }); topScores = topScores.slice(0, 3); saveTop(); renderTopList(); }
function renderTopList() { var rows = $('bronToprows'); rows.innerHTML = ''; if (!topScores.length) { rows.innerHTML = '&lt;div class="bron-toprow" style="justify-content:center;color:#5a5f8a"&gt;пока пусто&lt;/div&gt;'; return; } var medals = ['★', '◆', '•']; topScores.forEach(function(t, i) { var d = document.createElement('div'); d.className = 'bron-toprow'; d.innerHTML = '&lt;span&gt;' + medals[i] + '&lt;/span&gt;&lt;span&gt;&lt;span style="font-weight:800"&gt;' + t.s + '&lt;/span&gt; очк · Р' + t.r + '&lt;/span&gt;&lt;span&gt;' + t.d + '&lt;/span&gt;'; rows.appendChild(d); }); }
renderAchList(); renderTopList();

/* ═══ STATE ═══ */
var state = 'menu', tSec = 0;
var grid = new Uint8Array(GW * GH), deco = [], bushes = [], craters = [], stars = [];
for (var i0 = 0; i0 &lt; 120; i0++) stars.push({ x: R(0, W), y: R(0, H), r: R(.3, 1.8), b: R(.2, .8), s: R(.02, .08) });
var bullets = [], parts = [], rings = [], floats = [], warns = [], pickups = [], mines = [], mortarShots = [];
var enemies = [], bossPending = false, queue = [], spawnT = 0;
var round = 1, score = 0, lives = 3, kills = 0, shots = 0, hitsN = 0, best = 0;
try { best = topScores.length ? topScores[0].s : 0; } catch (e) {}
var streakN = 0, lastKill = -99, streakOn = false, dblT = 0;
var shake = 0, recoil = 0, shakeMul = 1, pMul = 1;
var keys = {}, firing = false, joyX = 0, joyY = 0, endTimer = null, visitedArenas = {};

var WEAPONS = {
  cannon: { name: 'ПУШКА', cd: .45, dmg: 1, bs: 430, spread: .03, pierce: false, heat: 0 },
  mg: { name: 'ПУЛЕМЁТ', cd: .12, dmg: .5, bs: 520, spread: .12, pierce: false, heat: 0 },
  laser: { name: 'ЛАЗЕР', cd: .6, dmg: 2, bs: 900, spread: 0, pierce: true, heat: .34 }
};
var P = { x: W / 2, y: H - 80, a: -Math.PI / 2, r: 15, barrel: 24, sp: 0, cd: 0, inv: 0, flash: 0, rec: 0, shield: false, rapidT: 0, dead: false, dustT: 0, engineT: 0, weapon: 'cannon', heat: 0, overheat: false, drones: [] };
function curMult() { return (streakOn ? 2 : 1) * (dblT &gt; 0 ? 2 : 1); }
function setWeapon(w) { if (P.weapon === w) return; P.weapon = w; P.heat = 0; P.overheat = false; updateWBtns(); SFX.pick(); }
window.bronSetW = setWeapon;
function updateWBtns() { $('bronW1').classList.toggle('bron-on', P.weapon === 'cannon'); $('bronW2').classList.toggle('bron-on', P.weapon === 'mg'); $('bronW3').classList.toggle('bron-on', P.weapon === 'laser'); $('bronHeatwrap').style.display = (P.weapon === 'laser') ? 'block' : 'none'; }
updateWBtns();

var PAL = {
  player: { tr: '#003d5c', b1: '#00f0ff', b2: '#0077aa', tu: '#a0ffff', bar: '#003355' },
  scout: { tr: '#5a4a00', b1: '#ffd700', b2: '#b8960a', tu: '#ffe850', bar: '#6a5500' },
  assault: { tr: '#5a1015', b1: '#ff0040', b2: '#a80020', tu: '#ff6080', bar: '#6a0015' },
  heavy: { tr: '#5a0030', b1: '#ff2d95', b2: '#b5004a', tu: '#ff80c0', bar: '#6a0030' },
  sniper: { tr: '#1a1a4a', b1: '#3a86ff', b2: '#1a4ac0', tu: '#90c0ff', bar: '#0a1a50' },
  boss: { tr: '#4a0010', b1: '#ff0040', b2: '#8b0000', tu: '#ff4040', bar: '#2a0005' },
  kamikaze: { tr: '#4a2a00', b1: '#ff6600', b2: '#b04000', tu: '#ffa060', bar: '#5a2a00' },
  attackd: { tr: '#003a4a', b1: '#00ffff', b2: '#008aaa', tu: '#80ffff', bar: '#004050' },
  minelayer: { tr: '#3a4a00', b1: '#ccff00', b2: '#80a000', tu: '#e0ff80', bar: '#405500' },
  mortar: { tr: '#4a2020', b1: '#c04030', b2: '#702010', tu: '#e08070', bar: '#3a1010' },
  shielded: { tr: '#3a2a00', b1: '#c9a227', b2: '#7a6010', tu: '#e0c070', bar: '#3a2a00' },
  medic: { tr: '#4a1050', b1: '#ff69b4', b2: '#c04080', tu: '#ffa0d0', bar: '#4a1050' }
};
var ETYPES = {
  scout: { hp: 1, sp: 115, turn: 3.4, cool: 2.1, bs: 250, spread: .3, range: 540, score: 100, r: 13, barrel: 20 },
  assault: { hp: 1, sp: 82, turn: 2.6, cool: 1.55, bs: 275, spread: .22, range: 470, score: 150, r: 15, barrel: 24 },
  heavy: { hp: 3, sp: 46, turn: 1.7, cool: 2.5, bs: 300, spread: .07, range: 640, score: 300, r: 19, barrel: 28 },
  sniper: { hp: 1, sp: 62, turn: 2.2, cool: 3.1, bs: 390, spread: .02, range: 820, score: 250, r: 13, barrel: 32 },
  boss: { hp: 14, sp: 40, turn: 1.3, cool: 2.1, bs: 285, spread: .12, range: 760, score: 1000, r: 34, barrel: 46 },
  kamikaze: { hp: 1, sp: 150, turn: 4.5, cool: 999, bs: 0, spread: 0, range: 0, score: 200, r: 12, barrel: 0, fly: true },
  attackd: { hp: 1, sp: 95, turn: 3.2, cool: 2.0, bs: 300, spread: .15, range: 520, score: 250, r: 13, barrel: 16, fly: true },
  minelayer: { hp: 2, sp: 60, turn: 2.0, cool: 4.0, bs: 0, spread: 0, range: 0, score: 300, r: 16, barrel: 0 },
  mortar: { hp: 2, sp: 40, turn: 1.5, cool: 3.5, bs: 0, spread: 0, range: 900, score: 350, r: 17, barrel: 22 },
  shielded: { hp: 3, sp: 55, turn: 1.8, cool: 2.3, bs: 290, spread: .1, range: 560, score: 400, r: 17, barrel: 26, shielded: true },
  medic: { hp: 2, sp: 50, turn: 2.0, cool: 3.0, bs: 0, spread: 0, range: 0, score: 350, r: 15, barrel: 0, medic: true }
};

function cellAt(x, y) { var cx = (x / CS) | 0, cy = (y / CS) | 0; if (cx &lt; 0 || cy &lt; 0 || cx &gt;= GW || cy &gt;= GH) return 2; return grid[cy * GW + cx]; }
function setc(x, y, v) { if (x &gt;= 0 &amp;&amp; y &gt;= 0 &amp;&amp; x &lt; GW &amp;&amp; y &lt; GH) grid[y * GW + x] = v; }
function clearZone(px, py, rad) { for (var y = 0; y &lt; GH; y++) for (var x = 0; x &lt; GW; x++) { var dx = x * CS + 16 - px, dy = y * CS + 16 - py; if (hyp(dx, dy) &lt; rad) grid[y * GW + x] = 0; } }
var SPAWNS = [[70, 70], [W - 70, 70], [70, H - 70], [W - 70, H - 70], [W / 2, 64]];
function genArena() { grid.fill(0); deco = []; bushes = []; for (var i = 0; i &lt; 40; i++) deco.push({ x: R(0, W), y: R(0, H), r: R(14, 50), a: R(.02, .06), ph: R(0, 6.28), s: R(.01, .04) }); for (var k = 0; k &lt; 5; k++) { var y = RI(3, GH - 6), x = RI(2, 7), len = RI(2, 4), vert = Math.random() &lt; .35; for (var j = 0; j &lt; len; j++) { if (vert) { setc(x, y + j, 1); setc(GW - 1 - x, y + j, 1); } else { setc(x + j, y, 1); setc(GW - 1 - x - j, y, 1); } } } var spots = [[5, 4], [9, 9], [5, 14]]; for (var s2 = 0; s2 &lt; spots.length; s2++) { if (Math.random() &lt; .8) { var sx = spots[s2][0], sy = spots[s2][1]; setc(sx, sy, 2); setc(sx + 1, sy, 2); setc(sx, sy + 1, 2); setc(sx + 1, sy + 1, 2); setc(GW - 2 - sx, sy, 2); setc(GW - 1 - sx, sy, 2); setc(GW - 2 - sx, sy + 1, 2); setc(GW - 1 - sx, sy + 1, 2); } } for (var b = 0; b &lt; 5; b++) bushes.push({ x: R(80, W - 80), y: R(80, H - 80), r: R(26, 40), s: R(0, 7) }); SPAWNS.forEach(function(p) { clearZone(p[0], p[1], 80); }); clearZone(W / 2, H - 80, 90); }
function circleBlocked(x, y, r) { var x0 = Math.max(0, ((x - r) / CS) | 0), x1 = Math.min(GW - 1, ((x + r) / CS) | 0); var y0 = Math.max(0, ((y - r) / CS) | 0), y1 = Math.min(GH - 1, ((y + r) / CS) | 0); for (var cy = y0; cy &lt;= y1; cy++) for (var cx = x0; cx &lt;= x1; cx++) { if (grid[cy * GW + cx]) { var rx = cx * CS, ry = cy * CS, nx = clamp(x, rx, rx + CS), ny = clamp(y, ry, ry + CS); if (hyp(x - nx, y - ny) &lt; r) return true; } } return false; }

function addShake(v) { shake = Math.min(20, shake + v * shakeMul); }
function addRecoil(v) { recoil = Math.min(8, recoil + v * shakeMul); }
function flash(cls) { var el = $(cls); if (!el) return; el.style.opacity = '1'; setTimeout(function() { el.style.opacity = '0'; }, 200); }
function fade(show, cb) { var f = $('bronFade'); if (show) { f.classList.add('bron-on'); setTimeout(cb || function() {}, 800); } else { setTimeout(function() { f.classList.remove('bron-on'); if (cb) cb(); }, 50); } }
function floatTxt(x, y, txt, col, big) { floats.push({ x: x, y: y, txt: txt, col: col || '#a0ffff', t: 1.2, big: big }); if (floats.length &gt; 24) floats.shift(); }
function ringFx(x, y, c, r0) { rings.push({ x: x, y: y, r: r0 || 8, vr: 260, a: .9, col: c }); }
function part(p) { parts.push(p); if (parts.length &gt; 360) parts.shift(); }
function boom(x, y, s, col, extra) { var n = Math.round((16 * s + 4) * pMul); for (var i = 0; i &lt; n; i++) { var a = R(0, 6.28), v = R(30, 190) * s; part({ tp: 'fire', x: x, y: y, vx: Math.cos(a) * v, vy: Math.sin(a) * v, t: R(.25, .5), m: .5, r: R(3, 7) * s, c: i % 3 ? col : '#ffd700' }); } for (i = 0; i &lt; 8 * s * pMul; i++) { a = R(0, 6.28); part({ tp: 'smoke', x: x + R(-8, 8), y: y + R(-8, 8), vx: Math.cos(a) * R(10, 40), vy: Math.sin(a) * R(10, 40) - 20, t: R(.5, .9), m: .9, r: R(6, 12) * s }); } for (i = 0; i &lt; 7 * s * pMul; i++) { a = R(0, 6.28); part({ tp: 'deb', x: x, y: y, vx: Math.cos(a) * R(60, 240) * s, vy: Math.sin(a) * R(60, 240) * s, t: R(.4, .8), m: .8, r: R(2, 4), a2: R(0, 6.28), vr: R(-8, 8), c: col }); } if (extra) { for (i = 0; i &lt; 12 * s * pMul; i++) { a = R(0, 6.28); v = R(50, 160) * s; part({ tp: 'spark', x: x, y: y, vx: Math.cos(a) * v, vy: Math.sin(a) * v, t: R(.15, .35), m: .35, c: extra }); } } part({ tp: 'flash', x: x, y: y, t: .12, m: .12, r: 26 * s }); ringFx(x, y, col, 10); if (s &gt; 1) { craters.push({ x: x, y: y, r: R(14, 22) * Math.min(s, 1.4) }); if (craters.length &gt; 60) craters.shift(); } addShake(5 * s); SFX.boom(Math.min(s, 1.4)); if (s &gt; 1.5) flash('bronFxgold'); }
function turretFly(e) { part({ tp: 'tur', x: e.x, y: e.y, vx: R(-90, 90), vy: R(-120, -30), t: 1, m: 1, r: e.r * .55, a2: e.a, vr: R(-7, 7), pal: PAL[e.type] || PAL.assault }); }
function sparks(x, y, n) { for (var i = 0; i &lt; n * pMul; i++) { var a = R(0, 6.28); part({ tp: 'spark', x: x, y: y, vx: Math.cos(a) * R(80, 260), vy: Math.sin(a) * R(80, 260), t: R(.15, .3), m: .3, c: '#ffd700' }); } }
function dust(x, y) { part({ tp: 'dust', x: x, y: y, vx: R(-8, 8), vy: R(-8, 8), t: .5, m: .5, r: R(3, 6) }); }

var lastLives = -1, lastScore = -1, lastFoes = -1, lastQueue = '';
function syncHUD() { if (lives !== lastLives) { lastLives = lives; var h = ''; for (var i = 0; i &lt; lives; i++) h += '&lt;span class="bron-life"&gt;&lt;/span&gt;'; $('bronLives').innerHTML = h; } if (score !== lastScore) { lastScore = score; $('bronScore').textContent = score; } $('bronRound').textContent = round; $('bronMult').style.display = (streakOn || dblT &gt; 0) ? 'inline' : 'none'; $('bronMult').textContent = '×' + curMult(); var rem = queue.length + warns.length + enemies.length; if (rem !== lastFoes) { lastFoes = rem; var f = ''; for (i = 0; i &lt; rem; i++) f += '&lt;span class="bron-foe"&gt;&lt;/span&gt;'; $('bronFoes').innerHTML = f || '&lt;span style="color:#00f0ff;font-size:9px"&gt;ЧИСТО&lt;/span&gt;'; } var boss = null; for (i = 0; i &lt; enemies.length; i++) if (enemies[i].type === 'boss') boss = enemies[i]; $('bronBossbar').classList.toggle('bron-on', !!boss); if (boss) $('bronBossfill').style.width = (boss.hp / boss.maxHp * 100) + '%'; var qstr = queue.slice(0, 5).join(',') + (queue.length &gt; 5 ? '+' + (queue.length - 5) : ''); if (qstr !== lastQueue) { lastQueue = qstr; var mm = $('bronMinimap'); mm.innerHTML = '&lt;span class="bron-ml"&gt;ОЧЕРЕДЬ&lt;/span&gt;'; queue.slice(0, 5).forEach(function(t) { var m = document.createElement('span'); m.className = 'bron-mi'; var c = PAL[t] ? PAL[t].b1 : '#fff'; m.style.background = c; m.style.boxShadow = '0 0 6px ' + c; mm.appendChild(m); }); if (queue.length &gt; 5) { var more = document.createElement('span'); more.className = 'bron-ml'; more.textContent = '+' + (queue.length - 5); mm.appendChild(more); } } }

function spawnBullet(x, y, a, bs, foe, dmg, pierce, big) { bullets.push({ x: x, y: y, vx: Math.cos(a) * bs, vy: Math.sin(a) * bs, foe: foe, r: big ? 6 : 4.2, big: big, dmg: dmg || 1, pierce: !!pierce, hit: [] }); }
function fireBullet(t, foe, spread, bs, dmg, pierce, big) { var a = t.a + R(-spread, spread); spawnBullet(t.x + Math.cos(a) * (t.r + t.barrel), t.y + Math.sin(a) * (t.r + t.barrel), a, bs, foe, dmg, pierce, big); t.flash = .07; t.rec = 1; if (!foe) addRecoil(3); }
function playerFire() { if (P.cd &gt; 0 || P.dead) return; var w = WEAPONS[P.weapon]; if (P.weapon === 'laser' &amp;&amp; P.overheat) return; P.cd = w.cd; fireBullet(P, false, w.spread, w.bs, w.dmg, w.pierce, false); if (w.heat) { P.heat = Math.min(1, P.heat + w.heat); if (P.heat &gt;= 1) { P.overheat = true; SFX.over(); } } shots++; if (P.weapon === 'mg') SFX.mg(); else if (P.weapon === 'laser') SFX.laser(); else SFX.shoot(); }
function hitPlayer() { if (P.inv &gt; 0 || P.dead || state !== 'playing') return; if (P.shield) { P.shield = false; P.inv = 1; ringFx(P.x, P.y, '#00f0ff', 20); SFX.ping(); floatTxt(P.x, P.y - 30, 'ЩИТ ПОГАС', '#00f0ff'); flash('bronFxblue'); return; } lives--; P.inv = 2; flash('bronFxred'); addShake(13); SFX.hurt(); boom(P.x, P.y, .7, '#ff6080', '#ffd700'); floatTxt(P.x, P.y - 34, '−1 ❤', '#ff0040'); syncHUD(); if (lives &lt;= 0) { P.dead = true; turretFly({ x: P.x, y: P.y, r: P.r, a: P.a, type: 'player' }); boom(P.x, P.y, 2, '#00f0ff', '#ff2d95'); state = 'dying'; SFX.over2(); setTimeout(showGameOver, 1400); } }
function killEnemy(e) { e.dead = true; kills++; if (kills === 1) unlockAch('firstBlood'); var mult = curMult(), pts = e.score * mult; score += pts; if (score &gt;= 5000) unlockAch('score5k'); var extra = e.type === 'boss' ? '#ffd700' : null; boom(e.x, e.y, e.type === 'boss' ? 2.4 : 1.1, PAL[e.type].b1, extra); if (!e.fly) turretFly(e); floatTxt(e.x, e.y - 30, '+' + pts, '#ffd700', e.type === 'boss'); if (e.type === 'boss') unlockAch('bossKill'); if (lives &lt; 9) { lives++; flash('bronFxgold'); SFX.life(); floatTxt(e.x, e.y - 52, '+1 ЖИЗНЬ', '#ffd700'); if (lives === 9) unlockAch('nineLives'); } if (tSec - lastKill &lt; 4) streakN++; else streakN = 1; lastKill = tSec; if (streakN &gt;= 3 &amp;&amp; !streakOn) { streakOn = true; floatTxt(P.x, P.y - 40, 'СЕРИЯ ×2!', '#ffd700', true); flash('bronFxgold'); } if (streakN &gt;= 10) unlockAch('streak10'); updateComboDisplay(); rollPickup(e); syncHUD(); if (state === 'playing' &amp;&amp; !queue.length &amp;&amp; !warns.length &amp;&amp; !enemies.some(function(o) { return !o.dead; })) { state = 'clearing'; setTimeout(roundEnd, 900); } }
function updateComboDisplay() { var el = $('bronCombo'), num = $('bronComboNum'); if (streakN &gt;= 3) { num.textContent = streakN; el.classList.add('bron-show'); } else { el.classList.remove('bron-show'); } }
function damageEnemy(e, b, fromAngle) { if (e.spawnT &gt; 0) return; if (e.shielded &amp;&amp; fromAngle !== undefined) { var rel = Math.abs(angDiff(e.a, fromAngle)); if (rel &lt; 1.2) { sparks(b.x, b.y, 8); SFX.ping(); floatTxt(b.x, b.y - 10, 'БРОНЯ', '#c9a227'); return; } } e.hp -= b.dmg; hitsN++; sparks(b.x, b.y, 6); SFX.ping(); if (e.hp &lt;= 0) killEnemy(e); }
function rollPickup(e) { var ch = e.type === 'boss' ? 1 : .2; if (Math.random() &gt; ch) return; var r = Math.random(), tp; if (r &lt; .25) tp = 'shield'; else if (r &lt; .5) tp = 'rapid'; else if (r &lt; .7) tp = 'double'; else if (r &lt; .85) tp = 'life'; else tp = 'drone'; pickups.push({ x: clamp(e.x, 40, W - 40), y: clamp(e.y, 40, H - 40), tp: tp, t: 8, ph: R(0, 6) }); }
function buildQueue(n) { queue = []; if (n % 5 === 0) { bossPending = true; for (var i = 0; i &lt; 4; i++) queue.push(Math.random() &lt; .5 ? 'scout' : 'assault'); return; } var total = Math.min(4 + 2 * (n - 1), 18); for (i = 0; i &lt; total; i++) { var r = Math.random(), t; if (n &lt; 3) t = r &lt; .55 ? 'scout' : 'assault'; else if (n === 3) t = r &lt; .4 ? 'scout' : r &lt; .7 ? 'assault' : r &lt; .85 ? 'heavy' : 'kamikaze'; else if (n === 4) t = r &lt; .3 ? 'scout' : r &lt; .55 ? 'assault' : r &lt; .75 ? 'heavy' : r &lt; .9 ? 'minelayer' : 'mortar'; else if (n === 5) t = r &lt; .25 ? 'scout' : r &lt; .45 ? 'assault' : r &lt; .62 ? 'heavy' : r &lt; .78 ? 'sniper' : r &lt; .88 ? 'kamikaze' : 'attackd'; else t = r &lt; .18 ? 'scout' : r &lt; .36 ? 'assault' : r &lt; .52 ? 'heavy' : r &lt; .66 ? 'sniper' : r &lt; .74 ? 'kamikaze' : r &lt; .82 ? 'attackd' : r &lt; .88 ? 'minelayer' : r &lt; .94 ? 'mortar' : r &lt; .97 ? 'shielded' : 'medic'; queue.push(t); } }
function hideAll() { qAll('.bron-ov').forEach(function(o) { o.classList.remove('bron-show'); }); }
function roundIntro(n) { arenaIdx = Math.floor((n - 1) / 5) % ARENAS.length; arena = ARENAS[arenaIdx]; visitedArenas[arenaIdx] = 1; if (Object.keys(visitedArenas).length === 4) unlockAch('allArenas'); $('bronArenaTag').textContent = arena.name; fade(true, function() { round = n; buildQueue(n); genArena(); bullets = []; pickups = []; warns = []; enemies = []; parts = []; rings = []; mines = []; mortarShots = []; P.x = W / 2; P.y = H - 80; P.a = -Math.PI / 2; P.inv = 1.5; P.cd = 0; P.dead = false; P.rapidT = 0; dblT = 0; streakOn = false; streakN = 0; P.drones.forEach(function(d) { if (d.type === 'shield') d.charges = 3; }); updateComboDisplay(); spawnT = 1; var en = queue.length + (bossPending ? 1 : 0); $('bronIntroT').textContent = 'РАУНД ' + n + (n % 5 === 0 ? ' · БОСС' : ''); $('bronIntroP').innerHTML = (n % 5 === 0 ? '⚠ &lt;span class="bron-b"&gt;БОСС&lt;/span&gt; на арене! ' : '') + 'Арена: &lt;span class="bron-b"&gt;' + arena.name + '&lt;/span&gt; · Врагов: &lt;span class="bron-b"&gt;' + en + '&lt;/span&gt;' + (n &gt;= 6 ? ' · ?? элита' : '') + (n % 3 === 0 ? ' · в конце &lt;span class="bron-b"&gt;+1 жизнь&lt;/span&gt;' : ''); hideAll(); $('bronIntroOv').classList.add('bron-show'); syncHUD(); setTimeout(function() { fade(false, function() { $('bronIntroOv').classList.remove('bron-show'); state = 'playing'; }); }, 1400); }); }
function roundEnd() { if (state !== 'clearing') return; state = 'roundend'; SFX.fanfare(); if (round &gt;= 10) unlockAch('round10'); if (round &gt;= 20) unlockAch('round20'); var bonus = round % 3 === 0 &amp;&amp; lives &lt; 9; if (round % 3 === 0) { lives = Math.min(9, lives + 1); flash('bronFxgold'); syncHUD(); } $('bronEndT').textContent = 'РАУНД ' + round + ' ЗАЧИЩЕН'; $('bronEndP').innerHTML = 'Жизни: &lt;span class="bron-b"&gt;' + lives + '&lt;/span&gt;' + (bonus ? ' · бонус &lt;span class="bron-b"&gt;+1&lt;/span&gt;!' : '') + ' · Счёт: &lt;span class="bron-b"&gt;' + score + '&lt;/span&gt;'; hideAll(); $('bronEndOv').classList.add('bron-show'); var c = 3; $('bronCd').textContent = c; clearInterval(endTimer); endTimer = setInterval(function() { c--; if (c &gt; 0) $('bronCd').textContent = c; else { clearInterval(endTimer); roundIntro(round + 1); } }, 1000); }
function showGameOver() { state = 'gameover'; if (shots &amp;&amp; hitsN / shots &gt;= .8 &amp;&amp; kills &gt;= 5) unlockAch('accuracy80'); if (score &gt; best) best = score; addTopScore(score, kills, round); $('bronSK').textContent = kills; $('bronSA').textContent = (shots ? Math.round(hitsN / shots * 100) : 0) + '%'; $('bronSR').textContent = round; $('bronSS').textContent = score; $('bronSB').textContent = best; hideAll(); $('bronOverOv').classList.add('bron-show'); stopMusic(); }
function fullReset() { score = 0; lives = 3; kills = 0; shots = 0; hitsN = 0; craters = []; lastLives = -1; lastScore = -1; lastFoes = -1; lastQueue = ''; streakN = 0; streakOn = false; dblT = 0; visitedArenas = {}; P.drones = []; P.weapon = 'cannon'; P.heat = 0; P.overheat = false; mines = []; mortarShots = []; updateWBtns(); updateComboDisplay(); renderTopList(); roundIntro(1); if (!muted &amp;&amp; audioInit) startMusic(); }
function fieldCount() { return enemies.length + warns.length; }
function updSpawn(dt) { if (bossPending) { bossPending = false; warns.push({ x: W / 2, y: 96, t: 1.3, type: 'boss' }); SFX.bossAlert(); flash('bronFxred'); } spawnT -= dt; var cap = round % 5 === 0 ? 5 : 4; if (spawnT &lt;= 0 &amp;&amp; queue.length &amp;&amp; fieldCount() &lt; cap) { var type = queue.shift(), pts = SPAWNS.filter(function(p) { return hyp(p[0] - P.x, p[1] - P.y) &gt; 200; }); var pt = (pts.length ? pts : SPAWNS)[RI(0, (pts.length ? pts : SPAWNS).length - 1)]; warns.push({ x: pt[0], y: pt[1], t: .85, type: type }); spawnT = Math.max(.75, 1.5 - (round - 1) * .07); } for (var i = warns.length - 1; i &gt;= 0; i--) { var w = warns[i]; w.t -= dt; if (w.t &lt;= 0) { warns.splice(i, 1); spawnEnemy(w.type, w.x, w.y); } } }
function spawnEnemy(type, x, y) { var T = ETYPES[type], sc = Math.min(1.5, 1 + (round - 1) * .05); var e = { type: type, x: x, y: y, a: Math.atan2(P.y - y, P.x - x), r: T.r, hp: type === 'boss' ? 12 + round : T.hp, sp: T.sp * sc, turn: T.turn, cool: R(.5, T.cool), cool2: 1.4, bs: T.bs, spread: T.spread, range: T.range, score: T.score, barrel: T.barrel, flash: 0, rec: 0, spawnT: .35, dead: false, avoidT: 0, avoidDir: 1, orbitDir: Math.random() &lt; .5 ? 1 : -1, orbitT: R(2, 5), aiming: false, aimT: 0, aimX: 0, aimY: 0, dodgeCd: 0, dodgeT: 0, dodgeDir: 1, dustT: 0, phase: 0, phaseTimer: 0, fly: !!T.fly, shielded: !!T.shielded, medic: !!T.medic, healT: R(3, 5) }; e.maxHp = e.hp; enemies.push(e); ringFx(x, y, PAL[type].b1, e.r + 6); noiz(.15, .06, 900); if (type === 'boss') { for (var i = 0; i &lt; 6; i++) { var a = i / 6 * Math.PI * 2; part({ tp: 'fire', x: x + Math.cos(a) * 20, y: y + Math.sin(a) * 20, vx: Math.cos(a) * 30, vy: Math.sin(a) * 30, t: .5, m: .5, r: 4, c: '#ff0040' }); } } }
function moveEnt(t, dt, spd) { var nx = t.x + Math.cos(t.a) * spd * dt, ny = t.y + Math.sin(t.a) * spd * dt, moved = 0; if (!circleBlocked(nx, t.y, t.r)) { t.x = nx; moved += Math.abs(spd * dt); } if (!circleBlocked(t.x, ny, t.r)) { t.y = ny; moved += Math.abs(spd * dt); } t.x = clamp(t.x, t.r + 4, W - t.r - 4); t.y = clamp(t.y, t.r + 4, H - t.r - 4); return moved; }
function moveFly(t, dt, spd) { t.x += Math.cos(t.a) * spd * dt; t.y += Math.sin(t.a) * spd * dt; t.x = clamp(t.x, t.r + 4, W - t.r - 4); t.y = clamp(t.y, t.r + 4, H - t.r - 4); }
function updEnemy(e, dt) { if (e.spawnT &gt; 0) { e.spawnT -= dt; return; } e.flash = Math.max(0, e.flash - dt); e.rec = Math.max(0, e.rec - dt * 4); e.cool -= dt; e.dodgeCd -= dt; e.dodgeT -= dt; if (e.medic) { e.healT -= dt; if (e.healT &lt;= 0) { e.healT = 5; var target = null, bd = 300; for (var q = 0; q &lt; enemies.length; q++) { var o = enemies[q]; if (o === e || o.dead || o.medic || o.hp &gt;= o.maxHp) continue; var dd = hyp(o.x - e.x, o.y - e.y); if (dd &lt; bd) { bd = dd; target = o; } } if (target) { target.hp = Math.min(target.maxHp, target.hp + 1); ringFx(target.x, target.y, '#ff69b4', target.r + 4); floatTxt(target.x, target.y - 20, '+1 HP', '#ff69b4'); SFX.heal(); } } } if (e.type === 'boss') { e.phaseTimer -= dt; if (e.phaseTimer &lt;= 0) { e.phase = (e.phase + 1) % 3; e.phaseTimer = 3 + R(0, 2); if (e.phase === 1) floatTxt(e.x, e.y - 40, 'РЕЖИМ ОГНЯ', '#ffd700', true); if (e.phase === 2) floatTxt(e.x, e.y - 40, 'УСКОРЕНИЕ', '#ff2d95', true); } } var dx = P.x - e.x, dy = P.y - e.y, dist = hyp(dx, dy), ang = Math.atan2(dy, dx); if (e.dodgeCd &lt;= 0 &amp;&amp; e.type !== 'boss' &amp;&amp; !e.fly &amp;&amp; !e.medic) { for (var i = 0; i &lt; bullets.length; i++) { var b = bullets[i]; if (b.foe) continue; var bd = hyp(b.x - e.x, b.y - e.y); if (bd &lt; 110) { var mt = ((e.x - b.x) * b.vx + (e.y - b.y) * b.vy) &gt; 0; if (mt &amp;&amp; Math.random() &lt; (e.type === 'scout' ? .75 : e.type === 'sniper' ? .5 : .4)) { e.dodgeT = .35; e.dodgeDir = Math.random() &lt; .5 ? 1 : -1; e.dodgeCd = 1.1; break; } } } } if (e.dodgeT &gt; 0) { e.a += e.dodgeDir * e.turn * 1.4 * dt; moveEnt(e, dt, e.sp); return; } var desired = ang, moveF = 1; if (e.type === 'kamikaze') { desired = ang; moveF = 1; if (dist &lt; e.r + P.r + 6 &amp;&amp; !P.dead) { e.dead = true; boom(e.x, e.y, 1.5, '#ff6600', '#ffd700'); addShake(7); SFX.boom(1.2); if (P.shield) { P.shield = false; ringFx(P.x, P.y, '#00f0ff', 20); SFX.ping(); floatTxt(P.x, P.y - 30, 'ЩИТ ПОГАС', '#00f0ff'); } else if (P.inv &lt;= 0) { hitPlayer(); } syncHUD(); return; } } else if (e.type === 'attackd') { if (dist &gt; 300) desired = ang; else if (dist &lt; 220) desired = ang + Math.PI; else moveF = .4; if (e.cool &lt;= 0 &amp;&amp; Math.abs(angDiff(e.a, ang)) &lt; .5 &amp;&amp; dist &lt; e.range) { fireBullet(e, true, e.spread, e.bs, 1, false, false); e.cool = ETYPES.attackd.cool * Math.max(.6, 1 - (round - 1) * .04); SFX.eshoot(); } } else if (e.type === 'minelayer') { if (dist &gt; 320) desired = ang; else if (dist &lt; 180) desired = ang + Math.PI; else { desired = ang + e.orbitDir * Math.PI / 2; moveF = .3; } e.orbitT -= dt; if (e.orbitT &lt;= 0) { e.orbitDir *= -1; e.orbitT = R(2, 4); } if (e.cool &lt;= 0 &amp;&amp; mines.length &lt; 6) { mines.push({ x: e.x, y: e.y, t: 18, arm: 0.7 }); SFX.mine(); dust(e.x, e.y); floatTxt(e.x, e.y - 24, 'МИНА', '#ccff00'); e.cool = ETYPES.minelayer.cool * Math.max(.6, 1 - (round - 1) * .04); } } else if (e.type === 'mortar') { if (dist &gt; 520) { desired = ang; moveF = .5; } else { moveF = 0; } if (e.cool &lt;= 0 &amp;&amp; dist &lt; e.range &amp;&amp; !P.dead) { mortarShots.push({ sx: e.x, sy: e.y, tx: P.x + R(-20, 20), ty: P.y + R(-20, 20), t: 1.5, fuse: 1.5 }); SFX.mortar(); e.cool = ETYPES.mortar.cool * Math.max(.6, 1 - (round - 1) * .04); } } else if (e.type === 'shielded') { if (dist &gt; 200) desired = ang; else moveF = .3; if (e.cool &lt;= 0 &amp;&amp; Math.abs(angDiff(e.a, ang)) &lt; .4 &amp;&amp; dist &lt; e.range) { fireBullet(e, true, e.spread, e.bs, 1, false, false); e.cool = ETYPES.shielded.cool * Math.max(.6, 1 - (round - 1) * .04); SFX.eshoot(); } } else if (e.type === 'medic') { if (dist &lt; 260) desired = ang + Math.PI; else moveF = .5; } else if (e.type === 'scout') { e.orbitT -= dt; if (e.orbitT &lt;= 0) { e.orbitDir *= -1; e.orbitT = R(2.5, 5); } if (dist &gt; 240) desired = ang; else if (dist &lt; 160) desired = ang + Math.PI; else desired = ang + e.orbitDir * Math.PI / 2; if (e.cool &lt;= 0 &amp;&amp; Math.abs(angDiff(e.a, ang)) &lt; .5 &amp;&amp; dist &lt; e.range) { fireBullet(e, true, e.spread, e.bs, 1, false, false); e.cool = ETYPES.scout.cool * Math.max(.6, 1 - (round - 1) * .04); SFX.eshoot(); } } else if (e.type === 'assault') { if (dist &gt; 160) desired = ang; else desired = ang + e.orbitDir * .9; e.orbitT -= dt; if (e.orbitT &lt;= 0) { e.orbitDir *= -1; e.orbitT = R(2, 4); } moveF = dist &lt; 110 ? .4 : 1; if (e.cool &lt;= 0 &amp;&amp; Math.abs(angDiff(e.a, ang)) &lt; .45 &amp;&amp; dist &lt; e.range) { fireBullet(e, true, e.spread, e.bs, 1, false, false); e.cool = ETYPES.assault.cool * Math.max(.6, 1 - (round - 1) * .04); SFX.eshoot(); } } else if (e.type === 'heavy') { if (dist &gt; 280) desired = ang; else moveF = 0; if (e.cool &lt;= 0 &amp;&amp; Math.abs(angDiff(e.a, ang)) &lt; .3 &amp;&amp; dist &lt; e.range) { fireBullet(e, true, e.spread, e.bs, 1, false, true); e.cool = ETYPES.heavy.cool * Math.max(.6, 1 - (round - 1) * .04); SFX.eshoot(); addShake(2); } } else if (e.type === 'sniper') { if (e.aiming) { e.aimT -= dt; e.aimX = P.x; e.aimY = P.y; e.a += angDiff(e.a, ang) * 4 * dt; if (e.aimT &lt;= 0) { e.aiming = false; fireBullet(e, true, e.spread, e.bs, 1, false, false); e.cool = ETYPES.sniper.cool * Math.max(.6, 1 - (round - 1) * .04); } return; } if (dist &gt; 360) desired = ang; else if (dist &lt; 240) desired = ang + Math.PI; else moveF = .3; if (e.cool &lt;= 0 &amp;&amp; dist &lt; e.range) { e.aiming = true; e.aimT = 1; e.aimX = P.x; e.aimY = P.y; SFX.laserAim(); moveF = 0; } } else if (e.type === 'boss') { var ps = e.phase === 2 ? 1.6 : 1; if (dist &gt; 250) desired = ang; else if (dist &lt; 170) desired = ang + Math.PI; else desired = ang + .7; moveF = .7 * ps; var fr = e.phase === 1 ? .7 : 1; if (e.cool &lt;= 0 &amp;&amp; Math.abs(angDiff(e.a, ang)) &lt; .5) { var count = e.phase === 1 ? 5 : 3; for (var s = 0; s &lt; count; s++) { var spread = (s - (count - 1) / 2) * .15; fireBullet(e, true, spread, e.bs, 1, false, false); } e.cool = ETYPES.boss.cool * fr; SFX.eshoot(); addShake(4); } e.cool2 -= dt; if (e.cool2 &lt;= 0 &amp;&amp; Math.abs(angDiff(e.a, ang)) &lt; .35) { fireBullet(e, true, .03, e.bs + 60, 1, false, true); e.cool2 = 1.5; SFX.eshoot(); } } if (e.fly) { e.a += clamp(angDiff(e.a, desired), -e.turn * dt, e.turn * dt); if (moveF &gt; 0) moveFly(e, dt, e.sp * moveF); return; } if (e.avoidT &gt; 0) { e.avoidT -= dt; desired = e.a + e.avoidDir * 1.2; moveF = 1; } e.a += clamp(angDiff(e.a, desired), -e.turn * dt, e.turn * dt); if (moveF &gt; 0) { var intent = e.sp * moveF * dt, moved = moveEnt(e, dt, e.sp * moveF); if (moved &lt; intent * .3 &amp;&amp; e.avoidT &lt;= 0) { e.avoidT = .7; e.avoidDir = Math.random() &lt; .5 ? 1 : -1; } e.dustT -= dt; if (e.dustT &lt;= 0) { dust(e.x - Math.cos(e.a) * e.r, e.y - Math.sin(e.a) * e.r); e.dustT = .12; } } for (var j = 0; j &lt; enemies.length; j++) { var o = enemies[j]; if (o === e || o.dead || o.fly || e.fly) continue; var d2 = hyp(o.x - e.x, o.y - e.y), min = e.r + o.r + 4; if (d2 &lt; min &amp;&amp; d2 &gt; 0) { var push = (min - d2) / 2, ax = (e.x - o.x) / d2, ay = (e.y - o.y) / d2; if (!circleBlocked(e.x + ax * push, e.y + ay * push, e.r)) { e.x += ax * push; e.y += ay * push; } } } }

function update(dt) { tSec += dt; P.cd -= dt; P.inv = Math.max(0, P.inv - dt); P.flash = Math.max(0, P.flash - dt); P.rec = Math.max(0, P.rec - dt * 4); P.rapidT = Math.max(0, P.rapidT - dt); dblT = Math.max(0, dblT - dt); recoil = Math.max(0, recoil - dt * 24); P.heat = Math.max(0, P.heat - 0.35 * dt); if (P.overheat &amp;&amp; P.heat &lt;= 0.35) P.overheat = false; var hf = $('bronHeatfill'); if (hf) { hf.style.width = (P.heat * 100) + '%'; $('bronHeatwrap').classList.toggle('bron-hot', P.overheat); } if (streakOn &amp;&amp; tSec - lastKill &gt; 4) { streakOn = false; updateComboDisplay(); } if (state === 'playing' || state === 'clearing') { if (!P.dead) { var fwd = 0, turn = 0; if (keys.KeyW || keys.ArrowUp) fwd = 1; if (keys.KeyS || keys.ArrowDown) fwd = -1; if (keys.KeyA || keys.ArrowLeft) turn = -1; if (keys.KeyD || keys.ArrowRight) turn = 1; if (Math.abs(joyX) &gt; .15 || Math.abs(joyY) &gt; .15) { turn = joyX; fwd = -joyY; } P.a += turn * 3.2 * dt; var sp = fwd &gt; 0 ? 155 : fwd &lt; 0 ? -95 : 0; if (sp) { var moved = moveEnt(P, dt, sp); P.dustT -= dt; if (P.dustT &lt;= 0 &amp;&amp; moved &gt; 0) { dust(P.x - Math.cos(P.a) * P.r, P.y - Math.sin(P.a) * P.r); P.dustT = .09; } if (moved &gt; 10) { P.engineT += dt; if (P.engineT &gt; .04) { P.engineT = 0; for (var i = 0; i &lt; 2; i++) { var a = P.a + Math.PI + R(-.5, .5), v = R(10, 25); part({ tp: 'smoke', x: P.x - Math.cos(P.a) * P.r + R(-4, 4), y: P.y - Math.sin(P.a) * P.r + R(-4, 4), vx: Math.cos(a) * v, vy: Math.sin(a) * v - R(2, 8), t: R(.3, .5), m: .5, r: R(3, 6) }); } } } } if (firing || keys.Space) playerFire(); P.drones.forEach(function(d) { d.ang += 2.2 * dt; d.px = P.x + Math.cos(d.ang) * 46; d.py = P.y + Math.sin(d.ang) * 46; if (d.type === 'gunner') { d.cd -= dt; if (d.cd &lt;= 0) { var best = null, bd = 260; enemies.forEach(function(en) { if (en.spawnT &gt; 0 || en.dead) return; var dd = hyp(en.x - d.px, en.y - d.py); if (dd &lt; bd) { bd = dd; best = en; } }); if (best) { var aa = Math.atan2(best.y - d.py, best.x - d.px); spawnBullet(d.px, d.py, aa, 380, false, .5, false, false); d.cd = .8; SFX.dshoot(); } } } }); } if (state === 'playing') updSpawn(dt); for (i = enemies.length - 1; i &gt;= 0; i--) { var e = enemies[i]; if (e.dead) { enemies.splice(i, 1); continue; } updEnemy(e, dt); } for (i = mines.length - 1; i &gt;= 0; i--) { var mn = mines[i]; mn.arm -= dt; mn.t -= dt; if (mn.t &lt;= 0) { mines.splice(i, 1); continue; } if (mn.arm &lt;= 0 &amp;&amp; !P.dead &amp;&amp; hyp(mn.x - P.x, mn.y - P.y) &lt; 26) { mines.splice(i, 1); boom(mn.x, mn.y, 1.3, '#ccff00', '#ffd700'); addShake(6); if (P.shield) { P.shield = false; ringFx(P.x, P.y, '#00f0ff', 20); SFX.ping(); } else if (P.inv &lt;= 0) { hitPlayer(); } syncHUD(); continue; } } for (i = mortarShots.length - 1; i &gt;= 0; i--) { var ms = mortarShots[i]; ms.t -= dt; if (ms.t &lt;= 0) { mortarShots.splice(i, 1); boom(ms.tx, ms.ty, 1.6, '#c04030', '#ffd700'); addShake(6); SFX.boom(1.3); if (!P.dead &amp;&amp; hyp(P.x - ms.tx, P.y - ms.ty) &lt; 60) { hitPlayer(); syncHUD(); } for (var q2 = mines.length - 1; q2 &gt;= 0; q2--) { if (hyp(mines[q2].x - ms.tx, mines[q2].y - ms.ty) &lt; 60) mines.splice(q2, 1); } continue; } } for (i = bullets.length - 1; i &gt;= 0; i--) { var b = bullets[i]; b.x += b.vx * dt; b.y += b.vy * dt; var del = false; if (b.x &lt; 4 || b.y &lt; 4 || b.x &gt; W - 4 || b.y &gt; H - 4) { del = true; } else { var vv = cellAt(b.x, b.y); if (vv === 1) { grid[((b.y / CS) | 0) * GW + ((b.x / CS) | 0)] = 0; SFX.brick(); sparks(b.x, b.y, 5); for (var k = 0; k &lt; 5 * pMul; k++) part({ tp: 'deb', x: b.x, y: b.y, vx: R(-90, 90), vy: R(-90, 90), t: .5, m: .5, r: R(2, 3.5), a2: R(0, 6.28), vr: R(-9, 9), c: arena.brick }); craters.push({ x: b.x, y: b.y, r: 9 }); if (craters.length &gt; 60) craters.shift(); del = true; } else if (vv === 2) { sparks(b.x, b.y, 7); SFX.ping(); del = true; } } if (!del &amp;&amp; !b.foe) { for (var mi = mines.length - 1; mi &gt;= 0; mi--) { var mm2 = mines[mi]; if (mm2.arm &lt;= 0 &amp;&amp; hyp(b.x - mm2.x, b.y - mm2.y) &lt; 14) { mines.splice(mi, 1); boom(mm2.x, mm2.y, 1.0, '#ccff00', '#ffd700'); score += 50; hitsN++; floatTxt(mm2.x, mm2.y - 20, '+50', '#ffd700'); SFX.boom(1); del = true; break; } } } if (!del) { if (b.foe) { var absorbed = false; for (var q = 0; q &lt; P.drones.length; q++) { var dr = P.drones[q]; if (dr.type === 'shield' &amp;&amp; dr.charges &gt; 0 &amp;&amp; hyp(b.x - dr.px, b.y - dr.py) &lt; 26) { dr.charges--; sparks(b.x, b.y, 8); SFX.ping(); ringFx(dr.px, dr.py, '#00f0ff', 14); absorbed = true; break; } } if (absorbed) { del = true; } else if (!P.dead &amp;&amp; hyp(b.x - P.x, b.y - P.y) &lt; P.r + b.r) { hitPlayer(); del = true; } } else { for (var j = 0; j &lt; enemies.length; j++) { var en = enemies[j]; if (en.spawnT &gt; 0) continue; if (hyp(b.x - en.x, b.y - en.y) &lt; en.r + b.r &amp;&amp; b.hit.indexOf(en) &lt; 0) { var fromAngle = Math.atan2(b.vy, b.vx) + Math.PI; damageEnemy(en, b, fromAngle); if (b.pierce) { b.hit.push(en); } else { del = true; break; } } } } } if (del) bullets.splice(i, 1); } for (i = pickups.length - 1; i &gt;= 0; i--) { var pk = pickups[i]; pk.t -= dt; pk.ph += dt * 4; if (pk.t &lt;= 0) { pickups.splice(i, 1); continue; } if (!P.dead &amp;&amp; hyp(pk.x - P.x, pk.y - P.y) &lt; P.r + 18) { var txt = '', col = '#ffd700'; if (pk.tp === 'shield') { P.shield = true; txt = 'ЩИТ'; col = '#00f0ff'; flash('bronFxblue'); } else if (pk.tp === 'rapid') { P.rapidT = 8; txt = 'ОГОНЬ x2'; col = '#ff2d95'; flash('bronFxgold'); } else if (pk.tp === 'double') { dblT = 10; txt = 'ОЧКИ x2'; col = '#ffd700'; flash('bronFxgold'); } else if (pk.tp === 'drone') { var g = P.drones.filter(function(x) { return x.type === 'gunner'; }).length; var sh = P.drones.some(function(x) { return x.type === 'shield'; }); if (g &lt; 2) { P.drones.push({ type: 'gunner', ang: R(0, 6.28), cd: .5, charges: 0, px: P.x, py: P.y }); txt = 'ДРОН-СТРЕЛОК'; } else if (!sh) { P.drones.push({ type: 'shield', ang: R(0, 6.28), cd: 0, charges: 3, px: P.x, py: P.y }); txt = 'ДРОН-ЩИТ'; } else { score += 200; txt = '+200'; } col = '#3a86ff'; flash('bronFxblue'); } else { lives = Math.min(9, lives + 1); txt = '+1 ЖИЗНЬ'; col = '#00f0ff'; flash('bronFxgold'); } floatTxt(pk.x, pk.y - 24, txt, col); SFX.pick(); ringFx(pk.x, pk.y, col, 14); flash('bronFxpickup'); pickups.splice(i, 1); syncHUD(); } } } for (i = parts.length - 1; i &gt;= 0; i--) { var p = parts[i]; p.t -= dt; if (p.t &lt;= 0) { parts.splice(i, 1); continue; } p.x += (p.vx || 0) * dt; p.y += (p.vy || 0) * dt; if (p.tp === 'deb' || p.tp === 'tur') { p.vx *= .96; p.vy *= .96; p.a2 += (p.vr || 0) * dt; } if (p.tp === 'smoke') p.r += 8 * dt; } for (i = rings.length - 1; i &gt;= 0; i--) { var r2 = rings[i]; r2.r += r2.vr * dt; r2.a -= dt * 2.2; if (r2.a &lt;= 0) rings.splice(i, 1); } for (i = floats.length - 1; i &gt;= 0; i--) { var f = floats[i]; f.t -= dt; f.y -= 28 * dt; if (f.t &lt;= 0) floats.splice(i, 1); } shake = Math.max(0, shake - dt * 30); syncHUD(); }

function drawTank(t, pal, alpha) { ctx.save(); ctx.globalAlpha = alpha === undefined ? 1 : alpha; ctx.translate(t.x, t.y); ctx.fillStyle = 'rgba(0,0,0,.4)'; ctx.beginPath(); ctx.ellipse(2, 4, t.r * 1.2, t.r * .95, 0, 0, 7); ctx.fill(); ctx.rotate(t.a); var rec = (t.rec || 0) * 4; ctx.fillStyle = pal.tr; rr(-t.r, -t.r - 3, t.r * 2, 7, 3); ctx.fill(); rr(-t.r, t.r - 4, t.r * 2, 7, 3); ctx.fill(); ctx.fillStyle = 'rgba(0,0,0,.4)'; for (var i = -t.r + 3; i &lt; t.r - 2; i += 6) { ctx.fillRect(i, -t.r - 2, 2, 5); ctx.fillRect(i, t.r - 3, 2, 5); } var g = ctx.createLinearGradient(0, -t.r, 0, t.r); g.addColorStop(0, pal.b1); g.addColorStop(1, pal.b2); ctx.fillStyle = g; rr(-t.r, -t.r + 3, t.r * 2, t.r * 2 - 6, 5); ctx.fill(); ctx.strokeStyle = 'rgba(0,0,0,.5)'; ctx.lineWidth = 2; ctx.stroke(); if (t.type === 'heavy' || t.type === 'boss' || t.shielded) { ctx.fillStyle = 'rgba(0,0,0,.3)'; ctx.fillRect(-t.r + 4, -t.r + 6, 4, t.r * 2 - 12); ctx.fillRect(t.r - 8, -t.r + 6, 4, t.r * 2 - 12); } if (t.shielded) { ctx.save(); ctx.rotate(-t.a); ctx.fillStyle = 'rgba(201,162,39,.45)'; ctx.beginPath(); ctx.arc(0, 0, t.r + 3, -Math.PI / 3, Math.PI / 3); ctx.lineTo(0, 0); ctx.closePath(); ctx.fill(); ctx.strokeStyle = '#e0c070'; ctx.lineWidth = 2; ctx.beginPath(); ctx.arc(0, 0, t.r + 3, -Math.PI / 3, Math.PI / 3); ctx.stroke(); ctx.restore(); } ctx.fillStyle = pal.bar; ctx.fillRect(t.r * .2 - 2, -3, t.r + t.barrel - rec - t.r * .2 + 2, 6); ctx.fillStyle = 'rgba(255,255,255,.3)'; ctx.fillRect(t.r * .2, -3, t.r + t.barrel - rec - t.r * .2, 2); if (t.rapidT &gt; 0 &amp;&amp; t === P) { ctx.shadowColor = '#ff2d95'; ctx.shadowBlur = 12; } var g2 = ctx.createRadialGradient(-2, -2, 1, 0, 0, t.r * .6); g2.addColorStop(0, pal.tu); g2.addColorStop(1, pal.b2); ctx.fillStyle = g2; ctx.beginPath(); ctx.arc(-rec * .4, 0, t.r * .58, 0, 7); ctx.fill(); ctx.strokeStyle = 'rgba(0,0,0,.5)'; ctx.stroke(); ctx.shadowBlur = 0; ctx.restore(); if (t.flash &gt; 0) { var mx = t.x + Math.cos(t.a) * (t.r + t.barrel), my = t.y + Math.sin(t.a) * (t.r + t.barrel); ctx.save(); ctx.translate(mx, my); ctx.rotate(R(0, 6.28)); ctx.fillStyle = 'rgba(255,255,220,.95)'; ctx.shadowColor = '#ffd700'; ctx.shadowBlur = 20; ctx.beginPath(); for (var s = 0; s &lt; 8; s++) { var rr2 = s % 2 ? 4 : 11; ctx.lineTo(Math.cos(s * Math.PI / 4) * rr2, Math.sin(s * Math.PI / 4) * rr2); } ctx.closePath(); ctx.fill(); ctx.restore(); } if (t.maxHp &amp;&amp; t.hp &lt; t.maxHp &amp;&amp; t.type !== 'boss') { ctx.fillStyle = 'rgba(0,0,0,.6)'; ctx.fillRect(t.x - 16, t.y - t.r - 14, 32, 5); var hpCol = t.hp / t.maxHp &gt; .5 ? '#00f0ff' : t.hp / t.maxHp &gt; .25 ? '#ffd700' : '#ff0040'; ctx.fillStyle = hpCol; ctx.fillRect(t.x - 15, t.y - t.r - 13, 30 * t.hp / t.maxHp, 3); } if (t.medic) { ctx.save(); ctx.strokeStyle = 'rgba(255,105,180,' + (0.3 + 0.3 * Math.sin(tSec * 4)) + ')'; ctx.lineWidth = 2; ctx.shadowColor = '#ff69b4'; ctx.shadowBlur = 12; ctx.beginPath(); ctx.arc(t.x, t.y, t.r + 6 + 2 * Math.sin(tSec * 3), 0, 7); ctx.stroke(); ctx.shadowBlur = 0; ctx.fillStyle = '#ff69b4'; ctx.font = '700 12px Courier New'; ctx.textAlign = 'center'; ctx.fillText('✚', t.x, t.y - t.r - 4); ctx.restore(); } }
function drawFly(e) { var pal = PAL[e.type]; ctx.save(); ctx.fillStyle = 'rgba(0,0,0,.35)'; ctx.beginPath(); ctx.ellipse(e.x + 8, e.y + 16, e.r * 1.1, e.r * .5, 0, 0, 7); ctx.fill(); ctx.translate(e.x, e.y); ctx.strokeStyle = 'rgba(255,255,255,.35)'; ctx.lineWidth = 2; ctx.beginPath(); ctx.arc(0, 0, e.r + 4, tSec * 14, tSec * 14 + 2.4); ctx.stroke(); ctx.beginPath(); ctx.arc(0, 0, e.r + 4, tSec * 14 + 3.14, tSec * 14 + 3.14 + 2.4); ctx.stroke(); var g = ctx.createRadialGradient(-2, -2, 1, 0, 0, e.r); g.addColorStop(0, pal.tu); g.addColorStop(1, pal.b2); ctx.fillStyle = g; ctx.beginPath(); ctx.arc(0, 0, e.r * .8, 0, 7); ctx.fill(); ctx.strokeStyle = 'rgba(0,0,0,.5)'; ctx.lineWidth = 2; ctx.stroke(); ctx.rotate(e.a); if (e.type === 'attackd') { ctx.fillStyle = pal.bar; ctx.fillRect(e.r * .4, -2, e.r * .9, 4); } else { var pl = .5 + .5 * Math.sin(tSec * 10); ctx.fillStyle = 'rgba(255,0,64,' + (0.5 + pl * 0.5) + ')'; ctx.shadowColor = '#ff0040'; ctx.shadowBlur = 12; ctx.beginPath(); ctx.arc(e.r * .3, 0, 4 + pl * 2, 0, 7); ctx.fill(); ctx.shadowBlur = 0; } ctx.restore(); if (e.maxHp &amp;&amp; e.hp &lt; e.maxHp) { ctx.fillStyle = 'rgba(0,0,0,.6)'; ctx.fillRect(e.x - 14, e.y - e.r - 12, 28, 4); ctx.fillStyle = '#ff0040'; ctx.fillRect(e.x - 13, e.y - e.r - 11, 26 * e.hp / e.maxHp, 2); } }
function drawMine(mn) { var blink = (Math.floor(tSec * 6) % 2) === 0; ctx.save(); ctx.translate(mn.x, mn.y); ctx.strokeStyle = 'rgba(204,255,0,.2)'; ctx.lineWidth = 1; ctx.beginPath(); ctx.arc(0, 0, 26, 0, 7); ctx.stroke(); if (mn.arm &gt; 0) { ctx.globalAlpha = .5; ctx.fillStyle = '#80a000'; ctx.beginPath(); ctx.arc(0, 0, 8, 0, 7); ctx.fill(); ctx.globalAlpha = 1; } else { ctx.fillStyle = blink ? '#ff0040' : '#7a1a0a'; ctx.shadowColor = '#ff0040'; ctx.shadowBlur = blink ? 10 : 4; ctx.beginPath(); ctx.arc(0, 0, 8, 0, 7); ctx.fill(); ctx.shadowBlur = 0; ctx.fillStyle = '#ccff00'; ctx.beginPath(); ctx.arc(0, 0, 3, 0, 7); ctx.fill(); } ctx.restore(); }
function drawMortarShot(ms) { var p = 1 - ms.t / ms.fuse; ctx.save(); var al = .4 + .3 * Math.sin(tSec * 15); ctx.strokeStyle = 'rgba(255,0,64,' + al + ')'; ctx.lineWidth = 2; ctx.setLineDash([6, 6]); ctx.lineDashOffset = -tSec * 40; ctx.beginPath(); ctx.arc(ms.tx, ms.ty, 60, 0, 7); ctx.stroke(); ctx.setLineDash([]); ctx.fillStyle = 'rgba(255,0,64,' + (0.10 + 0.10 * p) + ')'; ctx.beginPath(); ctx.arc(ms.tx, ms.ty, 60 * p, 0, 7); ctx.fill(); var lx = ms.sx + (ms.tx - ms.sx) * p, ly = ms.sy + (ms.ty - ms.sy) * p - Math.sin(p * Math.PI) * 50; ctx.fillStyle = 'rgba(0,0,0,.4)'; ctx.beginPath(); ctx.ellipse(ms.sx + (ms.tx - ms.sx) * p, ms.sy + (ms.ty - ms.sy) * p, 6 + 4 * p, 3 + 2 * p, 0, 0, 7); ctx.fill(); ctx.fillStyle = '#702010'; ctx.shadowColor = '#ffd700'; ctx.shadowBlur = 6; ctx.beginPath(); ctx.arc(lx, ly, 5, 0, 7); ctx.fill(); ctx.shadowBlur = 0; ctx.restore(); }
function drawDrone(d) { ctx.save(); ctx.translate(d.px, d.py); if (d.type === 'shield') { ctx.strokeStyle = 'rgba(0,240,255,' + (d.charges &gt; 0 ? 0.8 : 0.25) + ')'; ctx.lineWidth = 2; ctx.shadowColor = '#00f0ff'; ctx.shadowBlur = 10; ctx.beginPath(); ctx.arc(0, 0, 12, 0, 7); ctx.stroke(); ctx.fillStyle = 'rgba(0,240,255,.25)'; ctx.beginPath(); ctx.arc(0, 0, 8, 0, 7); ctx.fill(); ctx.shadowBlur = 0; for (var i = 0; i &lt; 3; i++) { ctx.fillStyle = i &lt; d.charges ? '#00f0ff' : 'rgba(0,240,255,.2)'; ctx.beginPath(); ctx.arc(-8 + i * 8, 16, 2.5, 0, 7); ctx.fill(); } } else { ctx.fillStyle = '#3a86ff'; ctx.shadowColor = '#3a86ff'; ctx.shadowBlur = 8; ctx.beginPath(); ctx.arc(0, 0, 7, 0, 7); ctx.fill(); ctx.shadowBlur = 0; ctx.fillStyle = '#0a1a50'; ctx.beginPath(); ctx.arc(0, 0, 3, 0, 7); ctx.fill(); ctx.strokeStyle = 'rgba(58,134,255,.6)'; ctx.lineWidth = 1.5; ctx.beginPath(); ctx.arc(0, 0, 10, tSec * 10, tSec * 10 + 2); ctx.stroke(); } ctx.restore(); }

function draw() { ctx.save(); ctx.fillStyle = arena.bg2; ctx.fillRect(0, 0, W, H); if (shake &gt; 0) ctx.translate(R(-shake, shake) * .5, R(-shake, shake) * .5); if (recoil &gt; 0 &amp;&amp; !P.dead) ctx.translate(-Math.cos(P.a) * recoil, -Math.sin(P.a) * recoil); var gg = ctx.createRadialGradient(W / 2, H / 2, 100, W / 2, H / 2, 620); gg.addColorStop(0, arena.bg1); gg.addColorStop(1, arena.bg2); ctx.fillStyle = gg; ctx.fillRect(-20, -20, W + 40, H + 40); ctx.strokeStyle = arena.gridC; ctx.lineWidth = 1; for (var x = 0; x &lt;= GW; x++) { ctx.beginPath(); ctx.moveTo(x * CS, 0); ctx.lineTo(x * CS, H); ctx.stroke(); } for (var y = 0; y &lt;= GH; y++) { ctx.beginPath(); ctx.moveTo(0, y * CS); ctx.lineTo(W, y * CS); ctx.stroke(); } stars.forEach(function(s) { ctx.globalAlpha = s.b * (0.6 + 0.4 * Math.sin(tSec * s.s)); ctx.fillStyle = arena.starC; ctx.beginPath(); ctx.arc(s.x, s.y, s.r, 0, 7); ctx.fill(); }); ctx.globalAlpha = 1; deco.forEach(function(d) { ctx.fillStyle = arena.decoC + (d.a + 0.08 * Math.sin(tSec * d.s)) + ')'; ctx.beginPath(); ctx.ellipse(d.x, d.y, d.r, d.r * .7, 0, 0, 7); ctx.fill(); }); craters.forEach(function(c) { ctx.fillStyle = 'rgba(0,0,0,.5)'; ctx.beginPath(); ctx.ellipse(c.x, c.y, c.r, c.r * .8, 0, 0, 7); ctx.fill(); ctx.strokeStyle = arena.decoC + '.2)'; ctx.lineWidth = 2; ctx.beginPath(); ctx.ellipse(c.x, c.y - 2, c.r * .8, c.r * .6, 0, Math.PI, 6.28); ctx.stroke(); }); for (var cy = 0; cy &lt; GH; cy++) for (var cx = 0; cx &lt; GW; cx++) { var v = grid[cy * GW + cx]; if (!v) continue; var px = cx * CS, py = cy * CS; if (v === 1) { ctx.fillStyle = arena.brick; ctx.fillRect(px, py, CS, CS); ctx.fillStyle = 'rgba(0,0,0,.4)'; ctx.fillRect(px, py + 14, CS, 3); ctx.fillRect(px + 14, py, 3, 14); ctx.fillRect(px + 6, py + 17, 3, 15); ctx.strokeStyle = arena.brickBrd; ctx.lineWidth = 1.5; ctx.strokeRect(px + 1, py + 1, CS - 2, CS - 2); } else { ctx.fillStyle = arena.steel; ctx.fillRect(px, py, CS, CS); ctx.strokeStyle = arena.steelBrd; ctx.lineWidth = 2; ctx.strokeRect(px + 1, py + 1, CS - 2, CS - 2); ctx.fillStyle = arena.steelBrd; [[6, 6], [26, 6], [6, 26], [26, 26]].forEach(function(q) { ctx.beginPath(); ctx.arc(px + q[0], py + q[1], 2, 0, 7); ctx.fill(); }); } } mines.forEach(drawMine); mortarShots.forEach(drawMortarShot); warns.forEach(function(w) { var pl = .5 + .5 * Math.sin(tSec * 12); ctx.strokeStyle = 'rgba(255,215,0,' + (0.35 + pl * .5) + ')'; ctx.lineWidth = 3; ctx.beginPath(); ctx.arc(w.x, w.y, (w.type === 'boss' ? 44 : 24) + pl * 6, 0, 7); ctx.stroke(); ctx.fillStyle = 'rgba(255,215,0,.9)'; ctx.font = '700 16px Courier New'; ctx.textAlign = 'center'; ctx.fillText('!', w.x, w.y + 6); }); pickups.forEach(function(pk) { if (pk.t &lt; 2 &amp;&amp; Math.floor(pk.t * 6) % 2) return; var bob = Math.sin(pk.ph) * 4; ctx.save(); ctx.translate(pk.x, pk.y + bob); ctx.fillStyle = 'rgba(0,0,0,.5)'; ctx.beginPath(); ctx.ellipse(0, 14 - bob, 13, 5, 0, 0, 7); ctx.fill(); var col = pk.tp === 'shield' ? '#00f0ff' : pk.tp === 'rapid' ? '#ff2d95' : pk.tp === 'double' ? '#ffd700' : pk.tp === 'drone' ? '#3a86ff' : '#00f0ff'; ctx.shadowColor = col; ctx.shadowBlur = 20; ctx.fillStyle = arena.bg2; rr(-14, -14, 28, 28, 7); ctx.fill(); ctx.strokeStyle = col; ctx.lineWidth = 2.5; ctx.stroke(); ctx.shadowBlur = 0; ctx.font = '15px Courier New'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; ctx.fillStyle = col; ctx.fillText(pk.tp === 'shield' ? 'S' : pk.tp === 'rapid' ? 'F' : pk.tp === 'double' ? 'x2' : pk.tp === 'drone' ? 'D' : '+', 0, 1); ctx.textBaseline = 'alphabetic'; ctx.restore(); }); enemies.forEach(function(e) { if (e.aiming) { var mx = e.x + Math.cos(e.a) * (e.r + e.barrel), my = e.y + Math.sin(e.a) * (e.r + e.barrel); ctx.save(); ctx.strokeStyle = 'rgba(255,0,64,' + (.45 + .4 * Math.sin(tSec * 20)) + ')'; ctx.lineWidth = 2; ctx.setLineDash([7, 7]); ctx.lineDashOffset = -tSec * 60; ctx.beginPath(); ctx.moveTo(mx, my); ctx.lineTo(e.aimX, e.aimY); ctx.stroke(); ctx.setLineDash([]); ctx.beginPath(); ctx.arc(e.aimX, e.aimY, 9, 0, 7); ctx.stroke(); ctx.restore(); } }); enemies.forEach(function(e) { var sc = e.spawnT &gt; 0 ? 1 - e.spawnT / .35 : 1; ctx.save(); if (sc &lt; 1) { ctx.translate(e.x, e.y); ctx.scale(sc, sc); ctx.translate(-e.x, -e.y); } if (e.fly) drawFly(e); else drawTank(e, PAL[e.type]); ctx.restore(); }); if (!P.dead) { var alpha = P.inv &gt; 0 &amp;&amp; Math.floor(tSec * 10) % 2 ? 0.35 : 1; drawTank(P, PAL.player, alpha); P.drones.forEach(drawDrone); if (P.shield) { ctx.save(); ctx.strokeStyle = 'rgba(0,240,255,' + (.6 + .3 * Math.sin(tSec * 6)) + ')'; ctx.lineWidth = 3; ctx.shadowColor = '#00f0ff'; ctx.shadowBlur = 16; ctx.beginPath(); ctx.arc(P.x, P.y, P.r + 9, 0, 7); ctx.stroke(); ctx.restore(); } if (P.rapidT &gt; 0) { ctx.save(); ctx.fillStyle = 'rgba(255,45,149,.15)'; ctx.shadowColor = '#ff2d95'; ctx.shadowBlur = 30; ctx.beginPath(); ctx.arc(P.x, P.y, P.r + 20, 0, 7); ctx.fill(); ctx.restore(); } } bullets.forEach(function(b) { var col = b.foe ? (b.big ? '#ff0040' : '#ffd700') : (b.pierce ? '#3a86ff' : '#00f0ff'); ctx.save(); ctx.shadowColor = col; ctx.shadowBlur = 16; ctx.fillStyle = col; ctx.beginPath(); ctx.arc(b.x, b.y, b.r, 0, 7); ctx.fill(); ctx.shadowBlur = 0; ctx.globalAlpha = .3; ctx.fillStyle = '#fff'; ctx.beginPath(); ctx.arc(b.x - b.vx * .01, b.y - b.vy * .01, b.r * .5, 0, 7); ctx.fill(); ctx.globalAlpha = 1; ctx.restore(); }); bushes.forEach(function(b) { ctx.save(); ctx.globalAlpha = .65; for (var i = 0; i &lt; 5; i++) { var a = b.s + i * 1.26, rr3 = b.r * .55, bx = b.x + Math.cos(a) * b.r * .4, by = b.y + Math.sin(a) * b.r * .4; ctx.fillStyle = arena.brick; ctx.beginPath(); ctx.arc(bx, by, rr3, 0, 7); ctx.fill(); } ctx.strokeStyle = arena.brickBrd; ctx.lineWidth = 1; for (i = 0; i &lt; 5; i++) { var a2 = b.s + i * 1.26, rr4 = b.r * .55, bx2 = b.x + Math.cos(a2) * b.r * .4, by2 = b.y + Math.sin(a2) * b.r * .4; ctx.beginPath(); ctx.arc(bx2, by2, rr4, 0, 7); ctx.stroke(); } ctx.restore(); }); parts.forEach(function(p) { var k = p.t / p.m; if (p.tp === 'fire') { ctx.globalAlpha = k; ctx.fillStyle = p.c; ctx.shadowColor = p.c; ctx.shadowBlur = 10; ctx.beginPath(); ctx.arc(p.x, p.y, p.r * k, 0, 7); ctx.fill(); ctx.shadowBlur = 0; } else if (p.tp === 'smoke') { ctx.globalAlpha = k * .4; ctx.fillStyle = arena.dustC; ctx.beginPath(); ctx.arc(p.x, p.y, p.r, 0, 7); ctx.fill(); } else if (p.tp === 'deb') { ctx.globalAlpha = k; ctx.save(); ctx.translate(p.x, p.y); ctx.rotate(p.a2); ctx.fillStyle = p.c || arena.dustC; ctx.fillRect(-p.r, -p.r, p.r * 2, p.r * 2); ctx.restore(); } else if (p.tp === 'spark') { ctx.globalAlpha = k; ctx.strokeStyle = p.c; ctx.shadowColor = p.c; ctx.shadowBlur = 8; ctx.lineWidth = 2; ctx.beginPath(); ctx.moveTo(p.x, p.y); ctx.lineTo(p.x - p.vx * .03, p.y - p.vy * .03); ctx.stroke(); ctx.shadowBlur = 0; } else if (p.tp === 'dust') { ctx.globalAlpha = k * .3; ctx.fillStyle = arena.dustC; ctx.beginPath(); ctx.arc(p.x, p.y, p.r, 0, 7); ctx.fill(); } else if (p.tp === 'flash') { ctx.globalAlpha = k; ctx.fillStyle = 'rgba(255,255,255,.85)'; ctx.shadowColor = '#fff'; ctx.shadowBlur = 30; ctx.beginPath(); ctx.arc(p.x, p.y, p.r * k * 2, 0, 7); ctx.fill(); ctx.shadowBlur = 0; } else if (p.tp === 'tur') { ctx.globalAlpha = Math.min(1, k * 1.5); ctx.save(); ctx.translate(p.x, p.y); ctx.rotate(p.a2); ctx.fillStyle = p.pal.b2; ctx.beginPath(); ctx.arc(0, 0, p.r, 0, 7); ctx.fill(); ctx.fillStyle = p.pal.bar; ctx.fillRect(0, -2.5, p.r + 9, 5); ctx.restore(); } ctx.globalAlpha = 1; }); rings.forEach(function(r) { ctx.globalAlpha = Math.max(r.a, 0); ctx.strokeStyle = r.col; ctx.shadowColor = r.col; ctx.shadowBlur = 12; ctx.lineWidth = 3; ctx.beginPath(); ctx.arc(r.x, r.y, r.r, 0, 7); ctx.stroke(); ctx.shadowBlur = 0; ctx.globalAlpha = 1; }); floats.forEach(function(f) { ctx.globalAlpha = Math.min(1, f.t); ctx.font = (f.big ? '800 20px' : '800 14px') + ' Courier New'; ctx.textAlign = 'center'; ctx.fillStyle = 'rgba(0,0,0,.7)'; ctx.shadowColor = f.col; ctx.shadowBlur = 10; ctx.fillText(f.txt, f.x, f.y); ctx.shadowBlur = 0; ctx.globalAlpha = 1; }); ctx.restore(); }

var last = performance.now();
function loop(t) { var dt = Math.min((t - last) / 1000, .033); last = t; if (state === 'playing' || state === 'clearing' || state === 'dying') update(dt); else { tSec += dt; for (var i = parts.length - 1; i &gt;= 0; i--) { var p = parts[i]; p.t -= dt; p.x += (p.vx || 0) * dt; p.y += (p.vy || 0) * dt; if (p.t &lt;= 0) parts.splice(i, 1); } for (i = rings.length - 1; i &gt;= 0; i--) { var r = rings[i]; r.r += r.vr * dt; r.a -= dt * 2.2; if (r.a &lt;= 0) rings.splice(i, 1); } for (i = floats.length - 1; i &gt;= 0; i--) { floats[i].t -= dt; floats[i].y -= 28 * dt; if (floats[i].t &lt;= 0) floats.splice(i, 1); } shake = Math.max(0, shake - dt * 30); recoil = Math.max(0, recoil - dt * 24); } draw(); requestAnimationFrame(loop); }

/* ═══ INPUT ═══ */
addEventListener('keydown', function(e) { if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Space'].indexOf(e.code) &gt;= 0) e.preventDefault(); keys[e.code] = true; if (e.code === 'KeyP' || e.code === 'Escape') { if (document.body.classList.contains('bron-game-mode')) return; togglePause(); } if (e.code === 'Digit1') setWeapon('cannon'); if (e.code === 'Digit2') setWeapon('mg'); if (e.code === 'Digit3') setWeapon('laser'); });
addEventListener('keyup', function(e) { keys[e.code] = false; });
addEventListener('blur', function() { if (state === 'playing' || state === 'clearing') togglePause(true); });
document.addEventListener('visibilitychange', function() { if (document.hidden &amp;&amp; (state === 'playing' || state === 'clearing')) togglePause(true); });
function togglePause(force) { if (state === 'playing' || state === 'clearing') { state = 'paused'; $('bronPauseOv').classList.add('bron-show'); if (musicOn &amp;&amp; musicG) { try { musicG.gain.linearRampToValueAtTime(.02, AC.currentTime + .2); } catch (e) {} } } else if (state === 'paused' &amp;&amp; !force) { state = 'playing'; $('bronPauseOv').classList.remove('bron-show'); if (musicOn &amp;&amp; musicG) { try { musicG.gain.linearRampToValueAtTime(.07, AC.currentTime + .2); } catch (e) {} } } }
window.bronResume = function() { togglePause(); };

var joy = $('bronJoy'), stick = $('bronStick'), fireBtn = $('bronFire'), joyId = null;
function handleJoy(cx2, cy2) { var rect = joy.getBoundingClientRect(), cxr = rect.left + rect.width / 2, cyr = rect.top + rect.height / 2; var dx = cx2 - cxr, dy = cy2 - cyr, d = hyp(dx, dy), max = 40, mx = dx, my = dy; if (d &gt; max) { var rt = max / d; mx = dx * rt; my = dy * rt; } stick.style.transform = 'translate(' + mx + 'px,' + my + 'px)'; joyX = mx / max; joyY = my / max; }
joy.addEventListener('touchstart', function(e) { e.preventDefault(); var t = e.changedTouches[0]; joyId = t.identifier; handleJoy(t.clientX, t.clientY); }, { passive: false });
joy.addEventListener('touchmove', function(e) { e.preventDefault(); for (var i = 0; i &lt; e.changedTouches.length; i++) { if (e.changedTouches[i].identifier === joyId) { handleJoy(e.changedTouches[i].clientX, e.changedTouches[i].clientY); break; } } }, { passive: false });
function endJoy(e) { for (var i = 0; i &lt; e.changedTouches.length; i++) { if (e.changedTouches[i].identifier === joyId) { joyId = null; joyX = 0; joyY = 0; stick.style.transform = 'translate(0,0)'; break; } } }
joy.addEventListener('touchend', endJoy); joy.addEventListener('touchcancel', endJoy);
var mdJoy = false; joy.addEventListener('mousedown', function(e) { mdJoy = true; handleJoy(e.clientX, e.clientY); }); addEventListener('mousemove', function(e) { if (mdJoy) handleJoy(e.clientX, e.clientY); }); addEventListener('mouseup', function() { if (mdJoy) { mdJoy = false; joyX = 0; joyY = 0; stick.style.transform = 'translate(0,0)'; } });
fireBtn.addEventListener('touchstart', function(e) { e.preventDefault(); initAudio(); firing = true; }, { passive: false });
fireBtn.addEventListener('touchend', function(e) { e.preventDefault(); firing = false; }, { passive: false });
fireBtn.addEventListener('mousedown', function(e) { e.preventDefault(); initAudio(); firing = true; });
fireBtn.addEventListener('mouseup', function() { firing = false; });

window.bronStart = function() { initAudio(); fullReset(); };
window.bronMenu = function() { hideAll(); $('bronMenuOv').classList.add('bron-show'); state = 'menu'; genArena(); updateComboDisplay(); renderTopList(); stopMusic(); };
window.bronToggleMusic = function() { initAudio(); var btn = $('bronMusbtn'); if (!musicOn) { startMusic(); btn.classList.add('bron-on'); btn.textContent = '♫ ON'; } else { stopMusic(); btn.classList.remove('bron-on'); btn.textContent = '♫ OFF'; } };

/* ══════════════════════════════════════════════════════════
   ФИНАЛЬНЫЙ ПОЛНОЭКРАННЫЙ РЕЖИМ (по образцу v2)
   ══════════════════════════════════════════════════════════ */
var monitor = $('bronMonitor');
var origParent = monitor.parentNode, origNext = monitor.nextSibling;
var inGame = false, realFs = false;

function fireResize() { window.dispatchEvent(new Event('resize')); }

function enterGame() {
  if (inGame) return; inGame = true;
  /* Прячем сайт */
  document.body.classList.add('bron-game-mode');
  /* Вырываем игру из сайтовой колонки и ставим в &lt;body&gt; */
  document.body.appendChild(monitor);
  /* Пробуем настоящий Fullscreen на самом мониторе */
  var r = monitor.requestFullscreen || monitor.webkitRequestFullscreen || monitor.mozRequestFullScreen || monitor.msRequestFullscreen;
  if (r) {
    try {
      var p = r.call(monitor);
      if (p &amp;&amp; p.then) { p.then(function() { realFs = true; }).catch(function() { realFs = false; }); }
      else realFs = true;
    } catch (e) { realFs = false; }
  }
  /* Многократный resize — чтобы canvas точно пересчитался */
  setTimeout(fireResize, 50);
  setTimeout(fireResize, 150);
  setTimeout(fireResize, 400);
  setTimeout(fireResize, 800);
  setTimeout(fireResize, 1500);
}
function exitGame() {
  if (!inGame) return; inGame = false;
  document.body.classList.remove('bron-game-mode');
  if (realFs &amp;&amp; document.fullscreenElement) {
    var x = document.exitFullscreen || document.webkitExitFullscreen || document.mozCancelFullScreen || document.msExitFullscreen;
    if (x) { try { x.call(document); } catch (e) {} }
    realFs = false;
  }
  monitor.style.cssText = '';
  if (origNext) origParent.insertBefore(monitor, origNext);
  else origParent.appendChild(monitor);
  setTimeout(fireResize, 50);
  setTimeout(fireResize, 200);
}
function toggleGameFS() { if (inGame) exitGame(); else enterGame(); }

/* Клонируем кнопку ⛶ — сбрасывает ВСЕ старые обработчики */
var oldBtn = $('bronFsbtn');
if (oldBtn) {
  var newBtn = oldBtn.cloneNode(true);
  oldBtn.parentNode.replaceChild(newBtn, oldBtn);
  newBtn.addEventListener('click', function(e) { e.stopPropagation(); e.preventDefault(); toggleGameFS(); });
}

/* F11 — в capture-фазе, чтобы перебить старые обработчики */
window.addEventListener('keydown', function(e) {
  if (e.key === 'F11') { e.preventDefault(); e.stopImmediatePropagation(); toggleGameFS(); }
}, true);

/* Если браузер сам вышел из Fullscreen (Esc) — выходим из игрового режима */
['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange', 'MSFullscreenChange'].forEach(function(ev) {
  document.addEventListener(ev, function() {
    if (!document.fullscreenElement &amp;&amp; !document.webkitFullscreenElement &amp;&amp; realFs) {
      realFs = false;
      if (inGame) exitGame();
    }
    setTimeout(fireResize, 100);
    setTimeout(fireResize, 300);
  });
});

window.addEventListener('orientationchange', function() { setTimeout(fireResize, 200); });
window.addEventListener('resize', function() { if (inGame) setTimeout(fireResize, 100); });

genArena(); syncHUD(); updateComboDisplay(); requestAnimationFrame(loop);
console.log('✅ БРОНЕНОСЕЦ v10 (финальная версия) загружен');

} catch (err) {
  console.error('❌ БРОНЕНОСЕЦ КРИТИЧЕСКАЯ ОШИБКА:', err);
  alert('❌ БРОНЕНОСЕЦ: Ошибка запуска!\n\n' + err.message);
}
})();
&lt;/script&gt;

&lt;style&gt;
/* Поднимаем z-index кнопки ⛶ ВЫШЕ всех оверлеев меню */
.bron-fsbtn, 
#bronFsbtn,
button.bron-fsbtn {
  z-index: 99999 !important;
  pointer-events: auto !important;
  cursor: pointer !important;
  position: absolute !important;
  top: 8px !important;
  right: 8px !important;
}
/* Убеждаемся что оверлеи имеют корректный z-index */
.bron-ov { z-index: 50 !important; }
.bron-ov * { pointer-events: auto !important; }
&lt;/style&gt;
&lt;script&gt;
(function(){
  "use strict";
  // Двойная страховка через JS — на случай если CSS не применился
  var btn = document.getElementById('bronFsbtn');
  if(btn){
    btn.style.setProperty('z-index', '99999', 'important');
    btn.style.setProperty('pointer-events', 'auto', 'important');
    btn.style.setProperty('cursor', 'pointer', 'important');
    btn.style.setProperty('position', 'absolute', 'important');
    btn.style.setProperty('top', '8px', 'important');
    btn.style.setProperty('right', '8px', 'important');
    // Пересоздаём обработчик клика на случай если он потерялся
    var newBtn = btn.cloneNode(true);
    btn.parentNode.replaceChild(newBtn, btn);
    newBtn.addEventListener('click', function(e){
      e.stopPropagation();
      e.preventDefault();
      // Вызываем существующий toggle если есть
      var monitor = document.getElementById('bronMonitor');
      if(!monitor) return;
      var inGame = document.body.classList.contains('bron-game-mode');
      if(inGame){
        document.body.classList.remove('bron-game-mode');
        if(document.fullscreenElement){
          (document.exitFullscreen||document.webkitExitFullscreen||function(){}).call(document);
        }
      } else {
        document.body.classList.add('bron-game-mode');
        document.body.appendChild(monitor);
        var r = monitor.requestFullscreen||monitor.webkitRequestFullscreen;
        if(r) try{r.call(monitor);}catch(e){}
      }
      setTimeout(function(){window.dispatchEvent(new Event('resize'));}, 100);
      setTimeout(function(){window.dispatchEvent(new Event('resize'));}, 400);
      setTimeout(function(){window.dispatchEvent(new Event('resize'));}, 900);
    });
  }
  console.log('✅ ФИКС кнопки ⛶ применён — теперь работает в свёрнутом режиме');
})();
&lt;/script&gt;

&lt;style&gt;
/* В игровом режиме прячем ВСЁ кроме .bron-game (монитор НЕ трогаем) */
body.bron-game-mode{overflow:hidden!important;background:#000!important;}
body.bron-game-mode &gt; *:not(.bron-game){display:none!important;}
/* Растягиваем игру на весь экран */
body.bron-game-mode .bron-game{
  position:fixed!important;inset:0!important;z-index:2147483647!important;
  width:100vw!important;height:100vh!important;max-width:none!important;max-height:none!important;margin:0!important;
}
body.bron-game-mode .bron-monitor{
  position:absolute!important;inset:0!important;width:100%!important;height:100%!important;
  max-width:none!important;max-height:none!important;aspect-ratio:auto!important;border-radius:0!important;
}
body.bron-game-mode .bron-screen{width:100%!important;height:100%!important;}
/* СТРАХОВКА: если старый код всё же перенёс монитор в body — показываем его */
body.bron-game-mode &gt; .bron-monitor{display:block!important;}
body.bron-game-mode &gt; .bron-monitor &gt; .bron-screen{display:block!important;}
/* Настоящий fullscreen на самой игре */
.bron-game:fullscreen,.bron-game:-webkit-full-screen{
  position:fixed!important;inset:0!important;width:100vw!important;height:100vh!important;
  max-width:none!important;max-height:none!important;margin:0!important;background:#02000a!important;
}
&lt;/style&gt;
&lt;script&gt;
(function(){
"use strict";
var game=document.getElementById('bronGame');
var monitor=document.getElementById('bronMonitor');
if(!game||!monitor)return;
var inGame=false,realFs=false;
function fireResize(){window.dispatchEvent(new Event('resize'));}
function enter(){
  if(inGame)return;inGame=true;
  document.body.classList.add('bron-game-mode');
  var r=game.requestFullscreen||game.webkitRequestFullscreen||game.mozRequestFullScreen;
  if(r){try{var p=r.call(game);if(p&amp;&amp;p.then){p.then(function(){realFs=true;}).catch(function(){realFs=false;});}else realFs=true;}catch(e){realFs=false;}}
  setTimeout(fireResize,60);setTimeout(fireResize,200);setTimeout(fireResize,500);setTimeout(fireResize,1000);
}
function exit(){
  if(!inGame)return;inGame=false;
  document.body.classList.remove('bron-game-mode');
  if(realFs&amp;&amp;document.fullscreenElement){var x=document.exitFullscreen||document.webkitExitFullscreen||document.mozCancelFullScreen;if(x){try{x.call(document);}catch(e){}}realFs=false;}
  setTimeout(fireResize,60);setTimeout(fireResize,250);
}
function toggle(){inGame?exit():enter();}
window.bronToggleFS2=toggle;

/* Клонируем кнопку ⛶ — сбрасывает ВСЕ старые обработчики */
var btn=document.getElementById('bronFsbtn');
if(btn){var nb=btn.cloneNode(true);btn.parentNode.replaceChild(nb,btn);
  nb.addEventListener('click',function(e){e.stopPropagation();e.preventDefault();toggle();});}

/* F11 (capture) */
window.addEventListener('keydown',function(e){if(e.key==='F11'){e.preventDefault();e.stopImmediatePropagation();toggle();}},true);

/* РЕМОНТ: если старый код перенёс монитор в body — возвращаем его в игру */
var mo=new MutationObserver(function(){
  if(monitor.parentNode===document.body){game.appendChild(monitor);}
});
mo.observe(document.body,{childList:true});

/* Выход из fullscreen по Esc */
['fullscreenchange','webkitfullscreenchange','mozfullscreenchange'].forEach(function(ev){
  document.addEventListener(ev,function(){
    if(!document.fullscreenElement&amp;&amp;!document.webkitFullscreenElement&amp;&amp;realFs){realFs=false;if(inGame)exit();}
    setTimeout(fireResize,120);
  });
});
window.addEventListener('resize',function(){if(inGame)setTimeout(fireResize,100);});
console.log('✅ Фикс чёрного экрана v2 применён');
})();
&lt;/script&gt;

&lt;style&gt;
body.bron-theater-final{overflow:hidden!important;background:#000!important;}
body.bron-theater-final &gt; *:not(.bron-game){display:none!important;}
body.bron-theater-final .bron-game{
  position:fixed!important;inset:0!important;z-index:2147483647!important;
  width:100vw!important;height:100vh!important;max-width:none!important;max-height:none!important;margin:0!important;
}
body.bron-theater-final .bron-monitor{
  position:absolute!important;inset:0!important;width:100%!important;height:100%!important;
  max-width:none!important;max-height:none!important;aspect-ratio:auto!important;border-radius:0!important;
}
body.bron-theater-final .bron-screen{width:100%!important;height:100%!important;}
&lt;/style&gt;
&lt;script&gt;
(function(){
"use strict";
var game=document.getElementById('bronGame');
var monitor=document.getElementById('bronMonitor');
if(!game||!monitor)return;
var inTheater=false;
function fireResize(){window.dispatchEvent(new Event('resize'));}
function enterTheater(){ if(inTheater)return; inTheater=true;
  document.body.classList.add('bron-theater-final');
  setTimeout(fireResize,60);setTimeout(fireResize,200);setTimeout(fireResize,500); }
function exitTheater(){ if(!inTheater)return; inTheater=false;
  document.body.classList.remove('bron-theater-final');
  setTimeout(fireResize,60);setTimeout(fireResize,250); }
function toggle(){ inTheater?exitTheater():enterTheater(); }
window.bronTheaterToggle=toggle;

/* Перехватываем клик по ЛЮБОЙ кнопке ⛶ (включая старые клоны) — только наш обработчик */
document.addEventListener('click',function(e){
  var t=e.target.closest?e.target.closest('.bron-fsbtn'):null;
  if(t){ e.stopPropagation(); e.preventDefault(); toggle(); }
},true);

/* F11 — наш режим */
window.addEventListener('keydown',function(e){ if(e.key==='F11'){ e.preventDefault(); toggle(); } },true);
/* Esc — выход */
window.addEventListener('keydown',function(e){ if(e.key==='Escape'&amp;&amp;inTheater){ exitTheater(); } },true);

/* РЕМОНТ: если старая заплатка утащила монитор в body или повесила bron-game-mode — чиним */
var mo=new MutationObserver(function(){
  var broken=false;
  if(monitor.parentNode===document.body){ game.appendChild(monitor); broken=true; }
  if(document.body.classList.contains('bron-game-mode')){ document.body.classList.remove('bron-game-mode'); broken=true; }
  if(document.fullscreenElement){ var x=document.exitFullscreen||document.webkitExitFullscreen; if(x){try{x.call(document);}catch(e){}} broken=true; }
  if(broken &amp;&amp; !inTheater) enterTheater();
});
mo.observe(document.body,{childList:true,attributes:true,attributeFilter:['class']});

console.log('✅ Финальный полный экран подключён (без чёрного экрана)');
})();
&lt;/script&gt;

&lt;style&gt;
/* Отменяем скрытие прямых детей body — иначе прячется обёртка, а в ней игра */
body.bron-theater-final &gt; *:not(.bron-game){display:block!important;}
/* Делаем игру непрозрачной и поверх всего — она сама закроет сайт */
body.bron-theater-final .bron-game{
  background:#02000a!important;
  position:fixed!important;inset:0!important;z-index:2147483647!important;
  width:100vw!important;height:100vh!important;max-width:none!important;max-height:none!important;margin:0!important;
}
body.bron-theater-final .bron-monitor{
  position:absolute!important;inset:0!important;width:100%!important;height:100%!important;
  max-width:none!important;max-height:none!important;aspect-ratio:auto!important;border-radius:0!important;
  background:#02000a!important;
}
body.bron-theater-final .bron-screen{width:100%!important;height:100%!important;background:#02000a!important;}
&lt;/style&gt;
&lt;script&gt;
(function(){
"use strict";
var game=document.getElementById('bronGame');
if(!game)return;
/* Страховка: как только включился театральный режим — форсируем пересчёт canvas */
var mo=new MutationObserver(function(){
  if(document.body.classList.contains('bron-theater-final')){
    setTimeout(function(){window.dispatchEvent(new Event('resize'));},50);
    setTimeout(function(){window.dispatchEvent(new Event('resize'));},250);
    setTimeout(function(){window.dispatchEvent(new Event('resize'));},600);
  }
});
mo.observe(document.body,{attributes:true,attributeFilter:['class']});
console.log('✅ Фикс чёрного экрана (обёртка сайта) применён');
})();
&lt;/script&gt;</subtitle>
  <updated>2026-09-18T09:27:14Z</updated>
  <logo>https://pandoraburo.ru/ssl/u/pic/ef/f66878aa6d11f1abb9f7ceed6face4/-/image%20%284%29.jpg</logo>
  <author>
    <name>1592962</name>
    <uri>https://www.pandoraburo.ru/</uri>
  </author>
</feed>
