<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://rnr-wiki.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=LabVaKars1</id>
	<title>RnR Wiki - Вклад участника [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://rnr-wiki.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=LabVaKars1"/>
	<link rel="alternate" type="text/html" href="https://rnr-wiki.ru/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/LabVaKars1"/>
	<updated>2026-07-28T09:49:49Z</updated>
	<subtitle>Вклад участника</subtitle>
	<generator>MediaWiki 1.32.0</generator>
	<entry>
		<id>https://rnr-wiki.ru/index.php?title=Way-%D1%84%D0%B0%D0%B9%D0%BB%D1%8B&amp;diff=5552</id>
		<title>Way-файлы</title>
		<link rel="alternate" type="text/html" href="https://rnr-wiki.ru/index.php?title=Way-%D1%84%D0%B0%D0%B9%D0%BB%D1%8B&amp;diff=5552"/>
		<updated>2026-07-26T20:12:22Z</updated>

		<summary type="html">&lt;p&gt;LabVaKars1: Уточнение значения attr_a&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''WAY-файлы''' — бинарные файлы дорожной и маршрутной сети в игре&lt;br /&gt;
''Дальнобойщики 2 / Hard Truck 2: King of the Road''. Обычно находятся в папке&lt;br /&gt;
''ENV'' и имеют имена, соответствующие участкам карты: например,&lt;br /&gt;
''aa.way'', ''ab.way'' или ''da.way''.&lt;br /&gt;
&lt;br /&gt;
Файл хранит геометрию маршрутов в трёхмерных координатах, ширину сегментов,&lt;br /&gt;
служебные узлы и набор атрибутов. Точная игровая семантика части атрибутов пока&lt;br /&gt;
не установлена; ниже описана подтверждённая бинарная структура.&lt;br /&gt;
&lt;br /&gt;
== Общая структура ==&lt;br /&gt;
&lt;br /&gt;
Файл состоит из вложенных чанков. Каждый чанк имеет четырёхсимвольный ASCII-тег&lt;br /&gt;
и размер полезной нагрузки в байтах:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct ChunkHeader {&lt;br /&gt;
    char     tag[4];&lt;br /&gt;
    uint32_t size; // little-endian&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После полезной нагрузки добавляются нулевые байты до границы 4 байт. Размер&lt;br /&gt;
чанка в заголовке не включает ни сам заголовок, ни это выравнивание.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
padding = (4 - (size mod 4)) mod 4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все числа записываются в порядке байтов ''little-endian''.&lt;br /&gt;
&lt;br /&gt;
Подтверждённое дерево чанков имеет следующий вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
WTWR&lt;br /&gt;
├── MNAM&lt;br /&gt;
└── GDAT&lt;br /&gt;
    └── GROM × N&lt;br /&gt;
        ├── RNAM&lt;br /&gt;
        ├── RNOD × N&lt;br /&gt;
        └── RSEG × N&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Чанк !! Назначение !! Тип&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;WTWR&amp;lt;/code&amp;gt; || Корневой контейнер файла || контейнер&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MNAM&amp;lt;/code&amp;gt; || Короткое имя карты, например &amp;lt;code&amp;gt;aa&amp;lt;/code&amp;gt; || строка с NUL в конце&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GDAT&amp;lt;/code&amp;gt; || Данные дорожного графа || контейнер&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GROM&amp;lt;/code&amp;gt; || Дорожная комната/группа сегментов || контейнер&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RNAM&amp;lt;/code&amp;gt; || Имя комнаты || строка с NUL в конце&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RNOD&amp;lt;/code&amp;gt; || Именованный служебный узел || контейнер&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RSEG&amp;lt;/code&amp;gt; || Сегмент маршрута || контейнер&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Строки в исследованных файлах совместимы с ASCII и Windows-1251; при чтении&lt;br /&gt;
строка заканчивается на первом байте &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Узлы RNOD ==&lt;br /&gt;
&lt;br /&gt;
Контейнер &amp;lt;code&amp;gt;RNOD&amp;lt;/code&amp;gt; состоит из трёх обязательных чанков:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RNOD&lt;br /&gt;
├── NNAM&lt;br /&gt;
├── POSN&lt;br /&gt;
└── FLAG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Чанк !! Размер !! Содержимое&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;NNAM&amp;lt;/code&amp;gt; || переменный || имя узла или служебной позиции&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;POSN&amp;lt;/code&amp;gt; || 24 байта || &amp;lt;code&amp;gt;double x, double y, double z&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;FLAG&amp;lt;/code&amp;gt; || 4 байта || &amp;lt;code&amp;gt;uint32 flag&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Примеры имён: &amp;lt;code&amp;gt;node_store_1000&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pos_hidden_0100&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;STO_AA&amp;lt;/code&amp;gt;. Встречаются значения &amp;lt;code&amp;gt;FLAG&amp;lt;/code&amp;gt; 0 и 1, но их точное&lt;br /&gt;
значение для игровой логики не подтверждено.&lt;br /&gt;
&lt;br /&gt;
== Сегменты RSEG ==&lt;br /&gt;
&lt;br /&gt;
Контейнер &amp;lt;code&amp;gt;RSEG&amp;lt;/code&amp;gt; описывает одну полилинию и состоит из трёх&lt;br /&gt;
обязательных чанков:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RSEG&lt;br /&gt;
├── ATTR&lt;br /&gt;
├── WDTH&lt;br /&gt;
└── VDAT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ATTR ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ATTR&amp;lt;/code&amp;gt; всегда имеет размер 16 байт:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct SegmentAttributes {&lt;br /&gt;
    uint32_t path_flags;&lt;br /&gt;
    double   attr_value;&lt;br /&gt;
    uint32_t attr_b;&lt;br /&gt;
}; // последовательная упаковка: &amp;lt;IdI&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
path_flags - набор битовых флагов описывающих текущий сегмент. Приблизительные значения каждого флага:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Флаг !! Описание !! Где встречается&lt;br /&gt;
|-&lt;br /&gt;
| 00000001 || Строит Bezier кривую по &amp;lt;b&amp;gt;4&amp;lt;/b&amp;gt; точкам || Большинство дорог&lt;br /&gt;
|-&lt;br /&gt;
| 00000010 || Строит путь по точкам  || Часто встречается в Алмазном&lt;br /&gt;
|-&lt;br /&gt;
| 00000100 || Скрывает левую полосу || Односторонние разьезды на базах&lt;br /&gt;
|-&lt;br /&gt;
| 00001000 || Скрывает правую полосу || Односторонние разьезды на базах&lt;br /&gt;
|-&lt;br /&gt;
| 00010000 || Путь, который не отображается на миникарте || Невидимые заезды на СТО, заправки&lt;br /&gt;
|-&lt;br /&gt;
| 00100000 || Путь, который скрыт по умолчанию, но заполняется во время проезда || Скрытые срезки на карте(шахты, болото и т.д.)&lt;br /&gt;
|-&lt;br /&gt;
| 01000000 || Пути, где не спавнится трафик? || Встречается только в заброшенных шахтах&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
В исследованных файлах встречаются &amp;lt;code&amp;gt;path_flags&amp;lt;/code&amp;gt; со значениями 1, 2, 6,&lt;br /&gt;
22, 34, 53, 57, 97 и 98; &amp;lt;code&amp;gt;attr_b&amp;lt;/code&amp;gt; — 1, 2 и 3. Это наблюдаемые&lt;br /&gt;
значения, а не расшифрованные типы дороги.&lt;br /&gt;
&lt;br /&gt;
В частности, &amp;lt;code&amp;gt;path_flags = 98&amp;lt;/code&amp;gt; нельзя однозначно считать тупиком:&lt;br /&gt;
в разных картах он встречается как на коротких соединителях, так и на длинных&lt;br /&gt;
цепочках. Автоматически менять этот атрибут без проверки в игре небезопасно.&lt;br /&gt;
&lt;br /&gt;
=== WDTH ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;WDTH&amp;lt;/code&amp;gt; имеет размер 16 байт:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct SegmentWidth {&lt;br /&gt;
    double width_left;&lt;br /&gt;
    double width_right;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обычно оба значения одинаковы: например, &amp;lt;code&amp;gt;3.0 / 3.0&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;4.0 / 4.0&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;8.0 / 8.0&amp;lt;/code&amp;gt;. Вероятнее всего, это ширина&lt;br /&gt;
слева и справа от осевой линии сегмента, однако это ещё не подтверждено&lt;br /&gt;
исходным кодом игры.&lt;br /&gt;
&lt;br /&gt;
=== VDAT ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;VDAT&amp;lt;/code&amp;gt; содержит вершины полилинии:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct VertexData {&lt;br /&gt;
    uint32_t count;&lt;br /&gt;
    struct { double x, y, z; } points[count];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Размер полезной нагрузки должен соответствовать формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VDAT.size = 4 + count × 24&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Начальная и конечная вершины часто совпадают с концами других сегментов и тем&lt;br /&gt;
самым задают геометрические связи маршрута. Удаление или перенос этих точек&lt;br /&gt;
может разорвать дорожную сеть.&lt;br /&gt;
&lt;br /&gt;
== Координаты ==&lt;br /&gt;
&lt;br /&gt;
Координаты точек и узлов хранятся как три &amp;lt;code&amp;gt;float64&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
X, Y, Z&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для двумерного отображения обычно используются &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; и&lt;br /&gt;
&amp;lt;code&amp;gt;-Y&amp;lt;/code&amp;gt;, поскольку в SVG и на экране ось Y направлена вниз. Координата&lt;br /&gt;
&amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt; соответствует высоте.&lt;br /&gt;
&lt;br /&gt;
== Безопасное редактирование ==&lt;br /&gt;
&lt;br /&gt;
При записи WAY-файла необходимо:&lt;br /&gt;
&lt;br /&gt;
# сохранять порядок чанков и неизвестные чанки без изменений;&lt;br /&gt;
# пересчитывать размеры изменённых чанков и их контейнеров;&lt;br /&gt;
# сохранять выравнивание до 4 байт;&lt;br /&gt;
# записывать числа в little-endian;&lt;br /&gt;
# завершать строки нулевым байтом;&lt;br /&gt;
# создавать резервную копию исходного файла;&lt;br /&gt;
# после записи повторно разобрать файл и проверить структуру.&lt;br /&gt;
&lt;br /&gt;
Для файла без изменений корректный сериализатор должен давать побайтно тот же&lt;br /&gt;
результат, что и исходный файл.&lt;br /&gt;
&lt;br /&gt;
== Неизвестные части формата ==&lt;br /&gt;
&lt;br /&gt;
Требуют дальнейшего исследования:&lt;br /&gt;
&lt;br /&gt;
* точная игровая роль полей &amp;lt;code&amp;gt;attr_value&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;attr_b&amp;lt;/code&amp;gt;;&lt;br /&gt;
* значение &amp;lt;code&amp;gt;FLAG&amp;lt;/code&amp;gt; у разных видов RNOD;&lt;br /&gt;
* направление движения по массиву точек;&lt;br /&gt;
* односторонность, полосы движения и скрытые ссылки между сегментами;&lt;br /&gt;
* безопасное добавление и удаление RSEG без изменения других ресурсов игры.&lt;br /&gt;
&lt;br /&gt;
== Утилиты ==&lt;br /&gt;
&lt;br /&gt;
Для просмотра и аккуратного редактирования формата существует&lt;br /&gt;
[https://github.com/VldmrInt/HT2-WAY-Tool HT2 WAY Tool]. Утилита поддерживает&lt;br /&gt;
просмотр структуры, экспорт JSON/SVG/CSV, резервные копии и проверку сегментов&lt;br /&gt;
с &amp;lt;code&amp;gt;attr_a = 98&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дальнобойщики 2]]&lt;br /&gt;
[[Категория:Моддинг (Дальнобойщики 2)]]&lt;br /&gt;
[[Категория:Форматы ресурсов]]&lt;/div&gt;</summary>
		<author><name>LabVaKars1</name></author>
		
	</entry>
</feed>