Skip to content

Ветка: jrpm | Версия: jrpm-0.1.0 (tagged, 2026-08-14) Результат сборки: openttd-jrpm (имя исполняемого файла)

Связь версий ​

                        jgrpp-0.73.1 (общий предок)
                        /                 \
        jgrpp ветка (63 коммита)          pulsexlb px-patch (152 коммита)
        ├ tracerestrict и др. обновления    ├ jgrpp-decouple (смена локомотивов)
        ├ мои 5 функций (d4c45740)          └ jgrpp-multitile-airport (модульные аэропорты)
        └ переименование jrpm-0.1.0 (425e7207)
                        \                 /
                        jrpm ветка (merge 71fe214c + совместимость cb9848b)

Содержание слияния ​

1. pulsexlb/OpenTTD-patches (px-patch полные 152 коммита) → объединены ​

ФункцияОписаниеОсновные файлы
Смена локомотивов (decouple)Расцепление/сцепление поездов: приказы на расцепку, передача маршрутных листов, ограничения длины сцепки/скорости, двойная тяга, сцепка NewGRF, навигация сцепки (YAPF/NPF), независимое управление двумя поездами после расцепкиtrain_cmd.cpp, order_cmd.cpp, order_gui.cpp, train.h, yapf/npf
Модульные аэропорты (multitile-airport)Переработка многосекционных аэропортов: система типов air (air.h/air_type.h/newgrf_airtype.), PBS воздушная диспетчеризация (pbs_air.), YAPF авиационная навигация, station.allow_modify_airports (изменение планировки аэропортов), gui.default_air_type, спрайты многосекционных аэропортовair., pbs_air., aircraft_cmd.cpp (рефакторинг 3600 строк), airport_cmd/gui, station_cmd

Обработка конфликтов: всего 2 конфликта заголовочных файлов (aircraft.h / airport.h) — pulsexlb авиационный рефакторинг удалил неиспользуемые мёртвые типы из рабочей области (VehicleAirFlags bitset, AirportMovingDataFlag), взята сторона pulsexlb, подтверждено отсутствие ссылок из других файлов.

2. Openttd-Cluster (проект Rust-кластера пользователя) → выборочные заимствования ​

ПатчОбработкаОписание
0006 vanilla-native-server (совместимость с несколькими версиями)✅ Объединён (cb9848b7)Сервер jrpm одновременно принимает клиенты jrpm / оригинальный jgrpp (jgrpp-) / pulsexlb (pxp); версия NewGRF по-прежнему строго проверяется
0001 revision-handshake / 0005 version-metadata✅ Идеи принятыjrpm использует независимую tagged строку ревизии jrpm-0.1.0, рукопожатие изолировано от jgrpp/pxp, реализована «новая версия для удобной игры по сети»
0007 parallel-download (HTTP пул потоков + Range-блочная загрузка, 30KB)📝 Справочно, не объединеноТа же тема, что и F1 «файловый параллелизм + несколько зеркал», затрагивает те же файлы; транспортный пул потоков/блочная загрузка 0007 записаны как направление будущего улучшения F1
0002-0004 snapshot/command/FFI мост📝 Архитектурная справкаЗависит от всей среды выполнения Rust otc-engine (FFI статическая линковка), относится к «дальней общей интеграции», а не к слиянию на уровне патчей; jrpm пока остаётся чистым C++ единым бинарником

3. Собственные функции jrpm (предыдущие 5 функций, d4c45740) → уже в ветке jrpm ​

Параллельная загрузка (несколько зеркал + 4 параллельных сессии), автоматическая группировка, подсказка строительства, глобальный AI (ScriptGlobal + GlobalAI), настройки зеркал/сервера контента.

Стратегия сетевой игры («новая версия для удобной игры по сети») ​

  • jrpm — tagged-версия: IsNetworkCompatibleVersion требует полного совпадения строки ревизии → клиент jrpm подключается только к серверу jrpm, полностью изолирован от jgrpp 0.73.x / pxp;
  • Серверное послабление: сервер jrpm дополнительно принимает клиенты jgrpp-* и pxp* (IsJgrppNativeNetworkRevision / IsPxpNetworkRevision, версия NewGRF должна совпадать);
  • Таким образом: хост jrpm открывает сервер = только для игроков jrpm (по умолчанию); при необходимости совместимости со старыми клиентами без изменения конфигурации принимает игроков jgrpp/pxp.

Сборка и проверка (выполняется на машине пользователя) ​

bash
# Первый раз (требуется CMake + зависимости, см. COMPILING.md)
cmake -B build ..
cmake --build build -j
# Результат: build/openttd-jrpm.exe

Приоритет проверки:

  1. openttd-jrpm -v показывает jrpm-0.1.0;
  2. Одиночная игра 1-2 года (слияние затрагивает крупные изменения train/airport + версия сохранения может быть увеличена из-за allow_modify_airports и т.д.);
  3. После открытия сервера: подключение клиента jrpm ✓; попытка подключения оригинального клиента jgrpp 0.73.x (ожидается успех, если NewGRF совпадают);
  4. Смена локомотивов: добавление приказов на расцепку/сцепку поезда, проверка независимого управления после расцепки; модульные аэропорты: включение station.allow_modify_airports и изменение планировки аэропорта;
  5. Регрессия предыдущих 5 функций (параллельная загрузка, автоматическая группировка, подсказка строительства, GlobalAI).

Известные риски ​

  • Не проверено на реальном железе: код после слияния+модификации не компилировался на данной машине (нет цепочки инструментов), при первой компиляции могут быть пропущенные изменения интерфейсов (особенно серия крупных изменений aircraft/airport/train);
  • Версия сохранения: px-patch мог увеличить SLV (M9 упоминает savegame version gate), сохранения jrpm и jgrpp 0.73.x могут не читать друг друга (следуя конвенции jgrpp, обратная совместимость с trunk сохранениями);
  • Слияние привносит всю историю pulsexlb, для отслеживания принадлежности функций используйте git log --oneline pulsexlb/px-patch.

Журнал слияний: 2026-09-28 (jgrpp-0.73.3 + px-patch 2609.x) ​

Коммиты слияния: jgrpp 94 коммита (до jgrpp-0.73.3) + px-patch 113 коммитов (до после pxp-2609.10).

Новое: от pulsexlb — перевозка автомобилей (RoRo, см. Функции), 128 типов груза (CargoTypes на Uint128, через XSLFI_CARGO_TYPES_128), партия исправлений расцепления/сцепления и улучшения расписаний; от jgrpp — перетаскивание заказов/двойной клик, двухконцевые суда (XSLFI_DOUBLE_ENDED_SHIPS) и множество общих исправлений.

Ключевая обработка конфликтов: слой сохранения pulsexlb основан на старой системе макросов SLE_, тогда как jrpm/jgrpp 0.73.3 использует VarFileType/VarMemType + VarTypes; все конфликты saveload/ и sl/ переписаны в современной системе с добавлением поддержки U128 (VarFileType::U128=13, VarMemType::U128, SLE_UINT128); зарезервированные jrpm версии 367/368 сохранены, новые upstream-версии сдвинуты в 369/370; совместимость с upstream-сохранениями идёт через подблок XSLFI_UPSTREAM_VERSION; CT_VEHICLES строкой, сравнение grfid через GrfID, консольные блоки autogroup + RORO_DEBUG_COMMANDS сохранены.

Состояние: сборка MinGW ninja пройдена, артефакт build/openttd-jrpm.exe; быстрый тест новой игры пройден.


Журнал слияний: 2026-10-07 (jgrpp 0.73.3+89 + px-patch 2610.3) ​

Коммиты слияния: jgrpp 23 коммита (после jgrpp-0.73.3, до 6318727b02) + px-patch 55 коммитов (до pxp-2610.3, 4a4d0724b5).

Новое: от pulsexlb — паром для поездов (суда перестраиваются на перевозку целых поездов, выделенный груз RAIL/CT_RAILVEHICLES, погрузка по вагонам), система дождя (weather.cpp со случайными дождливыми периодами, затемнением мира, каплями с масштабированием по зуму; опция difficulty.rain; песочница-чит с принудительной погодой; состояние погоды сохраняется в блоке WTHR/XSLFI_WEATHER), выход после расцепления в ту же сторону с ожиданием второй части, показ грузоподъёмности каждого трюма и каждого вагона, выбор знаков поезда/авто в опциях RoRo, устранение подвисаний поиска пути при сцеплении (проверка груза через пре-чек с откатом) и сборка Android с публикацией APK; от jgrpp — строгий тип StringID, запрет дублирующихся названий компаний, вычисление предпочтительного размера виджетов и множество рефакторингов с исправлениями.

Ключевая обработка конфликтов: главное препятствие сборки — строгая типизация Label/StringID: все 4-символьные литеральные метки в собственном коде jrpm переведены в строковые конструкции (CT_RAILVEHICLES{"RAIL"}), сравнения меток дорожных типов в afterload.cpp стали RoadTypeLabel{"ROAD"}, пустые строковые поля AirTypeInfo в airport.cpp используют STR_NULL, а ветви switch для STR_CHEAT_RAIN в cheat_gui.cpp используют .base(); устаревший тип блока CH_TABLE в новом блоке погоды WTHR заменён на ChunkType::Table; в таблице читов сохранены VarMemType и страж InflationCheat jrpm и добавлена новая строка дождя; SetStringTip(SPR_GOTO_LOCATION, …) в jrpm_watch_gui.cpp заменён на SetSpriteTip; в train_cmd.cpp сохранён гейт enable_decouple и принят апстримный фикс переворота только перед головой состава (if (v->IsMovingFront())) вместе с флагами выхода в ту же сторону; в order_cmd.cpp принята новая семантика DrivingBackwards по TCF_NO_DRIVING_CAB при сохранении переменной DecouplePart; сохранена сборка VitePress и деплой GitHub Pages в deploy-docs.yml, а также брендинг jrpm в README/.gitignore/.ottdrev-vc; SL_UPSTREAM_VERSION по-прежнему закреплён на 368 (апстримный DoubleEndedShips), static_assert в src/saveload/engine_sl.cpp проходит, зарезервированные jrpm 367/368 без изменений.

Состояние: сборка MinGW ninja (-j3) пройдена, артефакт build/openttd-jrpm.exe; дымовой тест выделенного сервера -D пройден — генерация карты → сохранение → загрузка → повторное сохранение → выход без assert и без падения SetupEngines, версионные гейты апстримных блоков работают корректно.

Последнее обновление: