diff --git a/engines/cruise/cruise_main.cpp b/engines/cruise/cruise_main.cpp
index 6e2847d..0501d10 100644
--- a/engines/cruise/cruise_main.cpp
+++ b/engines/cruise/cruise_main.cpp
@@ -1799,32 +1799,60 @@ void CruiseEngine::mainLoop() {
 		// Handle frame delay
 		uint32 currentTick = g_system->getMillis();
 
-		if (!bFastMode) {
-			// Delay for the specified amount of time, but still respond to events
-			bool skipEvents = false;
+		// Delay for the specified amount of time, but still respond to events
+		bool skipEvents = false;
 
-			do {
-				g_system->updateScreen();
+		do {
+			if (userEnabled && !userWait && !autoTrack) {
+				if (currentActiveMenu == -1) {
+					static int16 oldMouseX = -1;
+					static int16 oldMouseY = -1;
 
-				g_system->delayMillis(10);
-				currentTick = g_system->getMillis();
+					getMouseStatus(&main10, &mouseX, &mouseButton, &mouseY);
 
-				if (!skipEvents)
-					skipEvents = manageEvents();
+					if (mouseX != oldMouseX || mouseY != oldMouseY) {
+						int objectType;
+						int newCursor1;
+						int newCursor2;
 
-				if (playerDontAskQuit)
-					break;
+						oldMouseX = mouseX;
+						oldMouseY = mouseY;
 
-				_vm->getDebugger()->onFrame();
-			} while (currentTick < lastTick + _gameSpeed);
-		} else {
-			manageEvents();
+						objectType = findObject(mouseX, mouseY, &newCursor1, &newCursor2);
 
-			if (currentTick >= (lastTickDebug + 10)) {
-				lastTickDebug = currentTick;
-				_vm->getDebugger()->onFrame();
+						if (objectType == 9) {
+							changeCursor(CURSOR_EXIT);
+						} else if (objectType != -1) {
+							changeCursor(CURSOR_MAGNIFYING_GLASS);
+						} else {
+							changeCursor(CURSOR_WALK);
+						}
+					}
+				} else {
+					changeCursor(CURSOR_NORMAL);
+				}
+			} else {
+				changeCursor(CURSOR_NORMAL);
 			}
-		}
+
+			g_system->updateScreen();
+
+			if (!skipEvents || bFastMode)
+				skipEvents = manageEvents();
+
+			if (bFastMode) {
+				if (currentTick >= (lastTickDebug + 10))
+					lastTickDebug = currentTick;
+			} else {
+				g_system->delayMillis(10);
+				currentTick = g_system->getMillis();
+			}
+
+			if (playerDontAskQuit)
+				break;
+
+			_vm->getDebugger()->onFrame();
+		} while (currentTick < lastTick + _gameSpeed && !bFastMode);
 		if (playerDontAskQuit)
 			break;
 
@@ -1844,6 +1872,9 @@ void CruiseEngine::mainLoop() {
 //      readKeyboard();
 
 		bool isUserWait = userWait != 0;
+		if (userDelay) {
+			currentMouseButton = 0;
+		}
 		playerDontAskQuit = processInput();
 		if (playerDontAskQuit)
 			break;
@@ -1855,7 +1886,6 @@ void CruiseEngine::mainLoop() {
 
 		if (userDelay && !userWait) {
 			userDelay--;
-			continue;
 		}
 
 		if (isUserWait & !userWait) {
@@ -1918,38 +1948,6 @@ void CruiseEngine::mainLoop() {
 			mainDraw(userWait);
 			flipScreen();
 
-			if (userEnabled && !userWait && !autoTrack) {
-				if (currentActiveMenu == -1) {
-					static int16 oldMouseX = -1;
-					static int16 oldMouseY = -1;
-
-					getMouseStatus(&main10, &mouseX, &mouseButton, &mouseY);
-
-					if (mouseX != oldMouseX || mouseY != oldMouseY) {
-						int objectType;
-						int newCursor1;
-						int newCursor2;
-
-						oldMouseX = mouseX;
-						oldMouseY = mouseY;
-
-						objectType = findObject(mouseX, mouseY, &newCursor1, &newCursor2);
-
-						if (objectType == 9) {
-							changeCursor(CURSOR_EXIT);
-						} else if (objectType != -1) {
-							changeCursor(CURSOR_MAGNIFYING_GLASS);
-						} else {
-							changeCursor(CURSOR_WALK);
-						}
-					}
-				} else {
-					changeCursor(CURSOR_NORMAL);
-				}
-			} else {
-				changeCursor(CURSOR_NORMAL);
-			}
-
 			if (userWait == 1) {
 				// Waiting for press - original wait loop has been integrated into the
 				// main event loop
