> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ss14.art/llms.txt
> Use this file to discover all available pages before exploring further.

# Сетки

RobustToolbox имеет встроенную поддержку тайловых карт, называемых сетками (игроки SS14 также могут называть их шаттлами или станциями).

Внутренне они хранятся в виде чанков, так что при обновлении тайла обновляется только этот конкретный чанк, а не вся сетка. Чанки хранятся в хеш-карте по их началу (нижний левый угол). Это означает, что при расширении сетки нам не нужно копировать огромный массив, а нужно только создать или удалить новый чанк по мере необходимости.

## Коллизия сеток

Сетки используют тот же физический код (box2d), что и всё остальное. Сначала стоит [ознакомиться с документацией box2d](https://box2d.org/documentation/).

Мы генерируем фикстуры для каждого чанка и прикрепляем их к телу сетки. При обновлении тайла мы регенерируем все фикстуры для этого чанка; мы также стараемся генерировать фикстуры максимально большого размера, чтобы уменьшить их общее количество. Например, если все тайлы чанка 16x16 заполнены, то будет 1 фикстура размером 16x16. В SS14 это выглядит следующим образом:

<img src="https://mintcdn.com/meowmew/ziQKzpWpMFQkx6ZJ/images/grids-overlay.jpg?fit=max&auto=format&n=ziQKzpWpMFQkx6ZJ&q=85&s=07c9c07507a798bbfb3e0e7a4042629a" alt="grids.jpg" width="1282" height="696" data-path="images/grids-overlay.jpg" />

\*Красные линии представляют границы фикстур. Карта SS14 может состоять из сотен фикстур.
\*В нижнем левом углу виден шов между соседними чанками. Фикстуры генерируются на уровне чанков, поэтому не будут больше.

## Разделение сеток

Когда тайлы отделяются от остальной части сетки, мы определяем, нужно ли выделить их в новую сетку.

Для этого требуется поиск пути при каждом обновлении фикстур сетки, чтобы определить, не отделились ли какие-либо части. Вместо выполнения этой операции для каждого тайла (что было бы prohibitively дорого), мы превращаем группы тайлов в одном чанке в "узлы" и выполняем поиск пути по ним. Весь процесс выглядит следующим образом:

1. Когда чанку необходимо регенерировать фикстуры, мы также регенерируем его узлы. Мы делаем это, выполняя floodfill каждого тайла в чанке и возвращая каждый отдельный узел.
2. Для каждого узла мы определяем его соседей. Они не могут находиться в том же чанке (иначе они были бы частью исходного floodfill), поэтому мы проверяем только тайлы в соседних чанках на наличие их узлов.
3. На этом этапе мы построили граф сетки. На предыдущих шагах мы отметили, какие узлы были "грязными" (новые созданные и все соседние). Отсюда мы начинаем floodfill грязных узлов, чтобы определить, все ли они соединены друг с другом. Если все грязные узлы всё ещё соединены, разделение невозможно; но если после floodfill остались узлы, мы продолжаем итеративно, пока не получим все отдельные группы узлов.
4. Из полученных групп узлов мы создаём новые сетки. Для этого мы:

* Создаём новую сетку и применяем позицию + физические данные старой сетки (например, её скорость)
* Устанавливаем все тайлы на новой сетке
* Для каждого тайла проверяем наличие закреплённых сущностей и перезакрепляем их на новой сетке. Поскольку новая сетка имеет ту же позицию и поворот, что и старый родитель, нам нужно только обновить родителя.
* Для каждого тайла проверяем наличие незакреплённых сущностей и переназначаем их родителя на новую сетку.
* Устанавливаем все тайлы на старой сетке как пустые.

## Отладка

### Команды

`showchunkbb`
Включает отображение всех фикстур сеток в окне просмотра.

`showgridnodes`
Включает отображение узлов сеток, используемых для проверки разделения. Также включает связи между узлами.
