[Scummvm-git-logs] scummvm master -> 8df42e0b12545398615b8ee4d6b818b8679769da

dreammaster noreply at scummvm.org
Wed Aug 21 03:51:59 UTC 2024


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

Summary:
8df42e0b12 M4: RIDDLE: Finished room 406 parser


Commit: 8df42e0b12545398615b8ee4d6b818b8679769da
    https://github.com/scummvm/scummvm/commit/8df42e0b12545398615b8ee4d6b818b8679769da
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-08-20T20:51:50-07:00

Commit Message:
M4: RIDDLE: Finished room 406 parser

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


diff --git a/engines/m4/riddle/flags.h b/engines/m4/riddle/flags.h
index b4e22cff6d3..094f2612424 100644
--- a/engines/m4/riddle/flags.h
+++ b/engines/m4/riddle/flags.h
@@ -344,7 +344,7 @@ enum {
 	V306 = 306,
 	V307 = 307,
 	V308 = 308,
-	V309 = 309,
+	kWritingDeskDrawerOpen = 309,
 	V310 = 310,
 	V311 = 311,
 	V312 = 312,
diff --git a/engines/m4/riddle/rooms/section4/room406.cpp b/engines/m4/riddle/rooms/section4/room406.cpp
index 476c5c2e3cd..110d67a9826 100644
--- a/engines/m4/riddle/rooms/section4/room406.cpp
+++ b/engines/m4/riddle/rooms/section4/room406.cpp
@@ -119,7 +119,7 @@ void Room406::init() {
 			0, 0, 0, 100, 0xf00);
 	}
 
-	if (_G(flags)[V309]) {
+	if (_G(flags)[kWritingDeskDrawerOpen]) {
 		hotspot_set_active("WRITING DESK", false);
 		_desk = series_place_sprite("406 DESK OPEN", 0, 0, 0, 100, 0x600);
 	} else {
@@ -278,6 +278,7 @@ void Room406::pre_parser() {
 		_G(player).resetWalk();
 	}
 }
+
 #define LOOK(ITEM) (lookFlag && player_said(ITEM) && inv_object_is_here(ITEM))
 void Room406::parser() {
 	bool lookFlag = player_said_any("look", "look at");
@@ -285,7 +286,22 @@ void Room406::parser() {
 	bool useFlag = player_said_any("push", "pull", "gear", "open", "close");
 
 	if (takeFlag && player_said("ENVELOPE")) {
-		// No implementation
+		switch (_G(kernel).trigger) {
+		case -1:
+			if (inv_object_is_here("ENVELOPE")) {
+				inv_give_to_player("ENVELOPE");
+				hotspot_set_active("ENVELOPE", false);
+				terminateMachineAndNull(_envelope);
+				kernel_examine_inventory_object("PING ENVELOPE", _G(master_palette),
+					5, 1, 398, 220, 8, 0, -1);
+			}
+			break;
+		case 8:
+			player_set_commands_allowed(true);
+			break;
+		default:
+			break;
+		}
 	} else if (takeFlag && player_said("KEYS") && takeKeys()) {
 		// No implementation
 	} else if (takeFlag && player_said("DESK DRAWER OPEN")) {
@@ -489,9 +505,420 @@ void Room406::parser() {
 			useSwitchPaintingOpen();
 		else
 			useSwitchPaintingClosed();
-	}
-	// TODO
-	else {
+	} else if (useFlag && player_said_any("ACE OF SPADES", "ACE OF SPADES ")) {
+		// Note: The original had two separate blocks for use ace of spades.
+		// Since the second version could never be called, I've ommitted it
+		if (_G(flags)[V310])
+			useAceOfSpades1();
+		else
+			useAceOfSpades2();
+	} else if (player_said("CUBE CABINET", "KEYS")) {
+		digi_play("406r27", 1);
+	} else if (player_said("DART BOARD", "KEYS")) {
+		digi_play("406r26", 1);
+	} else if (useFlag && player_said("CUE CABINET")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+			_ripReachHand = series_load("RIP TREK MED REACH HAND POS1");
+			break;
+		case 1:
+			digi_play("406_s04", 2, 255, 2);
+			break;
+		case 2:
+			digi_play(inv_player_has("KEYS") ? "406r27" : "406r20", 1);
+			break;
+		case 4:
+			sendWSMessage_150000(5);
+			break;
+		case 5:
+			series_unload(_ripReachHand);
+			player_set_commands_allowed(true);
+			break;
+		default:
+			break;
+		}
+	} else if (useFlag && player_said("WRITING DESK DRAWER")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+			_rptmhr = series_load("RPTMHR11");
+			setGlobals1(_rptmhr, 1, 5, 5, 5, 0, 5, 1, 1, 1);
+			sendWSMessage_110000(1);
+			break;
+		case 1:
+			_val2 = 1000;
+			_emptyDrawer = series_place_sprite("406 DESK DRAWER EMPTY", 0, 0, 0, 100, 0x200);
+			digi_play("406_s02", 2);
+			hotspot_set_active(" ", true);
+			hotspot_set_active("DESK DRAWER OPEN", true);
+			hotspot_set_active("MESSAGES", true);
+
+			if (inv_object_is_here("ENVELOPE")) {
+				_envelope = series_place_sprite("406 DESK DRAWER ENVELOPE", 0, 0, 0, 100, 0x200);
+				hotspot_set_active("ENVELOPE", true);
+			}
+
+			if (!inv_player_has("KEYS")) {
+				_keys = series_place_sprite("406 DESK DRAWER WITH KEYS", 0, 0, 0, 100, 0x200);
+				hotspot_set_active("KEYS", true);
+			}
+
+			player_set_commands_allowed(true);
+			break;
+		default:
+			break;
+		}
+	} else if (useFlag && player_said("GAMES CABINET DRAWER")) {
+		if (_G(flags)[V307]) {
+			switch (_G(kernel).trigger) {
+			case -1:
+				player_set_commands_allowed(false);
+				_ripReachHand = series_load("RIP TREK MED REACH HAND POS1");
+				setGlobals1(_ripReachHand, 1, 10, 10, 10, 0, 10, 1, 1, 1);
+				sendWSMessage_110000(1);
+				break;
+			case 1:
+				if (_G(flags)[V308]) {
+					_val1 = 1000;
+					_cards = series_place_sprite("406 GAMES DRAWER WITH CARDS", 0, 0, 0, 100, 0x100);
+					digi_play("406_s02", 2);
+					hotspot_set_active(" ", true);
+					hotspot_set_active("CABINET DRAW OPEN", true);
+					player_set_commands_allowed(true);
+				} else {
+					digi_play("406r20", 1);
+					sendWSMessage_120000(4);
+				}
+				break;
+			case 4:
+				sendWSMessage_150000(5);
+				break;
+			case 5:
+				series_unload(_ripReachHand);
+				player_set_commands_allowed(true);
+				break;
+			default:
+				break;
+			}
+		} else {
+			digi_play("406r20", 1);
+		}
+	} else if (player_said("GAMES CABINET DRAWER", "KEYS")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+			_ripReachHand = series_load("RIP TREK MED REACH HAND POS1");
+			setGlobals1(_ripReachHand, 1, 10, 10, 10, 0, 10, 1, 1, 1);
+			sendWSMessage_110000(1);
+			break;
+		case 1:
+			if (_G(flags)[V308]) {
+				_G(flags)[V308] = 0;
+				digi_play("406_s06", 2);
+			} else {
+				digi_play("406_s05", 2);
+				_G(flags)[V308] = 1;
+			}
+			break;
+		case 4:
+			sendWSMessage_150000(5);
+			break;
+		case 5:
+			series_unload(_ripReachHand);
+			player_set_commands_allowed(true);
+			break;
+		default:
+			break;
+		}
+	} else if (player_said("GAMES CABINET", "KEYS")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+			_ripReachHand = series_load("RIP TREK MED REACH HAND POS1");
+			setGlobals1(_ripReachHand, 1, 10, 10, 10, 0, 10, 1, 1, 1);
+			sendWSMessage_110000(1);
+			break;
+		case 1:
+			if (_G(flags)[V307]) {
+				_G(flags)[V307] = 0;
+				digi_play("406_s06", 2);
+			} else {
+				digi_play("406_s05", 2);
+				_G(flags)[V307] = 1;
+			}
+			break;
+		case 4:
+			sendWSMessage_150000(5);
+			break;
+		case 5:
+			series_unload(_ripReachHand);
+			player_set_commands_allowed(true);
+			break;
+		default:
+			break;
+		}
+	} else if (useFlag && player_said("BILLIARD BALL") && lookBilliardBall()) {
+		// No implementation
+	} else if (useFlag && player_said("WRITING DESK")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+			_ripReachHand = series_load("RIP TREK MED REACH HAND POS1");
+			setGlobals1(_ripReachHand, 1, 10, 10, 10, 0, 10, 1, 1, 1);
+			sendWSMessage_110000(1);
+			break;
+		case 1:
+			terminateMachineAndNull(_desk);
+			_deskOpening = series_load("406 DESK OPENING");
+			digi_play("406_s05", 2, 255, -1, 406);
+			_desk = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x500, 0,
+				triggerMachineByHashCallbackAlways, "writing desk opens");
+			sendWSMessage_10000(1, _desk, _deskOpening, 1, 15, 2,
+				_deskOpening, 15, 15, 0);
+			break;
+		case 2:
+			terminateMachineAndNull(_desk);
+			_desk = series_place_sprite("406 DESK OPEN", 0, 0, 0, 100, 0x600);
+			hotspot_set_active("WRITING DESK", false);
+			hotspot_set_active("WRITING DESK ", true);
+			hotspot_set_active("WRITING DESK DRAWER", true);
+			sendWSMessage_120000(3);
+			break;
+		case 3:
+			sendWSMessage_150000(4);
+			break;
+		case 4:
+			series_unload(_deskOpening);
+			series_unload(_ripReachHand);
+			_G(flags)[kWritingDeskDrawerOpen] = 1;
+			player_set_commands_allowed(true);
+			break;
+		default:
+			break;
+		}
+	} else if (useFlag && player_said("WRITING DESK ")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+			_ripReachHand = series_load("RIP TREK MED REACH HAND POS1");
+			setGlobals1(_ripReachHand, 1, 10, 10, 10, 0, 10, 1, 1, 1);
+			sendWSMessage_110000(1);
+			break;
+		case 1:
+			terminateMachineAndNull(_desk);
+			_deskOpening = series_load("406 DESK OPENING");
+			digi_play("406_s05", 2, 255, -1, 406);
+			_desk = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x500, 0,
+				triggerMachineByHashCallbackAlways, "writing desk opens");
+			sendWSMessage_10000(1, _desk, _deskOpening, 15, 1, 2,
+				_deskOpening, 1, 1, 0);
+			break;
+		case 2:
+			terminateMachineAndNull(_desk);
+			_desk = series_place_sprite("406 DESK CLOSE", 0, 0, 0, 100, 0x600);
+			hotspot_set_active("WRITING DESK", true);
+			hotspot_set_active("WRITING DESK ", false);
+			hotspot_set_active("WRITING DESK DRAWER", false);
+			sendWSMessage_120000(3);
+			break;
+		case 3:
+			sendWSMessage_150000(4);
+			break;
+		case 4:
+			series_unload(_deskOpening);
+			series_unload(_ripReachHand);
+			_G(flags)[kWritingDeskDrawerOpen] = 0;
+			player_set_commands_allowed(true);
+			break;
+		default:
+			break;
+		}
+	} else if (useFlag && player_said("GAMES CABINET")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+			_ripReachHand = series_load("RIP TREK MED REACH HAND POS1");
+			setGlobals1(_ripReachHand, 1, 10, 10, 10, 0, 10, 1, 1, 1);
+			sendWSMessage_110000(1);
+			break;
+		case 1:
+			if (_G(flags)[V307]) {
+				terminateMachineAndNull(_gamesCabinet);
+				_cabinetOpens = series_load("406 GAMES CABINET OPENS");
+				digi_play("950_s36", 2, 255, -1, 950);
+				_gamesCabinet = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0xf00, 0,
+					triggerMachineByHashCallbackAlways, "game cabinet opens");
+				sendWSMessage_10000(1, _gamesCabinet, _cabinetOpens, 1, 10, 2,
+					_cabinetOpens, 10, 10, 0);
+			} else {
+				digi_play("406r20", 1, 255, 3);
+			}
+			break;
+		case 2:
+			terminateMachineAndNull(_gamesCabinet);
+			_gamesCabinet = series_place_sprite("406 GAMES CABINET OPEN", 0, 0, 0, 100, 0xf00);
+			hotspot_set_active("GAMES CABINET", false);
+			hotspot_set_active("GAMES CABINET ", true);
+			hotspot_set_active("GAMES CABINET DRAWER", true);
+			hotspot_set_active("CABINET DRAWER OPEN", false);
+			_G(flags)[V306] = 1;
+			kernel_timing_trigger(1, 3);
+			break;
+		case 3:
+			sendWSMessage_120000(4);
+			break;
+		case 4:
+			sendWSMessage_150000(5);
+			break;
+		case 5:
+			series_unload(_ripReachHand);
+			player_set_commands_allowed(true);
+			break;
+		default:
+			break;
+		}
+	} else if (useFlag && player_said("GAMES CABINET ")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+			_ripReachHand = series_load("RIP TREK MED REACH HAND POS1");
+			setGlobals1(_ripReachHand, 1, 10, 10, 10, 0, 10, 1, 1, 1);
+			sendWSMessage_110000(1);
+			break;
+		case 1:
+			terminateMachineAndNull(_gamesCabinet);
+			_cabinetOpens = series_load("406 GAMES CABINET OPENS");
+			digi_play("950_s36", 2, 255, -1, 950);
+			_gamesCabinet = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0xf00, 0,
+				triggerMachineByHashCallbackAlways, "game cabinet opens");
+			sendWSMessage_10000(1, _gamesCabinet, _cabinetOpens, 10, 1, 2,
+				_cabinetOpens, 1, 1, 0);
+			break;
+		case 2:
+			if (player_said("KEYS"))
+				digi_play("406_s06", 2);
+
+			terminateMachineAndNull(_gamesCabinet);
+			_desk = series_place_sprite("406 GAMES CABINET CLOSED", 0, 0, 0, 100, 0xf00);
+			hotspot_set_active("GAMES CABINET", true);
+			hotspot_set_active("GAMES CABINET ", false);
+			hotspot_set_active("GAMES CABINET DRAWER", false);
+			sendWSMessage_120000(3);
+			break;
+		case 3:
+			sendWSMessage_150000(4);
+			break;
+		case 4:
+			series_unload(_cabinetOpens);
+			series_unload(_ripReachHand);
+			_G(flags)[V306] = 0;
+
+			if (player_said("GAMES CABINET ", "KEYS"))
+				_G(flags)[V307] = 0;
+
+			player_set_commands_allowed(true);
+			break;
+		default:
+			break;
+		}
+	} else if (player_said("GAMES CABINET ", "KEYS")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+			_ripReachHand = series_load("RIP TREK MED REACH HAND POS1");
+			setGlobals1(_ripReachHand, 1, 10, 10, 10, 0, 10, 1, 1, 1);
+			sendWSMessage_110000(1);
+			break;
+		case 1:
+			terminateMachineAndNull(_gamesCabinet);
+			_cabinetOpens = series_load("406 GAMES CABINET OPENS");
+			digi_play("950_s36", 2, 255, -1, 950);
+			_gamesCabinet = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0xf00, 0,
+				triggerMachineByHashCallbackAlways, "game cabinet opens");
+			sendWSMessage_10000(1, _gamesCabinet, _cabinetOpens, 10, 1, 2,
+				_cabinetOpens, 1, 1, 0);
+			break;
+		case 2:
+			if (player_said("KEYS"))
+				digi_play("406_s06", 2);
+
+			terminateMachineAndNull(_gamesCabinet);
+			_gamesCabinet = series_place_sprite("406 GAMES CABINET CLOSED", 0, 0, 0, 100, 0xf00);
+			hotspot_set_active("GAMES CABINET", true);
+			hotspot_set_active("GAMES CABINET ", false);
+			hotspot_set_active("GAMES CABINET DRAWER", false);
+			sendWSMessage_120000(3);
+			break;
+		case 3:
+			sendWSMessage_150000(5);
+			break;
+		case 4:
+			series_unload(_cabinetOpens);
+			series_unload(_ripReachHand);
+			_G(flags)[V306] = 0;
+
+			if (player_said("GAMES CABINET ", "KEYS"))
+				_G(flags)[V307] = 0;
+
+			player_set_commands_allowed(true);
+			break;
+		default:
+			break;
+		}
+	} else if (player_said("DOWN", "STAIRS")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+			disable_player_commands_and_fade_init(2);
+			break;
+		case 2:
+			_G(flags)[V312] = 0;
+			_G(game).setRoom(407);
+			break;
+		default:
+			break;
+		}
+	} else if ((useFlag || lookFlag) && player_said("SMOKING HUTCH")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+			disable_player_commands_and_fade_init(2);
+			break;
+		case 2:
+			_G(game).setRoom(456);
+
+			if (_G(flags)[V322]) {
+				adv_kill_digi_between_rooms(false);
+				digi_play_loop("456_s03a", 3, 255, 700, 456);
+			}
+			break;
+		default:
+			break;							
+		}
+	} else if (player_said("WALK TO", "DOOR")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+			disable_player_commands_and_fade_init(2);
+			break;
+		case 2:
+			_G(game).setRoom(404);
+			break;
+		default:
+			break;
+		}
+	} else if (player_said("journal") && !takeFlag && !lookFlag &&
+			!inv_player_has(_G(player).noun)) {
+		if (_G(flags)[kCastleCartoon])
+			digi_play("com016", 1);
+		else if (_G(kernel).trigger != 6)
+			sendWSMessage_multi("com015");
+		else {
+			_G(flags)[kCastleCartoon] = 1;
+			sendWSMessage_multi("com015");
+		}
+	} else {
 		return;
 	}
 
@@ -517,7 +944,7 @@ void Room406::setHotspots() {
 		hotspot_set_active("GAMES CABINET DRAWER", false);
 	}
 
-	if (_G(flags)[V309]) {
+	if (_G(flags)[kWritingDeskDrawerOpen]) {
 		hotspot_set_active("WRITING DESK", false);
 	} else {
 		hotspot_set_active("WRITING DESK ", false);
@@ -751,6 +1178,106 @@ void Room406::useSwitchPaintingClosed() {
 	}
 }
 
+void Room406::useAceOfSpades1() {
+	switch (_G(kernel).trigger) {
+	case -1:
+		player_set_commands_allowed(false);
+		_ripHiHand = series_load("rip trek hi 1 hand");
+		setGlobals1(_ripHiHand, 1, 5, 5, 5, 0, 5, 1, 1, 1);
+		sendWSMessage_110000(1);
+
+	case 1:
+		terminateMachineAndNull(_cardDoor);
+		hotspot_set_active("ACE OF SPADES", true);
+		hotspot_set_active("ACE OF SPADES ", false);
+		hotspot_set_active("SWITCH", false);
+		sendWSMessage_120000(3);
+		break;
+
+	case 3:
+		sendWSMessage_150000(4);
+		break;
+
+	case 4:
+		series_unload(_ripHiHand);
+		_G(flags)[V310] = 0;
+		player_set_commands_allowed(true);
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Room406::useAceOfSpades2() {
+	switch (_G(kernel).trigger) {
+	case -1:
+		player_set_commands_allowed(false);
+		_ripHiHand = series_load("rip trek hi 1 hand");
+		setGlobals1(_ripHiHand, 1, 5, 5, 5, 0, 5, 1, 1, 1);
+		sendWSMessage_110000(1);
+
+	case 1:
+		_cardDoor = series_place_sprite("406 CARD DOOR OPEN BY PICT", 0, 0, 0, 100, 0xf00);
+		hotspot_set_active("ACE OF SPADES", false);
+		hotspot_set_active("ACE OF SPADES ", true);
+		hotspot_set_active("SWITCH", true);
+		sendWSMessage_120000(3);
+		break;
+
+	case 3:
+		sendWSMessage_150000(4);
+		break;
+
+	case 4:
+		series_unload(_ripHiHand);
+		_G(flags)[V310] = 1;
+		player_set_commands_allowed(true);
+		break;
+
+	default:
+		break;
+	}
+}
+
+bool Room406::lookBilliardBall() {
+	switch (_G(kernel).trigger) {
+	case -1:
+		if (inv_object_is_here("BILLIARD BALL")) {
+			player_set_commands_allowed(false);
+			_ripThrowsBall = series_load("406 RIP THROWS BALL");
+			digi_preload("406_s12");
+			terminateMachineAndNull(_poolBall);
+			ws_hide_walker();
+			_poolBall = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0, 0,
+				triggerMachineByHashCallbackAlways, "RIP throws ball");
+			sendWSMessage_10000(1, _poolBall, _ripThrowsBall, 1, 31, 2,
+				_ripThrowsBall, 31, 31, 0);
+			return true;
+		}
+		break;
+
+	case 2:
+		sendWSMessage_10000(1, _poolBall, _ripThrowsBall, 32, 66, 3,
+			_ripThrowsBall, 66, 66, 0);
+		digi_play("406_s12", 2);
+		return true;
+
+	case 3:
+		terminateMachineAndNull(_poolBall);
+		ws_unhide_walker();
+		series_unload(_ripThrowsBall);
+		_poolBall = series_place_sprite("BILLIARD BALL", 0, 0, 0, 100, 0x200);
+		player_set_commands_allowed(true);
+		return true;
+
+	default:
+		break;
+	}
+
+	return false;
+}
+
 } // namespace Rooms
 } // namespace Riddle
 } // namespace M4
diff --git a/engines/m4/riddle/rooms/section4/room406.h b/engines/m4/riddle/rooms/section4/room406.h
index 45cb2e91d84..9ed7e34e533 100644
--- a/engines/m4/riddle/rooms/section4/room406.h
+++ b/engines/m4/riddle/rooms/section4/room406.h
@@ -52,6 +52,9 @@ private:
 	int _lookMirror = 0;
 	int _tableRaises = 0;
 	int _paintingOpening = 0;
+	int _ripThrowsBall = 0;
+	int _deskOpening = 0;
+	int _cabinetOpens = 0;
 
 	void disableHotspots();
 	void setHotspots();
@@ -60,6 +63,9 @@ private:
 	bool billiardBallOnTable();
 	void useSwitchPaintingOpen();
 	void useSwitchPaintingClosed();
+	void useAceOfSpades1();
+	void useAceOfSpades2();
+	bool lookBilliardBall();
 
 public:
 	Room406() : Room() {}




More information about the Scummvm-git-logs mailing list