aboutsummaryrefslogtreecommitdiff
path: root/engines/sci
diff options
context:
space:
mode:
authorColin Snover2017-09-07 00:35:25 -0500
committerColin Snover2017-09-08 16:03:24 -0500
commitf11b0a4ff53db917dd0d93969540952175923528 (patch)
tree7cae7cf9bb091898eb14f447dc2b15e9e1bebcb0 /engines/sci
parent6571111efca8ade4e958b31318ebb5026d30c1f5 (diff)
downloadscummvm-rg350-f11b0a4ff53db917dd0d93969540952175923528.tar.gz
scummvm-rg350-f11b0a4ff53db917dd0d93969540952175923528.tar.bz2
scummvm-rg350-f11b0a4ff53db917dd0d93969540952175923528.zip
SCI32: Toggle Phant2 content censoring from game options
To enable the optional content censoring mode, Phant2 looks for a RESDUK.PAT file, which is normally placed by the game's installer if the user chose to enable censorship. If the file exists, the game reads an unlock password out of the file and asks the user to enter the password when starting a new game to create an uncensored game, or to click a "less intense" button to start the game with censoring. The censorship state of the game is then persisted in the save game file, and installations with the RESDUK.PAT file need to enter the password again in order to restore any of the uncensored saves. Since we do not have an installer that can enable this feature, add a game option toggle to enable/disable censoring (for the releases that have the optional censorship mode) instead so the censored content feature is available for anyone that wants to use it. This flag is restored from ScummVM whenever a save game is loaded, so it can be toggled on or off at any point without needing a separate save game, unlike in the original interpreter.
Diffstat (limited to 'engines/sci')
-rw-r--r--engines/sci/detection.cpp11
-rw-r--r--engines/sci/detection_tables.h18
-rw-r--r--engines/sci/engine/guest_additions.cpp6
-rw-r--r--engines/sci/engine/guest_additions.h5
-rw-r--r--engines/sci/engine/kfile.cpp3
-rw-r--r--engines/sci/engine/savegame.cpp8
-rw-r--r--engines/sci/engine/vm.h1
-rw-r--r--engines/sci/sci.cpp4
-rw-r--r--engines/sci/sci.h1
9 files changed, 55 insertions, 2 deletions
diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp
index 1707f13480..9ebdfa9e7c 100644
--- a/engines/sci/detection.cpp
+++ b/engines/sci/detection.cpp
@@ -499,6 +499,17 @@ static const ADExtraGuiOptionsMap optionsList[] = {
}
},
+ // Phantasmagoria 2 - content censoring option
+ {
+ GAMEOPTION_ENABLE_CENSORING,
+ {
+ _s("Enable content censoring"),
+ _s("Enable the game's built-in optional content censoring"),
+ "enable_censoring",
+ false
+ }
+ },
+
AD_EXTRA_GUI_OPTIONS_TERMINATOR
};
diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h
index 6f539a9c45..1f387d5932 100644
--- a/engines/sci/detection_tables.h
+++ b/engines/sci/detection_tables.h
@@ -3143,14 +3143,25 @@ static const struct ADGameDescription SciGameDescriptions[] = {
#undef GUIO_PHANTASMAGORIA
#undef GUIO_PHANTASMAGORIA_MAC
-#define GUIO_PHANTASMAGORIA2 GUIO8(GUIO_NOSUBTITLES, \
+#define GUIO_PHANTASMAGORIA2 GUIO9(GUIO_NOSUBTITLES, \
GUIO_LINKMUSICTOSFX, \
GUIO_LINKSPEECHTOSFX, \
GUIO_NOMIDI, \
GUIO_NOASPECT, \
GAMEOPTION_ORIGINAL_SAVELOAD, \
GAMEOPTION_ENABLE_BLACK_LINED_VIDEO, \
- GAMEOPTION_HQ_VIDEO)
+ GAMEOPTION_HQ_VIDEO, \
+ GAMEOPTION_ENABLE_CENSORING)
+// TODO: Learn which are the censored game editions and give them this GUIO
+// instead
+#define GUIO_PHANTASMAGORIA2_CENSORED GUIO8(GUIO_NOSUBTITLES, \
+ GUIO_LINKMUSICTOSFX, \
+ GUIO_LINKSPEECHTOSFX, \
+ GUIO_NOMIDI, \
+ GUIO_NOASPECT, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_ENABLE_BLACK_LINED_VIDEO, \
+ GAMEOPTION_HQ_VIDEO)
// Some versions of Phantasmagoria 2 were heavily censored.
// Censored versions (data files are currently unknown to us): UK, Australia, first English release in Germany
@@ -3249,6 +3260,9 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::JA_JPN, Common::kPlatformWindows, ADGF_CD | ADGF_TESTING, GUIO_PHANTASMAGORIA2 },
+#undef GUIO_PHANTASMAGORIA2
+#undef GUIO_PHANTASMAGORIA2_CENSORED
+
#endif // ENABLE_SCI32
// Pepper's Adventure In Time 1.000 English
diff --git a/engines/sci/engine/guest_additions.cpp b/engines/sci/engine/guest_additions.cpp
index 792605c4b9..b184887d66 100644
--- a/engines/sci/engine/guest_additions.cpp
+++ b/engines/sci/engine/guest_additions.cpp
@@ -189,6 +189,12 @@ bool GuestAdditions::kDoSoundMasterVolumeHook(const int volume) const {
}
#ifdef ENABLE_SCI32
+void GuestAdditions::sciEngineInitGameHook() {
+ if (g_sci->getGameId() == GID_PHANTASMAGORIA2 && Common::checkGameGUIOption(GAMEOPTION_ENABLE_CENSORING, ConfMan.get("guioptions"))) {
+ _state->variables[VAR_GLOBAL][kGlobalVarPhant2CensorshipFlag] = make_reg(0, ConfMan.getBool("enable_censoring"));
+ }
+}
+
void GuestAdditions::sendSelectorHook(const reg_t sendObj, Selector &selector, reg_t *argp) {
if (_features->getMessageTypeSyncStrategy() == kMessageTypeSyncStrategyLSL6Hires) {
syncMessageTypeToScummVMUsingLSL6HiresStrategy(sendObj, selector, argp);
diff --git a/engines/sci/engine/guest_additions.h b/engines/sci/engine/guest_additions.h
index 36264b946b..7c80c29aac 100644
--- a/engines/sci/engine/guest_additions.h
+++ b/engines/sci/engine/guest_additions.h
@@ -109,6 +109,11 @@ public:
#ifdef ENABLE_SCI32
/**
+ * Guest additions hook for SciEngine::initGame.
+ */
+ void sciEngineInitGameHook();
+
+ /**
* Guest additions hook for send_selector.
*/
void sendSelectorHook(const reg_t sendObj, Selector &selector, reg_t *argp);
diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp
index eb6cacbe19..79e1894532 100644
--- a/engines/sci/engine/kfile.cpp
+++ b/engines/sci/engine/kfile.cpp
@@ -446,6 +446,9 @@ reg_t kFileIOOpen(EngineState *s, int argc, reg_t *argv) {
*it = '_';
}
}
+ } else if (g_sci->getGameId() == GID_PHANTASMAGORIA2 && name == "RESDUK.PAT") {
+ // Ignore the censorship password file in lieu of our game option
+ return SIGNAL_REG;
}
// See kMakeSaveCatName
diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp
index 4ff27ba6d8..d6fab6229b 100644
--- a/engines/sci/engine/savegame.cpp
+++ b/engines/sci/engine/savegame.cpp
@@ -49,6 +49,7 @@
#include "sci/sound/music.h"
#ifdef ENABLE_SCI32
+#include "common/gui_options.h"
#include "sci/engine/guest_additions.h"
#include "sci/graphics/cursor32.h"
#include "sci/graphics/frameout.h"
@@ -1282,6 +1283,13 @@ void gamestate_afterRestoreFixUp(EngineState *s, int savegameId) {
// It gets disabled in the game's death screen.
g_sci->_gfxMenu->kernelSetAttribute(2, 1, SCI_MENU_ATTRIBUTE_ENABLED, TRUE_REG); // Game -> Save Game
break;
+#ifdef ENABLE_SCI32
+ case GID_PHANTASMAGORIA2:
+ if (Common::checkGameGUIOption(GAMEOPTION_ENABLE_CENSORING, ConfMan.get("guioptions"))) {
+ s->variables[VAR_GLOBAL][kGlobalVarPhant2CensorshipFlag] = make_reg(0, ConfMan.getBool("enable_censoring"));
+ }
+ break;
+#endif
default:
break;
}
diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h
index a8ac7b180f..67729bfbf9 100644
--- a/engines/sci/engine/vm.h
+++ b/engines/sci/engine/vm.h
@@ -160,6 +160,7 @@ enum GlobalVar {
kGlobalVarPhant1DACVolume = 188, // 0 to 127
kGlobalVarLSL6HiresMusicVolume = 194, // 0 to 13
kGlobalVarGK1DAC1 = 207, // 0 to 127
+ kGlobalVarPhant2CensorshipFlag = 207,
kGlobalVarGK1DAC2 = 208, // 0 to 127
kGlobalVarLSL6HiresRestoreTextWindow = 210,
kGlobalVarGK1DAC3 = 211, // 0 to 127
diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp
index f5e327c619..6ed7411020 100644
--- a/engines/sci/sci.cpp
+++ b/engines/sci/sci.cpp
@@ -569,6 +569,10 @@ bool SciEngine::initGame() {
// Load game language into printLang property of game object
setSciLanguage();
+#ifdef ENABLE_SCI32
+ _guestAdditions->sciEngineInitGameHook();
+#endif
+
return true;
}
diff --git a/engines/sci/sci.h b/engines/sci/sci.h
index ff3b515dcc..faa153221a 100644
--- a/engines/sci/sci.h
+++ b/engines/sci/sci.h
@@ -57,6 +57,7 @@ namespace Sci {
#define GAMEOPTION_HIGH_RESOLUTION_GRAPHICS GUIO_GAMEOPTIONS8
#define GAMEOPTION_ENABLE_BLACK_LINED_VIDEO GUIO_GAMEOPTIONS9
#define GAMEOPTION_HQ_VIDEO GUIO_GAMEOPTIONS10
+#define GAMEOPTION_ENABLE_CENSORING GUIO_GAMEOPTIONS11
struct EngineState;
class Vocabulary;