Fix save list, delete save, exit without saving, and blank username on Windows64 (#539)
* Fix world save rename not applying new name
KeyboardCompleteWorldNameCallback had no _WINDOWS64 branch, so the
typed name was validated then silently discarded on every rename attempt.
Write the new name to a worldname.txt sidecar file next to the save
(Windows64\GameHDD\{folder}\worldname.txt) and update the in-memory
display name immediately. ReadLevelNameFromSaveFile now checks for this
sidecar first so renamed saves persist correctly across restarts.
* Fixed gamertag being blank upon renaming and re-joining a save
* Save deletion fix, exiting without saving fix
* Add native in-game keyboard UI for world naming and renaming
This commit is contained in:
@@ -55,6 +55,8 @@ void KeyboardMouseInput::Init()
|
||||
m_hasInput = false;
|
||||
m_kbmActive = true;
|
||||
m_screenWantsCursorHidden = false;
|
||||
m_charBufferHead = 0;
|
||||
m_charBufferTail = 0;
|
||||
|
||||
RAWINPUTDEVICE rid;
|
||||
rid.usUsagePage = 0x01; // HID_USAGE_PAGE_GENERIC
|
||||
@@ -381,4 +383,29 @@ float KeyboardMouseInput::GetLookY(float sensitivity) const
|
||||
return (float)(-m_mouseDeltaY) * sensitivity;
|
||||
}
|
||||
|
||||
void KeyboardMouseInput::OnChar(wchar_t c)
|
||||
{
|
||||
int next = (m_charBufferHead + 1) % CHAR_BUFFER_SIZE;
|
||||
if (next != m_charBufferTail)
|
||||
{
|
||||
m_charBuffer[m_charBufferHead] = c;
|
||||
m_charBufferHead = next;
|
||||
}
|
||||
}
|
||||
|
||||
bool KeyboardMouseInput::ConsumeChar(wchar_t &outChar)
|
||||
{
|
||||
if (m_charBufferTail == m_charBufferHead)
|
||||
return false;
|
||||
outChar = m_charBuffer[m_charBufferTail];
|
||||
m_charBufferTail = (m_charBufferTail + 1) % CHAR_BUFFER_SIZE;
|
||||
return true;
|
||||
}
|
||||
|
||||
void KeyboardMouseInput::ClearCharBuffer()
|
||||
{
|
||||
m_charBufferHead = 0;
|
||||
m_charBufferTail = 0;
|
||||
}
|
||||
|
||||
#endif // _WINDOWS64
|
||||
|
||||
@@ -84,6 +84,11 @@ public:
|
||||
void SetScreenCursorHidden(bool hidden) { m_screenWantsCursorHidden = hidden; }
|
||||
bool IsScreenCursorHidden() const { return m_screenWantsCursorHidden; }
|
||||
|
||||
// Text input: buffer characters typed while the native keyboard scene is open
|
||||
void OnChar(wchar_t c);
|
||||
bool ConsumeChar(wchar_t &outChar);
|
||||
void ClearCharBuffer();
|
||||
|
||||
float GetMoveX() const;
|
||||
float GetMoveY() const;
|
||||
|
||||
@@ -129,6 +134,11 @@ private:
|
||||
bool m_kbmActive;
|
||||
|
||||
bool m_screenWantsCursorHidden;
|
||||
|
||||
static const int CHAR_BUFFER_SIZE = 32;
|
||||
wchar_t m_charBuffer[CHAR_BUFFER_SIZE];
|
||||
int m_charBufferHead;
|
||||
int m_charBufferTail;
|
||||
};
|
||||
|
||||
extern KeyboardMouseInput g_KBMInput;
|
||||
|
||||
@@ -565,6 +565,12 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
g_KBMInput.SetWindowFocused(true);
|
||||
break;
|
||||
|
||||
case WM_CHAR:
|
||||
// Buffer typed characters so UIScene_Keyboard can dispatch them to the Iggy Flash player
|
||||
if (wParam >= 0x20 || wParam == 0x08 || wParam == 0x0D) // printable chars + backspace + enter
|
||||
g_KBMInput.OnChar((wchar_t)wParam);
|
||||
break;
|
||||
|
||||
case WM_KEYDOWN:
|
||||
case WM_SYSKEYDOWN:
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user