[Scummvm-git-logs] scummvm master -> 77c33d1d90a176707f2f2bf228349d4490b60d69

AndywinXp noreply at scummvm.org
Wed Jun 25 08:31:56 UTC 2025


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

Summary:
f424d482b9 LASTEXPRESS: Avoid unnecessary PixelFormat conversions
5f2faa73bd LASTEXPRESS: DEBUGGER: Add Scene hotspot viewer
77c33d1d90 LASTEXPRESS: Tame some tight waiting loops


Commit: f424d482b9ffb3adf17e74f5f4803a75e9c95da2
    https://github.com/scummvm/scummvm/commit/f424d482b9ffb3adf17e74f5f4803a75e9c95da2
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-25T10:26:58+02:00

Commit Message:
LASTEXPRESS: Avoid unnecessary PixelFormat conversions

Changed paths:
    engines/lastexpress/data/gold_archive.cpp
    engines/lastexpress/graphics.cpp


diff --git a/engines/lastexpress/data/gold_archive.cpp b/engines/lastexpress/data/gold_archive.cpp
index 15a1c333276..09535198fdb 100644
--- a/engines/lastexpress/data/gold_archive.cpp
+++ b/engines/lastexpress/data/gold_archive.cpp
@@ -203,7 +203,7 @@ int GoldArchiveManager::loadBG(const char *filename) {
 		_engine->getGraphicsManager()->_renderBox1.width = seqDataStream->readUint32LE();
 		_engine->getGraphicsManager()->_renderBox1.height = seqDataStream->readUint32LE();
 
-		dec->setOutputPixelFormat(Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0));
+		dec->setOutputPixelFormat(Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0));
 		const Graphics::Surface *decodedSurf = dec->decodeFrame(*seqDataStream);
 
 		memcpy(bgSurface, decodedSurf->getPixels(), _engine->getGraphicsManager()->_renderBox1.width * _engine->getGraphicsManager()->_renderBox1.height * sizeof(PixMap));
diff --git a/engines/lastexpress/graphics.cpp b/engines/lastexpress/graphics.cpp
index b5fb56cc677..2f99e1204aa 100644
--- a/engines/lastexpress/graphics.cpp
+++ b/engines/lastexpress/graphics.cpp
@@ -27,7 +27,7 @@ namespace LastExpress {
 GraphicsManager::GraphicsManager(LastExpressEngine *engine) {
 	_engine = engine;
 
-	const Graphics::PixelFormat format(2, 5, 5, 5, 0, 10, 5, 0, 0);
+	const Graphics::PixelFormat format(2, 5, 6, 5, 0, 11, 5, 0, 0);
 	_screenSurface.create(640, 480, format);
 	_mainSurfaceIsInit = true;
 


Commit: 5f2faa73bdc8d71b2f6cddb4feb704416437e330
    https://github.com/scummvm/scummvm/commit/5f2faa73bdc8d71b2f6cddb4feb704416437e330
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-25T10:27:44+02:00

Commit Message:
LASTEXPRESS: DEBUGGER: Add Scene hotspot viewer

Also rename main gfx buffers

Changed paths:
    engines/lastexpress/data/archive.cpp
    engines/lastexpress/data/gold_archive.cpp
    engines/lastexpress/data/sprites.cpp
    engines/lastexpress/debug.cpp
    engines/lastexpress/fight/fight.cpp
    engines/lastexpress/game/action.cpp
    engines/lastexpress/game/credits.cpp
    engines/lastexpress/game/logic.cpp
    engines/lastexpress/game/logic.h
    engines/lastexpress/game/nis.cpp
    engines/lastexpress/graphics.cpp
    engines/lastexpress/graphics.h
    engines/lastexpress/lastexpress.cpp
    engines/lastexpress/memory.cpp
    engines/lastexpress/menu/menu.cpp
    engines/lastexpress/shared.h


diff --git a/engines/lastexpress/data/archive.cpp b/engines/lastexpress/data/archive.cpp
index 6ab6c7715e6..69c484b9b28 100644
--- a/engines/lastexpress/data/archive.cpp
+++ b/engines/lastexpress/data/archive.cpp
@@ -316,7 +316,7 @@ int ArchiveManager::loadBG(const char *filename) {
 	tbm.width = _engine->getGraphicsManager()->_renderBox1.width;
 	tbm.height = _engine->getGraphicsManager()->_renderBox1.height;
 
-	PixMap *bgSurface = _engine->getGraphicsManager()->_backgroundBuffer;
+	PixMap *bgSurface = _engine->getGraphicsManager()->_frontBuffer;
 
 	if (_engine->getLogicManager()->_doubleClickFlag &&
 		(_engine->mouseHasLeftClicked() || _engine->mouseHasRightClicked()) &&
@@ -368,14 +368,14 @@ int ArchiveManager::loadBG(const char *filename) {
 			}
 
 			if (_engine->getGraphicsManager()->_renderBox1.x) {
-				_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_backgroundBuffer, 0, 0, _engine->getGraphicsManager()->_renderBox1.x, 480);
-				_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_backgroundBuffer, 640 - _engine->getGraphicsManager()->_renderBox1.x, 0, _engine->getGraphicsManager()->_renderBox1.x, 480);
+				_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_frontBuffer, 0, 0, _engine->getGraphicsManager()->_renderBox1.x, 480);
+				_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_frontBuffer, 640 - _engine->getGraphicsManager()->_renderBox1.x, 0, _engine->getGraphicsManager()->_renderBox1.x, 480);
 			}
 
 			if (_engine->getGraphicsManager()->_renderBox1.y) {
-				_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_backgroundBuffer, _engine->getGraphicsManager()->_renderBox1.x, 0, _engine->getGraphicsManager()->_renderBox1.width, _engine->getGraphicsManager()->_renderBox1.y);
+				_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_frontBuffer, _engine->getGraphicsManager()->_renderBox1.x, 0, _engine->getGraphicsManager()->_renderBox1.width, _engine->getGraphicsManager()->_renderBox1.y);
 				_engine->getGraphicsManager()->clear(
-					_engine->getGraphicsManager()->_backgroundBuffer,
+					_engine->getGraphicsManager()->_frontBuffer,
 					_engine->getGraphicsManager()->_renderBox1.x,
 					480 - _engine->getGraphicsManager()->_renderBox1.y,
 					_engine->getGraphicsManager()->_renderBox1.width,
@@ -389,7 +389,7 @@ int ArchiveManager::loadBG(const char *filename) {
 				return -1;
 
 			} else {
-				_engine->getGraphicsManager()->copy(_engine->getGraphicsManager()->_backgroundBuffer, _engine->getGraphicsManager()->_screenBuffer, 0, 0, 640, 480);
+				_engine->getGraphicsManager()->copy(_engine->getGraphicsManager()->_frontBuffer, _engine->getGraphicsManager()->_backBuffer, 0, 0, 640, 480);
 
 				if (tbm.x      != _engine->getGraphicsManager()->_renderBox1.x     ||
 					tbm.y      != _engine->getGraphicsManager()->_renderBox1.y     ||
@@ -420,9 +420,9 @@ int ArchiveManager::loadBG(const char *filename) {
 			}
 		}
 	} else {
-		memset(_engine->getGraphicsManager()->_screenBuffer, 0, (640 * 480 * sizeof(PixMap)));
+		memset(_engine->getGraphicsManager()->_backBuffer, 0, (640 * 480 * sizeof(PixMap)));
 
-		_engine->getGraphicsManager()->copy(_engine->getGraphicsManager()->_screenBuffer, _engine->getGraphicsManager()->_backgroundBuffer, 0, 0, 640, 480);
+		_engine->getGraphicsManager()->copy(_engine->getGraphicsManager()->_backBuffer, _engine->getGraphicsManager()->_frontBuffer, 0, 0, 640, 480);
 		_engine->getGraphicsManager()->_renderBox1.x = 0;
 		_engine->getGraphicsManager()->_renderBox1.y = 0;
 		_engine->getGraphicsManager()->_renderBox1.width = 640;
diff --git a/engines/lastexpress/data/gold_archive.cpp b/engines/lastexpress/data/gold_archive.cpp
index 09535198fdb..5c29484dccb 100644
--- a/engines/lastexpress/data/gold_archive.cpp
+++ b/engines/lastexpress/data/gold_archive.cpp
@@ -165,7 +165,7 @@ int GoldArchiveManager::loadBG(const char *filename) {
 	tbm.width = _engine->getGraphicsManager()->_renderBox1.width;
 	tbm.height = _engine->getGraphicsManager()->_renderBox1.height;
 
-	PixMap *bgSurface = _engine->getGraphicsManager()->_backgroundBuffer;
+	PixMap *bgSurface = _engine->getGraphicsManager()->_frontBuffer;
 
 	if (_engine->getLogicManager()->_doubleClickFlag &&
 		(_engine->mouseHasLeftClicked() || _engine->mouseHasRightClicked()) &&
@@ -227,14 +227,14 @@ int GoldArchiveManager::loadBG(const char *filename) {
 			}
 
 			if (_engine->getGraphicsManager()->_renderBox1.x) {
-				_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_backgroundBuffer, 0, 0, _engine->getGraphicsManager()->_renderBox1.x, 480);
-				_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_backgroundBuffer, 640 - _engine->getGraphicsManager()->_renderBox1.x, 0, _engine->getGraphicsManager()->_renderBox1.x, 480);
+				_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_frontBuffer, 0, 0, _engine->getGraphicsManager()->_renderBox1.x, 480);
+				_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_frontBuffer, 640 - _engine->getGraphicsManager()->_renderBox1.x, 0, _engine->getGraphicsManager()->_renderBox1.x, 480);
 			}
 
 			if (_engine->getGraphicsManager()->_renderBox1.y) {
-				_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_backgroundBuffer, _engine->getGraphicsManager()->_renderBox1.x, 0, _engine->getGraphicsManager()->_renderBox1.width, _engine->getGraphicsManager()->_renderBox1.y);
+				_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_frontBuffer, _engine->getGraphicsManager()->_renderBox1.x, 0, _engine->getGraphicsManager()->_renderBox1.width, _engine->getGraphicsManager()->_renderBox1.y);
 				_engine->getGraphicsManager()->clear(
-					_engine->getGraphicsManager()->_backgroundBuffer,
+					_engine->getGraphicsManager()->_frontBuffer,
 					_engine->getGraphicsManager()->_renderBox1.x,
 					480 - _engine->getGraphicsManager()->_renderBox1.y,
 					_engine->getGraphicsManager()->_renderBox1.width,
@@ -248,7 +248,7 @@ int GoldArchiveManager::loadBG(const char *filename) {
 				return -1;
 
 			} else {
-				_engine->getGraphicsManager()->copy(_engine->getGraphicsManager()->_backgroundBuffer, _engine->getGraphicsManager()->_screenBuffer, 0, 0, 640, 480);
+				_engine->getGraphicsManager()->copy(_engine->getGraphicsManager()->_frontBuffer, _engine->getGraphicsManager()->_backBuffer, 0, 0, 640, 480);
 
 				if (tbm.x      != _engine->getGraphicsManager()->_renderBox1.x     ||
 					tbm.y      != _engine->getGraphicsManager()->_renderBox1.y     ||
@@ -279,9 +279,9 @@ int GoldArchiveManager::loadBG(const char *filename) {
 			}
 		}
 	} else {
-		memset(_engine->getGraphicsManager()->_screenBuffer, 0, (640 * 480 * sizeof(PixMap)));
+		memset(_engine->getGraphicsManager()->_backBuffer, 0, (640 * 480 * sizeof(PixMap)));
 
-		_engine->getGraphicsManager()->copy(_engine->getGraphicsManager()->_screenBuffer, _engine->getGraphicsManager()->_backgroundBuffer, 0, 0, 640, 480);
+		_engine->getGraphicsManager()->copy(_engine->getGraphicsManager()->_backBuffer, _engine->getGraphicsManager()->_frontBuffer, 0, 0, 640, 480);
 		_engine->getGraphicsManager()->_renderBox1.x = 0;
 		_engine->getGraphicsManager()->_renderBox1.y = 0;
 		_engine->getGraphicsManager()->_renderBox1.width = 640;
diff --git a/engines/lastexpress/data/sprites.cpp b/engines/lastexpress/data/sprites.cpp
index 3909de96771..79ea14d4015 100644
--- a/engines/lastexpress/data/sprites.cpp
+++ b/engines/lastexpress/data/sprites.cpp
@@ -49,7 +49,7 @@ void SpriteManager::drawCycle() {
 
 				if (_engine->getGraphicsManager()->acquireSurface()) {
 					_engine->getGraphicsManager()->copy(
-						_engine->getGraphicsManager()->_screenBuffer,
+						_engine->getGraphicsManager()->_backBuffer,
 						(PixMap *)_engine->getGraphicsManager()->_screenSurface.getPixels(),
 						_eraseRect.left,
 						_eraseRect.top,
diff --git a/engines/lastexpress/debug.cpp b/engines/lastexpress/debug.cpp
index e73845dd33a..4866b2533a0 100644
--- a/engines/lastexpress/debug.cpp
+++ b/engines/lastexpress/debug.cpp
@@ -53,6 +53,7 @@ typedef struct ImGuiState {
 	float _bottomPanelHeight = 0.0f;
 	float _rightTopPanelHeight = 0.0f;
 	int _ticksToAdvance = 0;
+	ImTextureID _textureID = nullptr;
 } ImGuiState;
 
 ImGuiState *_state = nullptr;
@@ -171,14 +172,21 @@ void onImGuiRender() {
 					ImGui::EndTabItem();
 				}
 
+				if (ImGui::BeginTabItem("Current Scene")) {
+					_state->_currentTab = 3;
+					ImGui::EndTabItem();
+				}
+
 				ImGui::EndTabBar();
 			}
 
-			// Update the character filter...
-			_state->_filter.Draw("Filter Characters", 180);
-			ImGui::SameLine();
-			if (ImGui::Button("Clear")) {
-				_state->_filter.Clear();
+			if (_state->_currentTab >= 0 && _state->_currentTab <= 2) {
+				// Update the character filter...
+				_state->_filter.Draw("Filter Characters", 180);
+				ImGui::SameLine();
+				if (ImGui::Button("Clear")) {
+					_state->_filter.Clear();
+				}
 			}
 
 			// Show corresponding view based on selected tab...
@@ -192,6 +200,11 @@ void onImGuiRender() {
 			case 2: // Pinned Characters
 				_state->_engine->getLogicManager()->renderCharacterGrid(true, _state->_selectedCharacter);
 				break;
+			case 3: // Current Scene
+				_state->_engine->getLogicManager()->renderCurrentSceneDebugger();
+				break;
+			default:
+				break;
 			}
 		}
 		ImGui::EndChild();
@@ -427,6 +440,251 @@ void LogicManager::renderCharacterList(int &selectedCharacter) {
 	ImGui::EndChild();
 }
 
+void LogicManager::renderCurrentSceneDebugger() {
+	if (_state->_textureID)
+		g_system->freeImGuiTexture(_state->_textureID);
+
+	// Let's blit the current background on the ImGui window...
+	Graphics::Surface temp;
+	temp.create(640, 480, Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0));
+	_engine->getGraphicsManager()->copy(_engine->getGraphicsManager()->_backBuffer, (PixMap *)temp.getPixels(), 0, 0, 640, 480);
+
+	_state->_textureID = g_system->getImGuiTexture(temp);
+
+	ImVec2 imagePos = ImGui::GetCursorScreenPos();
+	ImVec2 imageSize(640, 480);
+
+	ImGui::Image(_state->_textureID, imageSize);
+
+	// Set hovering flag...
+	ImVec2 mousePos = ImGui::GetMousePos();
+	ImVec2 relativeMousePos(mousePos.x - imagePos.x, mousePos.y - imagePos.y);
+
+	bool mouseOverImage = (relativeMousePos.x >= 0 && relativeMousePos.x < 640 &&
+						   relativeMousePos.y >= 0 && relativeMousePos.y < 480);
+
+	ImDrawList *drawList = ImGui::GetWindowDrawList();
+
+	Link *hoveredLink = nullptr;
+	int hoveredLinkIndex = -1;
+
+	// Draw all the Link hotspots and collision lines...
+	Node *currentNode = &_trainData[_activeNode];
+	if (currentNode && currentNode->link) {
+		Link *currentLink = currentNode->link;
+		int linkIndex = 0;
+
+		while (currentLink) {
+			// Calculate screen coordinates for this link's bounding box...
+			ImVec2 topLeft(imagePos.x + currentLink->left, imagePos.y + currentLink->top);
+			ImVec2 bottomRight(imagePos.x + currentLink->right, imagePos.y + currentLink->bottom);
+
+			// Check if mouse is hovering over this link...
+			bool isHovered = mouseOverImage &&
+							 relativeMousePos.x >= currentLink->left && relativeMousePos.x <= currentLink->right &&
+							 relativeMousePos.y >= currentLink->top && relativeMousePos.y <= currentLink->bottom;
+
+			// Store the hovered link with highest priority,
+			// if they have the same priority, the last one in list wins...
+			if (isHovered) {
+				if (hoveredLink == nullptr ||
+					currentLink->location > hoveredLink->location ||
+					currentLink->location == hoveredLink->location) {
+					hoveredLink = currentLink;
+					hoveredLinkIndex = linkIndex;
+				}
+			}
+
+			ImU32 rectColor = IM_COL32(255, 0, 0, 100);   // Semi-transparent red
+			ImU32 borderColor = IM_COL32(255, 0, 0, 255); // Solid red border
+
+			// Different colors for different cursor types
+			//switch (currentLink->cursor) {
+			//case 0:
+			//	borderColor = IM_COL32(255, 0, 0, 255);
+			//	break; // Red
+			//case 1:
+			//	borderColor = IM_COL32(0, 255, 0, 255);
+			//	break; // Green
+			//case 2:
+			//	borderColor = IM_COL32(0, 0, 255, 255);
+			//	break; // Blue
+			//case 3:
+			//	borderColor = IM_COL32(255, 255, 0, 255);
+			//	break; // Yellow
+			//default:
+			//	borderColor = IM_COL32(255, 0, 255, 255);
+			//	break; // Magenta
+			//}
+
+			// Highlight hovered link...
+			if (isHovered) {
+				rectColor = IM_COL32(255, 255, 255, 150);
+			}
+
+			drawList->AddRectFilled(topLeft, bottomRight, rectColor);
+			drawList->AddRect(topLeft, bottomRight, borderColor, 0.0f, 0, 2.0f);
+
+			// Draw collision lines...
+			Line7 *currentLine = currentLink->lineList;
+			int lineIndex = 0;
+			while (currentLine) {
+				ImU32 lineColor = IM_COL32(0, 255, 255, 255);
+
+				switch (currentLine->lineType) {
+				case 0:
+					lineColor = IM_COL32(0, 255, 255, 255); // Cyan
+					break;
+				case 1:
+				default:
+					lineColor = IM_COL32(255, 128, 0, 255); // Orange
+					break;
+				}
+
+				if (currentLine->slope == 0) {
+					// Horizontal line: y = -intercept / 1000
+					float y = -(float)currentLine->intercept / 1000.0f;
+					if (y >= currentLink->top && y <= currentLink->bottom) {
+						ImVec2 lineStart(imagePos.x + currentLink->left, imagePos.y + y);
+						ImVec2 lineEnd(imagePos.x + currentLink->right, imagePos.y + y);
+						drawList->AddLine(lineStart, lineEnd, lineColor, 2.0f);
+					}
+				} else {
+					// Non-horizontal line
+					float slope = (float)currentLine->slope;
+					float intercept = (float)currentLine->intercept;
+
+					// Calculate line endpoints across the entire screen bounds...
+					Common::Array<ImVec2> intersectionPoints;
+
+					// Left edge (x = currentLink->left)
+					float yLeft = -(slope * currentLink->left + intercept) / 1000.0f;
+					if (yLeft >= currentLink->top && yLeft <= currentLink->bottom) {
+						intersectionPoints.push_back(ImVec2(imagePos.x + currentLink->left, imagePos.y + yLeft));
+					}
+
+					// Right edge (x = currentLink->right)
+					float yRight = -(slope * currentLink->right + intercept) / 1000.0f;
+					if (yRight >= currentLink->top && yRight <= currentLink->bottom) {
+						intersectionPoints.push_back(ImVec2(imagePos.x + currentLink->right, imagePos.y + yRight));
+					}
+
+					// Top edge (y = currentLink->top)
+					float xTop = -(1000.0f * currentLink->top + intercept) / slope;
+					if (xTop >= currentLink->left && xTop <= currentLink->right) {
+						intersectionPoints.push_back(ImVec2(imagePos.x + xTop, imagePos.y + currentLink->top));
+					}
+
+					// Bottom edge (y = currentLink->bottom)
+					float xBottom = -(1000.0f * currentLink->bottom + intercept) / slope;
+					if (xBottom >= currentLink->left && xBottom <= currentLink->right) {
+						intersectionPoints.push_back(ImVec2(imagePos.x + xBottom, imagePos.y + currentLink->bottom));
+					}
+
+					// Draw line if we have at least 2 intersection points...
+					if (intersectionPoints.size() >= 2) {
+						drawList->AddLine(intersectionPoints[0], intersectionPoints[1], lineColor, 2.0f);
+					}
+				}
+
+				currentLine = currentLine->next;
+				lineIndex++;
+			}
+
+			currentLink = currentLink->next;
+			linkIndex++;
+		}
+	}
+
+	// Show tooltip for hovered link...
+	if (hoveredLink && mouseOverImage) {
+		ImGui::BeginTooltip();
+		ImGui::Text("Link %d", hoveredLinkIndex);
+		ImGui::Text("Bounds: (%d,%d) - (%d,%d)", hoveredLink->left, hoveredLink->top, hoveredLink->right, hoveredLink->bottom);
+
+		if (hoveredLink->scene) {
+			ImGui::Text("Leads to scene: %s (%d)", _trainData[hoveredLink->scene].sceneFilename, hoveredLink->scene);
+		} else {
+			ImGui::Text("Leads to scene: None (0)");
+		}
+
+		ImGui::Text("Location: %d", hoveredLink->location);
+
+		const char *actionName;
+		if (_engine->getMenu()->isShowingMenu()) {
+			const char *menuActionNames[] = {
+				"None", "PlayGame", "Credits", "Quit", "Action4",
+				"Action5", "SwitchEggs", "Rewind", "FastForward", "Action9",
+				"GoToParis", "GoToStrasbourg", "GoToMunich", "GoToVienna", "GoToBudapest",
+				"GoToBelgrad", "GoToCostantinople", "VolumeDown", "VolumeUp", "BrightnessDown",
+				"BrightnessUp"
+			};
+
+			actionName = (hoveredLink->action < 21) ? menuActionNames[hoveredLink->action] : "Unknown";
+		} else {
+			const char *gameActionNames[] = {
+				"None", "Inventory", "SendCathMessage", "PlaySound", "PlayMusic",
+				"Knock", "Compartment", "PlaySounds", "PlayAnimation", "SetDoor",
+				"SetModel", "SetItem", "KnockInside", "TakeItem", "DropItem",
+				"LinkOnGlobal", "Rattle", "DummyAction2", "LeanOutWindow", "AlmostFall",
+				"ClimbInWindow", "ClimbLadder", "ClimbDownTrain", "KronosSanctum", "EscapeBaggage",
+				"EnterBaggage", "BombPuzzle", "Conductors", "KronosConcert", "PlayMusic2",
+				"CatchBeetle", "ExitCompartment", "OutsideTrain", "FirebirdPuzzle", "OpenMatchBox",
+				"OpenBed", "DummyAction3", "HintDialog", "MusicEggBox", "PlayMusic3",
+				"Bed", "PlayMusicChapter", "PlayMusicChapterSetupTrain", "SwitchChapter", "EasterEgg"
+			};
+
+			actionName = (hoveredLink->action < 45) ? gameActionNames[hoveredLink->action] : "Unknown";
+		}
+
+		ImGui::Text("Action: %d (%s)", hoveredLink->action, actionName);
+
+		const char *cursorNames[] = {
+			"Normal", "Forward", "Backward", "TurnRight", "TurnLeft",
+			"Up", "Down", "Left", "Right", "Hand",
+			"HandKnock", "Magnifier", "HandPointer", "Sleep", "Talk",
+			"Talk2", "MatchBox", "Telegram", "PassengerList", "Article",
+			"Scarf", "Paper", "Parchemin", "Match", "Whistle",
+			"Key", "Bomb", "Firebird", "Briefcase", "Corpse",
+			"PunchLeft", "PunchRight", "Portrait", "PortraitSelected", "PortraitGreen",
+			"PortraitGreenSelected", "PortraitYellow", "PortraitYellowSelected", "HourGlass", "EggBlue",
+			"EggRed", "EggGreen", "EggPurple", "EggTeal", "EggGold",
+			"EggClock", "Normal2", "Blank"
+		};
+
+		const char *cursorName;
+		if (hoveredLink->cursor == 128) {
+			cursorName = "Process";
+		} else if (hoveredLink->cursor == 255) {
+			cursorName = "KeepValue";
+		} else if (hoveredLink->cursor < 48) {
+			cursorName = cursorNames[hoveredLink->cursor];
+		} else {
+			cursorName = "Unknown";
+		}
+
+		ImGui::Text("Cursor: %d (%s)", hoveredLink->cursor, cursorName);
+		ImGui::Text("Params: %d, %d, %d", hoveredLink->param1, hoveredLink->param2, hoveredLink->param3);
+
+		// Show line information...
+		if (hoveredLink->lineList) {
+			ImGui::Separator();
+			Line7 *line = hoveredLink->lineList;
+			int lineNum = 0;
+
+			while (line) {
+				ImGui::Text("Line %d: slope=%d, intercept=%d, type=%d",
+							lineNum, line->slope, line->intercept, line->lineType);
+
+				line = line->next;
+				lineNum++;
+			}
+		}
+
+		ImGui::EndTooltip();
+	}
+}
+
 Common::StringArray LogicManager::getCharacterFunctionNames(int character) {
 	return _engine->isDemo() ? _demoFuncNames[character] : _funcNames[character];
 }
diff --git a/engines/lastexpress/fight/fight.cpp b/engines/lastexpress/fight/fight.cpp
index 08024394dd6..02f1cf468eb 100644
--- a/engines/lastexpress/fight/fight.cpp
+++ b/engines/lastexpress/fight/fight.cpp
@@ -89,7 +89,7 @@ int LastExpressEngine::doFight(int fightId) {
 	getSoundManager()->_scanAnySoundLoopingSection = true;
 
 	if (getGraphicsManager()->acquireSurface()) {
-		getGraphicsManager()->copy(getGraphicsManager()->_backgroundBuffer, (PixMap *)getGraphicsManager()->_screenSurface.getPixels(), tbm->x, tbm->y, tbm->width, tbm->height);
+		getGraphicsManager()->copy(getGraphicsManager()->_frontBuffer, (PixMap *)getGraphicsManager()->_screenSurface.getPixels(), tbm->x, tbm->y, tbm->width, tbm->height);
 		getGraphicsManager()->unlockSurface();
 	}
 
diff --git a/engines/lastexpress/game/action.cpp b/engines/lastexpress/game/action.cpp
index 6e417ee6530..aa235200191 100644
--- a/engines/lastexpress/game/action.cpp
+++ b/engines/lastexpress/game/action.cpp
@@ -1722,7 +1722,7 @@ void LogicManager::doAction(Link *link) {
 		}
 
 		break;
-	case kActionEasterEggs:
+	case kActionEasterEgg:
 		if (_engine->isDemo())
 			break;
 
diff --git a/engines/lastexpress/game/credits.cpp b/engines/lastexpress/game/credits.cpp
index a184db697fa..026563379b4 100644
--- a/engines/lastexpress/game/credits.cpp
+++ b/engines/lastexpress/game/credits.cpp
@@ -127,7 +127,7 @@ void LastExpressEngine::doCredits() {
 
 							// Draw the map to the screen
 							if (getGraphicsManager()->acquireSurface()) {
-								PixMap *screenPtr = getGraphicsManager()->_screenBuffer + 20496;
+								PixMap *screenPtr = getGraphicsManager()->_backBuffer + 20496;
 								byte *surfacePtr = (byte *)getGraphicsManager()->_screenSurface.getPixels() + 40992;
 
 								for (int row = 0; row < currentMap->height; row++) {
@@ -194,7 +194,7 @@ void LastExpressEngine::doCredits() {
 						if (getGraphicsManager()->acquireSurface()) {
 							PixMap *surfacePtr = (PixMap *)((byte *)getGraphicsManager()->_screenSurface.getPixels() + 79920);
 							int rowCounter = 355;
-							PixMap *screenPtr = getGraphicsManager()->_screenBuffer + 39960;
+							PixMap *screenPtr = getGraphicsManager()->_backBuffer + 39960;
 
 							while (rowCounter > 0) {
 								memcpy(surfacePtr, screenPtr, 640);
diff --git a/engines/lastexpress/game/logic.cpp b/engines/lastexpress/game/logic.cpp
index 7a2b0745bec..e319178593a 100644
--- a/engines/lastexpress/game/logic.cpp
+++ b/engines/lastexpress/game/logic.cpp
@@ -184,7 +184,7 @@ void LogicManager::killGracePeriod() {
 
 void LogicManager::fadeToBlack() {
 	_engine->getGraphicsManager()->setMouseDrawable(false);
-	_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_backgroundBuffer, 0, 0, 640, 480);
+	_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_frontBuffer, 0, 0, 640, 480);
 	_engine->getGraphicsManager()->_renderBox1.x = 0;
 	_engine->getGraphicsManager()->_renderBox1.y = 0;
 	_engine->getGraphicsManager()->_renderBox1.width = 640;
@@ -201,7 +201,7 @@ void LogicManager::fadeToWhite() {
 	white = 0x7FFF;
 	_engine->getGraphicsManager()->modifyPalette(&white, 1);
 
-	backgroundBuffer = _engine->getGraphicsManager()->_backgroundBuffer;
+	backgroundBuffer = _engine->getGraphicsManager()->_frontBuffer;
 
 	for (int i = 480; i > 0; i--) {
 		for (int j = 640; j > 0; j--) {
diff --git a/engines/lastexpress/game/logic.h b/engines/lastexpress/game/logic.h
index 7c81ee9f388..dd17aad2763 100644
--- a/engines/lastexpress/game/logic.h
+++ b/engines/lastexpress/game/logic.h
@@ -214,6 +214,7 @@ public:
 	void renderCharacterDetails(Character *character, int index);
 	void renderCharacterGrid(bool onlyPinned, int &selectedCharacter);
 	void renderCharacterList(int &selectedCharacter);
+	void renderCurrentSceneDebugger();
 
 	Common::StringArray getCharacterFunctionNames(int character);
 
diff --git a/engines/lastexpress/game/nis.cpp b/engines/lastexpress/game/nis.cpp
index 4cf9e7495cb..f518feb43d5 100644
--- a/engines/lastexpress/game/nis.cpp
+++ b/engines/lastexpress/game/nis.cpp
@@ -214,10 +214,10 @@ bool NISManager::initNIS(const char *filename, int32 flags) {
 	_streamCurrentPosition = 0;
 	_remainingStreamBytes = 0;
 	_streamBufferSize = 1530 * PAGE_SIZE;
-	_originalBackgroundSurface = _engine->getGraphicsManager()->_backgroundBuffer;
+	_originalBackgroundSurface = _engine->getGraphicsManager()->_frontBuffer;
 	_totalBackgroundPages = 1530;
 	_totalStreamPages = 1530;
-	_backgroundSurface = _engine->getGraphicsManager()->_backgroundBuffer;
+	_backgroundSurface = _engine->getGraphicsManager()->_frontBuffer;
 
 	_archive = _engine->getArchiveManager()->openHPF(filename);
 	if (!_archive) {
@@ -366,7 +366,7 @@ void NISManager::drawSprite(NisSprite *sprite) {
 	switch (sprite->compBits) {
 	case 3:
 		if (_decompressToBackBuffer) {
-			_engine->getGraphicsManager()->bitBltSprite8(&tempSprite, _engine->getGraphicsManager()->_screenBuffer);
+			_engine->getGraphicsManager()->bitBltSprite8(&tempSprite, _engine->getGraphicsManager()->_backBuffer);
 		} else if (_engine->getGraphicsManager()->acquireSurface()) {
 			_engine->getGraphicsManager()->bitBltSprite8(&tempSprite, (PixMap *)_engine->getGraphicsManager()->_screenSurface.getPixels());
 			_engine->getGraphicsManager()->unlockSurface();
@@ -375,7 +375,7 @@ void NISManager::drawSprite(NisSprite *sprite) {
 		break;
 	case 4:
 		if (_decompressToBackBuffer) {
-			_engine->getGraphicsManager()->bitBltSprite16(&tempSprite, _engine->getGraphicsManager()->_screenBuffer);
+			_engine->getGraphicsManager()->bitBltSprite16(&tempSprite, _engine->getGraphicsManager()->_backBuffer);
 		} else if (_engine->getGraphicsManager()->acquireSurface()) {
 			_engine->getGraphicsManager()->bitBltSprite16(&tempSprite, (PixMap *)_engine->getGraphicsManager()->_screenSurface.getPixels());
 			_engine->getGraphicsManager()->unlockSurface();
@@ -384,7 +384,7 @@ void NISManager::drawSprite(NisSprite *sprite) {
 		break;
 	case 5:
 		if (_decompressToBackBuffer) {
-			_engine->getGraphicsManager()->bitBltSprite32(&tempSprite, _engine->getGraphicsManager()->_screenBuffer);
+			_engine->getGraphicsManager()->bitBltSprite32(&tempSprite, _engine->getGraphicsManager()->_backBuffer);
 		} else if (_engine->getGraphicsManager()->acquireSurface()) {
 			_engine->getGraphicsManager()->bitBltSprite32(&tempSprite, (PixMap *)_engine->getGraphicsManager()->_screenSurface.getPixels());
 			_engine->getGraphicsManager()->unlockSurface();
@@ -393,7 +393,7 @@ void NISManager::drawSprite(NisSprite *sprite) {
 		break;
 	case 7:
 		if (_decompressToBackBuffer) {
-			_engine->getGraphicsManager()->bitBltSprite128(&tempSprite, _engine->getGraphicsManager()->_screenBuffer);
+			_engine->getGraphicsManager()->bitBltSprite128(&tempSprite, _engine->getGraphicsManager()->_backBuffer);
 		} else if (_engine->getGraphicsManager()->acquireSurface()) {
 			_engine->getGraphicsManager()->bitBltSprite128(&tempSprite, (PixMap *)_engine->getGraphicsManager()->_screenSurface.getPixels());
 			_engine->getGraphicsManager()->unlockSurface();
@@ -402,7 +402,7 @@ void NISManager::drawSprite(NisSprite *sprite) {
 		break;
 	case 255:
 		if (_decompressToBackBuffer) {
-			_engine->getGraphicsManager()->bitBltSprite255(&tempSprite, _engine->getGraphicsManager()->_screenBuffer);
+			_engine->getGraphicsManager()->bitBltSprite255(&tempSprite, _engine->getGraphicsManager()->_backBuffer);
 		} else if (_engine->getGraphicsManager()->acquireSurface()) {
 			_engine->getGraphicsManager()->bitBltSprite255(&tempSprite, (PixMap *)_engine->getGraphicsManager()->_screenSurface.getPixels());
 			_engine->getGraphicsManager()->unlockSurface();
@@ -750,14 +750,14 @@ void NISManager::processNIS(NisEvents *event) {
 		_backgroundFlag = 0;
 
 		if (_decompressToBackBuffer)
-			_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_screenBuffer, 0, 0, 640, 480);
+			_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_backBuffer, 0, 0, 640, 480);
 
 		if (_selectBackgroundType != _backgroundType) {
 			drawBK(_selectBackgroundType);
 		} else if (_engine->getGraphicsManager()->acquireSurface()) {
 			if (_backgroundType == 1) {
 				_engine->getGraphicsManager()->copy(
-					_engine->getGraphicsManager()->_screenBuffer,
+					_engine->getGraphicsManager()->_backBuffer,
 					(PixMap *)_engine->getGraphicsManager()->_screenSurface.getPixels(),
 					_background1->rect.left,
 					_background1->rect.top,
@@ -766,7 +766,7 @@ void NISManager::processNIS(NisEvents *event) {
 				);
 			} else if (_backgroundType == 2) {
 				_engine->getGraphicsManager()->copy(
-					_engine->getGraphicsManager()->_screenBuffer,
+					_engine->getGraphicsManager()->_backBuffer,
 					(PixMap *)_engine->getGraphicsManager()->_screenSurface.getPixels(),
 					_background2->rect.left,
 					_background2->rect.top,
@@ -821,14 +821,14 @@ void NISManager::processNIS(NisEvents *event) {
 		if (_decompressToBackBuffer) {
 			for (int i = 0; i < 3; i++) {
 				_engine->getSoundManager()->soundThread();
-				_engine->getGraphicsManager()->dissolve((2 * x) + (2 * (i & 1)), width, 480, _engine->getGraphicsManager()->_screenBuffer);
+				_engine->getGraphicsManager()->dissolve((2 * x) + (2 * (i & 1)), width, 480, _engine->getGraphicsManager()->_backBuffer);
 				_engine->getGraphicsManager()->burstBox(x, 0, width, 480);
 				_engine->getSoundManager()->soundThread();
 				_engine->handleEvents();
 			}
 
 			if (_engine->getGraphicsManager()->acquireSurface()) {
-				_engine->getGraphicsManager()->copy(_engine->getGraphicsManager()->_screenBuffer, (PixMap *)_engine->getGraphicsManager()->_screenSurface.getPixels(), x, 0, width, 480);
+				_engine->getGraphicsManager()->copy(_engine->getGraphicsManager()->_backBuffer, (PixMap *)_engine->getGraphicsManager()->_screenSurface.getPixels(), x, 0, width, 480);
 				_engine->getGraphicsManager()->unlockSurface();
 			}
 
@@ -858,7 +858,7 @@ void NISManager::processNIS(NisEvents *event) {
 			if (_engine->getGraphicsManager()->acquireSurface()) {
 				if (_backgroundType == 1) {
 					_engine->getGraphicsManager()->copy(
-						_engine->getGraphicsManager()->_screenBuffer,
+						_engine->getGraphicsManager()->_backBuffer,
 						(PixMap *)_engine->getGraphicsManager()->_screenSurface.getPixels(),
 						_background1->rect.left,
 						_background1->rect.top,
@@ -867,7 +867,7 @@ void NISManager::processNIS(NisEvents *event) {
 					);
 				} else if (_backgroundType == 2) {
 					_engine->getGraphicsManager()->copy(
-						_engine->getGraphicsManager()->_screenBuffer,
+						_engine->getGraphicsManager()->_backBuffer,
 						(PixMap *)_engine->getGraphicsManager()->_screenSurface.getPixels(),
 						_background2->rect.left,
 						_background2->rect.top,
@@ -942,7 +942,7 @@ void NISManager::drawBK(int type) {
 	_firstNISBackgroundDraw = true;
 
 	if (!_decompressToBackBuffer && _engine->getGraphicsManager()->acquireSurface()) {
-		_engine->getGraphicsManager()->copy((PixMap *)_engine->getGraphicsManager()->_screenSurface.getPixels(), _engine->getGraphicsManager()->_screenBuffer, 0, 0, 640, 480);
+		_engine->getGraphicsManager()->copy((PixMap *)_engine->getGraphicsManager()->_screenSurface.getPixels(), _engine->getGraphicsManager()->_backBuffer, 0, 0, 640, 480);
 		_engine->getGraphicsManager()->unlockSurface();
 	}
 
diff --git a/engines/lastexpress/graphics.cpp b/engines/lastexpress/graphics.cpp
index 2f99e1204aa..6e4ca945d38 100644
--- a/engines/lastexpress/graphics.cpp
+++ b/engines/lastexpress/graphics.cpp
@@ -146,7 +146,7 @@ void GraphicsManager::goStepBG(int sceneIndex) {
 		_engine->getOtisManager()->updateAll();
 	}
 
-	_engine->getSpriteManager()->drawCycleSimple(_backgroundBuffer);
+	_engine->getSpriteManager()->drawCycleSimple(_frontBuffer);
 	stepDissolve(chosenTbm);
 	_engine->getLogicManager()->doPostFunction();
 }
@@ -158,7 +158,7 @@ void GraphicsManager::stepDissolve(TBM *tbm) {
 		int32 curFrameCount = _engine->getSoundFrameCounter();
 		_engine->getSoundManager()->soundThread();
 
-		dissolve(pos + sizeof(PixMap) * (i & 1), tbm->width, tbm->height, _backgroundBuffer);
+		dissolve(pos + sizeof(PixMap) * (i & 1), tbm->width, tbm->height, _frontBuffer);
 
 		burstBox(tbm->x, tbm->y, tbm->width, tbm->height);
 		int32 frameTimeDiff = _engine->getSoundFrameCounter() - curFrameCount;
@@ -183,7 +183,7 @@ void GraphicsManager::stepDissolve(TBM *tbm) {
 	}
 
 	if (acquireSurface()) {
-		copy(_backgroundBuffer, (PixMap *)_screenSurface.getPixels(), tbm->x, tbm->y, tbm->width, tbm->height);
+		copy(_frontBuffer, (PixMap *)_screenSurface.getPixels(), tbm->x, tbm->y, tbm->width, tbm->height);
 		unlockSurface();
 	}
 
@@ -1703,7 +1703,7 @@ void GraphicsManager::dissolve(int32 location, int32 width, int32 height, PixMap
 void GraphicsManager::doErase(byte *data) {
 	byte *screenSurface = (byte *)_screenSurface.getPixels();
 	byte *endOfSurface = screenSurface + (640 * 480 * sizeof(PixMap));
-	byte *previousScreenBuffer = (byte *)_screenBuffer;
+	byte *previousScreenBuffer = (byte *)_backBuffer;
 
 	uint16 *eraseMask = (uint16 *)data;
 
diff --git a/engines/lastexpress/graphics.h b/engines/lastexpress/graphics.h
index f9e76578072..762889dc50d 100644
--- a/engines/lastexpress/graphics.h
+++ b/engines/lastexpress/graphics.h
@@ -130,8 +130,8 @@ public:
 
 protected:
 	LastExpressEngine *_engine = nullptr;
-	PixMap *_backgroundBuffer = nullptr;
-	PixMap *_screenBuffer = nullptr;
+	PixMap *_frontBuffer = nullptr;
+	PixMap *_backBuffer = nullptr;
 	PixMap _mouseBackBuffer[32 * 32];
 
 	byte *_backgroundCompBuffer = nullptr;
diff --git a/engines/lastexpress/lastexpress.cpp b/engines/lastexpress/lastexpress.cpp
index 5ff5f58c77d..237253c52ed 100644
--- a/engines/lastexpress/lastexpress.cpp
+++ b/engines/lastexpress/lastexpress.cpp
@@ -91,8 +91,8 @@ void LastExpressEngine::startUp() {
 	getMemoryManager()->initMem();
 
 	getGraphicsManager()->clear(getGraphicsManager()->_screenSurface, 0, 0, 640, 480);
-	getGraphicsManager()->clear(getGraphicsManager()->_screenBuffer, 0, 0, 640, 480);
-	getGraphicsManager()->clear(getGraphicsManager()->_backgroundBuffer, 0, 0, 640, 480);
+	getGraphicsManager()->clear(getGraphicsManager()->_backBuffer, 0, 0, 640, 480);
+	getGraphicsManager()->clear(getGraphicsManager()->_frontBuffer, 0, 0, 640, 480);
 
 	getVCR()->shuffleGames();
 	getArchiveManager()->loadMice();
diff --git a/engines/lastexpress/memory.cpp b/engines/lastexpress/memory.cpp
index 968d6c0988c..fa760ac1906 100644
--- a/engines/lastexpress/memory.cpp
+++ b/engines/lastexpress/memory.cpp
@@ -55,7 +55,7 @@ void MemoryManager::initMem() {
 	_engine->_globalMemoryPool = (byte *)malloc(1800 * PAGE_SIZE);
 	memset(_engine->_globalMemoryPool, 0, 1800 * PAGE_SIZE);
 
-	_engine->getGraphicsManager()->_screenBuffer = (PixMap *)malloc(640 * 480 * sizeof(PixMap));
+	_engine->getGraphicsManager()->_backBuffer = (PixMap *)malloc(640 * 480 * sizeof(PixMap));
 	_engine->getLogicManager()->_trainData = (Node *)malloc(2048 * sizeof(Node));
 	_engine->_cursorsMemoryPool = (byte *)malloc(49 * PAGE_SIZE);
 	_engine->_characters = new Characters();
@@ -91,7 +91,7 @@ void MemoryManager::initMem() {
 	_engine->getGraphicsManager()->_cursorsDataHeader = (CursorHeader *)_engine->_cursorsMemoryPool;
 	_engine->getGraphicsManager()->_iconsBitmapData = (PixMap *)(_engine->_cursorsMemoryPool + sizeof(CursorHeader) * kCursorMAX);
 	_engine->_soundMemoryPool = _engine->_globalMemoryPool;
-	_engine->getGraphicsManager()->_backgroundBuffer = (PixMap *)(_engine->_globalMemoryPool + (270 * PAGE_SIZE));
+	_engine->getGraphicsManager()->_frontBuffer = (PixMap *)(_engine->_globalMemoryPool + (270 * PAGE_SIZE));
 
 	_memoryPages[0].memPageSize = 1230 * PAGE_SIZE;
 	_memoryPages[0].memPagePtr = _engine->_globalMemoryPool + (570 * PAGE_SIZE);
@@ -154,7 +154,7 @@ void MemoryManager::freeMem(void *data) {
 
 void MemoryManager::releaseMemory() {
 	SAFE_FREE(_engine->_globalMemoryPool);
-	SAFE_FREE(_engine->getGraphicsManager()->_screenBuffer);
+	SAFE_FREE(_engine->getGraphicsManager()->_backBuffer);
 	SAFE_FREE(_engine->getLogicManager()->_trainData);
 	SAFE_FREE(_engine->_cursorsMemoryPool);
 	SAFE_DELETE(_engine->_characters);
diff --git a/engines/lastexpress/menu/menu.cpp b/engines/lastexpress/menu/menu.cpp
index bc132dd2737..9ef897fedf5 100644
--- a/engines/lastexpress/menu/menu.cpp
+++ b/engines/lastexpress/menu/menu.cpp
@@ -992,10 +992,10 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 		setSprite(0, 11, false);
 		setSprite(2, 5, false);
 
-		_engine->getSpriteManager()->drawCycleSimple(_engine->getGraphicsManager()->_backgroundBuffer);
+		_engine->getSpriteManager()->drawCycleSimple(_engine->getGraphicsManager()->_frontBuffer);
 
 		if (_engine->getGraphicsManager()->acquireSurface()) {
-			_engine->getGraphicsManager()->copy(_engine->getGraphicsManager()->_backgroundBuffer, (PixMap *)_engine->getGraphicsManager()->_screenSurface.getPixels(), 0, 0, 640, 480);
+			_engine->getGraphicsManager()->copy(_engine->getGraphicsManager()->_frontBuffer, (PixMap *)_engine->getGraphicsManager()->_screenSurface.getPixels(), 0, 0, 640, 480);
 			_engine->getGraphicsManager()->unlockSurface();
 		}
 
@@ -1039,9 +1039,9 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 					setSprite(0, 10, false);
 					setSprite(2, 9, false);
 
-					_engine->getSpriteManager()->drawCycleSimple(_engine->getGraphicsManager()->_backgroundBuffer);
+					_engine->getSpriteManager()->drawCycleSimple(_engine->getGraphicsManager()->_frontBuffer);
 					if (_engine->getGraphicsManager()->acquireSurface()) {
-						_engine->getGraphicsManager()->copy(_engine->getGraphicsManager()->_backgroundBuffer, (PixMap *)_engine->getGraphicsManager()->_screenSurface.getPixels(), 0, 0, 640, 480);
+						_engine->getGraphicsManager()->copy(_engine->getGraphicsManager()->_frontBuffer, (PixMap *)_engine->getGraphicsManager()->_screenSurface.getPixels(), 0, 0, 640, 480);
 						_engine->getGraphicsManager()->unlockSurface();
 					}
 
@@ -1088,7 +1088,7 @@ void Menu::setCity(int cityIndex) {
 
 void Menu::switchEggs(int whichEgg) {
 	_engine->getSpriteManager()->destroySprite(&_startMenuFrames[3], false);
-	_engine->getSpriteManager()->drawCycleSimple(_engine->getGraphicsManager()->_backgroundBuffer);
+	_engine->getSpriteManager()->drawCycleSimple(_engine->getGraphicsManager()->_frontBuffer);
 
 	if (_menuSeqs[3]) {
 		_engine->getMemoryManager()->freeMem(_menuSeqs[3]->rawSeqData);
diff --git a/engines/lastexpress/shared.h b/engines/lastexpress/shared.h
index 06d924da5b4..6514e1bb80b 100644
--- a/engines/lastexpress/shared.h
+++ b/engines/lastexpress/shared.h
@@ -1945,7 +1945,7 @@ enum Actions {
 	kActionPlayMusicChapter,
 	kActionPlayMusicChapterSetupTrain,
 	kActionSwitchChapter,
-	kActionEasterEggs
+	kActionEasterEgg
 };
 
 //////////////////////////////////////////////////////////////////////////


Commit: 77c33d1d90a176707f2f2bf228349d4490b60d69
    https://github.com/scummvm/scummvm/commit/77c33d1d90a176707f2f2bf228349d4490b60d69
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-25T10:31:46+02:00

Commit Message:
LASTEXPRESS: Tame some tight waiting loops

Otherwise the OS never gets time to do other stuff
while the engine waits for a sound...

Changed paths:
    engines/lastexpress/characters/kronos.cpp
    engines/lastexpress/characters/master.cpp
    engines/lastexpress/menu/menu.cpp


diff --git a/engines/lastexpress/characters/kronos.cpp b/engines/lastexpress/characters/kronos.cpp
index db229992b47..42019b71445 100644
--- a/engines/lastexpress/characters/kronos.cpp
+++ b/engines/lastexpress/characters/kronos.cpp
@@ -845,8 +845,10 @@ void LogicManager::HAND_Kronos_Concert(HAND_PARAMS) {
 				playNIS(kEventCathFallingAsleep);
 				fadeToBlack();
 
-				while (dialogRunning("1919.LNK"))
+				while (dialogRunning("1919.LNK")) {
 					_engine->getSoundManager()->soundThread();
+					g_system->delayMillis(4);
+				}
 
 				playNIS(kEventCathWakingUp);
 				cleanNIS();
diff --git a/engines/lastexpress/characters/master.cpp b/engines/lastexpress/characters/master.cpp
index d16de500b78..75671f576b5 100644
--- a/engines/lastexpress/characters/master.cpp
+++ b/engines/lastexpress/characters/master.cpp
@@ -403,8 +403,10 @@ void LogicManager::HAND_Master_FirstDream(HAND_PARAMS) {
 		_activeItem = 0;
 		fadeToBlack();
 
-		while (dialogRunning("MUS008"))
+		while (dialogRunning("MUS008")) {
 			_engine->getSoundManager()->soundThread();
+			g_system->delayMillis(4);
+		}
 
 		_globals[kProgressField84] = 1;
 		bumpCath(kCarLocomotive, 75, 255);
@@ -1229,6 +1231,7 @@ void LogicManager::HAND_Master_SecondSleep(HAND_PARAMS) {
 
 		while (dialogRunning("MUS008")) {
 			_engine->getSoundManager()->soundThread();
+			g_system->delayMillis(4);
 		}
 
 		CONS_Master_StartPart2(0, 0, 0, 0);
@@ -2409,8 +2412,10 @@ void LogicManager::HAND_Master_MovingSecondNight(HAND_PARAMS) {
 		_activeItem = 0;
 		fadeToBlack();
 
-		while (dialogRunning("MUS008"))
+		while (dialogRunning("MUS008")) {
 			_engine->getSoundManager()->soundThread();
+			g_system->delayMillis(4);
+		}
 
 		if (cathHasItem(kItemBomb)) {
 			forceJump(kCharacterAlexei, &LogicManager::CONS_Alexei_Dead);
diff --git a/engines/lastexpress/menu/menu.cpp b/engines/lastexpress/menu/menu.cpp
index 9ef897fedf5..2f006b7258a 100644
--- a/engines/lastexpress/menu/menu.cpp
+++ b/engines/lastexpress/menu/menu.cpp
@@ -301,8 +301,10 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 				_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
 			}
 
-			while (_engine->getLogicManager()->dialogRunning("LIB046"))
+			while (_engine->getLogicManager()->dialogRunning("LIB046")) {
 				_engine->getSoundManager()->soundThread();
+				g_system->delayMillis(4);
+			}
 
 			g_system->delayMillis(334);
 




More information about the Scummvm-git-logs mailing list