aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorMatthew Hoops2013-04-28 13:42:50 -0400
committerMatthew Hoops2013-04-28 13:43:17 -0400
commitee86e671f1c29232d7d1d02841851e43b825d6ac (patch)
tree5c5faefa02c2017f5bc6dde9a2973b4a1333aec4 /engines
parent2c5a0008badb2c89d1c3f62f7c8b105b22ed8a19 (diff)
downloadscummvm-rg350-ee86e671f1c29232d7d1d02841851e43b825d6ac.tar.gz
scummvm-rg350-ee86e671f1c29232d7d1d02841851e43b825d6ac.tar.bz2
scummvm-rg350-ee86e671f1c29232d7d1d02841851e43b825d6ac.zip
SCI: Fix Phantasmagoria Mac's kDoSound
Diffstat (limited to 'engines')
-rw-r--r--engines/sci/engine/features.cpp4
-rw-r--r--engines/sci/engine/kernel.cpp11
-rw-r--r--engines/sci/engine/kernel.h3
-rw-r--r--engines/sci/engine/ksound.cpp27
4 files changed, 44 insertions, 1 deletions
diff --git a/engines/sci/engine/features.cpp b/engines/sci/engine/features.cpp
index 49e2bfc79f..6005ac50be 100644
--- a/engines/sci/engine/features.cpp
+++ b/engines/sci/engine/features.cpp
@@ -496,7 +496,9 @@ bool GameFeatures::autoDetectSci21KernelType() {
opcode = extOpcode >> 1;
// Check for end of script
- if (opcode == op_ret || offset >= script->getBufSize())
+ // We don't check for op_ret here because the Phantasmagoria Mac script
+ // has an op_ret early on in its script (controlled by a branch).
+ if (offset >= script->getBufSize())
break;
if (opcode == op_callk) {
diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp
index 0d0bbe8882..b5ca65fc1b 100644
--- a/engines/sci/engine/kernel.cpp
+++ b/engines/sci/engine/kernel.cpp
@@ -585,6 +585,17 @@ void Kernel::mapFunctions() {
continue;
}
+#ifdef ENABLE_SCI32
+ // HACK: Phantasmagoria Mac uses a modified kDoSound (which *nothing*
+ // else seems to use)!
+ if (g_sci->getPlatform() == Common::kPlatformMacintosh && g_sci->getGameId() == GID_PHANTASMAGORIA && kernelName == "DoSound") {
+ _kernelFuncs[id].function = kDoSoundPhantasmagoriaMac;
+ _kernelFuncs[id].signature = parseKernelSignature("DoSoundPhantasmagoriaMac", "i.*");
+ _kernelFuncs[id].name = "DoSoundPhantasmagoriaMac";
+ continue;
+ }
+#endif
+
// If the name is known, look it up in s_kernelMap. This table
// maps kernel func names to actual function (pointers).
SciKernelMapEntry *kernelMap = s_kernelMap;
diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h
index e3ebce80fb..8a021073fc 100644
--- a/engines/sci/engine/kernel.h
+++ b/engines/sci/engine/kernel.h
@@ -471,6 +471,9 @@ reg_t kAddLine(EngineState *s, int argc, reg_t *argv);
reg_t kUpdateLine(EngineState *s, int argc, reg_t *argv);
reg_t kDeleteLine(EngineState *s, int argc, reg_t *argv);
+// Phantasmagoria Mac Special Kernel Function
+reg_t kDoSoundPhantasmagoriaMac(EngineState *s, int argc, reg_t *argv);
+
// SCI3 Kernel functions
reg_t kPlayDuck(EngineState *s, int argc, reg_t *argv);
#endif
diff --git a/engines/sci/engine/ksound.cpp b/engines/sci/engine/ksound.cpp
index b803e123f1..2879b7f45d 100644
--- a/engines/sci/engine/ksound.cpp
+++ b/engines/sci/engine/ksound.cpp
@@ -309,6 +309,33 @@ reg_t kSetLanguage(EngineState *s, int argc, reg_t *argv) {
return s->r_acc;
}
+reg_t kDoSoundPhantasmagoriaMac(EngineState *s, int argc, reg_t *argv) {
+ // Phantasmagoria Mac (and seemingly no other game (!)) uses this
+ // cutdown version of kDoSound.
+
+ switch (argv[0].toUint16()) {
+ case 0:
+ return g_sci->_soundCmd->kDoSoundMasterVolume(argc - 1, argv + 1, s->r_acc);
+ case 2:
+ return g_sci->_soundCmd->kDoSoundInit(argc - 1, argv + 1, s->r_acc);
+ case 3:
+ return g_sci->_soundCmd->kDoSoundDispose(argc - 1, argv + 1, s->r_acc);
+ case 4:
+ return g_sci->_soundCmd->kDoSoundPlay(argc - 1, argv + 1, s->r_acc);
+ case 5:
+ return g_sci->_soundCmd->kDoSoundStop(argc - 1, argv + 1, s->r_acc);
+ case 8:
+ return g_sci->_soundCmd->kDoSoundSetVolume(argc - 1, argv + 1, s->r_acc);
+ case 9:
+ return g_sci->_soundCmd->kDoSoundSetLoop(argc - 1, argv + 1, s->r_acc);
+ case 10:
+ return g_sci->_soundCmd->kDoSoundUpdateCues(argc - 1, argv + 1, s->r_acc);
+ }
+
+ error("Unknown kDoSound Phantasmagoria Mac subop %d", argv[0].toUint16());
+ return s->r_acc;
+}
+
#endif
} // End of namespace Sci