summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/overlays/actors/ovl_Obj_Swprize/z_obj_swprize.c144
-rw-r--r--src/overlays/actors/ovl_Obj_Swprize/z_obj_swprize.h5
2 files changed, 119 insertions, 30 deletions
diff --git a/src/overlays/actors/ovl_Obj_Swprize/z_obj_swprize.c b/src/overlays/actors/ovl_Obj_Swprize/z_obj_swprize.c
index 4472c4fc3..6a50a018f 100644
--- a/src/overlays/actors/ovl_Obj_Swprize/z_obj_swprize.c
+++ b/src/overlays/actors/ovl_Obj_Swprize/z_obj_swprize.c
@@ -14,12 +14,15 @@ void ObjSwprize_Init(Actor* thisx, PlayState* play);
void ObjSwprize_Destroy(Actor* thisx, PlayState* play);
void ObjSwprize_Update(Actor* thisx, PlayState* play);
+void ObjSwprize_DoNothing(ObjSwprize* this, PlayState* play);
void func_80C25654(ObjSwprize* this, PlayState* play);
+void func_80C25640(ObjSwprize* this);
+void func_80C25698(ObjSwprize* this);
void func_80C256AC(ObjSwprize* this, PlayState* play);
+void func_80C25710(ObjSwprize* this);
void func_80C2572C(ObjSwprize* this, PlayState* play);
-void func_80C25794(ObjSwprize* this, PlayState* play);
+void ObjSwprize_SetupDoNothing(ObjSwprize* this);
-#if 0
const ActorInit Obj_Swprize_InitVars = {
ACTOR_OBJ_SWPRIZE,
ACTORCAT_PROP,
@@ -32,30 +35,113 @@ const ActorInit Obj_Swprize_InitVars = {
(ActorFunc)NULL,
};
-#endif
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/func_80C25360.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/func_80C253D0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/ObjSwprize_Init.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/ObjSwprize_Destroy.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/func_80C25640.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/func_80C25654.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/func_80C25698.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/func_80C256AC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/func_80C25710.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/func_80C2572C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/func_80C25780.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/func_80C25794.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Swprize/ObjSwprize_Update.s")
+s16 D_80C257F0[] = { 2, 0x14, 1, 8 };
+
+s16 D_80C257F8[] = { -0x888, 0, 0x888 };
+
+void func_80C25360(ObjSwprize* this, Vec3f* vec) {
+ Matrix_Push();
+ Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_NEW);
+ Matrix_RotateXS(this->actor.shape.rot.x, MTXMODE_APPLY);
+ Matrix_RotateZS(this->actor.shape.rot.z, MTXMODE_APPLY);
+ Matrix_MultVecY(1.0f, vec);
+ Matrix_Pop();
+}
+
+void func_80C253D0(ObjSwprize* this, PlayState* play) {
+ Actor* thisx = &this->actor;
+ s32 i;
+ Actor* collectible;
+ Vec3f sp78;
+ s32 type = OBJ_SWPRIZE_GET_TYPE(thisx);
+ s32 temp_s0 = D_80C257F0[type];
+
+ func_80C25360(this, &sp78);
+
+ if (type == 2) {
+ for (i = 0; i < 3; i++) {
+ collectible = Item_DropCollectible(play, &thisx->world.pos, temp_s0);
+ if (collectible != NULL) {
+ if (sp78.y < 0.98f) {
+ collectible->velocity.y = (sp78.y + 1.0f) * 4.0f;
+ collectible->speedXZ = (2.0f * (1.0f - fabsf(sp78.y))) + 2.0f;
+ collectible->world.rot.y = Math_FAtan2F(sp78.z, sp78.x) + D_80C257F8[i];
+ } else {
+ collectible->world.rot.y = i * (0x10000 / 3);
+ }
+ }
+ }
+ } else {
+ collectible = Item_DropCollectible(play, &thisx->world.pos, temp_s0);
+ if ((collectible != NULL) && (sp78.y < 0.98f)) {
+ collectible->velocity.y = (sp78.y + 1.0f) * 4.0f;
+ collectible->speedXZ = (2.0f * (1.0f - fabsf(sp78.y))) + 2.0f;
+ collectible->world.rot.y = Math_FAtan2F(sp78.z, sp78.x);
+ }
+ }
+}
+
+void ObjSwprize_Init(Actor* thisx, PlayState* play) {
+ ObjSwprize* this = THIS;
+
+ if (Flags_GetSwitch(play, OBJ_SWPRIZE_GET_SWITCH_FLAG(&this->actor))) {
+ ObjSwprize_SetupDoNothing(this);
+ } else {
+ func_80C25640(this);
+ }
+}
+
+void ObjSwprize_Destroy(Actor* thisx, PlayState* play) {
+}
+
+void func_80C25640(ObjSwprize* this) {
+ this->actionFunc = func_80C25654;
+}
+
+void func_80C25654(ObjSwprize* this, PlayState* play) {
+ if (Flags_GetSwitch(play, OBJ_SWPRIZE_GET_SWITCH_FLAG(&this->actor))) {
+ func_80C25698(this);
+ }
+}
+
+void func_80C25698(ObjSwprize* this) {
+ this->actionFunc = func_80C256AC;
+}
+
+void func_80C256AC(ObjSwprize* this, PlayState* play) {
+ if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
+ ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ func_80C253D0(this, play);
+ func_80C25710(this);
+ } else {
+ ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ }
+}
+
+void func_80C25710(ObjSwprize* this) {
+ this->timer = 40;
+ this->actionFunc = func_80C2572C;
+}
+
+void func_80C2572C(ObjSwprize* this, PlayState* play) {
+ if (this->timer > 0) {
+ this->timer--;
+ if (this->timer == 0) {
+ ActorCutscene_Stop(this->actor.cutscene);
+ ObjSwprize_SetupDoNothing(this);
+ }
+ }
+}
+
+void ObjSwprize_SetupDoNothing(ObjSwprize* this) {
+ this->actionFunc = ObjSwprize_DoNothing;
+}
+
+void ObjSwprize_DoNothing(ObjSwprize* this, PlayState* play) {
+}
+
+void ObjSwprize_Update(Actor* thisx, PlayState* play) {
+ ObjSwprize* this = THIS;
+
+ this->actionFunc(this, play);
+}
diff --git a/src/overlays/actors/ovl_Obj_Swprize/z_obj_swprize.h b/src/overlays/actors/ovl_Obj_Swprize/z_obj_swprize.h
index 29654f992..5b7cd2e09 100644
--- a/src/overlays/actors/ovl_Obj_Swprize/z_obj_swprize.h
+++ b/src/overlays/actors/ovl_Obj_Swprize/z_obj_swprize.h
@@ -3,6 +3,9 @@
#include "global.h"
+#define OBJ_SWPRIZE_GET_SWITCH_FLAG(thisx) ((thisx)->params & 0x7F)
+#define OBJ_SWPRIZE_GET_TYPE(thisx) (((thisx)->params >> 8) & 3)
+
struct ObjSwprize;
typedef void (*ObjSwprizeActionFunc)(struct ObjSwprize*, PlayState*);
@@ -10,7 +13,7 @@ typedef void (*ObjSwprizeActionFunc)(struct ObjSwprize*, PlayState*);
typedef struct ObjSwprize {
/* 0x000 */ Actor actor;
/* 0x144 */ ObjSwprizeActionFunc actionFunc;
- /* 0x148 */ char unk_148[0x4];
+ /* 0x148 */ s16 timer;
} ObjSwprize; // size = 0x14C
extern const ActorInit Obj_Swprize_InitVars;