[Scummvm-git-logs] scummvm master -> 7d09fb5b28b65598dede020bfabec25edc306fd3

dreammaster noreply at scummvm.org
Thu Oct 10 05:25:27 UTC 2024


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

Summary:
d2074c5959 M4: RIDDLE: Room 304 snake fixes
7d09fb5b28 M4: RIDDLE: Properly implement triggerMachineByHash_3000


Commit: d2074c59596621cf3a8122c03a9e6fa19cae918c
    https://github.com/scummvm/scummvm/commit/d2074c59596621cf3a8122c03a9e6fa19cae918c
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-10-09T21:27:26-07:00

Commit Message:
M4: RIDDLE: Room 304 snake fixes

Changed paths:
    engines/m4/riddle/rooms/section3/room304.cpp
    engines/m4/riddle/rooms/section3/room304.h


diff --git a/engines/m4/riddle/rooms/section3/room304.cpp b/engines/m4/riddle/rooms/section3/room304.cpp
index ef0a8099d8d..7e6795ed7a3 100644
--- a/engines/m4/riddle/rooms/section3/room304.cpp
+++ b/engines/m4/riddle/rooms/section3/room304.cpp
@@ -81,7 +81,8 @@ void Room304::init() {
 			digi_preload("304_s04");
 			player_set_commands_allowed(false);
 
-			_val2 = _val3 = _val4 = 0;
+			_useSword = _useHandlingStick = false;
+			_val4 = 0;
 			ws_demand_location(452, 285, 9);
 			kernel_timing_trigger(1, 49);
 			_trunk = series_show_sprite("one frame trunk", 0, 0);
@@ -154,7 +155,7 @@ void Room304::daemon() {
 
 void Room304::pre_parser() {
 	bool takeFlag = player_said("take");
-	bool gearFlag = player_said("gear");
+	bool useFlag = player_said("gear");
 
 	if (_flag1) {
 		terminateMachineAndNull(_machine3);
@@ -164,31 +165,32 @@ void Room304::pre_parser() {
 		interface_show();
 	}
 
+	// At the very start of the game, you can't freely move around
+	// the room until the Cobra has been dealt with
 	if (_G(flags)[V001]) {
-		_G(player).need_to_walk = false;
-		_G(player).ready_to_walk = true;
-		_G(player).waiting_for_walk = false;
+		_G(player).resetWalk();
 
-		if ((takeFlag || gearFlag) && player_said("samurai sword")) {
+		if ((takeFlag || useFlag) && player_said("samurai sword")) {
 			player_set_commands_allowed(false);
-			_val2 = 1;
+			_useSword = true;
 			digi_preload("304_s10");
 			digi_preload("304_s05");
 			_cutSnake = series_load("CUT SNAKE");
 			sendWSMessage(0xa0000, 0, _machine2, 0, nullptr, 1);
 		}
 
-		if ((takeFlag || gearFlag) && player_said("handling stick")) {
+		if ((takeFlag || useFlag) && player_said("handling stick")) {
 			digi_preload("304_s03");
 			digi_preload("304_s08");
 			digi_preload("304_s02");
 			digi_preload("304_s11");
+			_useHandlingStick = true;
 		}
 	}
 }
 
 void Room304::parser() {
-	bool lookFlag = player_said_any("look", "look any");
+	bool lookFlag = player_said_any("look", "look at");
 	bool takeFlag = player_said("take");
 	bool useFlag = player_said_any("push", "pull", "gear", "open", "close");
 
@@ -273,11 +275,10 @@ void Room304::parser() {
 			digi_play("304r64", 1);
 		}
 	} else if (_G(flags)[V001] && (takeFlag || useFlag) && player_said("handling stick")) {
-		// This is such an enormous switch in the original that
-		// it's been refactored to it's own method
+		// Catching snake with the handling stick
 		handlingStick();
 	
-	} if (lookFlag && player_said_any("native mask", "shield")) {
+	} else if (lookFlag && player_said_any("native mask", "shield")) {
 		digi_play("304r05", 1);
 	} else if (lookFlag && player_said("mailbag")) {
 		digi_play("304r15", 1);
@@ -418,23 +419,24 @@ void Room304::intrMsg(frac16 myMessage, struct machine *sender) {
 			return;
 		}
 
-		if (r->_val3) {
+		if (r->_useHandlingStick) {
 			ws_demand_location(382, 295);
+			ws_hide_walker();
 			player_set_commands_allowed(false);
 			terminateMachineAndNull(r->_machine2);
 			terminateMachineAndNull(r->_stick);
 			digi_stop(1);
 			terminateMachineAndNull(r->_trunk);
 
-			r->_handle = series_stream("SNAKE HANDLE", 5, 0, 17);
-			series_stream_break_on_frame(r->_handle, 10, 13);
+			r->_safe3 = series_stream("SNAKE HANDLE", 5, 0, 17);
+			series_stream_break_on_frame(r->_safe3, 10, 13);
 			sendWSMessage(0x200000, 0, r->_machine1, 0, nullptr, 1);
 			_G(flags)[V084] = 2;
 			return;
 		}
 	}
 
-	if ((myMessage >> 16) == 58 && r->_val2) {
+	if ((myMessage >> 16) == 58 && r->_useSword) {
 		ws_demand_location(382, 295);
 		ws_hide_walker();
 		player_set_commands_allowed(false);
@@ -454,19 +456,19 @@ void Room304::intrMsg(frac16 myMessage, struct machine *sender) {
 void Room304::handlingStick() {
 	switch (_G(kernel).trigger) {
 	case 13:
-		series_stream_break_on_frame(_field64, 29, 14);
+		series_stream_break_on_frame(_safe3, 29, 14);
 		digi_play("304_s03", 1);
 		break;
 	case 14:
-		series_stream_break_on_frame(_field64, 106, 15);
+		series_stream_break_on_frame(_safe3, 106, 15);
 		digi_play("304_s08", 1);
 		break;
 	case 15:
-		series_stream_break_on_frame(_field64, 111, 16);
+		series_stream_break_on_frame(_safe3, 111, 16);
 		digi_play("304_s02", 1);
 		break;
 	case 16:
-		series_stream_break_on_frame(_field64, 145, 19);
+		series_stream_break_on_frame(_safe3, 145, 19);
 		midi_stop();
 		digi_play("304_s11", 1);
 		break;
@@ -798,7 +800,7 @@ void Room304::handlingStick() {
 		_suit1 = series_load("rip suit rt hand gest talk pos3");
 		setGlobals1(_suit1, 1, 11, 12, 15, 1);
 		sendWSMessage_110000(73);
-		digi_play(_val3 ? "304r24" : "304r23", 1, 255, 73);
+		digi_play(_useHandlingStick ? "304r24" : "304r23", 1, 255, 73);
 		sendWSMessage_10000(_machine1, 242, 274, 3, 18, 0);
 		break;
 
@@ -816,7 +818,7 @@ void Room304::handlingStick() {
 		_suit3 = series_load("mei ny hands out talk pos4");
 		setGlobals1(_suit3, 1, 9, 10, 15, 1);
 		sendWSMessage_110000(71);
-		digi_play(_val3 ? "304m03" : "304m02", 1, 255, 71);
+		digi_play(_useHandlingStick ? "304m03" : "304m02", 1, 255, 71);
 		break;
 
 	case 75:
diff --git a/engines/m4/riddle/rooms/section3/room304.h b/engines/m4/riddle/rooms/section3/room304.h
index 3b23aacf59e..a60c13444be 100644
--- a/engines/m4/riddle/rooms/section3/room304.h
+++ b/engines/m4/riddle/rooms/section3/room304.h
@@ -32,20 +32,18 @@ class Room304 : public Room {
 private:
 	bool _flag1 = false;
 	int _val1 = 0;
-	int _val2 = 0;
-	int _val3 = 0;
+	bool _useSword = false;
+	bool _useHandlingStick = false;
 	int _val4 = 0;
 	machine *_sword = nullptr;
 	machine *_trunk = nullptr;
 	machine *_stick = nullptr;
-	machine *_handle = nullptr;
 	int _smoke = -1;
 	machine *_machine1 = nullptr;
 	machine *_machine2 = nullptr;
 	machine *_machine3 = nullptr;
 	machine *_pu = nullptr;
 	machine *_cobraKills = nullptr;
-	machine *_field64 = nullptr;
 	machine *_field60 = nullptr;
 	int _cutSnake = -1;
 	int _mei1 = -1;


Commit: 7d09fb5b28b65598dede020bfabec25edc306fd3
    https://github.com/scummvm/scummvm/commit/7d09fb5b28b65598dede020bfabec25edc306fd3
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-10-09T22:25:09-07:00

Commit Message:
M4: RIDDLE: Properly implement triggerMachineByHash_3000

Changed paths:
    engines/m4/riddle/rooms/room.cpp
    engines/m4/riddle/rooms/room.h
    engines/m4/riddle/rooms/section3/room303.cpp
    engines/m4/riddle/rooms/section3/room304.cpp
    engines/m4/riddle/rooms/section4/room402.cpp
    engines/m4/riddle/rooms/section4/room403.cpp
    engines/m4/riddle/rooms/section4/room404.cpp
    engines/m4/riddle/rooms/section4/room405.cpp
    engines/m4/riddle/rooms/section4/room408.cpp
    engines/m4/riddle/rooms/section5/room504.cpp
    engines/m4/riddle/rooms/section6/room603.cpp
    engines/m4/riddle/rooms/section6/room605.cpp
    engines/m4/riddle/rooms/section6/room608.cpp
    engines/m4/riddle/rooms/section6/room615.cpp
    engines/m4/riddle/rooms/section8/room801.cpp
    engines/m4/riddle/triggers.cpp
    engines/m4/riddle/triggers.h


diff --git a/engines/m4/riddle/rooms/room.cpp b/engines/m4/riddle/rooms/room.cpp
index 723e19f212c..06d9e5e24dc 100644
--- a/engines/m4/riddle/rooms/room.cpp
+++ b/engines/m4/riddle/rooms/room.cpp
@@ -47,52 +47,6 @@ void Room::restoreAutosave() {
 	}
 }
 
-void Room::triggerMachineByHashCallback(frac16 myMessage, machine *) {
-	int32 hi = myMessage >> 16;
-
-	if (hi >= 0)
-		kernel_trigger_dispatch_now(hi);
-}
-
-void Room::triggerMachineByHashCallbackNegative(frac16 myMessage, machine *) {
-	int32 hi = myMessage >> 16;
-
-	if (hi < 0)
-		kernel_trigger_dispatchx(hi);
-}
-
-void Room::triggerMachineByHashCallbackAlways(frac16 myMessage, machine *sender) {
-	kernel_trigger_dispatchx(myMessage);
-}
-
-void Room::triggerMachineByHashCallback3000(frac16 myMessage, machine *sender) {
-	int triggerType = _G(globals)[GLB_TEMP_1] >> 16;
-	int param = _G(globals)[GLB_TEMP_2] >> 16;
-	int msg = myMessage >> 16;
-
-	switch (triggerType) {
-	case 0:
-		break;
-
-	case 1:
-	case 3:
-		if (msg >= 0)
-			kernel_trigger_dispatchx(myMessage);
-		break;
-
-	case 2:
-		if (param)
-			sendWSMessage(0x30000, triggerType, sender, 0, nullptr, 1);
-		else if(msg >= 0)
-			kernel_trigger_dispatchx(myMessage);
-		break;
-
-	default:
-		error("spawn walker callback with triggerType = %d", triggerType);
-		break;
-	}
-}
-
 int Room::checkFlags(bool flag) {
 	int count = 0;
 
diff --git a/engines/m4/riddle/rooms/room.h b/engines/m4/riddle/rooms/room.h
index 118568b57ec..c1e220a153f 100644
--- a/engines/m4/riddle/rooms/room.h
+++ b/engines/m4/riddle/rooms/room.h
@@ -41,12 +41,6 @@ private:
 	static int _ripSketching;
 
 protected:
-	static void intrMsgNull(frac16 myMessage, machine *sender) {}
-	static void triggerMachineByHashCallback(frac16 myMessage, machine *sender = nullptr);
-	static void triggerMachineByHashCallbackNegative(frac16 myMessage, machine *sender = nullptr);
-	static void triggerMachineByHashCallback3000(frac16 myMessage, machine *sender = nullptr);
-	static void triggerMachineByHashCallbackAlways(frac16 myMessage, machine *sender = nullptr);
-
 	void restoreAutosave();
 
 	/**
diff --git a/engines/m4/riddle/rooms/section3/room303.cpp b/engines/m4/riddle/rooms/section3/room303.cpp
index 43527637fc3..5593e3d48dc 100644
--- a/engines/m4/riddle/rooms/section3/room303.cpp
+++ b/engines/m4/riddle/rooms/section3/room303.cpp
@@ -148,7 +148,7 @@ void Room303::init() {
 
 			ws_walk_load_walker_series(S3_NORMAL_DIRS, S3_NORMAL_NAMES);
 			ws_walk_load_shadow_series(S3_SHADOW_DIRS, S3_SHADOW_NAMES);
-			_machine1 = triggerMachineByHash_3000(8, 2, S3_NORMAL_DIRS, S3_SHADOW_DIRS,
+			_machine1 = triggerMachineByHash_3000(8, 2, *S3_NORMAL_DIRS, *S3_SHADOW_DIRS,
 				470, 226, 9, triggerMachineByHashCallback3000, "fl");
 			_val13 = 1;
 
@@ -159,7 +159,7 @@ void Room303::init() {
 			ws_walk_load_walker_series(S3_NORMAL_DIRS2, S3_NORMAL_NAMES2);
 			ws_walk_load_shadow_series(S3_SHADOW_DIRS2, S3_SHADOW_NAMES2);
 
-			_hands4 = triggerMachineByHash_3000(8, 3, S3_NORMAL_DIRS2, S3_SHADOW_DIRS2,
+			_hands4 = triggerMachineByHash_3000(8, 3, *S3_NORMAL_DIRS2, *S3_SHADOW_DIRS2,
 				445, 215, 7, triggerMachineByHashCallback3000, "mc");
 			_gestTalk4 = series_load("mei ny lft hand gest talk pos4");
 			kernel_timing_trigger(1, 107);
@@ -1034,10 +1034,10 @@ void Room303::daemon() {
 				terminateMachineAndNull(_machine1);
 
 				if (_val13)
-					_machine1 = triggerMachineByHash_3000(8, 2, S3_NORMAL_DIRS, S3_SHADOW_DIRS,
+					_machine1 = triggerMachineByHash_3000(8, 2, *S3_NORMAL_DIRS, *S3_SHADOW_DIRS,
 						480, 256, 7, triggerMachineByHashCallback3000, "fl walker");
 				else
-					_machine1 = triggerMachineByHash_3000(8, 2, S3_NORMAL_DIRS, S3_SHADOW_DIRS,
+					_machine1 = triggerMachineByHash_3000(8, 2, *S3_NORMAL_DIRS, *S3_SHADOW_DIRS,
 						706, 256, 5, triggerMachineByHashCallback3000, "fl walker");
 
 				_G(kernel).trigger_mode = KT_PARSE;
diff --git a/engines/m4/riddle/rooms/section3/room304.cpp b/engines/m4/riddle/rooms/section3/room304.cpp
index 7e6795ed7a3..812428c3393 100644
--- a/engines/m4/riddle/rooms/section3/room304.cpp
+++ b/engines/m4/riddle/rooms/section3/room304.cpp
@@ -499,7 +499,7 @@ void Room304::handlingStick() {
 		_headUp1 = series_load("fl returns to head up");
 		_headUp2 = series_ranged_play("fl returns to head up",
 			1, 0, 0, 0, 100, 0x100, 250, 31);
-		_machine1 = triggerMachineByHash_3000(8, 3, S3_NORMAL_DIRS2, S3_SHADOW_DIRS2,
+		_machine1 = triggerMachineByHash_3000(8, 3, *S3_NORMAL_DIRS2, *S3_SHADOW_DIRS2,
 			464, 283, 8, triggerMachineByHashCallback3000, "mc");
 		ws_demand_facing(8);
 		kernel_timing_trigger(1, 74);
diff --git a/engines/m4/riddle/rooms/section4/room402.cpp b/engines/m4/riddle/rooms/section4/room402.cpp
index 7aacc31ba9b..d22629cd9d7 100644
--- a/engines/m4/riddle/rooms/section4/room402.cpp
+++ b/engines/m4/riddle/rooms/section4/room402.cpp
@@ -237,7 +237,7 @@ void Room402::init() {
 					_G(flags)[V131] = 408;
 					ws_demand_location(517, 239, 3);
 
-					_wolfWalker = triggerMachineByHash_3000(8, 8, S4_NORMAL_DIRS, S4_SHADOW_DIRS,
+					_wolfWalker = triggerMachineByHash_3000(8, 8, *S4_NORMAL_DIRS, *S4_SHADOW_DIRS,
 						475, 300, 11, triggerMachineByHashCallback3000, "wolf_walker");
 					sendWSMessage_10000(_wolfWalker, 549, 239, 9, 42, 0);
 					kernel_timing_trigger(90, 40);
@@ -1268,7 +1268,7 @@ void Room402::daemon() {
 
 	case 302:
 		terminateMachineAndNull(_wolfieMach);
-		_wolfWalker = triggerMachineByHash_3000(8, 8, S4_NORMAL_DIRS, S4_SHADOW_DIRS,
+		_wolfWalker = triggerMachineByHash_3000(8, 8, *S4_NORMAL_DIRS, *S4_SHADOW_DIRS,
 			484, 315, 11, triggerMachineByHashCallback3000, "wolf_walker");
 		sendWSMessage_10000(_wolfWalker, 517, 239, 9, -1, 0);
 
@@ -1343,7 +1343,7 @@ void Room402::daemon() {
 	case 357:
 		digi_play("402w11", 1);
 		terminateMachineAndNull(_wolfieMach);
-		_wolfWalker = triggerMachineByHash_3000(8, 8, S4_NORMAL_DIRS, S4_SHADOW_DIRS,
+		_wolfWalker = triggerMachineByHash_3000(8, 8, *S4_NORMAL_DIRS, *S4_SHADOW_DIRS,
 			484, 315, 11, triggerMachineByHashCallback3000, "wolf_walker");
 		sendWSMessage_10000(_wolfWalker, 517, 239, 9, -1, 0);
 		kernel_timing_trigger(150, 358);
diff --git a/engines/m4/riddle/rooms/section4/room403.cpp b/engines/m4/riddle/rooms/section4/room403.cpp
index c26c984ab32..87cb526a453 100644
--- a/engines/m4/riddle/rooms/section4/room403.cpp
+++ b/engines/m4/riddle/rooms/section4/room403.cpp
@@ -1227,7 +1227,7 @@ void Room403::daemon() {
 		break;
 
 	case 310:
-		_wolfWalker = triggerMachineByHash_3000(8, 8, S4_NORMAL_DIRS, S4_SHADOW_DIRS,
+		_wolfWalker = triggerMachineByHash_3000(8, 8, *S4_NORMAL_DIRS, *S4_SHADOW_DIRS,
 			620, 313, 3, triggerMachineByHashCallbackNegative, "wolf_walker");
 		DisposePath(_wolfWalker->walkPath);
 		_wolfWalker->walkPath = CreateCustomPath(1067, 313, -1);
@@ -1303,7 +1303,7 @@ void Room403::daemon() {
 		sendWSMessage_120000(-1);
 		terminateMachineAndNull(_wolfie);
 
-		_wolfWalker = triggerMachineByHash_3000(8, 8, S4_NORMAL_DIRS, S4_SHADOW_DIRS,
+		_wolfWalker = triggerMachineByHash_3000(8, 8, *S4_NORMAL_DIRS, *S4_SHADOW_DIRS,
 			1067, 313, 3, triggerMachineByHashCallback3000, "wolf_walker");
 		sendWSMessage_10000(_wolfWalker, 620, 313, 3, 324, 0);
 		break;
@@ -1908,7 +1908,7 @@ void Room403::edgerBell() {
 		if (_G(flags)[V119] >= 7) {
 			ws_walk_load_shadow_series(S4_SHADOW_DIRS, S4_SHADOW_NAMES);
 			ws_walk_load_walker_series(S4_NORMAL_DIRS, S4_NORMAL_NAMES);
-			_wolfWalker = triggerMachineByHash_3000(8, 8, S4_NORMAL_DIRS, S4_SHADOW_DIRS, 620, 323, 3,
+			_wolfWalker = triggerMachineByHash_3000(8, 8, *S4_NORMAL_DIRS, *S4_SHADOW_DIRS, 620, 323, 3,
 				triggerMachineByHashCallback3000, "wolf_walker");
 			_wolfAdmonish = series_load("WOLF ADMONISHES RIP");
 			kernel_timing_trigger(120, 4);
@@ -1955,7 +1955,7 @@ void Room403::edgerBell() {
 	case 9:
 		terminateMachineAndNull(_wolfie);
 		_wolfWalker = triggerMachineByHash_3000(8, 8,
-			S4_NORMAL_DIRS, S4_SHADOW_DIRS, 687, 323, 3,
+			*S4_NORMAL_DIRS, *S4_SHADOW_DIRS, 687, 323, 3,
 			triggerMachineByHashCallback3000, "wolf_walker");
 		sendWSMessage_10000(_wolfWalker, 620, 323, 3, 10, 0);
 		playNum2(_G(flags)[V119]);
diff --git a/engines/m4/riddle/rooms/section4/room404.cpp b/engines/m4/riddle/rooms/section4/room404.cpp
index 09bfb90d119..13e14aea3dc 100644
--- a/engines/m4/riddle/rooms/section4/room404.cpp
+++ b/engines/m4/riddle/rooms/section4/room404.cpp
@@ -105,7 +105,7 @@ void Room404::init() {
 		ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
 		ws_demand_location(340, 480, 2);
 
-		_machine1 = triggerMachineByHash_3000(8, 10, NORMAL_DIRS, SHADOW_DIRS,
+		_machine1 = triggerMachineByHash_3000(8, 10, *NORMAL_DIRS, *SHADOW_DIRS,
 			380, 421, 1, triggerMachineByHashCallback3000, "BUTLER_walker");
 
 		if (!_G(kittyScreaming) || !player_been_here(404)) {
@@ -183,7 +183,7 @@ void Room404::daemon() {
 
 	case 32:
 		terminateMachineAndNull(_butlerTalks);
-		_machine1 = triggerMachineByHash_3000(8, 10, NORMAL_DIRS, SHADOW_DIRS,
+		_machine1 = triggerMachineByHash_3000(8, 10, *NORMAL_DIRS, *SHADOW_DIRS,
 			390, 332, 9, triggerMachineByHashCallback3000, "BUTLER_walker");
 		kernel_timing_trigger(270, 33);
 		break;
diff --git a/engines/m4/riddle/rooms/section4/room405.cpp b/engines/m4/riddle/rooms/section4/room405.cpp
index 4bea6697508..c7f8c48dcdd 100644
--- a/engines/m4/riddle/rooms/section4/room405.cpp
+++ b/engines/m4/riddle/rooms/section4/room405.cpp
@@ -99,7 +99,7 @@ void Room405::init() {
 	} else {
 		ws_walk_load_shadow_series(SHADOW_DIRS, SHADOW_NAMES);
 		ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
-		_baron = triggerMachineByHash_3000(8, 11, NORMAL_DIRS, SHADOW_DIRS, 185, 365, 1,
+		_baron = triggerMachineByHash_3000(8, 11, *NORMAL_DIRS, *SHADOW_DIRS, 185, 365, 1,
 			triggerMachineByHashCallback3000, "BARON_walker");
 		ws_walk(329, 320, nullptr, 20, 9);
 	}
diff --git a/engines/m4/riddle/rooms/section4/room408.cpp b/engines/m4/riddle/rooms/section4/room408.cpp
index 6adf921bdd0..e7990618b5e 100644
--- a/engines/m4/riddle/rooms/section4/room408.cpp
+++ b/engines/m4/riddle/rooms/section4/room408.cpp
@@ -439,7 +439,7 @@ void Room408::daemon() {
 		break;
 
 	case 300:
-		_wolfWalker = triggerMachineByHash_3000(8, 8, S4_NORMAL_DIRS, S4_SHADOW_DIRS,
+		_wolfWalker = triggerMachineByHash_3000(8, 8, *S4_NORMAL_DIRS, *S4_SHADOW_DIRS,
 			-20, 345, 3, triggerMachineByHashCallback3000, "WOLF_WALKER");
 		sendWSMessage_10000(_wolfWalker, 660, 345, 9, -1, 0);
 		kernel_timing_trigger(400, 302);
diff --git a/engines/m4/riddle/rooms/section5/room504.cpp b/engines/m4/riddle/rooms/section5/room504.cpp
index f008d222e46..9b38328e77c 100644
--- a/engines/m4/riddle/rooms/section5/room504.cpp
+++ b/engines/m4/riddle/rooms/section5/room504.cpp
@@ -820,7 +820,7 @@ void Room504::daemon() {
 		series_unload(_mzMenancesClimbs);
 		digi_unload("504_S02D");
 
-		_menendez = triggerMachineByHash_3000(8, 16, NORMAL_DIRS, SHADOW_DIRS,
+		_menendez = triggerMachineByHash_3000(8, 16, *NORMAL_DIRS, *SHADOW_DIRS,
 			1005, 155, 9, triggerMachineByHashCallback3000, "Emilio Menendez Walker");
 		sendWSMessage_10000(_menendez, -_G(game_buff_ptr)->x1 - 30,
 			155, 9, 536, 1);
diff --git a/engines/m4/riddle/rooms/section6/room603.cpp b/engines/m4/riddle/rooms/section6/room603.cpp
index 5a14c79c20e..eb4ebe73069 100644
--- a/engines/m4/riddle/rooms/section6/room603.cpp
+++ b/engines/m4/riddle/rooms/section6/room603.cpp
@@ -91,14 +91,14 @@ void Room603::init() {
 		ws_walk_load_walker_series(NORMAL_DIRS1, NORMAL_NAMES1);
 		ws_walk_load_shadow_series(SHADOW_DIRS1, SHADOW_NAMES1);
 
-		_shenWalker = triggerMachineByHash_3000(8, 12, NORMAL_DIRS1, SHADOW_DIRS1, 525, 238, 3,
+		_shenWalker = triggerMachineByHash_3000(8, 12, *NORMAL_DIRS1, *SHADOW_DIRS1, 525, 238, 3,
 			triggerMachineByHashCallback3000, "shen suit gun walker");
 		sendWSMessage_10000(_shenWalker, 535, 235, 3, 10, 1);
 
 		ws_walk_load_walker_series(NORMAL_DIRS2, NORMAL_NAMES2);
 		ws_walk_load_shadow_series(SHADOW_DIRS2, SHADOW_NAMES2);
 
-		_kuangWalker = triggerMachineByHash_3000(8, 13, NORMAL_DIRS2, SHADOW_DIRS2, 554, 245, 2,
+		_kuangWalker = triggerMachineByHash_3000(8, 13, *NORMAL_DIRS2, *SHADOW_DIRS2, 554, 245, 2,
 			triggerMachineByHashCallback3000, "kuang suit walker");
 		sendWSMessage_10000(_kuangWalker, 563, 244, 2, -1, 1);
 		return;
@@ -959,7 +959,7 @@ void Room603::daemon() {
 		_trigger1 = 0;
 		terminateMachineAndNull(_ttShadow);
 
-		_tt = triggerMachineByHash_3000(8, 9, SECTION6_NORMAL_DIRS, SECTION6_SHADOW_DIRS,
+		_tt = triggerMachineByHash_3000(8, 9, *SECTION6_NORMAL_DIRS, *SECTION6_SHADOW_DIRS,
 			291, 293, 4, triggerMachineByHashCallback3000, "tt walker");
 		sendWSMessage_10000(_tt, 357, 283, 1, 405, 0);
 		conv_resume();
@@ -981,7 +981,7 @@ void Room603::daemon() {
 	case 410:
 		terminateMachineAndNull(_tt);
 		terminateMachineAndNull(_ttShadow);
-		_tt = triggerMachineByHash_3000(8, 9, SECTION6_NORMAL_DIRS, SECTION6_SHADOW_DIRS,
+		_tt = triggerMachineByHash_3000(8, 9, *SECTION6_NORMAL_DIRS, *SECTION6_SHADOW_DIRS,
 			291, 293, 4, triggerMachineByHashCallback3000, "tt walker");
 		sendWSMessage_10000(_tt, 397, 286, 2, 415, 0);
 		kernel_timing_trigger(200, 411);
@@ -1176,7 +1176,7 @@ void Room603::daemon() {
 	case 510:
 		terminateMachineAndNull(_tt);
 		_trigger1 = 0;
-		_tt = triggerMachineByHash_3000(8, 9, SECTION6_NORMAL_DIRS, SECTION6_SHADOW_DIRS,
+		_tt = triggerMachineByHash_3000(8, 9, *SECTION6_NORMAL_DIRS, *SECTION6_SHADOW_DIRS,
 			291, 293, 4, triggerMachineByHashCallback3000, "tt walker");
 		sendWSMessage_10000(_tt, 357, 283, 3, 0x200, 0);
 		kernel_timing_trigger(100, 511);
@@ -1202,7 +1202,7 @@ void Room603::daemon() {
 	case 530:
 		terminateMachineAndNull(_tt);
 		_trigger1 = 0;
-		_tt = triggerMachineByHash_3000(8, 9, SECTION6_NORMAL_DIRS, SECTION6_SHADOW_DIRS,
+		_tt = triggerMachineByHash_3000(8, 9, *SECTION6_NORMAL_DIRS, *SECTION6_SHADOW_DIRS,
 			291, 293, 4, triggerMachineByHashCallback3000, "tt walker");
 		sendWSMessage_10000(_tt, 397, 286, 2, 533, 0);
 		kernel_timing_trigger(70, 531);
diff --git a/engines/m4/riddle/rooms/section6/room605.cpp b/engines/m4/riddle/rooms/section6/room605.cpp
index f576ebf11bc..d4d7ffa3b9a 100644
--- a/engines/m4/riddle/rooms/section6/room605.cpp
+++ b/engines/m4/riddle/rooms/section6/room605.cpp
@@ -86,7 +86,7 @@ void Room605::init() {
 
 			ws_walk_load_walker_series(SECTION6_NORMAL_DIRS, SECTION6_NORMAL_NAMES);
 			ws_walk_load_shadow_series(SECTION6_SHADOW_DIRS, SECTION6_SHADOW_NAMES);
-			_tt = triggerMachineByHash_3000(8, 9, SECTION6_NORMAL_DIRS, SECTION6_SHADOW_DIRS,
+			_tt = triggerMachineByHash_3000(8, 9, *SECTION6_NORMAL_DIRS, *SECTION6_SHADOW_DIRS,
 				450, 339, 1, triggerMachineByHashCallback3000, "tt walker");
 			sendWSMessage_10000(_tt, 476, 290, 5, 10, 1);
 
@@ -280,7 +280,7 @@ void Room605::daemon() {
 	case 203:
 		terminateMachineAndNull(_tt);
 		terminateMachineAndNull(_ttShadow);
-		_tt = triggerMachineByHash_3000(8, 9, SECTION6_NORMAL_DIRS, SECTION6_SHADOW_DIRS,
+		_tt = triggerMachineByHash_3000(8, 9, *SECTION6_NORMAL_DIRS, *SECTION6_SHADOW_DIRS,
 			476, 290, 5, triggerMachineByHashCallback3000, "tt walker");
 		sendWSMessage_10000(_tt, 485, 199, 2, 208, 0);
 		digi_play("19_07n04", 1, 255, 206);
diff --git a/engines/m4/riddle/rooms/section6/room608.cpp b/engines/m4/riddle/rooms/section6/room608.cpp
index 21d8c84da61..f2c150aa1ce 100644
--- a/engines/m4/riddle/rooms/section6/room608.cpp
+++ b/engines/m4/riddle/rooms/section6/room608.cpp
@@ -141,7 +141,7 @@ void Room608::init() {
 		ws_walk_load_walker_series(SECTION6_NORMAL_DIRS, SECTION6_NORMAL_NAMES);
 		ws_walk_load_shadow_series(SECTION6_SHADOW_DIRS, SECTION6_SHADOW_NAMES);
 
-		_tt = triggerMachineByHash_3000(8, 9, SECTION6_NORMAL_DIRS, SECTION6_SHADOW_DIRS,
+		_tt = triggerMachineByHash_3000(8, 9, *SECTION6_NORMAL_DIRS, *SECTION6_SHADOW_DIRS,
 			-30, 324, 3, triggerMachineByHashCallback3000, "tt walker");
 		sendWSMessage_10000(_tt, 105, 324, 5, 20, 1);
 	} else if (_G(flags)[V203] == 6) {
@@ -162,7 +162,7 @@ void Room608::init() {
 		ws_walk_load_walker_series(SECTION6_NORMAL_DIRS, SECTION6_NORMAL_NAMES);
 		ws_walk_load_shadow_series(SECTION6_SHADOW_DIRS, SECTION6_SHADOW_NAMES);
 
-		_tt = triggerMachineByHash_3000(8, 9, SECTION6_NORMAL_DIRS, SECTION6_SHADOW_DIRS,
+		_tt = triggerMachineByHash_3000(8, 9, *SECTION6_NORMAL_DIRS, *SECTION6_SHADOW_DIRS,
 			-30, 324, 3, triggerMachineByHashCallback3000, "tt walker");
 		sendWSMessage_10000(_tt, 103, 318, 3, 700, 1);
 	}
@@ -859,7 +859,7 @@ void Room608::daemon() {
 
 	case 500:
 		terminateMachineAndNull(_ol);
-		_ol = triggerMachineByHash_3000(8, 15, NORMAL_DIRS1, SHADOW_DIRS1,
+		_ol = triggerMachineByHash_3000(8, 15, *NORMAL_DIRS1, *SHADOW_DIRS1,
 			499, 318, 9, triggerMachineByHashCallback3000, "ow walker");
 		sendWSMessage_10000(_ol, 487, 290, 11, -1, 1);
 		kernel_timing_trigger(60, 501);
@@ -1051,7 +1051,7 @@ void Room608::daemon() {
 
 	case 548:
 		terminateMachineAndNull(_ol);
-		_ol = triggerMachineByHash_3000(8, 15, NORMAL_DIRS1, SHADOW_DIRS1,
+		_ol = triggerMachineByHash_3000(8, 15, *NORMAL_DIRS1, *SHADOW_DIRS1,
 			487, 293, 9, triggerMachineByHashCallback3000, "ow walker");
 		sendWSMessage_10000(_ol, 417, 295, 9, 549, 0);
 		kernel_timing_trigger(300, 551);
diff --git a/engines/m4/riddle/rooms/section6/room615.cpp b/engines/m4/riddle/rooms/section6/room615.cpp
index 533b5e08a57..0827707c33e 100644
--- a/engines/m4/riddle/rooms/section6/room615.cpp
+++ b/engines/m4/riddle/rooms/section6/room615.cpp
@@ -192,7 +192,7 @@ void Room615::daemon() {
 			series_load("SAFARI SHADOW 1", 11);
 			series_load("SAFARI SHADOW 1", 12);
 
-			_pu = triggerMachineByHash_3000(8, 0, RIPLEY_SERIES_DIRS, RIPLEY_SHADOWS_DIRS,
+			_pu = triggerMachineByHash_3000(8, 0, *RIPLEY_SERIES_DIRS, *RIPLEY_SHADOWS_DIRS,
 				392, 361, 10, triggerMachineByHashCallback3000, "rip");
 			sendWSMessage_10000(_pu, 426, 347, 9, 50, 1);
 
diff --git a/engines/m4/riddle/rooms/section8/room801.cpp b/engines/m4/riddle/rooms/section8/room801.cpp
index dc67c9addb2..4d3cfc39e61 100644
--- a/engines/m4/riddle/rooms/section8/room801.cpp
+++ b/engines/m4/riddle/rooms/section8/room801.cpp
@@ -107,7 +107,7 @@ void Room801::init() {
 		_roomStates_field60 = series_load("shadow of de plane", -1, nullptr);
 		ws_walk_load_shadow_series(S8_SHADOW_DIRS1, S8_SHADOW_NAMES1);
 		ws_walk_load_walker_series(S8_SHADOW_DIRS2, S8_SHADOW_NAMES2);
-		_roomStates_field9Eh = triggerMachineByHash_3000(8, 4, S8_SHADOW_DIRS2, S8_SHADOW_DIRS1,
+		_roomStates_field9Eh = triggerMachineByHash_3000(8, 4, *S8_SHADOW_DIRS2, *S8_SHADOW_DIRS1,
 														 20, 310, 3, triggerMachineByHashCallback3000, "mc_trek");
 		kernel_timing_trigger(60, 1, nullptr);
 	} else if (_G(game).previous_room < 850 || _G(game).previous_room != -2) {
diff --git a/engines/m4/riddle/triggers.cpp b/engines/m4/riddle/triggers.cpp
index f5366d3f158..63e470970cd 100644
--- a/engines/m4/riddle/triggers.cpp
+++ b/engines/m4/riddle/triggers.cpp
@@ -101,20 +101,25 @@ void sendWSMessage_10000(machine *recv, int val1, int val2, int val3,
 	sendWSMessage(0x10000, 0, recv, 0, nullptr, 1);
 }
 
-machine *triggerMachineByHash_3000(int val1, int val2, const int16 *normalDirs,
-	const int16 *shadowDirs, int val3, int val4, int val5,
-	MessageCB intrMsg, const char *machName) {
-#if 0
+machine *triggerMachineByHash_3000(int myHash, int dataHash, int normalDir, int shadowDir,
+		int param1, int param2, int index, MessageCB intrMsg, const char *machName) {
 	static const byte NUMS[14] = { 0, 0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 9, 0 };
-	byte  nums[14];
-	Common::copy(NUMS, NUMS + 14, nums);
 
-	_G(globals)[GLB_TEMP_1] = val2 << 16;
-	_G(globals)[GLB_TEMP_2] = val1 << 24;
-	_G(globals)[GLB_TEMP_3] = val3
-#else
-	error("sendWSMessage_3000");
-#endif
+	_G(globals)[GLB_TEMP_1] = dataHash << 16;
+	_G(globals)[GLB_TEMP_2] = normalDir << 24;
+	_G(globals)[GLB_TEMP_3] = shadowDir << 24;
+	_G(globals)[GLB_TEMP_4] = param1 << 16;
+	_G(globals)[GLB_TEMP_5] = param2 << 16;
+	_G(globals)[GLB_TEMP_6] = ((param2 << 16) - _G(globals)[V002])
+		* _G(globals)[V006] + _G(globals)[V004];
+	_G(globals)[GLB_TEMP_7] = NUMS[index] << 16;
+
+	machine *result = TriggerMachineByHash(myHash, nullptr, dataHash, 0,
+		intrMsg ? intrMsg : &triggerMachineByHashCallback3000,
+		false, machName);
+	_G(inverse_pal)->release();
+
+	return result;
 }
 
 void sendWSMessage_60000(machine *mach) {
@@ -419,6 +424,55 @@ void sendWSMessage_multi(const char *name) {
 	}
 }
 
+void intrMsgNull(frac16 myMessage, machine *sender) {
+}
+
+void triggerMachineByHashCallback(frac16 myMessage, machine *) {
+	int32 hi = myMessage >> 16;
+
+	if (hi >= 0)
+		kernel_trigger_dispatch_now(hi);
+}
+
+void triggerMachineByHashCallbackNegative(frac16 myMessage, machine *) {
+	int32 hi = myMessage >> 16;
+
+	if (hi < 0)
+		kernel_trigger_dispatchx(hi);
+}
+
+void triggerMachineByHashCallbackAlways(frac16 myMessage, machine *sender) {
+	kernel_trigger_dispatchx(myMessage);
+}
+
+void triggerMachineByHashCallback3000(frac16 myMessage, machine *sender) {
+	int triggerType = _G(globals)[GLB_TEMP_1] >> 16;
+	int param = _G(globals)[GLB_TEMP_2] >> 16;
+	int msg = myMessage >> 16;
+
+	switch (triggerType) {
+	case 0:
+		break;
+
+	case 1:
+	case 3:
+		if (msg >= 0)
+			kernel_trigger_dispatchx(myMessage);
+		break;
+
+	case 2:
+		if (param)
+			sendWSMessage(0x30000, triggerType, sender, 0, nullptr, 1);
+		else if (msg >= 0)
+			kernel_trigger_dispatchx(myMessage);
+		break;
+
+	default:
+		error("spawn walker callback with triggerType = %d", triggerType);
+		break;
+	}
+}
+
 } // namespace Riddle
 } // namespace M4
 
diff --git a/engines/m4/riddle/triggers.h b/engines/m4/riddle/triggers.h
index 19decf91136..74b5000aedd 100644
--- a/engines/m4/riddle/triggers.h
+++ b/engines/m4/riddle/triggers.h
@@ -45,9 +45,9 @@ extern void sendWSMessage_10000(int val1, machine *recv, int val2, int val3,
 extern void sendWSMessage_10000(machine *recv, int val1, int val2, int val3,
 	int trigger, int val4);
 
-machine *triggerMachineByHash_3000(int val1, int val2, const int16 *normalDirs,
-	const int16 *shadowDirs, int val3, int val4, int val5,
-	MessageCB intrMsg, const char *machName);
+machine *triggerMachineByHash_3000(int myHash, int dataHash,
+	int normalDir, int shadowDir, int param1, int param2,
+	int index, MessageCB intrMsg, const char *machName);
 extern void sendWSMessage_60000(machine *mach);
 extern void sendWSMessage_80000(machine *mach);
 extern void sendWSMessage_B0000(machine *mach, int trigger);
@@ -87,6 +87,11 @@ extern void sendWSMessage_210000(machine *recv, int trigger);
 extern void sendWSMessage_29a0000(machine *recv, int val1);
 extern void sendWSMessage_29a0000(int val1);
 
+extern void intrMsgNull(frac16 myMessage, machine *sender);
+extern void triggerMachineByHashCallback(frac16 myMessage, machine *sender = nullptr);
+extern void triggerMachineByHashCallbackNegative(frac16 myMessage, machine *sender = nullptr);
+extern void triggerMachineByHashCallback3000(frac16 myMessage, machine *sender = nullptr);
+extern void triggerMachineByHashCallbackAlways(frac16 myMessage, machine *sender = nullptr);
 
 } // namespace Riddle
 } // namespace M4




More information about the Scummvm-git-logs mailing list