[Scummvm-git-logs] scummvm master -> 356c0da0d6ed4cbcc905f0db7d9bd58f6a6345de
dreammaster
noreply at scummvm.org
Sat Aug 8 06:24:16 UTC 2026
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .
Summary:
cbc25c4fc6 M4: RIDDLE: Fix two one-way passages in the Sikkim maze
356c0da0d6 M4: RIDDLE: Restore the Sikkim maze cheat and add a variant
Commit: cbc25c4fc6a98c3908bdc54130a2cfa5e1082d37
https://github.com/scummvm/scummvm/commit/cbc25c4fc6a98c3908bdc54130a2cfa5e1082d37
Author: sloanext (46776957+sloanext at users.noreply.github.com)
Date: 2026-08-08T16:24:12+10:00
Commit Message:
M4: RIDDLE: Fix two one-way passages in the Sikkim maze
The maze in room 709 is a 100 entry array of left/right/up/down links, and
two of them were not reciprocal: rooms 26 and 57 lead left into 25 and 56,
but those had no right exit back. Pure typos.
Changed paths:
engines/m4/riddle/rooms/section7/room709.cpp
diff --git a/engines/m4/riddle/rooms/section7/room709.cpp b/engines/m4/riddle/rooms/section7/room709.cpp
index 82e717790c8..b9c3363fb12 100644
--- a/engines/m4/riddle/rooms/section7/room709.cpp
+++ b/engines/m4/riddle/rooms/section7/room709.cpp
@@ -59,7 +59,7 @@ const Maze709Room Room709::_rooms[100] = {
{ 0, 0, 11, 0 },
{ 0, 24, 0, 34 },
{ 23, 0, 13, 0 },
- { 0, 0, 14, 36 },
+ { 0, 26, 14, 36 },
{ 25, 0, 0, 37 },
{ 0, 28, 0, 38 },
{ 27, 0, 0, 0 },
@@ -93,7 +93,7 @@ const Maze709Room Room709::_rooms[100] = {
{ 0, 54, 42, 0 },
{ 53, 55, 0, 0 },
{ 54, 0, 0, 66 },
- { 0, 0, 45, 67 },
+ { 0, 57, 45, 67 },
{ 56, 0, 0, 0 },
{ 0, 59, 0, 69 },
{ 58, 0, 48, 70 },
Commit: 356c0da0d6ed4cbcc905f0db7d9bd58f6a6345de
https://github.com/scummvm/scummvm/commit/356c0da0d6ed4cbcc905f0db7d9bd58f6a6345de
Author: sloanext (46776957+sloanext at users.noreply.github.com)
Date: 2026-08-08T16:24:12+10:00
Commit Message:
M4: RIDDLE: Restore the Sikkim maze cheat and add a variant
Room709::clearPressed() implements the original warp-to-the-exit cheat, CTRL
+ L E E. Also add a second cheat on CTRL + S T A Y that warps out the same way
but first picks up the chisel and the incense burner, the two artifacts in the
maze that can be mailed home.
Making the warp reachable also exposes a bug in it. Daemon case 500 starts
304_s05 as a loop on channel 2, case 504 sets adv_kill_digi_between_rooms(false)
so the digi tracks survive the room change on purpose. Room 710 only ever starts
its ambience on channel 3, so the loop would keep playing until something else
happened to claim channel 2.
Changed paths:
engines/m4/riddle/rooms/section7/room709.cpp
engines/m4/riddle/rooms/section7/room709.h
diff --git a/engines/m4/riddle/rooms/section7/room709.cpp b/engines/m4/riddle/rooms/section7/room709.cpp
index b9c3363fb12..bf10245b678 100644
--- a/engines/m4/riddle/rooms/section7/room709.cpp
+++ b/engines/m4/riddle/rooms/section7/room709.cpp
@@ -162,9 +162,33 @@ void Room709::syncGame(Common::Serializer &s) {
s.syncAsByte(_pullRightFl);
}
+void Room709::addMazeCheatHotkeys() {
+ // The original registered the DOS ASCII codes 12 (Ctrl+L, form feed) and
+ // 5 (Ctrl+E), so the warp is triggered by Ctrl+L, Ctrl+E, Ctrl+E. The port
+ // turned the 12 into KEYCODE_CLEAR and kept the 5 verbatim, but
+ // Events::util_kbd_check() builds key values as keycode | (flags << 16),
+ // so neither of those could ever be matched.
+ AddSystemHotkey(KEY_CTRL_L, clearPressed);
+ AddSystemHotkey(KEY_CTRL_E, clearPressed);
+
+ // Ctrl+S, Ctrl+T, Ctrl+A, Ctrl+Y additionally takes the two artifacts
+ AddSystemHotkey(KEY_CTRL_S, stayPressed);
+ AddSystemHotkey(KEY_CTRL_T, stayPressed);
+ AddSystemHotkey(KEY_CTRL_A, stayPressed);
+ AddSystemHotkey(KEY_CTRL_Y, stayPressed);
+}
+
+void Room709::removeMazeCheatHotkeys() {
+ RemoveSystemHotkey(KEY_CTRL_L);
+ RemoveSystemHotkey(KEY_CTRL_E);
+ RemoveSystemHotkey(KEY_CTRL_S);
+ RemoveSystemHotkey(KEY_CTRL_T);
+ RemoveSystemHotkey(KEY_CTRL_A);
+ RemoveSystemHotkey(KEY_CTRL_Y);
+}
+
void Room709::init() {
- AddSystemHotkey(KEY_CLEAR, clearPressed);
- AddSystemHotkey(5, clearPressed);
+ addMazeCheatHotkeys();
digi_preload("950_s42");
_pullLeftFl = false;
@@ -550,8 +574,7 @@ void Room709::parser() {
break;
case 3:
- RemoveSystemHotkey(KEY_CLEAR);
- RemoveSystemHotkey(5);
+ removeMazeCheatHotkeys();
_G(game).setRoom(706);
break;
@@ -940,8 +963,7 @@ void Room709::daemon() {
if (_mazeCurrentIndex == 50) {
adv_kill_digi_between_rooms(false);
digi_play_loop("950_s41", 3, 255, -1, -1);
- RemoveSystemHotkey(KEY_CLEAR);
- RemoveSystemHotkey(5);
+ removeMazeCheatHotkeys();
_G(game).setRoom(710);
}
@@ -1013,13 +1035,41 @@ void Room709::daemon() {
case 504:
adv_kill_digi_between_rooms(false);
+ // Case 500 started 304_s05 as a loop on channel 2, and the digi tracks
+ // are deliberately kept across the room change. Room 710 only ever
+ // touches channel 2 by accident, so stop it here.
+ digi_stop(2);
digi_play_loop("950_s41", 3, 255, -1, -1);
- RemoveSystemHotkey(KEY_CLEAR);
- RemoveSystemHotkey(5);
+ removeMazeCheatHotkeys();
_G(game).setRoom(710);
break;
+ case 505:
+ // Take the two artifacts that can be mailed home, then warp out
+ if (inv_object_is_here("CHISEL")) {
+ inv_give_to_player("CHISEL");
+
+ if (_chiselActiveFl) {
+ terminateMachine(_709ChiselMach);
+ _chiselActiveFl = false;
+ hotspot_set_active(_G(currentSceneDef).hotspots, "Chisel", false);
+ }
+ }
+
+ if (inv_object_is_here("INCENSE BURNER")) {
+ inv_give_to_player("INCENSE BURNER");
+
+ if (_incenseBurnerActiveFl) {
+ terminateMachine(_709IncenseHolderMach);
+ _incenseBurnerActiveFl = false;
+ hotspot_set_active(_G(currentSceneDef).hotspots, "Incense Burner", false);
+ }
+ }
+
+ kernel_timing_trigger(1, 500, nullptr);
+ break;
+
case 1000:
player_set_commands_allowed(false);
kernel_timing_trigger(10, 1001, nullptr);
@@ -1240,6 +1290,7 @@ void Room709::clearPressed(void *, void *) {
}
if (_field84 == 3) {
+ _field84 = 0;
digi_preload("304_s05", -1);
digi_preload("709_s99", -1);
_G(kernel).trigger_mode = KT_DAEMON;
@@ -1247,6 +1298,36 @@ void Room709::clearPressed(void *, void *) {
}
}
+void Room709::stayPressed(void *keyVal, void *) {
+ static const int32 SEQUENCE[4] = { KEY_CTRL_S, KEY_CTRL_T, KEY_CTRL_A, KEY_CTRL_Y };
+ static int32 index = 0;
+ static uint32 lastPress = 0;
+
+ const int32 key = (int32)(intptr)keyVal;
+ const uint32 now = timer_read_60();
+
+ // Same one second window per keystroke as the warp cheat above
+ if (index && now - lastPress >= 60)
+ index = 0;
+
+ lastPress = now;
+
+ if (key != SEQUENCE[index]) {
+ // A wrong key can still be the start of the next attempt
+ index = (key == SEQUENCE[0]) ? 1 : 0;
+ return;
+ }
+
+ if (++index < 4)
+ return;
+
+ index = 0;
+ digi_preload("304_s05", -1);
+ digi_preload("709_s99", -1);
+ _G(kernel).trigger_mode = KT_DAEMON;
+ disable_player_commands_and_fade_init(505);
+}
+
void Room709::debugRoomChanged() {
if (gDebugLevel > 0) {
// Show room exits
diff --git a/engines/m4/riddle/rooms/section7/room709.h b/engines/m4/riddle/rooms/section7/room709.h
index 3bf05c92358..36c44e48974 100644
--- a/engines/m4/riddle/rooms/section7/room709.h
+++ b/engines/m4/riddle/rooms/section7/room709.h
@@ -82,10 +82,13 @@ private:
machine *_safariShadow1Mach = nullptr;
void debugRoomChanged();
+ void addMazeCheatHotkeys();
+ void removeMazeCheatHotkeys();
static const Maze709Room _rooms[100];
static void clearPressed(void *, void *);
+ static void stayPressed(void *, void *);
};
} // namespace Rooms
More information about the Scummvm-git-logs
mailing list