Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion Core/SNES/Input/SnesRumbleController.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,24 @@ void SnesRumbleController::Serialize(Serializer& s)
{
SnesController::Serialize(s);
SV(_rumbleData);
SV(_rumbleActive);
SV(_lastRumbleFrame);
}

void SnesRumbleController::RefreshStateBuffer()
{
_rumbleData = 0;

//The LRG rumble controller stops rumbling shortly after the last rumble command.
//Not accurate, assumes the game regularly latches the controller.
if(_rumbleActive) {
if(_emu->GetFrameCount() - _lastRumbleFrame > 2) {
KeyManager::SetForceFeedback(0, 0);
_rumbleActive = false;
}
}

SnesController::RefreshStateBuffer();
}

uint8_t SnesRumbleController::ReadRam(uint16_t addr)
Expand All @@ -44,7 +62,8 @@ uint8_t SnesRumbleController::ReadRam(uint16_t addr)

KeyManager::SetForceFeedback(rightRumble, leftRumble);

_rumbleData = 0;
_rumbleActive = true;
_lastRumbleFrame = _emu->GetFrameCount();
}
}

Expand Down
3 changes: 3 additions & 0 deletions Core/SNES/Input/SnesRumbleController.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,12 @@ class SnesRumbleController : public SnesController
private:
SnesConsole* _console = nullptr;
uint16_t _rumbleData = 0;
bool _rumbleActive = false;
uint32_t _lastRumbleFrame = 0;

protected:
void Serialize(Serializer& s) override;
void RefreshStateBuffer() override;

public:
SnesRumbleController(Emulator* emu, SnesConsole* console, uint8_t port, KeyMappingSet keyMappings);
Expand Down
Loading