summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorfig02 <fig02srl@gmail.com>2020-04-02 12:15:38 -0400
committerGitHub <noreply@github.com>2020-04-02 12:15:38 -0400
commit999044cdcd5bbcefddd4b3d13e0f64e2a788e704 (patch)
treebe042353caba14dd78c84d79441b048f1e7f6942 /src
parent3f6350afc0c153323b9647d70f90c052f865092d (diff)
parenta62877a5438164358e747796052ed928eca7e2d6 (diff)
Merge pull request #45 from zelda2773/master
Decompiled ovl_Obj_Comb
Diffstat (limited to 'src')
-rw-r--r--src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c189
-rw-r--r--src/overlays/actors/ovl_Obj_Comb/z_obj_comb.h9
2 files changed, 187 insertions, 11 deletions
diff --git a/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c b/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c
index 38099bca4..8fc88f2d7 100644
--- a/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c
+++ b/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c
@@ -1,3 +1,9 @@
+/*
+ * File: z_obj_comb.c
+ * Overlay: ovl_Obj_Comb
+ * Description: Beehive
+ */
+
#include "z_obj_comb.h"
#define ROOM 0x00
@@ -8,7 +14,11 @@ void ObjComb_Destroy(ObjComb* this, GlobalContext* globalCtx);
void ObjComb_Update(ObjComb* this, GlobalContext* globalCtx);
void ObjComb_Draw(ObjComb* this, GlobalContext* globalCtx);
-/*
+void ObjComb_Break(ObjComb* this, GlobalContext* globalCtx);
+void ObjComb_ChooseItemDrop(ObjComb* this, GlobalContext* globalCtx);
+void ObjComb_SetWait(ObjComb* this);
+void ObjComb_Wait(ObjComb* this, GlobalContext* globalCtx);
+
const ActorInit Obj_Comb_InitVars = {
ACTOR_OBJ_COMB,
ACTORTYPE_PROP,
@@ -21,19 +31,178 @@ const ActorInit Obj_Comb_InitVars = {
(ActorFunc)ObjComb_Update,
(ActorFunc)ObjComb_Draw,
};
-*/
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Comb/func_80B91B60.s")
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Comb/func_80B91E4C.s")
+UNK_TYPE D_80B922E0[] = {
+ 0x00000000, 0x00000000, 0x00000000, 0x4001FFFE, 0x00000000, 0x00010100, 0x00000000, 0x00000000, 0x000F0064,
+};
+
+UNK_TYPE D_80B92304[] = {
+ 0x0A000909,
+ 0x20000000,
+ 0x00000001,
+ &D_80B922E0,
+};
+
+static InitChainEntry initChain[] = {
+ ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_CONTINUE),
+ ICHAIN_F32(unk_F4, 1100, ICHAIN_CONTINUE),
+ ICHAIN_F32(unk_F8, 100, ICHAIN_CONTINUE),
+ ICHAIN_F32(unk_FC, 900, ICHAIN_STOP),
+};
+
+extern UNK_TYPE D_050095B0;
+extern UNK_TYPE D_05009940;
+
+void ObjComb_Break(ObjComb* this, GlobalContext* globalCtx) {
+ Vec3f pos1;
+ Vec3f posSum;
+ Vec3f pos2;
+ Gfx** dlist = &D_05009940;
+ s16 scale;
+ s16 angle = 0;
+ s16 gravityInfluence;
+ u8 u0;
+ u8 rotSpeed;
+ f32 rand1;
+ f32 rand2;
+ s32 i;
+
+ for (i = 0; i < 31; i++) {
+ angle += 20000;
+ rand1 = Math_Rand_ZeroOne() * 10.0f;
+
+ pos1.x = Math_Sins(angle) * rand1;
+ pos1.y = (i - 15) * 0.7f;
+ pos1.z = Math_Coss(angle) * rand1;
+
+ Math_Vec3f_Sum(&pos1, &this->actor.posRot.pos, &posSum);
+
+ pos2.x = (Math_Rand_ZeroOne() - 0.5f) + pos1.x * 0.5f;
+ pos2.y = (Math_Rand_ZeroOne() - 0.5f) + pos1.y * 0.6f;
+ pos2.z = (Math_Rand_ZeroOne() - 0.5f) + pos1.z * 0.5f;
+
+ scale = Math_Rand_ZeroOne() * 72.0f + 25.0f;
+ if (scale < 40) {
+ gravityInfluence = -200;
+ rotSpeed = 40;
+ } else if (scale < 70) {
+ gravityInfluence = -280;
+ rotSpeed = 30;
+ } else {
+ gravityInfluence = -340;
+ rotSpeed = 20;
+ }
+
+ rand2 = Math_Rand_ZeroOne();
+ if (rand2 < 0.1f) {
+ u0 = 96;
+ } else if (rand2 < 0.8f) {
+ u0 = 64;
+ } else {
+ u0 = 32;
+ }
+ Effect_SpawnFragment(globalCtx, &posSum, &pos2, &posSum, gravityInfluence, u0, rotSpeed, 4, 0, scale, 0, 0, 80,
+ -1, 2, dlist);
+ }
+
+ posSum.x = this->actor.posRot.pos.x;
+ posSum.y = this->actor.posRot.pos.y - 10.0f;
+ posSum.z = this->actor.posRot.pos.z;
+ func_80033480(globalCtx, &posSum, 40.0f, 6, 70, 60, 1);
+}
+
+void ObjComb_ChooseItemDrop(ObjComb* this, GlobalContext* globalCtx) {
+ s16 params = this->actor.params & 0x1F;
+
+ if ((params > 0) || (params < 0x1A)) {
+ if (params == 6) {
+ if (Flags_GetCollectible(globalCtx, (this->actor.params >> 8) & 0x3F)) {
+ params = -1;
+ } else {
+ params = (params | (((this->actor.params >> 8) & 0x3F) << 8));
+ }
+ } else if (Math_Rand_ZeroOne() < 0.5f) {
+ params = -1;
+ }
+ if (params >= 0) {
+ Item_DropCollectible(globalCtx, &this->actor.posRot, params);
+ }
+ }
+}
+
+void ObjComb_Init(ObjComb* this, GlobalContext* globalCtx) {
+ s32 pad;
+
+ Actor_ProcessInitChain(&this->actor, &initChain);
+ func_8005BBF8(globalCtx, &this->collider);
+ func_8005C050(globalCtx, &this->collider, this, &D_80B92304, &this->colliderBody);
+ ObjComb_SetWait(this);
+}
+
+void ObjComb_Destroy(ObjComb* this, GlobalContext* globalCtx) {
+ func_8005BCC8(globalCtx, &this->collider);
+}
+
+void ObjComb_SetWait(ObjComb* this) {
+ this->actionFunc = ObjComb_Wait;
+}
+
+void ObjComb_Wait(ObjComb* this, GlobalContext* globalCtx) {
+ s32 toucherFlags;
+
+ this->unk_1B0 -= 50;
+ if (this->unk_1B0 < 0) {
+ this->unk_1B0 = 0;
+ }
+
+ if ((this->collider.collideFlags & 0x2) != 0) {
+ this->collider.collideFlags &= ~0x2;
+ toucherFlags = this->colliderBodyPtr->colliding->toucher.flags;
+ if (toucherFlags & 0x4001F866) {
+ this->unk_1B0 = 1500;
+ } else {
+ ObjComb_Break(this, globalCtx);
+ ObjComb_ChooseItemDrop(this, globalCtx);
+ Actor_Kill(this);
+ }
+ } else {
+ Actor_CollisionCheck_SetAC(globalCtx, &globalCtx->sub_11E60, &this->collider);
+ }
+
+ if (this->actor.update != NULL) {
+ Actor_CollisionCheck_SetOT(globalCtx, &globalCtx->sub_11E60, &this->collider);
+ }
+}
+
+void ObjComb_Update(ObjComb* this, GlobalContext* globalCtx) {
+ this->unk_1B2 += 12000;
+ this->actionFunc(&this->actor, globalCtx);
+ this->actor.shape.rot.x = Math_Sins(this->unk_1B2) * this->unk_1B0 + this->actor.initPosRot.rot.x;
+}
+
+void ObjComb_Draw(ObjComb* this, GlobalContext* globalCtx) {
+ s32 pad;
+ GraphicsContext* gfxCtx;
+ Gfx* gfxArr[4];
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Comb/ObjComb_Init.s")
+ gfxCtx = globalCtx->state.gfxCtx;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Comb/ObjComb_Destroy.s")
+ func_800C6AC4(gfxArr, globalCtx->state.gfxCtx, "../z_obj_comb.c", 369);
+ func_80093D18(globalCtx->state.gfxCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Comb/func_80B91FB0.s")
+ Matrix_Translate(this->actor.posRot.pos.x, this->actor.posRot.pos.y + (118.0f * this->actor.scale.y),
+ this->actor.posRot.pos.z, 0);
+ Matrix_RotateY(this->actor.shape.rot.y * 0.0000958738f, 1);
+ Matrix_RotateX(this->actor.shape.rot.x * 0.0000958738f, 1);
+ Matrix_RotateZ(this->actor.shape.rot.z * 0.0000958738f, 1);
+ Matrix_Translate(0, -(this->actor.scale.y * 118.0f), 0, 1);
+ Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, 1);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Comb/func_80B91FC0.s")
+ gSPMatrix(gfxCtx->polyOpa.p++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_obj_comb.c", 394),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Comb/ObjComb_Update.s")
+ gSPDisplayList(gfxCtx->polyOpa.p++, &D_050095B0);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Comb/ObjComb_Draw.s")
+ func_800628A4(0, &this->collider);
+ func_800C6B54(gfxArr, globalCtx->state.gfxCtx, "../z_obj_comb.c", 402);
+}
diff --git a/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.h b/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.h
index 650ad1e26..fcd17464c 100644
--- a/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.h
+++ b/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.h
@@ -6,7 +6,14 @@
typedef struct {
/* 0x0000 */ Actor actor;
- /* 0x014C */ char unk_14C[0x68];
+ /* 0x014C */ ActorFunc actionFunc;
+ /* 0x0150 */ Collider collider;
+ /* 0x0168 */ char unk_168[0x4];
+ /* 0x016C */ ColliderBody* colliderBodyPtr;
+ /* 0x0170 */ ColliderBody colliderBody;
+ /* 0x0198 */ char unk_198[0x18];
+ /* 0x01B0 */ s16 unk_1B0;
+ /* 0x01B2 */ s16 unk_1B2;
} ObjComb; // size = 0x01B4
extern const ActorInit Obj_Comb_InitVars;