Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package rocksndiamonds for openSUSE:Factory checked in at 2025-07-18 15:58:17 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/rocksndiamonds (Old) and /work/SRC/openSUSE:Factory/.rocksndiamonds.new.8875 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rocksndiamonds" Fri Jul 18 15:58:17 2025 rev:44 rq:1294010 version:4.4.0.5 Changes: -------- --- /work/SRC/openSUSE:Factory/rocksndiamonds/rocksndiamonds.changes 2025-03-06 14:49:16.074796322 +0100 +++ /work/SRC/openSUSE:Factory/.rocksndiamonds.new.8875/rocksndiamonds.changes 2025-07-18 15:59:28.768850310 +0200 @@ -1,0 +2,20 @@ +Sun Jul 13 19:03:10 UTC 2025 - Carsten Ziepke <kiel...@gmail.com> + +- Update to version 4.4.0.5: + * fixed broken handling of swipe gestures for moving scrollbars + * fixed saving setup for name/team, keyboard and joystick + changes + * fixed saving setup for music and sound button changes + * fixed saving setup for virtual button changes + * fixed support for snapshot when collecting diamond for + BD engine + * fixed bugs with showing correct game buttons for various cases + * fixed game restart button when playing non-score tapes + * fixed updating ffwd/warp tape display when playing native + BD replays + * fixed crash bug caused by freeing custom game tile size + graphics twice + * added "please wait" message screen when importing level set + zip files + +------------------------------------------------------------------- Old: ---- rocksndiamonds-4.4.0.4-linux.tar.gz New: ---- rocksndiamonds-4.4.0.5-linux.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ rocksndiamonds.spec ++++++ --- /var/tmp/diff_new_pack.mq4g72/_old 2025-07-18 15:59:30.636928350 +0200 +++ /var/tmp/diff_new_pack.mq4g72/_new 2025-07-18 15:59:30.644928684 +0200 @@ -17,7 +17,7 @@ Name: rocksndiamonds -Version: 4.4.0.4 +Version: 4.4.0.5 Release: 0 Summary: Colorful Boulderdash'n'Emerald Mine'n'Sokoban'n'Stuff License: GPL-2.0-or-later ++++++ rocksndiamonds-4.4.0.4-linux.tar.gz -> rocksndiamonds-4.4.0.5-linux.tar.gz ++++++ Binary files old/rocksndiamonds-4.4.0.4/rocksndiamonds and new/rocksndiamonds-4.4.0.5/rocksndiamonds differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rocksndiamonds-4.4.0.4/src/confhash.h new/rocksndiamonds-4.4.0.5/src/confhash.h --- old/rocksndiamonds-4.4.0.4/src/confhash.h 2025-02-16 21:16:59.000000000 +0100 +++ new/rocksndiamonds-4.4.0.5/src/confhash.h 2025-05-30 00:18:57.000000000 +0200 @@ -1 +1 @@ -#define SOURCE_HASH_STRING "5696237" +#define SOURCE_HASH_STRING "21e274a7" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rocksndiamonds-4.4.0.4/src/conftime.h new/rocksndiamonds-4.4.0.5/src/conftime.h --- old/rocksndiamonds-4.4.0.4/src/conftime.h 2025-02-16 21:16:59.000000000 +0100 +++ new/rocksndiamonds-4.4.0.5/src/conftime.h 2025-05-30 00:18:57.000000000 +0200 @@ -1 +1 @@ -#define SOURCE_DATE_STRING "2025-02-16 20:01" +#define SOURCE_DATE_STRING "2025-05-29 21:39" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rocksndiamonds-4.4.0.4/src/events.c new/rocksndiamonds-4.4.0.5/src/events.c --- old/rocksndiamonds-4.4.0.4/src/events.c 2025-02-16 21:16:39.000000000 +0100 +++ new/rocksndiamonds-4.4.0.5/src/events.c 2025-05-30 00:18:37.000000000 +0200 @@ -563,10 +563,27 @@ HandleButton(event->x, event->y, button_status, button_status); } -void HandleWheelEvent(WheelEvent *event) +static void HandleWheelEventButton(int button_nr, int steps) { - int button_nr; +#if defined(PLATFORM_WINDOWS) || defined(PLATFORM_MAC) + // accelerated mouse wheel available on Mac and Windows + wheel_steps = steps; +#else + // no accelerated mouse wheel available on Unix/Linux + wheel_steps = DEFAULT_WHEEL_STEPS; +#endif + + motion_status = FALSE; + button_status = button_nr; + HandleButton(0, 0, button_status, -button_nr); + + button_status = MB_RELEASED; + HandleButton(0, 0, button_status, -button_nr); +} + +void HandleWheelEvent(WheelEvent *event) +{ #if DEBUG_EVENTS_WHEEL #if 1 Debug("event:wheel", "mouse == %d, x/y == %d/%d\n", @@ -580,26 +597,11 @@ #endif #endif - button_nr = (event->x < 0 ? MB_WHEEL_LEFT : - event->x > 0 ? MB_WHEEL_RIGHT : - event->y < 0 ? MB_WHEEL_DOWN : - event->y > 0 ? MB_WHEEL_UP : 0); - -#if defined(PLATFORM_WINDOWS) || defined(PLATFORM_MAC) - // accelerated mouse wheel available on Mac and Windows - wheel_steps = (event->x ? ABS(event->x) : ABS(event->y)); -#else - // no accelerated mouse wheel available on Unix/Linux - wheel_steps = DEFAULT_WHEEL_STEPS; -#endif - - motion_status = FALSE; - - button_status = button_nr; - HandleButton(0, 0, button_status, -button_nr); + if (event->x != 0) + HandleWheelEventButton(event->x < 0 ? MB_WHEEL_LEFT : MB_WHEEL_RIGHT, ABS(event->x)); - button_status = MB_RELEASED; - HandleButton(0, 0, button_status, -button_nr); + if (event->y != 0) + HandleWheelEventButton(event->y < 0 ? MB_WHEEL_DOWN : MB_WHEEL_UP, ABS(event->y)); } void HandleWindowEvent(WindowEvent *event) @@ -1592,6 +1594,9 @@ } } + // show "please wait" message, because extracting zip file may take some time + DrawScreenBeforeAddingSet(tree_type); + // extract level or artwork set from zip file to target directory char *top_dir = ExtractZipFileIntoDirectory(filename, directory, tree_type); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rocksndiamonds-4.4.0.4/src/files.c new/rocksndiamonds-4.4.0.5/src/files.c --- old/rocksndiamonds-4.4.0.4/src/files.c 2025-02-16 21:16:39.000000000 +0100 +++ new/rocksndiamonds-4.4.0.5/src/files.c 2025-05-30 00:18:37.000000000 +0200 @@ -13739,8 +13739,10 @@ { &game.button.save, &game.button.stop }, { &game.button.pause2, &game.button.pause }, { &game.button.load, &game.button.play }, + { &game.button.load, &game.button.restart }, { &game.button.undo, &game.button.stop }, { &game.button.redo, &game.button.play }, + { &game.button.redo, &game.button.restart }, { NULL, NULL } }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rocksndiamonds-4.4.0.4/src/game.c new/rocksndiamonds-4.4.0.5/src/game.c --- old/rocksndiamonds-4.4.0.4/src/game.c 2025-02-16 21:16:39.000000000 +0100 +++ new/rocksndiamonds-4.4.0.5/src/game.c 2025-05-30 00:18:37.000000000 +0200 @@ -17577,29 +17577,66 @@ UnmapGadget(game_gadget[i]); } +static void UnmapGameButtonsAtSamePositionIfMapped(int id) +{ + if (isMappedGadget(game_gadget[id])) + UnmapGameButtonsAtSamePosition(id); +} + +static void UnmapGameButtonsAtSamePositionIfMapped_LoadSaveGroup(void) +{ + UnmapGameButtonsAtSamePositionIfMapped(GAME_CTRL_ID_SAVE); + UnmapGameButtonsAtSamePositionIfMapped(GAME_CTRL_ID_PAUSE2); + UnmapGameButtonsAtSamePositionIfMapped(GAME_CTRL_ID_LOAD); +} + +static void UnmapGameButtonsAtSamePositionIfMapped_UndoRedoGroup(void) +{ + UnmapGameButtonsAtSamePositionIfMapped(GAME_CTRL_ID_UNDO); + UnmapGameButtonsAtSamePositionIfMapped(GAME_CTRL_ID_PAUSE2); + UnmapGameButtonsAtSamePositionIfMapped(GAME_CTRL_ID_REDO); +} + +static void UnmapGameButtonsAtSamePositionIfMapped_StopPlayGroup(void) +{ + UnmapGameButtonsAtSamePositionIfMapped(GAME_CTRL_ID_STOP); + UnmapGameButtonsAtSamePositionIfMapped(GAME_CTRL_ID_PAUSE); + UnmapGameButtonsAtSamePositionIfMapped(GAME_CTRL_ID_PLAY); + UnmapGameButtonsAtSamePositionIfMapped(GAME_CTRL_ID_RESTART); + + UnmapGameButtonsAtSamePositionIfMapped(GAME_CTRL_ID_PANEL_STOP); + UnmapGameButtonsAtSamePositionIfMapped(GAME_CTRL_ID_PANEL_PAUSE); + UnmapGameButtonsAtSamePositionIfMapped(GAME_CTRL_ID_PANEL_PLAY); + UnmapGameButtonsAtSamePositionIfMapped(GAME_CTRL_ID_PANEL_RESTART); +} + static void UnmapGameButtonsAtSamePosition_All(void) { + // make sure that only one button is mapped for multiple buttons at the same position + if (setup.show_load_save_buttons) { - UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_SAVE); - UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_PAUSE2); - UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_LOAD); + UnmapGameButtonsAtSamePositionIfMapped_LoadSaveGroup(); + + // if above buttons have redefined position, do the same for the remaining buttons + if (setup.show_undo_redo_buttons) + UnmapGameButtonsAtSamePositionIfMapped_UndoRedoGroup(); + else + UnmapGameButtonsAtSamePositionIfMapped_StopPlayGroup(); } else if (setup.show_undo_redo_buttons) { - UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_UNDO); - UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_PAUSE2); - UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_REDO); + UnmapGameButtonsAtSamePositionIfMapped_UndoRedoGroup(); + + // if above buttons have redefined position, do the same for the remaining buttons + if (setup.show_load_save_buttons) + UnmapGameButtonsAtSamePositionIfMapped_LoadSaveGroup(); + else + UnmapGameButtonsAtSamePositionIfMapped_StopPlayGroup(); } else { - UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_STOP); - UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_PAUSE); - UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_PLAY); - - UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_PANEL_STOP); - UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_PANEL_PAUSE); - UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_PANEL_PLAY); + UnmapGameButtonsAtSamePositionIfMapped_StopPlayGroup(); } } @@ -17887,6 +17924,8 @@ RedrawSoundButtonGadget(id); + SaveSetupIfNeeded(); + break; case SOUND_CTRL_ID_LOOPS: @@ -17910,6 +17949,8 @@ RedrawSoundButtonGadget(id); + SaveSetupIfNeeded(); + break; case SOUND_CTRL_ID_SIMPLE: @@ -17933,6 +17974,8 @@ RedrawSoundButtonGadget(id); + SaveSetupIfNeeded(); + break; default: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rocksndiamonds-4.4.0.4/src/game_bd/bd_caveengine.c new/rocksndiamonds-4.4.0.5/src/game_bd/bd_caveengine.c --- old/rocksndiamonds-4.4.0.4/src/game_bd/bd_caveengine.c 2025-02-16 21:16:39.000000000 +0100 +++ new/rocksndiamonds-4.4.0.5/src/game_bd/bd_caveengine.c 2025-05-30 00:18:37.000000000 +0200 @@ -1183,6 +1183,8 @@ cave->score += cave->diamond_value; cave->diamonds_collected++; + game.snapshot.collected_item = TRUE; + if (cave->diamonds_needed == cave->diamonds_collected) { cave->gate_open = TRUE; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rocksndiamonds-4.4.0.4/src/init.c new/rocksndiamonds-4.4.0.5/src/init.c --- old/rocksndiamonds-4.4.0.4/src/init.c 2025-02-16 21:16:39.000000000 +0100 +++ new/rocksndiamonds-4.4.0.5/src/init.c 2025-05-30 00:18:37.000000000 +0200 @@ -456,6 +456,7 @@ { FreeAllImageTextures(); FreeTileCursorTextures(); + FreeEnvelopeRequestTextures(); } static int getFontSpecialSuffix(void) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rocksndiamonds-4.4.0.4/src/libgame/gadgets.c new/rocksndiamonds-4.4.0.5/src/libgame/gadgets.c --- old/rocksndiamonds-4.4.0.4/src/libgame/gadgets.c 2025-02-16 21:16:39.000000000 +0100 +++ new/rocksndiamonds-4.4.0.5/src/libgame/gadgets.c 2025-05-30 00:18:37.000000000 +0200 @@ -2211,6 +2211,11 @@ // global pointer to gadget actually in use (when mouse button pressed) static struct GadgetInfo *last_gi = NULL; +boolean isMappedGadget(struct GadgetInfo *gi) +{ + return (gi != NULL && gi->mapped); +} + static void MapGadgetExt(struct GadgetInfo *gi, boolean redraw) { if (gi == NULL || gi->deactivated || gi->mapped) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rocksndiamonds-4.4.0.4/src/libgame/gadgets.h new/rocksndiamonds-4.4.0.5/src/libgame/gadgets.h --- old/rocksndiamonds-4.4.0.4/src/libgame/gadgets.h 2025-02-16 21:16:39.000000000 +0100 +++ new/rocksndiamonds-4.4.0.5/src/libgame/gadgets.h 2025-05-30 00:18:37.000000000 +0200 @@ -332,6 +332,7 @@ void ModifyGadget(struct GadgetInfo *, int, ...); void RedrawGadget(struct GadgetInfo *); +boolean isMappedGadget(struct GadgetInfo *); void MapGadget(struct GadgetInfo *); void UnmapGadget(struct GadgetInfo *); void UnmapAllGadgets(void); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rocksndiamonds-4.4.0.4/src/libgame/image.c new/rocksndiamonds-4.4.0.5/src/libgame/image.c --- old/rocksndiamonds-4.4.0.4/src/libgame/image.c 2025-02-16 21:16:39.000000000 +0100 +++ new/rocksndiamonds-4.4.0.5/src/libgame/image.c 2025-05-30 00:18:37.000000000 +0200 @@ -416,6 +416,10 @@ // image color template not yet defined -- copy from original bitmap Bitmap *orig_bitmap = img_info->bitmaps[IMG_BITMAP_PTR_ORIGINAL]; + // this may happen due to configuration problems in "graphicsinfo.conf" (to be checked) + if (orig_bitmap == NULL) + Fail("undefined bitmap for file '%s' -- should not happen", img_info->source_filename); + img_info->template = ZoomBitmap(orig_bitmap, orig_bitmap->width, orig_bitmap->height); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rocksndiamonds-4.4.0.4/src/libgame/sdl.c new/rocksndiamonds-4.4.0.5/src/libgame/sdl.c --- old/rocksndiamonds-4.4.0.4/src/libgame/sdl.c 2025-02-16 21:16:39.000000000 +0100 +++ new/rocksndiamonds-4.4.0.5/src/libgame/sdl.c 2025-05-30 00:18:37.000000000 +0200 @@ -1149,6 +1149,10 @@ SDL_Rect src_rect; SDL_Rect dst_rect; + // check renderer used to create textures + if (bitmap->renderer != sdl_renderer) + Warn("trying to blit textures with invalid renderer!"); + texture = (mask_mode == BLIT_MASKED ? bitmap->texture_masked : bitmap->texture); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rocksndiamonds-4.4.0.4/src/libgame/setup.c new/rocksndiamonds-4.4.0.5/src/libgame/setup.c --- old/rocksndiamonds-4.4.0.4/src/libgame/setup.c 2025-02-16 21:16:39.000000000 +0100 +++ new/rocksndiamonds-4.4.0.5/src/libgame/setup.c 2025-05-30 00:18:37.000000000 +0200 @@ -1788,10 +1788,12 @@ if (node == NULL) return NULL; - if (!node->parent_link && !node->level_group && - skip_sets_without_levels && node->levels == 0) - return cloneTreeNode(node_top, node_parent, node->next, - skip_sets_without_levels); + boolean group_without_levels = (node->level_group && node->level_group_empty); + boolean set_without_levels = (!node->parent_link && !node->level_group && node->levels == 0); + + // if requested, skip level groups and level sets without levels (and continue with next node) + if (skip_sets_without_levels && (group_without_levels || set_without_levels)) + return cloneTreeNode(node_top, node_parent, node->next, skip_sets_without_levels); node_new = getTreeInfoCopy(node); // copy complete node @@ -2925,6 +2927,7 @@ { TYPE_INTEGER, &ldi.sort_priority, "sort_priority" }, { TYPE_BOOLEAN, &ldi.latest_engine, "latest_engine" }, { TYPE_BOOLEAN, &ldi.level_group, "level_group" }, + { TYPE_BOOLEAN, &ldi.level_group_empty, "level_group_empty" }, { TYPE_BOOLEAN, &ldi.readonly, "readonly" }, { TYPE_STRING, &ldi.graphics_set_ecs, "graphics_set.old" }, { TYPE_STRING, &ldi.graphics_set_aga, "graphics_set.new" }, @@ -3045,6 +3048,7 @@ ti->first_level = 0; ti->last_level = 0; ti->level_group = FALSE; + ti->level_group_empty = FALSE; ti->handicap_level = 0; ti->readonly = TRUE; ti->handicap = TRUE; @@ -3133,6 +3137,7 @@ ti->first_level = parent->first_level; ti->last_level = parent->last_level; ti->level_group = FALSE; + ti->level_group_empty = parent->level_group_empty; ti->handicap_level = parent->handicap_level; ti->readonly = parent->readonly; ti->handicap = parent->handicap; @@ -3205,6 +3210,7 @@ ti_copy->latest_engine = ti->latest_engine; ti_copy->level_group = ti->level_group; + ti_copy->level_group_empty = ti->level_group_empty; ti_copy->parent_link = ti->parent_link; ti_copy->is_copy = ti->is_copy; ti_copy->in_user_dir = ti->in_user_dir; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rocksndiamonds-4.4.0.4/src/libgame/system.c new/rocksndiamonds-4.4.0.5/src/libgame/system.c --- old/rocksndiamonds-4.4.0.4/src/libgame/system.c 2025-02-16 21:16:39.000000000 +0100 +++ new/rocksndiamonds-4.4.0.5/src/libgame/system.c 2025-05-30 00:18:37.000000000 +0200 @@ -1393,13 +1393,27 @@ bitmaps[IMG_BITMAP_2x2] = tmp_bitmap_16; bitmaps[IMG_BITMAP_1x1] = tmp_bitmap_32; - if (width_0 != width_1) + // store the "game" bitmap (with game tile sized graphics), if not already stored + + int tmp_bitmap_0_nr = -1; + + for (i = 0; i < NUM_IMG_BITMAPS; i++) + if (bitmaps[i] == tmp_bitmap_0) + tmp_bitmap_0_nr = i; + + if (tmp_bitmap_0_nr == -1) // game tile size bitmap not stored + { + // store pointer of game tile size bitmap (not used for any other size) bitmaps[IMG_BITMAP_CUSTOM] = tmp_bitmap_0; - if (bitmaps[IMG_BITMAP_CUSTOM]) + // set game bitmap pointer to game tile size bitmap of other size bitmaps[IMG_BITMAP_PTR_GAME] = bitmaps[IMG_BITMAP_CUSTOM]; + } else - bitmaps[IMG_BITMAP_PTR_GAME] = bitmaps[IMG_BITMAP_STANDARD]; + { + // set game bitmap pointer to corresponding sized bitmap + bitmaps[IMG_BITMAP_PTR_GAME] = bitmaps[tmp_bitmap_0_nr]; + } // store the "final" (up-scaled) original bitmap, if not already stored diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rocksndiamonds-4.4.0.4/src/libgame/system.h new/rocksndiamonds-4.4.0.5/src/libgame/system.h --- old/rocksndiamonds-4.4.0.4/src/libgame/system.h 2025-02-16 21:16:39.000000000 +0100 +++ new/rocksndiamonds-4.4.0.5/src/libgame/system.h 2025-05-30 00:18:37.000000000 +0200 @@ -1740,6 +1740,7 @@ boolean latest_engine; // force level set to use the latest game engine boolean level_group; // directory contains more level series directories + boolean level_group_empty; // directory contains only empty level series directories boolean parent_link; // entry links back to parent directory boolean is_copy; // this entry is a copy of another entry in the tree boolean in_user_dir; // user defined levels are stored in home directory diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rocksndiamonds-4.4.0.4/src/main.c new/rocksndiamonds-4.4.0.5/src/main.c --- old/rocksndiamonds-4.4.0.4/src/main.c 2025-02-16 21:16:39.000000000 +0100 +++ new/rocksndiamonds-4.4.0.5/src/main.c 2025-05-30 00:18:37.000000000 +0200 @@ -9534,15 +9534,7 @@ Print("%s", getProgramInitString()); if (!strEqual(getProgramVersionString(), getProgramRealVersionString())) - { - Print(" (%s %d.%d.%d.%d%s)", - PROGRAM_TITLE_STRING, - PROGRAM_VERSION_SUPER, - PROGRAM_VERSION_MAJOR, - PROGRAM_VERSION_MINOR, - PROGRAM_VERSION_PATCH, - PROGRAM_VERSION_EXTRA); - } + Print(" (%s %s)", PROGRAM_TITLE_STRING, getVersionString(GAME_VERSION_ACTUAL_FULL)); Print("\n"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rocksndiamonds-4.4.0.4/src/main.h new/rocksndiamonds-4.4.0.5/src/main.h --- old/rocksndiamonds-4.4.0.4/src/main.h 2025-02-16 21:16:39.000000000 +0100 +++ new/rocksndiamonds-4.4.0.5/src/main.h 2025-05-30 00:18:37.000000000 +0200 @@ -3131,7 +3131,7 @@ #define PROGRAM_VERSION_SUPER 4 #define PROGRAM_VERSION_MAJOR 4 #define PROGRAM_VERSION_MINOR 0 -#define PROGRAM_VERSION_PATCH 4 +#define PROGRAM_VERSION_PATCH 5 #define PROGRAM_VERSION_STABLE 1 #define PROGRAM_VERSION_EXTRA 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rocksndiamonds-4.4.0.4/src/screens.c new/rocksndiamonds-4.4.0.5/src/screens.c --- old/rocksndiamonds-4.4.0.4/src/screens.c 2025-02-16 21:16:39.000000000 +0100 +++ new/rocksndiamonds-4.4.0.5/src/screens.c 2025-05-30 00:18:37.000000000 +0200 @@ -2526,6 +2526,8 @@ DrawCursorAndText_Main(MAIN_CONTROL_NAME, TRUE, FALSE); DrawPreviewPlayers(); + + SaveSetupIfNeeded(); } static void HandleMainMenu_SelectLevel(int step, int direction, @@ -9891,6 +9893,8 @@ BackToFront(); ClearEventQueue(); + + SaveSetupIfNeeded(); } DrawSetupScreen_Input(); @@ -10325,6 +10329,9 @@ BackToFront(); ClearEventQueue(); + + if (success) + SaveSetupIfNeeded(); } DrawSetupScreen_Input(); @@ -10652,6 +10659,8 @@ BackToFront(); ClearEventQueue(); + + SaveSetupIfNeeded(); } } @@ -11846,6 +11855,27 @@ return FALSE; } +void DrawScreenBeforeAddingSet(int tree_type) +{ + int font_nr_1 = FC_GREEN; + int font_nr_2 = FC_YELLOW; + int ypos_1 = 120; + int ypos_2 = 150; + char message_1[100]; + char message_2[100]; + char *set_type_text = (tree_type == TREE_TYPE_LEVEL_DIR ? "level" : "artwork"); + + sprintf(message_1, "Adding new %s set!", set_type_text); + sprintf(message_2, "Please wait!"); + + ClearField(); + + DrawTextSCentered(ypos_1, font_nr_1, message_1); + DrawTextSCentered(ypos_2, font_nr_2, message_2); + + BackToFront(); +} + void DrawScreenAfterAddingSet(char *tree_subdir_new, int tree_type) { // get tree info node of newly added level or artwork set diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rocksndiamonds-4.4.0.4/src/screens.h new/rocksndiamonds-4.4.0.5/src/screens.h --- old/rocksndiamonds-4.4.0.4/src/screens.h 2025-02-16 21:16:39.000000000 +0100 +++ new/rocksndiamonds-4.4.0.5/src/screens.h 2025-05-30 00:18:37.000000000 +0200 @@ -23,6 +23,7 @@ void DrawAndFadeInMainMenu(int); void DrawMainMenu(void); void DrawHallOfFame(int); +void DrawScreenBeforeAddingSet(int); void DrawScreenAfterAddingSet(char *, int); void DrawInfoScreen_FromMainMenu(int); void DrawInfoScreen_FromInitGame(int); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rocksndiamonds-4.4.0.4/src/tape.c new/rocksndiamonds-4.4.0.5/src/tape.c --- old/rocksndiamonds-4.4.0.4/src/tape.c 2025-02-16 21:16:39.000000000 +0100 +++ new/rocksndiamonds-4.4.0.5/src/tape.c 2025-05-30 00:18:37.000000000 +0200 @@ -404,6 +404,23 @@ DrawVideoDisplaySymbol(state); } +static void DrawVideoDisplayCurrentState_PlayAction(boolean update_draw_label_on) +{ + int state = 0; + + if (tape.warp_forward) + state |= VIDEO_STATE_WARP(update_draw_label_on); + else if (tape.fast_forward) + state |= VIDEO_STATE_FFWD(update_draw_label_on); + + if (tape.pause_before_end) + state |= VIDEO_STATE_PBEND(update_draw_label_on); + + // draw labels and symbols separately to prevent labels overlapping symbols + DrawVideoDisplayLabel(state); + DrawVideoDisplaySymbol(state); +} + void DrawCompleteVideoDisplay(void) { struct GraphicInfo *g_tape = &graphic_info[IMG_BACKGROUND_TAPE]; @@ -1056,7 +1073,13 @@ return NULL; if (tape.bd_replay && !bd_replay) + { + // skip tape records without game actions for native BD tapes (but update tape display) + if (update_video_display && !tape.deactivate_display) + DrawVideoDisplayCurrentState_PlayAction(update_draw_label_on); + return NULL; + } if (tape.pause_before_end) // stop some seconds before end of tape { @@ -1091,21 +1114,7 @@ } if (update_video_display && !tape.deactivate_display) - { - int state = 0; - - if (tape.warp_forward) - state |= VIDEO_STATE_WARP(update_draw_label_on); - else if (tape.fast_forward) - state |= VIDEO_STATE_FFWD(update_draw_label_on); - - if (tape.pause_before_end) - state |= VIDEO_STATE_PBEND(update_draw_label_on); - - // draw labels and symbols separately to prevent labels overlapping symbols - DrawVideoDisplayLabel(state); - DrawVideoDisplaySymbol(state); - } + DrawVideoDisplayCurrentState_PlayAction(update_draw_label_on); for (i = 0; i < MAX_TAPE_ACTIONS; i++) action[i] = tape.pos[tape.counter].action[i]; @@ -1404,7 +1413,7 @@ void TapeRestartGame(void) { - if (score_info_tape_play) + if (tape.playing) { TapeStartGamePlaying(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rocksndiamonds-4.4.0.4/src/tools.c new/rocksndiamonds-4.4.0.5/src/tools.c --- old/rocksndiamonds-4.4.0.4/src/tools.c 2025-02-16 21:16:39.000000000 +0100 +++ new/rocksndiamonds-4.4.0.5/src/tools.c 2025-05-30 00:18:37.000000000 +0200 @@ -3131,6 +3131,11 @@ } } +void FreeEnvelopeRequestTextures(void) +{ + SDLFreeBitmapTextures(menu.request.bitmap); +} + static void setRequestBasePosition(int *x, int *y) { int sx_base, sy_base; @@ -5128,6 +5133,9 @@ game.request_active = FALSE; + // required after resetting "game.request_active" to remove last envelope animation frame + BackToFront(); + return result; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rocksndiamonds-4.4.0.4/src/tools.h new/rocksndiamonds-4.4.0.5/src/tools.h --- old/rocksndiamonds-4.4.0.4/src/tools.h 2025-02-16 21:16:39.000000000 +0100 +++ new/rocksndiamonds-4.4.0.5/src/tools.h 2025-05-30 00:18:37.000000000 +0200 @@ -205,6 +205,7 @@ void ShowEnvelope(int); void ShowEnvelopeDoor(char *, int); void DrawEnvelopeRequestToScreen(int); +void FreeEnvelopeRequestTextures(void); void DrawLevel(int); void DrawSizedLevel(int, int, int, int, int);