[Scummvm-git-logs] scummvm master -> 27490d73de15057259e5eadbcd51bd8b6bbe365e

dreammaster noreply at scummvm.org
Sun Aug 11 19:17:20 UTC 2024


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

Summary:
86c80192b9 M4: RIDDLE: Added sendWSMessage_multi
04c0a9becd M4: RIDDLE: Finished room 402 parser
8ad00a20ff M4: RIDDLE: Beginnings of room 402 daemon
27490d73de M4: RIDDLE: More room 402 daemon


Commit: 86c80192b94c3cc99e1e0d476ba35d2c48f1fc8c
    https://github.com/scummvm/scummvm/commit/86c80192b94c3cc99e1e0d476ba35d2c48f1fc8c
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-08-11T12:17:13-07:00

Commit Message:
M4: RIDDLE: Added sendWSMessage_multi

Changed paths:
    engines/m4/riddle/rooms/room.cpp
    engines/m4/riddle/rooms/room.h
    engines/m4/riddle/rooms/section4/room402.cpp
    engines/m4/riddle/rooms/section4/room402.h


diff --git a/engines/m4/riddle/rooms/room.cpp b/engines/m4/riddle/rooms/room.cpp
index 0cfd3c31844..c4fd6cb0897 100644
--- a/engines/m4/riddle/rooms/room.cpp
+++ b/engines/m4/riddle/rooms/room.cpp
@@ -376,6 +376,10 @@ void Room::sendWSMessage_190000(machine *recv, int trigger) {
 	sendWSMessage(0x190000, 0, recv, 0, nullptr, 1);
 }
 
+void Room::sendWSMessage_190000(machine *recv, int trigger) {
+	sendWSMessage_190000(_G(my_walker), trigger);
+}
+
 void Room::sendWSMessage_1a0000(machine *recv, int trigger) {
 	_G(globals)[V024] = trigger << 16;
 	sendWSMessage(0x1a0000, 0, recv, 0, nullptr, 1);
@@ -390,6 +394,116 @@ void Room::sendWSMessage_29a0000(int val1) {
 	sendWSMessage_29a0000(_G(my_walker), val1);
 }
 
+void Room::sendWSMessage_multi(const char *name) {
+	int vSI = 0, vCX = 0;
+
+	switch (_G(kernel).trigger) {
+	case -1:
+	case 8:
+		player_update_info();
+
+		switch (_G(player_info).facing) {
+		case 1:
+		case 2:
+			ws_walk(_G(player_info).x, _G(player_info).y, nullptr, 1, 2);
+			break;
+
+		case 3:
+			ws_walk(_G(player_info).x, _G(player_info).y, nullptr, 1, 3);
+			break;
+
+		case 4:
+		case 5:
+			ws_walk(_G(player_info).x, _G(player_info).y, nullptr, 1, 4);
+			break;
+
+		case 7:
+		case 8:
+			ws_walk(_G(player_info).x, _G(player_info).y, nullptr, 1, 8);
+			break;
+
+		case 9:
+			ws_walk(_G(player_info).x, _G(player_info).y, nullptr, 1, 9);
+			break;
+
+		case 10:
+		case 11:
+			ws_walk(_G(player_info).x, _G(player_info).y, nullptr, 1, 10);
+			break;
+
+		default:
+			break;
+		}
+
+		player_set_commands_allowed(false);
+		break;
+
+	case 1:
+		player_update_info();
+		digi_preload("950_s34");
+
+		switch (_G(player_info).facing) {
+		case 2:
+		case 10:
+			vCX = 39;
+			vSI = 17;
+			_ripSketching = series_load("RIP SKETCHING IN NOTEBOOK POS 2");
+			break;
+
+		case 3:
+		case 9:
+			vCX = 36;
+			vSI = 22;
+			_ripSketching = series_load("RIP SKETCHING IN NOTEBOOK POS 3");
+			break;
+
+		case 4:
+		case 8:
+			vCX = 45;
+			vSI = 19;
+			_ripSketching = series_load("RIP SKETCHING IN NOTEBOOK POS 4");
+			break;
+
+		default:
+			break;
+		}
+
+		setGlobals1(_ripSketching, 1, vSI, vSI, vSI, 0, vCX + 1, vCX, vCX, vCX);
+		sendWSMessage_110000(3);
+		digi_play(name, 1);
+		break;
+
+	case 3:
+		if (_G(player_info).facing == 0 || _G(player_info).facing == 9)
+			sendWSMessage_190000(9);
+
+		sendWSMessage_120000(4);
+		digi_play("950_s34", 2, 200, 7);
+		break;
+
+	case 4:
+		sendWSMessage_110000(5);
+		break;
+
+	case 5:
+		sendWSMessage_140000(6);
+		break;
+
+	case 6:
+		series_unload(_ripSketching);
+		digi_unload("950_s34");
+		player_set_commands_allowed(true);
+		return;
+
+	case 7:
+		if (_G(player_info).facing == 3 || _G(player_info).facing == 9)
+			sendWSMessage_190000(5);
+		break;
+
+	default:
+		break;
+	}
+}
 
 int Room::getNumKeyItemsPlaced() const {
 	static const char *const ITEMS[11] = {
diff --git a/engines/m4/riddle/rooms/room.h b/engines/m4/riddle/rooms/room.h
index 0c0ee04f8f3..9618e3c6b9b 100644
--- a/engines/m4/riddle/rooms/room.h
+++ b/engines/m4/riddle/rooms/room.h
@@ -33,6 +33,9 @@ namespace Riddle {
 namespace Rooms {
 
 class Room : public M4::Room {
+private:
+	static int _ripSketching;
+
 protected:
 	static void intrMsgNull(frac16 myMessage, machine *sender) {}
 	static void triggerMachineByHashCallback(frac16 myMessage, machine *sender = nullptr);
@@ -94,9 +97,11 @@ protected:
 	void sendWSMessage_160000(machine *mach, int val1, int trigger);
 	void sendWSMessage_160000(int val1, int trigger);
 	void sendWSMessage_190000(machine *recv, int trigger);
+	void sendWSMessage_190000(int trigger);
 	void sendWSMessage_1a0000(machine *recv, int trigger);
 	void sendWSMessage_29a0000(machine *recv, int val1);
 	void sendWSMessage_29a0000(int val1);
+	void sendWSMessage_multi(const char *name);
 
 	/**
 	 * Get the number of key items placed in room 305 (display room)
diff --git a/engines/m4/riddle/rooms/section4/room402.cpp b/engines/m4/riddle/rooms/section4/room402.cpp
index a387103d345..83c10c2d5cb 100644
--- a/engines/m4/riddle/rooms/section4/room402.cpp
+++ b/engines/m4/riddle/rooms/section4/room402.cpp
@@ -117,9 +117,9 @@ void Room402::init() {
 			digi_preload("950_s22");
 			_ripDownStairs = series_load("RIP DOWN STAIRS");
 			ws_hide_walker();
-			_ripLeaving = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x600, 0,
+			_ripEnterLeave = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x600, 0,
 				triggerMachineByHashCallbackNegative, "rip leaving castle");
-			sendWSMessage_10000(1, _ripLeaving, _ripDownStairs, 1, 27, 55,
+			sendWSMessage_10000(1, _ripEnterLeave, _ripDownStairs, 1, 27, 55,
 				_ripDownStairs, 27, 27, 0);
 #endif
 
@@ -142,9 +142,9 @@ void Room402::init() {
 				digi_preload("950_s22");
 				_ripDownStairs = series_load("RIP DOWN STAIRS");
 				ws_hide_walker();
-				_ripLeaving = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x600, 0,
+				_ripEnterLeave = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x600, 0,
 					triggerMachineByHashCallbackNegative, "rip leaving castle");
-				sendWSMessage_10000(1, _ripLeaving, _ripDownStairs, 1, 27, 55,
+				sendWSMessage_10000(1, _ripEnterLeave, _ripDownStairs, 1, 27, 55,
 					_ripDownStairs, 27, 27, 0);
 				break;
 
@@ -201,9 +201,9 @@ void Room402::init() {
 				_ripDownStairs = series_load("RIP DOWN STAIRS");
 				ws_hide_walker();
 
-				_ripLeaving = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x600, 0,
+				_ripEnterLeave = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x600, 0,
 					triggerMachineByHashCallbackNegative, "rip leaving castle");
-				sendWSMessage_10000(1, _ripLeaving, _ripDownStairs, 1, 27, 55,
+				sendWSMessage_10000(1, _ripEnterLeave, _ripDownStairs, 1, 27, 55,
 					_ripDownStairs, 27, 27, 0);
 				break;
 
@@ -349,8 +349,97 @@ void Room402::parser() {
 	bool useFlag = player_said_any("push", "pull", "gear", "open", "close");
 
 	if (player_said("conv402a")) {
-		// TODO
-		conv402a();
+		if (_G(kernel).trigger) {
+			conv402a777();
+		} else {
+			conv402a();
+		}
+	} else if (talkFlag && player_said("WOLF")) {
+		player_set_commands_allowed(false);
+		_val5 = -1;
+		_val10 = 1000;
+		_val11 = 1100;
+
+		_G(kernel).trigger_mode = KT_DAEMON;
+		kernel_timing_trigger(1, 102);
+		_G(kernel).trigger_mode = KT_PARSE;
+	} else if (lookFlag && player_said("WOLF")) {
+		digi_play(_G(flags)[V111] ? "402r13" : "402r12", 1);
+	} else if (lookFlag && player_said("CASTLE")) {
+		// No implementation
+	} else if (lookFlag && player_said_any("TOPIARY", "TOPIARY ")) {
+		digi_play("408r02", 1);
+	} else if (takeFlag && player_said("WHEELBARROW")) {
+		digi_play("402r17", 1);
+	} else if (takeFlag && player_said_any("TOPIARY", "TOPIARY ")) {
+		digi_play("402r18", 1);
+	} else if (useFlag && player_said("TOPIARY")) {
+		digi_play("402r16", 1);
+	} else if (useFlag && player_said("TOPIARY ")) {
+		useTopiary();
+	} else if (player_said("POMERANIAN MARKS", "WOLF") && inv_player_has("POMERANIAN MARKS")) {
+		if (_G(flags)[V115] && !_G(flags)[V114]) {
+			_G(flags)[V114] = 1;
+			_G(flags)[V111]++;
+			player_set_commands_allowed(false);
+			_val5 = 210;
+		} else {
+			player_set_commands_allowed(false);
+			_val5 = 200;
+		}
+	}
+#define MONEY(ITEM) player_said("WOLF") && player_said(ITEM) && inv_player_has(ITEM)
+	else if (MONEY("US DOLLARS") || MONEY("CHINESE YUAN") ||
+			MONEY("PERUVIAN INTI") || MONEY("SIKKIMESE RUPEE")) {
+		if (!_G(flags)[V116]) {
+			_G(flags)[V116] = 1;
+			player_set_commands_allowed(false);
+			_val5 = 221;
+		}
+	}
+#undef MONEY
+	else if (enterFlag && player_said("GATE")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+			ws_walk(517, 239, nullptr, 2, 11);
+			break;
+		case 2:
+			disable_player_commands_and_fade_init(3);
+			break;
+		default:
+			break;
+		}
+	} else if (enterFlag && player_said("DANZIG")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+			disable_player_commands_and_fade_init(2);
+			break;
+		case 2:
+			_G(flags)[V112] = 1;
+			_G(game).setRoom(401);
+			break;
+		default:
+			break;
+		}
+	} else if (player_said("DANZIG")) {
+		// No implementation
+	} else if (enterFlag && player_said("CASTLE DOOR")) {
+		enterCastle();
+	} else if (player_said("journal") && !talkFlag && !lookFlag &&
+			!inv_player_has(_G(player).noun)) {
+		if (_G(flags)[kCastleCartoon])
+			digi_play("com016", 1);
+		else if (_G(kernel).trigger == -1)
+			ws_walk(190, 333, nullptr, 8, 2);
+		else {
+			if (_G(kernel).trigger == 6) {
+				_G(flags)[kCastleCartoon] = 1;
+				_G(flags)[V089] = 1;
+			}
+			//sub("com015");
+		}
 	}
 	// TODO
 	else {
@@ -580,6 +669,121 @@ void Room402::conv402a() {
 	}
 }
 
+void Room402::conv402a777() {
+	int who = conv_whos_talking();
+	int node = conv_current_node();
+	int entry = conv_current_entry();
+
+	if (who <= 0) {
+		if (node == 26 && entry == 0) {
+			_val10 = 1000;
+			_val11 = 1123;
+			_G(kernel).trigger_mode = KT_DAEMON;
+			kernel_timing_trigger(1, 102);
+			_G(kernel).trigger_mode = KT_PARSE;
+		} else {
+			_val13 = (_val12 == 2002) ? 2143 : 2104;
+			conv_resume();
+		}
+	} else if (who == 1) {
+		_val11 = (_val10 == 1001) ? 1115 : 1103;
+		conv_resume();
+	}
+}
+
+void Room402::useTopiary() {
+	switch (_G(kernel).trigger) {
+	case -1:
+		player_set_commands_allowed(false);
+		_ripMessesBush = series_load("RIP MESSES UP THE BUSH");
+		player_update_info();
+		_safariShadow = series_place_sprite("SAFARI SHADOW 3", 0,
+			_G(player_info).x, _G(player_info).y, _G(player_info).scale, 0xf00);
+		_ripEnterLeave = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, -53, 100, 0x200, 0,
+			triggerMachineByHashCallbackNegative, "rip entering castle");
+		sendWSMessage_10000(1, _ripEnterLeave, _ripMessesBush, 1, 10, 1,
+			_ripMessesBush, 10, 10, 0);
+		break;
+
+	case 1:
+		sendWSMessage_10000(1, _ripEnterLeave, _ripMessesBush, 10, 34, 2,
+			_ripMessesBush, 34, 34, 0);
+		digi_play("402_s02", 1, 255, 2);
+		break;
+
+	case 2:
+		if (inv_player_has("TURTLE") && !_G(flags)[V117]) {
+			_G(flags)[V117] = 1;
+			_G(flags)[V118]++;
+		}
+
+		_branch = series_place_sprite("sprite of the pulled out branch", 0, 0, -53, 100, 0x300);
+		series_unload(_ripMessesBush);
+		terminateMachineAndNull(_safariShadow);
+		ws_unhide_walker();
+		player_set_commands_allowed(true);
+		break;
+
+	default:
+		break;
+	}
+
+}
+
+void Room402::enterCastle() {
+	switch (_G(kernel).trigger) {
+	case -1:
+		player_set_commands_allowed(false);
+		_ripClimbKnock = series_load("RIP CLIMBS AND KNOCKS");
+		_doorOpens = series_load("DOOR OPENS");
+		ws_hide_walker();
+
+		_ripEnterLeave = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x600, 0,
+			triggerMachineByHashCallbackNegative, "rip entering castle");
+		sendWSMessage_10000(1, _ripEnterLeave, _ripClimbKnock, 1,
+			69, 1, _ripClimbKnock, 69, 69, 0);
+		break;
+
+	case 1:
+		digi_play("402_s01", 1, 255, 2);
+		sendWSMessage_10000(1, _ripEnterLeave, _ripClimbKnock, 69, 58, -1,
+			_ripClimbKnock, 58, 58, 0);
+		break;
+
+	case 2:
+		kernel_timing_trigger(15, 3);
+		break;
+
+	case 3:
+		_castleDoor = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0, 0,
+			triggerMachineByHashCallbackNegative, "castle door");
+		sendWSMessage_10000(1, _castleDoor, _doorOpens, 1, 2, -1,
+			_doorOpens, 2, 2, 0);
+		digi_play("402_S05", 1, 255, 4);
+		break;
+
+	case 4:
+		if (player_been_here(404)) {
+			kernel_timing_trigger(1, 5);
+		} else {
+			digi_play("402r28", 1, 255, 5);
+		}
+		break;
+
+	case 5:
+		disable_player_commands_and_fade_init(6);
+		break;
+
+	case 6:
+		_G(flags)[V112] = 1;
+		_G(game).setRoom(404);
+		break;
+
+	default:
+		break;
+	}
+}
+
 } // namespace Rooms
 } // namespace Riddle
 } // namespace M4
diff --git a/engines/m4/riddle/rooms/section4/room402.h b/engines/m4/riddle/rooms/section4/room402.h
index 7fbec8ce720..5ce4fd11089 100644
--- a/engines/m4/riddle/rooms/section4/room402.h
+++ b/engines/m4/riddle/rooms/section4/room402.h
@@ -55,14 +55,22 @@ private:
 	int _wolfWantsMoney = 0;
 	int _ripHeadTurn = 0;
 	int _ripDownStairs = 0;
-	machine *_ripLeaving = nullptr;
+	machine *_ripEnterLeave = nullptr;
 	machine *_branch = nullptr;
 	int _wolfTurnsClipping = 0;
 	int _turtlePopup = 0;
 	int _ripLeanWall = 0;
 	machine *_wolfWalker = nullptr;
+	machine *_safariShadow = nullptr;
+	int _ripMessesBush = 0;
+	int _ripClimbKnock = 0;
+	int _doorOpens = 0;
+	machine *_castleDoor = nullptr;
 
 	void conv402a();
+	void conv402a777();
+	void useTopiary();
+	void enterCastle();
 
 public:
 	Room402() : Room() {}


Commit: 04c0a9becd358f35ebbf3c73189d264c816bb4fa
    https://github.com/scummvm/scummvm/commit/04c0a9becd358f35ebbf3c73189d264c816bb4fa
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-08-11T12:17:13-07:00

Commit Message:
M4: RIDDLE: Finished room 402 parser

Changed paths:
    engines/m4/riddle/rooms/room.cpp
    engines/m4/riddle/rooms/section4/room402.cpp


diff --git a/engines/m4/riddle/rooms/room.cpp b/engines/m4/riddle/rooms/room.cpp
index c4fd6cb0897..d66fc144b73 100644
--- a/engines/m4/riddle/rooms/room.cpp
+++ b/engines/m4/riddle/rooms/room.cpp
@@ -27,6 +27,8 @@ namespace M4 {
 namespace Riddle {
 namespace Rooms {
 
+int Room::_ripSketching;
+
 void Room::restoreAutosave() {
 	if (g_engine->autosaveExists()) {
 		_G(kernel).restore_slot = 0;
@@ -376,7 +378,7 @@ void Room::sendWSMessage_190000(machine *recv, int trigger) {
 	sendWSMessage(0x190000, 0, recv, 0, nullptr, 1);
 }
 
-void Room::sendWSMessage_190000(machine *recv, int trigger) {
+void Room::sendWSMessage_190000(int trigger) {
 	sendWSMessage_190000(_G(my_walker), trigger);
 }
 
diff --git a/engines/m4/riddle/rooms/section4/room402.cpp b/engines/m4/riddle/rooms/section4/room402.cpp
index 83c10c2d5cb..1d9beeedc95 100644
--- a/engines/m4/riddle/rooms/section4/room402.cpp
+++ b/engines/m4/riddle/rooms/section4/room402.cpp
@@ -388,7 +388,7 @@ void Room402::parser() {
 			_val5 = 200;
 		}
 	}
-#define MONEY(ITEM) player_said("WOLF") && player_said(ITEM) && inv_player_has(ITEM)
+#define MONEY(ITEM) (player_said("WOLF") && player_said(ITEM) && inv_player_has(ITEM))
 	else if (MONEY("US DOLLARS") || MONEY("CHINESE YUAN") ||
 			MONEY("PERUVIAN INTI") || MONEY("SIKKIMESE RUPEE")) {
 		if (!_G(flags)[V116]) {
@@ -407,6 +407,12 @@ void Room402::parser() {
 		case 2:
 			disable_player_commands_and_fade_init(3);
 			break;
+		case 3:
+			_G(flags)[V112] = 1;
+			adv_kill_digi_between_rooms(false);
+			digi_play_loop("950_s22", 3);
+			_G(game).setRoom(408);
+			break;
 		default:
 			break;
 		}
@@ -438,11 +444,11 @@ void Room402::parser() {
 				_G(flags)[kCastleCartoon] = 1;
 				_G(flags)[V089] = 1;
 			}
-			//sub("com015");
+			sendWSMessage_multi("com015");
 		}
-	}
-	// TODO
-	else {
+	} else if (lookFlag && player_said(" ")) {
+		digi_play("402r08", 1);
+	} else {
 		return;
 	}
 


Commit: 8ad00a20ffebcb349346d44f268f4416cc5f6c28
    https://github.com/scummvm/scummvm/commit/8ad00a20ffebcb349346d44f268f4416cc5f6c28
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-08-11T12:17:13-07:00

Commit Message:
M4: RIDDLE: Beginnings of room 402 daemon

Changed paths:
    engines/m4/riddle/rooms/section4/room402.cpp


diff --git a/engines/m4/riddle/rooms/section4/room402.cpp b/engines/m4/riddle/rooms/section4/room402.cpp
index 1d9beeedc95..b6bf9d65caa 100644
--- a/engines/m4/riddle/rooms/section4/room402.cpp
+++ b/engines/m4/riddle/rooms/section4/room402.cpp
@@ -274,6 +274,236 @@ void Room402::init() {
 }
 
 void Room402::daemon() {
+	switch (_G(kernel).trigger) {
+	case 19:
+		ws_walk(449, 317, nullptr, 20, 3);
+		midi_fade_volume(0, 120);
+		break;
+
+	case 20:
+		midi_stop();
+		setGlobals1(_ripTalker, 1, 5, 1, 5, 1, 1, 1, 1, 1);
+		sendWSMessage_110000(-1);
+		digi_play("402r01", 1, 255, 21);
+		break;
+
+	case 21:
+		sendWSMessage_120000(-1);
+		digi_play("402w01", 1, 255, 22);
+		break;
+
+	case 22:
+		sendWSMessage_150000(23);
+		break;
+
+	case 23:
+		setGlobals1(_ripHeadTurn, 1, 5, 5, 5, 0, 5, 1, 1, 1, 0, 1, 1, 1, 1, 1);
+		sendWSMessage_110000(24);
+		digi_play("402r02", 1, 255, 25);
+		break;
+
+	case 24:
+		sendWSMessage_120000(-1);
+		break;
+
+	case 25:
+		sendWSMessage_130000(-1);
+		digi_play("402w02", 1, 255, 26);
+		break;
+
+	case 26:
+		sendWSMessage_150000(27);
+		break;
+
+	case 27:
+		ws_hide_walker();
+		_ripEnterLeave = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, -53, 100, 0x100, 0,
+			triggerMachineByHashCallbackNegative, "RIP talks to Wolife");
+		sendWSMessage_10000(1, _ripEnterLeave, _ripTalkWolf, 1, 13, 28,
+			_ripTalkWolf, 13, 13, 0);
+		digi_play("402r03", 1);
+		break;
+
+	case 28:
+		sendWSMessage_10000(1, _ripEnterLeave, _ripTalkWolf, 13, 1, 29,
+			_ripTalkWolf, 1, 1, 0);
+		break;
+
+	case 29:
+		terminateMachineAndNull(_ripEnterLeave);
+		series_unload(_ripHeadTurn);
+		ws_unhide_walker();
+		player_set_commands_allowed(true);
+		break;
+
+	case 30:
+		setGlobals1(_ripTalker, 0, 0, 1, 1, 0, 1, 5, 1, 5, 1);
+		sendWSMessage_110000(32);
+		break;
+
+	case 31:
+		digi_play("402r29", 1, 255, 33);
+		sendWSMessage_120000(-1);
+		break;
+
+	case 32:
+		sendWSMessage_110000(-1);
+		digi_play("402w09", 1, 255, 34);
+		break;
+
+	case 33:
+		sendWSMessage_150000(35);
+		break;
+
+	case 35:
+	case 43:
+		player_set_commands_allowed(true);
+		break;
+
+	case 40:
+		ws_walk(510, 260, nullptr, -1, 8);
+		break;
+
+	case 42:
+		sendWSMessage_10000(_wolfWalker, 517, 239, 9, 43, 0);
+		break;
+
+	case 50:
+		midi_stop();
+		player_set_commands_allowed(true);
+		break;
+
+	case 55:
+		terminateMachineAndNull(_ripEnterLeave);
+		series_unload(_ripDownStairs);
+		ws_demand_location(345, 275, 3);
+		ws_walk(375, 279, nullptr,
+			(_G(flags)[V131] == 402) ? 56 : 50,
+			1);
+		break;
+
+	case 56:
+		ws_walk(449, 317, nullptr, 30, 3);
+		break;
+
+	case 100:
+		kernel_timing_trigger(1, 102);
+		break;
+
+	case 101:
+		switch (_val10) {
+		case 1000:
+			_val11 = 1105;
+			break;
+		case 1001:
+			_val5 = (_G(flags)[V132]) ? 300 : 1112;
+			break;
+
+		default:
+			break;
+		}
+		break;
+
+	case 102:
+		if (_val2 == -1) {
+			kernel_timing_trigger(1, 103);
+		} else {
+			kernel_timing_trigger(1, _val2);
+			_val2 = -1;
+		}
+		break;
+
+	case 103:
+		switch (_val10) {
+		case 1000:
+			// TODO
+		default:
+			break;
+		}
+		break;
+
+	case 110:
+		switch (_val12) {
+		case 2000:
+			if (_val5 == -1) {
+				kernel_timing_trigger(1, 111);
+			} else {
+				kernel_timing_trigger(1, _val5);
+				_val5 = -1;
+			}
+			break;
+
+		case 2001:
+			if (_val13 == 2300) {
+				if (_val5 == -1) {
+					kernel_timing_trigger(1, 111);
+				} else {
+					kernel_timing_trigger(1, _val5);
+					_val5 = -1;
+				}
+			}
+			break;
+
+		case 2002:
+			if (_val5 == -1) {
+				kernel_timing_trigger(1, 111);
+			} else {
+				kernel_timing_trigger(1, _val5);
+				_val5 = -1;
+			}
+			break;
+
+		default:
+			break;
+		}
+		break;
+
+	case 111:
+		switch (_val12) {
+		case 2000:
+			switch (_val13) {
+			case 2106:
+				sendWSMessage_10000(1, _wolfieMach, _wolfClipping, 1, 10, 110,
+					_wolfClipping, 10, 10, 0);
+				break;
+			case 2108:
+				// TODO
+			case 2230:
+				player_set_commands_allowed(false);
+				sendWSMessage_10000(1, _wolfieMach, _wolfClippersDown, 1, 8, 111,
+					_wolfClippersDown, 8, 8, 0);
+				_val13 = 2231;
+				break;
+			case 2231:
+				_ripEnterLeave = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, -53, 100, 0x100, 0,
+					triggerMachineByHashCallbackNegative, "rip talks wolf");
+				player_update_info();
+
+				_safariShadow = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
+					_G(player_info).x, _G(player_info).y, _G(player_info).scale, 0x200, 0,
+					triggerMachineByHashCallbackNegative, "rip talks wolf SHADOW");
+				sendWSMessage_10000(1, _safariShadow, _shadow3, 1, 1, -1,
+					_shadow3, 1, 1, 0);
+				ws_hide_walker();
+
+				sendWSMessage_10000(1, _ripEnterLeave, _ripTalkWolf, 1, 7, 111,
+					_ripTalkWolf, 7, 7, 0);
+				_val13 = 2242;
+				break;
+
+			default:
+				break;
+			}
+			break;
+
+		default:
+			break;
+		}
+		break;
+
+	default:
+		break;
+	}
 }
 
 void Room402::pre_parser() {


Commit: 27490d73de15057259e5eadbcd51bd8b6bbe365e
    https://github.com/scummvm/scummvm/commit/27490d73de15057259e5eadbcd51bd8b6bbe365e
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-08-11T12:17:13-07:00

Commit Message:
M4: RIDDLE: More room 402 daemon

Changed paths:
    engines/m4/riddle/rooms/section4/room402.cpp
    engines/m4/riddle/rooms/section4/room402.h


diff --git a/engines/m4/riddle/rooms/section4/room402.cpp b/engines/m4/riddle/rooms/section4/room402.cpp
index b6bf9d65caa..6c6afb7beda 100644
--- a/engines/m4/riddle/rooms/section4/room402.cpp
+++ b/engines/m4/riddle/rooms/section4/room402.cpp
@@ -274,6 +274,8 @@ void Room402::init() {
 }
 
 void Room402::daemon() {
+	int frame;
+
 	switch (_G(kernel).trigger) {
 	case 19:
 		ws_walk(449, 317, nullptr, 20, 3);
@@ -462,18 +464,57 @@ void Room402::daemon() {
 		switch (_val12) {
 		case 2000:
 			switch (_val13) {
+			case 2101:
+				frame = imath_ranged_rand(8, 10);
+				sendWSMessage_10000(1, _wolfieMach, _wolfClipping, frame, frame, 110,
+					_wolfClipping, frame, frame, 0);
+				break;
+
+			case 2104:
+				sendWSMessage_10000(1, _wolfieMach, _wolfClipping, 8, 8, 110,
+					_wolfClipping, 8, 8, 0);
+				break;
+
+			case 2105:
+				sendWSMessage_10000(1, _wolfieMach, _wolfClipping, 8, 10, -1,
+					_wolfClipping, 10, 10, 0);
+				break;
 			case 2106:
 				sendWSMessage_10000(1, _wolfieMach, _wolfClipping, 1, 10, 110,
 					_wolfClipping, 10, 10, 0);
 				break;
+
 			case 2108:
-				// TODO
+				sendWSMessage_10000(1, _machine1, _machine1Series, 44, 16, 111,
+					_machine1Series, 16, 16, 0);
+				_val13 = 2110;
+				break;
+
+			case 2109:
+				kernel_timing_trigger(4, 111);
+				_val13 = 2108;
+				break;
+
+			case 2110:
+				terminateMachineAndNull(_machine1);
+				_val13 = 2101;
+				kernel_timing_trigger(1, 110);
+
+				if (_soundPtr2) {
+					_G(kernel).trigger_mode = KT_PARSE;
+					digi_play(_soundPtr2, 1, 255, 777);
+					_G(kernel).trigger_mode = KT_DAEMON;
+					_soundPtr2 = nullptr;
+				}
+				break;
+
 			case 2230:
 				player_set_commands_allowed(false);
 				sendWSMessage_10000(1, _wolfieMach, _wolfClippersDown, 1, 8, 111,
 					_wolfClippersDown, 8, 8, 0);
 				_val13 = 2231;
 				break;
+
 			case 2231:
 				_ripEnterLeave = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, -53, 100, 0x100, 0,
 					triggerMachineByHashCallbackNegative, "rip talks wolf");
@@ -491,6 +532,218 @@ void Room402::daemon() {
 				_val13 = 2242;
 				break;
 
+			case 2250:
+				sendWSMessage_10000(1, _wolfieMach, _wolfWantsMoney, 16, 1, 111,
+					_wolfWantsMoney, 1, 1, 0);
+				_val13 = 2252;
+				break;
+
+			case 2252:
+				sendWSMessage_10000(1, _wolfieMach, _wolfClippersDown, 43, 1, 111,
+					_wolfClipping, 1, 1, 0);
+				_val13 = 2253;
+				break;
+
+			case 2253:
+				_val12 = 2001;
+				_val13 = 2300;
+				kernel_timing_trigger(1, 110);
+
+				if (!player_said("enter", "CASTLE DOOR") && !_G(flags)[V052]) {
+					player_set_commands_allowed(true);
+				}
+				break;
+
+			default:
+				break;
+			}
+			break;
+
+		case 2001:
+			if (_val13 == 2300) {
+				sendWSMessage_10000(1, _wolfieMach, _wolfClipping, 1, 10, 110,
+					_wolfClipping, 10, 10, 0);
+				kernel_timing_trigger(35, 10000);
+			}
+			break;
+
+		case 2002:
+			switch (_val13) {
+			case 2141:
+				sendWSMessage_10000(1, _wolfieMach, _wolfShakesHead, 1, 1, 110,
+					_wolfShakesHead, 1, 1, 0);
+				_val13 = 2143;
+				break;
+
+			case 2142:
+				frame = imath_ranged_rand(1, 5);
+				sendWSMessage_10000(1, _wolfieMach, _wolfShakesHead, frame, frame, 110,
+					_wolfShakesHead, frame, frame, 0);
+				break;
+
+			case 2143:
+				sendWSMessage_10000(1, _wolfieMach, _wolfShakesHead, 1, 1, 110,
+					_wolfShakesHead, 1, 1, 0);
+				break;
+
+			case 2150:
+				_val13 = 2152;
+				sendWSMessage_10000(1, _wolfieMach, _wolfWantsMoney, 1, 16, 111,
+					_wolfWantsMoney, 16, 16, 0);
+
+				if (_soundPtr2) {
+					digi_play(_soundPtr2, 1);
+					_soundPtr2 = nullptr;
+				}
+				break;
+
+			case 2152:
+				_val13 = 2153;
+
+				if (_G(flags)[V111] > 0) {
+					_machine1 = series_stream("Rip popup", 7, 0, 111);
+				} else {
+					kernel_timing_trigger(1, 111);
+				}
+				break;
+
+			case 2153:
+				player_set_commands_allowed(true);
+				break;
+
+			case 2160:
+				sendWSMessage_10000(1, _wolfieMach, _wolfClippersDown, 43, 1, 111,
+					_wolfClipping, 1, 1, 0);
+				_val13 = 2162;
+				break;
+
+			case 2162:
+				_val12 = 2000;
+				_val13 = 2104;
+				kernel_timing_trigger(1, 110);
+				conv_resume();
+				break;
+
+			case 2170:
+				_val13 = 2272;
+				sendWSMessage_10000(1, _wolfieMach, _wolfWantsMoney, 1, 16, -1,
+					_wolfWantsMoney, 16, 16, 0);
+
+				if (_soundPtr2) {
+					digi_play(_soundPtr2, 1, 255, 111);
+					_soundPtr2 = nullptr;
+				}
+				break;
+
+			case 2180:
+				_val13 = 2181;
+				digi_play(_soundPtr2, 1, 255, 111);
+				break;
+
+			case 2181:
+				_val13 = 2182;
+				sendWSMessage_10000(1, _wolfieMach, _wolfWantsMoney, 16, 1, 111,
+					_wolfWantsMoney, 1, 1, 0);
+				break;
+
+			case 2182:
+				_val12 = 2002;
+				_val13 = 2143;
+				kernel_timing_trigger(1, 110);
+				conv_resume();
+				break;
+
+			case 2190:
+				if (_soundPtr2) {
+					digi_play(_soundPtr2, 1);
+					_soundPtr2 = nullptr;
+				}
+
+				sendWSMessage_10000(1, _wolfieMach, _wolfWantsMoney, 16, 1, 111,
+					_wolfWantsMoney, 1, 1, 0);
+				_val13 = 2192;
+				break;
+
+			case 2192:
+				sendWSMessage_10000(1, _wolfieMach, _wolfClippersDown, 43, 1, 111,
+					_wolfClipping, 1, 1, 0);
+				_val13 = 2193;
+				break;
+
+			case 2193:
+				_val12 = 2001;
+				_val13 = 2300;
+				kernel_timing_trigger(1, 110);
+				player_set_commands_allowed(true);
+				break;
+
+			case 2260:
+				sendWSMessage_10000(1, _wolfieMach, _wolfClippersDown, 1, 8, 111,
+					_wolfClippersDown, 8, 8, 0);
+				_val13 = 2261;
+				break;
+
+			case 2261:
+				digi_play("402_s04", 2);
+				sendWSMessage_10000(1, _wolfieMach, _wolfClippersDown, 8, 43, 111,
+					_wolfClippersDown, 43, 43, 0);
+				_val13 = 2262;
+				break;
+
+			case 2262:
+				if (_G(flags)[V111] > 0 || _currentNode == 16 ||
+						_currentNode == 14 || _currentNode == 26) {
+					sendWSMessage_10000(1, _wolfieMach, _wolfWantsMoney, 1, 16, -1,
+						_wolfWantsMoney, 16, 16, 0);
+
+					if (_soundPtr2) {
+						_G(kernel).trigger_mode = KT_PARSE;
+						digi_play(_soundPtr2, 1, 255, 777);
+						_G(kernel).trigger_mode = KT_DAEMON;
+						_soundPtr2 = nullptr;
+					}
+				} else {
+					_val13 = 2263;
+
+					if (_soundPtr2) {
+						digi_play(_soundPtr2, 1, 255, 111);
+					} else {
+						kernel_timing_trigger(1, 111);
+					}
+				}
+
+				if (inv_player_has("POMERANIAN MARKS")) {
+					player_set_commands_allowed(true);
+				}
+				break;
+
+			case 2263:
+				sendWSMessage_10000(1, _wolfieMach, _wolfWantsMoney, 1, 16, 110,
+					_wolfWantsMoney, 16, 16, 0);
+				_val13 = 2264;
+				break;
+
+			case 2264:
+				_machine1 = series_stream("Rip popup", 7, 0, 111);
+				_val13 = 2265;
+				break;
+
+			case 2265:
+				if (_soundPtr2) {
+					_soundPtr2 = nullptr;
+					_G(kernel).trigger_mode = KT_PARSE;
+					kernel_timing_trigger(1, 777);
+					_G(kernel).trigger_mode = KT_PARSE;
+
+				} else {
+					player_set_commands_allowed(true);
+				}
+				break;
+
+			case 2272:
+				conv_resume();
+				break;
+
 			default:
 				break;
 			}
@@ -501,6 +754,51 @@ void Room402::daemon() {
 		}
 		break;
 
+	case 200:
+		_ripEnterLeave = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, -53, 100, 0x100, 0,
+			triggerMachineByHashCallbackNegative, "rip talks wolf");
+
+		player_update_info();
+		_safariShadow = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
+			_G(player_info).x, _G(player_info).y, _G(player_info).scale, 0x200, 0,
+			triggerMachineByHashCallbackNegative, "rip talks wolf SHADOW");
+		sendWSMessage_10000(1, _ripEnterLeave, _ripTalkWolf, 1, 7, -1,
+			_ripTalkWolf, 7, 7, 0);
+		sendWSMessage_10000(1, _wolfieMach, _wolfClippersDown, 1, 8, 201,
+			_wolfClippersDown, 8, 8, 0);
+		break;
+
+	case 201:
+		digi_play("402_s04", 2);
+		sendWSMessage_10000(1, _wolfieMach, _wolfClippersDown, 8, 43, 202,
+			_wolfClippersDown, 43, 43, 0);
+		break;
+
+	case 202:
+		sendWSMessage_10000(1, _wolfieMach, _ripPaysWolfie, 1, 24, 203,
+			_ripPaysWolfie, 24, 24, 0);
+		break;
+
+	case 203:
+		sendWSMessage_10000(1, _wolfieMach, _wolfWantsMoney, 1, 16, 204,
+			_wolfWantsMoney, 16, 16, 0);
+
+		if (!_G(flags)[V115])
+			digi_play("402w07", 1);
+		break;
+
+	case 204:
+		digi_play("950_s23", 2);
+		kernel_timing_trigger(30, 205);
+		break;
+
+	// TODO
+
+	case 223:
+		sendWSMessage_10000(1, _wolfieMach, _ripPaysWolfie, 1, 24, 224,
+			_ripPaysWolfie, 24, 24, 0);
+		break;
+
 	default:
 		break;
 	}
diff --git a/engines/m4/riddle/rooms/section4/room402.h b/engines/m4/riddle/rooms/section4/room402.h
index 5ce4fd11089..c8bd7b4489f 100644
--- a/engines/m4/riddle/rooms/section4/room402.h
+++ b/engines/m4/riddle/rooms/section4/room402.h
@@ -66,6 +66,8 @@ private:
 	int _ripClimbKnock = 0;
 	int _doorOpens = 0;
 	machine *_castleDoor = nullptr;
+	machine *_machine1 = nullptr;
+	int _machine1Series = 0;
 
 	void conv402a();
 	void conv402a777();




More information about the Scummvm-git-logs mailing list