diff --git a/data/scripts/hyruleTown/script_Anju.inc b/data/scripts/hyruleTown/script_Anju.inc index adfccdb4..09bf74c8 100644 --- a/data/scripts/hyruleTown/script_Anju.inc +++ b/data/scripts/hyruleTown/script_Anju.inc @@ -16,7 +16,7 @@ script_0801015A: WaitUntilTextboxCloses CheckTextboxResult JumpIfNot script_080101A6 - Call sub_080A1608 + Call CuccoMinigame_TellObjective WaitUntilTextboxCloses EnablePlayerControl CallWithArg CuccoMinigame_Init, script_080101AC @@ -25,7 +25,7 @@ script_0801015A: SetRoomFlag 0x0001 Jump script_0801015A script_0801019E: - Call sub_080A1608 + Call CuccoMinigame_TellObjective WaitUntilTextboxCloses script_080101A6: EnablePlayerControl @@ -60,14 +60,14 @@ script_080101AC: SetFade4 WaitForFadeFinish PlayBGM - Call sub_080A13B4 + Call CuccoMinigame_Results WaitUntilTextboxCloses JumpIfNot script_08010240 - Call sub_080A13E8 + Call CuccoMinigame_WinItem WaitPlayerGetItem - Call sub_080A1460 + Call CuccoMinigame_WinRupees WaitUntilTextboxCloses - Call sub_080A14A8 + Call CuccoMinigame_AdvanceLevel script_08010240: Call EnablePauseMenu EnablePlayerControl diff --git a/src/object/cuccoMinigame.c b/src/object/cuccoMinigame.c index 1d87a6d0..4f3a1489 100644 --- a/src/object/cuccoMinigame.c +++ b/src/object/cuccoMinigame.c @@ -13,23 +13,28 @@ #include "npc.h" #include "object.h" #include "script.h" +#include "item.h" typedef struct { Entity base; - s16 unk68; - s16 unk6a; - s16 unk6c; + s16 timer; + s16 currentCuccos; + s16 targetCuccos; u16 unk6e; - u8 unk70[0x18]; + u8 returnedCuccoTypes[0x18]; } CuccoMinigameEntity; typedef Entity* CuccoMinigameHeap[10]; -u32 sub_080A1514(); +u32 CuccoMinigame_GetLevel(); -const u16 gUnk_08124C20[] = { - 25, 0x2, 25, 0x3, 30, 0x4, 45, 0x5, 50, 0x5, 45, 0x5, 50, 0x6, 60, 0x7, 55, 0x2, 55, 0x3, -}; +typedef struct { + u16 time; + u16 numCuccos; +} CuccoMinigameGoal; + +const CuccoMinigameGoal goalData[10] = { { 25, 2}, { 25, 3}, { 30, 4}, { 45, 5}, { 50, 5}, + { 45, 5}, { 50, 6}, { 60, 7}, { 55, 2}, { 55, 3} }; static const u16 pCuccoMinigame_MinigameCuccoDefs[][30] = { { 0x0001, 0x02E9, 0x0318, 0x0001, 0x0280, 0x0380, 0x0002, 0x0277, 0x0314, 0x0001, @@ -66,9 +71,23 @@ static const u16 pCuccoMinigame_MinigameCuccoDefs[][30] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 } }; -static const u8 gUnk_08124EA0[] = { 0x3F, 0x0A, 0x01, 0x00, 0x3F, 0x0A, 0x01, 0x00, 0x3F, 0x14, 0x01, 0x00, 0x3F, 0x14, - 0x01, 0x00, 0x3F, 0x1E, 0x01, 0x00, 0x3F, 0x1E, 0x01, 0x00, 0x5C, 0x6E, 0x01, 0x00, - 0x5C, 0x6F, 0x01, 0x00, 0x5C, 0x70, 0x01, 0x00, 0x63, 0x00, 0x01, 0x00 }; +typedef struct { + u8 item; + u8 subtype; + u8 unk2; + u8 unk3; +} CuccoMinigamePrizeData; + +static const CuccoMinigamePrizeData prizeData[10] = { { ITEM_SHELLS, 10, 1, 0 }, + { ITEM_SHELLS, 10, 1, 0 }, + { ITEM_SHELLS, 20, 1, 0 }, + { ITEM_SHELLS, 20, 1, 0 }, + { ITEM_SHELLS, 30, 1, 0 }, + { ITEM_SHELLS, 30, 1, 0 }, + { ITEM_KINSTONE, 0x6E, 1, 0 }, + { ITEM_KINSTONE, 0x6F, 1, 0 }, + { ITEM_KINSTONE, 0x70, 1, 0 }, + { ITEM_HEART_PIECE, 0, 1, 0 } }; static const u16 CuccoMinigame_Sounds[] = { SFX_VO_CUCCO5, SFX_VO_CUCCO_CALL }; @@ -78,17 +97,17 @@ void CuccoMinigame(CuccoMinigameEntity* this) { int index; u32 val; u8* puVar2; - const u16* ptr; + const CuccoMinigameGoal* ptr; if (super->action == 0) { super->action++; - ptr = gUnk_08124C20 + sub_080A1514() * 2; - this->unk68 = ptr[0] * 0x3c; - this->unk6a = 0; - this->unk6c = ptr[1]; + ptr = &goalData[CuccoMinigame_GetLevel()]; + this->timer = ptr->time * 60; + this->currentCuccos = 0; + this->targetCuccos = ptr->numCuccos; this->unk6e = 1; - for (puVar2 = this->unk70, val = 0, index = 9; index >= 0; index--) { + for (puVar2 = this->returnedCuccoTypes, val = 0, index = 9; index >= 0; index--) { *puVar2++ = val; } sub_0807DD64(super); @@ -110,7 +129,7 @@ NONMATCH("asm/non_matching/objectB9/sub_080A1270.inc", void sub_080A1270(CuccoMi sVar6 = 0; entArray = ((Entity**)super->myHeap); - ptr = this->unk70; + ptr = this->returnedCuccoTypes; iVar1 = (gRoomControls.origin_x + 0x360); iVar4 = (gRoomControls.origin_y + 0x350); iVar1 = (iVar1 << 16) >> 16; @@ -147,9 +166,9 @@ NONMATCH("asm/non_matching/objectB9/sub_080A1270.inc", void sub_080A1270(CuccoMi } } - this->unk6a = sVar6; + this->currentCuccos = sVar6; gPlayerState.field_0x27[0] = 0xff; - if (--this->unk68 < 1) { + if (--this->timer < 1) { SoundReq(SFX_CUCCO_MINIGAME_BELL); sub_08050384(); } else { @@ -163,7 +182,7 @@ void CuccoMinigame_Cleanup(CuccoMinigameEntity* this) { s8* pcVar2; int index; - pcVar2 = this->unk70; + pcVar2 = this->returnedCuccoTypes; puVar1 = super->myHeap; for (index = 9; index >= 0; index--, pcVar2++, puVar1++) { @@ -174,8 +193,8 @@ void CuccoMinigame_Cleanup(CuccoMinigameEntity* this) { } } -void sub_080A13B4(CuccoMinigameEntity* this, ScriptExecutionContext* context) { - if (this->unk6a >= this->unk6c) { +void CuccoMinigame_Results(CuccoMinigameEntity* this, ScriptExecutionContext* context) { + if (this->currentCuccos >= this->targetCuccos) { MessageFromTarget(TEXT_INDEX(TEXT_ANJU, 0xc)); context->condition = 1; } else { @@ -184,115 +203,115 @@ void sub_080A13B4(CuccoMinigameEntity* this, ScriptExecutionContext* context) { } } -void sub_080A13E8(CuccoMinigameEntity* this) { - bool32 bVar2; - const u8* ptr = &gUnk_08124EA0[sub_080A1514() * 4]; +void CuccoMinigame_WinItem(CuccoMinigameEntity* this) { + bool32 skipItem; + const CuccoMinigamePrizeData* prize = &prizeData[CuccoMinigame_GetLevel()]; - bVar2 = 0; - switch (ptr[0]) { - case 0x3f: + skipItem = 0; + switch (prize->item) { + case ITEM_SHELLS: if (gSave.stats.hasAllFigurines) { - bVar2 = 1; + skipItem = 1; } break; - case 0x5c: + case ITEM_KINSTONE: if (gSave.didAllFusions) { - bVar2 = 1; + skipItem = 1; } break; - case 0x63: + case ITEM_HEART_PIECE: if (!CheckGlobalFlag(ANJU_HEART)) { SetGlobalFlag(ANJU_HEART); break; } - bVar2 = 1; + skipItem = 1; break; } - if (!bVar2) { - InitItemGetSequence(ptr[0], ptr[1], 0); + if (!skipItem) { + InitItemGetSequence(prize->item, prize->subtype, 0); } else { this->unk6e = 2; } } -void sub_080A1460(CuccoMinigameEntity* this) { - s8* pcVar1; - int iVar2; +void CuccoMinigame_WinRupees(CuccoMinigameEntity* this) { + s8* cuccoTypes; + int index; s32 rupees; - const u8* ptr; + const u8* rupeeValues; - sub_080A1514(); - pcVar1 = this->unk70; + CuccoMinigame_GetLevel(); // Rupees previously dependent on level? + cuccoTypes = this->returnedCuccoTypes; rupees = 0; - ptr = CuccoMinigameRupees; + rupeeValues = CuccoMinigameRupees; - for (iVar2 = 9; iVar2 >= 0; iVar2--) { + for (index = 9; index >= 0; index--) { // Only first 10 count? // Weird register addition - // ptr[*pcVar1] translates to add r0,r3,r0 but should be add r0,r3 - u32 temp = *pcVar1; - temp += (int)ptr; + // rupeeValues[*cuccoTypes] translates to add r0,r3,r0 but should be add r0,r3 + u32 temp = *cuccoTypes; + temp += (int)rupeeValues; rupees += *(u8*)temp; - pcVar1++; + cuccoTypes++; } ModRupees(rupees); MessageNoOverlap(TEXT_INDEX(TEXT_ANJU, 0x7), super); gMessage.rupees = (u16)rupees; } -void sub_080A14A8(void) { - int iVar1; +void CuccoMinigame_AdvanceLevel(void) { + int level; - iVar1 = sub_080A1514(); - iVar1++; - if (iVar1 > 9) { - iVar1 = 9; + level = CuccoMinigame_GetLevel(); + level++; + if (level > 9) { + level = 9; } - if (iVar1 & 1) { + if (level & 1) { SetGlobalFlag(ANJU_LV_BIT0); } else { ClearGlobalFlag(ANJU_LV_BIT0); } - if (iVar1 & 2) { + if (level & 2) { SetGlobalFlag(ANJU_LV_BIT1); } else { ClearGlobalFlag(ANJU_LV_BIT1); } - if (iVar1 & 4) { + if (level & 4) { SetGlobalFlag(ANJU_LV_BIT2); } else { ClearGlobalFlag(ANJU_LV_BIT2); } - if (iVar1 & 8) { + if (level & 8) { SetGlobalFlag(ANJU_LV_BIT3); } else { ClearGlobalFlag(ANJU_LV_BIT3); } } -u32 sub_080A1514(void) { - u32 rv = 0; +u32 CuccoMinigame_GetLevel(void) { + u32 level = 0; if (CheckGlobalFlag(ANJU_LV_BIT0)) { - rv = 1; + level = 1; } if (CheckGlobalFlag(ANJU_LV_BIT1)) { - rv |= 2; + level |= 2; } if (CheckGlobalFlag(ANJU_LV_BIT2)) { - rv |= 4; + level |= 4; } if (CheckGlobalFlag(ANJU_LV_BIT3)) { - rv |= 8; + level |= 8; } - return rv; + return level; } void CuccoMinigame_Init(Entity* this, ScriptExecutionContext* context) { @@ -311,7 +330,7 @@ void CuccoMinigame_Init(Entity* this, ScriptExecutionContext* context) { } else { *(ScriptExecutionContext**)&((GenericEntity*)pEnt)->cutsceneBeh = (ScriptExecutionContext*)StartCutscene(pEnt, (u16*)context->intVariable); - pCuccoMinigameDef = pCuccoMinigame_MinigameCuccoDefs[sub_080A1514()]; + pCuccoMinigameDef = pCuccoMinigame_MinigameCuccoDefs[CuccoMinigame_GetLevel()]; ppEVar5 = (Entity**)pEnt->myHeap; room = &gRoomControls; for (index = 9; index >= 0; index--, pCuccoMinigameDef += 3) { @@ -332,9 +351,9 @@ void CuccoMinigame_Init(Entity* this, ScriptExecutionContext* context) { } } -void sub_080A1608(void) { +void CuccoMinigame_TellObjective(void) { u16 messageIndex; - const u16* ptr; + const CuccoMinigameGoal* ptr; messageIndex = TEXT_INDEX(TEXT_ANJU, 0x2); if (CheckRoomFlag(1)) { @@ -343,9 +362,9 @@ void sub_080A1608(void) { MessageFromTarget(messageIndex); gMessage.textWindowPosX = 1; gMessage.textWindowPosY = 0; - ptr = &gUnk_08124C20[sub_080A1514() * 2]; - gMessage.rupees = ptr[0]; - gMessage.field_0x14 = ptr[1]; + ptr = &goalData[CuccoMinigame_GetLevel()]; + gMessage.rupees = ptr->time; + gMessage.field_0x14 = ptr->numCuccos; } void sub_080A1648(void) {