[Scummvm-git-logs] scummvm master -> 192459af28c3d4d885fae49b1f5dbaa1b7919dc2

dreammaster noreply at scummvm.org
Sun May 31 09:45:21 UTC 2026


This automated email contains information about 4 new commits which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
09a5504b62 MADS: DRAGONSPHERE: Fix memory overrun entering room 605
3949a85972 MADS: DRAGONSPHERE: Game needs increased 32 max inventory items
ef8ecde30f MADS: FOREST: In progress room 101
192459af28 MADS: DRAGONSPHERE: Workaround taking rope in room 605


Commit: 09a5504b62f67f7a7b2d409715701df863ec9f45
    https://github.com/scummvm/scummvm/commit/09a5504b62f67f7a7b2d409715701df863ec9f45
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-05-31T17:21:58+10:00

Commit Message:
MADS: DRAGONSPHERE: Fix memory overrun entering room 605

Changed paths:
    engines/mads/madsv2/dragonsphere/rooms/room605.cpp


diff --git a/engines/mads/madsv2/dragonsphere/rooms/room605.cpp b/engines/mads/madsv2/dragonsphere/rooms/room605.cpp
index 616cea3193f..93126f0a40d 100644
--- a/engines/mads/madsv2/dragonsphere/rooms/room605.cpp
+++ b/engines/mads/madsv2/dragonsphere/rooms/room605.cpp
@@ -394,7 +394,7 @@ static void room_605_init() {
 	ss[fx_object_in_freezer]  = kernel_load_series(kernel_name('y', 5), false);
 	ss[fx_reach_into_freezer] = kernel_load_series(kernel_name('a', 0), false);
 
-	for (count = 10; count < 33; count++) {
+	for (count = 10; count < 32; count++) {
 		flag_used[count] = false;
 	}
 


Commit: 3949a859729bdc29b242bf10d2c37a32d7d64af0
    https://github.com/scummvm/scummvm/commit/3949a859729bdc29b242bf10d2c37a32d7d64af0
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-05-31T17:31:33+10:00

Commit Message:
MADS: DRAGONSPHERE: Game needs increased 32 max inventory items

Changed paths:
    engines/mads/madsv2/core/inter.h


diff --git a/engines/mads/madsv2/core/inter.h b/engines/mads/madsv2/core/inter.h
index 8a8ba23e29d..9b0d6e02289 100644
--- a/engines/mads/madsv2/core/inter.h
+++ b/engines/mads/madsv2/core/inter.h
@@ -63,7 +63,7 @@ namespace MADSV2 {
 
 #define INTER_COMMANDS          (inter_columns * 2)
 
-#define INVEN_MAX_OBJECTS       20      /* Can only carry ... objects */
+#define INVEN_MAX_OBJECTS       32            /* Can only carry ... objects */
 
 #define INTER_BUILDING_SENTENCES      0       /* Normal sentence building mode */
 #define INTER_CONVERSATION            1       /* Special conversation mode     */


Commit: ef8ecde30fc3e6b0d1190cc343f34a677ab0a478
    https://github.com/scummvm/scummvm/commit/ef8ecde30fc3e6b0d1190cc343f34a677ab0a478
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-05-31T19:35:16+10:00

Commit Message:
MADS: FOREST: In progress room 101

Changed paths:
    engines/mads/madsv2/core/kernel.cpp
    engines/mads/madsv2/core/kernel.h
    engines/mads/madsv2/core/midi.cpp
    engines/mads/madsv2/core/midi.h
    engines/mads/madsv2/core/player.cpp
    engines/mads/madsv2/core/player.h
    engines/mads/madsv2/forest/global.cpp
    engines/mads/madsv2/forest/global.h
    engines/mads/madsv2/forest/rooms/room101.cpp


diff --git a/engines/mads/madsv2/core/kernel.cpp b/engines/mads/madsv2/core/kernel.cpp
index cbd9fd89726..2b30b0f0f28 100644
--- a/engines/mads/madsv2/core/kernel.cpp
+++ b/engines/mads/madsv2/core/kernel.cpp
@@ -96,6 +96,7 @@ int kernel_allow_peel = false;
 
 int kernel_panning_speed = 0;
 int kernel_screen_fade   = 0;
+bool stop_speech_on_run_animation = false;
 
 Animation kernel_anim[KERNEL_MAX_ANIMATIONS];
 
@@ -2977,6 +2978,7 @@ void init_kernel() {
 	random_message_color = 0;
 	random_message_duration = 0;
 	memset(kernel_interface_loaded, 0, sizeof(kernel_interface_loaded));
+	stop_speech_on_run_animation = false;
 }
 
 void kernel_random_frame(int handle, int16 *frame, int mode) {
diff --git a/engines/mads/madsv2/core/kernel.h b/engines/mads/madsv2/core/kernel.h
index 65bfb67aff7..9fc707b9f72 100644
--- a/engines/mads/madsv2/core/kernel.h
+++ b/engines/mads/madsv2/core/kernel.h
@@ -364,6 +364,7 @@ extern int kernel_screen_fade;
 
 
 extern Animation kernel_anim[KERNEL_MAX_ANIMATIONS];
+extern bool stop_speech_on_run_animation;
 
 /*  Old animation stuff
 extern AnimPtr kernel_animation;
diff --git a/engines/mads/madsv2/core/midi.cpp b/engines/mads/madsv2/core/midi.cpp
index 60f4db14e41..34ed0051361 100644
--- a/engines/mads/madsv2/core/midi.cpp
+++ b/engines/mads/madsv2/core/midi.cpp
@@ -30,5 +30,9 @@ void midi_play(const char *name) {
 	// TODO
 }
 
+void midi_stop() {
+	// TODO
+}
+
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/core/midi.h b/engines/mads/madsv2/core/midi.h
index f3a1c00e378..be4b718d90b 100644
--- a/engines/mads/madsv2/core/midi.h
+++ b/engines/mads/madsv2/core/midi.h
@@ -28,6 +28,7 @@ namespace MADS {
 namespace MADSV2 {
 
 extern void midi_play(const char *name);
+extern void midi_stop();
 
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/core/player.cpp b/engines/mads/madsv2/core/player.cpp
index a8219d7b8aa..f1670e6c703 100644
--- a/engines/mads/madsv2/core/player.cpp
+++ b/engines/mads/madsv2/core/player.cpp
@@ -40,6 +40,7 @@ namespace MADSV2 {
 
 Player player;
 Player2 player2;
+static Player saved_player;
 
 static const byte player_facing_to_series[10] = { 0, 7, 4, 3, 6, 0, 2, 5, 0, 1 };
 const byte player_clockwise[10] = { 9, 4, 1, 2, 7, 9, 3, 8, 9, 6 };
@@ -1031,5 +1032,55 @@ void player_walk_trigger(int trigger) {
 	}
 }
 
+void save_player() {
+	saved_player.x                  = player.x;
+	saved_player.y                  = player.y;
+	saved_player.facing             = player.facing;
+	saved_player.center_of_gravity  = player.center_of_gravity;
+	saved_player.walking            = player.walking;
+	saved_player.need_to_walk       = player.need_to_walk;
+	saved_player.sprite_changed     = player.sprite_changed;
+	saved_player.frame_delay        = player.frame_delay;
+	saved_player.commands_allowed   = player.commands_allowed;
+	saved_player.walker_visible     = player.walker_visible;
+	saved_player.walk_freedom       = player.walk_freedom;
+	saved_player.series_base        = player.series_base;
+	saved_player.command_ready      = player.command_ready;
+	saved_player.num_rooms_been_in  = player.num_rooms_been_in;
+	saved_player.special_code       = player.special_code;
+	saved_player.next_special_code  = player.next_special_code;
+	saved_player.scaling_velocity   = player.scaling_velocity;
+	saved_player.walker_is_loaded   = player.walker_is_loaded;
+	saved_player.walker_must_reload = player.walker_must_reload;
+	saved_player.walker_loads_first = player.walker_loads_first;
+	saved_player.walk_trigger       = player.walk_trigger;
+	saved_player.enable_at_target   = player.enable_at_target;
+}
+
+void restore_player() {
+	player.x                  = saved_player.x;
+	player.y                  = saved_player.y;
+	player.facing             = saved_player.facing;
+	player.center_of_gravity  = saved_player.center_of_gravity;
+	player.walking            = saved_player.walking;
+	player.need_to_walk       = saved_player.need_to_walk;
+	player.sprite_changed     = saved_player.sprite_changed;
+	player.frame_delay        = saved_player.frame_delay;
+	player.commands_allowed   = saved_player.commands_allowed;
+	player.walker_visible     = saved_player.walker_visible;
+	player.walk_freedom       = saved_player.walk_freedom;
+	player.series_base        = saved_player.series_base;
+	player.command_ready      = saved_player.command_ready;
+	player.num_rooms_been_in  = saved_player.num_rooms_been_in;
+	player.special_code       = saved_player.special_code;
+	player.next_special_code  = saved_player.next_special_code;
+	player.scaling_velocity   = saved_player.scaling_velocity;
+	player.walker_is_loaded   = saved_player.walker_is_loaded;
+	player.walker_must_reload = saved_player.walker_must_reload;
+	player.walker_loads_first = saved_player.walker_loads_first;
+	player.walk_trigger       = saved_player.walk_trigger;
+	player.enable_at_target   = saved_player.enable_at_target;
+}
+
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/core/player.h b/engines/mads/madsv2/core/player.h
index 392ff7bb418..b0d87a237ae 100644
--- a/engines/mads/madsv2/core/player.h
+++ b/engines/mads/madsv2/core/player.h
@@ -342,6 +342,16 @@ extern void player_keep_turning();
 
 extern void player_activate_trigger();
 
+/**
+ * Saves the current player state to a static buffer for later restoration.
+ */
+extern void save_player();
+
+/**
+ * Restores the player state previously saved by save_player().
+ */
+extern void restore_player();
+
 } // namespace MADSV2
 } // namespace MADS
 
diff --git a/engines/mads/madsv2/forest/global.cpp b/engines/mads/madsv2/forest/global.cpp
index 28cd2afc830..6e78c3e7b58 100644
--- a/engines/mads/madsv2/forest/global.cpp
+++ b/engines/mads/madsv2/forest/global.cpp
@@ -29,6 +29,8 @@ namespace MADS {
 namespace MADSV2 {
 namespace Forest {
 
+int16 flags[40];
+
 namespace Rooms {
 
 // Section preloads
diff --git a/engines/mads/madsv2/forest/global.h b/engines/mads/madsv2/forest/global.h
index bf1498e4907..13833c02b30 100644
--- a/engines/mads/madsv2/forest/global.h
+++ b/engines/mads/madsv2/forest/global.h
@@ -30,10 +30,216 @@ namespace MADSV2 {
 namespace Forest {
 
 enum {
-	g009 =  9,
-	g010 = 10,
-	g016 = 16,
-	g017 = 17
+	kWalkerTiming2            =   1,
+	stop_walker_disabled      =   2,
+	temp_interface            =   3,
+	walker_converse           =   4,
+	walker_converse_state     =   5,
+	walker_converse_now       =   6,
+	_007                      =   7,
+	g008                      =   8,
+	g009                      =   9,
+	g010                      =  10,
+	g011                      =  11,
+	g012                      =  12,
+	g013                      =  13,
+	g014                      =  14,
+	g015                      =  15,
+	g016                      =  16,
+	g017                      =  17,
+	g018                      =  18,
+	g019                      =  19,
+	g020                      =  20,
+	g021                      =  21,
+	g022                      =  22,
+	g023                      =  23,
+	g024                      =  24,
+	g025                      =  25,
+	g026                      =  26,
+	g027                      =  27,
+	g028                      =  28,
+	g029                      =  29,
+	g030                      =  30,
+	g031                      =  31,
+	g032                      =  32,
+	g033                      =  33,
+	g034                      =  34,
+	g035                      =  35,
+	g036                      =  36,
+	g037                      =  37,
+	g038                      =  38,
+	g039                      =  39,
+	g040                      =  40,
+	g041                      =  41,
+	g042                      =  42,
+	g043                      =  43,
+	g044                      =  44,
+	g045                      =  45,
+	g046                      =  46,
+	g047                      =  47,
+	g048                      =  48,
+	g049                      =  49,
+	g050                      =  50,
+	g051                      =  51,
+	g052                      =  52,
+	g053                      =  53,
+	g054                      =  54,
+	g055                      =  55,
+	g056                      =  56,
+	g057                      =  57,
+	g058                      =  58,
+	g059                      =  59,
+	g060                      =  60,
+	g061                      =  61,
+	g062                      =  62,
+	g063                      =  63,
+	g064                      =  64,
+	g065                      =  65,
+	g066                      =  66,
+	g067                      =  67,
+	g068                      =  68,
+	g069                      =  69,
+	g070                      =  70,
+	g071                      =  71,
+	g072                      =  72,
+	g073                      =  73,
+	g074                      =  74,
+	g075                      =  75,
+	g076                      =  76,
+	g077                      =  77,
+	g078                      =  78,
+	g079                      =  79,
+	g080                      =  80,
+	g081                      =  81,
+	g082                      =  82,
+	g083                      =  83,
+	g084                      =  84,
+	g085                      =  85,
+	g086                      =  86,
+	g087                      =  87,
+	g088                      =  88,
+	g089                      =  89,
+	g090                      =  90,
+	g091                      =  91,
+	g092                      =  92,
+	g093                      =  93,
+	g094                      =  94,
+	g095                      =  95,
+	g096                      =  96,
+	g097                      =  97,
+	g098                      =  98,
+	g099                      =  99,
+	g100                      = 100,
+	g101                      = 101,
+	g102                      = 102,
+	g103                      = 103,
+	g104                      = 104,
+	g105                      = 105,
+	g106                      = 106,
+	g107                      = 107,
+	g108                      = 108,
+	g109                      = 109,
+	g110                      = 110,
+	g111                      = 111,
+	g112                      = 112,
+	g113                      = 113,
+	g114                      = 114,
+	g115                      = 115,
+	g116                      = 116,
+	g117                      = 117,
+	g118                      = 118,
+	g119                      = 119,
+	g120                      = 120,
+	g121                      = 121,
+	g122                      = 122,
+	g123                      = 123,
+	g124                      = 124,
+	g125                      = 125,
+	g126                      = 126,
+	g127                      = 127,
+	g128                      = 128,
+	g129                      = 129,
+	g130                      = 130,
+	g131                      = 131,
+	g132                      = 132,
+	g133                      = 133,
+	g134                      = 134,
+	g135                      = 135,
+	g136                      = 136,
+	g137                      = 137,
+	g138                      = 138,
+	g139                      = 139,
+	g140                      = 140,
+	g141                      = 141,
+	g142                      = 142,
+	g143                      = 143,
+	g144                      = 144,
+	g145                      = 145,
+	g146                      = 146,
+	g147                      = 147,
+	g148                      = 148,
+	g149                      = 149,
+	g150                      = 150,
+	g151                      = 151,
+	g152                      = 152,
+	g153                      = 153,
+	g154                      = 154,
+	g155                      = 155,
+	g156                      = 156,
+	g157                      = 157,
+	g158                      = 158,
+	g159                      = 159,
+	g160                      = 160,
+	g161                      = 161,
+	g162                      = 162,
+	g163                      = 163,
+	g164                      = 164,
+	g165                      = 165,
+	g166                      = 166,
+	g167                      = 167,
+	g168                      = 168,
+	g169                      = 169,
+	g170                      = 170,
+	g171                      = 171,
+	g172                      = 172,
+	g173                      = 173,
+	g174                      = 174,
+	g175                      = 175,
+	g176                      = 176,
+	g177                      = 177,
+	g178                      = 178,
+	g179                      = 179,
+	g180                      = 180,
+	g181                      = 181,
+	g182                      = 182,
+	g183                      = 183,
+	g184                      = 184,
+	g185                      = 185,
+	g186                      = 186,
+	g187                      = 187,
+	g188                      = 188,
+	g189                      = 189,
+	g190                      = 190,
+	g191                      = 191,
+	g192                      = 192,
+	g193                      = 193,
+	g194                      = 194,
+	g195                      = 195,
+	g196                      = 196,
+	g197                      = 197,
+	g198                      = 198,
+	g199                      = 199,
+	g200                      = 200,
+	g201                      = 201,
+	g202                      = 202,
+	g203                      = 203,
+	g204                      = 204,
+	g205                      = 205,
+	g206                      = 206,
+	g207                      = 207,
+	g208                      = 208,
+	g209                      = 209,
+	g210                      = 210
 };
 
 extern void global_section_constructor();
@@ -41,6 +247,8 @@ extern void sync_room(Common::Serializer &s);
 
 extern void global_digi_play(int num);
 
+extern int16 flags[40];
+
 } // namespace Forest
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/forest/rooms/room101.cpp b/engines/mads/madsv2/forest/rooms/room101.cpp
index deb7f902b21..d6182709f47 100644
--- a/engines/mads/madsv2/forest/rooms/room101.cpp
+++ b/engines/mads/madsv2/forest/rooms/room101.cpp
@@ -20,11 +20,16 @@
  */
 
 #include "mads/madsv2/core/conv.h"
+#include "mads/madsv2/core/digi.h"
 #include "mads/madsv2/core/game.h"
 #include "mads/madsv2/core/imath.h"
 #include "mads/madsv2/core/inter.h"
 #include "mads/madsv2/core/kernel.h"
-#include "mads/madsv2/core/sound.h"
+#include "mads/madsv2/core/matte.h"
+#include "mads/madsv2/core/midi.h"
+#include "mads/madsv2/core/mouse.h"
+#include "mads/madsv2/core/object.h"
+#include "mads/madsv2/core/player.h"
 #include "mads/madsv2/core/text.h"
 #include "mads/madsv2/forest/mads/inventory.h"
 #include "mads/madsv2/forest/mads/sounds.h"
@@ -38,29 +43,253 @@ namespace MADSV2 {
 namespace Forest {
 namespace Rooms {
 
-struct Scratch {
-	int16 sprite[15];       /* Sprite series handles */
-	int16 sequence[15];     /* Sequence handles      */
-	int16 animation[4];     /* Animation handles     */
+struct Struct8 {
+	int16 _val1;
+	int16 _val2;
+	int16 _val3;
+	int16 _val4;
 
-	int16 dragon_frame;     /* frame animation is on */
+	void synchronize(Common::Serializer &s) {
+		s.syncMultipleLE(_val1, _val2, _val3, _val4);
+	}
+};
 
-	int16 done_with_conv;   /* T if done with conv   */
-	int16 prev_room;
+struct Scratch {
+	// Tentative field definitions
+	int16 sprite[10];       // Offset 00h
+	int16 sequence[10];     // Offset 14h
+	int16 animation[11];	// Offset 28h
+	Struct8 array1[11];		// Offset 3eh
+	int16 _96;				// Offset 96h
+	int16 _98;				// Offset 98h
+	int16 _9a;				// Offset 9ah
+	int16 _9c;				// Offset 9ch
+	int16 _9e;				// Offset 9eh
+	int16 _a0;				// Offset a0h
+	int16 _a2;				// Offset a2h
+	int16 _a4;
+	int16 _a6;
+	int16 _a8;
+	int16 _aa;
+	int16 _ac;
+	int16 _ae;
+	int16 _b0;
+	int16 _b2;
+	int16 _b4;
+	int16 _b6;
 };
 
 static Scratch scratch;
 
-#define local (&scratch)
-#define ss    local->sprite
-#define seq   local->sequence
-#define aa    local->animation
+#define ss    scratch.sprite
+#define seq   scratch.sequence
+#define aa    scratch.animation
+
+static void room_101_init1() {
+	global[g009] = -1;
+	viewing_at_y = 22;
+	global[g010] = 0;
+	player.walker_visible = false;
+	player.commands_allowed = false;
+	mouse_hide();
+
+	for (auto &v : scratch.array1) {
+		v._val1 = 0;
+		v._val2 = -1;
+	}
+
+	stop_speech_on_run_animation = false;
+	aa[8] = kernel_run_animation(kernel_name('I', 1), 0);
+	scratch.array1[8]._val1 = -1;
+	scratch.array1[8]._val2 = 8;
+	kernel_reset_animation(aa[8], 8);
+}
+
+static void room_101_init2() {
+	player.commands_allowed = false;
+	global[g010] = 0;
+
+	ss[3] = kernel_load_series(kernel_name('p', 7), 0);
+	seq[3] = kernel_seq_stamp(ss[3], 0, -1);
+	kernel_seq_depth(seq[3], 8);
+	kernel_seq_loc(seq[3], 172, 119);
+	kernel_seq_scale(seq[3], 70);
+
+	global[g131] = 0;
+	global[g141] = 0;
+
+	scratch._a6 = kernel_run_animation_disp('r', 3, 0);
+	kernel_position_anim(scratch._a6, 123, 14, 69, 7);
+	scratch._a4 = kernel_run_animation_disp('e', 1, 0);
+	kernel_position_anim(scratch._a4, 194, 145, 75, 4);
+
+	global[g009] = -1;
+	global_digi_play(8);
+
+	if (previous_room != KERNEL_RESTORING_GAME) {
+		player.x = 96;
+		player.y = 140;
+		player.facing = 3;
+	}
+
+	aa[6] = kernel_run_animation(kernel_name('b', 1), 104);
+	scratch.array1[6]._val1 = -1;
+	scratch._9c = 1;
+	scratch._ac = 1;	
+}
+
+static void room_101_init3() {
+	player.commands_allowed = 0;
+	global[g010] = 0;
+	global[g009] = 0;
+	midi_stop();
+	global[g131] = 0;
+	global[g141] = 0;
+
+	scratch._a6 = kernel_run_animation_disp('r', 3, 0);
+	kernel_position_anim(scratch._a6, 123, 134, 69, 7);
+	scratch._a4 = kernel_run_animation_disp('e', 1, 0);
+	kernel_position_anim(scratch._a4, 194, 145, 75, 4);
+
+	if (previous_room != KERNEL_RESTORING_GAME) {
+		player.x = 96;
+		player.y = 140;
+		player.facing = 3;
+	}
+
+	if (previous_room == KERNEL_RESTORING_GAME) {
+		global[g131] = -1;
+		global[g141] = -1;
+		kernel_reset_animation(scratch._a4, 2);
+		kernel_reset_animation(scratch._a6, 2);
+		global[g133] = 0;
+		global[g143] = 0;
+		player.commands_allowed = -1;
+		return;
+	}
 
+	if (previous_room == 104) {
+		aa[0] = kernel_run_animation(kernel_name('y', 1), 100);
+		scratch.array1[0]._val1 = -1;
+		scratch._9c = 57;
+		return;
+	}
+
+	if (previous_room == 106) {
+		aa[0] = kernel_run_animation(kernel_name('y', 2), 100);
+		scratch.array1[0]._val1 = -1;
+		scratch._9c = 77;
+		return;
+	}
+
+	if (previous_room == 199) {
+		global[g131] = -1;
+		global[g141] = -1;
+		kernel_reset_animation(scratch._a4, 2);
+		kernel_reset_animation(scratch._a6, 2);
+		global[g133] = 0;
+		global[g143] = 0;
+		restore_player();
+		player.commands_allowed = -1;
+		player.walker_visible = -1;
+		return;
+	}
+
+	if (previous_room == 205) {
+		global[g131] = -1;
+		global[g141] = -1;
+		kernel_reset_animation(scratch._a4, 2);
+		kernel_reset_animation(scratch._a6, 2);
+		global[g133] = 0;
+		global[g143] = 0;
+		player.commands_allowed = 0;
+		player.walker_visible = 0;
+		global[g009] = 0;
+		scratch.array1[5]._val1 = -1;
+		aa[5] = kernel_run_animation(kernel_name('b', 8), 111);
+		scratch._ae = 4;
+		return;
+	}
+
+	global[g131] = -1;
+	global[g141] = -1;
+	kernel_reset_animation(scratch._a4, 2);
+	kernel_reset_animation(scratch._a6, 2);
+	global[g133] = 0;
+	global[g143] = 0;
+	player.commands_allowed = -1;
+	player.walker_visible = -1;
+}
 
 static void room_101_init() {
+	scratch._ae = scratch._b0 = scratch._b2 = 0;
+	scratch._b4 = scratch._b6 = -1;
+
+	if (previous_room != KERNEL_RESTORING_GAME) {
+		if (previous_room != 199) {
+			player.walker_visible = false;
+			player.commands_allowed = false;
+		}
+
+		for (Struct8 &s : scratch.array1) {
+			s._val1 = 0;
+			s._val2 = 1;
+			s._val3 = s._val4 = 0;
+		}
+
+		if (previous_room != 199 && flags[0] != 3)
+			++flags[0];
+	}
+
+	if (object_is_here(11)) {
+		ss[0] = kernel_load_series("*rm101p11", 0);
+		seq[0] = kernel_seq_stamp(ss[0], 0, -1);
+		kernel_seq_depth(seq[0], 13);
+		kernel_seq_loc(seq[0], 264, 131);
+		kernel_seq_scale(seq[0], 68);
+	} else {
+		kernel_flip_hotspot(164, false);
+	}
+
+	if (object_is_here(0)) {
+		ss[2] = kernel_load_series("*rm101p10", 0);
+		seq[2] = kernel_seq_stamp(ss[2], 0, -1);
+		kernel_seq_depth(seq[2], 8);
+		kernel_seq_loc(seq[2], 159, 116);
+		kernel_seq_scale(seq[2], 100);
+	} else {
+		kernel_flip_hotspot(105, false);
+	}
+
+	if (object_is_here(8)) {
+		ss[1] = kernel_load_series(kernel_name('p', 8), 0);
+		seq[1] = kernel_seq_stamp(ss[1], 0, -1);
+		kernel_seq_depth(seq[1], 1);
+		kernel_seq_loc(seq[1], 21, 127);
+		kernel_seq_scale(seq[1], 100);
+	} else {
+		kernel_flip_hotspot(154, false);
+	}
+
+	switch (flags[0]) {
+	case -3:
+		room_101_init1();
+		break;
+	case -2:
+		flags[0] = 1;
+		room_101_init2();
+		break;
+	case 1:
+		room_101_init2();
+		break;
+	default:
+		room_101_init3();
+		break;
+	}
 }
 
 static void room_101_daemon() {
+	// TODO
 }
 
 static void room_101_pre_parser() {
@@ -72,12 +301,66 @@ static void room_101_pre_parser() {
 }
 
 static void room_101_parser() {
+	if (global[walker_converse_state] != 0) {
+		player.commands_allowed = 0;
+		digi_play_build_ii('c', 1, 1);
+		scratch._aa = 29;
+		goto handled;
+	}
+
+	if (global[walker_converse] >= 0) {
+		goto handled;
+	}
+
+	if (player_parse(114, 116, 0)) {
+		player.commands_allowed = 0;
+		global[g145] = -1;
+		scratch._98 = 2;
+		goto handled;
+	}
+
+	if (player_parse(126, 154, 0)) {
+		player.commands_allowed = 0;
+		global[g150] = -1;
+		scratch._9a = 13;
+		goto handled;
+	}
+
+	if (player_parse(126, 105, 0)) {
+		player.commands_allowed = 0;
+		global[g150] = -1;
+		scratch._9a = 14;
+		goto handled;
+	}
+
+	if (player_parse(126, 164, 0)) {
+		player.commands_allowed = 0;
+		global[g150] = -1;
+		scratch._9a = 15;
+		goto handled;
+	}
+
+	if (player_parse(13, 149, 0)) {
+		player.commands_allowed = 0;
+		player.walker_visible = 0;
+		kernel.trigger_setup_mode = 1;
+		scratch.array1[5]._val1 = -1;
+		aa[5] = kernel_run_animation(kernel_name('b', 5), 111);
+		scratch._ae = 1;
+		goto handled;
+	}
+
+	goto done;
+handled:
+	player.command_ready = false;
+done:
+	;
 }
 
 void room_101_synchronize(Common::Serializer &s) {
 	for (int16 &v : scratch.sprite)    s.syncAsSint16LE(v);
 	for (int16 &v : scratch.sequence)  s.syncAsSint16LE(v);
-	for (int16 &v : scratch.animation) s.syncAsSint16LE(v);
+	for (auto &v : scratch.array1)     v.synchronize(s);
 }
 
 void room_101_preload() {


Commit: 192459af28c3d4d885fae49b1f5dbaa1b7919dc2
    https://github.com/scummvm/scummvm/commit/192459af28c3d4d885fae49b1f5dbaa1b7919dc2
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-05-31T19:45:04+10:00

Commit Message:
MADS: DRAGONSPHERE: Workaround taking rope in room 605

Changed paths:
    engines/mads/madsv2/core/matte.cpp


diff --git a/engines/mads/madsv2/core/matte.cpp b/engines/mads/madsv2/core/matte.cpp
index e6aa7f8c0b6..800c50f545a 100644
--- a/engines/mads/madsv2/core/matte.cpp
+++ b/engines/mads/madsv2/core/matte.cpp
@@ -368,16 +368,21 @@ static void make_matte(ImagePtr image, MattePtr matte) {
 		matte->x = image->x - picture_map.pan_x;
 		matte->y = image->y - picture_map.pan_y;
 
-		sprite = &series_list[image->series_id]->index[(image->sprite_id & SPRITE_MASK) - 1];
-
-		if (image->scale == IMAGE_UNSCALED) {
-			xs = sprite->xs;
-			ys = sprite->ys;
+		if (!series_list[image->series_id]) {
+			// WORKAROUND: Handle invalid sprites
+			xs = ys = 0;
 		} else {
-			xs = (50 + (sprite->xs * image->scale)) / 100;
-			ys = (50 + (sprite->ys * image->scale)) / 100;
-			matte->x -= (xs >> 1);
-			matte->y -= (ys - 1);
+			sprite = &series_list[image->series_id]->index[(image->sprite_id & SPRITE_MASK) - 1];
+
+			if (image->scale == IMAGE_UNSCALED) {
+				xs = sprite->xs;
+				ys = sprite->ys;
+			} else {
+				xs = (50 + (sprite->xs * image->scale)) / 100;
+				ys = (50 + (sprite->ys * image->scale)) / 100;
+				matte->x -= (xs >> 1);
+				matte->y -= (ys - 1);
+			}
 		}
 	}
 




More information about the Scummvm-git-logs mailing list