From: Holger Schemel Date: Thu, 26 Nov 2020 22:33:56 +0000 (+0100) Subject: added Emscripten support for running R'n'D in a web browser X-Git-Tag: 4.2.0.5~7 X-Git-Url: https://git.artsoft.org/?a=commitdiff_plain;h=0b877975a1d801e061e95f249359e7ec273dee78;p=rocksndiamonds.git added Emscripten support for running R'n'D in a web browser --- diff --git a/Makefile b/Makefile index 3e5877f0..5dd17c24 100644 --- a/Makefile +++ b/Makefile @@ -80,6 +80,9 @@ android-clean: android: android-package +emscripten: + @emmake $(MAKE_CMD) PLATFORM=emscripten + clean: @$(MAKE_CMD) clean @@ -166,6 +169,9 @@ dist-build-mac: dist-build-android: @BUILD_DIST=TRUE $(MAKE) android +dist-build-emscripten: + @BUILD_DIST=TRUE $(MAKE) emscripten + dist-package-linux: $(MAKE_DIST) package linux diff --git a/src/Makefile b/src/Makefile index 6885c601..0db8f54d 100644 --- a/src/Makefile +++ b/src/Makefile @@ -58,6 +58,14 @@ PROGNAME = ../$(PROGBASE).exe EXTRA_LDFLAGS = -lshfolder -lwsock32 endif +ifeq ($(PLATFORM),emscripten) # compiling with Emscripten +PROGNAME = ../$(PROGBASE).js +CC = emcc +AR = emar +RANLIB = emranlib +STRIP = true +endif + ifdef BUILD_DIST # distribution build ifeq ($(shell uname -s),Darwin) # compiling on Mac OS X MAC_TARGET_VERSION_MIN = 10.7 @@ -85,7 +93,15 @@ endif # $(info Using SDL version $(SDL_VERSION) [TARGET == $(TARGET)]) ifeq ($(TARGET),sdl2) # compiling for SDL2 target +ifeq ($(PLATFORM),emscripten) +SDL_LIBS = -s USE_SDL_IMAGE=2 -s USE_SDL_MIXER=2 -s USE_SDL_NET=2 -s USE_ZLIB=1 +SDL_FMTS = -s SDL2_IMAGE_FORMATS='["bmp","png","pcx","xpm"]' +EXTRA_CFLAGS = $(SDL_LIBS) +EXTRA_LDFLAGS = $(SDL_FMTS) -s INITIAL_MEMORY=65536000 -s ALLOW_MEMORY_GROWTH=1 --preload-file ../graphics/ --preload-file ../sounds/ --preload-file ../levels/ --preload-file ../music/ -s NO_EXIT_RUNTIME=0 -s ASYNCIFY -O2 +else SDL_LIBS = -lSDL2_image -lSDL2_mixer -lSDL2_net +endif + SYS_CFLAGS := -DTARGET_SDL2 $(shell sdl2-config --cflags) SYS_LDFLAGS := $(SDL_LIBS) $(shell sdl2-config --libs) -lm -lz endif @@ -317,7 +333,10 @@ clean-ico: clean-bin: $(RM) $(PROGNAME) - $(RM) ../*.exe + $(RM) $(PROGNAME).exe + $(RM) $(PROGNAME).js + $(RM) $(PROGNAME).wasm + $(RM) $(PROGNAME).data clean: clean-obj clean-ico clean-bin diff --git a/src/libgame/misc.c b/src/libgame/misc.c index b50abca7..bf2d2c42 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -786,7 +786,12 @@ static char *get_corrected_real_name(char *real_name) #if defined(PLATFORM_UNIX) static struct passwd *getPasswdEntry(void) { +#if defined(PLATFORM_EMSCRIPTEN) + // currently not fully supported; force fallback to default values + return NULL; +#else return getpwuid(getuid()); +#endif } char *getUnixLoginName(void) diff --git a/src/libgame/platform.h b/src/libgame/platform.h index 60ca20f4..438e8de1 100644 --- a/src/libgame/platform.h +++ b/src/libgame/platform.h @@ -153,6 +153,12 @@ #define PLATFORM_STRING "Android" #endif +#if defined(__EMSCRIPTEN__) +#define PLATFORM_EMSCRIPTEN +#undef PLATFORM_STRING +#define PLATFORM_STRING "Emscripten" +#endif + // ============================================================================ // define additional platform keywords for CPU architecture diff --git a/src/libgame/system.h b/src/libgame/system.h index 1bfed543..f02578be 100644 --- a/src/libgame/system.h +++ b/src/libgame/system.h @@ -65,7 +65,11 @@ #define STR_SPECIAL_RENDERING_TARGET "target_texture_only" #define STR_SPECIAL_RENDERING_DOUBLE "stream_and_target_texture" +#if defined(PLATFORM_EMSCRIPTEN) +#define STR_SPECIAL_RENDERING_DEFAULT STR_SPECIAL_RENDERING_BITMAP +#else #define STR_SPECIAL_RENDERING_DEFAULT STR_SPECIAL_RENDERING_DOUBLE +#endif #define SPECIAL_RENDERING_OFF 0 #define SPECIAL_RENDERING_BITMAP 1 diff --git a/src/libgame/zip/ioapi.h b/src/libgame/zip/ioapi.h index 0741de44..0b6555d6 100644 --- a/src/libgame/zip/ioapi.h +++ b/src/libgame/zip/ioapi.h @@ -33,7 +33,7 @@ # define ftello64 ftell # define fseeko64 fseek #else -# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__APPLE__) || defined(__ANDROID__) || defined(__linux__) +# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__APPLE__) || defined(__ANDROID__) || defined(__linux__) || defined(__EMSCRIPTEN__) # define fopen64 fopen # define ftello64 ftello # define fseeko64 fseeko