Сборка UQM 0.7.0 (HD) Windows, VisualC++

Вопросы, мысли, скандалы, интриги, расследования
Аватара пользователя
Malin
Сообщения: 2020
Регистрация: 28 май 2023

Сборка UQM 0.7.0 (HD) Windows, VisualC++

Сообщение Malin »

Сборка UQM 0.7.0 (HD)


Информация по сборке как оригинальной UQM 0.7.0, так и UQM 0.7.0 HD. Обе игры используют одинаковые библиотеки поэтому все пункты кроме п.5 у этих версий совпадают.

Система: Windows XP SP3 / Windows 7 / Windows 10
Компилятор: Visual C++ 2008 Express / Visual C++ 2010 Express

Скачать исходники:
UQM 0.7.0-1: https://sourceforge.net/...
Backup: uqm0.7.0-1.zip (Яндекс.Диск)
или UQM 0.7.0 HD: https://sourceforge.net/...
Распаковать в C:\Build\sc2\
Файл C:\Build\sc2\sc2\INSTALL.msvc содержит информацию об установке. Можно почитать блокнотом каким-нибудь. А ещё можно почитать файл INSTALL рядом.

На самом деле путь C:\Build\sc2\ не обязательно должен быть именно таким, можно изменить его тут и далее на любой другой.

Ниже, опираясь на файл INSTALL.msvc, представлено "переваренное мной" руководство:

1. Установка VisualC++ и SDK

1.1. Качаем и устанавливаем Microsoft Visual C++ 2008 Express Edition.
Microsoft Visual C++ 2010 Express
Можно сразу использовать Microsoft VisualC++ 2010 Express (см. заметку внизу поста)

Ссылка из файла не рабочая.
Побродив по интернетам нашёл вот эту: http://microsoft.com/.../VS2008ExpressWithSP1ENUX1504728.iso
На всякий случай backup'ул: MSVC++ 2008 Express (Яндекс.Диск)
Устанавливаем, со всем соглашаемся, регистрировать не обязательно.

1.2. Качаем и устанавливаем Microsoft Windows Platform SDK.
Ссылка конечно же не работает. Я качал от сюда: https://www.microsoft.com/....
Там предложат три образа. Нужен GRMSDKX_EN_DVD.iso.
Backup: GRMSDKX_EN_DVD.iso (Яндекс.Диск)
При установке можно снять галочки с SQL и Silverlight. Остальное не трогать.

Если ругается на отсутствие .NET 4.0: https://www.microsoft.com/ru-ru/Download/confirmation.aspx?id=17718
2. Зависимости.
UQM использует некоторые внешние библиотеки, их мы и будем ставить. Библиотеки будем по возможности складывать в "C:\Build\".

2.1. Нужен SDL. Это библиотека управляющая звуком, вводом и графикой на низком уровне. Ссылка ведёт на сайт, но версии 1.2.14 там уже нет, зато там МНОГО других ссылок. Прошу заметить что нас интересует что-то с VC на конце.
Я использовал SDL-devel-1.2.15-VC.zip
Backup: SDL-1.2.15.rar (Яндекс.Диск)

2.2 Нужен SDL_image. Библиотека для загрузки изображений для SDL.
Ситуация аналогичная. Я качал SDL_image-devel-1.2.12-VC.zip
Backup: SDL_image-1.2.12.rar (Яндекс.Диск)

2.3. Ogg Vorbis - сжиматель звука с потерями.
Ссылка из файла не рабочая. OggVorbis-win32sdk-1.0.1.zip
Backup: OggVorbis-win32sdk-1.0.1.rar (Яндекс.Диск)

2.4. zlib- архиватор.
Сайт по ссылке придуман инопланетянами. Однако одна полезная ссылка там есть: https://github.com/madler/zlib откуда нужно стащить zip при помощи кнопки "Code -> Download ZIP", но он не содержит dll'ки.
Нам нужны ещё и сами библиотеки: https://github.com/.../zlib-1.2.3.win32 откуда я повытягивал dll и lib.
Всё вместе легко и просто у меня: zlib.rar (Яндекс.Диск)

2.5. OpenAL - библиотека работы со звуком
Ссылка из файла не рабочая.
Скачать тут: http://openal.org/downloads/ Нам нужен тот что с пометкой SDK.
Backup: OpenAL11CoreSDK.zip (Яндекс.Диск)
Там не совсем библиотека, а установщик. Устанавливаем, со всем соглашаемся.
После сделать следующее:
- Создать папку "AL" в "C:\Program Files\OpenAL 1.1 SDK\include"
- Копировать все заголовочные файлы *.h из "C:\Program Files\OpenAL 1.1 SDK\include" в эту папку "AL"
3. Исходники UQM и библиотеки

3.1 Исходники мы уже скачали ранее, но на всякий случай выложу всю папку Build как она есть у меня: Build (Яндекс.Диск)
Если будете её качать то все последующие пункты уже выполнены. Однако будьте внимательны, чтобы прописанные мной пути в ниже перечисленных пунктах совпадали с вашими!

3.2 Копируем следующие библиотеки (*.dll - все dll файлы из папки)
- "C:\Build\SDL-1.2.15\lib\x86\SDL.dll"
- "C:\Build\SDL_image-1.2.10\lib\x86\*.dll"
- "C:\Build\oggvorbis-win32sdk-1.0.1\bin\*.dll"
в папку "C:\Build\sc2\sc2\"
4. Настраиваем проект в VisualC++

4.1. Заходим в папку C:\Build\sc2\build\msvc6\ дважды кликаем на "UrQuanMasters.dsp".
Откроется Visual C++ и запросит конвертацию файла VC6.dsp. Соглашаемся.

4.2. Устанавливаем зависимости
- В VisualC++, в панели Solution Explorer ПКМ на проекте 'UrQuanMasters', в контекстном меню выбираем "Properties"
- Откроется окно, в дереве слева выбираем "Configuration Properties -> C/C++ -> General"
- В правой части выбираем "Additional Include Directories" и кликаем на маленькую кнопочку справа "..."
Далее нужно добавить зависимости:
"C:\Build\zlib"
"C:\Build\oggvorbis-win32sdk-1.0.1\include"
"C:\Build\SDL_image-1.2.10\include"
"C:\Build\SDL-1.2.15\include"
"C:\Program Files\OpenAL 1.1 SDK\include"
"C:\Program Files\Microsoft SDKs\Windows\v7.0\Include"
помимо этих у меня уже есть эти две:
..\..\src
..\..\src\regex

4.3. Снова зависимости.
- Там же, слева, в дереве "Configuration Properties -> Linker -> General -> Additional Library Directories -> Кнопка "..."
- Добавить зависимости:
"C:\Build\zlib\lib"
"C:\Build\oggvorbis-win32sdk-1.0.1\lib"
"C:\Build\SDL_image-1.2.10\lib\x86"
"C:\Build\SDL-1.2.14\lib\x86"
"C:\Program Files\OpenAL 1.1 SDK\libs\Win32"
"C:\Program Files\Microsoft SDKs\Windows\v7.0\Lib"

4.4. Удалить ненужные зависимости
- Там же, в "Linker -> Input - > Additional Dependencies"
- Удалить odbc32.lib и odbccp32.lib.
В итоге у меня остались:
SDL.lib
SDLmain.lib
SDL_image.lib
zdll.lib
ws2_32.lib
user32.lib

Если user32.lib нет - добавить насильно.
5. Почти всё. Компилируем проект в VisualC++ (F5) и огребаем ошибок.
UQM 0.7.0-1

У меня их было много, я шаманил как мог, переименовывал папки и бился в истерике. Однако, мне кажется все они будут устранены так как они учтены в пунктах выше, опишу одну важную ошибку:

'vsnprintf' : redefinition; different linkage

Видимо произошёл конфликт новых библиотек и исходников. В итоге я внёс следующие правки в код:

..\src\libs\network\wspiapiwrap.h
Код:

Код: Выделить всё

#	define getaddrinfo WspiapiGetAddrInfo
# define getnameinfo WspiapiGetNameInfo
# define freeaddrinfo WspiapiFreeAddrInfo
void WINAPI WspiapiFreeAddrInfo (struct addrinfo *ai);
int WINAPI WspiapiGetAddrInfo(const char *nodename, const char *servname,
const struct addrinfo *hints, struct addrinfo **res);
int WINAPI WspiapiGetNameInfo (const struct sockaddr *sa, socklen_t salen,
char *host, size_t hostlen, char *serv, size_t servlen, int flags);

Заменил на:

Код: Выделить всё

#include <wspiapi.h>
..\src\libs\uio\utils.c
Удалил функцию:

Код: Выделить всё

static inline int vsnprintf(char *str, size_t size, const char *format, va_list args)
{
int result = _vsnprintf (str, size, format, args);
if (str != NULL && size != 0)
str[size - 1] = '\0';
return result;
}
..\src\port.h

Удалил объявление:

Код: Выделить всё

int vsnprintf(char *str, size_t size, const char *format, va_list args);
После этого всё скомпилировалось! Ура, товарищи! Ура!
Правда это мы скомпилировали отладочную версию, которая вместе с игрой запускает ещё и отладочное окно...
UQM 0.7.0 HD
Чуда не случилось и в этой версии. Сразу вылезла куча ошибок, повидимому связанная с тем что разработчики этой версии перешли на другой компилятор языка Си, от чего появились тысячи каких-то глупых ошибок.

../src/types.h

Убрать препроцессорное условие в этом коде:

Код: Выделить всё

#if !defined(HAVE__BOOL) && !(defined(_MSC_VER) && _MSC_VER >= 1600) // MB: update to work on MSVC 2013 and higher, which already has this defined
typedef unsigned char _Bool;
#endif /* HAVE_BOOL */

В итоге должно получиться это если просто закомментировать:

Код: Выделить всё

//#if !defined(HAVE__BOOL) && !(defined(_MSC_VER) && _MSC_VER >= 1600) // MB: update to work on MSVC 2013 and higher, which already has this defined
typedef unsigned char _Bool;
//#endif /* HAVE_BOOL */
../src/???
Далее могут возникнуть ошибки из-за того что Си не одобряет объявления перемнных не в начале тела блока { }. Таких мест было несколько, да простят меня те кто будут идти по моим стопам за то, что я не приведу их здесь конкретно. Да и если вы идёте по моим стопам то скорее всего знаете что такое объявления перемнных и тело блока. А если не знаете, то как вам удалось добраться до этого этапа???

Пример с ошибкой:

Код: Выделить всё

if (someCondition)
{ //начало тела блока
int i; //Объявление переменной
i += 1; //Исполняемый код
SIZE sizeVar; //перенести к int i; перед всем исполняемым кодом
sizeVar += 1; //Исполняемый код
...
} //конец тела блока
../src/uqm/gendef.c
Не знаю почему, но компилятор не нашёл функции генерации для колоний Зок-Фот-Пиков generateZoqFotPikColony0Functions и generateZoqFotPikColony1Functions. Придётся закоментировать их вызов и объявление:

Код: Выделить всё

//extern GenerateFunctions generateZoqFotPikColony0Functions;
//extern GenerateFunctions generateZoqFotPikColony1Functions;

...

//case ZOQ_COLONY0_DEFINED:
//return &generateZoqFotPikColony0Functions;
//case ZOQ_COLONY1_DEFINED:
//return &generateZoqFotPikColony1Functions;

UPD: сам файл genzoqcolony.c есть в папке ..\src\uqm\planets\generate. Надо добавить его через Solution Explorer в эту папку (Add Existing Item)
6. Компиляция релизной версии
Для того чтобы скомпилировать версию без отладочного окна, нужно следующее.

6.1. Перевести режим сборки с Debug_NoAccel в Release_NoAccel (ищи ниспадающее меню в верхней панели инструментов VisualStudio)

6.2. Повторить пункты 4.2, 4.3, 4.4 для релизной версии (окно свойств проекта в верху имеет также ниспадающее меню выбора режима сборки - выбрать Release_NoAccel)

6.3. В том же окне свойств перейти в Configuration Properties -> Build Events -> Post-Build Event и очистить поля Command Line и Description

Полезности и пояснения
    Скомпилированный файл uqm.exe находится в папке C:\Build\sc2\sc2\. Его можно переместить в ванильную UQM 0.7.0-1 и будет работать.
    Если нужно отладить сборку с аргументами типа --addon russian, то аргументы можно ввести в Configuration Properties -> Debugging -> Command Arguments
    Точка входа в программу main(..) находится в файле uqm.c
Переход на VisualStudio C++ 2010
1. Копировать папку ..\build\msvc6 рядом дав ей название msvc10 для порядку.
2. Запустить ..\build\msvc10\UrQuanMasters.sln в VSC++2010, подождать пока процесс миграции не завершится.
3. Project -> UqQuanMasters Properties -> Configuration Properties -> Debugging -> Command ввести путь до uqm.exe, например C:\Build\sc2\sc2\uqm.exe
    Аватара пользователя
    Malin
    Сообщения: 2020
    Регистрация: 28 май 2023

    Сборка UQM 0.7.0 (HD) Windows, VisualC++

    Сообщение Malin »

    Vasaka писал(а):Скачал с яндекс диска у тебя.
    Проблема с яндекс диском была похоже только с NET 4.0 https://yadi.sk/d/rr_xxyla9IYvCA
    Не могу скачать.

    ХЕ! По статистике он ни скачен ни разу. Может ему exe-шник не нравится, заархивирую.
    Vasaka писал(а):на либах опять затык

    Помощь нужна?
    Аватара пользователя
    Vasaka
    MOSC Team
    Сообщения: 3195
    Регистрация: 24 янв 2011

    Сборка UQM 0.7.0 (HD) Windows, VisualC++

    Сообщение Vasaka »

    Помощь нужна?
    Там же вроде архив уже готовый у тебя лежит, если я ничего не перепутал? В нём уже и архиватор и либы? Если так, то я его скачал.И теперь вроде всё у меня есть, кроме свободного времени. :D
    Когда появится, попробую всё настроить.


    Квестовые системы ты планируешь в версии 4 перетасовывать?
    Аватара пользователя
    Malin
    Сообщения: 2020
    Регистрация: 28 май 2023

    Сборка UQM 0.7.0 (HD) Windows, VisualC++

    Сообщение Malin »

    Vasaka писал(а):Там же вроде архив уже готовый у тебя лежит, если я ничего не перепутал? В нём уже и архиватор и либы? Если так, то я его скачал.

    Да, там всё разом, кроме OpenAL. Он должен быть установлен.
    Vasaka писал(а):Квестовые системы ты планируешь в версии 4 перетасовывать?

    Да
    Аватара пользователя
    Malin
    Сообщения: 2020
    Регистрация: 28 май 2023

    Сборка UQM 0.7.0 (HD) Windows, VisualC++

    Сообщение Malin »

    Давно хотел поделится изображеницем, потом забыл, сейчас снова наткнулся.

    Изображение

    Это битое сохранение, появилось тогда когда я пробовал разные версии исходников UQM 0.7.0, UQM 0.7.0-1 и UQM 0.7.0-2. Так как сохранения UQM кидает в системную папку пользователя на диске с виндой, то для любого UQM любой версии они распознаются игрой. Ну и видимо в версиях что-то отличается в сохранениях, поэтому загружается такая вот "ерунда".

    Сохранение понятное дело не загружается, но выглядит чертовски интригующе)
    Аватара пользователя
    Vasaka
    MOSC Team
    Сообщения: 3195
    Регистрация: 24 янв 2011

    Сборка UQM 0.7.0 (HD) Windows, VisualC++

    Сообщение Vasaka »

    Сохранение понятное дело не загружается, но выглядит чертовски интригующе)
    Сейчас тоже одну интересную историю расскажу.
    В ДОСовской версии игры, крякнутый запускаемый файл игры, был недостаточно хорошо крякнут и игра иногда (очень часто) зависала, когда на карте игрок наводил на какую-нибудь звезду и может при влёте в систему (сейчас уже точно не вспомню). Поэтому мы со временем приспособились с братом летать без автопилота. Или рядом с нужным местом ставили точку назначения, или просто на ручном управлении летали (кстати, это было намного веселее).
    Так вот, со всеменем, в созранении накапливались какие-то глюки и может быть из за этого, а может по какой-то другой причине, незадолго до вояжа Кохр-Ахов, Майконы полетели и уничтожили Зок-Фот-Пиков. Я до сих пор не знаю, был ли это глюк, или это как принято в Старконе, альтернативный способ отвлечения Майконов (а именно постоянное спасение Зок-Фотов). Может Шурик у тебя получится со временем выяснить, когда с кодом игры освоишься. А так же, если тебя не затруднит, можешь посмотреть сколько кораблей на домашних мирах? 255? 16к?

    Но это не самая интересная история с люком сохранений, которую я хотел рассказать.
    Когда я первый раз прошол старкон, злоключений было столько, что накопилось видимо много и я после победы наз Са-Матрой, смог летать дальше!!!
    И я дурак, вместо того, чтобы сохраниться и потом посмотреть смогу ли я с кем-то общаться, слетать на домашние миры и т.д. взял и заново уничтожил Са-Матру. Решил посмотреть воспроизводится ли глюк. Ну и он, как водится, не воспроизвёлся.
    Не знаю сколько раз у меня в тот день умерла Са-Матра в попытке воспроизвести глюк и добиться возможности летать после прохождения, но добиться этого эффекта так и не удалось. :D
    И кстати, это довольно интересная идея для нашей модификации. :D
    Аватара пользователя
    Malin
    Сообщения: 2020
    Регистрация: 28 май 2023

    Сборка UQM 0.7.0 (HD) Windows, VisualC++

    Сообщение Malin »

    Vasaka писал(а):А так же, если тебя не затруднит, можешь посмотреть сколько кораблей на домашних мирах? 255? 16к?

    Тут довольно хитро всё закручено.
    Когда мы натыкаемся на флот вызывается функция которая задаёт тип кораблей и количество экипажа - crew_level типа uint16. Когда мы натыкаемся на домашний мир crew_level приравнивается к константе INFINITE_FLEET равная 65535 (максимум uint16). Однако, при задании в качестве crew_level нуля функция берёт количество экипажа из "шаблона" соответствующего этому типу корабля. Так, например, для Sun Device функция создания флота вызывается пять раз с нулевым экипажем, и мы получаем пять кораблей защищающих Sun Device.
    В итоге, фактически, в домашнем мире должно быть 65535 делённое на количество экипажа одного корабля данного типа кораблей.
    Однако в коде существуют какие-то проверки на инфинитность флота, но там всё ещё хитрее и я не понял уменьшается ли crew_level после победы над кораблём или нет.
    Аватара пользователя
    Vasaka
    MOSC Team
    Сообщения: 3195
    Регистрация: 24 янв 2011

    Сборка UQM 0.7.0 (HD) Windows, VisualC++

    Сообщение Vasaka »

    Это значит мой киборг в автоматическом режиме перебил 3276,75 кораблей? :eek:
    Аватара пользователя
    Malin
    Сообщения: 2020
    Регистрация: 28 май 2023

    Сборка UQM 0.7.0 (HD) Windows, VisualC++

    Сообщение Malin »

    Изображение

    Вы понимаете что это значит, да? Понимаете? ;) :D

    Внезапный вопрос: кто-нибудь знает что находится\должно находиться в системах по координатам 387.5:514.5 и 358.3:547.9? Разрушенные колонии Зок-Фот-Пиков? Как было в оригинале? Наверное надо начать ритуал призыва Васи, он что-то говорил как-то про их колонии.
    Аватара пользователя
    SLY
    Сообщения: 3406
    Регистрация: 23 сен 2013

    Сборка UQM 0.7.0 (HD) Windows, VisualC++

    Сообщение SLY »

    Malin писал(а): 01 апр 2021, 00:21Вы понимаете что это значит, да? Понимаете? ;) :D

    Понимаем! Это значит, что моё письмо деду морозу наконец дошло! :D
    Malin писал(а): 01 апр 2021, 00:21Внезапный вопрос: кто-нибудь знает что находится\должно находиться в системах по координатам 387.5:514.5 и 358.3:547.9? Разрушенные колонии Зок-Фот-Пиков? Как было в оригинале?

    В HD - руины Зок-Фот-Пиков
    В 0.7 - ничего интересного
    Только что слетал перепроверил
    За СК2, если под оригиналом ты имел ввиду его, ничего не скажу.

    Изображение
    Malin писал(а): 01 апр 2021, 00:21Наверное надо начать ритуал призыва Васи, он что-то говорил как-то про их колонии.

    На HD, мне кажется, будет сложно его выудить из тени, но скрестим пальцы! :)
    Аватара пользователя
    Malin
    Сообщения: 2020
    Регистрация: 28 май 2023

    Сборка UQM 0.7.0 (HD) Windows, VisualC++

    Сообщение Malin »

    SLY писал(а):В HD - руины Зок-Фот-Пиков
    В 0.7 - ничего интересного

    Почему-то компилятор ругается на то что нет функции генерирующих эти руины в этих системах, хотя сами системы помечены и функции объявлены. Пришлось их закомментировать, чтобы всё скомпилировалось. Непонятно куда делись эти функции :conf: Качал самый последний исходный код.
    Ответить