<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>TENEVIK GAMES</title><author><name>TENEVIK GAMES</name></author><id>https://teletype.in/atom/tenevik_games</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/tenevik_games?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@tenevik_games?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=tenevik_games"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/tenevik_games?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-09-14T01:13:01.062Z</updated><entry><id>tenevik_games:rwCVL51A6zs</id><link rel="alternate" type="text/html" href="https://teletype.in/@tenevik_games/rwCVL51A6zs?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=tenevik_games"></link><title>Как я заставил сотни тысяч NPC ходить по лабиринту 1024×1024, убрав поиск пути</title><published>2026-08-16T13:01:09.840Z</published><updated>2026-08-16T13:01:09.840Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/5f/3b/5f3bec30-d87a-4493-beaa-482d88d49c10.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/5c/82/5c824a02-68b4-4809-88d1-71bfb9ba9d4d.png&quot;&gt;Осенью 2004 я сел писать прототип на C++ и SDL2. Задача была одна: мир-лабиринт размером 1024×1024 клетки и толпа персонажей, которые по нему осмысленно ходят — не по скрипту, не по рельсам, а из точки в точку через двери и комнаты.</summary><content type="html">
  &lt;p id=&quot;ZhCm&quot;&gt;Осенью 2004 я сел писать прототип на C++ и SDL2. Задача была одна: мир-лабиринт размером 1024×1024 клетки и толпа персонажей, которые по нему &lt;strong&gt;осмысленно ходят&lt;/strong&gt; — не по скрипту, не по рельсам, а из точки в точку через двери и комнаты.&lt;/p&gt;
  &lt;p id=&quot;Mtgg&quot;&gt;Не десятки персонажей. Не тысячи. В константах прототипа стоит:&lt;/p&gt;
  &lt;pre id=&quot;FCIx&quot;&gt;#define WORLD_WIDTH  1024
#define ROOMS        16384
#define CONNECTIONS  128
#define MAX_OBJECTS  1048576&lt;/pre&gt;
  &lt;p id=&quot;eKbU&quot;&gt;Миллион. И это не бравада в дефайне — оно работает, потому что архитектура построена вокруг одной мысли: &lt;strong&gt;персонаж не ищет путь&lt;/strong&gt;.&lt;/p&gt;
  &lt;figure id=&quot;r2Nt&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/5c/82/5c824a02-68b4-4809-88d1-71bfb9ba9d4d.png&quot; width=&quot;1024&quot; /&gt;
    &lt;figcaption&gt;Мир-лабиринт 1024×1024: 16 384 комнаты и сотни тысяч перемещающихся агентов&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;uFmJ&quot;&gt;Дальше — как именно. Весь код свой, литературу по алгоритмам я не читал; до всего доходил из первых принципов и проверял на практике. Уже потом выяснил, что у похожей схемы есть название и статьи с середины двухтысячных. Мне это ничего не добавило и не убавило — рассказываю так, как оно строилось.&lt;/p&gt;
  &lt;figure id=&quot;4FZ3&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/bd/14/bd1493f9-abf4-444f-be74-08ea46983bc5.png&quot; width=&quot;720&quot; /&gt;
    &lt;figcaption&gt;Фрагмент лабиринта в приближении: стены, двери и агенты (красные точки)&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;oGdf&quot;&gt;Почему очевидный путь не работает&lt;/h2&gt;
  &lt;p id=&quot;ReQf&quot;&gt;Очевидное решение — дать каждому персонажу искать дорогу самому. Волна в ширину от него до цели, или A*.&lt;/p&gt;
  &lt;p id=&quot;IhYl&quot;&gt;Считаем. Мир — миллион клеток. Одна волна в худшем случае обходит весь мир. Персонажей — сотни тысяч. Даже если волна укладывается в микросекунды, помножьте на число персонажей и на число кадров, и вы получите машину, которая занимается исключительно поиском пути.&lt;/p&gt;
  &lt;p id=&quot;UDhc&quot;&gt;Дальше обычно начинается лечение симптомов: кешировать пути, искать не каждый кадр, а раз в N, завести пул потоков, ограничить «активных» персонажей. Всё это отодвигает потолок, но не убирает его — стоимость по-прежнему растёт с числом персонажей.&lt;/p&gt;
  &lt;p id=&quot;enTh&quot;&gt;Я пошёл в другую сторону. Не «как ускорить поиск», а &lt;strong&gt;«как сделать так, чтобы искать не надо было вообще»&lt;/strong&gt;.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;Ou2L&quot;&gt;Идея: персонаж читает число&lt;/h2&gt;
  &lt;p id=&quot;WLBh&quot;&gt;Представьте, что в каждой клетке мира заранее написано число: «отсюда до двери — столько-то шагов». Тогда персонажу не нужно ничего искать. Он смотрит на своё число, смотрит на числа четырёх соседей, шагает в меньшее. И так, шаг за шагом, приходит к двери.&lt;/p&gt;
  &lt;pre id=&quot;NW7O&quot;&gt;   двери                                      персонаж
     ↓                                            ↓
   ┌───┬───┬───┬───┬───┬───┬───┬───┐
   │ 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 → ...&lt;/pre&gt;
  &lt;p id=&quot;gZ49&quot;&gt;Стоимость шага — четыре чтения из массива и сравнение. &lt;strong&gt;Константа.&lt;/strong&gt; Она не зависит ни от размера мира, ни от расстояния до цели, ни, главное, от числа персонажей. Миллион персонажей — это миллион раз по четыре чтения, и всё.&lt;/p&gt;
  &lt;p id=&quot;G8a4&quot;&gt;Числа считаются один раз при генерации мира. Волна из двери: соседям двери — единица, их соседям — двойка, и так пока не кончится комната.&lt;/p&gt;
  &lt;pre id=&quot;hHU7&quot;&gt;std::queue&amp;lt;int&amp;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 &amp;lt; 4; ++d)
    {
        cell* nb = world[cur].side(d);
        if (!nb) continue;
        int ni = nb-&amp;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);
        }
    }
}&lt;/pre&gt;
  &lt;p id=&quot;2pNS&quot;&gt;Про подчёркнутую строчку — ниже, она тут самая важная.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;336t&quot;&gt;Проблема: полей нужно слишком много&lt;/h2&gt;
  &lt;p id=&quot;yM83&quot;&gt;Схема выше прекрасна, пока цель одна. Но персонажи ходят в разные места. Если считать поле на каждую возможную цель — это миллион полей по миллиону клеток. Не бывает.&lt;/p&gt;
  &lt;p id=&quot;Hx8e&quot;&gt;Значит, поле на весь мир строить нельзя. Нужно, чтобы &lt;strong&gt;поле было маленьким&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;BlcU&quot;&gt;Отсюда вырос второй уровень.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;BpDm&quot;&gt;Уровень 1: комнаты как граф&lt;/h2&gt;
  &lt;p id=&quot;u72q&quot;&gt;Мир разбивается на комнаты. У каждой клетки есть номер комнаты — массив &lt;code&gt;zones&lt;/code&gt;, нумерация с единицы, ноль означает «не комната» (коридор, стена, пустота).&lt;/p&gt;
  &lt;figure id=&quot;SntL&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/60/7e/607e4cde-a11c-4c6a-9a53-c9163888b784.png&quot; width=&quot;720&quot; /&gt;
    &lt;figcaption&gt;Разбиение лабиринта на комнаты (массив zones, каждая комната выделена своим цветом)&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;t8bi&quot;&gt;Двери собираются по комнатам: пробегаем весь мир, каждую клетку типа &lt;code&gt;DOOR&lt;/code&gt; записываем в списки тех комнат, которых она касается. Дверь между двумя комнатами попадает в оба списка — это и делает её дверью.&lt;/p&gt;
  &lt;pre id=&quot;PiFT&quot;&gt;for (size_t i = 0; i &amp;lt; totalCells; ++i)
{
    if (world[i].type != DOOR) continue;

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

    for (int s = 0; s &amp;lt; room_count; ++s)
    {
        std::queue&amp;lt;int&amp;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 &amp;lt; CONNECTIONS; ++k)
            {
                int v = neighbours[u * CONNECTIONS + k];
                if (v == UNREACH) continue;

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

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

for (int k = 0; k &amp;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 &amp;lt; best_room_dist) { best_room_dist = d; next_room = r; }
}&lt;/pre&gt;
  &lt;p id=&quot;ykEr&quot;&gt;&lt;strong&gt;Второе.&lt;/strong&gt; Через какую дверь? Из дверей нашей комнаты берём те, что касаются выбранной соседней, и среди них — ту, до которой нам ближе (по её же полю):&lt;/p&gt;
  &lt;pre id=&quot;l5nG&quot;&gt;for (int f = 0; f &amp;lt; (int)room_doors[current_room].size(); ++f)
{
    int door_cell = room_doors[current_room][f];

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

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

if (best_side != -1)
    obj.pos = world[current_cell].side(best_side)-&amp;gt;get_n();&lt;/pre&gt;
  &lt;p id=&quot;KsBW&quot;&gt;Ни одной волны. Ни одного A*. Ни одного цикла, длина которого зависит от расстояния до цели. Только чтения из заранее посчитанных массивов.&lt;/p&gt;
  &lt;pre id=&quot;LTnu&quot;&gt;   персонаж в комнате 7, идёт в комнату 40
        │
        ├─ 1. таблица комнат  → «следующая комната 12»
        ├─ 2. двери комнаты 7 → «дверь №2, она ведёт в 12»
        └─ 3. поле двери №2   → «сосед справа меньше, шагаю вправо»
                                                    │
                                     повторить на следующем кадре&lt;/pre&gt;
  &lt;p id=&quot;zDyn&quot;&gt;Персонаж не знает маршрута. Он вообще не знает, что такое маршрут. Он каждый кадр отвечает на один вопрос — «куда шагнуть прямо сейчас» — и из этих ответов складывается дорога через полмира.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;88dU&quot;&gt;Раскладка paths: почему полей меньше, чем дверей&lt;/h2&gt;
  &lt;p id=&quot;ntVP&quot;&gt;Полей у нас по одному на дверь, а дверей в мире много. Хранить каждое поле отдельной плоскостью на миллион клеток было бы разорительно.&lt;/p&gt;
  &lt;p id=&quot;Ucf9&quot;&gt;Но поля разных комнат &lt;strong&gt;не пересекаются&lt;/strong&gt; — каждое обрезано своей зоной. Значит их можно класть в одну плоскость.&lt;/p&gt;
  &lt;p id=&quot;1U5H&quot;&gt;Плоскость &lt;code&gt;f&lt;/code&gt; содержит поля &lt;strong&gt;f-х дверей всех комнат сразу&lt;/strong&gt;:&lt;/p&gt;
  &lt;pre id=&quot;1bk7&quot;&gt;плоскость 0:  [поле 0-й двери комн.1][поле 0-й двери комн.2][...]  ← не пересекаются
плоскость 1:  [поле 1-й двери комн.1][поле 1-й двери комн.2][...]
...&lt;/pre&gt;
  &lt;p id=&quot;V9lp&quot;&gt;Отсюда &lt;code&gt;base = f * totalCells&lt;/code&gt; в коде выше. Число плоскостей — это максимальное число дверей у одной комнаты, а не общее число дверей в мире.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;pnfc&quot;&gt;Чем за это заплачено&lt;/h2&gt;
  &lt;pre id=&quot;Dye2&quot;&gt;distances    ROOMS × ROOMS × 2 байта   =  512 МиБ
paths        плоскости × 1024×1024 × 2 =  256 МиБ
neighbours   ROOMS × CONNECTIONS × 2   =    4 МиБ&lt;/pre&gt;
  &lt;p id=&quot;lQ3n&quot;&gt;Три четверти гигабайта, выделенных один раз на генерации мира.&lt;/p&gt;
  &lt;p id=&quot;Y960&quot;&gt;Это выглядит много, и первая реакция обычно — «надо сэкономить». Не надо. Именно полнота этих таблиц покупает константу на шаг персонажа. Как только начинаешь считать что-то лениво или держать в кеше, появляется промах кеша — а промах означает, что кто-то посреди кадра встал считать волну. При сотнях тысяч персонажей это ровно та непредсказуемость, ради избавления от которой всё и строилось.&lt;/p&gt;
  &lt;p id=&quot;XEv2&quot;&gt;Память здесь обменяна на время, причём по фиксированному курсу, известному заранее. Для мира с сотнями тысяч ходячих персонажей это правильная сторона размена.&lt;/p&gt;
  &lt;p id=&quot;6qZ3&quot;&gt;Мелочи, которые тоже не случайны: расстояния лежат в &lt;code&gt;unsigned short&lt;/code&gt;, недостижимость — это &lt;code&gt;65535&lt;/code&gt;, а не отдельный флаг и не &lt;code&gt;-1&lt;/code&gt; в знаковом типе. На таких объёмах два байта против четырёх — это разница между 512 МиБ и гигабайтом.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;aI7A&quot;&gt;Отладка: поле видно глазами&lt;/h2&gt;
  &lt;p id=&quot;qr7P&quot;&gt;Отдельно скажу про то, что сэкономило больше всего времени.&lt;/p&gt;
  &lt;p id=&quot;1pXK&quot;&gt;Поле расстояний — это готовая картинка. Ноль у двери, дальше темнее. Я вывел его прямо в текстуру SDL: клавишами влево-вправо листаешь двери, зелёным подсвечивается комната под курсором, красным — персонажи.&lt;/p&gt;
  &lt;pre id=&quot;ZmeW&quot;&gt;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 &amp;gt; 255) ? 255 : d;
    color = 255 - (unsigned char)dd;
}&lt;/pre&gt;
  &lt;figure id=&quot;5H7e&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e7/b8/e7b86d15-6cd8-4e31-8632-6d95754b8667.png&quot; width=&quot;1024&quot; /&gt;
    &lt;figcaption&gt;Глобальная карта распространения волны по комнатам мира 1024×1024 (от синего эпицентра к периферии)&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;9GnR&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/76/1b/761bce2d-64cc-423e-be24-f157dad7ce1d.png&quot; width=&quot;800&quot; /&gt;
    &lt;figcaption&gt;Отладка поля в приближении: градиент расстояний и агенты (красные точки), спускающиеся по градиенту к двери&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ms2p&quot;&gt;Ошибки в заливке видно мгновенно: комната залилась не до конца — значит где-то дыра в связности; поле перетекло к соседям — значит сломалась обрезка по зонам; чёрное пятно в середине комнаты — недостижимый карман, который персонажи никогда не покинут.&lt;/p&gt;
  &lt;p id=&quot;KGPy&quot;&gt;Это то, что я бы посоветовал каждому, кто делает что-то на сетках: &lt;strong&gt;рисуйте свои промежуточные данные&lt;/strong&gt;. Не логи, не числа в консоль — картинку. Один кадр отладочного хитмапа заменяет час чтения кода.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;uPtn&quot;&gt;Что из этого выросло&lt;/h2&gt;
  &lt;p id=&quot;DfN5&quot;&gt;Прототип занимает около 5000 строк своего кода поверх SDL2. Там нет движка, нет фреймворка, нет чужих библиотек кроме самого SDL — весь стек от структуры клетки и графа комнат до меню и отрисовки написан руками. Этот прототип был написан в октябре 2004 года.&lt;/p&gt;
  &lt;p id=&quot;zt5V&quot;&gt;А потом на этой архитектуре выросла &lt;strong&gt;ГИГАХРУЩ&lt;/strong&gt; — браузерная игра про вылазки в самособирающуюся хрущёвку размером с город.&lt;/p&gt;
  &lt;p id=&quot;xnCK&quot;&gt;Язык другой — TypeScript вместо C++. Объём другой — сотни тысяч строк вместо тысяч. Но принципиально там то же самое: мир 1024×1024, комнаты как граф, поля вместо поиска, персонаж читает число и шагает в меньшее. Всё, что нужно для толпы, было доказано вот в этом маленьком прототипе на SDL.&lt;/p&gt;
  &lt;p id=&quot;NdKt&quot;&gt;Поэтому я и рассказываю про него, а не про текущую версию. Текущая — это тот же концепт, обросший контентом. А идея целиком лежит в пяти с небольшим тысячах строк, и её видно.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;rwnL&quot;&gt;&lt;em&gt;Играть в ГИГАХРУЩ: &lt;a href=&quot;https://tenevik.itch.io/gigahrush&quot; target=&quot;_blank&quot;&gt;tenevik.itch.io/gigahrush&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

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

</content></entry></feed>