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

dreammaster noreply at scummvm.org
Mon Sep 9 04:31:55 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:
ddc7bcd964 M4: RIDDLE: In progress room 504 parser


Commit: ddc7bcd9647b3236e6b494c63804e8330758dd1a
    https://github.com/scummvm/scummvm/commit/ddc7bcd9647b3236e6b494c63804e8330758dd1a
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-09-08T21:31:48-07:00

Commit Message:
M4: RIDDLE: In progress room 504 parser

Changed paths:
    engines/m4/adv_r/adv_interface.cpp
    engines/m4/adv_r/adv_interface.h
    engines/m4/core/rooms.h
    engines/m4/riddle/rooms/section5/room504.cpp
    engines/m4/riddle/rooms/section5/room504.h


diff --git a/engines/m4/adv_r/adv_interface.cpp b/engines/m4/adv_r/adv_interface.cpp
index 6ca5150895a..7b3fa536394 100644
--- a/engines/m4/adv_r/adv_interface.cpp
+++ b/engines/m4/adv_r/adv_interface.cpp
@@ -79,4 +79,9 @@ void intr_freshen_sentence() {
 	_GI().freshen_sentence();
 }
 
+void intr_freshen_sentence(int cursor) {
+	mouse_set_sprite(cursor);
+	_GI().freshen_sentence();
+}
+
 } // End of namespace M4
diff --git a/engines/m4/adv_r/adv_interface.h b/engines/m4/adv_r/adv_interface.h
index 1d4615a015e..1241ef23c15 100644
--- a/engines/m4/adv_r/adv_interface.h
+++ b/engines/m4/adv_r/adv_interface.h
@@ -79,6 +79,7 @@ bool intr_EventHandler(void *bufferPtr, int32 eventType, int32 event, int32 x, i
 
 void intr_cancel_sentence();
 void intr_freshen_sentence();
+void intr_freshen_sentence(int cursor);
 
 } // End of namespace M4
 
diff --git a/engines/m4/core/rooms.h b/engines/m4/core/rooms.h
index 6e70cbec572..25388198581 100644
--- a/engines/m4/core/rooms.h
+++ b/engines/m4/core/rooms.h
@@ -159,6 +159,9 @@ public:
 
 	void pal_game_task();
 	void camera_shift_xy(int32 x, int32 y);
+	bool game_camera_panning() const {
+		return _cameraShiftAmount != 0 || _cameraShift_vert_Amount != 0;
+	}
 
 	virtual void global_daemon() = 0;
 	virtual void global_pre_parser() = 0;
diff --git a/engines/m4/riddle/rooms/section5/room504.cpp b/engines/m4/riddle/rooms/section5/room504.cpp
index 37588c92269..8843c140d12 100644
--- a/engines/m4/riddle/rooms/section5/room504.cpp
+++ b/engines/m4/riddle/rooms/section5/room504.cpp
@@ -23,13 +23,14 @@
 #include "m4/graphics/gr_series.h"
 #include "m4/riddle/vars.h"
 #include "m4/gui/gui_vmng.h"
+#include "m4/m4.h"
 
 namespace M4 {
 namespace Riddle {
 namespace Rooms {
 
 void Room504::init() {
-	_val1 = -1;
+	_trigger1 = -1;
 
 	_vines1 = nullptr;
 	_vines2 = nullptr;
@@ -59,7 +60,7 @@ void Room504::init() {
 		ws_demand_location(1384, 205, 9);
 		ws_hide_walker();
 		MoveScreenDelta(_G(game_buff_ptr), -1280, 0);
-		_xyzzy2 = 1;
+		_flag1 = true;
 
 		_downSteps = series_load("504 down steps");
 		player_update_info();
@@ -86,7 +87,7 @@ void Room504::init() {
 			ws_walk(183, 207, nullptr, 655, 3);
 		}
 
-		_xyzzy2 = 0;
+		_flag1 = false;
 		break;
 	}
 
@@ -102,11 +103,234 @@ void Room504::daemon() {
 }
 
 void Room504::pre_parser() {
-
+	bool useFlag = player_said("gear");
+	bool useFlag1 = useFlag && _flag1;
+	bool useFlag0 = useFlag && !_flag1;
+
+	if (useFlag1 && player_said("ROPE COIL "))
+		intr_freshen_sentence(62);
+	else if (useFlag1 && player_said("GREEN VINE COIL "))
+		intr_freshen_sentence(63);
+	else if (useFlag1 && player_said("BROWN VINE COIL "))
+		intr_freshen_sentence(64);
+	else if (useFlag1 && player_said("COIL OF VINES "))
+		intr_freshen_sentence(107);
+
+	else if (useFlag1 && player_said("ROPE COIL    "))
+		intr_freshen_sentence(62);
+	else if (useFlag1 && player_said("GREEN VINE COIL    "))
+		intr_freshen_sentence(63);
+	else if (useFlag1 && player_said("BROWN VINE COIL    "))
+		intr_freshen_sentence(64);
+	else if (useFlag1 && player_said("COIL OF VINES    "))
+		intr_freshen_sentence(107);
+
+	else if (useFlag0 && player_said("ROPE COIL  "))
+		intr_freshen_sentence(62);
+	else if (useFlag0 && player_said("GREEN VINE COIL  "))
+		intr_freshen_sentence(63);
+	else if (useFlag0 && player_said("BROWN VINE COIL  "))
+		intr_freshen_sentence(64);
+	else if (useFlag0 && player_said("COIL OF VINES  "))
+		intr_freshen_sentence(107);
+
+	else if (useFlag0 && player_said("ROPE COIL   "))
+		intr_freshen_sentence(62);
+	else if (useFlag0 && player_said("GREEN VINE COIL   "))
+		intr_freshen_sentence(63);
+	else if (useFlag0 && player_said("BROWN VINE COIL   "))
+		intr_freshen_sentence(64);
+	else if (useFlag0 && player_said("COIL OF VINES   "))
+		intr_freshen_sentence(107);
 }
 
 void Room504::parser() {
+	bool ropeCoilFlag = player_said_any("ROPE COIL ", "ROPE COIL  ",
+		"ROPE COIL   ", "ROPE COIL    ");
+	bool greenVineFlag = player_said_any("GREEN VINE COIL ",
+		"GREEN VINE COIL  ", "GREEN VINE COIL   ", "GREEN VINE COIL    ");
+	bool brownVineFlag = player_said_any("BROWN VINE COIL ",
+		"BROWN VINE COIL  ", "BROWN VINE COIL   ", "BROWN VINE COIL    ");
+	bool vineCoilFlag = player_said_any("COIL OF VINES ", "COIL OF VINES  ",
+		"COIL OF VINES   ", "COIL OF VINES    ");
+	bool lookFlag = player_said_any("look", "look at");
+	bool takeFlag = player_said("take");
+	bool talkFlag = player_said_any("talk", "talk to");
+	bool useFlag = player_said("gear");
+	//bool vineStatueFlag = player_said_any("rope ",
+	//	"green vine ", "brown vine ", "vines ", "spider statue");
+	bool menendezFlag = player_said_any("PERSON IN HOLE", "MENENDEZ");
+
+	player_update_info();
+	_flag1 = _G(player_info).x > 300;
+
+	if (player_said("GREEN VINE", "BROWN VINE") && inv_player_has("GREEN VINE") &&
+			inv_player_has("BROWN VINE")) {
+		inv_move_object("GREEN VINE", NOWHERE);
+		inv_move_object("BROWN VINE", NOWHERE);
+		inv_give_to_player("VINES");
+		_G(player).command_ready = false;
+		return;
+	} else if (((!_flag1 && _G(player).click_x > 300) ||
+			(_flag1 && _G(player).click_x <= 300)) &&
+			!lookFlag && !takeFlag && !useFlag &&
+			checkVinesDistance()) {
+		_G(player).command_ready = false;
+		return;
+	}
 
+	_flag2 = _G(flags)[V154] == 2 ||
+		(_G(flags)[V152] == 2 && _G(flags)[V153] == 2);
+
+	if (!lookFlag && !takeFlag && !useFlag && !ropeCoilFlag &&
+			!greenVineFlag && !brownVineFlag && !vineCoilFlag &&
+			(_G(flags)[V154] == 2 || _G(flags)[V152] == 2 || _G(flags)[V153] == 2) &&
+			parser1()) {
+		// No implementation
+	} else if (player_said("conv504a")) {
+		conv504a();
+	} else if (_G(kernel).trigger == 747) {
+		_G(kernel).trigger_mode = KT_DAEMON;
+		kernel_timing_trigger(1, 509);
+	} else if (talkFlag && menendezFlag) {
+		switch (_G(kernel).trigger) {
+		case -1:
+		case 666:
+			player_set_commands_allowed(false);
+			g_engine->camera_shift_xy(862, 0);
+			kernel_timing_trigger(1, 1);
+			break;
+		case 1:
+			if (g_engine->game_camera_panning()) {
+				kernel_timing_trigger(5, 1);
+			} else {
+				_trigger1 = kernel_trigger_create(2);
+				_G(kernel).trigger_mode = KT_DAEMON;
+				kernel_timing_trigger(5, 505);
+			}
+			break;
+		case 2:
+			_convState2 = 3;
+			digi_play("504R51", 1, 255, 3);
+			break;
+		case 3:
+			_convState2 = 1;
+			_convState = 2;
+			_trigger2 = kernel_trigger_create(4);
+			break;
+		case 4:
+			_G(kernel).trigger_mode = KT_DAEMON;
+			kernel_timing_trigger(1, 508);
+			break;
+		default:
+			break;
+		}
+	} else if (menendezFlag && player_said("ROMANOV EMERALD")) {
+		player_set_commands_allowed(false);
+		_G(kernel).trigger_mode = KT_DAEMON;
+		kernel_timing_trigger(1, 511);
+	} else if ((menendezFlag && player_said("PERUVIAN INTI")) ||
+			(menendezFlag && !lookFlag && !takeFlag && !useFlag)) {
+		player_set_commands_allowed(false);
+		_flag4 = true;
+		_G(kernel).trigger_mode = KT_DAEMON;
+		kernel_timing_trigger(1, 548);
+	} else if (player_said("WALK UP")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+		case 666:
+			player_set_commands_allowed(false);
+			_upSteps = series_load("504 UP STEPS");
+			player_update_info();
+			ws_hide_walker();
+			_ripley = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100,
+				_G(player_info).depth, 0, triggerMachineByHashCallbackNegative, "Rp");
+			sendWSMessage_10000(1, _ripley, _upSteps, 1, 25, -1, _upSteps, 25, 25, 0);
+			kernel_timing_trigger(60, 2);
+			break;
+		case 2:
+			disable_player_commands_and_fade_init(2);
+			break;
+		case 3:
+			_G(game).setRoom(506);
+			break;	
+		default:
+			break;
+		}
+	} else if (player_said("EXIT") && !_flag1) {
+		if (inv_player_has("ROPE")) {
+			switch (_G(kernel).trigger) {
+			case -1:
+				player_set_commands_allowed(false);
+				player_update_info();
+				ws_walk(_G(player_info).x, _G(player_info).y, nullptr, -1, 9);
+				disable_player_commands_and_fade_init(2);
+				break;
+			case 2:
+				_G(game).setRoom(501);
+				inv_move_object("ROPE", 504);
+				break;
+			default:
+				break;
+			}
+		} else {
+			switch (_G(kernel).trigger) {
+			case -1:
+				player_set_commands_allowed(false);
+				ws_walk(183, 207, nullptr, 2, 3);
+				break;
+			case 2:
+				digi_play("504R44", 1, 255, 3);
+				break;
+			case 3:
+				player_set_commands_allowed(true);
+				break;
+			default:
+				break;
+			}
+		}
+	} else if (lookFlag && player_said("ROPE ") &&
+			(_G(flags)[V154] == 1 || _G(flags)[V154] == 4)) {
+		digi_play("504R39", 1);
+	} else if (lookFlag && player_said("GREEN VINE ") &&
+			(_G(flags)[V152] == 1 || _G(flags)[V152] == 4)) {
+		digi_play("504R39", 1);
+	} else if (lookFlag && player_said("BROWN VINE ") &&
+			(_G(flags)[V153] == 1 || _G(flags)[V153] == 4)) {
+		digi_play("504R39", 1);
+	} else if (lookFlag && player_said("ROPE  ") &&
+			(_G(flags)[V154] == 0 || _G(flags)[V154] == 5)) {
+		digi_play("504R40", 1);
+	} else if (lookFlag && player_said("GREEN VINE  ") &&
+			(_G(flags)[V152] == 0 || _G(flags)[V152] == 5)) {
+		digi_play("504R40", 1);
+	} else if (lookFlag && player_said("BROWN VINE  ") &&
+			(_G(flags)[V153] == 0 || _G(flags)[V153] == 5)) {
+		digi_play("504R40", 1);
+	} else if (lookFlag && ropeCoilFlag) {
+		digi_play("504R36", 1);
+	} else if (lookFlag && greenVineFlag) {
+		digi_play("504R34", 1);
+	} else if (lookFlag && brownVineFlag) {
+		digi_play("504R34", 1);
+	} else if (lookFlag && vineCoilFlag) {
+		digi_play("504R35", 1);
+	} else if (lookFlag && (
+			player_said_any("GREEN VINE ", "GREEN VINE  ") ||
+			player_said_any("BROWN VINE ", "BROWN VINE  ") ||
+			player_said_any("ROPE ", "ROPE  ", "ROPE   ") ||
+			player_said_any("GREEN VINE   ", "BROWN VINE   ")) &&
+			lookVines()) {
+		// No implementation
+	} else if (lookFlag && player_said(" ")) {
+		// TODO
+	}
+	// TODO
+	else {
+		return;
+	}
+
+	_G(player).command_ready = false;
 }
 
 void Room504::setVines() {
@@ -398,6 +622,126 @@ void Room504::addShovel() {
 	_G(currentSceneDef).hotspots = hotspot_add(_G(currentSceneDef).hotspots, hs, true);
 }
 
+bool Room504::checkVinesDistance() {
+	if (player_said("ROPE") && inv_player_has("ROPE"))
+		digi_play("504R49", 1);
+	else if (player_said("GREEN VINE") && inv_player_has("GREEN VINE"))
+		digi_play("504R49", 1);
+	else if (player_said("BROWN VINE") && inv_player_has("BROWN VINE"))
+		digi_play("504R49", 1);
+	else if (player_said("VINES") && inv_player_has("VINES"))
+		digi_play("504R49", 1);
+	else
+		return false;
+
+	return true;
+}
+
+bool Room504::parser1() {
+	if (!_flag1 && _G(player).click_x > 300) {
+		_G(kernel).trigger_mode = KT_DAEMON;
+		if (inv_player_has("DRIFTWOOD STUMP") || inv_player_has("POLE")) {
+			kernel_timing_trigger(1, 707);
+		} else if (!_flag2) {
+			ws_walk(200, 153, nullptr, 714, 3);
+		} else {
+			ws_walk(200, 153, nullptr, 570, 3);
+		}
+	} else if (_flag1 && _G(player).click_x <= 300) {
+		_flag3 = player_said("EXIT") && _flag2;
+		_G(kernel).trigger_mode = KT_DAEMON;
+
+		if (inv_player_has("WOODEN LADDER") ||
+				inv_player_has("LADDER/ROPE") ||
+				inv_player_has("LADDER/GREEN VINE") ||
+				inv_player_has("LADDER/BROWN VINE") ||
+				inv_player_has("LADDER/VINES")) {
+			_G(kernel).trigger_mode = KT_DAEMON;
+			kernel_timing_trigger(1, 725);
+		} else if (inv_player_has("SHOVEL")) {
+			kernel_timing_trigger(1, 755);
+		} else if (_flag2) {
+			ws_walk(528, 168, nullptr, 558, 8);
+		} else {
+			ws_walk(528, 168, nullptr, 734, 8);
+		}
+	} else {
+		return false;
+	}
+
+	return true;
+}
+
+void Room504::conv504a() {
+	int who = conv_whos_talking();
+	int node = conv_current_node();
+	int entry = conv_current_entry();
+	const char *sound = conv_sound_to_play();
+
+	if (_G(kernel).trigger == 1) {
+		if (who <= 0)
+			_convState = 2;
+		else if (who == 1)
+			_convState2 = 1;
+
+		conv_resume();
+	} else {
+		if (who <= 0) {
+			if (node == 8 && entry == 3) {
+				_convState = 10;
+			} else if (node == 19 && entry == 2) {
+				_G(kernel).trigger_mode = KT_DAEMON;
+				kernel_timing_trigger(1, 669);
+			} else {
+				_convState = 4;
+
+				if (sound)
+					digi_play(sound, 1, 255, 1);
+				else
+					conv_resume();
+			}
+		} else if (who == 1) {
+			if ((node == 15 && entry == 0) || (node == 18 && entry == 0)) {
+				_G(kernel).trigger_mode = KT_DAEMON;
+				kernel_timing_trigger(1, 657);
+			} else {
+				_convState2 = 3;
+
+				if (sound)
+					digi_play(sound, 1, 255, 1);
+				else
+					conv_resume();
+			}
+		}
+	}
+}
+
+bool Room504::lookVines() {
+	if (_G(flags)[V152] == 2 && _G(flags)[V153] == 2 &&
+		_G(flags)[V154] == 2) {
+		digi_play("504R38", 1);
+	} else if (_G(flags)[V154] == 2 && _G(flags)[V152] == 2) {
+		digi_play("504R37", 1);
+	} else if (_G(flags)[V154] == 2 && _G(flags)[V153] == 2) {
+		digi_play("504R37", 1);
+	} else if (_G(flags)[V154] == 2) {
+		if (_G(flags)[V167]) {
+			digi_play("504R05A", 1);
+		} else {
+			digi_play("504R05", 1);
+			_G(flags)[V167] = 1;
+		}
+	} else if (_G(flags)[V152] == 2 && _G(flags)[V153] == 2) {
+		digi_play("504R42", 1);
+	} else if (_G(flags)[V152] == 2 || _G(flags)[V153] == 2) {
+		digi_play("504R41", 1);
+	} else {
+		return false;
+	}
+
+	return true;
+}
+
 } // namespace Rooms
 } // namespace Riddle
 } // namespace M4
diff --git a/engines/m4/riddle/rooms/section5/room504.h b/engines/m4/riddle/rooms/section5/room504.h
index c35ffd2cbb7..6f444ff823d 100644
--- a/engines/m4/riddle/rooms/section5/room504.h
+++ b/engines/m4/riddle/rooms/section5/room504.h
@@ -32,8 +32,11 @@ class Room504 : public Room {
 private:
 	machine *_ripley = nullptr;
 	machine *_waterfall = nullptr;
+	int _upSteps = 0;
 	int _downSteps = 0;
 	int _volume = 0;
+	int _convState = 0;
+	int _convState2 = 0;
 
 	machine *_vines1 = nullptr;
 	machine *_vines2 = nullptr;
@@ -45,9 +48,13 @@ private:
 	machine *_shovel = nullptr;
 	machine *_driftwood = nullptr;
 	machine *_pole = nullptr;
-	int _xyzzy2 = 0;
+	bool _flag1 = false;
+	bool _flag2 = false;
+	bool _flag3 = false;
+	bool _flag4 = false;
 
-	int _val1 = 0;
+	int _trigger1 = 0;
+	int _trigger2 = 0;
 
 	void setVines();
 	void freeVines();
@@ -61,6 +68,10 @@ private:
 	void addHotspot(int x1, int y1, int x2, int y2,
 		const char *verb, const char *vocab);
 	void addShovel();
+	bool checkVinesDistance();
+	bool parser1();
+	void conv504a();
+	bool lookVines();
 
 public:
 	Room504() : Room() {}




More information about the Scummvm-git-logs mailing list