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

dreammaster noreply at scummvm.org
Mon Aug 5 05:32: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:
f48d25fc9e M4: RIDDLE: More room 305 parser and support methods


Commit: f48d25fc9e465834ade7946a3c90870ec122fc5f
    https://github.com/scummvm/scummvm/commit/f48d25fc9e465834ade7946a3c90870ec122fc5f
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-08-04T22:31:57-07:00

Commit Message:
M4: RIDDLE: More room 305 parser and support methods

The code is a tangled mess that I've been trying to
clean up and simply implement. Unfortunately, it does
mean that I've had to use a few unavoidable gotos

Changed paths:
    engines/m4/riddle/rooms/section3/room305.cpp
    engines/m4/riddle/rooms/section3/room305.h


diff --git a/engines/m4/riddle/rooms/section3/room305.cpp b/engines/m4/riddle/rooms/section3/room305.cpp
index 6f00a6dbc8d..e9f3e10693d 100644
--- a/engines/m4/riddle/rooms/section3/room305.cpp
+++ b/engines/m4/riddle/rooms/section3/room305.cpp
@@ -282,8 +282,8 @@ void Room305::pre_parser() {
 
 	if (_val5) {
 		_G(camera_reacts_to_player) = true;
-		terminateMachineAndNull(_machine1);
-		terminateMachineAndNull(_machine2);
+		terminateMachineAndNull(_cartoonMach);
+		series_unload(_cartoon);
 		intr_cancel_sentence();
 		_val5 = 0;
 		hotspot_restore_all();
@@ -669,6 +669,218 @@ next3:
 	goto exit;
 
 next4:
+	if (player_said("TURTLE", "FENG LI")) {
+		digi_play("305r40", 1);
+	} else if (inv_player_has(_G(player).verb) && player_said("FENG LI")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			player_set_commands_allowed(false);
+			digi_play("305f08a", 1, 255, 1);
+			break;
+
+		case 1:
+			player_set_commands_allowed(true);
+			_val7 = 1;
+			break;
+
+		default:
+			break;
+		}
+	} else if (lookFlag && player_said("cartoon") && _G(kernel).trigger >= -1
+			&& _G(kernel).trigger <= 5) {
+		switch (_G(kernel).trigger) {
+		case -1:
+		case 1: {
+			player_set_commands_allowed(true);
+			int area = getXAreaNum();
+			const int32 flags[8] = {
+				_G(flags)[kEasterIslandCartoon], _G(flags)[kChinshiCartoon],
+				_G(flags)[kTabletsCartoon], _G(flags)[kEpitaphCartoon],
+				_G(flags)[kGraveyardCartoon], _G(flags)[kCastleCartoon],
+				_G(flags)[kMocaMocheCartoon], _G(flags)[kTempleCartoon]
+			};
+			bool flag = flags[area - 1] != 0;
+			if (flag && (area == 3 || area == 9))
+				player_set_commands_allowed(true);
+
+			interface_hide();
+			hotspot_hide_all();
+			mouse_set_sprite(0);
+			hotspot_add_dynamic("LOOK AT", " ", 0, 0, 1500, 480, 0);
+
+			Common::String digiName;
+			if (flag) {
+				_G(flags)[V089] = 2;
+				_cartoon = series_load(getXAreaCartoon(), -1, _G(master_palette));
+				_cartoonMach = series_place_sprite(getXAreaCartoon(),
+					0, getItemX(_cartoon), getItemY(_cartoon),
+					100, 0x100);
+				digiName = getXAreaDigi();
+
+			} else {
+				_cartoon = series_load(getXAreaSeries(), -1, _G(master_palette));
+				_cartoonMach = series_place_sprite(getXAreaSeries(), 0,
+					getItemX(_cartoon), getItemY(_cartoon), 100, 0x100);
+				digiName = getXAreaDigi2();
+			}
+
+			if (getXAreaNum() == 3 && caseFlag) {
+				digi_play("305r23", 1, 255, 2);
+			} else if (getXAreaNum() == 9 && caseFlag) {
+				digi_play("305r29", 1, 255, 3);
+			} else {
+				digi_play(digiName.c_str(), 1);
+			}
+
+			_val5 = 1;
+			break;
+		}
+
+		case 2:
+			digi_play("305r23a", 1);
+			player_set_commands_allowed(true);
+			break;
+
+		case 3:
+			if (_G(flags)[V141]) {
+				digi_play("305r29a", 1, 255, 4);
+			} else {
+				digi_play("305r29a", 1);
+			}
+			break;
+
+		case 4:
+			digi_play("305r29a", 1);
+			break;
+
+		default:
+			break;
+		}
+	} else if (lookFlag && player_said("mona lisa")) {
+		if (_G(flags)[V086] == 2) {
+			_G(flags)[V086] = 3;
+		} else if (_G(flags)[V086] == 1) {
+			_G(flags)[V086] = 0;
+		}
+
+		switch (_G(kernel).trigger) {
+		case -1:
+		case 666:
+			player_set_commands_allowed(false);
+			if (_G(flags)[V000] == 1)
+				setGlobals4(_rip2, 16, 16, 16);
+			else
+				setGlobals4(_suit1, 17, 17, 17);
+
+			sendWSMessage_C0000(0);
+
+			if (_G(flags)[V087]) {
+				digi_play("305r31", 1, 255, 2);
+			} else if (_G(flags)[V083]) {
+				digi_play("305r11", 1, 255, 2);
+			} else {
+				digi_play("305r10", 1, 255, 2);
+			}
+
+			_G(flags)[V087] = 1;
+			break;
+
+		case 2:
+			sendWSMessage_B0000(3);
+			break;
+
+		case 3:
+			player_set_commands_allowed(true);
+			break;
+
+		default:
+			break;
+		}
+	} else if (lookFlag && player_said("hourglass")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+		case 666:
+			player_set_commands_allowed(false);
+
+			if (_G(flags)[V000] == 1) {
+				_lookUp = series_load("rip looks up pos3");
+				setGlobals4(_lookUp, 6, 6, 6);
+			} else {
+				_lookUp = series_load("rpsd103");
+				setGlobals4(_lookUp, 7, 7, 7);
+			}
+
+			sendWSMessage_C0000(0);
+			digi_play("305r13", 1, 255, 2);
+			break;
+
+		case 2:
+			sendWSMessage_B0000(3);
+			break;
+
+		case 3:
+			series_unload(_lookUp);
+			break;
+
+		default:
+			break;
+		}
+	} else if (lookFlag && player_said("display case")) {
+		switch (_G(kernel).trigger) {
+		case -1:
+			if (_G(flags)[V000]) {
+				if (getNumKeyItemsPlaced() != 0 || inv_object_is_here("ROMANOV EMERALD")) {
+					digi_play("305r32", 1);
+				} else if (player_been_here(201)) {
+					digi_play("305f03", 1, 255, 1);
+					_val7 = 2;
+					player_set_commands_allowed(false);
+				} else {
+					digi_play("305r15", 1);
+				}
+			} else {
+				digi_play("305r15", 1);
+			}
+			break;
+
+		case 1:
+			player_set_commands_allowed(true);
+			_val7 = 1;
+			break;
+
+		default:
+			break;
+		}
+	} else if (lookFlag && player_said("terrarium")) {
+		if (inv_player_has("TURTLE")) {
+			digi_play("305r16a", 1);
+		} else if (_G(flags)[GLB_TEMP_12]) {
+			digi_play("305r16b", 1);
+		} else if (inv_object_is_here("TURTLE")) {
+			digi_play("305r16c", 1);
+		} else if (_G(flags)[V085]) {
+			digi_play("305r16b", 1);
+		} else {
+			_G(flags)[V085] = 1;
+			digi_play("305r16", 1);
+		}
+	} else if (lookFlag && player_said("turtle") &&
+			inv_object_is_here("turtle")) {
+		if (_G(flags)[V085]) {
+			digi_play("305r16b", 1);
+		} else {
+			_G(flags)[V085] = 1;
+			digi_play("305r16", 1);
+		}
+	} else if (lookFlag && player_said("turtle treats") &&
+			inv_object_is_here("TURTLE TREATS")) {
+		digi_play("305r18", 1);
+	} else if (lookFlag && player_said("drawer")) {
+		digi_play("305r17", 1);
+	} else if (lookFlag && player_said("button display case")) {
+		// TODO
+	}
+
 	// TODO
 exit:
 	_G(player).command_ready = false;
@@ -773,6 +985,86 @@ bool Room305::walkToObject() {
 	return false;
 }
 
+int Room305::getXAreaNum() const {
+	int x = _G(player).click_x;
+
+	if (x < 300)
+		return 1;
+	if (x < 380)
+		return 2;
+	if (x < 580)
+		return 3;
+	if (x < 670)
+		return 4;
+	if (x < 760)
+		return 5;
+	if (x < 860)
+		return 6;
+	if (x < 1040)
+		return 7;
+	if (x < 1140)
+		return 8;
+	return 9;
+}
+
+const char *Room305::getXAreaCartoon() const {
+	static const char *CARTOONS[9] = {
+		"395 easter island cartoon",
+		"395 chin shih huang ti cartoon",
+		"395 tablets of history cartoon",
+		"395 epitaph a cartoon",
+		"395 epitaph b cartoon",
+		"395 castle cartoon",
+		"395 moca moche cartoon",
+		"395 temple cartoon",
+		"395 romanov emerald cartoon"
+	};
+	return CARTOONS[getXAreaNum() - 1];
+}
+
+const char *Room305::getXAreaSeries() const {
+	if (_G(flags)[V000]) {
+		static const char *NAMES[9] = {
+			"395car01", "395car08", "395car03", "395car06",
+			"395car05", "395car04", "395car07", "395car02",
+			"395car09"
+		};
+		return NAMES[getXAreaNum() - 1];
+
+	} else {
+		static const char *NAMES[9] = {
+			"jack dempsey", "parrot", "kerosene",
+			"chimney tree", "prof bingo", "blind men",
+			"lemon", "hollow log", "restaurant"
+		};
+		return NAMES[getXAreaNum() - 1];
+	}
+}
+
+Common::String Room305::getXAreaDigi() const {
+	return Common::String::format("305r%d", getXAreaNum() + 20);
+}
+
+Common::String Room305::getXAreaDigi2() const {
+	static const int NUMS[9] = { 5, 1, 4, 3, 8, 7, 2, 9, 6 };
+	return Common::String::format("305r0%d", NUMS[getXAreaNum() - 1]);
+}
+
+int Room305::getItemX(int seriesHash) const {
+	int w = ws_get_sprite_width(seriesHash, 0);
+	int result = (640 - w) / 2;
+
+	int sx1 = _G(game_buff_ptr)->x1;
+	result += imath_abs(sx1);
+
+	return result;
+}
+
+int Room305::getItemY(int seriesHash) const {
+	int h = ws_get_sprite_height(seriesHash, 0);
+	return (374 - h) / 2;
+}
+
 } // namespace Rooms
 } // namespace Riddle
 } // namespace M4
diff --git a/engines/m4/riddle/rooms/section3/room305.h b/engines/m4/riddle/rooms/section3/room305.h
index f60fe6c8059..6c16f562b6e 100644
--- a/engines/m4/riddle/rooms/section3/room305.h
+++ b/engines/m4/riddle/rooms/section3/room305.h
@@ -95,13 +95,21 @@ private:
 	machine *_rip6 = nullptr;
 	machine *_openDrawer = nullptr;
 	machine *_openDrawerTreats = nullptr;
-	machine *_machine1 = nullptr;
-	machine *_machine2 = nullptr;
+	machine *_cartoonMach = nullptr;
+	int _cartoon = 0;
+	int _lookUp = 0;
 
 	void setupSign();
 	void setShadow5(bool active);
 	void conv305a();
 	bool walkToObject();
+	int getXAreaNum() const;
+	const char *getXAreaCartoon() const;
+	const char *getXAreaSeries() const;
+	Common::String getXAreaDigi() const;
+	Common::String getXAreaDigi2() const;
+	int getItemX(int seriesHash) const;
+	int getItemY(int seriesHash) const;
 
 public:
 	Room305() : Room() {}




More information about the Scummvm-git-logs mailing list