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

dreammaster noreply at scummvm.org
Sun Aug 4 04:42:58 UTC 2024


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

Summary:
eca0152fd4 M4: RIDDLE: Added room 305 init
f5f5e04549 M4: RIDDLE: Room 305 pre-parser
514801c262 M4: RIDDLE: Added room 305 conv305a
f810241fa1 M4: RIDDLE: Starting room 305 parser, added camera_shift_xy


Commit: eca0152fd48d8d1b0fff3d0adc36eb133fd5c881
    https://github.com/scummvm/scummvm/commit/eca0152fd48d8d1b0fff3d0adc36eb133fd5c881
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-08-03T20:13:12-07:00

Commit Message:
M4: RIDDLE: Added room 305 init

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


diff --git a/engines/m4/riddle/flags.h b/engines/m4/riddle/flags.h
index c5827542a9e..98bcdc67668 100644
--- a/engines/m4/riddle/flags.h
+++ b/engines/m4/riddle/flags.h
@@ -108,8 +108,8 @@ enum {
 	V073 =  73,
 	V074 =  74,
 	V075 =  75,
-	V076 =  76,
-	V077 =  77,
+	kChinshiCartoon =  76,
+	kTabletsCartoon =  77,
 	V078 =  78,
 	V079 =  79,
 	V080 =  80,
@@ -163,17 +163,17 @@ enum {
 	V127 = 127,
 	V128 = 128,
 	V129 = 129,
-	V130 = 130,
+	kCastleCartoon = 130,
 	V131 = 131,
 	V132 = 132,
 	V133 = 133,
 	V134 = 134,
 	V135 = 135,
-	V136 = 136,
-	V137 = 137,
-	V138 = 138,
+	kEmeraldCartoon = 136,
+	kEpitaphCartoon = 137,
+	kGraveyardCartoon = 138,
 	V139 = 139,
-	V140 = 140,
+	kMocaMocheCartoon = 140,
 	V141 = 141,
 	V142 = 142,
 	V143 = 143,
@@ -213,7 +213,7 @@ enum {
 	V177 = 177,
 	V178 = 178,
 	V179 = 179,
-	V180 = 180,
+	kEasterIslandCartoon = 180,
 	V181 = 181,
 	V182 = 182,
 	V183 = 183,
@@ -249,7 +249,7 @@ enum {
 	V212 = 212,
 	V213 = 213,
 	V214 = 214,
-	V215 = 215,
+	kTempleCartoon = 215,
 	V216 = 216,
 	V217 = 217,
 	V218 = 218,
diff --git a/engines/m4/riddle/rooms/section3/room305.cpp b/engines/m4/riddle/rooms/section3/room305.cpp
index 519835c7baf..38ef3a181b4 100644
--- a/engines/m4/riddle/rooms/section3/room305.cpp
+++ b/engines/m4/riddle/rooms/section3/room305.cpp
@@ -22,17 +22,255 @@
 #include "m4/riddle/rooms/section3/room305.h"
 #include "m4/graphics/gr_series.h"
 #include "m4/riddle/vars.h"
+#include "m4/gui/gui_vmng.h"
 
 namespace M4 {
 namespace Riddle {
 namespace Rooms {
 
+void Room305::preload() {
+	if (_G(flags)[V000]) {
+		_G(art_base_override) = "CARTOON ROOM-TREK";
+		_G(use_alternate_attribute_file) = false;
+		_G(player).walker_type = 1;
+		_G(player).shadow_type = 1;
+	} else {
+		_G(player).walker_type = 0;
+		_G(player).shadow_type = 0;
+	}
+
+	LoadWSAssets("other script");
+}
+
 void Room305::init() {
+	hotspot_set_active("TURTLE TREATS", false);
+	digi_preload("305_s01");
+	digi_preload("305_s02");
+
+	if (_G(game).previous_room != KERNEL_RESTORING_GAME) {
+		_val1 = -1;
+		_triggerMode1 = KT_DAEMON;
+		_triggerMode2 = KT_DAEMON;
+		_val2 = 0;
+		_val3 = 0;
+		_val4 = 0;
+	}
+
+	_val5 = 0;
+	_ripMedHigh = series_load("RIP MED HIGH REACHER POS2");
+	_ripLooksDown = series_load("RIP LOOKS DOWN POS1");
+
+	if (inv_object_is_here("TURTLE"))
+		_turtle = series_show_sprite("395turtl", 0, 0xf00);
+	else
+		hotspot_set_active("TURTLE", false);
+
+	setupSign();
+
+	_shrunkenHead1 = series_load("DISPLAY CASE SHRUNKEN HEAD");
+	_incenseHolder1 = series_load("DISPLAY CASE INCENSE HOLDER");
+	_crystalSkull1 = series_load("DISPLAY CASE CRYSTAL SKULL");
+	_whaleboneHorn1 = series_load("DISPLAY CASE WHALE BONE HORN");
+	_wheeledToy1 = series_load("DISPLAY CASE WHEELED TOY");
+	_butterfly1 = series_load("DISPLAY CASE BUTTERFLY");
+	_amulet1 = series_load("DISPLAY CASE AMULET");
+	_knife1 = series_load("DISPLAY CASE YETI HANDLED KNIFE");
+	_banknote1 = series_load("DISPLAY CASE GERMAN BANKNOTE");
+	_stamp1 = series_load("DISPLAY CASE CHEAPEST STAMP");
+	_map1 = series_load("DISPLAY CASE QUARRY STICK MAP");
+	_emerald1 = series_load("DISPLAY CASE EMERALD");
+
+	if (_G(flags)[kEasterIslandCartoon]) {
+		_easterIslandCartoon = series_load("SMALL EASTER ISLAND CARTOON");
+		series_show_sprite("SMALL EASTER ISLAND CARTOON", 0, 0xfff);
+	}
+	if (_G(flags)[kChinshiCartoon]) {
+		_chinshiCartoon = series_load("SMALL CHINSHI CARTOON");
+		series_show_sprite("SMALL CHINSHI CARTOON", 0, 0xfff);
+	}
+	if (_G(flags)[kTabletsCartoon]) {
+		_tabletsCartoon = series_load("SMALL TABLETS CARTOON");
+		series_show_sprite("SMALL TABLETS CARTOON", 0, 0xfff);
+	}
+	if (_G(flags)[kEpitaphCartoon]) {
+		_epitaphCartoon = series_load("SMALL EPITAPH CARTOON");
+		series_show_sprite("SMALL EPITAPH CARTOON", 0, 0xfff);
+	}
+	if (_G(flags)[kGraveyardCartoon]) {
+		_graveyardCartoon = series_load("SMALL GRAVEYARD CARTOON");
+		series_show_sprite("SMALL GRAVEYARD CARTOON", 0, 0xfff);
+	}
+	if (_G(flags)[kCastleCartoon]) {
+		_castleCartoon = series_load("SMALL CASTLE CARTOON");
+		series_show_sprite("SMALL CASTLE CARTOON", 0, 0xfff);
+	}
+	if (_G(flags)[kMocaMocheCartoon]) {
+		_mocaMocheCartoon = series_load("SMALL MOCA MOCHE CARTOON");
+		series_show_sprite("SMALL MOCA MOCHE CARTOON", 0, 0xfff);
+	}
+	if (_G(flags)[kTempleCartoon]) {
+		_templeCartoon = series_load("SMALL TEMPLE CARTOON");
+		series_show_sprite("SMALL TEMPLE CARTOON", 0, 0xfff);
+	}
+	if (_G(flags)[kEmeraldCartoon]) {
+		_emeraldCartoon = series_load("SMALL EMERALD CARTOON");
+		series_show_sprite("SMALL EMERALD CARTOON", 0, 0xfff);
+	}
+
+	#define ITEM(FIELD, NAME, SPR_NAME) \
+		if (inv_object_is_here(NAME)) \
+			FIELD = series_show_sprite(SPR_NAME, 0, 0xfff); \
+		else \
+			hotspot_set_active(NAME, false)
+
+	ITEM(_shrunkenHead2, "SHRUNKEN HEAD", "DISPLAY CASE SHRUNKEN HEAD");
+	ITEM(_incenseHolder2, "INCENSE BURNER", "DISPLAY CASE INCENSE HOLDER");
+	ITEM(_crystalSkull2, "CRYSTAL SKULL", "DISPLAY CASE CRYSTAL SKULL");
+	ITEM(_whaleboneHorn2, "WHALE BONE HORN", "DISPLAY CASE WHALE BONE HORN");
+	ITEM(_wheeledToy2, "WHEELED TOY", "DISPLAY CASE WHEELED TOY");
+	ITEM(_butterfly2, "SILVER BUTTERFLY", "DISPLAY CASE BUTTERFLY");
+	ITEM(_amulet2, "REBUS AMULET", "DISPLAY CASE AMULET");
+	ITEM(_knife2, "CHISEL", "DISPLAY CASE YETI HANDLED KNIFE");
+	ITEM(_banknote2, "GERMAN BANKNOTE", "DISPLAY CASE GERMAN BANKNOTE");
+	ITEM(_stamp2, "POSTAGE STAMP", "DISPLAY CASE CHEAPEST STAMP");
+	ITEM(_map2, "STICK AND SHELL MAP", "DISPLAY CASE QUARRY STICK MAP");
+	ITEM(_emerald2, "ROMANOV EMERALD", "DISPLAY CASE EMERALD");
+
+	series_play(_G(flags)[V000] == 1 ? "395 jelly beans" : "jelly beans",
+		0, 0, 3, 7, 0, 100, 0, 0, 49, 61);
+	_jellyBeans = series_load("FLTD35");
+
+	if (_G(flags)[V000] == 1) {
+		if (player_been_here(201)) {
+			_feng1 = series_load("feng trek hands clasped pos5");
+			_feng2 = series_load("feng trek bow pos5");
+			_feng3 = series_load("feng trek flame loop pos5");
+		}
+
+		_rip1 = series_load("RIP TREK HANDS HIPS POS2");
+		_rip2 = series_load("RIP TREK HAND ON CHIN POS2");
+		_rip3 = series_load("RIP TREK TWO HAND TALK POS2");
+	} else {
+		_suit1 = series_load("SUIT CHIN IN HAND POS2");
+		_suit2 = series_load("RIP SUIT RT HAND GEST TALK POS2");
+		_suit3 = series_load("RIP HNDS HIPS GEST TALK");
+	}
+
+	int32 status;
+	ScreenContext *game_buff_ptr = vmng_screen_find(_G(gameDrawBuff), &status);
+
+	switch (_G(game).previous_room) {
+	case KERNEL_RESTORING_GAME:
+		if (player_been_here(201)) {
+			_stander = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 494, 278, 73, 0xf00, 1,
+				triggerMachineByHashCallbackNegative, "fl stander");
+			sendWSMessage_10000(1, _stander, _feng3, 1, 1, 400, _feng3, 1, 6, 0);
+			_val6 = _val7 = 1;
+			setShadow5(true);
+		} else {
+			hotspot_set_active("FENG LI", false);
+		}
+
+		if (_val4) {
+			ws_demand_facing(11);
+			player_update_info();
+
+			if (_G(flags)[V000]) {
+				_rip4 = series_load("RIP TREK MED REACH HAND POS1");
+				setGlobals1(_rip4, 5, 5, 5, 5, 0, 5, 1, 1, 1);
+				sendWSMessage_110000(1);
+			} else {
+				ws_hide_walker();
+				_rip4 = series_load("SUIT RIP REACHES FOR DRAWER");
+				_rip5 = series_show("ripsh1", 0xf00, 0, -1, -1, 0,
+					_G(player_info).scale, _G(player_info).x, _G(player_info).y);
+				_rip6 = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0xf00, false,
+					triggerMachineByHashCallbackNegative, "rip reach");
+				sendWSMessage_10000(1, _rip6, _rip4, 5, 5, -1, _rip4, 5, 5, 0);
+			}
+
+			hotspot_hide_all();
+			mouse_set_sprite(0);
+			hotspot_add_dynamic("LOOK AT", " ", 0, 0, 1500, 480, 0);
+
+			if (inv_object_is_here("TURTLE TREATS")) {
+				hotspot_add_dynamic("LOOK AT", "TURTLE TREATS", 1105, 208, 1175, 266, 6);
+				hotspot_add_dynamic("LOOK AT", "TURTLE TREATS", 1052, 230, 1147, 296, 6);
+			}
+
+			_openDrawer = series_show_sprite("open drawer", 0, 0);
+
+			if (inv_object_is_here("TURTLE TREATS"))
+				_openDrawerTreats = series_show_sprite("open drawer with treats", 0, 0);
+		}
+		break;
+
+	case 303:
+		player_set_commands_allowed(false);
+
+		if (player_been_here(301)) {
+			ws_demand_location(1320, 296, 9);
+
+			if (player_been_here(201)) {
+				_stander = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 494, 278, 73, 0xf00, true,
+					triggerMachineByHashCallbackNegative, "fl stander");
+				_G(kernel).trigger_mode = KT_DAEMON;
+				sendWSMessage_10000(1, _stander, _feng3, 1, 1, 400, _feng3, 1, 6, 0);
+				_val6 = _val7 = 1;
+				setShadow5(true);
+			} else {
+				hotspot_set_active("FENG LI", false);
+			}
+
+			MoveScreenDelta(game_buff_ptr, -640, 0);
+			kernel_timing_trigger(1, 10);
+		} else {
+			ws_demand_location(1320, 296, 9);
+			hotspot_set_active("FENG LI", false);
+			kernel_timing_trigger(1, 10);
+			MoveScreenDelta(game_buff_ptr, -640, 0);
+
+		}
+		break;
+
+	default:
+		ws_demand_location(1180, 320, 9);
+		hotspot_set_active("FENG LI", false);
+		break;
+	}
+
+	digi_play("305_s01", 3, 140);
 }
 
 void Room305::daemon() {
 }
 
+void Room305::setupSign() {
+	if (!inv_object_is_here("SHRUNKEN HEAD")
+			&& !inv_object_is_here("INCENSE BURNER")
+			&& !inv_object_is_here("CRYSTAL SKULL")
+			&& !inv_object_is_here("WHALE BONE HORN")
+			&& !inv_object_is_here("WHEELED TOY")
+			&& !inv_object_is_here("SILVER BUTTERFLY")
+			&& !inv_object_is_here("REBUS AMULET")
+			&& !inv_object_is_here("CHISEL")
+			&& !inv_object_is_here("ROMANOV EMERALD")
+			&& !inv_object_is_here("GERMAN BANKNOTE")
+			&& !inv_object_is_here("POSTAGE STAMP")
+			&& !inv_object_is_here("STICK AND SHELL MAP")
+			&& !inv_object_is_here("305 NEW EXHIBIT SIGN")) {
+		series_load("305 NEW EXHIBIT SIGN");
+		series_show_sprite("305 NEW EXHIBIT SIGN", 0, 0xfff);
+	}
+}
+
+void Room305::setShadow5(bool active) {
+	if (active)
+		_shadow5 = series_place_sprite("candleman shadow5", 0, 494, 278, -84, 0xe06);
+	else
+		terminateMachineAndNull(_shadow5);
+}
+
 } // 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 2e9de70afe8..ed9e9fbcd32 100644
--- a/engines/m4/riddle/rooms/section3/room305.h
+++ b/engines/m4/riddle/rooms/section3/room305.h
@@ -29,10 +29,78 @@ namespace Riddle {
 namespace Rooms {
 
 class Room305 : public Room {
+private:
+	int _val1 = 0;
+	int _val2 = 0;
+	int _val3 = 0;
+	int _val4 = 0;
+	int _val5 = 0;
+	int _val6 = 0;
+	int _val7 = 0;
+	KernelTriggerType _triggerMode1 = KT_DAEMON;
+	KernelTriggerType _triggerMode2 = KT_DAEMON;
+	int _ripMedHigh = 0;
+	int _ripLooksDown = 0;
+	machine *_turtle = nullptr;
+	int _shrunkenHead1 = 0;
+	int _incenseHolder1 = 0;
+	int _crystalSkull1 = 0;
+	int _whaleboneHorn1 = 0;
+	int _wheeledToy1 = 0;
+	int _butterfly1 = 0;
+	int _amulet1 = 0;
+	int _knife1 = 0;
+	int _banknote1 = 0;
+	int _stamp1 = 0;
+	int _map1 = 0;
+	int _emerald1 = 0;
+	machine *_shrunkenHead2 = nullptr;
+	machine *_incenseHolder2 = nullptr;
+	machine *_crystalSkull2 = nullptr;
+	machine *_whaleboneHorn2 = nullptr;
+	machine *_wheeledToy2 = nullptr;
+	machine *_butterfly2 = nullptr;
+	machine *_amulet2 = nullptr;
+	machine *_knife2 = nullptr;
+	machine *_banknote2 = nullptr;
+	machine *_stamp2 = nullptr;
+	machine *_map2 = nullptr;
+	machine *_emerald2 = nullptr;
+
+	int _easterIslandCartoon = 0;
+	int _chinshiCartoon = 0;
+	int _tabletsCartoon = 0;
+	int _epitaphCartoon = 0;
+	int _graveyardCartoon = 0;
+	int _castleCartoon = 0;
+	int _mocaMocheCartoon = 0;
+	int _templeCartoon = 0;
+	int _emeraldCartoon = 0;
+	int _jellyBeans = 0;
+	int _feng1 = 0;
+	int _feng2 = 0;
+	int _feng3 = 0;
+	int _rip1 = 0;
+	int _rip2 = 0;
+	int _rip3 = 0;
+	int _rip4 = 0;
+	int _suit1 = 0;
+	int _suit2 = 0;
+	int _suit3 = 0;
+	machine *_stander = nullptr;
+	machine *_shadow5 = nullptr;
+	machine *_rip5 = nullptr;
+	machine *_rip6 = nullptr;
+	machine *_openDrawer = nullptr;
+	machine *_openDrawerTreats = nullptr;
+	void setupSign();
+	void setShadow5(bool active);
+
 public:
 	Room305() : Room() {}
 	~Room305() override {}
 
+	void preload() override;
 	void init() override;
 	void daemon() override;
 };


Commit: f5f5e04549ed8705592a34b2550920d910fac412
    https://github.com/scummvm/scummvm/commit/f5f5e04549ed8705592a34b2550920d910fac412
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-08-03T20:13:12-07:00

Commit Message:
M4: RIDDLE: Room 305 pre-parser

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


diff --git a/engines/m4/riddle/rooms/section3/room304.cpp b/engines/m4/riddle/rooms/section3/room304.cpp
index aea8bcf1741..ef0a8099d8d 100644
--- a/engines/m4/riddle/rooms/section3/room304.cpp
+++ b/engines/m4/riddle/rooms/section3/room304.cpp
@@ -392,6 +392,8 @@ void Room304::parser() {
 	} else {
 		return;
 	}
+
+	_G(player).command_ready = false;
 }
 
 void Room304::intrMsg(frac16 myMessage, struct machine *sender) {
diff --git a/engines/m4/riddle/rooms/section3/room305.cpp b/engines/m4/riddle/rooms/section3/room305.cpp
index 38ef3a181b4..d24e373df32 100644
--- a/engines/m4/riddle/rooms/section3/room305.cpp
+++ b/engines/m4/riddle/rooms/section3/room305.cpp
@@ -245,6 +245,53 @@ void Room305::init() {
 void Room305::daemon() {
 }
 
+void Room305::pre_parser() {
+	bool lookFlag = player_said_any("look", "look at");
+	bool takeFlag = player_said("take");
+
+	if (_val4 && !(takeFlag && player_said("turtle treats"))
+			&& !(lookFlag && player_said("turtle treats"))) {
+		player_set_commands_allowed(false);
+		Common::strcpy_s(_G(player).verb, "close");
+		Common::strcpy_s(_G(player).noun, "drawer");
+		_G(player).need_to_walk = false;
+		_G(player).ready_to_walk = true;
+		_G(player).waiting_for_walk = false;
+	}
+
+#define SAID(NAME) (player_said(NAME) && inv_player_has(NAME))
+	if (SAID("SHRUNKEN HEAD") || SAID("INCENSE BURNER") ||
+			SAID("CRYSTAL SKULL") || SAID("CRYSTAL SKULL)") ||
+			SAID("WHALE BONE HORN") || SAID("WHEELED TOY") ||
+			SAID("CHISEL") || SAID("ROMANOV EMERALD") ||
+			SAID("GERMAN BANKNOTE") || SAID("REBUS AMULET") ||
+			SAID("SILVER BUTTERFLY") || SAID("POSTAGE STAMP") ||
+			SAID("STICK AND SHELL MAP")) {
+		if (player_said("DISPLAY CASE")) {
+			_G(player).need_to_walk = false;
+			_G(player).ready_to_walk = true;
+			_G(player).waiting_for_walk = false;
+		}
+	}
+
+	if (lookFlag && player_said("cartoon"))
+		_G(camera_reacts_to_player) = false;
+
+	if (_val5) {
+		_G(camera_reacts_to_player) = true;
+		terminateMachineAndNull(_machine1);
+		terminateMachineAndNull(_machine2);
+		intr_cancel_sentence();
+		_val5 = 0;
+		hotspot_restore_all();
+		interface_show();
+	}
+}
+
+void Room305::parser() {
+
+}
+
 void Room305::setupSign() {
 	if (!inv_object_is_here("SHRUNKEN HEAD")
 			&& !inv_object_is_here("INCENSE BURNER")
diff --git a/engines/m4/riddle/rooms/section3/room305.h b/engines/m4/riddle/rooms/section3/room305.h
index ed9e9fbcd32..ce9ebd3f752 100644
--- a/engines/m4/riddle/rooms/section3/room305.h
+++ b/engines/m4/riddle/rooms/section3/room305.h
@@ -93,6 +93,9 @@ private:
 	machine *_rip6 = nullptr;
 	machine *_openDrawer = nullptr;
 	machine *_openDrawerTreats = nullptr;
+	machine *_machine1 = nullptr;
+	machine *_machine2 = nullptr;
+
 	void setupSign();
 	void setShadow5(bool active);
 
@@ -103,6 +106,8 @@ public:
 	void preload() override;
 	void init() override;
 	void daemon() override;
+	void pre_parser() override;
+	void parser() override;
 };
 
 } // namespace Rooms


Commit: 514801c2624ae979041cfc6919633bcc8f7b41ee
    https://github.com/scummvm/scummvm/commit/514801c2624ae979041cfc6919633bcc8f7b41ee
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-08-03T20:29:38-07:00

Commit Message:
M4: RIDDLE: Added room 305 conv305a

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 d24e373df32..4bf8d4569ce 100644
--- a/engines/m4/riddle/rooms/section3/room305.cpp
+++ b/engines/m4/riddle/rooms/section3/room305.cpp
@@ -289,7 +289,19 @@ void Room305::pre_parser() {
 }
 
 void Room305::parser() {
+	bool lookFlag = player_said_any("look", "look at");
+	bool takeFlag = player_said("take");
+	bool useFlag = player_said_any("push", "pull", "gear", "open", "close");
+
+	if (player_said("conv305a")) {
+		conv305a();
+	}
+	// TODO
+	else {
+		return;
+	}
 
+	_G(player).command_ready = false;
 }
 
 void Room305::setupSign() {
@@ -318,6 +330,50 @@ void Room305::setShadow5(bool active) {
 		terminateMachineAndNull(_shadow5);
 }
 
+void Room305::conv305a() {
+	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) {
+			_val7 = 1;
+		} else if (_G(kernel).trigger == 1) {
+			if (node != 1 || (entry != 0 && entry != 3 && entry != 5
+				&& entry != 6 && entry != 7))
+				_conv1 = 0;
+		}
+
+		conv_resume();
+
+	} else if (!sound) {
+		conv_resume();
+
+	} else {
+		if (who <= 0) {
+			_val7 = 2;
+		} else if (who == 1) {
+			if ((node == 1 && entry == 0) || (node == 1 && entry == 6) ||
+					(node == 1 && entry == 7)) {
+				_conv1 = 5;
+			} else if (node == 1 && (entry == 3 || entry == 5)) {
+				_conv1 = 3;
+			} else if ((node == 7 && entry == 0) || (node == 8 && entry == 0) ||
+					(node == 9 && entry == 0) || (node == 10 && entry == 0) ||
+					(node == 12 && entry == 0)) {
+				_conv1 = 0;
+			} else if (node == 1 && entry == 1) {
+				_G(flags)[V089] = 2;
+			} else {
+				_conv1 = 1;
+			}
+		}
+
+		digi_play(sound, 1, 255, 1);
+	}
+}
+
 } // 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 ce9ebd3f752..0c3c7428b70 100644
--- a/engines/m4/riddle/rooms/section3/room305.h
+++ b/engines/m4/riddle/rooms/section3/room305.h
@@ -87,6 +87,7 @@ private:
 	int _suit1 = 0;
 	int _suit2 = 0;
 	int _suit3 = 0;
+	int _conv1 = 0;
 	machine *_stander = nullptr;
 	machine *_shadow5 = nullptr;
 	machine *_rip5 = nullptr;
@@ -98,6 +99,7 @@ private:
 
 	void setupSign();
 	void setShadow5(bool active);
+	void conv305a();
 
 public:
 	Room305() : Room() {}


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

Commit Message:
M4: RIDDLE: Starting room 305 parser, added camera_shift_xy

Changed paths:
    engines/m4/adv_r/adv_control.cpp
    engines/m4/adv_r/adv_control.h
    engines/m4/core/rooms.cpp
    engines/m4/core/rooms.h
    engines/m4/riddle/rooms/room.cpp
    engines/m4/riddle/rooms/room.h
    engines/m4/riddle/rooms/section3/room305.cpp
    engines/m4/riddle/rooms/section3/room305.h


diff --git a/engines/m4/adv_r/adv_control.cpp b/engines/m4/adv_r/adv_control.cpp
index c835ab782ec..f1e7e5835e2 100644
--- a/engines/m4/adv_r/adv_control.cpp
+++ b/engines/m4/adv_r/adv_control.cpp
@@ -28,6 +28,7 @@
 #include "m4/mem/memman.h"
 #include "m4/wscript/ws_machine.h"
 #include "m4/vars.h"
+#include "m4/m4.h"
 
 namespace M4 {
 
diff --git a/engines/m4/adv_r/adv_control.h b/engines/m4/adv_r/adv_control.h
index a2beb04b15e..570dd628e00 100644
--- a/engines/m4/adv_r/adv_control.h
+++ b/engines/m4/adv_r/adv_control.h
@@ -28,13 +28,13 @@
 
 namespace M4 {
 
-bool kernel_section_startup();
-void player_set_commands_allowed(bool t_or_f);
-void game_pause(bool flag);
-bool this_is_a_walkcode(int32 x, int32 y);
-int32 get_screen_depth(int32 x, int32 y);
-int32 get_screen_color(int32 x, int32 y);
-void update_mouse_pos_dialog();
+extern bool kernel_section_startup();
+extern void player_set_commands_allowed(bool t_or_f);
+extern void game_pause(bool flag);
+extern bool this_is_a_walkcode(int32 x, int32 y);
+extern int32 get_screen_depth(int32 x, int32 y);
+extern int32 get_screen_color(int32 x, int32 y);
+extern void update_mouse_pos_dialog();
 
 } // End of namespace M4
 
diff --git a/engines/m4/core/rooms.cpp b/engines/m4/core/rooms.cpp
index 0b58db3a8e5..65b8a58007e 100644
--- a/engines/m4/core/rooms.cpp
+++ b/engines/m4/core/rooms.cpp
@@ -444,6 +444,15 @@ void Sections::pal_game_task() {
 		update_mouse_pos_dialog();
 }
 
+void Sections::camera_shift_xy(int32 x, int32 y) {
+	int32 status;
+	ScreenContext *sc = vmng_screen_find(_G(gameDrawBuff), &status);
+	assert(sc);
+
+	_cameraShiftAmount = -sc->x1 - x + _G(kernel).letter_box_x;
+	_cameraShift_vert_Amount = -sc->y1 - y + _G(kernel).letter_box_y;
+}
+
 /*------------------------------------------------------------------------*/
 
 Room *Section::operator[](uint roomNum) {
diff --git a/engines/m4/core/rooms.h b/engines/m4/core/rooms.h
index 7922ac3e851..6e70cbec572 100644
--- a/engines/m4/core/rooms.h
+++ b/engines/m4/core/rooms.h
@@ -158,6 +158,7 @@ public:
 	void m4EndScene();
 
 	void pal_game_task();
+	void camera_shift_xy(int32 x, int32 y);
 
 	virtual void global_daemon() = 0;
 	virtual void global_pre_parser() = 0;
diff --git a/engines/m4/riddle/rooms/room.cpp b/engines/m4/riddle/rooms/room.cpp
index 1a710e6dfbe..6b5f85fd033 100644
--- a/engines/m4/riddle/rooms/room.cpp
+++ b/engines/m4/riddle/rooms/room.cpp
@@ -369,6 +369,23 @@ void Room::sendWSMessage_1a0000(machine *recv, int trigger) {
 	sendWSMessage(0x1a0000, 0, recv, 0, nullptr, 1);
 }
 
+int Room::getNumKeyItemsPlaced() const {
+	static const char *const ITEMS[11] = {
+		"SHRUNKEN HEAD", "INCENSE BURNER", "CRYSTAL SKULL",
+		"WHALE BONE HORN", "WHEELED TOY", "SILVER BUTTERFLY",
+		"REBUS AMULET", "CHISEL", "GERMAN BANKNOTE",
+		"POSTAGE STAMP", "STICK AND SHELL MAP"
+	};
+
+	int total = 0;
+	for (int i = 0; i < 11; ++i) {
+		if (inv_object_in_scene(ITEMS[i], 305))
+			++total;
+	}
+
+	return total;
+}
+
 } // namespace Rooms
 } // namespace Riddle
 } // namespace M4
diff --git a/engines/m4/riddle/rooms/room.h b/engines/m4/riddle/rooms/room.h
index 3ce83c8f316..4926f29af63 100644
--- a/engines/m4/riddle/rooms/room.h
+++ b/engines/m4/riddle/rooms/room.h
@@ -94,6 +94,11 @@ protected:
 	void sendWSMessage_190000(machine *recv, int trigger);
 	void sendWSMessage_1a0000(machine *recv, int trigger);
 
+	/**
+	 * Get the number of key items placed in room 305 (display room)
+	 */
+	int getNumKeyItemsPlaced() const;
+
 public:
 	Room() : M4::Room() {}
 	~Room() override {}
diff --git a/engines/m4/riddle/rooms/section3/room305.cpp b/engines/m4/riddle/rooms/section3/room305.cpp
index 4bf8d4569ce..6a93692851f 100644
--- a/engines/m4/riddle/rooms/section3/room305.cpp
+++ b/engines/m4/riddle/rooms/section3/room305.cpp
@@ -21,6 +21,7 @@
 
 #include "m4/riddle/rooms/section3/room305.h"
 #include "m4/graphics/gr_series.h"
+#include "m4/riddle/riddle.h"
 #include "m4/riddle/vars.h"
 #include "m4/gui/gui_vmng.h"
 
@@ -135,6 +136,7 @@ void Room305::init() {
 	ITEM(_stamp2, "POSTAGE STAMP", "DISPLAY CASE CHEAPEST STAMP");
 	ITEM(_map2, "STICK AND SHELL MAP", "DISPLAY CASE QUARRY STICK MAP");
 	ITEM(_emerald2, "ROMANOV EMERALD", "DISPLAY CASE EMERALD");
+	#undef ITEM
 
 	series_play(_G(flags)[V000] == 1 ? "395 jelly beans" : "jelly beans",
 		0, 0, 3, 7, 0, 100, 0, 0, 49, 61);
@@ -259,7 +261,7 @@ void Room305::pre_parser() {
 		_G(player).waiting_for_walk = false;
 	}
 
-#define SAID(NAME) (player_said(NAME) && inv_player_has(NAME))
+	#define SAID(NAME) (player_said(NAME) && inv_player_has(NAME))
 	if (SAID("SHRUNKEN HEAD") || SAID("INCENSE BURNER") ||
 			SAID("CRYSTAL SKULL") || SAID("CRYSTAL SKULL)") ||
 			SAID("WHALE BONE HORN") || SAID("WHEELED TOY") ||
@@ -273,6 +275,7 @@ void Room305::pre_parser() {
 			_G(player).waiting_for_walk = false;
 		}
 	}
+	#undef SAID
 
 	if (lookFlag && player_said("cartoon"))
 		_G(camera_reacts_to_player) = false;
@@ -295,6 +298,49 @@ void Room305::parser() {
 
 	if (player_said("conv305a")) {
 		conv305a();
+	} else if (player_said("TALK FL")) {
+		g_engine->camera_shift_xy(160, 0);
+		player_update_info();
+		ws_hide_walker();
+
+		_rip6 = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
+			_G(player_info).x, _G(player_info).y, _G(player_info).scale + 1,
+			0x500, 0, triggerMachineByHashCallbackNegative, "rip");
+		_G(kernel).trigger_mode = KT_DAEMON;
+		sendWSMessage_10000(1, _rip6, 1, 1, 1,
+			_G(flags)[V000] == 1 ? 200 : 300,
+			1, 1, 1, 0);
+
+		_val8 = 0;
+		_conv1 = 0;
+		_G(kernel).trigger_mode = KT_PARSE;
+		player_set_commands_allowed(false);
+
+		_rip5 = series_show("safari shadow 2", 0xf00, 0, -1, -1, 0,
+			_G(player_info).scale, _G(player_info).x, _G(player_info).y);
+		conv_load("conv305a", 10, 10, 747);
+		conv_export_value_curr(_G(flags)[V088], 0);
+		conv_export_value_curr(_G(flags)[V089], 1);
+		conv_export_value_curr(
+			getNumKeyItemsPlaced() != 0 || inv_object_is_here("ROMANOV EMERALD") ? 1 : 0,
+			2);
+		conv_export_value_curr(inv_object_in_scene("TURTLE", 305) ? 1 : 0, 3);
+
+		if (_G(flags)[V090] == 0 || inv_player_has("ROMANOV EMERALD") ||
+			inv_object_is_here("ROMANOV EMERALD")) {
+			conv_export_value_curr(0, 7);
+		} else if (_G(flags)[V090] == 1) {
+			conv_export_value_curr(1, 7);
+		} else if (_G(flags)[V090] == 2) {
+			conv_export_value_curr(2, 7);
+		} else if (_G(flags)[V090] == 3) {
+			conv_export_value_curr(2, 7);
+		}
+
+		conv_export_value_curr(_G(flags)[V141], 8);
+		conv_play();
+		_val7 = 1;
+		_conv1 = 0;
 	}
 	// TODO
 	else {
diff --git a/engines/m4/riddle/rooms/section3/room305.h b/engines/m4/riddle/rooms/section3/room305.h
index 0c3c7428b70..b48420ea741 100644
--- a/engines/m4/riddle/rooms/section3/room305.h
+++ b/engines/m4/riddle/rooms/section3/room305.h
@@ -37,6 +37,7 @@ private:
 	int _val5 = 0;
 	int _val6 = 0;
 	int _val7 = 0;
+	int _val8 = 0;
 	KernelTriggerType _triggerMode1 = KT_DAEMON;
 	KernelTriggerType _triggerMode2 = KT_DAEMON;
 	int _ripMedHigh = 0;




More information about the Scummvm-git-logs mailing list