Дальнобойщики 2 · Новый движок

openHT2

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

В разработке. Для запуска нужны файлы установленной игры.

ЗИЛ у аэропорта в текущей версии openHT2
ENV / аэропорт · текущий порт
Rust + wgpuНовый движок, знакомый мир
39 районовОткрытый мир прототипа
1:1Цель совместимости с оригиналом

Разработка движка

Отмечены перенесённые части; полная игра и интеграция всех систем ещё в работе.

Подробный статус переноса
  • готовоЧтение .RES (141 из 141 файлов), .way (41 из 41), .b3d (45 из 45) и текстур .txr
  • готовоКонсольный инспектор ht2-tool и просмотрщик моделей на wgpu ht2-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 с места водителя. Точка глаз и интерфейс пока временные.
Дороги вокруг аэропорта
НОВОЕДороги вокруг аэропорта
Свежий обзор района старта. Отладочная камера сверху.
Первые метры пути
НОВОЕПервые метры пути
ЗИЛ после восьми секунд движения на перенесённой физике.
Легковая и тягач Scania из мира ИИ на дороге ENV
Машины мира ИИ со своими моделями из каталога evehicles.sch: у каждой своя запись vehicle.tech для перенесённой физики
Машина мира ИИ на дороге ENV
Машина из мира ИИ оригинала: «призрак», появившийся на кольце 320 м вокруг игрока и едущий своим маршрутом
Камера за машиной потока ИИ на серпантине
Камера за одной из машин потока: маршрут к случайному узлу назначения — перенесённые генератор, выбор назначения и поиск пути модуля дорог
Вид сверху на район старта
Район старта сверху: аэропорт и дороги к городам; узлы городов размечаются по mod_*.sch, как в оригинале
Машина ИИ едет по своей полосе
Машина ИИ ведёт себя по перенесённому коду водителя SecondCar
ЗИЛ едет по дороге у аэропорта
ЗИЛ на перенесённой физике оригинала (_Car_V), за рулём — перенесённый водитель ИИ; полосы треугольников (бит 0x80 формата) рисуются как в оригинале
Старт в аэропорту: ЗИЛ с тентом
Старт из GAME.CNF: аэропорт, ЗИЛ
Грузовик едет по трассе
Езда по трассе, физика по числам vehicle.tech
Вид сверху на открытый мир
Открытый мир из 39 районов, вид сверху
Модель КамАЗ
КамАЗ, собранный из ссылок на детали
Промышленный комбинат
Комбинат из 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 пока заглушки.

Приборы: подключена ветка ограничения скорости по технике и передаче сцены. 150 случаев проверены на исходной обёртке в эмуляторе. Полная интеграция сцены продолжается.

Восстановление приборов: перенесён блок публикации скорости, передачи, рулевого ввода и семи полей флагов из снимка сцены; полный restore ещё в работе.

Снимки машины: начат декодер заголовка, проверены все 256 упакованных байтов. Добавлены записи колёс и четыре флага: 360 сравнений с оригиналом. Поза также проверена в 360 составных случаях. Базовый и расширенный декодер проверены на 400 полных вызовах оригинала. Декодер соединён с публикацией полей сцены: 400 сравнений. Обновления геометрии и подключение к приложению ещё в работе.

Сцена: проверены исходные условия и период обновления геометрии (400 случаев); добавлен исходный расчёт базиса геометрии (300 сравнений). Остальное обновление ещё переносится.

Сцена: перенесён выбор комнаты по результату запроса отрезка, 300 сравнений с оригиналом. Запрос соединён с подготовкой матрицы геометрии и проверен в 300 составных вызовах оригинала; оставшиеся эффекты и игровой вызов ещё в работе.

Эффекты машины: перенесены координаты и направление первого эффекта, 300 сравнений с оригиналом. Добавлены исходные условия включения и выбор техники: 400 сравнений. Обе точки эффекта объединены и проверены в 400 случаях с порядком вызовов. Генератор эффекта ещё не подключён.

Эффекты: перенесена обёртка выделения и создания частицы, 300 проверок аргументов. Пул, симуляция и отрисовка ещё в работе.

Частицы: перенесено производное состояние конструктора, 300 сравнений памяти и аргументов. Добавлен общий конструктор размера: 300 сравнений. Начальные поля корневого объекта проверены в 300 случаях; выделение геометрии частицы ещё в работе.

Частицы: добавлена исходная геометрия четырёх вершин и UV, 300 сравнений. Регистрация и отрисовка ещё не подключены.

Частицы: перенесён вызов регистрации и начальные счётчики, 300 сравнений. Реальный менеджер и симуляция ещё в работе.

Частицы: подключение дескриптора геометрии проверено в 300 случаях; расчёт сферы геометрии проверен в 400 случаях. Объединение сфер подключено: 300 полных сравнений прикрепления геометрии. Игровой вызов ещё в работе.

Частицы: собран корневой конструктор с реальными границами, 200 полных сравнений. Менеджер и игровой вызов ещё в работе.

Частицы: соединены три конструктора, 200 проверок всей цепочки. Симуляция и игровое подключение ещё в работе.

Частицы: перенесена фаза замедления, 400 сравнений с оригиналом. Движение и позиция проверены в 400 полных вызовах. Общий update времени жизни ещё в работе.

Частицы: изменение размеров по времени проверено в 400 случаях. Завершение жизни и игровое подключение ещё в работе.

Частицы: кадры, цвет и время жизни проверены в 400 случаях. Реальное удаление и игровой менеджер ещё в работе.

Частицы: движение, размеры и время жизни объединены, 300 полных сравнений. Менеджер ресурсов и игровой вызов ещё в работе.

Частицы: полный update с исходной отметкой удаления проверен в 300 случаях. Очистка менеджером ещё в работе.

Эффекты: возврат объекта в пул проверен в 300 случаях. Деструкторы ресурсов и менеджер очистки ещё в работе.

Эффекты: выдача свободного объекта из пула проверена в 300 случаях. Менеджер и игровая интеграция ещё в работе.

Эффекты: выдача из пула соединена с базовой инициализацией, 300 сравнений всей цепочки. Игровой менеджер ещё в работе.

Эффекты: обход очистки помеченных объектов проверен в 300 случаях. Деструкторы ресурсов ещё в работе.

Частицы: порядок деструктора проверен в 300 случаях. Освобождение геометрии ещё требует подключения.

Частицы: освобождение массивов геометрии и обратный обход дескрипторов проверены в 200 случаях. Базовое снятие узла ещё в работе.

Эффекты: полное освобождение геометрии и имени узла проверено в 200 случаях; внешний allocator ещё требуется.

Эффекты: снятие узла из слотов родителя проверено в 300 случаях. Связанный список подключён и проверен без подмены; игровая интеграция ещё в работе.

Частицы: цепочка деструктора соединена, 200 полных сравнений. Менеджер очистки ещё требует подключения.

Частицы: деструктор соединён с возвратом в пул, 200 полных сравнений. Подключение менеджера очистки продолжается.

Частицы: очистка менеджера соединена с деструктором и пулом, 200 полных сравнений. Игровой вызов ещё в работе.

Эффекты: проход обновления менеджера соединён с очисткой, 200 проверок порядка с добавлением объектов. Игровое подключение ещё в работе.

Частицы: менеджер обновления и удаления объединён, 100 многокадровых сравнений с оригиналом. Игровой вызов ещё не подключён.

Частицы: базовая инициализация текстурного узла и имени проверена в 200 случаях. Игровой владелец ещё в работе.

Частицы: соединена базовая инициализация объекта и текстурного узла, 200 составных сравнений. Регистрация менеджера ещё в работе.

Частицы: установлен исходный класс менеджера, регистрация узла проверена в 200 случаях. Игровой владелец ещё в работе.

Частицы: регистрация доступна владельцу конструктора; 200 последовательностей добавления/снятия совпали с оригиналом. Игровая память ещё в работе.

Частицы: исходный конструктор дескриптора проверен в 200 случаях и доступен адаптеру владельца. Игровая память ещё в работе.

Частицы: владелец конструктора использует исходные идентичности и регистрацию; 200 полных сравнений с внешним allocator. Игровой вызов ещё в работе.

Частицы: исходный приёмник эффекта соединён с пулом и полной цепочкой создания, 200 сравнений. Игровой кадр и отрисовка ещё в работе.

Частицы: 40 сквозных сценариев создания, движения и удаления совпали с оригиналом. Игровое подключение и отрисовка ещё в работе.

Частицы: добавлен allocator приложения; три полных цикла проверяют освобождение и повторное использование ресурсов. SimCar и отрисовка ещё не подключены.

Частицы: добавлен runtime приложения с пулом, часами и очисткой; проверены исчерпание, истечение и reuse. SimCar и рендер ещё не подключены.

Частицы: менеджер шести классов (пыль, дым, пар, сажа, вспышка, сцена) собран в игре и подключён к грузовику: создание, обновление и удаление проверены без утечек, полный набор тестов проходит. Спрайты берутся из COMMON.RES и рисуются в сцене. Ветки колёс, выхлопа и вспышек 0x551970 перенесены и проверены; поля машины 0x54xxxx, запись 0x697xxx, ёмкость пулов и оси сцены пока заглушки. Сравнения кадров с оригиналом ещё нет.

Дым: перенесён исходный поиск материалов msmoke, 24 сравнения имён и флагов. Загрузка ресурсов в runtime и рендер ещё в работе.

Дым: поиск материалов соединён с runtime и сменой кадра анимации. Архивный lookup и рендер ещё в работе.