diff options
| author | Zelllll <56516451+Zelllll@users.noreply.github.com> | 2020-12-29 19:13:38 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-12-29 20:13:38 -0500 |
| commit | 8f3dc3db94bf684128f7006e61df7e12c2ec997a (patch) | |
| tree | d610439deaca3ccb09b65a4eaacbbf9210c8c692 /src | |
| parent | c71b8183ae637706ca3d7bbb707d82fc3ea878aa (diff) | |
Bg_Hidan_Kowarerukabe OK (#562)
* 10/12 functions decompiled and matched
* 12/12 matched
* file done
* kowarerukabe OK
* Update src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c
Co-authored-by: AdamKiddle <54328813+AdamKiddle@users.noreply.github.com>
* Update src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c
Co-authored-by: AdamKiddle <54328813+AdamKiddle@users.noreply.github.com>
* Update src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c
Co-authored-by: AdamKiddle <54328813+AdamKiddle@users.noreply.github.com>
* Update src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c
Co-authored-by: AdamKiddle <54328813+AdamKiddle@users.noreply.github.com>
* Update src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c
Co-authored-by: AdamKiddle <54328813+AdamKiddle@users.noreply.github.com>
* Update src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c
Co-authored-by: AdamKiddle <54328813+AdamKiddle@users.noreply.github.com>
* Update src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c
Co-authored-by: AdamKiddle <54328813+AdamKiddle@users.noreply.github.com>
* Update src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c
Co-authored-by: AdamKiddle <54328813+AdamKiddle@users.noreply.github.com>
* Update src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c
Co-authored-by: AdamKiddle <54328813+AdamKiddle@users.noreply.github.com>
* Update src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c
Co-authored-by: AdamKiddle <54328813+AdamKiddle@users.noreply.github.com>
* Update src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c
Co-authored-by: AdamKiddle <54328813+AdamKiddle@users.noreply.github.com>
* Update src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c
Co-authored-by: AdamKiddle <54328813+AdamKiddle@users.noreply.github.com>
* Update src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c
Co-authored-by: AdamKiddle <54328813+AdamKiddle@users.noreply.github.com>
* Update src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c
Co-authored-by: AdamKiddle <54328813+AdamKiddle@users.noreply.github.com>
* Update src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c
Co-authored-by: AdamKiddle <54328813+AdamKiddle@users.noreply.github.com>
* hopefully fixed build issue
* OK now
* Fix new math function names
Co-authored-by: Zelllll <elijah@DESKTOP-NMP1I89.localdomain>
Co-authored-by: AdamKiddle <54328813+AdamKiddle@users.noreply.github.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c | 299 | ||||
| -rw-r--r-- | src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.h | 5 |
2 files changed, 287 insertions, 17 deletions
diff --git a/src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c b/src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c index b8b3e054f..cae053a25 100644 --- a/src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c +++ b/src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c @@ -1,17 +1,29 @@ +/* + * File: z_bg_hidan_kowarerukabe.c + * Overlay: ovl_Bg_Hidan_Kowarerukabe + * Description: Fire Temple Bombable Walls and Floors + */ + #include "z_bg_hidan_kowarerukabe.h" +#include "overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.h" #define FLAGS 0x00000000 #define THIS ((BgHidanKowarerukabe*)thisx) +typedef enum { + /* 0 */ CRACKED_STONE_FLOOR, + /* 1 */ BOMBABLE_WALL, + /* 2 */ LARGE_BOMBABLE_WALL +} FireTempleBombableObjectsType; + void BgHidanKowarerukabe_Init(Actor* thisx, GlobalContext* globalCtx); void BgHidanKowarerukabe_Destroy(Actor* thisx, GlobalContext* globalCtx); void BgHidanKowarerukabe_Update(Actor* thisx, GlobalContext* globalCtx); void BgHidanKowarerukabe_Draw(Actor* thisx, GlobalContext* globalCtx); -extern UNK_TYPE D_05000530; +extern Gfx D_05000530[]; -/* const ActorInit Bg_Hidan_Kowarerukabe_InitVars = { ACTOR_BG_HIDAN_KOWARERUKABE, ACTORTYPE_BG, @@ -23,27 +35,284 @@ const ActorInit Bg_Hidan_Kowarerukabe_InitVars = { (ActorFunc)BgHidanKowarerukabe_Update, (ActorFunc)BgHidanKowarerukabe_Draw, }; -*/ -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/func_8088A020.s") -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/func_8088A0B8.s") +static Gfx* sBreakableWallDLists[] = { 0x0600B9C0, 0x0600C038, 0x0600B900 }; + +static ColliderJntSphItemInit sJntSphItemsInit[1] = { { + { 0x00, { 0x00000000, 0x00, 0x00 }, { 0x00000008, 0x00, 0x00 }, 0x00, 0x01, 0x00 }, + { 0, { { 0, 0, 0 }, 100 }, 100 }, +} }; + +static ColliderJntSphInit sJntSphInit = { + { COLTYPE_UNK10, 0x00, 0x09, 0x00, 0x00, COLSHAPE_JNTSPH }, + ARRAY_COUNT(sJntSphItemsInit), + sJntSphItemsInit, +}; + +void BgHidanKowarerukabe_InitDynaPoly(BgHidanKowarerukabe* this, GlobalContext* globalCtx) { + static ColHeader* collisionHeaders[] = { 0x0600D800, 0x0600D878, 0x0600D8F8 }; + s32 pad; + CollisionHeader* colHeader = NULL; + s32 pad2; + + if (collisionHeaders[this->dyna.actor.params & 0xFF] != NULL) { + DynaPolyInfo_SetActorMove(&this->dyna, 0); + DynaPolyInfo_Alloc(collisionHeaders[this->dyna.actor.params & 0xFF], &colHeader); + this->dyna.dynaPolyId = + DynaPolyInfo_RegisterActor(globalCtx, &globalCtx->colCtx.dyna, &this->dyna.actor, colHeader); + } else { + this->dyna.dynaPolyId = -1; + } +} + +void BgHidanKowarerukabe_InitColliderSphere(BgHidanKowarerukabe* this, GlobalContext* globalCtx) { + static s16 sphereRadii[] = { 80, 45, 80 }; + static s16 sphereYPositions[] = { 0, 500, 500 }; + s32 pad; + + Collider_InitJntSph(globalCtx, &this->collider); + Collider_SetJntSph(globalCtx, &this->collider, &this->dyna.actor, &sJntSphInit, this->colliderItems); + + this->collider.list[0].dim.modelSphere.radius = sphereRadii[this->dyna.actor.params & 0xFF]; + this->collider.list[0].dim.modelSphere.center.y = sphereYPositions[this->dyna.actor.params & 0xFF]; +} + +void BgHidanKowarerukabe_OffsetActorYPos(BgHidanKowarerukabe* this) { + static f32 actorYPosOffsets[] = { 0.7f, 0.0f, 0.0f }; + + this->dyna.actor.posRot.pos.y = + actorYPosOffsets[this->dyna.actor.params & 0xFF] + this->dyna.actor.initPosRot.pos.y; +} + +static InitChainEntry sInitChain[] = { + ICHAIN_F32(uncullZoneForward, 2000, ICHAIN_CONTINUE), + ICHAIN_F32(uncullZoneScale, 400, ICHAIN_CONTINUE), + ICHAIN_F32(uncullZoneDownward, 1000, ICHAIN_STOP), +}; + +void BgHidanKowarerukabe_Init(Actor* thisx, GlobalContext* globalCtx) { + BgHidanKowarerukabe* this = THIS; + + BgHidanKowarerukabe_InitDynaPoly(this, globalCtx); + + if (((this->dyna.actor.params & 0xFF) < CRACKED_STONE_FLOOR) || + ((this->dyna.actor.params & 0xFF) > LARGE_BOMBABLE_WALL)) { + // Translation: Error: Fire Temple Breakable Walls. arg_data I can't determine the (%s %d)(arg_data + // 0x%04x) + osSyncPrintf("Error : 炎の神殿 壊れる壁 の arg_data が判別出来ない(%s %d)(arg_data 0x%04x)\n", + "../z_bg_hidan_kowarerukabe.c", 254, this->dyna.actor.params); + Actor_Kill(&this->dyna.actor); + return; + } + + if (Flags_GetSwitch(globalCtx, (this->dyna.actor.params >> 8) & 0x3F)) { + Actor_Kill(&this->dyna.actor); + return; + } + + Actor_ProcessInitChain(&this->dyna.actor, sInitChain); + Actor_SetScale(&this->dyna.actor, 0.1f); + BgHidanKowarerukabe_InitColliderSphere(this, globalCtx); + BgHidanKowarerukabe_OffsetActorYPos(this); + // Translation: (fire walls, floors, destroyed by bombs)(arg_data 0x%04x) + osSyncPrintf("(hidan 爆弾で壊れる 壁 床)(arg_data 0x%04x)\n", this->dyna.actor.params); +} + +void BgHidanKowarerukabe_Destroy(Actor* thisx, GlobalContext* globalCtx) { + BgHidanKowarerukabe* this = THIS; + + DynaPolyInfo_Free(globalCtx, &globalCtx->colCtx.dyna, this->dyna.dynaPolyId); + Collider_DestroyJntSph(globalCtx, &this->collider); +} + +void BgHidanKowarerukabe_SpawnDust(BgHidanKowarerukabe* this, GlobalContext* globalCtx) { + s32 pad; + Vec3f pos; + + pos = this->dyna.actor.posRot.pos; + pos.y += 10.0f; + + func_80033480(globalCtx, &pos, 0.0f, 0, 600, 300, 1); + + pos.x = ((Rand_ZeroOne() - 0.5f) * 80.0f) + this->dyna.actor.posRot.pos.x; + pos.y = (Rand_ZeroOne() * 100.0f) + this->dyna.actor.posRot.pos.y; + pos.z = ((Rand_ZeroOne() - 0.5f) * 80.0f) + this->dyna.actor.posRot.pos.z; + + func_80033480(globalCtx, &pos, 100.0f, 4, 200, 250, 1); +} + +void BgHidanKowarerukabe_FloorBreak(BgHidanKowarerukabe* this, GlobalContext* globalCtx) { + s32 i; + s32 j; + Vec3f velocity; + Vec3f pos; + s16 arg5; + Actor* thisx = &this->dyna.actor; + f32 sin = Math_SinS(thisx->shape.rot.y); + f32 cos = Math_CosS(thisx->shape.rot.y); + f32 tmp1; + f32 tmp2; + s16 arg9; + + pos.y = thisx->posRot.pos.y + 10.0f; + + for (i = 0; i < 5; i++) { + for (j = 0; j < 5; j++) { + tmp1 = 24 * (i - 2); + tmp2 = 24 * (j - 2); + + pos.x = (tmp2 * sin) + (tmp1 * cos) + thisx->posRot.pos.x; + pos.z = (tmp2 * cos) - (tmp1 * sin) + thisx->posRot.pos.z; + + tmp1 = 8.0f * Rand_ZeroOne() * (i - 2); + tmp2 = 8.0f * Rand_ZeroOne() * (j - 2); + + velocity.x = (tmp2 * sin) + (tmp1 * cos); + velocity.y = 30.0f * Rand_ZeroOne(); + velocity.z = (tmp2 * cos) - (tmp1 * sin); + + arg9 = ((Rand_ZeroOne() - 0.5f) * 11.0f * 1.4f) + 11.0f; + + arg5 = (((i == 0) || (i == 4)) && ((j == 0) || (j == 4))) ? 65 : 64; + + EffectSsKakera_Spawn(globalCtx, &pos, &velocity, &thisx->posRot.pos, -550, arg5, 15, 15, 0, arg9, 2, 16, + 100, KAKERA_COLOR_NONE, OBJECT_GAMEPLAY_DANGEON_KEEP, D_05000530); + } + } +} + +void func_8088A67C(BgHidanKowarerukabe* this, GlobalContext* globalCtx) { + s32 i; + s32 j; + Vec3f velocity; + Vec3f pos; + s16 arg5; + Actor* thisx = &this->dyna.actor; + f32 sin = Math_SinS(thisx->shape.rot.y); + f32 cos = Math_CosS(thisx->shape.rot.y); + f32 tmp1; + f32 tmp2; + s16 arg9; + + for (i = 0; i < 5; i++) { + pos.y = (20 * i) + thisx->posRot.pos.y; + for (j = 0; j < 5; j++) { + tmp1 = 16 * (j - 2); + + pos.x = (tmp1 * cos) + thisx->posRot.pos.x; + pos.z = -(tmp1 * sin) + thisx->posRot.pos.z; + + tmp1 = 3.0f * Rand_ZeroOne() * (j - 2); + tmp2 = 6.0f * Rand_ZeroOne(); + + velocity.x = (tmp2 * sin) + (tmp1 * cos); + velocity.y = 18.0f * Rand_ZeroOne(); + velocity.z = (tmp2 * cos) - (tmp1 * sin); + + arg9 = ((Rand_ZeroOne() - 0.5f) * 11.0f * 1.4f) + 11.0f; + arg5 = (arg9 >= 15) ? 32 : 64; + + if (Rand_ZeroOne() < 5.0f) { + arg5 |= 1; + } + + EffectSsKakera_Spawn(globalCtx, &pos, &velocity, &thisx->posRot.pos, -540, arg5, 20, 20, 0, arg9, 2, 32, + 100, KAKERA_COLOR_NONE, OBJECT_GAMEPLAY_DANGEON_KEEP, D_05000530); + } + } +} + +void BgHidanKowarerukabe_LargeWallBreak(BgHidanKowarerukabe* this, GlobalContext* globalCtx) { + s32 i; + s32 j; + Vec3f velocity; + Vec3f pos; + s16 arg5; + Actor* thisx = &this->dyna.actor; + f32 sin = Math_SinS(thisx->shape.rot.y); + f32 cos = Math_CosS(thisx->shape.rot.y); + f32 tmp1; + f32 tmp2; + s16 arg9; + + for (i = 0; i < 5; i++) { + pos.y = (24 * i) + thisx->posRot.pos.y; + for (j = 0; j < 5; j++) { + tmp1 = 28 * (j - 2); + + pos.x = (tmp1 * cos) + thisx->posRot.pos.x; + pos.z = -(tmp1 * sin) + thisx->posRot.pos.z; + + tmp1 = 6.0f * Rand_ZeroOne() * (j - 2); + tmp2 = 6.0f * Rand_ZeroOne(); + + velocity.x = (tmp2 * sin) + (tmp1 * cos); + velocity.y = 34.0f * Rand_ZeroOne(); + velocity.z = (tmp2 * cos) - (tmp1 * sin); + + arg9 = ((Rand_ZeroOne() - 0.5f) * 14.0f * 1.6f) + 14.0f; + arg5 = (arg9 > 20) ? 32 : 64; + + if (Rand_ZeroOne() < 5.0f) { + arg5 |= 1; + } + + EffectSsKakera_Spawn(globalCtx, &pos, &velocity, &thisx->posRot, -650, arg5, 20, 20, 0, arg9, 2, 32, 100, + KAKERA_COLOR_NONE, OBJECT_GAMEPLAY_DANGEON_KEEP, D_05000530); + } + } +} + +void BgHidanKowarerukabe_Break(BgHidanKowarerukabe* this, GlobalContext* globalCtx) { + switch (this->dyna.actor.params & 0xFF) { + case CRACKED_STONE_FLOOR: + BgHidanKowarerukabe_FloorBreak(this, globalCtx); + break; + case BOMBABLE_WALL: + func_8088A67C(this, globalCtx); + break; + case LARGE_BOMBABLE_WALL: + BgHidanKowarerukabe_LargeWallBreak(this, globalCtx); + break; + } + + BgHidanKowarerukabe_SpawnDust(this, globalCtx); +} + +void BgHidanKowarerukabe_Update(Actor* thisx, GlobalContext* globalCtx) { + BgHidanKowarerukabe* this = THIS; + s32 pad; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/func_8088A150.s") + if (Actor_GetCollidedExplosive(globalCtx, &this->collider.base) != NULL) { + BgHidanKowarerukabe_Break(this, globalCtx); + Flags_SetSwitch(globalCtx, (this->dyna.actor.params >> 8) & 0x3F); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/BgHidanKowarerukabe_Init.s") + if ((this->dyna.actor.params & 0xFF) == 0) { + Audio_PlaySoundAtPosition(globalCtx, &this->dyna.actor.posRot.pos, 40, NA_SE_EV_EXPLOSION); + } else { + Audio_PlaySoundAtPosition(globalCtx, &this->dyna.actor.posRot.pos, 40, NA_SE_EV_WALL_BROKEN); + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/BgHidanKowarerukabe_Destroy.s") + func_80078884(NA_SE_SY_CORRECT_CHIME); + Actor_Kill(&this->dyna.actor); + return; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/func_8088A290.s") + CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/func_8088A3B0.s") +void BgHidanKowarerukabe_Draw(Actor* thisx, GlobalContext* globalCtx) { + BgHidanKowarerukabe* this = THIS; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/func_8088A67C.s") + OPEN_DISPS(globalCtx->state.gfxCtx, "../z_bg_hidan_kowarerukabe.c", 565); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/func_8088A914.s") + func_80093D18(globalCtx->state.gfxCtx); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/func_8088ABA0.s") + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_bg_hidan_kowarerukabe.c", 568), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, sBreakableWallDLists[this->dyna.actor.params & 0xFF]); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/BgHidanKowarerukabe_Update.s") + func_800628A4(0, &this->collider); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/BgHidanKowarerukabe_Draw.s") + CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_bg_hidan_kowarerukabe.c", 573); +} diff --git a/src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.h b/src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.h index 3fe350464..692fa4366 100644 --- a/src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.h +++ b/src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.h @@ -7,8 +7,9 @@ struct BgHidanKowarerukabe; typedef struct BgHidanKowarerukabe { - /* 0x0000 */ Actor actor; - /* 0x014C */ char unk_14C[0x78]; + /* 0x0000 */ DynaPolyActor dyna; + /* 0x0164 */ ColliderJntSph collider; + /* 0x0184 */ ColliderJntSphItem colliderItems[1]; } BgHidanKowarerukabe; // size = 0x01C4 extern const ActorInit Bg_Hidan_Kowarerukabe_InitVars; |
