[Scummvm-git-logs] scummvm master -> 75f315c1cd8f6c18a7782a499322083e1ecdddd6

dreammaster noreply at scummvm.org
Sat Aug 31 23:05:43 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:
31b1dce9ad M4: RIDDLE: Room 408 init
75f315c1cd M4: RIDDLE: Added room 408 parser


Commit: 31b1dce9adacb6ccf010d2b27cabe80681fefe8a
    https://github.com/scummvm/scummvm/commit/31b1dce9adacb6ccf010d2b27cabe80681fefe8a
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-08-31T16:05:33-07:00

Commit Message:
M4: RIDDLE: Room 408 init

Changed paths:
    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/section4/room406.cpp
    engines/m4/riddle/rooms/section4/room406.h
    engines/m4/riddle/rooms/section4/room407.cpp
    engines/m4/riddle/rooms/section4/room407.h
    engines/m4/riddle/rooms/section4/room408.cpp
    engines/m4/riddle/rooms/section4/room408.h


diff --git a/engines/m4/graphics/gr_series.cpp b/engines/m4/graphics/gr_series.cpp
index e9874b6f1d2..796deb3e568 100644
--- a/engines/m4/graphics/gr_series.cpp
+++ b/engines/m4/graphics/gr_series.cpp
@@ -341,6 +341,14 @@ machine *series_play_xy(const char *seriesName, int loopCount, int flags,
 		scale, x, y);
 }
 
+machine *series_simple_play(const char *seriesName, frac16 layer, bool stickWhenDone) {
+	int flags = 0;
+	if (stickWhenDone)
+		flags |= 0x10;
+
+	return series_play(seriesName, layer, flags);
+}
+
 void series_stream_check_series(machine *m, int val) {
 	// TODO: series_stream_check_series
 	error("TODO: series_stream_check_series");
diff --git a/engines/m4/graphics/gr_series.h b/engines/m4/graphics/gr_series.h
index 0503bf2de9e..7dd9faa786f 100644
--- a/engines/m4/graphics/gr_series.h
+++ b/engines/m4/graphics/gr_series.h
@@ -100,7 +100,7 @@ machine *series_show_sprite(const char *seriesName, int32 index, int32 layer);
 machine *series_play(const char *seriesName, frac16 layer, uint32 flags = 0,
 	int16 triggerNum = -1, int32 frameRate = 6, int32 loopCount = 0, int32 s = 100,
 	int32 x = 0, int32 y = 0, int32 firstFrame = 0, int32 lastFrame = -1);
-//machine *series_simple_play(char *seriesName, frac16 layer, bool stick_when_done);
+machine *series_simple_play(const char *seriesName, frac16 layer, bool stickWhenDone);
 
 machine *series_show(const char *seriesName, frac16 layer, uint32 flags = 0,
 	int16 triggerNum = -1, int32 duration = -1, int32 index = 0, int32 s = 100,
diff --git a/engines/m4/riddle/rooms/room.cpp b/engines/m4/riddle/rooms/room.cpp
index 8e937b4e908..1807f5ed615 100644
--- a/engines/m4/riddle/rooms/room.cpp
+++ b/engines/m4/riddle/rooms/room.cpp
@@ -29,6 +29,12 @@ namespace Rooms {
 
 int Room::_ripSketching;
 
+void Room::preload() {
+	_G(player).walker_type = 1;
+	_G(player).shadow_type = 1;
+	LoadWSAssets("OTHER SCRIPT");
+}
+
 void Room::restoreAutosave() {
 	if (g_engine->autosaveExists()) {
 		_G(kernel).restore_slot = 0;
diff --git a/engines/m4/riddle/rooms/room.h b/engines/m4/riddle/rooms/room.h
index f610c2ddb4a..8bd5294b897 100644
--- a/engines/m4/riddle/rooms/room.h
+++ b/engines/m4/riddle/rooms/room.h
@@ -125,6 +125,8 @@ protected:
 public:
 	Room() : M4::Room() {}
 	~Room() override {}
+
+	void preload();
 };
 
 } // namespace Rooms
diff --git a/engines/m4/riddle/rooms/section4/room406.cpp b/engines/m4/riddle/rooms/section4/room406.cpp
index af4af7d2e43..8b85f614bac 100644
--- a/engines/m4/riddle/rooms/section4/room406.cpp
+++ b/engines/m4/riddle/rooms/section4/room406.cpp
@@ -46,12 +46,6 @@ static const char *const SAID[][2] = {
 	{ nullptr, nullptr }
 };
 
-void Room406::preload() {
-	_G(player).walker_type = 1;
-	_G(player).shadow_type = 1;
-	LoadWSAssets("OTHER SCRIPT");
-}
-
 void Room406::init() {
 	player_set_commands_allowed(false);
 
diff --git a/engines/m4/riddle/rooms/section4/room406.h b/engines/m4/riddle/rooms/section4/room406.h
index 8a3512d6fb6..8cf53797fa0 100644
--- a/engines/m4/riddle/rooms/section4/room406.h
+++ b/engines/m4/riddle/rooms/section4/room406.h
@@ -70,7 +70,6 @@ public:
 	Room406() : Room() {}
 	~Room406() override {}
 
-	void preload() override;
 	void init() override;
 	void daemon() override;
 	void pre_parser() override;
diff --git a/engines/m4/riddle/rooms/section4/room407.cpp b/engines/m4/riddle/rooms/section4/room407.cpp
index b57b8208938..24e8484263a 100644
--- a/engines/m4/riddle/rooms/section4/room407.cpp
+++ b/engines/m4/riddle/rooms/section4/room407.cpp
@@ -71,12 +71,6 @@ static const char *const SAID[][2] = {
 	{ nullptr, nullptr }
 };
 
-void Room407::preload() {
-	_G(player).walker_type = 1;
-	_G(player).shadow_type = 1;
-	LoadWSAssets("OTHER SCRIPT");
-}
-
 void Room407::init() {
 	player_set_commands_allowed(false);
 	digi_preload("407_s31");
diff --git a/engines/m4/riddle/rooms/section4/room407.h b/engines/m4/riddle/rooms/section4/room407.h
index 00efed06c32..da444a1207d 100644
--- a/engines/m4/riddle/rooms/section4/room407.h
+++ b/engines/m4/riddle/rooms/section4/room407.h
@@ -254,7 +254,6 @@ public:
 	Room407() : Room() {}
 	~Room407() override {}
 
-	void preload() override;
 	void init() override;
 	void daemon() override;
 	void pre_parser() override;
diff --git a/engines/m4/riddle/rooms/section4/room408.cpp b/engines/m4/riddle/rooms/section4/room408.cpp
index ba192ec27d1..44246802300 100644
--- a/engines/m4/riddle/rooms/section4/room408.cpp
+++ b/engines/m4/riddle/rooms/section4/room408.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "m4/riddle/rooms/section4/room408.h"
+#include "m4/riddle/rooms/section4/section4.h"
 #include "m4/graphics/gr_series.h"
 #include "m4/riddle/vars.h"
 
@@ -28,6 +29,157 @@ namespace Riddle {
 namespace Rooms {
 
 void Room408::init() {
+	player_set_commands_allowed(false);
+
+	if (_G(game).previous_room != KERNEL_RESTORING_GAME) {
+		_val1 = 0;
+		_val2 = -1;
+		_val3 = 0;
+		_val4 = -1;
+		_val5 = -1;
+		_val6 = 0;
+		_val7 = 0;
+		_val8 = 0;
+		_val9 = 0;
+	}
+
+	digi_preload("950_s19");
+	digi_preload("950_s20");
+	digi_preload("950_s21");
+	hotspot_set_active("WOLF", false);
+	hotspot_set_active("PLANK", false);
+	hotspot_set_active("EDGER", false);
+	_exit = series_show("RIP EXITS 407", 0xf00, 16);
+
+	if (_G(flags)[V139] == 1) {
+		_G(flags)[V139] = 0;
+		_edger = series_place_sprite("Edger gone", 0, 0, -53, 100, 0xf00);
+		hotspot_set_active("EDGER", true);
+		inv_move_object("EDGER", 408);
+		ws_demand_location(234, 319, 3);
+		ws_walk(438, 325, nullptr, 400, 1);
+		
+	} else if (_G(flags)[V139] == 3) {
+		_G(flags)[V139] = 0;
+
+		if (inv_object_is_here("PLANK")) {
+			_plank = series_place_sprite("Plank gone", 0, 0, 0, 100, 0xf00);
+			hotspot_set_active("PLANK", true);
+		}
+
+		ws_demand_location(-20, 345, 3);
+		ws_walk(234, 319, nullptr, 420, 1);
+
+	} else {
+		if (inv_player_has("TURTLE") && !inv_player_has("EDGER") &&
+				!_G(flags)[GLB_TEMP_12]) {
+			_edger = series_place_sprite("Edger gone", 0, 0, -53, 100, 0xf00);
+			hotspot_set_active("EDGER", true);
+		}
+
+		if (inv_player_has("TURTLE") && !inv_player_has("PLANK") &&
+				!_G(flags)[GLB_TEMP_12] && inv_object_is_here("PLANK")) {
+			_plank = series_place_sprite("Plank gone", 0, 0, 0, 100, 0xf00);
+			hotspot_set_active("PLANK", true);
+		}
+
+		switch (_G(game).previous_room) {
+		case KERNEL_RESTORING_GAME:
+			digi_preload("950_s22");
+
+			if (_G(flags)[V131] == 400) {
+				hotspot_set_active("WOLF", true);
+				_val8 = 2001;
+				_val9 = 2200;
+				_wolf = series_load("WOLF CLPNG LOOP LOOKS TO SIDE");
+				_wolfie = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, -53, 100, 0xd00, 0,
+					triggerMachineByHashCallbackNegative, "WOLFIE");
+				sendWSMessage_10000(1, _wolfie, _wolf, 1, 10, 110, _wolf, 10, 10, 0);
+			}
+
+			player_set_commands_allowed(true);
+			break;
+
+		case 402:
+			if (_G(flags)[V132]) {
+				ws_hide_walker();
+				ws_walk_load_shadow_series(S4_SHADOW_DIRS, S4_SHADOW_NAMES);
+				ws_walk_load_walker_series(S4_NORMAL_DIRS, S4_NORMAL_NAMES);
+				kernel_timing_trigger(1, 300);
+			} else {
+				if (_G(flags)[V131] == 408) {
+					hotspot_set_active("WOLF", true);
+					_wolf = series_load("WOLF CLPNG LOOP LOOKS TO SIDE");
+					_wolfie = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, -53, 100, 0xd00, 0,
+						triggerMachineByHashCallbackNegative, "WOLFIE");
+					sendWSMessage_10000(1, _wolfie, _wolf, 1, 10, 110, _wolf, 10, 10, 0);
+					_val8 = 2001;
+					_val9 = 2200;
+				}
+
+				ws_demand_location(-20, 345, 3);
+				ws_walk(35, 345, nullptr, 20, 3);
+			}
+			break;
+
+		case 407:
+			digi_preload("950_s22");
+			terminateMachineAndNull(_exit);
+
+			if (_G(flags)[GLB_TEMP_12]) {
+				_G(flags)[V131] = 999;
+			} else if (inv_player_has("TURTLE")) {
+				_G(flags)[V131] = 402;
+				_G(flags)[V117] = 1;
+			} else if (_G(flags)[V124]) {
+				_G(flags)[V131] = 402;
+			} else {
+				_G(flags)[V131] = 403;
+			}
+
+			_ripExits = series_load("RIP EXITS 407");
+			ws_demand_location(201, 287, 4);
+			ws_hide_walker();
+
+			_exit = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0, 0,
+				triggerMachineByHashCallbackNegative, "RIP ENTERS from GIZMO");
+			sendWSMessage_10000(1, _exit, _ripExits, 1, 75, 40, _ripExists, 75, 75, 0);
+			digi_play("408_s01", 2);
+			break;
+
+		default:
+			digi_preload("950_s22");
+
+			if (_G(flags)[V117] && _G(flags)[V125] == 3 &&
+				!_G(flags)[GLB_TEMP_12] && !inv_player_has("EDGER") &&
+				!inv_player_has("PLANK")) {
+				_G(flags)[V131] = 408;
+				_G(flags)[V117] = 0;
+			}
+
+			if (_G(flags)[V131] == 408) {
+				hotspot_set_active("WOLF", true);
+				_wolf = series_load("WOLF CLPNG LOOP LOOKS TO SIDE");
+				_wolfie = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, -53, 100, 0xd00, 0,
+					triggerMachineByHashCallbackNegative, "WOLFIE");
+				sendWSMessage_10000(1, _wolfie, _wolf, 1, 10, 110, _wolf, 10, 10, 0);
+				_val8 = 2001;
+				_val9 = 2200;
+			}
+
+			ws_demand_location(660, 345, 9);
+
+			if (_G(flags)[V125] == 3) {
+				series_simple_play("408 turtle popup", 0, true);
+				ws_walk(438, 325, nullptr, 350, 1);
+			} else {
+				ws_walk(615, 345, nullptr, 30, 9);
+			}
+			break;
+		}
+	}
+
+	digi_play_loop("950_s22", 3, 120, -1, 950);
 }
 
 void Room408::daemon() {
diff --git a/engines/m4/riddle/rooms/section4/room408.h b/engines/m4/riddle/rooms/section4/room408.h
index 2207625e47b..d5a867c15a5 100644
--- a/engines/m4/riddle/rooms/section4/room408.h
+++ b/engines/m4/riddle/rooms/section4/room408.h
@@ -29,12 +29,31 @@ namespace Riddle {
 namespace Rooms {
 
 class Room408 : public Room {
+private:
+	int _val1 = 0;
+	int _val2 = 0;
+	int _val3 = 0;
+	int _val4 = 0;
+	int _val5 = 0;
+	int _val6 = 0;
+	int _val7 = 0;
+	int _val8 = 0;
+	int _val9 = 0;
+	machine *_exit = nullptr;
+	int _ripExits = 0;
+	machine *_edger = nullptr;
+	machine *_plank = nullptr;
+	int _wolf = 0;
+	machine *_wolfie = nullptr;
+
 public:
 	Room408() : Room() {}
 	~Room408() override {}
 
 	void init() override;
 	void daemon() override;
+	void pre_parser() override;
+	void parser() override;
 };
 
 } // namespace Rooms


Commit: 75f315c1cd8f6c18a7782a499322083e1ecdddd6
    https://github.com/scummvm/scummvm/commit/75f315c1cd8f6c18a7782a499322083e1ecdddd6
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-08-31T16:05:33-07:00

Commit Message:
M4: RIDDLE: Added room 408 parser

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


diff --git a/engines/m4/riddle/rooms/section4/room408.cpp b/engines/m4/riddle/rooms/section4/room408.cpp
index 44246802300..f204009b1e2 100644
--- a/engines/m4/riddle/rooms/section4/room408.cpp
+++ b/engines/m4/riddle/rooms/section4/room408.cpp
@@ -36,7 +36,7 @@ void Room408::init() {
 		_val2 = -1;
 		_val3 = 0;
 		_val4 = -1;
-		_val5 = -1;
+		_currentNode = -1;
 		_val6 = 0;
 		_val7 = 0;
 		_val8 = 0;
@@ -143,7 +143,7 @@ void Room408::init() {
 
 			_exit = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0, 0,
 				triggerMachineByHashCallbackNegative, "RIP ENTERS from GIZMO");
-			sendWSMessage_10000(1, _exit, _ripExits, 1, 75, 40, _ripExists, 75, 75, 0);
+			sendWSMessage_10000(1, _exit, _ripExits, 1, 75, 40, _ripExits, 75, 75, 0);
 			digi_play("408_s01", 2);
 			break;
 
@@ -185,6 +185,296 @@ void Room408::init() {
 void Room408::daemon() {
 }
 
+void Room408::pre_parser() {
+	bool takeFlag = player_said("take");
+	bool lookFlag = player_said_any("look", "look at");
+	bool enterFlag = player_said("enter");
+
+	if (lookFlag && player_said(" "))
+		_G(player).resetWalk();
+
+	if (enterFlag && player_said("GRAVEYARD"))
+		_G(player).resetWalk();
+
+	if (player_said("journal") && !takeFlag && !lookFlag &&
+			_G(kernel).trigger == -1)
+		_G(player).resetWalk();
+}
+
+void Room408::parser() {
+	bool lookFlag = player_said_any("look", "look at");
+	bool talkFlag = player_said("talk", "talk to");
+	bool takeFlag = player_said("take");
+	bool enterFlag = player_said("enter");
+	bool useFlag = player_said_any("push", "pull", "gear", "open", "close");
+
+	if (player_said("conv408a")) {
+		if (_G(kernel).trigger == -1) {
+			_val7 = 1103;
+			_val9 = 2102;
+			conv_resume();
+		} else {
+			conv408a();
+		}
+	} else if (talkFlag && player_said("WOLF")) {
+		player_set_commands_allowed(false);
+		_val4 = -1;
+		_val6 = 1000;
+		_val7 = 1100;
+		kernel_timing_trigger(1, 102, KT_DAEMON, KT_PARSE);
+	} else if (lookFlag && player_said("WINDOW")) {
+		digi_play("408r03", 1);
+	} else if (lookFlag && player_said("CASTLE")) {
+		digi_play("408r01", 1);
+	} else if (lookFlag && player_said("TOPIARY")) {
+		digi_play("408r02", 1);
+	} else if (lookFlag && player_said("SUNDIAL")) {
+		digi_play(player_been_here(408) ? "408r32" : "408r04", 1);
+	} else if (lookFlag && player_said_any("BUSH", "BUSH ")) {
+		digi_play("408r05", 1);
+	} else if (lookFlag && player_said("PLANK") && inv_object_is_here("PLANK")) {
+		digi_play("408r20", 1);
+	} else if (lookFlag && player_said("EDGER") && inv_object_is_here("EDGER")) {
+		digi_play("408r35", 1);
+	} else if (lookFlag && player_said("WOLF")) {
+		digi_play("408r21", 1);
+	} else if (takeFlag && player_said("TOPIARY")) {
+		digi_play("408r06", 1);
+	} else if (takeFlag && player_said("SUNDIAL")) {
+		digi_play("408r08", 1);
+	} else if (takeFlag && player_said("PLANK") && takePlank()) {
+		// No implementation
+	} else if (takeFlag && player_said("EDGER") && takeEdger()) {
+		// No implementation
+	} else if (player_said("EDGER", "BUSH")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+			_ripLowReacher = series_load("RIP TREK MED REACH HAND POS1");
+			setGlobals1(_ripLowReacher, 1, 10, 10, 10, 0, 10, 1, 1, 1);
+			sendWSMessage_110000(1);
+			break;
+
+		case 1:
+			_edger = series_place_sprite("Edger gone", 0, 0, -53, 100, 0xf00);
+			hotspot_set_active("EDGER", true);
+			inv_move_object("EDGER", 408);
+			sendWSMessage_120000(3);
+			break;
+
+		case 3:
+			sendWSMessage_150000(4);
+			break;
+
+		case 4:
+			series_unload(_ripLowReacher);
+			player_set_commands_allowed(true);
+			break;
+
+		default:
+			break;
+		}
+	} else if (player_said("PLANK", "TOPIARY")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			if (_G(flags)[V131] != 408) {
+				player_set_commands_allowed(false);
+				_ripLowReacher = series_load("RIP TREK LOW REACHER POS1");
+				setGlobals1(_ripLowReacher, 1, 7, 7, 7, 0, 7, 1, 1, 1);
+				sendWSMessage_110000(1);
+			}
+			break;
+
+		case 1:
+			_plank = series_place_sprite("Plank gone", 0, 0, 0, 100, 0xf00);
+			inv_move_object("PLANK", 408);
+			hotspot_set_active("PLANK", true);
+			sendWSMessage_120000(3);
+			break;
+
+		case 2:
+			_G(game).setRoom(403);
+			break;
+
+		default:
+			break;
+		}
+	} else if (useFlag && player_said("TOPIARY")) {
+		digi_play("408r07", 1);
+	} else if (useFlag && player_said("SUNDIAL")) {
+		digi_play(player_been_here(407) ? "408r34" : "408r09", 1);
+	} else if (useFlag && player_said("WINDOW")) {
+		digi_play("408r10", 1);
+	} else if (player_said("POMERANIAN MARKS", "WOLF") &&
+			inv_player_has("POMERANIAN MARKS")) {
+		digi_play("408w07", 1);
+	} else if (enterFlag && player_said("CASTLE GROUNDS")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+			ws_walk(-20, 345, nullptr, 1, 9);
+			break;
+		case 1:
+			disable_player_commands_and_fade_init(2);
+			break;
+		case 2:
+			adv_kill_digi_between_rooms(false);
+			digi_play_loop("950_s22", 3, 255, -1, 950);
+			_G(game).setRoom(402);
+			break;
+		default:
+			break;
+		}
+	} else if (enterFlag && player_said("GRAVEYARD")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+			ws_walk(660, 345, nullptr, 1, 3);
+			break;
+		case 1:
+			disable_player_commands_and_fade_init(2);
+			break;
+		case 2:
+			_G(game).setRoom(403);
+			break;
+		default:
+			break;
+		}
+	} else if (player_said("journal") && !takeFlag && !lookFlag &&
+			!inv_player_has(_G(player).noun)) {
+		if (_G(flags)[kCastleCartoon]) {
+			digi_play("com016", 1);
+		} else if (_G(kernel).trigger == 6) {
+			_G(flags)[kCastleCartoon] = 1;
+			sendWSMessage_multi("com015");
+		} else {
+			sendWSMessage_multi("com015");
+		}
+	} else if (lookFlag && player_said(" ")) {
+		digi_play("408r01", 1);
+	} else {
+		return;
+	}
+
+	_G(player).command_ready = false;
+}
+
+void Room408::conv408a() {
+	int who = conv_whos_talking();
+	_currentNode = conv_current_node();
+	const char *sound = conv_sound_to_play();
+
+	if (sound) {
+		if (who <= 0) {
+			_val9 = 2101;
+			digi_play(sound, 1);
+		} else if (who == 1) {
+			_val7 = 1102;
+			digi_play(sound, 1);
+		}
+	} else {
+		conv_resume();
+	}
+}
+
+bool Room408::takePlank() {
+	switch (_G(kernel).trigger) {
+	case -1:
+		if (inv_player_has("PLANK")) {
+			player_set_commands_allowed(false);
+
+			if (_G(flags)[V131] == 408) {
+				digi_play("408r29", 1, 255, 5);
+			} else {
+				_ripLowReacher = series_load("RIP TREK LOW REACHER POS1");
+				setGlobals1(_ripLowReacher, 1, 7, 7, 7, 0, 7, 1, 1, 1);
+				sendWSMessage_110000(1);
+			}
+			break;
+		}
+		return false;
+
+	case 1:
+		terminateMachineAndNull(_plank);
+		inv_give_to_player("PLANK");
+		hotspot_set_active("PLANK", false);
+		kernel_examine_inventory_object("PING PLANK",
+			_G(master_palette), 5, 1, 362, 225, 2, "408_s02", -1);
+		break;
+
+	case 2:
+		sendWSMessage_120000(3);
+		break;
+
+	case 3:
+		sendWSMessage_150000(4);
+		break;
+
+	case 4:
+		series_unload(_ripLowReacher);
+		player_set_commands_allowed(true);
+		break;
+
+	case 5:
+		player_set_commands_allowed(true);
+		break;
+
+	default:
+		return false;
+	}
+
+	return true;
+}
+
+bool Room408::takeEdger() {
+	switch (_G(kernel).trigger) {
+	case -1:
+		if (!inv_player_has("EDGER")) {
+			player_set_commands_allowed(false);
+
+			if (_G(flags)[V131] == 408) {
+				digi_play("408r30", 1, 255, 5);
+			} else {
+				_ripLowReacher = series_load("RIP TREK MED REACH HAND POS1");
+				setGlobals1(_ripLowReacher, 1, 10, 10, 10, 0, 10, 1, 1, 1);
+				sendWSMessage_110000(1);
+			}
+			break;
+		}
+		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, 190, 215, 2, nullptr, -1);
+		break;
+
+	case 2:
+		sendWSMessage_120000(3);
+		break;
+
+	case 3:
+		sendWSMessage_150000(4);
+		break;
+
+	case 4:
+		series_unload(_ripLowReacher);
+		player_set_commands_allowed(true);
+		break;
+
+	case 5:
+		player_set_commands_allowed(true);
+		break;
+
+	default:
+		break;
+	}
+
+	return true;
+}
+
 } // namespace Rooms
 } // namespace Riddle
 } // namespace M4
diff --git a/engines/m4/riddle/rooms/section4/room408.h b/engines/m4/riddle/rooms/section4/room408.h
index d5a867c15a5..c470e068f6c 100644
--- a/engines/m4/riddle/rooms/section4/room408.h
+++ b/engines/m4/riddle/rooms/section4/room408.h
@@ -34,7 +34,7 @@ private:
 	int _val2 = 0;
 	int _val3 = 0;
 	int _val4 = 0;
-	int _val5 = 0;
+	int _currentNode = 0;
 	int _val6 = 0;
 	int _val7 = 0;
 	int _val8 = 0;
@@ -45,6 +45,11 @@ private:
 	machine *_plank = nullptr;
 	int _wolf = 0;
 	machine *_wolfie = nullptr;
+	int _ripLowReacher = 0;
+
+	void conv408a();
+	bool takePlank();
+	bool takeEdger();
 
 public:
 	Room408() : Room() {}




More information about the Scummvm-git-logs mailing list