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);
