diff --git a/configure.py b/configure.py index 42c89833..e16ad870 100755 --- a/configure.py +++ b/configure.py @@ -1079,7 +1079,7 @@ def MatchingFor(*versions): [], [ Object(Matching, "Kameda/Motor.cpp"), - Object(NonMatching, "Kameda/MotorManager.cpp"), + Object(Matching, "Kameda/MotorManager.cpp"), Object(Matching, "Kameda/J2DManager.cpp"), Object(Matching, "Kameda/Task.cpp"), Object(NonMatching, "Kameda/Goal2D.cpp"), diff --git a/include/Kameda/MotorManager.h b/include/Kameda/MotorManager.h index 7b1f4e9b..9d454256 100644 --- a/include/Kameda/MotorManager.h +++ b/include/Kameda/MotorManager.h @@ -2,13 +2,12 @@ #define MOTORMANAGER_H #include "JSystem/JKernel/JKRDisposer.h" - +#include "Kameda/Motor.h" #include "types.h" class MotorManager : JKRDisposer -{ // Autogenerated +{ public: - // Global enum MotorType { MotorType_0, @@ -33,24 +32,34 @@ class MotorManager : JKRDisposer MotorType_19, MotorType_20, MotorType_21, - MotorType_22 + MotorType_22, + MotorType_23, + MotorType_24, + MotorType_MAX, }; - MotorManager(JKRHeap *); // 0x80130e58 - virtual ~MotorManager(); // 0x80130ee0 - void reset(); // 0x80130f48 - void exec(); // 0x80130fc0 - void setMotor(MotorType, int); // 0x8013103c - void setAwardMotor(MotorType); // 0x80131218 - void setPowerMotor(int, f32, u8, u8); // 0x801312e8 + MotorManager(JKRHeap *heap); // 0x80130e58 + virtual ~MotorManager(); // 0x80130ee0 - static MotorManager *getManager() { return mThis; }; + void reset(); // 0x80130f48 + void exec(); // 0x80130fc0 + + static void setMotor(MotorType motorType, int kart); // 0x8013103c + static void setAwardMotor(MotorType motorType); // 0x80131218 + static void setPowerMotor(int kart, + f32 strength, + u8 phase1Duration, + u8 phase2Duration); // 0x801312e8 - static int mCountFrame[0x19]; // 0x803fb640 - static MotorManager *mThis; // 0x80416280 + static MotorManager *getManager() { return mThis; }; private: - u8 _0[8]; + static int mCountFrame[8][MotorType_MAX]; // 0x803fb640 + + static MotorManager *mThis; // 0x80416280 + + Motor *mMotor; // 0x18 + int mKartNumber; // 0x1c }; -#endif +#endif // MOTORMANAGER_H diff --git a/include/Kameda/SequenceInfo.h b/include/Kameda/SequenceInfo.h index c785ca40..7bca7fbf 100644 --- a/include/Kameda/SequenceInfo.h +++ b/include/Kameda/SequenceInfo.h @@ -153,7 +153,11 @@ class SequenceInfo KartGamePad *_18; // 18 // Size: 0x1c } _318[2]; // 318 - int _350; // + +public: + int _350; // 350 (number of [human] players?) + +private: int _354; // ERaceLevel mLevel; // u8 _35c; // diff --git a/src/Kameda/MotorManager.cpp b/src/Kameda/MotorManager.cpp index f48c3caf..235a579c 100644 --- a/src/Kameda/MotorManager.cpp +++ b/src/Kameda/MotorManager.cpp @@ -1,21 +1,116 @@ #include "Kameda/MotorManager.h" -#include "mathHelper.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "Kameda/SequenceInfo.h" +#include "Kaneshige/RaceMgr.h" +#include "Osako/kartPad.h" +#include "mathHelper.h" // For unused data + +int MotorManager::mCountFrame[8][MotorManager::MotorType_MAX]; -int MotorManager::mCountFrame[0x19]; MotorManager *MotorManager::mThis; -MotorManager::MotorManager(JKRHeap *) {} +MotorManager::MotorManager(JKRHeap *heap) +{ + if (!heap) + { + heap = JKRHeap::getCurrentHeap(); + } + + mThis = this; + + mMotor = new (heap, 0) Motor(heap); + mKartNumber = RaceMgr::getManager()->getKartNumber(); +} + +MotorManager::~MotorManager() +{ + delete mMotor; +} + +void MotorManager::reset() +{ + mMotor->init(); + + for (s32 i = 0; i < mKartNumber; ++i) + { + for (s32 j = 0; j < MotorType_MAX; ++j) + { + mCountFrame[i][j] = 0; + } + } +} + +void MotorManager::exec() +{ + mMotor->exec(); + + for (s32 i = 0; i < mKartNumber; ++i) + { + for (s32 j = 0; j < MotorType_MAX; ++j) + { + mCountFrame[i][j] += 1; + } + } +} + +void MotorManager::setMotor(MotorManager::MotorType motorType, int kart) +{ +#line 117 + JUT_MINMAX_ASSERT(0, motorType, MotorType_MAX); + JUT_MINMAX_ASSERT(0, kart, 8); + + RaceMgr *raceMgr = RaceMgr::getManager(); + if (!raceMgr->isRaceEnd() && !raceMgr->getKartChecker(kart)->isDead()) + { + if (mCountFrame[kart][motorType] >= 10) + { + mCountFrame[kart][motorType] = 0; + + KartGamePad *kartGamePad = KartCtrl::getKartCtrl()->getPad(kart); + KartGamePad *kartGamePadCo = KartCtrl::getKartCtrl()->getCoPad(kart); + + s32 patternIndex = motorType + 1; + mThis->mMotor->triggerWave(kartGamePad, patternIndex); + + if ((KartCtrl::getKartCtrl()->GetGameStatus(kart) & 1) != 0) + { + mThis->mMotor->triggerWave(kartGamePadCo, patternIndex); + } + } + } +} -MotorManager::~MotorManager() {} +void MotorManager::setAwardMotor(MotorManager::MotorType motorType) +{ +#line 157 + JUT_MINMAX_ASSERT(0, motorType, MotorType_MAX); -void MotorManager::reset() {} + s32 patternIndex = motorType + 1; + for (s32 i = 0; i < gSequenceInfo._350; ++i) + { + mThis->mMotor->triggerWave(gpaKartPad[i], patternIndex); + } +} -void MotorManager::exec() {} +void MotorManager::setPowerMotor(int kart, f32 strength, u8 phase1Duration, u8 phase2Duration) +{ +#line 176 + JUT_MINMAX_ASSERT(0, kart, 8); -void MotorManager::setMotor(MotorManager::MotorType, int) {} + RaceMgr *raceMgr = RaceMgr::getManager(); + if (!raceMgr->isRaceEnd() && !raceMgr->getKartChecker(kart)->isDead()) + { + KartGamePad *kartGamePad = KartCtrl::getKartCtrl()->getPad(kart); + KartGamePad *kartGamePadCo = KartCtrl::getKartCtrl()->getCoPad(kart); -void MotorManager::setAwardMotor(MotorManager::MotorType) {} + mThis->mMotor->powerWave(kartGamePad, strength, phase1Duration, phase2Duration); -void MotorManager::setPowerMotor(int, f32, u8, u8) {} + if ((KartCtrl::getKartCtrl()->GetGameStatus(kart) & 1) != 0) + { + mThis->mMotor->powerWave(kartGamePadCo, strength, phase1Duration, phase2Duration); + } + } +} -#include "JSystem/JAudio/JASFakeMatch2.h" +#include "JSystem/JAudio/JASFakeMatch2.h" // For static initializer