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