The controls keyed off CPythonBackground's warp map name, which the
loading window sets before the game window exists, so the loading screen
already showed them. Also require CPythonNetworkStream's phase to be
"Game" (PORT_IsGamePhase, exposed as PythonBoot::InGamePhase).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A chat line keeps the IME focus under a hidden board (interfacemodule
__HideWindows for an NPC dialog, the focus handed back by
UnlockWindow/DeactivateWindow), and IsPointInsideFocusedWindow only
checked its own show flag and rect, so taps on the NPC dialog or the
minimap buttons opened the keyboard. Require the whole parent chain to
render and the picked window to be the focused one or its child.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Host-side window records + message queue; WM_SIZE/WM_MOVE/WM_DESTROY sent
synchronously as Win32 does; PostQuitMessage also queues WM_QUIT. 64-bit
pointer casts ADAPTED. port.ms_window.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copy SoundBase/SoundData/SoundInstance*/SoundManager*/Type from 40250 and
implement the AIL_* calls they make in MilesAil.cpp (2D pan, 3D distance and
listener pan, threaded stream decode, loop counts). The SDL host drains the
mixer. CSoundManager is created/updated/destroyed where 40250 does it and the
old AudioCommands bridge is removed. Port-map MilesLib 142/142 PORTED.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>