From 5dbf9d26f572ce49f7d9f27136c7d039bda870be Mon Sep 17 00:00:00 2001 From: Claude Fable 5 Date: Sun, 14 Jun 2026 11:51:23 -0700 Subject: [PATCH 1/2] partyobj: statCharge particleBase reassociation Split the ResetParticleWork index into an intermediate local so MWCC groups (comboItemState + field3E0*5) before adding 0x1C, matching the target's add ordering. statCharge 95.36->95.81, unit 98.48->98.50. Co-Authored-By: Claude Fable 5 --- src/partyobj.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/partyobj.cpp b/src/partyobj.cpp index b104bdb186..7d3220544f 100644 --- a/src/partyobj.cpp +++ b/src/partyobj.cpp @@ -2315,8 +2315,9 @@ void CGPartyObj::statCharge() } if (m_subFrame == 5 && m_comboItemState >= 0) { endPSlotBit(0x20); + int particleBase = m_comboItemState + *reinterpret_cast(reinterpret_cast(m_scriptHandle) + 0x3E0) * 5; CFlat.ResetParticleWork( - ((m_comboItemState + *reinterpret_cast(reinterpret_cast(m_scriptHandle) + 0x3E0) * 5) + 0x1C) | 0x400, + (particleBase + 0x1C) | 0x400, m_particleSlots[5]); CFlat.SetParticleWorkBind(reinterpret_cast(this)); CFlat.PutParticleWork(); From a57f7c0c1dc721c52b8bd2aa19ef45912cb93406 Mon Sep 17 00:00:00 2001 From: Claude Fable 5 Date: Sun, 14 Jun 2026 11:56:05 -0700 Subject: [PATCH 2/2] partyobj: gpmMove float compare sense for plain bge Rewrite the carrySpeed/speedLimit >= comparisons as !(a < b) so MWCC emits the target's plain bge after fcmpo instead of the NaN-safe cror eq,gt,eq; bne idiom. gpmMove 97.96->98.30, unit 98.50->98.52. Co-Authored-By: Claude Fable 5 --- src/partyobj.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/partyobj.cpp b/src/partyobj.cpp index 7d3220544f..cfb44b2a1e 100644 --- a/src/partyobj.cpp +++ b/src/partyobj.cpp @@ -5416,10 +5416,10 @@ void CGPartyObj::gpmMove() sGhostPartyWork.carrySpeed += FLOAT_80331A70; float speedScale = (sGhostPartyWork.pressure >= pressureLimit) ? kMonObjOne : FLOAT_80331A88; float newSpeed = FLOAT_80331a78; - if (sGhostPartyWork.carrySpeed >= newSpeed) { + if (!(sGhostPartyWork.carrySpeed < newSpeed)) { float speedLimit = speedScale * (m_moveBaseSpeed * *reinterpret_cast(reinterpret_cast(Game.m_partyObjArr[0]) + 0x690)); newSpeed = speedLimit; - if (speedLimit >= sGhostPartyWork.carrySpeed) { + if (!(speedLimit < sGhostPartyWork.carrySpeed)) { newSpeed = sGhostPartyWork.carrySpeed; } }