diff --git a/assets/xml/objects/gameplay_keep.xml b/assets/xml/objects/gameplay_keep.xml index ebbd02808c..a6504f2f37 100644 --- a/assets/xml/objects/gameplay_keep.xml +++ b/assets/xml/objects/gameplay_keep.xml @@ -935,7 +935,7 @@ - + diff --git a/spec b/spec index bcb58fecd0..12750b73fb 100644 --- a/spec +++ b/spec @@ -4542,8 +4542,7 @@ beginseg name "ovl_Obj_Kinoko" compress include "build/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.o" - include "build/data/ovl_Obj_Kinoko/ovl_Obj_Kinoko.data.o" - include "build/data/ovl_Obj_Kinoko/ovl_Obj_Kinoko.reloc.o" + include "build/src/overlays/actors/ovl_Obj_Kinoko/ovl_Obj_Kinoko_reloc.o" endseg beginseg diff --git a/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.c b/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.c index 8d4b2f5825..d580c5e8a4 100644 --- a/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.c +++ b/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.c @@ -5,8 +5,9 @@ */ #include "z_obj_kinoko.h" +#include "objects/gameplay_keep/gameplay_keep.h" -#define FLAGS 0x00000010 +#define FLAGS (ACTOR_FLAG_10) #define THIS ((ObjKinoko*)thisx) @@ -15,7 +16,6 @@ void ObjKinoko_Destroy(Actor* thisx, GlobalContext* globalCtx); void ObjKinoko_Update(Actor* thisx, GlobalContext* globalCtx); void ObjKinoko_Draw(Actor* thisx, GlobalContext* globalCtx); -#if 0 const ActorInit Obj_Kinoko_InitVars = { ACTOR_OBJ_KINOKO, ACTORCAT_ITEMACTION, @@ -28,12 +28,63 @@ const ActorInit Obj_Kinoko_InitVars = { (ActorFunc)ObjKinoko_Draw, }; -#endif +void ObjKinoko_Init(Actor* thisx, GlobalContext* globalCtx) { + thisx->world.pos.y += 4.0f; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Kinoko/ObjKinoko_Init.s") +void ObjKinoko_Destroy(Actor* thisx, GlobalContext* globalCtx) { +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Kinoko/ObjKinoko_Destroy.s") +void ObjKinoko_Update(Actor* thisx, GlobalContext* globalCtx) { + Player* player = GET_PLAYER(globalCtx); + s32 pad; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Kinoko/ObjKinoko_Update.s") + if (player->currentMask != PLAYER_MASK_SCENTS) { + thisx->draw = NULL; + thisx->hintId = 0xFF; + thisx->flags &= ~ACTOR_FLAG_1; + } else { + thisx->draw = ObjKinoko_Draw; + thisx->hintId = 0x64; + thisx->flags |= ACTOR_FLAG_1; + if (Actor_HasParent(thisx, globalCtx)) { + Flags_SetCollectible(globalCtx, OBJ_KINOKO_GET_FLAG(thisx)); + Actor_MarkForDeath(thisx); + return; + } + Actor_PickUp(thisx, globalCtx, GI_MAX, 20.0f, 10.0f); + if (Math_SmoothStepToF(&thisx->speedXZ, 0.0f, 0.04f, 2.0f, 0.5f) < 0.5f) { + thisx->scale.x = 0.0f; + thisx->speedXZ = 110.0f; + thisx->velocity.x = 0.2f; + } + if (Math_SmoothStepToF(&thisx->scale.x, thisx->velocity.x, 0.04f, 0.004f, 0.001f) < + ((thisx->velocity.x == 0.0f) ? 0.0f : 0.05f)) { + thisx->velocity.x = 0.0f; + } + thisx->scale.y = thisx->scale.x; + thisx->scale.z = thisx->scale.x; + thisx->shape.rot.y = func_800DFCDC(globalCtx->cameraPtrs[globalCtx->activeCamera]) + 0x8000; + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Kinoko/ObjKinoko_Draw.s") +void ObjKinoko_Draw(Actor* thisx, GlobalContext* globalCtx) { + Gfx* gfx; + + OPEN_DISPS(globalCtx->state.gfxCtx); + + func_8012C2DC(globalCtx->state.gfxCtx); + + gfx = POLY_XLU_DISP; + gDPSetPrimColor(&gfx[0], 0, 0, 169, 63, 186, (u8)thisx->speedXZ); + gDPSetEnvColor(&gfx[1], 110, 44, 200, 100); + gDPSetRenderMode(&gfx[2], G_RM_PASS, G_RM_ZB_CLD_SURF2); + gSPMatrix(&gfx[3], Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(&gfx[4], &gameplay_keep_DL_029D10[2]); + Matrix_InsertXRotation_s(-0x4000, 1); + gSPMatrix(&gfx[5], Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(&gfx[6], &gameplay_keep_DL_029D10[2]); + POLY_XLU_DISP = &gfx[7]; + + CLOSE_DISPS(globalCtx->state.gfxCtx); +} diff --git a/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.h b/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.h index 9ae26adf9d..9073e3e14c 100644 --- a/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.h +++ b/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.h @@ -11,4 +11,6 @@ typedef struct ObjKinoko { extern const ActorInit Obj_Kinoko_InitVars; +#define OBJ_KINOKO_GET_FLAG(thisx) ((thisx)->params & 0x7F) + #endif // Z_OBJ_KINOKO_H