[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