Permalink
Comparing changes
Open a pull request
- 3 commits
- 12 files changed
- 0 commit comments
- 2 contributors
Unified
Split
Showing
with
203 additions
and 51 deletions.
- +1 −0 devtools/scumm-md5.txt
- +64 −38 engines/scumm/actor.cpp
- +2 −0 engines/scumm/detection.cpp
- +2 −0 engines/scumm/detection_tables.h
- +23 −3 engines/scumm/file.cpp
- +10 −2 engines/scumm/input.cpp
- +8 −2 engines/scumm/resource_v2.cpp
- +20 −1 engines/scumm/script_v0.cpp
- +2 −1 engines/scumm/scumm-md5.h
- +12 −4 engines/scumm/scumm.cpp
- +4 −0 engines/scumm/scumm_v0.h
- +55 −0 engines/scumm/verbs.cpp
| @@ -52,6 +52,7 @@ | ||
| maniac Maniac Mansion | ||
| 2d624d1b214f7faf0094daea65c6d1a6 -1 en 2gs Apple II - - | ||
|
|
||
| 2cb46375dd5cdfd023e2f07e0a21b530 -1 en C64 C64 Demo - Robert Crossfield | ||
| eea4d9ac2fb6f145945a308e8866915b -1 en C64 C64 - - | ||
| 439a7f4adf510489981ac52308e7d7a2 -1 de C64 C64 - - | ||
|
|
||
| @@ -43,12 +43,60 @@ namespace Scumm { | ||
|
|
||
| byte Actor::kInvalidBox = 0; | ||
|
|
||
| static const byte v0ActorTalkArray[0x19] = { | ||
| 0x00, 0x06, 0x06, 0x06, 0x06, | ||
| 0x06, 0x06, 0x00, 0x46, 0x06, | ||
| 0x06, 0x06, 0x06, 0xFF, 0xFF, | ||
| 0x06, 0xC0, 0x06, 0x06, 0x00, | ||
| 0xC0, 0xC0, 0x00, 0x06, 0x06 | ||
| static const byte v0ActorDemoTalk[25] = { | ||
| 0x00, | ||
| 0x06, // Syd | ||
| 0x06, // Razor | ||
| 0x06, // Dave | ||
| 0x06, // Michael | ||
| 0x06, // Bernard | ||
| 0x06, // Wendy | ||
| 0x00, // Jeff | ||
| 0x46, // Radiation Suit | ||
| 0x06, // Dr Fred | ||
| 0x06, // Nurse Edna | ||
| 0x06, // Weird Ed | ||
| 0x06, // Dead Cousin Ted | ||
| 0xE2, // Purple Tentacle | ||
| 0xE2, // Green Tentacle | ||
| 0x06, // Meteor police | ||
| 0xC0, // Meteor | ||
| 0x06, // Mark Eteer | ||
| 0x06, // Talkshow Host | ||
| 0x00, // Plant | ||
| 0xC0, // Meteor Radiation | ||
| 0xC0, // Edsel (small, outro) | ||
| 0x00, // Meteor (small, intro) | ||
| 0x06, // Sandy (Lab) | ||
| 0x06, // Sandy (Cut-Scene) | ||
| }; | ||
|
|
||
| static const byte v0ActorTalk[25] = { | ||
| 0x00, | ||
| 0x06, // Syd | ||
| 0x06, // Razor | ||
| 0x06, // Dave | ||
| 0x06, // Michael | ||
| 0x06, // Bernard | ||
| 0x06, // Wendy | ||
| 0x00, // Jeff | ||
| 0x46, // Radiation Suit | ||
| 0x06, // Dr Fred | ||
| 0x06, // Nurse Edna | ||
| 0x06, // Weird Ed | ||
| 0x06, // Dead Cousin Ted | ||
| 0xFF, // Purple Tentacle | ||
| 0xFF, // Green Tentacle | ||
| 0x06, // Meteor police | ||
| 0xC0, // Meteor | ||
| 0x06, // Mark Eteer | ||
| 0x06, // Talkshow Host | ||
| 0x00, // Plant | ||
| 0xC0, // Meteor Radiation | ||
| 0xC0, // Edsel (small, outro) | ||
| 0x00, // Meteor (small, intro) | ||
| 0x06, // Sandy (Lab) | ||
| 0x06, // Sandy (Cut-Scene) | ||
| }; | ||
|
|
||
| static const byte v0WalkboxSlantedModifier[0x16] = { | ||
| @@ -210,6 +258,12 @@ void Actor_v0::initActor(int mode) { | ||
| _limbFrameRepeat[i] = 0; | ||
| _limb_flipped[i] = false; | ||
| } | ||
|
|
||
| if (_vm->_game.features & GF_DEMO) { | ||
| _sound[0] = v0ActorDemoTalk[_number]; | ||
| } else { | ||
| _sound[0] = v0ActorTalk[_number]; | ||
| } | ||
| } | ||
|
|
||
| void Actor::setBox(int box) { | ||
| @@ -1753,34 +1807,6 @@ void ScummEngine::showActors() { | ||
| } | ||
| } | ||
|
|
||
| // bits 0..5: sound, bit 6: ??? | ||
| static const byte v0ActorSounds[24] = { | ||
| 0x06, // Syd | ||
| 0x06, // Razor | ||
| 0x06, // Dave | ||
| 0x06, // Michael | ||
| 0x06, // Bernard | ||
| 0x06, // Wendy | ||
| 0x00, // Jeff | ||
| 0x46, // Radiation Suit | ||
| 0x06, // Dr Fred | ||
| 0x06, // Nurse Edna | ||
| 0x06, // Weird Ed | ||
| 0x06, // Dead Cousin Ted | ||
| 0xFF, // Purple Tentacle | ||
| 0xFF, // Green Tentacle | ||
| 0x06, // Meteor police | ||
| 0xC0, // Meteor | ||
| 0x06, // Mark Eteer | ||
| 0x06, // Talkshow Host | ||
| 0x00, // Plant | ||
| 0xC0, // Meteor Radiation | ||
| 0xC0, // Edsel (small, outro) | ||
| 0x00, // Meteor (small, intro) | ||
| 0x06, // Sandy (Lab) | ||
| 0x06, // Sandy (Cut-Scene) | ||
| }; | ||
|
|
||
| /* Used in Scumm v5 only. Play sounds associated with actors */ | ||
| void ScummEngine::playActorSounds() { | ||
| int i, j; | ||
| @@ -1790,7 +1816,7 @@ void ScummEngine::playActorSounds() { | ||
| if (_actors[i]->_cost.soundCounter && _actors[i]->isInCurrentRoom()) { | ||
| _currentScript = 0xFF; | ||
| if (_game.version == 0) { | ||
| sound = v0ActorSounds[i - 1] & 0x3F; | ||
| sound = _actors[i]->_sound[0] & 0x3F; | ||
| } else { | ||
| sound = _actors[i]->_sound[0]; | ||
| } | ||
| @@ -1950,7 +1976,7 @@ void ScummEngine::processActors() { | ||
|
|
||
| // Is this the correct location? | ||
| // 0x073C | ||
| if (v0ActorTalkArray[a0->_number] & 0x3F) | ||
| if (a0->_sound[0] & 0x3F) | ||
| a0->_cost.soundPos = (a0->_cost.soundPos + 1) % 3; | ||
| } | ||
| } | ||
| @@ -2259,7 +2285,7 @@ void Actor::startAnimActor(int f) { | ||
|
|
||
| void Actor_v0::startAnimActor(int f) { | ||
| if (f == _talkStartFrame) { | ||
| if (v0ActorTalkArray[_number] & 0x40) | ||
| if (_sound[0] & 0x40) | ||
| return; | ||
|
|
||
| _speaking = 1; | ||
| @@ -2365,7 +2391,7 @@ void Actor_v0::animateCostume() { | ||
| } | ||
|
|
||
| void Actor_v0::speakCheck() { | ||
| if (v0ActorTalkArray[_number] & 0x80) | ||
| if (_sound[0] & 0x80) | ||
| return; | ||
|
|
||
| int cmd = newDirToOldDir(_facing); | ||
| @@ -323,6 +323,8 @@ static BaseScummFile *openDiskImage(const Common::FSNode &node, const GameFilena | ||
| gs.gameid = gfp->gameid; | ||
| gs.id = (Common::String(gfp->gameid) == "maniac" ? GID_MANIAC : GID_ZAK); | ||
| gs.platform = gfp->platform; | ||
| if (strcmp(gfp->pattern, "maniacdemo.d64") == 0) | ||
| gs.features |= GF_DEMO; | ||
|
|
||
| // determine second disk file name | ||
| Common::String disk2(disk1); | ||
| @@ -207,6 +207,7 @@ static const Engines::ObsoleteGameID obsoleteGameIDsTable[] = { | ||
| static const GameSettings gameVariantsTable[] = { | ||
| {"maniac", "Apple II", 0, GID_MANIAC, 0, 0, MDT_APPLEIIGS, 0, Common::kPlatformApple2GS, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)}, | ||
| {"maniac", "C64", 0, GID_MANIAC, 0, 0, MDT_C64, 0, Common::kPlatformC64, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI) }, | ||
| {"maniac", "C64 Demo", 0, GID_MANIAC, 0, 0, MDT_C64, GF_DEMO, Common::kPlatformC64, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI) }, | ||
| {"maniac", "V1", "v1", GID_MANIAC, 1, 0, MDT_PCSPK | MDT_PCJR, 0, Common::kPlatformDOS, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)}, | ||
| {"maniac", "V1 Demo", "v1", GID_MANIAC, 1, 0, MDT_PCSPK | MDT_PCJR, GF_DEMO, Common::kPlatformDOS, GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)}, | ||
| {"maniac", "NES", 0, GID_MANIAC, 1, 0, MDT_NONE, 0, Common::kPlatformNES, GUIO3(GUIO_NOSPEECH, GUIO_NOMIDI, GUIO_NOASPECT)}, | ||
| @@ -448,6 +449,7 @@ static const GameFilenamePattern gameFilenamesTable[] = { | ||
| { "maniac", "%02d.MAN", kGenRoomNum, UNK_LANG, UNK, "V1 Demo" }, | ||
| { "maniac", "maniac1.d64", kGenUnchanged, UNK_LANG, Common::kPlatformC64, "C64" }, // ... and maniac2.d64 | ||
| { "maniac", "maniac1.dsk", kGenUnchanged, UNK_LANG, Common::kPlatformApple2GS, "Apple II" }, // ... and maniac2.dsk | ||
| { "maniac", "maniacdemo.d64", kGenUnchanged, UNK_LANG, Common::kPlatformC64, "C64 Demo" }, | ||
| { "maniac", "Maniac Mansion (E).prg", kGenUnchanged, Common::EN_GRB, Common::kPlatformNES, "NES" }, | ||
| { "maniac", "Maniac Mansion (F).prg", kGenUnchanged, Common::FR_FRA, Common::kPlatformNES, "NES" }, | ||
| { "maniac", "Maniac Mansion (SW).prg", kGenUnchanged, Common::SE_SWE, Common::kPlatformNES, "NES" }, | ||
| @@ -221,6 +221,15 @@ static const int maniacResourcesPerFile[55] = { | ||
| 3, 10, 1, 0, 0 | ||
| }; | ||
|
|
||
| static const int maniacDemoResourcesPerFile[55] = { | ||
| 0, 12, 0, 2, 1, 12, 1, 13, 6, 0, | ||
| 31, 0, 1, 0, 0, 0, 0, 1, 1, 1, | ||
| 0, 1, 0, 0, 2, 0, 0, 1, 0, 0, | ||
| 2, 7, 1, 11, 0, 0, 5, 1, 0, 0, | ||
| 1, 0, 1, 3, 4, 3, 1, 0, 0, 1, | ||
| 2, 2, 0, 0, 0 | ||
| }; | ||
|
|
||
| static const int zakResourcesPerFile[59] = { | ||
| 0, 29, 12, 14, 13, 4, 4, 10, 7, 4, | ||
| 14, 19, 5, 4, 7, 6, 11, 9, 4, 4, | ||
| @@ -253,9 +262,17 @@ ScummDiskImage::ScummDiskImage(const char *disk1, const char *disk2, GameSetting | ||
| _numGlobalObjects = 256; | ||
| _numRooms = 55; | ||
| _numCostumes = 25; | ||
| _numScripts = 160; | ||
| _numSounds = 70; | ||
| _resourcesPerFile = maniacResourcesPerFile; | ||
|
|
||
| if (_game.features & GF_DEMO) { | ||
| _numScripts = 55; | ||
| _numSounds = 40; | ||
| _resourcesPerFile = maniacDemoResourcesPerFile; | ||
| } else { | ||
| _numScripts = 160; | ||
| _numSounds = 70; | ||
| _resourcesPerFile = maniacResourcesPerFile; | ||
| } | ||
|
|
||
| } else { | ||
| _numGlobalObjects = 775; | ||
| _numRooms = 59; | ||
| @@ -327,6 +344,9 @@ bool ScummDiskImage::open(const Common::String &filename) { | ||
|
|
||
| extractIndex(0); // Fill in resource arrays | ||
|
|
||
| if (_game.features & GF_DEMO) | ||
| return true; | ||
|
|
||
| openDisk(2); | ||
|
|
||
| if (_game.platform == Common::kPlatformApple2GS) { | ||
| @@ -452,8 +452,16 @@ void ScummEngine_v2::processKeyboard(Common::KeyState lastKeyHit) { | ||
| lastKeyHit = Common::KeyState(Common::KEYCODE_ESCAPE); | ||
| // F7 is used to skip cutscenes in the Commodote 64 version of Maniac Mansion | ||
| } else if (_game.id == GID_MANIAC &&_game.platform == Common::kPlatformC64) { | ||
| if (lastKeyHit.keycode == Common::KEYCODE_F7 && lastKeyHit.hasFlags(0)) | ||
| lastKeyHit = Common::KeyState(Common::KEYCODE_ESCAPE); | ||
| // Demo always F7 to be pressed to restart | ||
| if (_game.features & GF_DEMO) { | ||
| if (_roomResource != 0x2D && lastKeyHit.keycode == Common::KEYCODE_F7 && lastKeyHit.hasFlags(0)) { | ||
| restart(); | ||
| return; | ||
| } | ||
| } else { | ||
| if (lastKeyHit.keycode == Common::KEYCODE_F7 && lastKeyHit.hasFlags(0)) | ||
| lastKeyHit = Common::KeyState(Common::KEYCODE_ESCAPE); | ||
| } | ||
| // 'B' is used to skip cutscenes in the NES version of Maniac Mansion | ||
| } else if (_game.id == GID_MANIAC &&_game.platform == Common::kPlatformNES) { | ||
| if (lastKeyHit.keycode == Common::KEYCODE_b && lastKeyHit.hasFlags(Common::KBD_SHIFT)) | ||
| @@ -34,8 +34,14 @@ void ScummEngine_v2::readClassicIndexFile() { | ||
| _numGlobalObjects = 256; | ||
| _numRooms = 55; | ||
| _numCostumes = 25; | ||
| _numScripts = 160; | ||
| _numSounds = 70; | ||
| if (_game.features & GF_DEMO) { | ||
| _numScripts = 55; | ||
| _numSounds = 40; | ||
| } else { | ||
| _numScripts = 160; | ||
| _numSounds = 70; | ||
| } | ||
|
|
||
| } else if (_game.platform == Common::kPlatformNES) { | ||
| _numGlobalObjects = 775; | ||
| _numRooms = 55; | ||
| @@ -172,7 +172,7 @@ void ScummEngine_v0::setupOpcodes() { | ||
| /* 6C */ | ||
| OPCODE(0x6c, o_stopCurrentScript); | ||
| OPCODE(0x6d, o2_putActorInRoom); | ||
| OPCODE(0x6e, o2_dummy); | ||
| OPCODE(0x6e, o_screenPrepare); | ||
| OPCODE(0x6f, o2_ifState08); | ||
| /* 70 */ | ||
| OPCODE(0x70, o_lights); | ||
| @@ -633,19 +633,34 @@ void ScummEngine_v0::setMode(byte mode) { | ||
|
|
||
| switch (_currentMode) { | ||
| case kModeCutscene: | ||
| if (_game.features & GF_DEMO) { | ||
| if (VAR(11) != 0) | ||
| _drawDemo = true; | ||
| } | ||
| _redrawSentenceLine = false; | ||
| // Note: do not change freeze state here | ||
| state = USERSTATE_SET_IFACE | | ||
| USERSTATE_SET_CURSOR; | ||
|
|
||
| break; | ||
| case kModeKeypad: | ||
| if (_game.features & GF_DEMO) { | ||
| if (VAR(11) != 0) | ||
| _drawDemo = true; | ||
| } | ||
| _redrawSentenceLine = false; | ||
| state = USERSTATE_SET_IFACE | | ||
| USERSTATE_SET_CURSOR | USERSTATE_CURSOR_ON | | ||
| USERSTATE_SET_FREEZE | USERSTATE_FREEZE_ON; | ||
| break; | ||
| case kModeNormal: | ||
| case kModeNoNewKid: | ||
| if (_game.features & GF_DEMO) { | ||
| resetVerbs(); | ||
| _activeVerb = kVerbWalkTo; | ||
| _redrawSentenceLine = true; | ||
| _drawDemo = false; | ||
| } | ||
| state = USERSTATE_SET_IFACE | USERSTATE_IFACE_ALL | | ||
| USERSTATE_SET_CURSOR | USERSTATE_CURSOR_ON | | ||
| USERSTATE_SET_FREEZE; | ||
| @@ -967,6 +982,10 @@ void ScummEngine_v0::o_setOwnerOf() { | ||
| setOwnerOf(obj, owner); | ||
| } | ||
|
|
||
| void ScummEngine_v0::o_screenPrepare() { | ||
|
|
||
| } | ||
|
|
||
| void ScummEngine_v0::resetSentence() { | ||
| _activeVerb = kVerbWalkTo; | ||
| _activeObject = 0; | ||
| @@ -1,5 +1,5 @@ | ||
| /* | ||
| This file was generated by the md5table tool on Sat Nov 29 19:54:41 2014 | ||
| This file was generated by the md5table tool on Sun Dec 7 23:09:10 2014 | ||
| DO NOT EDIT MANUALLY! | ||
| */ | ||
|
|
||
| @@ -135,6 +135,7 @@ static const MD5Table md5table[] = { | ||
| { "2a446817ffcabfef8716e0c456ecaf81", "puttzoo", "", "Demo", -1, Common::DE_DEU, Common::kPlatformWindows }, | ||
| { "2a8658dbd13d84d1bce64a71a35995eb", "pajama2", "HE 99", "Demo", -1, Common::HE_ISR, Common::kPlatformWindows }, | ||
| { "2c04aacffb8428f30ccf4f734fbe3adc", "activity", "", "", -1, Common::EN_ANY, Common::kPlatformDOS }, | ||
| { "2cb46375dd5cdfd023e2f07e0a21b530", "maniac", "C64", "Demo", -1, Common::EN_ANY, Common::kPlatformC64 }, | ||
| { "2ccd8891ce4d3f1a334d21bff6a88ca2", "monkey", "CD", "", 9455, Common::EN_ANY, Common::kPlatformMacintosh }, | ||
| { "2d1e891fe52df707c30185e52c50cd92", "monkey", "CD", "CD", 8955, Common::EN_ANY, Common::kPlatformDOS }, | ||
| { "2d388339d6050d8ccaa757b64633954e", "indyloom", "FM-TOWNS", "Demo", 7520, Common::EN_ANY, Common::kPlatformFMTowns }, | ||
| @@ -716,7 +716,7 @@ ScummEngine_v2::ScummEngine_v2(OSystem *syst, const DetectorResult &dr) | ||
|
|
||
| ScummEngine_v0::ScummEngine_v0(OSystem *syst, const DetectorResult &dr) | ||
| : ScummEngine_v2(syst, dr) { | ||
|
|
||
| _drawDemo = false; | ||
| _currentMode = 0; | ||
| _currentLights = 0; | ||
|
|
||
| @@ -731,6 +731,9 @@ ScummEngine_v0::ScummEngine_v0(OSystem *syst, const DetectorResult &dr) | ||
| VAR_ACTIVE_OBJECT2 = 0xFF; | ||
| VAR_IS_SOUND_RUNNING = 0xFF; | ||
| VAR_ACTIVE_VERB = 0xFF; | ||
|
|
||
| if (strcmp(dr.fp.pattern, "maniacdemo.d64") == 0 ) | ||
| _game.features |= GF_DEMO; | ||
| } | ||
|
|
||
| ScummEngine_v6::ScummEngine_v6(OSystem *syst, const DetectorResult &dr) | ||
| @@ -1091,8 +1094,13 @@ Common::Error ScummEngine::init() { | ||
| const char *tmpBuf1, *tmpBuf2; | ||
| assert(_game.id == GID_MANIAC || _game.id == GID_ZAK); | ||
| if (_game.id == GID_MANIAC) { | ||
| tmpBuf1 = "maniac1.d64"; | ||
| tmpBuf2 = "maniac2.d64"; | ||
| if (_game.features & GF_DEMO) { | ||
| tmpBuf1 = "maniacdemo.d64"; | ||
| tmpBuf2 = "maniacdemo.d64"; | ||
| } else { | ||
| tmpBuf1 = "maniac1.d64"; | ||
| tmpBuf2 = "maniac2.d64"; | ||
| } | ||
| } else { | ||
| tmpBuf1 = "zak1.d64"; | ||
| tmpBuf2 = "zak2.d64"; | ||
| @@ -2572,7 +2580,7 @@ void ScummEngine::runBootscript() { | ||
| int args[NUM_SCRIPT_LOCAL]; | ||
| memset(args, 0, sizeof(args)); | ||
| args[0] = _bootParam; | ||
| if (_game.id == GID_MANIAC && (_game.features & GF_DEMO)) | ||
| if (_game.id == GID_MANIAC && (_game.features & GF_DEMO) && (_game.platform != Common::kPlatformC64)) | ||
| runScript(9, 0, 0, args); | ||
| else | ||
| runScript(1, 0, 0, args); | ||
Oops, something went wrong.