/* 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 3 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, see . * */ #ifndef PRIVATE_H #define PRIVATE_H #include "common/compression/installshieldv3_archive.h" #include "common/random.h" #include "common/serializer.h" #include "engines/engine.h" #include "graphics/managed_surface.h" #include "video/smk_decoder.h" #include "private/grammar.h" namespace Image { class ImageDecoder; } namespace Graphics { class ManagedSurface; } struct ADGameDescription; namespace Private { // debug channels enum { kPrivateDebugFunction = 1 << 0, kPrivateDebugCode = 1 << 1, kPrivateDebugScript = 1 << 2 }; // sounds const int kPaperShuffleSound[7] = {32, 33, 34, 35, 36, 37, 39}; // police const int kPoliceBustVideos[6] = {1, 2, 4, 5, 7, 8}; // points const int kOriginZero[2] = {0, 0}; const int kOriginOne[2] = {64, 48}; // vm extern Gen::VM *Gen::g_vm; // structs typedef struct ExitInfo { Common::String nextSetting; Common::Rect rect; Common::String cursor; } ExitInfo; typedef struct MaskInfo { Graphics::Surface *surf; Common::String nextSetting; Common::Point point; Symbol *flag1; Symbol *flag2; Common::String cursor; void clear() { surf = nullptr; flag1 = nullptr; flag2 = nullptr; nextSetting.clear(); cursor.clear(); point = Common::Point(); } } MaskInfo; typedef struct PhoneInfo { Common::String sound; Symbol *flag; int val; } PhoneInfo; typedef struct DossierInfo { Common::String page1; Common::String page2; } DossierInfo; // funcs typedef struct FuncTable { void (*func)(Private::ArgArray); const char *name; } FunctTable; typedef Common::HashMap NameToPtr; extern const FuncTable funcTable[]; // lists typedef Common::List ExitList; typedef Common::List MaskList; typedef Common::List SoundList; typedef Common::List PhoneList; typedef Common::List InvList; // arrays typedef Common::Array DossierArray; // hash tables typedef Common::HashMap PlayedMediaTable; class PrivateEngine : public Engine { private: Common::RandomSource *_rnd; Graphics::PixelFormat _pixelFormat; Image::ImageDecoder *_image; int _screenW, _screenH; public: PrivateEngine(OSystem *syst, const ADGameDescription *gd); ~PrivateEngine(); const ADGameDescription *_gameDescription; bool isDemo() const; Common::Language _language; Common::Platform _platform; SymbolMaps maps; Audio::SoundHandle _fgSoundHandle; Audio::SoundHandle _bgSoundHandle; Video::SmackerDecoder *_videoDecoder; Common::InstallShieldV3 _installerArchive; Common::Error run() override; void restartGame(); void clearAreas(); void initializePath(const Common::FSNode &gamePath) override; Common::SeekableReadStream *loadAssets(); // Functions NameToPtr _functions; void initFuncs(); // User input void selectPauseGame(Common::Point); void selectMask(Common::Point); void selectExit(Common::Point); void selectLoadGame(Common::Point); void selectSaveGame(Common::Point); void resumeGame(); // Cursors bool cursorPauseMovie(Common::Point); bool cursorExit(Common::Point); bool cursorMask(Common::Point); bool hasFeature(EngineFeature f) const override; bool canLoadGameStateCurrently(Common::U32String *msg = nullptr) override { return true; } bool canSaveAutosaveCurrently() override { return false; } bool canSaveGameStateCurrently(Common::U32String *msg = nullptr) override { return true; } void ignoreEvents(); Common::Error loadGameStream(Common::SeekableReadStream *stream) override; Common::Error saveGameStream(Common::WriteStream *stream, bool isAutosave = false) override; void syncGameStream(Common::Serializer &s); Common::Path convertPath(const Common::String &); void playVideo(const Common::String &); void skipVideo(); Graphics::Surface *decodeImage(const Common::String &file, byte **palette); //byte *decodePalette(const Common::String &name); void remapImage(uint16 ncolors, const Graphics::Surface *oldImage, const byte *oldPalette, Graphics::Surface *newImage, const byte *currentPalette); void loadImage(const Common::String &file, int x, int y); void drawScreenFrame(const byte *videoPalette); // Cursors void changeCursor(const Common::String &); Common::String getInventoryCursor(); Common::String getExitCursor(); // Rendering Graphics::ManagedSurface *_compositeSurface; Graphics::Surface *loadMask(const Common::String &, int, int, bool); void drawMask(Graphics::Surface *); void fillRect(uint32, Common::Rect); bool inMask(Graphics::Surface *, Common::Point); uint32 _transparentColor; Common::Rect _screenRect; Common::String _framePath; Graphics::Surface *_frameImage; Graphics::Surface *_mframeImage; byte *_framePalette; Common::String _nextVS; Common::String _currentVS; Common::Point _origin; void drawScreen(); // settings Common::String _nextSetting; Common::String _pausedSetting; Common::String _currentSetting; Common::String getPauseMovieSetting(); Common::String getGoIntroSetting(); Common::String getMainDesktopSetting(); Common::String getPOGoBustMovieSetting(); Common::String getPoliceBustFromMOSetting(); Common::String getAlternateGameVariable(); Common::String getPoliceIndexVariable(); Common::String getWallSafeValueVariable(); // movies Common::String _nextMovie; Common::String _currentMovie; // Dossiers DossierArray _dossiers; uint _dossierSuspect; uint _dossierPage; MaskInfo _dossierNextSuspectMask; MaskInfo _dossierPrevSuspectMask; MaskInfo _dossierNextSheetMask; MaskInfo _dossierPrevSheetMask; bool selectDossierNextSuspect(Common::Point); bool selectDossierPrevSuspect(Common::Point); bool selectDossierNextSheet(Common::Point); bool selectDossierPrevSheet(Common::Point); void loadDossier(); // Police Bust void policeBust(); bool _policeBustEnabled; void startPoliceBust(); void checkPoliceBust(); int _numberClicks; int _maxNumberClicks; int _sirenWarning; Common::String _policeBustSetting; // Diary InvList inventory; Common::String _diaryLocPrefix; void loadLocations(const Common::Rect &); void loadInventory(uint32, const Common::Rect &, const Common::Rect &); bool _toTake; // Save/Load games MaskInfo _saveGameMask; MaskInfo _loadGameMask; int _mode; bool _modified; PlayedMediaTable _playedMovies; PlayedMediaTable _playedPhoneClips; Common::String _repeatedMovieExit; // Masks/Exits ExitList _exits; MaskList _masks; // Sounds void playSound(const Common::String &, uint, bool, bool); void stopSound(bool); bool isSoundActive(); bool _noStopSounds; Common::String getPaperShuffleSound(); Common::String _globalAudioPath; Common::String getTakeSound(); Common::String getTakeLeaveSound(); Common::String getLeaveSound(); Common::String _sirenSound; // Radios Common::String _infaceRadioPath; MaskInfo _AMRadioArea; MaskInfo _policeRadioArea; MaskInfo _phoneArea; Common::String _phonePrefix; Common::String _phoneCallSound; SoundList _AMRadio; SoundList _policeRadio; PhoneList _phone; Common::String getRandomPhoneClip(const char *, int, int); void selectAMRadioArea(Common::Point); void selectPoliceRadioArea(Common::Point); void selectPhoneArea(Common::Point); void checkPhoneCall(); // Safe uint32 _safeColor; Common::String _safeNumberPath; MaskInfo _safeDigitArea[3]; Common::Rect _safeDigitRect[3]; uint32 _safeDigit[3]; bool selectSafeDigit(Common::Point); void addSafeDigit(uint32, Common::Rect*); void renderSafeDigit(uint32); // Random values bool getRandomBool(uint); // Timers bool installTimer(uint32, Common::String *); void removeTimer(); }; extern PrivateEngine *g_private; } // End of namespace Private #endif