summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorpetrie911 <69443847+petrie911@users.noreply.github.com>2020-12-29 12:35:01 -0600
committerGitHub <noreply@github.com>2020-12-29 13:35:01 -0500
commit94d51ce86f7a565eb98cee1827d01423d64030aa (patch)
tree50905a01c6278f54d32b75e9abc8a1d3102bdfcf /src
parent9fcf8a4430bba543563dc21a8181576595d2416b (diff)
Bg_Mizu_Bwall (#543)
* Darkmeiro decompilation Bg_Gnd_Darkmeiro decompiled, matched, and documented. * give this a shot * fix conflict * one more try * could be useful * whoops * ZAP2 stuff * ZAP why * ZAP again * bwall * cleanup Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
Diffstat (limited to 'src')
-rw-r--r--src/overlays/actors/ovl_Bg_Mizu_Bwall/z_bg_mizu_bwall.c445
-rw-r--r--src/overlays/actors/ovl_Bg_Mizu_Bwall/z_bg_mizu_bwall.h24
2 files changed, 455 insertions, 14 deletions
diff --git a/src/overlays/actors/ovl_Bg_Mizu_Bwall/z_bg_mizu_bwall.c b/src/overlays/actors/ovl_Bg_Mizu_Bwall/z_bg_mizu_bwall.c
index 7028abdae..03567683c 100644
--- a/src/overlays/actors/ovl_Bg_Mizu_Bwall/z_bg_mizu_bwall.c
+++ b/src/overlays/actors/ovl_Bg_Mizu_Bwall/z_bg_mizu_bwall.c
@@ -1,3 +1,9 @@
+/*
+ * File: z_bg_mizu_bwall.c
+ * Overlay: ovl_Bg_Mizu_Bwall
+ * Description: Water Temple bombable walls
+ */
+
#include "z_bg_mizu_bwall.h"
#define FLAGS 0x00000010
@@ -9,7 +15,10 @@ void BgMizuBwall_Destroy(Actor* thisx, GlobalContext* globalCtx);
void BgMizuBwall_Update(Actor* thisx, GlobalContext* globalCtx);
void BgMizuBwall_Draw(Actor* thisx, GlobalContext* globalCtx);
-/*
+void BgMizuBwall_Idle(BgMizuBwall* this, GlobalContext* globalCtx);
+void BgMizuBwall_Break(BgMizuBwall* this, GlobalContext* globalCtx);
+void BgMizuBwall_DoNothing(BgMizuBwall* this, GlobalContext* globalCtx);
+
const ActorInit Bg_Mizu_Bwall_InitVars = {
ACTOR_BG_MIZU_BWALL,
ACTORTYPE_BG,
@@ -21,23 +30,435 @@ const ActorInit Bg_Mizu_Bwall_InitVars = {
(ActorFunc)BgMizuBwall_Update,
(ActorFunc)BgMizuBwall_Draw,
};
-*/
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Mizu_Bwall/func_8089C480.s")
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Mizu_Bwall/BgMizuBwall_Init.s")
+static ColliderTrisItemInit sTrisElementInitFloor[2] = {
+ {
+ { 0x00, { 0x00000000, 0x00, 0x00 }, { 0x00000008, 0x00, 0x00 }, 0x00, 0x01, 0x00 },
+ { { { -40.0f, 0.0f, -40.0f }, { -40.0f, 0.0f, 40.0f }, { 40.0f, 0.0f, 40.0f } } },
+ },
+ {
+ { 0x00, { 0x00000000, 0x00, 0x00 }, { 0x00000008, 0x00, 0x00 }, 0x00, 0x01, 0x00 },
+ { { { -40.0f, 0.0f, -40.0f }, { 40.0f, 0.0f, 40.0f }, { 40.0f, 0.0f, -40.0f } } },
+ },
+};
+
+static ColliderTrisInit sTrisInitFloor = {
+ { COLTYPE_UNK10, 0x00, 0x09, 0x00, 0x00, COLSHAPE_TRIS },
+ 2,
+ sTrisElementInitFloor,
+};
+
+static ColliderTrisItemInit sTrisElementInitRutoWall[1] = {
+ {
+ { 0x00, { 0x00000000, 0x00, 0x00 }, { 0x00000008, 0x00, 0x00 }, 0x00, 0x01, 0x00 },
+ { { { 0.0f, 116.0f, 0.0f }, { 0.0f, 0.0f, 70.0f }, { 0.0f, 0.0f, -70.0f } } },
+ },
+};
+
+static ColliderTrisInit sTrisInitRutoWall = {
+ { COLTYPE_UNK10, 0x00, 0x09, 0x00, 0x00, COLSHAPE_TRIS },
+ 1,
+ sTrisElementInitRutoWall,
+};
+
+static ColliderTrisItemInit sTrisElementInitWall[2] = {
+ {
+ { 0x00, { 0x00000000, 0x00, 0x00 }, { 0x00000008, 0x00, 0x00 }, 0x00, 0x01, 0x00 },
+ { { { 0.0f, 120.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 60.0f, 0.0f, 0.0f } } },
+ },
+ {
+ { 0x00, { 0x00000000, 0x00, 0x00 }, { 0x00000008, 0x00, 0x00 }, 0x00, 0x01, 0x00 },
+ { { { 0.0f, 120.0f, 0.0f }, { 60.0f, 0.0f, 0.0f }, { 60.0f, 120.0f, 0.0f } } },
+ },
+};
+
+static ColliderTrisInit sTrisInitUnusedWall = {
+ { COLTYPE_UNK10, 0x00, 0x09, 0x00, 0x00, COLSHAPE_TRIS },
+ 2,
+ sTrisElementInitWall,
+};
+
+static ColliderTrisInit sTrisInitStingerWall = {
+ { COLTYPE_UNK10, 0x00, 0x09, 0x00, 0x00, COLSHAPE_TRIS },
+ 2,
+ sTrisElementInitWall,
+};
+
+static Gfx* sDLists[] = {
+ 0x06001A30, 0x06002390, 0x06001CD0, 0x06002090, 0x06001770,
+};
+static ColHeader* sColHeaders[] = {
+ 0x06001C58, 0x060025A4, 0x06001DE8, 0x06001DE8, 0x06001DE8,
+};
+
+static InitChainEntry D_8089D854[] = {
+ ICHAIN_F32(uncullZoneScale, 1500, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneDownward, 1100, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneForward, 1000, ICHAIN_CONTINUE),
+ ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_STOP),
+};
+
+void BgMizuBwall_RotateVec3f(Vec3f* out, Vec3f* in, f32 sin, f32 cos) {
+ out->x = (in->z * sin) + (in->x * cos);
+ out->y = in->y;
+ out->z = (in->z * cos) - (in->x * sin);
+}
+
+void BgMizuBwall_Init(Actor* thisx, GlobalContext* globalCtx) {
+ s32 pad;
+ BgMizuBwall* this = THIS;
+ ColHeader* colHeader = NULL;
+
+ Actor_ProcessInitChain(&this->dyna.actor, D_8089D854);
+ this->yRot = this->dyna.actor.posRot.pos.y;
+ this->dList = sDLists[(u16)this->dyna.actor.params & 0xF];
+ DynaPolyInfo_SetActorMove(&this->dyna, 1);
+ DynaPolyInfo_Alloc(sColHeaders[(u16)this->dyna.actor.params & 0xF], &colHeader);
+ this->dyna.dynaPolyId =
+ DynaPolyInfo_RegisterActor(globalCtx, &globalCtx->colCtx.dyna, &this->dyna.actor, colHeader);
+
+ switch ((u16)this->dyna.actor.params & 0xF) {
+ case MIZUBWALL_FLOOR:
+ if (Flags_GetSwitch(globalCtx, ((u16)this->dyna.actor.params >> 8) & 0x3F)) {
+ func_8003EBF8(globalCtx, &globalCtx->colCtx.dyna, this->dyna.dynaPolyId);
+ this->dList = NULL;
+ this->actionFunc = BgMizuBwall_DoNothing;
+ } else {
+ Collider_InitTris(globalCtx, &this->collider);
+ if (!Collider_SetTris(globalCtx, &this->collider, &this->dyna.actor, &sTrisInitFloor, this->elements)) {
+ osSyncPrintf("Error : コリジョンデータセット失敗(%s %d)(arg_data 0x%04x)\n", "../z_bg_mizu_bwall.c",
+ 484, this->dyna.actor.params);
+ Actor_Kill(&this->dyna.actor);
+ } else {
+ f32 sin = Math_SinS(this->dyna.actor.shape.rot.y);
+ f32 cos = Math_CosS(this->dyna.actor.shape.rot.y);
+ s32 i;
+ s32 j;
+ Vec3f offset;
+ Vec3f vtx[3];
+
+ for (i = 0; i < ARRAY_COUNT(sTrisElementInitFloor); i++) {
+ for (j = 0; j < 3; j++) {
+ offset.x = sTrisInitFloor.list[i].dim.vtx[j].x;
+ offset.y = sTrisInitFloor.list[i].dim.vtx[j].y;
+ offset.z = sTrisInitFloor.list[i].dim.vtx[j].z + 2.0f;
+ BgMizuBwall_RotateVec3f(&vtx[j], &offset, sin, cos);
+ vtx[j].x += this->dyna.actor.posRot.pos.x;
+ vtx[j].y += this->dyna.actor.posRot.pos.y;
+ vtx[j].z += this->dyna.actor.posRot.pos.z;
+ }
+ func_800627A0(&this->collider, i, &vtx[0], &vtx[1], &vtx[2]);
+ }
+ this->actionFunc = BgMizuBwall_Idle;
+ }
+ }
+ break;
+ case MIZUBWALL_RUTO_ROOM:
+ if (Flags_GetSwitch(globalCtx, ((u16)this->dyna.actor.params >> 8) & 0x3F)) {
+ func_8003EBF8(globalCtx, &globalCtx->colCtx.dyna, this->dyna.dynaPolyId);
+ this->dList = NULL;
+ this->actionFunc = BgMizuBwall_DoNothing;
+ } else {
+ Collider_InitTris(globalCtx, &this->collider);
+ if (!Collider_SetTris(globalCtx, &this->collider, &this->dyna.actor, &sTrisInitRutoWall,
+ this->elements)) {
+ osSyncPrintf("Error : コリジョンデータセット失敗(%s %d)(arg_data 0x%04x)\n", "../z_bg_mizu_bwall.c",
+ 558, this->dyna.actor.params);
+ Actor_Kill(&this->dyna.actor);
+ } else {
+ f32 sin = Math_SinS(this->dyna.actor.shape.rot.y);
+ f32 cos = Math_CosS(this->dyna.actor.shape.rot.y);
+ s32 i;
+ s32 j;
+ Vec3f offset;
+ Vec3f vtx[3];
+
+ for (i = 0; i < ARRAY_COUNT(sTrisElementInitRutoWall); i++) {
+ for (j = 0; j < 3; j++) {
+ offset.x = sTrisInitRutoWall.list[i].dim.vtx[j].x;
+ offset.y = sTrisInitRutoWall.list[i].dim.vtx[j].y;
+ offset.z = sTrisInitRutoWall.list[i].dim.vtx[j].z + 2.0f;
+ BgMizuBwall_RotateVec3f(&vtx[j], &offset, sin, cos);
+ vtx[j].x += this->dyna.actor.posRot.pos.x;
+ vtx[j].y += this->dyna.actor.posRot.pos.y;
+ vtx[j].z += this->dyna.actor.posRot.pos.z;
+ }
+ func_800627A0(&this->collider, i, &vtx[0], &vtx[1], &vtx[2]);
+ }
+ this->actionFunc = BgMizuBwall_Idle;
+ }
+ }
+ break;
+ case MIZUBWALL_UNUSED:
+ if (Flags_GetSwitch(globalCtx, ((u16)this->dyna.actor.params >> 8) & 0x3F)) {
+ func_8003EBF8(globalCtx, &globalCtx->colCtx.dyna, this->dyna.dynaPolyId);
+ this->dList = NULL;
+ this->actionFunc = BgMizuBwall_DoNothing;
+ } else {
+ Collider_InitTris(globalCtx, &this->collider);
+ if (!Collider_SetTris(globalCtx, &this->collider, &this->dyna.actor, &sTrisInitUnusedWall,
+ this->elements)) {
+ osSyncPrintf("Error : コリジョンデータセット失敗(%s %d)(arg_data 0x%04x)\n", "../z_bg_mizu_bwall.c",
+ 638, this->dyna.actor.params);
+ Actor_Kill(&this->dyna.actor);
+ } else {
+ f32 sin = Math_SinS(this->dyna.actor.shape.rot.y);
+ f32 cos = Math_CosS(this->dyna.actor.shape.rot.y);
+ s32 i;
+ s32 j;
+ Vec3f offset;
+ Vec3f vtx[3];
+
+ for (i = 0; i < ARRAY_COUNT(sTrisElementInitFloor); i++) {
+ for (j = 0; j < 3; j++) {
+ //! @bug This uses the wrong set of collision triangles, causing the collider to be
+ //! flat to the ground instead of vertical. It should use sTrisInitUnusedWall.
+ offset.x = sTrisInitFloor.list[i].dim.vtx[j].x;
+ offset.y = sTrisInitFloor.list[i].dim.vtx[j].y;
+ offset.z = sTrisInitFloor.list[i].dim.vtx[j].z;
+ BgMizuBwall_RotateVec3f(&vtx[j], &offset, sin, cos);
+ vtx[j].x += this->dyna.actor.posRot.pos.x;
+ vtx[j].y += this->dyna.actor.posRot.pos.y;
+ vtx[j].z += this->dyna.actor.posRot.pos.z;
+ }
+ func_800627A0(&this->collider, i, &vtx[0], &vtx[1], &vtx[2]);
+ }
+ this->actionFunc = BgMizuBwall_Idle;
+ }
+ }
+ break;
+ case MIZUBWALL_STINGER_ROOM_1:
+ if (Flags_GetSwitch(globalCtx, ((u16)this->dyna.actor.params >> 8) & 0x3F)) {
+ func_8003EBF8(globalCtx, &globalCtx->colCtx.dyna, this->dyna.dynaPolyId);
+ this->dList = NULL;
+ this->actionFunc = BgMizuBwall_DoNothing;
+ } else {
+ Collider_InitTris(globalCtx, &this->collider);
+ if (!Collider_SetTris(globalCtx, &this->collider, &this->dyna.actor, &sTrisInitStingerWall,
+ this->elements)) {
+ osSyncPrintf("Error : コリジョンデータセット失敗(%s %d)(arg_data 0x%04x)\n", "../z_bg_mizu_bwall.c",
+ 724, this->dyna.actor.params);
+ Actor_Kill(&this->dyna.actor);
+ } else {
+ f32 sin = Math_SinS(this->dyna.actor.shape.rot.y);
+ f32 cos = Math_CosS(this->dyna.actor.shape.rot.y);
+ s32 i;
+ s32 j;
+ Vec3f offset;
+ Vec3f vtx[3];
+
+ for (i = 0; i < ARRAY_COUNT(sTrisElementInitFloor); i++) {
+ for (j = 0; j < 3; j++) {
+ //! @bug This uses the wrong set of collision triangles, causing the collider to be
+ //! flat to the ground instead of vertical. It should use sTrisInitStingerWall.
+ offset.x = sTrisInitFloor.list[i].dim.vtx[j].x;
+ offset.y = sTrisInitFloor.list[i].dim.vtx[j].y;
+ offset.z = sTrisInitFloor.list[i].dim.vtx[j].z + 2.0f;
+ BgMizuBwall_RotateVec3f(&vtx[j], &offset, sin, cos);
+ vtx[j].x += this->dyna.actor.posRot.pos.x;
+ vtx[j].y += this->dyna.actor.posRot.pos.y;
+ vtx[j].z += this->dyna.actor.posRot.pos.z;
+ }
+ func_800627A0(&this->collider, i, &vtx[0], &vtx[1], &vtx[2]);
+ }
+ this->actionFunc = BgMizuBwall_Idle;
+ }
+ }
+ break;
+ case MIZUBWALL_STINGER_ROOM_2:
+ if (Flags_GetSwitch(globalCtx, ((u16)this->dyna.actor.params >> 8) & 0x3F)) {
+ func_8003EBF8(globalCtx, &globalCtx->colCtx.dyna, this->dyna.dynaPolyId);
+ this->dList = NULL;
+ this->actionFunc = BgMizuBwall_DoNothing;
+ } else {
+ Collider_InitTris(globalCtx, &this->collider);
+ if (!Collider_SetTris(globalCtx, &this->collider, &this->dyna.actor, &sTrisInitStingerWall,
+ this->elements)) {
+ osSyncPrintf("Error : コリジョンデータセット失敗(%s %d)(arg_data 0x%04x)\n", "../z_bg_mizu_bwall.c",
+ 798, this->dyna.actor.params);
+ Actor_Kill(&this->dyna.actor);
+ } else {
+ f32 sin = Math_SinS(this->dyna.actor.shape.rot.y);
+ f32 cos = Math_CosS(this->dyna.actor.shape.rot.y);
+ s32 i;
+ s32 j;
+ Vec3f offset;
+ Vec3f vtx[3];
+
+ for (i = 0; i < ARRAY_COUNT(sTrisElementInitFloor); i++) {
+ for (j = 0; j < 3; j++) {
+ //! @bug This uses the wrong set of collision triangles, causing the collider to be
+ //! flat to the ground instead of vertical. It should use sTrisInitStingerWall.
+ offset.x = sTrisInitFloor.list[i].dim.vtx[j].x;
+ offset.y = sTrisInitFloor.list[i].dim.vtx[j].y;
+ offset.z = sTrisInitFloor.list[i].dim.vtx[j].z + 2.0f;
+ BgMizuBwall_RotateVec3f(&vtx[j], &offset, sin, cos);
+ vtx[j].x += this->dyna.actor.posRot.pos.x;
+ vtx[j].y += this->dyna.actor.posRot.pos.y;
+ vtx[j].z += this->dyna.actor.posRot.pos.z;
+ }
+ func_800627A0(&this->collider, i, &vtx[0], &vtx[1], &vtx[2]);
+ }
+ this->actionFunc = BgMizuBwall_Idle;
+ }
+ }
+ break;
+ }
+}
+
+void BgMizuBwall_Destroy(Actor* thisx, GlobalContext* globalCtx) {
+ s32 pad;
+ BgMizuBwall* this = THIS;
+
+ DynaPolyInfo_Free(globalCtx, &globalCtx->colCtx.dyna, this->dyna.dynaPolyId);
+ Collider_DestroyTris(globalCtx, &this->collider);
+}
+
+void BgMizuBwall_SetAlpha(BgMizuBwall* this, GlobalContext* globalCtx) {
+ f32 waterLevel = globalCtx->colCtx.stat.colHeader->waterBoxes[2].ySurface;
+ s32 alphaMod;
+
+ if (globalCtx->colCtx.stat.colHeader->waterBoxes) {}
+
+ if (waterLevel < -15.0f) {
+ this->scrollAlpha1 = 255;
+ } else if (waterLevel < 445.0f) {
+ alphaMod = ((waterLevel - -15.0f) / (445.0f - -15.0f)) * 95.0f;
+ this->scrollAlpha1 = 255 - alphaMod;
+ } else {
+ this->scrollAlpha1 = 160;
+ }
+ if (waterLevel < 445.0f) {
+ this->scrollAlpha2 = 255;
+ } else if (waterLevel < 765.0f) {
+ alphaMod = ((waterLevel - 445.0f) / (765.0f - 445.0f)) * 95.0f;
+ this->scrollAlpha2 = 255 - alphaMod;
+ } else {
+ this->scrollAlpha2 = 160;
+ }
+ if (waterLevel < -835.0f) {
+ this->scrollAlpha3 = 255;
+ } else if (waterLevel < -15.0f) {
+ alphaMod = ((waterLevel - -835.0f) / (-15.0f - -835.0f)) * 95.0f;
+ this->scrollAlpha3 = 255 - alphaMod;
+ } else {
+ this->scrollAlpha3 = 160;
+ }
+ this->scrollAlpha4 = this->scrollAlpha3;
+}
+
+void BgMizuBwall_SpawnDebris(BgMizuBwall* this, GlobalContext* globalCtx) {
+ s32 i;
+ s32 pad;
+ s16 rand1;
+ s16 rand2;
+ Vec3f* thisPos = &this->dyna.actor.posRot.pos;
+ Vec3f debrisPos;
+ f32 tempx;
+ f32 tempz;
+ f32 sin = Math_SinS(this->dyna.actor.shape.rot.y);
+ f32 cos = Math_CosS(this->dyna.actor.shape.rot.y);
+ Vec3f debrisOffsets[15];
+
+ for (i = 0; i < ARRAY_COUNT(debrisOffsets); i++) {
+ switch ((u16)this->dyna.actor.params & 0xF) {
+ case MIZUBWALL_FLOOR:
+ debrisOffsets[i].x = (Rand_ZeroOne() * 80.0f) - 40.0f;
+ debrisOffsets[i].y = Rand_ZeroOne() * 0;
+ debrisOffsets[i].z = (Rand_ZeroOne() * 80.0f) - 40.0f;
+ break;
+ case MIZUBWALL_RUTO_ROOM:
+ debrisOffsets[i].x = Rand_ZeroOne() * 0;
+ debrisOffsets[i].y = Rand_ZeroOne() * 100.0f;
+ debrisOffsets[i].z = (Rand_ZeroOne() * 80.0f) - 40.0f;
+ break;
+ case MIZUBWALL_UNUSED:
+ case MIZUBWALL_STINGER_ROOM_1:
+ default:
+ debrisOffsets[i].x = (Rand_ZeroOne() * 120) - 60.0f;
+ debrisOffsets[i].y = Rand_ZeroOne() * 120;
+ debrisOffsets[i].z = Rand_ZeroOne() * 0;
+ break;
+ }
+ }
+
+ for (i = 0; i < ARRAY_COUNT(debrisOffsets); i++) {
+ tempx = debrisOffsets[i].x;
+ tempz = debrisOffsets[i].z;
+
+ debrisPos.x = thisPos->x + tempz * sin + tempx * cos;
+ debrisPos.y = thisPos->y + debrisOffsets[i].y;
+ debrisPos.z = thisPos->z + tempz * cos - tempx * sin;
+
+ rand1 = (s16)(Rand_ZeroOne() * 120.0f) + 20;
+ rand2 = (s16)(Rand_ZeroOne() * 240.0f) + 20;
+ func_80033480(globalCtx, &debrisPos, 50.0f, 2, rand1, rand2, 0);
+ Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_A_OBJ, debrisPos.x, debrisPos.y, debrisPos.z, 0, 0, 0,
+ 0xB);
+ }
+}
+
+void BgMizuBwall_Idle(BgMizuBwall* this, GlobalContext* globalCtx) {
+ BgMizuBwall_SetAlpha(this, globalCtx);
+ if (this->collider.base.acFlags & 2) {
+ this->collider.base.acFlags &= ~2;
+ Flags_SetSwitch(globalCtx, ((u16)this->dyna.actor.params >> 8) & 0x3F);
+ this->breakTimer = 1;
+ func_8003EBF8(globalCtx, &globalCtx->colCtx.dyna, this->dyna.dynaPolyId);
+ this->dList = NULL;
+ BgMizuBwall_SpawnDebris(this, globalCtx);
+ Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_WALL_BROKEN);
+ Audio_PlaySoundGeneral(NA_SE_SY_CORRECT_CHIME, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
+ this->actionFunc = BgMizuBwall_Break;
+ } else if (this->dyna.actor.xzDistFromLink < 600.0f) {
+ CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Mizu_Bwall/BgMizuBwall_Destroy.s")
+void BgMizuBwall_Break(BgMizuBwall* this, GlobalContext* globalCtx) {
+ if (this->breakTimer > 0) {
+ this->breakTimer--;
+ } else {
+ this->actionFunc = BgMizuBwall_DoNothing;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Mizu_Bwall/func_8089CE04.s")
+void BgMizuBwall_DoNothing(BgMizuBwall* this, GlobalContext* globalCtx) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Mizu_Bwall/func_8089CF84.s")
+void BgMizuBwall_Update(Actor* thisx, GlobalContext* globalCtx) {
+ s32 pad;
+ BgMizuBwall* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Mizu_Bwall/func_8089D258.s")
+ this->actionFunc(this, globalCtx);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Mizu_Bwall/func_8089D350.s")
+void BgMizuBwall_Draw(Actor* thisx, GlobalContext* globalCtx2) {
+ BgMizuBwall* this = THIS;
+ GlobalContext* globalCtx = globalCtx2;
+ u32 frames;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Mizu_Bwall/func_8089D37C.s")
+ OPEN_DISPS(globalCtx->state.gfxCtx, "../z_bg_mizu_bwall.c", 1095);
+ if (1) {}
+ frames = globalCtx->gameplayFrames;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Mizu_Bwall/BgMizuBwall_Update.s")
+ func_80093D18(globalCtx->state.gfxCtx);
+ gSPSegment(POLY_OPA_DISP++, 0x08,
+ Gfx_TwoTexScrollEnvColor(globalCtx->state.gfxCtx, 0, 1 * frames, 0, 0x20, 0x20, 1, 0, 0, 0x20, 0x20, 0,
+ 0, 0, this->scrollAlpha1));
+ gSPSegment(POLY_OPA_DISP++, 0x09,
+ Gfx_TwoTexScrollEnvColor(globalCtx->state.gfxCtx, 0, 1 * frames, 0, 0x20, 0x20, 1, 0, 0, 0x20, 0x20, 0,
+ 0, 0, this->scrollAlpha2));
+ gSPSegment(POLY_OPA_DISP++, 0x0A,
+ Gfx_TwoTexScrollEnvColor(globalCtx->state.gfxCtx, 0, 1 * frames, 0, 0x20, 0x20, 1, 0, 0, 0x20, 0x20, 0,
+ 0, 0, this->scrollAlpha3));
+ gSPSegment(POLY_OPA_DISP++, 0x0B,
+ Gfx_TwoTexScrollEnvColor(globalCtx->state.gfxCtx, 0, 3 * frames, 0, 0x20, 0x20, 1, 0, 0, 0x20, 0x20, 0,
+ 0, 0, this->scrollAlpha4));
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_bg_mizu_bwall.c", 1129), 2);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Mizu_Bwall/BgMizuBwall_Draw.s")
+ if (this->dList != NULL) {
+ gSPDisplayList(POLY_OPA_DISP++, this->dList);
+ }
+ CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_bg_mizu_bwall.c", 1136);
+}
diff --git a/src/overlays/actors/ovl_Bg_Mizu_Bwall/z_bg_mizu_bwall.h b/src/overlays/actors/ovl_Bg_Mizu_Bwall/z_bg_mizu_bwall.h
index b282ea36b..5814be594 100644
--- a/src/overlays/actors/ovl_Bg_Mizu_Bwall/z_bg_mizu_bwall.h
+++ b/src/overlays/actors/ovl_Bg_Mizu_Bwall/z_bg_mizu_bwall.h
@@ -6,11 +6,31 @@
struct BgMizuBwall;
+typedef void (*BgMizuBwallActionFunc)(struct BgMizuBwall*, GlobalContext*);
+
typedef struct BgMizuBwall {
- /* 0x0000 */ Actor actor;
- /* 0x014C */ char unk_14C[0x170];
+ /* 0x0000 */ DynaPolyActor dyna;
+ /* 0x0164 */ ColliderTris collider;
+ /* 0x0184 */ ColliderTrisItem elements[3]; // only ever uses 2
+ /* 0x0298 */ BgMizuBwallActionFunc actionFunc;
+ /* 0x029C */ f32 yRot;
+ /* 0x02A0 */ s32 scrollAlpha1;
+ /* 0x02A4 */ s32 scrollAlpha2;
+ /* 0x02A8 */ s32 scrollAlpha3;
+ /* 0x02AC */ s32 scrollAlpha4;
+ /* 0x02B0 */ s32 breakTimer;
+ /* 0x02B4 */ char unk_2B4[4];
+ /* 0x02B8 */ Gfx* dList;
} BgMizuBwall; // size = 0x02BC
+typedef enum {
+ MIZUBWALL_FLOOR,
+ MIZUBWALL_RUTO_ROOM,
+ MIZUBWALL_UNUSED,
+ MIZUBWALL_STINGER_ROOM_1,
+ MIZUBWALL_STINGER_ROOM_2
+} BgMizuBwallType;
+
extern const ActorInit Bg_Mizu_Bwall_InitVars;
#endif