aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/hopkins/anim.cpp17
-rw-r--r--engines/hopkins/graphics.cpp28
-rw-r--r--engines/hopkins/graphics.h3
-rw-r--r--engines/hopkins/objects.cpp5
-rw-r--r--engines/hopkins/talk.cpp16
5 files changed, 42 insertions, 27 deletions
diff --git a/engines/hopkins/anim.cpp b/engines/hopkins/anim.cpp
index 1263f6281b..37eb4adc73 100644
--- a/engines/hopkins/anim.cpp
+++ b/engines/hopkins/anim.cpp
@@ -222,10 +222,7 @@ void AnimationManager::playAnim2(const Common::String &filename, uint32 rate1, u
while (!_vm->shouldQuit()) {
memcpy(_vm->_graphicsManager->_oldPalette, _vm->_graphicsManager->_palette, 769);
- if (_vm->_graphicsManager->_lineNbr == SCREEN_WIDTH)
- _vm->_saveLoadManager->saveFile("TEMP.SCR", _vm->_graphicsManager->_backBuffer, 307200);
- else if (_vm->_graphicsManager->_lineNbr == (SCREEN_WIDTH * 2))
- _vm->_saveLoadManager->saveFile("TEMP.SCR", _vm->_graphicsManager->_backBuffer, 614400);
+ _vm->_graphicsManager->backupScreen();
if (!_vm->_graphicsManager->_lineNbr)
_vm->_graphicsManager->_scrollOffset = 0;
@@ -344,8 +341,7 @@ void AnimationManager::playAnim2(const Common::String &filename, uint32 rate1, u
}
_vm->_graphicsManager->_fadingFl = false;
- _vm->_saveLoadManager->load("TEMP.SCR", _vm->_graphicsManager->_backBuffer);
- g_system->getSavefileManager()->removeSavefile("TEMP.SCR");
+ _vm->_graphicsManager->restoreScreen();
memcpy(_vm->_graphicsManager->_palette, _vm->_graphicsManager->_oldPalette, 769);
_vm->_graphicsManager->clearPalette();
@@ -575,10 +571,8 @@ void AnimationManager::playSequence(const Common::String &file, uint32 rate1, ui
if (!noColFl) {
_vm->_eventsManager->refreshScreenAndEvents();
- if (_vm->_graphicsManager->_lineNbr == SCREEN_WIDTH)
- _vm->_saveLoadManager->saveFile("TEMP.SCR", _vm->_graphicsManager->_backBuffer, 307200);
- else if (_vm->_graphicsManager->_lineNbr == (SCREEN_WIDTH * 2))
- _vm->_saveLoadManager->saveFile("TEMP.SCR", _vm->_graphicsManager->_backBuffer, 614400);
+ _vm->_graphicsManager->backupScreen();
+
if (!_vm->_graphicsManager->_lineNbr)
_vm->_graphicsManager->_scrollOffset = 0;
}
@@ -691,8 +685,7 @@ void AnimationManager::playSequence(const Common::String &file, uint32 rate1, ui
f.close();
if (!noColFl) {
- _vm->_saveLoadManager->load("TEMP.SCR", _vm->_graphicsManager->_backBuffer);
- g_system->getSavefileManager()->removeSavefile("TEMP.SCR");
+ _vm->_graphicsManager->restoreScreen();
_vm->_eventsManager->_mouseFl = true;
}
diff --git a/engines/hopkins/graphics.cpp b/engines/hopkins/graphics.cpp
index ee2c75cf55..7eeb5e5b3e 100644
--- a/engines/hopkins/graphics.cpp
+++ b/engines/hopkins/graphics.cpp
@@ -52,6 +52,7 @@ GraphicsManager::GraphicsManager(HopkinsEngine *vm) {
_backBuffer = NULL;
_frontBuffer = NULL;
_screenBuffer = g_PTRNUL;
+ _backupScreen = g_PTRNUL;
_showDirtyRects = false;
_lineNbr2 = 0;
@@ -97,6 +98,7 @@ GraphicsManager::~GraphicsManager() {
_vm->_globals->freeMemory(_backBuffer);
_vm->_globals->freeMemory(_frontBuffer);
_vm->_globals->freeMemory(_screenBuffer);
+ _vm->_globals->freeMemory(_backupScreen);
}
void GraphicsManager::setGraphicalMode(int width, int height) {
@@ -1826,4 +1828,30 @@ void GraphicsManager::drawVerticalLine(byte *surface, int xp, int yp, int height
}
}
+/**
+ * Backup the current screen
+ */
+void GraphicsManager::backupScreen() {
+ // Allocate a new data block for the screen, if necessary
+ if (_vm->_graphicsManager->_backupScreen == g_PTRNUL)
+ _vm->_graphicsManager->_backupScreen = _vm->_globals->allocMemory(SCREEN_WIDTH * 2 * SCREEN_HEIGHT);
+
+ // Backup the screen
+ Common::copy(_vm->_graphicsManager->_backBuffer, _vm->_graphicsManager->_backBuffer +
+ SCREEN_WIDTH * 2 * SCREEN_HEIGHT, _vm->_graphicsManager->_backupScreen);
+}
+
+/**
+ * Restore a previously backed up screen
+ */
+void GraphicsManager::restoreScreen() {
+ assert(_vm->_graphicsManager->_backupScreen != g_PTRNUL);
+
+ // Restore the screen and free the buffer
+ Common::copy(_vm->_graphicsManager->_backupScreen, _vm->_graphicsManager->_backupScreen +
+ SCREEN_WIDTH * 2 * SCREEN_HEIGHT, _vm->_graphicsManager->_backBuffer);
+ _vm->_globals->freeMemory(_vm->_graphicsManager->_backupScreen);
+ _backupScreen = g_PTRNUL;
+}
+
} // End of namespace Hopkins
diff --git a/engines/hopkins/graphics.h b/engines/hopkins/graphics.h
index 8009a366b9..bc8bb19c3f 100644
--- a/engines/hopkins/graphics.h
+++ b/engines/hopkins/graphics.h
@@ -90,6 +90,7 @@ public:
byte *_backBuffer;
byte *_frontBuffer;
byte *_screenBuffer;
+ byte *_backupScreen;
bool _largeScreenFl;
bool _noFadingFl;
bool _fadingFl;
@@ -177,6 +178,8 @@ public:
void m_scroll16(const byte *surface, int xs, int ys, int width, int height, int destX, int destY);
void Trans_bloc2(byte *surface, byte *col, int size);
void NB_SCREEN(bool initPalette);
+ void backupScreen();
+ void restoreScreen();
};
} // End of namespace Hopkins
diff --git a/engines/hopkins/objects.cpp b/engines/hopkins/objects.cpp
index 734d44da4c..7b0e57c9d7 100644
--- a/engines/hopkins/objects.cpp
+++ b/engines/hopkins/objects.cpp
@@ -2653,7 +2653,7 @@ void ObjectsManager::handleSpecialGames() {
oldPalette = _vm->_globals->allocMemory(1000);
memcpy(oldPalette, _vm->_graphicsManager->_palette, 769);
- _vm->_saveLoadManager->saveFile("TEMP1.SCR", _vm->_graphicsManager->_backBuffer, 307200);
+ _vm->_graphicsManager->backupScreen();
if (!_vm->_graphicsManager->_lineNbr)
_vm->_graphicsManager->_scrollOffset = 0;
@@ -2665,8 +2665,7 @@ void ObjectsManager::handleSpecialGames() {
_vm->_soundManager->_specialSoundNum = 0;
_vm->_graphicsManager->NB_SCREEN(false);
- _vm->_saveLoadManager->load("TEMP1.SCR", _vm->_graphicsManager->_backBuffer);
- g_system->getSavefileManager()->removeSavefile("TEMP1.SCR");
+ _vm->_graphicsManager->restoreScreen();
_charactersEnabledFl = false;
memcpy(_vm->_graphicsManager->_palette, oldPalette, 769);
diff --git a/engines/hopkins/talk.cpp b/engines/hopkins/talk.cpp
index 455ead6b9b..a69ae59c94 100644
--- a/engines/hopkins/talk.cpp
+++ b/engines/hopkins/talk.cpp
@@ -83,10 +83,7 @@ void TalkManager::startAnimatedCharacterDialogue(const Common::String &filename)
_characterSprite = _vm->_objectsManager->loadSprite("RES_SAN.RES");
}
- if (_vm->_graphicsManager->_lineNbr == SCREEN_WIDTH)
- _vm->_saveLoadManager->saveFile("TEMP.SCR", _vm->_graphicsManager->_backBuffer, 307200);
- else if (_vm->_graphicsManager->_lineNbr == (SCREEN_WIDTH * 2))
- _vm->_saveLoadManager->saveFile("TEMP.SCR", _vm->_graphicsManager->_backBuffer, 614400);
+ _vm->_graphicsManager->backupScreen();
if (!_vm->_graphicsManager->_lineNbr)
_vm->_graphicsManager->_scrollOffset = 0;
@@ -126,8 +123,7 @@ void TalkManager::startAnimatedCharacterDialogue(const Common::String &filename)
_characterSprite = _vm->_globals->freeMemory(_characterSprite);
_vm->_graphicsManager->NB_SCREEN(false);
- _vm->_saveLoadManager->load("TEMP.SCR", _vm->_graphicsManager->_backBuffer);
- g_system->getSavefileManager()->removeSavefile("TEMP.SCR");
+ _vm->_graphicsManager->restoreScreen();
_vm->_objectsManager->_charactersEnabledFl = false;
_vm->_eventsManager->_mouseCursorId = oldMouseCursorId;
@@ -997,10 +993,7 @@ void TalkManager::animateObject(const Common::String &filename) {
else
_characterSprite = _vm->_objectsManager->loadSprite("RES_SAN.RES");
- if (_vm->_graphicsManager->_lineNbr == SCREEN_WIDTH)
- _vm->_saveLoadManager->saveFile("TEMP.SCR", _vm->_graphicsManager->_backBuffer, 307200);
- else if (_vm->_graphicsManager->_lineNbr == (SCREEN_WIDTH * 2))
- _vm->_saveLoadManager->saveFile("TEMP.SCR", _vm->_graphicsManager->_backBuffer, 614400);
+ _vm->_graphicsManager->backupScreen();
if (!_vm->_graphicsManager->_lineNbr)
_vm->_graphicsManager->_scrollOffset = 0;
@@ -1060,8 +1053,7 @@ void TalkManager::animateObject(const Common::String &filename) {
if (_vm->_globals->_exitId == 101)
_vm->_globals->_exitId = 0;
- _vm->_saveLoadManager->load("TEMP.SCR", _vm->_graphicsManager->_backBuffer);
- g_system->getSavefileManager()->removeSavefile("TEMP.SCR");
+ _vm->_graphicsManager->restoreScreen();
_vm->_objectsManager->_charactersEnabledFl = false;
_vm->_eventsManager->_mouseCursorId = 4;