[Scummvm-git-logs] scummvm master -> 7a074b407a83e811297b41b2762202489d00c0a5

dreammaster noreply at scummvm.org
Sat Aug 3 17:39:02 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:
7a074b407a M4: RIDDLE: In progress room 304 daemon


Commit: 7a074b407a83e811297b41b2762202489d00c0a5
    https://github.com/scummvm/scummvm/commit/7a074b407a83e811297b41b2762202489d00c0a5
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-08-03T10:38:56-07:00

Commit Message:
M4: RIDDLE: In progress room 304 daemon

Changed paths:
    engines/m4/adv_r/adv_hotspot.cpp
    engines/m4/adv_r/adv_hotspot.h
    engines/m4/graphics/gr_series.cpp
    engines/m4/graphics/gr_series.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/room304.cpp
    engines/m4/riddle/rooms/section3/room304.h
    engines/m4/riddle/rooms/section3/section3.cpp
    engines/m4/riddle/rooms/section3/section3.h


diff --git a/engines/m4/adv_r/adv_hotspot.cpp b/engines/m4/adv_r/adv_hotspot.cpp
index 3b4565fbc8c..0a8a62dc095 100644
--- a/engines/m4/adv_r/adv_hotspot.cpp
+++ b/engines/m4/adv_r/adv_hotspot.cpp
@@ -23,6 +23,7 @@
 #include "m4/core/cstring.h"
 #include "m4/core/errors.h"
 #include "m4/core/term.h"
+#include "m4/gui/gui_vmng.h"
 #include "m4/mem/mem.h"
 #include "m4/mem/memman.h"
 #include "m4/vars.h"
@@ -167,6 +168,30 @@ HotSpotRec *hotspot_add(HotSpotRec *head, HotSpotRec *h, bool new_head) {
 	return head;
 }
 
+HotSpotRec *hotspot_add_dynamic(const char *verb, const char *noun,
+		int32 x1, int32 y1, int32 x2, int32 y2, int32 cursor,
+		bool new_head, int32 walkto_x, int32 walkto_y, int32 facing) {
+	int32 status;
+	ScreenContext *sc = vmng_screen_find(_G(gameDrawBuff), &status);
+	y2 = MIN(y2, sc->y2);
+
+	HotSpotRec *hotspot = hotspot_new(x1, y1, x2, y2);
+	if (!hotspot)
+		error("hotspot_new failed");
+
+	hotspot_newVocab(hotspot, noun);
+	hotspot_newVocab(hotspot, verb);
+	hotspot->feet_x = walkto_x;
+	hotspot->feet_y = walkto_y;
+	hotspot->cursor_number = cursor;
+	hotspot->facing = facing;
+
+	_G(currentSceneDef).hotspots = hotspot_add(_G(currentSceneDef).hotspots,
+		hotspot, new_head);
+
+	return hotspot;
+}
+
 void kill_hotspot_node(HotSpotRec *h) {
 	if (!h)
 		return;
diff --git a/engines/m4/adv_r/adv_hotspot.h b/engines/m4/adv_r/adv_hotspot.h
index efd2dded7d4..cedbd2453e2 100644
--- a/engines/m4/adv_r/adv_hotspot.h
+++ b/engines/m4/adv_r/adv_hotspot.h
@@ -46,7 +46,7 @@ struct HotSpotRec {
 };
 
 HotSpotRec *hotspot_add_dynamic(
-	char *verb, char *noun,
+	const char *verb, const char *noun,
 	int32 x1, int32 y1, int32 x2, int32 y2,
 	int32 cursor,
 	bool new_head = true,
diff --git a/engines/m4/graphics/gr_series.cpp b/engines/m4/graphics/gr_series.cpp
index 5aa35f5ec6d..e9874b6f1d2 100644
--- a/engines/m4/graphics/gr_series.cpp
+++ b/engines/m4/graphics/gr_series.cpp
@@ -311,6 +311,18 @@ machine *series_ranged_play(const char *seriesName, int32 loopCount, uint32 flag
 		loopCount, s, 0, 0, firstFrame, lastFrame);
 }
 
+machine *series_ranged_play_xy(const char *seriesName, int loopCount, int flags,
+		int firstFrame, int lastFrame, int x, int y, int s, int layer,
+		int frameRate, int trigger, bool stick_when_done) {
+	if (loopCount == 1)
+		loopCount = 0;
+	if (stick_when_done)
+		flags |= 0x10;
+
+	return series_play(seriesName, layer, flags, trigger, frameRate,
+		loopCount, s, x, y, firstFrame, lastFrame);
+}
+
 machine *series_plain_play(const char *seriesName, int32 loopCount, uint32 flags,
 		int32 s, int32 layer, int32 frameRate, int32 trigger, bool stickWhenDone) {
 	if (stickWhenDone)
diff --git a/engines/m4/graphics/gr_series.h b/engines/m4/graphics/gr_series.h
index ecd0ffc37cf..0503bf2de9e 100644
--- a/engines/m4/graphics/gr_series.h
+++ b/engines/m4/graphics/gr_series.h
@@ -109,6 +109,9 @@ machine *series_show(const char *seriesName, frac16 layer, uint32 flags = 0,
 machine *series_ranged_play(const char *seriesName, int32 loopCount, uint32 flags,
 	int32 firstFrame, int32 lastFrame, int32 s, uint32 layer,
 	int32 frameRate, int32 trigger = -1, bool stick_when_done = false);
+machine *series_ranged_play_xy(const char *seriesName, int loopCount, int flags,
+	int firstFrame, int lastFrame, int x, int y, int s, int layer,
+	int frameRate, int 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,
diff --git a/engines/m4/riddle/rooms/room.cpp b/engines/m4/riddle/rooms/room.cpp
index f57b3770991..01dceb3a059 100644
--- a/engines/m4/riddle/rooms/room.cpp
+++ b/engines/m4/riddle/rooms/room.cpp
@@ -342,6 +342,19 @@ void Room::sendWSMessage_150000(int trigger) {
 	sendWSMessage_150000(_G(my_walker), trigger);
 }
 
+void Room::sendWSMessage_160000(machine *mach, int val1, int trigger) {
+	if (!trigger)
+		trigger = -1;
+
+	_G(globals)[V023] = kernel_trigger_create(trigger);
+	_G(globals)[V024] = val1 << 16;
+	sendWSMessage(0x160000, 0, mach, 0, nullptr, 1);
+}
+
+void Room::sendWSMessage_160000(int val1, int trigger) {
+	sendWSMessage_160000(_G(my_walker), val1, trigger);
+}
+
 void Room::sendWSMessage_190000(machine *recv, int trigger) {
 	_G(globals)[V023] = trigger << 16;
 	sendWSMessage(0x190000, 0, recv, 0, nullptr, 1);
diff --git a/engines/m4/riddle/rooms/room.h b/engines/m4/riddle/rooms/room.h
index 5374da226cb..1467b0cd776 100644
--- a/engines/m4/riddle/rooms/room.h
+++ b/engines/m4/riddle/rooms/room.h
@@ -88,11 +88,11 @@ protected:
 	void sendWSMessage_140000(int trigger);
 	void sendWSMessage_150000(machine *mach, int trigger);
 	void sendWSMessage_150000(int trigger);
+	void sendWSMessage_160000(machine *mach, int val1, int trigger);
+	void sendWSMessage_160000(int val1, int trigger);
 	void sendWSMessage_190000(machine *recv, int trigger);
 	void sendWSMessage_1a0000(machine *recv, int trigger);
 
-	int _roomVal1 = 0;		// TODO: deprecate
-
 public:
 	Room() : M4::Room() {}
 	~Room() override {}
diff --git a/engines/m4/riddle/rooms/section3/room303.cpp b/engines/m4/riddle/rooms/section3/room303.cpp
index 1f4949d569e..071cc3088b8 100644
--- a/engines/m4/riddle/rooms/section3/room303.cpp
+++ b/engines/m4/riddle/rooms/section3/room303.cpp
@@ -43,32 +43,6 @@ static const char *SAID[][2] = {
 	{ nullptr, nullptr }
 };
 
-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"
-};
-
 
 void Room303::preload() {
 	LoadWSAssets("OTHER SCRIPT");
@@ -128,8 +102,8 @@ void Room303::init() {
 			loadHands();
 			setShadow4(true);
 
-			ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
-			ws_walk_load_shadow_series(SHADOW_DIRS, SHADOW_NAMES);
+			ws_walk_load_walker_series(S3_NORMAL_DIRS, S3_NORMAL_NAMES);
+			ws_walk_load_shadow_series(S3_SHADOW_DIRS, S3_SHADOW_NAMES);
 			loadClasped();
 
 			if (_val13) {
@@ -172,9 +146,9 @@ void Room303::init() {
 			_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,
+			ws_walk_load_walker_series(S3_NORMAL_DIRS, S3_NORMAL_NAMES);
+			ws_walk_load_shadow_series(S3_SHADOW_DIRS, S3_SHADOW_NAMES);
+			_machine1 = triggerMachineByHash_3000(8, 2, S3_NORMAL_DIRS, S3_SHADOW_DIRS,
 				470, 226, 9, triggerMachineByHashCallback3000, "fl");
 			_val13 = 1;
 
@@ -182,10 +156,10 @@ void Room303::init() {
 			setFengActive(true);
 			loadClasped();
 
-			ws_walk_load_walker_series(NORMAL_DIRS2, NORMAL_NAMES2);
-			ws_walk_load_shadow_series(SHADOW_DIRS2, SHADOW_NAMES2);
+			ws_walk_load_walker_series(S3_NORMAL_DIRS2, S3_NORMAL_NAMES2);
+			ws_walk_load_shadow_series(S3_SHADOW_DIRS2, S3_SHADOW_NAMES2);
 
-			_hands4 = triggerMachineByHash_3000(8, 3, NORMAL_DIRS2, SHADOW_DIRS2,
+			_hands4 = triggerMachineByHash_3000(8, 3, S3_NORMAL_DIRS2, S3_SHADOW_DIRS2,
 				445, 215, 7, triggerMachineByHashCallback3000, "mc");
 			_gestTalk4 = series_load("mei ny lft hand gest talk pos4");
 			kernel_timing_trigger(1, 107);
@@ -201,8 +175,8 @@ void Room303::init() {
 				loadHands();
 				setShadow4(true);
 
-				ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
-				ws_walk_load_shadow_series(SHADOW_DIRS, SHADOW_NAMES);
+				ws_walk_load_walker_series(S3_NORMAL_DIRS, S3_NORMAL_NAMES);
+				ws_walk_load_shadow_series(S3_SHADOW_DIRS, S3_SHADOW_NAMES);
 				loadClasped();
 
 				_machine1 = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, 1,
@@ -228,8 +202,8 @@ void Room303::init() {
 			loadHands();
 			setShadow4(true);
 
-			ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
-			ws_walk_load_shadow_series(SHADOW_DIRS, SHADOW_NAMES);
+			ws_walk_load_walker_series(S3_NORMAL_DIRS, S3_NORMAL_NAMES);
+			ws_walk_load_shadow_series(S3_SHADOW_DIRS, S3_SHADOW_NAMES);
 			loadClasped();
 
 			_machine1 = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, 1,
@@ -255,8 +229,8 @@ void Room303::init() {
 		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);
+			ws_walk_load_walker_series(S3_NORMAL_DIRS, S3_NORMAL_NAMES);
+			ws_walk_load_shadow_series(S3_SHADOW_DIRS, S3_SHADOW_NAMES);
 			_val13 = 1;
 			loadClasped();
 
@@ -312,8 +286,8 @@ void Room303::init() {
 		loadHands();
 		setShadow4(true);
 
-		ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
-		ws_walk_load_shadow_series(SHADOW_DIRS, SHADOW_NAMES);
+		ws_walk_load_walker_series(S3_NORMAL_DIRS, S3_NORMAL_NAMES);
+		ws_walk_load_shadow_series(S3_SHADOW_DIRS, S3_SHADOW_NAMES);
 
 		_val13 = 1;
 		loadClasped();
@@ -1060,10 +1034,10 @@ void Room303::daemon() {
 				terminateMachineAndNull(_machine1);
 
 				if (_val13)
-					_machine1 = triggerMachineByHash_3000(8, 2, NORMAL_DIRS, SHADOW_DIRS,
+					_machine1 = triggerMachineByHash_3000(8, 2, S3_NORMAL_DIRS, S3_SHADOW_DIRS,
 						480, 256, 7, triggerMachineByHashCallback3000, "fl walker");
 				else
-					_machine1 = triggerMachineByHash_3000(8, 2, NORMAL_DIRS, SHADOW_DIRS,
+					_machine1 = triggerMachineByHash_3000(8, 2, S3_NORMAL_DIRS, S3_SHADOW_DIRS,
 						706, 256, 5, triggerMachineByHashCallback3000, "fl walker");
 
 				_G(kernel).trigger_mode = KT_PARSE;
diff --git a/engines/m4/riddle/rooms/section3/room304.cpp b/engines/m4/riddle/rooms/section3/room304.cpp
index 1d29a9e70a4..296e0885c37 100644
--- a/engines/m4/riddle/rooms/section3/room304.cpp
+++ b/engines/m4/riddle/rooms/section3/room304.cpp
@@ -35,7 +35,7 @@ void Room304::init() {
 	_val1 = 0;
 
 	if (_G(game).previous_room != KERNEL_RESTORING_GAME)
-		_roomVal1 = 0;
+		_flag1 = false;
 
 	if (_G(game).previous_room == 303 && _G(flags)[V001])
 		_G(game).previous_room = 354;
@@ -156,9 +156,9 @@ void Room304::pre_parser() {
 	bool takeFlag = player_said("take");
 	bool gearFlag = player_said("gear");
 
-	if (_roomVal1) {
+	if (_flag1) {
 		terminateMachineAndNull(_machine3);
-		_roomVal1 = 0;
+		_flag1 = false;
 		intr_cancel_sentence();
 		hotspot_restore_all();
 		interface_show();
@@ -188,7 +188,179 @@ void Room304::pre_parser() {
 }
 
 void Room304::parser() {
-	// TODO: parser
+	bool lookFlag = player_said_any("look", "look any");
+	bool takeFlag = player_said("take");
+	bool useFlag = player_said_any("push", "pull", "gear", "open", "close");
+
+	if (lookFlag && player_said("cartoon")) {
+		if (_G(flags)[V001]) {
+			digi_play("304r13", 1);
+
+		} else {
+			hotspot_hide_all();
+			interface_hide();
+			intr_cancel_sentence();
+			hotspot_add_dynamic("x", " ", 0, 0, 1500, 374, 0);
+
+			_flag1 = true;
+			_pu = series_show_sprite(_G(flags)[V000] ? "394pu99" : "304pu99", 0, 0);
+			digi_play("304r59", 1);
+		}
+	} else if (_G(kernel).trigger == 749) {
+		midi_stop();
+	} else if (_G(flags)[V001] && _val4) {
+		switch (_G(kernel).trigger) {
+		case 49:
+			ws_hide_walker();
+			_cobraKills = series_ranged_play("COBRA KILLS RIP AND LF",
+				1, 0, 1, 4, 100, 0x200, 5, 50);
+			break;
+		case 50:
+			_cobraKills = series_ranged_play("COBRA KILLS RIP AND LF",
+				1, 0, 5, 19, 100, 0x200, 5, 51);
+			digi_play("304_s07", 1);
+			break;
+		case 51:
+			_cobraKills = series_ranged_play("COBRA KILLS RIP AND LF",
+				1, 0, 20, 41, 100, 0x200, 5, 54);
+			digi_play("304_s07", 1);
+			break;
+		case 52:
+			_cobraKills = series_ranged_play("COBRA KILLS RIP AND LF",
+				1, 0, 51, 51, 100, 0x200, 3000, -1);
+			disable_player_commands_and_fade_init(-1);
+			midi_fade_volume(0, 120);
+			kernel_timing_trigger(120, 53);
+			break;
+		case 53:
+			_G(game).setRoom(413);
+			break;
+		case 54:
+			_cobraKills = series_ranged_play("COBRA KILLS RIP AND LF",
+				1, 0, 42, 51, 100, 0x200, 5, 52);
+			digi_play("304_s12", 2);
+			break;
+		default:
+			break;
+		}
+	} else if (0) {
+		parserSwitch();
+	
+	} else if (lookFlag && player_said_any("native mask", "shield")) {
+		digi_play("304r05", 1);
+	} else if (lookFlag && player_said("mailbag")) {
+		digi_play("304r15", 1);
+	} else if (lookFlag && player_said("picture")) {
+		digi_play("304r16", 1);
+	} else if (lookFlag && player_said("globe")) {
+		digi_play("304r18", 1);
+	} else if (lookFlag && player_said("vase")) {
+		digi_play("304r19", 1);
+	} else if (lookFlag && player_said_any("rug", "rug ")) {
+		digi_play("304r20", 1);
+	} else if (lookFlag && player_said("light switch")) {
+		digi_play("304r21", 1);
+	} else if (lookFlag && player_said("failing cabinet")) {
+		digi_play("304r29", 1);
+	} else if (takeFlag && player_said("flat file")) {
+		digi_play("304r30", 1);
+	} else if (takeFlag && player_said("cartoon")) {
+		digi_play("304r35", 1);
+	} else if (takeFlag && player_said("picture")) {
+		digi_play("304r36", 1);
+	} else if (useFlag && player_said("flat file")) {
+		digi_play(_G(flags)[V001] ? "304r46" : "304r76", 1);
+	} else if (useFlag && player_said("filing cabinet")) {
+		digi_play(_G(flags)[V001] ? "304r45" : "304r75", 1);
+	} else if (useFlag && player_said("trunk")) {
+		digi_play(_G(flags)[V001] ? "304r47" : "304r70", 1);
+	} else if (lookFlag && player_said("feng li")) {
+		digi_play("304r03", 1);
+	} else if (lookFlag && player_said("mei chen")) {
+		digi_play("304r04", 1);
+	} else if (lookFlag && player_said("beer stein") && _G(kernel).trigger == -1) {
+		digi_play("304r06", 1, 255, _G(flags)[V001] ? 1 : -1);
+	} else if (lookFlag && player_said("beer stein") && _G(kernel).trigger == 1) {
+		digi_play("304r07", 1);
+	} else if (lookFlag && player_said("desk")) {
+		digi_play(_G(flags)[V001] ? "304r08" : "304r56", 1);
+	} else if (lookFlag && player_said("filing cabinet")) {
+		digi_play(_G(flags)[V001] ? "304r09" : "304r57", 1);
+	} else if (lookFlag && player_said("flat file")) {
+		digi_play(_G(flags)[V001] ? "304r10" : "304r58", 1);
+	} else if (lookFlag && player_said("samurai sword")) {
+		digi_play("304r11", 1);
+	} else if (lookFlag && player_said("handling stick")) {
+		digi_play(_G(flags)[V001] ? "304r12" : "304r82", 1);
+	} else if (lookFlag && player_said("trunk")) {
+		if (_G(flags)[V001])
+			digi_play("304r14", 1);
+		else if (_G(flags)[V000] || _G(flags)[V084] == 1)
+			digi_play("304r61", 1);
+		else
+			digi_play("304r60", 1);
+	} else if (lookFlag && player_said("bookshelf")) {
+		digi_play(_G(flags)[V001] ? "304r17" : "304r62", 1);
+	} else if (player_said("exit")) {
+		if (_G(flags)[V001]) {
+			digi_play("304r01", 1);
+		} else {
+			switch (_G(kernel).trigger) {
+			case -1:
+				disable_player_commands_and_fade_init(1);
+				break;
+			case 1:
+				_G(game).setRoom(303);
+				break;
+			default:
+				break;
+			}
+		}
+	} else if (takeFlag && player_said("native mask")) {
+		digi_play(_G(flags)[V001] ? "304r25" : "304r66", 1);
+	} else if (takeFlag && player_said("shield")) {
+		digi_play(_G(flags)[V001] ? "304r26" : "304r67", 1);
+	} else if (takeFlag && player_said("samurai sword") && _G(flags)[V084] == 2) {
+		digi_play("304r64", 1);
+	} else if (takeFlag && player_said("handling stick") && _G(flags)[V084] == 1) {
+		digi_play("304r65", 1);
+	} else if (takeFlag && player_said("beer stein")) {
+		digi_play(_G(flags)[V001] ? "304r27" : "304r68", 1);
+	} else if (takeFlag && player_said("desk")) {
+		digi_play(_G(flags)[V001] ? "304r28" : "304r69", 1);
+	} else if (takeFlag && player_said("trunk")) {
+		digi_play(_G(flags)[V001] ? "304r31" : "304r70", 1);
+	} else if (takeFlag && player_said("mailbag")) {
+		digi_play("304r32", 1);
+	} else if (takeFlag && player_said("globe")) {
+		digi_play(_G(flags)[V001] ? "304r33" : "304r71", 1);
+	} else if (takeFlag && player_said("vase")) {
+		digi_play(_G(flags)[V001] ? "304r34" : "304r72", 1);
+	} else if (takeFlag && player_said("bookshelf")) {
+		digi_play(_G(flags)[V001] ? "304r37" : "304r37a", 1);
+	} else if (takeFlag && player_said("rug")) {
+		digi_play("304r73", 1);
+	} else if (takeFlag && player_said("rug ")) {
+		digi_play("304r38", 1);
+	} else if (useFlag && player_said("cartoon") && _G(player).click_x > 534) {
+		digi_play(_G(flags)[V001] ? "304r13" : "304r77", 1);
+	} else if (takeFlag && _G(player).click_y <= 374 && _G(flags)[V001]) {
+		switch (imath_ranged_rand(1, 3)) {
+		case 1:
+			digi_play("304r39", 1);
+			break;
+		case 2:
+			digi_play("304r40", 1);
+			break;
+		case 3:
+			digi_play("304r41", 1);
+			break;
+		default:
+			break;
+		}
+	} else {
+		return;
+	}
 }
 
 void Room304::intrMsg(frac16 myMessage, struct machine *sender) {
@@ -246,6 +418,256 @@ void Room304::intrMsg(frac16 myMessage, struct machine *sender) {
 	}
 }
 
+void Room304::parserSwitch() {
+	switch (_G(kernel).trigger) {
+	case 13:
+		series_stream_break_on_frame(_field64, 29, 14);
+		digi_play("304_s03", 1);
+		break;
+	case 14:
+		series_stream_break_on_frame(_field64, 106, 15);
+		digi_play("304_s08", 1);
+		break;
+	case 15:
+		series_stream_break_on_frame(_field64, 111, 16);
+		digi_play("304_s02", 1);
+		break;
+	case 16:
+		series_stream_break_on_frame(_field64, 145, 19);
+		midi_stop();
+		digi_play("304_s11", 1);
+		break;
+	case 17:
+		if (_G(flags)[V084] == 1) {
+			digi_unload("304_s10");
+			digi_unload("304_s05");
+			series_show_sprite("one frame dead snake", 0, 0x100);
+		} else if (_G(flags)[V084] == 2) {
+			digi_unload("304_s03");
+			digi_unload("304_s08");
+			digi_unload("304_s02");
+			digi_unload("304_s11");
+		}
+
+		terminateMachineAndNull(_machine1);
+		series_unload(_mei1);
+		series_unload(_mei2);
+
+		ws_unhide_walker();
+		player_update_info();
+		ws_demand_location(_G(player_info).x + 28,
+			_G(player_info).y + 9);
+
+		ws_walk_load_walker_series(S3_NORMAL_DIRS2, S3_NORMAL_NAMES2);
+		ws_walk_load_shadow_series(S3_SHADOW_DIRS2, S3_SHADOW_NAMES2);
+
+		_headUp1 = series_load("fl returns to head up");
+		_headUp2 = series_ranged_play("fl returns to head up",
+			1, 0, 0, 0, 100, 0x100, 250, 31);
+		_machine1 = triggerMachineByHash_3000(8, 3, S3_NORMAL_DIRS2, S3_SHADOW_DIRS2,
+			464, 283, 8, triggerMachineByHashCallback3000, "mc");
+		ws_demand_facing(8);
+		kernel_timing_trigger(1, 74);
+		break;
+
+	case 18:
+		sendWSMessage_10000(_machine1, 73, 275, 3, 20, 0);
+		break;
+
+	case 19:
+		digi_play("com125", 1);
+		break;
+
+	case 20:
+		sendWSMessage_10000(_machine1, 29, 295, 3, 21, 1);
+		break;
+
+	case 21:
+		series_unload(_suit1);
+		terminateMachineAndNull(_headUp2);
+		series_unload(_headUp1);
+
+		_headUp1 = series_load("lf talk 1");
+		ws_hide_walker(_machine1);
+		series_unload(221);
+		series_unload(222);
+
+		_suit1 = series_load("suit chin in hand pos3");
+		_suit2 = series_load("mc hands out talk pos3");
+		_suit3 = series_load("MC UNTIES LF");
+
+		series_ranged_play("MC UNTIES LF", 1, 0, 1, 21, 100, 0xa05, 5, 222);
+		break;
+
+	case 22:
+		ws_unhide_walker(_machine1);
+		setGlobals1(_suit1, 1, 15, 15, 15, 1, 16, 19, 20, 23, 1);
+		sendWSMessage_110000(-1);
+
+		_headUp2 = series_ranged_play("MC UNTIES LF", -1, 0, 82, 82, 100, 0x200, 250);
+		setGlobals3(_suit2, 1, 24);
+		sendWSMessage_F0000(_machine1, 23);
+		digi_play("304m04", 1);
+		break;
+
+	case 23:
+		terminateMachineAndNull(_headUp2);
+		series_unload(_suit2);
+		series_ranged_play("MC UNITES LF", 1, 1, 83, 98, 100, 0xf05, 7, 25);
+		digi_play("304f02", 1);
+		break;
+
+	case 25:
+		series_unload(_suit3);
+		_headUp2 = series_ranged_play("MC UNTIES LF", -1, 0, 98, 98, 100, 0x200, 250);
+		kernel_timing_trigger(20, 26);
+		break;
+
+	case 26:
+		digi_play("304r48", 1, 255, 27);
+		sendWSMessage_120000(-1);
+		break;
+
+	case 27:
+		terminateMachineAndNull(_headUp2);
+		sendWSMessage_110000(28);
+		_headUp2 = series_ranged_play("lf talk 2", 1, 1, 5, 10, 100, 0x100, 6, 33);
+		digi_play("304f03", 1);
+		break;
+
+	case 28:
+		sendWSMessage_140000(29);
+		break;
+
+	case 29:
+		series_unload(_suit1);
+		_suit1 = series_load("rip suit arms x point pos3");
+		setGlobals1(_suit1, 1, 13, 14, 14, 1, 14, 14, 14, 19, 1,
+			14, 44, 44, 44, 1, 0, 0, 0, 0, 0);
+		sendWSMessage_110000(34);
+		digi_play("304r49", 1, 255, 35);
+		break;
+
+	case 31:
+		terminateMachineAndNull(_headUp2);
+		series_ranged_play("fl returns to head up", 1, 0, 1, 6, 100, 0x100, 7, 32);
+		break;
+
+	case 32:
+		_headUp2 = series_ranged_play("fl returns to head up", -1, 0, 6, 6, 100, 0x100, 300);
+		break;
+
+	case 33:
+		_headUp2 = series_ranged_play("fl talk 1", -1, 0, 0, 0, 100, 0x200, 250);
+		break;
+
+	case 34:
+		sendWSMessage_120000(-1);
+		break;
+
+	case 35:
+		sendWSMessage_110000(36);
+		break;
+
+	case 36:
+		terminateMachineAndNull(_headUp2);
+		_headUp2 = series_ranged_play("lf talk 1", 1, 1, 0, 14, 100, 0xa00, 6, 37);
+		digi_play("304f04", 1, 255);
+		break;
+
+	case 37:
+		_headUp2 = series_ranged_play("lf talk 1", -1, 0, 0, 0, 100, 0x200, 250);
+		_suit3 = series_load("mc stand and talk pos3");
+		setGlobals1(_suit3, 1, 1, 1, 8, 1);
+		sendWSMessage_110000(_machine1, 38);
+		digi_play("304m05", 1, 255, 38);
+		break;
+
+	case 38:
+		if (_ctr1 >= 1) {
+			_ctr1 = 0;
+			sendWSMessage_140000(_machine1, 39);
+		} else {
+			++_ctr1;
+		}
+		break;
+
+	case 39:
+		series_unload(_suit3);
+		sendWSMessage_160000(3, 44);
+		kernel_timing_trigger(30, 67);
+		break;
+
+	case 40:
+		series_unload(_suit1);
+		_safe1 = series_load("rip opens safe part 1");
+		_safe2 = series_load("rip opens safe part 2");
+		ws_walk(510, 300, 0, 43, 3);
+		digi_preload("304r51");
+		digi_play("304r51", 1, 255, 79);
+		break;
+
+	case 43:
+		player_update_info();
+		ws_hide_walker();
+		digi_preload("304_s04");
+		digi_preload("304f05");
+		digi_preload("304r52");
+		series_plain_play("rip opens safe part 1", 1, 0, 100, 0, 5, 45);
+		break;
+
+	case 44:
+		sendWSMessage_150000(40);
+		break;
+
+	case 45:
+		series_plain_play("rip opens safe part 2", 1, 0, 100, 0, 5, 46);
+		digi_play("304_s01", 2);
+		break;
+
+	case 46:
+		_safe3 = series_stream("RIP OPENS SAFE PART 3", 5, 0, 49);
+		series_stream_break_on_frame(_safe3, 44, 53);
+		digi_play("304_s04", 2);
+		break;
+
+	case 47:
+		terminateMachineAndNull(_headUp2);
+		_headUp2 = series_ranged_play("lf talk 1", 1, 1, 0, 4, 100, 0xa00, 6, 48);
+		digi_play("304f05", 1, 255, 54);
+		break;
+
+	case 48:
+		_headUp2 = series_ranged_play("lf talk 1", -1, 0, 0, 0, 100, 0x200, 250);
+		break;
+
+	case 49:
+		ws_unhide_walker();
+		series_unload(_safe1);
+		series_unload(_safe2);
+		_safe1 = series_load("one frame safe open");
+		series_show_sprite("one frame safe open", 0, 0xa00);
+		_suit3 = series_load("mc hand to chin pos3");
+		ws_walk(260, 279, nullptr, 80, 8);
+		break;
+
+	case 51:
+		digi_unload("304_s04");
+		digi_unload("304_f05");
+		digi_unload("304r52");
+		sendWSMessage_140000(-1);
+		ws_hide_walker();
+
+		_field60 = series_ranged_play_xy("mc hand to chin pos3",
+			1, 0, 0, 17, 29, 295, 100, 0x100, 9);
+		digi_play("304m06", 1, 255, 55);
+		break;
+		// TODO
+	default:
+		break;
+	}
+}
+
 } // namespace Rooms
 } // namespace Riddle
 } // namespace M4
diff --git a/engines/m4/riddle/rooms/section3/room304.h b/engines/m4/riddle/rooms/section3/room304.h
index 8a326d30c01..3e287a3c41d 100644
--- a/engines/m4/riddle/rooms/section3/room304.h
+++ b/engines/m4/riddle/rooms/section3/room304.h
@@ -30,6 +30,7 @@ namespace Rooms {
 
 class Room304 : public Room {
 private:
+	bool _flag1 = false;
 	int _val1 = 0;
 	int _val2 = 0;
 	int _val3 = 0;
@@ -42,13 +43,28 @@ private:
 	machine *_machine1 = nullptr;
 	machine *_machine2 = nullptr;
 	machine *_machine3 = nullptr;
+	machine *_pu = nullptr;
+	machine *_cobraKills = nullptr;
+	machine *_field64 = nullptr;
+	machine *_field60 = nullptr;
 	int _cutSnake = -1;
 	int _mei1 = -1;
 	int _mei2 = -1;
 	int _mei3 = -1;
 	int _cobra = -1;
+	int _headUp1 = -1;
+	machine *_headUp2 = nullptr;
+	int _suit1 = 0;
+	int _suit2 = 0;
+	int _suit3 = 0;
+	int _safe1 = 0;
+	int _safe2 = 0;
+	machine *_safe3 = nullptr;
+
+	int _ctr1 = 0;
 
 	static void intrMsg(frac16 myMessage, struct machine *sender);
+	void parserSwitch();
 
 public:
 	Room304() : Room() {}
diff --git a/engines/m4/riddle/rooms/section3/section3.cpp b/engines/m4/riddle/rooms/section3/section3.cpp
index 5b82befb699..4e593748c3f 100644
--- a/engines/m4/riddle/rooms/section3/section3.cpp
+++ b/engines/m4/riddle/rooms/section3/section3.cpp
@@ -26,6 +26,33 @@ namespace M4 {
 namespace Riddle {
 namespace Rooms {
 
+const int16 S3_NORMAL_DIRS[] = { 200, 201, 202, -1 };
+const char *S3_NORMAL_NAMES[] = {
+	"Feng Li walk pos3",
+	"Feng Li walk pos4",
+	"Feng Li walk pos5"
+};
+const int16 S3_SHADOW_DIRS[] = { 210, 211, 212, -1 };
+const char *S3_SHADOW_NAMES[] = {
+	"candleman shadow3",
+	"candleman shadow4",
+	"candleman shadow5"
+};
+
+const int16 S3_NORMAL_DIRS2[] = { 220, 221, 222, -1 };
+const char *S3_NORMAL_NAMES2[] = {
+	"mei chen ny walker pos3",
+	"mei chen ny walker pos4",
+	"mei chen ny walker pos5"
+};
+const int16 S3_SHADOW_DIRS2[] = { 230, 231, 232, -1 };
+const char *S3_SHADOW_NAMES2[] = {
+	"candleman shadow3",
+	"candleman shadow4",
+	"candleman shadow5"
+};
+
+
 Section3::Section3() : Rooms::Section() {
 	add(301, &_room301);
 	add(303, &_room303);
diff --git a/engines/m4/riddle/rooms/section3/section3.h b/engines/m4/riddle/rooms/section3/section3.h
index 8eae84ec8d7..c003c6cc9cb 100644
--- a/engines/m4/riddle/rooms/section3/section3.h
+++ b/engines/m4/riddle/rooms/section3/section3.h
@@ -35,6 +35,16 @@ namespace M4 {
 namespace Riddle {
 namespace Rooms {
 
+extern const int16 S3_NORMAL_DIRS[];
+extern const char *S3_NORMAL_NAMES[];
+extern const int16 S3_SHADOW_DIRS[];
+extern const char *S3_SHADOW_NAMES[];
+extern const int16 S3_NORMAL_DIRS2[];
+extern const char *S3_NORMAL_NAMES2[];
+extern const int16 S3_SHADOW_DIRS2[];
+extern const char *S3_SHADOW_NAMES2[];
+
+
 class Section3 : public Section {
 private:
 	Room301 _room301;




More information about the Scummvm-git-logs mailing list