aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2015-03-18 19:02:17 -0400
committerPaul Gilbert2015-03-18 19:02:17 -0400
commitb8ad1ce140c91257ba79fe50f41da34a5a6e74c2 (patch)
tree72d3aeddfa430c575bfa313b52a8040ffa0e82d9
parent62f3f5d14e391cdac0bbfe200cdde2e4773afba4 (diff)
downloadscummvm-rg350-b8ad1ce140c91257ba79fe50f41da34a5a6e74c2.tar.gz
scummvm-rg350-b8ad1ce140c91257ba79fe50f41da34a5a6e74c2.tar.bz2
scummvm-rg350-b8ad1ce140c91257ba79fe50f41da34a5a6e74c2.zip
SHERLOCK: Make random pixel transitions more like the original
-rw-r--r--engines/sherlock/events.cpp34
-rw-r--r--engines/sherlock/screen.cpp19
-rw-r--r--engines/sherlock/screen.h1
3 files changed, 39 insertions, 15 deletions
diff --git a/engines/sherlock/events.cpp b/engines/sherlock/events.cpp
index c6c013193c..b2d9fc65e8 100644
--- a/engines/sherlock/events.cpp
+++ b/engines/sherlock/events.cpp
@@ -166,18 +166,32 @@ void EventsManager::wait(int numFrames) {
}
bool EventsManager::delay(uint32 time, bool interruptable) {
- uint32 delayEnd = g_system->getMillis() + time;
-
- while (!_vm->shouldQuit() && g_system->getMillis() < delayEnd) {
- pollEventsAndWait();
-
- if (interruptable && (isKeyPressed() || _mouseClicked)) {
- clearEvents();
- return false;
+ // Different handling for really short versus extended times
+ if (time < 10) {
+ // For really short periods, simply delay by the desired amount
+ pollEvents();
+ g_system->delayMillis(time);
+ bool result = !(interruptable && (isKeyPressed() || _mouseClicked));
+
+ clearEvents();
+ return result;
+ } else {
+ // For long periods go into a loop where we delay by 10ms at a time and then
+ // check for events. This ensures for longer delays that responsiveness is
+ // maintained
+ uint32 delayEnd = g_system->getMillis() + time;
+
+ while (!_vm->shouldQuit() && g_system->getMillis() < delayEnd) {
+ pollEventsAndWait();
+
+ if (interruptable && (isKeyPressed() || _mouseClicked)) {
+ clearEvents();
+ return false;
+ }
}
- }
- return true;
+ return true;
+ }
}
/**
diff --git a/engines/sherlock/screen.cpp b/engines/sherlock/screen.cpp
index 41cf19e48c..7a4d4863ac 100644
--- a/engines/sherlock/screen.cpp
+++ b/engines/sherlock/screen.cpp
@@ -30,6 +30,7 @@ namespace Sherlock {
Screen::Screen(SherlockEngine *vm) : Surface(SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT), _vm(vm),
_backBuffer(SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT),
_backBuffer2(SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT) {
+ _transitionSeed = 1;
setFont(1);
}
@@ -178,15 +179,23 @@ bool Screen::unionRectangle(Common::Rect &destRect, const Common::Rect &src1, co
*/
void Screen::randomTransition() {
EventsManager &events = *_vm->_events;
+ const int TRANSITION_MULTIPLIER = 0x15a4e35;
+ _dirtyRects.clear();
for (int idx = 0; idx <= 65535; ++idx) {
- int offset = _vm->getRandomNumber(this->w * this->h);
- *((byte *)getPixels() + offset) = *((const byte *)_backBuffer.getPixels() + offset);
+ _transitionSeed = _transitionSeed * TRANSITION_MULTIPLIER + 1;
+ int offset = _transitionSeed & 65535;
+
+ if (offset < (SHERLOCK_SCREEN_WIDTH * SHERLOCK_SCREEN_HEIGHT))
+ *((byte *)getPixels() + offset) = *((const byte *)_backBuffer.getPixels() + offset);
if (idx != 0 && (idx % 100) == 0) {
- _dirtyRects.clear();
- addDirtyRect(Common::Rect(0, 0, this->w, this->h));
- events.delay(5);
+ // Ensure there's a full screen dirty rect for the next frame update
+ if (_dirtyRects.empty())
+ addDirtyRect(Common::Rect(0, 0, this->w, this->h));
+
+ events.pollEvents();
+ events.delay(1);
}
}
diff --git a/engines/sherlock/screen.h b/engines/sherlock/screen.h
index 0c0175d2ed..78ccffc575 100644
--- a/engines/sherlock/screen.h
+++ b/engines/sherlock/screen.h
@@ -42,6 +42,7 @@ private:
SherlockEngine *_vm;
int _fontNumber;
Common::List<Common::Rect> _dirtyRects;
+ uint32 _transitionSeed;
void mergeDirtyRects();