doom2d.org

Главная база плоских морпехов
It is currently 28 Sep 2022, 12:10

All times are UTC + 3 hours




Post new topic Reply to topic  [ 26 posts ]  Go to page 1, 2  Next
Author Message
PostPosted: 14 Aug 2014, 16:56 
Offline
Приколист

Joined: 18 Oct 2009, 12:00
Posts: 1249
Location: Подмосковье
Сегодня, разбираясь в сорцах DF, я понял: Delphi (особенно 7) - говно. Почему говно? Потому что не поддерживается. Ну по другим причинам, конечно, тоже, но все равно - если мы заходим впилить что-нибудь хорошее в DF (сеть через ENet, новый ZLib, т.д.), то биндинги для всего этого нам придется писать самим. А это очень плохо.

Переписывать DF на сях/чем-нибудь другом - это довольно долго и вообще впадлу. Поэтому я решил попытаться скомпилить DF с помощью FPC, благо на нем есть $MODE DELPHI, для него есть груды полезных библиотек различных сорцов, и его до сих пор ковыряют.
Результат сначала меня огорчил, а потом приятно удивил, а потом опять огорчил.

Сей пост содержит подробный гайд по сборке DF на FPC. Потому что я впал в ступор и мне пока что лень продолжать, так что если кто-то знает, где вылетает сегфолт, помогите мне с этой хуйней, если не трудно.

Собирать будем из сорцов версии 0.62.2, которые на гитхабе. pss, я смотрю на тебя укоряющим взглядом.

Итак, сначала команда для сборки:
Code:
fpc -MDELPHI -g Doom2DF.dpr

Ошибки и говно, с которым я столкнулся во время сборки:

Попытка №1:
Code:
Free Pascal Compiler version 2.6.4 [2014/03/06] for i386
Copyright (c) 1993-2014 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling Doom2DF.dpr
Compiling ..\Lib\DX\DirectInput.pas
Compiling ..\Lib\DX\DXTypes.pas
DirectInput.pas(104,3) Warning: Illegal compiler directive "$NOINCLUDE"
Compiling ..\Lib\OpenGL\GL.pas
...
Compiling ..\Engine Source\e_log.pas
e_log.pas(38,59) Error: Identifier not found "GetTime"
e_log.pas(47,41) Error: Identifier not found "GetTime"
e_log.pas(62) Fatal: There were 2 errors compiling module, stopping
Fatal: Compilation aborted

В FPC имя этой функции - просто "Time". Заменяем в e_log.pas GetTime на Time.

Попытка №2:
Code:
...
Compiling ..\Engine Source\e_input.pas
Compiling ..\Engine Source\e_sound.pas
Compiling ..\Lib\FMOD\fmod.pas
fmod.inc(27,7) Error: Compile time expression: Wanted STRING but got INTEGER at
"COMPILERVERSION >= 150"
fmod.inc(28,6) Warning: Illegal identifier "UNSAFE_TYPE" for $WARN directive
Compiling ..\Lib\FMOD\fmodtypes.pas
fmod.inc(27,7) Error: Compile time expression: Wanted STRING but got INTEGER at
"COMPILERVERSION >= 150"
fmod.inc(28,6) Warning: Illegal identifier "UNSAFE_TYPE" for $WARN directive
fmodtypes.pas(2158,1) Fatal: There were 2 errors compiling module, stopping
Fatal: Compilation aborted

Идем в fmod.inc. {$IFNDEF DELPHI_5_OR_LOWER} - у нас не LOWER, но и не дельфи. Можно просто удалить весь IFNDEF к черту.

Попытка №3:
Code:
...
Compiling ..\Shared Source\WADEDITOR.pas
Compiling ..\Shared Source\WADSTRUCT.pas
WADEDITOR.pas(183,13) Error: Identifier not found "CompressBuf"
WADEDITOR.pas(276,13) Error: Identifier not found "CompressBuf"
WADEDITOR.pas(276,13) Error: Identifier not found "DecompressBuf"
WADEDITOR.pas(562,16) Error: Identifier not found "DecompressBuf"
WADEDITOR.pas(836) Fatal: There were 4 errors compiling module, stopping
Fatal: Compilation aborted

DF использует старый-престарый ZLib, который от Delphi7. В новом функция CompressBuf называется просто Compress, а DecompressBuf вообще несколько другая.
Поэтому, первую функцию мы заменяем на Compress, перед вторым аргументом у ее вызовов ставим '@' без кавычек (указатель), а оставшиеся две ошибки не трогаем, но вставляем вот эту функцию в начало implementation.

Попытка №4:
Code:
...
WADEDITOR.pas(111,26) Error: Incompatible types: got "PChar" expected "pBytef"
...
WADEDITOR.pas(876) Fatal: There were 1 errors compiling module, stopping
Fatal: Compilation aborted

Просто заменяем там PChar( на PByteF(.

Попытка №5:
Code:
...
WADEDITOR.pas(72,12) Error: Forward declaration not solved "g_ProcessResourceStr
(AnsiString,PAnsiString,PAnsiString,PAnsiString);"
WADEDITOR.pas(876) Fatal: There were 1 errors compiling module, stopping
Fatal: Compilation aborted

Тут какая-то херня с именами типов, не имею понятия. Находим в implementation функцию g_ProcessResourceStr, у которой последний аргумент имеет тип PString.
Заменяем там ': String' на ': AnsiString', а ': PString' на ': PAnsiString'.

Попытка №6:
Code:
Compiling ..\Shared Source\BinEditor.pas
BinEditor.pas(538,21) Error: Identifier not found "CloseFile"
BinEditor.pas(620,21) Error: Identifier not found "CloseFile"
BinEditor.pas(635) Fatal: There were 2 errors compiling module, stopping
Fatal: Compilation aborted

Заменяем в BinEditor.pas везде System.CloseFile на Close. Хреново фальк метод назвал.

Попытка №7:
Code:
g_gui.pas(2972,4) Error: Illegal expression
g_gui.pas(2972,7) Fatal: Syntax error, ")" expected but "identifier G_TEXTURE_GET" found

Если честно, я не имею ни малейшего понятия, отчего тут стоят скобки. Может быть в седьмых дельфях они считаются как begin и end в if-ах, я не знаю.
Заменяем их на кошерные begin и end:
Code:
 if FImageRes = '' then
 begin
  if g_Texture_Get(FDefaultRes, ID) then
   e_Draw(ID, FX, FY, 0, True, False);
 end
 else
 begin
  if g_Texture_Get(FImageRes, ID) then
   e_Draw(ID, FX, FY, 0, True, False);
 end;

Попытка №8:
Code:
g_map.pas(1724,26) Error: Illegal assignment to for-loop variable "i"
g_map.pas(1936) Fatal: There were 1 errors compiling module, stopping
Fatal: Compilation aborted

> assignment
???
Похуй, впихиваем туда костыль в виде дополнительной переменной k: Integer, вот так:
Code:
   k := i;
      // ID панели:
        PAMem.WriteInt(k);
      // Сохраняем панель:
        panels[i].SaveState(PAMem);


Вуаля, оно скомпилилось!!1
Запускаем. Видим, что грузится фон и шрифты. Видим, что игра вылетает при загрузке. Лезем в лог:
Code:
[17:40:18] *** Loading menu data...
...
[17:40:18] !!! ИГРА УПАЛА! Ошибка: Access violation

Чому? Вспоминаем про ключ -g в команде. Добавляем туда еще и ключ -gl. Заходим в директорию к DF, делаем
Code:
$ gdb Doom2DF.exe
> run

Получаем:
Code:
Program received signal SIGSEGV, Segmentation fault.
TGUIMENU__ADDSPACE (this=<error reading variable>) at g_gui.pas:1279
1279      Text := nil;

Лезем в g_gui.pas:1279. Видим:
Code:
 with FItems[NewItem()] do
 begin
  Text := nil;
  Control := nil;
 end;

Почему бы этому не работать? Память течет где-то? Непонятно.
Ставим там какой-нибудь костыль вроде
Code:
I := NewItem();
Item := FItems[I];
Item.Text := nil;
Item.Control := nil;

Получаем вообще какую-то хуйню:
Code:
Program received signal SIGSEGV, Segmentation fault.
0x770d8e19 in ntdll!TpCallbackMayRunLong () from C:\Windows\system32\ntdll.dll

Дальше мне разбираться стало лень. Видимо, где-то что-то течет.
Сорцы, которые я таким образом соорудил, прилагаются.
UPD: Экспериментальным путем было установлено, что сегфолт вылетает ровно после инициализации меню видеонастроек, а конкретно выбора разрешений. Но если закомментить вообще все меню, получаем примерно ту же ошибку при инициализации консоли. Так что надо глядеть глубже.


Attachments:
DF.zip [765.07 KiB]
Downloaded 206 times

_________________
aka PrimuS
Top
 Profile  
 
PostPosted: 14 Aug 2014, 17:26 
Offline
Приколист
User avatar

Joined: 18 Oct 2009, 04:01
Posts: 5984
Location: Владивосток
Немного подброшу инфы. В Delphi 7 используется ZLib 1.0.4, оригинал которого всё ещё можно невозбранно надыбать на официальном сайте ZLib в таинственной подпапке, которую я как-то случайно нагуглил.

А вообще я с Примусом согласен всецело и абсолютно - нам срочно необходимо перекатываться либо на FPC, либо хотя бы на какой-нибудь XE 2010 (или как там его). Иначе увязнем. И отсутствие поддержки юникода - это едва ли не самое мягкое из последствий, которые можно себе представить.

_________________
Чёрный Думер, Чёрный Думер
С монстрами сражается.
Чёрный Думер, Чёрный Думер
Рокетланчер плавится.


Top
 Profile  
 
PostPosted: 21 Aug 2014, 00:44 
Offline
Приколист
User avatar

Joined: 24 Jan 2012, 15:18
Posts: 1404
Location: Москва
Черный Думер wrote:
XE 2010 (или как там его)
Delphi 2010 - она ещё не XE, а вот XE это 4, 5 и выше. Апгрейд среды и компилятора считаю логичным ходом, главное чтобы сложность переделки кода окупилась.

_________________
by Stas'M


Top
 Profile  
 
PostPosted: 21 Aug 2014, 19:34 
Offline
Site Admin

Joined: 17 Oct 2009, 20:40
Posts: 30
Location: Новосибирск
Я пару лет назад компилил дф в FPC достаточно легко, только ресурсы не распаковывались т.к как я понел, там Zlib отличается. Вобщем если мое мнение кому-то интересно, я считаю лучше перейти на ФПК а не на новую версию делфи.


Top
 Profile  
 
PostPosted: 22 Aug 2014, 03:18 
Offline
Site Admin
User avatar

Joined: 17 Oct 2009, 23:43
Posts: 6820
Location: \\NEGRO
Я правильно понимаю, что с FPC можно компилять бинарики под линух?

_________________
И неважно, что нет морей на Марсе, каждый морпех носит море в сердце.


Top
 Profile  
 
PostPosted: 22 Aug 2014, 03:40 
Offline
Приколист
User avatar

Joined: 18 Oct 2009, 04:01
Posts: 5984
Location: Владивосток
falcon wrote:
Я пару лет назад компилил дф в FPC достаточно легко, только ресурсы не распаковывались т.к как я понел, там Zlib отличается.
Ну с ZLib'ом мы проблему решили. Только у нас куча других вылезла.
Если бы ты смог в паре с Примусом перенести D2D:F на FPC - это было бы прекрасно.

Jabberwock wrote:
Я правильно понимаю, что с FPC можно компилять бинарики под линух?
Если бы только на него.
https://ru.wikipedia.org/wiki/FPC#Платформы
Проблема после переноса на FPC будет только в том, что D2D:F использует некоторые специфичные только для шиндошс вещи, вроде DirectInput. Но всё это выделено в отдельные подсистемы, так что переписать не составит особого труда, я думаю.

_________________
Чёрный Думер, Чёрный Думер
С монстрами сражается.
Чёрный Думер, Чёрный Думер
Рокетланчер плавится.


Top
 Profile  
 
PostPosted: 22 Aug 2014, 11:56 
Offline
Site Admin
User avatar

Joined: 17 Oct 2009, 23:43
Posts: 6820
Location: \\NEGRO
Значит, мечта о дф-сервере на никсовом VDS делается ближе.

_________________
И неважно, что нет морей на Марсе, каждый морпех носит море в сердце.


Top
 Profile  
 
PostPosted: 22 Aug 2014, 11:58 
Offline
Приколист
User avatar

Joined: 18 Oct 2009, 04:01
Posts: 5984
Location: Владивосток
Его сначала надо научить обходиться без подсистем, например. То есть сделать их динамически инициализируемыми, а не статически.

_________________
Чёрный Думер, Чёрный Думер
С монстрами сражается.
Чёрный Думер, Чёрный Думер
Рокетланчер плавится.


Top
 Profile  
 
PostPosted: 07 Feb 2015, 20:22 
Offline
Site Admin

Joined: 17 Oct 2009, 20:40
Posts: 30
Location: Новосибирск
Сконпелировал ДФ, ошибка вылезала в TGUIMenu.NewItem() при расширении динамического массива. С чем это связано хз, я заменил массив на статический [0..255] (с переменной-указателем на размер и соотв. изменением класса в местах типа if FItems <> nil then и циклах по массиву). Конпелируется и работает норм, только у меня не выводятся графические шрифты, наверное несостыковки версий исходника и ресурсов (ресурсы от 0.666).
Да, исходник брал из первого поста, предварительно прошелся по нему конвертером dpr в проект lazarus. потом вычищал хуйню которую он там наворотил (вызовы ReadFile в классе вад ридера и конфига).


Attachments:
g_gui.pas [68.1 KiB]
Downloaded 267 times
Top
 Profile  
 
PostPosted: 07 Feb 2015, 22:15 
Offline
Приколист

Joined: 18 Oct 2009, 12:00
Posts: 1249
Location: Подмосковье
Надо бы мне это смержить с исходниками на гитхабе и посмотреть, все ли будет работать.

_________________
aka PrimuS


Top
 Profile  
 
PostPosted: 07 Feb 2015, 22:16 
Offline
Приколист
User avatar

Joined: 18 Oct 2009, 04:01
Posts: 5984
Location: Владивосток
Prostovitalik wrote:
Неплохо бы это смержить с исходниками на гитхабе.
Зачем?

_________________
Чёрный Думер, Чёрный Думер
С монстрами сражается.
Чёрный Думер, Чёрный Думер
Рокетланчер плавится.


Top
 Profile  
 
PostPosted: 07 Feb 2015, 22:16 
Offline
Приколист

Joined: 18 Oct 2009, 12:00
Posts: 1249
Location: Подмосковье
Чтоб можно было их FPC собирать, наверное?

_________________
aka PrimuS


Top
 Profile  
 
PostPosted: 07 Feb 2015, 22:19 
Offline
Приколист
User avatar

Joined: 24 Jan 2012, 15:18
Posts: 1404
Location: Москва
Prostovitalik wrote:
Чтоб можно было их FPC собирать, наверное?

Мы ж планировали FPC версию с нуля писать. Или всё-таки хотите раскрутить старый добрый DF на FPC?)

_________________
by Stas'M


Top
 Profile  
 
PostPosted: 07 Feb 2015, 22:21 
Offline
Приколист

Joined: 18 Oct 2009, 12:00
Posts: 1249
Location: Подмосковье
Не, ну пока мы будем писать это все с нуля пусть будет версия, которую можно собрать на фпц.

_________________
aka PrimuS


Top
 Profile  
 
PostPosted: 07 Feb 2015, 22:25 
Offline
Приколист
User avatar

Joined: 18 Oct 2009, 04:01
Posts: 5984
Location: Владивосток
Prostovitalik wrote:
Чтоб можно было их FPC собирать, наверное?
У тебя там правки для этого из разряда "костыль поставил и пофиг". Зачем код замусоривать?

Prostovitalik wrote:
Не, ну пока мы будем писать это все с нуля пусть будет версия, которую можно собрать на фпц.
Так толку-то от неё всё равно пока не будет, потому что пользуется DirectInput и WinAPI в самых разных местах кода, а ещё к тому же нет транслированного unix.h для ENet. А кроме как для кросс-компиляции FPC-версия и не нужна особо, я полагаю.

_________________
Чёрный Думер, Чёрный Думер
С монстрами сражается.
Чёрный Думер, Чёрный Думер
Рокетланчер плавится.


Top
 Profile  
 
PostPosted: 07 Feb 2015, 22:28 
Offline
Приколист

Joined: 18 Oct 2009, 12:00
Posts: 1249
Location: Подмосковье
Если кто-то зачем-то захочет собрать исходники, думаю, навряд ли он захочет ставить себе D7 и трахаться с ним еще.

_________________
aka PrimuS


Top
 Profile  
 
PostPosted: 07 Feb 2015, 22:41 
Offline
Приколист
User avatar

Joined: 18 Oct 2009, 04:01
Posts: 5984
Location: Владивосток
Prostovitalik wrote:
Если кто-то зачем-то захочет собрать исходники, думаю, навряд ли он захочет ставить себе D7 и трахаться с ним еще.
Так пусть сюда приходит. Здесь есть мы. А ещё есть эта тема, в которой всё дано.

_________________
Чёрный Думер, Чёрный Думер
С монстрами сражается.
Чёрный Думер, Чёрный Думер
Рокетланчер плавится.


Top
 Profile  
 
PostPosted: 08 Feb 2015, 00:11 
Offline
User avatar

Joined: 12 Nov 2014, 17:47
Posts: 109
Черный Думер wrote:
нет транслированного unix.h для ENet.

Давно уже сделал, кстати говоря.


Top
 Profile  
 
PostPosted: 08 Feb 2015, 00:12 
Offline
Приколист
User avatar

Joined: 18 Oct 2009, 04:01
Posts: 5984
Location: Владивосток
daniel_p wrote:
Давно уже сделал, кстати говоря.
А мою трансляцию остальных хедеров для Delphi 7 ты под FPC случаем не правил ещё?

_________________
Чёрный Думер, Чёрный Думер
С монстрами сражается.
Чёрный Думер, Чёрный Думер
Рокетланчер плавится.


Top
 Profile  
 
PostPosted: 08 Feb 2015, 01:23 
Offline
User avatar

Joined: 12 Nov 2014, 17:47
Posts: 109
Я с нуля сделал и одним файлом, чтобы подключать без гемора. В твоей трансляции мелкие косяки были (size_t и еще какие-то, точно не помню уже). В общем, сам смотри: примерно так это выглядит.


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 26 posts ]  Go to page 1, 2  Next

All times are UTC + 3 hours


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
doom2d.org, since 2007