X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsystem.c;h=225738cc361ece7da2e18f944cd4082ba529ce6f;hb=4afa1876ca64ce2b3084c64ea0c60ea42be92127;hp=156e8a1ba493e4cf326798b56cae5a6acacca98e;hpb=9844da8056347b71669ce3b5bccb4cd01caa71b3;p=rocksndiamonds.git diff --git a/src/libgame/system.c b/src/libgame/system.c index 156e8a1b..225738cc 100644 --- a/src/libgame/system.c +++ b/src/libgame/system.c @@ -40,6 +40,7 @@ struct OverlayInfo overlay; struct ArtworkInfo artwork; struct JoystickInfo joystick; struct SetupInfo setup; +struct UserInfo user; LevelDirTree *leveldir_first_all = NULL; LevelDirTree *leveldir_first = NULL; @@ -79,7 +80,7 @@ void InitProgramInfo(char *argv0, char *config_filename, char *userdata_subdir, program.config_filename = config_filename; program.userdata_subdir = userdata_subdir; - program.userdata_path = getUserGameDataDir(); + program.userdata_path = getMainUserGameDataDir(); program.program_title = program_title; program.window_title = "(undefined)"; @@ -103,6 +104,25 @@ void InitProgramInfo(char *argv0, char *config_filename, char *userdata_subdir, 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; + }); + ); + + // wait for persistent data to be synchronized to memory + while (emscripten_run_script_int("Module.sync_done") == 0) + Delay(20); +#endif } void InitNetworkInfo(boolean enabled, boolean connected, boolean serveronly, @@ -1224,14 +1244,30 @@ 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]; + bitmaps[IMG_BITMAP_PTR_GAME] = bitmaps[IMG_BITMAP_STANDARD]; return; } @@ -1243,7 +1279,7 @@ void ReCreateGameTileSizeBitmap(Bitmap **bitmaps) Bitmap *bitmap_new = ZoomBitmap(bitmap, width, height); bitmaps[IMG_BITMAP_CUSTOM] = bitmap_new; - bitmaps[IMG_BITMAP_GAME] = bitmap_new; + bitmaps[IMG_BITMAP_PTR_GAME] = bitmap_new; } static void CreateScaledBitmaps(Bitmap **bitmaps, int zoom_factor, @@ -1393,9 +1429,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_GAME] = bitmaps[IMG_BITMAP_STANDARD]; + 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 + { + // 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; @@ -1415,6 +1475,9 @@ 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]; } UPDATE_BUSY_STATE();