openHT2
Свободная реализация движка Hard Truck 2 / «Дальнобойщики 2» на Rust и wgpu. Цель — 1:1 совместимость с оригиналом.
В разработке. Для запуска нужны файлы установленной игры.

Разработка движка
Отмечены перенесённые части; полная игра и интеграция всех систем ещё в работе.
Подробный статус переноса
- готовоЧтение
.RES(141 из 141 файлов),.way(41 из 41),.b3d(45 из 45) и текстур.txr - готовоКонсольный инспектор
ht2-toolи просмотрщик моделей на wgpuht2-view - готовоПрототип: открытый мир из 39 районов, управляемый грузовик с данными из
vehicle.tech, расшифрованные скрипты.sch - готовоПеренос физики оригинала: двигатель, автоматическая коробка, топливо, руль (сверено с оригинальным кодом на эмуляторе)
- готовоПеренос шага физики машины целиком: шины, подвеска, покрытия дорог, кузов (сверено с оригиналом на эмуляторе)
- готовоПеренос конструктора машины: массы, крепления колёс, постановка на землю (сверено с оригиналом на эмуляторе)
- готовоМашина в игре работает на перенесённом коде: конструктор, шаг физики, колёса из узлов модели
- готовоБлоки столкновений комнат (многоугольники, плоскости) с типами покрытий; проверка отрезка перенесена из оригинала
- готовоОбход графа сцены как в оригинале: комнаты, порталы, делящие узлы
- в работеСтены комнат и столкновения кузова, отрисовка колёс как в оригинале
- готовоДорожная сеть из
.wayкак в оригинале: кривые Безье, длина дуги, узлы, движение по маршруту (сверено с оригиналом на эмуляторе) - готовоВодитель машин ИИ: руль, удержание полосы, скорость перед поворотами, торможение, выезд задним ходом
- готовоПоток машин ИИ видит соседей: держит дистанцию, перестраивается, разворачивается
- готовоМодуль дорог оригинала запущен в эмуляторе на настоящих картах: сеть дорог, поиск маршрута и генератор случайных чисел перенесены и совпадают с оригиналом
- готовоГорода из скриптов районов
mod_*.sch: узлы складов и разгрузки размечаются, как при начале новой игры в оригинале - готовоМир ИИ новой игры как в оригинале: рынки, списки машин, 109 игроков, машины на продажу и внаём (сверено с оригиналом побитово)
- готовоДвижение машин ИИ вне видимости со скоростью игрока; подгрузка машин в сцену по «нужности», задачи часов игры и поток «призраков» вокруг игрока — сверены с оригиналом в эмуляторе, сотни тиков побитово
- готовоМашины ИИ со своими моделями и физикой из каталога: легковые, грузовики, тягачи
- готовоОбъекты новой игры как в оригинале: бочки топлива, полуприцепы на базах и на дорогах с заказами, контейнеры, машины на стоянках (сверено побитово)
- готовоЗаказы городов и задачи часов игры: продавцы, соперники, засады, порча груза, гонки, препятствия и дорожные работы — первые 8 часов игры совпадают с оригиналом побитово; с едущим игроком (срабатывание и снятие засад, проеханные дороги) — первые 2 часа
- готовоДальнобойщики ИИ берут, везут и сдают заказы (вместимость из
vehicle.tech, цены, прокат), финиш гонки, рейтинг, лицензии и компании дальнобойщиков, движение по маршруту с разворотами как в оригинале - готовоЗаказы игрока и его конкуренты: погрузка, выгрузка, штраф за просрочку, гонка дальнобойщиков к городу (сверено с оригиналом побитово)
- готовоРозыск игрока: погоня полиции и мафии, граница штата снимает розыск (сверено с оригиналом побитово)
- готовоУчёт скрытого груза, интереса мафии и сигнализации, включение мафиозных засад: 2160 пар вызовов совпадают с оригиналом, включая полное состояние генератора
- в работеНавигатор игрока, собственная компания игрока и нелегальные грузы
- готовоПодмена товара в заказах городов на нелегальный при росте доли игрока: 480 сценариев сверены с оригиналом, включая поля заказа и генератор
- готовоРасчёт долей компаний с парком сотрудников и фиксация победителя: 720 вызовов сверены с оригиналом; экран победы ещё не подключён
- готовоПосле победы расширяется выбор машин продавцов; игровой прототип передаёт смену дороги игрока в обработку границ и преследования
- в работеСобытие победы доставляется в прототип с выбором оригинального ролика или меню; проигрыватель и переходы интерфейса ещё не готовы
- в работеМедиаслой: контейнеры всех семи роликов BNE/AVI читаются; декодирование Indeo 5, видео и звук ещё не подключены
- готовоИзвлечение PCM-звука роликов: сэмплы всех семи BNE побайтово совпадают с FFmpeg; аудиовывод ещё не подключён
- в работеWindows-аудиобэкенд выводит PCM, поддерживает паузу и остановку, проверен на аудиоустройстве; синхронизация с роликами ещё не подключена
- в работеПотоковый декодер на внешнем FFmpeg выдаёт RGBA всех семи роликов, проверены тайминги и досрочное закрытие; показ кадров ещё не подключён
- в работеКадр ролика выводится через wgpu без изменения пикселей в исходном размере; общие видеочасы и синхронизация со звуком ещё не подключены
- в работеПроигрыватель подключён к запросам победы: видео идёт по часам аудиоустройства; проверена связка декодера, GPU и звука. Переходы меню после ролика ещё не готовы
- в работеПропуск ролика и выбор режима следующего меню сверены с оригиналом: 140 событий ввода и три перехода. Отображение меню ещё не перенесено
- готовоПалитровые UI-текстуры TXR/TGA: все 172 изображения LOAD.RES декодируются без пропусков; интерактивные меню ещё в работе
- в работеИтоговые экраны показывают исходные фоны из esc16.RES; фон победы проверен снимком. Таблица рейтинга и кнопки ещё не перенесены
- готовоЧтение атласов FON: метрики и маски всех 1792 символов семи шрифтов совпали с оригиналом на эмуляторе; размещение текста ещё в работе
- в работеОбновление сценической машины (
0x54ff80) переносится по частям, каждая сверена с оригиналом в эмуляторе: триггер удара, наклон кузова, биты приборов, пыль колёс, лучи света целиком, выбор манёвра (0x54f040: 250 случаев со всей функцией и записанными ответами дорожного модуля), проверка приборов, зонд луча (0x54cb90), слоты запросов (0x54d0b0), сброс объекта (0x580dd0), «returnToLast» (0x554670), сетевые сообщения (0x546360,0x546240); вся функция собрана из частей и сверена с настоящей0x54ff80на 150 случайных сценах (внешние объекты движка — владельцы-заглушки, их порты впереди). Дорожный модуль дополнен проверкой односторонних сегментов, зонами точек и поиском по таблице имён (сверка с эмулятором на карте ENV) Перенесены и виртуалы тела MovingItem: шаг интегрирования (0x580ce0), поза (0x580f80), «place» (0x581230), диспетчер запросов столкновения (0x58dff0) и луч по дороге (0x5843c0,0x4e6578,0x4e67f9,0x4e6d41,0x4e5a45, сфера в0x5f6820, тело против соседей0x584570, конструктор набора контактов0x587c80, запрос по сетке дорог0x56f3f0,0x56f650,0x5818b0, сборщик0x56f450, матрица узла0x5f25c0, запрос привязки0x587e20, запись контакта0x584820,0x584c70, тело против узлов дорожной сетки0x585150, переключатель вариантов0x4e480c, виртуал0x583c30, разность поз0x5818d0,0x4e2fb4, обход точек тела0x5820c0,0x581ea0, шаг обновления позы0x582c30, сброс флагов0x58cf30, переключение режима0x58cf60, тело против соседей0x58ae30, лучи по точкам тела0x589640, отрезок против бокса0x589eb0, точки против тела0x58a020, плоскости тела0x58d1f0,0x58d250,0x58b4f0,0x5917f0,0x591b50, тело против всего остального0x58b120, виртуалы обёртки столкновений0x5f9b00,0x5f9d20, стек преобразований сцены0x5ae580,0x5ae8a0, список отложенных событий0x5d32f0с пулом узлов и сортированной вставкой, варианты0x5d3350,0x5d33d0и очистка0x5d3790,0x5d35b0,0x5d33b0; наземный контакт тела0x592a20, поза тела по контакту0x57e2e0, решатель контакта двух тел0x4e7b4d,0x4e794f, отклик тела на контакт0x580a00, грубый отклик0x5808c0с решателем0x4e8ae1, трение тела о контакт0x57e540, разрешение контакта двух тел0x57eae0) — каждый сверен с эмулятором побитово. - планИнтерфейс, звук, задания, торговля
Галерея скриншотов
Кадры из openHT2: текущая сборка, открытый мир и история переноса. Нажмите на снимок, чтобы рассмотреть детали.
Это работа самого движка openHT2 на данных установленной копии игры: открытый мир, гоночная трасса, грузовик, комбинат и арена.

Выброс идёт через перенесённые ветки
0x551970 (колёса и выхлоп, побитовые сравнения с эмулятором) по временной сцене машины: пыль из-под колёс и пар выхлопа. Кадр из openHT2; ресурсы принадлежат оригинальной игре.
После переноса переключателей B3D виден радар-детектор с индикаторами. Его начальный вид взят из файла; реакция на игровые события ещё не подключена.

Оригинальная 3D-кабина: спидометр, тахометр и топливо подключены к симуляции. Остальные индикаторы ещё в работе.

Своя панель и шкалы из CABINES.B3D. Камера сиденья пока временная.

ЗИЛ у аэропорта. Текущий порт матриц и проекции; положение камеры пока временное.

Аэропорт ENV с места водителя. Точка глаз и интерфейс пока временные.

Свежий обзор района старта. Отладочная камера сверху.

ЗИЛ после восьми секунд движения на перенесённой физике.

evehicles.sch: у каждой своя запись vehicle.tech для перенесённой физики


mod_*.sch, как в оригинале
SecondCar
_Car_V), за рулём — перенесённый водитель ИИ; полосы треугольников (бит 0x80 формата) рисуются как в оригинале
GAME.CNF: аэропорт, ЗИЛ
vehicle.tech


ENV/aa.b3d
MTB/tb.b3d
MENV/dr.b3dМодели, текстуры и сцены на скриншотах принадлежат правообладателям оригинальной игры и показаны только для иллюстрации работы движка. В репозиторий они не входят.
Технические проверки и последние изменения
Ширина текста из FON сверена с king.exe: 1470 проверок на семи шрифтах, включая переносы строк и оба режима ширины. Программные маски строк совпали побайтово в 2520 проверках. Колонки строки рейтинга сверены на 640 командах вывода; порядок компаний и строка игрока совпали на 320 таблицах. Таблица подключена к игровому миру и показана в итоговом меню; GPU-кадр и кириллица проверены. Логотипы компаний подключены; 64 сравнения масок с оригиналом прошли. Кнопки показаны оригинальными текстурами, 200 раскладок сверены. Состояния кнопок совпали в 564 проверках; подключение событий окна подключены к мыши. Продолжить возвращает в игровой мир; перезапуск, главное меню и клавиатурная навигация ещё в работе. Сброс очереди сценарного контроллера и базовый сброс сверены с оригиналом на 400 случаях; восстановление камеры — ещё на 200 состояниях, очистка сцены — на 160 наборах списков. Выполнение сценария перезапуска ещё не подключено. Порядок внутренних задач и 84 случая их диспетчеризации сверены с оригиналом. Постановка 6300 запросов планировщика совпала по порядку и отклонению дубликатов. Исполнение очередей сверено на 200 состояниях, запросов — на 20 комбинациях; завершение кадра — на восьми ветках палитры и аудио. Начало кадра совпало побитово на 400 состояниях часов и сцены. Связанный runtime внутренних задач совпал на 200 последовательных тактах; проход сцены — на 256 сочетаниях. Обратные матрицы отражения вычисляются перенесённой математикой и совпали побитово. Матрица камеры подключена напрямую: 200 поз и углов совпали побитово. Подготовка стеков сцены подключена: 160 наборов и 500 специальных обратных матриц совпали побитово. Viewport и проекция совпали на 240 парах команд; явный viewport проверен на GPU. Аппаратная матрица вида совпала побитово на 200 моделях. Renderer принимает исходные view/projection и viewport; порядок преобразования точек проверен на 200 парах команд. Подготовка камеры со стереофазами, зеркальным знаком и clip-origin совпала побитово на 320 комбинациях; исправлено округление общей обратной матрицы. Иерархия transform камеры совпала на 320 цепочках глубиной до восьми узлов. Обычный игровой кадр и снимки кабины/погони используют перенесённые матрицы и проекцию со стартовым объективом оригинала; оба вида проверены на карте ENV. Положения и слежение камеры, а также настройки из модулей ещё в работе. Перенесены обновление углов с допуском 0.001 rad и установка transform камеры; их подключение к постоянному состоянию игрового кадра продолжается. Оригинальный руль кабины подключён к положению управления; 240 матриц его поворота совпали с оригиналом побитово. Команды передач, ламп и одометра проверены на 512 сочетаниях узлов; их видимое подключение ещё в работе. Кабина теперь выбирается из отдельного поля vehicle.tech; 120 запросов совпали с оригиналом, проверена также кабина «Газели». Резервная кабина при отсутствии основной читается из заголовка vehicle.tech; порядок обоих запросов проверен ещё на 120 сценариях. Исходный расчёт вида кабины совпал побитово на 360 состояниях; его привязка к состоянию игрового сценария ещё требуется. Начальная точка глаз и наклон вида кабины теперь читаются из vehicle.tech; внешняя модель собственного грузовика скрывается внутри кабины. Панель, стрелки и руль рисуются отдельным проходом с собственной глубиной, чтобы внешняя сцена не перекрывала приборы; проверено пиксельным GPU-тестом. Проверки ключей индикаторов и чтение их состояния совпали с оригиналом на 400 состояниях; подключение остальных ламп и цифр к отрисовке ещё в работе. Загрузчик геометрии теперь учитывает начальные варианты B3D и ссылочные переключатели refer_: выбор проверен по исходному dispatch на 400 состояниях. Наличие радар-детектора теперь берётся из оборудования машины. Расчёт его мигания и команд звука совпал на 512 состояниях; обнаружение полицейских радаров и живое предупреждение ещё не подключены. Запись сигнала полицейской машины совпала с оригиналом на 400 состояниях; проверена цепочка сигнала, ламп и сброса в памяти. Полицейский ИИ ещё требует интеграции. Полный расчёт состояния машины проверен на 600 наборах; допуск радара и изменения полей отключённого полицейского — на 400 состояниях оригинала. Правила перехода ИИ между траекторией и физикой проверены на 600 парах решений оригинала; применение самих переходов в игровом цикле ещё требуется. Обе операции перехода перенесены с явными вызовами владельцев сцены и ИИ: по 300 проверок матриц, скоростей, флагов и порядка вызовов. Подключение этих владельцев к трафику остаётся в работе. Настройки движения и столкновений MovingBox перенесены и подключены к стандартным вызовам переходов ИИ; 1200 вызовов сверены с оригиналом. Оркестрация режима машины, отключение драйвера и подготовка входа в физику проверены на 400 состояниях; сам запуск драйвера ещё требует подключения. Диспетчер запуска физического драйвера теперь вызывает перенесённые операции положения и скоростей; его порядок и аргументы проверены на 400 вызовах. Проверки скорости XYZ и диагностическая XY сверены на 600 наборах; исправлено отличие от оригинала при NaN. Setter линейной скорости тела подключён к стандартным вызовам переходов ИИ; 400 проверок подтвердили векторы, длины и перекрывающиеся буферы. Угловой setter и пересчёт момента также подключены к стандартным вызовам переходов ИИ; 400 сравнений с оригиналом прошли. Реализация режима связана с настоящим миром столкновений: совместный тест на установленной ENV запустил физику ЗИЛа, проверил скорости и 12 шагов, затем отключил драйвер. Автоматические переходы трафика ещё не включены. Диспетчер выбора перехода связан с операциями входа/выхода: 400 проверок блока оригинала и совместный тест на ENV при расстояниях 30/400 м прошли. Обработка команды расстояния до препятствия перенесена: 400 сравнений оригинала подтвердили потребление команды и публикацию результата в ИИ. Замена и глубокое копирование двухслотовых команд проверены на 400 вызовах, включая порядок освобождения памяти. Полная регрессия переходов: 33 набора прошли. Владелец команды связан с обработчиком препятствия и публикацией результата: проверены глубокая копия, однократное освобождение и 300 исходных записей в ИИ. Публикация связана с полями настоящего игрока мира траекторий: совместный тест проверяет установку и снятие ограничения, а также физический режим. Проверено влияние на реальный путь ИИ: препятствие сокращает продвижение машины в сцене по исходной формуле; дальняя траектория игнорирует это ограничение. Подготовка команды препятствия из плоскости и фазы управления совпала с оригиналом на 500 состояниях; обход объектов сцены и доставка ещё в работе. Постановка подготовленной команды в два слота и порядок освобождения памяти совпали на 300 состояниях оригинала, включая отказ создания новой записи. Подготовка и очередь соединены в единый обработчик команды 29: 300 полных вызовов оригинала подтвердили состояние и порядок операций. Обход сцены ещё нужен. Остальные ветки callback событий машины тоже перенесены: 400 проверок высоты и флага игрока прошли. Запросы и обход сцены ещё требуют интеграции. Обход событий сцены перенесён: 300 сравнений порядка, локальных координат и восстановления точки с оригиналом. Геометрия объёмов перенесена: 1200 проверок и ещё 100 сцен с исходной геометрией совпали. B3D сохраняет объёмы типов 13–17: 100 сравнений загрузки с оригиналом и чтение 45 файлов прошли; подключение событий к миру ещё впереди. Выбор стороны плоскости в столкновениях использует исходный предикат: 600 проверок около границы совпали с оригиналом. Условные объёмы B3D 10/11 сохранены: исправлено смещение детей у цилиндра, 100 сравнений загрузки и проверка второго списка прошли; их игровая интеграция продолжается. Исходные таблицы детей проверены на 400 случаях и ещё 100 сценах совместно с геометрией без подмены этих операций. Добавлен адаптер B3D к обходу событий: 100 деревьев дали исходные команды с параметрами. Переключатели событий проверены на 100 деревьях до и после изменения ключа. Локальные refer_ связаны с владельцем ключа: ещё 100 деревьев совпали. Связи пространства и группы типа 18 проверены на 100 деревьях с поворотом и переносом. Группы 4/5, включая ветки env/lamp, проверены ещё на 100 деревьях. Связи между несколькими корнями проверены в 300 вариантах. COMMON.B3D подключён к определениям событий: ILLUM_LEVEL_14 найден. Исходное правило необязательных $$-ссылок проверено без подмен resolver: адаптер успешно строит связи 39 сцен ENV с COMMON. Доставка событий машинам подключена в интеграционном тесте через общую память. На ENV выполнены 1036 пробных запросов комнат; реальный выбор позиции машины и полный игровой цикл ещё в работе. Исходный выбор точки машины и корня сцены проверен на 300 случаях. Явный запрос из SimCar прошёл 12 физических шагов на ENV с точкой из текущего кузова. Интеграционный тест события 29 проверяет доставку, очередь, дистанцию и очистку ограничения ИИ; штатное обновление машины ещё в работе. Постоянный владелец памяти команд проверен на 1000 циклах доставки и ротации без роста числа блоков. Начало штатного AI update (флаги, human early return, траектория и ночной свет) совпало с оригиналом на 500 случаях. Преобразование опорной точки машины совпало побитово на 400 случаях. Блок синхронизации сценической машины проверен на 300 случаях с обоими режимами; сервисы мира ещё подключаются. Этапы общего обновления сценической машины соединены; поведение при смене указателя водителя во время событий проверено на 400 запусках оригинала. Тот же порядок сохранён при доставке событий через владелец очереди команд. Очередь может доставлять ограничение препятствия непосредственно игроку мира ИИ; автоматическое подключение машин к событиям сцены ещё в работе. Для слота трафика связаны текущая поза кузова и владелец ИИ; связь проверена на ENV с синтетическим событием, штатный проход событий ещё подключается. Сообщения сцены сохраняют отметку отложенного удаления у игрока ИИ; сам проход удаления ещё переносится. Отметка удаления передаётся через общий владелец очереди событий. Порядок поиска отмеченных игроков совпал с оригиналом на 200 сценариях; побочные действия самого удаления ещё подключаются. Для машин-призраков добавлена временная обработка отметки в тике мира; полное удаление игроков и связей остаётся в работе. В кабине добавлено переключение оригинальной лампы радар-детектора; сигнал полицейских и звук ещё подключаются. Расстояние до полиции и передача сигнала к панели проверены отдельно; подключение к реальным машинам полиции ещё в работе. Спидометр кабины выбирает физический источник скорости по правилу оригинала; сценические и специальные режимы пока используют временное значение. Звук детектора можно прочитать из архива установленной игры; его оригинальное микширование ещё подключается. Windows-прототип подключает звук к фазам панели; это временный вывод, оригинальный микшер и автоматический сигнал полиции ещё в работе. Очистка ссылок игрока в записях транспорта проверена на 200 сценариях; управление вложенной памятью и общий процесс удаления ещё подключаются. Глубокое копирование вложенных записей проверено на 200 случаях; выделение памяти остаётся за владельцем, общий процесс удаления ещё не подключён. Для этих вложенных записей добавлен владелец памяти с повторным использованием блоков; полный процесс удаления игроков ещё в работе. Сброс участия удаляемого игрока в списке конкурентов совпал с оригиналом на 250 случаях и подключён к временной обработке призраков. Производные флаги игрока проверены на 400 состояниях, с отдельной границей поиска груза; подключение полного расчёта к миру ещё продолжается. Поиск груза тягача и прицепа проверен на 400 случаях и соединён с расчётом флагов в тесте; подключение к штатному игровому циклу ещё требуется. Признаки конкурента и компании пересчитываются в игровом мире и проверены на 400 состояниях оригинала; остальные производные флаги ещё подключаются. Совместный расчёт флагов с исходным поиском груза проверен на 400 состояниях. Полное снятие конкурента с расчётом флагов и поиском груза совпало на 250 сценариях с пустым грузом; интеграция с игровым миром ещё продолжается. Удаление конкурента в игровом мире теперь снимает первое вхождение и флаг конкурента, включая временную обработку машин-призраков. При найме и уходе сотрудника представленные флаги обоих игроков обновляются вместе; остальные флаги техники и груза ещё в работе. Подключение этого обновления к игровому циклу ещё не завершено. Сквозная проверка оригинального обновления охватывает выход игрока и физический и траекторный режимы и переключения при двух дистанциях; проверка с настоящими сервисами мира и сцены ещё впереди. Сглаживание положения на траектории совпало на 600 случаях, матрица позы — на 400; подключение к обновлению ИИ продолжается. Запись движения по направлению проверена на 400 случаях, исправлен порог общей нормализации; 8981 тест симулятора прошёл. Особый выбор полосы по индексу гонщика совпал на 600 случаях. Флаги и индекс игрока подключены к физическому трафику. Торможение по флагу владельца совпало на 400 случаях и проверено на ENV. Запрос 19 записей игрока и обратная запись перенесены: 300 сравнений без подмен подтвердили копирование. Ветка высоты использует этот запрос по умолчанию. Начальная матрица кабины проходит через исходную cabin_view и матрицу кузова напрямую; динамические поправки высоты, взгляда и колебаний ещё в работе. Расчёт рамки вида для направлений обзора совпал на 400 случаях, включая пороги разрешения и переполнение координат; подключение таблиц ещё требуется. Чтение четырёх таблиц рамки из TRUCK.INI проверено на 120 наборах с defaults и короткими списками; разделение проходов салона и мира ещё требуется. Интеграция игровых эффектов продолжается.
Как это работает
openHT2 — это замена движка, а не отдельная игра. Он читает файлы вашей установленной копии игры и ничего в них не изменяет. Код и ассеты оригинала в проект не входят: форматы описываются clean-room, по самим файлам данных.
Попробовать
git clone https://github.com/LakoMoor/openHT2 cd openHT2 cargo run --release -p ht2-tool -- res-ls "<папка игры>/ENV/aa.res"
Документация
Описание форматов файлов — что уже расшифровано и что нет.
Частицы и управление: цепочка создания и обновления частиц (выхлоп, пыль, вспышки, менеджер 0x5796e0) сверена с настоящим кодом оригинала в эмуляторе побайтно по каждому слоту пула; сверка нашла и исправила ошибку скорости пыли. Перенесены оси педалей игрока (0x5300b0, 0x53b590) с фильтром, игрок помечен как человек, автомат переключается; торможение на ходу вызывает вспышки выхлопа. Привязка клавиш к осям и часть слоя 0x54xxxx пока заглушки.