<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>TENEVIK GAMES</title><generator>teletype.in</generator><description><![CDATA[TENEVIK GAMES]]></description><image><url>https://img1.teletype.in/files/83/dd/83ddfd78-3ee0-4728-a1c3-c450f7e265f6.png</url><title>TENEVIK GAMES</title><link>https://teletype.in/@tenevik_games</link></image><link>https://teletype.in/@tenevik_games?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=tenevik_games</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/tenevik_games?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/tenevik_games?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Mon, 14 Sep 2026 01:13:47 GMT</pubDate><lastBuildDate>Mon, 14 Sep 2026 01:13:47 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@tenevik_games/rwCVL51A6zs</guid><link>https://teletype.in/@tenevik_games/rwCVL51A6zs?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=tenevik_games</link><comments>https://teletype.in/@tenevik_games/rwCVL51A6zs?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=tenevik_games#comments</comments><dc:creator>tenevik_games</dc:creator><title>Как я заставил сотни тысяч NPC ходить по лабиринту 1024×1024, убрав поиск пути</title><pubDate>Sun, 16 Aug 2026 13:01:09 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/5f/3b/5f3bec30-d87a-4493-beaa-482d88d49c10.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/5c/82/5c824a02-68b4-4809-88d1-71bfb9ba9d4d.png"></img>Осенью 2004 я сел писать прототип на C++ и SDL2. Задача была одна: мир-лабиринт размером 1024×1024 клетки и толпа персонажей, которые по нему осмысленно ходят — не по скрипту, не по рельсам, а из точки в точку через двери и комнаты.]]></description><content:encoded><![CDATA[
  <p id="ZhCm">Осенью 2004 я сел писать прототип на C++ и SDL2. Задача была одна: мир-лабиринт размером 1024×1024 клетки и толпа персонажей, которые по нему <strong>осмысленно ходят</strong> — не по скрипту, не по рельсам, а из точки в точку через двери и комнаты.</p>
  <p id="Mtgg">Не десятки персонажей. Не тысячи. В константах прототипа стоит:</p>
  <pre id="FCIx">#define WORLD_WIDTH  1024
#define ROOMS        16384
#define CONNECTIONS  128
#define MAX_OBJECTS  1048576</pre>
  <p id="eKbU">Миллион. И это не бравада в дефайне — оно работает, потому что архитектура построена вокруг одной мысли: <strong>персонаж не ищет путь</strong>.</p>
  <figure id="r2Nt" class="m_original">
    <img src="https://img2.teletype.in/files/5c/82/5c824a02-68b4-4809-88d1-71bfb9ba9d4d.png" width="1024" />
    <figcaption>Мир-лабиринт 1024×1024: 16 384 комнаты и сотни тысяч перемещающихся агентов</figcaption>
  </figure>
  <p id="uFmJ">Дальше — как именно. Весь код свой, литературу по алгоритмам я не читал; до всего доходил из первых принципов и проверял на практике. Уже потом выяснил, что у похожей схемы есть название и статьи с середины двухтысячных. Мне это ничего не добавило и не убавило — рассказываю так, как оно строилось.</p>
  <figure id="4FZ3" class="m_original">
    <img src="https://img4.teletype.in/files/bd/14/bd1493f9-abf4-444f-be74-08ea46983bc5.png" width="720" />
    <figcaption>Фрагмент лабиринта в приближении: стены, двери и агенты (красные точки)</figcaption>
  </figure>
  <hr />
  <h2 id="oGdf">Почему очевидный путь не работает</h2>
  <p id="ReQf">Очевидное решение — дать каждому персонажу искать дорогу самому. Волна в ширину от него до цели, или A*.</p>
  <p id="IhYl">Считаем. Мир — миллион клеток. Одна волна в худшем случае обходит весь мир. Персонажей — сотни тысяч. Даже если волна укладывается в микросекунды, помножьте на число персонажей и на число кадров, и вы получите машину, которая занимается исключительно поиском пути.</p>
  <p id="UDhc">Дальше обычно начинается лечение симптомов: кешировать пути, искать не каждый кадр, а раз в N, завести пул потоков, ограничить «активных» персонажей. Всё это отодвигает потолок, но не убирает его — стоимость по-прежнему растёт с числом персонажей.</p>
  <p id="enTh">Я пошёл в другую сторону. Не «как ускорить поиск», а <strong>«как сделать так, чтобы искать не надо было вообще»</strong>.</p>
  <hr />
  <h2 id="Ou2L">Идея: персонаж читает число</h2>
  <p id="WLBh">Представьте, что в каждой клетке мира заранее написано число: «отсюда до двери — столько-то шагов». Тогда персонажу не нужно ничего искать. Он смотрит на своё число, смотрит на числа четырёх соседей, шагает в меньшее. И так, шаг за шагом, приходит к двери.</p>
  <pre id="NW7O">   двери                                      персонаж
     ↓                                            ↓
   ┌───┬───┬───┬───┬───┬───┬───┬───┐
   │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │
   ├───┼───┼───┼───┼───┼───┼───┼───┤
   │ 1 │ 2 │ 3 │ 4 │███│ 6 │ 7 │ 8 │
   ├───┼───┼───┼───┼───┼───┼───┼───┤
   │ 2 │ 3 │ 4 │ 5 │███│ 7 │ 8 │ 9 │
   └───┴───┴───┴───┴───┴───┴───┴───┘

   персонаж стоит на 9 → смотрит соседей: 8 и 8 → шагает на 8 → 7 → ...</pre>
  <p id="gZ49">Стоимость шага — четыре чтения из массива и сравнение. <strong>Константа.</strong> Она не зависит ни от размера мира, ни от расстояния до цели, ни, главное, от числа персонажей. Миллион персонажей — это миллион раз по четыре чтения, и всё.</p>
  <p id="G8a4">Числа считаются один раз при генерации мира. Волна из двери: соседям двери — единица, их соседям — двойка, и так пока не кончится комната.</p>
  <pre id="hHU7">std::queue&lt;int&gt; q;
temp[door_cell] = 0;
q.push(door_cell);

while (!q.empty())
{
    int cur = q.front(); q.pop();
    unsigned short curd = temp[cur];

    for (int d = 0; d &lt; 4; ++d)
    {
        cell* nb = world[cur].side(d);
        if (!nb) continue;
        int ni = nb-&gt;get_n();

        if (zones[ni] != room_zone) continue;   // ← вот эта строчка решает всё
        if (world[ni].type == WALL) continue;

        if (temp[ni] == UNREACH)
        {
            temp[ni] = curd + 1;
            q.push(ni);
        }
    }
}</pre>
  <p id="2pNS">Про подчёркнутую строчку — ниже, она тут самая важная.</p>
  <hr />
  <h2 id="336t">Проблема: полей нужно слишком много</h2>
  <p id="yM83">Схема выше прекрасна, пока цель одна. Но персонажи ходят в разные места. Если считать поле на каждую возможную цель — это миллион полей по миллиону клеток. Не бывает.</p>
  <p id="Hx8e">Значит, поле на весь мир строить нельзя. Нужно, чтобы <strong>поле было маленьким</strong>.</p>
  <p id="BlcU">Отсюда вырос второй уровень.</p>
  <hr />
  <h2 id="BpDm">Уровень 1: комнаты как граф</h2>
  <p id="u72q">Мир разбивается на комнаты. У каждой клетки есть номер комнаты — массив <code>zones</code>, нумерация с единицы, ноль означает «не комната» (коридор, стена, пустота).</p>
  <figure id="SntL" class="m_original">
    <img src="https://img3.teletype.in/files/60/7e/607e4cde-a11c-4c6a-9a53-c9163888b784.png" width="720" />
    <figcaption>Разбиение лабиринта на комнаты (массив zones, каждая комната выделена своим цветом)</figcaption>
  </figure>
  <p id="t8bi">Двери собираются по комнатам: пробегаем весь мир, каждую клетку типа <code>DOOR</code> записываем в списки тех комнат, которых она касается. Дверь между двумя комнатами попадает в оба списка — это и делает её дверью.</p>
  <pre id="PiFT">for (size_t i = 0; i &lt; totalCells; ++i)
{
    if (world[i].type != DOOR) continue;

    for (int d = 0; d &lt; 4; ++d)
    {
        cell* nb = world[i].side(d);
        int z = zones[nb-&gt;get_n()];          // 1-based
        if (z &gt;= 1 &amp;&amp; z &lt;= room_n)
            room_doors[z - 1].push_back((int)i);
    }
}</pre>
  <p id="ijGp">Теперь у нас есть граф: комнаты — узлы, двери — рёбра. Соседство лежит в <code>neighbours[room * CONNECTIONS + k]</code>.</p>
  <pre id="t0tl">       ┌────────┐  дверь  ┌────────┐
       │ комн.7 ├─────────┤ комн.12│
       └───┬────┘         └───┬────┘
           │дверь             │дверь
       ┌───┴────┐         ┌───┴────┐
       │ комн.3 ├─────────┤ комн.40│
       └────────┘  дверь  └────────┘</pre>
  <p id="D5fd">Ключевое: этот граф <strong>на четыре порядка меньше мира</strong>. Миллион клеток превратился в 16 384 узла.</p>
  <p id="YoLP">По нему я гоняю волну из каждой комнаты и складываю результат в таблицу «сколько дверей пройти от комнаты A до комнаты B»:</p>
  <pre id="5BF7">void build_distances(unsigned short* neighbours, unsigned short* distances, int room_count)
{
    for (int i = 0; i &lt; room_count; ++i)
        for (int j = 0; j &lt; room_count; ++j)
            distances[i * room_count + j] = UNREACH;

    for (int s = 0; s &lt; room_count; ++s)
    {
        std::queue&lt;int&gt; q;
        distances[s * room_count + s] = 0;
        q.push(s);

        while (!q.empty())
        {
            int u = q.front(); q.pop();
            unsigned short du = distances[s * room_count + u];

            for (int k = 0; k &lt; CONNECTIONS; ++k)
            {
                int v = neighbours[u * CONNECTIONS + k];
                if (v == UNREACH) continue;

                if (distances[s * room_count + v] &gt; du + 1)
                {
                    distances[s * room_count + v] = du + 1;
                    q.push(v);
                }
            }
        }
    }
}</pre>
  <hr />
  <h2 id="kE8A">Уровень 2: поля внутри комнаты</h2>
  <p id="oPJR">Вернёмся к той строчке:</p>
  <pre id="GDKf">if (zones[ni] != room_zone) continue;</pre>
  <p id="CqBd">Она обрезает волну границей комнаты. Волна из двери не растекается по всему миру — она заливает только свою комнату и останавливается.</p>
  <p id="LGHZ">Это и есть ответ на «полей слишком много». Поле теперь стоит не миллион клеток, а размер одной комнаты. И считается оно не «на каждую цель в мире», а <strong>на каждую дверь</strong> — а дверей конечное, известное на генерации число.</p>
  <figure id="0zFy" class="m_original">
    <img src="https://img2.teletype.in/files/de/f0/def0fc59-99a5-43d3-a698-dd3f255a9b36.png" width="800" />
    <figcaption>Поле расстояний: градиент от синего (источник/дверь) к периферии по связным комнатам</figcaption>
  </figure>
  <pre id="3UGh">        ┌─────────────────┐   ┌─────────────────┐
        │ 4 3 2 3 4 5 6 7 │   │ 7 6 5 4 3 2 3 4 │
        │ 3 2 1 2 3 4 5 6 │   │ 6 5 4 3 2 1 2 3 │
        │ 2 1 0═══════════╪═══╪═══════════0 1 2 │
        │ 3 2 1 2 3 4 5 6 │дв.│ 6 5 4 3 2 1 2 3 │
        └─────────────────┘   └─────────────────┘
            комната 7             комната 12

     у каждой комнаты — своё поле до этой двери,
     и заливка одной комнаты не залезает в соседнюю</pre>
  <hr />
  <h2 id="QPsX">Шаг персонажа: три чтения</h2>
  <p id="gmLi">Вся навигация в рантайме укладывается в три действия.</p>
  <p id="AQAn"><strong>Первое.</strong> В какую соседнюю комнату идти? Смотрим таблицу расстояний между комнатами и выбираем соседа, который ближе к цели, чем мы:</p>
  <pre id="tH6h">unsigned short best_room_dist = distances[current_room * room_count + target_room];

for (int k = 0; k &lt; CONNECTIONS; ++k)
{
    int r = neighbours[current_room * CONNECTIONS + k];
    if (r == UNREACH) continue;

    unsigned short d = distances[r * room_count + target_room];
    if (d &lt; best_room_dist) { best_room_dist = d; next_room = r; }
}</pre>
  <p id="ykEr"><strong>Второе.</strong> Через какую дверь? Из дверей нашей комнаты берём те, что касаются выбранной соседней, и среди них — ту, до которой нам ближе (по её же полю):</p>
  <pre id="l5nG">for (int f = 0; f &lt; (int)room_doors[current_room].size(); ++f)
{
    int door_cell = room_doors[current_room][f];

    for (int d = 0; d &lt; 4; ++d)
    {
        cell* nb = world[door_cell].side(d);
        if (zones[nb-&gt;get_n()] - 1 == next_room)
        {
            unsigned short v = paths[f * totalCells + current_cell];
            if (v &lt; best_path_val) { best_path_val = v; best_door_index = f; }
        }
    }
}</pre>
  <p id="3lnD"><strong>Третье.</strong> Собственно шаг — спуск по полю выбранной двери:</p>
  <pre id="KufM">size_t base = (size_t)best_door_index * totalCells;
unsigned short best = paths[base + current_cell];
int best_side = -1;

for (int d = 0; d &lt; 4; ++d)
{
    cell* nb = world[current_cell].side(d);
    int ni = nb-&gt;get_n();
    if (world[ni].type == WALL) continue;

    unsigned short v = paths[base + ni];
    if (v &lt; best) { best = v; best_side = d; }
}

if (best_side != -1)
    obj.pos = world[current_cell].side(best_side)-&gt;get_n();</pre>
  <p id="KsBW">Ни одной волны. Ни одного A*. Ни одного цикла, длина которого зависит от расстояния до цели. Только чтения из заранее посчитанных массивов.</p>
  <pre id="LTnu">   персонаж в комнате 7, идёт в комнату 40
        │
        ├─ 1. таблица комнат  → «следующая комната 12»
        ├─ 2. двери комнаты 7 → «дверь №2, она ведёт в 12»
        └─ 3. поле двери №2   → «сосед справа меньше, шагаю вправо»
                                                    │
                                     повторить на следующем кадре</pre>
  <p id="zDyn">Персонаж не знает маршрута. Он вообще не знает, что такое маршрут. Он каждый кадр отвечает на один вопрос — «куда шагнуть прямо сейчас» — и из этих ответов складывается дорога через полмира.</p>
  <hr />
  <h2 id="88dU">Раскладка paths: почему полей меньше, чем дверей</h2>
  <p id="ntVP">Полей у нас по одному на дверь, а дверей в мире много. Хранить каждое поле отдельной плоскостью на миллион клеток было бы разорительно.</p>
  <p id="Ucf9">Но поля разных комнат <strong>не пересекаются</strong> — каждое обрезано своей зоной. Значит их можно класть в одну плоскость.</p>
  <p id="1U5H">Плоскость <code>f</code> содержит поля <strong>f-х дверей всех комнат сразу</strong>:</p>
  <pre id="1bk7">плоскость 0:  [поле 0-й двери комн.1][поле 0-й двери комн.2][...]  ← не пересекаются
плоскость 1:  [поле 1-й двери комн.1][поле 1-й двери комн.2][...]
...</pre>
  <p id="V9lp">Отсюда <code>base = f * totalCells</code> в коде выше. Число плоскостей — это максимальное число дверей у одной комнаты, а не общее число дверей в мире.</p>
  <hr />
  <h2 id="pnfc">Чем за это заплачено</h2>
  <pre id="Dye2">distances    ROOMS × ROOMS × 2 байта   =  512 МиБ
paths        плоскости × 1024×1024 × 2 =  256 МиБ
neighbours   ROOMS × CONNECTIONS × 2   =    4 МиБ</pre>
  <p id="lQ3n">Три четверти гигабайта, выделенных один раз на генерации мира.</p>
  <p id="Y960">Это выглядит много, и первая реакция обычно — «надо сэкономить». Не надо. Именно полнота этих таблиц покупает константу на шаг персонажа. Как только начинаешь считать что-то лениво или держать в кеше, появляется промах кеша — а промах означает, что кто-то посреди кадра встал считать волну. При сотнях тысяч персонажей это ровно та непредсказуемость, ради избавления от которой всё и строилось.</p>
  <p id="XEv2">Память здесь обменяна на время, причём по фиксированному курсу, известному заранее. Для мира с сотнями тысяч ходячих персонажей это правильная сторона размена.</p>
  <p id="6qZ3">Мелочи, которые тоже не случайны: расстояния лежат в <code>unsigned short</code>, недостижимость — это <code>65535</code>, а не отдельный флаг и не <code>-1</code> в знаковом типе. На таких объёмах два байта против четырёх — это разница между 512 МиБ и гигабайтом.</p>
  <hr />
  <h2 id="aI7A">Отладка: поле видно глазами</h2>
  <p id="qr7P">Отдельно скажу про то, что сэкономило больше всего времени.</p>
  <p id="1pXK">Поле расстояний — это готовая картинка. Ноль у двери, дальше темнее. Я вывел его прямо в текстуру SDL: клавишами влево-вправо листаешь двери, зелёным подсвечивается комната под курсором, красным — персонажи.</p>
  <pre id="ZmeW">unsigned short d = paths[base + i];
unsigned char color = 0;

if (d == 65535)  color = 0;      // недостижимо → чёрное
else if (d == 0) color = 255;    // источник    → белое
else {
    unsigned short dd = (d &gt; 255) ? 255 : d;
    color = 255 - (unsigned char)dd;
}</pre>
  <figure id="5H7e" class="m_original">
    <img src="https://img3.teletype.in/files/e7/b8/e7b86d15-6cd8-4e31-8632-6d95754b8667.png" width="1024" />
    <figcaption>Глобальная карта распространения волны по комнатам мира 1024×1024 (от синего эпицентра к периферии)</figcaption>
  </figure>
  <figure id="9GnR" class="m_original">
    <img src="https://img4.teletype.in/files/76/1b/761bce2d-64cc-423e-be24-f157dad7ce1d.png" width="800" />
    <figcaption>Отладка поля в приближении: градиент расстояний и агенты (красные точки), спускающиеся по градиенту к двери</figcaption>
  </figure>
  <p id="ms2p">Ошибки в заливке видно мгновенно: комната залилась не до конца — значит где-то дыра в связности; поле перетекло к соседям — значит сломалась обрезка по зонам; чёрное пятно в середине комнаты — недостижимый карман, который персонажи никогда не покинут.</p>
  <p id="KGPy">Это то, что я бы посоветовал каждому, кто делает что-то на сетках: <strong>рисуйте свои промежуточные данные</strong>. Не логи, не числа в консоль — картинку. Один кадр отладочного хитмапа заменяет час чтения кода.</p>
  <hr />
  <h2 id="uPtn">Что из этого выросло</h2>
  <p id="DfN5">Прототип занимает около 5000 строк своего кода поверх SDL2. Там нет движка, нет фреймворка, нет чужих библиотек кроме самого SDL — весь стек от структуры клетки и графа комнат до меню и отрисовки написан руками. Этот прототип был написан в октябре 2004 года.</p>
  <p id="zt5V">А потом на этой архитектуре выросла <strong>ГИГАХРУЩ</strong> — браузерная игра про вылазки в самособирающуюся хрущёвку размером с город.</p>
  <p id="xnCK">Язык другой — TypeScript вместо C++. Объём другой — сотни тысяч строк вместо тысяч. Но принципиально там то же самое: мир 1024×1024, комнаты как граф, поля вместо поиска, персонаж читает число и шагает в меньшее. Всё, что нужно для толпы, было доказано вот в этом маленьком прототипе на SDL.</p>
  <p id="NdKt">Поэтому я и рассказываю про него, а не про текущую версию. Текущая — это тот же концепт, обросший контентом. А идея целиком лежит в пяти с небольшим тысячах строк, и её видно.</p>
  <hr />
  <p id="rwnL"><em>Играть в ГИГАХРУЩ: <a href="https://tenevik.itch.io/gigahrush" target="_blank">tenevik.itch.io/gigahrush</a></em></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@tenevik_games/O_IMDdxFFLV</guid><link>https://teletype.in/@tenevik_games/O_IMDdxFFLV?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=tenevik_games</link><comments>https://teletype.in/@tenevik_games/O_IMDdxFFLV?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=tenevik_games#comments</comments><dc:creator>tenevik_games</dc:creator><title>ДВОРЕЦ МОЧИ: КАК УСТРОЕНА КОРРУПЦИОННАЯ ВЕРТИКАЛЬ НА ДВАЧЕ /gd/</title><pubDate>Sun, 09 Aug 2026 17:47:53 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/14/b4/14b44eb3-8ede-4f28-b728-05fc06441951.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/0e/54/0e547110-b9e9-4ba6-bf47-b69751205e94.png"></img>Расследование независимой студии Tenevik Games (создатели GIGAHRUSH и STARCLUSTER) о коррупции, шпионаже и цензуре на Дваче.]]></description><content:encoded><![CDATA[
  <p id="aQNb">Расследование независимой студии Tenevik Games (создатели GIGAHRUSH и STARCLUSTER) о коррупции, шпионаже и цензуре на Дваче.</p>
  <blockquote id="z4y3"><strong>Канал проекта:</strong> <a href="https://t.me/gigah_rush" target="_blank">@gigah_rush</a> | <strong>База доказательств:</strong> 137 525 сообщений закрытой конфы General, 9 архивных тредов Двача</blockquote>
  <p id="ODt3">Годами администрация Двача внушала пользователям сказку: мол, имиджборда — это обитель абсолютной свободы слова, где нет авторитетов, анонимность священна, а любой инди-разработчик может зайти в <strong>/gd/</strong> (Game Development), создать тред и получить объективный фидбек.</p>
  <p id="IO2C">Сегодня на основе <strong>полного дампа закрытой Telegram-конфы модерации (137 525 сообщений)</strong> и архивов тредов мы вскрываем реальную картину:</p>
  <ul id="f5UP">
    <li id="NXq1">Раздел <strong>/gd/</strong> полностью приватизирован картелем «старых участников» во главе с Дмитрием (<strong>Димасик</strong>) @maltitol.</li>
    <li id="TaY2">Владелец сайта <strong>Нариман Абу </strong>в закрытых чатах напрямую раздает модераторские полномочия («модерку») своим любимчикам для контроля доски и подавления конкурентов @abunya.</li>
    <li id="uiNT">Независимые разработчики, отказавшиеся подчиняться кагалу модераторов, подвергаются координированной травле, шпионажу и цензуре («чистке вилкой»).</li>
  </ul>
  <hr />
  <h2 id="70rw"><strong>Архитектура власти: Схема «Вертикали Мочи»</strong></h2>
  <pre id="jjrG">             ┌────────────────────────────────────────────────────────┐
             │                   ВЕРТИКАЛЬ МОЧИ /gd/                  │
             └───────────────────────────┬────────────────────────────┘
                                         │
                                         ▼
                     ┌───────────────────────────────────────┐
                     │          НАРИМАН АБУ (Владелец)       │
                     │  &quot;Я могу выдать кому-нибудь модерку&quot;  │
                     │  &quot;Ваших конкурсов в /gd/ не будет&quot;    │
                     └───────────────────┬───────────────────┘
                                         │
                                         ▼
                     ┌───────────────────────────────────────┐
                     │     КАРТЕЛЬ ОРГАНИЗАТОРОВ (TWG)       │
                     │  Димасик (Dmitry), Е(халимедведи),    │
                     │  Ильдар Шарафутдинов, Коджем, Нульч   │
                     │  * Контроль кошельков, плашек, банов  │
                     └───────────────────┬───────────────────┘
                                         │
                                         ▼
                     ┌───────────────────────────────────────┐
                     │      ЗАВЕРБОВАННЫЕ ШНЫРИ / ШПИОНЫ     │
                     │  TatriX (VK/TG инфильтратор),         │
                     │  Маша / jutcoder (чатные рупоры)      │
                     │  * Сбор инфы в ЛС, доносы, набеги     │
                     └───────────────────┬───────────────────┘
                                         │
                                         ▼
            ┌─────────────────────────────────────────────────────────┐
            │          АТАКА НА НЕЗАВИСИМЫХ РАЗРАБОТЧИКОВ             │
            │           TENEVIK GAMES / GIGAHRUSH / STARCLUSTER       │
            │     * Снятие с джемов, клевета, #wipe, снос тредов      │
            └─────────────────────────────────────────────────────────┘</pre>
  <hr />
  <h2 id="a5Kp"><strong>ГЛАВА 1. «Я могу выдать кому-нибудь модерку»: Как Абу раздает власть в Telegram</strong></h2>
  <p id="fD5f">Судьба доски /gd/ решается не анонимным комьюнити, а в закрытой Telegram-группе <strong>General</strong> (где накоплено 137 525 сообщений). Владелец Двача <strong>Nariman Abu</strong> лично присутствует в чате и открыто распределяет инструмент цензуры («модерку») в обход любых правил и регламентов.</p>
  <figure id="Eoaz" class="m_original">
    <img src="https://img1.teletype.in/files/0e/54/0e547110-b9e9-4ba6-bf47-b69751205e94.png" width="938" />
    <figcaption>Раздача модерок Нариманом Абу</figcaption>
  </figure>
  <p id="FVub"><strong>Прямые цитаты из дампа переписки:</strong></p>
  <blockquote id="SC7P"><strong>[11.07.2016, 22:36:15] Nariman Abu (#51):</strong><br />«все договорились, все вместе организуют и судят, кошелек старый тогда используете. <strong>я могу выдать кому-нибудь модерку, чтобы тред прикрепляли-открепляли и в целом присматривали за доской</strong>.»</blockquote>
  <blockquote id="kT3u"><strong>[11.07.2016, 22:36:34] TatriX (#52):</strong><br />«Абуняша, ответь мне в вк пожалуйста про гринлайт»</blockquote>
  <blockquote id="1MSK"><strong>[11.07.2016, 22:37:34] Dmitry (#56):</strong><br />«Ну прошлый я вёл, деньги все раздал. Но вёл с &quot;огрехами&quot;, как ты понял (иначе не хейтили бы). Вот в этот раз мы объединиться с Нульчем... и опомом 1/6 решили и общими усилиями всё сделать нормально»</blockquote>
  <blockquote id="Qnqs"><strong>[11.07.2016, 22:54:13] Dmitry (#193):</strong><br />«Абу, чего по поводу модерки-то?»</blockquote>
  <blockquote id="gysW"><strong>[11.07.2016, 23:09:59] Ильдар Шарафутдинов (#334):</strong><br />«Дима тебе же дали модерку?»</blockquote>
  <figure id="cvmd" class="m_original">
    <img src="https://img4.teletype.in/files/32/74/32749486-988c-47b6-a0a6-02bd23dbe108.png" width="970" />
    <figcaption>Абу обсуждает кандидатуры в чате</figcaption>
  </figure>
  <blockquote id="TEoN"><strong>[11.07.2016, 22:32:41] Nariman Abu (#35):</strong> «ладно, одна сторона, это: Н0ч, коджем, и 1/6 оп, кто из них здесь есть?»<br /><strong>[11.07.2016, 22:32:51] TatriX (#37):</strong> «Я предложил свою кандидатуру, потому что в рот ебал все ваши терки между собой. И если всех это устроит, то я могу.»</blockquote>
  <p id="Dlco"><strong>Факт:</strong> «Анонимный имиджборд» управляется через личные связи в VK и Telegram. Модераторские права выдаются по личному усмотрению Абу узкому кругу приближенных.</p>
  <hr />
  <h2 id="lkU5"><strong>ГЛАВА 2. Феодализм Абу: «Ваших конкурсов в /gd/ не будет вообще»</strong></h2>
  <p id="7efG">Когда простые анонимы попытались организовать собственный альтернативный конкурс («Синдикат») без участия прикормленной клики Димасика, их треды были немедленно стерты модерацией, а в закрытый чат пришел лично Нариман Абу с прямыми угрозами и шантажом:</p>
  <blockquote id="a2pg"><strong>[23.01.2017, 16:06:20] Glow Stick (#41996):</strong> «@apetrov89 поясни за конкурс от синдиката, который ты и китти так усердно трёте»<br /><strong>[23.01.2017, 16:07:05] Nariman Abu (#41998):</strong> «с конкурсом все же решили, нахуя опять истерики устраивать?»<br /><strong>[23.01.2017, 16:07:45] Glow Stick (#42003):</strong> «@abunya Конкурс синдиката стартовал — и через полчаса его удалили, заменив конкурсом Коджема. Казалось бы, зачем? Мы что, хуже?»<br /><strong>[23.01.2017, 16:08:10] Dmitry (#42005):</strong> «Вы были за сутки уведомлены о таком возможном ходе вещей»<br /><strong>[23.01.2017, 16:08:30] Glow Stick (#42007):</strong> «У нас нет таких связей с администрацией, как у тебя»<br /><strong>[23.01.2017, 16:08:34] Glow Stick (#42010):</strong> «Мы простые аноны»<br /><strong>[23.01.2017, 16:11:14] Nariman Abu (#42035):</strong> «<strong>блять, либо угомонись, либо ваши конкурсы по пизде пойдут раз и навсегда</strong>»<br /><strong>[23.01.2017, 16:11:41] Nariman Abu (#42039):</strong> «ты проверить хочешь?»<br /><strong>[23.01.2017, 16:12:55] Nariman Abu (#42056):</strong> «<strong>Хорошо, вашего конкурса в /gd/ не будет вообще, наслаждайся</strong>»</blockquote>
  <p id="ul8o"><strong>Факт:</strong> Любая независимая инициатива на Дваче, не согласованная с картелем Димасика, уничтожается лично владельцем сайта с применением административного террора.</p>
  <hr />
  <h2 id="VWtN"><strong>ГЛАВА 3. Картель TWG: Распилы, старые кошельки и монополия «Димасика»</strong></h2>
  <p id="LVn8">Конкурс <strong>Two Weeks Game (TWG)</strong> позиционируется как визитная карточка /gd/. Но за кулисами — это закрытая кормушка, где десятилетиями крутятся донаты анонимов под контролем несменяемых лиц.</p>
  <figure id="iTTf" class="m_original">
    <img src="https://img1.teletype.in/files/87/29/87292df4-0351-4509-8589-c06cd2d9d454.png" width="966" />
    <figcaption>Делёжка конкурса и кошельков</figcaption>
  </figure>
  <blockquote id="UqEi"><strong>[11.07.2016, 22:33:43] Dmitry (#41):</strong> «Да блядь, хватит отдельные объединения пилить, чего вы как дети малые. Вам предложили объединиться, нет, не хочу не буду, хочу сам всё делать»<br /><strong>[11.07.2016, 22:33:55] Ильдар Шарафутдинов (#42):</strong> «Я сам Коджа и Нульча не особо уважаю, но они лучше чем анонимы»<br /><strong>[11.07.2016, 22:34:06] Nariman Abu (#43):</strong> «больше желающих нет? анонимы в треде какие-то были? вроде какой-то аноним пару лет назад деньги спиздил»<br /><strong>[11.07.2016, 22:34:18] Dmitry (#45):</strong> «Макдачный оп на втором конкурсе, да. До пятого из-за этого застой был, пока модер не перезагрузил»<br /><strong>[11.07.2016, 22:35:10] Nariman Abu (#48):</strong> «лол, понятно. ну давайте как в прошлый раз, не было же проебов на прошлом конкурсе с деньгами»</blockquote>
  <figure id="fk0k" class="m_original">
    <img src="https://img4.teletype.in/files/fd/e0/fde0b331-86f2-432d-a0e9-2b63212f0277.png" width="914" />
    <figcaption>Координация через VK и оргконфу</figcaption>
  </figure>
  <blockquote id="Rtqc"><strong>[11.07.2016, 22:38:59] Е(халимедведи) (#63):</strong> «Дай свой вк. Добавим в оргконфу»<br /><strong>[11.07.2016, 22:39:07] TatriX (#64):</strong> <code>vk.com/tatrix</code><br /><strong>[11.07.2016, 22:39:13] Dmitry (#65):</strong> «Не все хотят нас как оргов конкурса видеть. У кого-то ко мне претензии, у кого-то к Нульчу. Вот и пилят свои конкурсы зачем-то, <strong>хотя давно всё решено</strong>»</blockquote>
  <hr />
  <h2 id="CKcR"><strong>ГЛАВА 4. Спецоперация «Шнырь»: Шпионаж TatriX и сфабрикованное снятие STARCLUSTER</strong></h2>
  <p id="bCZ9">В августе 2026 года независимая студия <strong>TENEVIK GAMES</strong> выставила на конкурс игру <strong>STARCLUSTER</strong>. Понимая, что независимый проект может выиграть конкурс в обход их контроля, картель провел спецоперацию по инфильтрации и фальсификации нарушений.</p>
  <p id="0tK4"><strong>Хроника оперативной разработки (4–7 августа 2026):</strong></p>
  <p id="ZawA">1. <strong>4 августа, 20:03–20:27:</strong> В закрытый чат разработчиков <code>ГИГАХРЮЧЕВО</code> внедряется провокатор <strong>TatriX</strong> (норвежский номер <code>+47 Norway</code>, регистрация март 2016).</p>
  <figure id="qdoB" class="m_original">
    <img src="https://img3.teletype.in/files/62/af/62af4324-ecc7-4035-b70f-dd4e1922453a.png" width="954" />
    <figcaption>Деанон и профиль провокатора TatriX</figcaption>
  </figure>
  <figure id="keJH" class="m_original">
    <img src="https://img4.teletype.in/files/bb/2a/bb2af125-c67f-44b2-9992-2b19ffa4cbf0.png" width="952" />
    <figcaption>Внедрение TatriX в чат разработчиков</figcaption>
  </figure>
  <blockquote id="Jz2H"><strong>TatriX [20:03]:</strong> «Вейт, так ты делаешь гигахрущ или старкластер»<br /><strong>TENEVIK GAMES [20:19]:</strong> «привет, всё делаем, <code>https://myindie.ru/users/user/tenevik</code>»<br /><strong>TatriX [20:27]:</strong> «Признавайтесь, кто старкластер писал»</blockquote>
  <p id="Of1J">2. <strong>6–7 августа:</strong> Собрав ссылки и профили, TatriX выходит из чата разработчиков и идет с докладом напрямую к Димасику в закрытую конфу <code>General</code>.</p>
  <figure id="Ldo9" class="m_original">
    <img src="https://img4.teletype.in/files/f6/0a/f60a4a31-d9a8-4ba7-a7e6-ae7630e7abe2.png" width="958" />
    <figcaption>Доклад TatriX и снятие Starcluster</figcaption>
  </figure>
  <blockquote id="AkaS"><strong>[07.08.2026, 12:53:20] TatriX (#141373):</strong> «Диманидзе, че там за драма со старкластером?»<br /><strong>[07.08.2026, 13:03:28] Dmitry (#141374):</strong> «Заготовочник»<br /><strong>[07.08.2026, 13:03:39] Dmitry (#141375):</strong> «<strong>Не смог предоставить убедительных доказательств что не заготовочка</strong>»<br /><strong>[07.08.2026, 13:06:11] Dmitry (#141376):</strong> <em>(пересылает ответ Tenevik Games)</em> «очень жаль, что вы не хотите договариваться по хорошему и создаёте себе могущественных врагов на ровном месте, оч жаль»<br /><strong>[07.08.2026, 13:06:17] Dmitry (#141377):</strong> «Ну он смешной конечно. Жду что мне насрут под дверь теперь. Страшно»<br /><strong>[07.08.2026, 13:07:05] TatriX (#141380):</strong> «Так и че, снят с конкурса?»<br /><strong>[07.08.2026, 13:07:08] Dmitry (#141381):</strong> «Да»</blockquote>
  <blockquote id="0rFx"><strong>[07.08.2026, 14:44:34] Dmitry (#141393):</strong> «Да уже не важно в общем-то что он там мог переиспользовать. Мне предварительных виляний жопой... вполне достаточно чтобы больше не иметь желания с ним коммуницировать. Игру его на конкурсе держать тем более.»</blockquote>
  <p id="YNwt"><strong>Факт:</strong> Димасик самолично снял STARCLUSTER с конкурса без каких-либо технических доказательств на основании личной неприязни («не смог доказать, что не заготовочка»).</p>
  <hr />
  <h2 id="wDLk"><strong>ГЛАВА 5. Фабрика хейта: Координированные набеги и травля GIGAHRUSH</strong></h2>
  <p id="l0ax">После снятия игры картель развязал массированную атаку на студию и её флагманский проект <strong>GIGAHRUSH</strong>. В тредах /gd/ начались координированные вбросы дезинформации:</p>
  <figure id="MOok" class="m_original">
    <img src="https://img3.teletype.in/files/25/21/2521e487-32a6-42b7-81dc-4a145506c259.png" width="1878" />
    <figcaption>Клевета про «заготовочку» и «вирусную игру»</figcaption>
  </figure>
  <blockquote id="3QOi"><strong>Тред TWG, Пост №1100374 (07.08.2026, 22:16:08):</strong><br />«Тред не читал, но хочется чтобы здесь и в архиве треда было зафиксировано, что автор нехороший человек, и отправил на конкурс /gd/ заготовочку трёхмесячной давности... Никаких дел с этим мудаком вести нельзя! Нахуй его и вирусную забагованную игру.»</blockquote>
  <figure id="YSHb" class="m_original">
    <img src="https://img4.teletype.in/files/f7/40/f7400d6e-92be-4011-9cee-ede87b3696e3.png" width="1746" />
    <figcaption>Атаки на визуал и геймплей GIGAHRUSH</figcaption>
  </figure>
  <blockquote id="7TUj"><strong>Пост №1100137 (07.08.2026, 12:20:56):</strong><br />«...такого низкопробного продукта даже по меркам gd треда давно не видел... У автора жалкая пародия на игру, пожалуйста автор выйди из своего кокона самоотсоса...»</blockquote>
  <figure id="NtET" class="m_original">
    <img src="https://img2.teletype.in/files/54/6c/546c1bab-4a53-476c-aaf2-050821402ae3.png" width="1420" />
    <figcaption>Угрозы сажей в TWG-треде</figcaption>
  </figure>
  <blockquote id="d2Bu"><strong>Пост №1097552 (27.07.2026, 14:33:52):</strong><br />«если ты продолжишь срать в ТВГ треде, я тебя засагаю нахуй»</blockquote>
  <hr />
  <h2 id="3zcC"><strong>ГЛАВА 6. «Чистка вилкой»: Паника модерации и уничтожение улик</strong></h2>
  <p id="jzfY">9 августа 2026 года в тред /gd/ №1100400 были выложены скриншоты сговора Наримана Абу и Димасика:</p>
  <figure id="Tooi" class="m_original">
    <img src="https://img3.teletype.in/files/e1/5b/e15bc95a-c006-4cf9-ac75-ab0f9c047d07.png" width="1728" />
    <figcaption>Публикация пруфов и ответный вайп #wipe</figcaption>
  </figure>
  <blockquote id="u57F"><strong>Пост №1100804 (09.08.2026, 14:36:58):</strong><br />«...и это только начало. в следующий раз у кого-то будет пробита голова ирл. моча должна страдать. конфа пидарасов набегающих на GIGAHRUSH: <code>https://t.me/gdchat</code>»</blockquote>
  <p id="Rb0y">Сразу после этого модерация включила аварийный режим стирания:</p>
  <blockquote id="hqxt"><strong>Пост №1100811 (09.08.2026, 15:04:45):</strong> <code>#wipe samewords</code></blockquote>
  <p id="jKzF">А вот как эту панику комментировал сам Димасик в закрытом чате:</p>
  <figure id="vuJ2" class="m_original">
    <img src="https://img4.teletype.in/files/ff/c3/ffc39f43-9690-4363-b74c-06e986338fec.png" width="990" />
    <figcaption>Димасик признает чистку вилкой</figcaption>
  </figure>
  <blockquote id="yr0L"><strong>[08.08.2026, 11:14:22] Dmitry (#141416):</strong> «<strong>Давно такого не было что пол треда скрывать приходится</strong>»<br /><strong>[08.08.2026, 11:14:48] Dmitry (#141417):</strong> «<strong>У модера похоже две фазы, он или чистит вилкой как не в себя, или нихуя не работает</strong>»</blockquote>
  <hr />
  <h2 id="BflS"><strong>ГЛАВА 7. Каталог источников и доказательной базы</strong></h2>
  <p id="dfdh">Все упомянутые факты подтверждены архивными ссылками и материалами расследования:</p>
  <h3 id="0nDg">🌐 Зафиксированные треды Двача:</h3>
  <ul id="EMcB">
    <li id="SnLI"><strong><a href="https://2ch.org/sf/res/262936.html" target="_blank">2ch.org/sf/res/262936.html</a></strong> — тред фиксации инцидентов и предыстории конфликта.</li>
    <li id="Pt0B"><strong><a href="https://2ch.org/gd/res/1100400.html" target="_blank">2ch.org/gd/res/1100400.html</a></strong> — основной тред Two Weeks Game 30 с публикацией сливов переписки (пост №1100804), набегами хейтеров и последующим <code>#wipe</code>.</li>
    <li id="2kuX"><strong><a href="https://2ch.org/fd/res/1831143.html" target="_blank">2ch.org/fd/res/1831143.html</a></strong> — фиксация координации в смежных разделах.</li>
    <li id="DolU"><strong><a href="https://2ch.org/gd/res/1093998.html" target="_blank">2ch.org/gd/res/1093998.html</a></strong> — официальный тред разработки GIGAHRUSH от студии Tenevik Games, подвергшийся скоординированной атаке.</li>
    <li id="L2fI"><strong><a href="https://2ch.org/gd/res/1098558.html" target="_blank">2ch.org/gd/res/1098558.html</a></strong> — предконкурсный тред с угрозами сажей и банами в адрес независимых авторов.</li>
    <li id="Rg6y"><strong><a href="https://2ch.su/gd/res/1097691.html" target="_blank">2ch.su/gd/res/1097691.html</a></strong> — тред обсуждения сливов и драмы TWG.</li>
    <li id="z980"><strong><a href="https://2ch.hk/gd/res/275200.html#275920" target="_blank">2ch.hk/gd/res/275200.html#275920</a></strong> — исторический тред TWG #8, упоминаемый в переписке Абу.</li>
    <li id="sZMf"><strong><a href="https://2ch.hk/gd/res/1032065.html" target="_blank">2ch.hk/gd/res/1032065.html</a></strong> — тред TWG 28 с зачистками модерации.</li>
    <li id="8RKX"><strong><a href="https://2ch.org/gd/res/1072278.html" target="_blank">2ch.org/gd/res/1072278.html</a></strong> — тред TWG 29.</li>
  </ul>
  <hr />
  <h2 id="guUE"><strong>ЗАКЛЮЧЕНИЕ: МАНИФЕСТ НЕЗАВИСИМОГО ГЕЙМДЕВА</strong></h2>
  <ol id="8J65">
    <li id="H7jB"><strong>Двач /gd/ — это не независимая борда, а феодальный междусобойчик Telegram-конфы <code>General</code>.</strong></li>
    <li id="P3Zc"><strong>Владелец ресурса Нариман Абу лично соучаствует в передаче власти карманным модераторам и угрожает уничтожением любых альтернативных конкурсов.</strong></li>
    <li id="FBjc"><strong>Любой независимый разработчик, не входящий в круг друзей Димасика, сталкивается со шпионажем, клеветой, банами и стиранием тредов.</strong></li>
  </ol>
  <p id="8R3K">Студия <strong>TENEVIK GAMES</strong> продолжит разработку <strong>GIGAHRUSH</strong>, <strong>STARCLUSTER</strong> и будущих проектов. Мы не подчиняемся карманным картелям и не боимся их «чисток вилкой».</p>
  <p id="ajyj">Распространяйте это расследование. Правда должна быть доступна каждому анониму!</p>
  <hr />
  <p id="UmsS"><em>(c) TENEVIK GAMES &amp; GIGAHRUSH INVESTIGATION TEAM, 2026</em></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@tenevik_games/kz5rLU24fbg</guid><link>https://teletype.in/@tenevik_games/kz5rLU24fbg?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=tenevik_games</link><comments>https://teletype.in/@tenevik_games/kz5rLU24fbg?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=tenevik_games#comments</comments><dc:creator>tenevik_games</dc:creator><title>Мы делаем ГИГАХРУЩ: браузерный survival horror без движка, ассетов и спокойной жизни</title><pubDate>Sun, 02 Aug 2026 06:10:02 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/98/01/9801a54b-0adc-417a-965a-fb315b51349f.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/b0/2a/b02ac6cb-d765-462e-88bc-9f4aa9679f1b.png"></img>Канал проекта: @gigah_rush | Формат: Статья Teletype / Обзор проекта]]></description><content:encoded><![CDATA[
  <blockquote id="GESb"><strong>Канал проекта:</strong> <a href="https://t.me/gigah_rush" target="_blank">@gigah_rush</a> | <strong>Формат:</strong> Статья Teletype / Обзор проекта</blockquote>
  <p id="nfEE">Привет! Мы делаем <strong>ГИГАХРУЩ</strong> — браузерный survival horror / ARPG shooter про вылазки внутри безграничной 1024x1024 бетонной структуры.</p>
  <p id="rg8P">Звучит как питч из папки <em>«после этого нас точно забанят»</em>, поэтому сразу перейдём к технической части. Это <strong>не</strong> Unity WebGL, <strong>не</strong> Phaser, <strong>не</strong> Godot export, <strong>не</strong> React-обвязка вокруг canvas и <strong>не</strong> набор купленных ассетов с Unity Asset Store.</p>
  <p id="4Iqc">Игра собрана как один чистый браузерный билд на <strong>TypeScript/Vite</strong>, <strong>WebGL/canvas</strong>, с процедурными текстурами, процедурными спрайтами, процедурным звуком и плоскими структурами данных. Zero runtime dependencies.</p>
  <figure id="jR7d" class="m_original">
    <img src="https://img4.teletype.in/files/b0/2a/b02ac6cb-d765-462e-88bc-9f4aa9679f1b.png" width="3456" />
    <figcaption>Знакомство с Ольгой Дмитриевной и первые минуты </figcaption>
  </figure>
  <hr />
  <h2 id="6vKF">Игровой цикл: Зачем всё это?</h2>
  <p id="OOKp">Идея была простая и неприятная: сделать не красивую демку на три комнаты, а <strong>живой survival loop</strong>:</p>
  <ol id="Nwqz">
    <li id="mZBe">Игрок готовится в жилой зоне (еда, вода, патроны, медицина, пропуска и документы).</li>
    <li id="SONI">Выходит в вылазку на опасные и процедурные этажи.</li>
    <li id="lGkV">Встречает NPC, монстров, фракции, торговлю, квесты и <strong>САМОСБОР</strong>.</li>
    <li id="2NQ4">Возвращается не в абстрактный хаб, а в мир, который помнит все последствия его поступков.</li>
  </ol>
  <p id="wG7a">Это статья о том, как маленькая браузерная игра постепенно превратилась в инженерный мешок с WebGL-рейкастером, A-Life, процедурной генерацией, локальными сохранениями, самодельным HUD и тысячами проверок и правок.</p>
  <hr />
  <h2 id="0Bzh">Почему именно браузер?</h2>
  <p id="BxkX">Потому что необходимость установки убивает импульс. Человек увидел странную гифку или пост про САМОСБОР, нажал ссылку в Telegram, за секунду загрузил страницу — и уже через 10 секунд умер от твари в темном коридоре. <strong>Идеальный сценарий.</strong></p>
  <figure id="BQx0" class="m_original">
    <img src="https://img2.teletype.in/files/dc/a8/dca87305-9d94-48f2-ade6-e90958aedadc.png" />
    <figcaption>Инвентарь игрока</figcaption>
  </figure>
  <p id="m3kk">Но браузер сразу ставит жесткие рамки:</p>
  <ul id="M4e9">
    <li id="g0tM">❌ Нельзя рассчитывать на тяжелый движковый runtime.</li>
    <li id="44tJ">❌ Нельзя прятать долгую загрузку за лаунчером.</li>
    <li id="GgbI">❌ Нельзя раздать 500 МБ ассетов и надеяться, что игрок терпелив.</li>
    <li id="oFqb">❌ Нельзя забыть про Pointer Lock, Fullscreen, мобильные экраны и localStorage.</li>
  </ul>
  <p id="WVgq">Базовое правило проекта: <strong>0 сторонних runtime-библиотек, 1 браузерный билд, максимум данных и поведения из кода.</strong></p>
  <hr />
  <h2 id="3Cdv">Мир как данные, а не сцена</h2>
  <p id="A3fJ">Главная ошибка, которую хотелось не повторять — делать уровень как коллекцию &quot;красивых 3D-объектов&quot;. Для линейного хоррора это приятно, но для системного выживача быстро превращается в мертвый декор.</p>
  <p id="Dm9H">В ГИГАХРУЩЕ мир описывается как клеточная поверхность (тороидальная матрица 1024x1024) с комнатами, коридорами, дверями, текстурами, контейнерами, сущностями и событиями.</p>
  <figure id="bfyA" class="m_original">
    <img src="https://img2.teletype.in/files/91/28/91289d66-fba9-4a99-9065-1f360a4d63ed.png" width="3456" />
    <figcaption>Миникарта Жилого Этажа</figcaption>
  </figure>
  <h3 id="uQ1L">Архитектурные слои:</h3>
  <ul id="Ih1u">
    <li id="zbSS"><code>core</code> — хранит примитивные формы, математику тора и World.</li>
    <li id="zCax"><code>data</code> — реестры предметов, оружия, фракций, квестов, монстров.</li>
    <li id="1jvB"><code>gen</code> — генераторы этажей, POI, комнат и расстановка содержимого.</li>
    <li id="N1Ib"><code>systems</code> — логика AI, боя, квестов, экономики, Самосбора и сохранений.</li>
    <li id="8cHf"><code>render</code> — <strong>только рисует</strong> (не принимает никаких геймплейных решений).</li>
  </ul>
  <hr />
  <h2 id="B3Iy">WebGL-Рейкастинг вместо тяжелого 3D</h2>
  <p id="Ziid">Честный 3D-движок был бы красивее, но тяжелее и медленнее. Для ГИГАХРУЩА важнее не количество полигонов, а <strong>быстрота и четкость игрового решения</strong>:</p>
  <ul id="fF0n">
    <li id="92Mf">Вижу ли я угрозу в коридоре?</li>
    <li id="HW2w">Понимаю ли я, где укрытие?</li>
    <li id="Amct">Успеваю ли заблокировать гермодверь до входа тумана?</li>
  </ul>
  <figure id="edkS" class="m_original">
    <img src="https://img1.teletype.in/files/00/93/00936b8b-0e41-4757-9df3-1ff68558ecbe.png" width="3456" />
    <figcaption>Стычка с Теневиком</figcaption>
  </figure>
  <p id="Zrt3">Наш псевдо-3D рендер на WebGL с процедурными текстурами и спрайтами справляется с главным: передает атмосферу бесконечного бетонного лабиринта, дистанцию, туман, вспышки и опасность.</p>
  <hr />
  <h2 id="KoeT">A-Life: Живой мир без &quot;театра одного игрока&quot;</h2>
  <p id="Y5yE">Мы не хотели делать мир, где NPC спавнятся из воздуха за спиной игрока и исчезают, когда он отворачивается.</p>
  <p id="Z1qE">В ГИГАХРУЩЕ работает слой <strong>A-Life</strong>:</p>
  <ul id="EDFX">
    <li id="4jTF">При старте генерируется пул персонажей с именами, характерами и фракциями.</li>
    <li id="r3dK">На активном этаже материализуются живые NPC: их инвентарь, торговцы, ликвидаторы, отношения к игроку.</li>
    <li id="yecc"><strong>Смерть NPC перманентна.</strong> Если торговца задрала тварь во время Самосбора — его больше нет, а его труп останется лежать в том же коридоре.</li>
    <li id="ff4v">Игрок подчиняется тем же правилам и социальной математике (карма, статус, отношения фракций), что и NPC.</li>
  </ul>
  <figure id="eQEv" class="m_original">
    <img src="https://img3.teletype.in/files/21/d5/21d543e3-980a-43c4-b432-31d0f715deb2.png" width="3456" />
    <figcaption>Меню торговли</figcaption>
  </figure>
  <hr />
  <h2 id="snTR">САМОСБОР — мутация пространства, а не просто &quot;красный экран&quot;</h2>
  <p id="K6FB">Самосбор — главная стихийная угроза ГИГАХРУЩА. Мы не стали делать его простой заставкой с красным фильтром.</p>
  <p id="DW1E">При наступлении Самосбора происходит <strong>реальная мутация этажа</strong>:</p>
  <ol id="PSfw">
    <li id="8Kdv">Звучит сирена, включается система оповещения.</li>
    <li id="1W5M">Игроку и NPC нужно успеть в герметичные блоки и задраить гермодвери.</li>
    <li id="vpG0">Происходит давление тумана, спавн аномальных сущностей.</li>
    <li id="pw0k">После окончания — мир перестраивается: меняются некоторые проходы, выбиваются двери, а не успевшие укрыться NPC погибают.</li>
  </ol>
  <figure id="aLYF" class="m_original">
    <img src="https://img2.teletype.in/files/19/a7/19a70ab8-47d0-4ce1-832f-5569235f5663.png" width="3456" />
    <figcaption>Начинается Самосбор</figcaption>
  </figure>
  <hr />
  <h2 id="UVHy">Что уже есть в игре и что дальше?</h2>
  <p id="fsgy">В текущей версии уже доступно:</p>
  <ul id="afWi">
    <li id="hyC8">🛠️ Полная система подготовка/выживания (голод, жажда, патроны, аптечки, документы).</li>
    <li id="OB4p">🔫 Разнообразное оружие, аномальные PSI-способности и монстры.</li>
    <li id="KamR">🏢 Процедурные этажи + авторские сюжетные зоны.</li>
    <li id="qNn8">🤝 Фракции, торговля, экономика и караваны.</li>
    <li id="qx30">☣️ Полноценный Самосбор с укрытиями и перестройкой пространства.</li>
    <li id="joqi">💾 Локальные сохранения в localStorage.</li>
  </ul>
  <figure id="o4UT" class="m_original">
    <img src="https://img3.teletype.in/files/a0/23/a023b650-9853-4887-aeaa-2b6ad6b75aa1.png" width="3456" />
    <figcaption>Лифт на следующий этаж</figcaption>
  </figure>
  <hr />
  <p id="NfBJ">👥 <strong>Присоединяйтесь к разработке и следите за обновлениями:</strong></p>
  <ul id="qlLR">
    <li id="4FYC"><strong>Telegram-канал:</strong> <a href="https://t.me/gigah_rush" target="_blank">@gigah_rush</a> — новости, чейнджлоги и гифки разработки.</li>
    <li id="4kUl"><strong>Играть в браузере:</strong> <a href="https://myindie.ru/games/game/gigahrush" target="_blank">myindie.ru/games/game/gigahrush</a></li>
  </ul>
  <p id="JzJB"><em>Напишите в комментариях: как вам концепт чистокровного браузерного survival-horror без внешних движков?</em></p>

]]></content:encoded></item></channel></rss>