X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=6fab5c19b378316e002cc4247bc34fcee288a863;hb=95d4b893f159c0b3541b8f0a33d789f44f38646c;hp=1dbc1a5549b53bd94b6710a1a263f27ed6b874fb;hpb=155484223b5bed1218883009f86a6e5714c41bdb;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 1dbc1a55..6fab5c19 100644 --- a/src/tools.c +++ b/src/tools.c @@ -4,7 +4,7 @@ // (c) 1995-2014 by Artsoft Entertainment // Holger Schemel // info@artsoft.org -// http://www.artsoft.org/ +// https://www.artsoft.org/ // ---------------------------------------------------------------------------- // tools.c // ============================================================================ @@ -193,22 +193,6 @@ static char *print_if_not_empty(int element) return s; } -int correctLevelPosX_EM(int lx) -{ - lx -= 1; - lx -= (BorderElement != EL_EMPTY ? 1 : 0); - - return lx; -} - -int correctLevelPosY_EM(int ly) -{ - ly -= 1; - ly -= (BorderElement != EL_EMPTY ? 1 : 0); - - return ly; -} - int getFieldbufferOffsetX_RND(int dir, int pos) { int full_lev_fieldx = lev_fieldx + (BorderElement != EL_EMPTY ? 2 : 0); @@ -307,8 +291,6 @@ static int getLevelFromScreenX_EM(int sx) int px = sx - SX; int lx = LEVELX((px + dx) / TILESIZE_VAR); - lx = correctLevelPosX_EM(lx); - return lx; } @@ -324,8 +306,6 @@ static int getLevelFromScreenY_EM(int sy) int py = sy - SY; int ly = LEVELY((py + dy) / TILESIZE_VAR); - ly = correctLevelPosY_EM(ly); - return ly; } @@ -971,19 +951,13 @@ static void FadeExt(int fade_mask, int fade_mode, int fade_type) height = WIN_YSIZE; } - if (!setup.fade_screens || - fade_delay == 0 || - fading.fade_mode == FADE_MODE_NONE) - { - if (fade_mode == FADE_MODE_FADE_OUT) - return; - - BlitBitmap(backbuffer, window, x, y, width, height, x, y); - - redraw_mask &= ~fade_mask; + // when switching screens without fading, set fade delay to zero + if (!setup.fade_screens || fading.fade_mode == FADE_MODE_NONE) + fade_delay = 0; + // do not display black frame when fading out without fade delay + if (fade_mode == FADE_MODE_FADE_OUT && fade_delay == 0) return; - } FadeRectangle(x, y, width, height, fade_mode, fade_delay, post_delay, draw_border_function); @@ -999,8 +973,7 @@ static void SetScreenStates_BeforeFadingIn(void) global.anim_status = global.anim_status_next; // store backbuffer with all animations that will be started after fading in - if (fade_type_skip != FADE_MODE_SKIP_FADE_IN) - PrepareFadeBitmap(DRAW_TO_FADE_TARGET); + PrepareFadeBitmap(DRAW_TO_FADE_TARGET); // set screen mode for animations back to fading global.anim_status = GAME_MODE_PSEUDO_FADING; @@ -1023,8 +996,7 @@ static void SetScreenStates_BeforeFadingOut(void) global.anim_status = GAME_MODE_PSEUDO_FADING; // store backbuffer with all animations that will be stopped for fading out - if (fade_type_skip != FADE_MODE_SKIP_FADE_OUT) - PrepareFadeBitmap(DRAW_TO_FADE_SOURCE); + PrepareFadeBitmap(DRAW_TO_FADE_SOURCE); } static void SetScreenStates_AfterFadingOut(void) @@ -6563,12 +6535,12 @@ em_object_mapping_list[GAME_TILE_MAX + 1] = EL_SPRING, -1, -1 }, { - Xspring_e, FALSE, FALSE, - EL_SPRING, -1, -1 + Xspring_e, TRUE, FALSE, + EL_SPRING_RIGHT, -1, -1 }, { - Xspring_w, FALSE, FALSE, - EL_SPRING, -1, -1 + Xspring_w, TRUE, FALSE, + EL_SPRING_LEFT, -1, -1 }, { Xspring_fall, FALSE, FALSE, @@ -6657,11 +6629,11 @@ em_object_mapping_list[GAME_TILE_MAX + 1] = }, { Xpush_spring_e, FALSE, FALSE, - EL_SPRING, -1, MV_BIT_RIGHT + EL_SPRING_RIGHT, -1, MV_BIT_RIGHT }, { Xpush_spring_w, FALSE, FALSE, - EL_SPRING, -1, MV_BIT_LEFT + EL_SPRING_LEFT, -1, MV_BIT_LEFT }, { @@ -6880,11 +6852,11 @@ em_object_mapping_list[GAME_TILE_MAX + 1] = }, { - Xdrip, FALSE, FALSE, + Xdrip, TRUE, FALSE, EL_AMOEBA_DROP, ACTION_GROWING, -1 }, { - Xdrip_fall, TRUE, FALSE, + Xdrip_fall, FALSE, FALSE, EL_AMOEBA_DROP, -1, -1 }, { @@ -8267,6 +8239,11 @@ int getBeltSwitchElementFromBeltNrAndBeltDir(int belt_nr, int belt_dir) return getBeltSwitchElementFromBeltNrAndBeltDirNr(belt_nr, belt_dir_nr); } +boolean swapTiles_EM(boolean is_pre_emc_cave) +{ + return is_pre_emc_cave && leveldir_current->use_emc_tiles; +} + boolean getTeamMode_EM(void) { return game.team_mode || network_playing; @@ -9040,7 +9017,7 @@ static void CheckSaveEngineSnapshot_EM(byte action[MAX_PLAYERS], int frame, boolean any_player_snapping, boolean any_player_dropping) { - if (frame == 0 && !any_player_dropping) + if (frame == 7 && !any_player_dropping) { if (!local_player->was_waiting) { @@ -9098,7 +9075,7 @@ void CheckSingleStepMode_EM(byte action[MAX_PLAYERS], int frame, boolean any_player_dropping) { if (tape.single_step && tape.recording && !tape.pausing) - if (frame == 0 && !any_player_dropping) + if (frame == 7 && !any_player_dropping) TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); CheckSaveEngineSnapshot_EM(action, frame, any_player_moving, @@ -9266,51 +9243,59 @@ void PlaySoundSelecting(void) #endif } -void ToggleFullscreenOrChangeWindowScalingIfNeeded(void) +void ToggleFullscreenIfNeeded(void) { - boolean change_fullscreen = (setup.fullscreen != - video.fullscreen_enabled); - boolean change_window_scaling_percent = (!video.fullscreen_enabled && - setup.window_scaling_percent != - video.window_scaling_percent); - - if (change_window_scaling_percent && video.fullscreen_enabled) + // if setup and video fullscreen state are already matching, nothing do do + if (setup.fullscreen == video.fullscreen_enabled || + !video.fullscreen_available) return; - if (!change_window_scaling_percent && !video.fullscreen_available) - return; + SDLSetWindowFullscreen(setup.fullscreen); - if (change_window_scaling_percent) - { - SDLSetWindowScaling(setup.window_scaling_percent); + // set setup value according to successfully changed fullscreen mode + setup.fullscreen = video.fullscreen_enabled; +} +void ChangeWindowScalingIfNeeded(void) +{ + // if setup and video window scaling are already matching, nothing do do + if (setup.window_scaling_percent == video.window_scaling_percent || + video.fullscreen_enabled) return; - } - else if (change_fullscreen) - { - SDLSetWindowFullscreen(setup.fullscreen); - // set setup value according to successfully changed fullscreen mode - setup.fullscreen = video.fullscreen_enabled; + SDLSetWindowScaling(setup.window_scaling_percent); + // set setup value according to successfully changed window scaling + setup.window_scaling_percent = video.window_scaling_percent; +} + +void ChangeVsyncModeIfNeeded(void) +{ + int setup_vsync_mode = VSYNC_MODE_STR_TO_INT(setup.vsync_mode); + int video_vsync_mode = video.vsync_mode; + + // if setup and video vsync mode are already matching, nothing do do + if (setup_vsync_mode == video_vsync_mode) return; - } - if (change_fullscreen || - change_window_scaling_percent) + // if renderer is using OpenGL, vsync mode can directly be changed + SDLSetScreenVsyncMode(setup.vsync_mode); + + // if vsync mode unchanged, try re-creating renderer to set vsync mode + if (video.vsync_mode == video_vsync_mode) { Bitmap *tmp_backbuffer = CreateBitmap(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH); - // save backbuffer content which gets lost when toggling fullscreen mode + // save backbuffer content which gets lost when re-creating screen BlitBitmap(backbuffer, tmp_backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); - if (change_window_scaling_percent) - { - // keep window mode, but change window scaling - video.fullscreen_enabled = TRUE; // force new window scaling - } + // force re-creating screen and renderer to set new vsync mode + video.fullscreen_enabled = !setup.fullscreen; - // toggle fullscreen + // when creating new renderer, destroy textures linked to old renderer + FreeAllImageTextures(); // needs old renderer to free the textures + + // re-create screen and renderer (including change of vsync mode) ChangeVideoModeIfNeeded(setup.fullscreen); // set setup value according to successfully changed fullscreen mode @@ -9318,12 +9303,17 @@ void ToggleFullscreenOrChangeWindowScalingIfNeeded(void) // restore backbuffer content from temporary backbuffer backup bitmap BlitBitmap(tmp_backbuffer, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); - FreeBitmap(tmp_backbuffer); // update visible window/screen BlitBitmap(backbuffer, window, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); + + // when changing vsync mode, re-create textures for new renderer + InitImageTextures(); } + + // set setup value according to successfully changed vsync mode + setup.vsync_mode = VSYNC_MODE_INT_TO_STR(video.vsync_mode); } static void JoinRectangles(int *x, int *y, int *width, int *height, @@ -9664,6 +9654,6 @@ void ChangeViewportPropertiesIfNeeded(void) if (init_em_graphics) { - InitGraphicInfo_EM(); + InitGraphicInfo_EM(); } }