diff options
Diffstat (limited to 'engines/sherlock/tattoo/tattoo.cpp')
-rw-r--r-- | engines/sherlock/tattoo/tattoo.cpp | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/engines/sherlock/tattoo/tattoo.cpp b/engines/sherlock/tattoo/tattoo.cpp new file mode 100644 index 0000000000..3131df7649 --- /dev/null +++ b/engines/sherlock/tattoo/tattoo.cpp @@ -0,0 +1,214 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/config-manager.h" +#include "engines/util.h" +#include "sherlock/tattoo/tattoo.h" +#include "sherlock/tattoo/tattoo_fixed_text.h" +#include "sherlock/tattoo/tattoo_resources.h" +#include "sherlock/tattoo/tattoo_scene.h" +#include "sherlock/tattoo/tattoo_user_interface.h" +#include "sherlock/tattoo/widget_base.h" +#include "sherlock/people.h" + +namespace Sherlock { + +namespace Tattoo { + +TattooEngine::TattooEngine(OSystem *syst, const SherlockGameDescription *gameDesc) : + SherlockEngine(syst, gameDesc), _darts(this), _foolscapWidget(this) { + _runningProlog = false; + _fastMode = false; + _allowFastMode = true; + _transparentMenus = true; + _textWindowsOn = true; +} + +TattooEngine::~TattooEngine() { +} + +void TattooEngine::showOpening() { + // No implementation - opening is done using in-game scenes +} + +void TattooEngine::initialize() { + initGraphics(640, 480, true); + + // Initialize the base engine + SherlockEngine::initialize(); + + // Initialise the global flags + _flags.resize(3200); + _flags[1] = _flags[4] = _flags[76] = true; + _runningProlog = true; + + // Add some more files to the cache + _res->addToCache("walk.lib"); + + // Set up list of people + TattooFixedText &fixedText = *(TattooFixedText *)_fixedText; + const char *peopleNamePtr = nullptr; + + for (int idx = 0; idx < TATTOO_MAX_PEOPLE; ++idx) { + peopleNamePtr = fixedText.getText(PEOPLE_DATA[idx].fixedTextId); + + _people->_characters.push_back(PersonData( + peopleNamePtr, + PEOPLE_DATA[idx].portrait, nullptr, nullptr)); + } + + // Load the inventory + loadInventory(); + + // Starting scene + _scene->_goToScene = STARTING_INTRO_SCENE; + + // Load an initial palette + loadInitialPalette(); +} + +void TattooEngine::startScene() { + TattooUserInterface &ui = *(TattooUserInterface *)_ui; + + switch (_scene->_goToScene) { + case 7: + case 8: + case 18: + case 53: + case 68: + // Load overlay mask(s) for the scene + ui._mask = _res->load(Common::String::format("res%02d.msk", _scene->_goToScene)); + if (_scene->_goToScene == 8) + ui._mask1 = _res->load("res08a.msk"); + else if (_scene->_goToScene == 18 || _scene->_goToScene == 68) + ui._mask1 = _res->load("res08a.msk"); + break; + + case STARTING_INTRO_SCENE: + // Disable input so that the intro can't be skipped until the game's logo has been shown + ui._lockoutTimer = STARTUP_KEYS_DISABLED_DELAY; + break; + + case OVERHEAD_MAP: + case OVERHEAD_MAP2: + // Show the map + _scene->_currentScene = OVERHEAD_MAP; + _scene->_goToScene = _map->show(); + + _people->_savedPos = Common::Point(-1, -1); + _people->_savedPos._facing = -1; + break; + + case 101: + // Darts Board minigame + _darts.playDarts(GAME_CRICKET); + break; + + case 102: + // Darts Board minigame + _darts.playDarts(GAME_301); + break; + + case 103: + // Darts Board minigame + _darts.playDarts(GAME_501); + break; + + default: + break; + } + + _events->setCursor(ARROW); +} + +void TattooEngine::loadInitialPalette() { + byte palette[768]; + Common::SeekableReadStream *stream = _res->load("room.pal"); + stream->read(palette, PALETTE_SIZE); + _screen->translatePalette(palette); + _screen->setPalette(palette); + + delete stream; +} + +void TattooEngine::loadInventory() { + Inventory &inv = *_inventory; + + Common::String inv1 = _fixedText->getText(kFixedText_Inv1); + Common::String inv2 = _fixedText->getText(kFixedText_Inv2); + Common::String inv3 = _fixedText->getText(kFixedText_Inv3); + Common::String inv4 = _fixedText->getText(kFixedText_Inv4); + Common::String inv5 = _fixedText->getText(kFixedText_Inv5); + Common::String inv6 = _fixedText->getText(kFixedText_Inv6); + Common::String inv7 = _fixedText->getText(kFixedText_Inv7); + Common::String inv8 = _fixedText->getText(kFixedText_Inv8); + Common::String invDesc1 = _fixedText->getText(kFixedText_InvDesc1); + Common::String invDesc2 = _fixedText->getText(kFixedText_InvDesc2); + Common::String invDesc3 = _fixedText->getText(kFixedText_InvDesc3); + Common::String invDesc4 = _fixedText->getText(kFixedText_InvDesc4); + Common::String invDesc5 = _fixedText->getText(kFixedText_InvDesc5); + Common::String invDesc6 = _fixedText->getText(kFixedText_InvDesc6); + Common::String invDesc7 = _fixedText->getText(kFixedText_InvDesc7); + Common::String invDesc8 = _fixedText->getText(kFixedText_InvDesc8); + Common::String solve = _fixedText->getText(kFixedText_Solve); + + // Initial inventory + inv._holdings = 5; + inv.push_back(InventoryItem(0, inv1, invDesc1, "_ITEM01A")); + inv.push_back(InventoryItem(0, inv2, invDesc2, "_ITEM02A")); + inv.push_back(InventoryItem(0, inv3, invDesc3, "_ITEM03A")); + inv.push_back(InventoryItem(0, inv4, invDesc4, "_ITEM04A")); + inv.push_back(InventoryItem(0, inv5, invDesc5, "_ITEM05A")); + + // Hidden items + inv.push_back(InventoryItem(295, inv6, invDesc6, "_PAP212D", solve)); + inv.push_back(InventoryItem(294, inv7, invDesc7, "_PAP212I")); + inv.push_back(InventoryItem(818, inv8, invDesc8, "_LANT02I")); +} + +void TattooEngine::doFoolscapPuzzle() { + _foolscapWidget.show(); +} + +void TattooEngine::loadConfig() { + SherlockEngine::loadConfig(); + + _transparentMenus = ConfMan.getBool("transparent_windows"); + _textWindowsOn = ConfMan.getBool("subtitles") || !_sound->_speechOn; +} + +void TattooEngine::saveConfig() { + SherlockEngine::saveConfig(); + + ConfMan.setBool("transparent_windows", _transparentMenus); + ConfMan.setBool("subtitles", _textWindowsOn); + ConfMan.flushToDisk(); +} + +bool TattooEngine::canSaveGameStateCurrently() { + TattooUserInterface &ui = *(TattooUserInterface *)_ui; + return _canLoadSave && !ui._creditsWidget.active() && !_runningProlog; +} + +} // End of namespace Tattoo + +} // End of namespace Sherlock |