From 28bfe7374930cd78f722451b8754822a11dd500d Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 13 Aug 2014 22:23:08 -0400 Subject: [PATCH] ACCESS: Implemented cmdSpecial script opcode --- engines/access/amazon/amazon_scripts.cpp | 5 +++++ engines/access/amazon/amazon_scripts.h | 2 ++ engines/access/screen.cpp | 18 ++++++++++++++++++ engines/access/screen.h | 6 ++++++ engines/access/scripts.cpp | 21 ++++++++++++++++++++- engines/access/scripts.h | 2 ++ 6 files changed, 53 insertions(+), 1 deletion(-) diff --git a/engines/access/amazon/amazon_scripts.cpp b/engines/access/amazon/amazon_scripts.cpp index 1d3e7b4b7699..d7e84394b51c 100644 --- a/engines/access/amazon/amazon_scripts.cpp +++ b/engines/access/amazon/amazon_scripts.cpp @@ -31,6 +31,11 @@ namespace Amazon { AmazonScripts::AmazonScripts(AccessEngine *vm) : Scripts(vm) { } +void AmazonScripts::executeSpecial(int commandIndex, int param1, int param2) { + warning("TODO"); +} + + } // End of namespace Amazon } // End of namespace Access diff --git a/engines/access/amazon/amazon_scripts.h b/engines/access/amazon/amazon_scripts.h index 08fbc3a0f2ad..b8fdaaa7f3dc 100644 --- a/engines/access/amazon/amazon_scripts.h +++ b/engines/access/amazon/amazon_scripts.h @@ -31,6 +31,8 @@ namespace Access { namespace Amazon { class AmazonScripts: public Scripts { +protected: + virtual void executeSpecial(int commandIndex, int param1, int param2); public: AmazonScripts(AccessEngine *vm); }; diff --git a/engines/access/screen.cpp b/engines/access/screen.cpp index 6f9b53994def..4673bb6136a6 100644 --- a/engines/access/screen.cpp +++ b/engines/access/screen.cpp @@ -40,6 +40,7 @@ Screen::Screen(AccessEngine *vm) : _vm(vm) { Common::fill(&_manPal[0], &_manPal[0x60], 0); Common::fill(&_scaleTable1[0], &_scaleTable1[256], 0); Common::fill(&_scaleTable2[0], &_scaleTable2[256], 0); + _savedPaletteCount = 0; _vesaMode = 0; _vesaCurrentWin = 0; _currentPanel = 0; @@ -114,6 +115,23 @@ void Screen::updatePalette() { updateScreen(); } +void Screen::savePalette() { + Common::copy(&_rawPalette[0], &_rawPalette[PALETTE_SIZE], + &_savedPalettes[_savedPaletteCount][0]); + + if (++_savedPaletteCount == 2) + _savedPaletteCount = 1; +} + +void Screen::restorePalette() { + if (--_savedPaletteCount < 0) + _savedPaletteCount = 0; + + Common::copy(&_savedPalettes[_savedPaletteCount][0], + &_savedPalettes[_savedPaletteCount][PALETTE_SIZE], &_rawPalette[0]); +} + + void Screen::forceFadeOut() { const int FADE_AMOUNT = 2; bool repeatFlag; diff --git a/engines/access/screen.h b/engines/access/screen.h index 6ede482e6101..d759ae119e9e 100644 --- a/engines/access/screen.h +++ b/engines/access/screen.h @@ -52,6 +52,8 @@ class Screen: public ASurface { AccessEngine *_vm; byte _tempPalette[PALETTE_SIZE]; byte _rawPalette[PALETTE_SIZE]; + byte _savedPalettes[2][PALETTE_SIZE]; + int _savedPaletteCount; int _vesaCurrentWin; int _currentPanel; Common::Point _msVirtualOffset; @@ -117,6 +119,10 @@ class Screen: public ASurface { void loadRawPalette(Common::SeekableReadStream *stream); + void savePalette(); + + void restorePalette(); + /** * Copy a buffer to the screen */ diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp index 19633544f488..0e1d421c346e 100644 --- a/engines/access/scripts.cpp +++ b/engines/access/scripts.cpp @@ -326,7 +326,26 @@ void Scripts::cmdRemoveLast() { --_vm->_numAnimTimers; } -void Scripts::CMDSPECIAL() { error("TODO"); } +void Scripts::CMDSPECIAL() { + _specialFunction = _data->readUint16LE(); + int p1 = _data->readUint16LE(); + int p2 = _data->readUint16LE(); + + if (_specialFunction == 1) { + if (_vm->_establishTable[p2] == 1) + return; + + _vm->_screen->savePalette(); + } + + executeSpecial(_specialFunction, p1, p2); + + if (_specialFunction == 1) { + _vm->_screen->restorePalette(); + _vm->_room->_function = 3; + } +} + void Scripts::CMDSETCYCLE() { error("TODO"); } void Scripts::CMDCYCLE() { error("TODO"); } void Scripts::CMDCHARSPEAK() { error("TODO"); } diff --git a/engines/access/scripts.h b/engines/access/scripts.h index 495c4c5f9f8c..0916b9e9b16c 100644 --- a/engines/access/scripts.h +++ b/engines/access/scripts.h @@ -37,9 +37,11 @@ class Scripts { private: const byte *_rawData; Common::MemoryReadStream *_data; + int _specialFunction; protected: AccessEngine *_vm; + virtual void executeSpecial(int commandIndex, int param1, int param2) = 0; virtual void executeCommand(int commandIndex); void CMDOBJECT(); void CMDENDOBJECT();