[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