diff --git a/include/z64actor.h b/include/z64actor.h index ef474e3ec2..f55a17978e 100644 --- a/include/z64actor.h +++ b/include/z64actor.h @@ -259,7 +259,10 @@ typedef struct { /* 0xAE7 */ s8 unkAE7; /* 0xAE8 */ UNK_TYPE1 padAE8[0x40]; /* 0xB28 */ s16 unkB28; - /* 0xB2A */ UNK_TYPE1 padB2A[0x72]; + /* 0xB2A */ UNK_TYPE1 padB2A[0x56]; + /* 0xB80 */ f32 unk_B80; + /* 0xB84 */ s16 unk_B84; + /* 0xB86 */ char unk_B86[0x16]; /* 0xB9C */ Vec3f unkB9C; /* 0xBA8 */ UNK_TYPE1 padBA8[0x44]; /* 0xBEC */ Vec3f bodyPartsPos[18]; diff --git a/linker_scripts/code_script.txt b/linker_scripts/code_script.txt index c7ee6128a6..954e322bfc 100644 --- a/linker_scripts/code_script.txt +++ b/linker_scripts/code_script.txt @@ -3563,9 +3563,9 @@ SECTIONS ovl_Obj_Boyo : AT(RomLocation) { build/src/overlays/actors/ovl_Obj_Boyo/z_obj_boyo.o(.text) - build/asm/overlays/ovl_Obj_Boyo_data.o(.data) + build/src/overlays/actors/ovl_Obj_Boyo/z_obj_boyo.o(.data) build/src/overlays/actors/ovl_Obj_Boyo/z_obj_boyo.o(.rodata) - build/asm/overlays/ovl_Obj_Boyo_rodata.o(.rodata) + build/src/overlays/actors/ovl_Obj_Boyo/z_obj_boyo_overlay.o(.ovl) } SegmentEnd = .; SegmentSize = SegmentEnd - SegmentStart; diff --git a/linker_scripts/object_script.txt b/linker_scripts/object_script.txt index 2d2704d650..734e0ad0f5 100644 --- a/linker_scripts/object_script.txt +++ b/linker_scripts/object_script.txt @@ -110,6 +110,10 @@ D_0600DEF0 = 0x0600DEF0; /* arms_hook */ D_0601D960 = 0x0601D960; +/* z_obj_boyo */ +D_06000300 = 0x06000300; +D_06000E88 = 0x06000E88; + /* en_ending_hero */ D_0600B0CC = 0x0600B0CC; D_06000BE0 = 0x06000BE0; diff --git a/src/overlays/actors/ovl_En_Bom/z_en_bom.h b/src/overlays/actors/ovl_En_Bom/z_en_bom.h index 71d5c55de3..3ed63f9bdc 100644 --- a/src/overlays/actors/ovl_En_Bom/z_en_bom.h +++ b/src/overlays/actors/ovl_En_Bom/z_en_bom.h @@ -7,7 +7,9 @@ struct EnBom; typedef struct EnBom { /* 0x000 */ Actor actor; - /* 0x144 */ char unk_144[0xC0]; + /* 0x144 */ char unk_144[0xAC]; + /* 0x1F0 */ s16 timer; + /* 0x1F2 */ char unk_1F2[0x12]; } EnBom; // size = 0x204 extern const ActorInit En_Bom_InitVars; diff --git a/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.h b/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.h index 684353aad0..0647b66543 100644 --- a/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.h +++ b/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.h @@ -7,7 +7,10 @@ struct EnKaizoku; typedef struct EnKaizoku { /* 0x000 */ Actor actor; - /* 0x144 */ char unk_144[0x4AC]; + /* 0x144 */ char unk_144[0x1AC]; + /* 0x2F0 */ f32 unk_2F0; + /* 0x2F4 */ s16 unk_2F4; + /* 0x2F6 */ char unk_2F6[0x2FA]; } EnKaizoku; // size = 0x5F0 extern const ActorInit En_Kaizoku_InitVars; diff --git a/src/overlays/actors/ovl_Obj_Boyo/z_obj_boyo.c b/src/overlays/actors/ovl_Obj_Boyo/z_obj_boyo.c index b64e5e5bce..7fc09af2d0 100644 --- a/src/overlays/actors/ovl_Obj_Boyo/z_obj_boyo.c +++ b/src/overlays/actors/ovl_Obj_Boyo/z_obj_boyo.c @@ -1,15 +1,22 @@ +/* + * File: z_obj_boyo.c + * Overlay: ovl_Obj_Boyo + * Description: Unused Bumper + */ + #include "z_obj_boyo.h" +#include "../ovl_En_Kaizoku/z_en_kaizoku.h" +#include "../ovl_En_Bom/z_en_bom.h" #define FLAGS 0x00000010 #define THIS ((ObjBoyo*)thisx) void ObjBoyo_Init(Actor* thisx, GlobalContext* globalCtx); -void ObjBoyo_Destroy(Actor* thisx, GlobalContext* globalCtx); -void ObjBoyo_Update(Actor* thisx, GlobalContext* globalCtx); +void ObjBoyo_Destroy(Actor* thisx, GlobalContext* globalCtx2); +void ObjBoyo_Update(Actor* thisx, GlobalContext* globalCtx2); void ObjBoyo_Draw(Actor* thisx, GlobalContext* globalCtx); -/* const ActorInit Obj_Boyo_InitVars = { ACTOR_OBJ_BOYO, ACTORCAT_PROP, @@ -19,22 +26,161 @@ const ActorInit Obj_Boyo_InitVars = { (ActorFunc)ObjBoyo_Init, (ActorFunc)ObjBoyo_Destroy, (ActorFunc)ObjBoyo_Update, - (ActorFunc)ObjBoyo_Draw + (ActorFunc)ObjBoyo_Draw, }; -*/ -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Obj_Boyo_0x809A5D10/ObjBoyo_Init.asm") +static ColliderCylinderInit sCylinderInit = { + { + COLTYPE_NONE, + AT_NONE, + AC_ON | AC_HARD | AC_TYPE_PLAYER, + OC1_ON | OC1_TYPE_ALL, + OC2_TYPE_2, + COLSHAPE_CYLINDER, + }, + { + ELEMTYPE_UNK0, + { 0x00000000, 0x00, 0x00 }, + { 0x01CBFFBE, 0x00, 0x00 }, + TOUCH_NONE | TOUCH_SFX_NORMAL, + BUMP_ON, + OCELEM_ON, + }, + { 60, 140, 0, { 0, 0, 0 } }, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Obj_Boyo_0x809A5D10/ObjBoyo_Destroy.asm") +static InitChainEntry sInitChain[] = { + ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_CONTINUE), + ICHAIN_F32(uncullZoneScale, 300, ICHAIN_CONTINUE), + ICHAIN_F32(uncullZoneDownward, 300, ICHAIN_CONTINUE), + ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_STOP), +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Obj_Boyo_0x809A5D10/func_809A5DC0.asm") +extern Gfx D_06000300[]; +extern AnimatedTexture D_06000E88; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Obj_Boyo_0x809A5D10/func_809A5DE0.asm") +void ObjBoyo_Init(Actor* thisx, GlobalContext* globalCtx) { + ObjBoyo* this = THIS; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Obj_Boyo_0x809A5D10/func_809A5E14.asm") + Actor_ProcessInitChain(&this->actor, &sInitChain); + Collider_InitCylinder(globalCtx, &this->collider); + Collider_SetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit); + Collider_UpdateCylinder(this, &this->collider); + this->actor.colChkInfo.mass = MASS_IMMOVABLE; + this->unk_190 = Lib_SegmentedToVirtual(&D_06000E88); +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Obj_Boyo_0x809A5D10/func_809A5E24.asm") +void ObjBoyo_Destroy(Actor* thisx, GlobalContext* globalCtx2) { + GlobalContext* globalCtx = globalCtx2; + ObjBoyo* this = THIS; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Obj_Boyo_0x809A5D10/ObjBoyo_Update.asm") + Collider_DestroyCylinder(globalCtx, &this->collider); +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Obj_Boyo_0x809A5D10/ObjBoyo_Draw.asm") +void ObjBoyo_UpdatePlayerBumpValues(ObjBoyo* this, ActorPlayer* target) { + target->unk_B80 = 30.0f; + target->unk_B84 = this->actor.yawTowardsPlayer; +} + +void ObjBoyo_UpdatePirateBumpValues(ObjBoyo* src, EnKaizoku* target) { + target->unk_2F0 = 30.0f; + target->unk_2F4 = Actor_YawBetweenActors(src, target); +} + +void ObjBoyo_UpdateBombBumpValues(ObjBoyo* src, EnBom* target) { + target->timer = 0; +} + +BumperCollideInfo sBumperCollideInfo[] = { + { ACTOR_PLAYER, ObjBoyo_UpdatePlayerBumpValues }, + { ACTOR_EN_KAIZOKU, ObjBoyo_UpdatePirateBumpValues }, + { ACTOR_EN_BOM, ObjBoyo_UpdateBombBumpValues }, +}; + +Actor* ObjBoyo_GetCollidedActor(ObjBoyo* this, GlobalContext* globalCtx, s32* num) { + Actor* collideActor; + BumperCollideInfo* collideInfo; + s32 i; + + if (this->collider.base.ocFlags2 & 1) { + *num = 0; + return globalCtx->actorCtx.actorList[2].first; + } + + if (this->collider.base.ocFlags1 & 2) { + for (collideActor = this->collider.base.oc, collideInfo = &sBumperCollideInfo[1], i = 1; i < 3; + collideInfo++, i++) { + if (collideInfo->id == collideActor->id) { + *num = i; + return collideActor; + } + } + } + + return NULL; +} + +void ObjBoyo_Update(Actor* thisx, GlobalContext* globalCtx2) { + ObjBoyo* this = THIS; + GlobalContext* globalCtx = globalCtx2; + Actor* target; + s32 num; + + target = ObjBoyo_GetCollidedActor(thisx, globalCtx, &num); + + if (target != NULL) { + sBumperCollideInfo[num].actorCollideFunc(this, (void*)target); + this->unk_194 = 100; + this->unk_196 = 3; + this->unk_198 = 0.01f; + this->unk_19C = this->unk_1A0 = 0.03f; + this->unk_1A4 = 0x3F40; + this->unk_1A6 = 2000; + this->unk_1A8 = 0; + this->unk_1AA = 0x2DF7; + this->unk_1AC = 600; + } + + if (this->unk_194 > 0) { + this->unk_194 -= this->unk_196; + this->unk_1AA += this->unk_1AC; + this->unk_1A8 += this->unk_1AA; + + this->actor.scale.x = this->actor.scale.z = + (Math_CosS(this->unk_1A8 + this->unk_1A4) * this->unk_194 * this->unk_19C * this->unk_198) + 0.1f; + this->actor.scale.y = + (Math_CosS(this->unk_1A8 + this->unk_1A6) * this->unk_194 * this->unk_1A0 * this->unk_198) + 0.1f; + } else { + Actor_SetScale(&this->actor, 0.1f); + + if (this->collider.base.acFlags & 2) { + this->unk_194 = 30; + this->unk_196 = 2; + this->unk_198 = 0.033333335f; + this->unk_19C = 0.012f; + this->unk_1A0 = 0.006f; + this->unk_1A4 = 0x3F40; + this->unk_1A6 = 2000; + this->unk_1A8 = 0; + this->unk_1AA = 15000; + this->unk_1AC = 1600; + } + } + + this->collider.base.acFlags &= ~2; + this->collider.base.ocFlags1 &= ~2; + this->collider.base.ocFlags2 &= ~1; + + CollisionCheck_SetOC(globalCtx, &globalCtx->colCheckCtx, &this->collider.base); + + if (thisx->xzDistToPlayer < 2000.0f) { + CollisionCheck_SetAC(globalCtx, &globalCtx->colCheckCtx, &this->collider.base); + } +} + +void ObjBoyo_Draw(Actor* thisx, GlobalContext* globalCtx) { + ObjBoyo* this = THIS; + + SceneProc_DrawAllSceneAnimatedTextures(globalCtx, this->unk_190); + func_800BDFC0(globalCtx, D_06000300); +} diff --git a/src/overlays/actors/ovl_Obj_Boyo/z_obj_boyo.h b/src/overlays/actors/ovl_Obj_Boyo/z_obj_boyo.h index c390e4aa69..d6c089609b 100644 --- a/src/overlays/actors/ovl_Obj_Boyo/z_obj_boyo.h +++ b/src/overlays/actors/ovl_Obj_Boyo/z_obj_boyo.h @@ -5,9 +5,27 @@ struct ObjBoyo; +typedef void (*BumperCollideActorFunc)(struct ObjBoyo*, void*); + +typedef struct { + /* 0x0 */ s16 id; + /* 0x4 */ BumperCollideActorFunc actorCollideFunc; +} BumperCollideInfo; + typedef struct ObjBoyo { /* 0x000 */ Actor actor; - /* 0x144 */ char unk_144[0x6C]; + /* 0x144 */ ColliderCylinder collider; + /* 0x190 */ AnimatedTexture* unk_190; + /* 0x194 */ s16 unk_194; + /* 0x196 */ s16 unk_196; + /* 0x198 */ f32 unk_198; + /* 0x19C */ f32 unk_19C; + /* 0x1A0 */ f32 unk_1A0; + /* 0x1A4 */ s16 unk_1A4; + /* 0x1A6 */ s16 unk_1A6; + /* 0x1A8 */ s16 unk_1A8; + /* 0x1AA */ s16 unk_1AA; + /* 0x1AC */ s16 unk_1AC; } ObjBoyo; // size = 0x1B0 extern const ActorInit Obj_Boyo_InitVars; diff --git a/tables/variables.txt b/tables/variables.txt index 2d993b4791..14513d088c 100644 --- a/tables/variables.txt +++ b/tables/variables.txt @@ -10539,7 +10539,7 @@ 0x809A6150:("Obj_Boyo_InitVars","UNK_TYPE1","",0x1), 0x809A6170:("D_809A6170","UNK_TYPE1","",0x1), 0x809A619C:("D_809A619C","UNK_TYPE1","",0x1), - 0x809A61B0:("D_809A61B0","UNK_TYPE1","",0x1), + 0x809A61B0:("sBumperCollideInfo","UNK_TYPE1","",0x1), 0x809A61B4:("D_809A61B4","UNK_TYPE2","",0x2), 0x809A61D0:("D_809A61D0","f32","",0x4), 0x809A61D4:("D_809A61D4","f32","",0x4),