Компоновка уровня на глобальной карте

Материал из Моддинг трилогии S.T.A.L.K.E.R. - modFAQ.RU | +TES/Fallout
Перейти к навигации Перейти к поиску

Компоновка уровня на глобальной карте

Автор БАТЯ-STALKER
Дополнили XMK, stalker grez, aka_sektor
Тип статьи руководство
Актуальность ЧН, ЗП
Необходимый софт Текстовый редактор, STALKER Icon Editor, Map dragger
Необходимые файлы game_maps_single.ltx, level.ltx, map\map_имя_нового_уровня.dds, ui_global_map.dds

Теория

  1. Что такое глобальная карта?
    Это текстура, поверх которой расставлены текстуры локальных карт всех уровней и объеденены общим фоном-переходом[1][2].
  2. Как она работает?
    В конфиге задается путь к текстуре и её координаты-размеры.
  3. Откуда на ней все карты локаций?
    Локальные карты всех уровней налкадываются на глобальную карту по заданным в конфиге координатам.
    Таким образом, в разделе КПК "Карта" видно метки локации "Кордон" на участке обозначающем "Кордон". А метки, например, "Армейских складов" — там где они и должны быть.

Разбор конфигов

На примере файлов Чистого Неба (аналогично и в Зове Припяти).

Глобальная карта

За параметры глобальной карты отвечает секция [global_map]

[global_map]
        ;
        bound_rect                       = 0.0, 0.0, 1024, 2634.0
        max_zoom                         = 6.0
        texture                          = ui\ui_global_map

По умолчанию она находится в файле по пути gamedata\configs\game_maps_single.ltx

bound_rect – параметр задаёт координаты-размеры текстуры, нечто вроде сетки на глобальной карте. Числа означают крайние точки координат:

  • 0.0, 0.0 — координаты верхнего левого угла глобальной карты
  • 1024, 2634.0 — координты нижнего правого угла глобальной карты.

Обратите внимание! Это не пиксели! Текстура имеет размер 1024x2048, а может быть и любого другого — но для движка высота карты берётся равной 2634.0 пункта! При том что ширина сохраняется 1024.

texture — параметр задаёт путь к текстуре относительно папки gamedata\textures. В данном случае, это ui\ui_global_map.

Обратите внимание! Расширение *.dds текстуры указывать не нужно.

max_zoom — это максимальное увеличение карты в КПК. В данном случае, максимально можно приблизить изображение в 6 раз. Пробуйте устанавливать и другие значения, иногда получается интересно.


Локальные карты

За параметры локальных карт отвечает секция [level_map] в файлах level.ltx каждого из уровней по пути gamedata\levels\имя_уровня\

bound_rect – параметр задаёт крайние координаты уровня ВНУТРИ самой локации. Любой кто имел дело с координатами на уровнях, замечал что X и Y (высоту сейчас не принимайте в расчет) бывают не только положительными, но и отрицательными. Точка на уровне имеющая координаты 0,0 это не угол карты, как можно было бы предположить, а где-то около её середины.

Например, на локации "Кордон" в ТЧ, точка с координатами 0,0 расположена недалеко от поста Кузнецова под мостом. А вот возле бункера Сидоровича координата X у игрока (или чего угодно другого, любого объекта в игре) будет отрицательная. А возле блокпоста военных (тот, что на юге, вниз по дороге от деревни новичков) координата Y будет отрицательной.

В параметре bound_rect последовательно указаны самые минимальные координаты уровня и самые максимальные. То есть самый меньший X, потом самый меньший Y, потом самый большой X, и четвёртое число – самый большой Y.

Обратите внимание! Эти координаты вовсе не там, где можно побегать. Нет. Речь идёт об УГЛАХ локации, там где заканчивается земля и начинается пустота. На локации "Лиманск" (bound_rect) юго-западный угол имеет координаты -210.000000,-415.000000, а северо-восточный 210.000000,425.000000. Точность указана до одной миллионной.

texture — параметр задаёт путь к текстуре относительно папки gamedata\textures. Именно она показывается на мини-карте в игре, и она же накладывется на глобальную карту по указанным координатам. В данном случае, это map\map_имя_уровня.

Координаты расположения всех уровней (от Болота до ЧАЭС-2) на глобальной карте прописываются в секции [level_maps_single] того же файла game_maps_single.ltx

[level_maps_single]
        agroprom                         =
;       agroprom_underground             =
        darkvalley                       =
        escape                           =
        garbage                          =
        limansk                          =
        marsh                            =
        military                         =
        red_forest                       =
        stancia_2                        =
        yantar                           =

Точнее, в одноименных секциях, указанных в [level_maps_single].

Обратите внимание:

  • Имена всех уровней должны соответствовать именам уровней из gamedata\levels\
  • Если не прописать уровень в секцию [level_maps_single] — игра не вылетит.
    Например, agroprom_underground — закомментирован, но имеет локальную карту, отображаемую на мини-карте в игре.

Пример секции:

[limansk]
        global_rect                      = 66.0, 874.0, 182.0, 1105.000000
        music_tracks                     = limansk_musics
        weathers                         = dynamic_default

global_rect – параметр задаёт координаты прямоугольника на глобальной карте, тот кусочек куда будет вписана (наложена) локальная карта уровня, и где будут с учётом масштаба отображаться все метки локации. Метод указания координат аналогичен bound_rect глобальной карты. Берутся два угла: первый — верхний левый, второй — нижний правый.

Обратите внимание! При определении координат на уровне отсчёт Y идёт снизу вверх, а тут наоборот, сверху вниз. Т.е. точка с координатами 50, 100 будет ВЫШЕ, чем точка 50, 200. А точка с координатами 50, 0 — вообще на самом верху. В то время, как точка с координатами 50, 2634 — на самом низу глобальной карты. Вообще, правило отсчёта координат от верхнего левого угла текстуры характерно для S.T.A.L.K.E.R., неизвестны другие игры использующие *.dds-формат таким же образом.

Касаемо координат 66.0, 874.0, 182.0, 1105.000000, получается, что прямоугольник куда будет вписана локальная карта уровня (в данном случае: Лиманска) определён двумя точками. Первая с координатами (на глобальной карте!) 66.0, 874.0, а вторая с координатами 182.0, 1105.000000. Зачем столько нулей – неизвестно. Но по этим координатам видно, что локальная карта Лиманска будет вписана в прямоугольник, который начинается от 66 по X и 874 по Y, а заканчивается на 182 по X и 1105 по Y. Итого на глобальной карте размер карты Лиманска составит 116x231 пункта.

Обратите внимание! Это не пиксели, а пункты, количество которых ограничено параметром bound_rect в секции [global_map] глобальной карты.

music_tracks – параметр задаёт секцию (по умолчанию она находится в файле по пути gamedata\configs\game_levels_music.ltx), в которой задаётся путь к фоновой музыке уровня относительно папки gamedata\textures. В данном случае, это music\limansk (limansk.ogg).

weathers – параметр задаёт секцию (по умолчанию она находится в файле по пути gamedata\configs\environment\dynamic_weather_graphs.ltx), в которой задаются секции погоды. В данном случае, это dynamic_default.

Примечание

  • Интересно, что, например, локация "Подземелья Агропрома" в ТЧ, на глобальной карте тоже есть – но для неё отведено всего лишь 2x3 пункта, и находятся она почти посередине локации "Агропром"! Именно поэтому, когда игрок находится в подземке, его метка всегда светится в районе завода, где прятался Крот при первом заходе на локацию, и практически неподвижна.
  • Похожим образом сделано и с локацией "Лаборатория Х-18" – она на глобальной карте расположена справа от локации "Радар", но размер её прямоугольника всего 2x2 пункта.

Практика

Этап 1. Редактирование текстуры

Откройте файл по пути gamedata\textures\ui\ui_global_map.dds в графическом редакторе (рекомендуется Adobe Photoshop + NVIDIA Texture Tools) и определите место для новой локации.

Map-location-01.jpg


Наложите текстуру нового уровня в выбранное место, и сохраните изменения.

Этап 2. Расчет координат

Для добавления новой локации на глобальную карту в КПК, необходимо рассчитать её координаты: global_rect.

Чтобы это сделать, используйте координаты bound_rect и текстуру локальной карты. Они формируются при сборке уровня в Level Editor X-Ray SDK. Прописываются в секции [level_map] файла level.ltx нового уровня по пути gamedata\levels\имя_нового_уровня\

Секция имеет следующий вид:

[level_map]
bound_rect = -210.000000,-415.000000,210.000000,425.000000
texture = map\map_limansk

Обратите внимание! Уровень должен быть сделан правильно, иметь правильную прямоугольную форму террейна, а геометрия оставаться в пределах террейна[3][4]. В противном случае, при сборке в SDK есть риск получить неправильные координаты.

Способ 1. STALKER Icon Editor

Откройте файл ui_global_map.dds в утилите STALKER Icon Editor, укажите выбранное место новой локации, и получите координаты верхнего левого угла будущего места расположения локации (см. нижнюю строку):

Map-location-02.jpg
На скриншоте не видно курсора, но координаты есть: x=180, y=370


global_rect нового уровня можно рассчитать зная:

  1. Координаты из STALKER Icon Editor. В данном случае: x=180, y=370
  2. Разрешение текстуры глобальной карты. В данном случае: 1024x2048
  3. Координаты параметра bound_rect секции [global_map]. В данном случае: 1024, 2634.0

Калькуляция:

  1. Разделите координату 2634 на высоту текстуры 2048. Получится: 1.2861328125
  2. Умножте координату y=370 на получившееся в предыдущем пункте значение. Получится: 475.86
  3. Если разрешение текстуры локальной карты нового уровня размером 100x100, то global_rect будет такой: 180.0, 475.86, 280.0, 575.86

    180.0 — координата X левого края текстуры локации.
    475.86 — число, которое получено. Координата верхнего края текстуры локации.
    280.0 — координата X правого края текстуры локации (получена путём прибавления к координате левого края локации — ширины локальной карты уровня).
    575.86 — координата Y нижнего края текстуры локации (получена путём прибавления к координате верхнего края локации — высоты локальной карты уровня).

Способ 2. Map dragger

[5]

Этап 3. Прописка в конфиг

  1. Пропишите новый уровень в секции [level_maps_single] в файле по пути gamedata\configs\game_maps_single.ltx
  2. Полученный global_rect задайте одноименному параметру в секции нового уровня.
  3. Готово!
Map-location-03.jpg
Результат.


Источники