[Scummvm-git-logs] scummvm master -> eee2b607b4b780016b1b942957fb8f17a64bd776
dreammaster
noreply at scummvm.org
Thu Aug 1 05:42:48 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:
eee2b607b4 M4: RIDDLE: In progress room 303 daemon
Commit: eee2b607b4b780016b1b942957fb8f17a64bd776
https://github.com/scummvm/scummvm/commit/eee2b607b4b780016b1b942957fb8f17a64bd776
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-07-31T22:42:40-07:00
Commit Message:
M4: RIDDLE: In progress room 303 daemon
Changed paths:
engines/m4/adv_r/adv_file.cpp
engines/m4/adv_r/adv_file.h
engines/m4/platform/sound/digi.cpp
engines/m4/platform/sound/digi.h
engines/m4/riddle/rooms/room.cpp
engines/m4/riddle/rooms/room.h
engines/m4/riddle/rooms/section3/room303.cpp
engines/m4/riddle/rooms/section3/room303.h
diff --git a/engines/m4/adv_r/adv_file.cpp b/engines/m4/adv_r/adv_file.cpp
index 4c53bde75e7..23c75b3e8e0 100644
--- a/engines/m4/adv_r/adv_file.cpp
+++ b/engines/m4/adv_r/adv_file.cpp
@@ -401,4 +401,18 @@ static void troll_for_colors(RGB8 *newPal, uint8 minPalEntry, uint8 maxPalEntry)
}
}
+Common::String expand_name_2_RAW(const Common::String &name, int32 room_num) {
+ Common::String tempName = f_extension_new(name, "RAW");
+
+ if (!_G(kernel).hag_mode) {
+ if (room_num == -1)
+ room_num = extract_room_num(name);
+
+ return Common::String::format("%d\\%s", room_num, tempName.c_str());
+
+ } else {
+ return tempName;
+ }
+}
+
} // End of namespace M4
diff --git a/engines/m4/adv_r/adv_file.h b/engines/m4/adv_r/adv_file.h
index 440c64a1a67..8847e662339 100644
--- a/engines/m4/adv_r/adv_file.h
+++ b/engines/m4/adv_r/adv_file.h
@@ -54,6 +54,7 @@ bool kernel_load_code_variant(SceneDef *rdef, char *variant, GrBuff **codeData);
void kernel_current_background_name(char *result);
void kernel_current_codes_name(char *result);
void screen_capture(RGB8 *masterPalette);
+Common::String expand_name_2_RAW(const Common::String &name, int32 room_num);
} // End of namespace M4
diff --git a/engines/m4/platform/sound/digi.cpp b/engines/m4/platform/sound/digi.cpp
index 725973b01aa..a3052a55cc8 100644
--- a/engines/m4/platform/sound/digi.cpp
+++ b/engines/m4/platform/sound/digi.cpp
@@ -152,20 +152,6 @@ void Digi::playFootsteps() {
}
}
-Common::String Digi::expand_name_2_RAW(const Common::String &name, int32 room_num) {
- Common::String tempName = f_extension_new(name, "RAW");
-
- if (!_G(kernel).hag_mode) {
- if (room_num == -1)
- room_num = extract_room_num(name);
-
- return Common::String::format("%d\\%s", room_num, tempName.c_str());
-
- } else {
- return tempName;
- }
-}
-
void Digi::stop(uint channel, bool calledFromUnload) {
assert(channel < 4);
diff --git a/engines/m4/platform/sound/digi.h b/engines/m4/platform/sound/digi.h
index 6d13c8e920c..32a3540d565 100644
--- a/engines/m4/platform/sound/digi.h
+++ b/engines/m4/platform/sound/digi.h
@@ -64,7 +64,6 @@ private:
int32 play(const Common::String &name, uint channel, int32 vol, int32 trigger,
int32 room_num, bool loop);
- Common::String expand_name_2_RAW(const Common::String &name, int32 room_num);
public:
Digi(Audio::Mixer *mixer) : _mixer(mixer) {}
diff --git a/engines/m4/riddle/rooms/room.cpp b/engines/m4/riddle/rooms/room.cpp
index ae2f695988e..f57b3770991 100644
--- a/engines/m4/riddle/rooms/room.cpp
+++ b/engines/m4/riddle/rooms/room.cpp
@@ -183,6 +183,12 @@ void Room::setGlobals1(int val1, int val2, int val3, int val4, int val5,
_G(globals)[V028] = val21 << 16;
}
+void Room::setGlobals3(int series, int val1, int val2) {
+ _G(globals)[GLB_TEMP_1] = series << 24;
+ _G(globals)[GLB_TEMP_2] = val1 << 16;
+ _G(globals)[GLB_TEMP_3] = val2 << 16;
+}
+
void Room::setGlobals4(int val1, int val2, int val3, int val4) {
_G(globals)[GLB_TEMP_1] = val1;
_G(globals)[GLB_TEMP_2] = val2;
@@ -239,15 +245,15 @@ machine *Room::triggerMachineByHash_3000(int val1, int val2, const int16 * norma
#endif
}
-void Room::sendWSMessage_60000(machine *walker) {
- sendWSMessage(0x60000, 0, walker, 0, nullptr, 1);
+void Room::sendWSMessage_60000(machine *mach) {
+ sendWSMessage(0x60000, 0, mach, 0, nullptr, 1);
}
-void Room::sendWSMessage_80000(machine *walker) {
- sendWSMessage(0x80000, 0, walker, 0, nullptr, 1);
+void Room::sendWSMessage_80000(machine *mach) {
+ sendWSMessage(0x80000, 0, mach, 0, nullptr, 1);
}
-void Room::sendWSMessage_B0000(machine *walker, int trigger) {
+void Room::sendWSMessage_B0000(machine *mach, int trigger) {
}
@@ -255,73 +261,81 @@ void Room::sendWSMessage_B0000(int trigger) {
sendWSMessage_B0000(_G(my_walker), trigger);
}
-void Room::sendWSMessage_C0000(machine *walker, int trigger) {
+void Room::sendWSMessage_C0000(machine *mach, int trigger) {
if (!trigger)
trigger = -1;
_G(globals)[GLB_TEMP_5] = kernel_trigger_create(trigger);
- sendWSMessage(0xC0000, 0, walker, 0, nullptr, 1);
+ sendWSMessage(0xC0000, 0, mach, 0, nullptr, 1);
}
void Room::sendWSMessage_C0000(int trigger) {
sendWSMessage_C0000(_G(my_walker), trigger);
}
-void Room::sendWSMessage_D0000(machine *walker) {
- sendWSMessage(0xd0000, 0, walker, 0, nullptr, 1);
+void Room::sendWSMessage_D0000(machine *mach) {
+ sendWSMessage(0xd0000, 0, mach, 0, nullptr, 1);
}
void Room::sendWSMessage_D0000() {
sendWSMessage_D0000(_G(my_walker));
}
-void Room::sendWSMessage_E0000(machine *walker) {
- sendWSMessage(0xe0000, 0, walker, 0, nullptr, 1);
+void Room::sendWSMessage_E0000(machine *mach) {
+ sendWSMessage(0xe0000, 0, mach, 0, nullptr, 1);
}
void Room::sendWSMessage_E0000() {
sendWSMessage_E0000(_G(my_walker));
}
-void Room::sendWSMessage_110000(machine *walker, int trigger) {
+void Room::sendWSMessage_F0000(machine *mach, int trigger) {
+ if (!trigger)
+ trigger = -1;
+
+ _G(globals)[GLB_TEMP_4] = kernel_trigger_create(trigger);
+ sendWSMessage(0xf0000, 0, mach, 0, nullptr, 1);
+}
+
+void Room::sendWSMessage_110000(machine *mach, int trigger) {
if (!trigger)
trigger = -1;
_G(globals)[V023] = kernel_trigger_create(trigger);
- sendWSMessage(0x110000, 0, walker, 0, nullptr, 1);
+ sendWSMessage(0x110000, 0, mach, 0, nullptr, 1);
}
void Room::sendWSMessage_110000(int trigger) {
sendWSMessage_110000(_G(my_walker), trigger);
}
-void Room::sendWSMessage_120000(machine *walker, int trigger) {
+void Room::sendWSMessage_120000(machine *mach, int trigger) {
if (!trigger)
trigger = -1;
_G(globals)[V023] = kernel_trigger_create(trigger);
- sendWSMessage(0x120000, 0, walker, 0, nullptr, 1);
+ sendWSMessage(0x120000, 0, mach, 0, nullptr, 1);
}
void Room::sendWSMessage_120000(int trigger) {
sendWSMessage_120000(_G(my_walker), trigger);
}
-void Room::sendWSMessage_140000(machine *walker, int trigger) {
+void Room::sendWSMessage_140000(machine *mach, int trigger) {
if (!trigger)
trigger = -1;
_G(globals)[V023] = kernel_trigger_create(trigger);
- sendWSMessage(0x140000, 0, walker, 0, nullptr, 1);
+ sendWSMessage(0x140000, 0, mach, 0, nullptr, 1);
}
void Room::sendWSMessage_140000(int trigger) {
sendWSMessage_140000(_G(my_walker), trigger);
}
-void Room::sendWSMessage_150000(machine *walker, int trigger) {
+void Room::sendWSMessage_150000(machine *mach, int trigger) {
_G(globals)[V023] = kernel_trigger_create(trigger);
- sendWSMessage(0x150000, 0, walker, 0, nullptr, 1);
+ sendWSMessage(0x150000, 0, mach, 0, nullptr, 1);
}
void Room::sendWSMessage_150000(int trigger) {
diff --git a/engines/m4/riddle/rooms/room.h b/engines/m4/riddle/rooms/room.h
index 2238c399dfa..5374da226cb 100644
--- a/engines/m4/riddle/rooms/room.h
+++ b/engines/m4/riddle/rooms/room.h
@@ -58,6 +58,7 @@ protected:
int val11 = 0, int val12 = 0, int val13 = 0, int val14 = 0, int val15 = 0,
int val16 = 0, int val17 = 0, int val18 = 0, int val19 = 0, int val20 = 0,
int val21 = 0);
+ void setGlobals3(int series, int val1, int val2);
void setGlobals4(int val1, int val2, int val3, int val4);
void sendWSMessage_10000(int val1, machine *recv, int val2, int val3,
@@ -68,23 +69,24 @@ protected:
machine *triggerMachineByHash_3000(int val1, int val2, const int16 *normalDirs,
const int16 *shadowDirs, int val3, int val4, int val5,
MessageCB intrMsg, const char *machName);
- void sendWSMessage_60000(machine *walker);
- void sendWSMessage_80000(machine *walker);
- void sendWSMessage_B0000(machine *walker, int trigger);
+ void sendWSMessage_60000(machine *mach);
+ void sendWSMessage_80000(machine *mach);
+ void sendWSMessage_B0000(machine *mach, int trigger);
void sendWSMessage_B0000(int trigger);
- void sendWSMessage_C0000(machine *walker, int trigger);
+ void sendWSMessage_C0000(machine *mach, int trigger);
void sendWSMessage_C0000(int trigger);
- void sendWSMessage_D0000(machine *walker);
+ void sendWSMessage_D0000(machine *mach);
void sendWSMessage_D0000();
- void sendWSMessage_E0000(machine *walker);
+ void sendWSMessage_E0000(machine *mach);
void sendWSMessage_E0000();
- void sendWSMessage_110000(machine *walker, int trigger);
+ void sendWSMessage_F0000(machine *mach, int trigger);
+ void sendWSMessage_110000(machine *mach, int trigger);
void sendWSMessage_120000(int trigger);
- void sendWSMessage_120000(machine *walker, int trigger);
+ void sendWSMessage_120000(machine *mach, int trigger);
void sendWSMessage_110000(int trigger);
- void sendWSMessage_140000(machine *walker, int trigger);
+ void sendWSMessage_140000(machine *mach, int trigger);
void sendWSMessage_140000(int trigger);
- void sendWSMessage_150000(machine *walker, int trigger);
+ void sendWSMessage_150000(machine *mach, int trigger);
void sendWSMessage_150000(int trigger);
void sendWSMessage_190000(machine *recv, int trigger);
void sendWSMessage_1a0000(machine *recv, int trigger);
diff --git a/engines/m4/riddle/rooms/section3/room303.cpp b/engines/m4/riddle/rooms/section3/room303.cpp
index 8c6d6067595..648ac3bc123 100644
--- a/engines/m4/riddle/rooms/section3/room303.cpp
+++ b/engines/m4/riddle/rooms/section3/room303.cpp
@@ -23,6 +23,8 @@
#include "m4/graphics/gr_series.h"
#include "m4/riddle/vars.h"
#include "m4/adv_r/adv_file.h"
+#include "m4/fileio/extensions.h"
+#include "m4/fileio/info.h"
#include "m4/gui/gui_vmng.h"
#include "m4/gui/gui_sys.h"
#include "m4/platform/keys.h"
@@ -94,7 +96,7 @@ void Room303::init() {
_val1 = _lonelyFlag = 0;
if (_G(game).previous_room != KERNEL_RESTORING_GAME) {
- _val3 = 0;
+ _digiName1 = nullptr;
_val4 = -1;
_triggerMode1 = _triggerMode2 = KT_DAEMON;
_val5 = 0;
@@ -346,10 +348,549 @@ void Room303::daemon() {
ws_walk(128, 267, nullptr, 75, 3);
break;
- // TODO
+ case 7:
+ priestTalk(true, -1);
+ setShadow5(true);
+ break;
+
+ case 8:
+ ws_walk(145, 289, nullptr, -1, 2);
+ kernel_timing_trigger(200, 38);
+ break;
+
+ case 9:
+ ws_demand_location(1350, 276, 9);
+ ws_walk(1208, 276, nullptr, 75, 9);
+ break;
+
+ case 10:
+ ws_demand_location(425, 227, 7);
+ ws_walk(399, 260, nullptr, 50, 7);
+ break;
+
+ case 18:
+ digi_play("303r02", 1);
+ series_stream_break_on_frame(_machine2, 20, 19);
+ break;
+
+ case 19:
+ digi_play("303m02", 1);
+ series_stream_break_on_frame(_machine2, 55, 20);
+ break;
+
+ case 20:
+ digi_play("303f01", 1);
+ series_stream_break_on_frame(_machine2, 77, 24);
+ break;
+
+ case 21:
+ series_plain_play("303 final frame", -1, 0, 100,
+ 0x100, 3000);
+ disable_player_commands_and_fade_init(22);
+ break;
+
+ case 22:
+ digi_stop(1);
+ digi_stop(3);
+ adv_kill_digi_between_rooms(false);
+ _G(game).setRoom(354);
+ break;
+
+ case 24:
+ break;
+
+ case 38:
+ sendWSMessage_10000(_machine1, 146, 270, 9, 39, 0);
+ break;
+
+ case 39:
+ sendWSMessage_10000(_machine1, 480, 256, 7, 40, 1);
+ break;
+
+ case 40:
+ sendWSMessage_60000(_machine1);
+ _machine1 = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, 1,
+ triggerMachineByHashCallbackNegative, "fl");
+ sendWSMessage_10000(1, _machine1, _clasped1, 1, 16, 400,
+ _clasped4, 1, 6, 0);
+ _val14 = _val15 = 1;
+ setShadow5(true);
+ player_set_commands_allowed(true);
+ break;
+
+ case 50:
+ terminateMachineAndNull(_door);
+ digi_preload("950_s44");
+ series_plain_play("DOOR", 1, 2, 100, 0xf05, 10, 51);
+ break;
+
+ case 51:
+ digi_play("950_s44", 2, 200, 52);
+ _door = series_show_sprite("DOOR", 0, 0xf05);
+ player_set_commands_allowed(true);
+ break;
+
+ case 52:
+ digi_unload("950_s44");
+ break;
+
+ case 60:
+ sendWSMessage_150000(61);
+ break;
+
+ case 70:
+ kernel_timing_trigger(imath_ranged_rand(300, 600), 71);
+ break;
+
+ case 71:
+ series_plain_play("CREATURE FEATURE LONG VIEW", 1, 0,
+ 100, 0xf05, 7, 70);
+ break;
+
+ case 75:
+ player_set_commands_allowed(true);
+ break;
+
+ case 100:
+ digi_play("950_s01", 3);
+ kernel_timing_trigger(1020, 100);
+ break;
+
+ case 103:
+ sendWSMessage_10000(_machine1, 414, 228, 9, 104, 0);
+ break;
+
+ case 104:
+ sendWSMessage_10000(_machine1, 399, 256, 7, 105, 0);
+ break;
+
+ case 105:
+ terminateMachineAndNull(_door);
+ digi_preload("950_s44");
+ series_plain_play("DOOR", 1, 2, 100, 0xf05, 8, 156);
+ sendWSMessage_10000(_machine1, 480, 256, 7, 106, 1);
+ break;
+
+ case 106:
+ sendWSMessage_60000(_machine1);
+ priestTalk(true, -1);
+ setShadow5(true);
+ break;
+
+ case 107:
+ ws_walk(700, 305, 0, -1, 3);
+ sendWSMessage_10000(_hands4, 393, 260, 9, 109, 0);
+ break;
+
+ case 109:
+ sendWSMessage_10000(_hands4, 393, 260, 5, 110, 1);
+ break;
+
+ case 110:
+ setGlobals3(_gestTalk4, 1, 21);
+ sendWSMessage_F0000(_hands4, 157);
+ digi_play("303m03", 1, 255, 143);
+ break;
+
+ case 111:
+ _chinTalk4 = series_load("suit hands out to side pos1");
+ _suitTalk1 = series_load("suit talk pos1");
+ setGlobals1(_chinTalk4, 1, 8, 8, 8);
+ sendWSMessage_110000(154);
+ digi_play("303r03", 1, 255, 116);
+ break;
+
+ case 116:
+ _gestTalk4 = series_load("mc ny hand out talk pos4");
+ sendWSMessage_10000(_hands4, 357, 255, 4, 117, 1);
+ kernel_timing_trigger(60, 103);
+ series_unload(_suitTalk1);
+ series_unload(_chinTalk4);
+ ws_walk(700, 305, nullptr, -1, 3);
+ break;
+
+ case 117:
+ setGlobals1(_gestTalk4, 1, 9, 9, 9);
+ sendWSMessage_110000(_hands4, 120);
+ kernel_timing_trigger(70, 118);
+ digi_play("303m04", 1, 255);
+ break;
+
+ case 118:
+ ws_walk(444, 295, nullptr, 119, 10);
+ break;
+
+ case 119:
+ _chinTalk4 = series_load("rip suit rt hand gest talk pos2");
+ setGlobals1(_chinTalk4, 1, 8, 8, 8);
+
+ _ctr1 = 0;
+ sendWSMessage_110000(121);
+ digi_play("303r04", 1, 255, 121);
+ break;
+
+ case 120:
+ sendWSMessage_140000(_hands4, 159);
+ break;
+
+ case 121:
+ if (++_ctr1 == 2)
+ sendWSMessage_140000(122);
+ break;
+
+ case 122:
+ series_unload(_chinTalk4);
+ player_update_info();
+ ws_walk(_G(player_info).x + 1, _G(player_info).y - 1,
+ nullptr, 123, 1);
+ break;
+
+ case 123:
+ _chinTalk4 = series_load("suit talk pos1");
+ digi_play(_G(flags)[V084] == 2 ? "303r05" : "303r06",
+ 1, 255, 138);
+ setGlobals1(_chinTalk4, 1, 5, 5, 5);
+ sendWSMessage_110000(144);
+ kernel_timing_trigger(200, 124);
+ break;
+
+ case 124:
+ _G(globals)[GLB_TEMP_1] = 0;
+ _G(globals)[GLB_TEMP_2] = 0xFFFF0000;
+ sendWSMessage(0x200000, 0, _priestTalk, 0, nullptr, 1);
+ break;
+
+ case 125:
+ _chinTalk4 = series_load("rip suit lft hand gest talk");
+ setGlobals4(_chinTalk4, 6, 6, 13);
+ sendWSMessage_C0000(126);
+ break;
+
+ case 126:
+ digi_play("303r07", 1, 255, 150);
+ sendWSMessage_D0000();
+ break;
+
+ case 127:
+ ws_walk(_G(player_info).x + 50, _G(player_info).y + 10,
+ nullptr, -1, 10);
+ break;
+
+ case 129:
+ series_unload(_chinTalk4);
+ _chinTalk4 = series_load("rip suit rt hand gest talk pos2");
+ setGlobals1(_chinTalk4, 1, 5, 5, 5);
+ digi_play("303r08", 1, 255, 131);
+ break;
+
+ case 130:
+ sendWSMessage_140000(158);
+ break;
+
+ case 131:
+ _val12 = KT_DAEMON;
+ playSound("303f03", -1, 132);
+ break;
+
+ case 132:
+ ws_walk(565, 306, nullptr, 170, 10);
+ kernel_timing_trigger(1, 133);
+ break;
+
+ case 133:
+ playSound("303f04", 134, -1);
+ break;
+
+ case 134:
+ if (_val1)
+ kernel_timing_trigger(1, 172);
+ else
+ kernel_timing_trigger(60, 134);
+ break;
+
+ case 136:
+ sendWSMessage_140000(137);
+ break;
+
+ case 137:
+ sendWSMessage_60000(_hands4);
+ loadHands();
+ setShadow4(true);
+ _val11 = 7;
+ kernel_timing_trigger(1, 160);
+ break;
+
+ case 138:
+ series_unload(_chinTalk4);
+ ws_walk(500, 300, nullptr, 125, 3);
+ break;
+
+ case 143:
+ player_update_info();
+ sendWSMessage_10000(_G(my_walker),
+ _G(player_info).x - 1, _G(player_info).y - 1,
+ 10, 198, 0);
+ break;
+
+ case 144:
+ case 154:
+ sendWSMessage_140000(-1);
+ break;
+
+ case 147:
+ sendWSMessage_120000(148);
+ break;
+
+ case 148:
+ sendWSMessage_110000(-1);
+ break;
+
+ case 150:
+ sendWSMessage_B0000(127);
+ playSound("303f02", -1, 129);
+ break;
+
+ case 156:
+ digi_play("950_s44", 1, 200, 52);
+ _door = series_show_sprite("DOOR", 0, 0xf05);
+ break;
+
+ case 157:
+ case 159:
+ series_unload(_gestTalk4);
+ break;
+
+ case 158:
+ series_unload(_chinTalk4);
+ break;
+
+ case 160:
+ series_unload(_chinTalk4);
+ series_unload(220);
+ series_unload(221);
+ series_unload(222);
+ series_plain_play("303cow1", -1, 0, 100, 0, 9);
+
+ _G(player).disable_hyperwalk = false;
+ _G(camera_reacts_to_player) = true;
+ _val12 = KT_PARSE;
+ _G(flags)[V001] = 0;
+
+ terminateMachineAndNull(_priestTalk);
+ _machine1 = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, true,
+ triggerMachineByHashCallbackNegative, "fl");
+ sendWSMessage_10000(1, _machine1, _clasped4, 1, 1, 400,
+ _clasped4, 1, 6, 0);
+ _val14 = _val15 = 1;
+
+ player_set_commands_allowed(true);
+ break;
+
+ case 170:
+ _val1 = 1;
+ break;
+
+ case 172:
+ _chinTalk4 = series_load("RIP HNDS HIPS GEST TALK");
+ setGlobals1(_chinTalk4, 1, 15, 15, 15, 0, 16, 25, 25, 25);
+ sendWSMessage_110000(-1);
+ kernel_timing_trigger(200, 147);
+ digi_play("303r09", 1, 255, 136);
+ break;
+
+ case 198:
+ ws_walk(444, 295, nullptr, 111, 11);
+ break;
+
+ case 200:
+ if (_val10 == 0 && _val11 == 0 && _val4 != -1) {
+ kernel_trigger_dispatchx(_val4);
+ _val4 = -1;
+
+ if (_val5) {
+ ws_unhide_walker();
+ _val5 = 0;
+ }
+ }
+
+ kernel_trigger_dispatchx(kernel_trigger_create(201));
+ break;
+
+ case 201:
+ // TODO: Complete trigger 201
+ switch (_val10) {
+ case 0:
+ switch (_val11) {
+ case 0:
+ if (_val7) {
+ series_unload(_meiLips);
+ _val7 = 0;
+ }
+
+ if (_digiName1) {
+ digi_play(_digiName1, 1, 255, _val18);
+ _digiName1 = nullptr;
+ _triggerMode2 = KT_DAEMON;
+ _G(kernel).trigger_mode = KT_DAEMON;
+ }
+
+ }
+ }
+ break;
+
+ case 300:
+ if (_val17 == 0 && _val16 == 0 && _val4 != -1) {
+ kernel_trigger_dispatchx(_val4);
+ _val4 = -1;
+
+ if (_val5) {
+ ws_unhide_walker();
+ _val5 = 0;
+ }
+ }
+
+ kernel_trigger_dispatchx(kernel_trigger_create(301));
+ break;
+
+ case 301:
+ switch (_val17) {
+ case 0:
+ switch (_val16) {
+ case 0:
+ if (_digiName1) {
+ digi_play(_digiName1, 1, 255, _val18);
+ _digiName1 = nullptr;
+ _triggerMode2 = KT_DAEMON;
+ _G(kernel).trigger_mode = KT_DAEMON;
+ }
+
+ sendWSMessage_10000(1, _machine3, 1, 1, 1, 300, 1, 1, 1, 0);
+ break;
+
+ case 1:
+ sendWSMessage_10000(1, _machine3, _suit2, 1, 10, 300, _suit2, 10, 10, 0);
+ _val17 = 1;
+ break;
+
+ case 2:
+ sendWSMessage_10000(1, _machine3, _suit1, 1, 17, 300,
+ _suit1, 17, 17, 0);
+ _val17 = 2;
+ break;
+
+ case 3:
+ case 4:
+ sendWSMessage_10000(1, _machine3, _ripGesture, 1, 14, 300,
+ _ripGesture, 1, 14, 0);
+ break;
+
+ case 5:
+ terminateMachineAndNull(_machine3);
+ terminateMachineAndNull(_ripsh2);
+ ws_unhide_walker();
+ series_unload(_suit1);
+ series_unload(_suit2);
+ series_unload(_ripGesture);
+ player_set_commands_allowed(true);
+ return;
+
+ default:
+ break;
+ }
+ break;
+
+ case 1:
+ if (_val16 == 1) {
+ sendWSMessage_10000(1, _machine3, _suit2, 10, 10, 300,
+ _suit2, 10, 10, 0);
+ } else {
+ sendWSMessage_10000(1, _machine3, _suit2, 11, 18, 300, 1, 1, 1, 0);
+ _val17 = 0;
+ }
+ break;
+
+ case 2:
+ if (_val16 == 2) {
+ sendWSMessage_10000(1, _machine3, _suit1, 17, 17, 300,
+ _suit1, 17, 17, 0);
+ } else {
+ sendWSMessage_10000(1, _machine3, _suit1, 17, 1, 300, 1, 1, 1, 0);
+ _val17 = 0;
+ }
+ break;
+
+ case 3:
+ switch (_val16) {
+ case 3:
+ sendWSMessage_10000(1, _machine3, _ripGesture, 14, 14, 300,
+ _ripGesture, 14, 14, 0);
+ break;
+ case 4:
+ sendWSMessage_10000(1, _machine3, _ripGesture, 15, 25, 300,
+ _ripGesture, 25, 25, 0);
+ break;
+ default:
+ sendWSMessage_10000(1, _machine3, _ripGesture, 14,
+ 1, 300, 1, 1, 1, 0);
+ _val17 = 0;
+ break;
+ }
+ break;
+
+ case 4:
+ if (_val16 == 4) {
+ sendWSMessage_10000(1, _machine3, _ripGesture, 25, 25, 300,
+ _ripGesture, 25, 25, 0);
+ } else {
+ sendWSMessage_10000(1, _machine3, _ripGesture, 25, 15, 300,
+ _ripGesture, 14, 14, 0);
+ _val17 = 3;
+ }
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ case 400:
+ if (_val14 == 0 && _val15 == 0 && _val4 != -1) {
+ kernel_trigger_dispatchx(_val4);
+ _val4 = -1;
+
+ if (_val5) {
+ ws_unhide_walker();
+ _val5 = 0;
+ }
+ }
+
+ kernel_trigger_dispatchx(kernel_trigger_create(401));
+ break;
+
default:
break;
}
+
+ if (_G(game).previous_room == 352) {
+ switch (_G(kernel).trigger) {
+ case 55:
+ _G(game).setRoom(304);
+ break;
+ case 56:
+ _G(game).setRoom(494);
+ break;
+ default:
+ break;
+ }
+
+ if (_G(MouseState).ButtonState) {
+ _btnFlag = true;
+ } else if (_btnFlag) {
+ _btnFlag = false;
+
+ disable_player_commands_and_fade_init(55);
+ }
+ }
}
void Room303::pre_parser() {
@@ -1226,6 +1767,25 @@ void Room303::priestTalk(bool flag, int trigger) {
priestTalkCallback, false, "fl priest/talk");
}
+int Room303::getSize(const Common::String &assetName, int roomNum) {
+ Common::String name = expand_name_2_RAW(assetName, roomNum);
+ size_t fileSize = f_info_get_file_size(Common::Path(name));
+
+ return static_cast<int>((double)fileSize * 0.000090702946);
+}
+
+void Room303::playSound(const Common::String &assetName, int trigger, int val1) {
+ if (!val1)
+ _val1 = -1;
+
+ int size = MAX(getSize(assetName), 0);
+ _G(globals)[GLB_TEMP_1] = size << 16;
+ _G(globals)[GLB_TEMP_2] = val1 << 16;
+ sendWSMessage(0x200000, 0, _priestTalk, 0, nullptr, 1);
+
+ digi_play(assetName.c_str(), 1, 255, trigger);
+}
+
} // namespace Rooms
} // namespace Riddle
} // namespace M4
diff --git a/engines/m4/riddle/rooms/section3/room303.h b/engines/m4/riddle/rooms/section3/room303.h
index 45ed072e743..18870934bd2 100644
--- a/engines/m4/riddle/rooms/section3/room303.h
+++ b/engines/m4/riddle/rooms/section3/room303.h
@@ -32,7 +32,7 @@ class Room303 : public Room {
private:
int _val1 = 0;
bool _lonelyFlag = 0;
- int _val3 = 0;
+ const char *_digiName1 = nullptr;
int _val4 = 0;
int _val5 = 0;
int _val6 = 0;
@@ -47,6 +47,7 @@ private:
int _val15 = 0;
int _val16 = 0;
int _val17 = 0;
+ int _val18 = 0;
KernelTriggerType _triggerMode1 = KT_DAEMON;
KernelTriggerType _triggerMode2 = KT_DAEMON;
machine *_door = nullptr;
@@ -75,6 +76,10 @@ private:
int _meiLips = 0;
int _ripGesture = 0;
machine *_priestTalk = nullptr;
+ int _suitTalk1 = 0;
+
+ int _ctr1 = 0;
+ bool _btnFlag = false;
static void escapePressed(void *, void *);
@@ -89,6 +94,8 @@ private:
void conv303b();
static void priestTalkCallback(frac16 myMessage, machine *sender);
void priestTalk(bool flag, int trigger);
+ int getSize(const Common::String &assetName, int roomNum = -1);
+ void playSound(const Common::String &assetName, int trigger, int val1);
public:
Room303() : Room() {}
More information about the Scummvm-git-logs
mailing list