SCI: Fix Phantasmagoria Mac's kDoSound
This commit is contained in:
parent
2c5a0008ba
commit
ee86e671f1
4 changed files with 44 additions and 1 deletions
|
@ -496,7 +496,9 @@ bool GameFeatures::autoDetectSci21KernelType() {
|
||||||
opcode = extOpcode >> 1;
|
opcode = extOpcode >> 1;
|
||||||
|
|
||||||
// Check for end of script
|
// 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;
|
break;
|
||||||
|
|
||||||
if (opcode == op_callk) {
|
if (opcode == op_callk) {
|
||||||
|
|
|
@ -585,6 +585,17 @@ void Kernel::mapFunctions() {
|
||||||
continue;
|
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
|
// If the name is known, look it up in s_kernelMap. This table
|
||||||
// maps kernel func names to actual function (pointers).
|
// maps kernel func names to actual function (pointers).
|
||||||
SciKernelMapEntry *kernelMap = s_kernelMap;
|
SciKernelMapEntry *kernelMap = s_kernelMap;
|
||||||
|
|
|
@ -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 kUpdateLine(EngineState *s, int argc, reg_t *argv);
|
||||||
reg_t kDeleteLine(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
|
// SCI3 Kernel functions
|
||||||
reg_t kPlayDuck(EngineState *s, int argc, reg_t *argv);
|
reg_t kPlayDuck(EngineState *s, int argc, reg_t *argv);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -309,6 +309,33 @@ reg_t kSetLanguage(EngineState *s, int argc, reg_t *argv) {
|
||||||
return s->r_acc;
|
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
|
#endif
|
||||||
|
|
||||||
} // End of namespace Sci
|
} // End of namespace Sci
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue