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

dreammaster noreply at scummvm.org
Mon Sep 30 00:00:14 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:
c42f1481a3 M4: RIDDLE: Added room 610 parser


Commit: c42f1481a3f3e58a1ead62608880db29ab6cf138
    https://github.com/scummvm/scummvm/commit/c42f1481a3f3e58a1ead62608880db29ab6cf138
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-09-29T17:00:05-07:00

Commit Message:
M4: RIDDLE: Added room 610 parser

Changed paths:
    engines/m4/riddle/rooms/section4/room405.cpp
    engines/m4/riddle/rooms/section6/room610.cpp
    engines/m4/riddle/rooms/section6/room610.h


diff --git a/engines/m4/riddle/rooms/section4/room405.cpp b/engines/m4/riddle/rooms/section4/room405.cpp
index 822b4fff475..4bea6697508 100644
--- a/engines/m4/riddle/rooms/section4/room405.cpp
+++ b/engines/m4/riddle/rooms/section4/room405.cpp
@@ -148,7 +148,6 @@ void Room405::daemon() {
 	case 23:
 		sendWSMessage_10000(1, _baronWalker, _baronShakeSit, 48, 100, 24,
 			_baronShakeSit, 100, 100, 0);
-		break;
 		digi_play("405b01a", 1, 255, 25);
 		break;
 
diff --git a/engines/m4/riddle/rooms/section6/room610.cpp b/engines/m4/riddle/rooms/section6/room610.cpp
index 71a3c3aa4b0..a6adcf8b415 100644
--- a/engines/m4/riddle/rooms/section6/room610.cpp
+++ b/engines/m4/riddle/rooms/section6/room610.cpp
@@ -22,15 +22,339 @@
 #include "m4/riddle/rooms/section6/room610.h"
 #include "m4/graphics/gr_series.h"
 #include "m4/riddle/vars.h"
+#include "m4/adv_r/other.h"
 
 namespace M4 {
 namespace Riddle {
 namespace Rooms {
 
 void Room610::init() {
+	if (_G(game).previous_room != KERNEL_RESTORING_GAME) {
+		_val1 = 1;
+		_val2 = 1;
+		_val3 = 0;
+		_val4 = 1;
+		_val5 = 1;
+		_val6 = 0;
+	}
+
+	_val7 = 0;
+	_val8 = 0;
+	_G(kernel).call_daemon_every_loop = true;
+
+	digi_preload("610s01");
+	digi_preload("610_s02");
+	digi_preload("610_s02a");
+	digi_preload("610_s03");
+	digi_preload("610_s03a");
+	digi_preload("610_s03b");
+	digi_preload("610k07");
+	digi_preload("610k08");
+	digi_preload("610k09");
+	digi_preload("610k10");
+	digi_preload("610k11");
+	digi_preload("610k12");
+	digi_preload("610k13");
+
+	_ripPeerAroundHut = series_load("RIP PEERS AROUND THE HUT");
+	_rp04 = series_load("610RP04");
+	_k00 = series_load("610K00");
+	_k01 = series_load("610K01");
+	_sgSlapsTt1 = series_load("SG SLAPS TT");
+	_sgSlapsTt2 = series_load("SG SLAPS TT AGAIN");
+	_sgPullsGun = series_load("SG PULLS A GUN");
+
+	if (_G(flags)[GLB_TEMP_6]) {
+		hotspot_set_active("window", false);
+		series_show("610 shed window open", 0xf00, 16);
+	} else {
+		hotspot_set_active("window ", false);
+	}
+
+	_k = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0xa00, 0,
+		triggerMachineByHashCallback610, "k");
+	_sgTt = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0xb00, 0,
+		triggerMachineByHashCallback610, "sg and tt");
+
+	switch (_G(kernel).trigger) {
+	case KERNEL_RESTORING_GAME:
+		midi_play("tensions", 255, 1, -1, 949);
+
+		if (_flag1)
+			ws_demand_location(615, 364, 10);
+
+		setup();
+		kernel_timing_trigger(300, 135);
+		digi_preload("950_s28a");
+		break;
+
+	case 604:
+		digi_preload("950_s28a");
+		setup();
+		kernel_timing_trigger(300, 135);
+		ws_demand_location(472, 262, 3);
+		break;
+ 
+	default:
+		digi_preload("950_s28a");
+		digi_stop(3);
+		digi_unload("950_s28");
+
+		if (player_been_here(610)) {
+			setup();
+			player_set_commands_allowed(false);
+			ws_demand_location(665, 364, 9);
+			ws_walk(615, 364, nullptr, 1, 10);
+		} else {
+			sendWSMessage_10000(1, _k, _k00, 1, 50, -1, _k00, 50, 60, 4);
+			sendWSMessage_10000(1, _sgTt, _sgSlapsTt1, 1, 1, -1,
+				_sgSlapsTt1, 1, 1, 4);
+
+			player_set_commands_allowed(false);
+			ws_demand_location(665, 364, 9);
+			ws_walk(240, 272, nullptr, 10, 10);
+			kernel_timing_trigger(1, 100);
+		}
+		break;
+	}
+
+	_flag2 = true;
+	_flag1 = false;
+	digi_play_loop("950_s28a", 3, 110);
 }
 
 void Room610::daemon() {
+	// TODO
+}
+
+void Room610::pre_parser() {
+	bool lookFlag = player_said_any("look", "look at");
+
+	if (lookFlag && player_said_any("HUT", "PIT", "SAMANTHA", "KUANG", "SHEN GUO"))
+		_G(player).resetWalk();
+}
+
+void Room610::parser() {
+	bool lookFlag = player_said_any("look", "look at");
+	bool talkFlag = player_said_any("talk", "talk to");
+	bool useFlag = player_said_any("push", "pull", "gear", "open", "close");
+
+	if (talkFlag && player_said_any("KUANG", "SHEN GUO")) {
+		talkKuangShenGuo();
+	} else if (talkFlag && player_said("SAMANTHA")) {
+		talkSamantha();
+	} else if (useFlag && player_said("WHALE BONE HORN") && useHorn()) {
+		// No implementation
+	} else if (lookFlag && player_said("SAMANTHA")) {
+		digi_play("610r01", 1);
+	} else if (lookFlag && player_said("KUANG")) {
+		digi_play("610r02", 1);
+	} else if (lookFlag && player_said("SHEN GUO")) {
+		digi_play("610r03", 1);
+	} else if (lookFlag && player_said("HUT")) {
+		digi_play("610r04", 1);
+	} else if (lookFlag && player_said("PIT")) {
+		digi_play("610r05", 1);
+	} else if (lookFlag && player_said("SHED")) {
+		digi_play("610r06", 1);
+	} else if (lookFlag && player_said("WINDOW")) {
+		digi_play("610r07", 1);
+	} else if (lookFlag && player_said("WINDOW ")) {
+		digi_play("604r47", 1);
+	} else if (lookFlag && player_said("POWER LINE")) {
+		digi_play("610r08", 1);
+	} else if ((useFlag && player_said_any("WINDOW", "WINDOW ")) ||
+			player_said("enter")) {
+		useWindow();
+	} else if (_G(kernel).trigger == 555) {
+		midi_stop();
+
+		static const char *DIGI[] = {
+			"610_s02", "610_s02a", "610_s03", "610_s03a",
+			"610_s03b", "610k07", "610k08", "610k09",
+			"610k10", "610k11", "610k12", "610k13", nullptr
+		};
+		for (const char **name = DIGI; *name; ++name)
+			digi_unload(*name);
+
+		adv_kill_digi_between_rooms(false);
+		digi_play_loop("950_s28a", 3, 110);
+		_G(game).setRoom(605);
+	} else if (player_said("exit")) {
+		player_set_commands_allowed(false);
+		disable_player_commands_and_fade_init(-1);
+		midi_fade_volume(0, 120);
+		kernel_timing_trigger(120, 555);
+	} else {
+		return;
+	}
+
+	_G(player).command_ready = false;
+}
+
+void Room610::triggerMachineByHashCallback610(frac16 myMessage, machine *sender) {
+	int trigger = myMessage >> 16;
+
+	if (trigger >= 0)
+		kernel_trigger_dispatchx(trigger);
+}
+
+void Room610::setup() {
+	sendWSMessage_10000(1, _sgTt, _sgSlapsTt2, 1, 1, 200,
+		_sgSlapsTt2, 1, 1, 1);
+	sendWSMessage_10000(1, _k, _k00, 50, 50, 400, _k00, 50, 60, 4);
+	sendWSMessage_190000(_k, 11);
+	sendWSMessage_1a0000(_k, 11);
+	_val1 = 1;
+	_val2 = 0;
+	_val3 = 0;
+	_val4 = 0;
+	_val5 = 1;
+	_val6 = 0;
+}
+
+void Room610::talkKuangShenGuo() {
+	switch (_G(kernel).trigger) {
+	case -1:
+		_flag1 = true;
+		digi_stop(2);
+		player_set_commands_allowed(false);
+		_val5 = 2;
+		_val2 = 4;
+		digi_play("610r12", 1, 255, 1);
+		break;
+
+	case 1:
+		ws_hide_walker();
+		_spleen = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x100, 0,
+			triggerMachineByHashCallback610, "spleen");
+		sendWSMessage_10000(1, _spleen, _rp04, 1, 21, 2, _rp04, 21, 11, 4);
+		sendWSMessage_1a0000(_spleen, 50);
+		break;
+
+	case 2:
+		digi_play("610r13", 1, 255, 3);
+		break;
+
+	case 3:
+		disable_player_commands_and_fade_init(4);
+		interface_hide();
+		break;
+
+	case 4:
+		kernel_timing_trigger(30, 5);
+		break;
+
+	case 5:
+		digi_play("950_s14", 1, 255, 6);
+		break;
+
+	case 6:
+		other_save_game_for_resurrection();
+		_G(game).setRoom(413);
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Room610::talkSamantha() {
+	switch (_G(kernel).trigger) {
+	case -1:
+		_flag1 = true;
+		digi_stop(2);
+		player_set_commands_allowed(false);
+		_val5 = 2;
+		_val2 = 4;
+		digi_play("610r14", 1, 255, 1);
+		break;
+
+	case 1:
+		ws_hide_walker();
+		_spleen = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x100, 0,
+			triggerMachineByHashCallback610, "spleen");
+		sendWSMessage_10000(1, _spleen, _rp04, 1, 21, 2, _rp04, 21, 11, 4);
+		sendWSMessage_1a0000(_spleen, 50);
+		break;
+
+	case 2:
+		digi_play("610r15", 1, 255, 3);
+		break;
+
+	case 3:
+		disable_player_commands_and_fade_init(4);
+		interface_hide();
+		break;
+
+	case 4:
+		kernel_timing_trigger(30, 5);
+		break;
+
+	case 5:
+		digi_play("950_s14", 1, 255, 6);
+		break;
+
+	case 6:
+		other_save_game_for_resurrection();
+		_G(game).setRoom(413);
+		break;
+
+	default:
+		break;
+	}
+}
+
+bool Room610::useHorn() {
+	_flag1 = true;
+
+	if (_G(kernel).trigger == 5) {
+		_val5 = 2;
+		_val2 = 4;
+	}
+
+	// Original never exits parser even when this code is called
+	return false;
+}
+
+void Room610::useWindow() {
+	switch (_G(kernel).trigger) {
+	case -1:
+		player_set_commands_allowed(false);
+
+		if (_G(flags)[GLB_TEMP_6]) {
+			kernel_timing_trigger(1, 1);
+		} else {
+			ws_hide_walker();
+			_spleen = series_play("610rp02", 0, 0, 3, 5, 0, 100, 0, 0, 0, 32);
+		}
+		break;
+
+	case 1:
+		disable_player_commands_and_fade_init(2);
+		break;
+
+	case 2:
+		_G(game).setRoom(604);
+		break;
+
+	case 3:
+		_spleen = series_play("610rp02", 0, 0, 4, 5, 0, 100, 0, 0, 33, 64);
+		digi_play("610_s01", 2);
+		hotspot_set_active("window", false);
+		hotspot_set_active("window ", true);
+		_G(flags)[GLB_TEMP_6] = 1;
+		break;
+
+	case 4:
+		series_show("610 shed window open", 0xf00, 16);
+		ws_unhide_walker();
+		player_set_commands_allowed(true);
+		break;
+
+	default:
+		break;
+	}
 }
 
 } // namespace Rooms
diff --git a/engines/m4/riddle/rooms/section6/room610.h b/engines/m4/riddle/rooms/section6/room610.h
index 5c438ebf26b..63dbe5a75e5 100644
--- a/engines/m4/riddle/rooms/section6/room610.h
+++ b/engines/m4/riddle/rooms/section6/room610.h
@@ -29,12 +29,43 @@ namespace Riddle {
 namespace Rooms {
 
 class Room610 : public Room {
+private:
+	int _ripPeerAroundHut = 0;
+	int _rp04 = 0;
+	int _k00 = 0;
+	int _k01 = 0;
+	int _sgSlapsTt1 = 0;
+	int _sgSlapsTt2 = 0;
+	int _sgPullsGun = 0;
+	machine *_spleen = nullptr;
+	machine *_k = nullptr;
+	machine *_sgTt = nullptr;
+	int _val1 = 0;
+	int _val2 = 0;
+	int _val3 = 0;
+	int _val4 = 0;
+	int _val5 = 0;
+	int _val6 = 0;
+	int _val7 = 0;
+	int _val8 = 0;
+	bool _flag1 = false;
+	bool _flag2 = false;
+
+	static void triggerMachineByHashCallback610(frac16 myMessage, machine *sender);
+	void setup();
+	void talkKuangShenGuo();
+	void talkSamantha();
+	bool useHorn();
+	void useWindow();
+
 public:
 	Room610() : Room() {}
 	~Room610() override {}
 
 	void init() override;
 	void daemon() override;
+	void pre_parser() override;
+	void parser() override;
 };
 
 } // namespace Rooms




More information about the Scummvm-git-logs mailing list