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

dreammaster noreply at scummvm.org
Sun Jul 28 03:44:45 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:
cdaa16dea7 M4: RIDDLE: Added room 303 init


Commit: cdaa16dea7472dd5d6bf797ccc7360b7cf370e0e
    https://github.com/scummvm/scummvm/commit/cdaa16dea7472dd5d6bf797ccc7360b7cf370e0e
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-07-27T20:44:35-07:00

Commit Message:
M4: RIDDLE: Added room 303 init

Changed paths:
    engines/m4/adv_r/adv_walk.h
    engines/m4/riddle/rooms/room.cpp
    engines/m4/riddle/rooms/room.h
    engines/m4/riddle/rooms/section3/room303.cpp
    engines/m4/riddle/rooms/section3/room303.h


diff --git a/engines/m4/adv_r/adv_walk.h b/engines/m4/adv_r/adv_walk.h
index 69cb5960624..02c7fa55b5a 100644
--- a/engines/m4/adv_r/adv_walk.h
+++ b/engines/m4/adv_r/adv_walk.h
@@ -64,7 +64,7 @@ void ws_get_walker_info(machine *myWalker, int32 *x, int32 *y, int32 *s, int32 *
 bool ws_walk_init_system();
 
 bool ws_walk_load_series(const int16 *dir_array, const char *name_array[], bool shadow_flag, bool load_palette);
-bool ws_walk_load_walker_series(const int16 *dir_array, const char *name_array[], bool load_palette);
+bool ws_walk_load_walker_series(const int16 *dir_array, const char *name_array[], bool load_palette = false);
 bool ws_walk_load_shadow_series(const int16 *dir_array, const char *name_array[]);
 
 void ws_walk_dump_series(int16 num_directions, int16 start_hash);
diff --git a/engines/m4/riddle/rooms/room.cpp b/engines/m4/riddle/rooms/room.cpp
index fe4cacc2772..da2b53c57ca 100644
--- a/engines/m4/riddle/rooms/room.cpp
+++ b/engines/m4/riddle/rooms/room.cpp
@@ -53,6 +53,34 @@ void Room::triggerMachineByHashCallbackNegative(frac16 myMessage, machine *) {
 		kernel_trigger_dispatchx(hi);
 }
 
+void Room::triggerMachineByHashCallback3000(frac16 myMessage, machine *sender) {
+	int triggerType = _G(globals)[GLB_TEMP_1] >> 16;
+	int param = _G(globals)[GLB_TEMP_2] >> 16;
+	int msg = myMessage >> 16;
+
+	switch (triggerType) {
+	case 0:
+		break;
+
+	case 1:
+	case 3:
+		if (msg >= 0)
+			kernel_trigger_dispatchx(myMessage);
+		break;
+
+	case 2:
+		if (param)
+			sendWSMessage(0x30000, triggerType, sender, 0, nullptr, 1);
+		else if(msg >= 0)
+			kernel_trigger_dispatchx(myMessage);
+		break;
+
+	default:
+		error("spawn walker callback with triggerType = %d", triggerType);
+		break;
+	}
+}
+
 int Room::checkFlags(bool flag) {
 	int count = 0;
 
@@ -173,6 +201,22 @@ void Room::sendWSMessage_10000(int val1, machine *recv, int val2, int val3,
 	sendWSMessage(0x10000, 0, nullptr, 0, nullptr, 1);
 }
 
+machine *Room::triggerMachineByHash_3000(int val1, int val2, const int16 * normalDirs,
+		const int16 * shadowDirs, int val3, int val4, int val5,
+		MessageCB intrMsg, const char *machName) {
+#if 0
+	static const byte NUMS[14] = { 0, 0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 9, 0 };
+	byte  nums[14];
+	Common::copy(NUMS, NUMS + 14, nums);
+
+	_G(globals)[GLB_TEMP_1] = val2 << 16;
+	_G(globals)[GLB_TEMP_2] = val1 << 24;
+	_G(globals)[GLB_TEMP_3] = val3
+#else
+	error("sendWSMessage_3000");
+#endif
+}
+
 void Room::sendWSMessage_80000(machine *walker) {
 	sendWSMessage(0x80000, 0, walker, 0, nullptr, 1);
 }
diff --git a/engines/m4/riddle/rooms/room.h b/engines/m4/riddle/rooms/room.h
index 72d8be29bbd..66c20af3c93 100644
--- a/engines/m4/riddle/rooms/room.h
+++ b/engines/m4/riddle/rooms/room.h
@@ -37,6 +37,7 @@ protected:
 	static void intrMsgNull(frac16 myMessage, machine *sender) {}
 	static void triggerMachineByHashCallback(frac16 myMessage, machine *sender = nullptr);
 	static void triggerMachineByHashCallbackNegative(frac16 myMessage, machine *sender = nullptr);
+	static void triggerMachineByHashCallback3000(frac16 myMessage, machine *sender = nullptr);
 
 	void restoreAutosave();
 
@@ -53,13 +54,16 @@ protected:
 	 * Sets a bunch of globals. Sooooo many globals.
 	 */
 	void setGlobals1(int val1, int val2, int val3, int val4, int val5,
-		int val6, int val7 = 0, int val8 = 0, int val9 = 0, int val10 = 0,
+		int val6 = 0, int val7 = 0, int val8 = 0, int val9 = 0, int val10 = 0,
 		int val11 = 0, int val12 = 0, int val13 = 0, int val14 = 0, int val15 = 0,
 		int val16 = 0, int val17 = 0, int val18 = 0, int val19 = 0, int val20 = 0,
 		int val21 = 0);
 
 	void sendWSMessage_10000(int val1, machine *recv, int val2, int val3,
 		int val4, int trigger, int val9, int val6, int val7, int val8);
+	machine *triggerMachineByHash_3000(int val1, int val2, const int16 *normalDirs,
+		const int16 *shadowDirs, int val3, int val4, int val5,
+		MessageCB intrMsg, const char *machName);
 	void sendWSMessage_80000(machine *walker);
 	void sendWSMessage_C0000(machine *walker, int trigger);
 	void sendWSMessage_C0000(int trigger);
diff --git a/engines/m4/riddle/rooms/section3/room303.cpp b/engines/m4/riddle/rooms/section3/room303.cpp
index 792c0045f71..5bd61402499 100644
--- a/engines/m4/riddle/rooms/section3/room303.cpp
+++ b/engines/m4/riddle/rooms/section3/room303.cpp
@@ -22,6 +22,10 @@
 #include "m4/riddle/rooms/section3/room303.h"
 #include "m4/graphics/gr_series.h"
 #include "m4/riddle/vars.h"
+#include "m4/adv_r/adv_file.h"
+#include "m4/gui/gui_vmng.h"
+#include "m4/gui/gui_sys.h"
+#include "m4/platform/keys.h"
 
 namespace M4 {
 namespace Riddle {
@@ -51,6 +55,32 @@ void Room303::preload() {
 }
 
 void Room303::init() {
+	static const int16 NORMAL_DIRS[] = { 200, 201, 202, -1 };
+	static const char *NORMAL_NAMES[] = {
+		"Feng Li walk pos3",
+		"Feng Li walk pos4",
+		"Feng Li walk pos5"
+	};
+	static const int16 SHADOW_DIRS[] = { 210, 211, 212, -1 };
+	static const char *SHADOW_NAMES[] = {
+		"candleman shadow3",
+		"candleman shadow4",
+		"candleman shadow5"
+	};
+
+	static const int16 NORMAL_DIRS2[] = { 220, 221, 222, -1 };
+	static const char *NORMAL_NAMES2[] = {
+		"mei chen ny walker pos3",
+		"mei chen ny walker pos4",
+		"mei chen ny walker pos5"
+	};
+	static const int16 SHADOW_DIRS2[] = { 230, 231, 232, -1 };
+	static const char *SHADOW_NAMES2[] = {
+		"candleman shadow3",
+		"candleman shadow4",
+		"candleman shadow5"
+	};
+
 	_val1 = _val2 = 0;
 
 	if (_G(game).previous_room != KERNEL_RESTORING_GAME) {
@@ -73,10 +103,215 @@ void Room303::init() {
 		_door = series_show_sprite("DOOR", 0, 0xf05);
 	}
 
+	int32 status;
+	ScreenContext *game_buff_ptr = vmng_screen_find(_G(gameDrawBuff), &status);
+	assert(game_buff_ptr);
+
 	switch (_G(game).previous_room) {
+	case KERNEL_RESTORING_GAME:
+		if (!player_been_here(301)) {
+			kernel_load_variant(_val13 ? "303lock1" : "303lock2");
+			setFengActive(_val13);
+			loadHands();
+			setShadow4(true);
+
+			ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
+			ws_walk_load_shadow_series(SHADOW_DIRS, SHADOW_NAMES);
+			loadClasped();
+
+			if (_val13) {
+				_machine1 = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, 1,
+					triggerMachineByHashCallbackNegative, "fl");
+				setShadow5(true);
+			} else {
+				_machine1 = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 706, 256, 86, 0xc00, 0,
+					triggerMachineByHashCallbackNegative, "fl state machine");
+				setShadow5(false);
+			}
+
+			sendWSMessage_10000(1, _machine1, _clasped4, 1, 1, 400,
+				_clasped4, 1, 6, 0);
+			_val14 = _val15 = 1;
+		}
+
+		playSeries();
+		break;
+
 	case 301:
+		MoveScreenDelta(game_buff_ptr, -641, 0);
+		playSeries();
+
+		kernel_timing_trigger(1, 9);
+		break;
+
+	case 304:
+		if (_G(flags)[V001]) {
+			_G(player).disable_hyperwalk = true;
+			LoadWSAssets("303 FL SCRIPT");
+
+			_G(camera_reacts_to_player) = true;
+			MoveScreenDelta(game_buff_ptr, -110, 0);
+			_val12 = 2;
+
+			player_set_commands_allowed(false);
+			playSeries(false);
+
+			_door = series_show_sprite("DOOR", 7, 0xf05);
+			ws_demand_location(393, 260, 5);
+
+			ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
+			ws_walk_load_shadow_series(SHADOW_DIRS, SHADOW_NAMES);
+			_machine1 = triggerMachineByHash_3000(8, 2, NORMAL_DIRS, SHADOW_DIRS,
+				470, 226, 9, triggerMachineByHashCallback3000, "fl");
+			_val13 = 1;
+
+			kernel_load_variant("303lock1");
+			setFengActive(true);
+			loadClasped();
+
+			ws_walk_load_walker_series(NORMAL_DIRS2, NORMAL_NAMES2);
+			ws_walk_load_shadow_series(SHADOW_DIRS2, SHADOW_NAMES2);
+
+			_hands4 = triggerMachineByHash_3000(8, 3, NORMAL_DIRS2, SHADOW_DIRS2,
+				445, 215, 7, triggerMachineByHashCallback3000, "mc");
+			_gestTalk4 = series_load("mei ny lft hand gest talk pos4");
+			kernel_timing_trigger(1, 107);
+
+		} else {
+			player_set_commands_allowed(false);
+			kernel_timing_trigger(1, 10);
+			_door = series_show_sprite("DOOR", 7, 0xf05);
+
+			if (!player_been_here(301)) {
+				kernel_load_variant("303lock1");
+				setFengActive(true);
+				loadHands();
+				setShadow4(true);
+
+				ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
+				ws_walk_load_shadow_series(SHADOW_DIRS, SHADOW_NAMES);
+				loadClasped();
+
+				_machine1 = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, 1,
+					triggerMachineByHashCallbackNegative, "fl");
+				sendWSMessage_10000(1, _machine1, _clasped4, 1, 1, 400,
+					_clasped4, 1, 6, 0);
+
+				_val14 = _val15 = _val13 = 1;
+				setShadow5(true);
+			}
+
+			playSeries();
+		}
 		break;
+
+	case 305:
+		player_set_commands_allowed(false);
+		ws_demand_location(28, 267, 3);
+		playSeries();
+
+		if (!player_been_here(301)) {
+			kernel_timing_trigger(1, 6);
+			loadHands();
+			setShadow4(true);
+
+			ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
+			ws_walk_load_shadow_series(SHADOW_DIRS, SHADOW_NAMES);
+			loadClasped();
+
+			_machine1 = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, 1,
+				triggerMachineByHashCallbackNegative, "fl");
+			sendWSMessage_10000(1, _machine1, _clasped1, 1, 16, 400,
+				_clasped1, 1, 6, 0);
+			_val14 = _val15 = 1;
+			setShadow5(true);
+			_val13 = 1;
+
+			kernel_load_variant("303lock1");
+			setFengActive(true);
+		} else {
+			kernel_timing_trigger(1, 6);
+		}
+		break;
+
+	case 309:
+		interface_show();
+		ws_demand_location(230, 258, 10);
+		player_set_commands_allowed(false);
+
+		if (!player_been_here(301)) {
+			loadHands();
+			setShadow4(true);
+			ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
+			ws_walk_load_shadow_series(SHADOW_DIRS, SHADOW_NAMES);
+			_val13 = 1;
+			loadClasped();
+
+			_machine1 = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, 1,
+				triggerMachineByHashCallbackNegative, "fl");
+			sendWSMessage_10000(1, _machine1, _clasped4, 1, 16, 400,
+				_clasped4, 1, 6, 0);
+
+			_val14 = _val15 = 1;
+			setShadow5(true);
+			kernel_load_variant("303lock1");
+			setFengActive(true);
+		}
+
+		playSeries();
+
+		if (player_been_here(301)) {
+			_ripBends = series_load("rip trek bends to viewer");
+			setGlobals1(_ripBends, 17, 17, 17, 17, 1, 17, 1, 1, 1, 1);
+			sendWSMessage_110000(3);
+
+		} else {
+			_ripBends = series_load("RIP BENDS TO SEE CREATURE");
+			setGlobals1(_ripBends, 26, 1, 1, 1);
+		}
+		break;
+
+	case 352:
+		player_set_commands_allowed(false);
+		interface_hide();
+		digi_preload("303r02");
+		digi_preload("303m02");
+		digi_preload("303f01");
+
+		AddSystemHotkey(KEY_ESCAPE, escapePressed);
+		_G(kernel).call_daemon_every_loop = true;
+		digi_stop(3);
+
+		series_plain_play("303cow1", -1, 0, 100, 0, 9);
+		series_show_sprite("doorknob relocation", 0, 0xf04);
+		series_load("303 final frame");
+		_machine2 = series_stream("EVERYTHING IN 303", 5, 17, 21);
+		series_stream_break_on_frame(_machine2, 3, 18);
+
+		MoveScreenDelta(game_buff_ptr, -320, 0);
+		break;
+
 	default:
+		_val12 = 1;
+		kernel_load_variant("303lock1");
+		setFengActive(true);
+		ws_demand_location(145, 289, 3);
+		loadHands();
+		setShadow4(true);
+
+		ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
+		ws_walk_load_shadow_series(SHADOW_DIRS, SHADOW_NAMES);
+
+		_val13 = 1;
+		loadClasped();
+		_machine1 = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, 1,
+			triggerMachineByHashCallbackNegative, "fl");
+		sendWSMessage_10000(1, _machine1, _clasped4, 1, 1, 400,
+			_clasped4, 1, 6, 0);
+		_val14 = _val15 = 1;
+		setShadow5(true);
+
+		playSeries();
 		break;
 	}
 }
@@ -133,6 +368,17 @@ void Room303::setShadow5(bool active) {
 	}
 }
 
+void Room303::escapePressed(void *, void *) {
+	_G(kernel).trigger_mode = KT_DAEMON;
+	disable_player_commands_and_fade_init(56);
+}
+
+void Room303::playSeries(bool cow) {
+	series_plain_play("SPINNING TOMATO MAN", -1, 0, 100, 0, 7);
+	series_plain_play("PUFFBALL", -1, 0, 100, 0, 8);
+	series_plain_play("CREATURE FEATURE LONG VIEW", 1, 0, 100, 0xf05, 7, 70);
+}
+
 } // namespace Rooms
 } // namespace Riddle
 } // namespace M4
diff --git a/engines/m4/riddle/rooms/section3/room303.h b/engines/m4/riddle/rooms/section3/room303.h
index 30fc90aa4f0..e882e970da8 100644
--- a/engines/m4/riddle/rooms/section3/room303.h
+++ b/engines/m4/riddle/rooms/section3/room303.h
@@ -42,7 +42,7 @@ private:
 	int _val10 = 0;
 	int _val11 = 0;
 	int _val12 = 0;
-	int _val13 = 0;
+	bool _val13 = false;
 	int _val14 = 0;
 	int _val15 = 0;
 	KernelTriggerType _triggerMode1 = KT_DAEMON;
@@ -58,12 +58,19 @@ private:
 	int _clasped4 = 0;
 	machine *_shadow4 = nullptr;
 	machine *_shadow5 = nullptr;
+	machine *_machine1 = nullptr;
+	machine *_machine2 = nullptr;
+	int _gestTalk4 = 0;
+	int _ripBends = 0;
+
+	static void escapePressed(void *, void *);
 
 	void loadHands();
 	void loadClasped();
 	void setFengActive(bool flag);
 	void setShadow4(bool active);
 	void setShadow5(bool active);
+	void playSeries(bool cow = true);
 
 public:
 	Room303() : Room() {}




More information about the Scummvm-git-logs mailing list