[Scummvm-git-logs] scummvm master -> 8c7991a66defcb48e29fbfbd1b198f7f94af1052
dreammaster
noreply at scummvm.org
Wed Jul 31 03:38:37 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:
8c7991a66d M4: RIDDLE: Finished room 303 parser
Commit: 8c7991a66defcb48e29fbfbd1b198f7f94af1052
https://github.com/scummvm/scummvm/commit/8c7991a66defcb48e29fbfbd1b198f7f94af1052
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-07-30T20:38:29-07:00
Commit Message:
M4: RIDDLE: Finished room 303 parser
Changed paths:
engines/m4/adv_r/conv_io.cpp
engines/m4/adv_r/conv_io.h
engines/m4/graphics/gr_series.cpp
engines/m4/graphics/gr_series.h
engines/m4/platform/sound/midi.cpp
engines/m4/platform/sound/midi.h
engines/m4/riddle/rooms/section3/room303.cpp
engines/m4/riddle/rooms/section3/room303.h
engines/m4/riddle/walker.cpp
engines/m4/riddle/walker.h
diff --git a/engines/m4/adv_r/conv_io.cpp b/engines/m4/adv_r/conv_io.cpp
index 1c1040bfc6d..d3b4b181428 100644
--- a/engines/m4/adv_r/conv_io.cpp
+++ b/engines/m4/adv_r/conv_io.cpp
@@ -127,6 +127,10 @@ void conv_play(Conv *c) {
conv_go(c);
}
+void conv_play() {
+ conv_play(conv_get_handle());
+}
+
int32 conv_current_node() {
if (conv_get_handle())
return conv_get_handle()->node_hash;
diff --git a/engines/m4/adv_r/conv_io.h b/engines/m4/adv_r/conv_io.h
index c672dcd54cd..f9a40f604e2 100644
--- a/engines/m4/adv_r/conv_io.h
+++ b/engines/m4/adv_r/conv_io.h
@@ -107,6 +107,7 @@ void conv_reset(char *filename);
void conv_reset_all();
void conv_play(Conv *c);
+void conv_play();
void set_conv_name(const char *s);
const char *get_conv_name();
diff --git a/engines/m4/graphics/gr_series.cpp b/engines/m4/graphics/gr_series.cpp
index 56088990de9..5aa35f5ec6d 100644
--- a/engines/m4/graphics/gr_series.cpp
+++ b/engines/m4/graphics/gr_series.cpp
@@ -321,6 +321,14 @@ machine *series_plain_play(const char *seriesName, int32 loopCount, uint32 flags
return series_play(seriesName, layer, flags, trigger, frameRate, loopCount, s);
}
+machine *series_play_xy(const char *seriesName, int loopCount, int flags,
+ int x, int y, int scale, int depth, int layer, int frameRate) {
+ // TODO: proper implementation
+ warning("TODO: series_play_xy");
+ return series_play(seriesName, layer, flags, -1, frameRate, loopCount,
+ scale, x, y);
+}
+
void series_stream_check_series(machine *m, int val) {
// TODO: series_stream_check_series
error("TODO: series_stream_check_series");
diff --git a/engines/m4/graphics/gr_series.h b/engines/m4/graphics/gr_series.h
index 9c69839057e..ecd0ffc37cf 100644
--- a/engines/m4/graphics/gr_series.h
+++ b/engines/m4/graphics/gr_series.h
@@ -111,6 +111,8 @@ machine *series_ranged_play(const char *seriesName, int32 loopCount, uint32 flag
int32 frameRate, int32 trigger = -1, bool stick_when_done = false);
machine *series_plain_play(const char *seriesName, int32 loopCount, uint32 flags,
int32 s, int32 layer, int32 frameRate, int32 trigger = -1, bool stickWhenDone = false);
+machine *series_play_xy(const char *seriesName, int loopCount, int flags,
+ int x, int y, int scale, int depth, int layer, int frameRate);
machine *series_stream(const char *seriesName, int32 frameRate, int32 layer, int32 trigger);
bool series_stream_break_on_frame(machine *m, int32 frameNum, int32 trigger);
diff --git a/engines/m4/platform/sound/midi.cpp b/engines/m4/platform/sound/midi.cpp
index 780df227dd5..a0d46a2a85f 100644
--- a/engines/m4/platform/sound/midi.cpp
+++ b/engines/m4/platform/sound/midi.cpp
@@ -63,4 +63,8 @@ void midi_set_overall_volume(int vol) {
_G(midi).set_overall_volume(vol);
}
+void midi_fade_volume(int val1, int val2) {
+ warning("TODO: midi_fade_volume");
+}
+
} // namespace M4
diff --git a/engines/m4/platform/sound/midi.h b/engines/m4/platform/sound/midi.h
index 3997a408e0d..e84ddf08001 100644
--- a/engines/m4/platform/sound/midi.h
+++ b/engines/m4/platform/sound/midi.h
@@ -43,6 +43,7 @@ void midi_play(const char *name, int volume, int loop, int trigger, int roomNum)
void midi_loop();
void midi_stop();
void midi_set_overall_volume(int vol);
+void midi_fade_volume(int val1, int val2);
} // namespace M4
diff --git a/engines/m4/riddle/rooms/section3/room303.cpp b/engines/m4/riddle/rooms/section3/room303.cpp
index ff74f45aac7..0409a1cb5ca 100644
--- a/engines/m4/riddle/rooms/section3/room303.cpp
+++ b/engines/m4/riddle/rooms/section3/room303.cpp
@@ -31,6 +31,15 @@ namespace M4 {
namespace Riddle {
namespace Rooms {
+static const char *SAID[][2] = {
+ { "IRON MAIDEN", "303R29" },
+ { "MUMMY WITH HAIR", "303R30" },
+ { "MAN WITH HAMMER", "303R33" },
+ { "TICKET WINDOW", "303R34" },
+ { "PICTURE", "303R35" },
+ { nullptr, nullptr }
+};
+
void Room303::preload() {
LoadWSAssets("OTHER SCRIPT");
@@ -638,8 +647,270 @@ void Room303::parser() {
break;
}
}
+ } else if (lookFlag && player_said("giant matchstick")) {
+ if (_G(flags)[V000] == 1) {
+ digi_play("303r36", 1);
+ } else {
+ switch (_G(kernel).trigger) {
+ case -1:
+ case 666:
+ player_set_commands_allowed(false);
+ _chinTalk4 = series_load("rip suit talker pos4");
+ setGlobals4(_chinTalk4, 1, 1, 5);
+ sendWSMessage_C0000(1);
+ break;
+
+ case 2:
+ sendWSMessage_D0000();
+ digi_play("303r25", 1, 255, 3);
+ break;
+
+ case 3:
+ digi_play("303F12", 1, 255, 4);
+ _val15 = 2;
+ sendWSMessage_B0000(0);
+ break;
+
+ case 4:
+ _val15 = 1;
+ series_unload(_chinTalk4);
+ break;
+
+ default:
+ break;
+ }
+ }
+ } else if (player_said("open")) {
+ if (player_been_here(301)) {
+ switch (_G(kernel).trigger) {
+ case -1:
+ ws_walk(409, 266, nullptr, 1, 1);
+ break;
+
+ case 1:
+ player_set_commands_allowed(false);
+ _med1 = series_load("RIP TREK MED REACH HAND POS1");
+ setGlobals1(_med1, 1, 10, 10, 10, 1);
+ sendWSMessage_110000(2);
+ break;
+
+ case 2:
+ sendWSMessage_140000(4);
+ terminateMachineAndNull(_door);
+ series_plain_play("DOOR", 1, 0, 100, 0xf05, 7, 3);
+ digi_play("303_s01", 1);
+ break;
+
+ case 3:
+ series_show_sprite("DOOR", 7, 0xf05);
+ break;
+
+ case 4:
+ ws_walk(417, 232, nullptr, -1, 2);
+ break;
+
+ case 5:
+ _G(game).setRoom(304);
+ break;
+
+ default:
+ break;
+ }
+ } else {
+ switch (_G(kernel).trigger) {
+ case -1:
+ player_set_commands_allowed(false);
+ player_update_info();
+ ws_hide_walker();
+ _ripsh1 = series_place_sprite("ripsh1", 0,
+ _G(player_info).x, _G(player_info).y, _G(player_info).scale,
+ _G(player_info).depth + 1);
+ _med1 = series_load("SUIT DOOR OPENER POS1");
+
+ series_play_xy("SUIT DOOR OPENER POS1", 1, 0, 405, 266,
+ _G(player_info).scale, _G(player_info).depth, 7, 1);
+ break;
+
+ case 2:
+ series_show_sprite("DOOR", 7, 0xf05);
+ break;
- // TODO
+ case 3:
+ ws_unhide_walker();
+ terminateMachineAndNull(_ripsh1);
+ kernel_timing_trigger(10, 4);
+ break;
+
+ case 4:
+ ws_walk(417, 232, nullptr, -1, 2);
+ disable_player_commands_and_fade_init(6);
+ break;
+
+ case 6:
+ digi_stop(3);
+ _G(game).setRoom(304);
+ break;
+
+ default:
+ break;
+ }
+ }
+ } else if (lookFlag && player_said("cobra case")) {
+ digi_play(player_been_here(201) ? "203r38" : "303r32", 1);
+ } else if ((lookFlag || player_said("peer into")) &&
+ player_said("copper tank viewer")) {
+ if (player_been_here(301)) {
+ switch (_G(kernel).trigger) {
+ case -1:
+ player_set_commands_allowed(false);
+ _ripBends = series_load("rip trek bends to viewer");
+ setGlobals1(_ripBends, 1, 17, 17, 17, 1);
+ sendWSMessage_110000(-1);
+ disable_player_commands_and_fade_init(1);
+ break;
+
+ case 1:
+ _G(game).setRoom(309);
+ interface_hide();
+ break;
+
+ default:
+ break;
+ }
+ } else {
+ switch (_G(kernel).trigger) {
+ case -1:
+ player_set_commands_allowed(false);
+ _ripBends = series_load("RIP BENDS TO SEE CREATURE");
+ setGlobals1(_ripBends, 1, 26, 26, 26);
+ sendWSMessage_110000(1);
+ break;
+
+ case 1:
+ disable_player_commands_and_fade_init(2);
+ break;
+
+ case 2:
+ _G(game).setRoom(309);
+ interface_hide();
+ break;
+ default:
+ break;
+ }
+ }
+ } else if (player_said("TALK MEI CHEN")) {
+ player_set_commands_allowed(false);
+ _suit1 = series_load("SUIT CHIN IN HAND POS2");
+ _suit2 = series_load("RIP SUIT RT HAND GEST TALK POS2");
+ _meiLips = series_load("MEI PUTS FINGER TO LIPS");
+ _ripGesture = series_load("RIP HNDS HIPS GEST TALK");
+ player_update_info();
+ ws_hide_walker();
+
+ _ripsh2 = series_show("ripsh2", 0xf00, 128, -1, 0,
+ _G(player_info).scale, _G(player_info).x, _G(player_info).y);
+ _machine3 = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
+ _G(player_info).x, _G(player_info).y, _G(player_info).scale + 1,
+ 0x500, 1, triggerMachineByHashCallbackNegative, "rip");
+
+ _G(kernel).trigger_mode = KT_DAEMON;
+ sendWSMessage_10000(1, _machine3, 1, 1, 1, 300, 1, 1, 1, 0);
+
+ _val17 = _val16 = 0;
+ _G(kernel).trigger_mode = KT_PARSE;
+
+ conv_load("conv303b", 10, 10, 747);
+ conv_play(conv_get_handle());
+ _val11 = 4;
+ _val16 = 0;
+
+ } else if (_G(kernel).trigger == 747) {
+ midi_fade_volume(0, 120);
+ kernel_timing_trigger(120, 749);
+ _lonelyFlag = false;
+ _val7 = 1;
+ _val11 = 0;
+ _val16 = 5;
+
+ } else if (_G(kernel).trigger == 749) {
+ midi_stop();
+
+ } else if (player_said("TALK FL")) {
+ _suit1 = series_load("SUIT CHIN IN HAND POS2");
+ _suit2 = series_load("RIP SUIT RT HAND GEST TALK POS2");
+ _ripGesture = series_load("RIP HNDS HIPS GEST TALK");
+ player_update_info();
+ ws_hide_walker();
+
+ if (_val13) {
+ _ripsh2 = series_show("ripsh2", 0xf00, 0, -1, -1, 0,
+ _G(player_info).scale, _G(player_info).x, _G(player_info).y);
+ _machine3 = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
+ _G(player_info).x, _G(player_info).y, _G(player_info).scale + 1,
+ 0x500, 0, triggerMachineByHashCallbackNegative, "rip");
+
+ } else {
+ _ripsh2 = series_show("ripsh2", 0xf00, 128, -1, -1, 0,
+ _G(player_info).scale, _G(player_info).x, _G(player_info).y);
+ _machine3 = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
+ _G(player_info).x, _G(player_info).y, _G(player_info).scale + 1,
+ 0x500, 1, triggerMachineByHashCallbackNegative, "rip");
+ }
+
+ _G(kernel).trigger_mode = KT_DAEMON;
+ sendWSMessage_10000(1, _machine3, 1, 1, 1, 300, 1, 1, 1, 0);
+ _val16 = _val17 = 0;
+
+ _G(kernel).trigger_mode = KT_PARSE;
+ player_set_commands_allowed(false);
+ conv_load("conv303a", 10, 10, 748);
+
+ conv_export_value(conv_get_handle(), _G(flags)[V086], 0);
+ conv_play();
+ _val15 = 1;
+ _val16 = 0;
+
+ } else if (_G(kernel).trigger == 748) {
+ _G(flags)[V082] = 1;
+ _G(flags)[V083] = 1;
+ midi_fade_volume(0, 120);
+ kernel_timing_trigger(120, 749);
+ _lonelyFlag = false;
+ _val15 = 4;
+ _val16 = 5;
+
+ } else if (player_said("exit left")) {
+ switch (_G(kernel).trigger) {
+ case -1:
+ player_set_commands_allowed(false);
+ disable_player_commands_and_fade_init(1);
+ break;
+
+ case 1:
+ digi_stop(3);
+ _G(game).setRoom(305);
+ break;
+
+ default:
+ break;
+ }
+ } else if (lookFlag && _G(walker).ripley_said(SAID)) {
+ // Already handled
+ } else if (player_said("exit right")) {
+ switch (_G(kernel).trigger) {
+ case -1:
+ player_set_commands_allowed(false);
+ disable_player_commands_and_fade_init(1);
+ break;
+
+ case 1:
+ digi_stop(3);
+ _G(game).setRoom(301);
+ break;
+
+ default:
+ break;
+ }
} else {
return;
}
diff --git a/engines/m4/riddle/rooms/section3/room303.h b/engines/m4/riddle/rooms/section3/room303.h
index cceba51f183..46afb897d8c 100644
--- a/engines/m4/riddle/rooms/section3/room303.h
+++ b/engines/m4/riddle/rooms/section3/room303.h
@@ -46,6 +46,7 @@ private:
int _val14 = 0;
int _val15 = 0;
int _val16 = 0;
+ int _val17 = 0;
KernelTriggerType _triggerMode1 = KT_DAEMON;
KernelTriggerType _triggerMode2 = KT_DAEMON;
machine *_door = nullptr;
@@ -61,10 +62,18 @@ private:
machine *_shadow5 = nullptr;
machine *_machine1 = nullptr;
machine *_machine2 = nullptr;
+ machine *_machine3 = nullptr;
machine *_ripPonders = nullptr;
int _gestTalk4 = 0;
int _ripBends = 0;
int _chinTalk4 = 0;
+ int _med1 = 0;
+ machine *_ripsh1 = nullptr;
+ machine *_ripsh2 = nullptr;
+ int _suit1 = 0;
+ int _suit2 = 0;
+ int _meiLips = 0;
+ int _ripGesture = 0;
static void escapePressed(void *, void *);
diff --git a/engines/m4/riddle/walker.cpp b/engines/m4/riddle/walker.cpp
index c135744e59d..e6736db10f4 100644
--- a/engines/m4/riddle/walker.cpp
+++ b/engines/m4/riddle/walker.cpp
@@ -169,6 +169,20 @@ void Walker::unloadSprites() {
}
}
+bool Walker::ripley_said(const char *list[][2]) {
+ if (!list)
+ return false;
+
+ for (int index = 0; list[index][0]; ++index) {
+ if (player_said(list[index][0])) {
+ digi_play(list[index][1], 1);
+ return true;
+ }
+ }
+
+ return false;
+}
+
void enable_player() {
player_set_commands_allowed(true);
ws_unhide_walker(_G(my_walker));
diff --git a/engines/m4/riddle/walker.h b/engines/m4/riddle/walker.h
index 3ce50d50622..5160cd847fc 100644
--- a/engines/m4/riddle/walker.h
+++ b/engines/m4/riddle/walker.h
@@ -56,6 +56,8 @@ public:
void reset_walker_sprites();
static void unloadSprites();
+
+ bool ripley_said(const char *list[][2]);
};
void enable_player();
More information about the Scummvm-git-logs
mailing list