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

dreammaster noreply at scummvm.org
Wed Aug 14 05:37:45 UTC 2024


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
134d2bd392 M4: RIDDLE: More room 403 parser, fix ripley_said calls in prior rooms
bca8ed45cc M4: RIDDLE: Finished room 403 parser and supporting methods


Commit: 134d2bd3920965f89e97ff915d482e58a652b32a
    https://github.com/scummvm/scummvm/commit/134d2bd3920965f89e97ff915d482e58a652b32a
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-08-13T22:37:37-07:00

Commit Message:
M4: RIDDLE: More room 403 parser, fix ripley_said calls in prior rooms

Changed paths:
    engines/m4/riddle/rooms/section3/room303.cpp
    engines/m4/riddle/rooms/section4/room401.cpp
    engines/m4/riddle/rooms/section4/room402.cpp
    engines/m4/riddle/rooms/section4/room403.cpp
    engines/m4/riddle/walker.cpp
    engines/m4/riddle/walker.h


diff --git a/engines/m4/riddle/rooms/section3/room303.cpp b/engines/m4/riddle/rooms/section3/room303.cpp
index 071cc3088b8..43527637fc3 100644
--- a/engines/m4/riddle/rooms/section3/room303.cpp
+++ b/engines/m4/riddle/rooms/section3/room303.cpp
@@ -34,7 +34,7 @@ namespace M4 {
 namespace Riddle {
 namespace Rooms {
 
-static const char *SAID[][2] = {
+static const char *const SAID[][2] = {
 	{ "IRON MAIDEN",     "303R29" },
 	{ "MUMMY WITH HAIR", "303R30" },
 	{ "MAN WITH HAMMER", "303R33" },
diff --git a/engines/m4/riddle/rooms/section4/room401.cpp b/engines/m4/riddle/rooms/section4/room401.cpp
index 832185ef444..6231c287595 100644
--- a/engines/m4/riddle/rooms/section4/room401.cpp
+++ b/engines/m4/riddle/rooms/section4/room401.cpp
@@ -27,6 +27,23 @@ namespace M4 {
 namespace Riddle {
 namespace Rooms {
 
+static const char *const SAID[][2] = {
+	{ "POSTCARD RACK", "401R08" },
+	{ "POSTER",        "COM002" },
+	{ "WINDOW",        "401R10" },
+	{ "MAGAZINE",      "COM003" },
+	{ "RAILING",       "401R22" },
+	{ "DESK",          "401R23" },
+	{ "FAN",           "401R24" },
+	{ "BUSH",          "401R25" },
+	{ "AGENT",         "401R12" },
+	{ "CHAIR",         "COM023" },
+	{ "SOFA",          "COM023" },
+	{ "TELEPHONE",     "COM024" },
+	{ "COAT",          "401R41" },
+	{ nullptr, nullptr }
+};
+
 void Room401::preload() {
 	_G(player).walker_type = 1;
 	_G(player).shadow_type = 1;
@@ -892,7 +909,7 @@ void Room401::parser() {
 				break;
 			}
 		}
-	} else if (lookFlag && player_said("POSTCARD RACK")) {
+	} else if (lookFlag && _G(walker).ripley_said(SAID)) {
 		// No implementation
 	} else if (useFlag && player_said_any("SOFA", "CHAIR")) {
 		digi_play("COM025", 1, 255, -1, 997);
diff --git a/engines/m4/riddle/rooms/section4/room402.cpp b/engines/m4/riddle/rooms/section4/room402.cpp
index be60f1dc63c..cb30abb5984 100644
--- a/engines/m4/riddle/rooms/section4/room402.cpp
+++ b/engines/m4/riddle/rooms/section4/room402.cpp
@@ -28,6 +28,16 @@ namespace M4 {
 namespace Riddle {
 namespace Rooms {
 
+static const char *const SAID[][2] = {
+	{ "CASTLE",      "402r09" },
+	{ "CASTLE DOOR", "402r09" },
+	{ "FLOWERBED",   "402r10" },
+	{ "WINDOW",      "402r11" },
+	{ "GATE",        "402r14" },
+	{ "WHEELBARROW", "402r15" },
+	{ nullptr, nullptr }
+};
+
 void Room402::preload() {
 	_G(player).walker_type = 1;
 	_G(player).shadow_type = 1;
@@ -1486,7 +1496,7 @@ void Room402::parser() {
 		_G(kernel).trigger_mode = KT_PARSE;
 	} else if (lookFlag && player_said("WOLF")) {
 		digi_play(_G(flags)[V111] ? "402r13" : "402r12", 1);
-	} else if (lookFlag && player_said("CASTLE")) {
+	} else if (lookFlag && _G(walker).ripley_said(SAID)) {
 		// No implementation
 	} else if (lookFlag && player_said_any("TOPIARY", "TOPIARY ")) {
 		digi_play("408r02", 1);
diff --git a/engines/m4/riddle/rooms/section4/room403.cpp b/engines/m4/riddle/rooms/section4/room403.cpp
index 79946bb68a9..771f23a5093 100644
--- a/engines/m4/riddle/rooms/section4/room403.cpp
+++ b/engines/m4/riddle/rooms/section4/room403.cpp
@@ -29,6 +29,27 @@ namespace M4 {
 namespace Riddle {
 namespace Rooms {
 
+static const char *const SAID[][2] = {
+	{ "BROKEN HEADSTONE",    "403r11" },
+	{ "POMMEE CROSS",        "403r12" },
+	{  "GRAVE PLAQUE",       "403r13" },
+	{ "GRAVE",               "403r18" },
+	{ "1ST MARBLE MONUMENT", "403r15" },
+	{ "2ND MARBLE MONUMENT", "403r26" },
+	{ "MARBLE COLUMN",       "403r16" },
+	{ "SMALL HEADSTONE",     "403r17" },
+	{ "MARBLE HEADSTONE",    "403r27" },
+	{ "TOMBSTONE",           "403r19" },
+	{ "BURIAL TABLET",       "403r20" },
+	{ "SMALL GRAVE MARKER",  "403r14" },
+	{ "TALL HEADSTONE",      "403r22" },
+	{ "GRANITE HEADSTONE",   "403r23" },
+	{ "BURIAL PLAQUE",       "403r24" },
+	{ "CELTIC CROSS",        "403r25" },
+	{ "URN",                 "403r08" },
+	{ nullptr, nullptr }
+};
+
 void Room403::preload() {
 	_G(player).walker_type = 1;
 	_G(player).shadow_type = 1;
@@ -422,7 +443,6 @@ void Room403::pre_parser() {
 		_G(player).waiting_for_walk = false;
 	}
 }
-#undef TRIGGER
 
 void Room403::parser() {
 	bool lookFlag = player_said_any("look", "look at");
@@ -437,6 +457,69 @@ void Room403::parser() {
 		} else {
 			conv403a();
 		}
+	} else if (talkFlag && player_said("WOLF")) {
+		player_set_commands_allowed(false);
+		_val4 = -1;
+		_val6 = 1000;
+		_val7 = 1100;
+		TRIGGER;
+	} else if (enterFlag && player_said("CASTLE")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+			disable_player_commands_and_fade_init(1);
+			break;
+		case 1:
+			midi_stop();
+			digi_stop(3);
+			_G(game).setRoom(408);
+			break;
+		default:
+			break;
+		}
+	} else if (lookFlag && player_said("grate")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+
+			if (_G(flags)[V123]) {
+				digi_play("403R06", 1, 255, 2);
+			} else {
+				digi_play("403R06", 1, 255, 1);
+				_G(flags)[V123] = 1;
+			}
+			break;
+		case 1:
+			digi_play("403R06A", 1, 255, 2);
+			break;
+		case 2:
+			player_set_commands_allowed(true);
+			break;
+		default:
+			break;
+		}
+	} else if (lookFlag && player_said("WOLF")) {
+		digi_play(_G(flags)[V111] > 0 ? "402R13" : "402R12", 1);
+	} else if (lookFlag && player_said("wall")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+			digi_play("403r09", 1, 255, 1);
+			break;
+		case 1:
+			player_set_commands_allowed(true);
+			digi_play("403r09a", 1);
+			break;
+
+		}
+	} else if (lookFlag && player_said_any("tomb", "door")) {
+		digi_play("403r05", 1);
+		_G(flags)[V121] = 1;
+	} else if (lookFlag && player_said("bell")) {
+		digi_play("403r07", 1);
+		_G(flags)[V122] = 1;
+	} else if (lookFlag && _G(walker).ripley_said(SAID)) {
+		// No implementation
 	}
 	// TODO
 	else {
@@ -445,6 +528,7 @@ void Room403::parser() {
 
 	_G(player).command_ready = false;
 }
+#undef TRIGGER
 
 void Room403::conv403a() {
 	const char *sound = conv_sound_to_play();
diff --git a/engines/m4/riddle/walker.cpp b/engines/m4/riddle/walker.cpp
index e6736db10f4..0a94cee142c 100644
--- a/engines/m4/riddle/walker.cpp
+++ b/engines/m4/riddle/walker.cpp
@@ -169,7 +169,7 @@ void Walker::unloadSprites() {
 	}
 }
 
-bool Walker::ripley_said(const char *list[][2]) {
+bool Walker::ripley_said(const char *const list[][2]) {
 	if (!list)
 		return false;
 
diff --git a/engines/m4/riddle/walker.h b/engines/m4/riddle/walker.h
index 5160cd847fc..89ff4ce6b61 100644
--- a/engines/m4/riddle/walker.h
+++ b/engines/m4/riddle/walker.h
@@ -57,7 +57,7 @@ public:
 	void reset_walker_sprites();
 	static void unloadSprites();
 
-	bool ripley_said(const char *list[][2]);
+	bool ripley_said(const char *const list[][2]);
 };
 
 void enable_player();


Commit: bca8ed45cc2690cd46b5380e5e3d3e1debeab106
    https://github.com/scummvm/scummvm/commit/bca8ed45cc2690cd46b5380e5e3d3e1debeab106
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-08-13T22:37:37-07:00

Commit Message:
M4: RIDDLE: Finished room 403 parser and supporting methods

Changed paths:
    engines/m4/riddle/rooms/section4/room403.cpp
    engines/m4/riddle/rooms/section4/room403.h


diff --git a/engines/m4/riddle/rooms/section4/room403.cpp b/engines/m4/riddle/rooms/section4/room403.cpp
index 771f23a5093..0b1f215e2d0 100644
--- a/engines/m4/riddle/rooms/section4/room403.cpp
+++ b/engines/m4/riddle/rooms/section4/room403.cpp
@@ -266,6 +266,7 @@ void Room403::daemon() {
 #define TRIGGER _G(kernel).trigger_mode = KT_DAEMON; \
 	kernel_timing_trigger(1, 102); \
 	_G(kernel).trigger_mode = KT_PARSE
+#define MONEY(ITEM) (player_said(ITEM, "WOLF") && inv_player_has(ITEM))
 
 void Room403::pre_parser() {
 	bool talkFlag = player_said_any("talk", "talk to");
@@ -402,7 +403,6 @@ void Room403::pre_parser() {
 	if (_val12) {
 		_val12 = 0;
 
-#define MONEY(ITEM) (player_said(ITEM, "WOLF") && inv_player_has(ITEM))
 		if (MONEY("POMERANIAN MARKS")) {
 			player_set_commands_allowed(false);
 			intr_cancel_sentence();
@@ -432,7 +432,6 @@ void Room403::pre_parser() {
 			kernel_timing_trigger(1, 110);
 			_G(kernel).trigger_mode = KT_PREPARSE;
 		}
-#undef MONEY
 	}
 
 	if ((lookFlag && player_said(" ")) ||
@@ -520,14 +519,104 @@ void Room403::parser() {
 		_G(flags)[V122] = 1;
 	} else if (lookFlag && _G(walker).ripley_said(SAID)) {
 		// No implementation
-	}
-	// TODO
-	else {
+	} else if (lookFlag && player_said("edger") && !inv_player_has("EDGER")) {
+		digi_play("403r53", 1);
+	} else if (lookFlag && player_said_any("STEP LADDER", "STEP LADDER ") &&
+			inv_object_is_here("STEP LADDER")) {
+		digi_play(_G(flags)[V131] == 403 ? "403R10" : "403R46", 1);
+	} else if (useFlag && player_said("PLANK") && inv_object_is_here("PLANK")) {
+		_val6 = 1020;
+		_val7 = 1300;
+		TRIGGER;
+	} else if (useFlag && player_said("STEP LADDER") && inv_object_is_here("STEP LADDER")) {
+		_val6 = 1010;
+		_val7 = 1200;
+		TRIGGER;
+	} else if (player_said("POMERANIAN MARKS", "WOLF") &&
+			inv_player_has("POMERANIAN MARKS")) {
+		if (!_G(flags)[V115] || _G(flags)[V114]) {
+			player_set_commands_allowed(false);
+			_val4 = 200;
+		} else {
+			_G(flags)[V114] = 1;
+			_G(flags)[V111]++;
+			player_set_commands_allowed(false);
+			_val4 = 210;
+		}
+	} else if (MONEY("US DOLLARS") || MONEY("CHINESE YUAN") ||
+			MONEY("PERUVIAN INTI") || MONEY("SIKKIMESE RUPEE")) {
+		if (!_G(flags)[V116]) {
+			_G(flags)[V116] = 1;
+			player_set_commands_allowed(false);
+			_val4 = 220;
+		}
+	} else if (player_said("EDGER", "BELL") && inv_player_has("EDGER")) {
+		edgerBell();
+	} else if (player_said("EDGER", "URN")) {
+		// No implementation
+	} else if ((player_said("STEP LADDER", "TOMB") ||
+			player_said("STEP LADDER", "STAIRS")) ||
+			stepLadderTomb()) {
+		// No implementation
+	} else if (player_said("STEP LADDER", "WALL")) {
+		digi_play("403R32", 1);
+	} else if (player_said("STEP LADDER", "BELL")) {
+		digi_play("403R31", 1);
+	} else if (takeFlag && player_said("URN")) {
+		digi_play("403R28", 1);
+	} else if (takeFlag && player_said("BELL")) {
+		digi_play("403R30", 1);
+	} else if (takeFlag && player_said("PLANK") &&
+			takePlank()) {
+		// No implementation
+	} else if (takeFlag && player_said("EDGER") && takeEdger()) {
+		// No implementation
+	} else if (takeFlag && player_said("STEP LADDER") && takeStepLadder()) {
+		// No implementation
+	} else if (takeFlag && player_said("STEP LADDER ")) {
+		takeStepLadder_();
+	} else if (takeFlag && player_said("EDGER") && inv_object_is_here("EDGER")) {
+		digi_play("403R30", 1);
+	} else if (takeFlag && (
+		player_said_any(
+			"broken headstone", "wall", "pommee cross",
+			"grave plaque", "1ST MARBLE MONUMENT", "2ND MARBLE MONUMENT",
+			"marble column", "small headstone") ||
+		player_said_any(
+			"marble headstone", "tombstone",
+			"burial tablet", "small grave marker", "tall headstone",
+			"granite headstone", "burial plaque", "celtic cross")
+	)) {
+		digi_play("403R33", 1);
+	} else if (lookFlag && player_said(" ")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+			digi_play("403r04", 1, 255, 2);
+			break;
+		case 2:
+			player_set_commands_allowed(true);
+			break;
+
+		}
+	} else if (player_said("journal") && (
+		player_said_any(
+			"broken headstone", "pommee cross", "grave plaque",
+			"grave", "1ST MARBLE MONUMENT", "2ND MARBLE MONUMENT",
+			"marble column", "small headstone") ||
+		player_said_any(
+			"marble headstone", "tombstone", "burial tablet",
+			"small grave marker", "tall headstone", "granite headstone",
+			"burial plaque", "celtic cross")
+	)) {
+		useJournal();
+	} else {
 		return;
 	}
 
 	_G(player).command_ready = false;
 }
+#undef MONEY
 #undef TRIGGER
 
 void Room403::conv403a() {
@@ -621,6 +710,422 @@ void Room403::conv403a1() {
 	conv_resume();
 }
 
+void Room403::edgerBell() {
+	switch (_G(kernel).trigger) {
+	case -1:
+		player_set_commands_allowed(false);
+		if (++_G(flags)[V119] < 8) {
+			_ripRingsBell = series_load("RIP RINGS BELL");
+			player_update_info();
+			ws_hide_walker();
+			_ripOnLadder = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x100, 0,
+				triggerMachineByHashCallbackNegative, "RIP rings bell");
+
+			terminateMachineAndNull(_bell);
+			sendWSMessage_10000(1, _ripOnLadder, _ripRingsBell, 1, 19, 1,
+				_ripRingsBell, 19, 19, 0);
+		}
+		break;
+
+	case 1:
+		digi_play("403_s12", 2);
+		sendWSMessage_10000(1, _ripOnLadder, _ripRingsBell, 19, 19, 2,
+			_ripRingsBell, 19, 32, 0);
+		break;
+
+	case 2:
+		sendWSMessage_10000(1, _ripOnLadder, _ripRingsBell, 32, 1, 3,
+			_ripRingsBell, 1, 1, 0);
+		break;
+
+	case 3:
+		terminateMachineAndNull(_ripOnLadder);
+		ws_unhide_walker();
+		_bell = series_place_sprite("ONE FRAME BELL", 0, 0, 0, 100, 0xf00);
+		series_unload(_ripRingsBell);
+
+		if (_G(flags)[V119] >= 7) {
+			ws_walk_load_shadow_series(S4_SHADOW_DIRS, S4_SHADOW_NAMES);
+			ws_walk_load_walker_series(S4_NORMAL_DIRS, S4_NORMAL_NAMES);
+			_wolfWalker = triggerMachineByHash_3000(8, 8, S4_NORMAL_DIRS, S4_SHADOW_DIRS, 620, 323, 3,
+				triggerMachineByHashCallback3000, "wolf_walker");
+			_wolfAdmonish = series_load("WOLF ADMONISHES RIP");
+			kernel_timing_trigger(120, 4);
+		} else {
+			player_set_commands_allowed(true);
+		}
+		break;
+
+	case 4:
+		sendWSMessage_10000(_wolfWalker, 687, 323, 3, 5, 1);
+		break;
+
+	case 5:
+		sendWSMessage_60000(_wolfWalker);
+		_wolfie = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x100, 0,
+			triggerMachineByHashCallbackNegative, "WOLFIE");
+		sendWSMessage_10000(1, _wolfie, _wolfAdmonish, 1, 18, 6,
+			_wolfAdmonish, 18, 18, 0);
+
+		_ripHeadTurn = series_load("RIP TREK HEAD TURN POS1");
+		setGlobals1(_ripHeadTurn, 4, 8, 8, 8, 0, 8, 4, 4, 4);
+		sendWSMessage_110000(-1);
+		break;
+
+	case 6:
+		sendWSMessage_10000(1, _wolfie, _wolfAdmonish, 19, 31, 7,
+			_wolfAdmonish, 31, 31, 0);
+		playNum1(_G(flags)[V119]);
+		break;
+
+	case 7:
+		sendWSMessage_10000(1, _wolfie, _wolfAdmonish, 31, 1, -1,
+			_wolfAdmonish, 1, 1, 0);
+		break;
+
+	case 8:
+		if (_G(flags)[V119] == 1) {
+			digi_play("403r47", 1, 255, 9);
+		} else {
+			kernel_timing_trigger(60, 9);
+		}
+		break;
+
+	case 9:
+		terminateMachineAndNull(_wolfie);
+		_wolfWalker = triggerMachineByHash_3000(8, 8,
+			S4_NORMAL_DIRS, S4_SHADOW_DIRS, 687, 323, 3,
+			triggerMachineByHashCallback3000, "wolf_walker");
+		sendWSMessage_10000(_wolfWalker, 620, 323, 3, 10, 0);
+		playNum2(_G(flags)[V119]);
+		break;
+
+	case 10:
+		sendWSMessage_60000(_wolfWalker);
+		sendWSMessage_120000(11);
+		break;
+
+	case 11:
+		series_unload(_wolfAdmonish);
+		series_unload(S4_NORMAL_DIRS[1]);
+		series_unload(S4_NORMAL_DIRS[0]);
+		series_unload(S4_SHADOW_DIRS[1]);
+		series_unload(S4_SHADOW_DIRS[0]);
+		series_unload(_ripHeadTurn);
+		sendWSMessage_150000(-1);
+		player_set_commands_allowed(true);
+		break;
+
+	default:
+		break;
+	}
+}
+
+bool Room403::edgerUrn() {
+	switch (_G(kernel).trigger) {
+	case 1:
+		if (inv_player_has("EDGER")) {
+			player_set_commands_allowed(false);
+			_ripMedReach = series_load("RIP MED REACH 1HAND POS2");
+			setGlobals1(_ripMedReach, 1, 17, 17, 17, 0, 17, 1, 1, 1);
+			sendWSMessage_110000(2);
+			return true;
+		}
+		return false;
+
+	case 2:
+		_edger = series_place_sprite("ONE FRAME EDGER", 0, 0, 0, 100, 0xf00);
+		hotspot_set_active("EDGER", true);
+		inv_move_object("EDGER", 403);
+		sendWSMessage_120000(3);
+		return true;
+
+	case 3:
+		sendWSMessage_150000(4);
+		return true;
+
+	case 4:
+		series_unload(_ripMedReach);
+		player_set_commands_allowed(true);
+		return true;
+
+	case 69:
+		if (inv_player_has("EDGER")) {
+			player_set_commands_allowed(false);
+			ws_walk(1201, 321, 0, 1, 2);
+			return true;
+		}
+		return false;
+
+	default:
+		return true;
+	}
+}
+
+bool Room403::stepLadderTomb() {
+	switch (_G(kernel).trigger) {
+	case -1:
+		if (inv_player_has("STEP LADDER")) {
+			player_set_commands_allowed(false);
+			_series1 = series_load("RIP TREK MED REACH HAND POS1");
+			setGlobals1(_series1, 1, 10, 10, 10, 0, 10, 1, 1, 1);
+			sendWSMessage_110000(1);
+			return true;
+		}
+		return false;
+
+	case 1:
+		digi_play("403_s04", 2);
+		_ladder = series_place_sprite("1 sprite of ladder", 0, 0, 0, 100, 0xf00);
+		hotspot_set_active("STEP LADDER", true);
+		inv_move_object("STEP LADDER", 403);
+		_G(flags)[V313] = 2;
+		sendWSMessage_120000(3);
+		return true;
+
+	case 3:
+		sendWSMessage_150000(4);
+		return true;
+
+	case 4:
+		series_unload(_series1);
+		player_set_commands_allowed(true);
+		return true;
+
+	default:
+		break;
+	}
+
+	return false;
+}
+
+bool Room403::takePlank() {
+	switch (_G(kernel).trigger) {
+	case -1:
+		if (inv_object_is_here("PLANK")) {
+			_ripPutBoard = series_load("RIPLEY PUTS BOARD ON POTS");
+			terminateMachineAndNull(_board);
+			ws_hide_walker();
+
+			_ripOnLadder = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x300, 0,
+				triggerMachineByHashCallbackNegative, "RIP plants plank");
+			sendWSMessage_10000(1, _ripOnLadder, _ripPutBoard, 57, 1, 2,
+				_ripPutBoard, 1, 1, 0);
+			return true;
+		}
+		return false;
+
+	case 2:
+		hotspot_set_active("PLANK", false);
+		inv_give_to_player("PLANK");
+		_plank = 0;
+		kernel_examine_inventory_object("PING PLANK", _G(master_palette),
+			5, 1, 396, 223, 3, nullptr, -1);
+		return true;
+
+	case 3:
+		terminateMachineAndNull(_ripOnLadder);
+		ws_unhide_walker();
+		series_unload(_ripPutBoard);
+		player_set_commands_allowed(true);
+		return true;
+
+	default:
+		break;
+	}
+
+	return false;
+}
+
+bool Room403::takeEdger() {
+	switch (_G(kernel).trigger) {
+	case -1:
+		if (!inv_player_has("EDGER")) {
+			player_set_commands_allowed(false);
+			_ripMedReach = series_load("RIP MED REACH 1HAND POS2");
+			setGlobals1(_ripMedReach, 1, 17, 17, 17, 0, 17, 1, 1, 1);
+			sendWSMessage_110000(1);
+			return true;
+		}
+		return false;
+
+	case 1:
+		terminateMachineAndNull(_edger);
+		hotspot_set_active("EDGER", false);
+		inv_give_to_player("EDGER");
+		kernel_examine_inventory_object("PING EDGER", _G(master_palette),
+			5, 1, 500, 216, 2, 0, -1);
+		return true;
+
+	case 2:
+		sendWSMessage_120000(3);
+		return true;
+
+	case 3:
+		sendWSMessage_150000(4);
+		return true;
+
+	case 4:
+		series_unload(_ripMedReach);
+		player_set_commands_allowed(true);
+		return true;
+
+	case 5:
+		player_set_commands_allowed(true);
+		return true;
+
+	default:
+		break;
+	}
+
+	return false;
+}
+
+bool Room403::takeStepLadder() {
+	switch (_G(kernel).trigger) {
+	case -1:
+		if (inv_object_is_here("STEP LADDER")) {
+			player_set_commands_allowed(false);
+			_series1 = series_load("RIP TREK MED REACH HAND POS1");
+			setGlobals1(_series1, 1, 10, 10, 10, 0, 10, 1, 1, 1);
+			sendWSMessage_110000(1);
+			return true;
+		}
+		return false;
+
+	case 1:
+		if (_G(flags)[V131] == 403) {
+			digi_play("403w08", 1, 255, 3);
+			_val8 = 2000;
+			_val9 = 2100;
+			kernel_timing_trigger(15, 2);
+		} else {
+			digi_play("403_s03", 2);
+			terminateMachineAndNull(_ladder);
+			hotspot_set_active("STEP LADDER", false);
+			inv_give_to_player("STEP LADDER");
+			_G(flags)[V313] = 0;
+			kernel_examine_inventory_object("PING STEP LADDER", _G(master_palette),
+				5, 1, 429, 215, 2, nullptr, -1);
+
+		}
+		return true;
+
+	case 2:
+		sendWSMessage_120000(4);
+		return true;
+
+	case 3:
+		_val9 = 2105;
+		digi_play("403r47", 1);
+		return true;
+
+	case 4:
+		sendWSMessage_150000(5);
+		return true;
+
+	case 5:
+		series_unload(_series1);
+		player_set_commands_allowed(true);
+		return true;
+
+	default:
+		break;
+	}
+
+	return false;
+}
+
+void Room403::takeStepLadder_() {
+	switch (_G(kernel).trigger) {
+	case -1:
+		if (inv_object_is_here("STEP LADDER")) {
+			player_set_commands_allowed(false);
+			_series1 = series_load("RIP TREK MED REACH HAND POS1");
+			setGlobals1(_series1, 1, 10, 10, 10, 0, 10, 1, 1, 1);
+			sendWSMessage_110000(1);
+		}
+		break;
+
+	case 1:
+		if (_G(flags)[V131] == 403) {
+			digi_play("403w08", 1, 255, 3);
+			_val8 = 2000;
+			_val9 = 2100;
+			kernel_timing_trigger(15, 2);
+		} else {
+			digi_play("403_s03", 2);
+			hotspot_set_active("STEP LADDER ", false);
+			inv_give_to_player("STEP LADDER");
+			_G(flags)[V313] = 0;
+			kernel_examine_inventory_object("PING STEP LADDER",
+				_G(master_palette), 5, 1, 496, 226, 2, nullptr, -1);
+			terminateMachineAndNull(_ladder);
+		}
+		break;
+
+	case 2:
+		sendWSMessage_120000(4);
+		break;
+
+	case 3:
+		_val9 = 2105;
+		digi_play("403r47", 1);
+		break;
+
+	case 4:
+		sendWSMessage_150000(5);
+		break;
+
+	case 5:
+		series_unload(_series1);
+		player_set_commands_allowed(true);
+		break;
+
+	case 6:
+		player_set_commands_allowed(true);
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Room403::useJournal() {
+	if (_G(flags)[kGraveyardCartoon]) {
+		digi_play("403r42", 1);
+	} else if (_G(flags)[kEpitaphCartoon]) {
+		if (_G(kernel).trigger == 6)
+			_G(flags)[kGraveyardCartoon] = 1;
+		sendWSMessage_multi(nullptr);
+	} else {
+		if (_G(kernel).trigger == 6)
+			_G(flags)[kGraveyardCartoon] = 1;
+		sendWSMessage_multi("403r41");
+	}
+}
+
+void Room403::playNum1(int num) {
+	static const char *const NAMES[] = {
+		"403w11", "403w13", "403w15", "40ew16",
+		"403w17", "403w18", "40w1", "40w1"
+	};
+	digi_play(NAMES[num - 1], 1, 255, 8);
+}
+
+void Room403::playNum2(int num) {
+	switch (num) {
+	case 1:
+		digi_play("403w12", 1);
+		break;
+	case 2:
+		digi_play("403w14", 1);
+		break;
+	default:
+		break;
+	}
+}
+
 } // namespace Rooms
 } // namespace Riddle
 } // namespace M4
diff --git a/engines/m4/riddle/rooms/section4/room403.h b/engines/m4/riddle/rooms/section4/room403.h
index 16377d00d7b..ac3dae32e83 100644
--- a/engines/m4/riddle/rooms/section4/room403.h
+++ b/engines/m4/riddle/rooms/section4/room403.h
@@ -62,9 +62,26 @@ private:
 	int _noTreat = 0;
 	bool _flag1 = false;
 	bool _flag2 = false;
+	int _ripRingsBell = 0;
+	machine *_wolfWalker = nullptr;
+	int _wolfAdmonish = 0;
+	int _ripHeadTurn = 0;
+	int _ripMedReach = 0;
+	int _series1 = 0;
+	int _ripPutBoard = 0;
 
 	void conv403a();
 	void conv403a1();
+	void edgerBell();
+	bool edgerUrn();
+	bool stepLadderTomb();
+	bool takePlank();
+	bool takeEdger();
+	bool takeStepLadder();
+	void takeStepLadder_();
+	void useJournal();
+	void playNum1(int num);
+	void playNum2(int num);
 
 public:
 	Room403() : Room() {}




More information about the Scummvm-git-logs mailing list