Merge branch 'master' into mxdsselectaction

This commit is contained in:
Christian Semmler 2023-10-03 14:04:21 -04:00
commit 831bf4cb5b
6 changed files with 232 additions and 34 deletions

View File

@ -214,7 +214,7 @@ if (ISLE_USE_DX5)
endif()
# Link libraries
target_link_libraries(lego1 PRIVATE ddraw dsound dxguid winmm)
target_link_libraries(lego1 PRIVATE ddraw dsound dxguid dinput winmm)
# Make sure filenames are ALL CAPS
set_property(TARGET lego1 PROPERTY OUTPUT_NAME LEGO1)
@ -273,4 +273,4 @@ if (MSVC)
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "/incremental:no")
set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "/incremental:no /debug")
set(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL "/incremental:no")
endif()
endif()

View File

@ -1,25 +1,175 @@
#include "legoinputmanager.h"
#include "legocontrolmanager.h"
#include "legoomni.h"
#include "decomp.h"
#include "mxautolocker.h"
DECOMP_SIZE_ASSERT(LegoInputManager, 0x338); // 0x10059085
DECOMP_SIZE_ASSERT(LegoInputManager, 0x338);
// OFFSET: LEGO1 0x1005b790 STUB
// OFFSET: LEGO1 0x1005b790
LegoInputManager::LegoInputManager()
{
// TODO
m_unk0x5c = NULL;
m_unk0x64 = 0;
m_unk0x60 = 0;
m_unk0x68 = NULL;
m_unk0x80 = 0;
m_timer = 0;
m_unk0x6c = 0;
m_unk0x70 = 0;
m_controlManager = NULL;
m_unk0x81 = 0;
m_unk0x88 = FALSE;
m_directInput = NULL;
m_directInputDevice = NULL;
m_unk0x94 = 0;
m_unk0x195 = 0;
m_joyid = -1;
m_joystickIndex = -1;
m_useJoystick = FALSE;
m_unk0x335 = 0;
m_unk0x336 = 0;
m_unk0x74 = 0x19;
m_timeout = 1000;
}
// OFFSET: LEGO1 0x1005b8f0 STUB
// OFFSET: LEGO1 0x1005b8b0 STUB
MxResult LegoInputManager::Tickle()
{
// TODO
return SUCCESS;
}
// OFFSET: LEGO1 0x1005b8f0
LegoInputManager::~LegoInputManager()
{
// TODO
Destroy();
}
// OFFSET: LEGO1 0x1005c740 STUB
void LegoInputManager::QueueEvent(NotificationId id, unsigned char p2, MxLong p3, MxLong p4, unsigned char p5)
// OFFSET: LEGO1 0x1005bfe0
void LegoInputManager::Destroy()
{
// TODO
ReleaseDX();
if (m_unk0x5c)
delete m_unk0x5c;
m_unk0x5c = NULL;
if (m_unk0x68)
delete m_unk0x68;
m_unk0x68 = NULL;
if (m_controlManager)
delete m_controlManager;
}
// OFFSET: LEGO1 0x1005c030
void LegoInputManager::CreateAndAcquireKeyboard(HWND hwnd)
{
HINSTANCE hinstance = (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE);
HRESULT hresult = DirectInputCreate(hinstance, 0x500, &m_directInput, NULL); // 0x500 for DX5
if (hresult == DI_OK) {
HRESULT createdeviceresult = m_directInput->CreateDevice(GUID_SysKeyboard, &m_directInputDevice, NULL);
if (createdeviceresult == DI_OK) {
m_directInputDevice->SetCooperativeLevel(hwnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND);
m_directInputDevice->SetDataFormat(&c_dfDIKeyboard);
m_directInputDevice->Acquire();
}
}
}
// OFFSET: LEGO1 0x1005c0a0
void LegoInputManager::ReleaseDX()
{
if (m_directInputDevice != NULL) {
m_directInputDevice->Unacquire();
m_directInputDevice->Release();
m_directInputDevice = NULL;
}
if (m_directInput != NULL) {
m_directInput->Release();
m_directInput = NULL;
}
}
// OFFSET: LEGO1 0x1005c240
MxResult LegoInputManager::GetJoystickId()
{
JOYINFOEX joyinfoex;
if (m_useJoystick != FALSE) {
MxS32 joyid = m_joystickIndex;
if (joyid >= 0) {
joyinfoex.dwSize = 0x34;
joyinfoex.dwFlags = 0xFF;
if (joyGetPosEx(joyid, &joyinfoex) == JOYERR_NOERROR && joyGetDevCaps(joyid, &m_joyCaps, 0x194) == JOYERR_NOERROR) {
m_joyid = joyid;
return SUCCESS;
}
}
for (joyid = JOYSTICKID1; joyid < 16; joyid++) {
joyinfoex.dwSize = 0x34;
joyinfoex.dwFlags = 0xFF;
if (joyGetPosEx(joyid, &joyinfoex) == JOYERR_NOERROR && joyGetDevCaps(joyid, &m_joyCaps, 0x194) == JOYERR_NOERROR) {
m_joyid = joyid;
return SUCCESS;
}
}
}
return FAILURE;
}
// OFFSET: LEGO1 0x1005c320
MxResult LegoInputManager::GetJoystickState(MxU32 *joystick_x, MxU32 *joystick_y, DWORD *buttons_state, MxU32 *pov_position)
{
if (m_useJoystick != FALSE) {
if (m_joyid < 0 && GetJoystickId() == -1) {
m_useJoystick = FALSE;
return FAILURE;
}
JOYINFOEX joyinfoex;
joyinfoex.dwSize = 0x34;
joyinfoex.dwFlags = JOY_RETURNX | JOY_RETURNY | JOY_RETURNBUTTONS;
MxU32 capabilities = m_joyCaps.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_joyCaps.wXmin;
MxU32 ymax = m_joyCaps.wYmax;
MxU32 ymin = m_joyCaps.wYmin;
MxS32 ydiff = ymax - ymin;
*joystick_x = ((joyinfoex.dwXpos - xmin) * 100) / (m_joyCaps.wXmax - xmin);
*joystick_y = ((joyinfoex.dwYpos - m_joyCaps.wYmin) * 100) / ydiff;
if ((m_joyCaps.wCaps & (JOYCAPS_POV4DIR | JOYCAPS_POVCTS)) != 0) {
if (joyinfoex.dwPOV == JOY_POVCENTERED) {
*pov_position = (MxU32) -1;
return SUCCESS;
}
*pov_position = joyinfoex.dwPOV / 100;
return SUCCESS;
}
else {
*pov_position = (MxU32) -1;
return SUCCESS;
}
}
}
return FAILURE;
}
// OFFSET: LEGO1 0x1005c470 STUB
@ -34,11 +184,25 @@ void LegoInputManager::UnRegister(MxCore *)
// TODO
}
// OFFSET: LEGO1 0x1005b8b0 STUB
MxResult LegoInputManager::Tickle()
// OFFSET: LEGO1 0x1005c740 STUB
void LegoInputManager::QueueEvent(NotificationId id, unsigned char p2, MxLong p3, MxLong p4, unsigned char p5)
{
// TODO
return 0;
}
// OFFSET: LEGO1 0x1005cfb0
void LegoInputManager::SetTimer()
{
LegoOmni* omni = LegoOmni::GetInstance();
UINT timer = ::SetTimer(omni->GetWindowHandle(), 1, m_timeout, NULL);
m_timer = timer;
}
// OFFSET: LEGO1 0x1005cfd0
void LegoInputManager::KillTimer()
{
if (m_timer != 0) {
LegoOmni* omni = LegoOmni::GetInstance();
::KillTimer(omni->GetWindowHandle(), m_timer);
}
}

View File

@ -3,6 +3,9 @@
#include "decomp.h"
#include "mxpresenter.h"
#include "mxlist.h"
#include <dinput.h>
enum NotificationId
{
@ -14,6 +17,8 @@ enum NotificationId
TIMER = 15
};
class LegoControlManager;
// VTABLE 0x100d8760
// SIZE 0x338
class LegoInputManager : public MxPresenter
@ -28,22 +33,42 @@ class LegoInputManager : public MxPresenter
virtual MxResult Tickle() override; // vtable+0x8
undefined m_pad40[0x48];
void Destroy();
void CreateAndAcquireKeyboard(HWND hwnd);
void ReleaseDX();
MxResult GetJoystickId();
MxResult GetJoystickState(MxU32 *joystick_x, MxU32 *joystick_y, DWORD *buttons_state, MxU32 *pov_position);
void SetTimer();
void KillTimer();
MxBool m_unk88;
undefined m_unk89[0x113];
// 0x19C
int m_joystickIndex;
undefined m_pad1a0[0x194];
// 0x334
//private:
MxCriticalSection m_criticalSection;
MxList<undefined4> *m_unk0x5c; // list or hash table
undefined4 m_unk0x60;
undefined4 m_unk0x64;
MxList<undefined4> *m_unk0x68; // list or hash table
undefined4 m_unk0x6c;
undefined4 m_unk0x70;
undefined4 m_unk0x74;
UINT m_timer;
UINT m_timeout;
undefined m_unk0x80;
undefined m_unk0x81;
LegoControlManager* m_controlManager;
MxBool m_unk0x88;
IDirectInput *m_directInput;
IDirectInputDevice *m_directInputDevice;
undefined m_unk0x94;
undefined4 m_unk0x98;
undefined m_unk0x9c[0xF8];
undefined m_unk0x194;
MxBool m_unk0x195;
MxS32 m_joyid;
MxS32 m_joystickIndex;
JOYCAPS m_joyCaps;
MxBool m_useJoystick;
undefined m_unk335;
MxBool m_unk336;
undefined m_unk337;
MxBool m_unk0x335;
MxBool m_unk0x336;
};
#endif // LEGOINPUTMANAGER_H

View File

@ -1,7 +1,12 @@
#include "motorcycle.h"
// OFFSET: LEGO1 0x100357b0 STUB
DECOMP_SIZE_ASSERT(Motorcycle, 0x16c);
// OFFSET: LEGO1 0x100357b0
Motorcycle::Motorcycle()
{
// TODO
this->m_unk13c = 40.0;
this->m_unk150 = 1.75;
this->m_unk148 = 1;
this->m_unk164 = 1.0;
}

View File

@ -1,6 +1,7 @@
#ifndef MOTORCYCLE_H
#define MOTORCYCLE_H
#include "decomp.h"
#include "islepathactor.h"
// VTABLE 0x100d7090
@ -22,7 +23,10 @@ class Motorcycle : public IslePathActor
{
return !strcmp(name, Motorcycle::ClassName()) || IslePathActor::IsA(name);
}
private:
undefined m_unk160[4];
MxFloat m_unk164;
undefined m_unk168[4];
};
#endif // MOTORCYCLE_H

View File

@ -83,8 +83,8 @@ MxResult MxTransitionManager::StartTransition(TransitionType p_animationType, Mx
tickleManager->RegisterClient(this, p_speed);
LegoInputManager *inputManager = InputManager();
inputManager->m_unk88 = TRUE;
inputManager->m_unk336 = FALSE;
inputManager->m_unk0x88 = TRUE;
inputManager->m_unk0x336 = FALSE;
LegoVideoManager *videoManager = VideoManager();
videoManager->SetUnkE4(FALSE);