Нативная Arma: Cold War Assault под FreeBSD
Как только узнал о том, что Cold War Assault выпустили (ни много ни мало!) под GPL-3.0-or-later (с некоторыми дополнительными условиями про торговые марки, правда), немедленно побежал разбираться, что там к чему.
Как и водится в таких случаях, на гитхабе никаких ассетов нет, но их можно абсолютно бесплатно скачать из Steam под лицензией Arma Public License Share Alike (APL-SA), которых там около 250 Мб. Вместе с ними идут бинари PoseidonGameDemo.exe (под винду) и PoseidonGameDemo (соответственно, под линукс, glibc 2.38+, пришлось обновлять чрут с Ubuntu 22.04 до 24.04), из которых можно запустить демо‐миссию и ничего больше, как я понял. К моему удивлению, первое через Wine вместо изображения показывает мне чёрный экран и, иногда, невероятных размеров шакальный курсор, а второе через Linuxulator зависает примерно через минуту; при этом проприетарная CWA из стима прекрасно работала как через Wine, так и через Linuxulator.
На гитхабе инструкции только для винды и линукса, ничего больше разработчики, собственно, и не предусматривали, но меня это совсем не испугало. Зависимости предлагают подтягивать через vcpkg, вместо чего я героическим образом всё ставил собственными руками. При этом нужно обратить внимание на версии некоторых библиотек, которые указаны в vcpkg.json; в частности, не хотело собираться со свежими CLI11 и mimalloc, нужны именно версии 2.4.0 и 2.2.4 соответственно (или, может быть, слегка новее, не проверял). Также споткнулся на том, что opus, libogg, libvorbis, enkiTS и, возможно, некоторые другие библиотеки, которые у меня подтянулись из системы, нужно собирать с -fPIC (ну то есть с -DCMAKE_POSITION_INDEPENDENT_CODE=ON) и что mimalloc из vcpkg по умолчанию устанавливается с -DMI_OVERRIDE=OFF, но цмейком по умолчанию собирается с -DMI_OVERRIDE=ON (с -DMI_OVERRIDE=ON при сборке армы возникают дубликаты при линковке, так что это нужно выключать).
Линукс‐специфичного кода во всём огромном репозитории почти не оказалось. Из обнаруженного:
- Хидер
linux/sysinfo.h, подключение которого оказалось достаточно тупо закомментировать. PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP, который заменяется наPTHREAD_MUTEX_INITIALIZERи вызовpthread_mutexattr_settypeв конструкторе.- Неоднократные жалобы линкера на
undefined reference to 'backtrace', что решается дописыванием-lexecinfoвезде, где это необходимо. - В imgui из репозиториев FreeBSD обнаружилось отсутствие imgui_freetype.h, который я просто прилинковал ручками.
- В
engine/Poseidon/World/Viewer.cppругалось на неизвестные переменныеmajorиminor, которые определены парой строк выше. Решилось переименованиемmajorвmajorColor, аminor— вminorColor; но вообще не знаю, связано ли это с FreeBSD.
После пары часов ковыряний получил работающий без всяких нареканий самый настоящий нативный бинарь PoseidonGameDemo с самой настоящей армой. В дополнение к нему после сборки вы получите:
PoseidonGame, из которого можно открыть всеми любимый редактор.PoseidonServer, с помощью которого можно запустить, собственно, игровой сервер, из консольки.PoseidonStudio, в которой можно разглядывать ассеты.PoseidonEvaluator, которым можно запускать SQS- и SQF-скрипты.- И даже тетрис
PoseidonTetris, и ещё всякого по мелочи.
Помимо всего прочего, в CONTRIBUTING.md указан комьюнити‐форк, в котором открыты пул‐реквесты.
Ну и да, на скриншотах WindowMaker и полтора докаппа.


