[Scummvm-git-logs] scummvm master -> cdaa16dea7472dd5d6bf797ccc7360b7cf370e0e
dreammaster
noreply at scummvm.org
Sun Jul 28 03:44:45 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:
cdaa16dea7 M4: RIDDLE: Added room 303 init
Commit: cdaa16dea7472dd5d6bf797ccc7360b7cf370e0e
https://github.com/scummvm/scummvm/commit/cdaa16dea7472dd5d6bf797ccc7360b7cf370e0e
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-07-27T20:44:35-07:00
Commit Message:
M4: RIDDLE: Added room 303 init
Changed paths:
engines/m4/adv_r/adv_walk.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_walk.h b/engines/m4/adv_r/adv_walk.h
index 69cb5960624..02c7fa55b5a 100644
--- a/engines/m4/adv_r/adv_walk.h
+++ b/engines/m4/adv_r/adv_walk.h
@@ -64,7 +64,7 @@ void ws_get_walker_info(machine *myWalker, int32 *x, int32 *y, int32 *s, int32 *
bool ws_walk_init_system();
bool ws_walk_load_series(const int16 *dir_array, const char *name_array[], bool shadow_flag, bool load_palette);
-bool ws_walk_load_walker_series(const int16 *dir_array, const char *name_array[], bool load_palette);
+bool ws_walk_load_walker_series(const int16 *dir_array, const char *name_array[], bool load_palette = false);
bool ws_walk_load_shadow_series(const int16 *dir_array, const char *name_array[]);
void ws_walk_dump_series(int16 num_directions, int16 start_hash);
diff --git a/engines/m4/riddle/rooms/room.cpp b/engines/m4/riddle/rooms/room.cpp
index fe4cacc2772..da2b53c57ca 100644
--- a/engines/m4/riddle/rooms/room.cpp
+++ b/engines/m4/riddle/rooms/room.cpp
@@ -53,6 +53,34 @@ void Room::triggerMachineByHashCallbackNegative(frac16 myMessage, machine *) {
kernel_trigger_dispatchx(hi);
}
+void Room::triggerMachineByHashCallback3000(frac16 myMessage, machine *sender) {
+ int triggerType = _G(globals)[GLB_TEMP_1] >> 16;
+ int param = _G(globals)[GLB_TEMP_2] >> 16;
+ int msg = myMessage >> 16;
+
+ switch (triggerType) {
+ case 0:
+ break;
+
+ case 1:
+ case 3:
+ if (msg >= 0)
+ kernel_trigger_dispatchx(myMessage);
+ break;
+
+ case 2:
+ if (param)
+ sendWSMessage(0x30000, triggerType, sender, 0, nullptr, 1);
+ else if(msg >= 0)
+ kernel_trigger_dispatchx(myMessage);
+ break;
+
+ default:
+ error("spawn walker callback with triggerType = %d", triggerType);
+ break;
+ }
+}
+
int Room::checkFlags(bool flag) {
int count = 0;
@@ -173,6 +201,22 @@ void Room::sendWSMessage_10000(int val1, machine *recv, int val2, int val3,
sendWSMessage(0x10000, 0, nullptr, 0, nullptr, 1);
}
+machine *Room::triggerMachineByHash_3000(int val1, int val2, const int16 * normalDirs,
+ const int16 * shadowDirs, int val3, int val4, int val5,
+ MessageCB intrMsg, const char *machName) {
+#if 0
+ static const byte NUMS[14] = { 0, 0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 9, 0 };
+ byte nums[14];
+ Common::copy(NUMS, NUMS + 14, nums);
+
+ _G(globals)[GLB_TEMP_1] = val2 << 16;
+ _G(globals)[GLB_TEMP_2] = val1 << 24;
+ _G(globals)[GLB_TEMP_3] = val3
+#else
+ error("sendWSMessage_3000");
+#endif
+}
+
void Room::sendWSMessage_80000(machine *walker) {
sendWSMessage(0x80000, 0, walker, 0, nullptr, 1);
}
diff --git a/engines/m4/riddle/rooms/room.h b/engines/m4/riddle/rooms/room.h
index 72d8be29bbd..66c20af3c93 100644
--- a/engines/m4/riddle/rooms/room.h
+++ b/engines/m4/riddle/rooms/room.h
@@ -37,6 +37,7 @@ protected:
static void intrMsgNull(frac16 myMessage, machine *sender) {}
static void triggerMachineByHashCallback(frac16 myMessage, machine *sender = nullptr);
static void triggerMachineByHashCallbackNegative(frac16 myMessage, machine *sender = nullptr);
+ static void triggerMachineByHashCallback3000(frac16 myMessage, machine *sender = nullptr);
void restoreAutosave();
@@ -53,13 +54,16 @@ protected:
* Sets a bunch of globals. Sooooo many globals.
*/
void setGlobals1(int val1, int val2, int val3, int val4, int val5,
- int val6, int val7 = 0, int val8 = 0, int val9 = 0, int val10 = 0,
+ int val6 = 0, int val7 = 0, int val8 = 0, int val9 = 0, int val10 = 0,
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 sendWSMessage_10000(int val1, machine *recv, int val2, int val3,
int val4, int trigger, int val9, int val6, int val7, int val8);
+ 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_80000(machine *walker);
void sendWSMessage_C0000(machine *walker, int trigger);
void sendWSMessage_C0000(int trigger);
diff --git a/engines/m4/riddle/rooms/section3/room303.cpp b/engines/m4/riddle/rooms/section3/room303.cpp
index 792c0045f71..5bd61402499 100644
--- a/engines/m4/riddle/rooms/section3/room303.cpp
+++ b/engines/m4/riddle/rooms/section3/room303.cpp
@@ -22,6 +22,10 @@
#include "m4/riddle/rooms/section3/room303.h"
#include "m4/graphics/gr_series.h"
#include "m4/riddle/vars.h"
+#include "m4/adv_r/adv_file.h"
+#include "m4/gui/gui_vmng.h"
+#include "m4/gui/gui_sys.h"
+#include "m4/platform/keys.h"
namespace M4 {
namespace Riddle {
@@ -51,6 +55,32 @@ void Room303::preload() {
}
void Room303::init() {
+ 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"
+ };
+
_val1 = _val2 = 0;
if (_G(game).previous_room != KERNEL_RESTORING_GAME) {
@@ -73,10 +103,215 @@ void Room303::init() {
_door = series_show_sprite("DOOR", 0, 0xf05);
}
+ int32 status;
+ ScreenContext *game_buff_ptr = vmng_screen_find(_G(gameDrawBuff), &status);
+ assert(game_buff_ptr);
+
switch (_G(game).previous_room) {
+ case KERNEL_RESTORING_GAME:
+ if (!player_been_here(301)) {
+ kernel_load_variant(_val13 ? "303lock1" : "303lock2");
+ setFengActive(_val13);
+ loadHands();
+ setShadow4(true);
+
+ ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
+ ws_walk_load_shadow_series(SHADOW_DIRS, SHADOW_NAMES);
+ loadClasped();
+
+ if (_val13) {
+ _machine1 = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, 1,
+ triggerMachineByHashCallbackNegative, "fl");
+ setShadow5(true);
+ } else {
+ _machine1 = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 706, 256, 86, 0xc00, 0,
+ triggerMachineByHashCallbackNegative, "fl state machine");
+ setShadow5(false);
+ }
+
+ sendWSMessage_10000(1, _machine1, _clasped4, 1, 1, 400,
+ _clasped4, 1, 6, 0);
+ _val14 = _val15 = 1;
+ }
+
+ playSeries();
+ break;
+
case 301:
+ MoveScreenDelta(game_buff_ptr, -641, 0);
+ playSeries();
+
+ kernel_timing_trigger(1, 9);
+ break;
+
+ case 304:
+ if (_G(flags)[V001]) {
+ _G(player).disable_hyperwalk = true;
+ LoadWSAssets("303 FL SCRIPT");
+
+ _G(camera_reacts_to_player) = true;
+ MoveScreenDelta(game_buff_ptr, -110, 0);
+ _val12 = 2;
+
+ player_set_commands_allowed(false);
+ playSeries(false);
+
+ _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,
+ 470, 226, 9, triggerMachineByHashCallback3000, "fl");
+ _val13 = 1;
+
+ kernel_load_variant("303lock1");
+ setFengActive(true);
+ loadClasped();
+
+ ws_walk_load_walker_series(NORMAL_DIRS2, NORMAL_NAMES2);
+ ws_walk_load_shadow_series(SHADOW_DIRS2, SHADOW_NAMES2);
+
+ _hands4 = triggerMachineByHash_3000(8, 3, NORMAL_DIRS2, SHADOW_DIRS2,
+ 445, 215, 7, triggerMachineByHashCallback3000, "mc");
+ _gestTalk4 = series_load("mei ny lft hand gest talk pos4");
+ kernel_timing_trigger(1, 107);
+
+ } else {
+ player_set_commands_allowed(false);
+ kernel_timing_trigger(1, 10);
+ _door = series_show_sprite("DOOR", 7, 0xf05);
+
+ if (!player_been_here(301)) {
+ kernel_load_variant("303lock1");
+ setFengActive(true);
+ loadHands();
+ setShadow4(true);
+
+ ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
+ ws_walk_load_shadow_series(SHADOW_DIRS, SHADOW_NAMES);
+ loadClasped();
+
+ _machine1 = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, 1,
+ triggerMachineByHashCallbackNegative, "fl");
+ sendWSMessage_10000(1, _machine1, _clasped4, 1, 1, 400,
+ _clasped4, 1, 6, 0);
+
+ _val14 = _val15 = _val13 = 1;
+ setShadow5(true);
+ }
+
+ playSeries();
+ }
break;
+
+ case 305:
+ player_set_commands_allowed(false);
+ ws_demand_location(28, 267, 3);
+ playSeries();
+
+ if (!player_been_here(301)) {
+ kernel_timing_trigger(1, 6);
+ loadHands();
+ setShadow4(true);
+
+ ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
+ ws_walk_load_shadow_series(SHADOW_DIRS, SHADOW_NAMES);
+ loadClasped();
+
+ _machine1 = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, 1,
+ triggerMachineByHashCallbackNegative, "fl");
+ sendWSMessage_10000(1, _machine1, _clasped1, 1, 16, 400,
+ _clasped1, 1, 6, 0);
+ _val14 = _val15 = 1;
+ setShadow5(true);
+ _val13 = 1;
+
+ kernel_load_variant("303lock1");
+ setFengActive(true);
+ } else {
+ kernel_timing_trigger(1, 6);
+ }
+ break;
+
+ case 309:
+ interface_show();
+ ws_demand_location(230, 258, 10);
+ player_set_commands_allowed(false);
+
+ 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);
+ _val13 = 1;
+ loadClasped();
+
+ _machine1 = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, 1,
+ triggerMachineByHashCallbackNegative, "fl");
+ sendWSMessage_10000(1, _machine1, _clasped4, 1, 16, 400,
+ _clasped4, 1, 6, 0);
+
+ _val14 = _val15 = 1;
+ setShadow5(true);
+ kernel_load_variant("303lock1");
+ setFengActive(true);
+ }
+
+ playSeries();
+
+ if (player_been_here(301)) {
+ _ripBends = series_load("rip trek bends to viewer");
+ setGlobals1(_ripBends, 17, 17, 17, 17, 1, 17, 1, 1, 1, 1);
+ sendWSMessage_110000(3);
+
+ } else {
+ _ripBends = series_load("RIP BENDS TO SEE CREATURE");
+ setGlobals1(_ripBends, 26, 1, 1, 1);
+ }
+ break;
+
+ case 352:
+ player_set_commands_allowed(false);
+ interface_hide();
+ digi_preload("303r02");
+ digi_preload("303m02");
+ digi_preload("303f01");
+
+ AddSystemHotkey(KEY_ESCAPE, escapePressed);
+ _G(kernel).call_daemon_every_loop = true;
+ digi_stop(3);
+
+ series_plain_play("303cow1", -1, 0, 100, 0, 9);
+ series_show_sprite("doorknob relocation", 0, 0xf04);
+ series_load("303 final frame");
+ _machine2 = series_stream("EVERYTHING IN 303", 5, 17, 21);
+ series_stream_break_on_frame(_machine2, 3, 18);
+
+ MoveScreenDelta(game_buff_ptr, -320, 0);
+ break;
+
default:
+ _val12 = 1;
+ kernel_load_variant("303lock1");
+ setFengActive(true);
+ ws_demand_location(145, 289, 3);
+ loadHands();
+ setShadow4(true);
+
+ ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
+ ws_walk_load_shadow_series(SHADOW_DIRS, SHADOW_NAMES);
+
+ _val13 = 1;
+ loadClasped();
+ _machine1 = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, 1,
+ triggerMachineByHashCallbackNegative, "fl");
+ sendWSMessage_10000(1, _machine1, _clasped4, 1, 1, 400,
+ _clasped4, 1, 6, 0);
+ _val14 = _val15 = 1;
+ setShadow5(true);
+
+ playSeries();
break;
}
}
@@ -133,6 +368,17 @@ void Room303::setShadow5(bool active) {
}
}
+void Room303::escapePressed(void *, void *) {
+ _G(kernel).trigger_mode = KT_DAEMON;
+ disable_player_commands_and_fade_init(56);
+}
+
+void Room303::playSeries(bool cow) {
+ series_plain_play("SPINNING TOMATO MAN", -1, 0, 100, 0, 7);
+ series_plain_play("PUFFBALL", -1, 0, 100, 0, 8);
+ series_plain_play("CREATURE FEATURE LONG VIEW", 1, 0, 100, 0xf05, 7, 70);
+}
+
} // 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 30fc90aa4f0..e882e970da8 100644
--- a/engines/m4/riddle/rooms/section3/room303.h
+++ b/engines/m4/riddle/rooms/section3/room303.h
@@ -42,7 +42,7 @@ private:
int _val10 = 0;
int _val11 = 0;
int _val12 = 0;
- int _val13 = 0;
+ bool _val13 = false;
int _val14 = 0;
int _val15 = 0;
KernelTriggerType _triggerMode1 = KT_DAEMON;
@@ -58,12 +58,19 @@ private:
int _clasped4 = 0;
machine *_shadow4 = nullptr;
machine *_shadow5 = nullptr;
+ machine *_machine1 = nullptr;
+ machine *_machine2 = nullptr;
+ int _gestTalk4 = 0;
+ int _ripBends = 0;
+
+ static void escapePressed(void *, void *);
void loadHands();
void loadClasped();
void setFengActive(bool flag);
void setShadow4(bool active);
void setShadow5(bool active);
+ void playSeries(bool cow = true);
public:
Room303() : Room() {}
More information about the Scummvm-git-logs
mailing list