Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package rocksndiamonds for openSUSE:Factory 
checked in at 2026-06-25 10:57:35
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/rocksndiamonds (Old)
 and      /work/SRC/openSUSE:Factory/.rocksndiamonds.new.2088 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "rocksndiamonds"

Thu Jun 25 10:57:35 2026 rev:48 rq:1361600 version:4.4.2.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/rocksndiamonds/rocksndiamonds.changes    
2026-06-09 14:31:32.080461103 +0200
+++ /work/SRC/openSUSE:Factory/.rocksndiamonds.new.2088/rocksndiamonds.changes  
2026-06-25 10:59:47.794717848 +0200
@@ -1,0 +2,23 @@
+Sun Jun 21 13:44:15 UTC 2026 - Martin Hauke <[email protected]>
+
+- Update to version 4.4.2.2
+  * added checkbox to use fast opening and closing exits and gates.
+  * added support for non-masked drawing for game elements info
+    screen.
+  * added truncating text if it does not fit into the playfield
+    viewport.
+  * added flags for DC style behavior to fix a few old tapes.
+  * fixed visual bug with adjusting scrollbar while dragging it.
+  * fixed running program in headless mode.
+
+-------------------------------------------------------------------
+Sat Jun 13 09:16:25 UTC 2026 - Martin Hauke <[email protected]>
+
+- Update to version 4.4.2.1
+  * fixed animation of BD style rocket.
+  * fixed animation when collecting BD style clock.
+  * fixed animation when releasing BD diamond from wall with BD
+    jackhammer.
+  * changed pause button to behave like pause key for tape recorder
+
+-------------------------------------------------------------------

Old:
----
  rocksndiamonds-4.4.2.0-linux.tar.gz

New:
----
  rocksndiamonds-4.4.2.2-linux.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ rocksndiamonds.spec ++++++
--- /var/tmp/diff_new_pack.J9bMAV/_old  2026-06-25 10:59:48.262734008 +0200
+++ /var/tmp/diff_new_pack.J9bMAV/_new  2026-06-25 10:59:48.262734008 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           rocksndiamonds
-Version:        4.4.2.0
+Version:        4.4.2.2
 Release:        0
 Summary:        Colorful Boulderdash'n'Emerald Mine'n'Sokoban'n'Stuff
 License:        GPL-2.0-or-later

++++++ rocksndiamonds-4.4.2.0-linux.tar.gz -> 
rocksndiamonds-4.4.2.2-linux.tar.gz ++++++
Binary files old/rocksndiamonds-4.4.2.0/rocksndiamonds and 
new/rocksndiamonds-4.4.2.2/rocksndiamonds differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rocksndiamonds-4.4.2.0/src/conf_gfx.c 
new/rocksndiamonds-4.4.2.2/src/conf_gfx.c
--- old/rocksndiamonds-4.4.2.0/src/conf_gfx.c   2026-06-07 15:58:16.000000000 
+0200
+++ new/rocksndiamonds-4.4.2.2/src/conf_gfx.c   2026-06-20 23:18:45.000000000 
+0200
@@ -1477,7 +1477,6 @@
   { "bdx_rocket.ypos",                                 "14"                    
        },
   { "bdx_rocket.frames",                               "8"                     
        },
   { "bdx_rocket.delay",                                        "4"             
                },
-  { "bdx_rocket.vertical",                             "true"                  
        },
   { "bdx_rocket.right",                                        "RocksBD.png"   
                },
   { "bdx_rocket.right.xpos",                           "0"                     
        },
   { "bdx_rocket.right.ypos",                           "14"                    
        },
@@ -9741,6 +9740,8 @@
 
   { "menu.tile_size.INFO[ELEMENTS]",                   "-1"                    
        },
 
+  { "menu.draw_masked.INFO[ELEMENTS]",                 "true"                  
        },
+
   { "menu.left_spacing.NAMES",                         "0"                     
        },
   { "menu.left_spacing.LEVELS",                                "0"             
                },
   { "menu.left_spacing.LEVELNR",                       "0"                     
        },
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rocksndiamonds-4.4.2.0/src/conf_var.c 
new/rocksndiamonds-4.4.2.2/src/conf_var.c
--- old/rocksndiamonds-4.4.2.0/src/conf_var.c   2026-06-07 15:58:17.000000000 
+0200
+++ new/rocksndiamonds-4.4.2.2/src/conf_var.c   2026-06-20 23:18:46.000000000 
+0200
@@ -3099,6 +3099,10 @@
     &menu.tile_size_info[GFX_SPECIAL_ARG_INFO_ELEMENTS]
   },
   {
+    "menu.draw_masked.INFO[ELEMENTS]",
+    &menu.draw_masked_info[GFX_SPECIAL_ARG_INFO_ELEMENTS]
+  },
+  {
     "menu.left_spacing.NAMES",
     &menu.left_spacing[GFX_SPECIAL_ARG_NAMES]
   },
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rocksndiamonds-4.4.2.0/src/confhash.h 
new/rocksndiamonds-4.4.2.2/src/confhash.h
--- old/rocksndiamonds-4.4.2.0/src/confhash.h   2026-06-07 15:58:38.000000000 
+0200
+++ new/rocksndiamonds-4.4.2.2/src/confhash.h   2026-06-20 23:19:06.000000000 
+0200
@@ -1 +1 @@
-#define SOURCE_HASH_STRING "6102999a"
+#define SOURCE_HASH_STRING "43413116"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rocksndiamonds-4.4.2.0/src/conftime.h 
new/rocksndiamonds-4.4.2.2/src/conftime.h
--- old/rocksndiamonds-4.4.2.0/src/conftime.h   2026-06-07 15:58:38.000000000 
+0200
+++ new/rocksndiamonds-4.4.2.2/src/conftime.h   2026-06-20 23:19:06.000000000 
+0200
@@ -1 +1 @@
-#define SOURCE_DATE_STRING "2026-06-07 13:57"
+#define SOURCE_DATE_STRING "2026-06-20 21:15"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rocksndiamonds-4.4.2.0/src/editor.c 
new/rocksndiamonds-4.4.2.2/src/editor.c
--- old/rocksndiamonds-4.4.2.0/src/editor.c     2026-06-07 15:58:16.000000000 
+0200
+++ new/rocksndiamonds-4.4.2.2/src/editor.c     2026-06-20 23:18:45.000000000 
+0200
@@ -861,6 +861,8 @@
   GADGET_ID_DC_KEEP_WALL_CONTENT,
   GADGET_ID_DC_NO_TIMEOUT_WITH_SHIELD,
   GADGET_ID_DC_LIMIT_MAX_SHIELD_TIME,
+  GADGET_ID_DC_FAST_OPENING_EXITS,
+  GADGET_ID_DC_FAST_OPENING_GATES,
   GADGET_ID_USE_DIGGABLE_LANDMINES,
   GADGET_ID_USE_SPRING_BUG,
   GADGET_ID_USE_TIME_ORB_BUG,
@@ -1332,6 +1334,8 @@
   ED_CHECKBUTTON_ID_DC_KEEP_WALL_CONTENT,
   ED_CHECKBUTTON_ID_DC_NO_TIMEOUT_WITH_SHIELD,
   ED_CHECKBUTTON_ID_DC_LIMIT_MAX_SHIELD_TIME,
+  ED_CHECKBUTTON_ID_DC_FAST_OPENING_EXITS,
+  ED_CHECKBUTTON_ID_DC_FAST_OPENING_GATES,
   ED_CHECKBUTTON_ID_USE_DIGGABLE_LANDMINES,
   ED_CHECKBUTTON_ID_USE_SPRING_BUG,
   ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG,
@@ -4569,6 +4573,22 @@
     "Limit maximum shield duration",           "Reset shield time instead of 
adding it"
   },
   {
+    ED_CHECKBUTTON_ID_DC_FAST_OPENING_EXITS,
+    ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(1),
+    GADGET_ID_DC_FAST_OPENING_EXITS,           GADGET_ID_NONE,
+    &level.dc_fast_opening_exits,
+    NULL, NULL,
+    "Use fast opening/closing exits",          "Use DC style opening and 
closing speed"
+  },
+  {
+    ED_CHECKBUTTON_ID_DC_FAST_OPENING_GATES,
+    ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(0),
+    GADGET_ID_DC_FAST_OPENING_GATES,           GADGET_ID_NONE,
+    &level.dc_fast_opening_gates,
+    NULL, NULL,
+    "Use fast opening/closing gates",          "Use DC style opening and 
closing speed"
+  },
+  {
     ED_CHECKBUTTON_ID_USE_DIGGABLE_LANDMINES,
     ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(0),
     GADGET_ID_USE_DIGGABLE_LANDMINES,          GADGET_ID_NONE,
@@ -13765,6 +13785,8 @@
       COULD_MOVE_INTO_ACID(element) ||
       MAYBE_DONT_COLLIDE_WITH(element) ||
       IS_SLIPPERY_CAN_FALL(element) ||
+      IS_OPEN_OR_CLOSED_EXIT(element) ||
+      IS_OPEN_OR_CLOSED_GATE(element) ||
       element == EL_BDX_SAND ||
       element == EL_BDX_ROCK ||
       element == EL_BDX_HEAVY_ROCK ||
@@ -13781,16 +13803,7 @@
       element == EL_DC_MAGIC_WALL ||
       element == EL_LANDMINE ||
       element == EL_DC_LANDMINE ||
-      element == EL_TRAP ||
-      element == EL_EXIT_CLOSED ||
-      element == EL_EXIT_OPEN ||
-      element == EL_STEEL_EXIT_CLOSED ||
-      element == EL_STEEL_EXIT_OPEN ||
-      element == EL_EM_EXIT_CLOSED ||
-      element == EL_EM_EXIT_OPEN ||
-      element == EL_EM_STEEL_EXIT_CLOSED ||
-      element == EL_EM_STEEL_EXIT_OPEN ||
-      element == EL_SP_EXIT_CLOSED)
+      element == EL_TRAP)
   {
     return TRUE;
   }
@@ -14336,6 +14349,12 @@
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_DC_LIMIT_MAX_SHIELD_TIME);
   }
 
+  if (IS_OPEN_OR_CLOSED_EXIT(properties_element))
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_DC_FAST_OPENING_EXITS);
+
+  if (IS_OPEN_OR_CLOSED_GATE(properties_element))
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_DC_FAST_OPENING_GATES);
+
   if (level.game_engine_type == GAME_ENGINE_TYPE_RND &&
       COULD_MOVE_INTO_ACID(properties_element) &&
       !IS_PLAYER_ELEMENT(properties_element) &&
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rocksndiamonds-4.4.2.0/src/files.c 
new/rocksndiamonds-4.4.2.2/src/files.c
--- old/rocksndiamonds-4.4.2.0/src/files.c      2026-06-07 15:58:16.000000000 
+0200
+++ new/rocksndiamonds-4.4.2.2/src/files.c      2026-06-20 23:18:45.000000000 
+0200
@@ -1615,6 +1615,17 @@
     TYPE_BOOLEAN,                              CONF_VALUE_8_BIT(1),
     &li.exit_open_flash_playfield,             FALSE
   },
+  {
+    EL_EXIT_OPEN,                              -1,
+    TYPE_BOOLEAN,                              CONF_VALUE_8_BIT(2),
+    &li.dc_fast_opening_exits,                 FALSE
+  },
+
+  {
+    EL_SWITCHGATE_OPEN,                                -1,
+    TYPE_BOOLEAN,                              CONF_VALUE_8_BIT(1),
+    &li.dc_fast_opening_gates,                 FALSE
+  },
 
   {
     EL_MM_MCDUFFIN,                            -1,
@@ -3028,9 +3039,14 @@
   va_list ap;
 
   va_start(ap, format);
-  vsprintf(basename, format, ap);
+
+  int text_length = vsnprintf(basename, sizeof(basename), format, ap);
+
   va_end(ap);
 
+  if (text_length >= sizeof(basename))
+    Warn("string too long in setLevelFileInfo_FormatLevelFilename() -- 
truncated");
+
   lfi->type = type;
   lfi->packed = FALSE;
 
@@ -8034,6 +8050,10 @@
   // Diamond Caves resets the shield time when collecting shields instead of 
adding it
   level->dc_limit_max_shield_time = TRUE;
 
+  // Diamond Caves opens and closes exits and time/switch gates faster than 
R'n'D
+  level->dc_fast_opening_exits = TRUE;
+  level->dc_fast_opening_gates = TRUE;
+
   // Diamond Caves causes the playfield to flash when the exit is opening
   level->exit_open_flash_playfield = TRUE;
 
@@ -14657,6 +14677,7 @@
       { "menu.list_size.INFO",         &menu.list_size_info[i]         },
       { "menu.list_entry_size.INFO",   &menu.list_entry_size_info[i]   },
       { "menu.tile_size.INFO",         &menu.tile_size_info[i]         },
+      { "menu.draw_masked.INFO",       &menu.draw_masked_info[i]       },
       { "menu.left_spacing.INFO",      &menu.left_spacing_info[i]      },
       { "menu.middle_spacing.INFO",    &menu.middle_spacing_info[i]    },
       { "menu.right_spacing.INFO",     &menu.right_spacing_info[i]     },
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rocksndiamonds-4.4.2.0/src/game.c 
new/rocksndiamonds-4.4.2.2/src/game.c
--- old/rocksndiamonds-4.4.2.0/src/game.c       2026-06-07 15:58:16.000000000 
+0200
+++ new/rocksndiamonds-4.4.2.2/src/game.c       2026-06-20 23:18:45.000000000 
+0200
@@ -3378,6 +3378,21 @@
   game_em.zigzag_movement = game.zigzag_movement;
   game_sp.zigzag_movement = game.zigzag_movement;
 
+  // set flag if DC style behavior of limiting maximum shield time should be 
used
+  game.dc_limit_max_shield_time = level.dc_limit_max_shield_time;
+
+  // set flag if DC style behavior of fast opening and closing exits and gates 
should be used
+  game.dc_fast_opening_exits = level.dc_fast_opening_exits;
+  game.dc_fast_opening_gates = level.dc_fast_opening_gates;
+
+  // unset some flags for DC style behavior if playing tapes from old 4.4.2.0 
test versions
+  if (tape.game_version_full < VERSION_IDENT_FULL(4,4,2,0, 1,0,0))
+  {
+    game.dc_limit_max_shield_time = FALSE;
+    game.dc_fast_opening_exits = FALSE;
+    game.dc_fast_opening_gates = FALSE;
+  }
+
 #if 0
   Debug("game:init:level", "level %d: level.game_version  == %s", level_nr,
        getVersionString(level.game_version));
@@ -11791,6 +11806,21 @@
 
   ChangeDelay[x][y]--;
 
+  // check for using DC style fast opening and closing exits and gates
+  if (((game.dc_fast_opening_exits && IS_OPENING_OR_CLOSING_EXIT(element)) ||
+       (game.dc_fast_opening_gates && IS_OPENING_OR_CLOSING_GATE(element))) &&
+      ChangeDelay[x][y] > 0)
+  {
+    int graphic = el_act_dir2img(element, GfxAction[x][y], GfxDir[x][y]);
+
+    // change element twice as fast
+    ChangeDelay[x][y]--;
+
+    // do not skip "new" animation frames (would currently break animation)
+    if (!IS_NEW_FRAME(GfxFrame[x][y], graphic))
+      GfxFrame[x][y]++;
+  }
+
   if (ChangeDelay[x][y] != 0)          // continue element change
   {
     int graphic = el_act_dir2img(element, GfxAction[x][y], GfxDir[x][y]);
@@ -15382,7 +15412,7 @@
                                           level.shield_deadly_time :
                                           level.shield_normal_time);
 
-      if (level.dc_limit_max_shield_time)
+      if (game.dc_limit_max_shield_time)
       {
        player->shield_normal_time_left = shield_time;
        if (element == EL_SHIELD_DEADLY)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rocksndiamonds-4.4.2.0/src/game.h 
new/rocksndiamonds-4.4.2.2/src/game.h
--- old/rocksndiamonds-4.4.2.0/src/game.h       2026-06-07 15:58:16.000000000 
+0200
+++ new/rocksndiamonds-4.4.2.2/src/game.h       2026-06-20 23:18:45.000000000 
+0200
@@ -244,6 +244,13 @@
   // flag to set if zigzag movement should be used (BD/EM/SP engine only)
   boolean zigzag_movement;
 
+  // flag to set if DC style behavior of limiting maximum shield time should 
be used
+  boolean dc_limit_max_shield_time;
+
+  // flag to set if DC style behavior of fast opening and closing exits and 
gates should be used
+  boolean dc_fast_opening_exits;
+  boolean dc_fast_opening_gates;
+
   // variable within running game
   int yamyam_content_nr;
   boolean robot_wheel_active;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rocksndiamonds-4.4.2.0/src/game_bd/bd_caveengine.c 
new/rocksndiamonds-4.4.2.2/src/game_bd/bd_caveengine.c
--- old/rocksndiamonds-4.4.2.0/src/game_bd/bd_caveengine.c      2026-06-07 
15:58:16.000000000 +0200
+++ new/rocksndiamonds-4.4.2.2/src/game_bd/bd_caveengine.c      2026-06-20 
23:18:45.000000000 +0200
@@ -2636,7 +2636,8 @@
            // hammered explodes during hammering (by a nearby explosion)
            if (new_elem != O_NONE)
            {
-             store_dir(cave, x, y, GD_MV_DOWN, new_elem);
+             // (do not use "store_dir()" here, to prevent movement animation 
for new element)
+             store(cave, x, y + 1, new_elem);
 
              // and if walls reappear, remember it in array
               // y + 1 is down
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rocksndiamonds-4.4.2.0/src/game_bd/bd_graphics.c 
new/rocksndiamonds-4.4.2.2/src/game_bd/bd_graphics.c
--- old/rocksndiamonds-4.4.2.0/src/game_bd/bd_graphics.c        2026-06-07 
15:58:16.000000000 +0200
+++ new/rocksndiamonds-4.4.2.2/src/game_bd/bd_graphics.c        2026-06-20 
23:18:45.000000000 +0200
@@ -734,7 +734,7 @@
   int tile_crm = get_dirt_element(tile, dir_to, TRUE);
   int animcycle = game->animcycle;
   int itercycle = MIN(game->itercycle * 8 / game->itermax, 7);
-  int frame = (is_digging ? itercycle : animcycle);
+  int frame = (draw_last == O_CLOCK ? 7 - itercycle : is_digging ? itercycle : 
animcycle);
   struct GraphicInfo_BD *gfx = &graphic_info_bd_object[tile_gfx][frame];
   struct GraphicInfo_BD *crm = &graphic_info_bd_object[tile_crm][frame];
   int dirs[] = { GD_MV_UP, GD_MV_LEFT, GD_MV_RIGHT, GD_MV_DOWN };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rocksndiamonds-4.4.2.0/src/libgame/sdl.c 
new/rocksndiamonds-4.4.2.2/src/libgame/sdl.c
--- old/rocksndiamonds-4.4.2.0/src/libgame/sdl.c        2026-06-07 
15:58:16.000000000 +0200
+++ new/rocksndiamonds-4.4.2.2/src/libgame/sdl.c        2026-06-20 
23:18:45.000000000 +0200
@@ -622,6 +622,9 @@
   if (!strEqual(setup.system.sdl_renderdriver, ARG_DEFAULT))
     SDL_SetHint(SDL_HINT_RENDER_DRIVER, setup.system.sdl_renderdriver);
 
+  // prevent Windows systems from upscaling the program Window
+  SDL_SetHint(SDL_HINT_WINDOWS_DPI_AWARENESS, "permonitorv2");
+
   // initialize SDL video
   if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0)
     Fail("SDL_InitSubSystem() failed: %s", SDL_GetError());
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rocksndiamonds-4.4.2.0/src/libgame/text.c 
new/rocksndiamonds-4.4.2.2/src/libgame/text.c
--- old/rocksndiamonds-4.4.2.0/src/libgame/text.c       2026-06-07 
15:58:16.000000000 +0200
+++ new/rocksndiamonds-4.4.2.2/src/libgame/text.c       2026-06-20 
23:18:45.000000000 +0200
@@ -218,11 +218,13 @@
   va_list ap;
 
   va_start(ap, format);
-  vsprintf(buffer, format, ap);
+
+  int text_length = vsnprintf(buffer, sizeof(buffer), format, ap);
+
   va_end(ap);
 
-  if (strlen(buffer) > MAX_OUTPUT_LINESIZE)
-    Fail("string too long in DrawTextF() -- aborting");
+  if (text_length >= sizeof(buffer))
+    Warn("string too long in DrawTextF() -- truncated");
 
   DrawText(gfx.sx + x, gfx.sy + y, buffer, font_nr);
 }
@@ -233,11 +235,13 @@
   va_list ap;
 
   va_start(ap, format);
-  vsprintf(buffer, format, ap);
+
+  int text_length = vsnprintf(buffer, sizeof(buffer), format, ap);
+
   va_end(ap);
 
-  if (strlen(buffer) > MAX_OUTPUT_LINESIZE)
-    Fail("string too long in DrawTextFCentered() -- aborting");
+  if (text_length >= sizeof(buffer))
+    Warn("string too long in DrawTextFCentered() -- truncated");
 
   DrawText(gfx.sx + (gfx.sxsize - getTextWidth(buffer, font_nr)) / 2,
           gfx.sy + y, buffer, font_nr);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rocksndiamonds-4.4.2.0/src/main.h 
new/rocksndiamonds-4.4.2.2/src/main.h
--- old/rocksndiamonds-4.4.2.0/src/main.h       2026-06-07 15:58:16.000000000 
+0200
+++ new/rocksndiamonds-4.4.2.2/src/main.h       2026-06-20 23:18:45.000000000 
+0200
@@ -1020,6 +1020,38 @@
                                         (e) == EL_SHIELD_NORMAL ||             
        \
                                         (e) == EL_SHIELD_DEADLY)
 
+#define IS_OPEN_OR_CLOSED_EXIT(e)      ((e) == EL_EXIT_OPEN ||                 
        \
+                                        (e) == EL_EXIT_CLOSED ||               
        \
+                                        (e) == EL_STEEL_EXIT_OPEN ||           
        \
+                                        (e) == EL_STEEL_EXIT_CLOSED ||         
        \
+                                        (e) == EL_EM_EXIT_OPEN ||              
        \
+                                        (e) == EL_EM_EXIT_CLOSED ||            
        \
+                                        (e) == EL_EM_STEEL_EXIT_OPEN ||        
        \
+                                        (e) == EL_EM_STEEL_EXIT_CLOSED ||      
        \
+                                        (e) == EL_SP_EXIT_OPEN ||              
        \
+                                        (e) == EL_SP_EXIT_CLOSED)
+
+#define IS_OPEN_OR_CLOSED_GATE(e)      ((e) == EL_SWITCHGATE_OPEN ||           
        \
+                                        (e) == EL_SWITCHGATE_CLOSED ||         
        \
+                                        (e) == EL_TIMEGATE_OPEN ||             
        \
+                                        (e) == EL_TIMEGATE_CLOSED)
+
+#define IS_OPENING_OR_CLOSING_EXIT(e)  ((e) == EL_EXIT_OPENING ||              
        \
+                                        (e) == EL_EXIT_CLOSING ||              
        \
+                                        (e) == EL_STEEL_EXIT_OPENING ||        
        \
+                                        (e) == EL_STEEL_EXIT_CLOSING ||        
        \
+                                        (e) == EL_EM_EXIT_OPENING ||           
        \
+                                        (e) == EL_EM_EXIT_CLOSING ||           
        \
+                                        (e) == EL_EM_STEEL_EXIT_OPENING ||     
        \
+                                        (e) == EL_EM_STEEL_EXIT_CLOSING ||     
        \
+                                        (e) == EL_SP_EXIT_OPENING ||           
        \
+                                        (e) == EL_SP_EXIT_CLOSING)
+
+#define IS_OPENING_OR_CLOSING_GATE(e)  ((e) == EL_SWITCHGATE_OPENING ||        
        \
+                                        (e) == EL_SWITCHGATE_CLOSING ||        
        \
+                                        (e) == EL_TIMEGATE_OPENING ||          
        \
+                                        (e) == EL_TIMEGATE_CLOSING)
+
 #define IS_DRAWABLE(e)                 ((e) < EL_BLOCKED)
 #define IS_NOT_DRAWABLE(e)             ((e) >= EL_BLOCKED)
 #define TAPE_IS_EMPTY(x)               ((x).length == 0)
@@ -3190,7 +3222,7 @@
 #define PROGRAM_VERSION_SUPER          4
 #define PROGRAM_VERSION_MAJOR          4
 #define PROGRAM_VERSION_MINOR          2
-#define PROGRAM_VERSION_PATCH          0
+#define PROGRAM_VERSION_PATCH          2
 
 #define PROGRAM_VERSION_STABLE         1
 #define PROGRAM_VERSION_EXTRA          0
@@ -3528,6 +3560,8 @@
   int list_entry_size_setup[NUM_SPECIAL_GFX_SETUP_ARGS];
   int tile_size_info[NUM_SPECIAL_GFX_INFO_ARGS];
 
+  int draw_masked_info[NUM_SPECIAL_GFX_INFO_ARGS];
+
   int left_spacing[NUM_SPECIAL_GFX_ARGS];
   int left_spacing_info[NUM_SPECIAL_GFX_INFO_ARGS];
   int left_spacing_setup[NUM_SPECIAL_GFX_SETUP_ARGS];
@@ -4051,6 +4085,8 @@
   boolean dc_keep_wall_content;                // DC style behavior when 
exploding wall with content
   boolean dc_no_timeout_with_shield;   // DC style behavior of surviving 
timeout with shield
   boolean dc_limit_max_shield_time;    // DC style behavior of limiting 
maximum shield time
+  boolean dc_fast_opening_exits;       // DC style behavior of fast opening 
and closing exits
+  boolean dc_fast_opening_gates;       // DC style behavior of fast opening 
and closing gates
   boolean use_diggable_landmines;      // DC style behavior when digging traps 
and (DC) landmines
   boolean use_spring_bug;              // for compatibility with old levels
   boolean use_time_orb_bug;            // for compatibility with old levels
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rocksndiamonds-4.4.2.0/src/screens.c 
new/rocksndiamonds-4.4.2.2/src/screens.c
--- old/rocksndiamonds-4.4.2.0/src/screens.c    2026-06-07 15:58:16.000000000 
+0200
+++ new/rocksndiamonds-4.4.2.2/src/screens.c    2026-06-20 23:18:45.000000000 
+0200
@@ -234,6 +234,7 @@
 #define MENU_SCREEN_INFO_ENTRY_SIZE_RAW                
(menu.list_entry_size_info[info_mode])
 #define MENU_SCREEN_INFO_ENTRY_SIZE            
(MAX(MENU_SCREEN_INFO_ENTRY_SIZE_RAW,           \
                                                     
MENU_SCREEN_INFO_TILE_SIZE))
+#define MENU_SCREEN_INFO_MASK_MODE             
(menu.draw_masked_info[info_mode])
 #define MENU_SCREEN_INFO_YSTART                        
MENU_SCREEN_INFO_SPACE_TOP
 #define MENU_SCREEN_INFO_YSTEP                 (MENU_SCREEN_INFO_ENTRY_SIZE +  
                \
                                                 MENU_SCREEN_INFO_SPACE_EXTRA)
@@ -1729,15 +1730,22 @@
 
   int xpos = MENU_TEXT_ALIGNED_XPOS(*tpi);
   int ypos = MENU_TEXT_ALIGNED_YPOS(*tpi);
+  int font_width = getFontWidth(tpi->font);
   char buffer[MAX_OUTPUT_LINESIZE + 1];
   va_list ap;
 
   va_start(ap, format);
-  vsprintf(buffer, format, ap);
+
+  int text_length = vsnprintf(buffer, sizeof(buffer), format, ap);
+
   va_end(ap);
 
-  if (strlen(buffer) > MAX_OUTPUT_LINESIZE)
-    Fail("string too long in DrawMenuText() -- aborting");
+  if (text_length >= sizeof(buffer))
+    Warn("string too long in DrawMenuText() -- truncated");
+
+  // truncate text if it does not fit into the playfield viewport
+  if (text_length * font_width > SXSIZE)
+    buffer[SXSIZE / font_width] = '\0';
 
   DrawTextSAligned(xpos, ypos, buffer, tpi->font, tpi->align);
 }
@@ -3795,6 +3803,7 @@
   int ystep = MENU_SCREEN_INFO_YSTEP;
   int row_height = MENU_SCREEN_INFO_ENTRY_SIZE;
   int tilesize = MENU_SCREEN_INFO_TILE_SIZE;
+  int mask_mode = MENU_SCREEN_INFO_MASK_MODE;
   int yoffset = (row_height - tilesize) / 2;
   int element, action, direction;
   int graphic;
@@ -3883,7 +3892,7 @@
 
     ClearRectangleOnBackground(drawto, xstart, ystart_pos, tilesize, tilesize);
     DrawSizedGraphicAnimationExt(drawto, xstart, ystart_pos,
-                                graphic, sync_frame, tilesize, USE_MASKING);
+                                graphic, sync_frame, tilesize, mask_mode);
 
     if (init)
       DrawInfoScreen_HelpText(element, action, direction, ypos);
@@ -4742,6 +4751,8 @@
 
     int start_pos = 0;
 
+    InitWrappedText(0, 0, wrapped_text, start_pos);
+
     while (wrapped_text->line_visible_last < wrapped_text->num_lines - 1)
       InitWrappedText(0, 0, wrapped_text, ++start_pos);
 
@@ -5919,9 +5930,9 @@
   DrawBackgroundForFont(SX, SY + ypos, SXSIZE, getFontHeight(font_nr), 
font_nr);
 
   if (node->parent_link)
-    DrawMenuText(tpi, "leave \"%s\"", node->node_parent->name);
+    DrawMenuText(tpi, "Leave \"%s\"", node->node_parent->name);
   else if (node->level_group)
-    DrawMenuText(tpi, "enter \"%s\"", node->name);
+    DrawMenuText(tpi, "Enter \"%s\"", node->name);
   else if (ti->type == TREE_TYPE_LEVELSET_DIR)
     DrawMenuText(tpi, format_levels, node->levels, text_levels, 
node->class_desc);
 
@@ -5937,14 +5948,15 @@
   drawChooseTreeText(ti, ti->cl_cursor, active);
 }
 
-static void drawChooseTreeScreen(TreeInfo *ti)
+static void drawChooseTreeScreen(TreeInfo *ti, boolean adjust_scrollbar)
 {
   drawChooseTreeHead(ti);
   drawChooseTreeList(ti);
   drawChooseTreeInfo(ti);
   drawChooseTreeCursorAndText(ti, TRUE);
 
-  AdjustChooseTreeScrollbar(ti, SCREEN_CTRL_ID_SCROLL_VERTICAL);
+  if (adjust_scrollbar)
+    AdjustChooseTreeScrollbar(ti, SCREEN_CTRL_ID_SCROLL_VERTICAL);
 
   // scroll bar and buttons may just have been added after reloading scores
   if (game_status == GAME_MODE_SCORES)
@@ -6050,7 +6062,7 @@
     if (position_set_by_scrollbar)
       ti->cl_first = dy;
 
-    drawChooseTreeScreen(ti);
+    drawChooseTreeScreen(ti, !position_set_by_scrollbar);
 
     return;
   }
@@ -6182,7 +6194,7 @@
       }
 
       if (redraw)
-       drawChooseTreeScreen(ti);
+       drawChooseTreeScreen(ti, !position_set_by_scrollbar);
 
       return;
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rocksndiamonds-4.4.2.0/src/tape.c 
new/rocksndiamonds-4.4.2.2/src/tape.c
--- old/rocksndiamonds-4.4.2.0/src/tape.c       2026-06-07 15:58:16.000000000 
+0200
+++ new/rocksndiamonds-4.4.2.2/src/tape.c       2026-06-20 23:18:45.000000000 
+0200
@@ -2718,7 +2718,7 @@
       break;
 
     case TAPE_CTRL_ID_PAUSE:
-      TapeTogglePause(TAPE_TOGGLE_MANUAL);
+      TapeTogglePause(TAPE_TOGGLE_MANUAL | TAPE_TOGGLE_PLAY_PAUSE);
 
       break;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rocksndiamonds-4.4.2.0/src/tools.c 
new/rocksndiamonds-4.4.2.2/src/tools.c
--- old/rocksndiamonds-4.4.2.0/src/tools.c      2026-06-07 15:58:16.000000000 
+0200
+++ new/rocksndiamonds-4.4.2.2/src/tools.c      2026-06-20 23:18:45.000000000 
+0200
@@ -11506,7 +11506,7 @@
                      i == O_BITER_SWITCH_2_CRUMBLED         ||
                      i == O_BITER_SWITCH_3_CRUMBLED         ||
                      i == O_BITER_SWITCH_4_CRUMBLED         ?
-                     graphic = el_act2crm(effective_element, effective_action) 
:
+                     el_act2crm(effective_element, effective_action) :
                      i == O_DIRT_DIGGING_LEFT_CRUMBLED   ||
                      i == O_DIRT_DIGGING_RIGHT_CRUMBLED  ||
                      i == O_DIRT_DIGGING_UP_CRUMBLED     ||
@@ -11515,7 +11515,7 @@
                      i == O_DIRT2_DIGGING_RIGHT_CRUMBLED ||
                      i == O_DIRT2_DIGGING_UP_CRUMBLED    ||
                      i == O_DIRT2_DIGGING_DOWN_CRUMBLED ?
-                     graphic = el_act_dir2crm(effective_element, 
effective_action, direction) :
+                     el_act_dir2crm(effective_element, effective_action, 
direction) :
                      direction == MV_NONE ?
                      el_act2img(effective_element, effective_action) :
                      el_act_dir2img(effective_element, effective_action, 
direction));
@@ -12526,6 +12526,9 @@
   static int show_flash_count = 0;
   int num_flash_frames = 16;
 
+  if (program.headless)
+    return;
+
   if (mode == FLASH_PLAYFIELD_MODE_FREE_TEXTURES)
   {
     SDLFreeBitmapTextures(flash_bitmap);

Reply via email to