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

dreammaster noreply at scummvm.org
Wed Jul 31 03:38:37 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:
8c7991a66d M4: RIDDLE: Finished room 303 parser


Commit: 8c7991a66defcb48e29fbfbd1b198f7f94af1052
    https://github.com/scummvm/scummvm/commit/8c7991a66defcb48e29fbfbd1b198f7f94af1052
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-07-30T20:38:29-07:00

Commit Message:
M4: RIDDLE: Finished room 303 parser

Changed paths:
    engines/m4/adv_r/conv_io.cpp
    engines/m4/adv_r/conv_io.h
    engines/m4/graphics/gr_series.cpp
    engines/m4/graphics/gr_series.h
    engines/m4/platform/sound/midi.cpp
    engines/m4/platform/sound/midi.h
    engines/m4/riddle/rooms/section3/room303.cpp
    engines/m4/riddle/rooms/section3/room303.h
    engines/m4/riddle/walker.cpp
    engines/m4/riddle/walker.h


diff --git a/engines/m4/adv_r/conv_io.cpp b/engines/m4/adv_r/conv_io.cpp
index 1c1040bfc6d..d3b4b181428 100644
--- a/engines/m4/adv_r/conv_io.cpp
+++ b/engines/m4/adv_r/conv_io.cpp
@@ -127,6 +127,10 @@ void conv_play(Conv *c) {
 	conv_go(c);
 }
 
+void conv_play() {
+	conv_play(conv_get_handle());
+}
+
 int32 conv_current_node() {
 	if (conv_get_handle())
 		return conv_get_handle()->node_hash;
diff --git a/engines/m4/adv_r/conv_io.h b/engines/m4/adv_r/conv_io.h
index c672dcd54cd..f9a40f604e2 100644
--- a/engines/m4/adv_r/conv_io.h
+++ b/engines/m4/adv_r/conv_io.h
@@ -107,6 +107,7 @@ void conv_reset(char *filename);
 
 void conv_reset_all();
 void conv_play(Conv *c);
+void conv_play();
 
 void set_conv_name(const char *s);
 const char *get_conv_name();
diff --git a/engines/m4/graphics/gr_series.cpp b/engines/m4/graphics/gr_series.cpp
index 56088990de9..5aa35f5ec6d 100644
--- a/engines/m4/graphics/gr_series.cpp
+++ b/engines/m4/graphics/gr_series.cpp
@@ -321,6 +321,14 @@ machine *series_plain_play(const char *seriesName, int32 loopCount, uint32 flags
 	return series_play(seriesName, layer, flags, trigger, frameRate, loopCount, s);
 }
 
+machine *series_play_xy(const char *seriesName, int loopCount, int flags,
+		int x, int y, int scale, int depth, int layer, int frameRate) {
+	// TODO: proper implementation
+	warning("TODO: series_play_xy");
+	return series_play(seriesName, layer, flags, -1, frameRate, loopCount,
+		scale, x, y);
+}
+
 void series_stream_check_series(machine *m, int val) {
 	// TODO: series_stream_check_series
 	error("TODO: series_stream_check_series");
diff --git a/engines/m4/graphics/gr_series.h b/engines/m4/graphics/gr_series.h
index 9c69839057e..ecd0ffc37cf 100644
--- a/engines/m4/graphics/gr_series.h
+++ b/engines/m4/graphics/gr_series.h
@@ -111,6 +111,8 @@ machine *series_ranged_play(const char *seriesName, int32 loopCount, uint32 flag
 	int32 frameRate, int32 trigger = -1, bool stick_when_done = false);
 machine *series_plain_play(const char *seriesName, int32 loopCount, uint32 flags,
 	int32 s, int32 layer, int32 frameRate, int32 trigger = -1, bool stickWhenDone = false);
+machine *series_play_xy(const char *seriesName, int loopCount, int flags,
+	int x, int y, int scale, int depth, int layer, int frameRate);
 
 machine *series_stream(const char *seriesName, int32 frameRate, int32 layer, int32 trigger);
 bool series_stream_break_on_frame(machine *m, int32 frameNum, int32 trigger);
diff --git a/engines/m4/platform/sound/midi.cpp b/engines/m4/platform/sound/midi.cpp
index 780df227dd5..a0d46a2a85f 100644
--- a/engines/m4/platform/sound/midi.cpp
+++ b/engines/m4/platform/sound/midi.cpp
@@ -63,4 +63,8 @@ void midi_set_overall_volume(int vol) {
 	_G(midi).set_overall_volume(vol);
 }
 
+void midi_fade_volume(int val1, int val2) {
+	warning("TODO: midi_fade_volume");
+}
+
 } // namespace M4
diff --git a/engines/m4/platform/sound/midi.h b/engines/m4/platform/sound/midi.h
index 3997a408e0d..e84ddf08001 100644
--- a/engines/m4/platform/sound/midi.h
+++ b/engines/m4/platform/sound/midi.h
@@ -43,6 +43,7 @@ void midi_play(const char *name, int volume, int loop, int trigger, int roomNum)
 void midi_loop();
 void midi_stop();
 void midi_set_overall_volume(int vol);
+void midi_fade_volume(int val1, int val2);
 
 } // namespace M4
 
diff --git a/engines/m4/riddle/rooms/section3/room303.cpp b/engines/m4/riddle/rooms/section3/room303.cpp
index ff74f45aac7..0409a1cb5ca 100644
--- a/engines/m4/riddle/rooms/section3/room303.cpp
+++ b/engines/m4/riddle/rooms/section3/room303.cpp
@@ -31,6 +31,15 @@ namespace M4 {
 namespace Riddle {
 namespace Rooms {
 
+static const char *SAID[][2] = {
+	{ "IRON MAIDEN",     "303R29" },
+	{ "MUMMY WITH HAIR", "303R30" },
+	{ "MAN WITH HAMMER", "303R33" },
+	{ "TICKET WINDOW",   "303R34" },
+	{ "PICTURE",         "303R35" },
+	{ nullptr, nullptr }
+};
+
 void Room303::preload() {
 	LoadWSAssets("OTHER SCRIPT");
 
@@ -638,8 +647,270 @@ void Room303::parser() {
 				break;
 			}
 		}
+	} else if (lookFlag && player_said("giant matchstick")) {
+		if (_G(flags)[V000] == 1) {
+			digi_play("303r36", 1);
+		} else {
+			switch (_G(kernel).trigger) {
+			case -1:
+			case 666:
+				player_set_commands_allowed(false);
+				_chinTalk4 = series_load("rip suit talker pos4");
+				setGlobals4(_chinTalk4, 1, 1, 5);
+				sendWSMessage_C0000(1);
+				break;
+
+			case 2:
+				sendWSMessage_D0000();
+				digi_play("303r25", 1, 255, 3);
+				break;
+
+			case 3:
+				digi_play("303F12", 1, 255, 4);
+				_val15 = 2;
+				sendWSMessage_B0000(0);
+				break;
+
+			case 4:
+				_val15 = 1;
+				series_unload(_chinTalk4);
+				break;
+
+			default:
+				break;
+			}
+		}
+	} else if (player_said("open")) {
+		if (player_been_here(301)) {
+			switch (_G(kernel).trigger) {
+			case -1:
+				ws_walk(409, 266, nullptr, 1, 1);
+				break;
+
+			case 1:
+				player_set_commands_allowed(false);
+				_med1 = series_load("RIP TREK MED REACH HAND POS1");
+				setGlobals1(_med1, 1, 10, 10, 10, 1);
+				sendWSMessage_110000(2);
+				break;
+
+			case 2:
+				sendWSMessage_140000(4);
+				terminateMachineAndNull(_door);
+				series_plain_play("DOOR", 1, 0, 100, 0xf05, 7, 3);
+				digi_play("303_s01", 1);
+				break;
+
+			case 3:
+				series_show_sprite("DOOR", 7, 0xf05);
+				break;
+
+			case 4:
+				ws_walk(417, 232, nullptr, -1, 2);
+				break;
+
+			case 5:
+				_G(game).setRoom(304);
+				break;
+
+			default:
+				break;
+			}
+		} else {
+			switch (_G(kernel).trigger) {
+			case -1:
+				player_set_commands_allowed(false);
+				player_update_info();
+				ws_hide_walker();
+				_ripsh1 = series_place_sprite("ripsh1", 0,
+					_G(player_info).x, _G(player_info).y, _G(player_info).scale,
+					_G(player_info).depth + 1);
+				_med1 = series_load("SUIT DOOR OPENER POS1");
+
+				series_play_xy("SUIT DOOR OPENER POS1", 1, 0, 405, 266,
+					_G(player_info).scale, _G(player_info).depth, 7, 1);
+				break;
+
+			case 2:
+				series_show_sprite("DOOR", 7, 0xf05);
+				break;
 
-		// TODO
+			case 3:
+				ws_unhide_walker();
+				terminateMachineAndNull(_ripsh1);
+				kernel_timing_trigger(10, 4);
+				break;
+
+			case 4:
+				ws_walk(417, 232, nullptr, -1, 2);
+				disable_player_commands_and_fade_init(6);
+				break;
+
+			case 6:
+				digi_stop(3);
+				_G(game).setRoom(304);
+				break;
+
+			default:
+				break;
+			}
+		}
+	} else if (lookFlag && player_said("cobra case")) {
+		digi_play(player_been_here(201) ? "203r38" : "303r32", 1);
+	} else if ((lookFlag || player_said("peer into")) &&
+			player_said("copper tank viewer")) {
+		if (player_been_here(301)) {
+			switch (_G(kernel).trigger) {
+			case -1:
+				player_set_commands_allowed(false);
+				_ripBends = series_load("rip trek bends to viewer");
+				setGlobals1(_ripBends, 1, 17, 17, 17, 1);
+				sendWSMessage_110000(-1);
+				disable_player_commands_and_fade_init(1);
+				break;
+
+			case 1:
+				_G(game).setRoom(309);
+				interface_hide();
+				break;
+
+			default:
+				break;
+			}
+		} else {
+			switch (_G(kernel).trigger) {
+			case -1:
+				player_set_commands_allowed(false);
+				_ripBends = series_load("RIP BENDS TO SEE CREATURE");
+				setGlobals1(_ripBends, 1, 26, 26, 26);
+				sendWSMessage_110000(1);
+				break;
+
+			case 1:
+				disable_player_commands_and_fade_init(2);
+				break;
+
+			case 2:
+				_G(game).setRoom(309);
+				interface_hide();
+				break;
+			default:
+				break;
+			}
+		}
+	} else if (player_said("TALK MEI CHEN")) {
+		player_set_commands_allowed(false);
+		_suit1 = series_load("SUIT CHIN IN HAND POS2");
+		_suit2 = series_load("RIP SUIT RT HAND GEST TALK POS2");
+		_meiLips = series_load("MEI PUTS FINGER TO LIPS");
+		_ripGesture = series_load("RIP HNDS HIPS GEST TALK");
+		player_update_info();
+		ws_hide_walker();
+
+		_ripsh2 = series_show("ripsh2", 0xf00, 128, -1, 0,
+			_G(player_info).scale, _G(player_info).x, _G(player_info).y);
+		_machine3 = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
+			_G(player_info).x, _G(player_info).y, _G(player_info).scale + 1,
+			0x500, 1, triggerMachineByHashCallbackNegative, "rip");
+
+		_G(kernel).trigger_mode = KT_DAEMON;
+		sendWSMessage_10000(1, _machine3, 1, 1, 1, 300, 1, 1, 1, 0);
+
+		_val17 = _val16 = 0;
+		_G(kernel).trigger_mode = KT_PARSE;
+
+		conv_load("conv303b", 10, 10, 747);
+		conv_play(conv_get_handle());
+		_val11 = 4;
+		_val16 = 0;
+
+	} else if (_G(kernel).trigger == 747) {
+		midi_fade_volume(0, 120);
+		kernel_timing_trigger(120, 749);
+		_lonelyFlag = false;
+		_val7 = 1;
+		_val11 = 0;
+		_val16 = 5;
+
+	} else if (_G(kernel).trigger == 749) {
+		midi_stop();
+
+	} else if (player_said("TALK FL")) {
+		_suit1 = series_load("SUIT CHIN IN HAND POS2");
+		_suit2 = series_load("RIP SUIT RT HAND GEST TALK POS2");
+		_ripGesture = series_load("RIP HNDS HIPS GEST TALK");
+		player_update_info();
+		ws_hide_walker();
+
+		if (_val13) {
+			_ripsh2 = series_show("ripsh2", 0xf00, 0, -1, -1, 0,
+				_G(player_info).scale, _G(player_info).x, _G(player_info).y);
+			_machine3 = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
+				_G(player_info).x, _G(player_info).y, _G(player_info).scale + 1,
+				0x500, 0, triggerMachineByHashCallbackNegative, "rip");
+
+		} else {
+			_ripsh2 = series_show("ripsh2", 0xf00, 128, -1, -1, 0,
+				_G(player_info).scale, _G(player_info).x, _G(player_info).y);
+			_machine3 = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
+				_G(player_info).x, _G(player_info).y, _G(player_info).scale + 1,
+				0x500, 1, triggerMachineByHashCallbackNegative, "rip");
+		}
+
+		_G(kernel).trigger_mode = KT_DAEMON;
+		sendWSMessage_10000(1, _machine3, 1, 1, 1, 300, 1, 1, 1, 0);
+		_val16 = _val17 = 0;
+
+		_G(kernel).trigger_mode = KT_PARSE;
+		player_set_commands_allowed(false);
+		conv_load("conv303a", 10, 10, 748);
+
+		conv_export_value(conv_get_handle(), _G(flags)[V086], 0);
+		conv_play();
+		_val15 = 1;
+		_val16 = 0;
+
+	} else if (_G(kernel).trigger == 748) {
+		_G(flags)[V082] = 1;
+		_G(flags)[V083] = 1;
+		midi_fade_volume(0, 120);
+		kernel_timing_trigger(120, 749);
+		_lonelyFlag = false;
+		_val15 = 4;
+		_val16 = 5;
+
+	} else if (player_said("exit left")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+			disable_player_commands_and_fade_init(1);
+			break;
+
+		case 1:
+			digi_stop(3);
+			_G(game).setRoom(305);
+			break;
+
+		default:
+			break;
+		}
+	} else if (lookFlag && _G(walker).ripley_said(SAID)) {
+		// Already handled
+	} else if (player_said("exit right")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+			disable_player_commands_and_fade_init(1);
+			break;
+
+		case 1:
+			digi_stop(3);
+			_G(game).setRoom(301);
+			break;
+
+		default:
+			break;
+		}
 	} else {
 		return;
 	}
diff --git a/engines/m4/riddle/rooms/section3/room303.h b/engines/m4/riddle/rooms/section3/room303.h
index cceba51f183..46afb897d8c 100644
--- a/engines/m4/riddle/rooms/section3/room303.h
+++ b/engines/m4/riddle/rooms/section3/room303.h
@@ -46,6 +46,7 @@ private:
 	int _val14 = 0;
 	int _val15 = 0;
 	int _val16 = 0;
+	int _val17 = 0;
 	KernelTriggerType _triggerMode1 = KT_DAEMON;
 	KernelTriggerType _triggerMode2 = KT_DAEMON;
 	machine *_door = nullptr;
@@ -61,10 +62,18 @@ private:
 	machine *_shadow5 = nullptr;
 	machine *_machine1 = nullptr;
 	machine *_machine2 = nullptr;
+	machine *_machine3 = nullptr;
 	machine *_ripPonders = nullptr;
 	int _gestTalk4 = 0;
 	int _ripBends = 0;
 	int _chinTalk4 = 0;
+	int _med1 = 0;
+	machine *_ripsh1 = nullptr;
+	machine *_ripsh2 = nullptr;
+	int _suit1 = 0;
+	int _suit2 = 0;
+	int _meiLips = 0;
+	int _ripGesture = 0;
 
 	static void escapePressed(void *, void *);
 
diff --git a/engines/m4/riddle/walker.cpp b/engines/m4/riddle/walker.cpp
index c135744e59d..e6736db10f4 100644
--- a/engines/m4/riddle/walker.cpp
+++ b/engines/m4/riddle/walker.cpp
@@ -169,6 +169,20 @@ void Walker::unloadSprites() {
 	}
 }
 
+bool Walker::ripley_said(const char *list[][2]) {
+	if (!list)
+		return false;
+
+	for (int index = 0; list[index][0]; ++index) {
+		if (player_said(list[index][0])) {
+			digi_play(list[index][1], 1);
+			return true;
+		}
+	}
+
+	return false;
+}
+
 void enable_player() {
 	player_set_commands_allowed(true);
 	ws_unhide_walker(_G(my_walker));
diff --git a/engines/m4/riddle/walker.h b/engines/m4/riddle/walker.h
index 3ce50d50622..5160cd847fc 100644
--- a/engines/m4/riddle/walker.h
+++ b/engines/m4/riddle/walker.h
@@ -56,6 +56,8 @@ public:
 
 	void reset_walker_sprites();
 	static void unloadSprites();
+
+	bool ripley_said(const char *list[][2]);
 };
 
 void enable_player();




More information about the Scummvm-git-logs mailing list