From cd77ffb15c80e89c26252858830d6cfd8bb6b007 Mon Sep 17 00:00:00 2001 From: Kevin <136357605+energydrink02@users.noreply.github.com> Date: Tue, 2 Dec 2025 23:04:17 +0100 Subject: [PATCH 1/2] zEntDestructObj: 100% and Link by porting Seil's EventCB function --- configure.py | 2 +- src/SB/Game/zEntDestructObj.cpp | 189 +++++++++++++------------------- 2 files changed, 76 insertions(+), 115 deletions(-) diff --git a/configure.py b/configure.py index 6460232ba..e76246a23 100644 --- a/configure.py +++ b/configure.py @@ -479,7 +479,7 @@ def MatchingFor(*versions): Object(Equivalent, "SB/Game/zEnt.cpp"), Object(Equivalent, "SB/Game/zEntButton.cpp"), Object(NonMatching, "SB/Game/zEntCruiseBubble.cpp"), - Object(NonMatching, "SB/Game/zEntDestructObj.cpp"), + Object(Matching, "SB/Game/zEntDestructObj.cpp"), Object(NonMatching, "SB/Game/zEntHangable.cpp"), Object(NonMatching, "SB/Game/zEntPickup.cpp"), Object(NonMatching, "SB/Game/zEntPlayer.cpp", extra_cflags=["-sym on"]), diff --git a/src/SB/Game/zEntDestructObj.cpp b/src/SB/Game/zEntDestructObj.cpp index a3ac02c7e..9324b9fe5 100644 --- a/src/SB/Game/zEntDestructObj.cpp +++ b/src/SB/Game/zEntDestructObj.cpp @@ -3,10 +3,10 @@ #include static zParEmitter* sEmitDust; +static zParEmitter* sEmitXplo; +static zParEmitter* sEmitWeb; static zParEmitter* sEmitFire; static zParEmitter* sEmitSmoke; -static zParEmitter* sEmitWeb; -static zParEmitter* sEmitXplo; static zParEmitter* sShrapDefault; namespace @@ -408,168 +408,129 @@ void zEntDestructObj_DestroyFX(zEntDestructObj* ent) } } -S32 zEntDestructObjEventCB(xBase* from, xBase* to, U32 toEvent, const F32* toParam, xBase* baseUnk3) +S32 zEntDestructObjEventCB(xBase* from, xBase* to, U32 toEvent, const F32* toParam, xBase* toParamWidget) { - zEntDestructObj* toDobj = (zEntDestructObj*)to; - F32 sp8; - - // Shrapnel Asset callbacks - //void (*temp_r12) (zShrapnelAsset*, xModelInstance*, xVec3*, void*); - void (*temp_r12_2)(zEntDestructObj&, void*); - void (*temp_r12_3)(zShrapnelAsset*, xModelInstance*, xVec3*, void (*)(zFrag*, zFragAsset*)); + zEntDestructObj* s = (zEntDestructObj*)to; - F32 temp_f1; - U32 temp_r3_2; - zShrapnelAsset* shrapnelDestroyAsset; - xEnt* temp_r4_2; - xModelInstance* temp_r4; - xModelInstance* temp_r4_3; - - switch ((en_xEventTags)toEvent) - { - case eEventFastVisible: + switch (toEvent) { case eEventVisible: - xEntShow((xEnt*)to); - if ((toParam != NULL) && ((s32)(0.5f + toParam[0]) == 0x4D)) - { - zFXPopOn(*toDobj, toParam[1], toParam[2]); + case eEventFastVisible: + xEntShow(s); + if (toParam && (S32)(0.5f + toParam[0]) == 77) { + zFXPopOn(*s, toParam[1], toParam[2]); } break; - case eEventFastInvisible: case eEventInvisible: - xEntHide((xEnt*)to); - if ((toParam != NULL) && ((s32)(0.5f + toParam[0]) == 0x4D)) - { - zFXPopOff(*toDobj, toParam[1], toParam[2]); + case eEventFastInvisible: + xEntHide(s); + if (toParam && (S32)(0.5f + toParam[0]) == 77) { + zFXPopOff(*s, toParam[1], toParam[2]); } break; case eEventCollisionOn: - toDobj->chkby |= 0x18; - toDobj->bupdate((xEnt*)to, (xVec3*)&toDobj->model->Mat->pos); + s->chkby |= (XENT_COLLTYPE_PLYR | XENT_COLLTYPE_NPC); + s->bupdate(s, (xVec3*)&s->model->Mat->pos); break; case eEventCollisionOff: - toDobj->chkby &= 0xE7; + s->chkby &= (U8)~(XENT_COLLTYPE_PLYR | XENT_COLLTYPE_NPC); break; case eEventCollision_Visible_On: - toDobj->chkby |= 0x18; - xEntShow((xEnt*)to); - toDobj->bupdate((xEnt*)to, (xVec3*)&toDobj->model->Mat->pos); - if ((toParam != NULL) && ((s32)(0.5f + toParam[0]) == 0x4D)) - { - zFXPopOn(*toDobj, toParam[1], toParam[2]); + s->chkby |= (XENT_COLLTYPE_PLYR | XENT_COLLTYPE_NPC); + xEntShow(s); + s->bupdate(s, (xVec3*)&s->model->Mat->pos); + if (toParam && (S32)(0.5f + toParam[0]) == 77) { + zFXPopOn(*s, toParam[1], toParam[2]); } break; case eEventCollision_Visible_Off: - toDobj->chkby &= 0xE7; - xEntHide((xEnt*)to); - if ((toParam != NULL) && ((s32)(0.5f + toParam[0]) == 0x4D)) - { - zFXPopOff(*toDobj, toParam[1], toParam[2]); + s->chkby &= (U8)~(XENT_COLLTYPE_PLYR | XENT_COLLTYPE_NPC); + xEntHide(s); + if (toParam && (S32)(0.5f + toParam[0]) == 77) { + zFXPopOff(*s, toParam[1], toParam[2]); } break; case eEventCameraCollideOn: - zCollGeom_CamEnable((xEnt*)to); + zCollGeom_CamEnable(s); break; case eEventCameraCollideOff: - zCollGeom_CamDisable((xEnt*)to); + zCollGeom_CamDisable(s); break; - case eEventTeleportPlayer: - temp_r4 = toDobj->destroy_model; - if (temp_r4 != NULL) - { - SwapModel(toDobj, temp_r4); + case eEventDestroy: + if (s->destroy_model) { + SwapModel(s, s->destroy_model); + } else { + s->chkby &= (U8)~(XENT_COLLTYPE_PLYR | XENT_COLLTYPE_NPC); + xEntHide(s); } - else - { - toDobj->chkby &= 0xE7; - xEntHide((xEnt*)to); + zEntDestructObj_DestroyFX(s); + s->state = 2; + if (s->shrapnel_destroy && s->shrapnel_destroy->initCB) { + s->shrapnel_destroy->initCB(s->shrapnel_destroy, s->model, NULL, NULL); } - zEntDestructObj_DestroyFX((zEntDestructObj*)to); - toDobj->state = DOBJ_STATE_DESTROYED; - shrapnelDestroyAsset = toDobj->shrapnel_destroy; - if (shrapnelDestroyAsset != NULL) - { - //temp_r12 = shrapnelDestroyAsset->initCB; - if (shrapnelDestroyAsset->initCB != NULL) - { - shrapnelDestroyAsset->initCB(shrapnelDestroyAsset, toDobj->model, NULL, NULL); - } - } - temp_r12_2 = toDobj->destroy_notify; - if (temp_r12_2 != NULL) - { - temp_r12_2(*toDobj, toDobj->notify_context); + if (s->destroy_notify) { + s->destroy_notify(*s, s->notify_context); } - temp_r4_2 = toDobj->driver; - if (temp_r4_2 != NULL) - { - temp_r4_2->driving_count = (u8)(temp_r4_2->driving_count - 1); - toDobj->driver = NULL; + if (s->driver) { + s->driver->driving_count--; + s->driver = NULL; } break; case eEventReset: - zEntDestructObj_Reset((zEntDestructObj*)to, globals.sceneCur); + zEntDestructObj_Reset(s, globals.sceneCur); break; - default: - zEntAnimEvent((zEnt*)to, toEvent, toParam); + case eEventAnimPlay: + case eEventAnimPlayLoop: + case eEventAnimStop: + case eEventAnimPause: + case eEventAnimResume: + case eEventAnimTogglePause: + case eEventAnimPlayRandom: + case eEventAnimPlayMaybe: + zEntAnimEvent(s, toEvent, toParam); break; case eEventHit: - temp_r3_2 = toDobj->healthCnt; - if (temp_r3_2 != 0U) - { - toDobj->healthCnt = temp_r3_2 - 1; - if (toDobj->healthCnt != 0U) - { - temp_r4_3 = toDobj->hit_model; - if (temp_r4_3 != NULL) - { - SwapModel(toDobj, temp_r4_3); - } + if (s->healthCnt) { + s->healthCnt--; + if (s->healthCnt && s->hit_model) { + SwapModel(s, s->hit_model); } - if (toDobj->healthCnt == 0U) - { - zEntEvent(to, to, eEventDestroy); + if (s->healthCnt == 0) { + zEntEvent(s, s, eEventDestroy); } } break; case eEventSetUpdateDistance: - if ((xUpdateCullMgr*)globals.updateMgr != NULL) - { - temp_f1 = toParam[0]; - if (temp_f1 <= 0.0f) - { - xUpdateCull_SetCB(globals.updateMgr, to, xUpdateCull_AlwaysTrueCB, NULL); - } - else - { - sp8 = temp_f1 * temp_f1; - xUpdateCull_SetCB(globals.updateMgr, to, xUpdateCull_DistanceSquaredCB, &sp8); + if (globals.updateMgr) { + if (toParam[0] <= 0.0f) { + xUpdateCull_SetCB(globals.updateMgr, s, xUpdateCull_AlwaysTrueCB, NULL); + } else { + FloatAndVoid dist; + dist.f = SQR(toParam[0]); + xUpdateCull_SetCB(globals.updateMgr, s, xUpdateCull_DistanceSquaredCB, dist.v); } } break; case eEventHit_BubbleBounce: - zEntDestructObj_Hit((zEntDestructObj*)to, 0x2000U); + zEntDestructObj_Hit(s, 0x2000); break; case eEventHit_BubbleBash: - zEntDestructObj_Hit((zEntDestructObj*)to, 0x4000U); + zEntDestructObj_Hit(s, 0x4000); break; case eEventHit_PatrickSlam: - zEntDestructObj_Hit((zEntDestructObj*)to, 0x400U); + zEntDestructObj_Hit(s, 0x400); break; case eEventHit_Throw: - zEntDestructObj_Hit((zEntDestructObj*)to, 0x800U); + zEntDestructObj_Hit(s, 0x800); break; case eEventLaunchShrapnel: - zShrapnelAsset* shrapnelAsset = (zShrapnelAsset*)baseUnk3; - if (baseUnk3 != NULL) - { - temp_r12_3 = shrapnelAsset->initCB; - if (temp_r12_3 != NULL) - { - temp_r12_3(shrapnelAsset, toDobj->model, NULL, NULL); + if (toParamWidget) { + zShrapnelAsset* shrap = (zShrapnelAsset*)toParamWidget; + if (shrap->initCB) { + shrap->initCB(shrap, s->model, NULL, NULL); } } break; } - return eEventEnable; + + return 1; } From ad5127077d193d3ed3527e7c5493a75426a8026c Mon Sep 17 00:00:00 2001 From: Kevin <136357605+energydrink02@users.noreply.github.com> Date: Wed, 3 Dec 2025 00:07:32 +0100 Subject: [PATCH 2/2] zRumble: 100% and Link --- configure.py | 2 +- src/SB/Game/zRumble.cpp | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/configure.py b/configure.py index e76246a23..0af909f8e 100644 --- a/configure.py +++ b/configure.py @@ -511,7 +511,7 @@ def MatchingFor(*versions): Object(NonMatching, "SB/Game/zPlatform.cpp", extra_cflags=["-sym on"]), Object(Matching, "SB/Game/zPortal.cpp"), Object(Matching, "SB/Game/zRenderState.cpp"), - Object(Equivalent, "SB/Game/zRumble.cpp"), + Object(Matching, "SB/Game/zRumble.cpp"), Object(Equivalent, "SB/Game/zSaveLoad.cpp"), Object(NonMatching, "SB/Game/zScene.cpp"), Object(Matching, "SB/Game/zScript.cpp"), diff --git a/src/SB/Game/zRumble.cpp b/src/SB/Game/zRumble.cpp index 776b52f15..17590cf10 100644 --- a/src/SB/Game/zRumble.cpp +++ b/src/SB/Game/zRumble.cpp @@ -108,13 +108,10 @@ void zRumbleStartDistance(S32 pad_id, F32 real_dist, F32 max_dist, _tagRumbleTyp } } -// Equivalent: regalloc void zRumbleStartEntDistance(xEnt* ent, F32 dist, _tagRumbleType type, F32 maxTime) { - xVec3* ent_pos = xEntGetPos(ent); - xVec3* player_pos = xEntGetPos(&globals.player.ent); xVec3 ent_player_dist; - xVec3Sub(&ent_player_dist, player_pos, ent_pos); + xVec3Sub(&ent_player_dist, xEntGetPos(&globals.player.ent), xEntGetPos(ent)); zRumbleStartDistance(globals.currentActivePad, SQR(ent_player_dist.x) + SQR(ent_player_dist.z), SQR(dist), type, maxTime);