diff options
| author | petrie911 <69443847+petrie911@users.noreply.github.com> | 2020-12-31 18:56:02 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-12-31 19:56:02 -0500 |
| commit | 7daadc5ea123485ebfa9c6ea461c5c6cc566df87 (patch) | |
| tree | 2c7a11c9298ce5193f5f0b2162328cdb9fe5c123 /src | |
| parent | 600bad1f20e259b70708944b045d3f4407b673bf (diff) | |
En_Ex_Item (#567)
* first go
* match
* vt
* docs
* one last thing
* formatted
* bowling, why not
* header
* Update src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.h
Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com>
* Update src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c
Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com>
* press FFFF
Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/code/z_en_item00.c | 2 | ||||
| -rw-r--r-- | src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c | 28 | ||||
| -rw-r--r-- | src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c | 9 | ||||
| -rw-r--r-- | src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.h | 2 | ||||
| -rw-r--r-- | src/overlays/actors/ovl_En_Changer/z_en_changer.c | 3 | ||||
| -rw-r--r-- | src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c | 501 | ||||
| -rw-r--r-- | src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.h | 49 |
7 files changed, 551 insertions, 43 deletions
diff --git a/src/code/z_en_item00.c b/src/code/z_en_item00.c index c9fe52f00..ef57cd1cd 100644 --- a/src/code/z_en_item00.c +++ b/src/code/z_en_item00.c @@ -782,7 +782,7 @@ void func_8001F080(EnItem00* this, GlobalContext* globalCtx) { gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_en_item00.c", 1607), G_MTX_MODELVIEW | G_MTX_LOAD); - gSPDisplayList(POLY_OPA_DISP++, &D_0403F070); + gSPDisplayList(POLY_OPA_DISP++, D_0403F070); CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_en_item00.c", 1611); } diff --git a/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c b/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c index dec689193..a8ffbf761 100644 --- a/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c +++ b/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c @@ -1,6 +1,7 @@ #include "z_en_bom_bowl_man.h" #include "vt.h" #include "overlays/actors/ovl_En_Syateki_Niw/z_en_syateki_niw.h" +#include "overlays/actors/ovl_En_Ex_Item/z_en_ex_item.h" #define FLAGS 0x08000039 @@ -249,8 +250,8 @@ void EnBomBowMan_RunGame(EnBomBowlMan* this, GlobalContext* globalCtx) { this->actor.textId = 0x1A; this->dialogState = 4; this->minigamePlayStatus = 0; - if ((this->exItem != NULL) && (this->exItem->actor.update != 0)) { - this->exItem->unk_160 = 1; + if ((this->exItem != NULL) && (this->exItem->actor.update != NULL)) { + this->exItem->killItem = true; this->exItem = NULL; } globalCtx->bombchuBowlingStatus = 0; @@ -379,35 +380,36 @@ void EnBomBowMan_ChooseShowPrize(EnBomBowlMan* this, GlobalContext* globalCtx) { if (this->prizeRevealTimer == 0) { switch (this->prizeSelect) { case 0: - prizeTemp = 0; + prizeTemp = EXITEM_BOMB_BAG_BOWLING; if (gSaveContext.itemGetInf[1] & 2) { - prizeTemp = 4; + prizeTemp = EXITEM_PURPLE_RUPEE_BOWLING; } break; case 1: - prizeTemp = 4; + prizeTemp = EXITEM_PURPLE_RUPEE_BOWLING; break; case 2: - prizeTemp = 2; + prizeTemp = EXITEM_BOMBCHUS_BOWLING; break; case 3: - prizeTemp = 1; + prizeTemp = EXITEM_HEART_PIECE_BOWLING; if (gSaveContext.itemGetInf[1] & 4) { - prizeTemp = 4; + prizeTemp = EXITEM_PURPLE_RUPEE_BOWLING; } break; case 4: - prizeTemp = 3; + prizeTemp = EXITEM_BOMBS_BOWLING; break; } this->prizeIndex = prizeTemp; if (BREG(7)) { this->prizeIndex = BREG(7) - 1; } - this->exItem = (EnExItem*)Actor_SpawnAsChild( - &globalCtx->actorCtx, &this->actor, globalCtx, ACTOR_EN_EX_ITEM, - sPrizePosOffset[this->prizeIndex].x + 148.0f, sPrizePosOffset[this->prizeIndex].y + 40.0f, - sPrizePosOffset[this->prizeIndex].z + 300.0f, 0, sPrizeRot[this->prizeIndex], 0, this->prizeIndex + 5); + this->exItem = (EnExItem*)Actor_SpawnAsChild(&globalCtx->actorCtx, &this->actor, globalCtx, ACTOR_EN_EX_ITEM, + sPrizePosOffset[this->prizeIndex].x + 148.0f, + sPrizePosOffset[this->prizeIndex].y + 40.0f, + sPrizePosOffset[this->prizeIndex].z + 300.0f, 0, + sPrizeRot[this->prizeIndex], 0, this->prizeIndex + EXITEM_COUNTER); if (!this->startedPlaying) { this->bowlPit = (EnBomBowlPit*)Actor_SpawnAsChild(&globalCtx->actorCtx, &this->actor, globalCtx, ACTOR_EN_BOM_BOWL_PIT, 0.0f, 90.0f, -860.0f, 0, 0, 0, 0); diff --git a/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c b/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c index 2817224a4..3a764a4db 100644 --- a/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c +++ b/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c @@ -1,6 +1,7 @@ #include "z_en_bom_bowl_pit.h" #include "vt.h" #include "overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.h" +#include "overlays/actors/ovl_En_Ex_Item/z_en_ex_item.h" #define FLAGS 0x00000010 @@ -155,12 +156,12 @@ void EnBomBowlPit_SpawnPrize(EnBomBowlPit* this, GlobalContext* globalCtx) { } void EnBomBowlPit_SetupGivePrize(EnBomBowlPit* this, GlobalContext* globalCtx) { - if (this->unk_156 != 0) { + if (this->exItemDone != 0) { switch (this->prizeIndex) { - case 0: + case EXITEM_BOMB_BAG_BOWLING: gSaveContext.itemGetInf[1] |= 2; break; - case 1: + case EXITEM_HEART_PIECE_BOWLING: gSaveContext.itemGetInf[1] |= 4; break; } @@ -206,7 +207,7 @@ void EnBomBowlPit_Reset(EnBomBowlPit* this, GlobalContext* globalCtx) { // Ah recovery! (?) osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ あぁ回復! ☆☆☆☆☆ \n" VT_RST); } - this->unk_156 = 0; + this->exItemDone = 0; this->status = 2; this->actionFunc = EnBomBowlPit_SetupDetectHit; } diff --git a/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.h b/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.h index eb12b867d..ee9ff1cd0 100644 --- a/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.h +++ b/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.h @@ -15,7 +15,7 @@ typedef struct EnBomBowlPit { /* 0x0150 */ u16 unk_150; /* 0x0152 */ s16 camId; /* 0x0154 */ s16 unk_154; - /* 0x0156 */ s16 unk_156; // Set by EnExItem? + /* 0x0156 */ s16 exItemDone; // Set by EnExItem? /* 0x0158 */ s16 timer; /* 0x015A */ s16 prizeIndex; /* 0x015C */ s16 start; diff --git a/src/overlays/actors/ovl_En_Changer/z_en_changer.c b/src/overlays/actors/ovl_En_Changer/z_en_changer.c index 93c07b026..50ee77b35 100644 --- a/src/overlays/actors/ovl_En_Changer/z_en_changer.c +++ b/src/overlays/actors/ovl_En_Changer/z_en_changer.c @@ -7,6 +7,7 @@ #include "z_en_changer.h" #include "vt.h" #include "overlays/actors/ovl_Item_Etcetera/z_item_etcetera.h" +#include "overlays/actors/ovl_En_Ex_Item/z_en_ex_item.h" #define FLAGS 0x00000000 @@ -246,7 +247,7 @@ void EnChanger_OpenChests(EnChanger* this, GlobalContext* globalCtx) { Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_EX_ITEM, xPos, yPos, zPos, 0, 0, 0, 0xF); Flags_SetSwitch(globalCtx, 0x32); } else { - temp_s0_2 = (s16)(this->rightChestGetItemId - 0x72) + 0xA; + temp_s0_2 = (s16)(this->rightChestGetItemId - GI_RUPEE_GREEN_LOSE) + EXITEM_CHEST; // Open right treasure (chest) osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ 右宝開く ☆☆☆☆☆ %d\n" VT_RST, temp_s0_2); Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_EX_ITEM, xPos, yPos, zPos, 0, 0, 0, diff --git a/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c b/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c index d34ef660c..150358897 100644 --- a/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c +++ b/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c @@ -1,4 +1,12 @@ +/* + * File: z_en_ex_item.c + * Overlay: ovl_En_Ex_Item + * Description: Minigame prize items + */ + #include "z_en_ex_item.h" +#include "vt.h" +#include "overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.h" #define FLAGS 0x00000030 @@ -9,7 +17,22 @@ void EnExItem_Destroy(Actor* thisx, GlobalContext* globalCtx); void EnExItem_Update(Actor* thisx, GlobalContext* globalCtx); void EnExItem_Draw(Actor* thisx, GlobalContext* globalCtx); -/* +void EnExItem_DrawItems(EnExItem* this, GlobalContext* globalCtx); +void EnExItem_DrawHeartPiece(EnExItem* this, GlobalContext* globalCtx); +void EnExItem_DrawRupee(EnExItem* this, GlobalContext* globalCtx); +void EnExItem_DrawKey(EnExItem* this, GlobalContext* globalCtx, s32 index); +void EnExItem_DrawMagic(EnExItem* this, GlobalContext* globalCtx, s16 magicIndex); + +void EnExItem_WaitForObject(EnExItem* this, GlobalContext* globalCtx); +void EnExItem_BowlPrize(EnExItem* this, GlobalContext* globalCtx); +void EnExItem_SetupBowlCounter(EnExItem* this, GlobalContext* globalCtx); +void EnExItem_BowlCounter(EnExItem* this, GlobalContext* globalCtx); +void EnExItem_ExitChest(EnExItem* this, GlobalContext* globalCtx); +void EnExItem_FairyMagic(EnExItem* this, GlobalContext* globalCtx); +void EnExItem_TargetPrizeApproach(EnExItem* this, GlobalContext* globalCtx); +void EnExItem_TargetPrizeGive(EnExItem* this, GlobalContext* globalCtx); +void EnExItem_TargetPrizeFinish(EnExItem* this, GlobalContext* globalCtx); + const ActorInit En_Ex_Item_InitVars = { ACTOR_EN_EX_ITEM, ACTORTYPE_PROP, @@ -21,39 +44,477 @@ const ActorInit En_Ex_Item_InitVars = { (ActorFunc)EnExItem_Update, (ActorFunc)EnExItem_Draw, }; -*/ -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ex_Item/EnExItem_Destroy.s") -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ex_Item/EnExItem_Init.s") +void EnExItem_Destroy(Actor* thisx, GlobalContext* globalCtx) { +} + +void EnExItem_Init(Actor* thisx, GlobalContext* globalCtx) { + s32 pad; + EnExItem* this = THIS; + + this->actor.flags &= ~1; + this->type = this->actor.params & 0xFF; + this->unusedParam = (this->actor.params >> 8) & 0xFF; + osSyncPrintf("\n\n"); + // What will come out? + osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ なにがでるかな? ☆☆☆☆☆ %d\n" VT_RST, this->type); + // What will come out? + osSyncPrintf(VT_FGCOL(YELLOW) "☆☆☆☆☆ なにがでるかな? ☆☆☆☆☆ %d\n" VT_RST, this->unusedParam); + this->initPos = this->actor.posRot.pos; + this->getItemObjId = -1; + switch (this->type) { + case EXITEM_BOMB_BAG_BOWLING: + case EXITEM_BOMB_BAG_COUNTER: + this->getItemObjId = OBJECT_GI_BOMBPOUCH; + break; + case EXITEM_HEART_PIECE_BOWLING: + case EXITEM_HEART_PIECE_COUNTER: + this->getItemObjId = OBJECT_GI_HEARTS; + break; + case EXITEM_BOMBCHUS_BOWLING: + case EXITEM_BOMBCHUS_COUNTER: + this->getItemObjId = OBJECT_GI_BOMB_2; + break; + case EXITEM_BOMBS_BOWLING: + case EXITEM_BOMBS_COUNTER: + this->getItemObjId = OBJECT_GI_BOMB_1; + break; + case EXITEM_PURPLE_RUPEE_BOWLING: + case EXITEM_PURPLE_RUPEE_COUNTER: + case EXITEM_GREEN_RUPEE_CHEST: + case EXITEM_BLUE_RUPEE_CHEST: + case EXITEM_RED_RUPEE_CHEST: + case EXITEM_13: + case EXITEM_14: + this->getItemObjId = OBJECT_GI_RUPY; + break; + case EXITEM_SMALL_KEY_CHEST: + this->scale = 0.05f; + this->actor.velocity.y = 10.0f; + this->timer = 7; + this->actionFunc = EnExItem_ExitChest; + break; + case EXITEM_MAGIC_FIRE: + case EXITEM_MAGIC_WIND: + case EXITEM_MAGIC_DARK: + this->getItemObjId = OBJECT_GI_GODDESS; + break; + case EXITEM_BULLET_BAG: + this->getItemObjId = OBJECT_GI_DEKUPOUCH; + } + + if (this->getItemObjId >= 0) { + this->objectIdx = Object_GetIndex(&globalCtx->objectCtx, this->getItemObjId); + this->actor.draw = NULL; + if (this->objectIdx < 0) { + Actor_Kill(&this->actor); + // What? + osSyncPrintf("なにみの? %d\n", this->actor.params); + // bank is funny + osSyncPrintf(VT_FGCOL(PURPLE) " バンクおかしいしぞ!%d\n" VT_RST "\n", this->actor.params); + return; + } + this->actionFunc = EnExItem_WaitForObject; + } +} + +void EnExItem_WaitForObject(EnExItem* this, GlobalContext* globalCtx) { + s32 onCounter; + + if (Object_IsLoaded(&globalCtx->objectCtx, this->objectIdx)) { + // End of transfer + osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ 転送終了 ☆☆☆☆☆ %d\n" VT_RST, this->actor.params, this); + osSyncPrintf(VT_FGCOL(YELLOW) "☆☆☆☆☆ 転送終了 ☆☆☆☆☆ %d\n" VT_RST, this->actor.params, this); + osSyncPrintf(VT_FGCOL(BLUE) "☆☆☆☆☆ 転送終了 ☆☆☆☆☆ %d\n" VT_RST, this->actor.params, this); + osSyncPrintf(VT_FGCOL(PURPLE) "☆☆☆☆☆ 転送終了 ☆☆☆☆☆ %d\n" VT_RST, this->actor.params, this); + osSyncPrintf(VT_FGCOL(CYAN) "☆☆☆☆☆ 転送終了 ☆☆☆☆☆ %d\n\n" VT_RST, this->actor.params, this); + this->actor.objBankIndex = this->objectIdx; + this->actor.draw = EnExItem_Draw; + this->stopRotate = false; + onCounter = false; + switch (this->type) { + case EXITEM_BOMB_BAG_COUNTER: + onCounter = true; + case EXITEM_BOMB_BAG_BOWLING: + this->unk_17C = func_8002EBCC; + this->drawItemId = 0x18; + this->timer = 65; + this->prizeRotateTimer = 35; + this->scale = 0.5f; + if (onCounter == 0) { + this->actionFunc = EnExItem_BowlPrize; + } else { + this->actionFunc = EnExItem_SetupBowlCounter; + this->actor.shape.unk_08 = -18.0f; + } + break; + case EXITEM_HEART_PIECE_COUNTER: + onCounter = true; + case EXITEM_HEART_PIECE_BOWLING: + this->unk_17C = func_8002ED80; + this->timer = 65; + this->prizeRotateTimer = 35; + this->scale = 0.5f; + if (!onCounter) { + func_80078884(NA_SE_SY_PIECE_OF_HEART); + this->actionFunc = EnExItem_BowlPrize; + } else { + this->actionFunc = EnExItem_SetupBowlCounter; + this->actor.shape.unk_08 = -10.0f; + } + break; + case EXITEM_BOMBCHUS_COUNTER: + onCounter = true; + case EXITEM_BOMBCHUS_BOWLING: + this->unk_17C = func_8002EBCC; + this->drawItemId = 39; + this->timer = 65; + this->prizeRotateTimer = 35; + this->scale = 0.5f; + if (!onCounter) { + this->actionFunc = EnExItem_BowlPrize; + } else { + this->actionFunc = EnExItem_SetupBowlCounter; + } + break; + case EXITEM_BOMBS_BOWLING: + case EXITEM_BOMBS_COUNTER: + this->unk_17C = func_8002EBCC; + this->drawItemId = 0x1F; + this->timer = 65; + this->prizeRotateTimer = 35; + this->scale = 0.5f; + this->unkFloat = 0.5f; + if (this->type == EXITEM_BOMBS_BOWLING) { + this->actionFunc = EnExItem_BowlPrize; + } else { + this->actionFunc = EnExItem_SetupBowlCounter; + this->actor.shape.unk_08 = 10.0f; + } + break; + case EXITEM_PURPLE_RUPEE_BOWLING: + case EXITEM_PURPLE_RUPEE_COUNTER: + this->unk_17C = func_8002EBCC; + this->unk_180 = func_8002ED80; + this->drawItemId = 0x70; + this->timer = 65; + this->prizeRotateTimer = 35; + this->scale = 0.5f; + this->unkFloat = 0.5f; + if (this->type == EXITEM_PURPLE_RUPEE_BOWLING) { + this->actionFunc = EnExItem_BowlPrize; + } else { + this->actionFunc = EnExItem_SetupBowlCounter; + this->actor.shape.unk_08 = 40.0f; + } + break; + case EXITEM_GREEN_RUPEE_CHEST: + case EXITEM_BLUE_RUPEE_CHEST: + case EXITEM_RED_RUPEE_CHEST: + case EXITEM_13: + case EXITEM_14: + this->unk_17C = func_8002EBCC; + this->unk_180 = func_8002ED80; + this->timer = 7; + this->scale = 0.5f; + this->unkFloat = 0.5f; + this->actor.velocity.y = 10.0f; + switch (this->type) { + case EXITEM_GREEN_RUPEE_CHEST: + this->drawItemId = 0x6C; + break; + case EXITEM_BLUE_RUPEE_CHEST: + this->drawItemId = 0x6D; + break; + case EXITEM_RED_RUPEE_CHEST: + this->drawItemId = 0x6E; + break; + case EXITEM_14: + this->drawItemId = 0x70; + break; + } + this->actionFunc = EnExItem_ExitChest; + break; + case EXITEM_MAGIC_FIRE: + case EXITEM_MAGIC_WIND: + case EXITEM_MAGIC_DARK: + this->scale = 0.35f; + this->actionFunc = EnExItem_FairyMagic; + break; + case EXITEM_BULLET_BAG: + this->unk_17C = func_8002EBCC; + this->drawItemId = 0x6B; + this->scale = 0.1f; + this->timer = 80; + this->prizeRotateTimer = 35; + this->actionFunc = EnExItem_TargetPrizeApproach; + break; + case EXITEM_SMALL_KEY_CHEST: + break; + } + } +} + +void EnExItem_BowlPrize(EnExItem* this, GlobalContext* globalCtx) { + s32 pad; + f32 tmpf1; + f32 tmpf2; + f32 tmpf3; + f32 tmpf4; + f32 tmpf5; + f32 tmpf6; + f32 tmpf7; + f32 sp3C; + + if (!this->stopRotate) { + this->actor.shape.rot.y += 0x1000; + if ((this->prizeRotateTimer == 0) && ((this->actor.shape.rot.y & 0xFFFF) == 0x9000)) { + this->stopRotate++; + } + } else { + Math_SmoothStepToS(&this->actor.shape.rot.y, 0, 5, 0x1000, 0); + } + if (this->timer != 0) { + if (this->prizeRotateTimer != 0) { + sp3C = 250.0f; + if (this->type == EXITEM_BOMBCHUS_BOWLING) { + sp3C = 220.0f; + } + tmpf1 = globalCtx->view.lookAt.x - globalCtx->view.eye.x; + tmpf2 = globalCtx->view.lookAt.y - globalCtx->view.eye.y; + tmpf3 = globalCtx->view.lookAt.z + sp3C - globalCtx->view.eye.z; + tmpf4 = sqrtf(SQ(tmpf1) + SQ(tmpf2) + SQ(tmpf3)); + + tmpf5 = (tmpf1 / tmpf4) * 5.0f; + tmpf6 = (tmpf2 / tmpf4) * 5.0f; + tmpf7 = (tmpf3 / tmpf4) * 5.0f; + + tmpf1 = globalCtx->view.eye.x + tmpf5 - this->actor.posRot.pos.x; + tmpf2 = globalCtx->view.eye.y + tmpf6 - this->actor.posRot.pos.y; + tmpf3 = globalCtx->view.eye.z + tmpf7 - this->actor.posRot.pos.z; + + this->actor.posRot.pos.x += (tmpf1 / tmpf4) * 5.0f; + this->actor.posRot.pos.y += (tmpf2 / tmpf4) * 5.0f; + this->actor.posRot.pos.z += (tmpf3 / tmpf4) * 5.0f; + } + } else { + // parent + osSyncPrintf(VT_FGCOL(GREEN) " ☆☆☆☆☆ 母親ー? ☆☆☆☆☆ %x\n" VT_RST, this->actor.parent); + // Can it move? + osSyncPrintf(VT_FGCOL(GREEN) " ☆☆☆☆☆ 動いてねー? ☆☆☆☆☆ %x\n" VT_RST, this->actor.parent->update); + if ((this->actor.parent != NULL) && (this->actor.parent->update != NULL)) { + ((EnBomBowlPit*)this->actor.parent)->exItemDone = 1; + // It can't move! + osSyncPrintf(VT_FGCOL(GREEN) " ☆☆☆☆☆ さぁきえるぞ! ☆☆☆☆☆ \n" VT_RST); + } + Actor_Kill(&this->actor); + } +} + +void EnExItem_SetupBowlCounter(EnExItem* this, GlobalContext* globalCtx) { + this->actor.posRot.rot.y = this->actor.shape.rot.y = 0x4268; + this->actionFunc = EnExItem_BowlCounter; +} + +void EnExItem_BowlCounter(EnExItem* this, GlobalContext* globalCtx) { + this->actor.shape.rot.y += 0x800; + if (this->killItem) { + Actor_Kill(&this->actor); + } +} + +void EnExItem_ExitChest(EnExItem* this, GlobalContext* globalCtx) { + this->actor.shape.rot.y += 0x1000; + if (this->timer != 0) { + if (this->timer == 1) { + this->chestKillTimer = 20; + } + } else { + this->actor.velocity.y = 0.0f; + if (this->chestKillTimer == 0) { + Actor_Kill(&this->actor); + } + } + Actor_MoveForward(&this->actor); +} + +void EnExItem_FairyMagic(EnExItem* this, GlobalContext* globalCtx) { + this->actor.shape.rot.y += 0x800; +} + +void EnExItem_TargetPrizeApproach(EnExItem* this, GlobalContext* globalCtx) { + f32 tmpf1; + f32 tmpf2; + f32 tmpf3; + f32 tmpf4; + f32 tmpf5; + f32 tmpf6; + f32 tmpf7; + + Math_ApproachF(&this->scale, 0.8f, 0.1f, 0.02f); + if (!this->stopRotate) { + this->actor.shape.rot.y += 0x1000; + if ((this->prizeRotateTimer == 0) && ((this->actor.shape.rot.y & 0xFFFF) == 0x9000)) { + this->stopRotate++; + } + } else { + Math_SmoothStepToS(&this->actor.shape.rot.y, -0x4000, 5, 0x1000, 0); + } + + if (this->timer != 0) { + if (this->prizeRotateTimer != 0) { + tmpf1 = globalCtx->view.lookAt.x - globalCtx->view.eye.x; + tmpf2 = globalCtx->view.lookAt.y - 10.0f - globalCtx->view.eye.y; + tmpf3 = globalCtx->view.lookAt.z + 10.0f - globalCtx->view.eye.z; + tmpf4 = sqrtf(SQ(tmpf1) + SQ(tmpf2) + SQ(tmpf3)); + + tmpf5 = (tmpf1 / tmpf4) * 5.0f; + tmpf6 = (tmpf2 / tmpf4) * 5.0f; + tmpf7 = (tmpf3 / tmpf4) * 5.0f; + + tmpf1 = globalCtx->view.eye.x + tmpf5 - this->actor.posRot.pos.x; + tmpf2 = globalCtx->view.eye.y - 10.0f + tmpf6 - this->actor.posRot.pos.y; + tmpf3 = globalCtx->view.eye.z + 10.0f + tmpf7 - this->actor.posRot.pos.z; + + this->actor.posRot.pos.x += (tmpf1 / tmpf4) * 5.0f; + this->actor.posRot.pos.y += (tmpf2 / tmpf4) * 5.0f; + this->actor.posRot.pos.z += (tmpf3 / tmpf4) * 5.0f; + } + } else { + s32 itemId; + + this->actor.draw = NULL; + func_8002DF54(globalCtx, NULL, 7); + this->actor.parent = NULL; + if (CUR_UPG_VALUE(UPG_BULLET_BAG) == 1) { + itemId = GI_BULLET_BAG_40; + } else { + itemId = GI_BULLET_BAG_50; + } + func_8002F434(&this->actor, globalCtx, itemId, 2000.0f, 1000.0f); + this->actionFunc = EnExItem_TargetPrizeGive; + } +} + +void EnExItem_TargetPrizeGive(EnExItem* this, GlobalContext* globalCtx) { + s32 itemId; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ex_Item/func_80A09054.s") + if (Actor_HasParent(&this->actor, globalCtx)) { + this->actionFunc = EnExItem_TargetPrizeFinish; + } else { + itemId = (CUR_UPG_VALUE(UPG_BULLET_BAG) == 2) ? GI_BULLET_BAG_50 : GI_BULLET_BAG_40; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ex_Item/func_80A09434.s") + func_8002F434(&this->actor, globalCtx, itemId, 2000.0f, 1000.0f); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ex_Item/func_80A0964C.s") +void EnExItem_TargetPrizeFinish(EnExItem* this, GlobalContext* globalCtx) { + if ((func_8010BDBC(&globalCtx->msgCtx) == 6) && func_80106BC8(globalCtx)) { + // Successful completion + osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ 正常終了 ☆☆☆☆☆ \n" VT_RST); + gSaveContext.itemGetInf[1] |= 0x2000; + Actor_Kill(&this->actor); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ex_Item/func_80A09670.s") +void EnExItem_Update(Actor* thisx, GlobalContext* globalCtx) { + s32 pad; + EnExItem* this = THIS; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ex_Item/func_80A096A8.s") + if (this->timer != 0) { + this->timer--; + } + if (this->chestKillTimer != 0) { + this->chestKillTimer--; + } + if (this->prizeRotateTimer != 0) { + this->prizeRotateTimer--; + } + this->actionFunc(this, globalCtx); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ex_Item/func_80A09710.s") +void EnExItem_Draw(Actor* thisx, GlobalContext* globalCtx) { + s32 pad; + EnExItem* this = THIS; + s32 magicType; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ex_Item/func_80A09724.s") + Actor_SetScale(&this->actor, this->scale); + switch (this->type) { + case EXITEM_BOMB_BAG_BOWLING: + case EXITEM_BOMBCHUS_BOWLING: + case EXITEM_BOMBS_BOWLING: + case EXITEM_BOMB_BAG_COUNTER: + case EXITEM_BOMBCHUS_COUNTER: + case EXITEM_BOMBS_COUNTER: + case EXITEM_BULLET_BAG: + EnExItem_DrawItems(this, globalCtx); + break; + case EXITEM_HEART_PIECE_BOWLING: + case EXITEM_HEART_PIECE_COUNTER: + EnExItem_DrawHeartPiece(this, globalCtx); + break; + case EXITEM_PURPLE_RUPEE_BOWLING: + case EXITEM_PURPLE_RUPEE_COUNTER: + case EXITEM_GREEN_RUPEE_CHEST: + case EXITEM_BLUE_RUPEE_CHEST: + case EXITEM_RED_RUPEE_CHEST: + case EXITEM_13: + case EXITEM_14: + EnExItem_DrawRupee(this, globalCtx); + break; + case EXITEM_SMALL_KEY_CHEST: + EnExItem_DrawKey(this, globalCtx, 0); + break; + case EXITEM_MAGIC_FIRE: + case EXITEM_MAGIC_WIND: + case EXITEM_MAGIC_DARK: + magicType = this->type - EXITEM_MAGIC_FIRE; + EnExItem_DrawMagic(this, globalCtx, magicType); + break; + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ex_Item/func_80A09978.s") +void EnExItem_DrawItems(EnExItem* this, GlobalContext* globalCtx) { + if (this->unk_17C != NULL) { + this->unk_17C(&this->actor, globalCtx, 0); + } + if (this) {} + func_8002ED80(&this->actor, globalCtx, 0); + func_800694A0(globalCtx, this->drawItemId); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ex_Item/func_80A09A00.s") +void EnExItem_DrawHeartPiece(EnExItem* this, GlobalContext* globalCtx) { + func_8002ED80(&this->actor, globalCtx, 0); + func_800694A0(globalCtx, 0x13); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ex_Item/EnExItem_Update.s") +void EnExItem_DrawMagic(EnExItem* this, GlobalContext* globalCtx, s16 magicIndex) { + static s16 drawItemIds[] = { 0x63, 0x64, 0x65 }; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ex_Item/EnExItem_Draw.s") + func_8002ED80(&this->actor, globalCtx, 0); + func_800694A0(globalCtx, drawItemIds[magicIndex]); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ex_Item/func_80A09B6C.s") +void EnExItem_DrawKey(EnExItem* this, GlobalContext* globalCtx, s32 index) { + static s32 keySegments[] = { 0x0403F140 }; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ex_Item/func_80A09BCC.s") + OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_ex_item.c", 880); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ex_Item/func_80A09BFC.s") + func_8009460C(globalCtx->state.gfxCtx); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_en_ex_item.c", 887), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(keySegments[index])); + gSPDisplayList(POLY_OPA_DISP++, D_0403F070); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ex_Item/func_80A09C40.s") + CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_en_ex_item.c", 893); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ex_Item/func_80A09D6C.s") +void EnExItem_DrawRupee(EnExItem* this, GlobalContext* globalCtx) { + if (this->unk_17C != NULL) { + this->unk_17C(&this->actor, globalCtx, 0); + } + if (this->unk_180 != NULL) { + this->unk_180(&this->actor, globalCtx, 0); + } + func_800694A0(globalCtx, this->drawItemId); +} diff --git a/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.h b/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.h index 5060b68ae..f11f2d1ee 100644 --- a/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.h +++ b/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.h @@ -6,13 +6,56 @@ struct EnExItem; +typedef void (*EnExItemActionFunc)(struct EnExItem* this, GlobalContext* globalCtx); +typedef void (*EnExItemLightFunc)(Actor*, GlobalContext*, s32); + typedef struct EnExItem { /* 0x0000 */ Actor actor; - /* 0x014C */ char unk_14C[0x14]; - /* 0x0160 */ s16 unk_160; - /* 0x0162 */ char unk_165[0x22]; + /* 0x014C */ EnExItemActionFunc actionFunc; + /* 0x0150 */ s16 getItemObjId; + /* 0x0152 */ s16 type; + /* 0x0152 */ s16 unusedParam; + /* 0x0156 */ s16 drawItemId; + /* 0x0158 */ s16 stopRotate; + /* 0x015A */ s16 timer; + /* 0x015A */ s16 chestKillTimer; + /* 0x015A */ s16 prizeRotateTimer; + /* 0x0160 */ s16 killItem; + /* 0x0164 */ f32 scale; + /* 0x0168 */ f32 unkFloat; // set to the same value as scale, but unused + /* 0x016C */ s8 objectIdx; + /* 0x0170 */ Vec3f initPos; // unused + /* 0x017C */ EnExItemLightFunc unk_17C; + /* 0x0180 */ EnExItemLightFunc unk_180; } EnExItem; // size = 0x0184 extern const ActorInit En_Ex_Item_InitVars; +typedef enum { + /* 0 */ EXITEM_BOMB_BAG_BOWLING, + /* 1 */ EXITEM_HEART_PIECE_BOWLING, + /* 2 */ EXITEM_BOMBCHUS_BOWLING, + /* 3 */ EXITEM_BOMBS_BOWLING, + /* 4 */ EXITEM_PURPLE_RUPEE_BOWLING, + /* 5 */ EXITEM_BOMB_BAG_COUNTER, + /* 6 */ EXITEM_HEART_PIECE_COUNTER, + /* 7 */ EXITEM_BOMBCHUS_COUNTER, + /* 8 */ EXITEM_BOMBS_COUNTER, + /* 9 */ EXITEM_PURPLE_RUPEE_COUNTER, + /* 10 */ EXITEM_GREEN_RUPEE_CHEST, + /* 11 */ EXITEM_BLUE_RUPEE_CHEST, + /* 12 */ EXITEM_RED_RUPEE_CHEST, + /* 13 */ EXITEM_13, + /* 14 */ EXITEM_14, + /* 15 */ EXITEM_SMALL_KEY_CHEST, + /* 16 */ EXITEM_MAGIC_FIRE, + /* 17 */ EXITEM_MAGIC_WIND, + /* 18 */ EXITEM_MAGIC_DARK, + /* 19 */ EXITEM_BULLET_BAG +} EnExItemType; + +#define EXITEM_COUNTER 5 +#define EXITEM_CHEST 10 +#define EXITEM_MAGIC 16 + #endif |
