diff --git a/include/z64actor.h b/include/z64actor.h index be246d0598..d86af71092 100644 --- a/include/z64actor.h +++ b/include/z64actor.h @@ -262,7 +262,9 @@ typedef struct { /* 0xB08 */ f32 unkB08; /* 0xB0C */ UNK_TYPE1 padB0C[0x1C]; /* 0xB28 */ s16 unkB28; - /* 0xB2A */ UNK_TYPE1 padB2A[0x56]; + /* 0xB2A */ UNK_TYPE1 padB2A[0x1E]; + /* 0xB48 */ f32 unkB48; + /* 0xB4C */ UNK_TYPE1 padB4C[0x34]; /* 0xB80 */ f32 unk_B80; /* 0xB84 */ s16 unk_B84; /* 0xB86 */ char unk_B86[0x16]; diff --git a/linker_scripts/code_script.txt b/linker_scripts/code_script.txt index c7e7dadec6..101819ecda 100644 --- a/linker_scripts/code_script.txt +++ b/linker_scripts/code_script.txt @@ -8928,9 +8928,9 @@ SECTIONS ovl_Bg_Iknin_Susceil : AT(RomLocation) { build/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.o(.text) - build/asm/overlays/ovl_Bg_Iknin_Susceil_data.o(.data) + build/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.o(.data) build/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.o(.rodata) - build/asm/overlays/ovl_Bg_Iknin_Susceil_rodata.o(.rodata) + build/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil_overlay.o(.ovl) } SegmentEnd = .; SegmentSize = SegmentEnd - SegmentStart; diff --git a/linker_scripts/object_script.txt b/linker_scripts/object_script.txt index 115167394d..422228ba3e 100644 --- a/linker_scripts/object_script.txt +++ b/linker_scripts/object_script.txt @@ -243,6 +243,11 @@ D_06003478 = 0x06003478; D_06000040 = 0x06000040; D_060024F0 = 0x060024F0; +/* z_bg_iknin_susceil */ +D_0600CBAC = 0x0600CBAC; +D_0600C670 = 0x0600C670; +D_0600C308 = 0x0600C308; + /* z_bg_keikoku_spr */ D_06000100 = 0x06000100; D_060001F8 = 0x060001F8; diff --git a/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.c b/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.c index e0261e4d60..781f909013 100644 --- a/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.c +++ b/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.c @@ -9,7 +9,21 @@ void BgIkninSusceil_Destroy(Actor* thisx, GlobalContext* globalCtx); void BgIkninSusceil_Update(Actor* thisx, GlobalContext* globalCtx); void BgIkninSusceil_Draw(Actor* thisx, GlobalContext* globalCtx); -/* +void func_80C0AB44(BgIkninSusceil* this, GlobalContext* globalCtx); +void func_80C0AB88(BgIkninSusceil* this); +void func_80C0ABA8(BgIkninSusceil* this, GlobalContext* globalCtx); +void func_80C0AC74(BgIkninSusceil* this); +void func_80C0AC90(BgIkninSusceil* this, GlobalContext* globalCtx); +void func_80C0ACD4(BgIkninSusceil* this); +void func_80C0ACE8(BgIkninSusceil* this, GlobalContext* globalCtx); +void func_80C0AD44(BgIkninSusceil* this); +void func_80C0AD64(BgIkninSusceil* this, GlobalContext* globalCtx); +void func_80C0AE5C(BgIkninSusceil* this, GlobalContext* globalCtx); + +extern CollisionHeader D_0600CBAC; +extern AnimatedMaterial D_0600C670; +extern Gfx D_0600C308[]; + const ActorInit Bg_Iknin_Susceil_InitVars = { ACTOR_BG_IKNIN_SUSCEIL, ACTORCAT_BG, @@ -21,46 +35,224 @@ const ActorInit Bg_Iknin_Susceil_InitVars = { (ActorFunc)BgIkninSusceil_Update, (ActorFunc)BgIkninSusceil_Draw, }; -*/ -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Iknin_Susceil_0x80C0A740/func_80C0A740.asm") +s32 unused = 0; +f32 D_80C0B0E4 = 960.0f; +Vec2f D_80C0B0E8 = { -320.0f, 0.0f }; +s8 D_80C0B0F0[] = { 0x00, 0x00, 0x07, 0x0A, 0x0A, 0x0B, 0x0B, 0x00 }; +s8 D_80C0B0F8[] = { 0x01, 0x02, 0x00, 0x01, 0x02, 0x01, 0x02, 0x00 }; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Iknin_Susceil_0x80C0A740/func_80C0A804.asm") +static InitChainEntry sInitChain[] = { + ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_STOP), +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Iknin_Susceil_0x80C0A740/func_80C0A838.asm") +s32 func_80C0A740(BgIkninSusceil* this, GlobalContext* globalCtx) { + s32 pad2[2]; + Vec3f offset; + ActorPlayer* player = PLAYER; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Iknin_Susceil_0x80C0A740/func_80C0A86C.asm") + Actor_CalcOffsetOrientedToDrawRotation(&this->dyna.actor, &offset, &player->base.world.pos); -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Iknin_Susceil_0x80C0A740/func_80C0A95C.asm") + return (D_80C0B0E8.x < offset.z) && (offset.z < D_80C0B0E8.y) && (offset.x > -240.0f) && (offset.x < D_80C0B0E4); +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Iknin_Susceil_0x80C0A740/BgIkninSusceil_Init.asm") +void func_80C0A804(BgIkninSusceil* this, GlobalContext* globalCtx) { + func_800C6314(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId); +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Iknin_Susceil_0x80C0A740/BgIkninSusceil_Destroy.asm") +void func_80C0A838(BgIkninSusceil* this, GlobalContext* globalCtx) { + func_800C62BC(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId); +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Iknin_Susceil_0x80C0A740/func_80C0AB14.asm") +void func_80C0A86C(BgIkninSusceil* this, GlobalContext* globalCtx, s16 y, s16 countdown, s32 arg4) { + s32 pad; + s16 quake = Quake_Add(ACTIVE_CAM, 3); -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Iknin_Susceil_0x80C0A740/func_80C0AB44.asm") + Quake_SetSpeed(quake, 0x7B30); + Quake_SetQuakeValues(quake, y, 0, 0, 0); + Quake_SetCountdown(quake, countdown); + if (arg4 == 1) { + func_8013ECE0(10000.0f, 255, 20, 150); + } else if (arg4 == 2) { + func_8013ECE0(10000.0f, 180, 20, 100); + } else if (arg4 == 3) { + func_8013ECE0(10000.0f, 120, 20, 10); + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Iknin_Susceil_0x80C0A740/func_80C0AB88.asm") +s32 func_80C0A95C(BgIkninSusceil* this, GlobalContext* globalCtx) { + s32 phi_t0 = true; + s32 i; + f32 new_var; + ActorPlayer* player = PLAYER; + Vec3f offset; + f32 temp1, temp2, temp3, temp4; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Iknin_Susceil_0x80C0A740/func_80C0ABA8.asm") + Actor_CalcOffsetOrientedToDrawRotation(&this->dyna.actor, &offset, &player->base.world.pos); + for (i = 0; i < 7; i++) { + temp3 = (D_80C0B0F0[i] * 80.0f) + 0.5f; + temp4 = (D_80C0B0F0[i] * 80.0f) + 79.5f; + if (1) {} + new_var = D_80C0B0F8[i] * -80.0f; // temp seems to actually be needed for matching + temp1 = new_var - 79.5f; + temp2 = new_var - 0.5f; + if ((temp1 < offset.z) && (offset.z < temp2) && (temp3 < offset.x) && (offset.x < temp4)) { + phi_t0 = false; + break; + } + } -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Iknin_Susceil_0x80C0A740/func_80C0AC74.asm") + return phi_t0; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Iknin_Susceil_0x80C0A740/func_80C0AC90.asm") +void BgIkninSusceil_Init(Actor* thisx, GlobalContext* globalCtx) { + BgIkninSusceil* this = THIS; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Iknin_Susceil_0x80C0A740/func_80C0ACD4.asm") + Actor_ProcessInitChain(&this->dyna.actor, sInitChain); + BcCheck3_BgActorInit(&this->dyna, 1); + BgCheck3_LoadMesh(globalCtx, &this->dyna, &D_0600CBAC); + this->animatedTexture = Lib_SegmentedToVirtual(&D_0600C670); + func_80C0AC74(this); +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Iknin_Susceil_0x80C0A740/func_80C0ACE8.asm") +void BgIkninSusceil_Destroy(Actor* thisx, GlobalContext* globalCtx) { + BgIkninSusceil* this = THIS; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Iknin_Susceil_0x80C0A740/func_80C0AD44.asm") + BgCheck_RemoveActorMesh(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId); +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Iknin_Susceil_0x80C0A740/func_80C0AD64.asm") +void func_80C0AB14(BgIkninSusceil* this) { + this->timer = 110; + this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y + 365.0f; + this->actionFunc = func_80C0AB44; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Iknin_Susceil_0x80C0A740/func_80C0AE3C.asm") +void func_80C0AB44(BgIkninSusceil* this, GlobalContext* globalCtx) { + if (this->timer > 0) { + this->timer -= 1; + return; + } -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Iknin_Susceil_0x80C0A740/func_80C0AE5C.asm") + if (func_80C0A740(this, globalCtx)) { + func_80C0AB88(this); + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Iknin_Susceil_0x80C0A740/BgIkninSusceil_Update.asm") +void func_80C0AB88(BgIkninSusceil* this) { + this->actionFunc = func_80C0ABA8; + this->dyna.actor.velocity.y = -10.0f; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Iknin_Susceil_0x80C0A740/BgIkninSusceil_Draw.asm") +void func_80C0ABA8(BgIkninSusceil* this, GlobalContext* globalCtx) { + this->dyna.actor.velocity.y += -0.7f; + this->dyna.actor.velocity.y *= 0.93f; + this->dyna.actor.world.pos.y += this->dyna.actor.velocity.y; + if (this->dyna.actor.world.pos.y <= this->dyna.actor.home.pos.y) { + func_80C0A86C(this, globalCtx, 4, 14, 1); + Actor_UnsetSwitchFlag(globalCtx, GET_SUSCEIL_SWITCHFLAG(this)); + Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_BIGWALL_BOUND); + func_80C0AC74(this); + } else { + func_800B9010(&this->dyna.actor, NA_SE_EV_ICE_PILLAR_FALL - SFX_FLAG); + } +} + +void func_80C0AC74(BgIkninSusceil* this) { + this->actionFunc = func_80C0AC90; + this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y; +} + +void func_80C0AC90(BgIkninSusceil* this, GlobalContext* globalCtx) { + if (Flags_GetSwitch(globalCtx, GET_SUSCEIL_SWITCHFLAG(this))) { + func_80C0ACD4(this); + } +} + +void func_80C0ACD4(BgIkninSusceil* this) { + this->actionFunc = func_80C0ACE8; +} + +void func_80C0ACE8(BgIkninSusceil* this, GlobalContext* globalCtx) { + if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) { + ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor); + func_80C0AD44(this); + } else { + ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene); + } +} + +void func_80C0AD44(BgIkninSusceil* this) { + this->actionFunc = func_80C0AD64; + this->dyna.actor.velocity.y = 5.0f; +} + +void func_80C0AD64(BgIkninSusceil* this, GlobalContext* globalCtx) { + this->dyna.actor.velocity.y += 0.46f; + this->dyna.actor.velocity.y *= 0.98f; + if (Math_SmoothStepToF(&this->dyna.actor.world.pos.y, this->dyna.actor.home.pos.y + 365.0f, 0.5f, + this->dyna.actor.velocity.y, 1.0f) < 0.1f) { + func_80C0A86C(this, globalCtx, 1, 0xE, 3); + ActorCutscene_Stop(this->dyna.actor.cutscene); + func_80C0AB14(this); + } else { + func_800B9010(&this->dyna.actor, NA_SE_EV_ICE_PILLAR_RISING - SFX_FLAG); + } +} + +void func_80C0AE3C(BgIkninSusceil* this) { + this->actionFunc = func_80C0AE5C; + this->dyna.actor.velocity.y = 30.0f; +} + +void func_80C0AE5C(BgIkninSusceil* this, GlobalContext* globalCtx) { + this->dyna.actor.velocity.y += -0.1f; + this->dyna.actor.velocity.y *= 0.95f; + this->dyna.actor.velocity.y = CLAMP_MIN(this->dyna.actor.velocity.y, 1.0f); + this->dyna.actor.world.pos.y = this->dyna.actor.world.pos.y + this->dyna.actor.velocity.y; + if ((this->dyna.actor.home.pos.y + 365.0f) < this->dyna.actor.world.pos.y) { + func_80C0A86C(this, globalCtx, 3, 14, 2); + func_80C0AB14(this); + } +} + +void BgIkninSusceil_Update(Actor* thisx, GlobalContext* globalCtx) { + s32 pad; + BgIkninSusceil* this = THIS; + ActorPlayer* player = PLAYER; + + if ((this->unk168 == 0) && (this->unk166 > 0) && ((player->unkA74 & 0x100) != 0) && (player->unkB48 > 1000.0f)) { + this->unk168 = 2; + if ((func_80C0A95C(this, globalCtx) != 0) && (this->actionFunc != func_80C0AE5C)) { + func_800B8E58(player, 0x83E); + func_80C0AE3C(this); + } + } + + if (this->unk168 > 0) { + this->unk168--; + } + + this->actionFunc(this, globalCtx); + + if ((this->dyna.actor.home.pos.y + 70.0f) < this->dyna.actor.world.pos.y) { + this->unk166 = 0; + } else if ((player->unkA74 & 0x100) != 0) { + this->unk166 = 3; + } else { + if (this->unk166 > 0) { + this->unk166--; + } + } + if (this->unk166 > 0) { + func_80C0A838(this, globalCtx); + } else { + func_80C0A804(this, globalCtx); + } +} + +void BgIkninSusceil_Draw(Actor* thisx, GlobalContext* globalCtx) { + BgIkninSusceil* this = THIS; + + AnimatedMat_Draw(globalCtx, this->animatedTexture); + func_800BDFC0(globalCtx, D_0600C308); +} diff --git a/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.h b/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.h index 191a95f814..c76bbf518d 100644 --- a/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.h +++ b/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.h @@ -3,11 +3,20 @@ #include +#define GET_SUSCEIL_SWITCHFLAG(this) (((this)->dyna.actor.params) & 0x7F) + struct BgIkninSusceil; +typedef void (*BgIkninSusceilActionFunc)(struct BgIkninSusceil*, GlobalContext*); + typedef struct BgIkninSusceil { - /* 0x000 */ Actor actor; - /* 0x144 */ char unk_144[0x28]; + /* 0x000 */ DynaPolyActor dyna; + /* 0x15C */ AnimatedMaterial* animatedTexture; + /* 0x160 */ BgIkninSusceilActionFunc actionFunc; + /* 0x164 */ s16 timer; + /* 0x166 */ s16 unk166; + /* 0x168 */ s16 unk168; + /* 0x16A */ UNK_TYPE2 unk16A; } BgIkninSusceil; // size = 0x16C extern const ActorInit Bg_Iknin_Susceil_InitVars; diff --git a/tools/gen_mips_to_c_context.py b/tools/gen_mips_to_c_context.py index 2767457f4f..de72d591f5 100755 --- a/tools/gen_mips_to_c_context.py +++ b/tools/gen_mips_to_c_context.py @@ -28,7 +28,7 @@ def get_c_file(directory): def find_build_command_line(c_file): rel_c_file = os.path.relpath(c_file, root_dir) - make_cmd = ["make", "rom_uncompressed.z64", "--always-make", "--dry-run", "--debug=j", "PERMUTER=1"] + make_cmd = ["make", "mm.us.rev1.rom_uncompressed.z64", "--always-make", "--dry-run", "--debug=j", "PERMUTER=1"] debug_output = ( subprocess.check_output(make_cmd, cwd=root_dir).decode("utf-8").split("\n") )