Fixed temporary arrays being cleared when flushing the keyboard buffer (#337)

Added a message about failed initialization of the game and exit if an error occurs.
This commit is contained in:
NovaRain
2020-09-15 11:33:57 +08:00
parent f16ba16d21
commit a9cde5757f
3 changed files with 18 additions and 4 deletions
+9 -2
View File
@@ -104,7 +104,6 @@ Delegate<>& OnInputLoop() {
}
void FlushInputBuffer() {
while (!bufferedPresses.empty()) bufferedPresses.pop();
__asm call fo::funcoffs::kb_clear_;
}
@@ -267,17 +266,25 @@ public:
return 0;
}
// Only called for the keyboard (dxinput_read_keyboard_buffer_ called at 0x4E06AB)
/* Only called for the keyboard
0x4E06AB dxinput_read_keyboard_buffer_
0x4E0631 dxinput_flush_keyboard_buffer_
*/
HRESULT __stdcall GetDeviceData(DWORD a, DIDEVICEOBJECTDATA* buf, DWORD* count, DWORD d) { // buf - DirectInputKeyboardBuffer (0x6B2560)
if (DeviceType != kDeviceType_KEYBOARD) {
return RealDevice->GetDeviceData(a, buf, count, d);
}
if (!buf && !d && *count == INFINITE) { // flush
while (!bufferedPresses.empty()) bufferedPresses.pop();
return RealDevice->GetDeviceData(a, buf, count, d);
}
onInputLoop.invoke();
if (!buf || bufferedPresses.empty() || (d & DIGDD_PEEK)) {
HRESULT hr = RealDevice->GetDeviceData(a, buf, count, d);
if (FAILED(hr) || !buf || !(*count)) return hr;
for (DWORD i = 0; i < *count; i++) {
DWORD dxKey = buf[i].dwOfs;
DWORD state = buf[i].dwData & 0x80;
+1 -1
View File
@@ -202,7 +202,7 @@ const float* Graphics::rcpresGet() {
static void GetDisplayMode(D3DDISPLAYMODE &ddm) {
ZeroMemory(&ddm, sizeof(ddm));
d3d9->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &ddm);
dlog_f("\nDisplay mode format id: %d", DL_INIT, ddm.Format);
dlog_f("Display mode format id: %d\n", DL_INIT, ddm.Format);
}
static void ResetDevice(bool createNew) {
+8 -1
View File
@@ -339,7 +339,13 @@ static void __stdcall game_init_hook() {
onGameInit.invoke();
}
static void __stdcall GameInitialized() {
static void __stdcall GameInitialized(int initResult) {
#ifdef NDEBUG
if (!initResult) {
MessageBoxA(0, "Game initialization failed!", "Error", MB_TASKMODAL | MB_ICONERROR);
return;
}
#endif
onAfterGameInit.invoke();
}
@@ -358,6 +364,7 @@ static void __declspec(naked) main_init_system_hook() {
popadc;
call fo::funcoffs::main_init_system_;
pushadc;
push eax;
call GameInitialized;
popadc;
retn;