Add rumble event for hit actor

This commit is contained in:
Christian Semmler 2025-07-13 18:52:29 -07:00
parent c9930d10f9
commit b16414059c
No known key found for this signature in database
GPG Key ID: 086DAA1360BEEE5C
8 changed files with 30 additions and 1 deletions

View File

@ -791,6 +791,11 @@ SDL_AppResult SDL_AppEvent(void* appstate, SDL_Event* event)
SDL_Log("Game started");
}
}
else if (event->user.type == g_legoSdlEvents.m_hitActor) {
if (InputManager()) {
InputManager()->HandleRumbleEvent();
}
}
return SDL_APP_CONTINUE;
}

View File

@ -153,6 +153,7 @@ class LegoInputManager : public MxPresenter {
MxResult GetNavigationKeyStates(MxU32& p_keyFlags);
MxResult GetNavigationTouchStates(MxU32& p_keyFlags);
LEGO1_EXPORT MxBool HandleTouchEvent(SDL_Event* p_event, TouchScheme p_touchScheme);
LEGO1_EXPORT void HandleRumbleEvent();
// SYNTHETIC: LEGO1 0x1005b8d0
// LegoInputManager::`scalar deleting destructor'

View File

@ -71,6 +71,7 @@ LegoNamedTexture* ReadNamedTexture(LegoStorage* p_storage);
void WriteDefaultTexture(LegoStorage* p_storage, const char* p_name);
void WriteNamedTexture(LegoStorage* p_storage, LegoNamedTexture* p_namedTexture);
void LoadFromNamedTexture(LegoNamedTexture* p_namedTexture);
void HitActorEvent();
// FUNCTION: BETA10 0x100260a0
inline void StartIsleAction(IsleScript::Script p_objectId)

View File

@ -782,3 +782,10 @@ void LoadFromNamedTexture(LegoNamedTexture* p_namedTexture)
textureInfo->LoadBits(p_namedTexture->GetTexture()->GetImage()->GetBits());
}
}
void HitActorEvent()
{
SDL_Event event;
event.user.type = g_legoSdlEvents.m_hitActor;
SDL_PushEvent(&event);
}

View File

@ -626,3 +626,14 @@ MxBool LegoInputManager::HandleTouchEvent(SDL_Event* p_event, TouchScheme p_touc
return TRUE;
}
void LegoInputManager::HandleRumbleEvent()
{
if (m_joystick != NULL && SDL_GamepadConnected(m_joystick) == TRUE) {
const Uint16 frequency = 65535 / 3;
const Uint32 durationMs = 1000;
SDL_RumbleGamepad(m_joystick, frequency, frequency, durationMs);
}
// Add support for SDL Haptic API
}

View File

@ -235,6 +235,7 @@ MxResult LegoExtraActor::HitActor(LegoPathActor* p_actor, MxBool p_bool)
assert(m_roi);
assert(SoundManager()->GetCacheSoundManager());
SoundManager()->GetCacheSoundManager()->Play("crash5", m_roi->GetName(), FALSE);
HitActorEvent();
m_scheduledTime = Timer()->GetTime() + m_disAnim->GetDuration();
m_prevWorldSpeed = GetWorldSpeed();
VTable0xc4();
@ -248,6 +249,7 @@ MxResult LegoExtraActor::HitActor(LegoPathActor* p_actor, MxBool p_bool)
LegoROI* roi = GetROI();
assert(roi);
SoundManager()->GetCacheSoundManager()->Play("crash5", m_roi->GetName(), FALSE);
HitActorEvent();
VTable0xc4();
SetActorState(c_two | c_noCollide);
Mx3DPointFloat dir = p_actor->GetWorldDirection();

View File

@ -10,6 +10,7 @@
struct LegoSdlEvents {
Uint32 m_windowsMessage;
Uint32 m_presenterProgress;
Uint32 m_hitActor;
};
LEGO1_EXPORT extern LegoSdlEvents g_legoSdlEvents;

View File

@ -163,9 +163,10 @@ MxResult MxOmni::Create(MxOmniCreateParam& p_param)
}
{
Uint32 event = SDL_RegisterEvents(2);
Uint32 event = SDL_RegisterEvents(3);
g_legoSdlEvents.m_windowsMessage = event + 0;
g_legoSdlEvents.m_presenterProgress = event + 1;
g_legoSdlEvents.m_hitActor = event + 2;
}
result = SUCCESS;