From 332ef2cbd5f4e4b70cc3897e4e7e60cfb0320d9e Mon Sep 17 00:00:00 2001 From: Benjamin Mugnier Date: Mon, 17 Aug 2026 10:23:00 +0200 Subject: [PATCH 1/2] ItemStar: Implement and mark as matching --- configure.py | 2 +- include/Sato/ItemStar.h | 7 +-- src/Sato/ItemStar.cpp | 127 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 131 insertions(+), 5 deletions(-) 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/ItemStar.h b/include/Sato/ItemStar.h index 17811da0..eb0b3a07 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; + Mtx mRotMtx; }; -#endif // ITEMSTAR_H \ No newline at end of file +#endif // ITEMSTAR_H diff --git a/src/Sato/ItemStar.cpp b/src/Sato/ItemStar.cpp index e69de29b..c30d5afa 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(); + JMath::gekko_ps_copy12(mRotMtx, _210); // NOTE: mRotMtx might be SMatrix34C, spot other inlnes to be sure +} + +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); +} From 35e574540642ad21d6d9cf9a0002a3b2c86ed00e Mon Sep 17 00:00:00 2001 From: Benjamin Mugnier Date: Tue, 25 Aug 2026 18:20:10 +0200 Subject: [PATCH 2/2] Simplify ItemHeart and ItemStar initEquip() Switch mRotMtx type from Mtx to JGeometry::TRot3f so we can call set() directly. --- include/Sato/ItemHeart.h | 2 +- include/Sato/ItemStar.h | 2 +- src/Sato/ItemHeart.cpp | 2 +- src/Sato/ItemStar.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) 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 eb0b3a07..222bec1f 100644 --- a/include/Sato/ItemStar.h +++ b/include/Sato/ItemStar.h @@ -23,6 +23,6 @@ class ItemStar : public ItemObj virtual ~ItemStar() {} // 0x80255ec8 f32 mRot; - Mtx mRotMtx; + JGeometry::TRot3f mRotMtx; }; #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 c30d5afa..cc742166 100644 --- a/src/Sato/ItemStar.cpp +++ b/src/Sato/ItemStar.cpp @@ -71,7 +71,7 @@ void ItemStar::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 ItemStar::doEquip() {