Witam. Zwykle chętnie pomagam w problemach związanych z Delphi i Pascalem, jeśli tylko potrafię. Jednak nie ukrywam, że z języków C jestem totalna lama i moja wiedza jest bardzo mała. Początkowo prosiłem na PW o pomoc Azariena, który kiedyś doradzał mi przy tłumaczeniu plików SDK dla pluginów do odtwarzacza XMPlay, jednak Azarien do tej pory mi nie odpisał. Jeżeli to teraz czytasz i znajdziesz czas to proszę odpisz :) Anyway, to zaadaprowanie kodu z C było moim pierwszym większym tłumaczeniem z C na Delphi i jakoś sobie poradziłem tworząc plugin do obsługi klawiszy multimedialnym w XMPlay'u. Jednak teraz szukam osób chętnych do pomocy przy przetłumaczeniu pewnego źródla z C na Delphi, a także "uniwersalizacji" tego kodu tak aby mógł działać możłiwie z każdą starszą grą. Chodzi o projekt ze strony: http://hifi.iki.fi/cnc-ddraw dla C&C Redalert sprawdza się dobrze. Jednak ja chciałbym aby można było uruchomić stare gry bez skopanych kolorów także pod Windows 7, bez konieczności "ubijania" procesu explorer.exe. Póki co przygotowałem sobie to co jest dołaczone do tego posta. W katalogu głownym !
znajduje się krótki kod w Delphi, po jego skompilowaniu otrzymujemy ddraw.dll, która póki co tylko po wrzuceniu do katalogu z grą "Wacki - Kosmiczna Rozgrywka", powoduje że mamy ok kolory pod Windows 7, jednak zadziała to dopiero za drugim uruchomieniem, a później nie działa, bo nie umiem zwolnić dllki, gdyż ddraw.dll nie ma chyba wywoływanego DLL_PROCESS_DETACH przez tę gre i nie mogę zwolnić używanej oryginalnej ddraw.dll. A próbowałem na rózne sposoby. Nie można wywołąć FreeLibrary w trakcie pracy gry bo się ona wysypie. Niestety w innych grach do których chciałem zastosować ten "myk" z wrzuceniem ddraw.dll, ale ani na "Księcia i Tchórza" ani na "Die by The Sword" to nie podziałalo. Wrzucenie oryginalnej dllki ze strony pod adresem powyżej do tych gier powoduje że się one wysypują. Dlatego chciałem mając przetłumaczony kod ddraw.dll z C na Delphi, spróbowac zaadoptować ją do innych gier. Nie pisałem póki co w tej sprawie do autora dllki dla RedAlerta, bo On pewnie i tak nie pisze w Delphi i nie wiem czy by pomógł. A z takiej działającej i uniwersalnej dllki ucieszyli by się pewnie fani wielu starych gier w tym StarCrafta, bo póki co sposobem jest albo odpalenie na wirtualnej maszynie ze starym systemem albo odpowiedni wpis w rejestrze. Niestety przy wpisie albo kombinacji tak jak dla Wacków, po przełaczeniu Alt+Tab na Pulpit i powrocie do okna gry kolory znowu są skopane. Pomaga tylko ubicie na czas grania expolorer.exe. Napisałem sobie do tego celu działające loadery, które przywrócają proces explorer.exe po wyjściu z gry, ale to metoda mało elegancka i jak wnioskuje z tej modyfikacji "C&C Red Alert" są inne skuteczne sposoby. Bo okno Red Alerta możemy przełaczać i kolory się nie psują. Za pewne dlatego, że dla celów rysowania autor tego ddraw.dll stwórzył włąsne okno i przechwytuje komunikaty do niego skierowane w odpowiedni sposób oraz po tym oknie chyba rysuje. Chodzi mi najpierw o przetłumaczenie kodu który jest w podkatalogu DDRAW_ORIGINAL_SOURCE
na Delphi, tak aby skompilował się pod Delphi 7. Pomijam moduł screenshot.c bo nie znam zgrabnej biblioteki dla Delphi do plików png, która działała by w WinAPI. A ja chce jak najmniejszą możłiwie dllke, a nie spasła która się nie skompiluje z modułami z http://kolmck.net - zresztą ScreenShoty mozna sobie darować, po co to komu jak w razie czego jest Fraps :) A wspomniane "Wacki" w wersji "poprawionej" przeze mnie i działającej bez CD/ISO można znaleźć na trzy literowym portalu z "róznościami" ;) A teraz prosba do chętnych, bo ja mam mało czasu ze względu na dużą ilośc godzin spędzanych w pracy poza tym słaba znajomośc C. Otóż przygotowałem potrzebne moduły dla OpenGL'a i DirectXa oraz zaczątek źródła w podkatalogu `DDRAW_TRANSLATED_TO_DELPHI. I tutaj pare pytań jeżeli przejrzyćie kod w C:
- Czy dało by się to przetłumaczyć mając te moduły co dołaczyłęm dla DirectX'a i OpenGL'a? Pomijam StrStr, dołaczanie stdio i ewentualnie zamiane printfów na Delphiową funkcję taką jak w podkatalogu
TEMPORARY_01
. - Czy StrStr to na pewno to samo co Pos tylko z odwróconymi parametrami?
- Czy LPVoid w tym kodzie to na pewno Pointer?
- Czy taki zapis (fragment):
if(lpDDDriverCaps)
{
lpDDDriverCaps->dwSize = sizeof(DDCAPS);
lpDDDriverCaps->dwCaps = DDCAPS_BLT|DDCAPS_PALETTE;
// ...
to to samo co if lpDDDriverCaps <> nil then // ...
?
5. Czy wszelkie te structy w kodzie C można śmiało zamieniać na packed record?
6. Czy takie zapisy jak:
struct IDirectDrawImplVtbl
{
HRESULT(__stdcall *QueryInterface) (IDirectDrawImpl *, const IID* const riid, LPVOID * ppvObj);
ULONG(__stdcall *AddRef) (IDirectDrawImpl *);
ULONG(__stdcall *Release) (IDirectDrawImpl *);
Mozna smiało przetłumaczyć na wzór:
type
TJakasFunkcja = function(Parametr : string) : boolean;
Cosik = packed record
JakasFuncja : ^TJakasFunkcja;
end;
Pomijam zawartość funkcji - chodzi mi tylko o ideę. I sorry za wstawianie kodu nie Delphiowego w znaczniki code
, ale nie wiem czy w cpp było by ok. Wybaczcie też rozpisanie się. Wszelkie uwagi na temat kodu i odpowiedzi na moje lamerskie pytanie mile widzane. Jakby właśnie przede wszystkim ktoś fachowym okiem rzucił by na oryginalny kod C i zaopiniował czy w ogóle branie się za przerabianie kodu tak aby działał w innych grach się powiedzie? W RedAlercie działa elegancko, bo można przełaczać okno Alt+Tab i nie kopią się kolory. Problem jest tylko ze scrollem myszką. Nowsza wersja ma to poprawione, ale za to filmiki się tną. Mi już nie chodzi o ddraw.ini z ustawieniami, niech gra sobie działa nawet w oryginalnej 640x480, a te całe "hackowanie" coś tam z kursorem myszki też mi nie potrzebne. Chodzi tylko aby paleta 8 biotwa wyswietlała się ok, czyli tak jak jeszcze w Windowsach XP i była zachowana po Alt+Tab, ale bez kombinacji z ubijaniem explorer.exe. No pora iść spać, bo dzisiaj do roboty na nockę. Czekam na odpowiedzi. Wybaczcie jeszcze raz rozpisanie się i ewentualne literówki, ale późna pora oraz pośpiech i to pewnie dlatego :)