[Scummvm-git-logs] scummvm master -> 67f0e03c4619982f23ec4f19916f69842cca22b0

dreammaster noreply at scummvm.org
Wed Oct 7 05:35:42 UTC 2026


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

Summary:
04ed851670 MADS: FOREST: Drive the room 203 path-reveal talk animation
9d87a8a741 MADS: FOREST: Update room 203 path-reveal state
e582738608 MADS: FOREST: Disable the vine weed hotspot after pickup
79b78d1523 MADS: FOREST: Avoid invalid room 307 animation synchronization
bd82c2f09e MADS: FOREST: Restore room 402 hotspot cursors
8247e83255 MADS: FOREST: Restore room 308 walker preload state
39456eae2c MADS: FOREST: Restore room 321 pickup animation setup
98d3d28aff MADS: FOREST: Preserve room 501 trigger state
40ebeba2a5 MADS: FOREST: Document native quirks preserved from the original
67f0e03c46 MADS: FOREST: Fix kernel_synch params in room 302 daemon


Commit: 04ed8516708dc85bdcc42afc31e3ea103643496c
    https://github.com/scummvm/scummvm/commit/04ed8516708dc85bdcc42afc31e3ea103643496c
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-10-07T16:34:09+11:00

Commit Message:
MADS: FOREST: Drive the room 203 path-reveal talk animation

Thanks to Tropp

Changed paths:
    engines/mads/forest/rooms/room203.cpp


diff --git a/engines/mads/forest/rooms/room203.cpp b/engines/mads/forest/rooms/room203.cpp
index 4929dc012fc..c3cbb252776 100644
--- a/engines/mads/forest/rooms/room203.cpp
+++ b/engines/mads/forest/rooms/room203.cpp
@@ -1772,7 +1772,7 @@ static void room_203_parser() {
 			player.walker_visible = false;
 			scratch._a2 = kernel_run_animation_talk('b', 7, 0);
 			extra_change_animation(scratch._a2, player.x, player.y, player.scale, player.depth);
-			scratch._b4 = -1;
+			scratch._b2 = -1;
 			kernel_synch(KERNEL_ANIM, scratch._a2, KERNEL_PLAYER, 0);
 			digi_play_build_ii('b', 1, 1);
 			scratch._a4 = 30;


Commit: 9d87a8a74144eb689b75334b799e62e1df7b70ad
    https://github.com/scummvm/scummvm/commit/9d87a8a74144eb689b75334b799e62e1df7b70ad
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-10-07T16:34:09+11:00

Commit Message:
MADS: FOREST: Update room 203 path-reveal state

Thanks to Tropp

Changed paths:
    engines/mads/forest/rooms/room203.cpp


diff --git a/engines/mads/forest/rooms/room203.cpp b/engines/mads/forest/rooms/room203.cpp
index c3cbb252776..f9be7336a8e 100644
--- a/engines/mads/forest/rooms/room203.cpp
+++ b/engines/mads/forest/rooms/room203.cpp
@@ -1399,6 +1399,7 @@ static void room_203_daemon() {
 			global[g133] = 0;
 			global[g143] = 0;
 
+			kernel_flip_hotspot(words_moss, false);
 			kernel_flip_hotspot(words_room_210, true);
 			seq[1] = kernel_seq_stamp(ss[1], false, -1);
 			kernel_seq_depth(seq[1], 15);


Commit: e582738608905b93c68f62510775c8c591d76639
    https://github.com/scummvm/scummvm/commit/e582738608905b93c68f62510775c8c591d76639
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-10-07T16:34:09+11:00

Commit Message:
MADS: FOREST: Disable the vine weed hotspot after pickup

Thanks to Tropp

Changed paths:
    engines/mads/forest/rooms/room204.cpp


diff --git a/engines/mads/forest/rooms/room204.cpp b/engines/mads/forest/rooms/room204.cpp
index c43f717d66f..c51b9157dec 100644
--- a/engines/mads/forest/rooms/room204.cpp
+++ b/engines/mads/forest/rooms/room204.cpp
@@ -139,7 +139,7 @@ static void room_204_init() {
 		kernel_seq_loc(seq[0], 293, 87);
 		kernel_seq_scale(seq[0], 54);
 	} else {
-		kernel_flip_hotspot(words_vine_weed, true);
+		kernel_flip_hotspot(words_vine_weed, false);
 	}
 
 	if (previous_room != KERNEL_RESTORING_GAME) {
@@ -519,7 +519,7 @@ trigger_103:
 	kernel_reset_animation(local->_9a, 1);
 	kernel_synch(3, local->_9a, 4, 0);
 	global[g133] = 0;
-	kernel_flip_hotspot(words_vine_weed, true);
+	kernel_flip_hotspot(words_vine_weed, false);
 	inter_move_object(vine_weed, PLAYER);
 	global[play_background_sounds] = -1;
 	player.commands_allowed = true;


Commit: 79b78d15233bdcf85385efa87efda380d6f71619
    https://github.com/scummvm/scummvm/commit/79b78d15233bdcf85385efa87efda380d6f71619
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-10-07T16:34:09+11:00

Commit Message:
MADS: FOREST: Avoid invalid room 307 animation synchronization

Thanks to Tropp

Changed paths:
    engines/mads/forest/rooms/room307.cpp


diff --git a/engines/mads/forest/rooms/room307.cpp b/engines/mads/forest/rooms/room307.cpp
index 15eb1269360..322190993bf 100644
--- a/engines/mads/forest/rooms/room307.cpp
+++ b/engines/mads/forest/rooms/room307.cpp
@@ -636,15 +636,17 @@ static void room_307_daemon() {
 			kernel_abort_animation(scratch._9c);
 			scratch._9a = -1;
 			scratch._9c = -1;
+			// Retail uses scratch._9c as the synchronization master below even
+			// after setting it to -1. Use NOW to avoid indexing kernel_anim[-1].
 			if (player_has(lily_pad)) {
 				aa[8] = kernel_run_animation(kernel_name('R', 4), 111);
 				aainfo[8]._active = -1;
 				scratch._92 = 32;
-				kernel_synch(KERNEL_ANIM, aa[8], KERNEL_ANIM, scratch._9c);
+				kernel_synch(KERNEL_ANIM, aa[8], KERNEL_NOW, 0);
 			} else {
 				aa[9] = kernel_run_animation(kernel_name('R', 3), 111);
 				aainfo[9]._active = -1;
-				kernel_synch(KERNEL_ANIM, aa[9], KERNEL_ANIM, scratch._9c);
+				kernel_synch(KERNEL_ANIM, aa[9], KERNEL_NOW, 0);
 			}
 		} else if (scratch._a2 == 3) {
 			aa[2] = kernel_run_animation(kernel_name('R', 2), 0);


Commit: bd82c2f09ebd72313b014015ca89efbfc68eefe4
    https://github.com/scummvm/scummvm/commit/bd82c2f09ebd72313b014015ca89efbfc68eefe4
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-10-07T16:34:09+11:00

Commit Message:
MADS: FOREST: Restore room 402 hotspot cursors

Thanks to Tropp

Changed paths:
    engines/mads/forest/rooms/room402.cpp


diff --git a/engines/mads/forest/rooms/room402.cpp b/engines/mads/forest/rooms/room402.cpp
index facfc0ad752..169fd7c6fcf 100644
--- a/engines/mads/forest/rooms/room402.cpp
+++ b/engines/mads/forest/rooms/room402.cpp
@@ -202,6 +202,14 @@ static void room_402_init() {
 }
 
 static void room_402_anim5() {
+	scratch._9e = 0;
+	room_spots[3].cursor_number = 1;
+	room_spots[4].cursor_number = 1;
+	room_spots[7].cursor_number = 1;
+	room_spots[8].cursor_number = 1;
+	room_spots[9].cursor_number = 1;
+	room_spots[10].cursor_number = 1;
+	room_spots[11].cursor_number = 1;
 }
 
 static void room_402_anim_case7() {


Commit: 8247e832550018616581a44beaea696f915e6abc
    https://github.com/scummvm/scummvm/commit/8247e832550018616581a44beaea696f915e6abc
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-10-07T16:34:09+11:00

Commit Message:
MADS: FOREST: Restore room 308 walker preload state

Thanks to Tropp

Changed paths:
    engines/mads/forest/rooms/room308.cpp


diff --git a/engines/mads/forest/rooms/room308.cpp b/engines/mads/forest/rooms/room308.cpp
index 81686cdf51f..eed8fbfeb38 100644
--- a/engines/mads/forest/rooms/room308.cpp
+++ b/engines/mads/forest/rooms/room308.cpp
@@ -1360,9 +1360,9 @@ void room_308_preload() {
 	room_parser_code_pointer     = room_308_parser;
 	room_daemon_code_pointer     = room_308_daemon;
 
+	global[g016] = -1;
 	global_section_walker();
 	global_section_interface();
-	player.walker_must_reload = true;
 }
 
 } // namespace Rooms


Commit: 39456eae2c940816617bf32b279966f14310dccd
    https://github.com/scummvm/scummvm/commit/39456eae2c940816617bf32b279966f14310dccd
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-10-07T16:34:09+11:00

Commit Message:
MADS: FOREST: Restore room 321 pickup animation setup

Thanks to Tropp

Changed paths:
    engines/mads/forest/rooms/room321.cpp


diff --git a/engines/mads/forest/rooms/room321.cpp b/engines/mads/forest/rooms/room321.cpp
index 6de9b9bf6e3..6addda35437 100644
--- a/engines/mads/forest/rooms/room321.cpp
+++ b/engines/mads/forest/rooms/room321.cpp
@@ -182,6 +182,57 @@ static void room_321_init() {
 	room_321_init1();
 }
 
+static void room_321_prepare_pickup_animation() {
+	kernel_abort_animation(aa[8]);
+	aainfo[8]._active = 0;
+	kernel_abort_animation(aa[7]);
+	aainfo[7]._active = 0;
+
+	if (global[g071] != 0) {
+		kernel_abort_animation(aa[5]);
+		aainfo[5]._active = 0;
+
+		ss[1] = kernel_load_series(kernel_name('p', 5), 0);
+		ss[2] = kernel_load_series(kernel_name('h', 9), 0);
+
+		seq[1] = kernel_seq_stamp(ss[1], false, -1);
+		kernel_seq_depth(seq[1], 15);
+		kernel_seq_loc(seq[1], 230, 105);
+		kernel_seq_scale(seq[1], 83);
+
+		seq[2] = kernel_seq_stamp(ss[2], false, -1);
+		kernel_seq_depth(seq[2], 14);
+		kernel_seq_loc(seq[2], 230, 105);
+		kernel_seq_scale(seq[2], 100);
+	}
+
+	ss[3] = kernel_load_series(kernel_name('z', 9), 0);
+	seq[3] = kernel_seq_stamp(ss[3], false, -1);
+	kernel_seq_depth(seq[3], 7);
+	kernel_seq_loc(seq[3], 292, 32);
+	kernel_seq_scale(seq[3], 45);
+}
+
+static void room_321_finish_pickup_animation() {
+	kernel_seq_delete(seq[3]);
+	matte_deallocate_series(ss[3], -1);
+
+	if (global[g071] != 0) {
+		kernel_seq_delete(seq[2]);
+		kernel_seq_delete(seq[1]);
+		matte_deallocate_series(ss[2], -1);
+		matte_deallocate_series(ss[1], -1);
+
+		aa[5] = kernel_run_animation(kernel_name('H', 1), 104);
+		aainfo[5]._active = -1;
+	}
+
+	aa[7] = kernel_run_animation(kernel_name('L', 3), 104);
+	aainfo[7]._active = -1;
+	aa[8] = kernel_run_animation(kernel_name('L', 2), 104);
+	aainfo[8]._active = -1;
+}
+
 static void room_321_anim1() {
 	int16 cur = kernel_anim[aa[0]].frame;
 	if (cur != aainfo[0]._frame)
@@ -633,10 +684,10 @@ static void room_321_daemon() {
 			global[g143] = 1;
 		} else if (t == 5) {
 			if (scratch._a6 == 1) {
-				room_321_anim1();
+				room_321_prepare_pickup_animation();
 				aa[3] = kernel_run_animation(kernel_name('P', 1), 103);
 			} else if (scratch._a6 == 2) {
-				room_321_anim1();
+				room_321_prepare_pickup_animation();
 				aa[3] = kernel_run_animation(kernel_name('P', 2), 103);
 			} else {
 				break;
@@ -707,7 +758,7 @@ static void room_321_daemon() {
 			kernel_reset_animation(scratch._9a, 1);
 			kernel_synch(KERNEL_ANIM, scratch._9a, KERNEL_NOW, 0);
 			global[g133] = 0;
-			room_321_anim2();
+			room_321_finish_pickup_animation();
 			kernel_flip_hotspot(words_reeds, false);
 			inter_move_object(6, PLAYER);
 			global[play_background_sounds] = -1;
@@ -722,7 +773,7 @@ static void room_321_daemon() {
 			kernel_reset_animation(scratch._9a, 1);
 			kernel_synch(KERNEL_ANIM, scratch._9a, KERNEL_NOW, 0);
 			global[g133] = 0;
-			room_321_anim2();
+			room_321_finish_pickup_animation();
 			kernel_flip_hotspot(words_pebbles, false);
 			if (!player_has(pebbles))
 				inter_move_object(pebbles, PLAYER);


Commit: 98d3d28affa93d98ecdecee81fc06d7ac31b6259
    https://github.com/scummvm/scummvm/commit/98d3d28affa93d98ecdecee81fc06d7ac31b6259
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-10-07T16:34:10+11:00

Commit Message:
MADS: FOREST: Preserve room 501 trigger state

Thanks to Tropp

Changed paths:
    engines/mads/forest/rooms/room501.cpp


diff --git a/engines/mads/forest/rooms/room501.cpp b/engines/mads/forest/rooms/room501.cpp
index 6f4bda7466b..4626969561a 100644
--- a/engines/mads/forest/rooms/room501.cpp
+++ b/engines/mads/forest/rooms/room501.cpp
@@ -446,7 +446,8 @@ static void room_501_daemon() {
 		kernel_reset_animation(scratch._9c, 0);
 		global[g133] = 1;
 		global[g143] = 1;
-		scratch._90--;
+		// The retail executable decrements a temporary copy of scratch._90 here,
+		// but never stores it back. Preserve that no-op behavior.
 		break;
 
 	case 27:


Commit: 40ebeba2a562e6bb64dfba8ccacfaf6f3b007463
    https://github.com/scummvm/scummvm/commit/40ebeba2a562e6bb64dfba8ccacfaf6f3b007463
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-10-07T16:34:10+11:00

Commit Message:
MADS: FOREST: Document native quirks preserved from the original

Thanks to Tropp

Changed paths:
    engines/mads/forest/rooms/room101.cpp
    engines/mads/forest/rooms/room104.cpp
    engines/mads/forest/rooms/room106.cpp
    engines/mads/forest/rooms/room203.cpp
    engines/mads/forest/rooms/room205.cpp
    engines/mads/forest/rooms/room220.cpp
    engines/mads/forest/rooms/room304.cpp
    engines/mads/forest/rooms/room306.cpp
    engines/mads/forest/rooms/room510.cpp


diff --git a/engines/mads/forest/rooms/room101.cpp b/engines/mads/forest/rooms/room101.cpp
index f7b0e59284d..d7e5d03594e 100644
--- a/engines/mads/forest/rooms/room101.cpp
+++ b/engines/mads/forest/rooms/room101.cpp
@@ -500,6 +500,8 @@ static void room_101_anim8() {
 		stop_speech_on_run_animation = false;
 		aa[9] = kernel_run_animation(kernel_name('I', 2), 0);
 		aainfo[9]._active = -1;
+		// Retail also synchronizes I2 to the just-aborted I1 animation. Keep
+		// the old master handle here rather than replacing it with KERNEL_NOW.
 		kernel_synch(KERNEL_ANIM, aa[9], KERNEL_ANIM, aa[8]);
 	}
 	kernel_timing_trigger(1, 113);
diff --git a/engines/mads/forest/rooms/room104.cpp b/engines/mads/forest/rooms/room104.cpp
index 22f7fbd7450..68ea25fe7fc 100644
--- a/engines/mads/forest/rooms/room104.cpp
+++ b/engines/mads/forest/rooms/room104.cpp
@@ -463,6 +463,8 @@ static void room_104_anim2() {
 			stop_speech_on_run_animation = false;
 			aa[8] = kernel_run_animation(kernel_name('T', 2), 0);
 			aainfo[8]._active = -1;
+			// Retail also synchronizes the just-aborted T1 slot to T2. Although
+			// this looks redundant after aborting T1, preserve the native call.
 			kernel_synch(KERNEL_ANIM, aa[7], KERNEL_ANIM, aa[8]);
 			break;
 		}
diff --git a/engines/mads/forest/rooms/room106.cpp b/engines/mads/forest/rooms/room106.cpp
index 01baea3980c..7639f1cdd01 100644
--- a/engines/mads/forest/rooms/room106.cpp
+++ b/engines/mads/forest/rooms/room106.cpp
@@ -779,6 +779,8 @@ static void room_106_parser() {
 	if (player_parse(words_pick_up, words_flowers, 0) || player_parse(words_click_on, words_moss, 0)) {
 		player.commands_allowed = false;
 		global[g135] = -1;
+		// Retail stores 3 here too, even though trigger 24 dispatches on
+		// scratch._a2. Preserve the apparently unused state write for parity.
 		scratch._8c = 3;
 		player.command_ready = 0;
 		return;
diff --git a/engines/mads/forest/rooms/room203.cpp b/engines/mads/forest/rooms/room203.cpp
index f9be7336a8e..4298eb6e9e5 100644
--- a/engines/mads/forest/rooms/room203.cpp
+++ b/engines/mads/forest/rooms/room203.cpp
@@ -1235,6 +1235,9 @@ static void room_203_daemon() {
 		break;
 
 	case 26:
+		// The retail executable also indexes aa[] with these display-animation
+		// handles here (and in case 55 below). It looks like a handle-space
+		// mix-up, but preserve the native behavior rather than guessing at a fix.
 		kernel_reset_animation(local->_9e, 0);
 		kernel_synch(KERNEL_ANIM, aa[local->_9e], KERNEL_NOW, 0);
 		global[g133] = 1;
diff --git a/engines/mads/forest/rooms/room205.cpp b/engines/mads/forest/rooms/room205.cpp
index 1e2142e43a0..6cff06ba6c4 100644
--- a/engines/mads/forest/rooms/room205.cpp
+++ b/engines/mads/forest/rooms/room205.cpp
@@ -314,6 +314,9 @@ static void room_205_daemon() {
 		kernel_reset_animation(local->_9c, 0);
 		global[g133] = 1;
 		global[g143] = 1;
+		// Retail decrements only a temporary copy of scratch._90 here and never
+		// stores the result back. There is intentionally no scratch._90-- in the
+		// port.
 		break;
 
 	case 28:
diff --git a/engines/mads/forest/rooms/room220.cpp b/engines/mads/forest/rooms/room220.cpp
index dd225c76195..f07d72b5cdc 100644
--- a/engines/mads/forest/rooms/room220.cpp
+++ b/engines/mads/forest/rooms/room220.cpp
@@ -93,6 +93,9 @@ static void room_220_anim1() {
 		aa[1] = kernel_run_animation("*RM220Y12", 0);
 		aainfo[1]._active = -1;
 		scratch._92 = 55;
+		// Retail also synchronizes the just-aborted Y11 slot to Y12 here. The
+		// old slot no longer has an active animation, so this looks redundant,
+		// but keep the native clock update for parity.
 		kernel_synch(KERNEL_ANIM, aa[0], KERNEL_ANIM, aa[1]);
 	} else if (f < 121) {
 		if (f == 52) {
diff --git a/engines/mads/forest/rooms/room304.cpp b/engines/mads/forest/rooms/room304.cpp
index 1665fd105f3..6a4d08a8465 100644
--- a/engines/mads/forest/rooms/room304.cpp
+++ b/engines/mads/forest/rooms/room304.cpp
@@ -458,6 +458,9 @@ static void room_304_daemon() {
 		break;
 
 	case 101:
+		// Retail also uses scratch._94 as an aa[] index here, although this
+		// room never assigns it locally. Preserve the original behavior rather
+		// than guessing at the intended animation slot.
 		kernel_abort_animation(aa[scratch._94]);
 		aainfo[scratch._94]._active = 0;
 		kernel_reset_animation(scratch._9c, 1);
diff --git a/engines/mads/forest/rooms/room306.cpp b/engines/mads/forest/rooms/room306.cpp
index 665faf9135f..355e330952b 100644
--- a/engines/mads/forest/rooms/room306.cpp
+++ b/engines/mads/forest/rooms/room306.cpp
@@ -809,6 +809,9 @@ static void room_306_daemon() {
 		break;
 
 	case 101:
+		// Retail also uses scratch.x94 as an aa[] index here, although this
+		// room never assigns it locally. Preserve the original behavior rather
+		// than guessing at the intended animation slot.
 		kernel_abort_animation(aa[scratch.x94]);
 		aainfo[scratch.x94]._active = 0;
 		kernel_reset_animation(scratch.x9c, 1);
diff --git a/engines/mads/forest/rooms/room510.cpp b/engines/mads/forest/rooms/room510.cpp
index 73bde33c5b9..af6eb8bdc44 100644
--- a/engines/mads/forest/rooms/room510.cpp
+++ b/engines/mads/forest/rooms/room510.cpp
@@ -201,6 +201,8 @@ static void room_510_anim2() {
 		} else if (scratch._8e == 91) {
 			scratch._8e = 132;
 			digi_play_build(510, 'r', 1, 1);
+		// The retail executable checks for 133 here even though the preceding
+		// transition stores 132. Preserve the apparently unreachable branch.
 		} else if (scratch._8e == 133) {
 			scratch._8e = -1;
 		}


Commit: 67f0e03c4619982f23ec4f19916f69842cca22b0
    https://github.com/scummvm/scummvm/commit/67f0e03c4619982f23ec4f19916f69842cca22b0
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-10-07T16:34:10+11:00

Commit Message:
MADS: FOREST: Fix kernel_synch params in room 302 daemon

Thanks to Tropp

Changed paths:
    engines/mads/forest/rooms/room302.cpp


diff --git a/engines/mads/forest/rooms/room302.cpp b/engines/mads/forest/rooms/room302.cpp
index fde5630e7ab..4f73fb492b8 100644
--- a/engines/mads/forest/rooms/room302.cpp
+++ b/engines/mads/forest/rooms/room302.cpp
@@ -618,8 +618,8 @@ static void room_302_daemon() {
 			if (scratch._a8 == 1) {
 				kernel_reset_animation(scratch._9a, 0);
 				kernel_reset_animation(scratch._9c, 0);
-				kernel_synch(KERNEL_ANIM, scratch._9a, KERNEL_NOW, 0);
-				kernel_synch(KERNEL_ANIM, scratch._9c, KERNEL_NOW, 0);
+				kernel_synch(KERNEL_ANIM, aa[scratch._9a], KERNEL_NOW, 0);
+				kernel_synch(KERNEL_ANIM, aa[scratch._9c], KERNEL_NOW, 0);
 				global[g133] = 1;
 				global[g143] = 1;
 				global[g131] = 0;




More information about the Scummvm-git-logs mailing list