X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsystem.c;h=3eb9c62d55dc4e42d32de21e5459c876d7542f3d;hb=746d91a67b5059c607e8e6bd0453e6e0738ffe45;hp=a2f7ebeccd7d199716400db3fbeb14363f8fdbb4;hpb=ba6af23b5637bcd5fa4e247dc336b45ba1e6fd1a;p=rocksndiamonds.git diff --git a/src/libgame/system.c b/src/libgame/system.c index a2f7ebec..3eb9c62d 100644 --- a/src/libgame/system.c +++ b/src/libgame/system.c @@ -103,26 +103,9 @@ void InitProgramInfo(char *argv0, char *config_filename, char *userdata_subdir, program.log_file[LOG_OUT_ID] = program.log_file_default[LOG_OUT_ID] = stdout; program.log_file[LOG_ERR_ID] = program.log_file_default[LOG_ERR_ID] = stderr; - program.headless = FALSE; - -#if defined(PLATFORM_EMSCRIPTEN) - EM_ASM - ( - Module.sync_done = 0; - - FS.mkdir('/persistent'); // create persistent data directory - FS.mount(IDBFS, {}, '/persistent'); // mount with IDBFS filesystem type - FS.syncfs(true, function(err) // sync persistent data into memory - { - assert(!err); - Module.sync_done = 1; - }); - ); + program.api_thread_count = 0; - // wait for persistent data to be synchronized to memory - while (emscripten_run_script_int("Module.sync_done") == 0) - Delay(20); -#endif + program.headless = FALSE; } void InitNetworkInfo(boolean enabled, boolean connected, boolean serveronly, @@ -146,33 +129,8 @@ void InitRuntimeInfo() #else runtime.uses_touch_device = FALSE; #endif -} - -void InitScoresInfo(void) -{ - char *global_scores_dir = getPath2(getCommonDataDir(), SCORES_DIRECTORY); - - program.global_scores = directoryExists(global_scores_dir); - program.many_scores_per_name = !program.global_scores; - -#if 0 - if (options.debug) - { - if (program.global_scores) - { - Debug("internal:path", "Using global, multi-user scores directory '%s'.", - global_scores_dir); - Debug("internal:path", "Remove to enable single-user scores directory."); - Debug("internal:path", "(This enables multipe score entries per user.)"); - } - else - { - Debug("internal:path", "Using private, single-user scores directory."); - } - } -#endif - free(global_scores_dir); + runtime.use_api_server = setup.use_api_server; } void SetWindowTitle(void) @@ -206,6 +164,8 @@ void InitExitFunction(void (*exit_function)(int)) void InitPlatformDependentStuff(void) { + InitEmscriptenFilesystem(); + // this is initialized in GetOptions(), but may already be used before options.verbose = TRUE; @@ -1235,7 +1195,7 @@ void ReloadCustomImage(Bitmap *bitmap, char *basename) free(new_bitmap); } -static Bitmap *ZoomBitmap(Bitmap *src_bitmap, int zoom_width, int zoom_height) +Bitmap *ZoomBitmap(Bitmap *src_bitmap, int zoom_width, int zoom_height) { return SDLZoomBitmap(src_bitmap, zoom_width, zoom_height); } @@ -1244,14 +1204,31 @@ void ReCreateGameTileSizeBitmap(Bitmap **bitmaps) { if (bitmaps[IMG_BITMAP_CUSTOM]) { - FreeBitmap(bitmaps[IMG_BITMAP_CUSTOM]); + // check if original sized bitmap points to custom sized bitmap + if (bitmaps[IMG_BITMAP_PTR_ORIGINAL] == bitmaps[IMG_BITMAP_CUSTOM]) + { + SDLFreeBitmapTextures(bitmaps[IMG_BITMAP_PTR_ORIGINAL]); + + // keep pointer of previous custom size bitmap + bitmaps[IMG_BITMAP_OTHER] = bitmaps[IMG_BITMAP_CUSTOM]; + + // set original bitmap pointer to scaled original bitmap of other size + bitmaps[IMG_BITMAP_PTR_ORIGINAL] = bitmaps[IMG_BITMAP_OTHER]; + + SDLCreateBitmapTextures(bitmaps[IMG_BITMAP_PTR_ORIGINAL]); + } + else + { + FreeBitmap(bitmaps[IMG_BITMAP_CUSTOM]); + } bitmaps[IMG_BITMAP_CUSTOM] = NULL; } if (gfx.game_tile_size == gfx.standard_tile_size) { - bitmaps[IMG_BITMAP_GAME] = bitmaps[IMG_BITMAP_STANDARD]; + // set game bitmap pointer to standard sized bitmap (already existing) + bitmaps[IMG_BITMAP_PTR_GAME] = bitmaps[IMG_BITMAP_STANDARD]; return; } @@ -1260,10 +1237,10 @@ void ReCreateGameTileSizeBitmap(Bitmap **bitmaps) int width = bitmap->width * gfx.game_tile_size / gfx.standard_tile_size;; int height = bitmap->height * gfx.game_tile_size / gfx.standard_tile_size;; - Bitmap *bitmap_new = ZoomBitmap(bitmap, width, height); + bitmaps[IMG_BITMAP_CUSTOM] = ZoomBitmap(bitmap, width, height); - bitmaps[IMG_BITMAP_CUSTOM] = bitmap_new; - bitmaps[IMG_BITMAP_GAME] = bitmap_new; + // set game bitmap pointer to custom sized bitmap (newly created) + bitmaps[IMG_BITMAP_PTR_GAME] = bitmaps[IMG_BITMAP_CUSTOM]; } static void CreateScaledBitmaps(Bitmap **bitmaps, int zoom_factor, @@ -1413,9 +1390,33 @@ static void CreateScaledBitmaps(Bitmap **bitmaps, int zoom_factor, bitmaps[IMG_BITMAP_CUSTOM] = tmp_bitmap_0; if (bitmaps[IMG_BITMAP_CUSTOM]) - bitmaps[IMG_BITMAP_GAME] = bitmaps[IMG_BITMAP_CUSTOM]; + bitmaps[IMG_BITMAP_PTR_GAME] = bitmaps[IMG_BITMAP_CUSTOM]; + else + bitmaps[IMG_BITMAP_PTR_GAME] = bitmaps[IMG_BITMAP_STANDARD]; + + // store the "final" (up-scaled) original bitmap, if not already stored + + int tmp_bitmap_final_nr = -1; + + for (i = 0; i < NUM_IMG_BITMAPS; i++) + if (bitmaps[i] == tmp_bitmap_final) + tmp_bitmap_final_nr = i; + + if (tmp_bitmap_final_nr == -1) // scaled original bitmap not stored + { + // store pointer of scaled original bitmap (not used for any other size) + bitmaps[IMG_BITMAP_OTHER] = tmp_bitmap_final; + + // set original bitmap pointer to scaled original bitmap of other size + bitmaps[IMG_BITMAP_PTR_ORIGINAL] = bitmaps[IMG_BITMAP_OTHER]; + } else - bitmaps[IMG_BITMAP_GAME] = bitmaps[IMG_BITMAP_STANDARD]; + { + // set original bitmap pointer to corresponding sized bitmap + bitmaps[IMG_BITMAP_PTR_ORIGINAL] = bitmaps[tmp_bitmap_final_nr]; + } + + // free the "old" (unscaled) original bitmap, if not already stored boolean free_old_bitmap = TRUE; @@ -1435,6 +1436,12 @@ static void CreateScaledBitmaps(Bitmap **bitmaps, int zoom_factor, else { bitmaps[IMG_BITMAP_32x32] = tmp_bitmap_1; + + // set original bitmap pointer to corresponding sized bitmap + bitmaps[IMG_BITMAP_PTR_ORIGINAL] = bitmaps[IMG_BITMAP_32x32]; + + if (old_bitmap != tmp_bitmap_1) + FreeBitmap(old_bitmap); } UPDATE_BUSY_STATE(); @@ -1450,12 +1457,18 @@ void CreateBitmapWithSmallBitmaps(Bitmap **bitmaps, int zoom_factor, void CreateBitmapTextures(Bitmap **bitmaps) { - SDLCreateBitmapTextures(bitmaps[IMG_BITMAP_STANDARD]); + if (bitmaps[IMG_BITMAP_PTR_ORIGINAL] != NULL) + SDLCreateBitmapTextures(bitmaps[IMG_BITMAP_PTR_ORIGINAL]); + else + SDLCreateBitmapTextures(bitmaps[IMG_BITMAP_STANDARD]); } void FreeBitmapTextures(Bitmap **bitmaps) { - SDLFreeBitmapTextures(bitmaps[IMG_BITMAP_STANDARD]); + if (bitmaps[IMG_BITMAP_PTR_ORIGINAL] != NULL) + SDLFreeBitmapTextures(bitmaps[IMG_BITMAP_PTR_ORIGINAL]); + else + SDLFreeBitmapTextures(bitmaps[IMG_BITMAP_STANDARD]); } void ScaleBitmap(Bitmap **bitmaps, int zoom_factor) @@ -1867,3 +1880,43 @@ void ClearJoystickState(void) { SDLClearJoystickState(); } + + +// ============================================================================ +// Emscripten functions +// ============================================================================ + +void InitEmscriptenFilesystem(void) +{ +#if defined(PLATFORM_EMSCRIPTEN) + EM_ASM + ( + Module.sync_done = 0; + + FS.mkdir('/persistent'); // create persistent data directory + FS.mount(IDBFS, {}, '/persistent'); // mount with IDBFS filesystem type + FS.syncfs(true, function(err) // sync persistent data into memory + { + assert(!err); + Module.sync_done = 1; + }); + ); + + // wait for persistent data to be synchronized to memory + while (emscripten_run_script_int("Module.sync_done") == 0) + Delay(20); +#endif +} + +void SyncEmscriptenFilesystem(void) +{ +#if defined(PLATFORM_EMSCRIPTEN) + EM_ASM + ( + FS.syncfs(function(err) + { + assert(!err); + }); + ); +#endif +}