From 08e964972f1a77c97d7f2a6bddc520ce75ca04cf Mon Sep 17 00:00:00 2001 From: kyleburnette Date: Fri, 12 Feb 2021 15:25:48 -0800 Subject: [PATCH] en_nnh OK (#42) * Matching (last thing to figure out is ColliderInit) * nnh work * Working on collider * formatting * Fixing en_nnh * Fixed build error. The issue was a collider init, not sure what made me think it was OK before * Removed overlay helper stuff * Removed weird qemu file * Fixed collider once and for all. Co-authored-by: fullgrowngaming --- include/functions.h | 2 +- linker_scripts/code_script.txt | 5 +- linker_scripts/object_script.txt | 5 ++ src/overlays/actors/ovl_En_Nnh/z_en_nnh.c | 76 ++++++++++++++++++++--- src/overlays/actors/ovl_En_Nnh/z_en_nnh.h | 5 +- 5 files changed, 79 insertions(+), 14 deletions(-) diff --git a/include/functions.h b/include/functions.h index c092919de1..30949ee511 100644 --- a/include/functions.h +++ b/include/functions.h @@ -2899,7 +2899,7 @@ void func_8014D7B4(void); // func_8014D7B4 void func_80150A84(void); // func_80150A84 void func_80150D08(GlobalContext* ctxt, unsigned int uParm2); // func_80150D08 void func_801514B0(void); // func_801514B0 -void func_801518B0(GlobalContext* ctxt, u32 uParm2, UNK_TYPE4 uParm3); // func_801518B0 +void func_801518B0(GlobalContext* ctxt, u32 uParm2, Actor* uParm3); // func_801518B0 void func_80151938(GlobalContext* ctxt, u16 param_2); // func_80151938 void func_80151A68(GlobalContext* ctxt, u16 param_2); // func_80151A68 void func_80151BB4(s32 iParm1, u32 uParm2); // func_80151BB4 diff --git a/linker_scripts/code_script.txt b/linker_scripts/code_script.txt index ed053af4ea..25647656d2 100644 --- a/linker_scripts/code_script.txt +++ b/linker_scripts/code_script.txt @@ -8236,8 +8236,9 @@ SECTIONS ovl_En_Nnh : AT(RomLocation) { build/src/overlays/actors/ovl_En_Nnh/z_en_nnh.o(.text) - build/asm/ovl_En_Nnh_data.o(.data) - build/asm/ovl_En_Nnh_rodata.o(.rodata) + build/src/overlays/actors/ovl_En_Nnh/z_en_nnh.o(.data) + build/src/overlays/actors/ovl_En_Nnh/z_en_nnh.o(.rodata) + build/src/overlays/actors/ovl_En_Nnh/z_en_nnh_overlay.o(.ovl) } SegmentEnd = .; SegmentSize = SegmentEnd - SegmentStart; diff --git a/linker_scripts/object_script.txt b/linker_scripts/object_script.txt index 9095150e98..2add037fb1 100644 --- a/linker_scripts/object_script.txt +++ b/linker_scripts/object_script.txt @@ -14,6 +14,11 @@ D_0E000140 = 0x0E000140; D_0E0001C8 = 0x0E0001C8; D_0E0002C8 = 0x0E0002C8; +D_06000500 = 0x06000500; + +/* z_en_nnh */ +D_06001510 = 0x06001510; + /* bg_haka_curtain */ D_06001410 = 0x06001410; D_06001588 = 0x06001588; diff --git a/src/overlays/actors/ovl_En_Nnh/z_en_nnh.c b/src/overlays/actors/ovl_En_Nnh/z_en_nnh.c index f27285ff6a..6f7ba4c070 100644 --- a/src/overlays/actors/ovl_En_Nnh/z_en_nnh.c +++ b/src/overlays/actors/ovl_En_Nnh/z_en_nnh.c @@ -9,7 +9,11 @@ void EnNnh_Destroy(Actor* thisx, GlobalContext* globalCtx); void EnNnh_Update(Actor* thisx, GlobalContext* globalCtx); void EnNnh_Draw(Actor* thisx, GlobalContext* globalCtx); -/* +void func_80C08828(EnNnh* this); +void func_80C0883C(EnNnh* this, GlobalContext* globalCtx); +void func_80C088A4(EnNnh* this); +void func_80C088B8(EnNnh* this, GlobalContext* globalCtx); + const ActorInit En_Nnh_InitVars = { ACTOR_EN_NNH, ACTORTYPE_PROP, @@ -21,20 +25,72 @@ const ActorInit En_Nnh_InitVars = { (ActorFunc)EnNnh_Update, (ActorFunc)EnNnh_Draw }; -*/ -GLOBAL_ASM("asm/non_matchings/ovl_En_Nnh_0x80C08760/EnNnh_Init.asm") +ColCylinderInit D_80C08A00 = +{ + { 0x0D, 0x00, 0x09, 0x39, 0x10, 0x01 }, + { 0x01, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, 0x00, 0x01, 0x01 }, + { 20, 50, 0, { 0, 0, 0 } }, +}; -GLOBAL_ASM("asm/non_matchings/ovl_En_Nnh_0x80C08760/EnNnh_Destroy.asm") +extern Gfx D_06001510[]; -GLOBAL_ASM("asm/non_matchings/ovl_En_Nnh_0x80C08760/func_80C08828.asm") +void EnNnh_Init(Actor *thisx, GlobalContext *globalCtx) { + EnNnh* this = THIS; -GLOBAL_ASM("asm/non_matchings/ovl_En_Nnh_0x80C08760/func_80C0883C.asm") + Actor_SetScale(&this->actor, 0.01f); + Collision_InitCylinderDefault(globalCtx, &this->collider); + Collision_InitCylinderWithData(globalCtx, &this->collider, &this->actor, &D_80C08A00); + this->actor.unk1F = 1; + this->actor.topPosRot.pos = this->actor.currPosRot.pos; + this->actor.topPosRot.pos.y += 30.0f; + func_80C08828(this); +} -GLOBAL_ASM("asm/non_matchings/ovl_En_Nnh_0x80C08760/func_80C088A4.asm") +void EnNnh_Destroy(Actor *thisx, GlobalContext *globalCtx) { + EnNnh* this = THIS; -GLOBAL_ASM("asm/non_matchings/ovl_En_Nnh_0x80C08760/func_80C088B8.asm") + Collision_FiniCylinder(globalCtx, &this->collider); +} -GLOBAL_ASM("asm/non_matchings/ovl_En_Nnh_0x80C08760/EnNnh_Update.asm") +void func_80C08828(EnNnh* this) { + this->actionFunc = func_80C0883C; +} -GLOBAL_ASM("asm/non_matchings/ovl_En_Nnh_0x80C08760/EnNnh_Draw.asm") +void func_80C0883C(EnNnh* this, GlobalContext* globalCtx) { + if (func_800B84D0(&this->actor, globalCtx)) { + func_801518B0(globalCtx, 0x228U, &this->actor); + func_80C088A4(this); + return; + } + func_800B8614(&this->actor, globalCtx, 100.0f); +} + +void func_80C088A4(EnNnh* this) { + this->actionFunc = func_80C088B8; +} + +void func_80C088B8(EnNnh* this, GlobalContext* globalCtx) { + if (func_800B867C(&this->actor, globalCtx)) { + func_80C08828(this); + } +} + +void EnNnh_Update(Actor *thisx, GlobalContext *globalCtx) { + EnNnh* this = THIS; + s32 pad; + + this->actionFunc(this, globalCtx); + Collision_CylinderMoveToActor(&this->actor, &this->collider); + Collision_AddOT(globalCtx, &globalCtx->colCheckCtx, &this->collider.base); +} + +void EnNnh_Draw(Actor *thisx, GlobalContext *globalCtx) { + GraphicsContext* gfxCtx = globalCtx->state.gfxCtx; + s32 pad; + + func_8012C28C(gfxCtx); + gSPMatrix(gfxCtx->polyOpa.p++, SysMatrix_AppendStateToPolyOpaDisp(globalCtx->state.gfxCtx), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(gfxCtx->polyOpa.p++, D_06001510); +} diff --git a/src/overlays/actors/ovl_En_Nnh/z_en_nnh.h b/src/overlays/actors/ovl_En_Nnh/z_en_nnh.h index 43149e9c91..a019fe6c77 100644 --- a/src/overlays/actors/ovl_En_Nnh/z_en_nnh.h +++ b/src/overlays/actors/ovl_En_Nnh/z_en_nnh.h @@ -5,9 +5,12 @@ struct EnNnh; +typedef void (*EnNnhActionFunc)(struct EnNnh*, GlobalContext*); + typedef struct EnNnh { /* 0x000 */ Actor actor; - /* 0x144 */ char unk_144[0x50]; + /* 0x144 */ ColCylinder collider; + /* 0x190 */ EnNnhActionFunc actionFunc; } EnNnh; // size = 0x194 extern const ActorInit En_Nnh_InitVars;