Описание НАДЗЕМНОГО уровня карты (level >= 1). Уровень 0 остаётся в
полях map/physicsStatic/layers — так карта старого формата
продолжает грузиться без единой правки.
Слоистая геометрия карты без физического мира: гриды уровней, списки
сплошных тайлов, прогоны рамп. Хост держит её внутри GameMap,
клиентская реплика игры строит из полей MAP_DATA — правила уровней у
обеих сторон читаются отсюда и только отсюда.
Максимум поддерживаемых уровней: земля + одна эстакада. Больше двух
упирается в 2.5D-модель (у луча/танка ровно один «текущий» уровень) и
в бюджет масок Rapier, отведённый под уровни.
Группа статики карты: её несут стены ВСЕХ уровней в дополнение к своей
level_group. Нужна телам, которым по правилам игры полагаются только
стены и ни одного динамического тела (падающий с обрыва танк): маска
STATIC_LEVEL_GROUP в одиночку видит стену любого уровня и не видит ни
танков, ни ящиков. Уровни занимают GROUP_1..GROUP_2 (см. MAX_LEVELS),
поэтому статика берёт заведомо свободный бит.
Битовая маска слоя для InteractionGroups. Уровень 0 — GROUP_1,
уровень 1 — GROUP_2. Тела за пределами реестра (не выставившие группы)
остаются в Group::ALL и поэтому продолжают взаимодействовать с
уровнем 0 — старые карты и старые игры не замечают появления слоёв.
Проверки формы слоёных полей карты (levels/ramps). Вынесены из
MapConfig::validate отдельной функцией, потому что выполнять их обязаны
обе стороны: хост при загрузке карты и клиентская реплика, которой те же
поля приходят по сети в MAP_DATA. Косой грид уровня на клиенте не паникует
— он молча даёт геометрию, отличную от хостовой, и предсказание расходится
без единой строки в консоли: ровно та категория отказа, ради которой
валидатор и написан.