четверг, 22 сентября 2016 г.

Teeworlds. Собираем под Windows из исходников.

Дело было вечером, делать было нечего ... ;) Началась эта история с того, что один из участников нашего сообщества @kolobus рассказал мне об игре Teeworlds. Для тех кто не в курсе - это такая "ретро" мультиплеерная стрелялка. По первым скриншотам она мне почему-то напомнила червяков, но, как оказалось, геймплей намного динамичнее и фактически это просто неплохой action. Нормальный человек бы посвятил первое знакомство с игрой непосредственно процессу, но меня почему-то зацепило другое. В разделе Downloads на официальном сайте игры я увидел версии для Win32 и Linux 64-bit'а (речь идет о последней на данной момент версии 0.6.3), однако, релиза 0.6.3 для Win64 почему-то не было. Хотя на сайте говорится что как раз в версии сервера 0.6.3 пофикшена уязвимость сервера. Вообщем не долго думая я решил разобраться, а как собрать всё это из исходников, чтобы заполучить бинарники клиента и сервера под Windows 64. В принципе получилось довольно быстро.

Первое что необходимо сделать - это прочитать мануал по сборке, благо разработчики все достаточно подробно описали - Compiling Teeworlds. Ставим Python 2.7, git (в любом случае он будет полезен) и MSVC 2013. Как говорится в мануале плюсом ко всему нам потребуется bam - https://github.com/matricks/bam , однако на Git'е последняя версия -  0.5, а сборочный скрипт bam.lua от игры требует версию 0.4. Ок ... качаем исходники bam-0.4.0 и слегка правим скрипты make_win32_msvc.bat и make_win64_msvc.bat добавляя туда поддержку современных компиляторов. Например для x64:

@echo off

@REM Check for Visual Studio
call set "VSPATH="
if defined VS140COMNTOOLS ( if not defined VSPATH (
 call set "VSPATH=%%VS140COMNTOOLS%%"
) )
if defined VS120COMNTOOLS ( if not defined VSPATH (
 call set "VSPATH=%%VS120COMNTOOLS%%"
) )
if defined VS110COMNTOOLS ( if not defined VSPATH (
 call set "VSPATH=%%VS110COMNTOOLS%%"
) )
if defined VS100COMNTOOLS ( if not defined VSPATH (
 call set "VSPATH=%%VS100COMNTOOLS%%"
) )
if defined VS90COMNTOOLS ( if not defined VSPATH (
 call set "VSPATH=%%VS90COMNTOOLS%%"
) )
if defined VS80COMNTOOLS ( if not defined VSPATH (
 call set "VSPATH=%%VS80COMNTOOLS%%"
) )

@REM check if we already have the tools in the environment
if exist "%VCINSTALLDIR%" (
 goto compile
)

if not defined VSPATH (
 echo You need Microsoft Visual Studio 8, 9, 10, 11, 12, 13 or 15 installed
 pause
 exit
)

@REM set up the environment
if exist "%VSPATH%..\..\vc\vcvarsall.bat" (
 call "%%VSPATH%%..\..\vc\vcvarsall.bat" amd64
 goto compile
)

echo Unable to set up the environment
pause
exit

:compile

Для x86 в принципе все то же самое, только вместо vcvarsall.bat нужно использовать vsvars32.bat. Скрипты для сборки bam'а можно посмотреть в Git'е для 0.5.0. В итоге у нас собирается bam.exe ... отлично ... Далее качаем исходники самой Teeworlds - teeworlds-0.6.3-src.zip и распаковываем в отдельную папку. Создаем build.cmd следующего вида (шапка для поддержки компиляторов выше), а затем следующие строки:
cd teeworlds-0.6.3-src
..\bam-0.4.0\bam -c all
..\bam-0.4.0\bam client_release
..\bam-0.4.0\bam server_release
После чего запускаем компиляцию и получаем несколько ошибок в результате, которые касаются функции round. Исправить их довольно просто:

  • Открываем в исходниках Teeworlds заголовочный файл src/base/math.h и ищем там определение функции round - inline int round(float f), заменяем round на roundmy, так чтобы получилось так - inline int roundmy(float f).
  • Затем открываем \src\game\editor\layer_tiles.cpp и ищем в нем метод void CLayerTiles::BrushRotate(float Amount), в нем мы видим вызов  int Rotation = (round(360.0f*Amount/(pi*2))/90)%4; - заменяем его на вызов roundmy, т.е. в итоге у нас получается строка: int Rotation = (roundmy(360.0f*Amount/(pi*2))/90)%4;

Всё, на этом предварительная подготовка исходников закончена. Собираем и получаем бинарники (если вы проводите сборку под Win64, то bam по всей видимости нужно собирать 64-битным, если под Win32, то 32-х).

Ну а кого просто интересует конечный результат, т.е. готовые бинарники клиента и сервера Teeworlds 0.6.3 для Windows 64-bit, то вот они - teeworlds-0.6.3-win64.7z .

Обновлено 22.09.2016 02:51 (MSK)

Да, ну и обнаружив официальный репозиторий teeworlds на GitHub'е - https://github.com/teeworlds/teeworlds я не мог пройти мимо чтобы не попробовать собрать последнюю 0.7 trunk :


Все получилось, единственное, что при сборке использовался уже свежий bam 0.5.0 и более свежая версия SDL 2.0.4 (stable). Результат, а именно бинарники Teeworlds 0.7 trunk можно забрать тут:


В сборку включены стандартные карты, файлы языковых переводов и т.п., а также клиент и сервер. Единственное о чем следует помнить - публичных серверов на версии 0.7 пока не так много и играть вы сможете только на тех серверах у кого он собран c той же GAME_NETVERSION_HASH, у этой сборки он равен "8743be4f24dc7e35".

Комментариев нет :

Отправить комментарий