[Scummvm-git-logs] scummvm master -> dfdc90eb709cd2acfad5eb1b1e987c87b718478f

dreammaster noreply at scummvm.org
Wed Sep 18 05:17:11 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:
dfdc90eb70 M4: In progress room 603 parser


Commit: dfdc90eb709cd2acfad5eb1b1e987c87b718478f
    https://github.com/scummvm/scummvm/commit/dfdc90eb709cd2acfad5eb1b1e987c87b718478f
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-09-17T22:16:26-07:00

Commit Message:
M4: In progress room 603 parser

Changed paths:
    engines/m4/riddle/rooms/room.cpp
    engines/m4/riddle/rooms/room.h
    engines/m4/riddle/rooms/section6/room603.cpp
    engines/m4/riddle/rooms/section6/room603.h


diff --git a/engines/m4/riddle/rooms/room.cpp b/engines/m4/riddle/rooms/room.cpp
index e37e483f1ae..07fa786445d 100644
--- a/engines/m4/riddle/rooms/room.cpp
+++ b/engines/m4/riddle/rooms/room.cpp
@@ -409,6 +409,20 @@ void Room::sendWSMessage_1a0000(machine *recv, int trigger) {
 	sendWSMessage(0x1a0000, 0, recv, 0, nullptr, 1);
 }
 
+void Room::sendWSMessage_1e0000(machine *recv, int val1, int val2) {
+	_G(globals)[V023] = val1 << 16;
+	_G(globals)[V024] = val2 << 16;
+	sendWSMessage(0x1e0000, 0, recv, 0, nullptr, 1);
+}
+
+void Room::sendWSMessage_200000(machine *recv, int trigger) {
+
+}
+
+void Room::sendWSMessage_1e0000(int val1, int val2) {
+	sendWSMessage_1e0000(_G(my_walker), val1, val2);
+}
+
 void Room::sendWSMessage_29a0000(machine *recv, int val1) {
 	_G(globals)[GLB_TEMP_1] = val1 << 24;
 	sendWSMessage(0x29a0000, 0, recv, 0, 0, 1);
diff --git a/engines/m4/riddle/rooms/room.h b/engines/m4/riddle/rooms/room.h
index fadd6285d01..d4fd97ca5dd 100644
--- a/engines/m4/riddle/rooms/room.h
+++ b/engines/m4/riddle/rooms/room.h
@@ -102,6 +102,10 @@ protected:
 	void sendWSMessage_190000(machine *recv, int trigger);
 	void sendWSMessage_190000(int trigger);
 	void sendWSMessage_1a0000(machine *recv, int trigger);
+	void sendWSMessage_1e0000(machine *recv, int val1, int val2);
+	void sendWSMessage_1e0000(int val1, int val2);
+	void sendWSMessage_200000(machine *recv, int trigger);
+
 	void sendWSMessage_29a0000(machine *recv, int val1);
 	void sendWSMessage_29a0000(int val1);
 	void sendWSMessage_multi(const char *name);
diff --git a/engines/m4/riddle/rooms/section6/room603.cpp b/engines/m4/riddle/rooms/section6/room603.cpp
index eb4f4aed9cd..efdf77879ba 100644
--- a/engines/m4/riddle/rooms/section6/room603.cpp
+++ b/engines/m4/riddle/rooms/section6/room603.cpp
@@ -48,7 +48,7 @@ void Room603::preload() {
 
 void Room603::init() {
 	if (_G(game).previous_room != KERNEL_RESTORING_GAME) {
-		_val1 = 0;
+		_trigger1 = 0;
 		_val2 = 0;
 		_val3 = 0;
 		_val4 = 0;
@@ -208,7 +208,7 @@ void Room603::init() {
 			triggerMachineByHashCallbackNegative, "tt");
 		sendWSMessage_10000(1, _tt, _ttDigShirtOff, 2, 2, 200, _ttDigShirtOff, 2, 2, 0);
 
-		_val1 = 200;
+		_trigger1 = 200;
 		_val7 = 1;
 		_val8 = 0;
 		_val9 = 0;
@@ -235,7 +235,7 @@ void Room603::init() {
 			_tt = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x200, 0,
 				triggerMachineByHashCallbackNegative, "tt");
 			sendWSMessage_10000(1, _tt, _ttD01, 1, 1, 400, _ttD01, 1, 1, 0);
-			_val1 = 400;
+			_trigger1 = 400;
 			hotspot_set_active("twelvetrees ", false);
 			_ttShadow = series_show("tt walker shadow 4", 0xf00, 0, -1, -1, 0, 53, 291, 293);
 
@@ -244,7 +244,7 @@ void Room603::init() {
 				triggerMachineByHashCallbackNegative, "tt");
 			sendWSMessage_10000(1, _tt, _ttDigShirtOn, 1, 1, 500,
 				_ttDigShirtOn, 1, 1, 0);
-			_val1 = 500;
+			_trigger1 = 500;
 			hotspot_set_active("twelvetrees", false);
 		}
 		break;
@@ -273,13 +273,458 @@ void Room603::daemon() {
 }
 
 void Room603::pre_parser() {
-	// TODO
+	if (_G(flags)[V202] && !player_said("talk to", "twelvetrees"))
+		_G(flags)[V204] = 1;
+
+	if (_val6) {
+		Common::strcpy_s(_G(player).noun, "remove note");
+		_G(player).resetWalk();
+	}
+
+	if (player_said("take", "sleeve") && inv_object_is_here("SLEEVE")) {
+		auto &v203 = _G(flags)[V203];
+		if (v203 == 1 || v203 == 3 || v203 == 5 || v203 == 7)
+			_G(player).resetWalk();
+	}
 }
 
 void Room603::parser() {
+	bool lookFlag = player_said_any("look", "look at");
+	bool takeFlag = player_said("take");
+
+	if (player_said("conv603a")) {
+		conv603a();
+	} else if (player_said("conv603b")) {
+		conv603b();
+	} else if (_G(kernel).trigger == 747) {
+		if (_val8 != 20) {
+			unloadSeries();
+			_val9 = 1000;
+			_num1 = 11;
+			_val8 = 17;
+		}
+	} else if (_G(kernel).trigger == 748) {
+		if (_val8 == 21) {
+			disable_player_commands_and_fade_init(749);
+		} else {
+			unloadSeries();
+			_val9 = 1000;
+			_num1 = 11;
+			_val8 = 17;
+		}
+	} else if (_G(kernel).trigger == 749) {
+		digi_unload("603_S02");
+		digi_unload("603_S02a");
+		digi_unload("603_S02b");
+		digi_unload("603_S02c");
+		adv_kill_digi_between_rooms(false);
+		digi_play_loop("950_s28a", 3, 90);
+		_G(game).setRoom(608);
+		_G(flags)[V203] = 6;
+	} else if (player_said("talk to", "person it pit")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+		case 666:
+			player_set_commands_allowed(false);
+			player_update_info();
+			_G(player).disable_hyperwalk = true;
+			_G(flags)[V202] = 1;
+			setGlobals1(_ripHandsBehindBack, 1, 15, 15, 15);
+			sendWSMessage_110000(2);
+			break;
+		case 2:
+			sendWSMessage_150000(-1);
+			ws_hide_walker();
+			_ripley = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 311, 308, -59, 0x100, 0,
+				triggerMachineByHashCallbackNegative, "rip");
+			_G(kernel).trigger_mode = KT_DAEMON;
+			sendWSMessage_10000(1, _ripley, _rp01, 1, 15, 302, _rp01, 15, 15, 0);
+			sendWSMessage_1e0000(0, 0);
+			sendWSMessage_200000(_ripley, 100);
+			_G(kernel).trigger_mode = KT_PARSE;
+
+			_num2 = 0;
+			_num1 = 0;
+			_G(flags)[V203] = 1;
+			_val5 = 1;
+			hotspot_set_active("person in pit", false);
+			hotspot_set_active("twelvetrees", true);
+			hotspot_set_active("twelvetrees ", false);
+			break;
+		default:
+			break;
+		}
+	} else if (player_said_any("lighter", "lit lighter") &&
+			player_said_any("twelvetrees", "twelvetrees ")) {
+		digi_play("com140", 1, 255, -1, 997);
+	} else if (player_said("talk to", "twelvetrees")) {
+		player_set_commands_allowed(false);
+		ws_hide_walker();
+		_val2 = 1;
+		_ripley = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 345, 300, -56, 0x100, 1,
+			triggerMachineByHashCallbackNegative, "rip");
+		_shadow = series_show("safari shadow 2", 0xf00, 128, -1, -1, 0, 56, 345, 300);
+		_G(kernel).trigger_mode = KT_DAEMON;
+		sendWSMessage_10000(1, _ripley, _ripTalk, 1, 1, 300, _ripTalk, 1, 1, 0);
+		sendWSMessage_190000(_ripley, 4);
+		_G(kernel).trigger_mode = KT_PARSE;
+		_num2 = 0;
+		_num1 = 0;
+
+		conv_load("conv603a", 10, 10, 747);
+		conv_set_shading(65);
+		conv_export_value_curr(_G(flags)[V204], 0);
+		conv_export_value_curr(_G(flags)[V205], 1);
+		conv_play();
+	} else if (player_said("talk to", "twelvetrees ")) {
+		player_set_commands_allowed(false);
+		ws_hide_walker();
+		_val2 = 1;
+		_ripley = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 311, 308, -59, 0x100, 1,
+			triggerMachineByHashCallbackNegative, "rip");
+		_shadow = series_show("safari shadow 2", 0xf00, 128, -1, -1, 0, 59, 311, 308);
+		_G(kernel).trigger_mode = KT_DAEMON;
+
+		sendWSMessage_10000(1, _ripley, _ripTalk, 1, 1, 300, _ripTalk, 1, 1, 0);
+		sendWSMessage_190000(_ripley, 4);
+		_G(kernel).trigger_mode = KT_PARSE;
+		_num2 = 0;
+		_num1 = 0;
+		_val8 = 7;
+
+		if (_G(flags)[V203] <= 1) {
+			conv_load("conv603a", 10, 10, 747);
+			conv_export_value_curr(_G(flags)[V204], 0);
+			conv_export_value_curr(_G(flags)[V205], 1);
+			conv_play();
+		} else {
+			conv_load("conv603b", 10, 10, 748);
+
+			if (_G(flags)[V203] == 7) {
+				conv_export_value_curr(4, 0);
+			} else {
+				switch (_G(flags)[V186]) {
+				case 0:
+					conv_export_value_curr(1, 0);
+					break;
+				case 1:
+					conv_export_value_curr(2, 0);
+					break;
+				case 2:
+					conv_export_value_curr(3, 0);
+					break;
+				default:
+					break;
+				}
+			}
+
+			conv_export_value_curr(0, 1);
+			conv_export_value_curr(_G(flags)[V039], 6);
+			conv_play();
+		}
+	} else if (takeFlag && player_said("sleeve")) {
+		// TODO
+	} else if (lookFlag) {
+		// TODO
+	}
+	// TODO
+	else {
+		return;
+	}
+
+	_G(player).command_ready = false;
+}
+
+void Room603::conv603a() {
+	const char *sound = conv_sound_to_play();
+	int who = conv_whos_talking();
+	int node = conv_current_node();
+	int entry = conv_current_entry();
+
+	switch (_G(kernel).trigger) {
+	case 1:
+		if (who <= 0) {
+			if (node == 23) {
+				if (_val5) {
+					_pu01 = series_stream("603pu03", 5, 0, 30);
+					_val8 = 6;
+
+					if (_val5)
+						kernel_timing_trigger(1, _trigger1, KT_DAEMON, KT_PARSE);
+				} else {
+					_pu01 = series_stream("603pu03a", 5, 0, 30);
+					_val8 = 7;
+					kernel_timing_trigger(1, 500, KT_DAEMON, KT_PARSE);
+				}
+			} else if (_val5) {
+				if (node == 3 && (entry == 1 || entry == 2)) {
+					// No implementation
+				} else if ((node == 6 || node == 27) && entry == 0) {
+					_val8 = 12;
+					kernel_timing_trigger(1, 400, KT_DAEMON, KT_PARSE);
+					conv_resume();
+				} else if ((node == 3 && entry == 7) ||
+						(node == 3 && entry == 8)) {
+					// No implementation
+				} else if (node == 25 && entry == 3) {
+					_val8 = 20;
+					kernel_timing_trigger(1, 400, KT_DAEMON, KT_PARSE);
+					conv_resume();
+				} else if (node == 3 && entry == 4) {
+					_val8 = 16;
+					kernel_timing_trigger(1, 400, KT_DAEMON, KT_PARSE);
+					conv_resume();
+				} else if (node = 0 || node == 1 || node == 2) {
+					sendWSMessage_10000(1, _tt, _ttDigShirtOff, 43, 43, -1,
+						_ttDigShirtOff, 43, 43, 0);
+					conv_resume();
+				} else {
+					_val8 = 6;
+
+					if (_trigger1)
+						kernel_timing_trigger(1, _trigger1, KT_DAEMON, KT_PARSE);
+					conv_resume();
+				}
+			} else {
+				_val8 = (node == 25 && entry == 3) ? 20 : 7;
+				kernel_timing_trigger(1, 500, KT_DAEMON, KT_PARSE);
+				conv_resume();
+			}
+		} else if (who == 1) {
+			if (node == 3 && entry == 0) {
+				// No implementation
+			} else if (node == 0 || node == 1 || node == 2) {
+				_num1 = 14;
+				kernel_timing_trigger(1, 300, KT_DAEMON, KT_PARSE);
+				conv_resume();
+			} else if (node == 3 && entry == 6) {
+				// No implementation
+			} else if ((node == 5 && entry == 0) ||
+					(node == 25 && entry == 0) ||
+					(node == 14 && entry == 0) ||
+					(node == 27 && entry == 0) ||
+					(node == 11 && entry == 0) ||
+					(node == 4 && entry == 0) ||
+					(node == 4 && entry == 1) ||
+					(node == 7)) {
+				conv_resume();
+			} else if (node == 12 && entry == 1) {
+				_num1 = 0;
+				conv_resume();
+			} else if (_val2) {
+				if (_num1 == 5)
+					kernel_timing_trigger(1, 300, KT_DAEMON, KT_PARSE);
+				conv_resume();
+			} else {
+				conv_resume();
+			}
+		} else {
+			conv_resume();
+		}
+		break;
+
+	case 2:
+		series_stream_break_on_frame(_pu01, 16, 40);
+		digi_play(sound, 1);
+		break;
+
+	case 3:
+		ws_hide_walker();
+		series_play("603tt07", 0, 0, 4, 6);
+		break;
+
+	case 4:
+		terminateMachineAndNull(_door);
+		series_play("603DOOR", 0x300, 2, 6, 6, 0, 100, 0, 0, 1, 23);
+		series_play("603tt07", 0, 2, 5, 6, 1, 100, 0, 0, 0, 9);
+		break;
+
+	case 5:
+		ws_unhide_walker();
+		sendWSMessage_10000(_tt, 501, 236, 8, 7, 1);
+		break;
+
+	case 6:
+		_door = series_show("603DOOR", 0xf00, 16);
+		hotspot_set_active("wire", false);
+		digi_play("603_s03", 2);
+		break;
+
+	case 7:
+	case 33:
+		conv_resume();
+		break;
+
+	case 10:
+		kernel_timing_trigger(40, 11);
+		break;
+
+	case 11:
+		_pu01 = series_stream("603pu02", 5, 0, 12);
+		break;
+
+	case 12:
+		digi_unload("17_04n08");
+		digi_unload("17_04n99");
+		sendWSMessage_10000(_tt, 357, 283, 1, 13, 0);
+		kernel_timing_trigger(200, 15);
+		break;
+
+	case 13:
+		sendWSMessage_10000(_tt, 291, 293, 4, 14, 1);
+		break;
+
+	case 14:
+		conv_resume();
+		sendWSMessage_60000(_tt);
+		_ttShadow = series_show("tt walker shadow 4", 0xf00, 0, -1, -1, 0, 53, 291, 293);
+		_trigger1 = 400;
+		_tt = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x200, 0,
+			triggerMachineByHashCallbackNegative, "tt");
+		_G(kernel).trigger_mode = KT_DAEMON;
+		sendWSMessage_10000(1, _tt, _tt03, 110, 122, 400, _ttD01, 1, 1, 0);
+		_G(kernel).trigger_mode = KT_PARSE;
+		break;
+
+	case 15:
+		ws_walk(345, 300, nullptr, 16, 10);
+		break;
+
+	case 16:
+		ws_hide_walker();
+		_val2 = 1;
+		_ripley = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 345, 300, -56, 0x100, 1,
+			triggerMachineByHashCallbackNegative, "rip");
+		_shadow = series_show("safari shadow 2", 0xf00, 128, -1, -1, 0, 56, 345, 300);
+		_G(kernel).trigger_mode = KT_DAEMON;
+		sendWSMessage_10000(1, _ripley, _ripHandsBehindBack, 1, 15, 300,
+			_ripHandsBehindBack, 15, 15, 0);
+		sendWSMessage_190000(_ripley, 4);
+		_G(kernel).trigger_mode = KT_PARSE;
+		_num2 = 8;
+		_num1 = 8;
+		break;
+
+	case 20:
+		_num1 = 10;
+		break;
+
+	case 21:
+		_val8 = 14;
+		_G(kernel).trigger_mode = KT_DAEMON;
+		kernel_timing_trigger(1, _trigger1);
+		break;
+
+	case 22:
+		_val8 = 13;
+		_G(kernel).trigger_mode = KT_DAEMON;
+		kernel_timing_trigger(1, _trigger1);
+		break;
+
+	case 30:
+		kernel_timing_trigger(1, 31);
+		break;
+
+	case 31:
+		_pu01 = series_stream(_val5 ? "603pu04" : "603pu04a", 5, 0, 33);
+		break;
+
+	case 40:
+		conv_resume();
+		digi_play(sound, 1);
+		break;
+
+	default:
+		if (sound) {
+			if (who <= 0) {
+				if (!_val5) {
+					_val8 = 8;
+				} else if (node == 0 || node == 1 || node == 2) {
+					sendWSMessage_10000(1, _tt, _ttDigShirtOff, 41, 43, -1,
+						_ttDigShirtOff, 41, 43, 0);
+					sendWSMessage_190000(_tt, 13);
+					sendWSMessage_1a0000(_tt, 13);
+				} else if (node == 12 && entry == 1) {
+					_val8 = 8;
+					kernel_timing_trigger(200, 20);
+					kernel_timing_trigger(760, 21);
+				} else if (node == 12 && entry == 2) {
+					_val8 = 8;
+					kernel_timing_trigger(210, 22);
+				} else if (node == 11 && entry == 0) {
+					_val8 = 14;
+				} else if ((node == 27 && entry == 0) ||
+						(node == 6 && entry == 0)) {
+					_val8 = 11;
+				} else if (node == 3 && entry == 7) {
+					digi_preload("17_04n08");
+					digi_preload("17_04n99");
+					_pu01 = series_stream("603pu01", 5, 0, 10);
+					series_stream_break_on_frame(_pu01, 6, 2);
+				} else {
+					_val8 = 8;
+				}
+			} else if (who == 1) {
+				if (node == 3 && entry == 0) {
+					_num1 = 1;
+				} else if (node == 3 && entry == 6) {
+					sendWSMessage_10000(_tt, 501, 234, 1, 3, 1);
+				} else if ((node == 4 && entry == 0) || (node == 7)) {
+					_num1 = 8;
+				} else if (node == 0 || node == 1 || node == 2) {
+					_num1 = 13;
+				} else if (node == 6 && entry == 0) {
+					_num1 = 2;
+				} else if (node == 6 && entry == 1) {
+					_num1 = 6;
+				} else if (node == 15 && entry == 0) {
+					_num1 = 6;
+				} else if (node == 14 && entry == 0) {
+					_num1 = 8;
+				} else if (node == 27 && entry == 0) {
+					_num1 = 10;
+				} else if (node == 8 && entry == 0) {
+					_num1 = 9;
+				} else if ((node == 11 && entry == 0) ||
+						(node == 25 && entry == 0)) {
+					_num1 = 10;
+				} else if (node == 25 && entry == 2) {
+					_num1 = 7;
+				} else if ((node == 12 && entry == 1) ||
+						(node == 7 && entry == 0)) {
+					_num1 = 6;
+				} else if (node == 5 && entry == 0) {
+					_num1 = 10;
+				} else if (_val2) {
+					_num1 = 5;
+				}
+			}
+
+			digi_play(sound, 1);
+
+		} else {
+			conv_resume();
+		}
+		break;
+	}
+}
+
+void Room603::conv603b() {
 	// TODO
 }
 
+void Room603::unloadSeries() {
+	series_unload(200);
+	series_unload(201);
+	series_unload(202);
+	series_unload(203);
+	series_unload(204);
+	series_unload(210);
+	series_unload(211);
+	series_unload(212);
+	series_unload(214);
+}
+
 } // namespace Rooms
 } // namespace Riddle
 } // namespace M4
diff --git a/engines/m4/riddle/rooms/section6/room603.h b/engines/m4/riddle/rooms/section6/room603.h
index 486ee0ed7e9..f036f9bd330 100644
--- a/engines/m4/riddle/rooms/section6/room603.h
+++ b/engines/m4/riddle/rooms/section6/room603.h
@@ -30,7 +30,7 @@ namespace Rooms {
 
 class Room603 : public Room {
 private:
-	int _val1 = 0;
+	int _trigger1 = 0;
 	int _val2 = 0;
 	int _val3 = 0;
 	int _val4 = 0;
@@ -40,6 +40,8 @@ private:
 	int _val8 = 0;
 	int _val9 = 0;
 	int _val10 = 0;
+	int _num1 = 0;
+	int _num2 = 0;
 	machine *_shed = nullptr;
 	machine *_shenWalker = nullptr;
 	machine *_kuangWalker = nullptr;
@@ -50,6 +52,9 @@ private:
 	machine *_door = nullptr;
 	machine *_tt = nullptr;
 	machine *_ttShadow = nullptr;
+	machine *_pu01 = nullptr;
+	machine *_ripley = nullptr;
+	machine *_shadow = nullptr;
 	int _rp01 = 0;
 	int _rp02 = 0;
 	int _ttDigShirtOff = 0;
@@ -63,6 +68,10 @@ private:
 	int _ripHandChin = 0;
 	int _ripTwoHandTalk = 0;
 
+	void conv603a();
+	void conv603b();
+	void unloadSeries();
+
 public:
 	Room603() : Room() {}
 	~Room603() override {}




More information about the Scummvm-git-logs mailing list