Skip to content

Commit f15996e

Browse files
committed
Get standalone rec2 building on Linux (loading driver fails)
1 parent b618c87 commit f15996e

File tree

27 files changed

+2245
-88
lines changed

27 files changed

+2245
-88
lines changed

CMakeLists.txt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,28 @@ project(rec2 C)
77

88
include(CMakeDependentOption)
99

10+
set(REC2_ALL_PLATFORM_CHOICES "SDL3" "WIN32")
11+
if(WIN32 AND CMAKE_SIZEOF_VOID_P EQUAL 4)
12+
set(REC2_PLATFORM_DEFAULT "WIN32")
13+
set(valid_platform_choices "WIN32" "SDL3")
14+
else()
15+
set(REC2_PLATFORM_DEFAULT "SDL3")
16+
set(valid_platform_choices "SDL3")
17+
endif()
18+
set(REC2_PLATFORM "${REC2_PLATFORM_DEFAULT}" CACHE STRING "rec2 platform")
19+
set_property(CACHE REC2_PLATFORM PROPERTY STRINGS "${valid_platform_choices}")
20+
if(NOT REC2_PLATFORM IN_LIST valid_platform_choices)
21+
message(FATAL_ERROR "Invalid REC2_PLATFORM=${REC2_PLATFORM} (choices=${valid_platform_choices})")
22+
endif()
23+
message(STATUS "REC2_PLATFORM=${REC2_PLATFORM} (choices=${valid_platform_choices})")
24+
foreach(choice IN LISTS REC2_ALL_PLATFORM_CHOICES)
25+
if(REC2_PLATFORM STREQUAL "${choice}")
26+
set(REC2_PLATFORM_${choice} TRUE)
27+
else()
28+
set(REC2_PLATFORM_${choice} FALSE)
29+
endif()
30+
endforeach()
31+
1032
option(KEEP_ACTIVE_IN_BACKGROUND "Keep the game active when alt-tabbing to another application" OFF)
1133
option(REC2_VENDORED "Use vendored dependencies" ON)
1234
option(REC2_WERROR "Treat warnings as errors" OFF)
@@ -27,6 +49,10 @@ if(Python3_Interpreter_FOUND)
2749
endif()
2850
cmake_dependent_option(REC2_DUMPERS "Build struct/enum dumpers" FALSE GENDUMPER_AVAILABLE FALSE)
2951

52+
if(NOT MSVC)
53+
add_compile_options(-Wno-format-overflow)
54+
endif()
55+
3056
if(REC2_VENDORED)
3157
add_subdirectory(external/libtiff EXCLUDE_FROM_ALL)
3258
add_subdirectory(external/zlib EXCLUDE_FROM_ALL)

external/smackw32/CMakeLists.txt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1-
add_library(Smackw32::Smackw32 SHARED IMPORTED GLOBAL)
2-
set_property(TARGET Smackw32::Smackw32 PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_LIST_DIR}/include")
3-
set_property(TARGET Smackw32::Smackw32 PROPERTY IMPORTED_IMPLIB "${CMAKE_CURRENT_LIST_DIR}/lib/x86/smackw32.lib")
1+
if(REC2_PLATFORM_WIN32)
2+
add_library(Smackw32::Smackw32 SHARED IMPORTED GLOBAL)
3+
set_property(TARGET Smackw32::Smackw32 PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_LIST_DIR}/include")
4+
set_property(TARGET Smackw32::Smackw32 PROPERTY IMPORTED_IMPLIB "${CMAKE_CURRENT_LIST_DIR}/lib/x86/smackw32.lib")
5+
else()
6+
add_library(smackw32_smackw32_dummy STATIC
7+
src/dummy/dummy.c
8+
)
9+
target_include_directories(smackw32_smackw32_dummy PUBLIC "${CMAKE_CURRENT_LIST_DIR}/include")
10+
add_library(Smackw32::Smackw32 ALIAS smackw32_smackw32_dummy)
11+
endif()
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
#include "smack.h"
2+
3+
#include <stddef.h>
4+
5+
unsigned int SMACK_STDCALL SmackUseMMX(unsigned int flag) {
6+
(void)flag;
7+
return 0;
8+
}
9+
10+
int SMACK_STDCALL SmackSoundUseDirectSound(SMACK_HWND hWnd) {
11+
(void)hWnd;
12+
return 0;
13+
}
14+
15+
HSMACK SMACK_STDCALL SmackOpen(const char *path, unsigned int uFlags, unsigned int uExtraBuffers) {
16+
(void)path;
17+
(void)uFlags;
18+
(void)uExtraBuffers;
19+
return NULL;
20+
}
21+
int SMACK_STDCALL SmackBufferOpen(SMACK_HWND a1, long a2, long a3, long a4, long a5, long a6) {
22+
(void)a1;
23+
(void)a2;
24+
(void)a3;
25+
(void)a4;
26+
(void)a5;
27+
(void)a6;
28+
return 0;
29+
}
30+
31+
void SMACK_STDCALL SmackToBuffer(HSMACK hSmack, unsigned int uX, unsigned int uY, unsigned int uPitch, unsigned int uHeight, void *pBuffer, unsigned int uFlags) {
32+
(void)hSmack;
33+
(void)uX;
34+
(void)uY;
35+
(void)uPitch;
36+
(void)uHeight;
37+
(void)pBuffer;
38+
(void)uFlags;
39+
}
40+
41+
unsigned int SMACK_STDCALL SmackDoFrame(HSMACK hSmack) {
42+
(void)hSmack;
43+
return 0;
44+
}
45+
46+
void SMACK_STDCALL SmackNextFrame(HSMACK hSmack) {
47+
(void)hSmack;
48+
}
49+
50+
HSMACKBLIT SMACK_STDCALL SmackBlitOpen(unsigned int uSurfaceFormat) {
51+
return NULL;
52+
}
53+
54+
void SMACK_STDCALL SmackBlitSetPalette(HSMACKBLIT hBlit, void *pPalette, unsigned int uPalType) {
55+
(void)hBlit;
56+
(void)pPalette;
57+
(void)uPalType;
58+
}
59+
60+
void SMACK_STDCALL SmackBlit(HSMACKBLIT hBlit, void *pDest, unsigned int uDestPitch, unsigned int uDestX, unsigned int uDestY, void *pSrc, unsigned int uSrcPitch, unsigned int uSrcX, unsigned int uSrcY, unsigned int uSrcZ, unsigned int uSrcW) {
61+
(void)hBlit;
62+
(void)pDest;
63+
(void)uDestPitch;
64+
(void)uDestX;
65+
(void)uDestY;
66+
(void)pSrc;
67+
(void)uSrcPitch;
68+
(void)uSrcX;
69+
(void)uSrcY;
70+
(void)uSrcZ;
71+
(void)uSrcW;
72+
}
73+
74+
unsigned int SMACK_STDCALL SmackWait(HSMACK hSmack) {
75+
(void)hSmack;
76+
return 0;
77+
}
78+
79+
void SMACK_STDCALL SmackBlitClose(HSMACKBLIT hBlit) {
80+
(void)hBlit;
81+
}
82+
83+
void SMACK_STDCALL SmackClose(HSMACK hSmack) {
84+
(void)hSmack;
85+
}

src/brender/CMakeLists.txt

Lines changed: 60 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -327,64 +327,66 @@ if(REC2_STANDALONE)
327327
target_link_options(brender-brhost1-shared PRIVATE "/ENTRY:DllMain")
328328
endif()
329329

330-
add_library(brender_driver_d3d SHARED
331-
drivers/d3d/d3d.def
332-
drivers/d3d/backend.c
333-
drivers/d3d/backend.h
334-
drivers/d3d/devclut.c
335-
drivers/d3d/devclut.h
336-
drivers/d3d/device.c
337-
drivers/d3d/device.h
338-
drivers/d3d/devpixmp.c
339-
drivers/d3d/devpixmp.h
340-
drivers/d3d/devpmsys.c
341-
drivers/d3d/devpmsys.h
342-
drivers/d3d/driver.c
343-
drivers/d3d/match.c
344-
drivers/d3d/match.h
345-
drivers/d3d/object.c
346-
drivers/d3d/object.h
347-
drivers/d3d/outfcty.c
348-
drivers/d3d/outfcty.h
349-
drivers/d3d/plib.c
350-
drivers/d3d/plib.h
351-
drivers/d3d/prim_l15.c
352-
drivers/d3d/prim_l15.h
353-
drivers/d3d/prim_p15.h
354-
drivers/d3d/prim_p15.c
355-
drivers/d3d/prim_t15.c
356-
drivers/d3d/prim_t15.h
357-
drivers/d3d/pstate.c
358-
drivers/d3d/pstate.h
359-
drivers/d3d/renderfuncs.c
360-
drivers/d3d/renderfuncs.h
361-
drivers/d3d/sbuffer.c
362-
drivers/d3d/sbuffer.h
363-
drivers/d3d/texture.c
364-
drivers/d3d/texture.h
365-
drivers/d3d/timestmp.c
366-
drivers/d3d/timestmp.h
367-
drivers/d3d/types.h
368-
)
369-
target_compile_definitions(brender_driver_d3d PRIVATE DIRECTDRAW_VERSION=0x500)
370-
target_include_directories(brender_driver_d3d
371-
PRIVATE
372-
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
373-
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
374-
)
375-
target_link_libraries(brender_driver_d3d
376-
PRIVATE
377-
brender-brcore1-shared
378-
brender-brpmap1-shared
379-
brender-brhost1-shared
380-
c2_hooks
381-
)
382-
target_compile_definitions(brender_driver_d3d
383-
PRIVATE
384-
BASED_FLOAT
385-
)
386-
set_property(TARGET brender_driver_d3d PROPERTY PREFIX "")
387-
set_property(TARGET brender_driver_d3d PROPERTY OUTPUT_NAME "d3d_rec2")
330+
if(REC2_PLATFORM_WIN32)
331+
add_library(brender_driver_d3d SHARED
332+
drivers/d3d/d3d.def
333+
drivers/d3d/backend.c
334+
drivers/d3d/backend.h
335+
drivers/d3d/devclut.c
336+
drivers/d3d/devclut.h
337+
drivers/d3d/device.c
338+
drivers/d3d/device.h
339+
drivers/d3d/devpixmp.c
340+
drivers/d3d/devpixmp.h
341+
drivers/d3d/devpmsys.c
342+
drivers/d3d/devpmsys.h
343+
drivers/d3d/driver.c
344+
drivers/d3d/match.c
345+
drivers/d3d/match.h
346+
drivers/d3d/object.c
347+
drivers/d3d/object.h
348+
drivers/d3d/outfcty.c
349+
drivers/d3d/outfcty.h
350+
drivers/d3d/plib.c
351+
drivers/d3d/plib.h
352+
drivers/d3d/prim_l15.c
353+
drivers/d3d/prim_l15.h
354+
drivers/d3d/prim_p15.h
355+
drivers/d3d/prim_p15.c
356+
drivers/d3d/prim_t15.c
357+
drivers/d3d/prim_t15.h
358+
drivers/d3d/pstate.c
359+
drivers/d3d/pstate.h
360+
drivers/d3d/renderfuncs.c
361+
drivers/d3d/renderfuncs.h
362+
drivers/d3d/sbuffer.c
363+
drivers/d3d/sbuffer.h
364+
drivers/d3d/texture.c
365+
drivers/d3d/texture.h
366+
drivers/d3d/timestmp.c
367+
drivers/d3d/timestmp.h
368+
drivers/d3d/types.h
369+
)
370+
target_compile_definitions(brender_driver_d3d PRIVATE DIRECTDRAW_VERSION=0x500)
371+
target_include_directories(brender_driver_d3d
372+
PRIVATE
373+
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
374+
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
375+
)
376+
target_link_libraries(brender_driver_d3d
377+
PRIVATE
378+
brender-brcore1-shared
379+
brender-brpmap1-shared
380+
brender-brhost1-shared
381+
c2_hooks
382+
)
383+
target_compile_definitions(brender_driver_d3d
384+
PRIVATE
385+
BASED_FLOAT
386+
)
387+
set_property(TARGET brender_driver_d3d PROPERTY PREFIX "")
388+
set_property(TARGET brender_driver_d3d PROPERTY OUTPUT_NAME "d3d_rec2")
389+
endif()
388390

389391
add_library(BRender::BRender ALIAS brender-shared)
390392
else()

src/brender/core/host/himage.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
#include "himage.h"
22

3+
#ifdef _WIN32
34
#include <windows.h>
5+
#else
6+
#include <dlfcn.h>
7+
#endif
48

59
void* (C2_HOOK_CDECL * HostImageLoad_original)(const char* name);
610
void* C2_HOOK_CDECL HostImageLoad(const char* name) {
711
#if 0//defined(C2_HOOKS_ENABLED)
812
return HostImageLoad_original(name);
913
#else
1014

15+
#ifdef _WIN32
1116
return LoadLibraryA(name);
17+
#else
18+
return dlopen(name, RTLD_NOW);
19+
#endif
1220
#endif
1321
}
1422
C2_HOOK_FUNCTION_ORIGINAL(0x0053fb50, HostImageLoad, HostImageLoad_original)
@@ -29,8 +37,11 @@ void* C2_HOOK_CDECL HostImageLookupName(void* img, const char* name, br_uint_32
2937
#if 0//defined(C2_HOOKS_ENABLED)
3038
return HostImageLookupName_original(img, name, hint);
3139
#else
32-
40+
#ifdef _WIN32
3341
return GetProcAddress((HMODULE)img, name);
42+
#else
43+
return dlsym(img, name);
44+
#endif
3445
#endif
3546
}
3647
C2_HOOK_FUNCTION_ORIGINAL(0x0053fb70, HostImageLookupName, HostImageLookupName_original)

src/brender/core/host/hostcfg.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
#include "core/fw/diag.h"
44

5+
#ifdef _WIN32
56
#include <windows.h>
7+
#endif
68

79
const char* (C2_HOOK_CDECL * HostDefaultDevice_original)(void);
810
const char* C2_HOOK_CDECL HostDefaultDevice(void) {
@@ -22,9 +24,13 @@ br_boolean C2_HOOK_CDECL HostIniSectionExists(char* ini_file, char* section_name
2224
#if 0//defined(C2_HOOKS_ENABLED)
2325
return HostIniSectionExists_original(ini_file, section_name);
2426
#else
27+
#ifdef _WIN32
2528
char buffer[5];
2629

2730
return GetPrivateProfileSectionA(section_name, buffer, sizeof(buffer), ini_file) != 0;
31+
#else
32+
return 0;
33+
#endif
2834
#endif
2935
}
3036
C2_HOOK_FUNCTION_ORIGINAL(0x0053fbb0, HostIniSectionExists, HostIniSectionExists_original)
@@ -36,10 +42,14 @@ br_error C2_HOOK_CDECL HostIniQuery(char* ini_file, char* section_name, char* en
3642
#if 0//defined(C2_HOOKS_ENABLED)
3743
return HostIniQuery_original(ini_file, section_name, entry, Buffer, max, size);
3844
#else
45+
#ifdef _WIN32
3946
static char default_entry[] = "";
4047

4148
*size = (br_uint_16)GetPrivateProfileStringA(section_name, entry, default_entry, Buffer, max, ini_file);
4249
return 0;
50+
#else
51+
return 0x1002;
52+
#endif
4353
#endif
4454
}
4555
C2_HOOK_FUNCTION_ORIGINAL(0x0053fbe0, HostIniQuery, HostIniQuery_original)
@@ -51,6 +61,7 @@ br_error C2_HOOK_CDECL HostRegistryQuery(void* hKey, char* Path, char* entry, ch
5161
#if 0//defined(C2_HOOKS_ENABLED)
5262
return HostRegistryQuery_original(hKey, Path, entry, Buffer, max, size);
5363
#else
64+
#ifdef _WIN32
5465
DWORD cbData;
5566
DWORD type;
5667

@@ -70,6 +81,9 @@ br_error C2_HOOK_CDECL HostRegistryQuery(void* hKey, char* Path, char* entry, ch
7081
}
7182
*size = (br_uint_16)cbData;
7283
return 0;
84+
#else
85+
return 0x1002;
86+
#endif
7387
#endif
7488
}
7589
C2_HOOK_FUNCTION_ORIGINAL(0x0053fc10, HostRegistryQuery, HostRegistryQuery_original)

src/carma2/common/world.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -603,21 +603,21 @@ tAdd_to_storage_result C2_HOOK_FASTCALL LoadSoundInStorage(tBrender_storage* pSt
603603
C2_HOOK_FUNCTION_ORIGINAL(0x00501930, LoadSoundInStorage, LoadSoundInStorage_original)
604604

605605
int C2_HOOK_FASTCALL IsValidFile(const char* path) {
606-
struct c2_stat stat;
606+
struct c2_stat s;
607607

608-
return c2_stat32(path, &stat) == 0;
608+
return c2_stat32(path, &s) == 0;
609609
}
610610
C2_HOOK_FUNCTION(0x00486c00, IsValidFile)
611611

612612
int C2_HOOK_FASTCALL GetLastModificationTime(const char* path) {
613-
struct c2_stat stat;
613+
struct c2_stat s;
614614
int res;
615615

616-
res = c2_stat32(path, &stat);
616+
res = c2_stat32(path, &s);
617617
if (res == -1) {
618618
return 0;
619619
}
620-
return stat.st_mtime;
620+
return s.st_mtime;
621621
}
622622
C2_HOOK_FUNCTION(0x00486be0, GetLastModificationTime)
623623

@@ -636,7 +636,7 @@ br_pixelmap* C2_HOOK_FASTCALL Read_DEFAULT_ACT(const char* textureDir, int flags
636636
*errorCode = 5;
637637
return NULL;
638638
}
639-
if (fread(defaultActBuffer, 0x300, 1, (FILE*)f) == 0) {
639+
if (fread(defaultActBuffer, REC2_ASIZE(defaultActBuffer), 1, (FILE*)f) == 0) {
640640
PFfclose(f);
641641
*errorCode = 5;
642642
return NULL;

0 commit comments

Comments
 (0)