<?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/igra-dlya-biznesa</id>
  <link href="https://www.pandoraburo.ru/igra-dlya-biznesa.xml" rel="self"/>
  <title>Игра для бизнеса</title>
  <subtitle type="html">
&lt;html lang="ru"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
&lt;title&gt;Контур влияния&lt;/title&gt;
&lt;style&gt;
  :root{
    --bg:#0b1020; --panel:#131a30; --panel2:#1a2340; --line:#2a3660;
    --text:#e8ecff; --muted:#8a96c0; --gold:#ffd166; --red:#ff5c7a;
    --green:#3ddc97; --blue:#5aa9ff; --purple:#b388ff;
  }
  *{box-sizing:border-box}
  body{
    margin:0; font-family:'Segoe UI',system-ui,-apple-system,sans-serif;
    color:var(--text); min-height:100vh; overflow-x:hidden;
    transition:background 1s ease;
    background:radial-gradient(circle at 20% 10%, #16204a 0%, var(--bg) 45%, #05070f 100%);
  }
  body.pos-outside{background:radial-gradient(circle at 20% 10%, #16204a 0%, var(--bg) 45%, #05070f 100%)}
  body.pos-inside{background:radial-gradient(circle at 50% 40%, #3a0f1e 0%, #1a0a14 50%, #05070f 100%)}
  body.pos-inside .panel{border-color:#5a2030}
  body.pos-inside .panel h2{color:#ff8fa3}
  body.pos-inside::after{
    content:''; position:fixed; inset:0; pointer-events:none; z-index:0;
    background:radial-gradient(circle at 50% 50%, transparent 40%, rgba(255,92,122,.12) 100%);
    opacity:0;
    animation:pulseDanger 2.4s ease-in-out 0.8s infinite;
  }
  @keyframes pulseDanger{
    0%,100%{opacity:0}
    50%{opacity:.7}
  }
  body::before{
    content:''; position:fixed; inset:0; pointer-events:none; z-index:0;
    background:
      radial-gradient(circle at 80% 20%, rgba(90,169,255,.08), transparent 40%),
      radial-gradient(circle at 10% 80%, rgba(179,136,255,.08), transparent 40%);
  }
  .wrap{position:relative; z-index:1; max-width:1200px; margin:0 auto; padding:20px}
  h1{
    font-size:clamp(22px,3vw,34px); margin:0 0 4px; letter-spacing:2px;
    background:linear-gradient(90deg,var(--gold),var(--blue),var(--purple));
    -webkit-background-clip:text; background-clip:text; color:transparent;
    text-align:center;
  }
  .sub{text-align:center; color:var(--muted); margin-bottom:18px; font-size:13px; letter-spacing:1px}

  #startScreen{
    position:fixed; inset:0; z-index:100; display:flex; flex-direction:column;
    align-items:center; justify-content:center; padding:24px;
    background:radial-gradient(circle at 50% 30%, #16204a, #05070f 70%);
    overflow-y:auto;
    transition:opacity .3s;
  }
  #startScreen.hide{display:none}
  #startScreen h2{font-size:clamp(18px,2.4vw,26px); letter-spacing:2px; margin:0 0 6px; color:var(--gold); text-align:center}
  #startScreen p.hint{color:var(--muted); font-size:13px; margin:0 0 22px; text-align:center; max-width:620px}
  .blocks{display:grid; grid-template-columns:repeat(auto-fit,minmax(240px,1fr)); gap:14px; max-width:1100px; width:100%; transition:opacity .3s}
  .block{
    cursor:pointer; background:linear-gradient(160deg,var(--panel),var(--panel2));
    border:1px solid var(--line); border-radius:16px; padding:16px;
    transition:transform .2s cubic-bezier(.2,.9,.3,1), box-shadow .25s, border-color .25s;
    position:relative; overflow:hidden;
  }
  .block::after{
    content:''; position:absolute; inset:0; border-radius:16px; pointer-events:none;
    background:radial-gradient(circle at 50% 0%, rgba(255,209,102,.12), transparent 60%);
    opacity:0; transition:opacity .3s;
  }
  .block:hover{transform:translateY(-4px) scale(1.015); border-color:var(--gold); box-shadow:0 14px 40px rgba(255,209,102,.18)}
  .block:hover::after{opacity:1}
  .block .emoji{font-size:30px; line-height:1}
  .block .bname{font-weight:800; font-size:15px; margin:8px 0 4px; letter-spacing:.5px}
  .block .bdesc{font-size:11px; color:var(--muted); line-height:1.5; min-height:52px}
  .block .bstats{display:flex; gap:6px; flex-wrap:wrap; margin-top:8px}
  .block .bstats span{font-size:10px; padding:3px 7px; border-radius:20px; background:#0e1428; border:1px solid var(--line); color:#aab6e0}
  .block .bspec{font-size:11px; color:var(--green); margin-top:8px; line-height:1.4}

  .grid{display:grid; grid-template-columns:1fr 1fr; gap:14px}
  @media(max-width:860px){.grid{grid-template-columns:1fr}}
  .panel{
    background:linear-gradient(160deg,var(--panel),var(--panel2));
    border:1px solid var(--line); border-radius:14px; padding:14px;
    box-shadow:0 8px 30px rgba(0,0,0,.35);
    transition:border-color .6s;
  }
  .panel h2{font-size:13px; letter-spacing:2px; color:var(--muted); margin:0 0 10px; text-transform:uppercase; transition:color .6s}
  .stats{display:grid; grid-template-columns:1fr 1fr; gap:10px}
  .stat{background:#0e1428; border:1px solid var(--line); border-radius:10px; padding:8px 10px; position:relative; overflow:hidden}
  .stat .lbl{font-size:11px; color:var(--muted); letter-spacing:1px}
  .stat .val{font-size:20px; font-weight:700; transition:transform .2s, color .3s}
  .stat .val.bump{transform:scale(1.25); color:var(--gold)}
  .stat .val.hurt{transform:scale(1.25); color:var(--red)}
  .bar{height:6px; background:#0a0f22; border-radius:4px; margin-top:6px; overflow:hidden}
  .bar &gt; i{display:block; height:100%; border-radius:4px; transition:width .5s cubic-bezier(.2,.9,.3,1)}
  .u &gt; i{background:linear-gradient(90deg,#3ddc97,#5aa9ff)}
  .e &gt; i{background:linear-gradient(90deg,#ff5c7a,#ff9f43)}
  .k &gt; i{background:linear-gradient(90deg,#b388ff,#5aa9ff)}
  .r &gt; i{background:linear-gradient(90deg,#ffd166,#ff9f43)}
  .cards{display:flex; flex-direction:column; gap:8px}
  .card{
    background:#0e1428; border:1px solid var(--line); border-radius:10px;
    padding:10px 12px; display:flex; justify-content:space-between; align-items:center;
    gap:8px; animation:deal .45s cubic-bezier(.2,.9,.3,1) both;
  }
  @keyframes deal{from{opacity:0; transform:translateY(14px) scale(.96)}to{opacity:1; transform:none}}
  .card .info{flex:1; min-width:0}
  .card .title{font-weight:600; font-size:14px}
  .card .meta{font-size:11px; color:var(--muted); margin-top:2px}
  .tag{display:inline-block; font-size:10px; padding:2px 6px; border-radius:6px; margin-right:4px; background:#1d2748; color:#aab6e0}
  .btn{
    cursor:pointer; border:none; border-radius:10px; padding:9px 14px;
    font-weight:700; font-size:13px; letter-spacing:.5px; color:#08101f;
    background:linear-gradient(135deg,var(--gold),#ffb347);
    transition:transform .12s ease, box-shadow .2s ease, filter .2s;
    box-shadow:0 4px 14px rgba(255,209,102,.25);
  }
  .btn:hover{transform:translateY(-1px); filter:brightness(1.06)}
  .btn:active{transform:scale(.96)}
  .btn:disabled{opacity:.35; cursor:not-allowed; filter:grayscale(.6); box-shadow:none}
  .btn.ghost{background:#1a2340; color:var(--text); box-shadow:none; border:1px solid var(--line)}
  .btn.danger{background:linear-gradient(135deg,var(--red),#ff9f43); box-shadow:0 4px 14px rgba(255,92,122,.25)}
  .btn.small{padding:6px 10px; font-size:11px}
  .btn.special{
    background:linear-gradient(135deg,var(--purple),var(--blue));
    color:#fff; box-shadow:0 4px 16px rgba(179,136,255,.35);
    position:relative; overflow:hidden;
  }
  .btn.special::after{
    content:''; position:absolute; inset:0; background:linear-gradient(120deg,transparent,rgba(255,255,255,.25),transparent);
    transform:translateX(-100%); animation:shine 2.4s infinite;
  }
  @keyframes shine{to{transform:translateX(100%)}}
  .btn.special:disabled::after{display:none}

  .topbar{display:flex; flex-wrap:wrap; gap:10px; align-items:center; justify-content:space-between; margin-bottom:14px}
  .chips{display:flex; gap:6px; flex-wrap:wrap}
  .chip{font-size:11px; padding:4px 9px; border-radius:20px; background:#1a2340; border:1px solid var(--line); color:#aab6e0}
  .chip b{color:var(--gold)}
  .chip.danger{border-color:var(--red); color:#ff8fa3; animation:pulseChip 1.4s infinite}
  @keyframes pulseChip{0%,100%{box-shadow:0 0 0 0 rgba(255,92,122,.4)}50%{box-shadow:0 0 0 6px rgba(255,92,122,0)}}
  .log{
    height:120px; overflow-y:auto; font-size:12px; color:#aab6e0;
    background:#0a0f22; border:1px solid var(--line); border-radius:10px; padding:8px 10px;
    line-height:1.5;
  }
  .log div{animation:slide .3s ease both}
  @keyframes slide{from{opacity:0; transform:translateX(-6px)}to{opacity:1; transform:none}}
  .log .good{color:var(--green)}
  .log .bad{color:var(--red)}
  .log .warn{color:var(--gold)}
  .log .spec{color:var(--purple)}
  .dice{
    width:64px; height:64px; border-radius:14px; display:flex; align-items:center; justify-content:center;
    font-size:30px; font-weight:800; background:linear-gradient(145deg,#1d2748,#0e1428);
    border:1px solid var(--line); box-shadow:inset 0 2px 10px rgba(255,255,255,.06), 0 6px 20px rgba(0,0,0,.4);
  }
  .dice.rolling{animation:roll .6s cubic-bezier(.2,.9,.3,1)}
  @keyframes roll{
    0%{transform:rotate(0) scale(1)}
    25%{transform:rotate(90deg) scale(1.15)}
    50%{transform:rotate(180deg) scale(.95)}
    75%{transform:rotate(270deg) scale(1.1)}
    100%{transform:rotate(360deg) scale(1)}
  }
  .flash{animation:flash .5s ease}
  @keyframes flash{0%{box-shadow:0 0 0 0 rgba(255,209,102,.7)}100%{box-shadow:0 0 0 24px rgba(255,209,102,0)}}
  .shake{animation:shake .4s ease}
  @keyframes shake{0%,100%{transform:translateX(0)}25%{transform:translateX(-6px)}75%{transform:translateX(6px)}}
  .result{
    margin-top:10px; padding:10px 12px; border-radius:10px; font-size:13px; font-weight:600;
    background:#0a0f22; border:1px solid var(--line); min-height:42px; display:flex; align-items:center; gap:8px;
    transition:border-color .3s, color .3s;
  }
  .result.win{border-color:rgba(61,220,151,.5); color:var(--green)}
  .result.lose{border-color:rgba(255,92,122,.5); color:var(--red)}
  .actions{display:flex; flex-wrap:wrap; gap:8px; margin-top:10px}
  .slot{font-size:11px; color:var(--muted); margin-top:6px}
  .think{position:fixed; inset:0; background:rgba(5,7,15,.78); display:none; align-items:center; justify-content:center; z-index:50; backdrop-filter:blur(4px)}
  .think.show{display:flex; animation:fade .25s ease}
  @keyframes fade{from{opacity:0}to{opacity:1}}
  .think .box{background:linear-gradient(160deg,#182142,#0e1428); border:1px solid var(--line); border-radius:16px; padding:22px 26px; max-width:440px; text-align:center; box-shadow:0 20px 60px rgba(0,0,0,.6); animation:pop .35s cubic-bezier(.2,.9,.3,1)}
  @keyframes pop{from{transform:scale(.9); opacity:0}to{transform:scale(1); opacity:1}}
  .think h3{margin:0 0 6px; color:var(--gold); letter-spacing:1px}
  .think p{color:#aab6e0; font-size:13px; line-height:1.5}
  .think .opts{display:flex; gap:10px; justify-content:center; margin-top:16px; flex-wrap:wrap}
  .confetti{position:fixed; width:8px; height:8px; pointer-events:none; z-index:60; border-radius:2px}
  @keyframes fall{to{transform:translateY(110vh) rotate(720deg); opacity:0}}

  .playerBlock{
    display:flex; align-items:center; gap:10px; background:#0e1428; border:1px solid var(--line);
    border-radius:10px; padding:8px 10px; margin-bottom:10px;
  }
  .playerBlock .emoji{font-size:26px}
  .playerBlock .pbname{font-weight:800; font-size:14px}
  .playerBlock .pbspec{font-size:11px; color:var(--muted)}
  .cooldown{font-size:10px; color:var(--gold); margin-top:2px}

  .posSwitch{
    display:flex; align-items:center; justify-content:space-between; gap:10px;
    background:#0e1428; border:1px solid var(--line); border-radius:10px;
    padding:8px 12px; margin-bottom:10px; transition:border-color .4s;
  }
  .posSwitch.danger{border-color:var(--red)}
  .posLabel{font-size:12px; font-weight:700; letter-spacing:1px}
  .posLabel.inside{color:var(--red)}
  .posLabel.outside{color:var(--green)}
  .toggle{
    position:relative; width:64px; height:30px; border-radius:20px; cursor:pointer;
    background:#1a2340; border:1px solid var(--line); transition:background .4s;
  }
  .toggle.inside{background:linear-gradient(90deg,#5a0f1e,#ff5c7a)}
  .toggle .knob{
    position:absolute; top:2px; left:2px; width:24px; height:24px; border-radius:50%;
    background:#e8ecff; transition:left .35s cubic-bezier(.2,.9,.3,1), background .35s;
  }
  .toggle.inside .knob{left:36px; background:#ffd166}

  .oceanPanel{position:relative; overflow:hidden}
  .sharkHPWrap{margin-bottom:8px}
  .sharkHP{height:14px; background:#1a0a14; border-radius:8px; overflow:hidden; border:1px solid #5a2030; position:relative}
  .sharkHP &gt; i{display:block; height:100%; background:linear-gradient(90deg,#ff5c7a,#ff9f43); transition:width .6s cubic-bezier(.2,.9,.3,1); box-shadow:0 0 12px rgba(255,92,122,.7)}
  .sharkHP.enraged &gt; i{background:linear-gradient(90deg,#ff0000,#ff5c7a,#ffd166); animation:hpPulse 1s infinite}
  @keyframes hpPulse{0%,100%{filter:brightness(1)}50%{filter:brightness(1.5)}}
  .sharkHPLabel{display:flex; justify-content:space-between; font-size:11px; color:var(--muted); margin-bottom:4px}
  .sharkHPLabel b{color:var(--red)}
  .ocean{
    position:relative; height:220px; border-radius:10px; overflow:hidden;
    background:linear-gradient(180deg,#0a2a4a,#061626);
    border:1px solid #1a3a5a;
    transition:background .8s;
  }
  .ocean.inside{background:linear-gradient(180deg,#3a0f1e,#1a0a14)}
  .ocean .grid-lines{
    position:absolute; inset:0; opacity:.25;
    background-image:linear-gradient(rgba(90,169,255,.2) 1px,transparent 1px),linear-gradient(90deg,rgba(90,169,255,.2) 1px,transparent 1px);
    background-size:20px 20px;
  }
  .shark{
    position:absolute; font-size:30px; transition:left .6s cubic-bezier(.2,.9,.3,1), top .6s cubic-bezier(.2,.9,.3,1);
    z-index:3; filter:drop-shadow(0 0 10px rgba(255,92,122,.7));
  }
  .shark.enraged{font-size:38px; filter:drop-shadow(0 0 18px rgba(255,0,0,.9)) drop-shadow(0 0 30px rgba(255,92,122,.6)); animation:sharkRage .6s infinite}
  @keyframes sharkRage{0%,100%{transform:rotate(-4deg)}50%{transform:rotate(4deg)}}
  .playerDot{
    position:absolute; font-size:24px; z-index:4; transition:left .5s, top .5s;
    filter:drop-shadow(0 0 8px rgba(61,220,151,.8));
  }
  .bubble{
    position:absolute; width:6px; height:6px; border-radius:50%; background:rgba(90,169,255,.6);
    animation:rise 3s linear infinite;
  }
  @keyframes rise{from{transform:translateY(0); opacity:.8}to{transform:translateY(-200px); opacity:0}}
  .oceanInfo{display:flex; justify-content:space-between; font-size:11px; color:var(--muted); margin-top:8px; flex-wrap:wrap; gap:6px}
  .wound{
    position:absolute; font-size:14px; z-index:5; pointer-events:none;
    animation:woundPop .9s ease-out forwards;
  }
  @keyframes woundPop{0%{transform:scale(0); opacity:1}50%{transform:scale(1.6); opacity:1}100%{transform:scale(1); opacity:0}}

  #finalScreen{
    position:fixed; inset:0; z-index:200; display:none; flex-direction:column;
    align-items:center; justify-content:center; padding:24px;
    background:radial-gradient(circle at 50% 30%, #16204a, #05070f 80%);
    overflow-y:auto;
  }
  #finalScreen.show{display:flex; animation:fade .6s ease}
  #finalScreen h2{font-size:clamp(20px,3vw,30px); letter-spacing:3px; margin:0 0 8px; color:var(--gold); text-align:center}
  #finalScreen .verdict{font-size:13px; color:var(--muted); margin-bottom:20px; text-align:center; max-width:600px; line-height:1.6}
  .graphWrap{background:linear-gradient(160deg,var(--panel),var(--panel2)); border:1px solid var(--line); border-radius:16px; padding:16px; max-width:620px; width:100%; box-shadow:0 20px 60px rgba(0,0,0,.6)}
  .graphWrap svg{width:100%; height:auto; display:block}
  .finalStats{display:grid; grid-template-columns:1fr 1fr 1fr; gap:10px; margin-top:16px; max-width:620px; width:100%}
  .finalStats .fs{background:#0e1428; border:1px solid var(--line); border-radius:10px; padding:10px; text-align:center}
  .finalStats .fs .l{font-size:10px; color:var(--muted); letter-spacing:1px}
  .finalStats .fs .v{font-size:22px; font-weight:800; color:var(--gold)}
  .finalStats .fs .v.bad{color:var(--red)}
  .finalStats .fs .v.good{color:var(--green)}
  #finalScreen .btn{margin-top:18px}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;div id="startScreen"&gt;
  &lt;h2&gt;Выбери блок входа&lt;/h2&gt;
  &lt;p class="hint"&gt;Это твоя стартовая позиция в системе. Хочешь азарта и угрозы — включи режим «Акула в воде»: у акулы есть здоровье, её можно ранить точными задачами.&lt;/p&gt;
  &lt;div style="margin-bottom:14px; display:flex; gap:10px; align-items:center; flex-wrap:wrap; justify-content:center"&gt;
    &lt;label style="font-size:12px; color:#aab6e0; cursor:pointer; display:flex; gap:6px; align-items:center"&gt;
      &lt;input type="checkbox" id="sharkMode" style="accent-color:#ff5c7a; width:16px; height:16px" /&gt;
      Режим «Акула в воде» — ИИ-угроза с полосой здоровья
    &lt;/label&gt;
  &lt;/div&gt;
  &lt;div class="blocks" id="blocks"&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;div class="wrap" id="game" style="display:none"&gt;
  &lt;h1&gt;КОНТУР ВЛИЯНИЯ&lt;/h1&gt;
  &lt;div class="sub"&gt;СИЛА НЕ РЕШАЕТ · РЕШАЕТ ДОСТУП К УПРАВЛЯЮЩЕМУ ВХОДУ&lt;/div&gt;

  &lt;div class="topbar"&gt;
    &lt;div class="chips"&gt;
      &lt;span class="chip"&gt;Раунд &lt;b id="round"&gt;1&lt;/b&gt;/8&lt;/span&gt;
      &lt;span class="chip"&gt;Действий &lt;b id="actions"&gt;2&lt;/b&gt;&lt;/span&gt;
      &lt;span class="chip"&gt;Прибыль &lt;b id="profit"&gt;0&lt;/b&gt;&lt;/span&gt;
      &lt;span class="chip"&gt;ОК &lt;b id="ok"&gt;0&lt;/b&gt;&lt;/span&gt;
      &lt;span class="chip" id="modeChip" style="display:none"&gt;&lt;/span&gt;
    &lt;/div&gt;
    &lt;div class="chips"&gt;
      &lt;span class="chip" id="eventChip"&gt;Событие: —&lt;/span&gt;
      &lt;button class="btn ghost small" id="restart"&gt;Заново&lt;/button&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="grid"&gt;
    &lt;div class="panel"&gt;
      &lt;h2&gt;Твой контур&lt;/h2&gt;
      &lt;div class="playerBlock" id="playerBlock"&gt;&lt;/div&gt;

      &lt;div class="posSwitch" id="posSwitch"&gt;
        &lt;div class="posLabel outside" id="posLabel"&gt;Снаружи системы · безопасно&lt;/div&gt;
        &lt;div class="toggle" id="posToggle"&gt;&lt;div class="knob"&gt;&lt;/div&gt;&lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="stats"&gt;
        &lt;div class="stat"&gt;&lt;div class="lbl"&gt;УПРАВЛЯЕМОСТЬ&lt;/div&gt;&lt;div class="val" id="uVal"&gt;3&lt;/div&gt;&lt;div class="bar u"&gt;&lt;i id="uBar" style="width:30%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;
        &lt;div class="stat"&gt;&lt;div class="lbl"&gt;ЭКСПОЗИЦИЯ&lt;/div&gt;&lt;div class="val" id="eVal"&gt;2&lt;/div&gt;&lt;div class="bar e"&gt;&lt;i id="eBar" style="width:20%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;
        &lt;div class="stat"&gt;&lt;div class="lbl"&gt;КАНАЛ&lt;/div&gt;&lt;div class="val" id="kVal"&gt;2&lt;/div&gt;&lt;div class="bar k"&gt;&lt;i id="kBar" style="width:20%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;
        &lt;div class="stat"&gt;&lt;div class="lbl"&gt;РЕСУРС&lt;/div&gt;&lt;div class="val" id="rVal"&gt;5&lt;/div&gt;&lt;div class="bar r"&gt;&lt;i id="rBar" style="width:50%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="slot" id="slots"&gt;Слоты задач: 0/2 · Исполнители: 0/2 · Риски: 0&lt;/div&gt;
      &lt;div class="actions"&gt;
        &lt;button class="btn special small" id="btnSpecial"&gt;Способность блока&lt;/button&gt;
        &lt;button class="btn small" id="btnChannel"&gt;Усилить канал (−2 Р)&lt;/button&gt;
        &lt;button class="btn small" id="btnExpo"&gt;Снизить экспозицию (−1 Р)&lt;/button&gt;
        &lt;button class="btn small ghost" id="btnRisk"&gt;Снять риск (−1 Р)&lt;/button&gt;
      &lt;/div&gt;
      &lt;div class="result" id="result"&gt;Выбери задачу и нажми «Закрыть» — кубик решит.&lt;/div&gt;
      &lt;div style="display:flex; gap:14px; align-items:center; margin-top:10px"&gt;
        &lt;div class="dice" id="dice"&gt;?&lt;/div&gt;
        &lt;div style="font-size:12px; color:var(--muted); line-height:1.5"&gt;
          Проверка: &lt;b style="color:var(--text)"&gt;d6 + У + К + бонус&lt;/b&gt;&lt;br /&gt;
          против сложности задачи.
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="panel"&gt;
      &lt;h2&gt;Рынок задач&lt;/h2&gt;
      &lt;div class="cards" id="tasks"&gt;&lt;/div&gt;
      &lt;h2 style="margin-top:14px"&gt;Исполнители&lt;/h2&gt;
      &lt;div class="cards" id="workers"&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="panel oceanPanel" id="oceanPanel" style="margin-top:14px; display:none"&gt;
    &lt;h2&gt;Океан · режим «Акула в воде»&lt;/h2&gt;
    &lt;div class="sharkHPWrap"&gt;
      &lt;div class="sharkHPLabel"&gt;
        &lt;span&gt;? Акула-босс&lt;/span&gt;
        &lt;span&gt;&lt;b id="sharkHPText"&gt;6 / 6&lt;/b&gt; HP&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class="sharkHP" id="sharkHPBar"&gt;&lt;i id="sharkHPFill" style="width:100%"&gt;&lt;/i&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ocean" id="ocean"&gt;
      &lt;div class="grid-lines"&gt;&lt;/div&gt;
      &lt;div class="playerDot" id="playerDot"&gt;?&lt;/div&gt;
      &lt;div class="shark" id="shark"&gt;?&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="oceanInfo"&gt;
      &lt;span&gt;Позиция: &lt;b id="posInfo" style="color:var(--green)"&gt;вне системы&lt;/b&gt;&lt;/span&gt;
      &lt;span&gt;Дистанция: &lt;b id="distInfo" style="color:var(--gold)"&gt;—&lt;/b&gt;&lt;/span&gt;
      &lt;span&gt;Состояние: &lt;b id="sharkState" style="color:var(--gold)"&gt;спокойна&lt;/b&gt;&lt;/span&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="panel" style="margin-top:14px"&gt;
    &lt;h2&gt;Журнал&lt;/h2&gt;
    &lt;div class="log" id="log"&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="think" id="think"&gt;
  &lt;div class="box"&gt;
    &lt;h3 id="thinkTitle"&gt;Подумай&lt;/h3&gt;
    &lt;p id="thinkText"&gt;&lt;/p&gt;
    &lt;div class="opts" id="thinkOpts"&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div id="finalScreen"&gt;
  &lt;h2&gt;КОНТУР СОБРАН&lt;/h2&gt;
  &lt;div class="verdict" id="finalVerdict"&gt;&lt;/div&gt;
  &lt;div class="graphWrap"&gt;&lt;svg id="finalGraph" viewbox="0 0 400 260"&gt;&lt;/svg&gt;&lt;/div&gt;
  &lt;div class="finalStats" id="finalStats"&gt;&lt;/div&gt;
  &lt;button class="btn" id="playAgain"&gt;Играть заново&lt;/button&gt;
&lt;/div&gt;

&lt;script&gt;
(() =&gt; {
  const $ = id =&gt; document.getElementById(id);
  const rand = n =&gt; Math.floor(Math.random()*n);
  const pick = a =&gt; a[rand(a.length)];

  let AC = null;
  const ac = () =&gt; AC || (AC = new (window.AudioContext||window.webkitAudioContext)());
  function beep(freq=440, dur=.08, type='sine', vol=.06){
    try{
      const c = ac(), o = c.createOscillator(), g = c.createGain();
      o.type = type; o.frequency.value = freq;
      g.gain.setValueAtTime(vol, c.currentTime);
      g.gain.exponentialRampToValueAtTime(.0001, c.currentTime+dur);
      o.connect(g); g.connect(c.destination);
      o.start(); o.stop(c.currentTime+dur);
    }catch(e){}
  }
  const sfx = {
    click: ()=&gt;beep(520,.05,'square',.04),
    deal: ()=&gt;beep(700,.06,'triangle',.04),
    roll: ()=&gt;{beep(300,.05,'sawtooth',.03); setTimeout(()=&gt;beep(500,.05,'sawtooth',.03),60);},
    win: ()=&gt;{[523,659,784,1046].forEach((f,i)=&gt;setTimeout(()=&gt;beep(f,.12,'triangle',.07),i*90));},
    lose: ()=&gt;{[330,247,196].forEach((f,i)=&gt;setTimeout(()=&gt;beep(f,.14,'sawtooth',.06),i*110));},
    risk: ()=&gt;beep(180,.18,'square',.05),
    special: ()=&gt;{[440,660,880].forEach((f,i)=&gt;setTimeout(()=&gt;beep(f,.1,'sine',.07),i*70));},
    select: ()=&gt;{[523,784].forEach((f,i)=&gt;setTimeout(()=&gt;beep(f,.08,'triangle',.05),i*80));},
    bite: ()=&gt;{[120,80,60].forEach((f,i)=&gt;setTimeout(()=&gt;beep(f,.2,'sawtooth',.1),i*80));},
    dive: ()=&gt;beep(200,.3,'sine',.06),
    wound: ()=&gt;{[880,660,440].forEach((f,i)=&gt;setTimeout(()=&gt;beep(f,.09,'square',.07),i*60));},
    rage: ()=&gt;{[80,60,80,60,100].forEach((f,i)=&gt;setTimeout(()=&gt;beep(f,.15,'sawtooth',.1),i*70));}
  };

  const BLOCKS = [
    {id:'fisher', emoji:'?', name:'Рыболов-наблюдатель', desc:'Субъект вне системы. Читает скрытые параметры и выбирает точку.', u:2,e:1,k:3,r:6, spec:'Раз за раунд: перебросить кубик (взять лучший).', cooldownMax:1, cdKey:'reroll'},
    {id:'diver', emoji:'?', name:'Ныряльщик-объект', desc:'Внутри системы. Мало управляет, но умеет переключать позицию.', u:1,e:4,k:2,r:6, spec:'Раз за раунд: снизить Э на 2, потратив 1 Р.', cooldownMax:1, cdKey:'dive'},
    {id:'baker', emoji:'?', name:'Пекарь-экспериментатор', desc:'Ограничивает степени свободы. Форма важнее силы.', u:3,e:1,k:2,r:6, spec:'Раз за раунд: перебросить кубик, но взять худший из двух.', cooldownMax:1, cdKey:'form'},
    {id:'hunter', emoji:'?', name:'Ловчий-тактик', desc:'Против активного объекта. Трение, момент, захват.', u:3,e:2,k:2,r:5, spec:'Раз за раунд: +2 к проверке гибки/сварки.', cooldownMax:1, cdKey:'grip'},
    {id:'broker', emoji:'?', name:'Посредник-дирижёр', desc:'Вне ограничений одного завода. Управляет сетью.', u:3,e:2,k:4,r:5, spec:'Раз за раунд: взять вторую карту исполнителя и выбрать лучшую.', cooldownMax:1, cdKey:'network'},
    {id:'owner', emoji:'?', name:'Бизнесмен-собственник', desc:'Владеет ресурсом, но ограничен капиталом и временем.', u:3,e:2,k:2,r:7, spec:'Раз за раунд: отсрочка +2 Р, но −1 У в конце следующего раунда.', cooldownMax:1, cdKey:'credit'},
    {id:'engineer', emoji:'?', name:'Инженер-консультант', desc:'Продаёт не металл, а решённую задачу.', u:4,e:1,k:2,r:5, spec:'Раз за раунд: посмотреть верхнюю задачу и решить — брать или сбросить.', cooldownMax:1, cdKey:'audit'}
  ];

  const TASK_TYPES = [{t:'Лист',c:3},{t:'Раскрой',c:4},{t:'Гибка',c:5},{t:'Сварка',c:5},{t:'Отливка',c:6},{t:'Сборка',c:6}];
  const CONDITIONS = ['Стандарт','Без трещин','Без предподогрева','Любая форма','Протокол испытаний','Нестандартная толщина','Малый кусок','Хладостойкость −70°C','Закалённая броня','Любой раскрой'];
  const WORKERS = [
    {n:'Гибщик',b:'Гибка',v:2,lim:'слож. ≤6'},{n:'Сварщик',b:'Сварка',v:2,lim:'+1 Р'},
    {n:'Литейщик',b:'Отливка',v:2,lim:'срок +1'},{n:'Резчик',b:'Раскрой',v:2,lim:'без нестанд.'},
    {n:'Сборщик',b:'Сборка',v:2,lim:'нужен протокол'},{n:'Универсал',b:'Любой',v:1,lim:'не 2 раза подряд'},
    {n:'Быстрый',b:'Любой',v:1,lim:'+1 риск при провале'},{n:'Надёжный',b:'Любой',v:1,lim:'слож. ≤5'}
  ];
  const EVENTS = [
    {n:'Санкции',e:'Импортный исполнитель +1 Риск',mod:'risk'},
    {n:'Аврал',e:'Задачи со сроком 1 раунд: +2 ОК',mod:'bonus'},
    {n:'Проверка',e:'Наибольшая Э → Риск',mod:'check'},
    {n:'Дефицит',e:'Исполнители +1 Р',mod:'cost'},
    {n:'Скачок цен',e:'Прибыль за лист +1, за отливку −1',mod:'price'},
    {n:'Новый клиент',e:'Открыта доп. задача',mod:'extra'},
    {n:'Логистический сбой',e:'Доставка не работает',mod:'logi'},
    {n:'Технология',e:'Наибольшая У → +1 ОК',mod:'tech'},
    {n:'Авария на заводе',e:'Один исполнитель сброшен',mod:'crash'},
    {n:'Тишина',e:'Все +1 Ресурс',mod:'calm'},
    {n:'Акула голодна',e:'Акула делает доп. ход',mod:'sharkHungry'},
    {n:'Течение',e:'Акула сносит к тебе',mod:'sharkCurrent'}
  ];

  let S = null;
  let selectedBlock = null;

  function init(block, sharkMode){
    selectedBlock = block;
    S = {
      round:1, actions:2, profit:0, ok:0,
      u:block.u, e:block.e, k:block.k, r:block.r,
      tasks:[], workers:[], hired:[], risks:0,
      event:null, log:[], specialCd:0, specialBuff:null,
      insideSystem:false,
      sharkMode:sharkMode,
      sharkPos:{x:80,y:30}, playerPos:{x:20,y:70},
      sharkHp:6, sharkMaxHp:6, sharkEnraged:false,
      totalWounds:0, creditPenalty:0
    };
    dealTasks(3); dealWorkers(3);
    $('game').style.display = 'block';
    $('startScreen').classList.add('hide');
    if(sharkMode){
      $('oceanPanel').style.display = 'block';
      $('modeChip').style.display = 'inline-block';
      $('modeChip').className = 'chip danger';
      $('modeChip').textContent = '? Акула в воде';
      positionShark(); positionPlayer(); makeBubbles();
      updateSharkHP();
    }
    renderPlayerBlock();
    renderAll();
    log(`Ты вошёл как ${block.name}. ${block.spec}`, 'spec');
    if(sharkMode) log('Акула-босс: 6 HP. Ранишь её задачами на гибку, сварку и отливку — там нужны точность и трение.', 'bad');
    openEvent();
  }

  function renderPlayerBlock(){
    const b = selectedBlock;
    $('playerBlock').innerHTML = `
      &lt;div class="emoji"&gt;${b.emoji}&lt;/div&gt;
      &lt;div style="flex:1"&gt;
        &lt;div class="pbname"&gt;${b.name}&lt;/div&gt;
        &lt;div class="pbspec"&gt;${b.spec}&lt;/div&gt;
        &lt;div class="cooldown" id="cdText"&gt;${S.specialCd &gt; 0 ? 'Перезарядка: ' + S.specialCd + ' раунд' : 'Способность готова'}&lt;/div&gt;
      &lt;/div&gt;
    `;
  }

  function dealTasks(n){
    for(let i=0;i&lt;n;i++){
      const base = pick(TASK_TYPES);
      const diff = base.c + rand(3);
      const term = 1 + rand(3);
      S.tasks.push({id:Math.random(), type:base.t, diff, term, reward:diff, cond:pick(CONDITIONS)});
    }
  }
  function dealWorkers(n){
    for(let i=0;i&lt;n;i++){ const w = {...pick(WORKERS)}; S.workers.push({...w, id:Math.random()}); }
  }

  function bump(id, cls='bump'){
    const el = $(id);
    if(!el) return;
    el.classList.remove('bump','hurt');
    el.classList.add(cls);
    setTimeout(()=&gt;el.classList.remove(cls), 260);
  }

  function setPosUI(){
    document.body.classList.toggle('pos-inside', S.insideSystem === true);
    document.body.classList.toggle('pos-outside', S.insideSystem !== true);
    const t = $('posToggle'), l = $('posLabel'), oc = $('ocean');
    if(!t) return;
    t.classList.toggle('inside', S.insideSystem);
    l.classList.toggle('inside', S.insideSystem);
    l.classList.toggle('outside', !S.insideSystem);
    l.textContent = S.insideSystem ? 'Внутри системы · опасность' : 'Снаружи системы · безопасно';
    if(oc) oc.classList.toggle('inside', S.insideSystem);
    const oi = $('posInfo');
    if(oi){ oi.textContent = S.insideSystem ? 'внутри системы' : 'вне системы'; oi.style.color = S.insideSystem ? 'var(--red)' : 'var(--green)'; }
  }

  function renderAll(){
    $('round').textContent = S.round;
    $('actions').textContent = S.actions;
    $('profit').textContent = S.profit;
    $('ok').textContent = S.ok;
    $('eventChip').textContent = 'Событие: ' + (S.event ? S.event.n : '—');

    $('uVal').textContent = S.u; $('uBar').style.width = (S.u*10)+'%';
    $('eVal').textContent = S.e; $('eBar').style.width = (S.e*10)+'%';
    $('kVal').textContent = S.k; $('kBar').style.width = (S.k*10)+'%';
    $('rVal').textContent = S.r; $('rBar').style.width = (S.r*10)+'%';

    $('slots').textContent = `Слоты задач: ${S.tasks.length}/2 · Исполнители: ${S.hired.length}/2 · Риски: ${S.risks}`;

    $('tasks').innerHTML = S.tasks.map(t=&gt;`
      &lt;div class="card" data-id="${t.id}"&gt;
        &lt;div class="info"&gt;
          &lt;div class="title"&gt;${t.type} &lt;span style="color:var(--muted);font-weight:400"&gt;· слож. ${t.diff}&lt;/span&gt;&lt;/div&gt;
          &lt;div class="meta"&gt;&lt;span class="tag"&gt;срок ${t.term}&lt;/span&gt;&lt;span class="tag"&gt;награда ${t.reward} ОК&lt;/span&gt;&lt;span class="tag"&gt;${t.cond}&lt;/span&gt;&lt;/div&gt;
        &lt;/div&gt;
        &lt;button class="btn small close-task" data-id="${t.id}"&gt;Закрыть&lt;/button&gt;
      &lt;/div&gt;
    `).join('') || '&lt;div style="color:var(--muted);font-size:12px"&gt;Задач нет — жди следующего раунда&lt;/div&gt;';

    $('workers').innerHTML = S.workers.map(w=&gt;`
      &lt;div class="card" data-id="${w.id}"&gt;
        &lt;div class="info"&gt;
          &lt;div class="title"&gt;${w.n}&lt;/div&gt;
          &lt;div class="meta"&gt;&lt;span class="tag"&gt;+${w.v} ${w.b}&lt;/span&gt;&lt;span class="tag"&gt;${w.lim}&lt;/span&gt;&lt;/div&gt;
        &lt;/div&gt;
        &lt;button class="btn small ghost hire" data-id="${w.id}"&gt;Нанять&lt;/button&gt;
      &lt;/div&gt;
    `).join('') || '&lt;div style="color:var(--muted);font-size:12px"&gt;Исполнители разобраны&lt;/div&gt;';

    document.querySelectorAll('.close-task').forEach(b=&gt;b.onclick = ()=&gt;closeTask(+b.dataset.id));
    document.querySelectorAll('.hire').forEach(b=&gt;b.onclick = ()=&gt;hire(+b.dataset.id));

    $('btnChannel').disabled = S.r &lt; 2 || S.k &gt;= 10;
    $('btnExpo').disabled = S.r &lt; 1 || S.e &lt;= 0;
    $('btnRisk').disabled = S.r &lt; 1 || S.risks &lt;= 0;
    const sb = $('btnSpecial');
    sb.disabled = S.specialCd &gt; 0 || S.actions &lt;= 0;
    sb.textContent = S.specialCd &gt; 0 ? `Перезарядка (${S.specialCd})` : 'Способность: ' + selectedBlock.name.split('-')[0];
    renderPlayerBlock();
    setPosUI();
    if(S.sharkMode) updateSharkHP();
  }

  function updateSharkHP(){
    const pct = Math.max(0, S.sharkHp / S.sharkMaxHp * 100);
    const fill = $('sharkHPFill'), bar = $('sharkHPBar'), txt = $('sharkHPText');
    const sh = $('shark');
    if(!fill) return;
    fill.style.width = pct + '%';
    txt.textContent = S.sharkHp + ' / ' + S.sharkMaxHp;
    if(S.sharkEnraged){
      bar.classList.add('enraged'); sh.classList.add('enraged');
      $('sharkState').textContent = 'в ярости'; $('sharkState').style.color = '#ff0000';
    } else {
      bar.classList.remove('enraged'); sh.classList.remove('enraged');
      $('sharkState').textContent = S.sharkHp &lt;= 2 ? 'ранена' : 'спокойна';
      $('sharkState').style.color = S.sharkHp &lt;= 2 ? 'var(--red)' : 'var(--gold)';
    }
  }

  function log(txt, cls=''){
    S.log.unshift({txt, cls});
    $('log').innerHTML = S.log.map(l=&gt;`&lt;div class="${l.cls}"&gt;${l.txt}&lt;/div&gt;`).join('');
  }

  function spend(){ S.actions = Math.max(0, S.actions-1); }

  function hire(id){
    const i = S.workers.findIndex(w=&gt;w.id===id);
    if(i&lt;0) return;
    if(S.hired.length &gt;= 2){ log('Слоты исполнителей заполнены (макс. 2).', 'bad'); return; }
    if(S.actions &lt;= 0){ log('Нет действий в этом раунде.', 'bad'); return; }
    if(S.specialBuff === 'network'){
      const extra = {...pick(WORKERS), id:Math.random()};
      S.specialBuff = null;
      const better = extra.v &gt; S.workers[i].v ? extra : S.workers[i];
      const chosen = better === extra ? extra : S.workers.splice(i,1)[0];
      if(better === extra) S.workers.splice(i,1);
      S.hired.push(chosen);
      log(`Сеть: выбран ${chosen.n} (лучший из двух).`, 'spec');
    } else {
      const w = S.workers.splice(i,1)[0];
      S.hired.push(w);
      log(`Нанят ${w.n}: +${w.v} к «${w.b}», канал +1.`, 'good');
    }
    spend(); S.k = Math.min(10, S.k+1);
    sfx.deal(); bump('kVal');
    renderAll();
  }

  function useSpecial(){
    if(S.specialCd &gt; 0 || S.actions &lt;= 0) return;
    const b = selectedBlock;
    sfx.special();
    switch(b.cdKey){
      case 'reroll': S.specialBuff = 'reroll'; log('Рыболов: следующий бросок — переброс (лучший).', 'spec'); break;
      case 'form': S.specialBuff = 'form'; log('Пекарь: следующий бросок — худший из двух.', 'spec'); break;
      case 'grip': S.specialBuff = 'grip'; log('Ловчий: +2 к следующей гибке/сварке.', 'spec'); break;
      case 'dive':
        if(S.r &lt; 1){ log('Нужен 1 Ресурс.', 'bad'); return; }
        S.r--; S.e = Math.max(0, S.e-2); bump('eVal','hurt');
        log('Ныряльщик: позиция переключена — Э −2, Р −1.', 'spec');
        break;
      case 'network': S.specialBuff = 'network'; log('Посредник: следующее нанятие даст выбор из двух.', 'spec'); break;
      case 'credit': S.r = Math.min(10, S.r+2); S.creditPenalty = 1; bump('rVal');
        log('Бизнесмен: отсрочка +2 Р, −1 У в конце следующего раунда.', 'spec'); break;
      case 'audit':
        if(S.tasks.length){
          const t = S.tasks[0];
          log(`Инженер: верхняя задача — «${t.type}», слож. ${t.diff}, ${t.cond}.`, 'spec');
          S.specialBuff = 'audit';
        } else log('Инженер: задач нет.', 'spec');
        break;
    }
    S.specialCd = b.cooldownMax;
    spend();
    renderAll();
  }

  function closeTask(id){
    const i = S.tasks.findIndex(t=&gt;t.id===id);
    if(i&lt;0) return;
    if(S.actions &lt;= 0){ log('Нет действий в этом раунде.', 'bad'); return; }
    const t = S.tasks[i];

    showThink(t, (mode)=&gt;{
      spend();
      const bonus = S.hired.reduce((a,w)=&gt; (w.b === t.type || w.b === 'Любой') ? a + w.v : a, 0);
      let base = S.u + S.k + bonus;
      let note = '';
      if(S.specialBuff === 'grip' &amp;&amp; (t.type==='Гибка'||t.type==='Сварка')){
        base += 2; note += ' +2 (Ловчий)'; S.specialBuff = null;
        log('Ловчий: +2 к гибке/сварке.', 'spec');
      }
      if(mode === 'safe'){
        if(S.r &lt; 1){ log('Не хватает ресурса.', 'bad'); return; }
        S.r--; base += 2;
        log('Стабилизация: −1 Р, +2 к проверке.', 'warn');
      } else {
        base += 2;
        log('Риск: +2 к проверке, провал даст риск.', 'warn');
      }

      let d = 1 + rand(6);
      if(S.specialBuff === 'reroll'){
        const d2 = 1 + rand(6);
        log(`Рыболов: переброс ${d} → ${d2}, берём лучший (${Math.max(d,d2)}).`, 'spec');
        d = Math.max(d, d2); S.specialBuff = null;
      }
      if(S.specialBuff === 'form'){
        const d2 = 1 + rand(6);
        log(`Пекарь: два броска ${d} и ${d2}, берём худший (${Math.min(d,d2)}).`, 'spec');
        d = Math.min(d, d2); S.specialBuff = null;
      }

      const dice = $('dice');
      dice.classList.add('rolling'); sfx.roll();
      dice.textContent = d;
      setTimeout(()=&gt;dice.classList.remove('rolling'), 650);

      const total = d + base;
      const res = $('result');
      res.classList.remove('win','lose');

      setTimeout(()=&gt;{
        if(total &gt;= t.diff){
          S.ok += t.reward + (S.event?.mod==='bonus' &amp;&amp; t.term===1 ? 2 : 0);
          S.profit += 1;
          S.tasks.splice(i,1);
          res.classList.add('win');
          res.textContent = `Успех! d6(${d}) + ${base}${note} = ${total} ≥ ${t.diff}. +${t.reward} ОК, +1 Прибыль.`;
          sfx.win(); flash(); confetti(); bump('ok');
          log(`«${t.type}» закрыта: ${total} ≥ ${t.diff}. +${t.reward} ОК.`, 'good');
          if(S.sharkMode &amp;&amp; ['Гибка','Сварка','Отливка'].includes(t.type)) woundShark(t.type);
          if(S.tasks.length === 0) dealTasks(1);
        } else {
          S.risks++;
          res.classList.add('lose');
          res.textContent = `Провал. d6(${d}) + ${base}${note} = ${total} &lt; ${t.diff}. +1 Риск.`;
          sfx.lose(); shake(); bump('eVal','hurt');
          log(`«${t.type}» провалена: ${total} &lt; ${t.diff}. +1 Риск.`, 'bad');
        }
        renderAll();
        if(S.sharkMode) moveShark();
        checkRoundEnd();
      }, 380);
    });
  }

  function woundShark(type){
    if(!S.sharkMode || S.sharkHp &lt;= 0) return;
    S.sharkHp = Math.max(0, S.sharkHp - 1);
    S.totalWounds++;
    sfx.wound();
    const w = document.createElement('div');
    w.className = 'wound'; w.textContent = '?';
    w.style.left = S.sharkPos.x + '%'; w.style.top = S.sharkPos.y + '%';
    $('ocean').appendChild(w);
    setTimeout(()=&gt;w.remove(), 900);
    log(`Ты ранил акулу задачей «${type}»! HP: ${S.sharkHp}/${S.sharkMaxHp}.`, 'good');
    if(S.sharkHp &lt;= 3 &amp;&amp; !S.sharkEnraged){
      S.sharkEnraged = true; sfx.rage();
      log('? Акула в ЯРОСТИ! Двигается быстрее и кусает больнее.', 'bad');
      shake();
    }
    if(S.sharkHp &lt;= 0){
      sfx.win(); confetti(); confetti();
      log('? АКУЛА ПОБЕЖДЕНА! Точность и трение сильнее грубой силы.', 'good');
      S.ok += 10; S.profit += 2;
      $('result').classList.remove('lose'); $('result').classList.add('win');
      $('result').textContent = 'Акула побеждена! +10 ОК, +2 Прибыли.';
    }
    updateSharkHP();
  }

  function showThink(t, cb){
    const box = $('think');
    $('thinkTitle').textContent = 'Подумай: как закрывать?';
    $('thinkText').innerHTML = `Задача: &lt;b&gt;${t.type}&lt;/b&gt;, сложность &lt;b&gt;${t.diff}&lt;/b&gt;, «${t.cond}».&lt;br&gt;Запас: У${S.u} + К${S.k} + бонусы. ${S.sharkMode &amp;&amp; ['Гибка','Сварка','Отливка'].includes(t.type) ? '&lt;br&gt;&lt;b style="color:var(--red)"&gt;Эта задача ранит акулу!&lt;/b&gt;' : ''}`;
    $('thinkOpts').innerHTML = `
      &lt;button class="btn" id="optRisk"&gt;Рискнуть (+2, провал → риск)&lt;/button&gt;
      &lt;button class="btn ghost" id="optSafe" ${S.r&lt;1?'disabled':''}&gt;Стабилизировать (−1 Р, +2)&lt;/button&gt;
      &lt;button class="btn ghost" id="optCancel"&gt;Отмена&lt;/button&gt;
    `;
    box.classList.add('show');
    $('optRisk').onclick = ()=&gt;{ box.classList.remove('show'); sfx.click(); cb('risk'); };
    $('optSafe').onclick = ()=&gt;{ box.classList.remove('show'); sfx.click(); cb('safe'); };
    $('optCancel').onclick = ()=&gt;{ box.classList.remove('show'); sfx.click(); };
  }

  function flash(){ const p=document.querySelector('.panel'); p.classList.add('flash'); setTimeout(()=&gt;p.classList.remove('flash'),500); }
  function shake(){ const p=document.querySelector('.panel'); p.classList.add('shake'); setTimeout(()=&gt;p.classList.remove('shake'),400); }
  function confetti(){
    for(let i=0;i&lt;18;i++){
      const c = document.createElement('div');
      c.className = 'confetti';
      c.style.left = (20+rand(60))+'vw'; c.style.top = '10vh';
      c.style.background = pick(['#ffd166','#5aa9ff','#3ddc97','#b388ff','#ff5c7a']);
      c.style.animation = `fall ${1+Math.random()}s ease-in forwards`;
      document.body.appendChild(c);
      setTimeout(()=&gt;c.remove(), 1600);
    }
  }

  function positionShark(){
    const sh = $('shark'); if(!sh) return;
    sh.style.left = S.sharkPos.x + '%'; sh.style.top = S.sharkPos.y + '%';
  }
  function positionPlayer(){
    const pd = $('playerDot'); if(!pd) return;
    pd.style.left = S.playerPos.x + '%'; pd.style.top = S.playerPos.y + '%';
    pd.textContent = S.insideSystem ? '?' : '?';
  }
  function makeBubbles(){
    const ocean = $('ocean'); if(!ocean || ocean.dataset.bubbles) return;
    ocean.dataset.bubbles = '1';
    for(let i=0;i&lt;12;i++){
      const b = document.createElement('div');
      b.className = 'bubble';
      b.style.left = rand(100)+'%'; b.style.top = (60+rand(40))+'%';
      b.style.animationDelay = (Math.random()*3)+'s';
      ocean.appendChild(b);
    }
  }
  function distance(){ return Math.hypot(S.sharkPos.x - S.playerPos.x, S.sharkPos.y - S.playerPos.y); }
  function moveShark(){
    if(!S.sharkMode || S.sharkHp &lt;= 0) return;
    const baseStep = S.sharkEnraged ? 30 : 18;
    const step = S.event?.mod === 'sharkCurrent' ? baseStep + 10 : baseStep;
    const dx = S.playerPos.x - S.sharkPos.x, dy = S.playerPos.y - S.sharkPos.y;
    S.sharkPos.x = Math.max(4, Math.min(94, S.sharkPos.x + Math.sign(dx)*Math.min(Math.abs(dx), step) + (rand(3)-1)*3));
    S.sharkPos.y = Math.max(6, Math.min(88, S.sharkPos.y + Math.sign(dy)*Math.min(Math.abs(dy), step) + (rand(3)-1)*3));
    positionShark();
    const d = distance();
    const distEl = $('distInfo');
    if(distEl){ distEl.textContent = Math.round(d) + '%'; distEl.style.color = d&lt;20?'var(--red)':d&lt;40?'var(--gold)':'var(--green)'; }
    S.playerPos.x = Math.max(4, Math.min(94, S.playerPos.x + (rand(7)-3)));
    S.playerPos.y = Math.max(6, Math.min(88, S.playerPos.y + (rand(7)-3)));
    positionPlayer();
    const biteRange = S.sharkEnraged ? 26 : 20;
    if(d &lt; biteRange){
      sfx.bite();
      S.risks += S.sharkEnraged ? 2 : 1;
      S.e = Math.min(10, S.e + (S.sharkEnraged ? 3 : 2));
      bump('eVal','hurt');
      log(`? Укус${S.sharkEnraged?' в ярости':''}! +${S.sharkEnraged?2:1} Риск, +${S.sharkEnraged?3:2} Э. Переключи позицию!`, 'bad');
      shake();
    } else if(d &lt; 40){ log('? Акула кружит рядом.', 'warn'); }
  }

  function togglePosition(){
    if(!S.sharkMode){ log('Переключение позиции доступно в режиме «Акула в воде».', 'warn'); return; }
    if(S.actions &lt;= 0){ log('Нет действий для переключения.', 'bad'); return; }
    S.insideSystem = !S.insideSystem;
    spend(); sfx.dive();
    if(S.insideSystem){
      S.e = Math.min(10, S.e+2); S.k = Math.min(10, S.k+1);
      log('Вошёл в систему: Э +2, К +1. Акула тебя видит.', 'bad');
      bump('eVal','hurt');
    } else {
      S.e = Math.max(0, S.e-2);
      log('Вышел из системы: Э −2. Безопаснее.', 'good');
      bump('eVal');
    }
    renderAll(); positionPlayer();
  }

  function openEvent(){
    const ev = pick(EVENTS);
    S.event = ev;
    log(`Событие: ${ev.n} — ${ev.e}`, 'warn');
    if(ev.mod === 'calm'){ S.r = Math.min(10,S.r+1); bump('rVal'); }
    if(ev.mod === 'check'){ if(S.e &gt;= 5){ S.risks++; log('Проверка: высокая Э → Риск.', 'bad'); } }
    if(ev.mod === 'tech'){ if(S.u &gt;= 5){ S.ok++; log('Технология: высокая У → +1 ОК.', 'good'); } }
    if(ev.mod === 'extra'){ dealTasks(1); }
    if(ev.mod === 'crash' &amp;&amp; S.hired.length){ const w = S.hired.pop(); log(`Авария: ${w.n} сброшен.`, 'bad'); }
    if(ev.mod === 'sharkHungry' &amp;&amp; S.sharkMode){ moveShark(); moveShark(); log('Акула голодна — два хода!', 'bad'); }
    if(ev.mod === 'sharkCurrent' &amp;&amp; S.sharkMode){ log('Течение несёт акулу к тебе.', 'bad'); moveShark(); }
    renderAll();
  }

  function checkRoundEnd(){
    if(S.actions &gt; 0) return;
    if(S.risks &gt; 2){ S.u = Math.max(0, S.u - (S.risks-2)); log('Риски давят на У.', 'bad'); bump('uVal','hurt'); }
    if(S.e &gt; S.u){ S.ok = Math.max(0, S.ok-1); S.r = Math.max(0,S.r-1); log('Стал объектом: Э &gt; У. −1 ОК, −1 Р.', 'bad'); sfx.risk(); bump('ok','hurt'); bump('rVal','hurt'); }
    if(S.creditPenalty){ S.u = Math.max(0, S.u-1); S.creditPenalty = 0; log('Отсрочка: −1 У.', 'bad'); bump('uVal','hurt'); }
    const expired = S.tasks.filter(t=&gt;t.term===1);
    if(expired.length){ S.tasks = S.tasks.filter(t=&gt;t.term!==1); S.risks += expired.length; log(`Срок истёк: ${expired.length} → Риск.`, 'bad'); }
    S.tasks.forEach(t=&gt;t.term = Math.max(0, t.term-1));

    S.round++;
    if(S.round &gt; 8){ endGame(); return; }
    S.actions = 2;
    if(S.specialCd &gt; 0) S.specialCd--;
    if(S.tasks.length &lt; 2) dealTasks(2 - S.tasks.length);
    if(S.workers.length &lt; 2) dealWorkers(2 - S.workers.length);
    openEvent();
    renderAll();
    if(S.sharkMode){ moveShark(); }
    log(`— Раунд ${S.round} —`, 'warn');
  }

  function endGame(){
    const asym = (S.u + S.k) &gt; (S.e + 2) ? 5 : 0;
    const riskPen = S.risks * 2;
    const objPen = S.e &gt; S.u ? 10 : 0;
    const sharkBonus = S.sharkMode &amp;&amp; S.sharkHp &lt;= 0 ? 10 : 0;
    const total = S.ok + S.hired.length + asym - riskPen - objPen + sharkBonus;
    $('result').classList.remove('win','lose');
    $('result').classList.add(total &gt;= 15 ? 'win' : 'lose');
    $('result').innerHTML = `&lt;b&gt;Финал:&lt;/b&gt; ${total} ОК`;
    log(`Игра окончена. Итог: ${total} ОК.`, total&gt;=15?'good':'bad');
    if(total&gt;=15){ sfx.win(); confetti(); confetti(); } else sfx.lose();
    showFinal(total, asym, riskPen, objPen, sharkBonus);
  }

  function showFinal(total, asym, riskPen, objPen, sharkBonus){
    $('finalScreen').classList.add('show');
    const verdict = total &gt;= 25 ? 'Ты собрал контур, который сильнее любого завода. Управляемость шире экспозиции, сеть диверсифицирована, угроза нейтрализована.'
      : total &gt;= 15 ? 'Ты удержал контур: субъектность сохранена, но зона риска ещё дышит в спину. Есть куда расти.'
      : 'Ты стал объектом. Система сжала тебя с двух сторон. В следующий раз — больше каналов, меньше экспозиции, диверсификация.';
    $('finalVerdict').textContent = verdict;

    const svg = $('finalGraph');
    const W = 400, H = 260, cx = W/2, cy = H/2;
    const nodes = [
      {label:'У', val:S.u, max:10, color:'#3ddc97', angle:-90},
      {label:'Э', val:S.e, max:10, color:'#ff5c7a', angle:-18},
      {label:'К', val:S.k, max:10, color:'#b388ff', angle:54},
      {label:'Р', val:S.r, max:10, color:'#ffd166', angle:126},
      {label:'ОК', val:Math.min(10,S.ok), max:10, color:'#5aa9ff', angle:198}
    ];
    const R = 90;
    let inner = '';
    let polyPoints = [];
    nodes.forEach((n,i)=&gt;{
      const a = n.angle * Math.PI / 180;
      const x = cx + Math.cos(a) * R;
      const y = cy + Math.sin(a) * R;
      const vx = cx + Math.cos(a) * (R * (n.val / n.max));
      const vy = cy + Math.sin(a) * (R * (n.val / n.max));
      polyPoints.push(`${vx},${vy}`);
      inner += `&lt;line x1="${cx}" y1="${cy}" x2="${x}" y2="${y}" stroke="#2a3660" stroke-width="1"/&gt;`;
      inner += `&lt;circle cx="${x}" cy="${y}" r="3" fill="${n.color}"/&gt;`;
      inner += `&lt;text x="${x + Math.cos(a)*14}" y="${y + Math.sin(a)*14 + 3}" fill="${n.color}" font-size="11" font-weight="700" text-anchor="middle"&gt;${n.label} ${n.val}&lt;/text&gt;`;
    });
    inner += `&lt;polygon points="${polyPoints.join(' ')}" fill="rgba(90,169,255,.2)" stroke="#5aa9ff" stroke-width="2"/&gt;`;
    inner += `&lt;circle cx="${cx}" cy="${cy}" r="4" fill="#ffd166"/&gt;`;
    svg.innerHTML = inner;

    $('finalStats').innerHTML = `
      &lt;div class="fs"&gt;&lt;div class="l"&gt;ОК&lt;/div&gt;&lt;div class="v"&gt;${S.ok}&lt;/div&gt;&lt;/div&gt;
      &lt;div class="fs"&gt;&lt;div class="l"&gt;АСИММЕТРИЯ&lt;/div&gt;&lt;div class="v ${asym&gt;0?'good':''}"&gt;${asym&gt;0?'+5':'0'}&lt;/div&gt;&lt;/div&gt;
      &lt;div class="fs"&gt;&lt;div class="l"&gt;РИСКИ&lt;/div&gt;&lt;div class="v bad"&gt;−${riskPen}&lt;/div&gt;&lt;/div&gt;
      &lt;div class="fs"&gt;&lt;div class="l"&gt;ОБЪЕКТ&lt;/div&gt;&lt;div class="v ${objPen&gt;0?'bad':''}"&gt;${objPen&gt;0?'−10':'0'}&lt;/div&gt;&lt;/div&gt;
      &lt;div class="fs"&gt;&lt;div class="l"&gt;АКУЛА&lt;/div&gt;&lt;div class="v ${sharkBonus&gt;0?'good':''}"&gt;${sharkBonus&gt;0?'+10':'0'}&lt;/div&gt;&lt;/div&gt;
      &lt;div class="fs"&gt;&lt;div class="l"&gt;ИТОГО&lt;/div&gt;&lt;div class="v"&gt;${total}&lt;/div&gt;&lt;/div&gt;
    `;
  }

  $('btnSpecial').onclick = ()=&gt;{ useSpecial(); renderAll(); };
  $('btnChannel').onclick = ()=&gt;{ if(S.r&lt;2||S.k&gt;=10) return; S.r-=2; S.k=Math.min(10,S.k+1); sfx.click(); bump('kVal'); log('Канал +1, −2 Р.', 'good'); renderAll(); };
  $('btnExpo').onclick = ()=&gt;{ if(S.r&lt;1||S.e&lt;=0) return; S.r-=1; S.e=Math.max(0,S.e-1); sfx.click(); bump('eVal'); log('Э −1, −1 Р.', 'good'); renderAll(); };
  $('btnRisk').onclick = ()=&gt;{ if(S.r&lt;1||S.risks&lt;=0) return; S.r-=1; S.risks=Math.max(0,S.risks-1); sfx.click(); log('Риск −1, −1 Р.', 'good'); renderAll(); };
  $('restart').onclick = ()=&gt;{ sfx.click(); location.reload(); };
  $('posToggle').onclick = ()=&gt;{ togglePosition(); };
  $('playAgain').onclick = ()=&gt;{ location.reload(); };

  function renderBlocks(){
    $('blocks').innerHTML = BLOCKS.map((b, idx)=&gt;`
      &lt;div class="block" data-idx="${idx}" style="animation:deal .5s ${idx*0.06}s both"&gt;
        &lt;div class="emoji"&gt;${b.emoji}&lt;/div&gt;
        &lt;div class="bname"&gt;${b.name}&lt;/div&gt;
        &lt;div class="bdesc"&gt;${b.desc}&lt;/div&gt;
        &lt;div class="bstats"&gt;&lt;span&gt;У ${b.u}&lt;/span&gt;&lt;span&gt;Э ${b.e}&lt;/span&gt;&lt;span&gt;К ${b.k}&lt;/span&gt;&lt;span&gt;Р ${b.r}&lt;/span&gt;&lt;/div&gt;
        &lt;div class="bspec"&gt;${b.spec}&lt;/div&gt;
      &lt;/div&gt;
    `).join('');
    document.querySelectorAll('.block').forEach(el=&gt;{
      el.onclick = ()=&gt;{
        sfx.select();
        el.style.transform = 'scale(1.05)';
        el.style.borderColor = 'var(--gold)';
        const sharkMode = $('sharkMode').checked;
        setTimeout(()=&gt;{
          $('blocks').style.opacity = '0';
          setTimeout(()=&gt;init(BLOCKS[+el.dataset.idx], sharkMode), 300);
        }, 200);
      };
    });
  }

  renderBlocks();
})();
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</subtitle>
  <updated>2026-11-01T09:35:14Z</updated>
  <logo>https://pandoraburo.ru/ssl/u/pic/07/26436cc3c611f19d9efcd8c4a10874/-/0c723f71762611f1b3964aaba1665535.jpg</logo>
  <author>
    <name>1592962</name>
    <uri>https://www.pandoraburo.ru/</uri>
  </author>
</feed>
