Files
mm/src/code/sys_rumble.c
T
Anghelo Carvajal 45eed680d6 code_8013EC10 and code_80182CE0 (z_rumble and sys_rumble) (#763)
* First pass

* import bss

* cleanup warnings

* PadMgr_ControllerHasRumblePak

* z64rumble.h

* rename file to z_rumble.c

* format

* Update src/code/z_rumble.c

Co-authored-by: Derek Hensley <hensley.derek58@gmail.com>

* Update src/code/z_rumble.c

Co-authored-by: Derek Hensley <hensley.derek58@gmail.com>

* name a temp

* minor cleaning

* bss

* match code_80182CE0

* import data and cleanups

* Rename RumbleManager struct and sys_rumble file

* Rename functions from sys_rumble

* Rename parameter to distSq

Co-authored-by: Derek Hensley <hensley.derek58@gmail.com>

* more notes and a bit of cleaning

* Name Rumble_Add and Rumble_AddForced

* some extra notes

* Rename Rumble_Override and Rumble_Request

* document states

* minor renames

* actorfixer

* format

* very minor docs

* whoops

* remove redundant prevent_bss_reordering

* Update src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.c

Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com>

* Update src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.c

Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com>

* Update src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.c

Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com>

* namefixer

* Update src/code/sys_rumble.c

Co-authored-by: Dragorn421 <Dragorn421@users.noreply.github.com>

* fix

* Elliptic review

Co-authored-by: EllipticEllipsis <73679967+EllipticEllipsis@users.noreply.github.com>

* minor cleanups

* Update include/z64rumble.h

Co-authored-by: EllipticEllipsis <elliptic.ellipsis@gmail.com>

* review

Co-authored-by: EllipticEllipsis <73679967+EllipticEllipsis@users.noreply.github.com>

* Update src/code/sys_rumble.c

Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com>

* Update src/code/z_rumble.c

Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com>

* review

Co-authored-by: Derek Hensley <hensley.derek58@gmail.com>

Co-authored-by: Derek Hensley <hensley.derek58@gmail.com>
Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com>
Co-authored-by: Dragorn421 <Dragorn421@users.noreply.github.com>
Co-authored-by: EllipticEllipsis <73679967+EllipticEllipsis@users.noreply.github.com>
Co-authored-by: EllipticEllipsis <elliptic.ellipsis@gmail.com>
2022-06-29 22:08:03 +01:00

161 lines
5.3 KiB
C

/*
* File: sys_rumble.c
* Description: Internal scheduler system for rumble requests
*/
#include "global.h"
#include "z64rumble.h"
// sRumbleWasEnabledOnLastTick/sWillDisableRumble? Probably name it after updateEnabled
u8 D_801D1E70 = true;
void RumbleManager_Update(RumbleManager* rumbleMgr) {
s32 strongestIndex = -1;
s32 i;
s32 temp;
// Turn rumbling off for all controllers
for (i = 0; i < ARRAY_COUNT(rumbleMgr->rumbleEnabled); i++) {
rumbleMgr->rumbleEnabled[i] = false;
}
if (!rumbleMgr->updateEnabled) {
// Rumbling update is disabled
if (D_801D1E70) {
for (i = 0; i < MAXCONTROLLERS; i++) {
func_8017544C(i, false);
}
}
D_801D1E70 = rumbleMgr->updateEnabled;
func_80175434();
return;
}
D_801D1E70 = rumbleMgr->updateEnabled;
// Start up the manager by wiping old requests
if (rumbleMgr->state == RUMBLEMANAGER_STATE_INITIAL) {
for (i = 0; i < MAXCONTROLLERS; i++) {
func_8017544C(i, false);
}
for (i = 0; i < RUMBLE_REQUEST_BUFFER_SIZE; i++) {
rumbleMgr->requestIntensities[i] = 0;
rumbleMgr->requestDecayTimers[i] = 0;
rumbleMgr->requestDecaySteps[i] = 0;
rumbleMgr->requestAccumulators[i] = 0;
}
rumbleMgr->rumblingDuration = 0;
rumbleMgr->downTime = 0;
rumbleMgr->overrideIntensity = 0;
rumbleMgr->overrideDecayTimer = 0;
rumbleMgr->overrideDecayStep = 0;
rumbleMgr->overrideAccumulator = 0;
rumbleMgr->state = RUMBLEMANAGER_STATE_RUNNING;
func_80175434();
}
if (rumbleMgr->state != RUMBLEMANAGER_STATE_WIPE) {
// Process arrays of rumble requests
for (i = 0; i < RUMBLE_REQUEST_BUFFER_SIZE; i++) {
if (rumbleMgr->requestIntensities[i] != 0) { // This entry has a non-empty rumble request
if (rumbleMgr->requestDecayTimers[i] > 0) {
rumbleMgr->requestDecayTimers[i]--;
} else {
temp = rumbleMgr->requestIntensities[i] - rumbleMgr->requestDecaySteps[i];
if (temp > 0) {
rumbleMgr->requestIntensities[i] = temp;
} else {
rumbleMgr->requestIntensities[i] = 0;
}
}
temp = rumbleMgr->requestAccumulators[i] + rumbleMgr->requestIntensities[i];
rumbleMgr->requestAccumulators[i] = temp; // overflows
if (strongestIndex == -1) {
strongestIndex = i;
rumbleMgr->rumbleEnabled[0] = (temp >= 0x100);
} else if (rumbleMgr->requestIntensities[strongestIndex] < rumbleMgr->requestIntensities[i]) {
strongestIndex = i;
rumbleMgr->rumbleEnabled[0] = (temp >= 0x100);
}
}
}
// Process Override request. Note it takes priority over the values set by the request arrays
if (rumbleMgr->overrideIntensity != 0) {
if (rumbleMgr->overrideDecayTimer > 0) {
rumbleMgr->overrideDecayTimer--;
} else {
temp = rumbleMgr->overrideIntensity - rumbleMgr->overrideDecayStep;
if (temp > 0) {
rumbleMgr->overrideIntensity = temp;
} else {
rumbleMgr->overrideIntensity = 0;
}
}
temp = rumbleMgr->overrideAccumulator + rumbleMgr->overrideIntensity;
rumbleMgr->overrideAccumulator = temp; // overflows
rumbleMgr->rumbleEnabled[0] = (temp >= 0x100);
}
if (rumbleMgr->overrideIntensity != 0) {
temp = rumbleMgr->overrideIntensity;
} else if (strongestIndex == -1) {
temp = 0;
} else {
temp = rumbleMgr->requestIntensities[strongestIndex];
}
// Keep track of how long this have been rumbling (almost) nonstop
if (temp == 0) {
rumbleMgr->downTime++;
if (rumbleMgr->downTime > 5) {
rumbleMgr->rumblingDuration = 0;
rumbleMgr->downTime = 5;
}
} else {
rumbleMgr->downTime = 0;
rumbleMgr->rumblingDuration++;
if (rumbleMgr->rumblingDuration > 2 * 60 * 60) { // 2 minutes
// Rumbling has lasted too long, clear system
rumbleMgr->state = RUMBLEMANAGER_STATE_WIPE;
}
}
} else { // RUMBLEMANAGER_STATE_WIPE
for (i = 0; i < RUMBLE_REQUEST_BUFFER_SIZE; i++) {
rumbleMgr->requestIntensities[i] = 0;
rumbleMgr->requestDecayTimers[i] = 0;
rumbleMgr->requestDecaySteps[i] = 0;
rumbleMgr->requestAccumulators[i] = 0;
}
rumbleMgr->rumblingDuration = 0;
rumbleMgr->downTime = 0;
rumbleMgr->overrideIntensity = 0;
rumbleMgr->overrideDecayTimer = 0;
rumbleMgr->overrideDecayStep = 0;
rumbleMgr->overrideAccumulator = 0;
func_80175434();
}
}
void RumbleManager_Init(RumbleManager* rumbleMgr) {
bzero(rumbleMgr, sizeof(RumbleManager));
rumbleMgr->state = RUMBLEMANAGER_STATE_INITIAL;
rumbleMgr->updateEnabled = true;
}
void RumbleManager_Destroy(RumbleManager* rumbleMgr) {
}