summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorZelllll <56516451+Zelllll@users.noreply.github.com>2020-12-29 19:13:38 -0600
committerGitHub <noreply@github.com>2020-12-29 20:13:38 -0500
commit8f3dc3db94bf684128f7006e61df7e12c2ec997a (patch)
treed610439deaca3ccb09b65a4eaacbbf9210c8c692 /src
parentc71b8183ae637706ca3d7bbb707d82fc3ea878aa (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.c299
-rw-r--r--src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.h5
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;