From 055b83c1ab38b86101ccba9d0c5eb0674bfea3ef Mon Sep 17 00:00:00 2001 From: ecumber Date: Sat, 8 Jul 2023 02:03:36 -0700 Subject: [PATCH] Squashed commit of the following: commit 1fe03a4a787693616c56f59622bcaae8fd53b30b Author: ecumber Date: Thu Jul 6 21:04:15 2023 -0700 data types commit 7c8432f88236c42c17998d51e820b5e219f3c326 Author: ecumber Date: Thu Jul 6 12:39:13 2023 -0700 Destroy commit f60eb3923b24bc87bb31ba783676c6a50d48e9b8 Author: ecumber Date: Thu Jul 6 12:15:33 2023 -0700 compile fix commit e2f78d557f223c2552a046470578d154c29e473b Author: ecumber Date: Tue Jul 4 13:37:33 2023 -0700 Timer functions commit 447e234e6324a5b0958e9e94c5cda53703abada2 Author: ecumber Date: Thu Jul 6 02:40:10 2023 -0700 fix commit 4670fd790b16a15b5797d50bc3cd1f6e2c9e890d Author: ecumber Date: Thu Jul 6 02:39:04 2023 -0700 improvements commit 7f70bce1eefe550fe6bef193e7ee54948af354b6 Author: ecumber Date: Tue Jul 4 03:42:47 2023 -0700 Update legoinputmanager.cpp commit 0d3433a75d2b20a3fff1da8147ce502b279b1e9c Author: ecumber Date: Tue Jul 4 03:38:32 2023 -0700 Add ReleaseDX commit 72d27fd402efb37da1ce8c41a3350df66c99db1d Author: ecumber Date: Tue Jul 4 02:27:12 2023 -0700 Update CMakeLists.txt commit 09626a62f9d2c56a523ca582be95a4dfb29ee188 Author: ecumber Date: Mon Jul 3 13:48:46 2023 -0700 Move to new branch --- CMakeLists.txt | 7 +- LEGO1/legoinputmanager.cpp | 176 +++++++++++++++++++++++++++++++++++-- LEGO1/legoinputmanager.h | 49 +++++++++-- LEGO1/mxomni.h | 3 + dx5sdk/.gitignore | 5 ++ 5 files changed, 224 insertions(+), 16 deletions(-) create mode 100644 dx5sdk/.gitignore diff --git a/CMakeLists.txt b/CMakeLists.txt index 6067d1f9..23af12f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -177,8 +177,9 @@ add_library(lego1 SHARED LEGO1/viewmanager.cpp ) +target_include_directories(lego1 PRIVATE "dx5sdk/inc") # Link libraries -target_link_libraries(lego1 PRIVATE ddraw dsound winmm) +target_link_libraries(lego1 PRIVATE ddraw dsound winmm "${CMAKE_SOURCE_DIR}/dx5sdk/lib/dinput.lib" "${CMAKE_SOURCE_DIR}/dx5sdk/lib/dxguid.lib") # Make sure filenames are ALL CAPS set_property(TARGET lego1 PROPERTY OUTPUT_NAME LEGO1) @@ -192,10 +193,10 @@ if (ISLE_BUILD_APP) ) # Include LEGO1 headers in ISLE - target_include_directories(isle PRIVATE "${CMAKE_SOURCE_DIR}/LEGO1") + target_include_directories(isle PRIVATE "${CMAKE_SOURCE_DIR}/LEGO1" "dx5sdk/inc") # Link DSOUND, WINMM, and LEGO1 - target_link_libraries(isle PRIVATE dsound winmm lego1) + target_link_libraries(isle PRIVATE dsound winmm lego1 "${CMAKE_SOURCE_DIR}/dx5sdk/lib/dinput.lib" "${CMAKE_SOURCE_DIR}/dx5sdk/lib/dxguid.lib") # Make sure filenames are ALL CAPS set_property(TARGET isle PROPERTY OUTPUT_NAME ISLE) diff --git a/LEGO1/legoinputmanager.cpp b/LEGO1/legoinputmanager.cpp index 90be0c2c..bfc0c4df 100644 --- a/LEGO1/legoinputmanager.cpp +++ b/LEGO1/legoinputmanager.cpp @@ -1,13 +1,35 @@ #include "legoinputmanager.h" #include "decomp.h" +#include "legoomni.h" -DECOMP_SIZE_ASSERT(LegoInputManager, 0x338); // 0x10059085 +//DECOMP_SIZE_ASSERT(LegoInputManager, 0x338); // 0x10059085 -// OFFSET: LEGO1 0x1005b790 STUB +// OFFSET: LEGO1 0x1005b790 LegoInputManager::LegoInputManager() { - // TODO + m_unknown5C = 0; + m_unknown64 = NULL; + m_unknown60 = NULL; + m_unknown_classptr68 = NULL; + m_unknown80 = 0; + m_timer = 0; + m_unknown6C = 0; + m_unknown70 = 0; + m_controlManager = NULL; + m_bool81 = FALSE; + m_bool88 = FALSE; + m_directinputInterface = NULL; + m_directinputDeviceInterface = NULL; + m_unused94 = 0; + m_unknown195 = 0; + m_joyid = (UINT)-1; + m_unknown19C = (UINT)-1; + m_joystickIndex = 0; + m_useJoystick = FALSE; + m_unknown336 = 0; + m_unknown74 = 0x19; + m_timeout = 1000; } // OFFSET: LEGO1 0x1005b8f0 STUB @@ -35,10 +57,150 @@ void LegoInputManager::UnRegister(MxCore *) } // OFFSET: LEGO1 0x1005b8b0 STUB -MxLong LegoInputManager::Tickle() -{ - // TODO +//MxLong LegoInputManager::Tickle() +//{ +// // TODO +// +// return 0; +//} - return 0; +void LegoInputManager::Destroy() +{ + ReleaseDX(); + + if (m_unknown_classptr68 != NULL) delete[] m_unknown_classptr68; + if (m_controlManager != NULL) delete[] m_controlManager; + return; } +void LegoInputManager::SetTimer() +{ + LegoOmni* omni = LegoOmni::GetInstance(); + UINT timer = ::SetTimer(*omni->GetWindowHandle(), 1, m_timeout, NULL); + m_timer = timer; +} + +void LegoInputManager::KillTimer() +{ + if (m_timer != 0) + { + LegoOmni* omni = LegoOmni::GetInstance(); + ::KillTimer(*omni->GetWindowHandle(), m_timer); + } +} + +// this function currently does not match 100% due to some member variables +// being at the wrong offsets, but the functionality is the same + +// OFFSET: LEGO1 0x1005c030 +void LegoInputManager::CreateAndAcquireKeyboard(HWND hwnd) +{ + HINSTANCE hinstance = (HINSTANCE)GetWindowLongA(hwnd, GWL_HINSTANCE); + HRESULT hresult = DirectInputCreateA(hinstance, 0x500, &m_directinputInterface, NULL); // 0x500 for DX5 + if (hresult == DI_OK) + { + HRESULT createdeviceresult = m_directinputInterface->CreateDevice(GUID_SysKeyboard, &m_directinputDeviceInterface, NULL); + if (createdeviceresult == DI_OK) + { + m_directinputDeviceInterface->RunControlPanel(hwnd, 6); + m_directinputDeviceInterface->SetDataFormat(&c_dfDIKeyboard); + m_directinputDeviceInterface->Acquire(); + } + } + return; +} + +MxS32 LegoInputManager::GetJoystickState(unsigned int* joystick_x, unsigned int* joystick_y, DWORD* buttons_state, unsigned int* pov_position) +{ + if ((m_joystickIndex != JOYSTICKID1) && (m_joyid < 0) && (GetJoystickId() == -1)) + { + m_joystickIndex = 0; + return -1; + } + + JOYINFOEX joyinfoex; + joyinfoex.dwSize = 0x34; + joyinfoex.dwFlags = JOY_RETURNX | JOY_RETURNY | JOY_RETURNBUTTONS; + MxU32 capabilities = m_joyCapsA.wCaps; + if ((capabilities & JOYCAPS_HASPOV) != 0) + { + joyinfoex.dwFlags = JOY_RETURNX | JOY_RETURNY | JOY_RETURNPOV | JOY_RETURNBUTTONS; + if ((capabilities & JOYCAPS_POVCTS) != 0) + { + joyinfoex.dwFlags = JOY_RETURNX | JOY_RETURNY | JOY_RETURNPOV | JOY_RETURNBUTTONS | JOY_RETURNPOVCTS; + } + } + MMRESULT mmresult = joyGetPosEx(m_joyid, &joyinfoex); + if (mmresult == MMSYSERR_NOERROR) + { + *buttons_state = joyinfoex.dwButtons; + MxU32 xmin = m_joyCapsA.wXmin; + MxU32 ymax = m_joyCapsA.wYmax; + MxU32 ymin = m_joyCapsA.wYmin; + *joystick_x = ((joyinfoex.dwXpos - xmin) * 100) / (m_joyCapsA.wXmax - xmin); + *joystick_y = ((joyinfoex.dwYpos - m_joyCapsA.wYmin) * 100) / (ymax - ymin); + if ((m_joyCapsA.wCaps & (JOYCAPS_POV4DIR | JOYCAPS_POVCTS)) == 0) + { + *pov_position = (MxU32)-1; + return 0; + } + if (joyinfoex.dwPOV == JOY_POVCENTERED) + { + *pov_position = (MxU32)-1; + return 0; + } + *pov_position = joyinfoex.dwPOV / 100; + return 0; + } + return -1; +} + +// FIXME: there's 2 different variables for the joystick id??? also the lines that +// set dwSize and dwFlags result in incorrect offsets in the JOYINFOEX struct + +// OFFSET: LEGO1 0x1005c240 +MxS32 LegoInputManager::GetJoystickId() +{ + JOYINFOEX joyinfoex; + if (m_joystickIndex != JOYSTICKID1) + { + MxS32 joyid = m_unknown19C; + if (-1 < joyid) + { + joyinfoex.dwSize = 0x34; + joyinfoex.dwFlags = 0xFF; + if (joyGetPosEx(joyid, &joyinfoex) == JOYERR_NOERROR && joyGetDevCapsA(joyid, &m_joyCapsA, 0x194) == JOYERR_NOERROR) + { + m_joyid = joyid; + return 0; + } + } + for (joyid = JOYSTICKID1; joyid < 16; joyid++) + { + joyinfoex.dwSize = 0x34; + joyinfoex.dwFlags = 0xFF; + if (joyGetPosEx(joyid, &joyinfoex) == JOYERR_NOERROR && joyGetDevCapsA(joyid, &m_joyCapsA, 0x194) == JOYERR_NOERROR) + { + m_joyid = joyid; + return 0; + } + } + } + return -1; +} + +void LegoInputManager::ReleaseDX() +{ + if (m_directinputDeviceInterface != NULL) + { + m_directinputDeviceInterface->Unacquire(); + m_directinputDeviceInterface->Release(); + m_directinputDeviceInterface = NULL; + } + if (m_directinputInterface != NULL) + { + m_directinputInterface->Release(); + m_directinputInterface = NULL; + } + return; +} diff --git a/LEGO1/legoinputmanager.h b/LEGO1/legoinputmanager.h index 7ae2dd62..7bcadb45 100644 --- a/LEGO1/legoinputmanager.h +++ b/LEGO1/legoinputmanager.h @@ -3,6 +3,8 @@ #include "decomp.h" #include "mxpresenter.h" +#include "legocontrolmanager.h" +#include enum NotificationId { @@ -25,13 +27,48 @@ class LegoInputManager : public MxPresenter __declspec(dllexport) void QueueEvent(NotificationId id, unsigned char p2, MxLong p3, MxLong p4, unsigned char p5); __declspec(dllexport) void Register(MxCore *); __declspec(dllexport) void UnRegister(MxCore *); + void Destroy(); + MxS32 GetJoystickState(unsigned int* something_x, unsigned int* something_y, DWORD* buttons_state, unsigned int* pov_position); + void CreateAndAcquireKeyboard(HWND hwnd); + MxS32 GetJoystickId(); + void ReleaseDX(); + void SetTimer(); + void KillTimer(); - virtual MxLong Tickle() override; // vtable+0x8 - - undefined m_pad40[0x15c]; - int m_joystickIndex; - undefined m_pad200[0x194]; - MxBool m_useJoystick; + //virtual MxLong Tickle() override; // vtable+0x8 + MxCriticalSection m_criticalsection; // 0x40 + MxS32 m_unknown5C; // 0x5C + MxS32* m_unknown60; // 0x60 + MxS32* m_unknown64; // 0x64 + void* m_unknown_classptr68; // 0x68 + MxS32 m_unknown6C; // 0x6C + MxS32 m_unknown70; // 0x70 + MxS32 m_unknown74; // 0x74 + UINT m_timer; // 0x78 + UINT m_timeout; // 0x7C + MxU8 m_unknown80; // 0x80 + MxBool m_bool81; // 0x81 + MxU8 m_unknown82; // 0x82 + MxU8 m_unknown83; // 0x83 + LegoControlManager* m_controlManager; // 0x84 + MxBool m_bool88; // 0x88 + MxU8 m_unknown89[3]; // 0x89 + IDirectInputA* m_directinputInterface; // 0x8C + IDirectInputDeviceA* m_directinputDeviceInterface; // 0x90 + MxU8 m_unused94; // 0x94 + MxU8 m_unknown95[3]; // 0x95 + void* m_unknown98; // 0x98 + MxU8 m_unknown9C[0xF8]; // 0x9C + MxBool m_unknown195; // 0x195 + MxU8 m_unknown196[2]; // 0x196 + UINT m_joyid; // 0x198 + UINT m_unknown19C; // 0x19C + JOYCAPSA m_joyCapsA; // 0x1a0 + MxU8 m_joystickIndex; // 0x334 + MxBool m_useJoystick; // 0x335 + MxU8 m_unknown336; // 0x336 + MxU8 m_unknown337; // 0x337 + MxU8 m_unknown338; // 0x338 }; #endif // LEGOINPUTMANAGER_H diff --git a/LEGO1/mxomni.h b/LEGO1/mxomni.h index f3f1ee9a..ea77259c 100644 --- a/LEGO1/mxomni.h +++ b/LEGO1/mxomni.h @@ -47,6 +47,9 @@ class MxOmni : public MxCore MxVariableTable* GetVariableTable() const { return this->m_variableTable; } MxMusicManager* GetMusicManager() const { return this->m_musicManager; } MxEventManager* GetEventManager() const { return this->m_eventManager; } + + // FIXME: put this in the correct spot, just a hack for LegoInputManager + HWND* GetWindowHandle() const { return this->m_windowHandle; } protected: static MxOmni* g_instance; diff --git a/dx5sdk/.gitignore b/dx5sdk/.gitignore new file mode 100644 index 00000000..a286f031 --- /dev/null +++ b/dx5sdk/.gitignore @@ -0,0 +1,5 @@ +inc/ +lib/ +samples/ +bin/ +readme.txt \ No newline at end of file