[Scummvm-git-logs] scummvm master -> 7a074b407a83e811297b41b2762202489d00c0a5
dreammaster
noreply at scummvm.org
Sat Aug 3 17:39: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:
7a074b407a M4: RIDDLE: In progress room 304 daemon
Commit: 7a074b407a83e811297b41b2762202489d00c0a5
https://github.com/scummvm/scummvm/commit/7a074b407a83e811297b41b2762202489d00c0a5
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-08-03T10:38:56-07:00
Commit Message:
M4: RIDDLE: In progress room 304 daemon
Changed paths:
engines/m4/adv_r/adv_hotspot.cpp
engines/m4/adv_r/adv_hotspot.h
engines/m4/graphics/gr_series.cpp
engines/m4/graphics/gr_series.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/room304.cpp
engines/m4/riddle/rooms/section3/room304.h
engines/m4/riddle/rooms/section3/section3.cpp
engines/m4/riddle/rooms/section3/section3.h
diff --git a/engines/m4/adv_r/adv_hotspot.cpp b/engines/m4/adv_r/adv_hotspot.cpp
index 3b4565fbc8c..0a8a62dc095 100644
--- a/engines/m4/adv_r/adv_hotspot.cpp
+++ b/engines/m4/adv_r/adv_hotspot.cpp
@@ -23,6 +23,7 @@
#include "m4/core/cstring.h"
#include "m4/core/errors.h"
#include "m4/core/term.h"
+#include "m4/gui/gui_vmng.h"
#include "m4/mem/mem.h"
#include "m4/mem/memman.h"
#include "m4/vars.h"
@@ -167,6 +168,30 @@ HotSpotRec *hotspot_add(HotSpotRec *head, HotSpotRec *h, bool new_head) {
return head;
}
+HotSpotRec *hotspot_add_dynamic(const char *verb, const char *noun,
+ int32 x1, int32 y1, int32 x2, int32 y2, int32 cursor,
+ bool new_head, int32 walkto_x, int32 walkto_y, int32 facing) {
+ int32 status;
+ ScreenContext *sc = vmng_screen_find(_G(gameDrawBuff), &status);
+ y2 = MIN(y2, sc->y2);
+
+ HotSpotRec *hotspot = hotspot_new(x1, y1, x2, y2);
+ if (!hotspot)
+ error("hotspot_new failed");
+
+ hotspot_newVocab(hotspot, noun);
+ hotspot_newVocab(hotspot, verb);
+ hotspot->feet_x = walkto_x;
+ hotspot->feet_y = walkto_y;
+ hotspot->cursor_number = cursor;
+ hotspot->facing = facing;
+
+ _G(currentSceneDef).hotspots = hotspot_add(_G(currentSceneDef).hotspots,
+ hotspot, new_head);
+
+ return hotspot;
+}
+
void kill_hotspot_node(HotSpotRec *h) {
if (!h)
return;
diff --git a/engines/m4/adv_r/adv_hotspot.h b/engines/m4/adv_r/adv_hotspot.h
index efd2dded7d4..cedbd2453e2 100644
--- a/engines/m4/adv_r/adv_hotspot.h
+++ b/engines/m4/adv_r/adv_hotspot.h
@@ -46,7 +46,7 @@ struct HotSpotRec {
};
HotSpotRec *hotspot_add_dynamic(
- char *verb, char *noun,
+ const char *verb, const char *noun,
int32 x1, int32 y1, int32 x2, int32 y2,
int32 cursor,
bool new_head = true,
diff --git a/engines/m4/graphics/gr_series.cpp b/engines/m4/graphics/gr_series.cpp
index 5aa35f5ec6d..e9874b6f1d2 100644
--- a/engines/m4/graphics/gr_series.cpp
+++ b/engines/m4/graphics/gr_series.cpp
@@ -311,6 +311,18 @@ machine *series_ranged_play(const char *seriesName, int32 loopCount, uint32 flag
loopCount, s, 0, 0, firstFrame, lastFrame);
}
+machine *series_ranged_play_xy(const char *seriesName, int loopCount, int flags,
+ int firstFrame, int lastFrame, int x, int y, int s, int layer,
+ int frameRate, int trigger, bool stick_when_done) {
+ if (loopCount == 1)
+ loopCount = 0;
+ if (stick_when_done)
+ flags |= 0x10;
+
+ return series_play(seriesName, layer, flags, trigger, frameRate,
+ loopCount, s, x, y, firstFrame, lastFrame);
+}
+
machine *series_plain_play(const char *seriesName, int32 loopCount, uint32 flags,
int32 s, int32 layer, int32 frameRate, int32 trigger, bool stickWhenDone) {
if (stickWhenDone)
diff --git a/engines/m4/graphics/gr_series.h b/engines/m4/graphics/gr_series.h
index ecd0ffc37cf..0503bf2de9e 100644
--- a/engines/m4/graphics/gr_series.h
+++ b/engines/m4/graphics/gr_series.h
@@ -109,6 +109,9 @@ machine *series_show(const char *seriesName, frac16 layer, uint32 flags = 0,
machine *series_ranged_play(const char *seriesName, int32 loopCount, uint32 flags,
int32 firstFrame, int32 lastFrame, int32 s, uint32 layer,
int32 frameRate, int32 trigger = -1, bool stick_when_done = false);
+machine *series_ranged_play_xy(const char *seriesName, int loopCount, int flags,
+ int firstFrame, int lastFrame, int x, int y, int s, int layer,
+ int frameRate, int 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,
diff --git a/engines/m4/riddle/rooms/room.cpp b/engines/m4/riddle/rooms/room.cpp
index f57b3770991..01dceb3a059 100644
--- a/engines/m4/riddle/rooms/room.cpp
+++ b/engines/m4/riddle/rooms/room.cpp
@@ -342,6 +342,19 @@ void Room::sendWSMessage_150000(int trigger) {
sendWSMessage_150000(_G(my_walker), trigger);
}
+void Room::sendWSMessage_160000(machine *mach, int val1, int trigger) {
+ if (!trigger)
+ trigger = -1;
+
+ _G(globals)[V023] = kernel_trigger_create(trigger);
+ _G(globals)[V024] = val1 << 16;
+ sendWSMessage(0x160000, 0, mach, 0, nullptr, 1);
+}
+
+void Room::sendWSMessage_160000(int val1, int trigger) {
+ sendWSMessage_160000(_G(my_walker), val1, trigger);
+}
+
void Room::sendWSMessage_190000(machine *recv, int trigger) {
_G(globals)[V023] = trigger << 16;
sendWSMessage(0x190000, 0, recv, 0, nullptr, 1);
diff --git a/engines/m4/riddle/rooms/room.h b/engines/m4/riddle/rooms/room.h
index 5374da226cb..1467b0cd776 100644
--- a/engines/m4/riddle/rooms/room.h
+++ b/engines/m4/riddle/rooms/room.h
@@ -88,11 +88,11 @@ protected:
void sendWSMessage_140000(int trigger);
void sendWSMessage_150000(machine *mach, int trigger);
void sendWSMessage_150000(int trigger);
+ void sendWSMessage_160000(machine *mach, int val1, int trigger);
+ void sendWSMessage_160000(int val1, int trigger);
void sendWSMessage_190000(machine *recv, int trigger);
void sendWSMessage_1a0000(machine *recv, int trigger);
- int _roomVal1 = 0; // TODO: deprecate
-
public:
Room() : M4::Room() {}
~Room() override {}
diff --git a/engines/m4/riddle/rooms/section3/room303.cpp b/engines/m4/riddle/rooms/section3/room303.cpp
index 1f4949d569e..071cc3088b8 100644
--- a/engines/m4/riddle/rooms/section3/room303.cpp
+++ b/engines/m4/riddle/rooms/section3/room303.cpp
@@ -43,32 +43,6 @@ static const char *SAID[][2] = {
{ nullptr, nullptr }
};
-static const int16 NORMAL_DIRS[] = { 200, 201, 202, -1 };
-static const char *NORMAL_NAMES[] = {
- "Feng Li walk pos3",
- "Feng Li walk pos4",
- "Feng Li walk pos5"
-};
-static const int16 SHADOW_DIRS[] = { 210, 211, 212, -1 };
-static const char *SHADOW_NAMES[] = {
- "candleman shadow3",
- "candleman shadow4",
- "candleman shadow5"
-};
-
-static const int16 NORMAL_DIRS2[] = { 220, 221, 222, -1 };
-static const char *NORMAL_NAMES2[] = {
- "mei chen ny walker pos3",
- "mei chen ny walker pos4",
- "mei chen ny walker pos5"
-};
-static const int16 SHADOW_DIRS2[] = { 230, 231, 232, -1 };
-static const char *SHADOW_NAMES2[] = {
- "candleman shadow3",
- "candleman shadow4",
- "candleman shadow5"
-};
-
void Room303::preload() {
LoadWSAssets("OTHER SCRIPT");
@@ -128,8 +102,8 @@ void Room303::init() {
loadHands();
setShadow4(true);
- ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
- ws_walk_load_shadow_series(SHADOW_DIRS, SHADOW_NAMES);
+ ws_walk_load_walker_series(S3_NORMAL_DIRS, S3_NORMAL_NAMES);
+ ws_walk_load_shadow_series(S3_SHADOW_DIRS, S3_SHADOW_NAMES);
loadClasped();
if (_val13) {
@@ -172,9 +146,9 @@ void Room303::init() {
_door = series_show_sprite("DOOR", 7, 0xf05);
ws_demand_location(393, 260, 5);
- ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
- ws_walk_load_shadow_series(SHADOW_DIRS, SHADOW_NAMES);
- _machine1 = triggerMachineByHash_3000(8, 2, NORMAL_DIRS, SHADOW_DIRS,
+ ws_walk_load_walker_series(S3_NORMAL_DIRS, S3_NORMAL_NAMES);
+ ws_walk_load_shadow_series(S3_SHADOW_DIRS, S3_SHADOW_NAMES);
+ _machine1 = triggerMachineByHash_3000(8, 2, S3_NORMAL_DIRS, S3_SHADOW_DIRS,
470, 226, 9, triggerMachineByHashCallback3000, "fl");
_val13 = 1;
@@ -182,10 +156,10 @@ void Room303::init() {
setFengActive(true);
loadClasped();
- ws_walk_load_walker_series(NORMAL_DIRS2, NORMAL_NAMES2);
- ws_walk_load_shadow_series(SHADOW_DIRS2, SHADOW_NAMES2);
+ ws_walk_load_walker_series(S3_NORMAL_DIRS2, S3_NORMAL_NAMES2);
+ ws_walk_load_shadow_series(S3_SHADOW_DIRS2, S3_SHADOW_NAMES2);
- _hands4 = triggerMachineByHash_3000(8, 3, NORMAL_DIRS2, SHADOW_DIRS2,
+ _hands4 = triggerMachineByHash_3000(8, 3, S3_NORMAL_DIRS2, S3_SHADOW_DIRS2,
445, 215, 7, triggerMachineByHashCallback3000, "mc");
_gestTalk4 = series_load("mei ny lft hand gest talk pos4");
kernel_timing_trigger(1, 107);
@@ -201,8 +175,8 @@ void Room303::init() {
loadHands();
setShadow4(true);
- ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
- ws_walk_load_shadow_series(SHADOW_DIRS, SHADOW_NAMES);
+ ws_walk_load_walker_series(S3_NORMAL_DIRS, S3_NORMAL_NAMES);
+ ws_walk_load_shadow_series(S3_SHADOW_DIRS, S3_SHADOW_NAMES);
loadClasped();
_machine1 = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, 1,
@@ -228,8 +202,8 @@ void Room303::init() {
loadHands();
setShadow4(true);
- ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
- ws_walk_load_shadow_series(SHADOW_DIRS, SHADOW_NAMES);
+ ws_walk_load_walker_series(S3_NORMAL_DIRS, S3_NORMAL_NAMES);
+ ws_walk_load_shadow_series(S3_SHADOW_DIRS, S3_SHADOW_NAMES);
loadClasped();
_machine1 = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, 1,
@@ -255,8 +229,8 @@ void Room303::init() {
if (!player_been_here(301)) {
loadHands();
setShadow4(true);
- ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
- ws_walk_load_shadow_series(SHADOW_DIRS, SHADOW_NAMES);
+ ws_walk_load_walker_series(S3_NORMAL_DIRS, S3_NORMAL_NAMES);
+ ws_walk_load_shadow_series(S3_SHADOW_DIRS, S3_SHADOW_NAMES);
_val13 = 1;
loadClasped();
@@ -312,8 +286,8 @@ void Room303::init() {
loadHands();
setShadow4(true);
- ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
- ws_walk_load_shadow_series(SHADOW_DIRS, SHADOW_NAMES);
+ ws_walk_load_walker_series(S3_NORMAL_DIRS, S3_NORMAL_NAMES);
+ ws_walk_load_shadow_series(S3_SHADOW_DIRS, S3_SHADOW_NAMES);
_val13 = 1;
loadClasped();
@@ -1060,10 +1034,10 @@ void Room303::daemon() {
terminateMachineAndNull(_machine1);
if (_val13)
- _machine1 = triggerMachineByHash_3000(8, 2, NORMAL_DIRS, SHADOW_DIRS,
+ _machine1 = triggerMachineByHash_3000(8, 2, S3_NORMAL_DIRS, S3_SHADOW_DIRS,
480, 256, 7, triggerMachineByHashCallback3000, "fl walker");
else
- _machine1 = triggerMachineByHash_3000(8, 2, NORMAL_DIRS, SHADOW_DIRS,
+ _machine1 = triggerMachineByHash_3000(8, 2, S3_NORMAL_DIRS, S3_SHADOW_DIRS,
706, 256, 5, triggerMachineByHashCallback3000, "fl walker");
_G(kernel).trigger_mode = KT_PARSE;
diff --git a/engines/m4/riddle/rooms/section3/room304.cpp b/engines/m4/riddle/rooms/section3/room304.cpp
index 1d29a9e70a4..296e0885c37 100644
--- a/engines/m4/riddle/rooms/section3/room304.cpp
+++ b/engines/m4/riddle/rooms/section3/room304.cpp
@@ -35,7 +35,7 @@ void Room304::init() {
_val1 = 0;
if (_G(game).previous_room != KERNEL_RESTORING_GAME)
- _roomVal1 = 0;
+ _flag1 = false;
if (_G(game).previous_room == 303 && _G(flags)[V001])
_G(game).previous_room = 354;
@@ -156,9 +156,9 @@ void Room304::pre_parser() {
bool takeFlag = player_said("take");
bool gearFlag = player_said("gear");
- if (_roomVal1) {
+ if (_flag1) {
terminateMachineAndNull(_machine3);
- _roomVal1 = 0;
+ _flag1 = false;
intr_cancel_sentence();
hotspot_restore_all();
interface_show();
@@ -188,7 +188,179 @@ void Room304::pre_parser() {
}
void Room304::parser() {
- // TODO: parser
+ bool lookFlag = player_said_any("look", "look any");
+ bool takeFlag = player_said("take");
+ bool useFlag = player_said_any("push", "pull", "gear", "open", "close");
+
+ if (lookFlag && player_said("cartoon")) {
+ if (_G(flags)[V001]) {
+ digi_play("304r13", 1);
+
+ } else {
+ hotspot_hide_all();
+ interface_hide();
+ intr_cancel_sentence();
+ hotspot_add_dynamic("x", " ", 0, 0, 1500, 374, 0);
+
+ _flag1 = true;
+ _pu = series_show_sprite(_G(flags)[V000] ? "394pu99" : "304pu99", 0, 0);
+ digi_play("304r59", 1);
+ }
+ } else if (_G(kernel).trigger == 749) {
+ midi_stop();
+ } else if (_G(flags)[V001] && _val4) {
+ switch (_G(kernel).trigger) {
+ case 49:
+ ws_hide_walker();
+ _cobraKills = series_ranged_play("COBRA KILLS RIP AND LF",
+ 1, 0, 1, 4, 100, 0x200, 5, 50);
+ break;
+ case 50:
+ _cobraKills = series_ranged_play("COBRA KILLS RIP AND LF",
+ 1, 0, 5, 19, 100, 0x200, 5, 51);
+ digi_play("304_s07", 1);
+ break;
+ case 51:
+ _cobraKills = series_ranged_play("COBRA KILLS RIP AND LF",
+ 1, 0, 20, 41, 100, 0x200, 5, 54);
+ digi_play("304_s07", 1);
+ break;
+ case 52:
+ _cobraKills = series_ranged_play("COBRA KILLS RIP AND LF",
+ 1, 0, 51, 51, 100, 0x200, 3000, -1);
+ disable_player_commands_and_fade_init(-1);
+ midi_fade_volume(0, 120);
+ kernel_timing_trigger(120, 53);
+ break;
+ case 53:
+ _G(game).setRoom(413);
+ break;
+ case 54:
+ _cobraKills = series_ranged_play("COBRA KILLS RIP AND LF",
+ 1, 0, 42, 51, 100, 0x200, 5, 52);
+ digi_play("304_s12", 2);
+ break;
+ default:
+ break;
+ }
+ } else if (0) {
+ parserSwitch();
+
+ } else if (lookFlag && player_said_any("native mask", "shield")) {
+ digi_play("304r05", 1);
+ } else if (lookFlag && player_said("mailbag")) {
+ digi_play("304r15", 1);
+ } else if (lookFlag && player_said("picture")) {
+ digi_play("304r16", 1);
+ } else if (lookFlag && player_said("globe")) {
+ digi_play("304r18", 1);
+ } else if (lookFlag && player_said("vase")) {
+ digi_play("304r19", 1);
+ } else if (lookFlag && player_said_any("rug", "rug ")) {
+ digi_play("304r20", 1);
+ } else if (lookFlag && player_said("light switch")) {
+ digi_play("304r21", 1);
+ } else if (lookFlag && player_said("failing cabinet")) {
+ digi_play("304r29", 1);
+ } else if (takeFlag && player_said("flat file")) {
+ digi_play("304r30", 1);
+ } else if (takeFlag && player_said("cartoon")) {
+ digi_play("304r35", 1);
+ } else if (takeFlag && player_said("picture")) {
+ digi_play("304r36", 1);
+ } else if (useFlag && player_said("flat file")) {
+ digi_play(_G(flags)[V001] ? "304r46" : "304r76", 1);
+ } else if (useFlag && player_said("filing cabinet")) {
+ digi_play(_G(flags)[V001] ? "304r45" : "304r75", 1);
+ } else if (useFlag && player_said("trunk")) {
+ digi_play(_G(flags)[V001] ? "304r47" : "304r70", 1);
+ } else if (lookFlag && player_said("feng li")) {
+ digi_play("304r03", 1);
+ } else if (lookFlag && player_said("mei chen")) {
+ digi_play("304r04", 1);
+ } else if (lookFlag && player_said("beer stein") && _G(kernel).trigger == -1) {
+ digi_play("304r06", 1, 255, _G(flags)[V001] ? 1 : -1);
+ } else if (lookFlag && player_said("beer stein") && _G(kernel).trigger == 1) {
+ digi_play("304r07", 1);
+ } else if (lookFlag && player_said("desk")) {
+ digi_play(_G(flags)[V001] ? "304r08" : "304r56", 1);
+ } else if (lookFlag && player_said("filing cabinet")) {
+ digi_play(_G(flags)[V001] ? "304r09" : "304r57", 1);
+ } else if (lookFlag && player_said("flat file")) {
+ digi_play(_G(flags)[V001] ? "304r10" : "304r58", 1);
+ } else if (lookFlag && player_said("samurai sword")) {
+ digi_play("304r11", 1);
+ } else if (lookFlag && player_said("handling stick")) {
+ digi_play(_G(flags)[V001] ? "304r12" : "304r82", 1);
+ } else if (lookFlag && player_said("trunk")) {
+ if (_G(flags)[V001])
+ digi_play("304r14", 1);
+ else if (_G(flags)[V000] || _G(flags)[V084] == 1)
+ digi_play("304r61", 1);
+ else
+ digi_play("304r60", 1);
+ } else if (lookFlag && player_said("bookshelf")) {
+ digi_play(_G(flags)[V001] ? "304r17" : "304r62", 1);
+ } else if (player_said("exit")) {
+ if (_G(flags)[V001]) {
+ digi_play("304r01", 1);
+ } else {
+ switch (_G(kernel).trigger) {
+ case -1:
+ disable_player_commands_and_fade_init(1);
+ break;
+ case 1:
+ _G(game).setRoom(303);
+ break;
+ default:
+ break;
+ }
+ }
+ } else if (takeFlag && player_said("native mask")) {
+ digi_play(_G(flags)[V001] ? "304r25" : "304r66", 1);
+ } else if (takeFlag && player_said("shield")) {
+ digi_play(_G(flags)[V001] ? "304r26" : "304r67", 1);
+ } else if (takeFlag && player_said("samurai sword") && _G(flags)[V084] == 2) {
+ digi_play("304r64", 1);
+ } else if (takeFlag && player_said("handling stick") && _G(flags)[V084] == 1) {
+ digi_play("304r65", 1);
+ } else if (takeFlag && player_said("beer stein")) {
+ digi_play(_G(flags)[V001] ? "304r27" : "304r68", 1);
+ } else if (takeFlag && player_said("desk")) {
+ digi_play(_G(flags)[V001] ? "304r28" : "304r69", 1);
+ } else if (takeFlag && player_said("trunk")) {
+ digi_play(_G(flags)[V001] ? "304r31" : "304r70", 1);
+ } else if (takeFlag && player_said("mailbag")) {
+ digi_play("304r32", 1);
+ } else if (takeFlag && player_said("globe")) {
+ digi_play(_G(flags)[V001] ? "304r33" : "304r71", 1);
+ } else if (takeFlag && player_said("vase")) {
+ digi_play(_G(flags)[V001] ? "304r34" : "304r72", 1);
+ } else if (takeFlag && player_said("bookshelf")) {
+ digi_play(_G(flags)[V001] ? "304r37" : "304r37a", 1);
+ } else if (takeFlag && player_said("rug")) {
+ digi_play("304r73", 1);
+ } else if (takeFlag && player_said("rug ")) {
+ digi_play("304r38", 1);
+ } else if (useFlag && player_said("cartoon") && _G(player).click_x > 534) {
+ digi_play(_G(flags)[V001] ? "304r13" : "304r77", 1);
+ } else if (takeFlag && _G(player).click_y <= 374 && _G(flags)[V001]) {
+ switch (imath_ranged_rand(1, 3)) {
+ case 1:
+ digi_play("304r39", 1);
+ break;
+ case 2:
+ digi_play("304r40", 1);
+ break;
+ case 3:
+ digi_play("304r41", 1);
+ break;
+ default:
+ break;
+ }
+ } else {
+ return;
+ }
}
void Room304::intrMsg(frac16 myMessage, struct machine *sender) {
@@ -246,6 +418,256 @@ void Room304::intrMsg(frac16 myMessage, struct machine *sender) {
}
}
+void Room304::parserSwitch() {
+ switch (_G(kernel).trigger) {
+ case 13:
+ series_stream_break_on_frame(_field64, 29, 14);
+ digi_play("304_s03", 1);
+ break;
+ case 14:
+ series_stream_break_on_frame(_field64, 106, 15);
+ digi_play("304_s08", 1);
+ break;
+ case 15:
+ series_stream_break_on_frame(_field64, 111, 16);
+ digi_play("304_s02", 1);
+ break;
+ case 16:
+ series_stream_break_on_frame(_field64, 145, 19);
+ midi_stop();
+ digi_play("304_s11", 1);
+ break;
+ case 17:
+ if (_G(flags)[V084] == 1) {
+ digi_unload("304_s10");
+ digi_unload("304_s05");
+ series_show_sprite("one frame dead snake", 0, 0x100);
+ } else if (_G(flags)[V084] == 2) {
+ digi_unload("304_s03");
+ digi_unload("304_s08");
+ digi_unload("304_s02");
+ digi_unload("304_s11");
+ }
+
+ terminateMachineAndNull(_machine1);
+ series_unload(_mei1);
+ series_unload(_mei2);
+
+ ws_unhide_walker();
+ player_update_info();
+ ws_demand_location(_G(player_info).x + 28,
+ _G(player_info).y + 9);
+
+ ws_walk_load_walker_series(S3_NORMAL_DIRS2, S3_NORMAL_NAMES2);
+ ws_walk_load_shadow_series(S3_SHADOW_DIRS2, S3_SHADOW_NAMES2);
+
+ _headUp1 = series_load("fl returns to head up");
+ _headUp2 = series_ranged_play("fl returns to head up",
+ 1, 0, 0, 0, 100, 0x100, 250, 31);
+ _machine1 = triggerMachineByHash_3000(8, 3, S3_NORMAL_DIRS2, S3_SHADOW_DIRS2,
+ 464, 283, 8, triggerMachineByHashCallback3000, "mc");
+ ws_demand_facing(8);
+ kernel_timing_trigger(1, 74);
+ break;
+
+ case 18:
+ sendWSMessage_10000(_machine1, 73, 275, 3, 20, 0);
+ break;
+
+ case 19:
+ digi_play("com125", 1);
+ break;
+
+ case 20:
+ sendWSMessage_10000(_machine1, 29, 295, 3, 21, 1);
+ break;
+
+ case 21:
+ series_unload(_suit1);
+ terminateMachineAndNull(_headUp2);
+ series_unload(_headUp1);
+
+ _headUp1 = series_load("lf talk 1");
+ ws_hide_walker(_machine1);
+ series_unload(221);
+ series_unload(222);
+
+ _suit1 = series_load("suit chin in hand pos3");
+ _suit2 = series_load("mc hands out talk pos3");
+ _suit3 = series_load("MC UNTIES LF");
+
+ series_ranged_play("MC UNTIES LF", 1, 0, 1, 21, 100, 0xa05, 5, 222);
+ break;
+
+ case 22:
+ ws_unhide_walker(_machine1);
+ setGlobals1(_suit1, 1, 15, 15, 15, 1, 16, 19, 20, 23, 1);
+ sendWSMessage_110000(-1);
+
+ _headUp2 = series_ranged_play("MC UNTIES LF", -1, 0, 82, 82, 100, 0x200, 250);
+ setGlobals3(_suit2, 1, 24);
+ sendWSMessage_F0000(_machine1, 23);
+ digi_play("304m04", 1);
+ break;
+
+ case 23:
+ terminateMachineAndNull(_headUp2);
+ series_unload(_suit2);
+ series_ranged_play("MC UNITES LF", 1, 1, 83, 98, 100, 0xf05, 7, 25);
+ digi_play("304f02", 1);
+ break;
+
+ case 25:
+ series_unload(_suit3);
+ _headUp2 = series_ranged_play("MC UNTIES LF", -1, 0, 98, 98, 100, 0x200, 250);
+ kernel_timing_trigger(20, 26);
+ break;
+
+ case 26:
+ digi_play("304r48", 1, 255, 27);
+ sendWSMessage_120000(-1);
+ break;
+
+ case 27:
+ terminateMachineAndNull(_headUp2);
+ sendWSMessage_110000(28);
+ _headUp2 = series_ranged_play("lf talk 2", 1, 1, 5, 10, 100, 0x100, 6, 33);
+ digi_play("304f03", 1);
+ break;
+
+ case 28:
+ sendWSMessage_140000(29);
+ break;
+
+ case 29:
+ series_unload(_suit1);
+ _suit1 = series_load("rip suit arms x point pos3");
+ setGlobals1(_suit1, 1, 13, 14, 14, 1, 14, 14, 14, 19, 1,
+ 14, 44, 44, 44, 1, 0, 0, 0, 0, 0);
+ sendWSMessage_110000(34);
+ digi_play("304r49", 1, 255, 35);
+ break;
+
+ case 31:
+ terminateMachineAndNull(_headUp2);
+ series_ranged_play("fl returns to head up", 1, 0, 1, 6, 100, 0x100, 7, 32);
+ break;
+
+ case 32:
+ _headUp2 = series_ranged_play("fl returns to head up", -1, 0, 6, 6, 100, 0x100, 300);
+ break;
+
+ case 33:
+ _headUp2 = series_ranged_play("fl talk 1", -1, 0, 0, 0, 100, 0x200, 250);
+ break;
+
+ case 34:
+ sendWSMessage_120000(-1);
+ break;
+
+ case 35:
+ sendWSMessage_110000(36);
+ break;
+
+ case 36:
+ terminateMachineAndNull(_headUp2);
+ _headUp2 = series_ranged_play("lf talk 1", 1, 1, 0, 14, 100, 0xa00, 6, 37);
+ digi_play("304f04", 1, 255);
+ break;
+
+ case 37:
+ _headUp2 = series_ranged_play("lf talk 1", -1, 0, 0, 0, 100, 0x200, 250);
+ _suit3 = series_load("mc stand and talk pos3");
+ setGlobals1(_suit3, 1, 1, 1, 8, 1);
+ sendWSMessage_110000(_machine1, 38);
+ digi_play("304m05", 1, 255, 38);
+ break;
+
+ case 38:
+ if (_ctr1 >= 1) {
+ _ctr1 = 0;
+ sendWSMessage_140000(_machine1, 39);
+ } else {
+ ++_ctr1;
+ }
+ break;
+
+ case 39:
+ series_unload(_suit3);
+ sendWSMessage_160000(3, 44);
+ kernel_timing_trigger(30, 67);
+ break;
+
+ case 40:
+ series_unload(_suit1);
+ _safe1 = series_load("rip opens safe part 1");
+ _safe2 = series_load("rip opens safe part 2");
+ ws_walk(510, 300, 0, 43, 3);
+ digi_preload("304r51");
+ digi_play("304r51", 1, 255, 79);
+ break;
+
+ case 43:
+ player_update_info();
+ ws_hide_walker();
+ digi_preload("304_s04");
+ digi_preload("304f05");
+ digi_preload("304r52");
+ series_plain_play("rip opens safe part 1", 1, 0, 100, 0, 5, 45);
+ break;
+
+ case 44:
+ sendWSMessage_150000(40);
+ break;
+
+ case 45:
+ series_plain_play("rip opens safe part 2", 1, 0, 100, 0, 5, 46);
+ digi_play("304_s01", 2);
+ break;
+
+ case 46:
+ _safe3 = series_stream("RIP OPENS SAFE PART 3", 5, 0, 49);
+ series_stream_break_on_frame(_safe3, 44, 53);
+ digi_play("304_s04", 2);
+ break;
+
+ case 47:
+ terminateMachineAndNull(_headUp2);
+ _headUp2 = series_ranged_play("lf talk 1", 1, 1, 0, 4, 100, 0xa00, 6, 48);
+ digi_play("304f05", 1, 255, 54);
+ break;
+
+ case 48:
+ _headUp2 = series_ranged_play("lf talk 1", -1, 0, 0, 0, 100, 0x200, 250);
+ break;
+
+ case 49:
+ ws_unhide_walker();
+ series_unload(_safe1);
+ series_unload(_safe2);
+ _safe1 = series_load("one frame safe open");
+ series_show_sprite("one frame safe open", 0, 0xa00);
+ _suit3 = series_load("mc hand to chin pos3");
+ ws_walk(260, 279, nullptr, 80, 8);
+ break;
+
+ case 51:
+ digi_unload("304_s04");
+ digi_unload("304_f05");
+ digi_unload("304r52");
+ sendWSMessage_140000(-1);
+ ws_hide_walker();
+
+ _field60 = series_ranged_play_xy("mc hand to chin pos3",
+ 1, 0, 0, 17, 29, 295, 100, 0x100, 9);
+ digi_play("304m06", 1, 255, 55);
+ break;
+ // TODO
+ default:
+ break;
+ }
+}
+
} // namespace Rooms
} // namespace Riddle
} // namespace M4
diff --git a/engines/m4/riddle/rooms/section3/room304.h b/engines/m4/riddle/rooms/section3/room304.h
index 8a326d30c01..3e287a3c41d 100644
--- a/engines/m4/riddle/rooms/section3/room304.h
+++ b/engines/m4/riddle/rooms/section3/room304.h
@@ -30,6 +30,7 @@ namespace Rooms {
class Room304 : public Room {
private:
+ bool _flag1 = false;
int _val1 = 0;
int _val2 = 0;
int _val3 = 0;
@@ -42,13 +43,28 @@ private:
machine *_machine1 = nullptr;
machine *_machine2 = nullptr;
machine *_machine3 = nullptr;
+ machine *_pu = nullptr;
+ machine *_cobraKills = nullptr;
+ machine *_field64 = nullptr;
+ machine *_field60 = nullptr;
int _cutSnake = -1;
int _mei1 = -1;
int _mei2 = -1;
int _mei3 = -1;
int _cobra = -1;
+ int _headUp1 = -1;
+ machine *_headUp2 = nullptr;
+ int _suit1 = 0;
+ int _suit2 = 0;
+ int _suit3 = 0;
+ int _safe1 = 0;
+ int _safe2 = 0;
+ machine *_safe3 = nullptr;
+
+ int _ctr1 = 0;
static void intrMsg(frac16 myMessage, struct machine *sender);
+ void parserSwitch();
public:
Room304() : Room() {}
diff --git a/engines/m4/riddle/rooms/section3/section3.cpp b/engines/m4/riddle/rooms/section3/section3.cpp
index 5b82befb699..4e593748c3f 100644
--- a/engines/m4/riddle/rooms/section3/section3.cpp
+++ b/engines/m4/riddle/rooms/section3/section3.cpp
@@ -26,6 +26,33 @@ namespace M4 {
namespace Riddle {
namespace Rooms {
+const int16 S3_NORMAL_DIRS[] = { 200, 201, 202, -1 };
+const char *S3_NORMAL_NAMES[] = {
+ "Feng Li walk pos3",
+ "Feng Li walk pos4",
+ "Feng Li walk pos5"
+};
+const int16 S3_SHADOW_DIRS[] = { 210, 211, 212, -1 };
+const char *S3_SHADOW_NAMES[] = {
+ "candleman shadow3",
+ "candleman shadow4",
+ "candleman shadow5"
+};
+
+const int16 S3_NORMAL_DIRS2[] = { 220, 221, 222, -1 };
+const char *S3_NORMAL_NAMES2[] = {
+ "mei chen ny walker pos3",
+ "mei chen ny walker pos4",
+ "mei chen ny walker pos5"
+};
+const int16 S3_SHADOW_DIRS2[] = { 230, 231, 232, -1 };
+const char *S3_SHADOW_NAMES2[] = {
+ "candleman shadow3",
+ "candleman shadow4",
+ "candleman shadow5"
+};
+
+
Section3::Section3() : Rooms::Section() {
add(301, &_room301);
add(303, &_room303);
diff --git a/engines/m4/riddle/rooms/section3/section3.h b/engines/m4/riddle/rooms/section3/section3.h
index 8eae84ec8d7..c003c6cc9cb 100644
--- a/engines/m4/riddle/rooms/section3/section3.h
+++ b/engines/m4/riddle/rooms/section3/section3.h
@@ -35,6 +35,16 @@ namespace M4 {
namespace Riddle {
namespace Rooms {
+extern const int16 S3_NORMAL_DIRS[];
+extern const char *S3_NORMAL_NAMES[];
+extern const int16 S3_SHADOW_DIRS[];
+extern const char *S3_SHADOW_NAMES[];
+extern const int16 S3_NORMAL_DIRS2[];
+extern const char *S3_NORMAL_NAMES2[];
+extern const int16 S3_SHADOW_DIRS2[];
+extern const char *S3_SHADOW_NAMES2[];
+
+
class Section3 : public Section {
private:
Room301 _room301;
More information about the Scummvm-git-logs
mailing list