[Scummvm-git-logs] scummvm master -> 145ca824ab42fcec434bec81e376ca7b17fb010b

Strangerke noreply at scummvm.org
Thu Apr 2 11:04:57 UTC 2026


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

Summary:
145ca824ab WAYNESWORLD: Implement palette animation in Map


Commit: 145ca824ab42fcec434bec81e376ca7b17fb010b
    https://github.com/scummvm/scummvm/commit/145ca824ab42fcec434bec81e376ca7b17fb010b
Author: Strangerke (arnaud.boutonne at gmail.com)
Date: 2026-04-02T13:03:46+02:00

Commit Message:
WAYNESWORLD: Implement palette animation in Map

Changed paths:
    engines/waynesworld/gamemap.cpp
    engines/waynesworld/waynesworld.cpp
    engines/waynesworld/waynesworld.h


diff --git a/engines/waynesworld/gamemap.cpp b/engines/waynesworld/gamemap.cpp
index 43f8ca9ab14..acec5ec57d6 100644
--- a/engines/waynesworld/gamemap.cpp
+++ b/engines/waynesworld/gamemap.cpp
@@ -127,13 +127,13 @@ void WaynesWorldEngine::gameMapOpen() {
     drawImageToScreen(_m02Gxl, "main_map.pcx", 0, 0);
     _screen->fillSquare(kMapItem9s[_gameMapRoomNumber].x0, kMapItem9s[_gameMapRoomNumber].y0, 3, 109);
     paletteFadeIn(0, 256, 16);
-    // TODO gameMapPaletteHandlerStart();
+    gameMapPaletteHandlerStart();
     // sysMouseDriver(1);
 }
 
 void WaynesWorldEngine::gameMapFinish() {
     _gameState = 0;
-    // TODO gameMapPaletteHandlerStop();
+    gameMapPaletteHandlerStop();
     paletteFadeOut(0, 256, 16);
     _musicIndex = 0;
     changeMusic();
@@ -146,17 +146,17 @@ void WaynesWorldEngine::gameMapFinish() {
 void WaynesWorldEngine::gameMapHandleMouseMove(int objectNumber) {
     if (_hoverObjectNumber == objectNumber)
         return;
-    _hoverObjectNumber = objectNumber;
+
+	_hoverObjectNumber = objectNumber;
 	GxlArchive *lib = _m02Gxl;
     Common::String tagFilename;
     int tagX = -1, tagY = -1;
 
     if (_hoverObjectNumber == -1) {
         if (_currentMapItemIndex == 6) {
-			warning("STUB gameMapHandleMouseMove - _currentMapItemIndex == 6");
-            // TODO gameMapPaletteHandlerStop();
-            // TODO paletteFadeColor(36, 4, 21, 2, 64);
-            // TODO gameMapPaletteHandlerStart();
+            gameMapPaletteHandlerStop();
+            paletteFadeColor(36, 4, 21, 2, 64);
+            gameMapPaletteHandlerStart();
             _currentMapItemIndex = -1;
         } else if (_currentMapItemIndex >= 0 && _currentMapItemIndex <= 5) {
             const MapItem13 &item = kMapItem13s[_currentMapItemIndex];
@@ -168,29 +168,28 @@ void WaynesWorldEngine::gameMapHandleMouseMove(int objectNumber) {
             tagFilename = Common::String::format("%s_xtag.pcx", item.name);
             tagX = item.tagX;
             tagY = item.tagY;
-        }
-    } else if (_hoverObjectNumber >= 0 && _hoverObjectNumber <= 5) {
-        const MapItem13 &item = kMapItem13s[_hoverObjectNumber];
-        tagFilename = Common::String::format("%s_tag.pcx", item.name);
-        tagX = item.tagX;
-        tagY = item.tagY;
-    } else if (_hoverObjectNumber >= 7 && _hoverObjectNumber <= 21) {
-        const MapItem17 &item = kMapItem17s[_hoverObjectNumber - 7];
-        tagFilename = Common::String::format("%s_tag.pcx", item.name);
-        tagX = item.tagX;
-        tagY = item.tagY;
-    } else if (_hoverObjectNumber == 6 || (_hoverObjectNumber >= 22 && _hoverObjectNumber <= 27)) {
-		warning("STUB gameMapHandleMouseMove - _hoverObjectNumber == 6");
-		// TODO gameMapPaletteHandlerStop();
-        // TODO paletteFadeColor(36, 63, 0, 0, 64);
-        // TODO gameMapPaletteHandlerStart();
-        _currentMapItemIndex = 6;
-    }
+		}
+	} else if (_hoverObjectNumber >= 0 && _hoverObjectNumber <= 5) {
+		const MapItem13 &item = kMapItem13s[_hoverObjectNumber];
+		tagFilename = Common::String::format("%s_tag.pcx", item.name);
+		tagX = item.tagX;
+		tagY = item.tagY;
+	} else if (_hoverObjectNumber >= 7 && _hoverObjectNumber <= 21) {
+		const MapItem17 &item = kMapItem17s[_hoverObjectNumber - 7];
+		tagFilename = Common::String::format("%s_tag.pcx", item.name);
+		tagX = item.tagX;
+		tagY = item.tagY;
+	} else if (_hoverObjectNumber == 6 || (_hoverObjectNumber >= 22 && _hoverObjectNumber <= 27)) {
+		gameMapPaletteHandlerStop();
+		paletteFadeColor(36, 63, 0, 0, 64);
+		gameMapPaletteHandlerStart();
+		_currentMapItemIndex = 6;
+	}
 
-    if (tagX != -1 && tagY != -1) {
-        _currentMapItemIndex = _hoverObjectNumber;
-        drawImageToScreen(lib, tagFilename.c_str(), tagX, tagY);
-    }
+	if (tagX != -1 && tagY != -1) {
+		_currentMapItemIndex = _hoverObjectNumber;
+		drawImageToScreen(lib, tagFilename.c_str(), tagX, tagY);
+	}
 }
 
 void WaynesWorldEngine::gameMapHandleMouseClick() {
@@ -242,4 +241,16 @@ void WaynesWorldEngine::gameMapSelectItem(const char *prefix, int animX, int ani
     _gameMapFlag = true;
 }
 
+void WaynesWorldEngine::gameMapPaletteHandlerStart() {
+	_gameMapHasPaletteHandler = true;
+	_gameMapCtr = 0;
+	// Original also sets a hook on INT 1Ch for a check 18.2 times a second
+}
+
+void WaynesWorldEngine::gameMapPaletteHandlerStop() {
+	_gameMapHasPaletteHandler = false;
+	_gameMapCtr = 0;
+	// Original also restored the original INT 1Ch
+}
+
 } // End of namespace WaynesWorld
diff --git a/engines/waynesworld/waynesworld.cpp b/engines/waynesworld/waynesworld.cpp
index f1037b1add7..a78b5875bec 100644
--- a/engines/waynesworld/waynesworld.cpp
+++ b/engines/waynesworld/waynesworld.cpp
@@ -260,6 +260,8 @@ Common::Error WaynesWorldEngine::run() {
 	_isSaveAllowed = true;
 
 	while (!shouldQuit() && !(_logic->_r8_flags & 0x20)) {
+		handleMapPalette();
+		
 		_mouseClickButtons = 0;
 		// _keyInput = 0;
 		updateEvents();
@@ -502,6 +504,21 @@ void WaynesWorldEngine::updateMouseMove() {
 
 }
 
+void WaynesWorldEngine::handleMapPalette() {
+	if (_gameMapHasPaletteHandler) {
+		const uint32 curTicks = _system->getMillis();
+		if (curTicks - _gameMapLastTicks > 55) {
+			_gameMapLastTicks = curTicks;
+			_gameMapCtr = (_gameMapCtr + 1) % 16;
+			if (_gameMapCtr == 0) {
+				paletteFadeColor(109, 1, 1, 1, 64);
+			} else if (_gameMapCtr == 8) {
+				paletteFadeColor(109, 56, 8, 5, 64);
+			}
+		}
+	}
+}
+
 void WaynesWorldEngine::handleMouseClick() {
     if (_mouseClickButtons & kLeftButtonClicked) {
         handleMouseLeftClick();
@@ -637,6 +654,30 @@ void WaynesWorldEngine::paletteFadeOut(int index, int count, int stepsSize) {
 	}
 }
 
+void WaynesWorldEngine::paletteFadeColor(int index, byte r, byte g, byte b, int steps) {
+	byte fadePalette[768];
+	g_system->getPaletteManager()->grabPalette(fadePalette, 0, 256);
+
+	const int destR = r << 2;
+	const int destG = g << 2;
+	const int destB = b << 2;
+	
+	const int deltaR = fadePalette[index * 3] >= destR ? 1 : -1;
+	const int deltaG = fadePalette[(index * 3) + 1] >= destG ? 1 : -1;
+	const int deltaB = fadePalette[(index * 3) + 2] >= destB ? 1 : -1;
+	
+	while (fadePalette[index * 3] != destR && fadePalette[(index * 3) + 1] != destG && fadePalette[(index * 3) + 2] != destB) {
+		fadePalette[index * 3] = ABS(fadePalette[index * 3] - destR) < steps ? destR : fadePalette[index * 3] - (steps * deltaR);
+		fadePalette[(index * 3) + 1] = ABS(fadePalette[(index * 3) + 1] - destG) < steps ? destG : fadePalette[(index * 3) + 1] - (steps * deltaG);
+		fadePalette[(index * 3) + 2] = ABS(fadePalette[(index * 3) + 2] - destB) < steps ? destB : fadePalette[(index * 3) + 2] - (steps * deltaB);
+
+		g_system->getPaletteManager()->setPalette(fadePalette, 0, 256);
+		g_system->updateScreen();
+		g_system->delayMillis(20);
+	}
+	
+}
+
 void WaynesWorldEngine::drawImageToSurfaceIntern(GxlArchive *lib, const char *filename, WWSurface *destSurface, int x, int y, bool transparent) {
     Image::PCXDecoder *imageDecoder = lib->loadImage(filename);
 	if (transparent) {
diff --git a/engines/waynesworld/waynesworld.h b/engines/waynesworld/waynesworld.h
index baa6a6edb4e..87994df6e0f 100644
--- a/engines/waynesworld/waynesworld.h
+++ b/engines/waynesworld/waynesworld.h
@@ -300,6 +300,9 @@ public:
 	int _currentMapItemIndex;
 	int _gameMapDestinationRoomNum;
 	bool _gameMapFlag;
+	bool _gameMapHasPaletteHandler = false;
+	int _gameMapCtr = 0;
+	uint32 _gameMapLastTicks = 0;
 
 	void runIntro();
 
@@ -322,6 +325,8 @@ public:
 
 	void paletteFadeIn(int index, int count, int stepsSize);
 	void paletteFadeOut(int index, int count, int stepsSize);
+	void paletteFadeColor(int index, byte r, byte g, byte b, int steps);
+	void handleMapPalette();
 
 	// Image drawing
 	void drawImageToSurfaceIntern(GxlArchive *lib, const char *filename, WWSurface *destSurface, int x, int y, bool transparent);
@@ -473,6 +478,9 @@ public:
 	void gameMapHandleMouseClick();
 	void gameMapSelectItem(const char *prefix, int animX, int animY);
 
+	void gameMapPaletteHandlerStart();
+	void gameMapPaletteHandlerStop();
+
 	// Savegame API
 
 	enum kReadSaveHeaderError {




More information about the Scummvm-git-logs mailing list