[Scummvm-git-logs] scummvm master -> 5cf139f0555552001a8be807f01854fe444b2a57

athrxx noreply at scummvm.org
Fri Jun 24 22:14:58 UTC 2022


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
5cf139f055 KYRA: (LoK) - fix animation glitch when skipping over scene


Commit: 5cf139f0555552001a8be807f01854fe444b2a57
    https://github.com/scummvm/scummvm/commit/5cf139f0555552001a8be807f01854fe444b2a57
Author: athrxx (athrxx at scummvm.org)
Date: 2022-06-25T00:14:17+02:00

Commit Message:
KYRA: (LoK) - fix animation glitch when skipping over scene

(When skipping over a scene by left-clicking, sometimes parts of the ongoing animation would remain visible on screen, e. g. some of Herman's body parts in the cave at the beginning)

Changed paths:
    engines/kyra/engine/kyra_lok.cpp
    engines/kyra/graphics/animator_lok.cpp
    engines/kyra/graphics/animator_lok.h


diff --git a/engines/kyra/engine/kyra_lok.cpp b/engines/kyra/engine/kyra_lok.cpp
index 6c4685d2f77..f45de68ff05 100644
--- a/engines/kyra/engine/kyra_lok.cpp
+++ b/engines/kyra/engine/kyra_lok.cpp
@@ -517,21 +517,25 @@ void KyraEngine_LoK::mainLoop() {
 }
 
 void KyraEngine_LoK::delayUntil(uint32 timestamp, bool updateTimers, bool update, bool isMainLoop) {
-	while (_system->getMillis() < timestamp && !shouldQuit() && !skipFlag()) {
+	uint32 ct = _system->getMillis();
+	while (ct < timestamp && !shouldQuit()) {
 		if (updateTimers)
 			_timer->update();
 
-		if (timestamp - _system->getMillis() >= 10)
+		ct = skipFlag() ? ct + _tickLength : _system->getMillis();
+
+		if (timestamp - ct >= 10)
 			delay(10, update, isMainLoop);
 	}
 }
 
 void KyraEngine_LoK::delay(uint32 amount, bool update, bool isMainLoop) {
 	uint32 start = _system->getMillis();
+	uint32 ct = start;
 	do {
 		if (update) {
 			_sprites->updateSceneAnims();
-			_animator->updateAllObjectShapes();
+			_animator->updateAllObjectShapes(!skipFlag());
 			updateTextFade();
 			updateMousePointer();
 		} else {
@@ -565,7 +569,8 @@ void KyraEngine_LoK::delay(uint32 amount, bool update, bool isMainLoop) {
 
 		if (skipFlag())
 			snd_stopVoice();
-	} while (!skipFlag() && _system->getMillis() < start + amount && !shouldQuit());
+		ct = skipFlag() ? ct + _tickLength : _system->getMillis();
+	} while (ct < start + amount && !shouldQuit());
 }
 
 bool KyraEngine_LoK::skipFlag() const {
diff --git a/engines/kyra/graphics/animator_lok.cpp b/engines/kyra/graphics/animator_lok.cpp
index 2087246c927..2da098da175 100644
--- a/engines/kyra/graphics/animator_lok.cpp
+++ b/engines/kyra/graphics/animator_lok.cpp
@@ -338,7 +338,7 @@ void Animator_LoK::prepDrawAllObjects() {
 	}
 }
 
-void Animator_LoK::copyChangedObjectsForward(int refreshFlag) {
+void Animator_LoK::copyChangedObjectsForward(int refreshFlag, bool refreshScreen) {
 	for (AnimObject *curObject = _objectQueue; curObject; curObject = curObject->nextAnimObject) {
 		if (curObject->active) {
 			if (curObject->refreshFlag || refreshFlag) {
@@ -370,14 +370,15 @@ void Animator_LoK::copyChangedObjectsForward(int refreshFlag) {
 		}
 	}
 
-	_screen->updateScreen();
+	if (refreshScreen)
+		_screen->updateScreen();
 }
 
-void Animator_LoK::updateAllObjectShapes() {
+void Animator_LoK::updateAllObjectShapes(bool refreshScreen) {
 	restoreAllObjectBackgrounds();
 	preserveAnyChangedBackgrounds();
 	prepDrawAllObjects();
-	copyChangedObjectsForward(0);
+	copyChangedObjectsForward(0, refreshScreen);
 }
 
 void Animator_LoK::animRemoveGameItem(int index) {
diff --git a/engines/kyra/graphics/animator_lok.h b/engines/kyra/graphics/animator_lok.h
index 4e6d1566111..c22fd6a31f5 100644
--- a/engines/kyra/graphics/animator_lok.h
+++ b/engines/kyra/graphics/animator_lok.h
@@ -69,9 +69,9 @@ public:
 	void restoreAllObjectBackgrounds();
 	void preserveAnyChangedBackgrounds();
 	virtual void prepDrawAllObjects();
-	void copyChangedObjectsForward(int refreshFlag);
+	void copyChangedObjectsForward(int refreshFlag, bool refreshScreen = true);
 
-	void updateAllObjectShapes();
+	void updateAllObjectShapes(bool refreshScreen = true);
 	void animRemoveGameItem(int index);
 	void animAddGameItem(int index, uint16 sceneId);
 	void animAddNPC(int character);




More information about the Scummvm-git-logs mailing list