From 2d6a74c0aacbf652341fc66873240d93d497d73a Mon Sep 17 00:00:00 2001
From: Maide <34639600+Kelebek1@users.noreply.github.com>
Date: Sat, 19 Feb 2022 19:11:13 +0000
Subject: [PATCH] Dm_Char01 (#589)
* Dm_Char01
* Merge
* Extract verts
* PR
---
assets/xml/objects/object_mtoride.xml | 4 +-
assets/xml/overlays/ovl_Dm_Char01.xml | 7 +
spec | 4 +-
.../actors/ovl_Dm_Char01/z_dm_char01.c | 520 +++++++++++++++++-
.../actors/ovl_Dm_Char01/z_dm_char01.h | 20 +-
undefined_syms.txt | 23 -
6 files changed, 524 insertions(+), 54 deletions(-)
create mode 100644 assets/xml/overlays/ovl_Dm_Char01.xml
diff --git a/assets/xml/objects/object_mtoride.xml b/assets/xml/objects/object_mtoride.xml
index ab07928391..a795477300 100644
--- a/assets/xml/objects/object_mtoride.xml
+++ b/assets/xml/objects/object_mtoride.xml
@@ -31,7 +31,7 @@
-
+
@@ -40,7 +40,7 @@
-
+
diff --git a/assets/xml/overlays/ovl_Dm_Char01.xml b/assets/xml/overlays/ovl_Dm_Char01.xml
new file mode 100644
index 0000000000..3f855c3764
--- /dev/null
+++ b/assets/xml/overlays/ovl_Dm_Char01.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/spec b/spec
index 54ac468bdb..f03b20aa6d 100644
--- a/spec
+++ b/spec
@@ -3267,9 +3267,7 @@ beginseg
name "ovl_Dm_Char01"
compress
include "build/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.o"
- include "build/data/ovl_Dm_Char01/ovl_Dm_Char01.data.o"
- include "build/data/ovl_Dm_Char01/ovl_Dm_Char01.bss.o"
- include "build/data/ovl_Dm_Char01/ovl_Dm_Char01.reloc.o"
+ include "build/src/overlays/actors/ovl_Dm_Char01/ovl_Dm_Char01_reloc.o"
endseg
beginseg
diff --git a/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c b/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c
index cf2d8b03b6..1bc42f32b0 100644
--- a/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c
+++ b/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c
@@ -5,8 +5,9 @@
*/
#include "z_dm_char01.h"
+#include "objects/object_mtoride/object_mtoride.h"
-#define FLAGS 0x02000030
+#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_2000000)
#define THIS ((DmChar01*)thisx)
@@ -15,7 +16,24 @@ void DmChar01_Destroy(Actor* thisx, GlobalContext* globalCtx);
void DmChar01_Update(Actor* thisx, GlobalContext* globalCtx);
void DmChar01_Draw(Actor* thisx, GlobalContext* globalCtx);
-#if 0
+void func_80AA8698(DmChar01* this, GlobalContext* globalCtx);
+void func_80AA884C(DmChar01* this, GlobalContext* globalCtx);
+void func_80AA88A8(DmChar01* this, GlobalContext* globalCtx);
+void func_80AA892C(DmChar01* this, GlobalContext* globalCtx);
+void func_80AA8C28(DmChar01* this, GlobalContext* globalCtx);
+void func_80AA8F1C(DmChar01* this, GlobalContext* globalCtx);
+void func_80AA8F2C(DmChar01* this, GlobalContext* globalCtx);
+void func_80AA9020(DmChar01* this, GlobalContext* globalCtx);
+void func_80AA90AC(DmChar01* this, GlobalContext* globalCtx);
+void func_80AA90F4(DmChar01* this, GlobalContext* globalCtx);
+
+s16 D_80AAAE20;
+s16 D_80AAAE22;
+s16 D_80AAAE24;
+s16 D_80AAAE26;
+
+#include "overlays/ovl_Dm_Char01/ovl_Dm_Char01.c"
+
const ActorInit Dm_Char01_InitVars = {
ACTOR_DM_CHAR01,
ACTORCAT_ITEMACTION,
@@ -28,44 +46,500 @@ const ActorInit Dm_Char01_InitVars = {
(ActorFunc)DmChar01_Draw,
};
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_80AAAAB0[] = {
+static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneScale, 300, ICHAIN_STOP),
};
-#endif
+s16 D_80AAAAB4 = false;
-extern InitChainEntry D_80AAAAB0[];
+void DmChar01_Init(Actor* thisx, GlobalContext* globalCtx) {
+ DmChar01* this = THIS;
+ s32 i;
-extern UNK_TYPE D_06009E4C;
-extern UNK_TYPE D_0600AA50;
+ Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
+ Actor_SetScale(&this->dyna.actor, 1.0f);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char01/DmChar01_Init.s")
+ this->unk_346 = 0;
+ this->unk_34D = false;
+ D_80AAAE24 = 0;
+ D_80AAAE26 = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char01/DmChar01_Destroy.s")
+ switch (DMCHAR01_GET(&this->dyna.actor)) {
+ case DMCHAR01_0:
+ if (gSaveContext.weekEventReg[20] & 2) {
+ this->unk_34C = 2;
+ this->actionFunc = func_80AA8F1C;
+ break;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char01/func_80AA8698.s")
+ if (gSaveContext.sceneSetupIndex == 0) {
+ globalCtx->envCtx.unk_1F = 5;
+ globalCtx->envCtx.unk_20 = 5;
+ }
+ this->unk_348 = 255.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char01/func_80AA884C.s")
+ for (i = 0; i < ARRAY_COUNT(this->unk_1AC); i++) {
+ this->unk_1AC[i] = ovl_dm_char01_Vtx_1BE0[i].v.ob[1] * 409.6f;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char01/func_80AA88A8.s")
+ DynaPolyActor_Init(&this->dyna, 0);
+ DynaPolyActor_LoadMesh(globalCtx, &this->dyna, &object_mtoride_Colheader_009E4C);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char01/func_80AA892C.s")
+ this->unk_34D = true;
+ if (gSaveContext.sceneSetupIndex == 1) {
+ this->unk_34C = 1;
+ this->actionFunc = func_80AA8C28;
+ } else {
+ this->unk_34C = 0;
+ this->actionFunc = func_80AA892C;
+ }
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char01/func_80AA8C28.s")
+ case DMCHAR01_1:
+ if ((gSaveContext.weekEventReg[20] & 2) || (gSaveContext.sceneSetupIndex == 1)) {
+ this->unk_34C = 1;
+ this->actionFunc = func_80AA8F1C;
+ } else {
+ this->actionFunc = func_80AA8698;
+ }
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char01/func_80AA8F0C.s")
+ case DMCHAR01_2:
+ this->unk_34C = 0;
+ if (!(gSaveContext.weekEventReg[20] & 1)) {
+ this->unk_34C = 1;
+ this->dyna.actor.world.pos.y -= 400.0f;
+ }
+ this->dyna.actor.world.rot.y += 0x8000;
+ this->dyna.actor.shape.rot.y += 0x8000;
+ DynaPolyActor_Init(&this->dyna, 0);
+ DynaPolyActor_LoadMesh(globalCtx, &this->dyna, &object_mtoride_Colheader_010C3C);
+ this->unk_34D = true;
+ this->unk_348 = 200.0f;
+ this->actionFunc = func_80AA8F2C;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char01/func_80AA8F1C.s")
+ case DMCHAR01_3:
+ this->dyna.actor.world.rot.y += 0x8000;
+ this->dyna.actor.shape.rot.y += 0x8000;
+ if (!(gSaveContext.weekEventReg[20] & 1)) {
+ Actor_MarkForDeath(&this->dyna.actor);
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char01/func_80AA8F2C.s")
+ Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_OBJ_ETCETERA, 5.0f, 202.0f, 294.0f, 0, 0, 0, 0x80);
+ DynaPolyActor_Init(&this->dyna, 0);
+ DynaPolyActor_LoadMesh(globalCtx, &this->dyna, &object_mtoride_Colheader_00FE5C);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char01/func_80AA9020.s")
+ this->unk_34D = true;
+ if (!(gSaveContext.weekEventReg[20] & 2)) {
+ this->actionFunc = func_80AA9020;
+ this->dyna.actor.world.pos.y -= 120.0f;
+ } else {
+ this->actionFunc = func_80AA8F1C;
+ }
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char01/func_80AA90AC.s")
+ default:
+ this->actionFunc = func_80AA88A8;
+ break;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char01/func_80AA90F4.s")
+void DmChar01_Destroy(Actor* thisx, GlobalContext* globalCtx) {
+ DmChar01* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char01/DmChar01_Update.s")
+ if (this->unk_34D) {
+ DynaPoly_DeleteBgActor(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Char01/DmChar01_Draw.s")
+void func_80AA8698(DmChar01* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+ Player* player2 = GET_PLAYER(globalCtx);
+
+ if (gSaveContext.weekEventReg[20] & 1) {
+ return;
+ }
+
+ if ((player->stateFlags2 & 0x8000000) && (player2->actor.world.pos.x > -40.0f) &&
+ (player2->actor.world.pos.x < 40.0f) && (player2->actor.world.pos.z > 1000.0f) &&
+ (player2->actor.world.pos.z < 1078.0f)) {
+ if (!D_80AAAAB4) {
+ play_sound(NA_SE_SY_TRE_BOX_APPEAR);
+ D_80AAAAB4 = true;
+ }
+ } else {
+ D_80AAAAB4 = false;
+ }
+
+ if ((player->transformation == PLAYER_FORM_DEKU) && (globalCtx->msgCtx.ocarinaMode == 3) &&
+ (globalCtx->msgCtx.unk1202E == 0)) {
+
+ if ((player2->actor.world.pos.x > -40.0f) && (player2->actor.world.pos.x < 40.0f) &&
+ (player2->actor.world.pos.z > 1000.0f) && (player2->actor.world.pos.z < 1078.0f)) {
+ gSaveContext.weekEventReg[20] |= 1;
+ this->actionFunc = func_80AA884C;
+ }
+ }
+}
+
+void func_80AA884C(DmChar01* this, GlobalContext* globalCtx) {
+ s16 sp1E = this->dyna.actor.cutscene;
+
+ if (ActorCutscene_GetCanPlayNext(sp1E)) {
+ ActorCutscene_Start(sp1E, &this->dyna.actor);
+ this->actionFunc = func_80AA88A8;
+ } else {
+ ActorCutscene_SetIntentToPlay(sp1E);
+ }
+}
+
+void func_80AA88A8(DmChar01* this, GlobalContext* globalCtx) {
+ if (func_800EE29C(globalCtx, 0x87)) {
+ if (globalCtx->csCtx.frames == globalCtx->csCtx.npcActions[func_800EE200(globalCtx, 0x87)]->startFrame) {
+ D_80AAAE24 = 1;
+ Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_FORT_RISING);
+ }
+ } else {
+ D_80AAAE24 = 0;
+ }
+}
+
+void func_80AA892C(DmChar01* this, GlobalContext* globalCtx) {
+ f32 temp_f18;
+ s32 temp_v0_4;
+ s32 i;
+
+ switch (this->unk_346) {
+ case 0:
+ D_80AAAE22 = -2200;
+ D_80AAAE20 = 380;
+ this->unk_346++;
+ break;
+
+ case 1:
+ if (D_80AAAE24 != 0) {
+ this->unk_34C = 1;
+ if (D_80AAAE22 > -2000) {
+ D_80AAAE26 = 1;
+ }
+
+ D_80AAAE22 += 40;
+ if (D_80AAAE22 > 3400) {
+ if (D_80AAAE20 > 100) {
+ D_80AAAE20 -= 230;
+ }
+ this->unk_346++;
+ }
+ }
+ break;
+
+ case 2:
+ D_80AAAE22 -= 40;
+ if (D_80AAAE22 <= -2200) {
+ if (D_80AAAE20 > 100) {
+ D_80AAAE20 -= 70;
+ }
+ this->unk_346--;
+ }
+ break;
+ }
+
+ if (D_80AAAE24 == 0) {
+ this->unk_34C = 0;
+ }
+
+ for (i = 0; i < ARRAY_COUNT(ovl_dm_char01_Vtx_1BE0); i++) {
+ s32 temp_s2 = sqrtf(SQ((f32)ovl_dm_char01_Vtx_1BE0[i].v.ob[2]) + SQ((f32)ovl_dm_char01_Vtx_1BE0[i].v.ob[0]));
+ f32 cos = Math_CosS((temp_s2 / 1892.0f) * 0x4000);
+ f32 temp_f20 = (1.0f - (ABS_ALT(temp_s2 - D_80AAAE22) / 1892.0f)) * D_80AAAE20 * cos;
+
+ if (temp_f20 < 0.0f) {
+ temp_f20 = 0.0f;
+ }
+
+ temp_f18 = Math_SinS(this->unk_1AC[i]) * 15.0f;
+ temp_f20 += temp_f18;
+
+ this->unk_1AC[i] += 1600;
+ ovl_dm_char01_Vtx_1BE0[i].v.ob[1] = temp_f20;
+ }
+}
+
+void func_80AA8C28(DmChar01* this, GlobalContext* globalCtx) {
+ f32 temp_f18;
+ s32 temp_v0_4;
+ s32 i;
+
+ switch (this->unk_346) {
+ case 0:
+ Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_WATER_PURIFICATION);
+ D_80AAAE22 = -2200;
+ D_80AAAE20 = 100;
+ this->unk_346++;
+ break;
+
+ case 1:
+ D_80AAAE22 += 40;
+ if (D_80AAAE22 > 3400) {
+ this->unk_346++;
+ }
+ break;
+
+ case 2:
+ D_80AAAE22 -= 40;
+ if (D_80AAAE22 <= -2200) {
+ this->unk_346--;
+ }
+ break;
+ }
+
+ for (i = 0; i < ARRAY_COUNT(ovl_dm_char01_Vtx_1BE0); i++) {
+ s32 temp_s2 = sqrtf(SQ((f32)ovl_dm_char01_Vtx_1BE0[i].v.ob[2]) + SQ((f32)ovl_dm_char01_Vtx_1BE0[i].v.ob[0]));
+ f32 cos = Math_CosS((temp_s2 / 1892.0f) * 0x4000);
+ f32 temp_f20 = (1.0f - (ABS_ALT(temp_s2 - D_80AAAE22) / 1892.0f)) * D_80AAAE20 * cos;
+
+ if (temp_f20 < 0.0f) {
+ temp_f20 = 0.0f;
+ }
+
+ temp_f18 = Math_SinS(this->unk_1AC[i]) * 15.0f;
+ temp_f20 += temp_f18;
+
+ this->unk_1AC[i] += 1600;
+ ovl_dm_char01_Vtx_1BE0[i].v.ob[1] = temp_f20;
+ }
+
+ Math_SmoothStepToF(&this->unk_348, 0.0f, 0.02f, 0.6f, 0.4f);
+
+ if (this->unk_348 < 0.01f) {
+ this->unk_34C = 2;
+ this->actionFunc = func_80AA8F1C;
+ }
+}
+
+void func_80AA8F0C(DmChar01* this, GlobalContext* globalCtx) {
+}
+
+void func_80AA8F1C(DmChar01* this, GlobalContext* globalCtx) {
+}
+
+void func_80AA8F2C(DmChar01* this, GlobalContext* globalCtx) {
+ if (D_80AAAE26 != 0) {
+ Math_SmoothStepToF(&this->dyna.actor.world.pos.y, 0.0f, 0.05f, 6.0f, 0.001f);
+ Math_SmoothStepToF(&this->unk_348, 0.0f, 0.01f, 0.5f, 0.4f);
+ if ((s32)this->dyna.actor.world.pos.y >= 0) {
+ D_80AAAE26 = 2;
+ Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_OBJ_ETCETERA, 5.0f, 202.0f, 294.0f, 0, 0, 0, 0x80);
+ this->actionFunc = func_80AA90F4;
+ }
+ }
+ func_80AA8F0C(this, globalCtx);
+}
+
+void func_80AA9020(DmChar01* this, GlobalContext* globalCtx) {
+ if (func_800EE29C(globalCtx, 0x87)) {
+ CsCmdActorAction* temp_v1 = globalCtx->csCtx.npcActions[func_800EE200(globalCtx, 0x87)];
+
+ if ((temp_v1->startFrame == globalCtx->csCtx.frames) && (temp_v1->unk0 == 2)) {
+ gSaveContext.weekEventReg[20] |= 2;
+ this->actionFunc = func_80AA90AC;
+ }
+ }
+}
+
+void func_80AA90AC(DmChar01* this, GlobalContext* globalCtx) {
+ Math_SmoothStepToF(&this->dyna.actor.world.pos.y, 0.0f, 0.05f, 2.0f, 0.001f);
+}
+
+void func_80AA90F4(DmChar01* this, GlobalContext* globalCtx) {
+ Math_SmoothStepToF(&this->unk_348, 0.0f, 0.02f, 0.8f, 0.4f);
+}
+
+void DmChar01_Update(Actor* thisx, GlobalContext* globalCtx2) {
+ GlobalContext* globalCtx = globalCtx2;
+ DmChar01* this = THIS;
+
+ this->actionFunc(this, globalCtx);
+
+ if (this->unk_34D) {
+ if (DMCHAR01_GET(&this->dyna.actor) == DMCHAR01_0) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ if (player->actor.world.pos.y > 5.0f) {
+ func_800C62BC(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
+ } else {
+ func_800C6314(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
+ }
+ }
+
+ if (DMCHAR01_GET(&this->dyna.actor) == DMCHAR01_2) {
+ if (this->dyna.actor.xzDistToPlayer > 600.0f) {
+ func_800C62BC(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
+ } else {
+ func_800C6314(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
+ }
+ }
+ }
+}
+
+void DmChar01_Draw(Actor* thisx, GlobalContext* globalCtx) {
+ static f32 D_80AAAAB8 = 0.0f;
+ static f32 D_80AAAABC = 0.0f;
+ static s16 D_80AAAAC0 = 0;
+ static s16 D_80AAAAC4 = 0;
+ static s16 D_80AAAAC8 = 0;
+ static s16 D_80AAAACC = 0;
+ DmChar01* this = THIS;
+ f32 temp_f12;
+ f32 spBC;
+ s32 i;
+ u8 spB7 = false;
+
+ switch (DMCHAR01_GET(thisx)) {
+ case DMCHAR01_0:
+ switch (this->unk_34C) {
+ case 0:
+ AnimatedMat_Draw(globalCtx, Lib_SegmentedToVirtual(&object_mtoride_Matanimheader_00AA50));
+ Gfx_DrawDListOpa(globalCtx, object_mtoride_DL_00A8F8);
+ break;
+
+ case 1:
+ if (gSaveContext.sceneSetupIndex == 1) {
+ AnimatedMat_Draw(globalCtx, Lib_SegmentedToVirtual(&object_mtoride_Matanimheader_0110B8));
+ Gfx_DrawDListOpa(globalCtx, object_mtoride_DL_010FD8);
+ Gfx_DrawDListXlu(globalCtx, object_mtoride_DL_010EF0);
+ Matrix_InsertTranslation(0.0f, 10.0f, 0.0f, MTXMODE_APPLY);
+ }
+ AnimatedMat_Draw(globalCtx, Lib_SegmentedToVirtual(&object_mtoride_Matanimheader_009D70));
+
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+
+ if ((u8)this->unk_348 == 255) {
+ func_8012C28C(globalCtx->state.gfxCtx);
+
+ gDPSetRenderMode(POLY_OPA_DISP++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2);
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x96, 255, 255, 255, 255);
+ gSPSegment(POLY_OPA_DISP++, 0x0B, Lib_SegmentedToVirtual(ovl_dm_char01_Vtx_1BE0));
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, object_mtoride_DL_009928);
+ } else {
+ func_8012C2DC(globalCtx->state.gfxCtx);
+
+ gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_XLU_SURF2);
+ gDPPipeSync(POLY_XLU_DISP++);
+ gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, (u8)this->unk_348);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x96, 255, 255, 255, (u8)this->unk_348);
+ gSPSegment(POLY_XLU_DISP++, 0x0B, Lib_SegmentedToVirtual(ovl_dm_char01_Vtx_1BE0));
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, object_mtoride_DL_009928);
+ }
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+ break;
+
+ case 2:
+ AnimatedMat_Draw(globalCtx, Lib_SegmentedToVirtual(&object_mtoride_Matanimheader_0110B8));
+ Gfx_DrawDListOpa(globalCtx, object_mtoride_DL_010FD8);
+ Gfx_DrawDListXlu(globalCtx, object_mtoride_DL_010EF0);
+ break;
+ }
+ break;
+
+ case DMCHAR01_1:
+ switch (this->unk_34C) {
+ case 0:
+ AnimatedMat_Draw(globalCtx, Lib_SegmentedToVirtual(&object_mtoride_Matanimheader_00A5C0));
+ Gfx_DrawDListOpa(globalCtx, object_mtoride_DL_00A398);
+ break;
+
+ case 1:
+ AnimatedMat_Draw(globalCtx, Lib_SegmentedToVirtual(&object_mtoride_Matanimheader_00B1A0));
+ Gfx_DrawDListOpa(globalCtx, object_mtoride_DL_00AF98);
+ break;
+ }
+ break;
+
+ case DMCHAR01_2:
+ AnimatedMat_Draw(globalCtx, Lib_SegmentedToVirtual(&object_mtoride_Matanimheader_00FE90));
+ Gfx_DrawDListOpa(globalCtx, object_mtoride_DL_00DF18);
+
+ if ((this->unk_34C != 0) && ((u8)this->unk_348 != 0)) {
+ AnimatedMat_Draw(globalCtx, Lib_SegmentedToVirtual(&object_mtoride_Matanimheader_00F768));
+
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+
+ func_8012C2DC(globalCtx->state.gfxCtx);
+
+ gDPPipeSync(POLY_XLU_DISP++);
+ gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, (u8)this->unk_348);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, (u8)this->unk_348);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, object_mtoride_DL_00F3C0);
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+ }
+
+ if (D_80AAAE24 != 0) {
+ if ((D_80AAAE22 > -1800) && (D_80AAAE22 < 3000)) {
+ temp_f12 = D_80AAAE22 - 640.0f;
+ if ((D_80AAAE20 == 380) && (D_80AAAE22 > 640)) {
+ D_80AAAAC0 = 2;
+ D_80AAAAC4 = 0;
+ D_80AAAAC8 = 900;
+ D_80AAAACC = 700;
+ spB7 = true;
+ if (D_80AAAE22 < 1350) {
+ f32 temp_f0 = temp_f12 / 2000.0f;
+
+ D_80AAAAB8 = 420.0f - (420.0f * temp_f0);
+ D_80AAAABC = (200.0f * temp_f0) + 200.0f;
+ } else {
+ f32 temp_f0 = temp_f12 / 2000.0f;
+
+ D_80AAAAB8 = 420.0f - (420.0f * temp_f0);
+ D_80AAAABC = 400.0f;
+ }
+ }
+ }
+
+ if (spB7) {
+ for (i = 0; i < D_80AAAAC0 * 2; i++) {
+ Vec3f sp44;
+ f32 phi_f2 = D_80AAAABC;
+ s16 temp;
+
+ spBC = Rand_ZeroOne() * D_80AAAAC8;
+ if ((globalCtx->state.frames % 2) != 0) {
+ sp44.x = (Rand_ZeroOne() - 0.5f) * (2.0f * phi_f2);
+ sp44.y = D_80AAAAB8;
+ sp44.z = (Rand_ZeroOne() * D_80AAAAC4) + phi_f2;
+ temp = (s16)spBC + D_80AAAACC;
+ EffectSsGSplash_Spawn(globalCtx, &sp44, NULL, NULL, 0, temp);
+ } else {
+ sp44.x = -phi_f2 - (Rand_ZeroOne() * D_80AAAAC4);
+ sp44.y = D_80AAAAB8;
+ sp44.z = (Rand_ZeroOne() - 0.5f) * (2.0f * phi_f2);
+ temp = (s16)spBC + D_80AAAACC;
+ EffectSsGSplash_Spawn(globalCtx, &sp44, NULL, NULL, 0, temp);
+ }
+ }
+ }
+ }
+
+ Gfx_DrawDListXlu(globalCtx, object_mtoride_DL_00DE50);
+ break;
+
+ case DMCHAR01_3:
+ if (thisx->world.pos.y > -120.0f) {
+ Gfx_DrawDListOpa(globalCtx, object_mtoride_DL_00FAE8);
+ }
+ break;
+ }
+}
diff --git a/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.h b/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.h
index a0d4fb3363..b2c235f561 100644
--- a/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.h
+++ b/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.h
@@ -7,11 +7,25 @@ struct DmChar01;
typedef void (*DmChar01ActionFunc)(struct DmChar01*, GlobalContext*);
+#define DMCHAR01_GET(thisx) ((thisx)->params)
+
+enum {
+ /* 0 */ DMCHAR01_0,
+ /* 1 */ DMCHAR01_1,
+ /* 2 */ DMCHAR01_2,
+ /* 3 */ DMCHAR01_3,
+};
+
typedef struct DmChar01 {
- /* 0x0000 */ Actor actor;
- /* 0x0144 */ char unk_144[0x5C];
+ /* 0x0000 */ DynaPolyActor dyna;
+ /* 0x015C */ UNK_TYPE1 unk15C[0x44];
/* 0x01A0 */ DmChar01ActionFunc actionFunc;
- /* 0x01A4 */ char unk_1A4[0x1AC];
+ /* 0x01A4 */ UNK_TYPE1 unk1A4[0x8];
+ /* 0x01AC */ s16 unk_1AC[205];
+ /* 0x0346 */ s16 unk_346;
+ /* 0x0348 */ f32 unk_348;
+ /* 0x034C */ u8 unk_34C;
+ /* 0x034D */ u8 unk_34D;
} DmChar01; // size = 0x350
extern const ActorInit Dm_Char01_InitVars;
diff --git a/undefined_syms.txt b/undefined_syms.txt
index 94d7d8d34d..cbbcc21ce0 100644
--- a/undefined_syms.txt
+++ b/undefined_syms.txt
@@ -984,29 +984,6 @@ D_060005FC = 0x060005FC;
D_06001804 = 0x06001804;
D_0600A6D0 = 0x0600A6D0;
-// ovl_Dm_Char01
-
-D_06009928 = 0x06009928;
-D_06009D70 = 0x06009D70;
-D_06009E4C = 0x06009E4C;
-D_0600A398 = 0x0600A398;
-D_0600A5C0 = 0x0600A5C0;
-D_0600A8F8 = 0x0600A8F8;
-D_0600AA50 = 0x0600AA50;
-D_0600AF98 = 0x0600AF98;
-D_0600B1A0 = 0x0600B1A0;
-D_0600DE50 = 0x0600DE50;
-D_0600DF18 = 0x0600DF18;
-D_0600F3C0 = 0x0600F3C0;
-D_0600F768 = 0x0600F768;
-D_0600FAE8 = 0x0600FAE8;
-D_0600FE5C = 0x0600FE5C;
-D_0600FE90 = 0x0600FE90;
-D_06010C3C = 0x06010C3C;
-D_06010EF0 = 0x06010EF0;
-D_06010FD8 = 0x06010FD8;
-D_060110B8 = 0x060110B8;
-
// ovl_Dm_Char02
D_0600AD68 = 0x0600AD68;