diff --git a/configure.py b/configure.py index e16ad870..b930d607 100755 --- a/configure.py +++ b/configure.py @@ -1306,7 +1306,7 @@ def MatchingFor(*versions): Object(NonMatching, "Sato/ItemBanana.cpp"), Object(Matching, "Sato/stEfctWeed.cpp"), Object(Matching, "Sato/ItemKinoko.cpp"), - Object(NonMatching, "Sato/ItemStar.cpp"), + Object(Matching, "Sato/ItemStar.cpp"), Object(NonMatching, "Sato/J3DEffectMgr.cpp"), Object(Matching, "Sato/StringObj.cpp"), Object(NonMatching, "Sato/ItemWanWan.cpp"), diff --git a/include/Sato/ItemHeart.h b/include/Sato/ItemHeart.h index dd0907f6..663296c5 100644 --- a/include/Sato/ItemHeart.h +++ b/include/Sato/ItemHeart.h @@ -32,7 +32,7 @@ class ItemHeart : public ItemObj bool hasHeartsRemaining() const { return !mNoHeartsRemaining; } f32 mRot; - Mtx mRotMtx; + JGeometry::TRot3f mRotMtx; s16 mRemainingNum; // 2e4 s16 mLostNum; // 2e6; J3DEfctHeart *mEffects[2]; // 2e8 diff --git a/include/Sato/ItemStar.h b/include/Sato/ItemStar.h index 17811da0..222bec1f 100644 --- a/include/Sato/ItemStar.h +++ b/include/Sato/ItemStar.h @@ -3,8 +3,6 @@ #include "Sato/ItemObj.h" - // TODO - class ItemStar : public ItemObj { // Autogenerated public: @@ -24,6 +22,7 @@ class ItemStar : public ItemObj // Inline virtual ~ItemStar() {} // 0x80255ec8 - u8 _[0x2e4 - 0x2b0]; + f32 mRot; + JGeometry::TRot3f mRotMtx; }; -#endif // ITEMSTAR_H \ No newline at end of file +#endif // ITEMSTAR_H diff --git a/src/Sato/ItemHeart.cpp b/src/Sato/ItemHeart.cpp index c0f672f7..2efe864e 100644 --- a/src/Sato/ItemHeart.cpp +++ b/src/Sato/ItemHeart.cpp @@ -142,7 +142,7 @@ void ItemHeart::initEquip() mpHandAnmMtx = getHandAnmMtx(); mVel.zero(); mPos.zero(); - JMath::gekko_ps_copy12(mRotMtx, _210); // NOTE: mRotMtx might be SMatrix34C, spot other inlnes to be sure + mRotMtx.set(_210); } void ItemHeart::doEquip() diff --git a/src/Sato/ItemStar.cpp b/src/Sato/ItemStar.cpp index e69de29b..cc742166 100644 --- a/src/Sato/ItemStar.cpp +++ b/src/Sato/ItemStar.cpp @@ -0,0 +1,127 @@ +#include "Sato/ItemStar.h" + +#include "JSystem/JAudio/JASFakeMatch2.h" + +namespace +{ + f32 sScale = 1.0f; + f32 sHeightOffset = 26.0f; + f32 sBoundsRadius = 30.0f; +} + +ItemStar::ItemStar(u32 kind) : ItemObj(kind) +{ + reset(); +} + +void ItemStar::reset() +{ + resetObject(); + mKartReaction = 7; + _12c |= 8; + _12c |= 0x200; + _28 = 0.5f; + _6c = sHeightOffset; + _2c = 0.5f; + + if (mBounds) + mBounds->setRadius(sBoundsRadius); + + mLerpRatio = 0.3f; + mRot = 0.0f; + PSMTXIdentity(mRotMtx); +} + +const char *ItemStar::getBmdFileName() +{ + static const char *cStarBmdName = "/Item/item_star.bmd"; + return cStarBmdName; +} + +void ItemStar::createModel(JKRSolidHeap *heap, u32 p2, u32 id) { + mModel.createDifferedModel(heap, p2, id | 0x1000200, false); +} + +void ItemStar::doUniv() +{ + if (!tstAnyObjectHitting()) + { + switch (mState) + { + case 1: + case 5: + doEquipScaleUp(sScale); + break; + case 4: + case 6: + doFallScaling(); + setScaleCol(mEquipScale); + break; + case 7: + doForceDisappearScaleDown(); + break; + } + } + (this->*mStateFunc)(); +} + +void ItemStar::initEquip() +{ + mEquipFlags = 0; + mpHandAnmMtx = getHandAnmMtx(); + mVel.zero(); + mPos.zero(); + mRotMtx.set(_210); +} + +void ItemStar::doEquip() { + rotationRad(mRot, 0.05f); + f32 r = mRot; + f32 s = sin(r); + f32 c = cos(r); + Mtx m; + + m[1][1] = 1.0f; + m[0][0] = c; + m[0][2] = s; + m[2][0] = -s; + m[2][2] = c; + m[2][1] = 0.0f; + m[1][2] = 0.0f; + m[1][0] = 0.0f; + m[0][1] = 0.0f; + m[0][3] = 0.0f; + m[1][3] = 0.0f; + m[2][3] = 0.0f; + PSMTXConcat(mRotMtx, m, _210); + doHandOneEquip(false, 0.0f); +} + +void ItemStar::initRelease() { setStateDisappear(true); } + +void ItemStar::doRelease() {} + +void ItemStar::initDisappear() +{ + _12c &= ~1; + mState = 10; +} + +void ItemStar::doDisappear() {} + +void ItemStar::initFall() +{ + mEquipFlags = 0xffffffff; + ItemObj::initmoveFall(); +} + +void ItemStar::doFall() +{ + Quaternion qRotY, q; + + rotationRad(mRot, 0.05f); + QuatRotY(mRot, &qRotY); + moveFall(); + PSQUATMultiply(&_34, &qRotY, &q); + setModelMatrixAndScale(q); +}