From f74ba29753de23bad9a07f531fc4c03ea3375594 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Tue, 30 Dec 2014 03:45:14 +0100 Subject: SCUMM: Enable Day of the Tentacle easter egg Instead of returning to the launcher, a game may now specify a list of "chained" games and optional save slots. The first game is popped from the list and started. Quitting still quits the entire ScummVM. It seemed like the sensible thing to do. --- engines/scumm/scumm.cpp | 44 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) (limited to 'engines/scumm/scumm.cpp') diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp index 6040344c2c..34ae957951 100644 --- a/engines/scumm/scumm.cpp +++ b/engines/scumm/scumm.cpp @@ -2597,9 +2597,47 @@ void ScummEngine_v90he::runBootscript() { } #endif -void ScummEngine::startManiac() { - debug(0, "stub startManiac()"); - displayMessage(0, "%s", _("Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' directory inside the Tentacle game directory.")); +bool ScummEngine::startManiac() { + Common::String currentPath = ConfMan.get("path"); + Common::String maniacTarget; + + // Look for a game with a game path pointing to a 'Maniac' directory + // as a subdirectory to the current game. + Common::ConfigManager::DomainMap::iterator iter = ConfMan.beginGameDomains(); + for (; iter != ConfMan.endGameDomains(); ++iter) { + Common::ConfigManager::Domain &dom = iter->_value; + Common::String path = dom.getVal("path"); + + if (path.hasPrefix(currentPath)) { + path.erase(0, currentPath.size() + 1); + if (path.equalsIgnoreCase("maniac")) { + maniacTarget = dom.getVal("gameid"); + break; + } + } + } + + if (!maniacTarget.empty()) { + // Request a temporary save game to be made. + _saveLoadFlag = 1; + _saveLoadSlot = 100; + _saveTemporaryState = true; + + // Set up the chanined games to Maniac Mansion, and then back + // to the current game again with that save slot. + ConfMan.set("chained_games", maniacTarget + "," + ConfMan.getActiveDomainName() + ":100", Common::ConfigManager::kTransientDomain); + + // Force a return to the launcher. This will start the first + // chained game. + Common::EventManager *eventMan = g_system->getEventManager(); + Common::Event event; + event.type = Common::EVENT_RTL; + eventMan->pushEvent(event); + return true; + } else { + displayMessage(0, "%s", _("Usually, Maniac Mansion would start now. But for that to work, the game files for Maniac Mansion have to be in the 'Maniac' directory inside the Tentacle game directory, and the game has to be added to ScummVM.")); + return false; + } } #pragma mark - -- cgit v1.2.3 From cc916625d9025ffaa898854c4de19da5dc2e2925 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Tue, 30 Dec 2014 10:47:51 +0100 Subject: SCUMM: Add a "chained games manager" This replaces the somewhat ugly use of the config manager to store the chained games. --- engines/scumm/scumm.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'engines/scumm/scumm.cpp') diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp index 34ae957951..9518ed4e5c 100644 --- a/engines/scumm/scumm.cpp +++ b/engines/scumm/scumm.cpp @@ -2625,7 +2625,8 @@ bool ScummEngine::startManiac() { // Set up the chanined games to Maniac Mansion, and then back // to the current game again with that save slot. - ConfMan.set("chained_games", maniacTarget + "," + ConfMan.getActiveDomainName() + ":100", Common::ConfigManager::kTransientDomain); + ChainedGamesMan.push(maniacTarget); + ChainedGamesMan.push(ConfMan.getActiveDomainName(), 100); // Force a return to the launcher. This will start the first // chained game. -- cgit v1.2.3 From 7dc316cced4c7a45a376d76a6ca0c84bd563132f Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Tue, 30 Dec 2014 10:54:49 +0100 Subject: SCUMM: Add secret "easter_egg" config key This makes it possible to override the detection of Maniac Mansion when starting the Day of the Tentacle easter egg. There is no GUI for setting this, no error handling, and setting it to Day of the Tentacle itself is probably a bad idea... --- engines/scumm/scumm.cpp | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) (limited to 'engines/scumm/scumm.cpp') diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp index 9518ed4e5c..7d927b0cda 100644 --- a/engines/scumm/scumm.cpp +++ b/engines/scumm/scumm.cpp @@ -2601,20 +2601,24 @@ bool ScummEngine::startManiac() { Common::String currentPath = ConfMan.get("path"); Common::String maniacTarget; - // Look for a game with a game path pointing to a 'Maniac' directory - // as a subdirectory to the current game. - Common::ConfigManager::DomainMap::iterator iter = ConfMan.beginGameDomains(); - for (; iter != ConfMan.endGameDomains(); ++iter) { - Common::ConfigManager::Domain &dom = iter->_value; - Common::String path = dom.getVal("path"); - - if (path.hasPrefix(currentPath)) { - path.erase(0, currentPath.size() + 1); - if (path.equalsIgnoreCase("maniac")) { - maniacTarget = dom.getVal("gameid"); - break; + if (!ConfMan.hasKey("easter_egg")) { + // Look for a game with a game path pointing to a 'Maniac' directory + // as a subdirectory to the current game. + Common::ConfigManager::DomainMap::iterator iter = ConfMan.beginGameDomains(); + for (; iter != ConfMan.endGameDomains(); ++iter) { + Common::ConfigManager::Domain &dom = iter->_value; + Common::String path = dom.getVal("path"); + + if (path.hasPrefix(currentPath)) { + path.erase(0, currentPath.size() + 1); + if (path.equalsIgnoreCase("maniac")) { + maniacTarget = dom.getVal("gameid"); + break; + } } } + } else { + maniacTarget = ConfMan.get("easter_egg"); } if (!maniacTarget.empty()) { -- cgit v1.2.3 From a0661328b94f0d452995da4f91318d0952ab8346 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Sat, 7 Feb 2015 21:55:24 +0100 Subject: SCUMM: Fix detection of the DoTT Maniac Mansion easter egg target It's the key, not the gameid, that is the proper target name. In my case, the key for that version of MM had the target name "maniac-old" and gameid "maniac" (can you tell I've messed around with this file a bit on my own?), so it tried to use "maniac" as the target, which happened to be the target name for the enhanced version instead. --- engines/scumm/scumm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/scumm/scumm.cpp') diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp index 7d927b0cda..99b4e695bb 100644 --- a/engines/scumm/scumm.cpp +++ b/engines/scumm/scumm.cpp @@ -2612,7 +2612,7 @@ bool ScummEngine::startManiac() { if (path.hasPrefix(currentPath)) { path.erase(0, currentPath.size() + 1); if (path.equalsIgnoreCase("maniac")) { - maniacTarget = dom.getVal("gameid"); + maniacTarget = iter->_key; break; } } -- cgit v1.2.3 From e670951a469b33e28bc9352f8417ba42868468a8 Mon Sep 17 00:00:00 2001 From: Kirben Date: Tue, 9 Jun 2015 11:58:59 +1000 Subject: SCUMM: Fix bug #6592 SCUMM: ZAK - Read Ticket is too fast to read. --- engines/scumm/scumm.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'engines/scumm/scumm.cpp') diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp index 99b4e695bb..c2e0cb2e05 100644 --- a/engines/scumm/scumm.cpp +++ b/engines/scumm/scumm.cpp @@ -316,6 +316,7 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr) _NES_lastTalkingActor = 0; _NES_talkColor = 0; _keepText = false; + _msgCount = 0; _costumeLoader = NULL; _costumeRenderer = NULL; _2byteFontPtr = 0; -- cgit v1.2.3 From ac4360af88d2dfec53fc00677c0284b8ab849b86 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sun, 19 Jul 2015 17:08:08 +0200 Subject: SCUMM: Get rid of unused Audio::mixer references --- engines/scumm/scumm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/scumm/scumm.cpp') diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp index c2e0cb2e05..24d676a1ff 100644 --- a/engines/scumm/scumm.cpp +++ b/engines/scumm/scumm.cpp @@ -1905,7 +1905,7 @@ void ScummEngine::setupMusic(int midi) { // EGA/VGA. However, we support multi MIDI for that game and we cannot // support this with the Player_AD code at the moment. The reason here // is that multi MIDI is supported internally by our iMuse output. - _musicEngine = new Player_AD(this, _mixer); + _musicEngine = new Player_AD(this); } else if (_game.version >= 3 && _game.heversion <= 62) { MidiDriver *nativeMidiDriver = 0; MidiDriver *adlibMidiDriver = 0; -- cgit v1.2.3