[Scummvm-git-logs] scummvm master -> b5fa1e3efd074febe97aafd8b2e5513543e003aa

athrxx noreply at scummvm.org
Wed Jan 3 19:27:03 UTC 2024


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:
b5fa1e3efd KYRA: (EOB) - improve spell anim performance


Commit: b5fa1e3efd074febe97aafd8b2e5513543e003aa
    https://github.com/scummvm/scummvm/commit/b5fa1e3efd074febe97aafd8b2e5513543e003aa
Author: athrxx (athrxx at scummvm.org)
Date: 2024-01-03T20:26:32+01:00

Commit Message:
KYRA: (EOB) - improve spell anim performance

(for fireball, ice storm, lightning bolt, cone of cold, etc)

The current code seems to misbehave on platforms with
slow graphics updates (whether related to our backend,
to SDL or the actual graphics drivers or hardware). This
patch allows frame drops if necessary.

Changed paths:
    engines/kyra/graphics/screen_eob.cpp


diff --git a/engines/kyra/graphics/screen_eob.cpp b/engines/kyra/graphics/screen_eob.cpp
index 6978ce8c339..502620aba70 100644
--- a/engines/kyra/graphics/screen_eob.cpp
+++ b/engines/kyra/graphics/screen_eob.cpp
@@ -39,7 +39,7 @@
 #include "graphics/sjis.h"
 #include "graphics/fonts/dosfont.h"
 
-#define EXPLOSION_ANIM_DURATION 750
+#define EXPLOSION_ANIM_DURATION 500
 #define VORTEX_ANIM_DURATION 750
 
 namespace Kyra {
@@ -1293,7 +1293,7 @@ void Screen_EoB::drawExplosion(int scale, int radius, int numElements, int stepS
 		ptr8[i] = scale << 8;
 	}
 
-	uint32 playSpeedDelay = ((EXPLOSION_ANIM_DURATION << 15) / numElements) >> 7;
+	uint32 playSpeedDelay = EXPLOSION_ANIM_DURATION << 3;
 	uint32 frameDelay = (1000 << 8) / 60;
 	uint32 playSpeedTimer = 0;
 	uint32 frameTimer = frameDelay;
@@ -1313,12 +1313,16 @@ void Screen_EoB::drawExplosion(int scale, int radius, int numElements, int stepS
 						setPagePixel(0, px, py, ptr6[i]);
 				}
 
-				if (_system->getMillis() >= start + (frameTimer >> 8)) {
+				playSpeedTimer += playSpeedDelay;
+				uint32 ct = _system->getMillis();
+				if (ct >= (start + (frameTimer >> 8))) {
 					updateScreen();
+					uint32 diff = (_system->getMillis() - ct) << 8;
+					if ((int32)diff > 0 && diff > frameDelay)
+						start += ((diff - frameDelay) >> 8);
 					frameTimer += frameDelay;
 				}
-				playSpeedTimer += playSpeedDelay;
-				if (_system->getMillis() < start + (playSpeedTimer >> 15))
+				if (_system->getMillis() < (start + (playSpeedTimer >> 15)))
 					_vm->delayUntil(start + (playSpeedTimer >> 15));
 			}
 		}
@@ -1361,12 +1365,16 @@ void Screen_EoB::drawExplosion(int scale, int radius, int numElements, int stepS
 				ptr7[i] = 0;
 			}
 
-			if (_system->getMillis() >= start + (frameTimer >> 8)) {
+			playSpeedTimer += playSpeedDelay;
+			uint32 ct = _system->getMillis();
+			if (ct >= (start + (frameTimer >> 8))) {
 				updateScreen();
+				uint32 diff = (_system->getMillis() - ct) << 8;
+				if ((int32)diff > 0 && diff > frameDelay)
+					start += ((diff - frameDelay) >> 8);
 				frameTimer += frameDelay;
 			}
-			playSpeedTimer += playSpeedDelay;
-			if (_system->getMillis() < start + (playSpeedTimer >> 15))
+			if (_system->getMillis() < (start + (playSpeedTimer >> 15)))
 				_vm->delayUntil(start + (playSpeedTimer >> 15));
 		}
 	}
@@ -1395,7 +1403,7 @@ void Screen_EoB::drawVortex(int numElements, int radius, int stepSize, int, int
 	int cy = 48;
 	radius <<= 6;
 
-	uint32 playSpeedDelay = ((VORTEX_ANIM_DURATION << 16) / numElements) >> 8;
+	uint32 playSpeedDelay = (VORTEX_ANIM_DURATION << 8) / numElements;
 	uint32 frameDelay = (1000 << 8) / 60;
 	uint32 playSpeedTimer = 0;
 	uint32 frameTimer = frameDelay;
@@ -1461,12 +1469,16 @@ void Screen_EoB::drawVortex(int numElements, int radius, int stepSize, int, int
 				else
 					setPagePixel(0, px, py, pixBackup[ii]);
 
-				if (_system->getMillis() >= start + (frameTimer >> 8)) {
+				playSpeedTimer += playSpeedDelay;
+				uint32 ct = _system->getMillis();
+				if (ct >= (start + (frameTimer >> 8))) {
 					updateScreen();
+					uint32 diff = (_system->getMillis() - ct) << 8;
+					if ((int32)diff > 0 && diff > frameDelay)
+						start += ((diff - frameDelay) >> 8);
 					frameTimer += frameDelay;
 				}
-				playSpeedTimer += playSpeedDelay;
-				if (_system->getMillis() < start + (playSpeedTimer >> 16))
+				if (_system->getMillis() < (start + (playSpeedTimer >> 16)))
 					_vm->delayUntil(start + (playSpeedTimer >> 16));
 			}
 		}
@@ -1512,12 +1524,16 @@ void Screen_EoB::drawVortex(int numElements, int radius, int stepSize, int, int
 				colTableStep[ii] = 0;
 			}
 
-			if (_system->getMillis() >= start + (frameTimer >> 8)) {
+			playSpeedTimer += playSpeedDelay;
+			uint32 ct = _system->getMillis();
+			if (ct >= (start + (frameTimer >> 8))) {
 				updateScreen();
+				uint32 diff = (_system->getMillis() - ct) << 8;
+				if ((int32)diff > 0 && diff > frameDelay)
+					start += ((diff - frameDelay) >> 8);
 				frameTimer += frameDelay;
 			}
-			playSpeedTimer += playSpeedDelay;
-			if (_system->getMillis() < start + (playSpeedTimer >> 16))
+			if (_system->getMillis() < (start + (playSpeedTimer >> 16)))
 				_vm->delayUntil(start + (playSpeedTimer >> 16));
 		}
 		d++;




More information about the Scummvm-git-logs mailing list