[Scummvm-git-logs] scummvm master -> cc6ecc9b3b588924f86d53b23522c7cd27e90e5b
dreammaster
noreply at scummvm.org
Sun Oct 13 16:34:11 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:
cc6ecc9b3b M4: RIDDLE: Add support for room specific savegame fields
Commit: cc6ecc9b3b588924f86d53b23522c7cd27e90e5b
https://github.com/scummvm/scummvm/commit/cc6ecc9b3b588924f86d53b23522c7cd27e90e5b
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-10-13T09:34:02-07:00
Commit Message:
M4: RIDDLE: Add support for room specific savegame fields
Now it makes sense why all the rooms share the same memory
for temporary values. In Riddle, the savegame saves out this
memory block (Orion Burger doesn't). And in room 303,
for example, there's a flag for whether Feng Li should be
positioned at the left or right side of the room. It's only
set when the room is entered, and is persistent across saves.
It'd obviously become a major chore to support saving all the
fields in all the rooms, since in ScummVM each room class has
it's own separate fields. So as a compromise, I've added a Room
class syncGame method that individual rooms can override to
save critical fields to, on a case by case basis. So room 303
will just save out the _fengFlag flag, for example.
Changed paths:
engines/m4/core/rooms.cpp
engines/m4/core/rooms.h
engines/m4/m4.cpp
engines/m4/riddle/rooms/section3/room303.cpp
engines/m4/riddle/rooms/section3/room303.h
engines/m4/riddle/rooms/section3/room305.cpp
diff --git a/engines/m4/core/rooms.cpp b/engines/m4/core/rooms.cpp
index f8cf8b1b720..434a0b40cc6 100644
--- a/engines/m4/core/rooms.cpp
+++ b/engines/m4/core/rooms.cpp
@@ -465,6 +465,10 @@ void Sections::adv_camera_pan_step(int32 step) {
camera_pan_step = step;
}
+Room *Sections::getRoom(int room) const {
+ return (*_sections[(room / 100) - 1])[room];
+}
+
/*------------------------------------------------------------------------*/
Room *Section::operator[](uint roomNum) {
diff --git a/engines/m4/core/rooms.h b/engines/m4/core/rooms.h
index da080d714e0..f118b046a10 100644
--- a/engines/m4/core/rooms.h
+++ b/engines/m4/core/rooms.h
@@ -23,6 +23,7 @@
#define M4_CORE_ROOMS_H
#include "common/hashmap.h"
+#include "common/serializer.h"
#include "m4/adv_r/adv.h"
#include "m4/adv_r/adv_control.h"
#include "m4/adv_r/adv_hotspot.h"
@@ -41,6 +42,7 @@ public:
virtual void parser();
virtual void roomError() {}
virtual void shutdown() {}
+ virtual void syncGame(Common::Serializer &s) {}
/**
* Used to return custom hotspots at a given position
@@ -148,6 +150,7 @@ public:
HotSpotRec *custom_hotspot_which(int x, int y) {
return _activeRoom->custom_hotspot_which(x, y);
}
+ Room *getRoom(int room) const;
void m4SceneLoad();
void m4RunScene();
diff --git a/engines/m4/m4.cpp b/engines/m4/m4.cpp
index 66997cd0701..3f715aec924 100644
--- a/engines/m4/m4.cpp
+++ b/engines/m4/m4.cpp
@@ -278,6 +278,10 @@ Common::Error M4Engine::syncGame(Common::Serializer &s) {
_G(conversations).syncGame(s);
_G(inventory)->syncGame(s);
+ Room *room = s.isSaving() ? g_engine->_activeRoom :
+ g_engine->getRoom(_G(game).room_id);
+ room->syncGame(s);
+
if (s.isLoading()) {
// set up variables so everyone knows we've teleported
_G(kernel).restore_game = true;
diff --git a/engines/m4/riddle/rooms/section3/room303.cpp b/engines/m4/riddle/rooms/section3/room303.cpp
index 28894cda903..794a4654ef8 100644
--- a/engines/m4/riddle/rooms/section3/room303.cpp
+++ b/engines/m4/riddle/rooms/section3/room303.cpp
@@ -97,8 +97,8 @@ void Room303::init() {
switch (_G(game).previous_room) {
case KERNEL_RESTORING_GAME:
if (!player_been_here(301)) {
- kernel_load_variant(_val13 ? "303lock1" : "303lock2");
- setFengActive(_val13);
+ kernel_load_variant(_fengFlag ? "303lock1" : "303lock2");
+ setFengActive(_fengFlag);
setupMei();
setShadow4(true);
@@ -106,7 +106,7 @@ void Room303::init() {
ws_walk_load_shadow_series(S3_SHADOW_DIRS, S3_SHADOW_NAMES);
loadFengLi();
- if (_val13) {
+ if (_fengFlag) {
_fengLi = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, 1,
triggerMachineByHashCallback, "fl");
setShadow5(true);
@@ -116,8 +116,7 @@ void Room303::init() {
setShadow5(false);
}
- sendWSMessage_10000(1, _fengLi, _feng4, 1, 1, 400,
- _feng4, 1, 6, 0);
+ sendWSMessage_10000(1, _fengLi, _feng4, 1, 1, 400, _feng4, 1, 6, 0);
_val14 = _val15 = 1;
}
@@ -150,7 +149,7 @@ void Room303::init() {
ws_walk_load_shadow_series(S3_SHADOW_DIRS, S3_SHADOW_NAMES);
_fengLi = triggerMachineByHash_3000(8, 2, *S3_NORMAL_DIRS, *S3_SHADOW_DIRS,
470, 226, 9, triggerMachineByHashCallback3000, "fl");
- _val13 = 1;
+ _fengFlag = true;
kernel_load_variant("303lock1");
setFengActive(true);
@@ -184,7 +183,8 @@ void Room303::init() {
sendWSMessage_10000(1, _fengLi, _feng4, 1, 1, 400,
_feng4, 1, 6, 0);
- _val14 = _val15 = _val13 = 1;
+ _val14 = _val15 = 1;
+ _fengFlag = true;
setShadow5(true);
}
@@ -208,11 +208,10 @@ void Room303::init() {
_fengLi = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, 1,
triggerMachineByHashCallback, "fl");
- sendWSMessage_10000(1, _fengLi, _feng1, 1, 16, 400,
- _feng1, 1, 6, 0);
+ sendWSMessage_10000(1, _fengLi, _feng1, 1, 16, 400, _feng1, 1, 6, 0);
_val14 = _val15 = 1;
setShadow5(true);
- _val13 = 1;
+ _fengFlag = true;
kernel_load_variant("303lock1");
setFengActive(true);
@@ -231,7 +230,7 @@ void Room303::init() {
setShadow4(true);
ws_walk_load_walker_series(S3_NORMAL_DIRS, S3_NORMAL_NAMES);
ws_walk_load_shadow_series(S3_SHADOW_DIRS, S3_SHADOW_NAMES);
- _val13 = 1;
+ _fengFlag = true;
loadFengLi();
_fengLi = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, 1,
@@ -289,12 +288,11 @@ void Room303::init() {
ws_walk_load_walker_series(S3_NORMAL_DIRS, S3_NORMAL_NAMES);
ws_walk_load_shadow_series(S3_SHADOW_DIRS, S3_SHADOW_NAMES);
- _val13 = 1;
+ _fengFlag = true;
loadFengLi();
_fengLi = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, 1,
triggerMachineByHashCallback, "fl");
- sendWSMessage_10000(1, _fengLi, _feng4, 1, 1, 400,
- _feng4, 1, 6, 0);
+ sendWSMessage_10000(1, _fengLi, _feng4, 1, 1, 400, _feng4, 1, 6, 0);
_val14 = _val15 = 1;
setShadow5(true);
@@ -1033,7 +1031,7 @@ void Room303::daemon() {
case 5:
terminateMachineAndNull(_fengLi);
- if (_val13)
+ if (_fengFlag)
_fengLi = triggerMachineByHash_3000(8, 2, *S3_NORMAL_DIRS, *S3_SHADOW_DIRS,
480, 256, 7, triggerMachineByHashCallback3000, "fl walker");
else
@@ -1156,7 +1154,7 @@ void Room303::parser() {
conv303b();
} else if (player_said("conv303a")) {
conv303a();
- } else if (lookFlag && _G(flags)[V000] == 0 && _val13 &&
+ } else if (lookFlag && _G(flags)[V000] == 0 && _fengFlag &&
player_said_any("cow", "giant matchstick")) {
switch (_G(kernel).trigger) {
case -1:
@@ -1182,7 +1180,7 @@ void Room303::parser() {
_feng4, 1, 6, 0);
_val14 = _val15 = 1;
setFengActive(false);
- _val13 = 0;
+ _fengFlag = false;
kernel_load_variant("303lock2");
_G(kernel).trigger_mode = KT_PARSE;
@@ -1193,7 +1191,7 @@ void Room303::parser() {
break;
}
} else if (lookFlag && player_said("torso tomato") &&
- !_G(flags)[V081] && !_G(flags)[V000] && !_val13) {
+ !_G(flags)[V081] && !_G(flags)[V000] && !_fengFlag) {
switch (_G(kernel).trigger) {
case 1:
setShadow5Alt(false);
@@ -1211,7 +1209,7 @@ void Room303::parser() {
_feng4, 1, 6, 0);
_val14 = _val15 = 1;
setFengActive(true);
- _val13 = 1;
+ _fengFlag = true;
kernel_load_variant("303lock1");
_G(kernel).trigger_mode = KT_PARSE;
@@ -1305,7 +1303,7 @@ void Room303::parser() {
}
}
} else if (lookFlag && player_said("copper tank") &&
- (_G(flags)[V000] == 1 || _val13)) {
+ (_G(flags)[V000] == 1 || _fengFlag)) {
if (_G(flags)[V000] == 1) {
digi_play("303r31", 1);
} else {
@@ -1655,7 +1653,7 @@ void Room303::parser() {
player_update_info();
ws_hide_walker();
- if (_val13) {
+ if (_fengFlag) {
_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,
@@ -1759,6 +1757,7 @@ void Room303::setFengActive(bool flag) {
} else {
hotspot->active = hotspot->lr_x > 600;
}
+ break;
}
}
}
@@ -2033,6 +2032,10 @@ void Room303::playSound(const Common::String &assetName, int trigger, int val1)
digi_play(assetName.c_str(), 1, 255, trigger);
}
+void Room303::syncGame(Common::Serializer &s) {
+ s.syncAsByte(_fengFlag);
+}
+
} // 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 adc8eb1eb28..111a224b453 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;
KernelTriggerType _val12 = KT_DAEMON;
- bool _val13 = false;
+ bool _fengFlag = false;
int _val14 = 0;
int _val15 = 0;
int _val16 = 0;
@@ -106,6 +106,7 @@ public:
void daemon() override;
void pre_parser() override;
void parser() override;
+ void syncGame(Common::Serializer &s) override;
};
} // namespace Rooms
diff --git a/engines/m4/riddle/rooms/section3/room305.cpp b/engines/m4/riddle/rooms/section3/room305.cpp
index 226109e6612..7e5435fe8f6 100644
--- a/engines/m4/riddle/rooms/section3/room305.cpp
+++ b/engines/m4/riddle/rooms/section3/room305.cpp
@@ -1292,6 +1292,7 @@ next4:
case 1:
_G(game).setRoom(303);
+ break;
default:
break;
More information about the Scummvm-git-logs
mailing list