mirror of
https://github.com/zeldaret/tww.git
synced 2026-06-08 20:20:04 -04:00
JUTGamePad work
This commit is contained in:
@@ -30,7 +30,7 @@ enum {
|
||||
struct JUTGamePadRecordBase {
|
||||
virtual void unk0() {}
|
||||
virtual void unk1(PADStatus* pad) {}
|
||||
virtual void unk2() {}
|
||||
virtual void write(PADStatus* pad) {}
|
||||
|
||||
/* 0x4 */ bool mActive;
|
||||
};
|
||||
@@ -189,7 +189,7 @@ public:
|
||||
struct CRumble {
|
||||
CRumble(JUTGamePad* pad) { clear(pad); }
|
||||
|
||||
static bool mStatus[4];
|
||||
static u8 mStatus[4];
|
||||
static PADMask mEnabled;
|
||||
|
||||
enum ERumble {
|
||||
@@ -213,10 +213,10 @@ public:
|
||||
static bool isEnabled(u32 mask) { return mEnabled & mask; }
|
||||
static bool isEnabledPort(int port) { return isEnabled(channel_mask[port]); }
|
||||
|
||||
/* 0x00 */ u32 field_0x0;
|
||||
/* 0x04 */ u32 field_0x4;
|
||||
/* 0x08 */ u8* field_0x8;
|
||||
/* 0x0C */ u32 field_0xc;
|
||||
/* 0x00 */ u32 mFrame;
|
||||
/* 0x04 */ u32 mLength;
|
||||
/* 0x08 */ u8* mData;
|
||||
/* 0x0C */ u32 mFrameCount;
|
||||
}; // Size: 0x10
|
||||
|
||||
void startMotorWave(u8* param_2, CRumble::ERumble rumble, u32 param_4) {
|
||||
|
||||
@@ -111,10 +111,10 @@ u32 JUTGamePad::read() {
|
||||
pad->update();
|
||||
}
|
||||
|
||||
if (pad->getPadRecord()) {
|
||||
s32 portNum = pad->mPortNum;
|
||||
if (portNum != -1 && mPadStatus[portNum].error == 0) {
|
||||
pad->getPadRecord()->unk2();
|
||||
if (pad->getPadRecord() && pad->mPortNum != -1) {
|
||||
s32 port = pad->mPortNum;
|
||||
if (mPadStatus[port].error == 0) {
|
||||
pad->getPadRecord()->write(&mPadStatus[port]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -140,7 +140,7 @@ void JUTGamePad::assign() {
|
||||
}
|
||||
}
|
||||
|
||||
bool JUTGamePad::CRumble::mStatus[4];
|
||||
u8 JUTGamePad::CRumble::mStatus[4];
|
||||
PADMask JUTGamePad::CRumble::mEnabled;
|
||||
callbackFn JUTGamePad::C3ButtonReset::sCallback;
|
||||
void* JUTGamePad::C3ButtonReset::sCallbackArg;
|
||||
@@ -357,10 +357,10 @@ u32 JUTGamePad::CStick::getButton() {
|
||||
|
||||
/* 802C4424-802C4444 .text clear__Q210JUTGamePad7CRumbleFv */
|
||||
void JUTGamePad::CRumble::clear() {
|
||||
field_0x0 = 0;
|
||||
field_0x4 = 0;
|
||||
field_0x8 = 0;
|
||||
field_0xc = 0;
|
||||
mFrame = 0;
|
||||
mLength = 0;
|
||||
mData = 0;
|
||||
mFrameCount = 0;
|
||||
mEnabled = (PADMask)(PAD_CHAN3_BIT | PAD_CHAN2_BIT | PAD_CHAN1_BIT | PAD_CHAN0_BIT);
|
||||
}
|
||||
|
||||
@@ -404,56 +404,52 @@ inline u8 getNumBit(u8* arr, u32 bitNo) {
|
||||
|
||||
/* 802C45A4-802C46CC .text update__Q210JUTGamePad7CRumbleFs */
|
||||
void JUTGamePad::CRumble::update(s16 portNo) {
|
||||
/* Nonmatching */
|
||||
if (!isEnabledPort(portNo)) {
|
||||
field_0x0 = 0;
|
||||
field_0x4 = 0;
|
||||
field_0x8 = NULL;
|
||||
field_0xc = 0;
|
||||
mFrame = 0;
|
||||
mLength = 0;
|
||||
mData = NULL;
|
||||
mFrameCount = 0;
|
||||
}
|
||||
|
||||
if (field_0x4 == 0) {
|
||||
if (mLength == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (field_0x0 >= field_0x4) {
|
||||
if (mFrame >= mLength) {
|
||||
stopMotorHard(portNo);
|
||||
field_0x4 = 0;
|
||||
} else if (field_0xc == 0) {
|
||||
mLength = 0;
|
||||
} else if (mFrameCount == 0) {
|
||||
if (mStatus[portNo] == 0) {
|
||||
startMotor(portNo);
|
||||
}
|
||||
return;
|
||||
} else {
|
||||
u32 temp = (field_0x0 / field_0xc);
|
||||
u8 numBit = getNumBit(field_0x8, field_0x0 - temp * field_0xc);
|
||||
if (numBit && !mStatus[portNo]) {
|
||||
u8 numBit = getNumBit(mData, mFrame % mFrameCount);
|
||||
if (numBit != 0 && mStatus[portNo] == 0) {
|
||||
startMotor(portNo);
|
||||
} else if (!numBit) {
|
||||
if (mStatus[portNo]) {
|
||||
stopMotorHard(portNo);
|
||||
}
|
||||
} else if (numBit == 0 && mStatus[portNo] != 0) {
|
||||
stopMotorHard(portNo);
|
||||
}
|
||||
}
|
||||
|
||||
field_0x0++;
|
||||
mFrame++;
|
||||
}
|
||||
|
||||
/* 802C46CC-802C46F4 .text triggerPatternedRumble__Q210JUTGamePad7CRumbleFUl */
|
||||
void JUTGamePad::CRumble::triggerPatternedRumble(u32 param_0) {
|
||||
if (field_0x8 != NULL && field_0xc != 0) {
|
||||
field_0x4 = param_0;
|
||||
field_0x0 = 0;
|
||||
if (mData != NULL && mFrameCount != 0) {
|
||||
mLength = param_0;
|
||||
mFrame = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* 802C46F4-802C4770 .text startPatternedRumble__Q210JUTGamePad7CRumbleFPUcQ310JUTGamePad7CRumble7ERumbleUl */
|
||||
void JUTGamePad::CRumble::startPatternedRumble(u8* param_0, JUTGamePad::CRumble::ERumble param_1, u32 param_2) {
|
||||
field_0xc = ((*param_0) << 8) + *(param_0 + 1);
|
||||
field_0x8 = param_0 + 2;
|
||||
mFrameCount = ((*param_0) << 8) + *(param_0 + 1);
|
||||
mData = param_0 + 2;
|
||||
switch (param_1) {
|
||||
case JUTGamePad::CRumble::VAL_0:
|
||||
triggerPatternedRumble(field_0xc);
|
||||
triggerPatternedRumble(mFrameCount);
|
||||
break;
|
||||
case JUTGamePad::CRumble::VAL_1:
|
||||
triggerPatternedRumble(-1);
|
||||
@@ -466,13 +462,13 @@ void JUTGamePad::CRumble::startPatternedRumble(u8* param_0, JUTGamePad::CRumble:
|
||||
|
||||
/* 802C4770-802C479C .text stopPatternedRumble__Q210JUTGamePad7CRumbleFs */
|
||||
void JUTGamePad::CRumble::stopPatternedRumble(s16 port) {
|
||||
field_0x4 = 0;
|
||||
mLength = 0;
|
||||
stopMotorHard(port);
|
||||
}
|
||||
|
||||
/* 802C479C-802C47C0 .text stopPatternedRumbleAtThePeriod__Q210JUTGamePad7CRumbleFv */
|
||||
void JUTGamePad::CRumble::stopPatternedRumbleAtThePeriod() {
|
||||
field_0x4 = (field_0x0 + field_0xc - 1) % field_0xc;
|
||||
mLength = (mFrame + mFrameCount - 1) % mFrameCount;
|
||||
}
|
||||
|
||||
/* 802C47C0-802C47FC .text getGamePad__10JUTGamePadFi */
|
||||
|
||||
Reference in New Issue
Block a user