diff options
| author | mnzlmstr <63561555+mnzlmstr@users.noreply.github.com> | 2020-12-30 17:36:17 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-12-30 11:36:17 -0500 |
| commit | 5a2bd7a035bfe718eaa34a1fcca76a87daae8644 (patch) | |
| tree | 92c0ec3f2977fae9b9563d9fca71cbea5221f728 /src | |
| parent | 257fc541958fd6e3e58e11a6e2ee653e7e6cc300 (diff) | |
z_bg_bombwall OK (#506)
* Update spec
remove z_bg_bombwall.o from spec
* Update z_bg_bombwall.h
updated actor struct
* Update z_bg_bombwall.c
* Delete BgBombwall_Destroy.s
no longer needed
* Delete BgBombwall_Draw.s
no longer needed
* Delete BgBombwall_Init.s
no longer needed
* Delete BgBombwall_Update.s
no longer needed
* Delete func_8086E7D0.s
no longer needed
* Delete func_8086E850.s
no longer needed
* Delete func_8086EAC0.s
no longer needed
* Delete func_8086EB5C.s
no longer needed
* Delete func_8086ED50.s
no longer needed
* Delete func_8086ED70.s
no longer needed
* Delete func_8086EDFC.s
no longer needed
* Delete func_8086EE40.s
no longer needed
* Delete func_8086EE94.s
no longer needed
* Update spec
update path to reloc
* Delete z_bg_bombwall.data.s
no longer needed
* Delete z_bg_bombwall.reloc.s
no longer needed
* Update spec
fix path to reloc of bombwall
* Update z_bg_bombwall.c
Co-authored-by: fig <fig02srl@gmail.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/overlays/actors/ovl_Bg_Bombwall/z_bg_bombwall.c | 229 | ||||
| -rw-r--r-- | src/overlays/actors/ovl_Bg_Bombwall/z_bg_bombwall.h | 8 |
2 files changed, 207 insertions, 30 deletions
diff --git a/src/overlays/actors/ovl_Bg_Bombwall/z_bg_bombwall.c b/src/overlays/actors/ovl_Bg_Bombwall/z_bg_bombwall.c index 2cec5ee7c..911e304cf 100644 --- a/src/overlays/actors/ovl_Bg_Bombwall/z_bg_bombwall.c +++ b/src/overlays/actors/ovl_Bg_Bombwall/z_bg_bombwall.c @@ -1,7 +1,7 @@ /* * File: z_bg_bombwall.c * Overlay: ovl_Bg_Bombwall - * Description: 2D Bombable Wall + * Description: Bombable Wall */ #include "z_bg_bombwall.h" @@ -15,16 +15,37 @@ void BgBombwall_Destroy(Actor* thisx, GlobalContext* globalCtx); void BgBombwall_Update(Actor* thisx, GlobalContext* globalCtx); void BgBombwall_Draw(Actor* thisx, GlobalContext* globalCtx); -void func_8086E7D0(BgBombwall* this, GlobalContext* globalCtx); -void func_8086EAC0(BgBombwall* this, GlobalContext* globalCtx); -void func_8086EB5C(BgBombwall* this, GlobalContext* globalCtx); void func_8086ED50(BgBombwall* this, GlobalContext* globalCtx); void func_8086ED70(BgBombwall* this, GlobalContext* globalCtx); void func_8086EDFC(BgBombwall* this, GlobalContext* globalCtx); void func_8086EE40(BgBombwall* this, GlobalContext* globalCtx); void func_8086EE94(BgBombwall* this, GlobalContext* globalCtx); -/* +extern CollisionHeader D_050041B0; +extern Gfx D_05003FC0[]; +extern Gfx D_05004088[]; + +static ColliderTrisItemInit sTrimItemInit[3] = { + { + { 0x00, { 0x00000000, 0x00, 0x00 }, { 0x40000048, 0x00, 0x00 }, 0x00, 0x01, 0x00 }, + { { { -70.0f, 176.0f, 0.0f }, { -70.0f, -4.0f, 0.0f }, { 0.0f, -4.0f, 30.0f } } }, + }, + { + { 0x00, { 0x00000000, 0x00, 0x00 }, { 0x40000048, 0x00, 0x00 }, 0x00, 0x01, 0x00 }, + { { { 70.0f, 176.0f, 0.0f }, { -70.0f, 176.0f, 0.0f }, { 0.0f, -4.0f, 30.0f } } }, + }, + { + { 0x00, { 0x00000000, 0x00, 0x00 }, { 0x40000048, 0x00, 0x00 }, 0x00, 0x01, 0x00 }, + { { { 70.0f, -4.0f, 0.0f }, { 70.0f, 176.0f, 0.0f }, { 0.0f, -4.0f, 30.0f } } }, + }, +}; + +static ColliderTrisInit sTrisInit = { + { COLTYPE_UNK10, 0x00, 0x09, 0x00, 0x00, COLSHAPE_TRIS }, + 3, + sTrimItemInit, +}; + const ActorInit Bg_Bombwall_InitVars = { ACTOR_BG_BOMBWALL, ACTORTYPE_BG, @@ -36,29 +57,181 @@ const ActorInit Bg_Bombwall_InitVars = { (ActorFunc)BgBombwall_Update, (ActorFunc)BgBombwall_Draw, }; -*/ -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Bombwall/func_8086E7D0.s") - -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Bombwall/func_8086E850.s") - -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Bombwall/BgBombwall_Init.s") - -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Bombwall/func_8086EAC0.s") -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Bombwall/BgBombwall_Destroy.s") - -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Bombwall/func_8086EB5C.s") - -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Bombwall/func_8086ED50.s") - -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Bombwall/func_8086ED70.s") - -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Bombwall/func_8086EDFC.s") - -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Bombwall/func_8086EE40.s") - -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Bombwall/func_8086EE94.s") +void BgBombwall_InitDynapoly(BgBombwall* this, GlobalContext* globalCtx) { + s32 pad; + s32 pad2; + ColHeader* colHeader = NULL; + + DynaPolyInfo_SetActorMove(&this->dyna, 0); + DynaPolyInfo_Alloc(&D_050041B0, &colHeader); + this->dyna.dynaPolyId = + DynaPolyInfo_RegisterActor(globalCtx, &globalCtx->colCtx.dyna, &this->dyna.actor, colHeader); + + if (this->dyna.dynaPolyId == 0x32) { + // Warning : move BG login failed + osSyncPrintf("Warning : move BG 登録失敗(%s %d)(arg_data 0x%04x)\n", "../z_bg_bombwall.c", 243, + this->dyna.actor.params); + } +} + +void BgBombwall_RotateVec(Vec3f* arg0, Vec3f* arg1, f32 arg2, f32 arg3) { + arg0->x = (arg1->z * arg2) + (arg1->x * arg3); + arg0->y = arg1->y; + arg0->z = (arg1->z * arg3) - (arg1->x * arg2); +} + +static InitChainEntry sInitChain[] = { + ICHAIN_F32(uncullZoneForward, 1800, ICHAIN_CONTINUE), + ICHAIN_F32(uncullZoneScale, 300, ICHAIN_CONTINUE), + ICHAIN_F32(uncullZoneDownward, 1000, ICHAIN_STOP), +}; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Bombwall/BgBombwall_Update.s") +void BgBombwall_Init(Actor* thisx, GlobalContext* globalCtx) { + s32 i; + s32 j; + Vec3f vecs[3]; + Vec3f sp80; + s32 pad; + BgBombwall* this = THIS; + f32 sin = Math_SinS(this->dyna.actor.shape.rot.y); + f32 cos = Math_CosS(this->dyna.actor.shape.rot.y); + + Actor_ProcessInitChain(&this->dyna.actor, sInitChain); + Actor_SetScale(&this->dyna.actor, 0.1f); + + if (Flags_GetSwitch(globalCtx, this->dyna.actor.params & 0x3F)) { + func_8086EE94(this, globalCtx); + } else { + BgBombwall_InitDynapoly(this, globalCtx); + this->unk_2A2 |= 2; + Collider_InitTris(globalCtx, &this->collider); + Collider_SetTris(globalCtx, &this->collider, &this->dyna.actor, &sTrisInit, this->colliderItems); + + for (i = 0; i <= 2; i++) { + for (j = 0; j <= 2; j++) { + sp80.x = sTrisInit.list[i].dim.vtx[j].x; + sp80.y = sTrisInit.list[i].dim.vtx[j].y; + sp80.z = sTrisInit.list[i].dim.vtx[j].z + 2.0f; + + BgBombwall_RotateVec(&vecs[j], &sp80, sin, cos); + + vecs[j].x += this->dyna.actor.posRot.pos.x; + vecs[j].y += this->dyna.actor.posRot.pos.y; + vecs[j].z += this->dyna.actor.posRot.pos.z; + } + func_800627A0(&this->collider, i, &vecs[0], &vecs[1], &vecs[2]); + } + + this->unk_2A2 |= 1; + func_8086ED50(this, globalCtx); + } + + osSyncPrintf("(field keep 汎用爆弾壁)(arg_data 0x%04x)(angY %d)\n", this->dyna.actor.params, + this->dyna.actor.shape.rot.y); +} + +void BgBombwall_DestroyCollision(BgBombwall* this, GlobalContext* globalCtx) { + if (this->unk_2A2 & 2) { + DynaPolyInfo_Free(globalCtx, &globalCtx->colCtx.dyna, this->dyna.dynaPolyId); + this->unk_2A2 &= ~2; + } + + if (this->unk_2A2 & 1) { + Collider_DestroyTris(globalCtx, &this->collider); + this->unk_2A2 &= ~1; + } +} + +void BgBombwall_Destroy(Actor* thisx, GlobalContext* globalCtx) { + BgBombwall* this = THIS; + + BgBombwall_DestroyCollision(this, globalCtx); +} + +Vec3s D_8086F010[] = { + { 40, 85, 21 }, { -43, 107, 14 }, { -1, 142, 14 }, { -27, 44, 27 }, { 28, 24, 20 }, { -39, 54, 21 }, { 49, 50, 20 }, +}; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Bombwall/BgBombwall_Draw.s") +void func_8086EB5C(BgBombwall* this, GlobalContext* globalCtx) { + s16 rand; + s16 rand2; + Vec3f sp88; + s32 i; + f32 sin = Math_SinS(this->dyna.actor.shape.rot.y); + f32 cos = Math_CosS(this->dyna.actor.shape.rot.y); + Vec3f* pos = &this->dyna.actor.posRot.pos; + f32 temp; + f32 new_var; + + for (i = 0; i < 7; i++) { + new_var = D_8086F010[i].x; + temp = new_var * cos; + sp88.x = ((sin * D_8086F010[i].z) + ((f32)temp)) + pos->x; + sp88.y = pos->y + D_8086F010[i].y; + sp88.z = ((D_8086F010[i].z * cos) - (sin * D_8086F010[i].x)) + pos->z; + rand = ((s16)(Rand_ZeroOne() * 120.0f)) + 0x14; + rand2 = ((s16)(Rand_ZeroOne() * 240.0f)) + 0x14; + func_80033480(globalCtx, &sp88, 50.0f, 2, rand, rand2, 1); + } + + sp88.x = pos->x; + new_var = pos->y + 90.0f; + sp88.y = pos->y + 90.0f; + sp88.z = pos->z + 15.0f; + func_80033480(globalCtx, &sp88, 40.0f, 4, 0xA, 0x32, 1); +} + +void func_8086ED50(BgBombwall* this, GlobalContext* globalCtx) { + this->dList = D_05003FC0; + this->actionFunc = func_8086ED70; +} + +void func_8086ED70(BgBombwall* this, GlobalContext* globalCtx) { + if (this->collider.base.acFlags & 2) { + this->collider.base.acFlags &= ~2; + func_8086EDFC(this, globalCtx); + Flags_SetSwitch(globalCtx, this->dyna.actor.params & 0x3F); + } else if (this->dyna.actor.xzDistFromLink < 600.0f) { + CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base); + } +} + +void func_8086EDFC(BgBombwall* this, GlobalContext* globalCtx) { + this->dList = D_05003FC0; + this->unk_2A0 = 1; + func_8086EB5C(this, globalCtx); + this->actionFunc = func_8086EE40; +} + +void func_8086EE40(BgBombwall* this, GlobalContext* globalCtx) { + if (this->unk_2A0 > 0) { + this->unk_2A0--; + } else { + func_8086EE94(this, globalCtx); + + if (((this->dyna.actor.params >> 0xF) & 1) != 0) { + func_80078884(NA_SE_SY_CORRECT_CHIME); + } + } +} + +void func_8086EE94(BgBombwall* this, GlobalContext* globalCtx) { + this->dList = D_05004088; + BgBombwall_DestroyCollision(this, globalCtx); + this->actionFunc = NULL; +} + +void BgBombwall_Update(Actor* thisx, GlobalContext* globalCtx) { + BgBombwall* this = THIS; + + if (this->actionFunc != NULL) { + this->actionFunc(this, globalCtx); + } +} + +void BgBombwall_Draw(Actor* thisx, GlobalContext* globalCtx) { + BgBombwall* this = THIS; + + Gfx_DrawDListOpa(globalCtx, this->dList); +} diff --git a/src/overlays/actors/ovl_Bg_Bombwall/z_bg_bombwall.h b/src/overlays/actors/ovl_Bg_Bombwall/z_bg_bombwall.h index 92348d235..e375f579f 100644 --- a/src/overlays/actors/ovl_Bg_Bombwall/z_bg_bombwall.h +++ b/src/overlays/actors/ovl_Bg_Bombwall/z_bg_bombwall.h @@ -10,9 +10,13 @@ typedef void (*BgBombwallActionFunc)(struct BgBombwall*, GlobalContext*); typedef struct BgBombwall { /* 0x0000 */ DynaPolyActor dyna; - /* 0x0164 */ char unk_164[0x134]; + /* 0x0164 */ ColliderTris collider; + /* 0x0184 */ ColliderTrisItem colliderItems[3]; /* 0x0298 */ BgBombwallActionFunc actionFunc; - /* 0x029C */ char unk_29C[0x8]; + /* 0x029C */ Gfx* dList; + /* 0x02A0 */ s16 unk_2A0; + /* 0x02A2 */ u8 unk_2A2; + /* 0x02A3 */ u8 unk_2A3; } BgBombwall; // size = 0x02A4 extern const ActorInit Bg_Bombwall_InitVars; |
