diff --git a/include/Kameda/Motor.h b/include/Kameda/Motor.h index 27eda56c..6df59207 100644 --- a/include/Kameda/Motor.h +++ b/include/Kameda/Motor.h @@ -1,41 +1,93 @@ #ifndef MOTOR_H #define MOTOR_H -#include "types.h" #include "JSystem/JKernel/JKRHeap.h" #include "JSystem/JORReflexible.h" #include "Kaneshige/HioMgr.h" #include "Osako/kartPad.h" +#include "types.h" -class MotorParam : public JORReflexible { +class MotorParam : public JORReflexible +{ public: - // Inline/Unused - MotorParam(); + MotorParam() + { + mUnknownContainer[0].flag = false; + mUnknownContainer[1].flag = false; + mUnknownContainer[2].flag = false; + mUnknownContainer[3].flag = false; + mUnknownFloat = 1.0f; + mUnknownValue = 0x1e; + mUnknownFlag = false; + } virtual ~MotorParam() {} + + struct + { + bool flag; // 0x48 + u8 _49[0x100 - 1]; // 0x49 + } mUnknownContainer[4]; + + f32 mUnknownFloat; // 0x448 + u8 mUnknownValue; // 0x44c + bool mUnknownFlag; // 0x44d }; -class MotorHioNode : public HioNode { +class MotorHioNode : public HioNode +{ public: - MotorHioNode(); + MotorHioNode() : HioNode("モーター", &mParam, 0, 0) {} virtual ~MotorHioNode() {} MotorParam mParam; }; -class Motor { // Autogenerated +class Motor +{ public: - Motor(JKRHeap *); // 0x801304d8 - void init(); // 0x801305c4 - ~Motor(); // 0x80130668 - void exec(); // 0x8013073c - void triggerWave(KartGamePad *, int); // 0x80130ad8 - void powerWave(KartGamePad *, f32, u8, u8); // 0x80130b50 - void stop(); // 0x80130cbc - static const char *mPatternWave[26]; // 0x803942e8 + Motor(JKRHeap *heap); // 0x801304d8 + void init(); // 0x801305c4 + ~Motor(); // 0x80130668 + void exec(); // 0x8013073c + void triggerWave(KartGamePad *kartGamePad, int index); // 0x80130ad8 + void powerWave(KartGamePad *kartGamePad, + f32 strength, + u8 phase1Duration, + u8 phase2Duration); // 0x80130b50 + void stop(); // 0x80130cbc + // Inline/Unused void loopWave(KartGamePad *, int); void loopWave(KartGamePad *, char *); void checkLoop(int, const char *); void triggerWave(KartGamePad *, char *); -}; // class Motor -#endif // MOTOR_H + +private: + static const char *mPatternWave[26]; // 0x803942e8 + + struct + { + KartGamePad *mKartGamePad; // 0x0 + + struct + { + const char *wave; // 0x4 + s32 value; // 0x8 + } mDriverMotor[4]; // 0x4 + + struct + { + const char *wave; // 0x24 + s32 value; // 0x28 + } mPartnerMotor[4]; // 0x24 + + u32 mUnknown[4]; // 0x44 + } mMotorData[4]; + + void *mUnknownPtr; // 0x150 + s32 mCount; // 0x154 + + MotorHioNode *mHioNode; // 0x158 (344) +}; + +#endif // MOTOR_H diff --git a/include/Osako/kartPad.h b/include/Osako/kartPad.h index 8be1c29c..4bbeb8d2 100644 --- a/include/Osako/kartPad.h +++ b/include/Osako/kartPad.h @@ -18,6 +18,7 @@ class KartGamePad : public JUTGamePad PORT_2 = 1, PORT_3 = 2, PORT_4 = 3, + PORT_COUNT = 4, }; enum PadType diff --git a/src/Kameda/Motor.cpp b/src/Kameda/Motor.cpp index bad2d640..a400c06d 100644 --- a/src/Kameda/Motor.cpp +++ b/src/Kameda/Motor.cpp @@ -1,5 +1,12 @@ #include "Kameda/Motor.h" +#include "JSystem/JAudio/JASFakeMatch2.h" // For static initializer +#include "Kaneshige/RaceMgr.h" +#include "Osako/kartPad.h" +#include "Yamamoto/kartCtrl.h" +#include "dolphin/pad.h" + +// clang-format off const char *Motor::mPatternWave[26] = { "/", "*****---**--*", @@ -24,23 +31,141 @@ const char *Motor::mPatternWave[26] = { "********/", "**------*-----*---*--*-*-******-*-*--*--*---*----*-----*------*-------*--------*---------*----------*", "***-------*-------*------*-----*----*----*---*---*---*---*---*--*--*--*-*-*-*-*-*-*-*-*-*-*-*--*--*--*--*---*---*---*---*---*---*---*---*----*----*-----*-----*-----*------*------*------*-------*-------*-------*-------*--------*----------*------------*", - "******---*-------*/", - "******-***-**-*--*------*", - "*****--**--*" + "******---*-------*/", + "******-***-**-*--*------*", + "*****--**--*", }; +// clang-format on + +Motor::Motor(JKRHeap *heap) +{ + mHioNode = new (heap, 0) MotorHioNode(); + + init(); +} + +void Motor::init() +{ + for (int i = 0; i < KartGamePad::PORT_COUNT; ++i) + { + mMotorData[i].mKartGamePad = nullptr; + + for (int j = 0; j < 4; ++j) + { + mMotorData[i].mDriverMotor[j].wave = mPatternWave[0]; + mMotorData[i].mDriverMotor[j].value = -1; -Motor::Motor(JKRHeap *) {} + mMotorData[i].mUnknown[j] = 0; -void Motor::init() {} + mMotorData[i].mPartnerMotor[j].wave = mPatternWave[0]; + mMotorData[i].mPartnerMotor[j].value = -1; + } + } -Motor::~Motor() {} + mUnknownPtr = nullptr; + mCount = 0; + + stop(); +} + +Motor::~Motor() { delete mHioNode; } void Motor::exec() {} -void Motor::triggerWave(KartGamePad *, int) {} +void Motor::triggerWave(KartGamePad *kartGamePad, int index) +{ + if (!kartGamePad) + return; + + KartGamePad::PadPort padPort = kartGamePad->getPadPort(); + if (0 <= padPort && padPort < KartGamePad::PORT_COUNT) + { + mMotorData[padPort].mKartGamePad = kartGamePad; + + mMotorData[padPort].mPartnerMotor[mCount].wave = mPatternWave[index]; + mMotorData[padPort].mPartnerMotor[mCount].value = 0; + + if (++mCount >= 4) + { + mCount = 0; + } + } +} + +void Motor::powerWave(KartGamePad *kartGamePad, f32 strength, u8 phase1Duration, u8 phase2Duration) +{ + KartGamePad::PadPort padPort = kartGamePad->getPadPort(); + if (0 <= padPort && padPort < KartGamePad::PORT_COUNT) + { + static char patterns[KartGamePad::PORT_COUNT][512]; + + f32 power = 0.0f; + + for (s32 duration = phase1Duration + phase2Duration, i = 0; duration > 0; --duration) + { + if (i < phase1Duration) + { + power += strength; + + if (power >= 1.0f) + { + power = power - 1.0f; + patterns[padPort][i] = '*'; + } + else + { + patterns[padPort][i] = '-'; + } + } + else + { + power += strength * (1.0f - (i - phase1Duration) / (f32)phase2Duration); + + if (power >= 1.0f) + { + power = power - 1.0f; + patterns[padPort][i] = '*'; + } + else + { + patterns[padPort][i] = '-'; + } + } + + ++i; + } + + char *pattern = patterns[padPort]; + pattern[phase1Duration + phase2Duration] = '\0'; + + if (!kartGamePad) + return; + + KartGamePad::PadPort padPort = kartGamePad->getPadPort(); + if (0 <= padPort && padPort < KartGamePad::PORT_COUNT) + { + mMotorData[padPort].mKartGamePad = kartGamePad; + + mMotorData[padPort].mPartnerMotor[mCount].wave = pattern; + mMotorData[padPort].mPartnerMotor[mCount].value = 0; -void Motor::powerWave(KartGamePad *, f32, u8, u8) {} + if (++mCount >= 4) + { + mCount = 0; + } + } + } +} -void Motor::stop() {} +void Motor::stop() +{ + PADControlMotor(0, 0); + PADControlMotor(1, 0); + PADControlMotor(2, 0); + PADControlMotor(3, 0); -#include "JSystem/JAudio/JASFakeMatch2.h" + for (int i = 0; i < RaceMgr::getManager()->getKartNumber(); ++i) + { + KartCtrl::getKartCtrl()->getKartBody(i)->getHandle()->StopMotor(); + } +}