[Scummvm-git-logs] scummvm master -> 22f63e36f0e6d3b574c541babad43f064b33f5e7
dreammaster
noreply at scummvm.org
Tue Aug 20 02:18:34 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:
22f63e36f0 M4: RIDDLE: Further room 406 parser
Commit: 22f63e36f0e6d3b574c541babad43f064b33f5e7
https://github.com/scummvm/scummvm/commit/22f63e36f0e6d3b574c541babad43f064b33f5e7
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-08-19T19:18:26-07:00
Commit Message:
M4: RIDDLE: Further room 406 parser
Changed paths:
engines/m4/riddle/rooms/section4/room406.cpp
engines/m4/riddle/rooms/section4/room406.h
diff --git a/engines/m4/riddle/rooms/section4/room406.cpp b/engines/m4/riddle/rooms/section4/room406.cpp
index 57dd0f9cc25..476c5c2e3cd 100644
--- a/engines/m4/riddle/rooms/section4/room406.cpp
+++ b/engines/m4/riddle/rooms/section4/room406.cpp
@@ -27,6 +27,25 @@ namespace M4 {
namespace Riddle {
namespace Rooms {
+static const char *const SAID[][2] = {
+ { "DART BOARD", "406r03" },
+ { "MESSAGES", "406r14" },
+ { "PAINTING", "456r01" },
+ { "OVERHANGING LAMP", "406r04" },
+ { "GAMES CABINET", "406r06" },
+ { "GAMES CABINET DRAWER", "406r47" },
+ { "BROKEN MIRROR", "406r43" },
+ { "WRITING DESK", "406r09a" },
+ { "WRITING DESK DRAWER", "406r21" },
+ { "DESK DRAWER OPEN", "406r09a" },
+ { "WRITING DESK ", "406r09" },
+ { "LAMP", "406r11" },
+ { "TABLE", "406r11" },
+ { "CHAIR", "406r12" },
+ { "PAINTING ", "406r13" },
+ { nullptr, nullptr }
+};
+
void Room406::preload() {
_G(player).walker_type = 1;
_G(player).shadow_type = 1;
@@ -259,7 +278,7 @@ void Room406::pre_parser() {
_G(player).resetWalk();
}
}
-
+#define LOOK(ITEM) (lookFlag && player_said(ITEM) && inv_object_is_here(ITEM))
void Room406::parser() {
bool lookFlag = player_said_any("look", "look at");
bool takeFlag = player_said("take");
@@ -275,6 +294,201 @@ void Room406::parser() {
digi_play("406r24", 1);
} else if (takeFlag && player_said("BILLIARD BALL") && takeBilliardBall()) {
// No implementation
+ } else if (player_said("BILLIARD BALL", "BILLIARD TABLE") && billiardBallOnTable()) {
+ // No implementation
+ } else if (lookFlag && player_said_any("BILLIARD TABLE", "BILLIARD TABLE ")) {
+ if (!_G(flags)[V030])
+ digi_play("406r41", 1);
+ else if (!_G(flags)[V321])
+ digi_play("406r02", 1);
+ else
+ digi_play("406r28", 1);
+ } else if (lookFlag && player_said("CUE CABINET")) {
+ if (_G(flags)[V030])
+ digi_play("406r42", 1);
+ else if (_G(flags)[V321])
+ digi_play("406r29", 1);
+ else
+ digi_play("406r05", 1);
+ } else if (lookFlag && player_said("BALL RACK")) {
+ if (_G(flags)[V030])
+ digi_play("406r42", 1);
+ else if (_G(flags)[V321])
+ digi_play("406r29", 1);
+ else
+ digi_play("406r49", 1);
+ } else if (lookFlag && player_said("GAMES CABINET ")) {
+ switch (_G(kernel).trigger) {
+ case -1:
+ digi_play("406r25", 1);
+ if (!_G(flags)[V317]) {
+ player_set_commands_allowed(false);
+ _G(flags)[V317] = 1;
+ }
+ break;
+ case 2:
+ digi_play("406r25a", 1, 255, 3);
+ break;
+ case 3:
+ player_set_commands_allowed(true);
+ break;
+ default:
+ break;
+ }
+ } else if (lookFlag && player_said("CABINET DRAWER OPEN")) {
+ switch (_G(kernel).trigger) {
+ case -1:
+ player_set_commands_allowed(false);
+ if (_G(flags)[V311])
+ digi_play("406r23", 1, 255, 2);
+ else
+ digi_play("406r23", 1, 255, 3);
+ break;
+ case 2:
+ digi_play("406r23a", 1, 255, 3);
+ break;
+ case 3:
+ player_set_commands_allowed(true);
+ break;
+ default:
+ break;
+ }
+ } else if (lookFlag && player_said("MIRROR")) {
+ switch (_G(kernel).trigger) {
+ case -1:
+ player_set_commands_allowed(false);
+ digi_preload("406_s13");
+ _G(flags)[V316] = 1;
+ _lookMirror = series_load("406 RIP LOOKS MIRROR");
+ ws_hide_walker();
+ _ripAction = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x700, 0,
+ triggerMachineByHashCallbackAlways, "rip looks at mirror");
+ sendWSMessage_10000(1, _ripAction, _lookMirror, 1, 17, 2,
+ _lookMirror, 17, 17, 0);
+ break;
+
+ case 1:
+ kernel_timing_trigger(10, 2);
+ break;
+
+ case 2:
+ _mirror = series_place_sprite("CRACKED MIRROR IN BILLIARD RM",
+ 0, 0, 0, 100, 0xf00);
+ digi_play("406_s13", 2, 255, 3);
+ break;
+
+ case 3:
+ digi_play("406r07", 1);
+ kernel_timing_trigger(40, 4);
+ break;
+
+ case 4:
+ sendWSMessage_10000(1, _ripAction, _lookMirror, 17, 1, 5,
+ _lookMirror, 1, 1, 0);
+ break;
+
+ case 5:
+ terminateMachineAndNull(_ripAction);
+ series_unload(_lookMirror);
+ ws_unhide_walker();
+ digi_play("406r07A", 1, 255, 6);
+ break;
+
+ case 6:
+ hotspot_set_active("BROKEN MIRROR", true);
+ hotspot_set_active("MIRROR", false);
+ player_set_commands_allowed(true);
+ break;
+
+ default:
+ break;
+ }
+ } else if (lookFlag && player_said("ACE OF SPADES")) {
+ _G(flags)[V311] = 1;
+ digi_play(_G(flags)[V030] ? "406r44" : "406r08", 1);
+ } else if (lookFlag && player_said_any("SWITCH", "ACE OF SPADES ")) {
+ digi_play(player_been_here(456) ? "406r44" : "456r03", 1);
+ } else if (LOOK("BILLIARD BALL")) {
+ digi_play("406r10", 1);
+ } else if (lookFlag && _G(walker).ripley_said(SAID)) {
+ // No implementation
+ } else if (LOOK("ENVELOPE")) {
+ digi_play("406r15", 1);
+ } else if (LOOK("KEYS")) {
+ digi_play("406r16", 1);
+ } else if (lookFlag && player_said("MESSAGE")) {
+ switch (_G(kernel).trigger) {
+ case -1:
+ player_set_commands_allowed(false);
+ digi_play("406r18", 1, 255, 2);
+ break;
+ case 2:
+ digi_play("406r18a", 1, 255, 3);
+ break;
+ case 3:
+ digi_play("406r18b", 1, 255, 4);
+ break;
+ case 4:
+ digi_play("406r18c", 1, 255, 5);
+ break;
+ case 5:
+ player_set_commands_allowed(true);
+ break;
+ default:
+ break;
+ }
+ } else if (lookFlag && player_said("STAMP")) {
+ digi_play("406r19", 1);
+ } else if (lookFlag && player_said(" ")) {
+ digi_play(_G(flags)[V030] ? "406r40" : "406r01", 1);
+ } else if (useFlag && player_said("DART BOARD")) {
+ digi_play("406r20", 1);
+ } else if (useFlag && player_said_any("BILLIARD TABLE",
+ "BILLIARD TABLE ") && _G(flags)[V312] == 1) {
+ switch (_G(kernel).trigger) {
+ case 1:
+ _rptmr15 = series_load("RPTMR15");
+ setGlobals1(_rptmr15, 1, 12, 12, 12, 0, 12, 1, 1, 1);
+ sendWSMessage_110000(2);
+ break;
+ case 2:
+ sendWSMessage_120000(4);
+ _tableRaises = series_load("808 BILLIARDS TABLE RAISES");
+ digi_play("406_s11", 2);
+ terminateMachineAndNull(_billiardTable);
+ _billiardTable = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x200, 0,
+ triggerMachineByHashCallbackAlways, "Table raises");
+ sendWSMessage_10000(1, _billiardTable, _tableRaises, 1, 24, 6,
+ _tableRaises, 24, 24, 0);
+ break;
+ case 4:
+ sendWSMessage_150000(5);
+ break;
+ case 5:
+ series_unload(_rptmr15);
+ break;
+ case 6:
+ terminateMachineAndNull(_billiardTable);
+ series_unload(_tableRaises);
+ hotspot_set_active("BILLIARD TABLE", false);
+ hotspot_set_active("BILLIARD TABLE ", false);
+ hotspot_set_active("STAIRS", true);
+ _billiardTable = series_place_sprite("406 BILLIARD TABLE UP", 0, 0, 0, 100, 0x200);
+ _G(flags)[V312] = 2;
+ player_set_commands_allowed(true);
+ break;
+ case 69:
+ player_set_commands_allowed(false);
+ ws_walk(205, 333, nullptr, 1, 5);
+ break;
+ default:
+ break;
+ }
+ } else if (useFlag && player_said("SWITCH")) {
+ if (_G(flags)[kPaintingOpen])
+ useSwitchPaintingOpen();
+ else
+ useSwitchPaintingClosed();
}
// TODO
else {
@@ -283,6 +497,7 @@ void Room406::parser() {
_G(player).command_ready = false;
}
+#undef LOOK
void Room406::disableHotspots() {
for (auto *hs = _G(currentSceneDef).hotspots; hs; hs = hs->next)
@@ -380,12 +595,34 @@ bool Room406::takeBilliardBall() {
_pickupBall = series_load("406 RIP PICKUP BALL");
ws_hide_walker();
- _ripPickupBall = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0, false,
+ _ripAction = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0, false,
triggerMachineByHashCallbackAlways, "RIP picks up ball");
- // TODO
+ sendWSMessage_10000(1, _ripAction, _pickupBall, 1, 14, 2,
+ _pickupBall, 14, 14, 0);
+ return true;
}
break;
+ case 2:
+ terminateMachineAndNull(_poolBall);
+ inv_give_to_player("BILLIARD BALL");
+ hotspot_set_active("BILLIARD BALL", false);
+ kernel_examine_inventory_object("PING BILLIARD BALL", _G(master_palette),
+ 5, 1, 125, 240, 3, 0, -1);
+ return true;
+
+ case 3:
+ sendWSMessage_10000(1, _ripAction, _pickupBall, 14, 1, 4,
+ _pickupBall, 1, 1, 0);
+ return true;
+
+ case 4:
+ terminateMachineAndNull(_ripAction);
+ ws_unhide_walker();
+ series_unload(_pickupBall);
+ player_set_commands_allowed(true);
+ return true;
+
default:
break;
}
@@ -393,6 +630,127 @@ bool Room406::takeBilliardBall() {
return false;
}
+bool Room406::billiardBallOnTable() {
+ switch (_G(kernel).trigger) {
+ case -1:
+ return true;
+
+ case 1:
+ if (inv_player_has("BILLIARD BALL")) {
+ player_set_commands_allowed(false);
+ _pickupBall = series_load("406 RIP PICKUP BALL");
+ ws_hide_walker();
+ _ripAction = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0, 0,
+ triggerMachineByHashCallbackAlways, "RIP picks up ball");
+ sendWSMessage_10000(1, _ripAction, _pickupBall, 1, 14, 2,
+ _pickupBall, 14, 14, 0);
+ return true;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return false;
+}
+
+void Room406::useSwitchPaintingOpen() {
+ switch (_G(kernel).trigger) {
+ case -1:
+ player_set_commands_allowed(false);
+ _ripHiHand = series_load("rip trek hi 1 hand");
+ setGlobals1(_ripHiHand, 1, 5, 5, 5, 0, 5, 1, 1, 1);
+ sendWSMessage_110000(1);
+ break;
+
+ case 1:
+ hotspot_set_active("PAINTING", true);
+ hotspot_set_active("SMOKING HUTCH", false);
+ terminateMachineAndNull(_painting);
+ _paintingOpening = series_load("406 PAINTING OPENING");
+ digi_play("406_s07", 2, 255, 69);
+ _painting = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0, 0,
+ triggerMachineByHashCallbackAlways, "HUTCH painting opens");
+ sendWSMessage_10000(1, _painting, _paintingOpening, 30, 1, 2,
+ _paintingOpening, 1, 1, 0);
+ break;
+
+ case 2:
+ terminateMachineAndNull(_painting);
+ series_unload(_paintingOpening);
+ _painting = series_place_sprite("406 PAINTING CLOSED",
+ 0, 0, 0, 100, 0xf00);
+ sendWSMessage_120000(3);
+ break;
+
+ case 3:
+ sendWSMessage_150000(4);
+ break;
+
+ case 4:
+ series_unload(_ripHiHand);
+ _G(flags)[kPaintingOpen] = 0;
+ player_set_commands_allowed(true);
+ break;
+
+ case 69:
+ digi_play("406_s09", 2);
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Room406::useSwitchPaintingClosed() {
+ switch (_G(kernel).trigger) {
+ case -1:
+ player_set_commands_allowed(false);
+ _ripHiHand = series_load("rip trek hi 1 hand");
+ setGlobals1(_ripHiHand, 1, 5, 5, 5, 0, 5, 1, 1, 1);
+ sendWSMessage_110000(1);
+ break;
+
+ case 1:
+ hotspot_set_active("PAINTING", false);
+ hotspot_set_active("SMOKING HUTCH", true);
+ terminateMachineAndNull(_painting);
+ _paintingOpening = series_load("406 PAINTING OPENING");
+ digi_play("406_s07", 2, 255, 69);
+ _painting = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0, 0,
+ triggerMachineByHashCallbackAlways, "HUTCH painting opens");
+ sendWSMessage_10000(1, _painting, _paintingOpening, 1, 30, 2,
+ _paintingOpening, 30, 30, 0);
+ break;
+
+ case 2:
+ terminateMachineAndNull(_painting);
+ series_unload(_paintingOpening);
+ _painting = series_place_sprite("406 PAINTING OPEN",
+ 0, 0, 0, 100, 0xf00);
+ sendWSMessage_120000(3);
+ break;
+
+ case 3:
+ sendWSMessage_150000(4);
+ break;
+
+ case 4:
+ series_unload(_ripHiHand);
+ _G(flags)[kPaintingOpen] = 1;
+ player_set_commands_allowed(true);
+ break;
+
+ case 69:
+ digi_play("406_s08", 2);
+ break;
+
+ default:
+ break;
+ }
+}
+
} // namespace Rooms
} // namespace Riddle
} // namespace M4
diff --git a/engines/m4/riddle/rooms/section4/room406.h b/engines/m4/riddle/rooms/section4/room406.h
index 9eda0652729..45cb2e91d84 100644
--- a/engines/m4/riddle/rooms/section4/room406.h
+++ b/engines/m4/riddle/rooms/section4/room406.h
@@ -42,17 +42,24 @@ private:
machine *_keys = nullptr;
machine *_cards = nullptr;
int _rptmhr = 0;
+ int _rptmr15 = 0;
int _val1 = 0;
int _val2 = 0;
int _ripReachHand = 0;
int _ripHiHand = 0;
int _pickupBall = 0;
- machine *_ripPickupBall = nullptr;
+ machine *_ripAction = nullptr;
+ int _lookMirror = 0;
+ int _tableRaises = 0;
+ int _paintingOpening = 0;
void disableHotspots();
void setHotspots();
bool takeKeys();
bool takeBilliardBall();
+ bool billiardBallOnTable();
+ void useSwitchPaintingOpen();
+ void useSwitchPaintingClosed();
public:
Room406() : Room() {}
More information about the Scummvm-git-logs
mailing list