summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTharo <17233964+Thar0@users.noreply.github.com>2020-06-07 15:54:44 +0100
committerGitHub <noreply@github.com>2020-06-07 10:54:44 -0400
commitb2df45ae06ddd4f25e83181f18725aef27e3377e (patch)
tree28ab1592ddbf4aab15683ce6ceb283967e4bfa3f /src
parentd7c9d8d86ffb50fd8b7812b2e76cd54012c6660c (diff)
Decompile ovl_Bg_Spot16_Doughnut (#187)
* Decompile ovl_Bg_Spot16_Doughnut * Ran formatter * Shorten float values Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com> * Fix last float values * Rename Update2 and Draw2 Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com>
Diffstat (limited to 'src')
-rw-r--r--src/overlays/actors/ovl_Bg_Spot16_Doughnut/z_bg_spot16_doughnut.c146
-rw-r--r--src/overlays/actors/ovl_Bg_Spot16_Doughnut/z_bg_spot16_doughnut.h4
2 files changed, 141 insertions, 9 deletions
diff --git a/src/overlays/actors/ovl_Bg_Spot16_Doughnut/z_bg_spot16_doughnut.c b/src/overlays/actors/ovl_Bg_Spot16_Doughnut/z_bg_spot16_doughnut.c
index 773c6ceca..996d29a83 100644
--- a/src/overlays/actors/ovl_Bg_Spot16_Doughnut/z_bg_spot16_doughnut.c
+++ b/src/overlays/actors/ovl_Bg_Spot16_Doughnut/z_bg_spot16_doughnut.c
@@ -1,4 +1,11 @@
+/*
+ * File: z_bg_spot16_doughnut.c
+ * Overlay: ovl_Bg_Spot16_Doughnut
+ * Description: Death Mountain cloud circle
+ */
+
#include "z_bg_spot16_doughnut.h"
+#include <vt.h>
#define FLAGS 0x00000000
@@ -9,7 +16,9 @@ void BgSpot16Doughnut_Destroy(Actor* thisx, GlobalContext* globalCtx);
void BgSpot16Doughnut_Update(Actor* thisx, GlobalContext* globalCtx);
void BgSpot16Doughnut_Draw(Actor* thisx, GlobalContext* globalCtx);
-/*
+void BgSpot16Doughnut_UpdateExpanding(Actor* thisx, GlobalContext* globalCtx);
+void BgSpot16Doughnut_DrawExpanding(Actor* thisx, GlobalContext* globalCtx);
+
const ActorInit Bg_Spot16_Doughnut_InitVars = {
ACTOR_BG_SPOT16_DOUGHNUT,
ACTORTYPE_PROP,
@@ -21,15 +30,136 @@ const ActorInit Bg_Spot16_Doughnut_InitVars = {
(ActorFunc)BgSpot16Doughnut_Update,
(ActorFunc)BgSpot16Doughnut_Draw,
};
-*/
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot16_Doughnut/BgSpot16Doughnut_Init.s")
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot16_Doughnut/BgSpot16Doughnut_Destroy.s")
+static InitChainEntry sInitChain[] = {
+ ICHAIN_F32(unk_F4, 5500, ICHAIN_CONTINUE),
+ ICHAIN_F32(unk_F8, 5000, ICHAIN_CONTINUE),
+ ICHAIN_F32(unk_FC, 5000, ICHAIN_STOP),
+};
+
+static s16 sScales[] = {
+ 0, 0, 70, 210, 300,
+};
+
+extern Gfx D_06000660[];
+extern Gfx D_06000FC0[];
+
+void BgSpot16Doughnut_Init(Actor* thisx, GlobalContext* globalCtx) {
+ BgSpot16Doughnut* this = THIS;
+ s32 params;
+
+ Actor_ProcessInitChain(&this->actor, sInitChain);
+ Actor_SetScale(&this->actor, 0.1f);
+ this->fireFlag = 0;
+ this->envColorAlpha = 0xFF;
+ params = this->actor.params;
+ if (params == 1 || params == 2 || params == 3 || params == 4) {
+ Actor_SetScale(&this->actor, sScales[this->actor.params] * 1.0e-4f);
+ this->actor.draw = BgSpot16Doughnut_DrawExpanding;
+ this->actor.update = BgSpot16Doughnut_UpdateExpanding;
+ } else {
+ // Scales this actor for scenes where it is featured in the background,
+ // Death Mountain itself falls into the default case.
+ switch (globalCtx->sceneNum) {
+ case SCENE_SPOT01:
+ Actor_SetScale(&this->actor, 0.04f);
+ break;
+ case SCENE_SHRINE:
+ case SCENE_SHRINE_N:
+ case SCENE_SHRINE_R:
+ Actor_SetScale(&this->actor, 0.018f);
+ break;
+ default:
+ Actor_SetScale(&this->actor, 0.1f);
+ break;
+ }
+ osSyncPrintf(VT_FGCOL(CYAN) "%f" VT_RST "\n", this->actor.scale.x);
+ if (LINK_IS_CHILD || gSaveContext.eventChkInf[2] & 0x8000) {
+ this->fireFlag &= ~1;
+ } else {
+ this->fireFlag |= 1;
+ }
+ osSyncPrintf("(spot16 ドーナツ雲)(arg_data 0x%04x)\n", this->actor.params);
+ }
+}
+
+void BgSpot16Doughnut_Destroy(Actor* thisx, GlobalContext* globalCtx) {
+}
+
+void BgSpot16Doughnut_Update(Actor* thisx, GlobalContext* globalCtx) {
+ BgSpot16Doughnut* this = THIS;
+
+ if (!(this->fireFlag & 1)) {
+ this->actor.shape.rot.y -= 0x20;
+ if (this->envColorAlpha < 0xFF) {
+ this->envColorAlpha += 5;
+ } else {
+ this->envColorAlpha = 0xFF;
+ }
+ } else if (globalCtx->csCtx.state != 0 && globalCtx->csCtx.npcActions[2] != NULL &&
+ globalCtx->csCtx.npcActions[2]->action == 2) {
+ if (this->envColorAlpha >= 6) {
+ this->envColorAlpha -= 5;
+ } else {
+ this->envColorAlpha = 0;
+ this->fireFlag &= ~1;
+ }
+ }
+}
+
+// Update function for outwardly expanding and dissipating
+void BgSpot16Doughnut_UpdateExpanding(Actor* thisx, GlobalContext* globalCtx) {
+ BgSpot16Doughnut* this = THIS;
+
+ if (this->envColorAlpha >= 6) {
+ this->envColorAlpha -= 5;
+ } else {
+ Actor_Kill(&this->actor);
+ }
+ this->actor.shape.rot.y -= 0x20;
+ Actor_SetScale(&this->actor, this->actor.scale.x + 0.0019999998f);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot16_Doughnut/BgSpot16Doughnut_Update.s")
+void BgSpot16Doughnut_Draw(Actor* thisx, GlobalContext* globalCtx) {
+ BgSpot16Doughnut* this = THIS;
+ u32 scroll;
+ GraphicsContext* gfxCtx;
+ Gfx* dispRefs[5];
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot16_Doughnut/func_808B6680.s")
+ scroll = globalCtx->gameplayFrames & 0xFFFF;
+ gfxCtx = globalCtx->state.gfxCtx;
+ Graph_OpenDisps(dispRefs, globalCtx->state.gfxCtx, "../z_bg_spot16_doughnut.c", 210);
+ func_80093D84(globalCtx->state.gfxCtx);
+ if (1) {}
+ gSPMatrix(gfxCtx->polyXlu.p++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_bg_spot16_doughnut.c", 213),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ if (this->fireFlag & 1) {
+ gSPSegment(
+ gfxCtx->polyXlu.p++, 0x08,
+ Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, scroll * (-1), 0, 16, 32, 1, scroll, scroll * (-2), 16, 32));
+ gDPSetEnvColor(gfxCtx->polyXlu.p++, 0xFF, 0x00, 0x00, this->envColorAlpha);
+ gSPDisplayList(gfxCtx->polyXlu.p++, D_06000660);
+ } else {
+ gDPSetEnvColor(gfxCtx->polyXlu.p++, 0xFF, 0xFF, 0xFF, this->envColorAlpha);
+ gDPSetPrimColor(gfxCtx->polyXlu.p++, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF);
+ gSPDisplayList(gfxCtx->polyXlu.p++, D_06000FC0);
+ }
+ Graph_CloseDisps(dispRefs, globalCtx->state.gfxCtx, "../z_bg_spot16_doughnut.c", 238);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot16_Doughnut/BgSpot16Doughnut_Draw.s")
+// Draw function for outwardly expanding and dissipating
+void BgSpot16Doughnut_DrawExpanding(Actor* thisx, GlobalContext* globalCtx) {
+ BgSpot16Doughnut* this = THIS;
+ GraphicsContext* gfxCtx;
+ Gfx* dispRefs[4];
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot16_Doughnut/func_808B68D8.s")
+ gfxCtx = globalCtx->state.gfxCtx;
+ Graph_OpenDisps(dispRefs, globalCtx->state.gfxCtx, "../z_bg_spot16_doughnut.c", 245);
+ func_80093D84(globalCtx->state.gfxCtx);
+ gSPMatrix(gfxCtx->polyXlu.p++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_bg_spot16_doughnut.c", 248),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPSetEnvColor(gfxCtx->polyXlu.p++, 0xFF, 0xFF, 0xFF, this->envColorAlpha);
+ gDPSetPrimColor(gfxCtx->polyXlu.p++, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF);
+ gSPDisplayList(gfxCtx->polyXlu.p++, D_06000FC0);
+ Graph_CloseDisps(dispRefs, globalCtx->state.gfxCtx, "../z_bg_spot16_doughnut.c", 256);
+}
diff --git a/src/overlays/actors/ovl_Bg_Spot16_Doughnut/z_bg_spot16_doughnut.h b/src/overlays/actors/ovl_Bg_Spot16_Doughnut/z_bg_spot16_doughnut.h
index cd6c181f4..ae8048c24 100644
--- a/src/overlays/actors/ovl_Bg_Spot16_Doughnut/z_bg_spot16_doughnut.h
+++ b/src/overlays/actors/ovl_Bg_Spot16_Doughnut/z_bg_spot16_doughnut.h
@@ -8,7 +8,9 @@ struct BgSpot16Doughnut;
typedef struct BgSpot16Doughnut {
/* 0x0000 */ Actor actor;
- /* 0x014C */ char unk_14C[0x8];
+ /* 0x014C */ u16 fireFlag;
+ /* 0x014E */ char pad[0x02];
+ /* 0x0150 */ u8 envColorAlpha;
} BgSpot16Doughnut; // size = 0x0154
extern const ActorInit Bg_Spot16_Doughnut_InitVars;