diff options
| author | notyourav <65437533+notyourav@users.noreply.github.com> | 2022-10-08 18:41:48 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-10-08 18:41:48 -0700 |
| commit | c851c7876c13facaaa4df0d01de3457cd0dc82bb (patch) | |
| tree | 261864c07f334c35024033a908b4af8e808caebe /src | |
| parent | 756a8a89da46dade06fad1723de88fa5a82cc2ec (diff) | |
| parent | 67467fd831d2928715835f8a389b4f464a0f9a7a (diff) | |
Merge pull request #574 from octorock/data
Extract some data
Diffstat (limited to 'src')
131 files changed, 9804 insertions, 5746 deletions
diff --git a/src/beanstalkSubtask.c b/src/beanstalkSubtask.c index 19f530be..ceb5a7c3 100644 --- a/src/beanstalkSubtask.c +++ b/src/beanstalkSubtask.c @@ -26,18 +26,9 @@ extern void gMapData; extern u8 gUpdateVisibleTiles; extern u16 gMapDataTopSpecial[]; extern u16 gMapDataBottomSpecial[]; - extern const u8 gGlobalGfxAndPalettes[]; extern const u8 gUnk_081091E4[]; -extern void (*const gUnk_080B4458[])(void); -extern const u16 gUnk_080B44A0[]; -extern const u16 gUnk_080B4410[]; -extern const s16 gUnk_080B4488[]; -extern const s16 gUnk_080B44A8[]; - -extern const struct_080B44D0 gUnk_080B44D0[]; - typedef struct { u16 tileType; u16 kind; @@ -47,6 +38,18 @@ typedef struct { u16 unk_a; } Data; +extern const u16 gUnk_080B4410[]; // TODO figure out structure +extern void (*const gUnk_080B4458[])(void); +extern const s16 gUnk_080B4468[]; // TODO struct xy +extern const s16 gUnk_080B4478[]; // TODO struct xy +extern const s16 gUnk_080B4488[]; +extern const s16 gUnk_080B4490[]; // TODO struct xy +extern const u16 gUnk_080B44A0[]; +extern const s16 gUnk_080B44A8[]; // TODO struct xy +extern const u32 gUnk_080B44B8[]; // TODO actually function pointers? +extern const Data gUnk_080B44C0[]; +extern const Data gUnk_080B44C2[]; + void sub_0801AD6C(const Data*, u32); bool32 sub_0801A4F8(void); bool32 sub_0801AA58(Entity*, u32, u32); @@ -110,31 +113,30 @@ void SetBGDefaults(void) { gMapTop.bgSettings->control = gUnk_080B77C0[1]; } -void sub_080197D4(u32* param_1) { +void sub_080197D4(struct_08109194* param_1) { u32 uVar1; u8* src; void* dest; do { - dest = (void*)param_1[1]; + dest = param_1->dest; if (dest != NULL) { - src = &gMapData + (*param_1 & 0x7fffffff); - if ((param_1[2] & 0x80000000) != 0) { + src = &gMapData + (param_1->src & 0x7fffffff); + if ((param_1->size & 0x80000000) != 0) { if ((u32)dest >> 0x18 == 6) { LZ77UnCompVram(src, dest); } else { LZ77UnCompWram(src, dest); } } else { - MemCopy(src, dest, param_1[2]); + MemCopy(src, dest, param_1->size); } } else { - LoadPaletteGroup((u32) * (u16*)param_1); + LoadPaletteGroup(*(u16*)param_1); sub_080533CC(); } - param_1 += 3; - uVar1 = *(param_1 - 3); - } while ((uVar1 & 0x80000000) != 0); + param_1++; + } while (((param_1 - 1)->src & 0x80000000) != 0); } // Has ifdefs for other variants @@ -483,10 +485,6 @@ u32 sub_0801AC68(u32 position, u32 data) { return data << 2; } -extern const Data gUnk_080B44C0[]; -extern const Data gUnk_080B44C2[]; -extern const u32 gUnk_080B44B8[]; - void sub_0801AC98(void) { u32 position; u32 width; @@ -571,11 +569,11 @@ u32 sub_0801AE34(void) { return gRoomControls.scroll_flags >> 1 & 1; } -void sub_0801AE44(s32 param_1) { +void sub_0801AE44(bool32 loadGfx) { void (*func)(void); gRoomControls.unk_34 = 0; sub_0807BFD0(); - if (param_1 != 0) { + if (loadGfx != 0) { LoadRoomGfx(); } sub_080809D4(); diff --git a/src/color.c b/src/color.c index 01e678e8..17de6630 100644 --- a/src/color.c +++ b/src/color.c @@ -35,7 +35,7 @@ void sub_0801CFD0(u32 index) { p->_0_0 = 4; p->_0_4 = 1; p->_1 = 0x80; - p->_2 = 0xFFFF; + p->objPaletteId = 0xffff; } void sub_0801D000(u32 a1) { @@ -56,58 +56,58 @@ void sub_0801D000(u32 a1) { gUnk_02001A3C._0_0 = 0; gUnk_02001A3C._0_4 = 0; gUnk_02001A3C._1 = 0; - gUnk_02001A3C._2 = 0; + gUnk_02001A3C.objPaletteId = 0; } } } -u32 LoadObjPalette(Entity* entity, u32 a2) { - Palette* puVar1; - int iVar2; +u32 LoadObjPalette(Entity* entity, u32 objPaletteId) { + Palette* palette; + s32 slot; u32 uVar3; u32 uVar4; - iVar2 = FindPalette(a2); - if (iVar2 < 0) { - if (a2 < 0x16) { + slot = FindPalette(objPaletteId); + if (slot < 0) { + if (objPaletteId < 0x16) { uVar3 = 1; } else { - uVar3 = gUnk_08133368[(a2 - 0x16)].BYTES.byte3; + uVar3 = gUnk_08133368[(objPaletteId - 0x16)].BYTES.byte3; uVar3 &= 0xf; } - iVar2 = FindFreeObjPalette(uVar3); - if (iVar2 < 0) { + slot = FindFreeObjPalette(uVar3); + if (slot < 0) { CleanUpObjPalettes(); - iVar2 = FindFreeObjPalette(uVar3); + slot = FindFreeObjPalette(uVar3); } - if (iVar2 >= 0) { - puVar1 = &gPaletteList[iVar2]; - puVar1->_2 = a2; - puVar1->_1 = 0; - puVar1->_0_4 = uVar3; - puVar1->_0_0 = 3; + if (slot >= 0) { + palette = &gPaletteList[slot]; + palette->objPaletteId = objPaletteId; + palette->_1 = 0; + palette->_0_4 = uVar3; + palette->_0_0 = 3; for (uVar3 = uVar3 - 1; uVar3 != 0; uVar3--) { - puVar1++; - puVar1->_2 = 0; - puVar1->_1 = 0; - puVar1->_0_4 = uVar3; - puVar1->_0_0 = 2; + palette++; + palette->objPaletteId = 0; + palette->_1 = 0; + palette->_0_4 = uVar3; + palette->_0_0 = 2; } - LoadObjPaletteAtIndex(a2, iVar2); + LoadObjPaletteAtIndex(objPaletteId, slot); } } - SetEntityObjPalette(entity, iVar2); - return iVar2; + SetEntityObjPalette(entity, slot); + return slot; } -s32 FindPalette(u32 a1) { +s32 FindPalette(u32 objPaletteId) { u32 index; Palette* palette; - if (a1 <= 5) - return a1; + if (objPaletteId <= 5) + return objPaletteId; for (index = 6, palette = gPaletteList; index < ARRAY_COUNT(gPaletteList); index++) { - if (a1 == palette[index]._2) { + if (objPaletteId == palette[index].objPaletteId) { return index; } } @@ -115,37 +115,37 @@ s32 FindPalette(u32 a1) { return -1; } -u32 FindFreeObjPalette(u32 a1) { - u32 uVar1; - u32 uVar2; +u32 FindFreeObjPalette(u32 paletteCount) { + u32 count; + u32 index; u32 tmp; - for (uVar1 = 0, uVar2 = 6; uVar2 < ARRAY_COUNT(gPaletteList); uVar2++) { - switch ((gPaletteList[uVar2]._0_0)) { + for (count = 0, index = 6; index < ARRAY_COUNT(gPaletteList); index++) { + switch ((gPaletteList[index]._0_0)) { case 0: - uVar1 = uVar1 + 1; - if (a1 > uVar1) + count = count + 1; + if (paletteCount > count) continue; - tmp = uVar1 - 1; - return uVar2 - tmp; + tmp = count - 1; + return index - tmp; default: - uVar1 = 0; + count = 0; break; } } - for (uVar1 = 0, uVar2 = 6; uVar2 < ARRAY_COUNT(gPaletteList); uVar2++) { - switch (gPaletteList[uVar2]._0_0) { + for (count = 0, index = 6; index < ARRAY_COUNT(gPaletteList); index++) { + switch (gPaletteList[index]._0_0) { case 0: case 1: - uVar1++; - if (a1 <= uVar1) { - tmp = uVar1 - 1; - return uVar2 - tmp; + count++; + if (paletteCount <= count) { + tmp = count - 1; + return index - tmp; } break; default: - uVar1 = 0; + count = 0; break; } } @@ -154,7 +154,7 @@ u32 FindFreeObjPalette(u32 a1) { NONMATCH("asm/non_matching/color/SetEntityObjPalette.inc", void SetEntityObjPalette(Entity* entity, u32 palette)) { u32 uVar1; - Palette* pPVar1; + Palette* pal; if (palette < 0) { palette = 0; @@ -164,15 +164,15 @@ NONMATCH("asm/non_matching/color/SetEntityObjPalette.inc", void SetEntityObjPale } entity->palette.b.b0 = palette; entity->palette.b.b4 = palette; - pPVar1 = &gPaletteList[palette]; - if ((s8)pPVar1->_0_0 != 4) { - pPVar1->_1++; - uVar1 = pPVar1->_0_4; - pPVar1->_0_0 = 3; + pal = &gPaletteList[palette]; + if ((s8)pal->_0_0 != 4) { + pal->_1++; + uVar1 = pal->_0_4; + pal->_0_0 = 3; while (uVar1 = uVar1 - 1, uVar1 != 0) { - pPVar1 = pPVar1 + 1; - pPVar1->_0_4 = uVar1; - pPVar1->_0_0 = 2; + pal = pal + 1; + pal->_0_4 = uVar1; + pal->_0_0 = 2; } } } @@ -204,7 +204,7 @@ void sub_0801D244(u32 a1) { } } -void sub_0801D28C(Entity* entity, u32 palette) { +void sub_0801D28C(Entity* entity, u32 objPaletteId) { u32 c = entity->spriteAnimation[1]; Palette* list = gPaletteList; Palette* p = &list[c]; @@ -213,31 +213,31 @@ void sub_0801D28C(Entity* entity, u32 palette) { u32 lo = ((u32)((*(u8*)p) << 0x1c)) >> 0x1c; if (lo == 3) { - p->_2 = palette; - LoadObjPaletteAtIndex(palette, c); + p->objPaletteId = objPaletteId; + LoadObjPaletteAtIndex(objPaletteId, c); } } -void ChangeObjPalette(Entity* entity, u32 a2) { +void ChangeObjPalette(Entity* entity, u32 objPaletteId) { UnloadOBJPalette(entity); - LoadObjPalette(entity, a2); + LoadObjPalette(entity, objPaletteId); } -void LoadObjPaletteAtIndex(u32 a1, u32 a2) { +void LoadObjPaletteAtIndex(u32 objPaletteId, u32 a2) { u16* buffer; gUsedPalettes |= 1 << (a2 + 0x10); - if (5 < a1) { - if (a1 == 0x15) { + if (objPaletteId > 5) { + if (objPaletteId == 0x15) { buffer = gPaletteBuffer; MemFill16(buffer[0x3C], buffer + (a2 + 0x10) * 0x10, 0x20); - } else if (a1 < 0x15) { - LoadPalettes((u8*)(gPaletteBuffer + (a1 - 6) * 0x10), a2 + 0x10, 1); + } else if (objPaletteId < 0x15) { + LoadPalettes((u8*)(gPaletteBuffer + (objPaletteId - 6) * 0x10), a2 + 0x10, 1); } else { - u32 tmp1 = gUnk_08133368[(a1 - 0x16)].WORD_U; - u32 tmp2 = (tmp1 >> 0x18) & 0xf; - tmp1 &= 0xffffff; - LoadPalettes(gGlobalGfxAndPalettes + tmp1, a2 + 0x10, tmp2); + u32 offset = gUnk_08133368[(objPaletteId - 0x16)].WORD_U; + u32 numPalettes = (offset >> 0x18) & 0xf; + offset &= 0xffffff; + LoadPalettes(gGlobalGfxAndPalettes + offset, a2 + 0x10, numPalettes); } } } @@ -260,7 +260,7 @@ void CleanUpObjPalettes(void) { gPaletteList[index1]._0_0 = 0; gPaletteList[index1]._0_4 = 0; gPaletteList[index1]._1 = 0; - gPaletteList[index1]._2 = 0; + gPaletteList[index1].objPaletteId = 0; break; } } @@ -337,7 +337,7 @@ void sub_0801D48C(u32 a1, u32 a2) { pPVar1->_0_0 = 0; pPVar1->_0_4 = 0; pPVar1->_1 = 0; - pPVar1->_2 = 0; + pPVar1->objPaletteId = 0; MemCopy(iVar3, iVar4, 0x20); iVar3 += 0x10; pPVar1++; diff --git a/src/common.c b/src/common.c index cffc3e61..cba8e53d 100644 --- a/src/common.c +++ b/src/common.c @@ -79,7 +79,7 @@ extern const DungeonLayout** const gUnk_080C9C50[]; extern u8 gMapDataBottomSpecial[]; u32 sub_0801DF10(const DungeonLayout* lyt); -bool32 sub_0801DF90(TileEntity* tileEntity, u32 bank); +bool32 IsRoomVisited(TileEntity* tileEntity, u32 bank); u32 sub_0801DF60(u32 a1, u8* p); u32 sub_0801DF78(u32 a1, u32 a2); void sub_0801DF28(u32 x, u32 y, s32 color); @@ -437,6 +437,7 @@ void DrawDungeonFeatures(u32 floor, void* data, u32 size) { layout = gUnk_080C9C50[gArea.dungeon_idx][floor]; MemClear(gMapDataBottomSpecial, 0x8000); while (layout->area != 0) { + // ROOM_VISIT_MARKER has to be first TileEntity in the room. tileEntity = (TileEntity*)GetRoomProperty(layout->area, layout->room, 3); bankOffset = sub_0801DF10(layout); features = 0; @@ -446,7 +447,7 @@ void DrawDungeonFeatures(u32 floor, void* data, u32 size) { if (HasDungeonSmallKey()) { features = 2; } - if (sub_0801DF90(tileEntity, bankOffset)) { + if (IsRoomVisited(tileEntity, bankOffset)) { features = 3; } } @@ -514,12 +515,12 @@ u32 sub_0801DF78(u32 a1, u32 a2) { } } -bool32 sub_0801DF90(TileEntity* tileEntity, u32 bank) { +bool32 IsRoomVisited(TileEntity* tileEntity, u32 bank) { if (tileEntity == NULL) return FALSE; for (; tileEntity->type != 0; tileEntity++) { - if (tileEntity->type == 1) + if (tileEntity->type == ROOM_VISIT_MARKER) return CheckLocalFlagByBank(bank, tileEntity->localFlag); } return FALSE; @@ -531,7 +532,7 @@ void sub_0801DFB4(Entity* entity, u32 textIndex, u32 a3, u32 a4) { gFuseInfo._8 = a3; gFuseInfo._a = a4; gFuseInfo.ent = entity; - gFuseInfo._3 = gUnk_03003DF0.unk_2; + gFuseInfo.kinstoneId = gUnk_03003DF0.unk_2; if (entity != NULL) { gFuseInfo.prevUpdatePriority = entity->updatePriority; entity->updatePriority = 2; @@ -738,12 +739,12 @@ void sub_0801E64C(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_ } } -void sub_0801E6C8(u32 param_1) { +void sub_0801E6C8(u32 kinstoneId) { u32 tmp; u32 index; - if (param_1 - 1 < 100) { + if (kinstoneId - 1 < 100) { for (index = 0; index < 0x80; index++) { - if (param_1 == gSave.unk1C1[index]) { + if (kinstoneId == gSave.unk1C1[index]) { gSave.unk1C1[index] = 0xf1; } } @@ -752,7 +753,7 @@ void sub_0801E6C8(u32 param_1) { gSave.unk1C1[tmp] = 0xf2; } for (index = 0; index < 0x20; index++) { - if (param_1 == gUnk_03003DF0.array[index].unk_3) { + if (kinstoneId == gUnk_03003DF0.array[index].unk_3) { gUnk_03003DF0.array[index].unk_3 = 0xf1; } } @@ -803,18 +804,18 @@ u32 sub_0801E7D0(u32 a1) { return gSave.unk12B[tmp]; } -u32 CheckKinstoneFused(u32 idx) { - if (idx > 100 || idx < 1) { +u32 CheckKinstoneFused(u32 kinstoneId) { + if (kinstoneId > 100 || kinstoneId < 1) { return 0; } - return ReadBit(&gSave.unk241, idx); + return ReadBit(&gSave.fusedKinstones, kinstoneId); } -bool32 sub_0801E810(u32 idx) { - if (idx > 100 || idx < 1) { +bool32 sub_0801E810(u32 kinstoneId) { + if (kinstoneId > 100 || kinstoneId < 1) { return FALSE; } - return ReadBit(&gSave.unk24E, idx); + return ReadBit(&gSave.unk24E, kinstoneId); } ASM_FUNC("asm/non_matching/common/sub_0801E82C.inc", void sub_0801E82C(void)); @@ -829,57 +830,59 @@ s32 sub_0801E8B0(u32 idx) { return -1; } +// Check conditions, something with kinstones void sub_0801E8D4(void) { - u32 i; - for (i = 10; i <= 100; ++i) { - if (CheckKinstoneFused(i) && !sub_0801E810(i)) { - u32 evt_type = gUnk_080C9CBC[i].evt_type; - struct_080FE320* s = &gUnk_080FE320[evt_type]; + u32 kinstoneId; + for (kinstoneId = 10; kinstoneId <= 100; ++kinstoneId) { + if (CheckKinstoneFused(kinstoneId) && !sub_0801E810(kinstoneId)) { + u32 worldEventId = gKinstoneWorldEvents[kinstoneId].worldEventId; + const WorldEvent* s = &gWorldEvents[worldEventId]; #if !defined EU && !defined JP u32 flag = s->flag; #endif u32 tmp; - switch (s->_10) { - case 0: + switch (s->condition) { + case CND_0: tmp = 0; break; - case 1: - tmp = s->_11; + case CND_1: + tmp = s->bank; break; - case 2: + case CND_2: tmp = 0xf; break; - case 3: + case CND_3: tmp = 0x10; break; - case 4: + case CND_4: tmp = 0x11; break; #if !defined EU && !defined JP - case 5: - tmp = 4; - flag = 0x83; + // Special conditions for BEANDEMO_00 to BEANDEMO_04 + case CND_5: + tmp = LOCAL_BANK_3; + flag = SORA_10_H00; break; - case 6: - tmp = 4; - flag = 0x84; + case CND_6: + tmp = LOCAL_BANK_3; + flag = SORA_11_H00; break; - case 7: - tmp = 4; - flag = 0x87; + case CND_7: + tmp = LOCAL_BANK_3; + flag = SORA_12_T00; break; - case 8: - tmp = 4; - flag = 0x88; + case CND_8: + tmp = LOCAL_BANK_3; + flag = SORA_13_H00; break; - case 9: - tmp = 4; - flag = 0x8b; + case CND_9: + tmp = LOCAL_BANK_3; + flag = SORA_14_T00; break; #ifndef DEMO_JP - case 10: - tmp = 5; - flag = 0x88; + case CND_10: + tmp = LOCAL_BANK_4; + flag = KS_B15; break; #endif #endif @@ -889,7 +892,7 @@ void sub_0801E8D4(void) { #else if (sub_0807CB24(tmp, s->flag)) { #endif - WriteBit(&gSave.unk24E, i); + WriteBit(&gSave.unk24E, kinstoneId); } } } @@ -911,7 +914,7 @@ void (*const gUnk_080C9CAC[])(void) = { // TODO merge #ifdef JP -const struct_080C9CBC gUnk_080C9CBC[] = { +const KinstoneWorldEvent gKinstoneWorldEvents[] = { { 15, 44, 45, 8, 0, 0, 0, 0 }, { 4, 8, 1, 0, 0, 1, 2, 0 }, { 4, 9, 1, 0, 0, 2, 2, 0 }, { 4, 10, 1, 0, 0, 3, 2, 0 }, { 4, 10, 1, 0, 0, 3, 2, 0 }, { 4, 9, 1, 0, 0, 2, 2, 0 }, { 4, 13, 2, 0, 0, 6, 2, 0 }, { 4, 14, 2, 0, 0, 7, 2, 0 }, { 4, 15, 2, 0, 0, 8, 2, 0 }, @@ -956,7 +959,7 @@ const struct_080C9CBC gUnk_080C9CBC[] = { #else #ifdef EU -const struct_080C9CBC gUnk_080C9CBC[] = { +const KinstoneWorldEvent gKinstoneWorldEvents[] = { { 15, 44, 45, 8, 0, 0, 0, 0 }, { 4, 8, 1, 0, 0, 1, 2, 0 }, { 4, 9, 1, 0, 0, 2, 2, 0 }, { 4, 10, 1, 0, 0, 3, 2, 0 }, { 4, 10, 1, 0, 0, 3, 2, 0 }, { 4, 9, 1, 0, 0, 2, 2, 0 }, { 4, 13, 2, 0, 0, 6, 2, 0 }, { 4, 14, 2, 0, 0, 7, 2, 0 }, { 4, 15, 2, 0, 0, 8, 2, 0 }, @@ -999,7 +1002,7 @@ const struct_080C9CBC gUnk_080C9CBC[] = { { 2, 43, 7, 8, 0, 18, 0, 0 }, }; #else -const struct_080C9CBC gUnk_080C9CBC[] = { +const KinstoneWorldEvent gKinstoneWorldEvents[] = { { 15, 44, 45, 8, 0, 0, 0, 0 }, { 4, 8, 1, 0, 0, 1, 2, 0 }, { 4, 9, 1, 0, 0, 2, 2, 0 }, { 4, 10, 1, 0, 0, 3, 2, 0 }, { 4, 10, 1, 0, 0, 3, 2, 0 }, { 4, 9, 1, 0, 0, 2, 2, 0 }, { 4, 13, 2, 0, 0, 6, 2, 0 }, { 4, 14, 2, 0, 0, 7, 2, 0 }, { 4, 15, 2, 0, 0, 8, 2, 0 }, @@ -1063,13 +1066,14 @@ const u8 gUnk_080CA11C[] = { 24, 45, 53, 54, 55, 57, 60, 68, 70, 71, 78, 80, 83, 85, 86, 88, 95, 96, 0, 0, }; +// Get a random kinstone u32 sub_0801EA74(void) { s32 r = (s32)Random() % 18; u32 i; for (i = 0; i < 18; ++i) { - u32 n = gUnk_080CA11C[r]; - if (!CheckKinstoneFused(n)) - return n; + u32 kinstoneId = gUnk_080CA11C[r]; + if (!CheckKinstoneFused(kinstoneId)) + return kinstoneId; r = (r + 1) % 18; } return 0xF2; diff --git a/src/cutscene.c b/src/cutscene.c new file mode 100644 index 00000000..93ea6eac --- /dev/null +++ b/src/cutscene.c @@ -0,0 +1,779 @@ +/** + * @file cutscene.c + * + * @brief Cutscenes + */ +#include "cutscene.h" + +#include "enemy.h" +#include "fade.h" +#include "fileselect.h" +#include "functions.h" +#include "game.h" +#include "main.h" +#include "menu.h" +#include "npc.h" +#include "object.h" +#include "screen.h" + +void sub_08051F78(void); +void sub_08051FF0(void); +void sub_08052004(void); + +const EntityData gUnk_080FCB94[] = { + { OBJECT, 15, CHUCHU_BOSS_CUTSCENE, 0, 0, 0x1c8, 0x288, 0 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; + +void sub_080535AC(void); +void sub_080535F4(void); +void nullsub_481(void); +void sub_08053618(void); +void (*const gUnk_080FCBB4[])(void) = { + sub_080535AC, + sub_080535F4, + nullsub_481, + sub_08053618, +}; + +void CutsceneMain_Init(void) { + gUnk_080FCBB4[gMenu.overlayType](); +} + +void sub_080535AC(void) { + gMenu.overlayType = 1; + gMenu.transitionTimer = 120; + gUI.field_0x6 = 1; + gUpdateVisibleTiles = 1; + gScreen.lcd.displayControl &= 0xfeff; + LoadRoomEntityList(gUnk_080FCB94); + SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 8); +} + +void sub_080535F4(void) { + if (gFadeControl.active == 0) { + ResetSystemPriority(); + gMenu.overlayType = 2; + } +} + +void nullsub_481(void) { +} + +void sub_08053618(void) { + gMenu.transitionTimer--; + if (gMenu.transitionTimer == 0) { + sub_08052004(); + } +} + +void sub_08053634(void) { + gUI.nextToLoad = 3; // Subtask_FadeOut + MessageInitialize(); +} + +void sub_08053648(void) { + Entity* obj = CreateObject(SMOKE, 0, 0); + if (obj != NULL) { + obj->x.HALF.HI = gRoomControls.origin_x + 0x2d0; + obj->y.HALF.HI = gRoomControls.origin_y + 0x148; + } +} + +void sub_0805367C(void) { + gMenu.overlayType++; +} + +void sub_0805368C(void) { + Entity* entity = FindEntityByID(OBJECT, HOUSE_DOOR_INT, 6); + if (entity != NULL) { + DeleteEntity(entity); + SoundReq(SFX_F0); // TODO Door sound during intro + } +} + +void sub_080536A8(void) { + sub_080A71C4(5, 5, FADE_INSTANT, 0x10); +} + +void sub_080536B8(void) { + sub_080A71C4(5, 3, FADE_INSTANT, 4); + SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100); +} + +extern Script script_IntroCameraTarget; +extern Script script_ZeldaMoveToLinksHouse; +extern Script script_HouseDoorIntro; +extern Script script_CutsceneOrchestratorIntro2; + +const EntityData gUnk_080FCBC4[] = { + { OBJECT, 79, CUTSCENE_ORCHESTRATOR, 0, 0, 0x230, 0x1a8, (u32)&script_IntroCameraTarget }, + { NPC, 79, ZELDA, 0, 0, 0x230, 0x1a8, (u32)&script_ZeldaMoveToLinksHouse }, + { OBJECT, 79, HOUSE_DOOR_EXT, 3, 3, 0x290, 0x193, (u32)&script_HouseDoorIntro }, + { OBJECT, 79, CUTSCENE_ORCHESTRATOR, 0, 0, 0x2d0, 0x1a8, (u32)&script_CutsceneOrchestratorIntro2 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; + +extern Script script_CutsceneOrchestratorIntro; +extern Script script_SmithIntro; +extern Script script_ZeldaIntro; +const EntityData gUnk_080FCC14[] = { + { OBJECT, 79, CUTSCENE_ORCHESTRATOR, 0, 0, 0x0, 0x0, (u32)&script_CutsceneOrchestratorIntro }, + { NPC, 79, SMITH, 0, 0, 0xb8, 0x60, (u32)&script_SmithIntro }, + { NPC, 79, ZELDA, 0, 0, 0x8, 0x5e, (u32)&script_ZeldaIntro }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; + +extern Script script_ZeldaLeaveLinksHouse; +const EntityData gUnk_080FCC54[] = { + { NPC, 79, ZELDA, 0, 0, 0xa0, 0x5d, (u32)&script_ZeldaLeaveLinksHouse }, + { OBJECT, 15, HOUSE_DOOR_INT, 4, 256, 0x78, 0x88, 0 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; + +const Font gUnk_080FCC84 = { + &gBG1Buffer[0x1cf], BG_TILE_ADDR(0x188), gTextGfxBuffer, 0, 0xf020, 0xf0, 1, 0, 0, 0, 0, 5, 0, 0, 0 +}; +const Font gUnk_080FCC9C = { + &gBG1Buffer[0x96], BG_TILE_ADDR(0x188), gTextGfxBuffer, 0, 0xf020, 0x78, 1, 0, 0, 0, 0, 5, 0, 0, 0 +}; + +const struct_080FCCB4 gUnk_080FCCB4[] = { + { &gUnk_080FCC84, 240, 96, 193, 1 }, { &gUnk_080FCC84, 240, 96, 453, 6 }, { &gUnk_080FCC9C, 120, 160, 363, 4 }, + { &gUnk_080FCC9C, 120, 160, 498, 4 }, { &gUnk_080FCC84, 240, 96, 368, 4 }, { &gUnk_080FCC84, 240, 96, 358, 4 }, +}; + +void sub_08053758(void); +void sub_08053800(void); +void sub_08053894(void); +void sub_08053800(void); +void sub_08053894(void); +void sub_08053800(void); +void sub_08053894(void); +void sub_08053800(void); +void sub_08053894(void); +void sub_08053800(void); +void sub_08053904(void); +void sub_08053974(void); +void nullsub_482(void); +void sub_080539BC(void); +void (*const gUnk_080FCCFC[])(void) = { + sub_08053758, sub_08053800, sub_08053894, sub_08053800, sub_08053894, sub_08053800, sub_08053894, sub_08053800, + sub_08053894, sub_08053800, sub_08053904, sub_08053974, nullsub_482, sub_080539BC, nullsub_482, +}; + +void sub_080536D4(void) { + gUnk_080FCCFC[gMenu.overlayType](); +} + +void sub_0805370C(void); +void (*const gUnk_080FCD38[])(void) = { + sub_0805370C, + nullsub_482, +}; + +void sub_080536F0(void) { + gUnk_080FCD38[gMenu.overlayType](); +} + +void sub_0805370C(void) { + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + sub_08051FF0(); + LoadRoomEntityList((EntityData*)gUnk_080FCC54); + SetFade(FADE_INSTANT, 0x10); +} + +void sub_08053758(void); +void sub_08053800(void); +void sub_08053894(void); +void sub_08053800(void); +void sub_08053894(void); +void sub_08053800(void); +void sub_08053894(void); +void sub_08053800(void); +void sub_08053894(void); +void sub_08053800(void); +void sub_08053894(void); +void sub_08053800(void); +void sub_08053894(void); +void sub_080539F4(void); +void sub_08053A1C(void); +void sub_08053A5C(void); +void sub_08053A90(void); +void (*const gUnk_080FCD40[])(void) = { + sub_08053758, sub_08053800, sub_08053894, sub_08053800, sub_08053894, sub_08053800, + sub_08053894, sub_08053800, sub_08053894, sub_08053800, sub_08053894, sub_08053800, + sub_08053894, sub_080539F4, sub_08053A1C, sub_08053A5C, sub_08053A90, +}; + +void sub_0805373C(void) { + gUnk_080FCD40[gMenu.overlayType](); +} + +void sub_08053758(void) { + gMenu.overlayType = 1; + gMenu.transitionTimer = 120; + gMenu.field_0xa = 0x1e; + *((u8*)&gMenu + 0x10) = 0; // TODO + gUI.field_0x6 = 1; + gMapBottom.bgSettings = NULL; + gMapTop.bgSettings = NULL; + gRoomControls.camera_target = NULL; + gRoomControls.scroll_y = 0; + gRoomControls.scroll_x = 0; + ClearBgAnimations(); + DispReset(0); + gScreen.lcd.displayControl = 0x2640; + gScreen.controls.layerFXControl = 0x2244; + gScreen.controls.alphaBlend = 0x1000; + gScreen.controls.windowInsideControl = 0x1f; + gScreen.controls.windowOutsideControl = 0x3f; + gScreen.controls.window0HorizontalDimensions = 0xf0; + gScreen.controls.window0VerticalDimensions = 0x60; + gScreen.bg1.control = 0x1c4e; + gScreen.bg2.control = 0x1dc1; + SoundReq(BGM_STORY); + ResetSystemPriority(); + SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100); +} + +void sub_08053800(void) { + u32 index; + const struct_080FCCB4* ptr; + if (gFadeControl.active == 0) { + index = gGenericMenu.unk10.a[0]; + ptr = &gUnk_080FCCB4[index]; + gGenericMenu.base.transitionTimer = ptr->transitionTimer; + gGenericMenu.base.field_0xa = 0x1e; + gGenericMenu.unk10.a[0]++; + gGenericMenu.base.overlayType++; + gGenericMenu.base.storyPanelIndex = 0; + LoadPaletteGroup(index + 0x8a); + LoadGfxGroup(index + 0x3a); + MemClear(&gBG1Buffer, 0x800); + ShowTextBox(TEXT_INDEX(TEXT_PICORI, 1) + index, ptr->font); + gScreen.bg1.updated = 1; + gScreen.controls.alphaBlend = 0x10; + gScreen.controls.window0HorizontalDimensions = ptr->width; + gScreen.controls.window0VerticalDimensions = ptr->height; + SetFade(FADE_INSTANT, ptr->fadeSpeed); + } +} + +void sub_08053894(void) { + u32 tmp; + if (gFadeControl.active == 0) { + gMenu.transitionTimer--; + if (gMenu.field_0xa != 0) { + gMenu.field_0xa--; + } else { + if (((gRoomTransition.frameCount & 1) == 0) && (gMenu.storyPanelIndex < 0x10)) { + tmp = ++gMenu.storyPanelIndex << 0x18; + gScreen.controls.alphaBlend = (tmp >> 0x10) | (0x10 - ((tmp) >> 0x19)); + } + } + if (gMenu.transitionTimer == 0) { + gMenu.overlayType++; + SetFade(FADE_IN_OUT | FADE_INSTANT, 8); + } + } +} + +void sub_08053904(void) { + u32 tmp; + if (gFadeControl.active == 0) { + gMenu.transitionTimer--; + if (gMenu.field_0xa != 0) { + gMenu.field_0xa--; + } else { + if (((gRoomTransition.frameCount & 1) == 0) && (gMenu.storyPanelIndex < 0x10)) { + tmp = ++gMenu.storyPanelIndex << 0x18; + gScreen.controls.alphaBlend = (tmp >> 0x10) | (0x10 - (tmp >> 0x19)); + } + } + if (gMenu.transitionTimer == 0) { + gMenu.overlayType++; + SetFade(FADE_IN_OUT | FADE_INSTANT, 1); + } + } +} + +void sub_08053974(void) { + if (gFadeControl.active == 0) { + InitFade(); + DispReset(1); + SetBGDefaults(); + sub_08051F78(); + LoadRoomEntityList(gUnk_080FCBC4); + SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100); + gMenu.overlayType++; + } +} + +void nullsub_482(void) { +} + +void sub_080539BC(void) { + SetBGDefaults(); + DeleteAllEntities(); + sub_08051F9C(0x22, 0x11, 0, 0); + sub_0804B0B0(0x22, 0x11); + LoadRoomEntityList(gUnk_080FCC14); + gMenu.overlayType++; +} + +void sub_080539F4(void) { + if (gFadeControl.active == 0) { + DispReset(1); + gMenu.overlayType++; + gMenu.transitionTimer = 60; + } +} + +void sub_08053A1C(void) { + gMenu.transitionTimer--; + if (gMenu.transitionTimer == 0) { + gMenu.overlayType++; + gMenu.transitionTimer = 8; + MessageFromTarget(TEXT_INDEX(TEXT_PICORI, 0x07)); + gMessage.textWindowPosX = 1; + gMessage.textWindowPosY = 8; + SetFade(FADE_INSTANT, 8); + } +} + +void sub_08053A5C(void) { + if (((gMessage.doTextBox & 0x7f) == 0) && --gMenu.transitionTimer == 0) { + gMenu.overlayType++; + SetFade(FADE_IN_OUT | FADE_INSTANT, 8); + } +} + +void sub_08053A90(void) { + if (gFadeControl.active == 0) { + gUI.nextToLoad = 3; // Subtask_FadeOut + SetBGDefaults(); + } +} + +extern Script script_CutsceneOrchestratorMinishVaati; +extern Script script_MinishEzlo; +extern Script script_CutsceneMiscObjectMinishCap; +extern Script script_Vaati; + +const EntityData gUnk_080FCD84[] = { + { OBJECT, 79, CUTSCENE_ORCHESTRATOR, 0, 0, 0x0, 0x0, (u32)&script_CutsceneOrchestratorMinishVaati }, + { NPC, 79, MINISH_EZLO, 0, 0, 0x78, 0xd8, (u32)&script_MinishEzlo }, + { OBJECT, 79, CUTSCENE_MISC_OBJECT, 1, 0, 0x78, 0x58, (u32)&script_CutsceneMiscObjectMinishCap }, + { NPC, 79, VAATI, 1, 0, 0x78, 0x68, (u32)&script_Vaati }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; + +void sub_08053ACC(void); +void sub_08053B00(void); +void sub_08053B10(void); +void (*const gUnk_080FCDD4[])(void) = { + sub_08053ACC, + sub_08053B00, + sub_08053B10, +}; + +void sub_08053AB0(void) { + gUnk_080FCDD4[gMenu.overlayType](); +} + +void sub_08053ACC(void) { + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + sub_08051FF0(); + LoadRoomEntityList(gUnk_080FCD84); + SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100); +} + +void sub_08053B00(void) { + gMenu.overlayType++; +} + +void sub_08053B10(void) { + if (CheckRoomFlag(1)) { + gMenu.menuType++; + DispReset(1); + SetFade(FADE_INSTANT, 0x100); + } +} + +void sub_08053B3C(void) { + sub_080A71C4(5, 4, FADE_IN_OUT | FADE_INSTANT, 0x100); + SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100); +} + +extern Script script_CutsceneOrchestratorTakeoverCutscene; +extern Script script_KingDaltusTakeover; +extern Script script_VaatiTakeover; +extern Script script_ZeldaStoneTakeover; +const EntityData gUnk_080FCDE0[] = { + { OBJECT, 79, CUTSCENE_ORCHESTRATOR, 0, 0, 0x0, 0x0, (u32)&script_CutsceneOrchestratorTakeoverCutscene }, + { NPC, 79, KING_DALTUS, 0, 0, 0x88, 0x58, (u32)&script_KingDaltusTakeover }, + { NPC, 79, VAATI, 1, 0, 0x88, 0xe0, (u32)&script_VaatiTakeover }, + { NPC, 79, ZELDA, 0, 0, 0xb8, 0x58, (u32)&script_ZeldaStoneTakeover }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; + +extern Script script_MinisterPothoTakeover; +extern Script script_GuardTakeover; +extern Script script_GuardTakeover; +const EntityData gUnk_080FCE30[] = { + { NPC, 79, MINISTER_POTHO, 0, 0, 0x68, 0x58, (u32)&script_MinisterPothoTakeover }, + { NPC, 79, GUARD_1, 0, 0, 0x78, 0xe8, (u32)&script_GuardTakeover }, + { NPC, 79, GUARD_1, 1, 0, 0x78, 0x108, (u32)&script_GuardTakeover }, + { NPC, 79, GUARD_1, 2, 0, 0x78, 0x128, (u32)&script_GuardTakeover }, + { NPC, 79, GUARD_1, 3, 0, 0x98, 0xe8, (u32)&script_GuardTakeover }, + { NPC, 79, GUARD_1, 4, 0, 0x98, 0x108, (u32)&script_GuardTakeover }, + { NPC, 79, GUARD_1, 5, 0, 0x98, 0x128, (u32)&script_GuardTakeover }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; + +void sub_08053B74(void); +void sub_08053BAC(void); +void sub_08053BBC(void); +void (*const gUnk_080FCEB0[])(void) = { + sub_08053B74, + sub_08053BAC, + sub_08053BBC, +}; + +void sub_08053B58(void) { + gUnk_080FCEB0[gMenu.overlayType](); +} + +void sub_08053B74(void) { + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + LoadRoomEntityList(gUnk_080FCDE0); + ResetSystemPriority(); + ResetEntityPriority(); + SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100); +} + +void sub_08053BAC(void) { + gMenu.overlayType++; +} + +void sub_08053BBC(void) { + if (CheckRoomFlag(0)) { + gMenu.menuType++; + DispReset(1); + SetFade(FADE_INSTANT, 0x100); + } +} + +void sub_08053BE8(void) { + sub_080A71C4(5, 2, FADE_IN_OUT | FADE_INSTANT, 0x100); + SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100); +} + +extern Script script_ZeldaStoneInDHC; +extern Script script_ZeldaStoneDHC; +const EntityData gUnk_080FCEBC[] = { + { NPC, 79, ZELDA, 0, 0, 0x78, 0x68, (u32)&script_ZeldaStoneInDHC }, + { NPC, 79, VAATI, 1, 0, 0x78, 0x98, (u32)&script_ZeldaStoneDHC }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; +void sub_08053C20(void); +void nullsub_483(void); +void sub_08053C60(void); +void (*const gUnk_080FCEEC[])(void) = { + sub_08053C20, + nullsub_483, + sub_08053C60, +}; + +void sub_08053C04(void) { + gUnk_080FCEEC[gMenu.overlayType](); +} + +void sub_08053C20(void) { + gMenu.overlayType = 1; + gMenu.transitionTimer = 120; // Go to game over after 2 minutes. + gUpdateVisibleTiles = 1; + sub_08051FF0(); + LoadStaticBackground(4); + LoadRoomEntityList(gUnk_080FCEBC); + SetFade(FADE_INSTANT, 0x10); + SoundReq(BGM_FIGHT_THEME2); +} + +void nullsub_483(void) { +} + +void sub_08053C60(void) { + SetFade(FADE_IN_OUT | FADE_INSTANT, 2); + SoundReq(SFX_SUMMON); + SoundReq(SONG_STOP_BGM); + SetTask(TASK_GAMEOVER); +} + +void sub_08053C84(void) { + gMenu.overlayType = 2; +} +void sub_08053CAC(void); +void sub_08053CAC(void); +void sub_08053E58(void); +void (*const gUnk_080FCEF8[])(void) = { + sub_08053CAC, + sub_08053CAC, + sub_08053E58, +}; + +void CutsceneMain_Exit(void) { + gUnk_080FCEF8[gMenu.field_0x3](); +} + +const EntityData gUnk_080FCF24[]; +const EntityData gUnk_080FCF44[]; +const EntityData gUnk_080FCF64[]; +const EntityData gUnk_080FCF84[]; + +const struct_080FCF04 gUnk_080FCF04[] = { + { gUnk_080FCF24, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_WEST_STAIRS_2F, 0, 0 }, + { gUnk_080FCF44, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_WEST_STAIRS_1F, 0, 0 }, + { gUnk_080FCF64, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_EAST_STAIRS_2F, 0, 0 }, + { gUnk_080FCF84, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_EAST_STAIRS_1F, 0, 0 }, +}; + +const EntityData gUnk_080FCF24[] = { + { OBJECT, 15, GROUND_ITEM, 83, 512, 0x88, 0x68, 0 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; + +const EntityData gUnk_080FCF44[] = { + { OBJECT, 15, GROUND_ITEM, 83, 512, 0x68, 0x68, 0 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; + +const EntityData gUnk_080FCF64[] = { + { OBJECT, 15, GROUND_ITEM, 83, 512, 0x88, 0x68, 0 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; + +const EntityData gUnk_080FCF84[] = { + { OBJECT, 15, GROUND_ITEM, 83, 512, 0x68, 0x68, 0 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; + +void sub_08053CC8(void); +void sub_08053D34(void); +void sub_08053D90(void); +void sub_08053DB4(void); +void sub_08053E30(void); +void (*const gUnk_080FCFA4[])(void) = { + sub_08053CC8, sub_08053D34, sub_08053D90, sub_08053DB4, sub_08053E30, +}; + +void sub_08053CAC(void) { + gUnk_080FCFA4[gMenu.overlayType](); +} + +void sub_08053CC8(void) { + const struct_080FCF04* ptr; + ptr = gUnk_080FCF04 + gMenu.field_0x3 * 2; + gMenu.field_0xc = (void*)&ptr[1]; + LoadRoomEntityList(ptr->entityData); + LoadRoomEntityList(GetRoomProperty(ptr->area, ptr->room, 1)); + LoadRoomEntityList(GetRoomProperty(ptr->area, ptr->room, 2)); + gMenu.overlayType = 1; + gScreen.lcd.displayControl &= 0xfeff; + gUpdateVisibleTiles = 1; + SetFade(FADE_INSTANT, 0x10); + if (ptr->room == 0x1d) { // TODO what room is this? + gMenu.field_0xa = 1; + } +} + +void sub_08053D34(void) { + if (gMenu.field_0xa != 0) { + gMenu.field_0xa = 0; + if (CheckLocalFlagByBank(FLAG_BANK_7, 0x3d)) { + SetTileType(0x74, 0xc4, 1); + } + if (CheckLocalFlagByBank(FLAG_BANK_7, 0x3e)) { + SetTileType(0x74, 0xcc, 1); + } + } + if (gFadeControl.active == 0) { + gMenu.transitionTimer = 120; + gMenu.overlayType++; + } +} + +void sub_08053D90(void) { + gMenu.transitionTimer--; + if (gMenu.transitionTimer == 0) { + gMenu.overlayType++; + SetFadeInverted(0x10); + } +} + +void sub_08053DB4(void) { + if (gFadeControl.active == 0) { + struct_080FCF04* ptr = (struct_080FCF04*)gMenu.field_0xc; + sub_08052FF4(gMenu.field_0xc[4], gMenu.field_0xc[5]); + InitializeCamera(); + gUpdateVisibleTiles = 1; + gRoomControls.scroll_x = (s8)ptr->scrollX + gRoomControls.scroll_x; + gRoomControls.scroll_y = (s8)ptr->scrollY + gRoomControls.scroll_y; + LoadRoomEntityList(ptr->entityData); + LoadRoomEntityList((EntityData*)GetRoomProperty(ptr->area, ptr->room, 1)); + LoadRoomEntityList((EntityData*)GetRoomProperty(ptr->area, ptr->room, 2)); + gMenu.transitionTimer = 120; + gMenu.overlayType++; + SetFadeInverted(0x10); + } +} + +void sub_08053E30(void) { + if ((gFadeControl.active == 0) && --gMenu.transitionTimer == 0) { + gMenu.menuType++; + } +} + +const EntityData gUnk_080FCFE8[]; +const EntityData gUnk_080FD008[]; +const EntityData gUnk_080FD028[]; +const EntityData gUnk_080FD048[]; +const EntityData gUnk_080FD078[]; +const EntityData gUnk_080FD098[]; +const EntityData gUnk_080FD0C8[]; +const EntityData gUnk_080FD0E8[]; +const struct_080FCFB8 gUnk_080FCFB8[] = { + { gUnk_080FCFE8, gUnk_080FD008, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_2F_TOP_LEFT_DARKNUT, 16, 16 }, + { gUnk_080FD028, gUnk_080FD048, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_2F_TOP_RIGHT_DARKNUTS, 16, 16 }, + { gUnk_080FD078, gUnk_080FD098, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_2F_BOTTOM_LEFT_DARKNUTS, 16, 16 }, + { gUnk_080FD0C8, gUnk_080FD0E8, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_2F_BOTTOM_RIGHT_DARKNUT, 16, 16 }, +}; + +const EntityData gUnk_080FCFE8[] = { + { OBJECT, 15, BOSS_DOOR, 8, 0, 0x88, 0x28, 65535 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; +const EntityData gUnk_080FD008[] = { + { ENEMY, 47, DARK_NUT, 2, 0, 0x88, 0x68, 0 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; +const EntityData gUnk_080FD028[] = { + { OBJECT, 15, BOSS_DOOR, 8, 0, 0x88, 0x28, 65535 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; +const EntityData gUnk_080FD048[] = { + { ENEMY, 47, DARK_NUT, 1, 0, 0x70, 0x68, 0 }, + { ENEMY, 47, DARK_NUT, 0, 0, 0xa0, 0x68, 0 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; +const EntityData gUnk_080FD078[] = { + { OBJECT, 15, BOSS_DOOR, 10, 0, 0x88, 0xa8, 65535 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; +const EntityData gUnk_080FD098[] = { + { ENEMY, 47, DARK_NUT, 0, 0, 0x70, 0x68, 0 }, + { ENEMY, 47, DARK_NUT, 1, 0, 0xa0, 0x68, 0 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; +const EntityData gUnk_080FD0C8[] = { + { OBJECT, 15, BOSS_DOOR, 10, 0, 0x88, 0xa8, 65535 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; +const EntityData gUnk_080FD0E8[] = { + { ENEMY, 47, DARK_NUT, 2, 0, 0x88, 0x68, 0 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; + +void sub_08053E74(void); +void sub_08053EC4(void); +void sub_08053EFC(void); +void sub_08053F20(void); +void sub_08053EC4(void); +void sub_08053EFC(void); +void sub_08053F20(void); +void sub_08053EC4(void); +void sub_08053EFC(void); +void sub_08053F20(void); +void sub_08053EC4(void); +void sub_08053F88(void); +void (*const gUnk_080FD108[])(void) = { + sub_08053E74, sub_08053EC4, sub_08053EFC, sub_08053F20, sub_08053EC4, sub_08053EFC, + sub_08053F20, sub_08053EC4, sub_08053EFC, sub_08053F20, sub_08053EC4, sub_08053F88, +}; + +void sub_08053E58(void) { + gUnk_080FD108[gMenu.overlayType](); +} + +void sub_08053E74(void) { + const struct_080FCFB8* ptr = gUnk_080FCFB8; + gMenu.field_0xc = (u8*)ptr; + LoadRoomEntityList(ptr->entityData1); + gMenu.transitionTimer = 120; + gMenu.field_0xa = 0x3c; + gMenu.overlayType++; + gScreen.lcd.displayControl &= 0xfeff; + gUpdateVisibleTiles = 1; + SetMinPriority(1); + SetFade(FADE_INSTANT, 8); +} + +void sub_08053EC4(void) { + EntityData** data; + if ((gFadeControl.active == 0) && (--gMenu.field_0xa == 0)) { + data = (EntityData**)(gMenu.field_0xc + 4); // TODO entityData2 of struct_080FCFB8 + gMenu.field_0xc += 0xc; + LoadRoomEntityList(*data); + gMenu.overlayType++; + } +} + +void sub_08053EFC(void) { + if (--gMenu.transitionTimer == 0) { + gMenu.overlayType++; + SetFadeInverted(8); + } +} + +void sub_08053F20(void) { + struct_080FCFB8* ptr; + if (gFadeControl.active == 0) { + DeleteAllEntities(); + ptr = (struct_080FCFB8*)gMenu.field_0xc; + sub_08052FF4(ptr->area, ptr->room); + InitializeCamera(); + gUpdateVisibleTiles = 1; + gRoomControls.scroll_x = (s8)ptr->scrollX + gRoomControls.scroll_x; + gRoomControls.scroll_y = (s8)ptr->scrollY + gRoomControls.scroll_y; + LoadRoomEntityList((ptr)->entityData1); + gMenu.transitionTimer = 120; + gMenu.field_0xa = 0x3c; + gMenu.overlayType++; + SetFadeInverted(8); + } +} + +void sub_08053F88(void) { + if ((gFadeControl.active == 0) && --gMenu.transitionTimer == 0) { + gMenu.menuType++; + ResetEntityPriority(); + } +} + +void sub_080536D4(void); +void sub_08053B58(void); +void sub_0805373C(void); +void sub_08053AB0(void); +void sub_080536F0(void); +void sub_08053C04(void); +void (*const gUnk_080FD138[])(void) = { + sub_080536D4, sub_08053B58, sub_0805373C, sub_08053AB0, sub_080536F0, sub_08053C04, +}; + +void CutsceneMain_Update(void) { + gUnk_080FD138[gMenu.field_0x3](); +} diff --git a/src/data/figurineMenuData.c b/src/data/figurineMenuData.c new file mode 100644 index 00000000..67b338b0 --- /dev/null +++ b/src/data/figurineMenuData.c @@ -0,0 +1,56 @@ +#include "figurineMenu.h" +#include "pauseMenu.h" +#include "subtask.h" +#include "subtask2.h" + +// This data also belongs in figurine_menu.c, but the data/gfx/figurines.s are inbetween. +// TODO convert them to c code as well. + +// clang-format off + +// Pause menu screens +const struct_08128A38 gUnk_08128A38[] = { + [PauseMenuScreen_0] = { 0, 1, PauseMenu_Variant0 }, + [PauseMenuScreen_1] = { 0, 1, PauseMenu_ItemMenu }, + [PauseMenuScreen_2] = { 1, 2, PauseMenu2 }, + [PauseMenuScreen_3] = { 8, 2, PauseMenu_Variant0 }, + [PauseMenuScreen_4] = { 2, 15, PauseMenu_Screen_4 }, + [PauseMenuScreen_5] = { 3, 15, PauseMenu_Screen_5 }, + [PauseMenuScreen_6] = { 4, 15, PauseMenu_Screen_6 }, + [PauseMenuScreen_7] = { 5, 2, PauseMenu_Screen_7 }, + [PauseMenuScreen_8] = { 6, 2, PauseMenu_Screen_8 }, + [PauseMenuScreen_9] = { 9, 2, PauseMenu_Screen_9 }, + [PauseMenuScreen_10] = { 10, 2, PauseMenu_Screen_10 }, + [PauseMenuScreen_11] = { 10, 1, PauseMenu_Screen_10 }, + [PauseMenuScreen_12] = { 2, 15, PauseMenu_Variant0 }, + [PauseMenuScreen_13] = { 7, 15, PauseMenu_Variant0 }, + [PauseMenuScreen_14] = { 0, 1, PauseMenu_Variant0 }, + [PauseMenuScreen_15] = { 0, 1, PauseMenu_Variant0 }, + [PauseMenuScreen_16] = { 0, 1, PauseMenu_Variant0 }, + [PauseMenuScreen_17] = { 0, 1, PauseMenu_Variant0 }, + [PauseMenuScreen_18] = { 0, 1, PauseMenu_Variant0 }, + [PauseMenuScreen_19] = { 0, 1, PauseMenu_Variant0 }, +}; + + +// TODO extract the bg controls +const struct_08128AD8 gUnk_08128AD8[] = { + { 182, 90, 1024, 7173, 7427 }, + { 183, 91, 1024, 7173, 7427 }, + { 185, 94, 34304, 7171, 7435 }, + { 184, 92, 1536, 7170, 7427 }, + { 185, 129, 1536, 7178, 7427 }, + { 204, 125, 1024, 7171, 7427 }, + { 205, 126, 1536, 7170, 7427 }, + { 185, 93, 34304, 7171, 7435 }, + { 206, 89, 3840, 7170, 7427 }, +#ifdef EU + { 0, 128, 1536, 7170, 7431 }, + { 0, 127, 1536, 7170, 7431 }, +#else + { 207, 128, 1536, 7170, 7431 }, + { 207, 127, 1536, 7170, 7431 }, +#endif +}; + +// clang-format on diff --git a/src/data/hitbox.c b/src/data/hitbox.c new file mode 100644 index 00000000..297e17b4 --- /dev/null +++ b/src/data/hitbox.c @@ -0,0 +1,138 @@ +/** + * @file hitbox.c + * + * @brief Hitboxes + */ +#include "hitbox.h" + +const Hitbox gHitbox_0 = { 0, -3, { 5, 3, 3, 5 }, 6, 6 }; +const Hitbox gHitbox_30 = { 0, 6, { 5, 3, 3, 5 }, 10, 16 }; +const Hitbox gHitbox_31 = { 0, 6, { 5, 3, 3, 5 }, 10, 15 }; +const Hitbox gHitbox_1 = { 0, 0, { 5, 3, 3, 5 }, 6, 6 }; +const Hitbox gHitbox_2 = { 0, -3, { 5, 3, 3, 5 }, 8, 8 }; +const Hitbox gUnk_080FD178 = { 0, 0, { 5, 3, 3, 5 }, 8, 8 }; +const Hitbox gHitbox_3 = { 0, -3, { 5, 3, 3, 5 }, 12, 12 }; +const Hitbox gHitbox_4 = { 0, 0, { 9, 6, 6, 9 }, 10, 10 }; +const Hitbox gUnk_080FD190 = { 0, 0, { 12, 8, 8, 12 }, 14, 14 }; +const Hitbox gHitbox_5 = { 0, -1, { 6, 3, 3, 6 }, 6, 5 }; +const Hitbox gHitbox_6 = { 0, 0, { 4, 2, 2, 4 }, 2, 2 }; +const Hitbox3D gUnk_080FD1A8 = { 0, -3, { 6, 3, 3, 6 }, 2, 2, 64, { 0, 0, 0 } }; +const Hitbox gUnk_080FD1B4 = { 0, -4, { 8, 5, 6, 7 }, 8, 10 }; +const Hitbox unused1 = { 0, -3, { 0, 0, 0, 0 }, 0, 0 }; +const Hitbox gHitbox_7 = { 0, 0, { 2, 0, 0, 2 }, 2, 2 }; +const Hitbox gHitbox_8 = { 0, 1, { 5, 2, 3, 4 }, 4, 4 }; +const Hitbox gUnk_080FD1D4 = { 0, -3, { 0, 0, 0, 0 }, 10, 8 }; +const Hitbox gUnk_080FD1DC = { 0, 0, { 6, 4, 4, 6 }, 6, 6 }; +const Hitbox gUnk_080FD1E4 = { 0, 0, { 0, 0, 0, 0 }, 4, 4 }; +const Hitbox gUnk_080FD1EC = { 0, 0, { 0, 0, 0, 0 }, 2, 2 }; +const Hitbox gUnk_080FD1F4 = { 0, -1, { 6, 4, 4, 6 }, 4, 4 }; +const Hitbox gUnk_080FD1FC = { 0, 0, { 6, 4, 4, 6 }, 6, 6 }; +const Hitbox gUnk_080FD204 = { 0, 0, { 0, 0, 0, 0 }, 5, 5 }; +const Hitbox gUnk_080FD20C = { 0, 0, { 0, 0, 0, 0 }, 4, 4 }; +const Hitbox gUnk_080FD214 = { 0, 0, { 0, 0, 0, 0 }, 2, 2 }; +const Hitbox gUnk_080FD21C = { 0, 0, { 6, 4, 4, 6 }, 6, 6 }; +const Hitbox gUnk_080FD224 = { 0, -2, { 0, 0, 0, 0 }, 5, 3 }; +const Hitbox3D gUnk_080FD22C = { 0, 0, { 5, 3, 3, 5 }, 6, 6, 12, { 0, 0, 0 } }; +const Hitbox gUnk_080FD238 = { 0, 4, { 25, 8, 8, 12 }, 26, 8 }; +const Hitbox gUnk_080FD240 = { 0, 12, { 28, 14, 14, 16 }, 24, 24 }; +const Hitbox gUnk_080FD248 = { 0, 0, { 28, 14, 14, 16 }, 16, 16 }; +const Hitbox gHitbox_9 = { 0, -4, { 5, 3, 3, 5 }, 6, 6 }; +const Hitbox gUnk_080FD258 = { 0, -6, { 9, 6, 5, 10 }, 7, 8 }; +const Hitbox gUnk_080FD260 = { 0, -3, { 5, 3, 3, 4 }, 3, 3 }; +const Hitbox gHitbox_10 = { 0, -3, { 0, 0, 0, 0 }, 2, 3 }; +const Hitbox gUnk_080FD270 = { 0, 0, { 4, 4, 4, 4 }, 2, 6 }; +const Hitbox gUnk_080FD278 = { 0, 0, { 4, 4, 4, 4 }, 6, 2 }; +const Hitbox gUnk_080FD280 = { 0, -2, { 0, 0, 0, 0 }, 12, 14 }; +const Hitbox gUnk_080FD288 = { 0, -3, { 14, 12, 10, 12 }, 12, 10 }; +const Hitbox gUnk_080FD290 = { 0, 0, { 5, 3, 3, 5 }, 6, 6 }; +const Hitbox gUnk_080FD298 = { 0, 0, { 0, 0, 0, 0 }, 4, 4 }; +const Hitbox gUnk_080FD2A0 = { 0, 0, { 0, 0, 0, 0 }, 2, 2 }; +const Hitbox gUnk_080FD2A8 = { 0, -6, { 34, 24, 28, 32 }, 26, 21 }; +const Hitbox gHitbox_11 = { 0, -4, { 0, 0, 0, 0 }, 7, 4 }; +const Hitbox gHitbox_12 = { 0, -6, { 0, 0, 0, 0 }, 7, 4 }; +const Hitbox gHitbox_13 = { 0, 0, { 9, 4, 4, 9 }, 4, 4 }; +const Hitbox gHitbox_14 = { 0, -3, { 6, 4, 4, 6 }, 5, 5 }; +const Hitbox gUnk_080FD2D0 = { 0, -8, { 5, 3, 3, 5 }, 18, 16 }; +const Hitbox gUnk_080FD2D8 = { 0, -14, { 5, 3, 3, 5 }, 4, 4 }; +const Hitbox gUnk_080FD2E0 = { 0, 0, { 5, 3, 3, 5 }, 12, 12 }; +const Hitbox gUnk_080FD2E8 = { 0, 0, { 5, 3, 3, 5 }, 32, 32 }; +const Hitbox gUnk_080FD2F0 = { 0, 0, { 6, 4, 4, 6 }, 6, 6 }; +const Hitbox gHitbox_15 = { 0, 0, { 6, 4, 4, 6 }, 9, 9 }; +const Hitbox gHitbox_16 = { 0, -7, { 0, 0, 0, 0 }, 8, 7 }; +const Hitbox gUnk_080FD308 = { 0, -12, { 16, 8, 8, 16 }, 8, 8 }; +const Hitbox gUnk_080FD310 = { 0, -2, { 5, 3, 3, 5 }, 9, 9 }; +const Hitbox gHitbox_17 = { 0, 1, { 8, 6, 6, 8 }, 6, 6 }; +const Hitbox gUnk_080FD320 = { 0, 0, { 5, 3, 3, 5 }, 8, 12 }; +const Hitbox gUnk_080FD328 = { 0, 0, { 5, 3, 3, 5 }, 6, 12 }; +const Hitbox gUnk_080FD330 = { 0, -6, { 5, 3, 3, 5 }, 6, 6 }; +const Hitbox gHitbox_18 = { 0, -4, { 6, 3, 3, 6 }, 6, 6 }; +const Hitbox3D gUnk_080FD340 = { 0, 0, { 6, 3, 3, 6 }, 3, 3, 16, { 0, 0, 0 } }; +const Hitbox gUnk_080FD34C = { 0, 0, { 4, 2, 2, 4 }, 4, 4 }; +const Hitbox gUnk_080FD354 = { 0, -2, { 0, 0, 0, 0 }, 32, 10 }; +const Hitbox gUnk_080FD35C = { 11, 2, { 0, 0, 0, 0 }, 9, 8 }; +const Hitbox gUnk_080FD364 = { 12, 6, { 0, 0, 0, 0 }, 9, 8 }; +const Hitbox gUnk_080FD36C = { -11, 2, { 0, 0, 0, 0 }, 9, 8 }; +const Hitbox gUnk_080FD374 = { -12, 6, { 0, 0, 0, 0 }, 9, 8 }; +const Hitbox gUnk_080FD37C = { -2, -6, { 0, 0, 0, 0 }, 4, 5 }; +const Hitbox gUnk_080FD384 = { 2, -6, { 0, 0, 0, 0 }, 4, 5 }; +const Hitbox gUnk_080FD38C = { 0, 0, { 0, 0, 0, 0 }, 16, 12 }; +const Hitbox gUnk_080FD394 = { 31, 2, { 0, 0, 0, 0 }, 9, 8 }; +const Hitbox gUnk_080FD39C = { 8, 12, { 0, 0, 0, 0 }, 10, 10 }; +const Hitbox gUnk_080FD3A4 = { 0, 12, { 0, 0, 0, 0 }, 6, 18 }; +const Hitbox gUnk_080FD3AC = { -18, 10, { 0, 0, 0, 0 }, 12, 12 }; +const Hitbox gUnk_080FD3B4 = { -31, 2, { 0, 0, 0, 0 }, 9, 8 }; +const Hitbox gUnk_080FD3BC = { -8, 12, { 0, 0, 0, 0 }, 10, 10 }; +const Hitbox gUnk_080FD3C4 = { 18, 10, { 0, 0, 0, 0 }, 12, 12 }; +const Hitbox gUnk_080FD3CC = { 0, 0, { 72, 60, 60, 72 }, 40, 40 }; +const Hitbox unused2 = { 0, 0, { 52, 44, 44, 52 }, 40, 40 }; +const Hitbox gUnk_080FD3DC = { 0, 0, { 8, 8, 8, 8 }, 16, 16 }; +const Hitbox gUnk_080FD3E4 = { 0, 0, { 8, 8, 8, 8 }, 16, 16 }; +const Hitbox gUnk_080FD3EC = { 0, 0, { 8, 8, 8, 8 }, 16, 16 }; +const Hitbox gUnk_080FD3F4 = { 0, 0, { 8, 5, 5, 8 }, 16, 16 }; +const Hitbox3D gUnk_080FD3FC = { 0, -3, { 5, 3, 3, 5 }, 6, 6, 16, { 0, 0, 0 } }; +const Hitbox gUnk_080FD408 = { 0, 0, { 9, 4, 4, 9 }, 4, 4 }; +const Hitbox3D gHitbox_19 = { 0, -3, { 5, 3, 3, 5 }, 6, 6, 12, { 0, 0, 0 } }; +const Hitbox gUnk_080FD41C = { 0, 0, { 0, 0, 0, 0 }, 6, 6 }; +const Hitbox gUnk_080FD424 = { -3, 0, { 0, 0, 0, 0 }, 5, 6 }; +const Hitbox gUnk_080FD42C = { 0, -1, { 0, 0, 0, 0 }, 6, 6 }; +const Hitbox gUnk_080FD434 = { 3, 0, { 0, 0, 0, 0 }, 5, 6 }; +const Hitbox3D gUnk_080FD43C = { -16, 12, { 0, 0, 0, 0 }, 8, 4, 24, { 0, 0, 0 } }; +const Hitbox gHitbox_20 = { 0, 0, { 0, 0, 0, 0 }, 4, 4 }; +const Hitbox gUnk_080FD450 = { 0, -3, { 0, 0, 0, 0 }, 4, 4 }; +const Hitbox gHitbox_21 = { 0, 0, { 0, 0, 0, 0 }, 1, 1 }; +const Hitbox gHitbox_22 = { 0, 0, { 0, 0, 0, 0 }, 2, 2 }; +const Hitbox gHitbox_23 = { 0, -3, { 4, 3, 3, 4 }, 4, 4 }; +const Hitbox gHitbox_32 = { 0, -5, { 9, 6, 6, 9 }, 10, 10 }; +const Hitbox unused3 = { 0, -4, { 5, 3, 3, 5 }, 5, 5 }; +const Hitbox gHitbox_24 = { 0, -3, { 5, 3, 3, 5 }, 3, 3 }; +const Hitbox gUnk_080FD488 = { 0, -3, { 6, 3, 3, 4 }, 4, 3 }; +const Hitbox gUnk_080FD490 = { 0, -3, { 3, 2, 2, 3 }, 2, 2 }; +const Hitbox3D gHitbox_25 = { 0, -6, { 5, 3, 3, 5 }, 6, 6, 16, { 0, 0, 0 } }; +const Hitbox3D gHitbox_26 = { 0, -5, { 4, 2, 2, 4 }, 4, 4, 16, { 0, 0, 0 } }; +const Hitbox unused4 = { 0, -7, { 8, 6, 6, 8 }, 6, 6 }; +const Hitbox gUnk_080FD4B8 = { 0, 0, { 0, 0, 0, 0 }, 3, 8 }; +const Hitbox gUnk_080FD4C0 = { 0, 0, { 0, 0, 0, 0 }, 3, 16 }; +const Hitbox gUnk_080FD4C8 = { 0, 0, { 0, 0, 0, 0 }, 3, 24 }; +const Hitbox gUnk_080FD4D0 = { 0, 0, { 0, 0, 0, 0 }, 3, 32 }; +const Hitbox gUnk_080FD4D8 = { 0, 0, { 0, 0, 0, 0 }, 3, 40 }; +const Hitbox gUnk_080FD4E0 = { 0, 0, { 0, 0, 0, 0 }, 3, 48 }; +const Hitbox gUnk_080FD4E8 = { 0, 0, { 0, 0, 0, 0 }, 3, 56 }; +const Hitbox gUnk_080FD4F0 = { 0, 0, { 0, 0, 0, 0 }, 16, 3 }; +const Hitbox gUnk_080FD4F8 = { 0, 0, { 0, 0, 0, 0 }, 24, 3 }; +const Hitbox gUnk_080FD500 = { 0, 0, { 0, 0, 0, 0 }, 32, 3 }; +const Hitbox gUnk_080FD508 = { 0, 0, { 0, 0, 0, 0 }, 40, 3 }; +const Hitbox gUnk_080FD510 = { 0, 0, { 0, 0, 0, 0 }, 48, 3 }; +const Hitbox gUnk_080FD518 = { 0, 0, { 0, 0, 0, 0 }, 56, 3 }; +const Hitbox gUnk_080FD520 = { 0, 0, { 0, 0, 0, 0 }, 64, 3 }; +const Hitbox gHitbox_27 = { 0, 0, { 3, 2, 2, 3 }, 1, 1 }; +const Hitbox gUnk_080FD530 = { 0, 9, { 10, 8, 8, 10 }, 12, 12 }; +const Hitbox3D gUnk_080FD538 = { 0, -4, { 28, 23, 23, 28 }, 6, 6, 10, { 0, 0, 0 } }; +const Hitbox gUnk_080FD544 = { 0, -20, { 36, 24, 28, 32 }, 16, 16 }; +const Hitbox3D gHitbox_28 = { 0, 0, { 0, 0, 0, 0 }, 16, 16, 14, { 0, 0, 0 } }; +const Hitbox gUnk_080FD558 = { 0, 0, { 5, 3, 3, 5 }, 4, 4 }; +const Hitbox gUnk_080FD560 = { 0, 0, { 0, 0, 0, 0 }, 1, 1 }; +const Hitbox gHitbox_29 = { 0, -4, { 7, 5, 5, 7 }, 7, 7 }; +const Hitbox gUnk_080FD570 = { 0, -4, { 0, 0, 0, 0 }, 8, 6 }; +const Hitbox gUnk_080FD578 = { 0, -4, { 0, 0, 0, 0 }, 12, 6 }; +const Hitbox gUnk_080FD580 = { 0, -3, { 8, 5, 5, 8 }, 10, 10 }; +const Hitbox gUnk_080FD588 = { 0, -7, { 5, 3, 3, 5 }, 6, 6 }; diff --git a/src/data/objPalettes.c b/src/data/objPalettes.c new file mode 100644 index 00000000..a39037ce --- /dev/null +++ b/src/data/objPalettes.c @@ -0,0 +1,132 @@ +#include "global.h" +#include "assets/gfx_offsets.h" + +const u32 gUnk_08133368[] = { + offset_gPalette_14 | 1 << 0x18, offset_gPalette_15 | 1 << 0x18, offset_gPalette_16 | 1 << 0x18, + offset_gPalette_17 | 1 << 0x18, offset_gPalette_22 | 1 << 0x18, offset_gPalette_23 | 1 << 0x18, + offset_gPalette_102 | 1 << 0x18, offset_gPalette_321 | 1 << 0x18, offset_gPalette_100 | 1 << 0x18, + offset_gPalette_101 | 1 << 0x18, offset_gPalette_103 | 1 << 0x18, offset_gPalette_118 | 1 << 0x18, + offset_gPalette_105 | 1 << 0x18, offset_gPalette_104 | 1 << 0x18, offset_gPalette_106 | 1 << 0x18, + offset_gPalette_89 | 1 << 0x18, offset_gPalette_90 | 1 << 0x18, offset_gPalette_91 | 1 << 0x18, + offset_gPalette_107 | 1 << 0x18, offset_gPalette_109 | 1 << 0x18, offset_gPalette_94 | 1 << 0x18, + offset_gPalette_47 | 1 << 0x18, offset_gPalette_79 | 1 << 0x18, offset_gPalette_80 | 1 << 0x18, + offset_gPalette_24 | 1 << 0x18, offset_gPalette_679 | 1 << 0x18, offset_gPalette_205 | 1 << 0x18, + offset_gPalette_206 | 1 << 0x18, offset_gPalette_207 | 1 << 0x18, offset_gPalette_239 | 1 << 0x18, + offset_gPalette_231 | 1 << 0x18, offset_gPalette_133 | 1 << 0x18, offset_gPalette_134 | 1 << 0x18, + offset_gPalette_129 | 1 << 0x18, offset_gPalette_135 | 1 << 0x18, offset_gPalette_136 | 1 << 0x18, + offset_gPalette_137 | 1 << 0x18, offset_gPalette_138 | 1 << 0x18, offset_gPalette_139 | 1 << 0x18, + offset_gPalette_140 | 1 << 0x18, offset_gPalette_130 | 1 << 0x18, offset_gPalette_131 | 1 << 0x18, + offset_gPalette_132 | 1 << 0x18, offset_gPalette_141 | 1 << 0x18, offset_gPalette_142 | 1 << 0x18, + offset_gPalette_144 | 1 << 0x18, offset_gPalette_145 | 1 << 0x18, offset_gPalette_146 | 1 << 0x18, + offset_gPalette_143 | 1 << 0x18, offset_gPalette_147 | 1 << 0x18, offset_gPalette_148 | 1 << 0x18, + offset_gPalette_149 | 1 << 0x18, offset_gPalette_150 | 1 << 0x18, offset_gPalette_151 | 1 << 0x18, + offset_gPalette_152 | 1 << 0x18, offset_gPalette_153 | 1 << 0x18, offset_gPalette_154 | 1 << 0x18, + offset_gPalette_155 | 1 << 0x18, offset_gPalette_128 | 1 << 0x18, offset_gPalette_156 | 1 << 0x18, + offset_gPalette_168 | 1 << 0x18, offset_gPalette_169 | 1 << 0x18, offset_gPalette_170 | 1 << 0x18, + offset_gPalette_248 | 1 << 0x18, offset_gPalette_249 | 1 << 0x18, offset_gPalette_250 | 1 << 0x18, + offset_gPalette_251 | 1 << 0x18, offset_gPalette_252 | 1 << 0x18, offset_gPalette_253 | 1 << 0x18, + offset_gPalette_254 | 1 << 0x18, offset_gPalette_255 | 1 << 0x18, offset_gPalette_256 | 1 << 0x18, + offset_gPalette_257 | 1 << 0x18, offset_gPalette_258 | 1 << 0x18, offset_gPalette_259 | 1 << 0x18, + offset_gPalette_260 | 1 << 0x18, offset_gPalette_261 | 1 << 0x18, offset_gPalette_262 | 1 << 0x18, + offset_gPalette_263 | 1 << 0x18, offset_gPalette_264 | 1 << 0x18, offset_gPalette_265 | 1 << 0x18, + offset_gPalette_266 | 1 << 0x18, offset_gPalette_267 | 1 << 0x18, offset_gPalette_268 | 1 << 0x18, + offset_gPalette_269 | 1 << 0x18, offset_gPalette_270 | 1 << 0x18, offset_gPalette_271 | 1 << 0x18, + offset_gPalette_3773 | 1 << 0x18, offset_gPalette_92 | 1 << 0x18, offset_gPalette_85 | 1 << 0x18, + offset_gPalette_86 | 1 << 0x18, offset_gPalette_87 | 1 << 0x18, offset_gPalette_3774 | 1 << 0x18, + offset_gPalette_123 | 1 << 0x18, offset_gPalette_2212 | 1 << 0x18, offset_gPalette_2213 | 1 << 0x18, + offset_gPalette_124 | 1 << 0x18, offset_gPalette_42 | 1 << 0x18, offset_gPalette_235 | 1 << 0x18, + offset_gPalette_236 | 1 << 0x18, offset_gPalette_237 | 1 << 0x18, offset_gPalette_238 | 1 << 0x18, + offset_gPalette_108 | 1 << 0x18, offset_gPalette_93 | 1 << 0x18, offset_gPalette_680 | 1 << 0x18, + offset_gPalette_43 | 1 << 0x18, offset_gPalette_44 | 1 << 0x18, offset_gPalette_45 | 1 << 0x18, + offset_gPalette_46 | 1 << 0x18, offset_gPalette_125 | 1 << 0x18, offset_gPalette_284 | 1 << 0x18, + offset_gPalette_283 | 1 << 0x18, offset_gPalette_285 | 1 << 0x18, offset_gPalette_286 | 1 << 0x18, + offset_gPalette_287 | 1 << 0x18, offset_gPalette_288 | 1 << 0x18, offset_gPalette_289 | 1 << 0x18, + offset_gPalette_290 | 1 << 0x18, offset_gPalette_291 | 1 << 0x18, offset_gPalette_292 | 1 << 0x18, + offset_gPalette_293 | 1 << 0x18, offset_gPalette_294 | 1 << 0x18, offset_gPalette_295 | 1 << 0x18, + offset_gPalette_296 | 1 << 0x18, offset_gPalette_297 | 1 << 0x18, offset_gPalette_2214 | 1 << 0x18, + offset_gPalette_224 | 1 << 0x18, offset_gPalette_225 | 1 << 0x18, offset_gPalette_226 | 1 << 0x18, + offset_gPalette_227 | 1 << 0x18, offset_gPalette_228 | 1 << 0x18, offset_gPalette_229 | 1 << 0x18, + offset_gPalette_1261 | 1 << 0x18, offset_gPalette_318 | 1 << 0x18, offset_gPalette_319 | 1 << 0x18, + offset_gPalette_320 | 1 << 0x18, offset_gPalette_2140 | 1 << 0x18, offset_gPalette_2141 | 1 << 0x18, + offset_gPalette_2142 | 1 << 0x18, offset_gPalette_2159 | 1 << 0x18, offset_gPalette_2160 | 1 << 0x18, + offset_gPalette_2161 | 1 << 0x18, offset_gPalette_2178 | 1 << 0x18, offset_gPalette_2179 | 1 << 0x18, + offset_gPalette_2180 | 1 << 0x18, offset_gPalette_2197 | 1 << 0x18, offset_gPalette_2198 | 1 << 0x18, + offset_gPalette_2199 | 1 << 0x18, offset_gPalette_95 | 1 << 0x18, offset_gPalette_18 | 1 << 0x18, + offset_gPalette_19 | 1 << 0x18, offset_gPalette_20 | 1 << 0x18, offset_gPalette_21 | 1 << 0x18, + offset_gPalette_96 | 1 << 0x18, offset_gPalette_97 | 1 << 0x18, offset_gPalette_98 | 1 << 0x18, + offset_gPalette_99 | 1 << 0x18, offset_gPalette_110 | 1 << 0x18, offset_gPalette_208 | 2 << 0x18, + offset_gPalette_210 | 2 << 0x18, offset_gPalette_233 | 1 << 0x18, offset_gPalette_157 | 1 << 0x18, + offset_gPalette_158 | 1 << 0x18, offset_gPalette_159 | 1 << 0x18, offset_gPalette_160 | 1 << 0x18, + offset_gPalette_161 | 1 << 0x18, offset_gPalette_162 | 1 << 0x18, offset_gPalette_163 | 1 << 0x18, + offset_gPalette_164 | 1 << 0x18, offset_gPalette_165 | 1 << 0x18, offset_gPalette_166 | 1 << 0x18, + offset_gPalette_167 | 1 << 0x18, offset_gPalette_171 | 1 << 0x18, offset_gPalette_172 | 1 << 0x18, + offset_gPalette_173 | 1 << 0x18, offset_gPalette_234 | 1 << 0x18, offset_gPalette_111 | 1 << 0x18, + offset_gPalette_113 | 1 << 0x18, offset_gPalette_114 | 1 << 0x18, offset_gPalette_48 | 1 << 0x18, + offset_gPalette_49 | 1 << 0x18, offset_gPalette_50 | 1 << 0x18, offset_gPalette_51 | 1 << 0x18, + offset_gPalette_52 | 1 << 0x18, offset_gPalette_53 | 1 << 0x18, offset_gPalette_54 | 1 << 0x18, + offset_gPalette_322 | 1 << 0x18, offset_gPalette_299 | 1 << 0x18, offset_gPalette_300 | 1 << 0x18, + offset_gPalette_298 | 1 << 0x18, offset_gPalette_301 | 1 << 0x18, offset_gPalette_303 | 1 << 0x18, + offset_gPalette_304 | 1 << 0x18, offset_gPalette_305 | 1 << 0x18, offset_gPalette_306 | 1 << 0x18, + offset_gPalette_307 | 1 << 0x18, offset_gPalette_55 | 1 << 0x18, offset_gPalette_57 | 1 << 0x18, + offset_gPalette_58 | 1 << 0x18, offset_gPalette_59 | 1 << 0x18, offset_gPalette_60 | 1 << 0x18, + offset_gPalette_61 | 1 << 0x18, offset_gPalette_62 | 1 << 0x18, offset_gPalette_63 | 1 << 0x18, + offset_gPalette_64 | 1 << 0x18, offset_gPalette_65 | 1 << 0x18, offset_gPalette_66 | 1 << 0x18, + offset_gPalette_67 | 1 << 0x18, offset_gPalette_68 | 1 << 0x18, offset_gPalette_69 | 1 << 0x18, + offset_gPalette_70 | 1 << 0x18, offset_gPalette_174 | 1 << 0x18, offset_gPalette_212 | 1 << 0x18, + offset_gPalette_213 | 1 << 0x18, offset_gPalette_214 | 1 << 0x18, offset_gPalette_215 | 1 << 0x18, + offset_gPalette_216 | 1 << 0x18, offset_gPalette_72 | 1 << 0x18, offset_gPalette_78 | 1 << 0x18, + offset_gPalette_73 | 1 << 0x18, offset_gPalette_74 | 1 << 0x18, offset_gPalette_75 | 1 << 0x18, + offset_gPalette_76 | 1 << 0x18, offset_gPalette_77 | 1 << 0x18, offset_gPalette_175 | 1 << 0x18, + offset_gPalette_176 | 1 << 0x18, offset_gPalette_177 | 1 << 0x18, offset_gPalette_178 | 1 << 0x18, + offset_gPalette_179 | 1 << 0x18, offset_gPalette_180 | 1 << 0x18, offset_gPalette_181 | 1 << 0x18, + offset_gPalette_182 | 1 << 0x18, offset_gPalette_183 | 1 << 0x18, offset_gPalette_184 | 1 << 0x18, + offset_gPalette_185 | 1 << 0x18, offset_gPalette_186 | 1 << 0x18, offset_gPalette_187 | 1 << 0x18, + offset_gPalette_188 | 1 << 0x18, offset_gPalette_189 | 1 << 0x18, offset_gPalette_190 | 1 << 0x18, + offset_gPalette_191 | 1 << 0x18, offset_gPalette_192 | 1 << 0x18, offset_gPalette_193 | 1 << 0x18, + offset_gPalette_194 | 1 << 0x18, offset_gPalette_195 | 1 << 0x18, offset_gPalette_196 | 1 << 0x18, + offset_gPalette_197 | 1 << 0x18, offset_gPalette_198 | 1 << 0x18, offset_gPalette_199 | 1 << 0x18, + offset_gPalette_200 | 1 << 0x18, offset_gPalette_201 | 1 << 0x18, offset_gPalette_202 | 1 << 0x18, + offset_gPalette_308 | 1 << 0x18, offset_gPalette_309 | 1 << 0x18, offset_gPalette_310 | 1 << 0x18, + offset_gPalette_311 | 1 << 0x18, offset_gPalette_312 | 1 << 0x18, offset_gPalette_313 | 1 << 0x18, + offset_gPalette_282 | 1 << 0x18, offset_gPalette_217 | 1 << 0x18, offset_gPalette_204 | 1 << 0x18, + offset_gPalette_218 | 2 << 0x18, offset_gPalette_220 | 1 << 0x18, offset_gPalette_221 | 1 << 0x18, + offset_gPalette_222 | 1 << 0x18, offset_gPalette_127 | 1 << 0x18, offset_gPalette_115 | 1 << 0x18, + offset_gPalette_302 | 1 << 0x18, offset_gPalette_274 | 1 << 0x18, offset_gPalette_275 | 1 << 0x18, + offset_gPalette_276 | 1 << 0x18, offset_gPalette_277 | 1 << 0x18, offset_gPalette_278 | 1 << 0x18, + offset_gPalette_279 | 1 << 0x18, offset_gPalette_329 | 1 << 0x18, offset_gPalette_331 | 1 << 0x18, + offset_gPalette_332 | 1 << 0x18, offset_gPalette_116 | 1 << 0x18, offset_gPalette_334 | 1 << 0x18, + offset_gPalette_344 | 1 << 0x18, offset_gPalette_345 | 1 << 0x18, offset_gPalette_346 | 1 << 0x18, + offset_gPalette_347 | 1 << 0x18, offset_gPalette_348 | 1 << 0x18, offset_gPalette_349 | 1 << 0x18, + offset_gPalette_350 | 1 << 0x18, offset_gPalette_71 | 1 << 0x18, offset_gPalette_56 | 1 << 0x18, + offset_gPalette_328 | 1 << 0x18, offset_gPalette_232 | 1 << 0x18, offset_gPalette_25 | 1 << 0x18, + offset_gPalette_26 | 1 << 0x18, offset_gPalette_117 | 1 << 0x18, offset_gPalette_27 | 1 << 0x18, + offset_gPalette_28 | 1 << 0x18, offset_gPalette_29 | 1 << 0x18, offset_gPalette_30 | 1 << 0x18, + offset_gPalette_31 | 1 << 0x18, offset_gPalette_32 | 1 << 0x18, offset_gPalette_280 | 1 << 0x18, + offset_gPalette_281 | 1 << 0x18, offset_gPalette_333 | 1 << 0x18, offset_gPalette_314 | 1 << 0x18, + offset_gPalette_315 | 1 << 0x18, offset_gPalette_316 | 1 << 0x18, offset_gPalette_317 | 1 << 0x18, + offset_gPalette_330 | 1 << 0x18, offset_gPalette_335 | 1 << 0x18, offset_gPalette_336 | 1 << 0x18, + offset_gPalette_337 | 1 << 0x18, offset_gPalette_338 | 1 << 0x18, offset_gPalette_339 | 1 << 0x18, + offset_gPalette_340 | 1 << 0x18, offset_gPalette_341 | 1 << 0x18, offset_gPalette_342 | 1 << 0x18, + offset_gPalette_343 | 1 << 0x18, offset_gPalette_82 | 1 << 0x18, offset_gPalette_223 | 1 << 0x18, + offset_gPalette_240 | 1 << 0x18, offset_gPalette_241 | 1 << 0x18, offset_gPalette_242 | 1 << 0x18, + offset_gPalette_243 | 1 << 0x18, offset_gPalette_244 | 1 << 0x18, offset_gPalette_245 | 1 << 0x18, + offset_gPalette_246 | 1 << 0x18, offset_gPalette_247 | 1 << 0x18, offset_gPalette_272 | 1 << 0x18, + offset_gPalette_273 | 1 << 0x18, offset_gPalette_352 | 1 << 0x18, offset_gPalette_353 | 1 << 0x18, + offset_gPalette_351 | 1 << 0x18, offset_gPalette_126 | 1 << 0x18, offset_gPalette_327 | 1 << 0x18, + offset_gPalette_203 | 1 << 0x18, offset_gPalette_3430 | 1 << 0x18, offset_gPalette_3431 | 1 << 0x18, + offset_gPalette_3432 | 2 << 0x18, offset_gPalette_3434 | 1 << 0x18, offset_gPalette_3435 | 1 << 0x18, + offset_gPalette_3436 | 1 << 0x18, offset_gPalette_9 | 1 << 0x18, offset_gPalette_33 | 1 << 0x18, + offset_gPalette_34 | 1 << 0x18, offset_gPalette_35 | 1 << 0x18, offset_gPalette_36 | 1 << 0x18, + offset_gPalette_37 | 1 << 0x18, offset_gPalette_38 | 1 << 0x18, offset_gPalette_39 | 1 << 0x18, + offset_gPalette_40 | 1 << 0x18, offset_gPalette_41 | 1 << 0x18, offset_gPalette_83 | 1 << 0x18, + offset_gPalette_119 | 1 << 0x18, offset_gPalette_120 | 1 << 0x18, offset_gPalette_121 | 1 << 0x18, + offset_gPalette_81 | 1 << 0x18, offset_gPalette_84 | 1 << 0x18, offset_gPalette_88 | 1 << 0x18, + offset_gPalette_230 | 1 << 0x18, +#ifdef EU + offset_gPalette_2257 | 1 << 0x18, offset_gPalette_2258 | 1 << 0x18, +#else + offset_gPalette_2259 | 1 << 0x18, offset_gPalette_2260 | 1 << 0x18, +#endif + offset_gPalette_10 | 1 << 0x18, offset_gPalette_112 | 1 << 0x18, offset_gPalette_122 | 1 << 0x18, + offset_gPalette_13 | 1 << 0x18, +}; @@ -194,19 +194,19 @@ void sub_080A3198(u32 param_1, u32 param_2) { { gUnk_0203510E, BG_TILE_ADDR(0x1a0), gTextGfxBuffer, 0, 0x80, 0xd0, 1, 0, 0, 1, 9, 0, 0, 1, 1 }, }; static const u16 gUnk_08127CC8[4] = { - 0x71c, - 0x720, - 0x721, + TEXT_INDEX(TEXT_WINDCRESTS, 0x1c), + TEXT_INDEX(TEXT_WINDCRESTS, 0x20), + TEXT_INDEX(TEXT_WINDCRESTS, 0x21), 0x0, }; - u16 r4 = gUnk_08127CC8[param_1]; + u16 textIndex = gUnk_08127CC8[param_1]; - if (gChooseFileState.unk_0x12 != r4) { - gChooseFileState.unk_0x12 = r4; + if (gChooseFileState.unk_0x12 != textIndex) { + gChooseFileState.unk_0x12 = textIndex; MemClear(gUnk_08127C98[0].dest - 0xf, 0x180); - if (r4 != 0) { - sub_0805F46C(r4, gUnk_08127C98); + if (textIndex != 0) { + ShowTextBox(textIndex, gUnk_08127C98); } gScreen.bg0.updated = 1; diff --git a/src/enemy.c b/src/enemy.c index 60a0653c..01120f92 100644 --- a/src/enemy.c +++ b/src/enemy.c @@ -114,7 +114,7 @@ const EnemyDefinition gEnemyDefinitions[] = { { 145, 2, { &gHitbox_13 }, 483, { 0, 1, 1, 1 }, 255, 256, 102, 139 }, // TODO sprite index too high #endif MULTI_FORM(gEnemyDefinition_30), - { 236, 1, { &gHitbox_19 }, SPRITE_CROW, { 1, 0, 1, 1 }, 2, 320, 41, 15 }, + { 236, 1, { (Hitbox*)&gHitbox_19 }, SPRITE_CROW, { 1, 0, 1, 1 }, 2, 320, 41, 15 }, MULTI_FORM(gEnemyDefinition_32), { 253, 112, { &gHitbox_0 }, SPRITE_BOMBAROSSA, { 1, 1, 1, 1 }, 255, 256, 1, 139 }, MULTI_FORM(gEnemyDefinition_34), @@ -134,7 +134,7 @@ const EnemyDefinition gEnemyDefinitions[] = { MULTI_FORM(gEnemyDefinition_42), { 366, 0, { &gHitbox_18 }, SPRITE_FLYINGSKULL, { 0, 1, 1, 0 }, 255, 640, 110, 132 }, MULTI_FORM(gEnemyDefinition_44), - { 236, 0, { &gHitbox_19 }, SPRITE_CROW, { 1, 0, 1, 1 }, 4, 320, 87, 15 }, + { 236, 0, { (Hitbox*)&gHitbox_19 }, SPRITE_CROW, { 1, 0, 1, 1 }, 4, 320, 87, 15 }, MULTI_FORM(gEnemyDefinition_46), { 16400, 299, { &gHitbox_0 }, SPRITE_LAKITU, { 0, 1, 0, 1 }, 6, 128, 67, 143 }, { 16400, 0, { &gHitbox_0 }, SPRITE_LAKITUCLOUDPROJECTILE, { 1, 1, 1, 2 }, 255, 0, 166, 143 }, @@ -157,15 +157,15 @@ const EnemyDefinition gEnemyDefinitions[] = { MULTI_FORM(gEnemyDefinition_0), MULTI_FORM(gEnemyDefinition_56), MULTI_FORM(gEnemyDefinition_57), - { 444, 0, { &gHitbox_25 }, SPRITE_FIREBALLGUY, { 1, 1, 1, 1 }, 4, 64, 25, 139 }, - { 444, 0, { &gHitbox_26 }, SPRITE_FIREBALLGUY, { 1, 1, 1, 0 }, 1, 64, 25, 139 }, + { 444, 0, { (Hitbox*)&gHitbox_25 }, SPRITE_FIREBALLGUY, { 1, 1, 1, 1 }, 4, 64, 25, 139 }, + { 444, 0, { (Hitbox*)&gHitbox_26 }, SPRITE_FIREBALLGUY, { 1, 1, 1, 0 }, 1, 64, 25, 139 }, MULTI_FORM(gEnemyDefinition_5A), { 114, 110, { &gHitbox_0 }, SPRITE_BUSINESSSCRUB, { 0, 0, 1, 1 }, 255, 0, 1, 139 }, { 0, 0, { &gHitbox_0 }, SPRITE_0, { 0, 0, 0, 1 }, 24, 256, 0, 139 }, - { 16448, 338, { &gHitbox_28 }, SPRITE_GYORGMALE, { 0, 0, 1, 1 }, 12, 256, 27, 139 }, + { 16448, 338, { (Hitbox*)&gHitbox_28 }, SPRITE_GYORGMALE, { 0, 0, 1, 1 }, 12, 256, 27, 139 }, { 485, 352, { &gHitbox_0 }, SPRITE_CURTAIN, { 0, 1, 1, 1 }, 255, 256, 154, 139 }, - { 418, 320, { &gHitbox_20 }, SPRITE_WRATHEYE, { 1, 0, 1, 0 }, 255, 256, 57, 139 }, - { 498, 0, { &gHitbox_20 }, SPRITE_GYORGCHILD, { 0, 0, 1, 1 }, 3, 256, 32, 15 }, + { 418, 320, { (Hitbox*)&gHitbox_20 }, SPRITE_WRATHEYE, { 1, 0, 1, 0 }, 255, 256, 57, 139 }, + { 498, 0, { (Hitbox*)&gHitbox_20 }, SPRITE_GYORGCHILD, { 0, 0, 1, 1 }, 3, 256, 32, 15 }, #ifdef EU { 499, 377, { &gHitbox_22 }, SPRITE_GYORGFEMALEEYE, { 0, 0, 1, 1 }, 255, 256, 30, 139 }, #else @@ -173,7 +173,7 @@ const EnemyDefinition gEnemyDefinitions[] = { #endif { 500, 376, { &gHitbox_0 }, SPRITE_ENEMY62, { 0, 0, 1, 1 }, 255, 256, 30, 139 }, { 504, 372, { &gHitbox_0 }, SPRITE_GYORGFEMALEMOUTH, { 0, 0, 1, 1 }, 255, 256, 136, 139 }, - { 16448, 338, { &gHitbox_28 }, SPRITE_GYORGMALE, { 0, 0, 1, 1 }, 36, 256, 0, 139 }, + { 16448, 338, { (Hitbox*)&gHitbox_28 }, SPRITE_GYORGMALE, { 0, 0, 1, 1 }, 36, 256, 0, 139 }, { 0, 0, { &gHitbox_0 }, SPRITE_0, { 0, 0, 0, 1 }, 255, 256, 0, 139 }, }; @@ -228,9 +228,9 @@ const EnemyDefinition gEnemyDefinition_10[] = { { 32, 0, &gUnk_080FD21C, SPRITE_SLUGGULA_2, { 0, 0, 1, 0 }, 3, 0, 0, 139 }, }; const EnemyDefinition gEnemyDefinition_11[] = { - { 34, 38, &gUnk_080FD22C, SPRITE_PESTO, { 3, 1, 1, 1 }, 4, 64, 119, 15 }, - { 34, 39, &gUnk_080FD22C, SPRITE_PESTO, { 3, 1, 1, 1 }, 4, 64, 119, 15 }, - { 34, 37, &gUnk_080FD22C, SPRITE_PESTO, { 3, 1, 1, 1 }, 4, 64, 119, 15 }, + { 34, 38, (const Hitbox*)&gUnk_080FD22C, SPRITE_PESTO, { 3, 1, 1, 1 }, 4, 64, 119, 15 }, + { 34, 39, (const Hitbox*)&gUnk_080FD22C, SPRITE_PESTO, { 3, 1, 1, 1 }, 4, 64, 119, 15 }, + { 34, 37, (const Hitbox*)&gUnk_080FD22C, SPRITE_PESTO, { 3, 1, 1, 1 }, 4, 64, 119, 15 }, }; const EnemyDefinition gEnemyDefinition_12[] = { { 35, 40, &gHitbox_0, SPRITE_PUFFSTOOL, { 1, 1, 1, 0 }, 1, 64, 130, 15 }, @@ -370,11 +370,11 @@ const EnemyDefinition gEnemyDefinition_51[] = { { 417, 320, &gHitbox_0, SPRITE_VAATIWRATH_2, { 0, 0, 1, 1 }, 255, 256, 0, 139 }, }; const EnemyDefinition gEnemyDefinition_52[] = { - { 16400, 320, &gUnk_080FD538, SPRITE_VAATIARM, { 1, 0, 1, 1 }, 255, 256, 57, 139 }, - { 419, 320, &gUnk_080FD538, SPRITE_VAATIARM_1, { 0, 0, 1, 1 }, 255, 256, 57, 139 }, - { 419, 320, &gUnk_080FD538, SPRITE_VAATIARM_1, { 1, 0, 1, 1 }, 255, 256, 57, 139 }, - { 419, 320, &gUnk_080FD538, SPRITE_VAATIARM_1, { 1, 0, 1, 1 }, 255, 256, 57, 139 }, - { 419, 320, &gUnk_080FD538, SPRITE_VAATIARM_1, { 1, 0, 1, 1 }, 255, 256, 57, 139 }, + { 16400, 320, (Hitbox*)&gUnk_080FD538, SPRITE_VAATIARM, { 1, 0, 1, 1 }, 255, 256, 57, 139 }, + { 419, 320, (Hitbox*)&gUnk_080FD538, SPRITE_VAATIARM_1, { 0, 0, 1, 1 }, 255, 256, 57, 139 }, + { 419, 320, (Hitbox*)&gUnk_080FD538, SPRITE_VAATIARM_1, { 1, 0, 1, 1 }, 255, 256, 57, 139 }, + { 419, 320, (Hitbox*)&gUnk_080FD538, SPRITE_VAATIARM_1, { 1, 0, 1, 1 }, 255, 256, 57, 139 }, + { 419, 320, (Hitbox*)&gUnk_080FD538, SPRITE_VAATIARM_1, { 1, 0, 1, 1 }, 255, 256, 57, 139 }, }; const EnemyDefinition gEnemyDefinition_56[] = { { 422, 113, &gUnk_080FD488, SPRITE_SLIME, { 3, 1, 1, 1 }, 2, 64, 25, 139 }, diff --git a/src/enemy/chuchuBoss.c b/src/enemy/chuchuBoss.c index 2726a05c..af373d39 100644 --- a/src/enemy/chuchuBoss.c +++ b/src/enemy/chuchuBoss.c @@ -559,7 +559,7 @@ void sub_080262A8(ChuchuBossEntity* this) { this->unk_84->unk_03 = 3; gPlayerEntity.animationState = 0; gRoomControls.camera_target = super; - gRoomControls.unk5 = 1; + gRoomControls.scrollSpeed = 1; SetTile(0x4022, 0x2c8, 1); } } @@ -583,7 +583,7 @@ void sub_08026358(ChuchuBossEntity* this) { this->unk_84->unk_03++; gPlayerEntity.animationState = 0; gRoomControls.camera_target = super; - gRoomControls.unk5 = 1; + gRoomControls.scrollSpeed = 1; } else if (bVar1 < 0x61) { if (bVar1 < 0x5c) { gPlayerEntity.animationState = 4; @@ -661,7 +661,7 @@ void sub_0802650C(ChuchuBossEntity* this) { void sub_0802653C(ChuchuBossEntity* this) { if (gRoomControls.reload_flags == 0) { - gRoomControls.unk5 = 4; + gRoomControls.scrollSpeed = 4; sub_08027B98(this, 0x90, 0xb0, 4, 0xff); sub_08027548(this, 0); InitAnimationForceUpdate(super->child, 0); diff --git a/src/enemy/octorokBoss.c b/src/enemy/octorokBoss.c index 2e3283e0..8b248fa4 100644 --- a/src/enemy/octorokBoss.c +++ b/src/enemy/octorokBoss.c @@ -361,7 +361,7 @@ void OctorokBoss_Intro_SubAction2(OctorokBossEntity* this) { this->timer = 60; gPlayerEntity.spriteSettings.draw |= 1; gRoomControls.camera_target = &gPlayerEntity; - gRoomControls.unk5 = 1; + gRoomControls.scrollSpeed = 1; } } @@ -397,7 +397,7 @@ void OctorokBoss_Intro_SubAction5(OctorokBossEntity* this) { // Play boss theme, enable control and switch to main action super->action = ACTION1; super->subAction = 0; - gRoomControls.unk5 = gPlayerEntity.animationState; + gRoomControls.scrollSpeed = gPlayerEntity.animationState; OctorokBoss_SetAttackTimer(this); gPauseMenuOptions.disabled = 0; SoundReq(BGM_BOSS_THEME); diff --git a/src/enemyUtils.c b/src/enemyUtils.c index 46b9c17c..d484865a 100644 --- a/src/enemyUtils.c +++ b/src/enemyUtils.c @@ -1,11 +1,13 @@ #define NENT_DEPRECATED -#include "entity.h" +#include "enemyUtils.h" + #include "definitions.h" +#include "entity.h" #include "functions.h" #include "object.h" -#include "save.h" -#include "projectile.h" #include "object/deathFx.h" +#include "projectile.h" +#include "save.h" extern void sub_08049CF4(Entity*); @@ -13,8 +15,24 @@ extern EnemyDefinition gEnemyDefinitions[]; const EnemyDefinition* GetEnemyDefinition(Entity* entity); bool32 LoadEnemySprite(Entity* entity, const EnemyDefinition* definition); -extern const u16 gUnk_080D3E74[]; -extern const u8 gUnk_080D3D94[]; + +const struct_080D3D94 gUnk_080D3D94[] = { + { 8, 8 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, + { 64, 64 }, { 64, 64 }, { 64, 64 }, { 4, 4 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 16, 16 }, + { 64, 64 }, { 64, 64 }, { 12, 12 }, { 16, 16 }, { 8, 8 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, + { 10, 10 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 15, 9 }, + { 12, 12 }, { 16, 16 }, { 24, 24 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, + { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 60, 60 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, + { 24, 24 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, + { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, + { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, + { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 8, 8 }, { 8, 8 }, { 8, 8 }, { 16, 16 }, { 16, 16 }, + { 16, 16 }, { 8, 8 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, + { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, + { 64, 64 }, { 64, 64 }, { 64, 64 }, { 64, 64 }, +}; + +const u16 gUnk_080D3E74[] = { 2373, 1105, 2324, 21568, 4177, 16656, 1365, 21760, 8209, 0, 20480, 5, 0, 0 }; const EnemyDefinition* GetEnemyDefinition(Entity* entity) { const EnemyDefinition* definition = &gEnemyDefinitions[entity->id]; @@ -96,23 +114,23 @@ bool32 LoadEnemySprite(Entity* entity, const EnemyDefinition* definition) { void sub_0804A720(GenericEntity* this) { int iVar2; - const u8* pbVar3; + const struct_080D3D94* pbVar3; GenericEntityData* ptr; if ((this->field_0x6c.HALF.HI & 4) != 0) { return; } - pbVar3 = &gUnk_080D3D94[super->id * 2]; + pbVar3 = &gUnk_080D3D94[super->id]; ptr = (GenericEntityData*)&this->field_0x68; if (ptr->field_0x7c.BYTES.byte2 == 0) { - this->field_0x6e.HALF.LO = pbVar3[0]; + this->field_0x6e.HALF.LO = pbVar3->unk_0; } else { this->field_0x6e.HALF.LO = ptr->field_0x7c.BYTES.byte2; } if (ptr->field_0x7c.BYTES.byte3 == 0) { - this->field_0x6e.HALF.HI = pbVar3[1]; + this->field_0x6e.HALF.HI = pbVar3->unk_1; } else { this->field_0x6e.HALF.HI = ptr->field_0x7c.BYTES.byte3; } diff --git a/src/enterPortalSubtask.c b/src/enterPortalSubtask.c index 84091a0c..379ee2e7 100644 --- a/src/enterPortalSubtask.c +++ b/src/enterPortalSubtask.c @@ -1,31 +1,121 @@ -#include "global.h" -#include "entity.h" +/** + * @file enterPortalSubtask.c + * @ingroup Subtasks + * + * @brief Enter Portal Subtask + */ +#include "enterPortalSubtask.h" + #include "area.h" -#include "main.h" #include "common.h" -#include "screen.h" -#include "object.h" +#include "entity.h" +#include "fileselect.h" #include "functions.h" #include "game.h" -#include "fileselect.h" +#include "main.h" +#include "object.h" +#include "screen.h" +#include "subtask.h" extern void ClearArmosData(void); extern void sub_080300C4(void); -extern u16 gUnk_020178E0[]; extern u8 gUnk_02017700[]; -extern void (*const gUnk_080D4120[])(void); -extern void (*const gUnk_080D412C[])(void); -extern const u16 gUnk_080D4140[]; -extern const u8 gUnk_080D4138[]; -extern const EntityData* gUnk_080D4110[]; - bool32 sub_0804AD18(void); void sub_0804AD6C(RoomControls*); -void sub_080A71F4(const ScreenTransitionData*); bool32 sub_0804ACA8(void); +// Entities spawned inside the portal transition cutscene. +const EntityData gUnk_080D3E90[] = { + { OBJECT, 15, PORTAL_FALLING_PLAYER, 0, 0, 132, 156, 0 }, + { OBJECT, 15, PORTAL_MUSHROOM_STALKS, 0, 6, 120, 208, 0 }, + { OBJECT, 15, PORTAL_MUSHROOM_STALKS, 1, 1, 132, 160, 0 }, + { OBJECT, 15, PORTAL_MUSHROOM_STALKS, 2, 2, 96, 192, 0 }, + { OBJECT, 15, PORTAL_MUSHROOM_STALKS, 3, 3, 128, 208, 0 }, + { OBJECT, 15, PORTAL_MUSHROOM_STALKS, 5, 0, 120, 104, 0 }, + { OBJECT, 15, PORTAL_MUSHROOM_STALKS, 6, 1, 216, 200, 0 }, + { OBJECT, 15, PORTAL_MUSHROOM_STALKS, 7, 2, 120, 292, 0 }, + { OBJECT, 15, PORTAL_MUSHROOM_STALKS, 8, 3, 17, 200, 0 }, + { 0xff, 0, 0, 0, 0, 0, 0, 0 }, +}; +const EntityData gUnk_080D3F30[] = { + { OBJECT, 15, PORTAL_FALLING_PLAYER, 0, 0, 132, 156, 0 }, // + { OBJECT, 15, MACRO_CRYSTAL, 0, 6, 120, 200, 0 }, + { OBJECT, 15, MACRO_CRYSTAL, 1, 3, 132, 160, 0 }, + { OBJECT, 15, MACRO_CRYSTAL, 2, 2, 96, 192, 0 }, + { OBJECT, 15, MACRO_CRYSTAL, 3, 1, 128, 208, 0 }, + { OBJECT, 15, MACRO_CRYSTAL, 5, 0, 120, 104, 0 }, + { OBJECT, 15, MACRO_CRYSTAL, 6, 1, 216, 200, 0 }, + { OBJECT, 15, MACRO_CRYSTAL, 7, 2, 120, 292, 0 }, + { OBJECT, 15, MACRO_CRYSTAL, 8, 3, 17, 200, 0 }, + { 0xff, 0, 0, 0, 0, 0, 0, 0 }, +}; +const EntityData gUnk_080D3FD0[] = { + { OBJECT, 15, PORTAL_FALLING_PLAYER, 0, 0, 132, 156, 0 }, + { OBJECT, 15, MACRO_LEAF, 0, 6, 120, 208, 0 }, + { OBJECT, 15, MACRO_LEAF, 1, 1, 132, 160, 0 }, + { OBJECT, 15, MACRO_LEAF, 2, 2, 96, 192, 0 }, + { OBJECT, 15, MACRO_LEAF, 3, 3, 128, 208, 0 }, + { OBJECT, 15, MACRO_LEAF, 5, 0, 120, 104, 0 }, + { OBJECT, 15, MACRO_LEAF, 6, 1, 216, 200, 0 }, + { OBJECT, 15, MACRO_LEAF, 7, 2, 120, 300, 0 }, + { OBJECT, 15, MACRO_LEAF, 8, 3, 17, 200, 0 }, + { 0xff, 0, 0, 0, 0, 0, 0, 0 }, +}; +const EntityData gUnk_080D4070[] = { + { OBJECT, 15, PORTAL_FALLING_PLAYER, 0, 0, 132, 156, 0 }, + { OBJECT, 15, MACRO_LEAF, 9, 6, 120, 208, 0 }, + { OBJECT, 15, MACRO_LEAF, 10, 1, 132, 160, 0 }, + { OBJECT, 15, MACRO_LEAF, 11, 2, 96, 192, 0 }, + { OBJECT, 15, MACRO_LEAF, 12, 3, 128, 208, 0 }, + { OBJECT, 15, MACRO_LEAF, 14, 0, 120, 104, 0 }, + { OBJECT, 15, MACRO_LEAF, 15, 1, 216, 200, 0 }, + { OBJECT, 15, MACRO_LEAF, 16, 2, 120, 300, 0 }, + { OBJECT, 15, MACRO_LEAF, 17, 3, 17, 200, 0 }, + { 0xff, 0, 0, 0, 0, 0, 0, 0 }, +}; + +const EntityData* const gUnk_080D4110[] = { + gUnk_080D3E90, + gUnk_080D3F30, + gUnk_080D3FD0, + gUnk_080D4070, +}; + +void sub_0804AAD4(void); +void sub_0804AB04(void); +void sub_0804AB24(void); +void Subtask_PortalCutscene_0(void); +void Subtask_PortalCutscene_1(void); +void Subtask_PortalCutscene_2(void); + +void (*const gUnk_080D4120[])(void) = { + sub_0804AAD4, + sub_0804AB04, + sub_0804AB24, +}; +void (*const Subtask_PortalCutscene_Functions[])(void) = { + Subtask_PortalCutscene_0, + Subtask_PortalCutscene_1, + Subtask_PortalCutscene_2, +}; + +const struct_080D4138 gUnk_080D4138[] = { + { 95, 39 }, + { 96, 40 }, + { 97, 41 }, + { 98, 42 }, +}; + +// x, y values. But they cannot be put in a struct matching? +const s16 gUnk_080D4140[] = { + 0, -22, // + 22, 0, // + 0, 22, // + -22, 0, +}; + bool32 CheckInitPortal(void) { if (gArea.portal_in_use) { gMain.substate = GAMEMAIN_MINISHPORTAL; @@ -73,10 +163,10 @@ void sub_0804AB24(void) { } void Subtask_PortalCutscene(void) { - gUnk_080D412C[gArea.filler3[0]](); + Subtask_PortalCutscene_Functions[gArea.filler3[0]](); } -void sub_0804AB70(void) { - const u8* ptr; +void Subtask_PortalCutscene_0(void) { + const struct_080D4138* ptr; RoomControls* controls; u32 portalId; @@ -92,19 +182,19 @@ void sub_0804AB70(void) { if ((portalId == 2) && (gUI.roomControls.area != 2)) { portalId = 3; } - ptr = &gUnk_080D4138[portalId * 2]; - LoadPaletteGroup(ptr[0]); - LoadGfxGroup(ptr[1]); + ptr = &gUnk_080D4138[portalId]; + LoadPaletteGroup(ptr->paletteGroup); + LoadGfxGroup(ptr->gfxGroup); MemCopy(&gUnk_02017700, gUnk_02017700 + 0x240, 0x20); gUsedPalettes |= 0x200000; EraseAllEntities(); - LoadRoomEntityList((EntityData*)gUnk_080D4110[portalId]); + LoadRoomEntityList(gUnk_080D4110[portalId]); ResetSystemPriority(); gArea.filler3[0]++; SetFade(FADE_INSTANT, 8); } -void sub_0804AC1C(void) { +void Subtask_PortalCutscene_1(void) { s32 tmp; UpdateEntities(); @@ -139,7 +229,7 @@ bool32 sub_0804ACA8(void) { } } -void sub_0804ACC8(void) { +void Subtask_PortalCutscene_2(void) { if (gFadeControl.active == 0) { SetGlobalFlag(gArea.portal_type + ENTRANCE_0); sub_0804AD6C(&gUI.roomControls); @@ -192,3 +282,5 @@ void sub_0804AD6C(RoomControls* controls) { ClearArmosData(); sub_080300C4(); } + +// TODO end of portal cutscene subtask? diff --git a/src/entity.c b/src/entity.c index 5972636e..18f11f75 100644 --- a/src/entity.c +++ b/src/entity.c @@ -6,8 +6,6 @@ #include "npc.h" #include "manager/diggingCaveEntranceManager.h" -extern u8 gUnk_081091F8[]; -extern u8 gUnk_081091EE[]; extern u8 gUpdateVisibleTiles; extern Manager gUnk_02033290; void UpdatePlayerInput(void); @@ -36,6 +34,11 @@ typedef struct { } UpdateContext; extern UpdateContext gUpdateContext; +// List by entity kind. +const u8 gUnk_081091E4[] = { + 8, 1, 8, 4, 5, 8, 6, 7, 2, 6, +}; + void sub_0805E248(void) { s32 v0; @@ -64,9 +67,16 @@ void sub_0805E248(void) { gUpdateVisibleTiles = 0; } +const u8 gUnk_081091EE[] = { + 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, +}; +const u8 gUnk_081091F8[] = { + 0, 3, 0, 3, 3, 0, 3, 3, 3, 3, +}; + void SetDefaultPriorityForKind(Entity* e) { u8 r3 = gRoomTransition.entity_update_type; - u8* array = gUnk_081091F8; + const u8* array = gUnk_081091F8; if (r3 != 2) { array = gUnk_081091EE; @@ -172,12 +172,17 @@ static u32 sub_080501C0(FadeControl* ctl) { return !!((s16)ctl->sustain ^ (s16)ctl->progress); } +const u16 gMosaicSizes[] = { + 0, 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7777, + 0x8888, 0x9999, 0xaaaa, 0xbbbb, 0xcccc, 0xdddd, 0xeeee, 0xffff, +}; + static u32 sub_08050230(FadeControl* ctl) { u32 type = ctl->type; u32 idx = ((s16)ctl->progress >> 4) & 0xF; if (type & 1) idx = 0xF - idx; - gScreen.controls.mosaicSize = gUnk_080FC3C4[idx]; + gScreen.controls.mosaicSize = gMosaicSizes[idx]; if (ctl->progress != 0) return 1; diff --git a/src/fileselect.c b/src/fileselect.c index c3c1ba98..04bbfb89 100644 --- a/src/fileselect.c +++ b/src/fileselect.c @@ -4,12 +4,14 @@ * * @brief File select task */ +#include "fileselect.h" #include "common.h" -#include "fileselect.h" +#include "figurineMenu.h" #include "functions.h" #include "game.h" #include "item.h" +#include "kinstone.h" #include "main.h" #include "menu.h" #include "message.h" @@ -44,6 +46,190 @@ typedef enum { RESULT_ASCII = 1, } CharResult; +const struct_080FC3E4 gUnk_080FC3E4[] = { + { 0, 0, 128, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, +#ifdef EU + { 0, 0, 0, 1 }, +#else + { 0, 0, 2, 1 }, +#endif + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, KINSTONE_2C, UNK_6_10, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 4, 1 }, + { 0, 0, 7, 1 }, + { 0, 0, 3, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 4, 1 }, +#ifdef EU + { 0, 0, 2, 1 }, +#else + { 0, 0, 3, 1 }, +#endif + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, +#if defined(EU) || defined(JP) + { 0, 0x12, UNK_6_40, 1 }, +#else + { 0, 5, UNK_6_20, 1 }, +#endif + { 0, 0, 0, 1 }, + { FLAG_BANK_4, YAMADOUKUTU_0E_SENNIN, UNK_6_40, 1 }, + { 0, 0, 3, 1 }, + { 0, 0, 5, 1 }, + { 0, 0, 5, 1 }, + { 0, 0, 3, 1 }, + { 0, 0, 1, 1 }, + { 0, 0, 3, 1 }, + { 0, 0, 5, 1 }, + { 0, 0, 3, 1 }, + { 0, 0, 2, 1 }, + { 0, 0, 2, 1 }, + { 0, 0, 2, 1 }, + { 0, 0, UNK_6_20, 1 }, + { 0, KINSTONE_30, UNK_6_10, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 4, 1 }, + { 0, 0, 4, 1 }, + { 0, 0, 3, 1 }, + { 0, 0, 3, 1 }, + { FLAG_BANK_4, GORON_DOUKUTU_APPEAR, UNK_6_40, 1 }, + { 0, 0, 3, 1 }, + { 0, 0, 3, 0 }, + { 0, 0, 4, 0 }, + { 0, 0, 7, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 2, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 4, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 4, 0 }, + { 0, 0, 3, 0 }, + { 0, 0, 3, 0 }, + { 0, 0, 6, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 7, 0 }, +#ifdef EU + { 0, 0, 0, 0 }, +#else + { 0, 0, 2, 0 }, +#endif + { 0, KINSTONE_33, UNK_6_10, 1 }, + { 0, 1, UNK_6_20, 0 }, + { 0, 0, 0, 2 }, + { 0, 0, 4, 2 }, + { 0, 0, 4, 2 }, + { 0, 0, 0, 2 }, + { 0, 0, 3, 2 }, + { 0, 0, 0, 2 }, + { 0, 0, 3, 2 }, + { 0, 0, 0, 2 }, + { 0, 0, 0, 2 }, + { 0, 0, 5, 2 }, + { 0, 0, 7, 2 }, + { 0, 0, 0, 2 }, + { 0, 0, 3, 2 }, + { 0, 0, 3, 3 }, + { 0, 0, 7, 3 }, + { 0, 0, 0, 2 }, +#ifdef EU + { 0, 0, 3, 2 }, + { 0, 0, 6, 2 }, +#else + { 0, 0, 6, 2 }, + { 0, 0, 3, 2 }, +#endif + { 0, 0, 5, 2 }, + { 0, 0, 0, 2 }, + { 0, 0, 0, 2 }, + { 0, 0, 4, 2 }, + { 0, 0, 3, 2 }, + { 0, 0, 0, 2 }, + { 0, 0, 0, 2 }, + { 0, 0, 7, 2 }, + { 0, 0, 3, 2 }, + { 0, 0, 3, 2 }, + { 0, 0, 3, 2 }, + { 0, 0, 0, 2 }, + { 0, 0, 7, 3 }, + { 0, 0, 0, 2 }, + { 0, 0, 2, 2 }, + { 0, 0, 2, 2 }, + { 0, 0, 6, 2 }, + { 0, 0, 4, 2 }, + { 0, 0, 0, 2 }, + { 0, 0, 0, 2 }, + { 0, 0, 3, 2 }, + { 0, 0, 7, 2 }, + { 0, 0, 7, 2 }, + { 0, 0, 6, 2 }, + { 0, 0, 0, 2 }, + { 0, 2, UNK_6_20, 3 }, + { 0, 3, UNK_6_20, 3 }, + { 0, 4, UNK_6_20, 3 }, + { 0, 0, 2, 2 }, + { 0, 0, 6, 2 }, + { 0, 0, 3, 2 }, + { 0, 0, 0, 2 }, + { 0, 0, 0, 2 }, + { 0, 0, 0, 2 }, + { 0, 0, 0, 2 }, + { 0, 0, 3, 2 }, + { 0, 0, 0, 3 }, + { 0, 0, 1, 2 }, + { 0, 0, 4, 3 }, + { 0, 0, 7, 3 }, + { 0, 0, 6, 1 }, + { 0, 0, 0, 3 }, + { 0, 0, 1, 3 }, + { 0, 0, 3, 3 }, + { FLAG_BANK_8, LV4_10_BOSSDIE, UNK_6_8, 3 }, + { 0, 0, 9, 0 }, + { 0, 0, 9, 1 }, + { 0, 0, 9, 3 }, + { 0, 0, 9, 3 }, + { 0, 0, 9, 3 }, + { 0, 0, 9, 3 }, + { 0, 0xffff, 0, 1 }, + { 0, 0xffff, 0, 1 }, + { 0, 0xffff, 0, 1 }, +}; + +extern u16 gUnk_02034E4E[]; +const Font gUnk_080FC844 = { + gUnk_02034E4E, BG_TILE_ADDR(0x198), gTextGfxBuffer, 0, 96, 224, 1, 1, 0, 1, 3, 0, 0, 1, 0 +}; + +const u16 gUnk_080FC85C[][3] = { + { 0, 3, SFX_MENU_ERROR }, + { 0, 4, SFX_MENU_ERROR }, + { 1, 5, 0 }, + { 0, 6, SFX_MENU_ERROR }, + { 1, 7, 0 }, + { 1, 8, 0 }, + { 0, 9, SFX_MENU_ERROR }, + { 1, 10, 0 }, + { 1, 11, 0 }, + { 0, 12, SFX_MENU_ERROR }, + { 1, 13, 0 }, + { 0, 14, 0 }, +}; + static void HandleFileScreenEnter(void); static void HandleFileScreenActive(void); static void HandleFileScreenExit(void); @@ -101,9 +287,9 @@ extern void (*const gUnk_080FC960[])(void); extern void (*const gUnk_080FC9B0[])(void); extern void (*const gUnk_080FC9BC[])(void); extern void (*const gUnk_080FC9C8[])(void); -extern u8 gUnk_080FC970[]; -extern u8 gUnk_080FC980[]; -extern u8 gUnk_080FC9A0[]; +extern const u8 gUnk_080FC970[]; +extern const u8 gUnk_080FC980[]; +extern const u8 gUnk_080FC9A0[]; static void ResetEmptyOrDeletedSaveFile(u32); static void sub_0805066C(void); @@ -111,6 +297,10 @@ static void HideButtonR(void); static void ShowButtonR(void); void sub_08051458(void); +void sub_08050888(void); +void sub_080508E4(void); +void sub_08050910(void); + void CreateDialogBox(u32 arg0, u32 arg1) { u32 sfx; Font var0; @@ -119,7 +309,7 @@ void CreateDialogBox(u32 arg0, u32 arg1) { MemCopy(&gUnk_080FC844, &var0, sizeof(gUnk_080FC844)); sub_08056FEC(arg1, gUnk_020227E8); var0.gfx_src |= gUnk_080FC85C[arg0][0] << 0xC; - sub_0805F46C(gUnk_080FC85C[arg0][1], &var0); + ShowTextBox(gUnk_080FC85C[arg0][1], &var0); sfx = gUnk_080FC85C[arg0][2]; if (sfx) { SoundReq(sfx); @@ -375,6 +565,12 @@ void sub_08050848(void) { SetMenuType(1); } +void (*const gUnk_080FC908[])(void) = { + sub_08050888, + sub_080508E4, + sub_08050910, +}; + void sub_0805086C(void) { gUnk_080FC908[gChooseFileState.subState](); } @@ -550,6 +746,9 @@ typedef struct { extern const u16 gUnk_080FC914[]; +const u16 gUnk_080FC914[] = { 0xf251, 0xf251, 0xf251, 0xf251, 0xf251, 0xf251, 0xf251, 0xf251, 0xf251, 0xf251, + 0xf24d, 0xf24d, 0xf24d, 0xf24d, 0xf24d, 0xf24d, 0xf24d, 0xf24d, 0xf24d, 0xf24d }; + // Handles drawing of hearts NONMATCH("asm/non_matching/save/sub_08050B3C.inc", void sub_08050B3C(u16* arg0)) { unk_08050B3C sp; @@ -620,6 +819,14 @@ NONMATCH("asm/non_matching/save/sub_08050B3C.inc", void sub_08050B3C(u16* arg0)) } END_NONMATCH +void sub_08050C54(void); +void sub_08050D68(void); + +void (*const gUnk_080FC93C[])() = { + sub_08050C54, + sub_08050D68, +}; + void HandleFileView(void) { gUnk_080FC93C[gMenu.menuType](); sub_08050A64(gMapDataBottomSpecial.unk6); @@ -687,6 +894,15 @@ void sub_08050D68(void) { } } +void sub_08050DB8(void); +void sub_08050DE4(void); +void sub_08050E88(void); +void (*const gUnk_080FC944[])(void) = { + sub_08050DB8, + sub_08050DE4, + sub_08050E88, +}; + void HandleFileLanguageSelect(void) { gUnk_080FC944[gMenu.menuType](); } @@ -748,6 +964,17 @@ void sub_08050E88(void) { SetFileSelectState(0); } +void sub_08050EB8(void); +void sub_08050EF4(void); +void sub_08050FFC(void); +void sub_0805103C(void); +void (*const gUnk_080FC950[])(void) = { + sub_08050EB8, + sub_08050EF4, + sub_08050FFC, + sub_0805103C, +}; + void HandleFileOptions(void) { gUnk_080FC950[gMenu.menuType](); } @@ -863,6 +1090,17 @@ void sub_0805103C(void) { } } +void sub_08051090(void); +void sub_080610B8(void); +void sub_0805138C(void); +void sub_0805144C(void); +void (*const gUnk_080FC960[])(void) = { + sub_08051090, + sub_080610B8, + sub_0805138C, + sub_0805144C, +}; + void HandleFileNew(void) { gUnk_080FC960[gMenu.menuType](); } @@ -877,13 +1115,23 @@ void sub_08051090(void) { SetMenuType(1); } +const u8 gUnk_080FC970[] = { + 1, 2, 3, 5, 8, 0, 0, 0, 1, 2, 5, 8, 0, 0, 0, 0, +}; +const u8 gUnk_080FC980[] = { + 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 0, 0, 0, +}; +const u8 gUnk_080FC9A0[] = { + 1, 3, 6, 8, 11, 0, 0, 0, 1, 4, 7, 11, 11, 0, 0, 0, +}; + void sub_080610B8(void) { u8 uVar7; s32 uVar6; s32 tmp4; - u8* puVar3; - u8* puVar4; - u8* puVar5; + const u8* puVar3; + const u8* puVar4; + const u8* puVar5; s32 iVar4; u8 bVar2; u32 tmp1; @@ -1060,6 +1308,15 @@ void sub_08051358(void) { } } +void sub_080513A8(void); +void sub_080513C0(void); +void sub_0805141C(void); +void (*const gUnk_080FC9B0[])(void) = { + sub_080513A8, + sub_080513C0, + sub_0805141C, +}; + void sub_0805138C(void) { gUnk_080FC9B0[gMenu.overlayType](); } @@ -1209,12 +1466,21 @@ void sub_08051574(u32 sfx) { sub_0805070C(); } +void sub_080515C8(void); +void sub_080515D4(void); +void sub_080516E0(void); +void (*const gUnk_080FC9BC[])(void) = { + sub_080515C8, + sub_080515D4, + sub_080516E0, +}; + void HandleFileDelete(void) { gUnk_080FC9BC[gMenu.menuType](); sub_08050A64(gMapDataBottomSpecial.unk6); } -void sub_080515c8(void) { +void sub_080515C8(void) { SetMenuType(1); } @@ -1264,6 +1530,17 @@ void sub_080516E0(void) { } } +void sub_08051738(void); +void sub_080517EC(void); +void sub_08051874(void); +void sub_080518E4(void); +void (*const gUnk_080FC9C8[])(void) = { + sub_08051738, + sub_080517EC, + sub_08051874, + sub_080518E4, +}; + void HandleFileCopy(void) { gUnk_080FC9C8[gMenu.menuType](); sub_08050A64(gMapDataBottomSpecial.unk6); @@ -18,23 +18,24 @@ #include "functions.h" #include "item.h" #include "itemMetaData.h" +#include "itemMetaData.h" +#include "kinstone.h" #include "main.h" +#include "manager/diggingCaveEntranceManager.h" #include "menu.h" #include "message.h" +#include "npc.h" #include "object.h" #include "player.h" +#include "player.h" #include "room.h" +#include "roomid.h" #include "save.h" #include "screen.h" #include "sound.h" #include "subtask.h" -#include "itemMetaData.h" -#include "player.h" #include "transitions.h" -#include "roomid.h" #include "ui.h" -#include "kinstone.h" -#include "manager/diggingCaveEntranceManager.h" // Game task @@ -55,40 +56,8 @@ static GameMainState GameMain_BarrelUpdate; /*static GameMainState 00000000;*/ GameMainState GameMain_Subtask; -// Cutscene subtask - -typedef void(AuxCutsceneState)(void); -typedef void(CutsceneMainState)(void); - -static AuxCutsceneState AuxCutscene_Init; -static AuxCutsceneState AuxCutscene_Main; -static AuxCutsceneState AuxCutscene_Exit; - -CutsceneMainState CutsceneMain_Init; -CutsceneMainState CutsceneMain_Update; -CutsceneMainState CutsceneMain_Exit; - -// Game Over task - -typedef void(GameOverState)(void); - -static GameOverState GameOver_Init; -static GameOverState GameOver_FadeIn; -static GameOverState GameOver_TextMove; -static GameOverState GameOver_Update; -static GameOverState GameOver_Exit; - extern u8 gUpdateVisibleTiles; -extern u16 gUnk_020178E0[]; -extern u8 gUnk_02024090[]; -extern const u16 gUnk_080FD5A8[]; - -extern void** gAreaTilesets[]; -extern void** gAreaRoomMaps[]; -extern void* gAreaMetatiles[]; -extern void** gAreaTable[]; - extern void FinalizeSave(void); extern void ClearArmosData(void); extern void ClearRoomMemory(void); @@ -110,150 +79,13 @@ extern void LoadRoomGfx(void); extern void RecycleEntities(void); extern void sub_0804AF90(void); extern void CallRoomProp6(void); -extern void UpdateScroll(void); -extern void UpdateBgAnimations(void); -extern void CleanUpGFXSlots(void); -extern void sub_080ADE24(void); -extern void sub_0801AE44(u32); -extern void GenerateAreaHint(void); -extern void ForceSetPlayerState(u32); -extern void UpdateRoomTracker(void); -extern void InitScriptData(void); -extern void sub_08054524(void); -extern void sub_080186D4(void); -extern void sub_0806F364(void); -extern void sub_08052FF4(u32 area, u32 room); -extern void CloneMapData(void); -extern void InitializeCamera(void); -extern void SetBGDefaults(void); -extern void LoadItemGfx(void); -static void LoadRoomBgm(void); -static void sub_08052010(void); -static void ResetTmpFlags(void); -static void InitializeEntities(void); -static void CheckAreaDiscovery(void); -static void CreateMiscManager(void); static void UpdateWindcrests(void); -static void UpdateFakeScroll(void); -static void UpdatePlayerMapCoords(void); -static void sub_08052C3C(void); -static void UpdateTimerCallbacks(void); +static void InitializeEntities(void); static void sub_08051D98(void); static void sub_08051DCC(void); -static bool32 CheckGameOver(void); -static bool32 CheckRoomExit(void); -static void UpdatePlayerRoomStatus(void); -static void sub_0805329C(void); -static void InitializePlayer(void); -/* static */ void sub_08051F9C(u32 a1, u32 a2, u32 a3, u32 a4); -static void DrawGameOverText(void); -static u32 StairsAreValid(void); -static void ClearFlagArray(const u16*); -static void DummyHandler(u32* a1); -static void sub_08053434(u32* a1); -static void sub_080534E4(u32* a1); -static void InitAllRoomResInfo(void); -static void InitRoomResInfo(RoomResInfo* info, RoomHeader* hdr, u32 area, u32 room); -static void sub_080532E4(void); -static void ResetTimerFlags(void); -bool32 ItemIsBottle(u32); -void ModArrows(s32); -void ModShells(s32); - -typedef struct { - u8 dest_off[8]; - u8 _8; - u8 right_align; - u16 _a; -} PopupOption; - -typedef struct { - u8 area; - RoomID room : 8; - u8 _2; - u8 _3; - u16 x; - u16 y; -} CutsceneData; -static const CutsceneData sCutsceneData[]; - -extern u8 gUnk_0200AF14; -extern u8 gUnk_080FE1C6[]; -extern void (*const gUnk_080FE2AC[])(void); - -extern u8 gUnk_080FE1DD[]; - -extern void (*const gUnk_080FE2A0[])(void); - -extern void (*const gUnk_080FCBB4[])(void); - -extern const EntityData gUnk_080FCB94[]; - -void sub_08052004(void); - -extern void (*const gUnk_080FCCFC[])(void); - -extern void (*const gUnk_080FCD38[])(void); - -extern const EntityData gUnk_080FCC54[]; - -void sub_08051FF0(void); - -extern void (*const gUnk_080FCD40[])(void); - -extern const EntityData gUnk_080FCBC4[]; -void sub_08051F78(void); - -extern const EntityData gUnk_080FCC14[]; - -extern void DeleteAllEntities(void); - -extern void (*const gUnk_080FCDD4[])(void); - -extern const EntityData gUnk_080FCD84[]; - -extern void (*const gUnk_080FCEB0[])(void); - -extern const EntityData gUnk_080FCDE0[]; - -extern void (*const gUnk_080FCEEC[])(void); - -extern const EntityData gUnk_080FCEBC[]; - -extern void (*const gUnk_080FCEF8[])(void); - -extern void (*const gUnk_080FCFA4[])(void); - -extern void* GetRoomProperty(u32, u32, u32); - -extern void (*const gUnk_080FD108[])(void); - -extern const EntityData* gUnk_080FCFB8[]; -extern void (*const gUnk_080FD138[])(void); - -extern const u16 gUnk_080FD964[]; -extern const u8 gUnk_080FCF04[]; - -extern void ClearBgAnimations(void); - -void sub_08054974(s32, s32); -void sub_080548E8(void); - -extern void sub_0806F38C(void); - -extern void sub_08018710(u32); - -typedef struct { - Font* font; - u16 width; - u16 height; - u16 transitionTimer; - u16 fadeSpeed; -} struct_080FCCB4; - -extern struct_080FCCB4 gUnk_080FCCB4[]; +void sub_08054974(u32 worldEventId, bool32 param_2); void GameTask(void) { static GameState* const sStates[] = { @@ -430,7 +262,7 @@ static void GameMain_Update(void) { UpdateScroll(); UpdateBgAnimations(); UpdateScrollVram(); - sub_08052C3C(); + DecreasePortalTimer(); DrawUI(); UpdateManagers(); DrawUIElements(); @@ -500,6 +332,8 @@ static void GameTask_Exit(void) { #endif } +// TODO End of GameTask? + static void InitializeEntities(void) { sub_08052EA0(); sub_0804AF90(); @@ -572,2311 +406,3 @@ static void UpdateWindcrests(void) { } } } - -void Subtask_AuxCutscene(void) { - static AuxCutsceneState* const sStates[] = { - AuxCutscene_Init, - AuxCutscene_Main, - AuxCutscene_Exit, - }; - - sStates[gMenu.menuType](); -} - -static void AuxCutscene_Init(void) { - const CutsceneData* p = &sCutsceneData[gUI.field_0x3]; - gRoomControls.area = p->area; - gRoomControls.room = p->room; - LoadGfxGroups(); - gArea.localFlagOffset = GetFlagBankOffset(gRoomControls.area); - SetCurrentRoomPropertyList(p->area, p->room); - LoadAuxiliaryRoom(p->area, p->room); - gRoomControls.scroll_x = gRoomControls.origin_x + p->x; - gRoomControls.scroll_y = gRoomControls.origin_y + p->y; - gMenu.field_0x0 = p->_2; - gMenu.field_0x3 = p->_3 & 0xf; - gMenu.field_0xc = (void*)p; - gMenu.menuType++; - gMenu.overlayType = 0; - gMenu.transitionTimer = 300; - AuxCutscene_Main(); // init -} - -static void AuxCutscene_Main(void) { - static CutsceneMainState* const sStates[] = { - CutsceneMain_Init, - CutsceneMain_Update, - CutsceneMain_Exit, - }; - - sStates[gMenu.field_0x0](); - FlushSprites(); - UpdateEntities(); - DrawEntities(); - CopyOAM(); - UpdateScroll(); - UpdateBgAnimations(); - UpdateManagers(); - UpdateScrollVram(); -} - -static const CutsceneData sCutsceneData[] = { - { AREA_MINISH_WOODS, 0, 0, 0, 336, 528 }, - { AREA_HYRULE_FIELD, 1, 1, 0, 472, 312 }, - { AREA_HYRULE_CASTLE, 2, 1, 1, 16, 16 }, - { AREA_SANCTUARY, 2, 1, 2, 0, 0 }, - { AREA_EZLO_CUTSCENE, 0, 1, 3, 0, 0 }, - { AREA_HOUSE_INTERIORS_2, 16, 1, 4, 0, 0 }, - { AREA_DARK_HYRULE_CASTLE_OUTSIDE, 0, 1, 5, 0, 40 }, - { AREA_FORTRESS_OF_WINDS, 28, 2, 0, 0, 0 }, - { AREA_FORTRESS_OF_WINDS, 29, 2, 1, 0, 0 }, - { AREA_DARK_HYRULE_CASTLE, 14, 2, 2, 16, 16 }, -}; - -static void AuxCutscene_Exit(void) { - u32 flag = sCutsceneData[gUI.field_0x3]._3; - if (flag & 0xF0) { - MenuFadeIn(2, flag >> 4); - } else { - gUI.nextToLoad = 3; - SetFadeInverted(0x10); - MessageInitialize(); - } -} - -void sub_08051F78(void) { - u32 idx = gUI.field_0x3; - const CutsceneData* p = &sCutsceneData[idx]; - sub_08051F9C(p->area, p->room, p->x, p->y); -} - -void sub_08051F9C(u32 a1, u32 a2, u32 a3, u32 a4) { - u32 tmp = gScreen.lcd.displayControl & (DISPCNT_WIN0_ON | DISPCNT_WIN1_ON); - sub_08052FF4(a1, a2); - gRoomControls.scroll_x = gRoomControls.origin_x + a3; - gRoomControls.scroll_y = gRoomControls.origin_y + a4; - InitializeCamera(); - gUpdateVisibleTiles = 1; - gUsedPalettes = 0; - gScreen.lcd.displayControl |= tmp; -} - -void sub_08051FF0(void) { - sub_0804B0B0(gMenu.field_0xc[0], gMenu.field_0xc[1]); -} - -void sub_08052004(void) { - gMenu.menuType = 2; -} - -static void sub_08052010(void) { - InitSoundPlayingInfo(); - MessageInitialize(); - DispReset(1); - MemClear(gBG1Buffer, sizeof(gBG1Buffer)); - MemClear(gBG2Buffer, sizeof(gBG2Buffer)); - sub_080A4D34(); - LoadPaletteGroup(0xA); - SetColor(0, 0); - LoadGfxGroup(4); - MemClear((void*)0x06000000, 0x20); - MemClear(&gGenericMenu, sizeof(gGenericMenu)); - gScreen.lcd.displayControl |= DISPCNT_OBJ_ON; - gScreen.bg1.control = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(28) | BGCNT_CHARBASE(0); - gScreen.bg2.control = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(29) | BGCNT_CHARBASE(1); - gScreen.bg1.updated = 1; - gScreen.bg2.updated = 1; -} - -void GameOverTask(void) { - static GameOverState* const sStates[] = { - GameOver_Init, GameOver_FadeIn, GameOver_TextMove, GameOver_Update, GameOver_Exit, - }; - - sStates[gMain.state](); - if (gMain.state != GAMETASK_TRANSITION) { - FlushSprites(); - DrawGameOverText(); - CopyOAM(); - } -} - -static void switch_state(u32 idx) { - gMain.state = idx; - SetMenuType(0); -} - -static void GameOver_Init(void) { - if (gFadeControl.active) - return; - sub_08052010(); - gGenericMenu.unk10.a[0] = 80; - gMenu.transitionTimer = 60; - gSave.stats.health = 24; - gMain.field_0x5 = 60; - SoundReq(BGM_GAMEOVER); - SetFadeInverted(4); - gFadeControl.mask = 0xFFFF0001; - switch_state(GAMETASK_INIT); -} - -static void GameOver_FadeIn(void) { - if (gFadeControl.active) - return; - - if (gMain.field_0x5 == 0) { - if (gGenericMenu.unk10.a[0] >= 38) { - gGenericMenu.unk10.a[0]--; - } else { - gMenu.transitionTimer--; - if (gMenu.transitionTimer == 0) { - switch_state(GAMETASK_MAIN); -#if defined(DEMO_USA) || defined(DEMO_JP) - SoundReq(SONG_VOL_FADE_OUT); - SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 4); -#else - SetPopupState(0, 0); - gScreen.lcd.displayControl |= DISPCNT_BG1_ON | DISPCNT_BG2_ON; - gFadeControl.mask = 0x0000ffff; - SetFade(FADE_INSTANT, 16); -#endif - } - } - } else { - gMain.field_0x5--; - } -} - -static void GameOver_TextMove(void) { -#if defined(DEMO_USA) || defined(DEMO_JP) - if (gFadeControl.active == 0) { - DoSoftReset(); - } -} -#else - s32 temp3; - u32 temp2; - - if (gFadeControl.active) - return; - - switch (gMenu.menuType) { - case 0: - gMenu.transitionTimer = 30; - gMenu.field_0x3 = 0; - SetMenuType(1); - SetPopupState(0, 0); - gFadeControl.mask = 0xffffffff; - return; - case 1: - if (gMenu.transitionTimer == 0) { - u32 temp = gMenu.field_0x3; - switch (gInput.newKeys) { - case DPAD_UP: - temp = 0; - break; - case DPAD_DOWN: - temp = 1; - break; - case A_BUTTON: - if (gMenu.field_0x3 != 0) { - temp2 = 4; - } else { - CreateDialogBox(8, 0); - temp2 = 2; - } - gMenu.transitionTimer = 60; - SetMenuType(temp2); - SoundReq(SFX_TEXTBOX_SELECT); - break; - } - if (gMenu.field_0x3 != temp) { - gMenu.field_0x3 = temp; - SetPopupState(0, temp); - SoundReq(SFX_TEXTBOX_CHOICE); - } - return; - } - gMenu.transitionTimer--; - return; - case 2: - temp3 = HandleSave(0); - gMenu.field_0x0 = temp3; - switch (temp3) { - case 1: - SetMenuType(4); - break; - case -1: - gMenu.transitionTimer = 60; - CreateDialogBox(9, 0); - SetMenuType(3); - break; - } - return; - case 3: - if (gMenu.transitionTimer != 0) { - gMenu.transitionTimer--; - } else if (gInput.newKeys & (A_BUTTON | B_BUTTON | START_BUTTON)) { - SetMenuType(0); - } - return; - case 4: - default: - gScreen.lcd.displayControl &= ~DISPCNT_BG1_ON; - sub_08050384(); - switch_state(GAMETASK_EXIT); - return; - } -} -#endif - -static void GameOver_Update(void) { - switch (gMenu.menuType) { - case 0x0: - gMenu.transitionTimer = 30; - gMenu.field_0x3 = 0; - SetMenuType(1); - SetPopupState(1, 0); - return; - case 0x1: - gScreen.lcd.displayControl |= DISPCNT_BG1_ON; - if (gMenu.transitionTimer != 0) { - gMenu.transitionTimer--; - return; - } else { - u32 temp = gMenu.field_0x3; - switch (gInput.newKeys) { - case DPAD_UP: - temp = 0; - break; - case DPAD_DOWN: - temp = 1; - break; - case A_BUTTON: - SetMenuType(2); - SoundReq(SFX_TEXTBOX_SELECT); - if (temp == 0) { - SetFade(FADE_IN_OUT | FADE_INSTANT, 8); - } else { - SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 8); - } - break; - } - if (gMenu.field_0x3 != temp) { - gMenu.field_0x3 = temp; - SetPopupState(1, temp); - SoundReq(SFX_TEXTBOX_CHOICE); - } - } - return; - case 0x2: - default: - if (gFadeControl.active == 0) { - if (gMenu.field_0x3 == 0) { - SetTask(TASK_GAME); - } else { - DoSoftReset(); - } - } - return; - } -} - -// Unused, since task is set above -// if we got here, it would be a softlock -static void GameOver_Exit(void) { -} - -static void DrawGameOverText(void) { - static const u8 sOffsets[] = { - 48, 68, 88, 108, 137, 156, 174, 192, - }; - - u32 i; - - gOamCmd._4 = 0; - gOamCmd._6 = 0; - gOamCmd._8 = 0x8600; - gOamCmd.y = gGenericMenu.unk10.a[0]; - for (i = 0; i < 8; ++i) { - gOamCmd.x = sOffsets[i]; -#ifdef EU - DrawDirect(0x1fc, i); -#else - DrawDirect(0x1fd, i); -#endif - } -} - -void SetPopupState(u32 type, u32 choice_idx) { - static const Font sDefaultFont = { - .dest = gBG1Buffer, - .gfx_dest = (u16*)0x06006000, - .buffer_loc = gTextGfxBuffer, - ._c = 0, - .gfx_src = 0xD300, - .width = 0xE0, - .right_align = 0, - .sm_border = 0, - .unused = 0, - .draw_border = 0, - .border_type = 0, - .fill_type = 6, - .charColor = 4, - ._16 = 1, - .stylized = 0, - }; - static const PopupOption sPopupOptions[] = { - { { 11, 11, 11, 10, 11, 10, 10, 0 }, 8, 0, 16 }, - { { 10, 11, 11, 9, 11, 9, 9, 0 }, 8, 0, 17 }, - { { 15, 15, 15, 15, 15, 15, 15, 0 }, 5, 1, 13 }, - }; - - Font font; - const PopupOption* opt; - u32 fakematch; - - MemClear(gBG1Buffer, sizeof gBG1Buffer); - gUnk_020227E8[0]._0.WORD = 0xf; - gUnk_020227E8[1]._0.WORD = 0xf; - gUnk_020227E8[2]._0.WORD = 0xf; - gUnk_020227E8[3]._0.WORD = 0xf; - *(&gUnk_020227E8[choice_idx]._0.BYTES.byte0 + 1) = fakematch = 1; - - MemCopy(&sDefaultFont, &font, sizeof font); - opt = &sPopupOptions[type]; - font.dest = sDefaultFont.dest + (opt->dest_off[gSaveHeader->language] + opt->_8 * 32); - font.right_align = opt->right_align; - sub_0805F46C(opt->_a, &font); - gScreen.bg1.updated = fakematch; -} - -static void InitializePlayer(void) { - static const u8 sPlayerSpawnStates[] = { - [PL_SPAWN_DEFAULT] = PLAYER_INIT, - [PL_SPAWN_MINISH] = PLAYER_MINISH, - [PL_SPAWN_DROP] = PLAYER_INIT, - [PL_SPAWN_WALKING] = PLAYER_ROOMTRANSITION, - [PL_SPAWN_STEP_IN] = PLAYER_ROOM_EXIT, - [PL_SPAWN_SLEEPING] = PLAYER_SLEEP, - [PL_SPAWN_DROP_MINISH] = PLAYER_MINISH, - [PL_SPAWN_STAIRS_ASCEND] = PLAYER_USEENTRANCE, - [PL_SPAWN_STAIRS_DESCEND] = PLAYER_USEENTRANCE, - [PL_SPAWN_9] = PLAYER_MINISH, - [PL_SPAWN_PARACHUTE_FORWARD] = PLAYER_WARP, - [PL_SPAWN_PARACHUTE_UP] = PLAYER_WARP, - [PL_SPAWN_FAST_TRAVEL] = PLAYER_WARP, - }; - - Entity* pl; - - sub_080784C8(); - MemClear(&gActiveItems, sizeof(gActiveItems)); - MemClear(&gPlayerState, sizeof(gPlayerState)); - MemFill32(0xffffffff, &gPlayerState.path_memory, sizeof(gPlayerState.path_memory)); - MemClear(&gPlayerEntity, sizeof(gPlayerEntity)); - - pl = &gPlayerEntity; - - gRoomControls.camera_target = pl; - gPlayerState.queued_action = sPlayerSpawnStates[gRoomTransition.player_status.spawn_type]; - if (!CheckGlobalFlag(EZERO_1ST)) { - gPlayerState.flags |= PL_NO_CAP; - } - switch (gRoomTransition.player_status.spawn_type) { - case PL_SPAWN_DROP: - case PL_SPAWN_DROP_MINISH: - pl->z.HALF.HI = -0xc0; - break; - case PL_SPAWN_STEP_IN: - gPlayerState.field_0x38 = 16; - pl->direction = Direction8FromAnimationState(gRoomTransition.player_status.start_anim); - case PL_SPAWN_WALKING: - pl->speed = 224; - break; - case PL_SPAWN_STAIRS_ASCEND: - case PL_SPAWN_STAIRS_DESCEND: - gPlayerState.field_0x38 = 1; - gPlayerState.field_0x39 = gRoomTransition.player_status.spawn_type; - break; - case PL_SPAWN_PARACHUTE_FORWARD: - gPlayerState.field_0x38 = 1; - break; - case PL_SPAWN_PARACHUTE_UP: - gPlayerState.field_0x38 = 3; - break; - case PL_SPAWN_FAST_TRAVEL: - gPlayerState.field_0x38 = 4; - } - - pl->kind = PLAYER; - pl->flags |= ENT_COLLIDE | ENT_PERSIST; - pl->spritePriority.b0 = 4; - pl->health = gSave.stats.health; - pl->x.HALF.HI = gRoomTransition.player_status.start_pos_x; - pl->y.HALF.HI = gRoomTransition.player_status.start_pos_y; - pl->animationState = gRoomTransition.player_status.start_anim; - pl->collisionLayer = gRoomTransition.player_status.layer; - UpdateSpriteForCollisionLayer(pl); - AppendEntityToList(pl, 1); - RegisterPlayerHitbox(); -} - -bool32 AreaIsOverworld(void) { -#ifdef EU - return gArea.areaMetadata == 0x01; -#else - return gArea.areaMetadata == 0x81; -#endif -} - -bool32 CheckAreaOverworld(u32 area) { -#if EU - return gAreaMetadata[area].flags == 0x01; -#else - return gAreaMetadata[area].flags == 0x81; -#endif -} - -#ifndef EU -bool32 AreaAllowsWarp(void) { - return (gArea.areaMetadata >> 7) & 1; -} -#endif - -bool32 AreaIsDungeon(void) { - return (gArea.areaMetadata >> 2) & 1; -} - -bool32 AreaHasEnemies(void) { - return (gArea.areaMetadata >> 4) & 1; -} - -bool32 AreaHasNoEnemies(void) { - return (gArea.areaMetadata >> 6) & 1; -} - -bool32 AreaHasMap(void) { - return (gArea.areaMetadata >> 3) & 1; -} - -s32 ModHealth(s32 delta) { - s32 newHealth; - Stats* stats = &gSave.stats; - - newHealth = stats->health + delta; - if (newHealth < 0) { - newHealth = 0; - } - if (stats->maxHealth < newHealth) { - newHealth = (u32)stats->maxHealth; - } - stats->health = newHealth; - gPlayerEntity.health = newHealth; - return newHealth; -} - -void ModRupees(s32 delta) { - s32 newRupeeCount; - Stats* s = &gSave.stats; - - newRupeeCount = s->rupees + delta; - if (newRupeeCount < 0) { - newRupeeCount = 0; - } else { - if (newRupeeCount > gWalletSizes[s->walletType * 2]) { - newRupeeCount = gWalletSizes[s->walletType * 2]; - } - } - s->rupees = newRupeeCount; -} - -void sub_080526F8(s32 a1) { - if (AreaHasKeys()) { - u8* p = &gSave.unk45C[gArea.dungeon_idx]; - if (*p + a1 < 0) - *p = 0; - else - *p += a1; - } -} - -bool32 AreaHasKeys(void) { - return (gArea.areaMetadata >> 1) & 1; -} - -bool32 HasDungeonMap(void) { - u32 tmp; - - if (AreaHasKeys()) - tmp = gSave.unk45C[gArea.dungeon_idx]; - return tmp ? 1 : 0; -} - -bool32 HasDungeonCompass(void) { - u32 tmp; - - if (AreaHasKeys()) - tmp = gSave.unk46C[gArea.dungeon_idx] & 4; - return tmp ? 1 : 0; -} - -bool32 HasDungeonBigKey(void) { - if (!AreaHasKeys()) - return 0; - return (gSave.unk46C[gArea.dungeon_idx] >> 1) & 1; -} - -bool32 HasDungeonSmallKey(void) { - u32 tmp; - - if (!AreaHasKeys()) - return 0; - return gSave.unk46C[gArea.dungeon_idx] & 1; -} - -void RestoreGameTask(u32 a1) { - LoadGfxGroups(); -#ifndef EU - CleanUpGFXSlots(); -#endif - sub_080ADE24(); - InitUI(TRUE); - sub_0801AE44(a1); - MemCopy(gUnk_02024090, gPaletteBuffer, 1024); - gUsedPalettes = 0xffffffff; -} - -static void LoadRoomBgm(void) { - gArea.queued_bgm = gAreaMetadata[gRoomControls.area]._3; - if (CheckLocalFlagByBank(FLAG_BANK_10, LV6_KANE_START)) { - gArea.queued_bgm = BGM_FIGHT_THEME2; - } -} - -#ifndef EU -void sub_08052878(void) { - gArea.bgm = gArea.queued_bgm; - SoundReq(SONG_STOP_ALL); -} - -static void sub_0805289C(void) { - gArea.queued_bgm = gArea.bgm; -} -#endif - -static bool32 CheckGameOver(void) { - if (gRoomTransition.field_0x4[1]) { - InitFade(); - gMain.state = GAMETASK_EXIT; - gMain.substate = GAMEMAIN_INITROOM; - SetFade(FADE_IN_OUT | FADE_INSTANT, 8); - SoundReq(SONG_STOP_BGM); - return TRUE; - } - return FALSE; -} - -void RoomExitCallback(void) { - if (gArea.transitionManager != NULL && gArea.onExit != NULL) - gArea.onExit(gArea.transitionManager); -} - -static bool32 CheckRoomExit(void) { - if (gRoomTransition.transitioningOut && gSave.stats.health != 0 && gPlayerState.framestate != PL_STATE_DIE) { - if (StairsAreValid()) { - gRoomTransition.transitioningOut = 0; - return FALSE; - } - - switch (gRoomTransition.type) { - case TRANSITION_CUT: - SetFade(FADE_IN_OUT | FADE_INSTANT | FADE_MOSAIC, 8); - break; - case TRANSITION_CUT_FAST: - SetFade(FADE_IN_OUT | FADE_INSTANT | FADE_MOSAIC, 3); - break; - case TRANSITION_FADE_WHITE_SLOW: - SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 4); - break; - case TRANSITION_FADE_BLACK_SLOW: - SetFade(FADE_IN_OUT | FADE_INSTANT, 4); - break; - case TRANSITION_FADE_BLACK: - SetFade(FADE_IN_OUT | FADE_INSTANT, 16); - break; - case TRANSITION_FADE_BLACK_FAST: - SetFade(FADE_IN_OUT | FADE_INSTANT, 256); - break; - case TRANSITION_7: - case TRANSITION_FADE_WHITE_FAST: - SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 256); - break; - default: - SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 16); - break; - } - RoomExitCallback(); - gMain.substate = GAMEMAIN_CHANGEAREA; - *(&gMain.pauseInterval + 1) = 1; - return TRUE; - } - return FALSE; -} - -static u32 StairsAreValid(void) { - static const u16 sStairTypes[] = { 0x91, PL_SPAWN_STAIRS_ASCEND, 0x92, PL_SPAWN_STAIRS_DESCEND, - 0x93, PL_SPAWN_STAIRS_ASCEND, 0x94, PL_SPAWN_STAIRS_DESCEND, - 0x95, PL_SPAWN_STAIRS_ASCEND, 0x96, PL_SPAWN_STAIRS_DESCEND, - 0x97, PL_SPAWN_STAIRS_ASCEND, 0x98, PL_SPAWN_STAIRS_DESCEND, - 0 }; - - const u16* i; - u32 tgt = gRoomTransition.stairs_idx; - - for (i = sStairTypes; i[0] != 0; i += 2) { - if (tgt == i[0]) { - gPlayerState.queued_action = PLAYER_USEENTRANCE; - gPlayerState.field_0x38 = 0; - gPlayerState.field_0x39 = i[1]; - if (!gRoomTransition.player_status.spawn_type) - gRoomTransition.player_status.spawn_type = i[1]; - return 1; - } - } - return 0; -} - -void InitParachuteRoom(void) { - gRoomTransition.transitioningOut = 1; - gRoomTransition.player_status.start_pos_x = (gPlayerEntity.x.HALF.HI - gRoomControls.origin_x) & 0x3F8; - gRoomTransition.player_status.start_pos_y = (gPlayerEntity.y.HALF.HI - gRoomControls.origin_y) & 0x3F8; - gRoomTransition.player_status.start_anim = 4; - gRoomTransition.player_status.spawn_type = PL_SPAWN_PARACHUTE_FORWARD; - gRoomTransition.player_status.area_next = gRoomControls.area; - gRoomTransition.player_status.room_next = gRoomControls.room - 1; -} - -static void InitRoomTransition(void) { - switch (gRoomTransition.type) { - case TRANSITION_CUT: - SetFade(FADE_INSTANT | FADE_MOSAIC, 8); - break; - case TRANSITION_CUT_FAST: - SetFade(FADE_INSTANT | FADE_MOSAIC, 3); - break; - case TRANSITION_FADE_WHITE_SLOW: - SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 4); - break; - case TRANSITION_3: - break; - case TRANSITION_FADE_BLACK_FAST: - SetFade(FADE_IN_OUT | FADE_INSTANT, 256); - break; - case TRANSITION_7: - SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 256); - break; - case TRANSITION_FADE_BLACK: - SetFade(FADE_INSTANT, 16); - break; - case TRANSITION_FADE_WHITE_FAST: - SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 8); - break; - default: - SetFadeInverted(16); - break; - } -} - -bool32 CanDispEzloMessage(void) { - s32 tmp = PL_STATE_WALK; - - if (!(gInput.heldKeys & SELECT_BUTTON) || gPlayerState.controlMode != CONTROL_ENABLED || - gPauseMenuOptions.disabled || gUnk_0200AF00.unk_1) - return FALSE; - - if ((gPlayerState.flags & (PL_NO_CAP | PL_CAPTURED | PL_DISABLE_ITEMS)) || (gPlayerState.framestate_last > tmp) || - gPlayerState.item || gPlayerEntity.field_0x7a.HWORD) - return FALSE; - - if ((gPlayerEntity.z.HALF.HI & 0x8000) && !gPlayerState.field_0xa) - return FALSE; - - GenerateAreaHint(); - ForceSetPlayerState(PL_STATE_TALKEZLO); - SetPlayerEventPriority(); - return TRUE; -} - -void DisplayEzloMessage(void) { - u32 height; - u32 idx; -#if defined(JP) || defined(EU) - idx = 0x10; -#else - idx = 0x11; -#endif - - if (gRoomTransition.player_status.field_0x24[idx] == 0) { - height = gPlayerEntity.y.HALF.HI - gRoomControls.scroll_y > 96 ? 1 : 13; - } else { - height = gRoomTransition.player_status.field_0x24[idx]; - } - MessageAtHeight(gRoomTransition.hint_idx, height); -} - -#if defined(USA) || defined(DEMO_USA) || defined(DEMO_JP) -static void CreateMiscManager(void) { - Entity* e = NULL; - - if (gRoomTransition.player_status.field_0x24[13]) - return; - gRoomTransition.player_status.field_0x24[13] = 1; -#ifndef DEMO_JP - gRoomTransition.player_status.field_0x24[10] = gArea.locationIndex; -#endif - e = (Entity*)GetEmptyManager(); - if (e == NULL) - return; - e->kind = MANAGER; - e->id = MISC_MANAGER; - e->type = 15; - AppendEntityToList(e, 0); -} -#endif - -static void sub_08052C3C(void) { - if (gArea.portal_mode == 0) - gArea.portal_timer = 0; - if (gArea.portal_timer) { - gArea.portal_timer--; - gArea.portal_mode = 0; - } -} - -static void UpdatePlayerMapCoords(void) { - if (!AreaHasNoEnemies()) { - if (AreaIsOverworld()) { - gRoomTransition.player_status.overworld_map_x = gPlayerEntity.x.HALF_U.HI; - gRoomTransition.player_status.overworld_map_y = gPlayerEntity.y.HALF_U.HI; - } else if (AreaIsDungeon()) { - gRoomTransition.player_status.dungeon_map_x = gPlayerEntity.x.HALF.HI; - gRoomTransition.player_status.dungeon_map_y = gPlayerEntity.y.HALF.HI; - } - } -} - -void SetWorldMapPos(u32 area, u32 room, u32 x, u32 y) { - RoomHeader* hdr = gAreaRoomHeaders[area] + room; - gRoomTransition.player_status.overworld_map_x = hdr->map_x + x; - gRoomTransition.player_status.overworld_map_y = hdr->map_y + y; -} - -void SetDungeonMapPos(u32 area, u32 room, u32 x, u32 y) { - RoomHeader* hdr = gAreaRoomHeaders[area] + room; - gRoomTransition.player_status.dungeon_map_x = hdr->map_x + x; - gRoomTransition.player_status.dungeon_map_y = hdr->map_y + y; -} - -void InitRoom(void) { - AreaHeader* a_hdr = NULL; - - MemClear(&gArea, sizeof gArea); - a_hdr = &gAreaMetadata[gRoomControls.area]; - gArea.areaMetadata = a_hdr->flags; - gArea.locationIndex = a_hdr->location; - gArea.dungeon_idx = a_hdr->location - 23; - gArea.localFlagOffset = gLocalFlagBanks[a_hdr->flag_bank]; - gArea.flag_bank = a_hdr->flag_bank; - gArea.portal_timer = 180; - gArea.lightLevel = 256; - InitRoomTransition(); - InitAllRoomResInfo(); -} - -u32 GetFlagBankOffset(u32 idx) { - AreaHeader* a_hdr = &gAreaMetadata[idx]; - return gLocalFlagBanks[a_hdr->flag_bank]; -} - -void RegisterTransitionManager(void* mgr, void (*onEnter)(), void (*onExit)()) { - if (gMain.substate != GAMEMAIN_SUBTASK) { - gArea.transitionManager = mgr; - gArea.onEnter = onEnter; - gArea.onExit = onExit; - } -} - -static void InitAllRoomResInfo(void) { - RoomHeader* r_hdr = gAreaRoomHeaders[gRoomControls.area]; - RoomResInfo* info = gArea.roomResInfos; - u32 i; - for (i = 0; i < MAX_ROOMS && *(u16*)r_hdr != 0xFFFF; i++, r_hdr++) { - if (r_hdr->tileset_id != 0xFFFF) - InitRoomResInfo(info, r_hdr, gRoomControls.area, i); - info++; - } - gArea.pCurrentRoomInfo = GetCurrentRoomInfo(); -} - -static void InitRoomResInfo(RoomResInfo* info, RoomHeader* r_hdr, u32 area, u32 room) { - info->map_x = r_hdr->map_x; - info->map_y = r_hdr->map_y; - info->pixel_width = r_hdr->pixel_width; - info->pixel_height = r_hdr->pixel_height; - info->tileset = *(gAreaTilesets[area] + r_hdr->tileset_id); - info->map = *(gAreaRoomMaps[area] + room); - info->metatiles = gAreaMetatiles[area]; - info->bg_anim = (void*)gUnk_080B755C[area]; - info->exits = gExitLists[area][room]; - if (gAreaTable[area] != NULL) { - info->properties = *(gAreaTable[area] + room); - } -} - -RoomResInfo* GetCurrentRoomInfo(void) { - return &gArea.roomResInfos[gRoomControls.room]; -} - -void sub_08052EA0(void) { - MemClear(&gRoomVars, sizeof gRoomVars); - gRoomVars.unk_10[0] = -1; - gRoomVars.unk_10[1] = gRoomVars.unk_10[0]; - gRoomVars.unk_10[2] = gRoomVars.unk_10[0]; - gRoomVars.unk_10[3] = gRoomVars.unk_10[0]; - gRoomVars.lightLevel = 256; - gArea.locationIndex = gAreaMetadata[gRoomControls.area].location; - UpdateRoomTracker(); - InitScriptData(); - sub_08054524(); - sub_080186D4(); - sub_0806F364(); - UpdateGlobalProgress(); -} - -static u32 sub_08052EF4(s32 idx) { - AreaHeader* a_hdr = NULL; - u32 i = idx < 0 ? gRoomControls.area : idx; - a_hdr = &gAreaMetadata[i]; - return gLocalFlagBanks[a_hdr->flag_bank]; -} - -/** - * @brief If enabled, this type of transition does not change the room - * and keeps all entities. - */ -static void UpdateFakeScroll(void) { - u32 x, y; - LinkedList* ll; - Entity* e; - - if (gArea.unk_0c_0 == 0 || !gRoomVars.field_0x0) - return; - - y = 0; - x = 0; - - // WTF? - switch (gRoomControls.scroll_direction) { - case 0: - y = gArea.pCurrentRoomInfo->pixel_height; - case 1: - y = gArea.pCurrentRoomInfo->pixel_height; - case 2: - y = gArea.pCurrentRoomInfo->pixel_height; - case 3: - x = gArea.pCurrentRoomInfo->pixel_width; - } - - gArea.pCurrentRoomInfo->map_x += x; - gArea.pCurrentRoomInfo->map_y += y; - gRoomControls.origin_x += x; - gRoomControls.origin_y += y; - gRoomControls.scroll_x += x; - gRoomControls.scroll_y += y; - - ll = gEntityLists; - do { - for (e = ll->first; e != (Entity*)ll; e = e->next) { - if (e->kind != MANAGER) { - e->x.HALF.HI += x; - e->y.HALF.HI += y; - } - } - } while (++ll < gEntityLists + 9); -} - -void LoadAuxiliaryRoom(u32 area, u32 room) { - sub_08052FF4(area, room); - gRoomControls.camera_target = NULL; - CloneMapData(); - InitializeCamera(); -} - -void sub_08052FF4(u32 area, u32 room) { - RoomHeader* r_hdr = NULL; - - ClearTilemaps(); - SetBGDefaults(); - gRoomControls.area = area; - gRoomControls.room = room; - gScreen.lcd.displayControl = 0x1740; - MemClear(&gArea.currentRoomInfo, sizeof gArea.currentRoomInfo); - gArea.pCurrentRoomInfo = &gArea.currentRoomInfo; - r_hdr = gAreaRoomHeaders[area] + room; - gArea.currentRoomInfo.map_x = r_hdr->map_x; - gArea.currentRoomInfo.map_y = r_hdr->map_y; - gArea.currentRoomInfo.pixel_width = r_hdr->pixel_width; - gArea.currentRoomInfo.pixel_height = r_hdr->pixel_height; - gArea.currentRoomInfo.tileset = *(gAreaTilesets[area] + r_hdr->tileset_id); - gArea.currentRoomInfo.map = *(gAreaRoomMaps[area] + room); - gArea.currentRoomInfo.metatiles = gAreaMetatiles[area]; - gArea.currentRoomInfo.bg_anim = (void*)gUnk_080B755C[area]; -} - -void ChangeLightLevel(s32 lightLevel) { - lightLevel += gRoomVars.lightLevel; - if (lightLevel < 0) - lightLevel = 0; - if (lightLevel > 256) - lightLevel = 256; - gRoomVars.lightLevel = lightLevel; -} - -static void sub_080530B0(void) { - static const u16 sMinecartData[] = { 0x189, 0x0, 0x102, 0x4, 0x1af, 0x0, 0x204, 0x0, - 0x1cf, 0x0, 0x10, 0x4, 0x0, 0x0, 0x0, 0x0 }; - - MemCopy(sMinecartData, gRoomTransition.minecart_data, sizeof sMinecartData); -} - -void UpdateGlobalProgress(void) { - u8 pcnt = 1; - if (CheckLocalFlagByBank(FLAG_BANK_3, SEIIKI_STAINED_GLASS)) { - pcnt = 9; - } else if (CheckGlobalFlag(LV5_CLEAR)) { - pcnt = 8; - } else if (CheckLocalFlagByBank(FLAG_BANK_3, OUBO_KAKERA)) { - pcnt = 7; - } else if (CheckGlobalFlag(LV4_CLEAR)) { - pcnt = 6; - } else if (CheckGlobalFlag(LV3_CLEAR)) { - pcnt = 5; - } else if (CheckLocalFlagByBank(FLAG_BANK_1, SOUGEN_08_TORITSUKI)) { - pcnt = 4; - } else if (CheckGlobalFlag(LV1_CLEAR)) { - pcnt = 2; - } - gSave.global_progress = pcnt; -} - -static u32 sub_08053144(void) { - u32 ret; - - if (CheckGlobalFlag(ENDING)) - return 0; - ret = 0; - if (gArea.locationIndex != 0) - ret = !!(gRoomTransition.player_status.field_0x24[10] ^ gArea.locationIndex); - return ret; -} - -static void CheckAreaDiscovery(void) { - if (!sub_08053144()) - return; - - gRoomTransition.player_status.field_0x24[10] = gArea.locationIndex; - - if (!CheckGlobalFlag(TABIDACHI)) - return; - - if (!CheckGlobalFlag(ENDING)) { - Entity* e = (Entity*)GetEmptyManager(); - if (e != NULL) { - e->kind = MANAGER; - e->id = ENTER_ROOM_TEXTBOX_MANAGER; - AppendEntityToList(e, 8); - if (!gRoomVars.field_0x0 && !ReadBit(gSave.areaVisitFlags, gArea.locationIndex)) { - e->type2 = 1; - SetPlayerControl(3); - SetInitializationPriority(); - } - } - } - WriteBit(gSave.areaVisitFlags, gArea.locationIndex); -} - -static void UpdatePlayerRoomStatus(void) { - gPlayerState.startPosX = gPlayerEntity.x.HALF.HI; - gPlayerState.startPosY = gPlayerEntity.y.HALF.HI; - if (sub_08053144()) { - MemCopy(&gRoomTransition.player_status, &gSave.saved_status, sizeof gRoomTransition.player_status); - if (AreaIsDungeon()) { - gRoomTransition.player_status.dungeon_area = gRoomControls.area; - gRoomTransition.player_status.dungeon_room = gRoomControls.room; - gRoomTransition.player_status.dungeon_x = gPlayerEntity.x.HALF.HI; - gRoomTransition.player_status.dungeon_y = gPlayerEntity.y.HALF.HI; - } - } -} - -void sub_08053250(void) { - gRoomTransition.player_status.spawn_type = PL_SPAWN_DEFAULT; - gRoomTransition.player_status.start_pos_x = gPlayerEntity.x.HALF.HI - gRoomControls.origin_x; - gRoomTransition.player_status.start_pos_y = gPlayerEntity.y.HALF.HI - gRoomControls.origin_y; - gRoomTransition.player_status.start_anim = gPlayerEntity.animationState; - gRoomTransition.player_status.layer = gPlayerEntity.collisionLayer; - gRoomTransition.player_status.area_next = gRoomControls.area; - gRoomTransition.player_status.room_next = gRoomControls.room; - MemCopy(&gRoomTransition.player_status, &gSave.saved_status, sizeof gRoomTransition.player_status); -} - -static void sub_0805329C(void) { - if (sub_08053144()) { - switch (gRoomControls.area) { - case AREA_DEEPWOOD_SHRINE: - gSave.unk7 = 0; - break; - case AREA_CAVE_OF_FLAMES: - sub_080530B0(); - break; - case AREA_OUTER_FORTRESS_OF_WINDS: - sub_080532E4(); - break; - default: - ResetTimerFlags(); - break; - } - } -} - -static void sub_080532E4(void) { - s32 x, y; - - RoomHeader* r_hdr = gAreaRoomHeaders[AREA_FORTRESS_OF_WINDS] + 33; - - gRoomTransition.player_status.dungeon_area = AREA_FORTRESS_OF_WINDS; - gRoomTransition.player_status.dungeon_room = 33; - - gRoomTransition.player_status.dungeon_x = r_hdr->map_x + r_hdr->pixel_width / 2; - gRoomTransition.player_status.dungeon_map_x = gRoomTransition.player_status.dungeon_x; - gRoomTransition.player_status.dungeon_y = r_hdr->map_y + r_hdr->pixel_height + 0xa0; - gRoomTransition.player_status.dungeon_map_y = gRoomTransition.player_status.dungeon_y; -} - -void LoadGfxGroups(void) { - MemClear(&gBG0Buffer, sizeof gBG0Buffer); - MemClear(&gBG1Buffer, sizeof gBG1Buffer); - MemClear(&gBG2Buffer, sizeof gBG2Buffer); - MemClear(&gBG3Buffer, sizeof gBG3Buffer); - LoadGfxGroup(16); - LoadGfxGroup(23); - if (gRoomControls.area == AREA_CASTOR_WILDS) - LoadGfxGroup(26); - LoadItemGfx(); - LoadPaletteGroup(11); - LoadPaletteGroup(12); - SetColor(0, 0); -} - -void LoadItemGfx(void) { - LoadGfxGroup(GetInventoryValue(ITEM_REMOTE_BOMBS) ? 24 : 25); - if (GetInventoryValue(ITEM_LIGHT_ARROW)) - LoadGfxGroup(29); - LoadGfxGroup(GetInventoryValue(ITEM_MAGIC_BOOMERANG) ? 28 : 27); -} - -void sub_080533CC(void) { - u16* p1 = gUnk_020178E0; - u16* p2 = gUnk_020178E0 - 0x100; - *p2++ = *p1++; - *p2++ = *p1++; - *p2++ = *p1++; - *p2++ = *p1++; - *p2++ = *p1++; - gUsedPalettes |= 8; -} - -static void UpdateTimerCallbacks(void) { - static void (*const sHandlers[])(u32*) = { - sub_08053434, DummyHandler, sub_080534E4, DummyHandler, DummyHandler, DummyHandler, DummyHandler, DummyHandler, - }; - - u32* p; - u32 i; - - p = gSave.timers; - for (i = 0; i < 8; i++, p++) { - (sHandlers[i])(p); - } -} - -static void DummyHandler(u32* a1) { -} - -static void sub_08053434(u32* a1) { - if (gArea.locationIndex == 29 && *a1) { - if (!--*a1) { - ResetTimerFlags(); - MenuFadeIn(5, 6); - } - } -} - -static void ResetTimerFlags(void) { - static const u16 sClearFlags[] = { FLAG_BANK_10, LV6_GUFUU1_GISHIKI, FLAG_BANK_10, LV6_GUFUU1_DEMO, - FLAG_BANK_10, LV6_ZELDA_DISCURSE, FLAG_BANK_10, LV6_00_ESCAPE, - FLAG_BANK_10, LV6_GUFUU2_DEAD, FLAG_BANK_G, ENDING, - FLAG_BANK_10, LV6_KANE_START, FLAG_BANK_10, LV6_KANE_1ST, - FLAG_BANK_10, LV6_KANE_2ND, FLAG_BANK_10, LV6_SOTO_ENDING, - 0xFFFF }; - - gSave.timers[0] = 0; - if (CheckLocalFlagByBank(FLAG_BANK_10, LV6_ZELDA_DISCURSE)) - ClearGlobalFlag(ZELDA_CHASE); - ClearFlagArray(sClearFlags); -} - -void StartDarkNutTimer(void) { - gSave.timers[0] = 10800; -} - -void sub_080534AC(void) { - if (CheckLocalFlagByBank(FLAG_BANK_10, LV6_KANE_START)) { - ClearLocalFlagByBank(FLAG_BANK_10, LV6_KANE_START); - gSave.timers[0] = 0; - SoundReq(SONG_STOP_BGM); - } -} - -static void sub_080534E4(u32* a1) { - if (gRoomControls.area != AREA_VEIL_FALLS_TOP) { - if (*a1) - --*a1; - } -} - -void InitBiggoronTimer(void) { - gSave.timers[2] = 36000; -} - -static void ResetTmpFlags(void) { - static const u16 sClearFlags[] = { FLAG_BANK_2, BILL00_SHICHOU_00, FLAG_BANK_2, BILL0A_YADO_TAKARA_00, - FLAG_BANK_2, BILL0C_SCHOOLR_00, FLAG_BANK_1, MACHI00_00, - FLAG_BANK_1, MACHI00_02, FLAG_BANK_2, MHOUSE06_00, - FLAG_BANK_2, MHOUSE14_00, FLAG_BANK_2, MHOUSE2_00_02, - FLAG_BANK_2, MHOUSE2_01_T0, FLAG_BANK_2, MHOUSE2_02_KAME, - FLAG_BANK_2, SHOP00_ITEM_01, FLAG_BANK_2, SHOP01_CAFE_01, - 0xFFFF }; - - ResetTimerFlags(); - ClearFlagArray(sClearFlags); - - if (!CheckGlobalFlag(WATERBEAN_PUT)) - ClearGlobalFlag(WATERBEAN_OUT); - if (!GetInventoryValue(ITEM_EARTH_ELEMENT)) - ClearGlobalFlag(LV1_CLEAR); - if (!GetInventoryValue(ITEM_FIRE_ELEMENT)) - ClearGlobalFlag(LV2_CLEAR); - if (!GetInventoryValue(ITEM_WATER_ELEMENT)) - ClearGlobalFlag(LV4_CLEAR); -} - -static void ClearFlagArray(const u16* p) { - const u16* i; - - for (i = p; i[0] != 0xFFFF; i += 2) - ClearLocalFlagByBank(i[0], i[1]); -} - -void CutsceneMain_Init(void) { - gUnk_080FCBB4[gMenu.overlayType](); -} - -void sub_080535AC(void) { - gMenu.overlayType = 1; - gMenu.transitionTimer = 120; - gUI.field_0x6 = 1; - gUpdateVisibleTiles = 1; - gScreen.lcd.displayControl &= 0xfeff; - LoadRoomEntityList((EntityData*)gUnk_080FCB94); - SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 8); -} - -void sub_080535F4(void) { - if (gFadeControl.active == 0) { - ResetSystemPriority(); - gMenu.overlayType = 2; - } -} - -void nullsub_481(void) { -} - -void sub_08053618(void) { - gMenu.transitionTimer--; - if (gMenu.transitionTimer == 0) { - sub_08052004(); - } -} - -void sub_08053634(void) { - gUI.nextToLoad = 3; - MessageInitialize(); -} - -void sub_08053648(void) { - Entity* obj = CreateObject(SMOKE, 0, 0); - if (obj != NULL) { - obj->x.HALF.HI = gRoomControls.origin_x + 0x2d0; - obj->y.HALF.HI = gRoomControls.origin_y + 0x148; - } -} - -void sub_0805367C(void) { - gMenu.overlayType++; -} - -void sub_0805368C(void) { - Entity* entity = FindEntityByID(OBJECT, HOUSE_DOOR_INT, 6); - if (entity != NULL) { - DeleteEntity(entity); - SoundReq(SFX_F0); - } -} - -void sub_080536A8(void) { - sub_080A71C4(5, 5, FADE_INSTANT, 0x10); -} - -void sub_080536B8(void) { - sub_080A71C4(5, 3, FADE_INSTANT, 4); - SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100); -} - -void sub_080536D4(void) { - gUnk_080FCCFC[gMenu.overlayType](); -} - -void sub_080536F0(void) { - gUnk_080FCD38[gMenu.overlayType](); -} - -void sub_0805370C(void) { - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - sub_08051FF0(); - LoadRoomEntityList((EntityData*)gUnk_080FCC54); - SetFade(FADE_INSTANT, 0x10); -} - -void sub_0805373C(void) { - gUnk_080FCD40[gMenu.overlayType](); -} - -void sub_08053758(void) { - gMenu.overlayType = 1; - gMenu.transitionTimer = 120; - gMenu.field_0xa = 0x1e; - *((u8*)&gMenu + 0x10) = 0; // TODO - gUI.field_0x6 = 1; - gMapBottom.bgSettings = NULL; - gMapTop.bgSettings = NULL; - gRoomControls.camera_target = NULL; - gRoomControls.scroll_y = 0; - gRoomControls.scroll_x = 0; - ClearBgAnimations(); - DispReset(0); - gScreen.lcd.displayControl = 0x2640; - gScreen.controls.layerFXControl = 0x2244; - gScreen.controls.alphaBlend = 0x1000; - gScreen.controls.windowInsideControl = 0x1f; - gScreen.controls.windowOutsideControl = 0x3f; - gScreen.controls.window0HorizontalDimensions = 0xf0; - gScreen.controls.window0VerticalDimensions = 0x60; - gScreen.bg1.control = 0x1c4e; - gScreen.bg2.control = 0x1dc1; - SoundReq(BGM_STORY); - ResetSystemPriority(); - SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100); -} - -void sub_08053800(void) { - u32 index; - struct_080FCCB4* ptr; - if (gFadeControl.active == 0) { - index = gGenericMenu.unk10.a[0]; - ptr = &gUnk_080FCCB4[index]; - gGenericMenu.base.transitionTimer = ptr->transitionTimer; - gGenericMenu.base.field_0xa = 0x1e; - gGenericMenu.unk10.a[0]++; - gGenericMenu.base.overlayType++; - gGenericMenu.base.storyPanelIndex = 0; - LoadPaletteGroup(index + 0x8a); - LoadGfxGroup(index + 0x3a); - MemClear(&gBG1Buffer, 0x800); - sub_0805F46C(index + 0xf01, ptr->font); - gScreen.bg1.updated = 1; - gScreen.controls.alphaBlend = 0x10; - gScreen.controls.window0HorizontalDimensions = ptr->width; - gScreen.controls.window0VerticalDimensions = ptr->height; - SetFade(FADE_INSTANT, ptr->fadeSpeed); - } -} - -void sub_08053894(void) { - u32 tmp; - if (gFadeControl.active == 0) { - gMenu.transitionTimer--; - if (gMenu.field_0xa != 0) { - gMenu.field_0xa--; - } else { - if (((gRoomTransition.frameCount & 1) == 0) && (gMenu.storyPanelIndex < 0x10)) { - tmp = ++gMenu.storyPanelIndex << 0x18; - gScreen.controls.alphaBlend = (tmp >> 0x10) | (0x10 - ((tmp) >> 0x19)); - } - } - if (gMenu.transitionTimer == 0) { - gMenu.overlayType++; - SetFade(FADE_IN_OUT | FADE_INSTANT, 8); - } - } -} - -void sub_08053904(void) { - u32 tmp; - if (gFadeControl.active == 0) { - gMenu.transitionTimer--; - if (gMenu.field_0xa != 0) { - gMenu.field_0xa--; - } else { - if (((gRoomTransition.frameCount & 1) == 0) && (gMenu.storyPanelIndex < 0x10)) { - tmp = ++gMenu.storyPanelIndex << 0x18; - gScreen.controls.alphaBlend = (tmp >> 0x10) | (0x10 - (tmp >> 0x19)); - } - } - if (gMenu.transitionTimer == 0) { - gMenu.overlayType++; - SetFade(FADE_IN_OUT | FADE_INSTANT, 1); - } - } -} - -void sub_08053974(void) { - if (gFadeControl.active == 0) { - InitFade(); - DispReset(1); - SetBGDefaults(); - sub_08051F78(); - LoadRoomEntityList((EntityData*)&gUnk_080FCBC4); - SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100); - gMenu.overlayType++; - } -} - -void nullsub_482(void) { -} - -void sub_080539BC(void) { - SetBGDefaults(); - DeleteAllEntities(); - sub_08051F9C(0x22, 0x11, 0, 0); - sub_0804B0B0(0x22, 0x11); - LoadRoomEntityList((EntityData*)&gUnk_080FCC14); - gMenu.overlayType++; -} - -void sub_080539F4(void) { - if (gFadeControl.active == 0) { - DispReset(1); - gMenu.overlayType++; - gMenu.transitionTimer = 60; - } -} - -void sub_08053A1C(void) { - gMenu.transitionTimer--; - if (gMenu.transitionTimer == 0) { - gMenu.overlayType++; - gMenu.transitionTimer = 8; - MessageFromTarget(TEXT_INDEX(TEXT_PICORI, 0x07)); - gMessage.textWindowPosX = 1; - gMessage.textWindowPosY = 8; - SetFade(FADE_INSTANT, 8); - } -} - -void sub_08053A5C(void) { - if (((gMessage.doTextBox & 0x7f) == 0) && --gMenu.transitionTimer == 0) { - gMenu.overlayType++; - SetFade(FADE_IN_OUT | FADE_INSTANT, 8); - } -} - -void sub_08053A90(void) { - if (gFadeControl.active == 0) { - gUI.nextToLoad = 3; - SetBGDefaults(); - } -} - -void sub_08053AB0(void) { - gUnk_080FCDD4[gMenu.overlayType](); -} - -void sub_08053ACC(void) { - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - sub_08051FF0(); - LoadRoomEntityList((EntityData*)&gUnk_080FCD84); - SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100); -} - -void sub_08053B00(void) { - gMenu.overlayType++; -} - -void sub_08053B10(void) { - if (CheckRoomFlag(1)) { - gMenu.menuType++; - DispReset(1); - SetFade(FADE_INSTANT, 0x100); - } -} - -void sub_08053B3C(void) { - sub_080A71C4(5, 4, FADE_IN_OUT | FADE_INSTANT, 0x100); - SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100); -} - -void sub_08053B58(void) { - gUnk_080FCEB0[gMenu.overlayType](); -} - -void sub_08053B74(void) { - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - LoadRoomEntityList((EntityData*)&gUnk_080FCDE0); - ResetSystemPriority(); - ResetEntityPriority(); - SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100); -} - -void sub_08053BAC(void) { - gMenu.overlayType++; -} - -void sub_08053BBC(void) { - if (CheckRoomFlag(0)) { - gMenu.menuType++; - DispReset(1); - SetFade(FADE_INSTANT, 0x100); - } -} - -void sub_08053BE8(void) { - sub_080A71C4(5, 2, FADE_IN_OUT | FADE_INSTANT, 0x100); - SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100); -} - -void sub_08053C04(void) { - gUnk_080FCEEC[gMenu.overlayType](); -} - -void sub_08053C20(void) { - gMenu.overlayType = 1; - gMenu.transitionTimer = 120; - gUpdateVisibleTiles = 1; - sub_08051FF0(); - sub_0805B4D0(4); - LoadRoomEntityList((EntityData*)&gUnk_080FCEBC); - SetFade(FADE_INSTANT, 0x10); - SoundReq(BGM_FIGHT_THEME2); -} - -void nullsub_483(void) { -} - -void sub_08053C60(void) { - SetFade(FADE_IN_OUT | FADE_INSTANT, 2); - SoundReq(SFX_SUMMON); - SoundReq(SONG_STOP_BGM); - SetTask(3); -} - -void sub_08053C84(void) { - gMenu.overlayType = 2; -} - -void CutsceneMain_Exit(void) { - gUnk_080FCEF8[gMenu.field_0x3](); -} - -void sub_08053CAC(void) { - gUnk_080FCFA4[gMenu.overlayType](); -} - -void sub_08053CC8(void) { - const u8* ptr; - ptr = gUnk_080FCF04 + gMenu.field_0x3 * 0x10; - gMenu.field_0xc = (void*)&ptr[8]; - LoadRoomEntityList(*(EntityData**)(&ptr[0])); - LoadRoomEntityList(GetRoomProperty(ptr[4], ptr[5], 1)); - LoadRoomEntityList(GetRoomProperty(ptr[4], ptr[5], 2)); - gMenu.overlayType = 1; - gScreen.lcd.displayControl &= 0xfeff; - gUpdateVisibleTiles = 1; - SetFade(FADE_INSTANT, 0x10); - if (ptr[5] == 0x1d) { - gMenu.field_0xa = 1; - } -} - -void sub_08053D34(void) { - if (gMenu.field_0xa != 0) { - gMenu.field_0xa = 0; - if (CheckLocalFlagByBank(FLAG_BANK_7, 0x3d)) { - SetTileType(0x74, 0xc4, 1); - } - if (CheckLocalFlagByBank(FLAG_BANK_7, 0x3e)) { - SetTileType(0x74, 0xcc, 1); - } - } - if (gFadeControl.active == 0) { - gMenu.transitionTimer = 120; - gMenu.overlayType++; - } -} - -void sub_08053D90(void) { - gMenu.transitionTimer--; - if (gMenu.transitionTimer == 0) { - gMenu.overlayType++; - SetFadeInverted(0x10); - } -} - -void sub_08053DB4(void) { - if (gFadeControl.active == 0) { - u8* ptr = gMenu.field_0xc; - sub_08052FF4(gMenu.field_0xc[4], gMenu.field_0xc[5]); - InitializeCamera(); - gUpdateVisibleTiles = 1; - gRoomControls.scroll_x = (s8)ptr[6] + gRoomControls.scroll_x; - gRoomControls.scroll_y = (s8)ptr[7] + gRoomControls.scroll_y; - LoadRoomEntityList(*(EntityData**)ptr); - LoadRoomEntityList((EntityData*)GetRoomProperty(ptr[4], ptr[5], 1)); - LoadRoomEntityList((EntityData*)GetRoomProperty(ptr[4], ptr[5], 2)); - gMenu.transitionTimer = 120; - gMenu.overlayType++; - SetFadeInverted(0x10); - } -} - -void sub_08053E30(void) { - if ((gFadeControl.active == 0) && --gMenu.transitionTimer == 0) { - gMenu.menuType++; - } -} - -void sub_08053E58(void) { - gUnk_080FD108[gMenu.overlayType](); -} - -void sub_08053E74(void) { - const EntityData** ptr = gUnk_080FCFB8; - gMenu.field_0xc = (u8*)ptr; - LoadRoomEntityList((EntityData*)ptr[0]); - gMenu.transitionTimer = 120; - gMenu.field_0xa = 0x3c; - gMenu.overlayType++; - gScreen.lcd.displayControl &= 0xfeff; - gUpdateVisibleTiles = 1; - SetMinPriority(1); - SetFade(FADE_INSTANT, 8); -} - -void sub_08053EC4(void) { - EntityData** data; - if ((gFadeControl.active == 0) && (--gMenu.field_0xa == 0)) { - data = (EntityData**)(gMenu.field_0xc + 4); - gMenu.field_0xc += 0xc; - LoadRoomEntityList(*data); - gMenu.overlayType++; - } -} - -void sub_08053EFC(void) { - if (--gMenu.transitionTimer == 0) { - gMenu.overlayType++; - SetFadeInverted(8); - } -} - -void sub_08053F20(void) { - u8* ptr; - if (gFadeControl.active == 0) { - DeleteAllEntities(); - ptr = gMenu.field_0xc; - sub_08052FF4(gMenu.field_0xc[8], gMenu.field_0xc[9]); - InitializeCamera(); - gUpdateVisibleTiles = 1; - gRoomControls.scroll_x = (s8)ptr[10] + gRoomControls.scroll_x; - gRoomControls.scroll_y = (s8)ptr[0xb] + gRoomControls.scroll_y; - LoadRoomEntityList(*(EntityData**)ptr); - gMenu.transitionTimer = 120; - gMenu.field_0xa = 0x3c; - gMenu.overlayType++; - SetFadeInverted(8); - } -} - -void sub_08053F88(void) { - if ((gFadeControl.active == 0) && --gMenu.transitionTimer == 0) { - gMenu.menuType++; - ResetEntityPriority(); - } -} - -void CutsceneMain_Update(void) { - gUnk_080FD138[gMenu.field_0x3](); -} - -u32 GetSaleItemConfirmMessageID(u32 item) { - const u16* ptr = &gUnk_080FD964[item * 4]; - return ptr[2]; -} - -s32 GetItemPrice(u32 item) { - const u16* ptr = &gUnk_080FD964[item * 4]; - return ptr[0]; -} - -u32 GiveItem(Item item, u32 param_2) { - u32 uVar4; - u32 result; - u32 uVar9; - const ItemMetaData* metaData; - - uVar4 = GetInventoryValue(item); - metaData = &gItemMetaData[item]; - - if (uVar4 == 0) { - result = *(u16*)&metaData->textId; - } else { - result = *(u16*)&metaData->unk6; - } - if (!ItemIsBottle(item)) { - PutItemOnSlot(item); - if (uVar4 == 0) { - SetInventoryValue(item, 1); - } - } - switch (metaData->unk1) { - case 0: - default: - break; - case 1: - ModHealth(metaData->unk2); - SoundReq(SFX_HEART_GET); - break; - case 2: - ModRupees((u32)gUnk_080FD5A8[metaData->unk2]); - SoundReq(SFX_RUPEE_GET); - break; - case 3: - uVar9 = 0; - while (TRUE) { - if (3 < uVar9) { - return result; - } - if (GetInventoryValue(ITEM_BOTTLE1 + uVar9) == 0) - break; - uVar9++; - } - item = ITEM_BOTTLE1 + uVar9; - if (gSave.stats.bottles[uVar9] == 0) { - gSave.stats.bottles[uVar9] = 0x20; - } - SetInventoryValue(item, 1); - PutItemOnSlot(item); - break; - case 4: - uVar9 = 0; - while (gSave.stats.bottles[uVar9] != 0x20) { - uVar9++; - if (3 < uVar9) { - return result; - } - } - if (3 < uVar9) { - break; - } - gSave.stats.bottles[uVar9] = (u8)item; - SetInventoryValue(item, 1); - SoundReq(SFX_ITEM_GET); - break; - case 5: - sub_080526F8(1); - SoundReq(SFX_103); - break; - case 6: - gSave.unk46C[gArea.dungeon_idx] |= metaData->unk2; - break; - case 0xd: - sub_0801E738(0x72); - break; - case 0x12: - if (item == ITEM_BOOMERANG) { - SetInventoryValue(ITEM_MAGIC_BOOMERANG, 0); - } else { - SetInventoryValue(ITEM_BOOMERANG, 0); - } - case 0x11: - LoadItemGfx(); - break; - case 7: - if (item == ITEM_BOMBS) { - SetInventoryValue(ITEM_REMOTE_BOMBS, 0); - } else { - SetInventoryValue(ITEM_BOMBS, 0); - } - ModBombs(99); - LoadItemGfx(); - break; - case 8: - if (uVar4 == 0) { - SetInventoryValue(ITEM_BOMBS, 1); - PutItemOnSlot(7); - } else { - gSave.stats.bombBagType++; - if (3 < gSave.stats.bombBagType) { - gSave.stats.bombBagType = 3; - } - } - ModBombs(99); - break; - case 9: - ModBombs(metaData->unk2); - SoundReq(SFX_103); - break; - case 0xb: - if (GetInventoryValue(ITEM_LARGE_QUIVER) == 0) { - SetInventoryValue(ITEM_LARGE_QUIVER, 1); - } - ModArrows(99); - LoadItemGfx(); - break; - case 0xa: - gSave.stats.quiverType++; - if (3 < gSave.stats.quiverType) { - gSave.stats.quiverType = 3; - } - ModArrows(99); - break; - case 0xc: - ModArrows(metaData->unk2); - SoundReq(SFX_103); - break; - case 0x0e: - SetInventoryValue(ITEM_SHELLS, 1); - ModShells(param_2); - SoundReq(SFX_103); - break; - case 0x0f: - sub_0801E738(param_2); - break; - case 0x10: - gSave.stats.walletType++; - if (gSave.stats.walletType < 4) { - break; - } - gSave.stats.walletType = 3; - break; - } - return result; -} - -// TODO Adapt ItemMetaData struct -void sub_08054288(s32 param_1) { - const ItemMetaData* ptr1 = gItemMetaData; - u16* ptr = (u16*)&((ptr1)[param_1]); - MessageFromTarget(ptr[3]); -} - -u32 getItemMetaDataGetTextIndex(s32 itemIndex) { - const ItemMetaData* ptr1 = gItemMetaData; - u16* ptr = (u16*)&((ptr1)[itemIndex]); - return ptr[2]; -} - -u32 sub_080542AC(u32 param_1) { - const ItemMetaData* ptr1 = gItemMetaData; - u8* ptr = (u8*)&((ptr1)[param_1]); - return ptr[3] & 1; -} - -void ModShells(s32 shells) { - if (shells == 0) { - shells = 1; - } - shells += gSave.stats.shells; - if (shells < 0) { - shells = 0; - } else if (999 < shells) { - shells = 999; - } - gSave.stats.shells = shells; -} - -void ModBombs(s32 bombs) { - s32 bombCount = bombs; - s32 bagSize; - bombCount += gSave.stats.bombCount; - bagSize = gBombBagSizes[gSave.stats.bombBagType]; - if (bombCount < 0) { - bombCount = 0; - } else if (bagSize < bombCount) { - bombCount = bagSize; - } - gSave.stats.bombCount = bombCount; -} - -void ModArrows(s32 arrows) { - s32 quiverSize; - s32 arrowCount = arrows; - arrowCount += gSave.stats.arrowCount; - quiverSize = gQuiverSizes[gSave.stats.quiverType]; - if (arrowCount < 0) { - arrowCount = 0; - } else if (quiverSize < arrowCount) { - arrowCount = quiverSize; - } - gSave.stats.arrowCount = arrowCount; -} - -/** - * @brief Returns the slot the item is equipped in. - * - * 0: A - * 1: B - * 2: Not equipped - */ -EquipSlot IsItemEquipped(u32 itemId) { - EquipSlot equipSlot; - - if (itemId == gSave.stats.itemButtons[SLOT_A]) { - equipSlot = EQUIP_SLOT_A; - } else if (itemId == gSave.stats.itemButtons[SLOT_B]) { - equipSlot = EQUIP_SLOT_B; - } else { - equipSlot = EQUIP_SLOT_NONE; - } - return equipSlot; -} - -void PutItemOnSlot(u32 itemId) { - EquipSlot equipSlot; - u32 itemId2 = itemId; - if (itemId2 < 0x47) { - SetInventoryValue(0, 1); - } - if (itemId2 - 1 < 0x1f) { - equipSlot = EQUIP_SLOT_NONE; - if (gSave.stats.itemButtons[SLOT_A] == ITEM_NONE) { - equipSlot = EQUIP_SLOT_A; - } else if (gSave.stats.itemButtons[SLOT_B] == ITEM_NONE) { - equipSlot = EQUIP_SLOT_B; - } - if (equipSlot == EQUIP_SLOT_NONE) { - u32 temp = gItemMetaData[itemId2].menuSlot; - if (temp == gItemMetaData[gSave.stats.itemButtons[SLOT_A]].menuSlot) { - equipSlot = EQUIP_SLOT_A; - } else { - if (temp == gItemMetaData[gSave.stats.itemButtons[SLOT_B]].menuSlot) { - equipSlot = EQUIP_SLOT_B; - } - } - if (equipSlot == EQUIP_SLOT_NONE) { - return; - } - } - ForceEquipItem(itemId2, equipSlot); - } -} - -void ForceEquipItem(u32 itemId, u32 equipSlot) { - u32 otherItem; - u32 otherItemSlot; - u32 replacedItem; - - if ((itemId - 1 < 0x1f) && (equipSlot < EQUIP_SLOT_NONE)) { - otherItemSlot = equipSlot == EQUIP_SLOT_A; - replacedItem = gSave.stats.itemButtons[equipSlot]; - otherItem = gSave.stats.itemButtons[otherItemSlot]; - if (gItemMetaData[otherItem].menuSlot == gItemMetaData[itemId].menuSlot) { - otherItem = replacedItem; - } - gSave.stats.itemButtons[equipSlot] = itemId; - gSave.stats.itemButtons[otherItemSlot] = otherItem; - gUnk_0200AF00.unk_13 = 0x7f; - gUnk_0200AF00.unk_14 = 0x7f; - } -} - -u32 SetBottleContents(u32 itemId, u32 bottleIndex) { - if (bottleIndex > 3) { - bottleIndex = 0; - for (bottleIndex = 0; gSave.stats.bottles[bottleIndex] != ITEM_BOTTLE_EMPTY;) { - if (++bottleIndex > 3) { - return bottleIndex; - } - } - if (bottleIndex > 3) { - return bottleIndex; - } - } - gSave.stats.bottles[bottleIndex] = itemId; - return bottleIndex; -} - -bool32 ItemIsSword(u32 item) { - switch (item) { - case ITEM_SMITH_SWORD: - case ITEM_GREEN_SWORD: - case ITEM_RED_SWORD: - case ITEM_BLUE_SWORD: - case ITEM_FOURSWORD: - return TRUE; - default: - return FALSE; - } -} - -bool32 ItemIsShield(u32 id) { - switch (id) { - case ITEM_SHIELD: - case ITEM_MIRROR_SHIELD: - return TRUE; - default: - return FALSE; - } -} - -bool32 ItemIsBottle(u32 id) { - switch (id) { - case ITEM_BOTTLE1: - case ITEM_BOTTLE2: - case ITEM_BOTTLE3: - case ITEM_BOTTLE4: - return TRUE; - default: - return FALSE; - } -} - -u32 GetBottleContaining(u32 id) { - if (id == gSave.stats.bottles[0]) { - return 1; - } else if (id == gSave.stats.bottles[1]) { - return 2; - } else if (id == gSave.stats.bottles[2]) { - return 3; - } else if (id == gSave.stats.bottles[3]) { - return 4; - } else { - return 0; - } -} - -void sub_08054524(void) { - u32 bVar1; - - bVar1 = gArea.locationIndex; - if (gArea.locationIndex == 0) { - bVar1 = gRoomTransition.player_status.field_0x24[0xa]; - } - if (bVar1 > 0x16) { - bVar1 = 0; - } - - bVar1 = gUnk_080FE1C6[bVar1]; - MemCopy(&gAreaDroptables[bVar1], &gRoomVars.currentAreaDroptable, sizeof(Droptable)); -} - -void DisableRandomDrops(void) { - gRoomVars.randomDropsDisabled = TRUE; -} - -void EnableRandomDrops(void) { - gRoomVars.randomDropsDisabled = FALSE; -} - -extern void sub_08000F14(s16*, const s16*, const s16*, const s16*); -extern u32 sub_08000F2C(s16*, const s16*, const s16*, const s16*); -u32 CreateItemDrop(Entity* arg0, u32 itemId, u32 itemParameter); -u32 CreateRandomItemDrop(Entity* arg0, u32 arg1) { - extern const u8 gUnk_080FE1B4[] /* = { - ITEM_NONE, ITEM_RUPEE1, ITEM_RUPEE5, ITEM_RUPEE20, ITEM_HEART, ITEM_FAIRY, - ITEM_BOMBS5, ITEM_ARROWS5, ITEM_SHELLS, ITEM_KINSTONE_GREEN, ITEM_KINSTONE_BLUE, ITEM_KINSTONE_RED, - ITEM_ENEMY_BEETLE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, - }*/; - - int r0, r1, rand, summOdds, item; - u32 r3; - const Droptable *ptr2, *ptr3, *ptr4; - Droptable droptable; - r3 = arg1; - if (gRoomVars.randomDropsDisabled != TRUE) { - ptr2 = &gDroptableModifiers[DROPTABLE_NONE]; - ptr4 = NULL; - switch (r3) { - case 1 ... 12: - ptr4 = &gEnemyDroptables[r3]; - break; -#ifndef EU - case 24: - case 25: - r0 = gRoomVars.unk2; - ptr4 = &gUnk_0800191C[0]; - if (r0) { - ptr4++; - } - break; -#endif - case 16 ... 23: -#ifdef EU - case 24: -#endif - ptr2 = &gObjectDroptables[r3 - 16]; - case 15: - ptr4 = &gRoomVars.currentAreaDroptable; - break; - case 0: - default: - break; - } - if (ptr4 != 0) { - if ((r1 = gSave.stats.picolyteType) == 0) { - // nop - ptr3 = &gDroptableModifiers[DROPTABLE_NONE]; - } else { -#ifdef EU - ptr3 = &gEnemyDroptables[r1 + 9]; -#else - ptr3 = &gEnemyDroptables[r1 + 6]; -#endif - } - // vector addition, s0 = ptr4 + ptr2 + ptr3 - sub_08000F14(droptable.a, ptr4->a, ptr2->a, ptr3->a); - if (gSave.stats.health <= 8) { - droptable.s.hearts += 5; - } - if (gSave.stats.bombCount == 0) { - droptable.s.bombs += 3; - } - if (gSave.stats.arrowCount == 0) { - droptable.s.arrows += 3; - } - if (gSave.stats.rupees <= 10) { - droptable.s.rupee5++; - } - ptr2 = &gDroptableModifiers[DROPTABLE_NONE]; - r0 = gSave.stats.hasAllFigurines; - ptr3 = &gDroptableModifiers[DROPTABLE_NONE]; - // don't drop shells anymore - if (r0 != 0) { - ptr2 = &gDroptableModifiers[DROPTABLE_NO_SHELLS]; - } - // don't drop kinstones anymore - if (gSave.didAllFusions != 0) { - ptr3 = &gDroptableModifiers[DROPTABLE_NO_KINSTONES]; - } - // vector addition, s0 = s0 + ptr2 + ptr3 - // resulting values are clamped to be >= 0 - // returns sum over s0 - summOdds = sub_08000F2C(droptable.a, droptable.a, ptr2->a, ptr3->a); - rand = Random(); - item = (rand >> 0x18); - item &= 0xF; - rand = rand % summOdds; - { - u32 r3; - for (r3 = 0, r1 = 0; r3 < 0x10; r3++, item = (item + 1) & 0xF) { - if ((r1 += droptable.a[item]) > rand) { - break; - } - } - } - r1 = gUnk_080FE1B4[item]; - if (r1 != ITEM_NONE) { - return CreateItemDrop(arg0, r1, 0); - } - } - } - return ITEM_NONE; -} - -u32 CreateItemDrop(Entity* arg0, u32 itemId, u32 itemParameter) { - u32 adjustedParam = itemParameter; - Entity* itemEntity; - - switch (itemId) { - case ITEM_ENEMY_BEETLE: - if (!GetInventoryValue(ITEM_SMITH_SWORD)) { - return ITEM_NONE; - } - break; - case ITEM_BOMBS5: - if (!GetInventoryValue(ITEM_BOMBBAG)) { - return ITEM_NONE; - } - break; - case ITEM_ARROWS5: - if (!GetInventoryValue(ITEM_BOW)) { - return ITEM_NONE; - } - break; - case ITEM_SHELLS: { - if (!GetInventoryValue(ITEM_EARTH_ELEMENT)) { - return ITEM_NONE; - } - if (itemParameter == 0) { - adjustedParam = 1; - } - break; - } - case ITEM_KINSTONE: - case ITEM_KINSTONE_GREEN ... ITEM_KINSTONE_RED: { - u32 rand; - - if (GetInventoryValue(ITEM_KINSTONE_BAG) == 0) { - return ITEM_NONE; - } - if (3 < gRoomVars.filler1[0]) { - return ITEM_NONE; - } - - if (itemId != ITEM_KINSTONE) { - adjustedParam = itemId - ITEM_KINSTONE_GREEN; - rand = (Random() & 0x3f); - adjustedParam = gUnk_080FE1DD[(rand + adjustedParam * 0x40)]; - if (adjustedParam == 0) { - itemId = ITEM_NONE; - } else { - itemId = ITEM_KINSTONE; - } - } - break; - } - } - if (itemId != ITEM_NONE) { - if (itemId != ITEM_ENEMY_BEETLE) { - itemEntity = CreateObject(GROUND_ITEM, itemId, adjustedParam); - if (itemEntity != NULL) { - if (arg0 == &gPlayerEntity) { - itemEntity->timer = 1; - } else { - itemEntity->timer = 0; - } - if (arg0->kind == OBJECT) { - if (arg0->id == 99) { - arg0->child = itemEntity; - } else if (arg0->id == 0x1e) { - itemEntity->direction = arg0->animationState << 3 | 0x80; - itemEntity->speed = 0xc0; - itemEntity->zVelocity = Q_16_16(1.5); - } - } - CopyPosition(arg0, itemEntity); - } - } else { - itemEntity = CreateEnemy(BEETLE, 0); - if (itemEntity != NULL) { - itemEntity->x.HALF.HI = arg0->x.HALF.HI; - itemEntity->y.HALF.HI = arg0->y.HALF.HI; - itemEntity->collisionLayer = arg0->collisionLayer; - UpdateSpriteForCollisionLayer(itemEntity); - } - } - } - return itemId; -} - -void Subtask_WorldEvent(void) { -#if !(defined(DEMO_USA) || defined(DEMO_JP)) - gUnk_080FE2A0[gMenu.menuType](); -#endif -} - -void sub_0805488C(void) { - const struct_080FE320* ptr = &gUnk_080FE320[gUI.field_0x3]; - gMenu.field_0x0 = ptr->evt_type; - gMenu.field_0x3 = ptr->entity_idx; - gMenu.field_0x4 = gUI.field_0x3; - gMenu.field_0xc = (u8*)ptr; - gMenu.menuType++; - gMenu.overlayType = 0; - gMenu.transitionTimer = 300; - DispReset(0); - sub_08054974(gUI.field_0x3, 1); - sub_0806F364(); - ClearRoomFlag(0xff); - sub_080548E8(); -} - -void sub_080548E8(void) { - gUnk_080FE2AC[gMenu.field_0x0](); - FlushSprites(); - UpdateEntities(); - DrawEntities(); - CopyOAM(); - UpdateScroll(); - UpdateBgAnimations(); - UpdateScrollVram(); -} - -void sub_08054920(void) { - MessageInitialize(); - sub_0806F38C(); - if (gUnk_080C9CBC[gFuseInfo._3].unk7 != 0) { - MenuFadeIn(10, gUI.field_0x3); - } else { - gUI.nextToLoad = 3; - SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10); - } -} - -void sub_08054968(void) { - gMenu.menuType = 2; -} - -void sub_08054974(s32 param_1, s32 param_2) { - struct_080FE320* ptr = &gUnk_080FE320[param_1]; - SetCurrentRoomPropertyList(ptr->area, ptr->room); - gRoomControls.area = ptr->area; - gRoomControls.room = ptr->room; - LoadGfxGroups(); - gArea.localFlagOffset = GetFlagBankOffset(gRoomControls.area); - if (param_2 != 0) { - LoadAuxiliaryRoom(ptr->area, ptr->room); - } else { - sub_08052FF4(ptr->area, ptr->room); - InitializeCamera(); - gUpdateVisibleTiles = 1; - } - gScreen.lcd.displayControl &= 0x1fff; - gRoomControls.scroll_x = gRoomControls.origin_x + ptr->_4; - gRoomControls.scroll_y = gRoomControls.origin_y + ptr->_6; - if (ptr->area == AREA_HYRULE_TOWN) { - TryLoadPrologueHyruleTown(); - } - sub_08018710(gUI.field_0x3); -} - -void sub_08054A14(s32 param_1) { - struct_080FE320* ptr = &gUnk_080FE320[param_1]; - if (ptr->_11 < 0xe) { - SetLocalFlagByBank(gLocalFlagBanks[ptr->_11], ptr->flag); - } -} diff --git a/src/gameData.c b/src/gameData.c new file mode 100644 index 00000000..26462587 --- /dev/null +++ b/src/gameData.c @@ -0,0 +1,503 @@ +// TODO belongs to game.c, but spriteAnimations332.s is before. +// maybe also signals code that no longer belongs to game.c? +#include "common.h" +#include "flags.h" +#include "game.h" +#include "item.h" +#include "kinstone.h" +#include "room.h" + +// extern const u8 gUnk_080FE1B4[]; +// const u8 gUnk_080FE1B4[] = {0, 84, 85, 86, 95, 96, 93, 94, 63, 252, 253, 254, 255, 0, 0, 0,0,}; +const u8 gUnk_080FE1B4[] = { + ITEM_NONE, ITEM_RUPEE1, ITEM_RUPEE5, ITEM_RUPEE20, ITEM_HEART, ITEM_FAIRY, + ITEM_BOMBS5, ITEM_ARROWS5, ITEM_SHELLS, ITEM_KINSTONE_GREEN, ITEM_KINSTONE_BLUE, ITEM_KINSTONE_RED, + ITEM_ENEMY_BEETLE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, +}; +const u8 gUnk_080FE1C6[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 9, 10, 10, 11, 12, 13, 14, 15, 8, 15, 1, 8, +}; +const u8 gUnk_080FE1DD[] = { + 110, 111, 112, 112, 110, 111, 111, 112, 110, 110, 112, 111, 112, 111, 110, 110, 110, 111, 112, 112, 110, 111, + 111, 112, 110, 110, 112, 111, 112, 111, 110, 111, 110, 111, 112, 112, 110, 111, 111, 112, 110, 110, 112, 111, + 112, 111, 110, 112, 110, 111, 112, 112, 110, 111, 111, 112, 110, 110, 112, 111, 112, 111, 110, 0, 113, 114, + 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, + 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, + 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 113, 114, 115, 116, 117, 117, + 115, 116, 116, 117, 115, 115, 117, 116, 117, 116, 115, 115, 115, 116, 117, 117, 115, 116, 116, 117, 115, 115, + 117, 116, 117, 116, 115, 116, 115, 116, 117, 117, 115, 116, 116, 117, 115, 115, 117, 116, 117, 116, 115, 117, + 115, 116, 117, 117, 115, 116, 116, 117, 115, 115, 117, 116, 117, 116, 115, 0, 0, 0, 0, +}; + +void Subtask_WorldEvent_Init(void); +void Subtask_WorldEvent_Update(void); +void Subtask_WorldEvent_End(void); +void (*const gUnk_080FE2A0[])(void) = { + Subtask_WorldEvent_Init, + Subtask_WorldEvent_Update, + Subtask_WorldEvent_End, +}; +void WorldEvent_0(void); +void WorldEvent_1(void); +void WorldEvent_2(void); +void WorldEvent_3(void); +void WorldEvent_4(void); +void WorldEvent_5(void); +void WorldEvent_6(void); +void WorldEvent_7(void); +void WorldEvent_8(void); +void WorldEvent_9(void); +void WorldEvent_Beanstalk(void); +void WorldEvent_11(void); +void WorldEvent_12(void); +void WorldEvent_13(void); +void WorldEvent_14(void); +void WorldEvent_15(void); +void WorldEvent_16(void); +void WorldEvent_17(void); +void WorldEvent_17(void); +void WorldEvent_19(void); +void WorldEvent_20(void); +void WorldEvent_21(void); +void WorldEvent_22(void); +void WorldEvent_23(void); +void WorldEvent_24(void); +void WorldEvent_25(void); + +void (*const gWorldEventFunctions[])(void) = { + WorldEvent_0, WorldEvent_1, WorldEvent_2, WorldEvent_3, WorldEvent_4, WorldEvent_5, + WorldEvent_6, WorldEvent_7, WorldEvent_8, WorldEvent_9, WorldEvent_Beanstalk, WorldEvent_11, + WorldEvent_12, WorldEvent_13, WorldEvent_14, WorldEvent_15, WorldEvent_16, WorldEvent_17, + WorldEvent_17, WorldEvent_19, WorldEvent_20, WorldEvent_21, WorldEvent_22, WorldEvent_23, + WorldEvent_24, WorldEvent_25, WorldEvent_0, WorldEvent_0, WorldEvent_0, +}; + +// Indexed by worldEventId of gKinstoneWorldEvents +const WorldEvent gWorldEvents[] = { + { WORLD_EVENT_TYPE_0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_1, 0, AREA_RUINS, ROOM_RUINS_BELOW_FORTRESS_ENTRANCE, 128, 112, 248, 216, 728, 3112, CND_1, + LOCAL_BANK_0, OUGONTEKI_A }, + { WORLD_EVENT_TYPE_1, 1, AREA_MT_CRENEL, ROOM_MT_CRENEL_CENTER, 384, 192, 504, 280, 488, 1112, CND_1, LOCAL_BANK_0, + OUGONTEKI_B }, + { WORLD_EVENT_TYPE_1, 2, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 480, 80, 600, 168, 600, 1848, CND_1, + LOCAL_BANK_0, OUGONTEKI_C }, + { WORLD_EVENT_TYPE_1, 3, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_EASTERN_HILLLS_NORTH, 0, 352, 120, 440, 2616, 2600, + CND_1, LOCAL_BANK_0, OUGONTEKI_D }, + { WORLD_EVENT_TYPE_1, 4, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 768, 160, 936, 248, 2424, 440, CND_1, + LOCAL_BANK_0, OUGONTEKI_E }, + { WORLD_EVENT_TYPE_1, 5, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 224, 144, 344, 232, 2840, 472, CND_1, LOCAL_BANK_0, + OUGONTEKI_F }, + { WORLD_EVENT_TYPE_1, 6, AREA_MT_CRENEL, ROOM_MT_CRENEL_CAVERN_OF_FLAMES_ENTRANCE, 96, 368, 216, 456, 600, 680, + CND_1, LOCAL_BANK_0, OUGONTEKI_G }, + { WORLD_EVENT_TYPE_1, 7, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 192, 96, 328, 184, 3304, 2344, CND_1, + LOCAL_BANK_0, OUGONTEKI_H }, + { WORLD_EVENT_TYPE_1, 8, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_CENTER, 176, 0, 312, 88, 1320, 2888, + CND_1, LOCAL_BANK_0, OUGONTEKI_I }, + { WORLD_EVENT_TYPE_2, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_EASTERN_HILLLS_NORTH, 80, 288, 200, 376, 2696, 2536, + CND_1, LOCAL_BANK_1, KAKERA_TAKARA_A }, + { WORLD_EVENT_TYPE_2, 0, AREA_CRENEL_MINISH_PATHS, ROOM_CRENEL_MINISH_PATHS_RAIN, 272, 16, 392, 88, 744, 152, CND_1, + LOCAL_BANK_3, KAKERA_TAKARA_B }, + { WORLD_EVENT_TYPE_2, 0, AREA_CRENEL_MINISH_PATHS, ROOM_CRENEL_MINISH_PATHS_SPRING_WATER, 0, 48, 168, 136, 872, + 1432, CND_1, LOCAL_BANK_3, KAKERA_TAKARA_C }, + { WORLD_EVENT_TYPE_2, 0, AREA_MINISH_PATHS, ROOM_MINISH_PATHS_SCHOOLYARD, 0, 240, 120, 328, 2408, 1608, CND_1, + LOCAL_BANK_3, KAKERA_TAKARA_D }, + { WORLD_EVENT_TYPE_2, 0, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 0, 112, 104, 200, 3080, 2360, CND_1, + LOCAL_BANK_1, KAKERA_TAKARA_E }, + { WORLD_EVENT_TYPE_2, 0, AREA_MINISH_PATHS, ROOM_MINISH_PATHS_LON_LON_RANCH, 0, 288, 120, 376, 2968, 1544, CND_1, + LOCAL_BANK_3, KAKERA_TAKARA_F }, + { WORLD_EVENT_TYPE_2, 0, AREA_MINISH_PATHS, ROOM_MINISH_PATHS_MINISH_VILLAGE, 0, 416, 104, 504, 3448, 3064, CND_1, + LOCAL_BANK_3, KAKERA_TAKARA_G }, + { WORLD_EVENT_TYPE_2, 0, AREA_CRENEL_MINISH_PATHS, ROOM_CRENEL_MINISH_PATHS_MELARI, 208, 16, 344, 104, 616, 504, + CND_1, LOCAL_BANK_3, KAKERA_TAKARA_H }, + { WORLD_EVENT_TYPE_2, 0, AREA_MINISH_PATHS, ROOM_MINISH_PATHS_LAKE_HYLIA, 0, 640, 104, 760, 3896, 2024, CND_1, + LOCAL_BANK_3, KAKERA_TAKARA_I }, + { WORLD_EVENT_TYPE_2, 0, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 0, 576, 88, 664, 3064, 2824, CND_1, + LOCAL_BANK_1, KAKERA_TAKARA_J }, + { WORLD_EVENT_TYPE_2, 0, AREA_RUINS, ROOM_RUINS_FORTRESS_ENTRANCE, 288, 80, 488, 168, 968, 2808, CND_1, + LOCAL_BANK_1, KAKERA_TAKARA_K }, + { WORLD_EVENT_TYPE_2, 0, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 768, 496, 904, 584, 3880, 2744, CND_1, + LOCAL_BANK_1, KAKERA_TAKARA_L }, + { WORLD_EVENT_TYPE_2, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, 240, 0, 392, 56, 1400, 1256, CND_1, + LOCAL_BANK_1, KAKERA_TAKARA_M }, + { WORLD_EVENT_TYPE_2, 0, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 544, 640, 664, 728, 3640, 2888, CND_1, + LOCAL_BANK_1, KAKERA_TAKARA_N }, + { WORLD_EVENT_TYPE_2, 0, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 48, 320, 200, 360, 3176, 2520, CND_1, + LOCAL_BANK_1, KAKERA_TAKARA_O }, + { WORLD_EVENT_TYPE_2, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD, 656, 272, 776, 360, 2264, 2840, + CND_1, LOCAL_BANK_1, KAKERA_TAKARA_P }, + { WORLD_EVENT_TYPE_2, 0, AREA_ROYAL_VALLEY, ROOM_ROYAL_VALLEY_MAIN, 0, 0, 56, 88, 1064, 280, CND_1, LOCAL_BANK_1, + KAKERA_TAKARA_Q }, + { WORLD_EVENT_TYPE_2, 0, AREA_ROYAL_VALLEY, ROOM_ROYAL_VALLEY_MAIN, 240, 0, 424, 88, 1432, 280, CND_1, LOCAL_BANK_1, + KAKERA_TAKARA_R }, + { WORLD_EVENT_TYPE_2, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, 144, 352, 280, 440, 1288, 1640, + CND_1, LOCAL_BANK_1, KAKERA_TAKARA_S }, + { WORLD_EVENT_TYPE_2, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 0, 0, 104, 72, 1592, 792, CND_1, + LOCAL_BANK_1, KAKERA_TAKARA_T }, + { WORLD_EVENT_TYPE_2, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_LON_LON_RANCH, 48, 0, 168, 40, 2664, 1240, CND_1, + LOCAL_BANK_1, KAKERA_TAKARA_U }, + { WORLD_EVENT_TYPE_2, 0, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 240, 96, 360, 184, 2856, 376, CND_1, LOCAL_BANK_1, + KAKERA_TAKARA_V }, + { WORLD_EVENT_TYPE_2, 0, AREA_MT_CRENEL, ROOM_MT_CRENEL_WALL_CLIMB, 48, 288, 184, 376, 184, 600, CND_1, + LOCAL_BANK_1, KAKERA_TAKARA_W }, + { WORLD_EVENT_TYPE_2, 0, AREA_MT_CRENEL, ROOM_MT_CRENEL_ENTRANCE, 0, 0, 120, 88, 120, 1288, CND_1, LOCAL_BANK_1, + KAKERA_TAKARA_X }, + { WORLD_EVENT_TYPE_2, 0, AREA_RUINS, ROOM_RUINS_LADDER_TO_TEKTITES, 0, 0, 136, 88, 376, 3096, CND_1, LOCAL_BANK_1, + KAKERA_TAKARA_Y }, + { WORLD_EVENT_TYPE_0, 0, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 0, 0, 0, 0, 0, 0, CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_3, 0, AREA_RUINS, ROOM_RUINS_ENTRANCE, 0, 48, 40, 136, 40, 2776, CND_2, 0, + ITEM_ARROW_BUTTERFLY }, + { WORLD_EVENT_TYPE_3, 1, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 304, 448, 424, 520, 424, 2200, CND_2, 0, + ITEM_DIG_BUTTERFLY }, + { WORLD_EVENT_TYPE_3, 2, AREA_ROYAL_VALLEY, ROOM_ROYAL_VALLEY_MAIN, 0, 136, 56, 216, 1064, 408, CND_2, 0, + ITEM_SWIM_BUTTERFLY }, +#if defined(EU) || defined(JP) || defined(DEMO_JP) + { WORLD_EVENT_TYPE_4, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, 112, 160, 264, 264, 1272, 1432, + CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_4, 0, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 352, 400, 488, 520, 3704, 1688, CND_0, 0, 0 }, +#ifdef DEMO_JP + { WORLD_EVENT_TYPE_4, 0, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 160, 576, 232, 664, 2728, 824, CND_1, LOCAL_BANK_3, + MOGURA_41_T3 }, // same as USA +#else + { WORLD_EVENT_TYPE_4, 0, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 160, 576, 232, 664, 2728, 824, CND_0, 0, 0 }, +#endif + { WORLD_EVENT_TYPE_5, 132, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 656, 0, 776, 72, 2264, 264, CND_0, 0, 0 }, +#ifdef DEMO_JP + { WORLD_EVENT_TYPE_5, 1, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_LON_LON_RANCH, 384, 440, 504, 520, 3000, 1720, CND_1, + LOCAL_BANK_4, 0x4c }, // TODO differs from USA +#else + { WORLD_EVENT_TYPE_5, 1, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_LON_LON_RANCH, 384, 440, 504, 520, 3000, 1720, CND_0, + 0, 0 }, +#endif + { WORLD_EVENT_TYPE_5, 2, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD, 0, 200, 88, 280, 1576, 2760, + CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_5, 3, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, 0, 600, 56, 680, 1064, 1880, CND_0, + 0, 0 }, + { WORLD_EVENT_TYPE_5, 128, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 128, 0, 232, 72, 1720, 264, CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_6, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, 112, 224, 216, 296, 1240, 2488, + CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_6, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, 56, 32, 168, 88, 1192, 2280, + CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_6, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, 240, 448, 392, 552, 1416, 2744, + CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_6, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, 0, 464, 24, 568, 1048, 2760, + CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_7, 128, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 448, 224, 576, 296, 2072, 1016, + CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_7, 128, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 304, 304, 432, 392, 1928, 1112, + CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_7, 128, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 328, 224, 432, 296, 1928, 1016, + CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_7, 128, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 448, 328, 576, 392, 2072, 1112, + CND_0, 0, 0 }, +#ifdef DEMO_JP + { WORLD_EVENT_TYPE_7, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, 40, 408, 160, 488, 1160, 2648, + CND_1, LOCAL_BANK_2, URO_19_H0 }, // same as USA +#else + { WORLD_EVENT_TYPE_7, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, 40, 408, 160, 488, 1160, 2648, + CND_0, 0, 0 }, +#endif + { WORLD_EVENT_TYPE_7, 1, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 408, 376, 528, 456, 3496, 2600, CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_7, 2, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 632, 232, 752, 312, 2248, 1032, + CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_7, 3, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD, 768, 472, 928, 552, 2424, 3032, + CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_8, 0, AREA_RUINS, ROOM_RUINS_TEKTITES, 0, 0, 200, 88, 440, 2936, CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_8, 0, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 496, 848, 536, 968, 3512, 3128, CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_8, 0, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 0, 16, 24, 88, 24, 1768, CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_8, 0, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 48, 424, 152, 520, 3368, 1720, CND_0, 0, 0 }, + +#ifdef DEMO_JP + // mostly same as USA + { WORLD_EVENT_TYPE_9, 0, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 0, 0, 56, 40, 2552, 232, CND_1, LOCAL_BANK_4, + SUIGEN_DOUKUTU_09_H00 }, + { WORLD_EVENT_TYPE_9, 1, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 112, 304, 240, 392, 1736, 1912, CND_0, 0, + 0 }, // same as EU + { WORLD_EVENT_TYPE_25, 0, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 768, 0, 920, 56, 920, 1752, CND_2, 0, + ITEM_SKILL_FAST_SPIN }, + { WORLD_EVENT_TYPE_25, 1, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 80, 400, 200, 488, 1688, 1208, + CND_2, 0, ITEM_SKILL_LONG_SPIN }, + { WORLD_EVENT_TYPE_25, 2, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 128, 752, 248, 840, 2744, 1032, CND_2, 0, + ITEM_SKILL_FAST_SPLIT }, + { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_MT_CRENEL, ROOM_MT_CRENEL_TOP, 0, 0, 152, 40, 152, 40, CND_5, LOCAL_BANK_1, + BEANDEMO_00 }, // uses different flags due to CND_5 + { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_BEANSTALK, 432, 0, 552, 88, 3528, 1096, CND_6, + LOCAL_BANK_1, BEANDEMO_01 }, // uses different flags due to CND_6 + { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_RUINS, ROOM_RUINS_BEANSTALK, 0, 0, 72, 72, 312, 2712, CND_7, LOCAL_BANK_1, + BEANDEMO_02 }, // uses different flags due to CND_7 + { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_EASTERN_HILLLS_CENTER, 0, 0, 72, 56, 2568, + 2760, CND_8, LOCAL_BANK_1, BEANDEMO_03 }, // uses different flags due to CND_8 + { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_SOUTH, 0, 0, 56, 56, 1064, 3016, + CND_9, LOCAL_BANK_1, BEANDEMO_04 }, // uses different flags due to CND_9 +#else + { WORLD_EVENT_TYPE_9, 0, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 0, 0, 56, 40, 2552, 232, CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_9, 1, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 112, 304, 240, 392, 1736, 1912, CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_25, 0, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 768, 0, 920, 56, 920, 1752, CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_25, 1, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 80, 400, 200, 488, 1688, 1208, + CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_25, 2, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 128, 752, 248, 840, 2744, 1032, CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_MT_CRENEL, ROOM_MT_CRENEL_TOP, 0, 0, 152, 40, 152, 40, CND_0, LOCAL_BANK_1, + BEANDEMO_00 }, // uses different flags due to CND_5 + { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_BEANSTALK, 432, 0, 552, 88, 3528, 1096, CND_0, + LOCAL_BANK_1, BEANDEMO_01 }, // uses different flags due to CND_6 + { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_RUINS, ROOM_RUINS_BEANSTALK, 0, 0, 72, 72, 312, 2712, CND_0, LOCAL_BANK_1, + BEANDEMO_02 }, // uses different flags due to CND_7 + { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_EASTERN_HILLLS_CENTER, 0, 0, 72, 56, 2568, + 2760, CND_0, LOCAL_BANK_1, BEANDEMO_03 }, // uses different flags due to CND_8 + { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_SOUTH, 0, 0, 56, 56, 1064, 3016, + CND_0, LOCAL_BANK_1, BEANDEMO_04 }, // uses different flags due to CND_9 +#endif + { WORLD_EVENT_TYPE_11, 0, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 0, 48, 88, 152, 88, 1832, CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_11, 1, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 0, 160, 40, 232, 40, 1912, CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_11, 2, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 96, 664, 200, 776, 200, 2456, CND_0, 0, 0 }, +#ifdef DEMO_JP + // same as USA + { WORLD_EVENT_TYPE_12, 0, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 624, 784, 760, 952, 2184, 2360, CND_1, + LOCAL_BANK_2, 208 }, // TODO + { WORLD_EVENT_TYPE_13, 0, AREA_HOUSE_INTERIORS_4, ROOM_HOUSE_INTERIORS_4_CARPENTER, 0, 32, 120, 112, 1560, 1944, + CND_1, LOCAL_BANK_2, 207 }, // TODO +#else + { WORLD_EVENT_TYPE_12, 0, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 624, 784, 760, 952, 2184, 2360, CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_13, 0, AREA_HOUSE_INTERIORS_4, ROOM_HOUSE_INTERIORS_4_CARPENTER, 0, 32, 120, 112, 1560, 1944, + CND_0, 0, 0 }, +#endif + { WORLD_EVENT_TYPE_14, 0, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 768, 736, 904, 824, 2392, 2344, CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_15, 0, AREA_ROYAL_VALLEY, ROOM_ROYAL_VALLEY_MAIN, 240, 96, 392, 136, 1400, 360, CND_0, + LOCAL_BANK_1, HAKA_BOSEKI_00 }, // uses different flags due to CND_10 + { WORLD_EVENT_TYPE_16, 0, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 768, 160, 736, 232, 2040, 2040, CND_0, 0, 0 }, + + { WORLD_EVENT_TYPE_17, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_LON_LON_RANCH, 0, 800, 136, 856, 2624, 2056, CND_0, + 0, 0 }, + { WORLD_EVENT_TYPE_18, 1, AREA_GORON_CAVE, ROOM_GORON_CAVE_MAIN, 0, 464, 120, 440, 2632, 2056, CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_18, 2, AREA_GORON_CAVE, ROOM_GORON_CAVE_MAIN, 0, 288, 120, 280, 2632, 2056, CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_18, 3, AREA_GORON_CAVE, ROOM_GORON_CAVE_MAIN, 0, 288, 120, 280, 2632, 2056, CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_18, 4, AREA_GORON_CAVE, ROOM_GORON_CAVE_MAIN, 0, 144, 120, 136, 2632, 2056, CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_18, 5, AREA_GORON_CAVE, ROOM_GORON_CAVE_MAIN, 0, 144, 120, 136, 2632, 2056, CND_0, 0, 0 }, +#else + { WORLD_EVENT_TYPE_4, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, 112, 160, 264, 264, 1272, 1432, + CND_1, LOCAL_BANK_4, KS_B01 }, + { WORLD_EVENT_TYPE_4, 0, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 352, 400, 488, 520, 3704, 1688, CND_1, LOCAL_BANK_3, + MOGURA_01_T0 }, + { WORLD_EVENT_TYPE_4, 0, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 160, 576, 232, 664, 2728, 824, CND_1, LOCAL_BANK_3, + MOGURA_41_T3 }, + { WORLD_EVENT_TYPE_5, 132, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 656, 0, 776, 72, 2264, 264, CND_1, + LOCAL_BANK_3, IZUMIGARE_00_H00 }, + { WORLD_EVENT_TYPE_5, 1, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_LON_LON_RANCH, 384, 440, 504, 520, 3000, 1720, CND_1, + LOCAL_BANK_4, SOUGEN_DOUKUTU_0F_T00 }, + { WORLD_EVENT_TYPE_5, 2, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD, 0, 200, 88, 280, 1576, 2760, + CND_1, LOCAL_BANK_4, KS_C37 }, + { WORLD_EVENT_TYPE_5, 3, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, 0, 600, 56, 680, 1064, 1880, CND_1, + LOCAL_BANK_4, KS_C12 }, + { WORLD_EVENT_TYPE_5, 128, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 128, 0, 232, 72, 1720, 264, CND_1, + LOCAL_BANK_3, KS_C02 }, + { WORLD_EVENT_TYPE_6, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, 112, 224, 216, 296, 1240, 2488, + CND_1, LOCAL_BANK_1, SOUGEN_08_T00 }, + { WORLD_EVENT_TYPE_6, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, 56, 32, 168, 88, 1192, 2280, + CND_1, LOCAL_BANK_1, KS_C21 }, + { WORLD_EVENT_TYPE_6, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, 240, 448, 392, 552, 1416, 2744, + CND_1, LOCAL_BANK_1, KS_C25 }, + { WORLD_EVENT_TYPE_6, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, 0, 464, 24, 568, 1048, 2760, + CND_1, LOCAL_BANK_2, MHOUSE08_00 }, + { WORLD_EVENT_TYPE_7, 128, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 448, 224, 576, 296, 2072, 1016, + CND_1, LOCAL_BANK_4, SOUGEN_DOUKUTU_00_T1 }, + { WORLD_EVENT_TYPE_7, 128, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 304, 304, 432, 392, 1928, 1112, + CND_1, LOCAL_BANK_4, SOUGEN_DOUKUTU_00_T2 }, + { WORLD_EVENT_TYPE_7, 128, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 328, 224, 432, 296, 1928, 1016, + CND_1, LOCAL_BANK_4, SOUGEN_DOUKUTU_00_T0 }, + { WORLD_EVENT_TYPE_7, 128, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 448, 328, 576, 392, 2072, 1112, + CND_1, LOCAL_BANK_4, SOUGEN_DOUKUTU_00_T3 }, + { WORLD_EVENT_TYPE_7, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, 40, 408, 160, 488, 1160, 2648, + CND_1, LOCAL_BANK_2, URO_19_H0 }, + { WORLD_EVENT_TYPE_7, 1, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 408, 376, 528, 456, 3496, 2600, CND_1, + LOCAL_BANK_4, KS_B06 }, + { WORLD_EVENT_TYPE_7, 2, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 632, 232, 752, 312, 2248, 1032, + CND_1, LOCAL_BANK_4, KS_B12 }, + { WORLD_EVENT_TYPE_7, 3, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD, 768, 472, 928, 552, 2424, 3032, + CND_1, LOCAL_BANK_2, URO_12_H0 }, + { WORLD_EVENT_TYPE_8, 0, AREA_RUINS, ROOM_RUINS_TEKTITES, 0, 0, 200, 88, 440, 2936, CND_1, LOCAL_BANK_2, + KOBITOANA_0C_T0 }, + { WORLD_EVENT_TYPE_8, 0, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 496, 848, 536, 968, 3512, 3128, CND_1, + LOCAL_BANK_2, KOBITOANA_08_T0 }, + { WORLD_EVENT_TYPE_8, 0, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 0, 16, 24, 88, 24, 1768, CND_1, LOCAL_BANK_2, + KOBITOANA_0D_T0 }, + { WORLD_EVENT_TYPE_8, 0, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 48, 424, 152, 520, 3368, 1720, CND_1, LOCAL_BANK_2, + KS_A09 }, + { WORLD_EVENT_TYPE_9, 0, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 0, 0, 56, 40, 2552, 232, CND_1, LOCAL_BANK_4, + SUIGEN_DOUKUTU_09_H00 }, + { WORLD_EVENT_TYPE_9, 1, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 112, 304, 240, 392, 1736, 1912, CND_1, + LOCAL_BANK_4, SOUGEN_DOUKUTU_0B_T0 }, + { WORLD_EVENT_TYPE_25, 0, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 768, 0, 920, 56, 920, 1752, CND_2, 0, + ITEM_SKILL_FAST_SPIN }, + { WORLD_EVENT_TYPE_25, 1, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, 80, 400, 200, 488, 1688, 1208, + CND_2, 0, ITEM_SKILL_LONG_SPIN }, + { WORLD_EVENT_TYPE_25, 2, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 128, 752, 248, 840, 2744, 1032, CND_2, 0, + ITEM_SKILL_FAST_SPLIT }, + { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_MT_CRENEL, ROOM_MT_CRENEL_TOP, 0, 0, 152, 40, 152, 40, CND_5, LOCAL_BANK_1, + BEANDEMO_00 }, // uses different flags due to CND_5 + { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_BEANSTALK, 432, 0, 552, 88, 3528, 1096, CND_6, + LOCAL_BANK_1, BEANDEMO_01 }, // uses different flags due to CND_6 + { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_RUINS, ROOM_RUINS_BEANSTALK, 0, 0, 72, 72, 312, 2712, CND_7, LOCAL_BANK_1, + BEANDEMO_02 }, // uses different flags due to CND_7 + { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_EASTERN_HILLLS_CENTER, 0, 0, 72, 56, 2568, + 2760, CND_8, LOCAL_BANK_1, BEANDEMO_03 }, // uses different flags due to CND_8 + { WORLD_EVENT_TYPE_BEANSTALK, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_SOUTH, 0, 0, 56, 56, 1064, 3016, + CND_9, LOCAL_BANK_1, BEANDEMO_04 }, // uses different flags due to CND_9 + { WORLD_EVENT_TYPE_11, 0, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 0, 48, 88, 152, 88, 1832, CND_1, LOCAL_BANK_2, + KOBITOANA_09_T0 }, + { WORLD_EVENT_TYPE_11, 1, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 0, 160, 40, 232, 40, 1912, CND_1, LOCAL_BANK_2, + KOBITOANA_0A_T0 }, + { WORLD_EVENT_TYPE_11, 2, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 96, 664, 200, 776, 200, 2456, CND_1, + LOCAL_BANK_2, KOBITOANA_0B_T0 }, + { WORLD_EVENT_TYPE_12, 0, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 624, 784, 760, 952, 2184, 2360, CND_1, + LOCAL_BANK_2, KS_A18 }, + { WORLD_EVENT_TYPE_13, 0, AREA_HOUSE_INTERIORS_4, ROOM_HOUSE_INTERIORS_4_CARPENTER, 0, 32, 120, 112, 1560, 1944, + CND_1, LOCAL_BANK_2, KS_A02 }, + { WORLD_EVENT_TYPE_14, 0, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 768, 736, 904, 824, 2392, 2344, CND_1, + LOCAL_BANK_2, KS_B07 }, + { WORLD_EVENT_TYPE_15, 0, AREA_ROYAL_VALLEY, ROOM_ROYAL_VALLEY_MAIN, 240, 96, 392, 136, 1400, 360, CND_10, + LOCAL_BANK_1, HAKA_BOSEKI_00 }, // uses different flags due to CND_10 + { WORLD_EVENT_TYPE_16, 0, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 768, 160, 736, 232, 2040, 2040, CND_1, + LOCAL_BANK_1, KS_B18 }, + { WORLD_EVENT_TYPE_17, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_LON_LON_RANCH, 0, 800, 136, 856, 2624, 2056, CND_1, + LOCAL_BANK_4, GORON_DOUKUTU_01_T0 }, + { WORLD_EVENT_TYPE_18, 1, AREA_GORON_CAVE, ROOM_GORON_CAVE_MAIN, 0, 464, 120, 440, 2632, 2056, CND_1, LOCAL_BANK_4, + GORON_DOUKUTU_01_T0 }, + { WORLD_EVENT_TYPE_18, 2, AREA_GORON_CAVE, ROOM_GORON_CAVE_MAIN, 0, 288, 120, 280, 2632, 2056, CND_1, LOCAL_BANK_4, + GORON_DOUKUTU_01_T0 }, + { WORLD_EVENT_TYPE_18, 3, AREA_GORON_CAVE, ROOM_GORON_CAVE_MAIN, 0, 288, 120, 280, 2632, 2056, CND_1, LOCAL_BANK_4, + GORON_DOUKUTU_01_T0 }, + { WORLD_EVENT_TYPE_18, 4, AREA_GORON_CAVE, ROOM_GORON_CAVE_MAIN, 0, 144, 120, 136, 2632, 2056, CND_1, LOCAL_BANK_4, + GORON_DOUKUTU_01_T0 }, + { WORLD_EVENT_TYPE_18, 5, AREA_GORON_CAVE, ROOM_GORON_CAVE_MAIN, 0, 144, 120, 136, 2632, 2056, CND_1, LOCAL_BANK_4, + GORON_DOUKUTU_01_T0 }, +#endif + { WORLD_EVENT_TYPE_19, 0, AREA_VEIL_FALLS_TOP, ROOM_VEIL_FALLS_TOP_0, 192, 0, 320, 104, 0, 0, CND_0, 0, 0 }, +#if defined(EU) || defined(JP) || defined(DEMO_JP) + { WORLD_EVENT_TYPE_20, 0, AREA_TREE_INTERIORS, ROOM_TREE_INTERIORS_WITCH_HUT, 0, 0, 120, 56, 3656, 2248, CND_0, 0, + 0 }, + { WORLD_EVENT_TYPE_21, 0, AREA_HOUSE_INTERIORS_3, ROOM_HOUSE_INTERIORS_3_BORLOV_ENTRANCE, 0, 0, 120, 72, 2152, 2152, + CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_22, 0, AREA_HOUSE_INTERIORS_1, ROOM_HOUSE_INTERIORS_1_POST_OFFICE, 0, 0, 72, 56, 1560, 1704, + CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_23, 0, AREA_MINISH_HOUSE_INTERIORS, ROOM_MINISH_HOUSE_INTERIORS_MINISH_WOODS_BOMB, 0, 0, 120, 88, + 3288, 2952, CND_0, 0, 0 }, +#ifdef DEMO_JP + { WORLD_EVENT_TYPE_24, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD, 464, 176, 584, 264, 2072, 2744, + CND_1, LOCAL_BANK_1, 252 }, // TODO +#else + { WORLD_EVENT_TYPE_24, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD, 464, 176, 584, 264, 2072, 2744, + CND_0, 0, 0 }, +#endif +#else + { WORLD_EVENT_TYPE_20, 0, AREA_TREE_INTERIORS, ROOM_TREE_INTERIORS_WITCH_HUT, 0, 0, 120, 56, 3656, 2248, CND_2, 0, + ITEM_BOTTLE_RED_POTION }, + { WORLD_EVENT_TYPE_21, 0, AREA_HOUSE_INTERIORS_3, ROOM_HOUSE_INTERIORS_3_BORLOV_ENTRANCE, 0, 0, 120, 72, 2152, 2152, + CND_1, LOCAL_BANK_2, KS_B16 }, + { WORLD_EVENT_TYPE_22, 0, AREA_HOUSE_INTERIORS_1, ROOM_HOUSE_INTERIORS_1_POST_OFFICE, 0, 0, 72, 56, 1560, 1704, + CND_1, LOCAL_BANK_2, BILL01_TESSIN_8 }, + { WORLD_EVENT_TYPE_23, 0, AREA_MINISH_HOUSE_INTERIORS, ROOM_MINISH_HOUSE_INTERIORS_MINISH_WOODS_BOMB, 0, 0, 120, 88, + 3288, 2952, CND_1, LOCAL_BANK_2, KHOUSE26_REMOCON }, + { WORLD_EVENT_TYPE_24, 0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD, 464, 176, 584, 264, 2072, 2744, + CND_1, LOCAL_BANK_1, KS_A06 }, +#endif + { WORLD_EVENT_TYPE_0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CND_0, 0, 0 }, + { WORLD_EVENT_TYPE_0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CND_0, 0, 0 }, +}; + +// kinstone data + +// const TileEntity gUnk_080FEAC8[] = { +// { NONE, 0, 0, 0, 0x0, 0, 0 }, +// { NONE, 0, 0, 0, 0x0, 0, 0 }, +// { NONE, 0, 0, 0, 0x0, 0, 0 }, +// { NONE, 0, 0, 0, 0x0, 0, 0 }, +// { NONE, 0, 0, 0, 0x0, 0, 0 }, +// { NONE, 0, 0, 0, 0x0, 0, 0 }, +// { NONE, 0, 0, 0, 0x0, 0, 0 }, +// { NONE, 0, 0, 0, 0x0, 0, 0 }, +// { NONE, 0, 0, 0, 0x0, 0, 0 }, +// { NONE, 0, 0, 0, 0x0, 0, 0 }, +// { SMALL_CHEST, 180, 30, 0, 0x0, 0, 0 }, +// { SMALL_CHEST, 166, 92, 113, 0x0, 0, 0 }, +// { SMALL_CHEST, 167, 92, 114, 0x0, 0, 0 }, +// { SMALL_CHEST, 168, 92, 110, 0x0, 0, 0 }, +// { SMALL_CHEST, 181, 92, 114, 0x0, 0, 0 }, +// { SMALL_CHEST, 169, 92, 112, 0x0, 0, 0 }, +// { SMALL_CHEST, 170, 89, 0, 0x0, 0, 0 }, +// { SMALL_CHEST, 171, 63, 200, 0x0, 0, 0 }, +// { SMALL_CHEST, 172, 92, 113, 0x0, 0, 0 }, +// { SMALL_CHEST, 182, 92, 114, 0x0, 0, 0 }, +// { SMALL_CHEST, 183, 101, 0, 0x0, 0, 0 }, +// { SMALL_CHEST, 184, 92, 110, 0x0, 0, 0 }, +// { SMALL_CHEST, 185, 92, 111, 0x0, 0, 0 }, +// { SMALL_CHEST, 186, 92, 112, 0x0, 0, 0 }, +// { SMALL_CHEST, 187, 89, 0, 0x0, 0, 0 }, +// { SMALL_CHEST, 188, 63, 200, 0x0, 0, 0 }, +// { SMALL_CHEST, 189, 92, 112, 0x0, 0, 0 }, +// { SMALL_CHEST, 190, 92, 111, 0x0, 0, 0 }, +// { SMALL_CHEST, 191, 92, 110, 0x0, 0, 0 }, +// { SMALL_CHEST, 192, 63, 200, 0x0, 0, 0 }, +// { SMALL_CHEST, 193, 89, 0, 0x0, 0, 0 }, +// { SMALL_CHEST, 194, 92, 114, 0x0, 0, 0 }, +// { SMALL_CHEST, 195, 92, 113, 0x0, 0, 0 }, +// { SMALL_CHEST, 196, 89, 0, 0x0, 0, 0 }, +// { SMALL_CHEST, 197, 63, 200, 0x0, 0, 0 }, +// { NONE, 0, 0, 0, 0x0, 0, 0 }, +// }; + +// const TileEntity gUnk_080FEAC8[] = { +// { NONE, 0, 0, 0, 0x0, 0, 0 }, +// { NONE, 0, 0, 0, 0x0, 0, 0 }, +// { NONE, 0, 0, 0, 0x0, 0, 0 }, +// { NONE, 0, 0, 0, 0x0, 0, 0 }, +// { NONE, 0, 0, 0, 0x0, 0, 0 }, +// { NONE, 0, 0, 0, 0x0, 0, 0 }, +// { NONE, 0, 0, 0, 0x0, 0, 0 }, +// { NONE, 0, 0, 0, 0x0, 0, 0 }, +// { NONE, 0, 0, 0, 0x0, 0, 0 }, +// { NONE, 0, 0, 0, 0x0, 0, 0 }, +// { SMALL_CHEST, 3,178, 30, 0, 0x0, 0, 0 }, +// { SMALL_CHEST, 166, 92, 113, 0x0, 0, 0 }, +// { SMALL_CHEST, 167, 92, 114, 0x0, 0, 0 }, +// { SMALL_CHEST, 168, 92, 110, 0x0, 0, 0 }, +// { SMALL_CHEST, 179, 92, 114, 0x0, 0, 0 }, +// { SMALL_CHEST, 169, 92, 112, 0x0, 0, 0 }, +// { SMALL_CHEST, 170, 89, 0, 0x0, 0, 0 }, +// { SMALL_CHEST, 171, 63, 200, 0x0, 0, 0 }, +// { SMALL_CHEST, 172, 92, 113, 0x0, 0, 0 }, +// { SMALL_CHEST, 251, 92, 114, 0x0, 0, 0 }, +// { SMALL_CHEST, 180, 101, 0, 0x0, 0, 0 }, +// { SMALL_CHEST, 181, 92, 110, 0x0, 0, 0 }, +// { SMALL_CHEST, 182, 92, 111, 0x0, 0, 0 }, +// { SMALL_CHEST, 183, 92, 112, 0x0, 0, 0 }, +// { SMALL_CHEST, 184, 89, 0, 0x0, 0, 0 }, +// { SMALL_CHEST, 185, 63, 200, 0x0, 0, 0 }, +// { SMALL_CHEST, 186, 92, 112, 0x0, 0, 0 }, +// { SMALL_CHEST, 187, 92, 111, 0x0, 0, 0 }, +// { SMALL_CHEST, 188, 92, 110, 0x0, 0, 0 }, +// { SMALL_CHEST, 189, 63, 200, 0x0, 0, 0 }, +// { SMALL_CHEST, 190, 89, 0, 0x0, 0, 0 }, +// { SMALL_CHEST, 191, 92, 114, 0x0, 0, 0 }, +// { SMALL_CHEST, 192, 92, 113, 0x0, 0, 0 }, +// { SMALL_CHEST, 193, 89, 0, 0x0, 0, 0 }, +// { SMALL_CHEST, 194, 63, 200, 0x0, 0, 0 }, +// { NONE, 0, 0, 0, 0x0, 0, 0 }, +// }; +extern TileEntity gUnk_080FEAC8[]; // TODO differs jp, demo_jp, eu +extern EntityData gUnk_080FEBE8[]; +extern EntityData gUnk_080FEC28[]; +extern EntityData gUnk_080FECC8[]; +extern const EntityData gUnk_080FED18[]; +extern EntityData gUnk_080FED58[]; +// TODO need to find out what gRoomVars.field_0x8c[ptr->entity_idx] is. +extern const void* gUnk_080FED98[]; +// gUnk_080FEDA4 +// gUnk_080FEDDA +// gUnk_080FEDF8 +extern const EntityData gUnk_080FEE18[]; +extern const EntityData gUnk_080FEE38[]; +extern const EntityData gUnk_080FEE48[]; +extern const EntityData gUnk_080FEE58[]; // TODO differs jp, demo_jp, eu +extern EntityData gUnk_080FEE78[]; diff --git a/src/gameOverTask.c b/src/gameOverTask.c new file mode 100644 index 00000000..c56f86b3 --- /dev/null +++ b/src/gameOverTask.c @@ -0,0 +1,240 @@ +/** + * @file gameOverTask.c + * @ingroup Tasks + * + * @brief Game Over Task + */ +#include "common.h" +#include "fade.h" +#include "fileselect.h" +#include "functions.h" +#include "game.h" +#include "main.h" +#include "menu.h" +#include "save.h" +#include "sound.h" +#include "subtask.h" + +typedef void(GameOverState)(void); + +static GameOverState GameOver_Init; +static GameOverState GameOver_FadeIn; +static GameOverState GameOver_TextMove; +static GameOverState GameOver_Update; +static GameOverState GameOver_Exit; + +void DrawGameOverText(void); + +void GameOverTask(void) { + static GameOverState* const sStates[] = { + GameOver_Init, GameOver_FadeIn, GameOver_TextMove, GameOver_Update, GameOver_Exit, + }; + + sStates[gMain.state](); + if (gMain.state != GAMETASK_TRANSITION) { + FlushSprites(); + DrawGameOverText(); + CopyOAM(); + } +} +void switch_state(u32 idx) { + gMain.state = idx; + SetMenuType(0); +} +void GameOver_Init(void) { + if (gFadeControl.active) + return; + sub_08052010(); + gGenericMenu.unk10.a[0] = 80; + gMenu.transitionTimer = 60; + gSave.stats.health = 24; + gMain.field_0x5 = 60; + SoundReq(BGM_GAMEOVER); + SetFadeInverted(4); + gFadeControl.mask = 0xFFFF0001; + switch_state(GAMETASK_INIT); +} +void GameOver_FadeIn(void) { + if (gFadeControl.active) + return; + + if (gMain.field_0x5 == 0) { + if (gGenericMenu.unk10.a[0] >= 38) { + gGenericMenu.unk10.a[0]--; + } else { + gMenu.transitionTimer--; + if (gMenu.transitionTimer == 0) { + switch_state(GAMETASK_MAIN); +#if defined(DEMO_USA) || defined(DEMO_JP) + SoundReq(SONG_VOL_FADE_OUT); + SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 4); +#else + SetPopupState(0, 0); + gScreen.lcd.displayControl |= DISPCNT_BG1_ON | DISPCNT_BG2_ON; + gFadeControl.mask = 0x0000ffff; + SetFade(FADE_INSTANT, 16); +#endif + } + } + } else { + gMain.field_0x5--; + } +} +void GameOver_TextMove(void) { +#if defined(DEMO_USA) || defined(DEMO_JP) + if (gFadeControl.active == 0) { + DoSoftReset(); + } +#else + s32 temp3; + u32 temp2; + + if (gFadeControl.active) + return; + + switch (gMenu.menuType) { + case 0: + gMenu.transitionTimer = 30; + gMenu.field_0x3 = 0; + SetMenuType(1); + SetPopupState(0, 0); + gFadeControl.mask = 0xffffffff; + return; + case 1: + if (gMenu.transitionTimer == 0) { + u32 temp = gMenu.field_0x3; + switch (gInput.newKeys) { + case DPAD_UP: + temp = 0; + break; + case DPAD_DOWN: + temp = 1; + break; + case A_BUTTON: + if (gMenu.field_0x3 != 0) { + temp2 = 4; + } else { + CreateDialogBox(8, 0); + temp2 = 2; + } + gMenu.transitionTimer = 60; + SetMenuType(temp2); + SoundReq(SFX_TEXTBOX_SELECT); + break; + } + if (gMenu.field_0x3 != temp) { + gMenu.field_0x3 = temp; + SetPopupState(0, temp); + SoundReq(SFX_TEXTBOX_CHOICE); + } + return; + } + gMenu.transitionTimer--; + return; + case 2: + temp3 = HandleSave(0); + gMenu.field_0x0 = temp3; + switch (temp3) { + case 1: + SetMenuType(4); + break; + case -1: + gMenu.transitionTimer = 60; + CreateDialogBox(9, 0); + SetMenuType(3); + break; + } + return; + case 3: + if (gMenu.transitionTimer != 0) { + gMenu.transitionTimer--; + } else if (gInput.newKeys & (A_BUTTON | B_BUTTON | START_BUTTON)) { + SetMenuType(0); + } + return; + case 4: + default: + gScreen.lcd.displayControl &= ~DISPCNT_BG1_ON; + sub_08050384(); + switch_state(GAMETASK_EXIT); + return; + } +#endif +} +void GameOver_Update(void) { + switch (gMenu.menuType) { + case 0: + gMenu.transitionTimer = 30; + gMenu.field_0x3 = 0; + SetMenuType(1); + SetPopupState(1, 0); + return; + case 1: + gScreen.lcd.displayControl |= DISPCNT_BG1_ON; + if (gMenu.transitionTimer != 0) { + gMenu.transitionTimer--; + return; + } else { + u32 temp = gMenu.field_0x3; + switch (gInput.newKeys) { + case DPAD_UP: + temp = 0; + break; + case DPAD_DOWN: + temp = 1; + break; + case A_BUTTON: + SetMenuType(2); + SoundReq(SFX_TEXTBOX_SELECT); + if (temp == 0) { + SetFade(FADE_IN_OUT | FADE_INSTANT, 8); + } else { + SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 8); + } + break; + } + if (gMenu.field_0x3 != temp) { + gMenu.field_0x3 = temp; + SetPopupState(1, temp); + SoundReq(SFX_TEXTBOX_CHOICE); + } + } + return; + case 2: + default: + if (gFadeControl.active == 0) { + if (gMenu.field_0x3 == 0) { + SetTask(TASK_GAME); + } else { + DoSoftReset(); + } + } + return; + } +} + +// Unused, since task is set above +// if we got here, it would be a softlock +void GameOver_Exit(void) { +} + +void DrawGameOverText(void) { + static const u8 sOffsets[] = { + 48, 68, 88, 108, 137, 156, 174, 192, + }; + + u32 i; + + gOamCmd._4 = 0; + gOamCmd._6 = 0; + gOamCmd._8 = 0x8600; + gOamCmd.y = gGenericMenu.unk10.a[0]; + for (i = 0; i < 8; ++i) { + gOamCmd.x = sOffsets[i]; +#ifdef EU + DrawDirect(0x1fc, i); +#else + DrawDirect(0x1fd, i); +#endif + } +} diff --git a/src/gameUtils.c b/src/gameUtils.c new file mode 100644 index 00000000..dbc22f8b --- /dev/null +++ b/src/gameUtils.c @@ -0,0 +1,945 @@ +/** + * @file gameUtils.c + * + * @brief Game Utils + */ +#include "backgroundAnimations.h" +#include "enemy.h" +#include "entity.h" +#include "fade.h" +#include "fileselect.h" +#include "functions.h" +#include "game.h" +#include "item.h" +#include "itemMetaData.h" +#include "main.h" +#include "menu.h" +#include "npc.h" +#include "object.h" +#include "save.h" +#include "screen.h" +#include "script.h" +#include "sound.h" +#include "ui.h" + +u32 StairsAreValid(void); +void ClearFlagArray(const u16*); +void DummyHandler(u32* a1); +void sub_08053434(u32* a1); +void sub_080534E4(u32* a1); +void InitAllRoomResInfo(void); +void InitRoomResInfo(RoomResInfo* info, RoomHeader* hdr, u32 area, u32 room); +void sub_080532E4(void); +void ResetTimerFlags(void); + +extern void** gAreaTilesets[]; +extern void** gAreaRoomMaps[]; +extern void* gAreaMetatiles[]; +extern void** gAreaTable[]; + +typedef struct { + u8 dest_off[8]; + u8 _8; + u8 right_align; + u16 _a; +} PopupOption; + +extern u8 gUnk_0200AF14; + +void SetPopupState(u32 type, u32 choice_idx) { + static const Font sDefaultFont = { + .dest = gBG1Buffer, + .gfx_dest = (u16*)0x06006000, + .buffer_loc = gTextGfxBuffer, + ._c = 0, + .gfx_src = 0xD300, + .width = 0xE0, + .right_align = 0, + .sm_border = 0, + .unused = 0, + .draw_border = 0, + .border_type = 0, + .fill_type = 6, + .charColor = 4, + ._16 = 1, + .stylized = 0, + }; + static const PopupOption sPopupOptions[] = { + { { 11, 11, 11, 10, 11, 10, 10, 0 }, 8, 0, 16 }, + { { 10, 11, 11, 9, 11, 9, 9, 0 }, 8, 0, 17 }, + { { 15, 15, 15, 15, 15, 15, 15, 0 }, 5, 1, 13 }, + }; + + Font font; + const PopupOption* opt; + u32 fakematch; + + MemClear(gBG1Buffer, sizeof gBG1Buffer); + gUnk_020227E8[0]._0.WORD = 0xf; + gUnk_020227E8[1]._0.WORD = 0xf; + gUnk_020227E8[2]._0.WORD = 0xf; + gUnk_020227E8[3]._0.WORD = 0xf; + *(&gUnk_020227E8[choice_idx]._0.BYTES.byte0 + 1) = fakematch = 1; + + MemCopy(&sDefaultFont, &font, sizeof font); + opt = &sPopupOptions[type]; + font.dest = sDefaultFont.dest + (opt->dest_off[gSaveHeader->language] + opt->_8 * 32); + font.right_align = opt->right_align; + ShowTextBox(opt->_a, &font); + gScreen.bg1.updated = fakematch; +} + +void InitializePlayer(void) { + static const u8 sPlayerSpawnStates[] = { + [PL_SPAWN_DEFAULT] = PLAYER_INIT, + [PL_SPAWN_MINISH] = PLAYER_MINISH, + [PL_SPAWN_DROP] = PLAYER_INIT, + [PL_SPAWN_WALKING] = PLAYER_ROOMTRANSITION, + [PL_SPAWN_STEP_IN] = PLAYER_ROOM_EXIT, + [PL_SPAWN_SLEEPING] = PLAYER_SLEEP, + [PL_SPAWN_DROP_MINISH] = PLAYER_MINISH, + [PL_SPAWN_STAIRS_ASCEND] = PLAYER_USEENTRANCE, + [PL_SPAWN_STAIRS_DESCEND] = PLAYER_USEENTRANCE, + [PL_SPAWN_9] = PLAYER_MINISH, + [PL_SPAWN_PARACHUTE_FORWARD] = PLAYER_WARP, + [PL_SPAWN_PARACHUTE_UP] = PLAYER_WARP, + [PL_SPAWN_FAST_TRAVEL] = PLAYER_WARP, + }; + + Entity* pl; + + sub_080784C8(); + MemClear(&gActiveItems, sizeof(gActiveItems)); + MemClear(&gPlayerState, sizeof(gPlayerState)); + MemFill32(0xffffffff, &gPlayerState.path_memory, sizeof(gPlayerState.path_memory)); + MemClear(&gPlayerEntity, sizeof(gPlayerEntity)); + + pl = &gPlayerEntity; + + gRoomControls.camera_target = pl; + gPlayerState.queued_action = sPlayerSpawnStates[gRoomTransition.player_status.spawn_type]; + if (!CheckGlobalFlag(EZERO_1ST)) { + gPlayerState.flags |= PL_NO_CAP; + } + switch (gRoomTransition.player_status.spawn_type) { + case PL_SPAWN_DROP: + case PL_SPAWN_DROP_MINISH: + pl->z.HALF.HI = -0xc0; + break; + case PL_SPAWN_STEP_IN: + gPlayerState.field_0x38 = 16; + pl->direction = Direction8FromAnimationState(gRoomTransition.player_status.start_anim); + case PL_SPAWN_WALKING: + pl->speed = 224; + break; + case PL_SPAWN_STAIRS_ASCEND: + case PL_SPAWN_STAIRS_DESCEND: + gPlayerState.field_0x38 = 1; + gPlayerState.field_0x39 = gRoomTransition.player_status.spawn_type; + break; + case PL_SPAWN_PARACHUTE_FORWARD: + gPlayerState.field_0x38 = 1; + break; + case PL_SPAWN_PARACHUTE_UP: + gPlayerState.field_0x38 = 3; + break; + case PL_SPAWN_FAST_TRAVEL: + gPlayerState.field_0x38 = 4; + } + + pl->kind = PLAYER; + pl->flags |= ENT_COLLIDE | ENT_PERSIST; + pl->spritePriority.b0 = 4; + pl->health = gSave.stats.health; + pl->x.HALF.HI = gRoomTransition.player_status.start_pos_x; + pl->y.HALF.HI = gRoomTransition.player_status.start_pos_y; + pl->animationState = gRoomTransition.player_status.start_anim; + pl->collisionLayer = gRoomTransition.player_status.layer; + UpdateSpriteForCollisionLayer(pl); + AppendEntityToList(pl, 1); + RegisterPlayerHitbox(); +} + +bool32 AreaIsOverworld(void) { +#ifdef EU + return gArea.areaMetadata == 0x01; +#else + return gArea.areaMetadata == 0x81; +#endif +} + +bool32 CheckAreaOverworld(u32 area) { +#if EU + return gAreaMetadata[area].flags == 0x01; +#else + return gAreaMetadata[area].flags == 0x81; +#endif +} + +#ifndef EU +bool32 AreaAllowsWarp(void) { + return (gArea.areaMetadata >> 7) & 1; +} +#endif + +bool32 AreaIsDungeon(void) { + return (gArea.areaMetadata >> 2) & 1; +} + +bool32 AreaHasEnemies(void) { + return (gArea.areaMetadata >> 4) & 1; +} + +bool32 AreaHasNoEnemies(void) { + return (gArea.areaMetadata >> 6) & 1; +} + +bool32 AreaHasMap(void) { + return (gArea.areaMetadata >> 3) & 1; +} + +s32 ModHealth(s32 delta) { + s32 newHealth; + Stats* stats = &gSave.stats; + + newHealth = stats->health + delta; + if (newHealth < 0) { + newHealth = 0; + } + if (stats->maxHealth < newHealth) { + newHealth = (u32)stats->maxHealth; + } + stats->health = newHealth; + gPlayerEntity.health = newHealth; + return newHealth; +} + +void ModRupees(s32 delta) { + s32 newRupeeCount; + Stats* s = &gSave.stats; + + newRupeeCount = s->rupees + delta; + if (newRupeeCount < 0) { + newRupeeCount = 0; + } else { + if (newRupeeCount > (u16)gWalletSizes[s->walletType * 2]) { + newRupeeCount = (u16)gWalletSizes[s->walletType * 2]; + } + } + s->rupees = newRupeeCount; +} + +void ModDungeonKeys(s32 keys) { + if (AreaHasKeys()) { + u8* p = &gSave.dungeonKeys[gArea.dungeon_idx]; + if (*p + keys < 0) + *p = 0; + else + *p += keys; + } +} + +bool32 AreaHasKeys(void) { + return (gArea.areaMetadata >> 1) & 1; +} + +bool32 HasDungeonMap(void) { + u32 tmp; + + if (AreaHasKeys()) + tmp = gSave.dungeonKeys[gArea.dungeon_idx]; + return tmp ? 1 : 0; +} + +bool32 HasDungeonCompass(void) { + u32 tmp; + + if (AreaHasKeys()) + tmp = gSave.dungeonItems[gArea.dungeon_idx] & 4; + return tmp ? 1 : 0; +} + +bool32 HasDungeonBigKey(void) { + if (!AreaHasKeys()) + return 0; + return (gSave.dungeonItems[gArea.dungeon_idx] >> 1) & 1; +} + +bool32 HasDungeonSmallKey(void) { + u32 tmp; + + if (!AreaHasKeys()) + return 0; + return gSave.dungeonItems[gArea.dungeon_idx] & 1; +} + +extern u8 gPaletteBufferBackup[]; +void RestoreGameTask(u32 a1) { + LoadGfxGroups(); +#ifndef EU + CleanUpGFXSlots(); +#endif + sub_080ADE24(); + InitUI(TRUE); + sub_0801AE44(a1); + MemCopy(gPaletteBufferBackup, gPaletteBuffer, 1024); + gUsedPalettes = 0xffffffff; +} + +void LoadRoomBgm(void) { + gArea.queued_bgm = gAreaMetadata[gRoomControls.area]._3; + if (CheckLocalFlagByBank(FLAG_BANK_10, LV6_KANE_START)) { + gArea.queued_bgm = BGM_FIGHT_THEME2; + } +} + +#ifndef EU +void sub_08052878(void) { + gArea.bgm = gArea.queued_bgm; + SoundReq(SONG_STOP_ALL); +} + +void sub_0805289C(void) { + gArea.queued_bgm = gArea.bgm; +} +#endif + +bool32 CheckGameOver(void) { + if (gRoomTransition.field_0x4[1]) { + InitFade(); + gMain.state = GAMETASK_EXIT; + gMain.substate = GAMEMAIN_INITROOM; + SetFade(FADE_IN_OUT | FADE_INSTANT, 8); + SoundReq(SONG_STOP_BGM); + return TRUE; + } + return FALSE; +} + +void RoomExitCallback(void) { + if (gArea.transitionManager != NULL && gArea.onExit != NULL) + gArea.onExit(gArea.transitionManager); +} + +bool32 CheckRoomExit(void) { + if (gRoomTransition.transitioningOut && gSave.stats.health != 0 && gPlayerState.framestate != PL_STATE_DIE) { + if (StairsAreValid()) { + gRoomTransition.transitioningOut = 0; + return FALSE; + } + + switch (gRoomTransition.type) { + case TRANSITION_CUT: + SetFade(FADE_IN_OUT | FADE_INSTANT | FADE_MOSAIC, 8); + break; + case TRANSITION_CUT_FAST: + SetFade(FADE_IN_OUT | FADE_INSTANT | FADE_MOSAIC, 3); + break; + case TRANSITION_FADE_WHITE_SLOW: + SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 4); + break; + case TRANSITION_FADE_BLACK_SLOW: + SetFade(FADE_IN_OUT | FADE_INSTANT, 4); + break; + case TRANSITION_FADE_BLACK: + SetFade(FADE_IN_OUT | FADE_INSTANT, 16); + break; + case TRANSITION_FADE_BLACK_FAST: + SetFade(FADE_IN_OUT | FADE_INSTANT, 256); + break; + case TRANSITION_7: + case TRANSITION_FADE_WHITE_FAST: + SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 256); + break; + default: + SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 16); + break; + } + RoomExitCallback(); + gMain.substate = GAMEMAIN_CHANGEAREA; + *(&gMain.pauseInterval + 1) = 1; + return TRUE; + } + return FALSE; +} + +u32 StairsAreValid(void) { + static const u16 sStairTypes[] = { 0x91, PL_SPAWN_STAIRS_ASCEND, 0x92, PL_SPAWN_STAIRS_DESCEND, + 0x93, PL_SPAWN_STAIRS_ASCEND, 0x94, PL_SPAWN_STAIRS_DESCEND, + 0x95, PL_SPAWN_STAIRS_ASCEND, 0x96, PL_SPAWN_STAIRS_DESCEND, + 0x97, PL_SPAWN_STAIRS_ASCEND, 0x98, PL_SPAWN_STAIRS_DESCEND, + 0 }; + + const u16* i; + u32 tgt = gRoomTransition.stairs_idx; + + for (i = sStairTypes; i[0] != 0; i += 2) { + if (tgt == i[0]) { + gPlayerState.queued_action = PLAYER_USEENTRANCE; + gPlayerState.field_0x38 = 0; + gPlayerState.field_0x39 = i[1]; + if (!gRoomTransition.player_status.spawn_type) + gRoomTransition.player_status.spawn_type = i[1]; + return 1; + } + } + return 0; +} + +void InitParachuteRoom(void) { + gRoomTransition.transitioningOut = 1; + gRoomTransition.player_status.start_pos_x = (gPlayerEntity.x.HALF.HI - gRoomControls.origin_x) & 0x3F8; + gRoomTransition.player_status.start_pos_y = (gPlayerEntity.y.HALF.HI - gRoomControls.origin_y) & 0x3F8; + gRoomTransition.player_status.start_anim = 4; + gRoomTransition.player_status.spawn_type = PL_SPAWN_PARACHUTE_FORWARD; + gRoomTransition.player_status.area_next = gRoomControls.area; + gRoomTransition.player_status.room_next = gRoomControls.room - 1; +} + +void InitRoomTransition(void) { + switch (gRoomTransition.type) { + case TRANSITION_CUT: + SetFade(FADE_INSTANT | FADE_MOSAIC, 8); + break; + case TRANSITION_CUT_FAST: + SetFade(FADE_INSTANT | FADE_MOSAIC, 3); + break; + case TRANSITION_FADE_WHITE_SLOW: + SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 4); + break; + case TRANSITION_3: + break; + case TRANSITION_FADE_BLACK_FAST: + SetFade(FADE_IN_OUT | FADE_INSTANT, 256); + break; + case TRANSITION_7: + SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 256); + break; + case TRANSITION_FADE_BLACK: + SetFade(FADE_INSTANT, 16); + break; + case TRANSITION_FADE_WHITE_FAST: + SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 8); + break; + default: + SetFadeInverted(16); + break; + } +} + +bool32 CanDispEzloMessage(void) { + s32 tmp = PL_STATE_WALK; + + if (!(gInput.heldKeys & SELECT_BUTTON) || gPlayerState.controlMode != CONTROL_ENABLED || + gPauseMenuOptions.disabled || gUnk_0200AF00.unk_1) + return FALSE; + + if ((gPlayerState.flags & (PL_NO_CAP | PL_CAPTURED | PL_DISABLE_ITEMS)) || (gPlayerState.framestate_last > tmp) || + gPlayerState.item || gPlayerEntity.field_0x7a.HWORD) + return FALSE; + + if ((gPlayerEntity.z.HALF.HI & 0x8000) && !gPlayerState.field_0xa) + return FALSE; + + GenerateAreaHint(); + ForceSetPlayerState(PL_STATE_TALKEZLO); + SetPlayerEventPriority(); + return TRUE; +} + +void DisplayEzloMessage(void) { + u32 height; + u32 idx; +#if defined(JP) || defined(EU) + idx = 0x10; +#else + idx = 0x11; +#endif + + if (gRoomTransition.player_status.field_0x24[idx] == 0) { + height = gPlayerEntity.y.HALF.HI - gRoomControls.scroll_y > 96 ? 1 : 13; + } else { + height = gRoomTransition.player_status.field_0x24[idx]; + } + MessageAtHeight(gRoomTransition.hint_idx, height); +} + +#if defined(USA) || defined(DEMO_USA) || defined(DEMO_JP) +void CreateMiscManager(void) { + Entity* e = NULL; + + if (gRoomTransition.player_status.field_0x24[13]) + return; + gRoomTransition.player_status.field_0x24[13] = 1; +#ifndef DEMO_JP + gRoomTransition.player_status.field_0x24[10] = gArea.locationIndex; +#endif + e = (Entity*)GetEmptyManager(); + if (e == NULL) + return; + e->kind = MANAGER; + e->id = MISC_MANAGER; + e->type = 15; + AppendEntityToList(e, 0); +} +#endif + +void DecreasePortalTimer(void) { + if (gArea.portal_mode == 0) + gArea.portal_timer = 0; + if (gArea.portal_timer) { + gArea.portal_timer--; + gArea.portal_mode = 0; + } +} + +void UpdatePlayerMapCoords(void) { + if (!AreaHasNoEnemies()) { + if (AreaIsOverworld()) { + gRoomTransition.player_status.overworld_map_x = gPlayerEntity.x.HALF_U.HI; + gRoomTransition.player_status.overworld_map_y = gPlayerEntity.y.HALF_U.HI; + } else if (AreaIsDungeon()) { + gRoomTransition.player_status.dungeon_map_x = gPlayerEntity.x.HALF.HI; + gRoomTransition.player_status.dungeon_map_y = gPlayerEntity.y.HALF.HI; + } + } +} + +void SetWorldMapPos(u32 area, u32 room, u32 x, u32 y) { + RoomHeader* hdr = gAreaRoomHeaders[area] + room; + gRoomTransition.player_status.overworld_map_x = hdr->map_x + x; + gRoomTransition.player_status.overworld_map_y = hdr->map_y + y; +} + +void SetDungeonMapPos(u32 area, u32 room, u32 x, u32 y) { + RoomHeader* hdr = gAreaRoomHeaders[area] + room; + gRoomTransition.player_status.dungeon_map_x = hdr->map_x + x; + gRoomTransition.player_status.dungeon_map_y = hdr->map_y + y; +} + +void InitRoom(void) { + AreaHeader* a_hdr = NULL; + + MemClear(&gArea, sizeof gArea); + a_hdr = &gAreaMetadata[gRoomControls.area]; + gArea.areaMetadata = a_hdr->flags; + gArea.locationIndex = a_hdr->location; + gArea.dungeon_idx = a_hdr->location - 23; + gArea.localFlagOffset = gLocalFlagBanks[a_hdr->flag_bank]; + gArea.flag_bank = a_hdr->flag_bank; + gArea.portal_timer = 180; + gArea.lightLevel = 256; + InitRoomTransition(); + InitAllRoomResInfo(); +} + +u32 GetFlagBankOffset(u32 idx) { + AreaHeader* a_hdr = &gAreaMetadata[idx]; + return gLocalFlagBanks[a_hdr->flag_bank]; +} + +void RegisterTransitionManager(void* mgr, void (*onEnter)(), void (*onExit)()) { + if (gMain.substate != GAMEMAIN_SUBTASK) { + gArea.transitionManager = mgr; + gArea.onEnter = onEnter; + gArea.onExit = onExit; + } +} + +void InitAllRoomResInfo(void) { + RoomHeader* r_hdr = gAreaRoomHeaders[gRoomControls.area]; + RoomResInfo* info = gArea.roomResInfos; + u32 i; + for (i = 0; i < MAX_ROOMS && *(u16*)r_hdr != 0xFFFF; i++, r_hdr++) { + if (r_hdr->tileset_id != 0xFFFF) + InitRoomResInfo(info, r_hdr, gRoomControls.area, i); + info++; + } + gArea.pCurrentRoomInfo = GetCurrentRoomInfo(); +} + +void InitRoomResInfo(RoomResInfo* info, RoomHeader* r_hdr, u32 area, u32 room) { + info->map_x = r_hdr->map_x; + info->map_y = r_hdr->map_y; + info->pixel_width = r_hdr->pixel_width; + info->pixel_height = r_hdr->pixel_height; + info->tileset = *(gAreaTilesets[area] + r_hdr->tileset_id); + info->map = *(gAreaRoomMaps[area] + room); + info->metatiles = gAreaMetatiles[area]; + info->bg_anim = (void*)gUnk_080B755C[area]; + info->exits = gExitLists[area][room]; + if (gAreaTable[area] != NULL) { + info->properties = *(gAreaTable[area] + room); + } +} + +RoomResInfo* GetCurrentRoomInfo(void) { + return &gArea.roomResInfos[gRoomControls.room]; +} + +void sub_08052EA0(void) { + MemClear(&gRoomVars, sizeof gRoomVars); + gRoomVars.unk_10[0] = -1; + gRoomVars.unk_10[1] = gRoomVars.unk_10[0]; + gRoomVars.unk_10[2] = gRoomVars.unk_10[0]; + gRoomVars.unk_10[3] = gRoomVars.unk_10[0]; + gRoomVars.lightLevel = 256; + gArea.locationIndex = gAreaMetadata[gRoomControls.area].location; + UpdateRoomTracker(); + InitScriptData(); + sub_08054524(); + sub_080186D4(); + sub_0806F364(); + UpdateGlobalProgress(); +} + +u32 sub_08052EF4(s32 idx) { + AreaHeader* a_hdr = NULL; + u32 i = idx < 0 ? gRoomControls.area : idx; + a_hdr = &gAreaMetadata[i]; + return gLocalFlagBanks[a_hdr->flag_bank]; +} + +/** + * @brief If enabled, this type of transition does not change the room + * and keeps all entities. + */ +void UpdateFakeScroll(void) { + u32 x, y; + LinkedList* ll; + Entity* e; + + if (gArea.unk_0c_0 == 0 || !gRoomVars.field_0x0) + return; + + y = 0; + x = 0; + + // WTF? + switch (gRoomControls.scroll_direction) { + case 0: + y = gArea.pCurrentRoomInfo->pixel_height; + case 1: + y = gArea.pCurrentRoomInfo->pixel_height; + case 2: + y = gArea.pCurrentRoomInfo->pixel_height; + case 3: + x = gArea.pCurrentRoomInfo->pixel_width; + } + + gArea.pCurrentRoomInfo->map_x += x; + gArea.pCurrentRoomInfo->map_y += y; + gRoomControls.origin_x += x; + gRoomControls.origin_y += y; + gRoomControls.scroll_x += x; + gRoomControls.scroll_y += y; + + ll = gEntityLists; + do { + for (e = ll->first; e != (Entity*)ll; e = e->next) { + if (e->kind != MANAGER) { + e->x.HALF.HI += x; + e->y.HALF.HI += y; + } + } + } while (++ll < gEntityLists + 9); +} + +void LoadAuxiliaryRoom(u32 area, u32 room) { + sub_08052FF4(area, room); + gRoomControls.camera_target = NULL; + CloneMapData(); + InitializeCamera(); +} + +void sub_08052FF4(u32 area, u32 room) { + RoomHeader* r_hdr = NULL; + + ClearTilemaps(); + SetBGDefaults(); + gRoomControls.area = area; + gRoomControls.room = room; + gScreen.lcd.displayControl = 0x1740; + MemClear(&gArea.currentRoomInfo, sizeof gArea.currentRoomInfo); + gArea.pCurrentRoomInfo = &gArea.currentRoomInfo; + r_hdr = gAreaRoomHeaders[area] + room; + gArea.currentRoomInfo.map_x = r_hdr->map_x; + gArea.currentRoomInfo.map_y = r_hdr->map_y; + gArea.currentRoomInfo.pixel_width = r_hdr->pixel_width; + gArea.currentRoomInfo.pixel_height = r_hdr->pixel_height; + gArea.currentRoomInfo.tileset = *(gAreaTilesets[area] + r_hdr->tileset_id); + gArea.currentRoomInfo.map = *(gAreaRoomMaps[area] + room); + gArea.currentRoomInfo.metatiles = gAreaMetatiles[area]; + gArea.currentRoomInfo.bg_anim = (void*)gUnk_080B755C[area]; +} + +void ChangeLightLevel(s32 lightLevel) { + lightLevel += gRoomVars.lightLevel; + if (lightLevel < 0) + lightLevel = 0; + if (lightLevel > 256) + lightLevel = 256; + gRoomVars.lightLevel = lightLevel; +} + +void sub_080530B0(void) { + static const u16 sMinecartData[] = { 0x189, 0x0, 0x102, 0x4, 0x1af, 0x0, 0x204, 0x0, + 0x1cf, 0x0, 0x10, 0x4, 0x0, 0x0, 0x0, 0x0 }; + + MemCopy(sMinecartData, gRoomTransition.minecart_data, sizeof sMinecartData); +} + +void UpdateGlobalProgress(void) { + u8 pcnt = 1; + if (CheckLocalFlagByBank(FLAG_BANK_3, SEIIKI_STAINED_GLASS)) { + pcnt = 9; + } else if (CheckGlobalFlag(LV5_CLEAR)) { + pcnt = 8; + } else if (CheckLocalFlagByBank(FLAG_BANK_3, OUBO_KAKERA)) { + pcnt = 7; + } else if (CheckGlobalFlag(LV4_CLEAR)) { + pcnt = 6; + } else if (CheckGlobalFlag(LV3_CLEAR)) { + pcnt = 5; + } else if (CheckLocalFlagByBank(FLAG_BANK_1, SOUGEN_08_TORITSUKI)) { + pcnt = 4; + } else if (CheckGlobalFlag(LV1_CLEAR)) { + pcnt = 2; + } + gSave.global_progress = pcnt; +} + +u32 sub_08053144(void) { + u32 ret; + + if (CheckGlobalFlag(ENDING)) + return 0; + ret = 0; + if (gArea.locationIndex != 0) + ret = !!(gRoomTransition.player_status.field_0x24[10] ^ gArea.locationIndex); + return ret; +} + +void CheckAreaDiscovery(void) { + if (!sub_08053144()) + return; + + gRoomTransition.player_status.field_0x24[10] = gArea.locationIndex; + + if (!CheckGlobalFlag(TABIDACHI)) + return; + + if (!CheckGlobalFlag(ENDING)) { + Entity* e = (Entity*)GetEmptyManager(); + if (e != NULL) { + e->kind = MANAGER; + e->id = ENTER_ROOM_TEXTBOX_MANAGER; + AppendEntityToList(e, 8); + if (!gRoomVars.field_0x0 && !ReadBit(gSave.areaVisitFlags, gArea.locationIndex)) { + e->type2 = 1; + SetPlayerControl(3); + SetInitializationPriority(); + } + } + } + WriteBit(gSave.areaVisitFlags, gArea.locationIndex); +} + +void UpdatePlayerRoomStatus(void) { + gPlayerState.startPosX = gPlayerEntity.x.HALF.HI; + gPlayerState.startPosY = gPlayerEntity.y.HALF.HI; + if (sub_08053144()) { + MemCopy(&gRoomTransition.player_status, &gSave.saved_status, sizeof gRoomTransition.player_status); + if (AreaIsDungeon()) { + gRoomTransition.player_status.dungeon_area = gRoomControls.area; + gRoomTransition.player_status.dungeon_room = gRoomControls.room; + gRoomTransition.player_status.dungeon_x = gPlayerEntity.x.HALF.HI; + gRoomTransition.player_status.dungeon_y = gPlayerEntity.y.HALF.HI; + } + } +} + +void sub_08053250(void) { + gRoomTransition.player_status.spawn_type = PL_SPAWN_DEFAULT; + gRoomTransition.player_status.start_pos_x = gPlayerEntity.x.HALF.HI - gRoomControls.origin_x; + gRoomTransition.player_status.start_pos_y = gPlayerEntity.y.HALF.HI - gRoomControls.origin_y; + gRoomTransition.player_status.start_anim = gPlayerEntity.animationState; + gRoomTransition.player_status.layer = gPlayerEntity.collisionLayer; + gRoomTransition.player_status.area_next = gRoomControls.area; + gRoomTransition.player_status.room_next = gRoomControls.room; + MemCopy(&gRoomTransition.player_status, &gSave.saved_status, sizeof gRoomTransition.player_status); +} + +void sub_0805329C(void) { + if (sub_08053144()) { + switch (gRoomControls.area) { + case AREA_DEEPWOOD_SHRINE: + gSave.unk7 = 0; + break; + case AREA_CAVE_OF_FLAMES: + sub_080530B0(); + break; + case AREA_OUTER_FORTRESS_OF_WINDS: + sub_080532E4(); + break; + default: + ResetTimerFlags(); + break; + } + } +} + +void sub_080532E4(void) { + s32 x, y; + + RoomHeader* r_hdr = gAreaRoomHeaders[AREA_FORTRESS_OF_WINDS] + 33; + + gRoomTransition.player_status.dungeon_area = AREA_FORTRESS_OF_WINDS; + gRoomTransition.player_status.dungeon_room = 33; + + gRoomTransition.player_status.dungeon_x = r_hdr->map_x + r_hdr->pixel_width / 2; + gRoomTransition.player_status.dungeon_map_x = gRoomTransition.player_status.dungeon_x; + gRoomTransition.player_status.dungeon_y = r_hdr->map_y + r_hdr->pixel_height + 0xa0; + gRoomTransition.player_status.dungeon_map_y = gRoomTransition.player_status.dungeon_y; +} + +void LoadGfxGroups(void) { + MemClear(&gBG0Buffer, sizeof gBG0Buffer); + MemClear(&gBG1Buffer, sizeof gBG1Buffer); + MemClear(&gBG2Buffer, sizeof gBG2Buffer); + MemClear(&gBG3Buffer, sizeof gBG3Buffer); + LoadGfxGroup(16); + LoadGfxGroup(23); + if (gRoomControls.area == AREA_CASTOR_WILDS) + LoadGfxGroup(26); + LoadItemGfx(); + LoadPaletteGroup(11); + LoadPaletteGroup(12); + SetColor(0, 0); +} + +void LoadItemGfx(void) { + LoadGfxGroup(GetInventoryValue(ITEM_REMOTE_BOMBS) ? 24 : 25); + if (GetInventoryValue(ITEM_LIGHT_ARROW)) + LoadGfxGroup(29); + LoadGfxGroup(GetInventoryValue(ITEM_MAGIC_BOOMERANG) ? 28 : 27); +} + +extern u16 gUnk_020178E0[]; +void sub_080533CC(void) { + u16* p1 = gUnk_020178E0; + u16* p2 = gUnk_020178E0 - 0x100; + *p2++ = *p1++; + *p2++ = *p1++; + *p2++ = *p1++; + *p2++ = *p1++; + *p2++ = *p1++; + gUsedPalettes |= 8; +} + +void UpdateTimerCallbacks(void) { + static void (*const sHandlers[])(u32*) = { + sub_08053434, DummyHandler, sub_080534E4, DummyHandler, DummyHandler, DummyHandler, DummyHandler, DummyHandler, + }; + + u32* p; + u32 i; + + p = gSave.timers; + for (i = 0; i < 8; i++, p++) { + (sHandlers[i])(p); + } +} + +void DummyHandler(u32* a1) { +} + +void sub_08053434(u32* a1) { + if (gArea.locationIndex == 29 && *a1) { + if (!--*a1) { + ResetTimerFlags(); + MenuFadeIn(5, 6); + } + } +} + +void ResetTimerFlags(void) { + static const u16 sClearFlags[] = { + FLAG_BANK_10, LV6_GUFUU1_GISHIKI, // + FLAG_BANK_10, LV6_GUFUU1_DEMO, // + FLAG_BANK_10, LV6_ZELDA_DISCURSE, // + FLAG_BANK_10, LV6_00_ESCAPE, // + FLAG_BANK_10, LV6_GUFUU2_DEAD, // + FLAG_BANK_G, ENDING, // + FLAG_BANK_10, LV6_KANE_START, // + FLAG_BANK_10, LV6_KANE_1ST, // + FLAG_BANK_10, LV6_KANE_2ND, // + FLAG_BANK_10, LV6_SOTO_ENDING, // + 0xFFFF, + }; + + gSave.timers[0] = 0; + if (CheckLocalFlagByBank(FLAG_BANK_10, LV6_ZELDA_DISCURSE)) + ClearGlobalFlag(ZELDA_CHASE); + ClearFlagArray(sClearFlags); +} + +void StartDarkNutTimer(void) { + gSave.timers[0] = 10800; +} + +void sub_080534AC(void) { + if (CheckLocalFlagByBank(FLAG_BANK_10, LV6_KANE_START)) { + ClearLocalFlagByBank(FLAG_BANK_10, LV6_KANE_START); + gSave.timers[0] = 0; + SoundReq(SONG_STOP_BGM); + } +} + +void sub_080534E4(u32* a1) { + if (gRoomControls.area != AREA_VEIL_FALLS_TOP) { + if (*a1) + --*a1; + } +} + +void InitBiggoronTimer(void) { + gSave.timers[2] = 36000; +} + +void ResetTmpFlags(void) { + static const u16 sClearFlags[] = { + FLAG_BANK_2, BILL00_SHICHOU_00, // + FLAG_BANK_2, BILL0A_YADO_TAKARA_00, // + FLAG_BANK_2, BILL0C_SCHOOLR_00, // + FLAG_BANK_1, MACHI00_00, // + FLAG_BANK_1, MACHI00_02, // + FLAG_BANK_2, MHOUSE06_00, // + FLAG_BANK_2, MHOUSE14_00, // + FLAG_BANK_2, MHOUSE2_00_02, // + FLAG_BANK_2, MHOUSE2_01_T0, // + FLAG_BANK_2, MHOUSE2_02_KAME, // + FLAG_BANK_2, SHOP00_ITEM_01, // + FLAG_BANK_2, SHOP01_CAFE_01, // + 0xFFFF, + }; + + ResetTimerFlags(); + ClearFlagArray(sClearFlags); + + if (!CheckGlobalFlag(WATERBEAN_PUT)) + ClearGlobalFlag(WATERBEAN_OUT); + if (!GetInventoryValue(ITEM_EARTH_ELEMENT)) + ClearGlobalFlag(LV1_CLEAR); + if (!GetInventoryValue(ITEM_FIRE_ELEMENT)) + ClearGlobalFlag(LV2_CLEAR); + if (!GetInventoryValue(ITEM_WATER_ELEMENT)) + ClearGlobalFlag(LV4_CLEAR); +} + +void ClearFlagArray(const u16* p) { + const u16* i; + + for (i = p; i[0] != 0xFFFF; i += 2) + ClearLocalFlagByBank(i[0], i[1]); +} diff --git a/src/itemMetaData.c b/src/itemMetaData.c index ec3e1fe8..0a0d7af7 100644 --- a/src/itemMetaData.c +++ b/src/itemMetaData.c @@ -1,4 +1,4 @@ -#include "global.h" +#include "game.h" #include "itemMetaData.h" #include "item.h" #include "message.h" @@ -123,3 +123,143 @@ const ItemMetaData gItemMetaData[] = { [ITEM_SKILL_FAST_SPLIT] = { 0x63u, 0u, 0u, 0x2u, 0x74u, TEXT_ITEM_GET, 0x74u, 0x5u }, [ITEM_SKILL_LONG_SPIN] = { 0x63u, 0u, 0u, 0x2u, 0x75u, TEXT_ITEM_GET, 0x75u, 0x5u }, }; + +// TODO Shop price and item get message +const struct_080FD964 gUnk_080FD964[] = { + [ITEM_NONE] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x1) }, + [ITEM_SMITH_SWORD] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x1) }, + [ITEM_GREEN_SWORD] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x2) }, + [ITEM_RED_SWORD] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x3) }, + [ITEM_BLUE_SWORD] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x4) }, + [ITEM_UNUSED_SWORD] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x5) }, + [ITEM_FOURSWORD] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x6) }, + [ITEM_BOMBS] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x1c) }, + [ITEM_REMOTE_BOMBS] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x8) }, + [ITEM_BOW] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x9) }, + [ITEM_LIGHT_ARROW] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0xa) }, + [ITEM_BOOMERANG] = { 300, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x24), TEXT_INDEX(TEXT_ITEM_GET, 0xb) }, + [ITEM_MAGIC_BOOMERANG] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0xc) }, + [ITEM_SHIELD] = { 40, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x02), TEXT_INDEX(TEXT_ITEM_GET, 0x1d) }, + [ITEM_MIRROR_SHIELD] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0xe) }, + [ITEM_LANTERN_OFF] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0xf) }, + [ITEM_LANTERN_ON] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x10) }, + [ITEM_GUST_JAR] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x11) }, + [ITEM_PACCI_CANE] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x12) }, + [ITEM_MOLE_MITTS] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x13) }, + [ITEM_ROCS_CAPE] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x14) }, + [ITEM_PEGASUS_BOOTS] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x15) }, + [ITEM_FIRE_ROD] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x16) }, + [ITEM_OCARINA] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x17) }, + [ITEM_ORB_GREEN] = { 0, 0, 0x0, 0x0 }, + [ITEM_ORB_BLUE] = { 0, 0, 0x0, 0x0 }, + [ITEM_ORB_RED] = { 0, 0, 0x0, 0x0 }, + [ITEM_TRY_PICKUP_OBJECT] = { 0, 0, 0x0, 0x0 }, + [ITEM_BOTTLE1] = { 100, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x20) }, + [ITEM_BOTTLE2] = { 100, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x06), TEXT_INDEX(TEXT_ITEM_GET, 0x20) }, + [ITEM_BOTTLE3] = { 100, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x20) }, + [ITEM_BOTTLE4] = { 100, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x20) }, + [ITEM_BOTTLE_EMPTY] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x20) }, + [ITEM_BOTTLE_BUTTER] = { 120, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x21) }, + [ITEM_BOTTLE_MILK] = { 100, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x22) }, + [ITEM_BOTTLE_HALF_MILK] = { 60, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x23) }, + [ITEM_BOTTLE_RED_POTION] = { 150, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x24) }, + [ITEM_BOTTLE_BLUE_POTION] = { 60, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x25) }, + [ITEM_BOTTLE_WATER] = { 1, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x26) }, + [ITEM_BOTTLE_MINERAL_WATER] = { 5, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x27) }, + [ITEM_BOTTLE_FAIRY] = { 7, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x28) }, +#ifdef EU + [ITEM_BOTTLE_PICOLYTE_RED] = { 100, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x01), TEXT_INDEX(TEXT_ITEM_GET, 0x29) }, + [ITEM_BOTTLE_PICOLYTE_ORANGE] = { 300, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x06), TEXT_INDEX(TEXT_ITEM_GET, 0x2a) }, + [ITEM_BOTTLE_PICOLYTE_YELLOW] = { 200, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x04), TEXT_INDEX(TEXT_ITEM_GET, 0x2b) }, + [ITEM_BOTTLE_PICOLYTE_GREEN] = { 100, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x03), TEXT_INDEX(TEXT_ITEM_GET, 0x2c) }, + [ITEM_BOTTLE_PICOLYTE_BLUE] = { 200, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x05), TEXT_INDEX(TEXT_ITEM_GET, 0x2d) }, + [ITEM_BOTTLE_PICOLYTE_WHITE] = { 100, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x02), TEXT_INDEX(TEXT_ITEM_GET, 0x2e) }, +#else + [ITEM_BOTTLE_PICOLYTE_RED] = { 200, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x01), TEXT_INDEX(TEXT_ITEM_GET, 0x29) }, + [ITEM_BOTTLE_PICOLYTE_ORANGE] = { 200, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x06), TEXT_INDEX(TEXT_ITEM_GET, 0x2a) }, + [ITEM_BOTTLE_PICOLYTE_YELLOW] = { 200, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x04), TEXT_INDEX(TEXT_ITEM_GET, 0x2b) }, + [ITEM_BOTTLE_PICOLYTE_GREEN] = { 200, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x03), TEXT_INDEX(TEXT_ITEM_GET, 0x2c) }, + [ITEM_BOTTLE_PICOLYTE_BLUE] = { 200, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x05), TEXT_INDEX(TEXT_ITEM_GET, 0x2d) }, + [ITEM_BOTTLE_PICOLYTE_WHITE] = { 200, 0, TEXT_INDEX(TEXT_PICOLYTE, 0x02), TEXT_INDEX(TEXT_ITEM_GET, 0x2e) }, +#endif + [BOTTLE_CHARM_NAYRU] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x2f) }, + [BOTTLE_CHARM_FARORE] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x30) }, + [BOTTLE_CHARM_DIN] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x31) }, + [ITEM_32] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x32) }, + [ITEM_33] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x33) }, + [ITEM_QST_SWORD] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x34) }, + [ITEM_QST_BROKEN_SWORD] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x35) }, + [ITEM_QST_DOGFOOD] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x36) }, + [ITEM_QST_LONLON_KEY] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x37) }, + [ITEM_QST_MUSHROOM] = { 60, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x38) }, + [ITEM_QST_BOOK1] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x39) }, + [ITEM_QST_BOOK2] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x3a) }, + [ITEM_QST_BOOK3] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x3b) }, + [ITEM_QST_GRAVEYARD_KEY] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x3d) }, + [ITEM_QST_TINGLE_TROPHY] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x95) }, + [ITEM_QST_CARLOV_MEDAL] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x96) }, + [ITEM_SHELLS] = { 15, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x05), TEXT_INDEX(TEXT_ITEM_GET, 0x77) }, + [ITEM_EARTH_ELEMENT] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x40) }, + [ITEM_FIRE_ELEMENT] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x41) }, + [ITEM_WATER_ELEMENT] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x42) }, + [ITEM_WIND_ELEMENT] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x43) }, + [ITEM_GRIP_RING] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x44) }, + [ITEM_POWER_BRACELETS] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x45) }, + [ITEM_FLIPPERS] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x46) }, + [ITEM_MAP] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x47) }, + [ITEM_SKILL_SPIN_ATTACK] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x48) }, + [ITEM_SKILL_ROLL_ATTACK] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x49) }, + [ITEM_SKILL_DASH_ATTACK] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x4a) }, + [ITEM_SKILL_ROCK_BREAKER] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x4b) }, + [ITEM_SKILL_SWORD_BEAM] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x4c) }, + [ITEM_SKILL_GREAT_SPIN] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x4d) }, + [ITEM_SKILL_DOWN_THRUST] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x4e) }, + [ITEM_SKILL_PERIL_BEAM] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x4f) }, + [ITEM_DUNGEON_MAP] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x50) }, + [ITEM_COMPASS] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x51) }, + [ITEM_BIG_KEY] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x52) }, + [ITEM_SMALL_KEY] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x53) }, + [ITEM_RUPEE1] = { 1, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x54) }, + [ITEM_RUPEE5] = { 5, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x55) }, + [ITEM_RUPEE20] = { 20, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x56) }, + [ITEM_RUPEE50] = { 50, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x57) }, + [ITEM_RUPEE100] = { 100, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x58) }, + [ITEM_RUPEE200] = { 200, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x59) }, + [ITEM_5A] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x5a) }, + [ITEM_JABBERNUT] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x5b) }, + [ITEM_KINSTONE] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x5c) }, + [ITEM_BOMBS5] = { 15, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x5d) }, + [ITEM_ARROWS5] = { 15, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x5e) }, + [ITEM_HEART] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x5f) }, + [ITEM_FAIRY] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x60) }, +#ifdef EU + [ITEM_SHELLS30] = { 300, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x05), TEXT_INDEX(TEXT_ITEM_GET, 0x76) }, +#else + [ITEM_SHELLS30] = { 200, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x05), TEXT_INDEX(TEXT_ITEM_GET, 0x76) }, +#endif + [ITEM_HEART_CONTAINER] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x62) }, + [ITEM_HEART_PIECE] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x18) }, + [ITEM_WALLET] = { 80, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x04), TEXT_INDEX(TEXT_ITEM_GET, 0x64) }, +#ifdef EU + [ITEM_BOMBBAG] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x07) }, +#else + [ITEM_BOMBBAG] = { 600, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x25), TEXT_INDEX(TEXT_ITEM_GET, 0x63) }, +#endif + [ITEM_LARGE_QUIVER] = { 600, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x07), TEXT_INDEX(TEXT_ITEM_GET, 0x66) }, + [ITEM_KINSTONE_BAG] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x67) }, + [ITEM_BRIOCHE] = { 20, 0, TEXT_INDEX(TEXT_BAKERY, 0x01), TEXT_INDEX(TEXT_ITEM_GET, 0x68) }, + [ITEM_CROISSANT] = { 30, 0, TEXT_INDEX(TEXT_BAKERY, 0x0a), TEXT_INDEX(TEXT_ITEM_GET, 0x69) }, + [ITEM_PIE] = { 40, 0, TEXT_INDEX(TEXT_BAKERY, 0x0b), TEXT_INDEX(TEXT_ITEM_GET, 0x6a) }, + [ITEM_CAKE] = { 60, 0, TEXT_INDEX(TEXT_BAKERY, 0x0c), TEXT_INDEX(TEXT_ITEM_GET, 0x6b) }, + [ITEM_BOMBS10] = { 30, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x03), TEXT_INDEX(TEXT_ITEM_GET, 0x91) }, + [ITEM_BOMBS30] = { 80, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x09), TEXT_INDEX(TEXT_ITEM_GET, 0x92) }, + [ITEM_ARROWS10] = { 20, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x08), TEXT_INDEX(TEXT_ITEM_GET, 0x93) }, + [ITEM_ARROWS30] = { 50, 0, TEXT_INDEX(TEXT_STOCKWELL, 0x0a), TEXT_INDEX(TEXT_ITEM_GET, 0x94) }, + [ITEM_ARROW_BUTTERFLY] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x70) }, + [ITEM_DIG_BUTTERFLY] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x71) }, + [ITEM_SWIM_BUTTERFLY] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x72) }, + [ITEM_SKILL_FAST_SPIN] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x73) }, + [ITEM_SKILL_FAST_SPLIT] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x74) }, + [ITEM_SKILL_LONG_SPIN] = { 0, 0, 0x0, TEXT_INDEX(TEXT_ITEM_GET, 0x75) }, + +}; diff --git a/src/itemUtils.c b/src/itemUtils.c new file mode 100644 index 00000000..36ed6bbf --- /dev/null +++ b/src/itemUtils.c @@ -0,0 +1,591 @@ +/** + * @file itemUtils.c + * + * @brief Item Utils + */ +#include "item.h" +#include "game.h" +#include "itemMetaData.h" +#include "sound.h" +#include "save.h" +#include "object.h" +#include "enemy.h" +#include "message.h" + +const s16 gWalletSizes[] = { 100, -4000, 300, -3996, 500, -3992, 999, -3988 }; +const u8 gBombBagSizes[] = { + 10, + 30, + 50, + 99, +}; +const u8 gQuiverSizes[] = { + 30, + 50, + 70, + 99, +}; +const u16 gUnk_080FD5A8[] = { 1, 5, 20, 50, 100, 200 }; + +u32 GetSaleItemConfirmMessageID(u32 item) { + const struct_080FD964* ptr = &gUnk_080FD964[item]; + return ptr->saleItemConfirmMessageId; +} + +s32 GetItemPrice(u32 item) { + const struct_080FD964* ptr = &gUnk_080FD964[item]; + return ptr->itemPrice; +} + +u32 GiveItem(Item item, u32 param_2) { + u32 uVar4; + u32 result; + u32 uVar9; + const ItemMetaData* metaData; + + uVar4 = GetInventoryValue(item); + metaData = &gItemMetaData[item]; + + if (uVar4 == 0) { + result = *(u16*)&metaData->textId; + } else { + result = *(u16*)&metaData->unk6; + } + if (!ItemIsBottle(item)) { + PutItemOnSlot(item); + if (uVar4 == 0) { + SetInventoryValue(item, 1); + } + } + switch (metaData->unk1) { + case 0: + default: + break; + case 1: + ModHealth(metaData->unk2); + SoundReq(SFX_HEART_GET); + break; + case 2: + ModRupees((u32)gUnk_080FD5A8[metaData->unk2]); + SoundReq(SFX_RUPEE_GET); + break; + case 3: + uVar9 = 0; + while (TRUE) { + if (3 < uVar9) { + return result; + } + if (GetInventoryValue(ITEM_BOTTLE1 + uVar9) == 0) + break; + uVar9++; + } + item = ITEM_BOTTLE1 + uVar9; + if (gSave.stats.bottles[uVar9] == 0) { + gSave.stats.bottles[uVar9] = 0x20; + } + SetInventoryValue(item, 1); + PutItemOnSlot(item); + break; + case 4: + uVar9 = 0; + while (gSave.stats.bottles[uVar9] != 0x20) { + uVar9++; + if (3 < uVar9) { + return result; + } + } + if (3 < uVar9) { + break; + } + gSave.stats.bottles[uVar9] = (u8)item; + SetInventoryValue(item, 1); + SoundReq(SFX_ITEM_GET); + break; + case 5: + ModDungeonKeys(1); + SoundReq(SFX_103); + break; + case 6: // TODO dungeon item? + gSave.dungeonItems[gArea.dungeon_idx] |= metaData->unk2; + break; + case 0xd: + sub_0801E738(0x72); + break; + case 0x12: + if (item == ITEM_BOOMERANG) { + SetInventoryValue(ITEM_MAGIC_BOOMERANG, 0); + } else { + SetInventoryValue(ITEM_BOOMERANG, 0); + } + case 0x11: + LoadItemGfx(); + break; + case 7: + if (item == ITEM_BOMBS) { + SetInventoryValue(ITEM_REMOTE_BOMBS, 0); + } else { + SetInventoryValue(ITEM_BOMBS, 0); + } + ModBombs(99); + LoadItemGfx(); + break; + case 8: + if (uVar4 == 0) { + SetInventoryValue(ITEM_BOMBS, 1); + PutItemOnSlot(7); + } else { + gSave.stats.bombBagType++; + if (3 < gSave.stats.bombBagType) { + gSave.stats.bombBagType = 3; + } + } + ModBombs(99); + break; + case 9: + ModBombs(metaData->unk2); + SoundReq(SFX_103); + break; + case 0xb: + if (GetInventoryValue(ITEM_LARGE_QUIVER) == 0) { + SetInventoryValue(ITEM_LARGE_QUIVER, 1); + } + ModArrows(99); + LoadItemGfx(); + break; + case 0xa: + gSave.stats.quiverType++; + if (3 < gSave.stats.quiverType) { + gSave.stats.quiverType = 3; + } + ModArrows(99); + break; + case 0xc: + ModArrows(metaData->unk2); + SoundReq(SFX_103); + break; + case 0x0e: + SetInventoryValue(ITEM_SHELLS, 1); + ModShells(param_2); + SoundReq(SFX_103); + break; + case 0x0f: + sub_0801E738(param_2); + break; + case 0x10: + gSave.stats.walletType++; + if (gSave.stats.walletType < 4) { + break; + } + gSave.stats.walletType = 3; + break; + } + return result; +} + +// TODO Adapt ItemMetaData struct +void sub_08054288(s32 param_1) { + const ItemMetaData* ptr1 = gItemMetaData; + u16* ptr = (u16*)&((ptr1)[param_1]); + MessageFromTarget(ptr[3]); +} + +u32 getItemMetaDataGetTextIndex(s32 itemIndex) { + const ItemMetaData* ptr1 = gItemMetaData; + u16* ptr = (u16*)&((ptr1)[itemIndex]); + return ptr[2]; +} + +u32 sub_080542AC(u32 param_1) { + const ItemMetaData* ptr1 = gItemMetaData; + u8* ptr = (u8*)&((ptr1)[param_1]); + return ptr[3] & 1; +} + +void ModShells(s32 shells) { + if (shells == 0) { + shells = 1; + } + shells += gSave.stats.shells; + if (shells < 0) { + shells = 0; + } else if (999 < shells) { + shells = 999; + } + gSave.stats.shells = shells; +} + +void ModBombs(s32 bombs) { + s32 bombCount = bombs; + s32 bagSize; + bombCount += gSave.stats.bombCount; + bagSize = gBombBagSizes[gSave.stats.bombBagType]; + if (bombCount < 0) { + bombCount = 0; + } else if (bagSize < bombCount) { + bombCount = bagSize; + } + gSave.stats.bombCount = bombCount; +} + +void ModArrows(s32 arrows) { + s32 quiverSize; + s32 arrowCount = arrows; + arrowCount += gSave.stats.arrowCount; + quiverSize = gQuiverSizes[gSave.stats.quiverType]; + if (arrowCount < 0) { + arrowCount = 0; + } else if (quiverSize < arrowCount) { + arrowCount = quiverSize; + } + gSave.stats.arrowCount = arrowCount; +} + +/** + * @brief Returns the slot the item is equipped in. + * + * 0: A + * 1: B + * 2: Not equipped + */ +EquipSlot IsItemEquipped(u32 itemId) { + EquipSlot equipSlot; + + if (itemId == gSave.stats.itemButtons[SLOT_A]) { + equipSlot = EQUIP_SLOT_A; + } else if (itemId == gSave.stats.itemButtons[SLOT_B]) { + equipSlot = EQUIP_SLOT_B; + } else { + equipSlot = EQUIP_SLOT_NONE; + } + return equipSlot; +} + +void PutItemOnSlot(u32 itemId) { + EquipSlot equipSlot; + u32 itemId2 = itemId; + if (itemId2 < 0x47) { + SetInventoryValue(0, 1); + } + if (itemId2 - 1 < 0x1f) { + equipSlot = EQUIP_SLOT_NONE; + if (gSave.stats.itemButtons[SLOT_A] == ITEM_NONE) { + equipSlot = EQUIP_SLOT_A; + } else if (gSave.stats.itemButtons[SLOT_B] == ITEM_NONE) { + equipSlot = EQUIP_SLOT_B; + } + if (equipSlot == EQUIP_SLOT_NONE) { + u32 temp = gItemMetaData[itemId2].menuSlot; + if (temp == gItemMetaData[gSave.stats.itemButtons[SLOT_A]].menuSlot) { + equipSlot = EQUIP_SLOT_A; + } else { + if (temp == gItemMetaData[gSave.stats.itemButtons[SLOT_B]].menuSlot) { + equipSlot = EQUIP_SLOT_B; + } + } + if (equipSlot == EQUIP_SLOT_NONE) { + return; + } + } + ForceEquipItem(itemId2, equipSlot); + } +} + +void ForceEquipItem(u32 itemId, u32 equipSlot) { + u32 otherItem; + u32 otherItemSlot; + u32 replacedItem; + + if ((itemId - 1 < 0x1f) && (equipSlot < EQUIP_SLOT_NONE)) { + otherItemSlot = equipSlot == EQUIP_SLOT_A; + replacedItem = gSave.stats.itemButtons[equipSlot]; + otherItem = gSave.stats.itemButtons[otherItemSlot]; + if (gItemMetaData[otherItem].menuSlot == gItemMetaData[itemId].menuSlot) { + otherItem = replacedItem; + } + gSave.stats.itemButtons[equipSlot] = itemId; + gSave.stats.itemButtons[otherItemSlot] = otherItem; + gUnk_0200AF00.unk_13 = 0x7f; + gUnk_0200AF00.unk_14 = 0x7f; + } +} + +u32 SetBottleContents(u32 itemId, u32 bottleIndex) { + if (bottleIndex > 3) { + bottleIndex = 0; + for (bottleIndex = 0; gSave.stats.bottles[bottleIndex] != ITEM_BOTTLE_EMPTY;) { + if (++bottleIndex > 3) { + return bottleIndex; + } + } + if (bottleIndex > 3) { + return bottleIndex; + } + } + gSave.stats.bottles[bottleIndex] = itemId; + return bottleIndex; +} + +bool32 ItemIsSword(u32 item) { + switch (item) { + case ITEM_SMITH_SWORD: + case ITEM_GREEN_SWORD: + case ITEM_RED_SWORD: + case ITEM_BLUE_SWORD: + case ITEM_FOURSWORD: + return TRUE; + default: + return FALSE; + } +} + +bool32 ItemIsShield(u32 id) { + switch (id) { + case ITEM_SHIELD: + case ITEM_MIRROR_SHIELD: + return TRUE; + default: + return FALSE; + } +} + +bool32 ItemIsBottle(u32 id) { + switch (id) { + case ITEM_BOTTLE1: + case ITEM_BOTTLE2: + case ITEM_BOTTLE3: + case ITEM_BOTTLE4: + return TRUE; + default: + return FALSE; + } +} + +u32 GetBottleContaining(u32 id) { + if (id == gSave.stats.bottles[0]) { + return 1; + } else if (id == gSave.stats.bottles[1]) { + return 2; + } else if (id == gSave.stats.bottles[2]) { + return 3; + } else if (id == gSave.stats.bottles[3]) { + return 4; + } else { + return 0; + } +} + +extern u8 gUnk_080FE1C6[]; +void sub_08054524(void) { + u32 bVar1; + + bVar1 = gArea.locationIndex; + if (gArea.locationIndex == 0) { + bVar1 = gRoomTransition.player_status.field_0x24[0xa]; + } + if (bVar1 > 0x16) { + bVar1 = 0; + } + + bVar1 = gUnk_080FE1C6[bVar1]; + MemCopy(&gAreaDroptables[bVar1], &gRoomVars.currentAreaDroptable, sizeof(Droptable)); +} + +void DisableRandomDrops(void) { + gRoomVars.randomDropsDisabled = TRUE; +} + +void EnableRandomDrops(void) { + gRoomVars.randomDropsDisabled = FALSE; +} + +extern void sub_08000F14(s16*, const s16*, const s16*, const s16*); +extern u32 sub_08000F2C(s16*, const s16*, const s16*, const s16*); +u32 CreateItemDrop(Entity* arg0, u32 itemId, u32 itemParameter); +u32 CreateRandomItemDrop(Entity* arg0, u32 arg1) { + extern const u8 gUnk_080FE1B4[] /* = { + ITEM_NONE, ITEM_RUPEE1, ITEM_RUPEE5, ITEM_RUPEE20, ITEM_HEART, ITEM_FAIRY, + ITEM_BOMBS5, ITEM_ARROWS5, ITEM_SHELLS, ITEM_KINSTONE_GREEN, ITEM_KINSTONE_BLUE, ITEM_KINSTONE_RED, + ITEM_ENEMY_BEETLE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, + }*/; + + int r0, r1, rand, summOdds, item; + u32 r3; + const Droptable *ptr2, *ptr3, *ptr4; + Droptable droptable; + r3 = arg1; + if (gRoomVars.randomDropsDisabled != TRUE) { + ptr2 = &gDroptableModifiers[DROPTABLE_NONE]; + ptr4 = NULL; + switch (r3) { + case 1 ... 12: + ptr4 = &gEnemyDroptables[r3]; + break; +#ifndef EU + case 24: + case 25: + r0 = gRoomVars.unk2; + ptr4 = &gUnk_0800191C[0]; + if (r0) { + ptr4++; + } + break; +#endif + case 16 ... 23: +#ifdef EU + case 24: +#endif + ptr2 = &gObjectDroptables[r3 - 16]; + case 15: + ptr4 = &gRoomVars.currentAreaDroptable; + break; + case 0: + default: + break; + } + if (ptr4 != 0) { + if ((r1 = gSave.stats.picolyteType) == 0) { + // nop + ptr3 = &gDroptableModifiers[DROPTABLE_NONE]; + } else { +#ifdef EU + ptr3 = &gEnemyDroptables[r1 + 9]; +#else + ptr3 = &gEnemyDroptables[r1 + 6]; +#endif + } + // vector addition, s0 = ptr4 + ptr2 + ptr3 + sub_08000F14(droptable.a, ptr4->a, ptr2->a, ptr3->a); + if (gSave.stats.health <= 8) { + droptable.s.hearts += 5; + } + if (gSave.stats.bombCount == 0) { + droptable.s.bombs += 3; + } + if (gSave.stats.arrowCount == 0) { + droptable.s.arrows += 3; + } + if (gSave.stats.rupees <= 10) { + droptable.s.rupee5++; + } + ptr2 = &gDroptableModifiers[DROPTABLE_NONE]; + r0 = gSave.stats.hasAllFigurines; + ptr3 = &gDroptableModifiers[DROPTABLE_NONE]; + // don't drop shells anymore + if (r0 != 0) { + ptr2 = &gDroptableModifiers[DROPTABLE_NO_SHELLS]; + } + // don't drop kinstones anymore + if (gSave.didAllFusions != 0) { + ptr3 = &gDroptableModifiers[DROPTABLE_NO_KINSTONES]; + } + // vector addition, s0 = s0 + ptr2 + ptr3 + // resulting values are clamped to be >= 0 + // returns sum over s0 + summOdds = sub_08000F2C(droptable.a, droptable.a, ptr2->a, ptr3->a); + rand = Random(); + item = (rand >> 0x18); + item &= 0xF; + rand = rand % summOdds; + { + u32 r3; + for (r3 = 0, r1 = 0; r3 < 0x10; r3++, item = (item + 1) & 0xF) { + if ((r1 += droptable.a[item]) > rand) { + break; + } + } + } + r1 = gUnk_080FE1B4[item]; + if (r1 != ITEM_NONE) { + return CreateItemDrop(arg0, r1, 0); + } + } + } + return ITEM_NONE; +} + +extern u8 gUnk_080FE1DD[]; +u32 CreateItemDrop(Entity* arg0, u32 itemId, u32 itemParameter) { + u32 adjustedParam = itemParameter; + Entity* itemEntity; + + switch (itemId) { + case ITEM_ENEMY_BEETLE: + if (!GetInventoryValue(ITEM_SMITH_SWORD)) { + return ITEM_NONE; + } + break; + case ITEM_BOMBS5: + if (!GetInventoryValue(ITEM_BOMBBAG)) { + return ITEM_NONE; + } + break; + case ITEM_ARROWS5: + if (!GetInventoryValue(ITEM_BOW)) { + return ITEM_NONE; + } + break; + case ITEM_SHELLS: { + if (!GetInventoryValue(ITEM_EARTH_ELEMENT)) { + return ITEM_NONE; + } + if (itemParameter == 0) { + adjustedParam = 1; + } + break; + } + case ITEM_KINSTONE: + case ITEM_KINSTONE_GREEN ... ITEM_KINSTONE_RED: { + u32 rand; + + if (GetInventoryValue(ITEM_KINSTONE_BAG) == 0) { + return ITEM_NONE; + } + if (3 < gRoomVars.filler1[0]) { + return ITEM_NONE; + } + + if (itemId != ITEM_KINSTONE) { + adjustedParam = itemId - ITEM_KINSTONE_GREEN; + rand = (Random() & 0x3f); + adjustedParam = gUnk_080FE1DD[(rand + adjustedParam * 0x40)]; + if (adjustedParam == 0) { + itemId = ITEM_NONE; + } else { + itemId = ITEM_KINSTONE; + } + } + break; + } + } + if (itemId != ITEM_NONE) { + if (itemId != ITEM_ENEMY_BEETLE) { + itemEntity = CreateObject(GROUND_ITEM, itemId, adjustedParam); + if (itemEntity != NULL) { + if (arg0 == &gPlayerEntity) { + itemEntity->timer = 1; + } else { + itemEntity->timer = 0; + } + if (arg0->kind == OBJECT) { + if (arg0->id == 99) { + arg0->child = itemEntity; + } else if (arg0->id == 0x1e) { + itemEntity->direction = arg0->animationState << 3 | 0x80; + itemEntity->speed = 0xc0; + itemEntity->zVelocity = Q_16_16(1.5); + } + } + CopyPosition(arg0, itemEntity); + } + } else { + itemEntity = CreateEnemy(BEETLE, 0); + if (itemEntity != NULL) { + itemEntity->x.HALF.HI = arg0->x.HALF.HI; + itemEntity->y.HALF.HI = arg0->y.HALF.HI; + itemEntity->collisionLayer = arg0->collisionLayer; + UpdateSpriteForCollisionLayer(itemEntity); + } + } + } + return itemId; +} diff --git a/src/kinstone.c b/src/kinstone.c index 043f6623..1be80aa3 100644 --- a/src/kinstone.c +++ b/src/kinstone.c @@ -25,12 +25,12 @@ extern const EntityData gUnk_080FEE58[]; extern const void* gUnk_080FED98[]; void sub_08018AB4(int); -void sub_08018BB4(int); -void sub_08018A58(int); -void sub_08018B50(int); -void sub_080189EC(int); -void sub_0801876C(int, int); -void sub_08018738(u32, int); +void sub_08018BB4(u32 worldEventId); +void sub_08018A58(u32 worldEventId); +void sub_08018B50(u32 worldEventId); +void sub_080189EC(u32 worldEventId); +void sub_0801876C(u32 worldEventId, bool32 isKinstoneFused); +void sub_08018738(u32 kinstoneId, u32 worldEventId); void ShuffleEzloHints(int count, u16* basePtr); void sub_08018500(); bool32 sub_080185B4(const struct_gUnk_080B3D20* param_1); @@ -239,60 +239,60 @@ void sub_080186D4(void) { } void sub_080186EC(u32 param_1) { - const struct_080C9CBC* psVar1; + const KinstoneWorldEvent* psVar1; u32 i; - for (i = 0, psVar1 = gUnk_080C9CBC; i <= 100; psVar1++, i++) { - if (psVar1->unk3 == 8) { - sub_08018738(i, psVar1->evt_type); + for (i = 0, psVar1 = gKinstoneWorldEvents; i <= 100; psVar1++, i++) { + if (psVar1->subtask == SUBTASK_WORLDEVENT) { + sub_08018738(i, psVar1->worldEventId); } } } -void sub_08018710(u32 param_1) { - const struct_080C9CBC* psVar1; +void sub_08018710(u32 previousworldEventId) { + const KinstoneWorldEvent* psVar1; u32 i; - for (i = 0, psVar1 = gUnk_080C9CBC; i <= 100; psVar1++, i++) { - if (psVar1->unk3 == 8 && param_1 != psVar1->evt_type) { - sub_08018738(i, psVar1->evt_type); + for (i = 0, psVar1 = gKinstoneWorldEvents; i <= 100; psVar1++, i++) { + if (psVar1->subtask == SUBTASK_WORLDEVENT && previousworldEventId != psVar1->worldEventId) { + sub_08018738(i, psVar1->worldEventId); } } } -void sub_08018738(u32 param_1, int param_2) { - struct_080FE320* ptr = &gUnk_080FE320[param_2]; +void sub_08018738(u32 kinstoneId, u32 worldEventId) { + const WorldEvent* ptr = &gWorldEvents[worldEventId]; if (ptr->area == gRoomControls.area && ptr->room == gRoomControls.room) { - sub_0801876C(param_2, CheckKinstoneFused(param_1)); + sub_0801876C(worldEventId, CheckKinstoneFused(kinstoneId)); } } -void sub_0801876C(int param_1, int param_2) { +void sub_0801876C(u32 worldEventId, bool32 isKinstoneFused) { Entity* roomEnt; Entity* ent; u32 uVar3; u32 tmp; u8* puVar4; u32 uVar5; - struct_080FE320* ptr; + const WorldEvent* ptr; - ptr = &gUnk_080FE320[param_1]; - switch (ptr->evt_type) { - case 6: - if (param_2 == 0) { + ptr = &gWorldEvents[worldEventId]; + switch (ptr->type) { + case WORLD_EVENT_TYPE_6: + if (isKinstoneFused == 0) { sub_08018AB4((ptr->x >> 4 & 0x3f) | (ptr->y >> 4 & 0x3f) << 6); } break; - case 0: + case WORLD_EVENT_TYPE_0: break; - case 2: - if (param_2 != 0) { - sub_08018BB4(param_1); + case WORLD_EVENT_TYPE_2: + if (isKinstoneFused != 0) { + sub_08018BB4(worldEventId); } break; - case 1: - if (param_2 == 0) { + case WORLD_EVENT_TYPE_1: + if (isKinstoneFused == 0) { return; } if (CheckGlobalFlag(ptr->flag)) { @@ -300,8 +300,8 @@ void sub_0801876C(int param_1, int param_2) { } LoadRoomEntity(gUnk_080FEC28 + ptr->entity_idx); break; - case 3: - if (param_2 == 0) { + case WORLD_EVENT_TYPE_3: + if (isKinstoneFused == 0) { return; } if (GetInventoryValue(ptr->flag)) { @@ -309,47 +309,47 @@ void sub_0801876C(int param_1, int param_2) { } LoadRoomEntity(gUnk_080FEBE8 + ptr->entity_idx); break; - case 4: - if (param_2 == 0) { - sub_08018A58(param_1); + case WORLD_EVENT_TYPE_4: + if (isKinstoneFused == 0) { + sub_08018A58(worldEventId); } break; - case 5: - if (param_2 != 0) { - sub_08018B50(param_1); + case WORLD_EVENT_TYPE_5: + if (isKinstoneFused != 0) { + sub_08018B50(worldEventId); } break; - case 7: - if (param_2 != 0) { + case WORLD_EVENT_TYPE_7: + if (isKinstoneFused != 0) { return; } if (ptr->entity_idx != 0x80) { LoadRoomEntity(gUnk_080FECC8 + ptr->entity_idx); } else { - sub_080189EC(param_1); + sub_080189EC(worldEventId); } break; - case 0x19: + case WORLD_EVENT_TYPE_25: roomEnt = LoadRoomEntity(&gUnk_080FED18[ptr->entity_idx]); if (roomEnt != 0) { - roomEnt->type = param_2 ? 2 : 0; + roomEnt->type = isKinstoneFused ? 2 : 0; } break; - case 8: - if (param_2 == 0) { + case WORLD_EVENT_TYPE_8: + if (isKinstoneFused == 0) { return; } SetTileType(0x168, (ptr->x >> 4 & 0x3f) | (ptr->y >> 4 & 0x3f) << 6, 1); break; - case 0xb: - if (param_2 != 0) { + case WORLD_EVENT_TYPE_11: + if (isKinstoneFused != 0) { LoadRoomEntity(&gUnk_080FED58[ptr->entity_idx]); gRoomVars.field_0x8c[ptr->entity_idx] = (void*)gUnk_080FED98[ptr->entity_idx]; } break; - case 9: - if (param_2 == 0) { + case WORLD_EVENT_TYPE_9: + if (isKinstoneFused == 0) { return; } ent = LoadRoomEntity(&gUnk_080FEE78[ptr->entity_idx]); @@ -366,38 +366,38 @@ void sub_0801876C(int param_1, int param_2) { SetTileType(uVar3, uVar5, 1); } break; - case 0x18: - if (param_2 != 0) { + case WORLD_EVENT_TYPE_24: + if (isKinstoneFused != 0) { LoadRoomEntityList(gUnk_080FEE18); } break; - case 0xf: - if (param_2 != 0) { + case WORLD_EVENT_TYPE_15: + if (isKinstoneFused != 0) { LoadRoomEntity(gUnk_080FEE58); } else { LoadRoomEntity(gUnk_080FEE48); } break; - case 0x11: - if (param_2 != 0) { + case WORLD_EVENT_TYPE_17: + if (isKinstoneFused != 0) { SetLocalFlagByBank(FLAG_BANK_1, SOUGEN_05_BOMB_00); LoadRoomEntityList(gUnk_080FEE38); } break; - case 0x1a: - case 0x1b: - case 0x1c: + case WORLD_EVENT_TYPE_26: + case WORLD_EVENT_TYPE_27: + case WORLD_EVENT_TYPE_28: break; } } -void sub_080189EC(int param_1) { +void sub_080189EC(u32 worldEventId) { u32 i; int iVar1; int tilePosition; - struct_080FE320* ptr; + const WorldEvent* ptr; - ptr = &gUnk_080FE320[param_1]; + ptr = &gWorldEvents[worldEventId]; tilePosition = (ptr->x >> 4) & 0x3f; tilePosition |= ((ptr->y >> 4) & 0x3f) << 6; @@ -414,14 +414,14 @@ void sub_080189EC(int param_1) { } } -void sub_08018A58(int param_1) { +void sub_08018A58(u32 worldEventId) { u32 i; int iVar2; u32 j; int tilePosition; - struct_080FE320* ptr; + const WorldEvent* ptr; - ptr = &gUnk_080FE320[param_1]; + ptr = &gWorldEvents[worldEventId]; tilePosition = (ptr->x >> 4) & 0x3f; tilePosition |= ((ptr->y >> 4) & 0x3f) << 6; @@ -470,14 +470,14 @@ void sub_08018B10(int param_1) { } } -void sub_08018B50(int param_1) { +void sub_08018B50(u32 worldEventId) { u32 i; int iVar2; u32 j; int tilePosition; - struct_080FE320* ptr; + const WorldEvent* ptr; - ptr = &gUnk_080FE320[param_1]; + ptr = &gWorldEvents[worldEventId]; if ((ptr->entity_idx & 0x80) == 0) { iVar2 = 0x200; } else { @@ -495,14 +495,15 @@ void sub_08018B50(int param_1) { } } -void sub_08018BB4(int param_1) { +// TODO world event that loads tile entity +void sub_08018BB4(u32 worldEventId) { u32 layer; TileEntity tile; - struct_080FE320* ptr; + const WorldEvent* ptr; u32 position; - MemCopy(gUnk_080FEAC8 + param_1, &tile, sizeof(TileEntity)); - ptr = &gUnk_080FE320[param_1]; + MemCopy(gUnk_080FEAC8 + worldEventId, &tile, sizeof(TileEntity)); + ptr = &gWorldEvents[worldEventId]; tile.tilePos = (ptr->x >> 4 & 0x3f) | (((ptr->y) >> 4 & 0x3f) << 6); sub_0804B3C4(&tile); if (CheckLocalFlag(tile.localFlag) == 0) { @@ -169,7 +169,7 @@ const SaveHeader sDefaultSettings = { }; // single misplaced ldr -NONMATCH("asm/non_matching/InitSaveHeader.inc", /*static*/ void InitSaveHeader(void)) { +/*static*/ NONMATCH("asm/non_matching/InitSaveHeader.inc", void InitSaveHeader(void)) { u32 b; if (!CheckHeaderValid()) { diff --git a/src/manager/enterRoomTextboxManager.c b/src/manager/enterRoomTextboxManager.c index 0dcf7c9b..59f31e2f 100644 --- a/src/manager/enterRoomTextboxManager.c +++ b/src/manager/enterRoomTextboxManager.c @@ -7,6 +7,7 @@ #include "manager/enterRoomTextboxManager.h" #include "area.h" #include "common.h" +#include "fileselect.h" #include "functions.h" #include "game.h" #include "message.h" @@ -14,18 +15,24 @@ extern u8 gUnk_02034DF0[0x2F2]; -extern const u16 gUnk_08108DE8[]; -extern void (*const EnterRoomTextboxManager_Actions[])(EnterRoomTextboxManager*); -extern const u8 gUnk_08108E30[0x18]; -extern const u8 gUnk_08108E48[0x18]; -extern const u8 gUnk_08108E60[]; +const u16 gUnk_08108DE8[] = { 0, 0x70b, 0x70c, 0x70d, 0x70e, 0x70f, 0x710, 0x711, 0x712, 0x713, 0x714, + 0x715, 0x716, 0x717, 0x718, 0x719, 0x71a, 0x71b, 0x71c, 0x71d, 0x71e, 0x71f, + 0x726, 0x720, 0x720, 0x721, 0x722, 0x723, 0x725, 0x727, 0x724, 0x728 }; +void sub_0805E140(EnterRoomTextboxManager*); +void sub_0805E18C(EnterRoomTextboxManager*); +void (*const EnterRoomTextboxManager_Actions[])(EnterRoomTextboxManager*) = { + sub_0805E140, + sub_0805E18C, +}; -extern void sub_0805F46C(void*, const void*); +extern const Font gUnk_08108E30; +extern const Font gUnk_08108E48; +extern const u8 gUnk_08108E60[]; void sub_0805E140(EnterRoomTextboxManager*); void sub_0805E18C(EnterRoomTextboxManager*); // unused? void sub_0805E1D8(EnterRoomTextboxManager*); -void sub_0805E1F8(u32, u32); +void sub_0805E1F8(u32, bool32); void EnterRoomTextboxManager_Main(EnterRoomTextboxManager* this) { EnterRoomTextboxManager_Actions[super->action](this); @@ -65,21 +72,21 @@ void sub_0805E1D8(EnterRoomTextboxManager* this) { DeleteThisEntity(); } -void sub_0805E1F8(u32 unk0, u32 unk1) { +void sub_0805E1F8(u32 unk0, bool32 isDungeon) { struct { u8 unk_00[4]; u8 unk_04; u8 unk_05; u8 unk_06[3]; } PACKED tmp; - const u8* tmp2; + const Font* font; MemClear(&gUnk_02034DF0, 0x80); MemCopy(gUnk_08108E60, &tmp, sizeof(tmp)); tmp.unk_04 = unk0 >> 8; tmp.unk_05 = unk0; - tmp2 = gUnk_08108E48; - if (!unk1) - tmp2 = gUnk_08108E30; - sub_0805F46C(&tmp, tmp2); + font = &gUnk_08108E48; + if (!isDungeon) + font = &gUnk_08108E30; + ShowTextBox((u32)&tmp, font); gScreen.bg0.updated = 1; } diff --git a/src/manager/staticBackgroundManager.c b/src/manager/staticBackgroundManager.c index f069196c..a8bd1810 100644 --- a/src/manager/staticBackgroundManager.c +++ b/src/manager/staticBackgroundManager.c @@ -63,14 +63,14 @@ void sub_0805B474(StaticBackgroundManager* this) { } void sub_0805B4B4(StaticBackgroundManager* this) { - sub_0805B4D0(super->type); + LoadStaticBackground(super->type); if (super->type == 2) { sub_0806D0F8(); } StaticBackgroundManager_Main(this); } -void sub_0805B4D0(u32 param_1) { +void LoadStaticBackground(u32 param_1) { static const u8 gUnk_08108C5C[] = { 0x14, 0x15, 0x14, 0x2f, 0x4b, 0x4e, 0x4d, 0 }; s32 iVar1; u32 uVar2; diff --git a/src/manager/weatherChangeManager.c b/src/manager/weatherChangeManager.c index b74edcc2..f1988de4 100644 --- a/src/manager/weatherChangeManager.c +++ b/src/manager/weatherChangeManager.c @@ -58,7 +58,7 @@ void sub_080595E4(WeatherChangeManager* this) { gRoomVars.unk_10[0] = 0xFF; sub_08059690(this); sub_080596E0(this); - sub_0805B4D0(0); + LoadStaticBackground(0); } void sub_08059608(WeatherChangeManager* this) { diff --git a/src/menu/figurine_menu.c b/src/menu/figurineMenu.c index 4a558423..2a19f06d 100644 --- a/src/menu/figurine_menu.c +++ b/src/menu/figurineMenu.c @@ -1,23 +1,27 @@ -#include "global.h" -#include "main.h" -#include "menu.h" -#include "sound.h" +/** + * @file figurineMenu.c + * @ingroup Subtasks + * + * @brief Figurine Menu Subtask + */ +#include "figurineMenu.h" + #include "common.h" -#include "screen.h" -#include "save.h" #include "flags.h" -#include "subtask.h" -#include "object.h" -#include "game.h" #include "functions.h" +#include "game.h" +#include "main.h" +#include "menu.h" #include "message.h" +#include "object.h" +#include "pauseMenu.h" +#include "save.h" +#include "screen.h" +#include "sound.h" +#include "subtask.h" +#include "subtask2.h" #include "ui.h" -extern const struct { - u8 filler[7]; - u8 unk7; -} gUnk_080FC3E4[]; - void sub_080A4DA8(u32); void sub_080A4B44(void); void FigurineMenu_080A4978(void); @@ -47,13 +51,7 @@ const KeyButtonLayout gUnk_0812813C = { }; extern u8 gUnk_020344A0[8]; -typedef struct { - u8 unk0; - u8 unk1; - u16 unk2; - u16 unk4; - u16 unk6; -} struct_08128AD8; + extern const struct_08128AD8 gUnk_08128AD8[]; Subtask FigurineMenu0_Type0; @@ -64,6 +62,7 @@ Subtask FigurineMenu1_Type0; Subtask FigurineMenu1_Type1; Subtask FigurineMenu1_Type2; Subtask FigurineMenu1_Type3; + void Subtask_FigurineMenu(void) { static Subtask* const figurineMenu1_Types[] = { FigurineMenu0_Type0, @@ -135,7 +134,7 @@ void FigurineMenu0_Type0(void) { void FigurineMenu0_Type1(void) { if (gFadeControl.active == 0) { - CreateObject(OBJECT_A2, gUnk_080FC3E4[gFigurineMenu.figure_idx].unk7, 0); + CreateObject(OBJECT_A2, gUnk_080FC3E4[gFigurineMenu.figure_idx].type, 0); SetMenuType(2); } } @@ -444,7 +443,7 @@ const struct_08128184 gUnk_08128184 = { }; extern struct_020227E8 gUnk_020227E8[]; -extern void sub_0805F46C(u32, const struct_0812816C*); +extern void ShowTextBox(u32, const struct_0812816C*); void sub_080A4BA0(u32 arg1, u32 arg2) { int r0, r5, r6; @@ -497,9 +496,9 @@ void sub_080A4BA0(u32 arg1, u32 arg2) { s2.unk9 = r5; s0.unk0 += 0xb; if (gSaveHeader->language == 0) { - sub_0805F46C((u32)&s2, &s0); + ShowTextBox((u32)&s2, &s0); } else { - sub_0805F46C(r5, &s0); + ShowTextBox(r5, &s0); } } gScreen.bg3.updated = 1; @@ -538,7 +537,7 @@ u32 sub_080A4CBC(u32 param_1) { MemCopy(&gBG1Buffer, (void*)0x600e000, sizeof(gBG1Buffer)); iVar1 = sub_080A4948(param_1); if (iVar1 != 0) { - sub_0805F46C(param_1 + 0x900, &gUnk_08128190); + ShowTextBox(param_1 + 0x900, &gUnk_08128190); } gScreen.bg1.updated = 1; } @@ -585,6 +584,7 @@ void sub_080A4DA8(u32 param_1) { sub_080A4DB8(param_1); } +// Render screen? void sub_080A4DB8(u32 param_1) { const struct_08128AD8* ptr; @@ -603,25 +603,25 @@ void sub_080A4DB8(u32 param_1) { gScreen.bg0.updated = 1; gScreen.bg1.xOffset = 0; gScreen.bg1.yOffset = 0; - gScreen.bg1.control = ptr->unk4; + gScreen.bg1.control = ptr->bg1Control; gScreen.bg1.updated = 1; gScreen.bg2.xOffset = 0; gScreen.bg2.yOffset = 0; - gScreen.bg2.control = ptr->unk6; + gScreen.bg2.control = ptr->bg2Control; gScreen.bg2.updated = 1; gScreen.bg3.xOffset = 0; gScreen.bg3.yOffset = 0; gScreen.bg3.control = 0x1e0b; - if (ptr->unk0 != 0) { - LoadPaletteGroup(ptr->unk0); + if (ptr->paletteGroup != 0) { + LoadPaletteGroup(ptr->paletteGroup); } - if (ptr->unk1 != 0) { - LoadGfxGroup(ptr->unk1); + if (ptr->gfxGroup != 0) { + LoadGfxGroup(ptr->gfxGroup); } } void sub_080A4E84(u8 param_1) { - gPauseMenuOptions.unk14 = param_1; + gPauseMenuOptions.screen2 = param_1; } void sub_080A4E90(u8 param_1) { diff --git a/src/menu/kinstone_menu.c b/src/menu/kinstoneMenu.c index 247902e4..e9aaad8e 100644 --- a/src/menu/kinstone_menu.c +++ b/src/menu/kinstoneMenu.c @@ -1,3 +1,9 @@ +/** + * @file kinstoneMenu.c + * @ingroup Subtasks + * + * @brief Kinstone Menu Subtask + */ #include "area.h" #include "common.h" #include "enemy.h" @@ -221,12 +227,12 @@ void KinstoneMenu_Type1(void) { } void KinstoneMenu_Type2(void) { - const struct_080C9CBC* ptr; + const KinstoneWorldEvent* ptr; if (gMenu.column_idx == 6) { gFuseInfo._0 = 6; - ptr = &gUnk_080C9CBC[gFuseInfo._3]; - if (ptr->unk3 != 0) { - MenuFadeIn(ptr->unk3, ptr->evt_type); + ptr = &gKinstoneWorldEvents[gFuseInfo.kinstoneId]; + if (ptr->subtask != 0) { + MenuFadeIn(ptr->subtask, ptr->worldEventId); } else { Subtask_Exit(); } @@ -259,8 +265,8 @@ void KinstoneMenu_Type3_Overlay0(void) { } void KinstoneMenu_Type3_Overlay1(void) { - u32 temp = gUnk_080C9CBC[gKinstoneMenu.unk2a].unk5; - if (temp != gUnk_080C9CBC[gFuseInfo._3].unk5) { + u32 temp = gKinstoneWorldEvents[gKinstoneMenu.unk2a].unk5; + if (temp != gKinstoneWorldEvents[gFuseInfo.kinstoneId].unk5) { SoundReq(SFX_ITEM_SHIELD_BOUNCE); SetMenuType(4); } else { @@ -313,8 +319,8 @@ void KinstoneMenu_Type5(void) { void KinstoneMenu_Type5_Overlay0(void) { gMenu.column_idx = 5; - WriteBit(gSave.unk241, gFuseInfo._3); - if (++gSave.unk117 > 99) { + WriteBit(gSave.fusedKinstones, gFuseInfo.kinstoneId); + if (++gSave.fusedKinstoneCount > 99) { gSave.didAllFusions = 1; } KinstoneMenu_080A4468(); @@ -499,16 +505,16 @@ void KinstoneMenu_080A422C(void) { } gOamCmd.x = t2; - sub_080A42E0(gFuseInfo._3, 0); + sub_080A42E0(gFuseInfo.kinstoneId, 0); } -void sub_080A42E0(u32 param_1, u32 param_2) { +void sub_080A42E0(u32 kinstoneId, u32 param_2) { u8 uVar1; s32 sVar2; s32 sVar3; s32 iVar4; - const struct_080C9CBC* ptr = &gUnk_080C9CBC[param_1]; + const KinstoneWorldEvent* ptr = &gKinstoneWorldEvents[kinstoneId]; if (param_2 == 0xff) { uVar1 = ptr->unk2; @@ -538,7 +544,7 @@ void sub_080A42E0(u32 param_1, u32 param_2) { } { int t; - t = ptr->unk0; + t = ptr->objPalette; t <<= 0xc; t |= 0x800; t |= (iVar4 << 4) + 0x300; @@ -602,7 +608,7 @@ u32 sub_080A4418(u32 param_1, u32 param_2) { void KinstoneMenu_080A4468(void) { gUnk_03003DF0.unk_2 = 0; gUnk_03003DF0.unk_4[3] = 0; - sub_0801E6C8(gFuseInfo._3); + sub_0801E6C8(gFuseInfo.kinstoneId); sub_0801E798(gKinstoneMenu.unk2a); } diff --git a/src/subtask2.c b/src/menu/pauseMenu.c index 4476477c..63f22f28 100644 --- a/src/subtask2.c +++ b/src/menu/pauseMenu.c @@ -1,131 +1,604 @@ +/** + * @file pauseMenu.c + * @ingroup Subtasks + * + * @brief Pause Menu Subtask + */ +#include "pauseMenu.h" + #include "common.h" -#include "fileselect.h" -#include "flags.h" #include "functions.h" #include "game.h" #include "item.h" #include "itemMetaData.h" -#include "kinstone.h" #include "main.h" #include "menu.h" #include "message.h" #include "save.h" #include "screen.h" +#include "sound.h" +#include "structures.h" #include "subtask.h" #include "ui.h" -#ifdef EU -#define DRAW_DIRECT_SPRITE_INDEX 0x1fa -#else -#define DRAW_DIRECT_SPRITE_INDEX 0x1fb -#endif - -extern u8 gUnk_08128D38[]; -extern u8 gUnk_08128D43[]; -extern u16 gUnk_02017830[]; -extern u8 gUnk_020350F0[]; -extern u8 gUnk_08128C00[]; -extern Frame* gSpriteAnimations_322[]; -extern u32 gUnk_085C4620[]; -extern u16* gMoreSpritePtrs[]; -extern Screen gUnk_03001020; -extern u8 gUnk_02024090[]; -extern u8 gUnk_03000420[]; -extern u16 gUnk_02017AA0[]; +extern void sub_080A4DB8(u32); -void sub_080A5CFC(u32, void*, u32); -void sub_080A6FB4(u32, u32); -void sub_080A66D0(); -void sub_080A5D1C(); -void sub_080A70AC(const KeyButtonLayout* layout); -u32 sub_080A6F40(); -void sub_080A67C4(u32); -void sub_080A68D4(); -s32 sub_080A69E0(); -void sub_080A6EE0(u32 param_1); -struct_08127F94* sub_080A6A80(u32 param_1, u32 param_2); -void sub_080A698C(u32 param_1, u32 param_2, u32 param_3, u32 param_4); -void sub_080A6438(); +void sub_080A5128(void); +void sub_080A51D4(void); +bool32 sub_080A51F4(void); void sub_080A5F48(u32, u32); -void sub_080A6F6C(u32); -bool32 sub_080A5F24(void); -extern void DrawDungeonMap(u32 floor, struct_02019EE0* data, u32 size); -extern void LoadDungeonMap(void); +void Subtask_PauseMenu(void) { + static Subtask* const pauseMenu_Variants[] = { + PauseMenu_Variant0, PauseMenu_Variant1, PauseMenu_Variant2, + PauseMenu_Variant3, PauseMenu_Variant4, PauseMenu_Variant5, + }; -void DrawDungeonFeatures(u32, void*, u32); + if (gPauseMenuOptions.unk11 == 6) { + SetBgmVolume(0x100); + Subtask_Exit(); + } else { + FlushSprites(); + pauseMenu_Variants[gPauseMenuOptions.unk11](); + sub_080A5128(); + UpdateUIElements(); + DrawUIElements(); + if (gPauseMenuOptions.unk11 != 4) { + gUnk_08128A38[gPauseMenuOptions.screen].func(); + } + CopyOAM(); + { + u32 t = gPauseMenuOptions.unk16; + u32 t2 = (t != 0) ? 0xe46 : 0; + gScreen.controls.layerFXControl = t2; + gScreen.controls.alphaBlend = (t << 8) | (0x10 - t); + } + } +} -extern void (*const gUnk_08128D58[])(void); +struct_08127F94* sub_080A6A80(u32, u32); -extern KeyButtonLayout gUnk_08128D60; +extern u8 gUnk_02034492[]; +void sub_0801E8D4(void); +s32 sub_080A50A0(s32); -extern void (*const gUnk_08128DB0[])(void); -void sub_080A617C(void); -void sub_080A7040(u32); +void PauseMenu_Variant0(void) { + struct_08127F94* ptr; + int r0, r1; -extern u8 gUnk_08128DB8[]; -extern u8 gUnk_08128E80[]; -extern KeyButtonLayout gUnk_08128DBC; + sub_0801E8D4(); + sub_080A4D34(); + r1 = 4; + do { + gUnk_02034492[r1] = 0; + r1++; + } while (r1 <= 0xd); + ptr = sub_080A6A80((u16)gRoomTransition.player_status.overworld_map_x, + (u16)gRoomTransition.player_status.overworld_map_y); + gPauseMenuOptions.unk2[4] = ptr->_4; + gPauseMenuOptions.unk2[5] = sub_0801DB94(); + if (IsItemEquipped(ITEM_LANTERN_ON) != EQUIP_SLOT_NONE) { + r1 = 0x10; + } else { + r1 = 0xf; + } + gPauseMenuOptions.unk15 = r1; + r0 = gUnk_08128A38[gPauseMenuOptions.screen].unk1; + r0 = sub_080A50A0(r0); + gPauseMenuOptions.screen = r0; + gPauseMenuOptions.screen2 = r0; + sub_080A4DB8(r0); + SetFade(FADE_INSTANT, 0x20); + sub_080A4E90(1); +} -typedef struct { - u8 frameIndex; - u8 unk1; - u8 unk2; - u8 unk3; - u16 unk4; - u16 unk6; -} sturct_gUnk_08128F58; +void PauseMenu_Variant1(void) { + if (gFadeControl.active == 0) { + sub_080A4E90(2); + } +} -extern sturct_gUnk_08128F58 gUnk_08128F58[]; +void PauseMenu_Variant2(void) { + int iVar1; + u32 uVar2; + int iVar4; + s32 bVar5; -typedef struct { - u8 unk0; - u8 unk1; - u16 unk2; - u16 unk4; - u16 unk6; -} struct_sub_080A698C; + if (sub_080A51F4() && (gMenu.field_0xc != NULL)) { + iVar1 = -1; + switch (gInput.newKeys) { + case START_BUTTON: + iVar1 = 0; + break; + case L_BUTTON: + iVar1 = 1; + break; + case R_BUTTON: + iVar1 = 2; + break; + case B_BUTTON: + iVar1 = 3; + break; + } + if (iVar1 >= 0) { + switch (bVar5 = gMenu.field_0xc[iVar1]) { + case 0: + break; + case 4 ... 6: + case 0xf: + uVar2 = GetInventoryValue(ITEM_MAP); + if (uVar2 == 0) { + iVar4 = 1; + if (iVar1 == 1) { + iVar4 = 2; + } + bVar5 = gMenu.field_0xc[iVar4]; + } + default: + gPauseMenuOptions.screen2 = bVar5; + SoundReq(SFX_TEXTBOX_OPEN); + gMenu.field_0xc = NULL; + break; + } + } + } + bVar5 = sub_080A50A0(gPauseMenuOptions.screen2); + if (gPauseMenuOptions.screen != bVar5) { + gPauseMenuOptions.screen2 = bVar5; + sub_080A51D4(); + if (bVar5 == 0xe) { + sub_080A4E90(6); + } else { + sub_080A4E90(3); + MemClear(&gBG0Buffer, sizeof(gBG0Buffer)); + gScreen.bg0.updated = 1; + } + } +} -extern void (*const gUnk_08128DCC[])(void); -void sub_080A6378(void); +s32 sub_080A50A0(s32 param_1) { + s32 iVar1; -extern void (*const gUnk_08128F24[])(void); -void sub_080A6E70(void); -void sub_080A6498(void); + if (param_1 == 0xf) { + iVar1 = AreaHasMap(); + param_1 = 4; + if (iVar1 != 0) { + param_1 = 5; + } + } + return param_1; +} -void sub_080A4DB8(u32); -void sub_080A6290(void); -u32 sub_080A6D74(u32); +void PauseMenu_Variant3(void) { + s32 iVar1; -extern const ScreenTransitionData gUnk_08128024[]; -void sub_080A71F4(const ScreenTransitionData* exitTransition); + iVar1 = gPauseMenuOptions.unk16 + 2; + if (0x10 < iVar1) { + gScreen.lcd.displayControl &= 0xf8ff; + sub_080A4E90(4); + iVar1 = 0x10; + } + gPauseMenuOptions.unk16 = iVar1; +} -extern void DeleteAllEntities(void); -extern void sub_0805E974(void); -extern bool32 sub_080A51F4(void); -extern u32 sub_0807CB24(u32, u32); -extern void sub_080A42E0(u32, u32); +void PauseMenu_Variant4(void) { + u32 t; + gPauseMenuOptions.unk16 = 0x10; + gPauseMenuOptions.screen = t = gPauseMenuOptions.screen2; + sub_080A4DB8(t); + sub_080A4E90(5); +} -extern void (*const gUnk_0812901C[])(void); +void PauseMenu_Variant5(void) { + s32 iVar1; -void sub_080A74F4(void); + iVar1 = gPauseMenuOptions.unk16 - 2; + if (iVar1 < 0) { + sub_080A4E90(2); + iVar1 = 0; + } + gPauseMenuOptions.unk16 = iVar1; +} + +void sub_080A5128(void) { + int r5, t; + struct { + int x; + int y; + } p[3]; + + switch (gPauseMenuOptions.screen) { + case PauseMenuScreen_7: + case PauseMenuScreen_8: + p[0].x = 0x60; + p[0].y = 0x18; + p[1].x = -0x10; + p[1].y = 0x48; + p[2].x = 0x100; + p[2].y = 0x48; + break; + case PauseMenuScreen_9: + case PauseMenuScreen_10: + case PauseMenuScreen_11: + return; + default: + p[0].x = 0x40; + p[0].y = 0x10 - (gPauseMenuOptions.unk16 << 1); + t = (gPauseMenuOptions.unk16 / 3); + p[1].x = 0x10 - t; + p[1].y = 0x48; + p[2].x = 0xe0 + t; + p[2].y = 0x48; + break; + } + gOamCmd._4 = 0; + gOamCmd._6 = 0; + gOamCmd._8 = 0x400; + gOamCmd.x = p[0].x; + gOamCmd.y = p[0].y; +#ifdef EU + r5 = 0x1fa; +#else + r5 = 0x1fb; +#endif + DrawDirect(r5, 0); + gOamCmd.x = p[1].x; + gOamCmd.y = p[1].y; + DrawDirect(r5, 1); + gOamCmd.x = p[2].x; + gOamCmd.y = p[2].y; + DrawDirect(r5, 2); +} -extern void UpdateCarriedObject(void); +void sub_080A51D4(void) { + u32 i = gPauseMenuOptions.screen; + if (i < 0xe) { + gPauseMenuOptions.unk2[i] = gMenu.field_0x3; // TODO cursor? + } +} -extern void (*const gSubtasks[])(void); +bool32 sub_080A51F4(void) { + bool32 retval = TRUE; + if (gFadeControl.active != 0) + retval = FALSE; + if (gPauseMenuOptions.unk11 != 2) + retval = FALSE; + return retval; +} typedef struct { + u8 up; + u8 down; + u8 left; + u8 right; + u8 type; u8 unk0; - u8 unk1; - u8 unk2; - u8 unk3; - u8 unk4; - s8 unk5; - u8 unk6; - u8 unk7; -} struct_gUnk_08128E94; + u8 x; + u8 y; +} ItemMenuTableEntry; + +void PauseMenu_ItemMenu(void) { + static Subtask* const pauseMenu_Types[] = { PauseMenu_ItemMenu_Init, PauseMenu_ItemMenu_Update }; + + pauseMenu_Types[gMenu.menuType](); + PauseMenu_ItemMenu_Draw(); +} + +void PauseMenu_ItemMenu_Init(void) { + static const KeyButtonLayout gUnk_08128B50 = { + 0xd0u, + 0x10u, + 0u, + 0xb8u, + 0x10u, + 0u, + 0xffu, + 0xd8u, + 0u, + { + 0x3u, + 0u, + 0x4u, + 0u, + 0u, + 0u, + 0x1u, + 0u, + 0xffu, + 0u, + 0u, + }, + }; -extern const struct_gUnk_08128E94 gUnk_08128E94[]; + u32 uVar1; + u32 i; + u32 item; + + gMenu.field_0xc = NULL; + sub_080A70AC((KeyButtonLayout*)&gUnk_08128B50); + for (item = ITEM_SMITH_SWORD; item < ITEM_BOTTLE_EMPTY; item++) { + uVar1 = GetInventoryValue(item); + if ((uVar1 == 1) && (i = gItemMetaData[item].menuSlot, i <= MENU_SLOT_SAVE_BUTTON_JP)) { + switch (item) { + case ITEM_LANTERN_OFF: + case ITEM_LANTERN_ON: + item = gPauseMenuOptions.unk15; + break; + default: + break; + } + gPauseMenu.items[i] = item; + sub_080A5F48(item, i * 8 + 0x360); + } + } + SetMenuType(1); +} + +const ItemMenuTableEntry gItemMenuTable[] = { + [MENU_SLOT_SWORD] = { MENU_SLOT_BOTTLE0, MENU_SLOT_SHIELD, MENU_SLOT_BOOMERANG, MENU_SLOT_GUST_JAR, 0x01, 0x0c, + 0x42, 0x33 }, + [MENU_SLOT_GUST_JAR] = { MENU_SLOT_BOTTLE1, MENU_SLOT_MOLE_MITTS, MENU_SLOT_SWORD, MENU_SLOT_CANE, 0x01, 0x10, 0x66, + 0x33 }, + [MENU_SLOT_CANE] = { MENU_SLOT_BOTTLE3, MENU_SLOT_LANTERN, MENU_SLOT_GUST_JAR, MENU_SLOT_BOOMERANG, 0x01, 0x14, + 0x8a, 0x33 }, + [MENU_SLOT_BOOMERANG] = { MENU_SLOT_SAVE_BUTTON, MENU_SLOT_BOMBS, MENU_SLOT_CANE, MENU_SLOT_SWORD, 0x01, 0x15, 0xae, + 0x33 }, + [MENU_SLOT_SHIELD] = { MENU_SLOT_SWORD, MENU_SLOT_PEGASUS_BOOTS, MENU_SLOT_BOMBS, MENU_SLOT_MOLE_MITTS, 0x01, 0x16, + 0x42, 0x4b }, + [MENU_SLOT_MOLE_MITTS] = { MENU_SLOT_GUST_JAR, MENU_SLOT_ROCS_CAPE, MENU_SLOT_SHIELD, MENU_SLOT_LANTERN, 0x01, 0x17, + 0x66, 0x4b }, + [MENU_SLOT_LANTERN] = { MENU_SLOT_CANE, MENU_SLOT_OCARINA, MENU_SLOT_MOLE_MITTS, MENU_SLOT_BOMBS, 0x01, 0x00, 0x8a, + 0x4b }, + [MENU_SLOT_BOMBS] = { MENU_SLOT_BOOMERANG, MENU_SLOT_BOW, MENU_SLOT_LANTERN, MENU_SLOT_SHIELD, 0x01, 0x00, 0xae, + 0x4b }, + [MENU_SLOT_PEGASUS_BOOTS] = { MENU_SLOT_SHIELD, MENU_SLOT_BOTTLE0, MENU_SLOT_BOW, MENU_SLOT_ROCS_CAPE, 0x01, 0x00, + 0x42, 0x63 }, + [MENU_SLOT_ROCS_CAPE] = { MENU_SLOT_MOLE_MITTS, MENU_SLOT_BOTTLE1, MENU_SLOT_PEGASUS_BOOTS, MENU_SLOT_OCARINA, 0x01, + 0x00, 0x66, 0x63 }, + [MENU_SLOT_OCARINA] = { MENU_SLOT_LANTERN, MENU_SLOT_BOTTLE3, MENU_SLOT_ROCS_CAPE, MENU_SLOT_BOW, 0x01, 0x00, 0x8a, + 0x63 }, + [MENU_SLOT_BOW] = { MENU_SLOT_BOMBS, MENU_SLOT_SAVE_BUTTON, MENU_SLOT_OCARINA, MENU_SLOT_PEGASUS_BOOTS, 0x01, 0x00, + 0xae, 0x63 }, + [MENU_SLOT_BOTTLE0] = { MENU_SLOT_PEGASUS_BOOTS, MENU_SLOT_SWORD, MENU_SLOT_SAVE_BUTTON, MENU_SLOT_BOTTLE1, 0x01, + 0x00, 0x42, 0x7b }, + [MENU_SLOT_BOTTLE1] = { MENU_SLOT_ROCS_CAPE, MENU_SLOT_GUST_JAR, MENU_SLOT_BOTTLE0, MENU_SLOT_BOTTLE2, 0x01, 0x00, + 0x5a, 0x7b }, + [MENU_SLOT_BOTTLE2] = { MENU_SLOT_ROCS_CAPE, MENU_SLOT_GUST_JAR, MENU_SLOT_BOTTLE1, MENU_SLOT_BOTTLE3, 0x01, 0x00, + 0x72, 0x7b }, + [MENU_SLOT_BOTTLE3] = { MENU_SLOT_OCARINA, MENU_SLOT_CANE, MENU_SLOT_BOTTLE2, MENU_SLOT_SAVE_BUTTON, 0x01, 0x00, + 0x8a, 0x7b }, + [MENU_SLOT_SAVE_BUTTON] = { MENU_SLOT_BOW, MENU_SLOT_BOOMERANG, MENU_SLOT_BOTTLE3, MENU_SLOT_BOTTLE0, 0x03, 0x00, + 0xb5, 0x75 }, + [MENU_SLOT_SAVE_BUTTON_JP] = { MENU_SLOT_BOW, MENU_SLOT_BOOMERANG, MENU_SLOT_BOTTLE3, MENU_SLOT_BOTTLE0, 0x05, 0x00, + 0xb5, 0x75 }, +}; + +void PauseMenu_ItemMenu_Update(void) { + static const u8 gUnk_08128BF4[] = { 14, 15, 2, 0 }; + u32 item; + u32 menuSlot; + const ItemMenuTableEntry* entry; + + if (sub_080A51F4()) { + gMenu.field_0xc = (u8*)gUnk_08128BF4; + menuSlot = gMenu.field_0x3; + + entry = &gItemMenuTable[menuSlot]; + switch (gInput.newKeys) { + case A_BUTTON: + if (menuSlot == MENU_SLOT_SAVE_BUTTON) { +#if defined(DEMO_USA) || defined(DEMO_JP) + SoundReq(SFX_MENU_ERROR); +#else + sub_080A4E84(0xb); + SoundReq(SFX_TEXTBOX_SELECT); +#endif + break; + } + case B_BUTTON: + if (gPauseMenu.items[menuSlot] != 0) { + u32 slot = !!(gInput.newKeys ^ 1); + ForceEquipItem(gPauseMenu.items[menuSlot], slot); + SoundReq(SFX_TEXTBOX_SELECT); + } + break; + default: + switch (gInput.unk4) { + case DPAD_UP: + menuSlot = entry->up; + break; + case DPAD_DOWN: + menuSlot = entry->down; + break; + case DPAD_LEFT: + menuSlot = entry->left; + break; + case DPAD_RIGHT: + menuSlot = entry->right; + break; + } + break; + } + if (gMenu.field_0x3 != menuSlot) { + gMenu.field_0x3 = menuSlot; + SoundReq(SFX_TEXTBOX_CHOICE); + } + item = gPauseMenu.items[menuSlot]; + switch (menuSlot) { + case MENU_SLOT_BOTTLE0: + case MENU_SLOT_BOTTLE1: + case MENU_SLOT_BOTTLE2: + case MENU_SLOT_BOTTLE3: + if (item != 0) { + item = gSave.saved_status.field_0x24[item - 6]; + } + break; + case MENU_SLOT_SAVE_BUTTON: + // ITEM_SKILL_FAST_SPIN, but that does not make any sense at all + // it is just a text index for the text in the message box for the save button + item = 0x73; + break; + default: + break; + } + sub_080A6F6C(TEXT_INDEX(TEXT_ITEMS, 0) + item); + } +} + +u32 GetMenuSlotForItem(u32 item); + +extern Frame* gSpriteAnimations_322[]; + +#ifdef EU +#define sub_080A5384_draw_constant0 0x1fa +#define sub_080A5384_draw_constant1 0x141 +#else +#define sub_080A5384_draw_constant0 0x1fb +#define sub_080A5384_draw_constant1 0x142 +#endif +void PauseMenu_ItemMenu_Draw(void) { + u32 tmp; + u32 i; + s32 color; + const ItemMenuTableEntry* entry; + + gOamCmd._4 = 0x400; + gOamCmd._6 = 0; + gOamCmd._8 = 0; + for (i = 0; i < MENU_SLOT_COUNT; i++) { + u32 item; + if (gPauseMenu.items[i] != 0) { + entry = &gItemMenuTable[i]; + gOamCmd.x = entry->x; + gOamCmd.y = entry->y; + item = gPauseMenu.items[i]; + switch (item) { + case ITEM_BOTTLE1: + case ITEM_BOTTLE2: + case ITEM_BOTTLE3: + case ITEM_BOTTLE4: + item = gSave.stats.bottles[item - ITEM_BOTTLE1]; + break; + default: + break; + } + color = 3; + switch (item) { + case ITEM_BOMBS: + case ITEM_REMOTE_BOMBS: + if (gBombBagSizes[gSave.stats.bombBagType] <= gSave.stats.bombCount) { + color = 4; + } + break; + case ITEM_BOW: + case ITEM_LIGHT_ARROW: + if (gQuiverSizes[gSave.stats.quiverType] <= gSave.stats.arrowCount) { + color = 4; + } + break; + default: + break; + } + gOamCmd._8 = 0x800 | color << 0xc | ((i * 8) + 0x360); + DrawDirect(sub_080A5384_draw_constant1, gSpriteAnimations_322[item]->index); + } + } + gOamCmd._8 = 0x800; + { + u32 slot = gMenu.field_0x3; + if ((slot == MENU_SLOT_SAVE_BUTTON) && (gSaveHeader->language != 0)) { + slot = MENU_SLOT_SAVE_BUTTON_JP; + } + entry = &gItemMenuTable[slot]; + gOamCmd.x = entry->x; + gOamCmd.y = entry->y; + tmp = entry->type + ((gMain.ticks & 0x10) != 0 ? 3 : 4); + DrawDirect(sub_080A5384_draw_constant0, tmp); + } + { + u32 slot; + if (gSaveHeader->language != 0) { + slot = MENU_SLOT_SAVE_BUTTON; + } else { + slot = MENU_SLOT_SAVE_BUTTON_JP; + } + entry = &gItemMenuTable[slot]; + gOamCmd.x = entry->x; + gOamCmd.y = entry->y; + gOamCmd._8 = 0x800; + DrawDirect(sub_080A5384_draw_constant0, 0x22); + } + i = GetMenuSlotForItem(gSave.stats.itemButtons[SLOT_A]); + if (i < MENU_SLOT_COUNT) { + entry = &gItemMenuTable[i]; + gOamCmd.x = entry->x; + gOamCmd.y = entry->y; + DrawDirect(sub_080A5384_draw_constant0, 3); + } + i = GetMenuSlotForItem(gSave.stats.itemButtons[SLOT_B]); + if (i < MENU_SLOT_COUNT) { + entry = &gItemMenuTable[i]; + gOamCmd.x = entry->x; + gOamCmd.y = entry->y; + DrawDirect(sub_080A5384_draw_constant0, 3); + } +} + +u32 GetMenuSlotForItem(u32 item) { + u32 i; + + if (item != 0) { + for (i = 0; i < MENU_SLOT_COUNT; i++) { + if (item == gPauseMenu.items[i]) + return i; + } + } + return MENU_SLOT_SAVE_BUTTON_JP; +} + +Subtask sub_080A5594; +Subtask sub_080A56A0; +void PauseMenu2(void) { + static Subtask* const pauseMenu2_Types[] = { + sub_080A5594, + sub_080A56A0, + }; + pauseMenu2_Types[gMenu.menuType](); + sub_080A57F4(); +} + +//// TODO Moved here from subtask2.c +// Probably could split the different screens of the pause menu. +#include "fileselect.h" +#include "flags.h" + +extern u8 gUnk_08128C00[]; +extern u16 gUnk_02017830[]; +extern u8 gUnk_08128D38[]; +extern u8 gUnk_08128D43[]; +extern u16* gMoreSpritePtrs[]; +extern u32 gUnk_085C4620[]; +extern void (*const gUnk_08128D58[])(void); +extern KeyButtonLayout gUnk_08128D60; + +void sub_080A5D1C(); +void sub_080A5CFC(u32, void*, u32); +void sub_080A6FB4(u32, u32); +void DrawDungeonFeatures(u32, void*, u32); +extern void DrawDungeonMap(u32 floor, struct_02019EE0* data, u32 size); +extern void LoadDungeonMap(void); +bool32 sub_080A5F24(void); +extern void sub_080A42E0(u32, u32); +extern void (*const gUnk_08128DB0[])(void); +void sub_080A617C(void); +void sub_080A7040(u32); + +extern u8 gUnk_08128DB8[]; +extern KeyButtonLayout gUnk_08128DBC; + +extern void (*const gUnk_08128DCC[])(void); +void sub_080A6378(void); +void sub_080A6438(); typedef struct { u8 unk0; @@ -156,18 +629,6 @@ typedef struct { } gUnk_08128DE8_struct; extern gUnk_08128DE8_struct gUnk_08128DE8[]; -typedef struct { - u8 item; - u8 unk1; - u8 frameIndex; - u8 unk3; - u8 unk4; - s8 unk5; - u16 unk6; -} struct_gUnk_08128D70; - -extern const struct_gUnk_08128D70 gUnk_08128D70[]; - void sub_080A5594(void) { extern KeyButtonLayout gUnk_08128C04; int iVar1; @@ -239,7 +700,7 @@ void sub_080A5594(void) { void sub_080A56A0(void) { int iVar1; u32 uVar2; - u32 uVar4; + u32 item; struct_gUnk_08128C14* ptr; if (!sub_080A51F4()) { @@ -315,28 +776,28 @@ void sub_080A56A0(void) { } uVar2 = gMenu.field_0x3; - uVar4 = gGenericMenu.unk10.a[uVar2]; - if (uVar4 != 0) { + item = gGenericMenu.unk10.a[uVar2]; + if (item != 0) { switch (uVar2) { case 0: - if (uVar4 != 0x3d) { - uVar4 = 0x67; + if (item != 0x3d) { + item = 0x67; } break; case 1: - uVar4 = 99; + item = 99; break; case 2: - uVar4 = 0x70; + item = 0x70; break; case 4: - uVar4 = 0x74; + item = 0x74; break; case 5: - uVar4 = 0x73; + item = 0x73; } } - sub_080A6F6C(uVar4 + 0x400); + sub_080A6F6C(TEXT_INDEX(TEXT_ITEMS, 0) + item); } void sub_080A57F4(void) { @@ -431,7 +892,7 @@ void sub_080A57F4(void) { } } -void sub_080A5990(void) { +void PauseMenu_Screen_10(void) { extern void (*const gUnk_08128D14[])(void); gUnk_08128D14[gMenu.menuType](); } @@ -512,7 +973,7 @@ void sub_080A5A90(void) { } break; case 0xff: - if (gPauseMenuOptions.unk1 == 10) { + if (gPauseMenuOptions.screen == 10) { uVar1 = 2; } else { uVar1 = 1; @@ -525,7 +986,7 @@ void sub_080A5A90(void) { } } -void sub_080A5AD8() { +void PauseMenu_Screen_9() { extern void (*const gUnk_08128D24[])(void); gUnk_08128D24[gMenu.menuType](); } @@ -600,7 +1061,7 @@ void sub_080A5BB8(void) { } } -void sub_080A5BF0(void) { +void PauseMenu_Screen_5(void) { extern void (*const gUnk_08128D30[])(void); u32 uVar1; u32 temp; @@ -667,10 +1128,11 @@ void sub_080A5CFC(u32 menuType, void* param_2, u32 param_3) { #define SUB_080A5D1C_SPRITE_INDEX 0x144 #endif +// Actually draw the sprites for the dungeon map. void sub_080A5D1C(void) { extern u8 gUnk_08128D3C[]; u32 bVar1; - int iVar3; + int frameIndex; u32 uVar4; u32 uVar6; u32 index; @@ -693,19 +1155,19 @@ void sub_080A5D1C(void) { gOamCmd._8 = 0x4380; if (HasDungeonSmallKey()) { gOamCmd.x = 0x18; - iVar3 = gSpriteAnimations_322[0x50]->index; - DrawDirect(SUB_080A5D1C_SPRITE_INDEX, iVar3); + frameIndex = gSpriteAnimations_322[0x50]->index; + DrawDirect(SUB_080A5D1C_SPRITE_INDEX, frameIndex); } if (HasDungeonCompass()) { gOamCmd.x = 0x2e; - iVar3 = gSpriteAnimations_322[0x52]->index; - DrawDirect(SUB_080A5D1C_SPRITE_INDEX, iVar3); + frameIndex = gSpriteAnimations_322[0x52]->index; + DrawDirect(SUB_080A5D1C_SPRITE_INDEX, frameIndex); } if (HasDungeonBigKey()) { gOamCmd.x = 0x45; gOamCmd._8 = 0x380; - iVar3 = gSpriteAnimations_322[0x51]->index; - DrawDirect(SUB_080A5D1C_SPRITE_INDEX, iVar3); + frameIndex = gSpriteAnimations_322[0x51]->index; + DrawDirect(SUB_080A5D1C_SPRITE_INDEX, frameIndex); if (sub_080A5F24()) { gOamCmd._8 = 0; gOamCmd.x = 0x46; @@ -721,11 +1183,11 @@ void sub_080A5D1C(void) { gOamCmd._8 = 0; gOamCmd.x = 0x34; gOamCmd.y = bVar1; - iVar3 = pbVar9->unk_1 + 0x82; + frameIndex = pbVar9->unk_1 + 0x82; for (index = 0; index < pbVar9->unk_0; index++) { - DrawDirect(DRAW_DIRECT_SPRITE_INDEX, iVar3); - iVar3--; + DrawDirect(DRAW_DIRECT_SPRITE_INDEX, frameIndex); + frameIndex--; gOamCmd.y = gOamCmd.y + 0xc; } @@ -733,30 +1195,30 @@ void sub_080A5D1C(void) { while (*puVar8 != 0) { switch (*puVar8) { case 1: - iVar3 = 0x7d; + frameIndex = 0x7d; if (uVar4 != gMenu.field_0x3) { - iVar3 = 0x7e; + frameIndex = 0x7e; } break; case 2: - iVar3 = 0x80; + frameIndex = 0x80; break; case 3: - iVar3 = 0x81; + frameIndex = 0x81; break; case 4: if (sub_080A5F24()) { - iVar3 = 0x7f; + frameIndex = 0x7f; break; } default: - iVar3 = 0xff; + frameIndex = 0xff; break; } gOamCmd.x = puVar8[1] + 0x50 - gScreen.bg1.xOffset; gOamCmd.y = puVar8[2] + 0x10 - gScreen.bg1.yOffset; - DrawDirect(DRAW_DIRECT_SPRITE_INDEX, iVar3); + DrawDirect(DRAW_DIRECT_SPRITE_INDEX, frameIndex); puVar8 += 3; } } @@ -813,7 +1275,7 @@ void sub_080A5F48(u32 param_1, u32 param_2) { } } -void sub_080A6008(void) { +void PauseMenu_Screen_7(void) { gUnk_08128D58[gMenu.menuType](); } @@ -857,7 +1319,7 @@ void sub_080A6044(void) { } } -void sub_080A60E0(void) { +void PauseMenu_Screen_8(void) { gUnk_08128DB0[gMenu.menuType](); sub_080A617C(); sub_080A7040(gMenu.field_0x3); @@ -936,7 +1398,7 @@ void sub_080A617C(void) { } } -void sub_080A6270(void) { +void PauseMenu_Screen_4(void) { gUnk_08128DCC[gMenu.menuType](); sub_080A6378(); } @@ -1026,7 +1488,7 @@ void sub_080A6378(void) { void sub_080A6438(void) { u32 uVar1; - sturct_gUnk_08128F58* pcVar2; + struct_gUnk_08128F58* pcVar2; u32 uVar3; gOamCmd._4 = 0x400; @@ -1058,815 +1520,3 @@ void sub_080A6498(void) { } gScreen.controls.windowOutsideControl = 0x3d3f; } - -void Subtask_MapHint(void) { - extern void (*const gUnk_08128E70[])(void); - FlushSprites(); - gUnk_08128E70[gMenu.menuType](); - if ((gGenericMenu.unk2c & 0x20) != 0) { - sub_080A6438(); - } - sub_080A6498(); - CopyOAM(); -} - -void sub_080A6534(void) { - extern const u16 gUnk_08128F4C[]; - u32 val; - sub_080A4D34(); - sub_080A4DB8(4); - sub_080A6290(); - gScreen.lcd.displayControl = gScreen.lcd.displayControl & 0xf7ff; - SetColor(0, gPaletteBuffer[0x51]); - val = gUnk_08128F4C[gUI.field_0x3]; - gSave.field_0x20 |= val; - gGenericMenu.unk10.h[1] = val & gGenericMenu.unk10.h[0]; - gGenericMenu.unk10.h[0] = 0; - gMenu.transitionTimer = 60; - SetMenuType(1); - SetFade(FADE_INSTANT, 8); -} - -void sub_080A65AC(void) { - if (!gFadeControl.active) { - gGenericMenu.unk2c++; - switch (gMenu.transitionTimer) { - case 0x1e: - gGenericMenu.unk10.h[0] = gGenericMenu.unk10.h[1]; - gGenericMenu.unk2c = 0x20; - SoundReq(SFX_103); - default: - gMenu.transitionTimer--; - break; - case 0: - switch (gInput.newKeys) { - case A_BUTTON: - case B_BUTTON: - case START_BUTTON: - Subtask_Exit(); - break; - } - break; - } - } -} - -void sub_080A6608(void) { - extern void (*const gUnk_08128E78[])(void); - const struct_gUnk_08128E94* ptr; - gUnk_08128E78[gMenu.menuType](); - ptr = &gUnk_08128E94[gMenu.field_0x3]; - gScreen.bg1.yOffset = -ptr->unk5; - gScreen.bg2.yOffset = gMenu.field_0xa - (s8)ptr->unk6; - sub_080A66D0(); -} - -void sub_080A6650(void) { - extern u8 gUnk_08128E84[]; - u32 temp; - sub_080A70AC((KeyButtonLayout*)gUnk_08128E84); - temp = gPauseMenuOptions.unk2[4]; - gMenu.field_0x3 = temp; - sub_080A67C4(temp); - sub_080A68D4(); - SetMenuType(1); -} - -void sub_080A667C(void) { - u32 uVar1; - u32 uVar2; - const struct_gUnk_08128E94* ptr; - - gMenu.field_0xc = gUnk_08128E80; - ptr = &gUnk_08128E94[gMenu.field_0x3]; - uVar2 = gMenu.field_0xa; - switch (gInput.heldKeys) { - case DPAD_UP: - if (uVar2 != 0) { - uVar2 -= 2; - } - break; - case DPAD_DOWN: - uVar1 = ptr->unk2; - if (uVar1 > uVar2) { - uVar2 += 2; - } - if (uVar1 < uVar2) { - uVar2 = uVar1; - } - break; - } - - gMenu.field_0xa = uVar2; - sub_080A6FB4(gMenu.field_0x3, 0); -} - -void sub_080A66D0(void) { - u32 bVar2; - u32 bVar3; - u8 bVar4; - u32 uVar5; - u32 uVar8; - struct_sub_080A698C* ptr; - const struct_gUnk_08128E94* ptr2; - - gOamCmd._4 = 0; - gOamCmd._6 = 0; - gOamCmd.x = 0x78; - ptr2 = &gUnk_08128E94[gMenu.field_0x3]; - gGenericMenu.unk2c++; - if (gGenericMenu.unk2b != 1 && ((gGenericMenu.unk2c & 0x10) != 0)) { - gOamCmd._8 = 0x800; - if (gMenu.field_0xa != 0) { - gOamCmd.y = 0xc; - DrawDirect(DRAW_DIRECT_SPRITE_INDEX, 0x71); - } - if (ptr2->unk2 > gMenu.field_0xa) { - gOamCmd.y = 0x84; - DrawDirect(DRAW_DIRECT_SPRITE_INDEX, 0x72); - } - } - bVar2 = ptr2->unk7; - bVar3 = ptr2->unk3; - uVar5 = gMenu.field_0xa; - gOamCmd._4 = 0; - gOamCmd._6 = 0; - gOamCmd._8 = 0xc00; - bVar4 = gGenericMenu.unk2c & 0x20; - - for (ptr = (struct_sub_080A698C*)&gMapDataBottomSpecial; ptr->unk2 != 0; ptr++) { - uVar8 = 0; - if (ptr->unk0 == 1) { - if (bVar4 != 0) { - uVar8 = 1; - } - } else if (bVar4 == 0) { - uVar8 = 1; - } - - if (uVar8 != 0) { - gOamCmd.x = ptr->unk4 + bVar2; - gOamCmd.y = ptr->unk6 + bVar3 - uVar5; - DrawDirect(ptr->unk2, ptr->unk1); - } - } -} - -void sub_080A67C4(u32 param_1) { - u16* puVar2; - int i; - int iVar4; - s32 room; - const struct_gUnk_08128E94* ptr; - - LoadPaletteGroup(param_1 + 0xba); - iVar4 = param_1 + 0x5f; - switch (param_1) { - case 0x9: - if (CheckGlobalFlag(TATEKAKE_HOUSE)) { - iVar4 = 0x70; - } - break; - case 0xb: - if (CheckKinstoneFused(KINSTONE_E)) { - iVar4 = 0x71; - } - break; - case 0xe: - if (gUI.roomControls.area == 8) { - room = gUI.roomControls.room; - iVar4 = (u8)(room % 3) + 0x72; - } - break; - } - - LoadGfxGroup(iVar4); - ptr = &gUnk_08128E94[param_1]; - puVar2 = &gUnk_02017AA0[gUnk_03003DE4[0] * 0x500]; - - for (i = 0; i <= 7; puVar2++, i++) { - *puVar2 = 0x1e0a; - } - - for (i = 8; i < (int)(ptr->unk5 + ptr->unk4); puVar2++, i++) { - *puVar2 = 0x1e0b; - } - - for (; i < 0xa0; puVar2++, i++) { - *puVar2 = 0x1e0a; - } - - SetVBlankDMA((u16*)&gUnk_02017AA0[gUnk_03003DE4[0] * 0x500], (u16*)REG_ADDR_BG3CNT, - ((DMA_ENABLE | DMA_START_HBLANK | DMA_16BIT | DMA_REPEAT | DMA_SRC_INC | DMA_DEST_RELOAD) << 16) + - 0x1); - gMenu.field_0xa = ptr->unk2 >> 1; - MemClear(&gMapDataBottomSpecial, 0x400); -} - -void sub_080A68D4(void) { - u32 uVar1; - int iVar6; - sturct_gUnk_08128F58* pcVar4; - u32 i; - u32 uVar4; - struct_080FE320* ptr; - - if ((gPlayerState.flags & PL_NO_CAP) != 0) { - iVar6 = 101; - } else { - iVar6 = 100; - } - sub_080A698C(gRoomTransition.player_status.overworld_map_x, gRoomTransition.player_status.overworld_map_y, - DRAW_DIRECT_SPRITE_INDEX, iVar6 + 0x100); - uVar1 = sub_080A6F40(); - uVar1 &= gSave.field_0x20; - - for (pcVar4 = gUnk_08128F58, i = 0; pcVar4->frameIndex != 0; i++, pcVar4++) { - if (((1 << i) & uVar1) != 0) { - sub_080A698C(pcVar4->unk4, pcVar4->unk6, DRAW_DIRECT_SPRITE_INDEX, pcVar4->unk3); - } - } - - for (i = 10; i <= 100; i++) { - if (CheckKinstoneFused(i) && !sub_0801E810(i)) { - uVar4 = gUnk_080C9CBC[i].unk7; - ptr = &gUnk_080FE320[gUnk_080C9CBC[i].evt_type]; - sub_080A698C(ptr->_c, ptr->_e, DRAW_DIRECT_SPRITE_INDEX, uVar4 + 100); - } - } -} - -void sub_080A698C(u32 param_1, u32 param_2, u32 param_3, u32 param_4) { - int iVar1; - - iVar1 = sub_080A69E0(param_1, param_2); - if (0 < iVar1) { - ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk0 = param_4 >> 8; - ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk1 = param_4; - ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk2 = param_3; - ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk4 = iVar1; - ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk6 = iVar1 >> 0x10; - gGenericMenu.unk2d++; - } -} - -s32 sub_080A69E0(u32 param_1, u32 param_2) { - const struct_08127F94* pbVar1; - int iVar3; - - if ((param_1 | param_2) == 0) - return -1; - - pbVar1 = sub_080A6A80(param_1, param_2); - if (pbVar1 == NULL) - return -1; - - if (gMenu.field_0x3 != pbVar1->_4) - return -1; - - switch (gMenu.field_0x3) { - case 4: - case 7: - if (gMenu.field_0x3 == 4) { - iVar3 = 9; - } else { - iVar3 = 7; - } - param_2 -= gAreaRoomHeaders[iVar3]->map_y; - break; - break; - case 15: - param_1 -= 0x108; - break; - } - - param_1 = (s32)((param_1 - pbVar1->_0 * 0x10) * 100) / 0x23a; - param_2 = (s32)((param_2 - pbVar1->_1 * 0x10) * 100) / 0x23a; - return (param_2 << 0x10) | param_1; -} - -struct_08127F94* sub_080A6A80(u32 param_1, u32 param_2) { - struct_08127F94* pbVar1; - param_1 >>= 4; - param_2 >>= 4; - - for (pbVar1 = gUnk_08127F94; pbVar1->_0 != 0xff; pbVar1++) { - if (pbVar1->_0 <= param_1 && pbVar1->_2 >= param_1 && pbVar1->_1 <= param_2 && pbVar1->_3 >= param_2) { - return pbVar1; - } - } - return NULL; -} - -void Subtask_LocalMapHint() { - extern void (*const gUnk_08128F1C[])(void); - const struct_gUnk_08128E94* ptr; - FlushSprites(); - gUnk_08128F1C[gMenu.menuType](); - ptr = &gUnk_08128E94[gMenu.field_0x3]; - gScreen.bg1.yOffset = -ptr->unk5; - gScreen.bg2.yOffset = gMenu.field_0xa - (s8)ptr->unk6; - CopyOAM(); -} - -void sub_080A6B04(void) { - u32 bVar1; - u32 uVar2; - u32 uVar3; - u32 uVar4; - int uVar6; - u32 uVar7; - const struct_080C9CBC* ptr; - struct_080FE320* ptr2; - const struct_gUnk_08128E94* ptr3; - - sub_080A4D34(); - sub_080A4DB8(6); - ptr = &gUnk_080C9CBC[gFuseInfo._3]; - ptr2 = &gUnk_080FE320[ptr->evt_type]; - bVar1 = ptr->unk7; - uVar3 = ptr2->_c; - uVar4 = ptr2->_e; - uVar2 = sub_080A6A80(uVar3, uVar4)->_4; - gMenu.field_0x3 = uVar2; - gGenericMenu.unk2b = 1; - sub_080A67C4(uVar2); - sub_080A6FB4(uVar2, 2); - SetColor(0, 0x475f); - SetColor(0x5f, 0x475f); - MemFill16(0x5001, &gBG3Buffer, sizeof(gBG3Buffer)); - if ((gPlayerState.flags & PL_NO_CAP) != 0) { - uVar7 = 101; - } else { - uVar7 = 100; - } - sub_080A698C(gRoomTransition.player_status.overworld_map_x, gRoomTransition.player_status.overworld_map_y, - DRAW_DIRECT_SPRITE_INDEX, uVar7 + 0x100); - sub_080A698C(uVar3, uVar4, DRAW_DIRECT_SPRITE_INDEX, bVar1 + 100); - uVar4 = sub_080A69E0(uVar3, uVar4) >> 0x10; - ptr3 = &gUnk_08128E94[gMenu.field_0x3]; - gMenu.field_0xa = 0; - if (ptr3->unk2 != 0) { - uVar6 = uVar4 - 0x3c; - if (uVar6 > 0) { - if (ptr3->unk2 < uVar6) { - uVar6 = ptr3->unk2; - } - gMenu.field_0xa = uVar6; - } - } - gMenu.transitionTimer = 30; - SetMenuType(1); - SetFade(FADE_INSTANT, 8); -} - -void sub_080A6C1C(void) { - if (!gFadeControl.active) { - switch (gMenu.transitionTimer) { - case 0: - sub_080A66D0(); - switch (gInput.newKeys) { - case A_BUTTON: - case B_BUTTON: - case START_BUTTON: - Subtask_Exit(); - break; - } - return; - case 1: - SoundReq(SFX_103); - break; - } - gMenu.transitionTimer--; - } -} - -void Subtask_FastTravel(void) { - FlushSprites(); - gUnk_08128F24[gMenu.menuType](); - if (gMenu.field_0x0 != 0) { - sub_080A6E70(); - } - sub_080A6498(); - CopyOAM(); -} - -void sub_080A6CA8(void) { - sub_080A4D34(); - sub_080A4DB8(0xd); - sub_080A6290(); - gMenu.field_0x3 = sub_080A6D74(0); - SetMenuType(1); - SetFade(FADE_INSTANT, 8); -} - -void sub_080A6CD8(void) { - u32 uVar1; - u32 uVar2; - - if (gFadeControl.active) { - return; - } - - gMenu.field_0x0 = 1; - uVar2 = 0; - - switch (gInput.newKeys) { - case DPAD_LEFT: - case DPAD_UP: - uVar2 = -1; - break; - case DPAD_RIGHT: - case DPAD_DOWN: - uVar2 = 1; - break; - case A_BUTTON: - case START_BUTTON: - gMenu.field_0x0 = 2; - SetMenuType(2); - MessageFromTarget(TEXT_INDEX(TEXT_WINDCRESTS, 0x04)); - break; - case B_BUTTON: - gMenu.field_0x0 = 3; - SetMenuType(3); - break; - } - - if (uVar2) { - uVar1 = sub_080A6D74(uVar2); - if (uVar1 != gMenu.field_0x3) { - gMenu.field_0x3 = uVar1; - SoundReq(SFX_TEXTBOX_CHOICE); - } - } -} - -u32 sub_080A6D74(u32 param_1) { - u32 uVar1; - u32 uVar2; - u32 uVar3; - - uVar3 = gSave.windcrests >> 0x18; - uVar2 = gMenu.field_0x3; - if (param_1 == 0) { - uVar2 = 0; - if ((uVar3 & 1) == 0) { - while (++uVar2 < 8 && ((1 << uVar2) & uVar3) == 0) {} - } - } else if (uVar3 != 0) { - do { - uVar2 = (uVar2 + param_1 + 8) & 7; - } while ((1 << uVar2 & uVar3) == 0); - } - return uVar2 & 7; -} - -void sub_080A6DD0(void) { - u32 tmp; - switch (sub_08056338()) { -#ifdef EU - case 0: - gMenu.field_0x0 = 2; - break; - case 1: - gMenu.field_0x0 = 3; - tmp = 1; - break; - default: - return; - } - - if (tmp) { - SetMenuType(3); - } -#else - case 0: - gMenu.field_0x0 = 2; - tmp = 3; - break; - case 1: - tmp = 1; - break; - default: - return; - } - SetMenuType(tmp); -#endif -} - -void sub_080A6DF8(void) { - if (gMenu.field_0x0 == 2) { - SetMenuType(4); - SetFade(FADE_IN_OUT | FADE_INSTANT, 8); - } else { - ResetPlayerAnimationAndAction(); - sub_080042D0(&gPlayerEntity, (u32)gPlayerEntity.animIndex, gPlayerEntity.spriteIndex); - Subtask_Exit(); - gPauseMenuOptions.disabled = 0; - SoundReq(SFX_MENU_CANCEL); - } -} - -void sub_080A6E44(void) { - if (gFadeControl.active == 0) { - sub_080A71F4(&gUnk_08128024[gMenu.field_0x3]); - } -} - -void sub_080A6E70(void) { - u32 frameIndex; - u32 i; - - gOamCmd._4 = 0; - gOamCmd._6 = 0; - gOamCmd._8 = 0x400; - gGenericMenu.unk2c++; - sub_080A6EE0(gMenu.field_0x3); - if ((gGenericMenu.unk2c & 0x10) != 0) { - frameIndex = 0x5d; - } else { - frameIndex = 0x5e; - } - - DrawDirect(DRAW_DIRECT_SPRITE_INDEX, frameIndex); - for (i = 0; i < 8; i++) { - if ((gSave.windcrests & (1 << (i + 0x18))) != 0) { - sub_080A6EE0(i); - DrawDirect(DRAW_DIRECT_SPRITE_INDEX, 0x5c); - } - } -} - -void sub_080A6EE0(u32 param_1) { - u32 x; - u32 y; - RoomHeader* roomHeader; - const ScreenTransitionData* ptr = &gUnk_08128024[param_1]; - - x = (u16)ptr->playerXPos; - y = (u16)ptr->playerYPos; - roomHeader = &gAreaRoomHeaders[ptr->area][ptr->room]; - x += roomHeader->map_x; - y += roomHeader->map_y; - gOamCmd.x = (s32)(x * DISPLAY_HEIGHT) / 0xf90 + 0x28; - gOamCmd.y = (s32)(y * DISPLAY_HEIGHT) / 0xf90 + 0xc; -} - -u32 sub_080A6F40(void) { - extern u8 gUnk_08128F38[]; - int iVar1; - u8* pcVar2; - u32 uVar3; - u32 uVar4; - - for (uVar3 = 0, pcVar2 = gUnk_08128F38, uVar4 = 0; *pcVar2 != 0; uVar3++, pcVar2 += 2) { - uVar4 |= sub_0807CB24(*pcVar2, pcVar2[1]) << uVar3; - } - return ~uVar4; -} - -void sub_080A6F6C(u32 param_1) { - extern Font gUnk_08128FA8; - if (gGenericMenu.unk2e.HWORD != param_1) { - gGenericMenu.unk2e.HWORD = param_1; - MemClear(gUnk_020350F0, 0x100); - if ((param_1 & 0xff) != 0) { - sub_0805F46C(param_1, &gUnk_08128FA8); - } - gScreen.bg0.updated = 1; - } - gScreen.bg0.yOffset = 2; -} - -void sub_080A6FB4(u32 param_1, u32 param_2) { - extern u16 gUnk_08128FF0[]; - extern Font gUnk_08128FD8; - extern Font gUnk_08128FC0; - u32 uVar1; - Font* font; - - uVar1 = 0; - switch (param_2) { - case 0: - if ((gSave.windcrests & (1 << param_1)) == 0) - break; - case 2: - uVar1 = gUnk_08127F94[param_1]._6; - font = &gUnk_08128FC0; - break; - case 1: - uVar1 = gUnk_08128FF0[param_1]; - font = &gUnk_08128FD8; - break; - } - - if (gGenericMenu.unk2e.HWORD != uVar1) { - gGenericMenu.unk2e.HWORD = uVar1; - MemClear(&gUnk_020350F0, 0x100); - if ((uVar1 & 0xff) != 0) { - sub_0805F46C(uVar1, font); - } - gScreen.bg0.updated = 1; - } - gScreen.bg0.yOffset = 2; -} - -void sub_080A7040(u32 param_1) { - extern Font gUnk_08129004; - extern u8 gUnk_02022130[]; - if (gGenericMenu.unk2e.HWORD != param_1) { - gGenericMenu.unk2e.HWORD = param_1; - MemClear(gUnk_02022130, 0x300); - MemCopy(gUnk_02022130 - 0x200, (void*)0x600e000, 0x800); - if (GetInventoryValue(gUnk_08128D70[param_1].item) != 0) { - sub_0805F46C(gUnk_08128D70[param_1].unk6, &gUnk_08129004); - } - gScreen.bg1.yOffset = 3; - gScreen.bg1.updated = 1; - } -} - -void sub_080A70AC(const KeyButtonLayout* layout) { - MemClear(&gUnk_0200AF00.elements, 0x300); - gUnk_0200AF00.unk_13 = 0x7f; - gUnk_0200AF00.unk_14 = 0x7f; - gUnk_0200AF00.buttonX[0] = layout->aButtonX; - gUnk_0200AF00.buttonY[0] = (s8)layout->aButtonY; - gUnk_0200AF00.unk_30[0] = layout->aButtonText; - gUnk_0200AF00.buttonX[1] = layout->bButtonX; - gUnk_0200AF00.buttonY[1] = (s8)layout->bButtonY; - gUnk_0200AF00.unk_30[1] = layout->bButtonText; - gUnk_0200AF00.buttonX[2] = layout->rButtonX; - gUnk_0200AF00.buttonY[2] = (s8)layout->rButtonY; - gUnk_0200AF00.unk_32 = layout->rButtonText; - layout++; - do { - CreateUIElement(layout->aButtonX, layout->aButtonY); - layout = (KeyButtonLayout*)&layout->aButtonText; - } while ((s8)layout->aButtonX != -1); -} - -void SetMenuType(u32 menuType) { - gMenu.menuType = menuType; - gMenu.overlayType = 0; - gMenu.storyPanelIndex = 0; -} - -void ResetUI(void) { - MemClear(&gUI, sizeof(gUI)); -} - -void MenuFadeIn(u32 param_1, u32 param_2) { - if (gUI.nextToLoad == 0) { - MemClear(&gUI, sizeof(gUI)); - gUI.lastState = param_1; - gUI.field_0x3 = param_2; - gUI.pauseFadeIn = gMain.substate; - } else { - gUI.state = param_1; - gUI.field_0x5 = param_2; - gUI.nextToLoad = 1; - } - gUI.field_0x6 = 0; - gUI.fadeType = -1; - gUI.fadeInTime = 0x20; - gMain.substate = GAMEMAIN_SUBTASK; - SetFade(FADE_IN_OUT | FADE_INSTANT, 0x20); - gUnk_02018EB0.unk_0 = 0; - gUnk_02018EB0.unk_1 = 0; -} - -void sub_080A71A4(u32 param_1, u32 param_2, u32 param_3) { - if (gUI.nextToLoad == 0) { - gUI.unk_e = param_3; - } else { - gUI.unk_f = param_3; - } - MenuFadeIn(param_1, param_2); -} - -void sub_080A71C4(u32 param_1, u32 param_2, u32 fadeType, u32 param_4) { - MenuFadeIn(param_1, param_2); - gUI.fadeType = fadeType; - gUI.fadeInTime = param_4; -} - -void Subtask_Exit(void) { - gUI.nextToLoad = 3; - SetFade(FADE_IN_OUT | FADE_INSTANT, 0x20); -} - -void sub_080A71F4(const ScreenTransitionData* exitTransition) { - if (exitTransition != NULL) { - DoExitTransition(exitTransition); - } - DeleteAllEntities(); - sub_0805E974(); - DeleteAllEntities(); - gMain.state = GAMETASK_INIT; - gMain.substate = GAMEMAIN_INITROOM; -} - -void GameMain_Subtask(void) { - if (gUI.nextToLoad < 3) { - if (gUI.state != 0) { - gUI.field_0x3 = gUI.field_0x5; - gUI.lastState = gUI.state; - gUI.state = 0; - } - } - gUnk_0812901C[gUI.nextToLoad](); -} - -void Subtask_FadeIn(void) { - if (!gFadeControl.active) { - MemCopy(&gScreen, &gUnk_03001020, sizeof(Screen)); - MemCopy(gPaletteBuffer, gUnk_02024090, 0x400); - MemCopy(&gGFXSlots, &gUI.gfxSlotList, sizeof(GfxSlotList)); - MemCopy(gPaletteList, gUI.palettes, sizeof(gUI.palettes)); - MemCopy(&gRoomControls, &gUI.roomControls, sizeof(RoomControls)); - MemCopy(gUnk_03000420, gUI.unk_2a8, sizeof(gUI.unk_2a8)); - MemCopy(&gActiveScriptInfo, &gUI.activeScriptInfo, sizeof(ActiveScriptInfo)); - sub_0805E958(); - gUI.unk_d = gRoomTransition.field_0x2c[2]; - gUI.controlMode = gPlayerState.controlMode; - gUI.currentRoomProperties = gCurrentRoomProperties; - gUI.mapBottomBgSettings = gMapBottom.bgSettings; - gUI.mapTopBgSettings = gMapTop.bgSettings; - gUI.nextToLoad = 1; - } -} - -void Subtask_Init(void) { - if (gFadeControl.active == 0) { - DeleteAllEntities(); - MemClear(&gMenu, sizeof(FigurineMenu)); - MemClear(&gRoomControls, sizeof(gRoomControls)); - MemClear(gOAMControls.unk, 0x100); - MemClear(&gActiveScriptInfo, sizeof(gActiveScriptInfo)); - gActiveScriptInfo.fadeSpeed = 8; - DispReset(1); - MessageInitialize(); - ResetPalettes(); - ResetPaletteTable(0); - gGFXSlots.unk0 = 1; - gUI.nextToLoad = 2; - gRoomTransition.field_0x2c[3] = 1; - } -} - -void Subtask_FadeOut(void) { - if (!gFadeControl.active) { - DeleteAllEntities(); - sub_0805E974(); - gCurrentRoomProperties = gUI.currentRoomProperties; - gPlayerState.controlMode = gUI.controlMode; - gMapBottom.bgSettings = gUI.mapBottomBgSettings; - gMapTop.bgSettings = gUI.mapTopBgSettings; - MemCopy(&gUI.activeScriptInfo, &gActiveScriptInfo, sizeof(ActiveScriptInfo)); - MemCopy(gUI.unk_2a8, gUnk_03000420, sizeof(gUI.unk_2a8)); - MemCopy(gUI.palettes, gPaletteList, sizeof(gUI.palettes)); - MemCopy(&gUI.gfxSlotList, &gGFXSlots, sizeof(gGFXSlots)); - MemCopy(&gUI.roomControls, &gRoomControls, sizeof(RoomControls)); - MemCopy(&gUnk_03001020, &gScreen, sizeof(Screen)); - gArea.localFlagOffset = GetFlagBankOffset(gRoomControls.area); - gArea.pCurrentRoomInfo = GetCurrentRoomInfo(); - RestoreGameTask(gUI.field_0x6); - sub_0801D000(gUI.unk_d != 0); - sub_080A74F4(); - if (gUI.fadeType != 0xffff) { - SetFade(gUI.fadeType, gUI.fadeInTime); - } else { - SetFadeInverted(gUI.fadeInTime); - } - gUI.nextToLoad = 4; - gRoomTransition.field_0x2c[3] = 0; - } -} - -void Subtask_Die(void) { - sub_080A74F4(); - if (gFadeControl.active == 0) { - gMain.substate = gUI.pauseFadeIn; - gUI.nextToLoad = gFadeControl.active; - gUI.lastState = gFadeControl.active; - ResetSystemPriority(); - } -} - -void sub_080A74F4(void) { - SetInitializationPriority(); - gMain.pad = 0; - FlushSprites(); - UpdateEntities(); - UpdateManagers(); - DrawUI(); - DrawUIElements(); - UpdateCarriedObject(); - DrawEntities(); - CopyOAM(); -} - -void Subtask_Update(void) { - gSubtasks[gUI.lastState](); -} diff --git a/src/menu/pauseMenuScreen6.c b/src/menu/pauseMenuScreen6.c new file mode 100644 index 00000000..4bfcd17a --- /dev/null +++ b/src/menu/pauseMenuScreen6.c @@ -0,0 +1,276 @@ +/** + * @file pauseMenuScreen6.c + * + * @brief Pause Menu Screen 6 + */ +#include "common.h" +#include "fileselect.h" +#include "flags.h" +#include "functions.h" +#include "kinstone.h" +#include "main.h" +#include "menu.h" +#include "pauseMenu.h" +#include "save.h" +#include "screen.h" + +typedef struct { + u8 unk0; + u8 unk1; + u16 unk2; + u16 unk4; + u16 unk6; +} struct_sub_080A698C; + +extern u8 gUnk_08128E80[]; + +extern u16 gUnk_02017AA0[]; + +void sub_080A68D4(); + +void PauseMenu_Screen_6(void) { + extern void (*const gUnk_08128E78[])(void); + const struct_gUnk_08128E94* ptr; + gUnk_08128E78[gMenu.menuType](); + ptr = &gUnk_08128E94[gMenu.field_0x3]; + gScreen.bg1.yOffset = -ptr->unk5; + gScreen.bg2.yOffset = gMenu.field_0xa - (s8)ptr->unk6; + sub_080A66D0(); +} + +void sub_080A6650(void) { + extern u8 gUnk_08128E84[]; + u32 temp; + sub_080A70AC((KeyButtonLayout*)gUnk_08128E84); + temp = gPauseMenuOptions.unk2[4]; + gMenu.field_0x3 = temp; + sub_080A67C4(temp); + sub_080A68D4(); + SetMenuType(1); +} + +void sub_080A667C(void) { + u32 uVar1; + u32 uVar2; + const struct_gUnk_08128E94* ptr; + + gMenu.field_0xc = gUnk_08128E80; + ptr = &gUnk_08128E94[gMenu.field_0x3]; + uVar2 = gMenu.field_0xa; + switch (gInput.heldKeys) { + case DPAD_UP: + if (uVar2 != 0) { + uVar2 -= 2; + } + break; + case DPAD_DOWN: + uVar1 = ptr->unk2; + if (uVar1 > uVar2) { + uVar2 += 2; + } + if (uVar1 < uVar2) { + uVar2 = uVar1; + } + break; + } + + gMenu.field_0xa = uVar2; + sub_080A6FB4(gMenu.field_0x3, 0); +} + +void sub_080A66D0(void) { + u32 bVar2; + u32 bVar3; + u8 bVar4; + u32 uVar5; + u32 uVar8; + struct_sub_080A698C* ptr; + const struct_gUnk_08128E94* ptr2; + + gOamCmd._4 = 0; + gOamCmd._6 = 0; + gOamCmd.x = 0x78; + ptr2 = &gUnk_08128E94[gMenu.field_0x3]; + gGenericMenu.unk2c++; + if (gGenericMenu.unk2b != 1 && ((gGenericMenu.unk2c & 0x10) != 0)) { + gOamCmd._8 = 0x800; + if (gMenu.field_0xa != 0) { + gOamCmd.y = 0xc; + DrawDirect(DRAW_DIRECT_SPRITE_INDEX, 0x71); + } + if (ptr2->unk2 > gMenu.field_0xa) { + gOamCmd.y = 0x84; + DrawDirect(DRAW_DIRECT_SPRITE_INDEX, 0x72); + } + } + bVar2 = ptr2->unk7; + bVar3 = ptr2->unk3; + uVar5 = gMenu.field_0xa; + gOamCmd._4 = 0; + gOamCmd._6 = 0; + gOamCmd._8 = 0xc00; + bVar4 = gGenericMenu.unk2c & 0x20; + + for (ptr = (struct_sub_080A698C*)&gMapDataBottomSpecial; ptr->unk2 != 0; ptr++) { + uVar8 = 0; + if (ptr->unk0 == 1) { + if (bVar4 != 0) { + uVar8 = 1; + } + } else if (bVar4 == 0) { + uVar8 = 1; + } + + if (uVar8 != 0) { + gOamCmd.x = ptr->unk4 + bVar2; + gOamCmd.y = ptr->unk6 + bVar3 - uVar5; + DrawDirect(ptr->unk2, ptr->unk1); + } + } +} + +void sub_080A67C4(u32 param_1) { + u16* puVar2; + int i; + int iVar4; + s32 room; + const struct_gUnk_08128E94* ptr; + + LoadPaletteGroup(param_1 + 0xba); + iVar4 = param_1 + 0x5f; + switch (param_1) { + case 0x9: + if (CheckGlobalFlag(TATEKAKE_HOUSE)) { + iVar4 = 0x70; + } + break; + case 0xb: + if (CheckKinstoneFused(KINSTONE_E)) { + iVar4 = 0x71; + } + break; + case 0xe: + if (gUI.roomControls.area == 8) { + room = gUI.roomControls.room; + iVar4 = (u8)(room % 3) + 0x72; + } + break; + } + + LoadGfxGroup(iVar4); + ptr = &gUnk_08128E94[param_1]; + puVar2 = &gUnk_02017AA0[gUnk_03003DE4[0] * 0x500]; + + for (i = 0; i <= 7; puVar2++, i++) { + *puVar2 = 0x1e0a; + } + + for (i = 8; i < (int)(ptr->unk5 + ptr->unk4); puVar2++, i++) { + *puVar2 = 0x1e0b; + } + + for (; i < 0xa0; puVar2++, i++) { + *puVar2 = 0x1e0a; + } + + SetVBlankDMA((u16*)&gUnk_02017AA0[gUnk_03003DE4[0] * 0x500], (u16*)REG_ADDR_BG3CNT, + ((DMA_ENABLE | DMA_START_HBLANK | DMA_16BIT | DMA_REPEAT | DMA_SRC_INC | DMA_DEST_RELOAD) << 16) + + 0x1); + gMenu.field_0xa = ptr->unk2 >> 1; + MemClear(&gMapDataBottomSpecial, 0x400); +} + +void sub_080A68D4(void) { + u32 uVar1; + int iVar6; + struct_gUnk_08128F58* pcVar4; + u32 i; + u32 uVar4; + const WorldEvent* ptr; + + if ((gPlayerState.flags & PL_NO_CAP) != 0) { + iVar6 = 101; + } else { + iVar6 = 100; + } + sub_080A698C(gRoomTransition.player_status.overworld_map_x, gRoomTransition.player_status.overworld_map_y, + DRAW_DIRECT_SPRITE_INDEX, iVar6 + 0x100); + uVar1 = sub_080A6F40(); + uVar1 &= gSave.field_0x20; + + for (pcVar4 = gUnk_08128F58, i = 0; pcVar4->frameIndex != 0; i++, pcVar4++) { + if (((1 << i) & uVar1) != 0) { + sub_080A698C(pcVar4->unk4, pcVar4->unk6, DRAW_DIRECT_SPRITE_INDEX, pcVar4->unk3); + } + } + + for (i = 10; i <= 100; i++) { + if (CheckKinstoneFused(i) && !sub_0801E810(i)) { + uVar4 = gKinstoneWorldEvents[i].unk7; + ptr = &gWorldEvents[gKinstoneWorldEvents[i].worldEventId]; + sub_080A698C(ptr->_c, ptr->_e, DRAW_DIRECT_SPRITE_INDEX, uVar4 + 100); + } + } +} + +void sub_080A698C(u32 param_1, u32 param_2, u32 param_3, u32 param_4) { + int iVar1; + + iVar1 = sub_080A69E0(param_1, param_2); + if (0 < iVar1) { + ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk0 = param_4 >> 8; + ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk1 = param_4; + ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk2 = param_3; + ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk4 = iVar1; + ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk6 = iVar1 >> 0x10; + gGenericMenu.unk2d++; + } +} + +s32 sub_080A69E0(u32 param_1, u32 param_2) { + const struct_08127F94* pbVar1; + int iVar3; + + if ((param_1 | param_2) == 0) + return -1; + + pbVar1 = sub_080A6A80(param_1, param_2); + if (pbVar1 == NULL) + return -1; + + if (gMenu.field_0x3 != pbVar1->_4) + return -1; + + switch (gMenu.field_0x3) { + case 4: + case 7: + if (gMenu.field_0x3 == 4) { + iVar3 = 9; + } else { + iVar3 = 7; + } + param_2 -= gAreaRoomHeaders[iVar3]->map_y; + break; + break; + case 15: + param_1 -= 0x108; + break; + } + + param_1 = (s32)((param_1 - pbVar1->_0 * 0x10) * 100) / 0x23a; + param_2 = (s32)((param_2 - pbVar1->_1 * 0x10) * 100) / 0x23a; + return (param_2 << 0x10) | param_1; +} + +struct_08127F94* sub_080A6A80(u32 param_1, u32 param_2) { + struct_08127F94* pbVar1; + param_1 >>= 4; + param_2 >>= 4; + + for (pbVar1 = gUnk_08127F94; pbVar1->_0 != 0xff; pbVar1++) { + if (pbVar1->_0 <= param_1 && pbVar1->_2 >= param_1 && pbVar1->_1 <= param_2 && pbVar1->_3 >= param_2) { + return pbVar1; + } + } + return NULL; +} diff --git a/src/menu/pause_menu.c b/src/menu/pause_menu.c deleted file mode 100644 index 957dc751..00000000 --- a/src/menu/pause_menu.c +++ /dev/null @@ -1,567 +0,0 @@ -#include "global.h" -#include "menu.h" -#include "sound.h" -#include "subtask.h" -#include "screen.h" -#include "item.h" -#include "common.h" -#include "game.h" -#include "main.h" -#include "save.h" -#include "itemMetaData.h" -#include "structures.h" -#include "functions.h" -#include "ui.h" - -extern void sub_080A4DB8(u32); - -void sub_080A5128(void); -void sub_080A51D4(void); -bool32 sub_080A51F4(void); -void sub_080A5F48(u32, u32); - -Subtask PauseMenu_Variant0; -Subtask PauseMenu_Variant1; -Subtask PauseMenu_Variant2; -Subtask PauseMenu_Variant3; -Subtask PauseMenu_Variant4; -Subtask PauseMenu_Variant5; -void Subtask_PauseMenu(void) { - static Subtask* const pauseMenu_Variants[] = { - PauseMenu_Variant0, PauseMenu_Variant1, PauseMenu_Variant2, - PauseMenu_Variant3, PauseMenu_Variant4, PauseMenu_Variant5, - }; - - if (gPauseMenuOptions.unk11 == 6) { - SetBgmVolume(0x100); - Subtask_Exit(); - } else { - FlushSprites(); - pauseMenu_Variants[gPauseMenuOptions.unk11](); - sub_080A5128(); - UpdateUIElements(); - DrawUIElements(); - if (gPauseMenuOptions.unk11 != 4) { - gUnk_08128A38[gPauseMenuOptions.unk1].func(); - } - CopyOAM(); - { - u32 t = gPauseMenuOptions.unk16; - u32 t2 = (t != 0) ? 0xe46 : 0; - gScreen.controls.layerFXControl = t2; - gScreen.controls.alphaBlend = (t << 8) | (0x10 - t); - } - } -} - -struct_08127F94* sub_080A6A80(u32, u32); - -extern u8 gUnk_02034492[]; -void sub_0801E8D4(void); -s32 sub_080A50A0(s32); - -void PauseMenu_Variant0(void) { - struct_08127F94* ptr; - int r0, r1; - - sub_0801E8D4(); - sub_080A4D34(); - r1 = 4; - do { - gUnk_02034492[r1] = 0; - r1++; - } while (r1 <= 0xd); - ptr = sub_080A6A80((u16)gRoomTransition.player_status.overworld_map_x, - (u16)gRoomTransition.player_status.overworld_map_y); - gPauseMenuOptions.unk2[4] = ptr->_4; - gPauseMenuOptions.unk2[5] = sub_0801DB94(); - if (IsItemEquipped(ITEM_LANTERN_ON) != EQUIP_SLOT_NONE) { - r1 = 0x10; - } else { - r1 = 0xf; - } - gPauseMenuOptions.unk15 = r1; - r0 = gUnk_08128A38[gPauseMenuOptions.unk1].unk1; - r0 = sub_080A50A0(r0); - gPauseMenuOptions.unk1 = r0; - gPauseMenuOptions.unk14 = r0; - sub_080A4DB8(r0); - SetFade(FADE_INSTANT, 0x20); - sub_080A4E90(1); -} - -void PauseMenu_Variant1(void) { - if (gFadeControl.active == 0) { - sub_080A4E90(2); - } -} - -void PauseMenu_Variant2(void) { - int iVar1; - u32 uVar2; - int iVar4; - s32 bVar5; - - if (sub_080A51F4() && (gMenu.field_0xc != NULL)) { - iVar1 = -1; - switch (gInput.newKeys) { - case START_BUTTON: - iVar1 = 0; - break; - case L_BUTTON: - iVar1 = 1; - break; - case R_BUTTON: - iVar1 = 2; - break; - case B_BUTTON: - iVar1 = 3; - break; - } - if (iVar1 >= 0) { - switch (bVar5 = gMenu.field_0xc[iVar1]) { - case 0: - break; - case 4 ... 6: - case 0xf: - uVar2 = GetInventoryValue(ITEM_MAP); - if (uVar2 == 0) { - iVar4 = 1; - if (iVar1 == 1) { - iVar4 = 2; - } - bVar5 = gMenu.field_0xc[iVar4]; - } - default: - gPauseMenuOptions.unk14 = bVar5; - SoundReq(SFX_TEXTBOX_OPEN); - gMenu.field_0xc = NULL; - break; - } - } - } - bVar5 = sub_080A50A0(gPauseMenuOptions.unk14); - if (gPauseMenuOptions.unk1 != bVar5) { - gPauseMenuOptions.unk14 = bVar5; - sub_080A51D4(); - if (bVar5 == 0xe) { - sub_080A4E90(6); - } else { - sub_080A4E90(3); - MemClear(&gBG0Buffer, sizeof(gBG0Buffer)); - gScreen.bg0.updated = 1; - } - } -} - -s32 sub_080A50A0(s32 param_1) { - s32 iVar1; - - if (param_1 == 0xf) { - iVar1 = AreaHasMap(); - param_1 = 4; - if (iVar1 != 0) { - param_1 = 5; - } - } - return param_1; -} - -void PauseMenu_Variant3(void) { - s32 iVar1; - - iVar1 = gPauseMenuOptions.unk16 + 2; - if (0x10 < iVar1) { - gScreen.lcd.displayControl &= 0xf8ff; - sub_080A4E90(4); - iVar1 = 0x10; - } - gPauseMenuOptions.unk16 = iVar1; -} - -void PauseMenu_Variant4(void) { - u32 t; - gPauseMenuOptions.unk16 = 0x10; - gPauseMenuOptions.unk1 = t = gPauseMenuOptions.unk14; - sub_080A4DB8(t); - sub_080A4E90(5); -} - -void PauseMenu_Variant5(void) { - s32 iVar1; - - iVar1 = gPauseMenuOptions.unk16 - 2; - if (iVar1 < 0) { - sub_080A4E90(2); - iVar1 = 0; - } - gPauseMenuOptions.unk16 = iVar1; -} - -void sub_080A5128(void) { - int r5, t; - struct { - int x; - int y; - } p[3]; - - switch (gPauseMenuOptions.unk1) { - case 7: - case 8: - p[0].x = 0x60; - p[0].y = 0x18; - p[1].x = -0x10; - p[1].y = 0x48; - p[2].x = 0x100; - p[2].y = 0x48; - break; - case 9: - case 10: - case 11: - return; - default: - p[0].x = 0x40; - p[0].y = 0x10 - (gPauseMenuOptions.unk16 << 1); - t = (gPauseMenuOptions.unk16 / 3); - p[1].x = 0x10 - t; - p[1].y = 0x48; - p[2].x = 0xe0 + t; - p[2].y = 0x48; - break; - } - gOamCmd._4 = 0; - gOamCmd._6 = 0; - gOamCmd._8 = 0x400; - gOamCmd.x = p[0].x; - gOamCmd.y = p[0].y; -#ifdef EU - r5 = 0x1fa; -#else - r5 = 0x1fb; -#endif - DrawDirect(r5, 0); - gOamCmd.x = p[1].x; - gOamCmd.y = p[1].y; - DrawDirect(r5, 1); - gOamCmd.x = p[2].x; - gOamCmd.y = p[2].y; - DrawDirect(r5, 2); -} - -void sub_080A51D4(void) { - u32 i = gPauseMenuOptions.unk1; - if (i < 0xe) { - gPauseMenuOptions.unk2[i] = gMenu.field_0x3; - } -} - -bool32 sub_080A51F4(void) { - bool32 retval = TRUE; - if (gFadeControl.active != 0) - retval = FALSE; - if (gPauseMenuOptions.unk11 != 2) - retval = FALSE; - return retval; -} - -typedef struct { - u8 up; - u8 down; - u8 left; - u8 right; - u8 type; - u8 unk0; - u8 x; - u8 y; -} ItemMenuTableEntry; - -Subtask PauseMenu_ItemMenu_Draw; -Subtask PauseMenu_ItemMenu_Init; -Subtask PauseMenu_ItemMenu_Update; -void PauseMenu_ItemMenu(void) { - static Subtask* const pauseMenu_Types[] = { PauseMenu_ItemMenu_Init, PauseMenu_ItemMenu_Update }; - - pauseMenu_Types[gMenu.menuType](); - PauseMenu_ItemMenu_Draw(); -} - -void PauseMenu_ItemMenu_Init(void) { - static const KeyButtonLayout gUnk_08128B50 = { - 0xd0u, - 0x10u, - 0u, - 0xb8u, - 0x10u, - 0u, - 0xffu, - 0xd8u, - 0u, - { - 0x3u, - 0u, - 0x4u, - 0u, - 0u, - 0u, - 0x1u, - 0u, - 0xffu, - 0u, - 0u, - }, - }; - - u32 uVar1; - u32 i; - u32 item; - - gMenu.field_0xc = NULL; - sub_080A70AC((KeyButtonLayout*)&gUnk_08128B50); - for (item = ITEM_SMITH_SWORD; item < ITEM_BOTTLE_EMPTY; item++) { - uVar1 = GetInventoryValue(item); - if ((uVar1 == 1) && (i = gItemMetaData[item].menuSlot, i <= MENU_SLOT_SAVE_BUTTON_JP)) { - switch (item) { - case ITEM_LANTERN_OFF: - case ITEM_LANTERN_ON: - item = gPauseMenuOptions.unk15; - break; - default: - break; - } - gPauseMenu.items[i] = item; - sub_080A5F48(item, i * 8 + 0x360); - } - } - SetMenuType(1); -} - -const ItemMenuTableEntry gItemMenuTable[] = { - [MENU_SLOT_SWORD] = { MENU_SLOT_BOTTLE0, MENU_SLOT_SHIELD, MENU_SLOT_BOOMERANG, MENU_SLOT_GUST_JAR, 0x01, 0x0c, - 0x42, 0x33 }, - [MENU_SLOT_GUST_JAR] = { MENU_SLOT_BOTTLE1, MENU_SLOT_MOLE_MITTS, MENU_SLOT_SWORD, MENU_SLOT_CANE, 0x01, 0x10, 0x66, - 0x33 }, - [MENU_SLOT_CANE] = { MENU_SLOT_BOTTLE3, MENU_SLOT_LANTERN, MENU_SLOT_GUST_JAR, MENU_SLOT_BOOMERANG, 0x01, 0x14, - 0x8a, 0x33 }, - [MENU_SLOT_BOOMERANG] = { MENU_SLOT_SAVE_BUTTON, MENU_SLOT_BOMBS, MENU_SLOT_CANE, MENU_SLOT_SWORD, 0x01, 0x15, 0xae, - 0x33 }, - [MENU_SLOT_SHIELD] = { MENU_SLOT_SWORD, MENU_SLOT_PEGASUS_BOOTS, MENU_SLOT_BOMBS, MENU_SLOT_MOLE_MITTS, 0x01, 0x16, - 0x42, 0x4b }, - [MENU_SLOT_MOLE_MITTS] = { MENU_SLOT_GUST_JAR, MENU_SLOT_ROCS_CAPE, MENU_SLOT_SHIELD, MENU_SLOT_LANTERN, 0x01, 0x17, - 0x66, 0x4b }, - [MENU_SLOT_LANTERN] = { MENU_SLOT_CANE, MENU_SLOT_OCARINA, MENU_SLOT_MOLE_MITTS, MENU_SLOT_BOMBS, 0x01, 0x00, 0x8a, - 0x4b }, - [MENU_SLOT_BOMBS] = { MENU_SLOT_BOOMERANG, MENU_SLOT_BOW, MENU_SLOT_LANTERN, MENU_SLOT_SHIELD, 0x01, 0x00, 0xae, - 0x4b }, - [MENU_SLOT_PEGASUS_BOOTS] = { MENU_SLOT_SHIELD, MENU_SLOT_BOTTLE0, MENU_SLOT_BOW, MENU_SLOT_ROCS_CAPE, 0x01, 0x00, - 0x42, 0x63 }, - [MENU_SLOT_ROCS_CAPE] = { MENU_SLOT_MOLE_MITTS, MENU_SLOT_BOTTLE1, MENU_SLOT_PEGASUS_BOOTS, MENU_SLOT_OCARINA, 0x01, - 0x00, 0x66, 0x63 }, - [MENU_SLOT_OCARINA] = { MENU_SLOT_LANTERN, MENU_SLOT_BOTTLE3, MENU_SLOT_ROCS_CAPE, MENU_SLOT_BOW, 0x01, 0x00, 0x8a, - 0x63 }, - [MENU_SLOT_BOW] = { MENU_SLOT_BOMBS, MENU_SLOT_SAVE_BUTTON, MENU_SLOT_OCARINA, MENU_SLOT_PEGASUS_BOOTS, 0x01, 0x00, - 0xae, 0x63 }, - [MENU_SLOT_BOTTLE0] = { MENU_SLOT_PEGASUS_BOOTS, MENU_SLOT_SWORD, MENU_SLOT_SAVE_BUTTON, MENU_SLOT_BOTTLE1, 0x01, - 0x00, 0x42, 0x7b }, - [MENU_SLOT_BOTTLE1] = { MENU_SLOT_ROCS_CAPE, MENU_SLOT_GUST_JAR, MENU_SLOT_BOTTLE0, MENU_SLOT_BOTTLE2, 0x01, 0x00, - 0x5a, 0x7b }, - [MENU_SLOT_BOTTLE2] = { MENU_SLOT_ROCS_CAPE, MENU_SLOT_GUST_JAR, MENU_SLOT_BOTTLE1, MENU_SLOT_BOTTLE3, 0x01, 0x00, - 0x72, 0x7b }, - [MENU_SLOT_BOTTLE3] = { MENU_SLOT_OCARINA, MENU_SLOT_CANE, MENU_SLOT_BOTTLE2, MENU_SLOT_SAVE_BUTTON, 0x01, 0x00, - 0x8a, 0x7b }, - [MENU_SLOT_SAVE_BUTTON] = { MENU_SLOT_BOW, MENU_SLOT_BOOMERANG, MENU_SLOT_BOTTLE3, MENU_SLOT_BOTTLE0, 0x03, 0x00, - 0xb5, 0x75 }, - [MENU_SLOT_SAVE_BUTTON_JP] = { MENU_SLOT_BOW, MENU_SLOT_BOOMERANG, MENU_SLOT_BOTTLE3, MENU_SLOT_BOTTLE0, 0x05, 0x00, - 0xb5, 0x75 }, -}; - -void sub_080A6F6C(u32); -void PauseMenu_ItemMenu_Update(void) { - static const u8 gUnk_08128BF4[] = { 14, 15, 2, 0 }; - u32 item; - u32 menuSlot; - const ItemMenuTableEntry* entry; - - if (sub_080A51F4()) { - gMenu.field_0xc = (u8*)gUnk_08128BF4; - menuSlot = gMenu.field_0x3; - - entry = &gItemMenuTable[menuSlot]; - switch (gInput.newKeys) { - case A_BUTTON: - if (menuSlot == MENU_SLOT_SAVE_BUTTON) { -#if defined(DEMO_USA) || defined(DEMO_JP) - SoundReq(SFX_MENU_ERROR); -#else - sub_080A4E84(0xb); - SoundReq(SFX_TEXTBOX_SELECT); -#endif - break; - } - case B_BUTTON: - if (gPauseMenu.items[menuSlot] != 0) { - u32 slot = !!(gInput.newKeys ^ 1); - ForceEquipItem(gPauseMenu.items[menuSlot], slot); - SoundReq(SFX_TEXTBOX_SELECT); - } - break; - default: - switch (gInput.unk4) { - case DPAD_UP: - menuSlot = entry->up; - break; - case DPAD_DOWN: - menuSlot = entry->down; - break; - case DPAD_LEFT: - menuSlot = entry->left; - break; - case DPAD_RIGHT: - menuSlot = entry->right; - break; - } - break; - } - if (gMenu.field_0x3 != menuSlot) { - gMenu.field_0x3 = menuSlot; - SoundReq(SFX_TEXTBOX_CHOICE); - } - item = gPauseMenu.items[menuSlot]; - switch (menuSlot) { - case MENU_SLOT_BOTTLE0: - case MENU_SLOT_BOTTLE1: - case MENU_SLOT_BOTTLE2: - case MENU_SLOT_BOTTLE3: - if (item != 0) { - item = gSave.saved_status.field_0x24[item - 6]; - } - break; - case MENU_SLOT_SAVE_BUTTON: - // ITEM_SKILL_FAST_SPIN, but that does not make any sense at all - item = 0x73; - break; - default: - break; - } - sub_080A6F6C(item + 0x400); - } -} - -u32 GetMenuSlotForItem(u32 item); -extern u8* gSpriteAnimations_322[]; -#ifdef EU -#define sub_080A5384_draw_constant0 0x1fa -#define sub_080A5384_draw_constant1 0x141 -#else -#define sub_080A5384_draw_constant0 0x1fb -#define sub_080A5384_draw_constant1 0x142 -#endif -void PauseMenu_ItemMenu_Draw(void) { - u32 tmp; - u32 i; - s32 color; - const ItemMenuTableEntry* entry; - - gOamCmd._4 = 0x400; - gOamCmd._6 = 0; - gOamCmd._8 = 0; - for (i = 0; i < MENU_SLOT_COUNT; i++) { - u32 item; - if (gPauseMenu.items[i] != 0) { - entry = &gItemMenuTable[i]; - gOamCmd.x = entry->x; - gOamCmd.y = entry->y; - item = gPauseMenu.items[i]; - switch (item) { - case ITEM_BOTTLE1: - case ITEM_BOTTLE2: - case ITEM_BOTTLE3: - case ITEM_BOTTLE4: - item = gSave.stats.bottles[item - ITEM_BOTTLE1]; - break; - default: - break; - } - color = 3; - switch (item) { - case ITEM_BOMBS: - case ITEM_REMOTE_BOMBS: - if (gBombBagSizes[gSave.stats.bombBagType] <= gSave.stats.bombCount) { - color = 4; - } - break; - case ITEM_BOW: - case ITEM_LIGHT_ARROW: - if (gQuiverSizes[gSave.stats.quiverType] <= gSave.stats.arrowCount) { - color = 4; - } - break; - default: - break; - } - gOamCmd._8 = 0x800 | color << 0xc | ((i * 8) + 0x360); - DrawDirect(sub_080A5384_draw_constant1, *gSpriteAnimations_322[item]); - } - } - gOamCmd._8 = 0x800; - { - u32 slot = gMenu.field_0x3; - if ((slot == MENU_SLOT_SAVE_BUTTON) && (gSaveHeader->language != 0)) { - slot = MENU_SLOT_SAVE_BUTTON_JP; - } - entry = &gItemMenuTable[slot]; - gOamCmd.x = entry->x; - gOamCmd.y = entry->y; - tmp = entry->type + ((gMain.ticks & 0x10) != 0 ? 3 : 4); - DrawDirect(sub_080A5384_draw_constant0, tmp); - } - { - u32 slot; - if (gSaveHeader->language != 0) { - slot = MENU_SLOT_SAVE_BUTTON; - } else { - slot = MENU_SLOT_SAVE_BUTTON_JP; - } - entry = &gItemMenuTable[slot]; - gOamCmd.x = entry->x; - gOamCmd.y = entry->y; - gOamCmd._8 = 0x800; - DrawDirect(sub_080A5384_draw_constant0, 0x22); - } - i = GetMenuSlotForItem(gSave.stats.itemButtons[SLOT_A]); - if (i < MENU_SLOT_COUNT) { - entry = &gItemMenuTable[i]; - gOamCmd.x = entry->x; - gOamCmd.y = entry->y; - DrawDirect(sub_080A5384_draw_constant0, 3); - } - i = GetMenuSlotForItem(gSave.stats.itemButtons[SLOT_B]); - if (i < MENU_SLOT_COUNT) { - entry = &gItemMenuTable[i]; - gOamCmd.x = entry->x; - gOamCmd.y = entry->y; - DrawDirect(sub_080A5384_draw_constant0, 3); - } -} - -u32 GetMenuSlotForItem(u32 item) { - u32 i; - - if (item != 0) { - for (i = 0; i < MENU_SLOT_COUNT; i++) { - if (item == gPauseMenu.items[i]) - return i; - } - } - return MENU_SLOT_SAVE_BUTTON_JP; -} - -Subtask sub_080A5594; -Subtask sub_080A56A0; -void PauseMenu2(void) { - static Subtask* const pauseMenu2_Types[] = { - sub_080A5594, - sub_080A56A0, - }; - pauseMenu2_Types[gMenu.menuType](); - sub_080A57F4(); -} diff --git a/src/movement.c b/src/movement.c index 62b76406..6e87133b 100644 --- a/src/movement.c +++ b/src/movement.c @@ -67,31 +67,30 @@ bool32 TileCollisionFunction0(s32 x, s32 y) { bool32 TileCollisionFunction1(s32 x, s32 y) { return TRUE; } - +const u16 gUnk_08133918[] = { + /* + 0b1000000000000000, + 0b1100000000000000, + 0b1110000000000000, + 0b1111000000000000, + 0b1111100000000000, + 0b1111110000000000, + 0b1111111000000000, + 0b1111111100000000, + 0b1111111110000000, + 0b1111111111000000, + 0b1111111111100000, + 0b1111111111110000, + 0b1111111111111000, + 0b1111111111111100, + 0b1111111111111110, + 0b1111111111111111, + */ + 0x8000, 0xC000, 0xE000, 0xF000, 0xF800, 0xFC00, 0xFE00, 0xFF00, + 0xFF80, 0xFFC0, 0xFFE0, 0xFFF0, 0xFFF8, 0xFFFC, 0xFFFE, 0xFFFF, +}; /** Diagonal North West filled*/ bool32 TileCollisionFunction2(s32 x, s32 y) { - static const u16 gUnk_08133918[] = { - /* - 0b1000000000000000, - 0b1100000000000000, - 0b1110000000000000, - 0b1111000000000000, - 0b1111100000000000, - 0b1111110000000000, - 0b1111111000000000, - 0b1111111100000000, - 0b1111111110000000, - 0b1111111111000000, - 0b1111111111100000, - 0b1111111111110000, - 0b1111111111111000, - 0b1111111111111100, - 0b1111111111111110, - 0b1111111111111111, - */ - 0x8000, 0xC000, 0xE000, 0xF000, 0xF800, 0xFC00, 0xFE00, 0xFF00, - 0xFF80, 0xFFC0, 0xFFE0, 0xFFF0, 0xFFF8, 0xFFFC, 0xFFFE, 0xFFFF, - }; return gUnk_08133918[y & 0xf] >> (x & 0xf) & 1; } diff --git a/src/npc/beedle.c b/src/npc/beedle.c index b9c562ee..351a53fb 100644 --- a/src/npc/beedle.c +++ b/src/npc/beedle.c @@ -70,7 +70,7 @@ void sub_080632C8(Entity* this) { } void sub_080632E0(Entity* this) { - if (LoadExtraSpriteData(this, gUnk_0810C8D4) != 0) { + if (LoadExtraSpriteData(this, gUnk_0810C8D4)) { InitializeAnimation(this, 0); sub_08078778(this); this->spriteSettings.draw = 1; @@ -127,7 +127,7 @@ void Beedle_Head(Entity* this) { void sub_08063410(Entity* this) { if (this->action == 0) { - if (LoadExtraSpriteData(this, gUnk_0810C8D4) == 0) { + if (!LoadExtraSpriteData(this, gUnk_0810C8D4)) { return; } this->action++; diff --git a/src/npc/bladeBrothers.c b/src/npc/bladeBrothers.c index 7e4f161a..fb31384a 100644 --- a/src/npc/bladeBrothers.c +++ b/src/npc/bladeBrothers.c @@ -11,25 +11,202 @@ #include "game.h" #include "item.h" -extern void (*gUnk_081115C0[])(Entity*); -extern void (*gUnk_081115D0[])(Entity*); - -extern u16 gUnk_081115DC[]; -extern u8 BladeBrothers_EquippedItem[]; -extern PlayerMacroEntry* BladeBrothers_PlayerMacros[]; -extern u8 gUnk_08111623[]; -extern u8 gUnk_0811162B[]; -extern u16 gUnk_08111664[]; -extern u16 gUnk_0811167A[]; -extern u16 gUnk_08111690[]; -extern u16 gUnk_081116A6[]; -extern u16 gUnk_081116BC[]; -extern u16 gUnk_081116D2[]; -extern u16 gUnk_081116E8[]; -extern u16 gUnk_081116FE[]; -extern u16 gUnk_08111714[]; -extern u32 gUnk_08111740[]; -extern u16 gUnk_0811172A[]; +void sub_08068A1C(Entity*); +void sub_08068A4C(Entity*); +void sub_08068AA4(Entity*); +void sub_08068ADC(Entity*); +void (*const gUnk_081115C0[])(Entity*) = { + sub_08068A1C, + sub_08068A4C, + sub_08068AA4, + sub_08068ADC, +}; +void sub_08068AFC(Entity*); +void sub_08068b2c(Entity*); +void sub_08068B70(Entity*); +void (*const gUnk_081115D0[])(Entity*) = { + sub_08068AFC, + sub_08068b2c, + sub_08068B70, +}; + +const u16 gUnk_081115DC[] = { 183, 184, 185, 186, 187, 188, 189, 190 }; + +// TODO extract macros +extern const PlayerMacroEntry gUnk_08004A0C; +extern const PlayerMacroEntry gUnk_08004A16; +extern const PlayerMacroEntry gUnk_08004A24; +extern const PlayerMacroEntry gUnk_08004A32; +extern const PlayerMacroEntry gUnk_08004A48; +extern const PlayerMacroEntry gUnk_08004A72; +extern const PlayerMacroEntry gUnk_08004A8C; +extern const PlayerMacroEntry gUnk_08004AA6; +const PlayerMacroEntry* const BladeBrothers_PlayerMacros[] = { + &gUnk_08004A0C, &gUnk_08004A16, &gUnk_08004A24, &gUnk_08004A32, &gUnk_08004A48, &gUnk_08004A72, + &gUnk_08004A8C, &gUnk_08004AA6, NULL, NULL, NULL, +}; + +const u8 BladeBrothers_EquippedItem[] = { + 0, 0, ITEM_PEGASUS_BOOTS, ITEM_ROCS_CAPE, 0, 0, 0, 0, 0, 0, 0, +}; + +const u8 gUnk_08111623[] = { + 7, 0, 4, 6, 5, 8, 9, 10, +}; +const u8 gUnk_0811162B[] = { + ITEM_SKILL_SPIN_ATTACK, + ITEM_SKILL_ROCK_BREAKER, + ITEM_SKILL_DASH_ATTACK, + ITEM_SKILL_DOWN_THRUST, + ITEM_SKILL_ROLL_ATTACK, + ITEM_SKILL_SWORD_BEAM, + ITEM_SKILL_PERIL_BEAM, + ITEM_SKILL_GREAT_SPIN, + 243, + 244, + 245, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, +}; + +const u16 gUnk_08111664[] = { + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x01), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x09), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x11), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x19), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x22), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x2b), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x34), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x3d), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x46), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x50), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x5a), +}; + +const u16 gUnk_0811167A[] = { + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x02), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x0a), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x12), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x1a), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x23), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x2c), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x35), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x3e), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x47), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x51), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x5b), +}; +const u16 gUnk_08111690[] = { + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x03), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x0b), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x13), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x1b), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x24), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x2d), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x36), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x3f), + 0x0, + 0x0, + 0x0, +}; +const u16 gUnk_081116A6[] = { + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x04), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x0c), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x14), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x1c), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x25), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x2e), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x37), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x40), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x48), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x52), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x5c), +}; +const u16 gUnk_081116BC[] = { + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x05), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x0d), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x15), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x1d), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x26), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x2f), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x38), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x41), + 0x0, + 0x0, + 0x0, +}; +const u16 gUnk_081116D2[] = { + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x06), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x0e), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x16), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x1e), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x27), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x30), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x39), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x42), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x49), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x53), TEXT_INDEX(TEXT_BLADE_MASTERS, 0x5d), +}; +const u16 gUnk_081116E8[] = { + 0x0, + 0x0, + 0x0, + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x1f), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x28), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x31), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x3a), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x43), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x1f), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x1f), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x1f), +}; +const u16 gUnk_081116FE[] = { + 0x0, + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x07), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x0f), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x17), + 0x0, + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x32), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x3b), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x44), + 0x0, + 0x0, + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x5e), +}; +const u16 gUnk_08111714[] = { + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x60), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x61), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x62), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x63), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x64), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x65), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x66), + TEXT_INDEX(TEXT_BLADE_MASTERS, 0x67), + 0x0, + 0x0, + 0x0, +}; + +const u16 gUnk_0811172A[] = { 0, 0, 30, 0, 0, 0, 0, 30, 0, 0, 0 }; +const u32 gUnk_08111740[] = { 1, 4, 3, 7, 2, 5, 8, 6, 10, 11, 12 }; + extern u32 gUnk_0300402B; extern EntityData gUnk_080F3494; @@ -146,7 +323,7 @@ void BladeBrothers_StartPlayerDemonstration(Entity* this, ScriptExecutionContext if (p = this->timer, BladeBrothers_EquippedItem[p]) { ForceEquipItem(BladeBrothers_EquippedItem[this->timer], EQUIP_SLOT_A); } - InitPlayerMacro(BladeBrothers_PlayerMacros[this->timer]); + InitPlayerMacro((PlayerMacroEntry*)BladeBrothers_PlayerMacros[this->timer]); } void sub_08068BB4(Entity* this) { @@ -196,7 +373,7 @@ void BladeBrothers_GetScroll(Entity* this) { } void sub_08068C8C(Entity* this, ScriptExecutionContext* context) { - u8* arr = gUnk_0811162B + 0xd; + const u8* arr = gUnk_0811162B + 0xd; context->condition = *(u32*)(arr + this->timer * 4); } diff --git a/src/npc/carpenter.c b/src/npc/carpenter.c index d8572d1d..a4da0fff 100644 --- a/src/npc/carpenter.c +++ b/src/npc/carpenter.c @@ -98,7 +98,7 @@ void sub_08067314(Entity* this) { void Carpenter_Fusion(Entity* this) { if (this->action == 0) { - if (LoadExtraSpriteData(this, &gUnk_08110CA8[this->type * 4]) != 0) { + if (LoadExtraSpriteData(this, &gUnk_08110CA8[this->type * 4])) { this->action = this->action + 1; this->spriteSettings.draw = 1; SetDefaultPriority(this, PRIO_MESSAGE); diff --git a/src/npc/castleMaid.c b/src/npc/castleMaid.c index cb327cdc..c17db2f8 100644 --- a/src/npc/castleMaid.c +++ b/src/npc/castleMaid.c @@ -66,7 +66,7 @@ void sub_08064570(CastleMaidEntity* this) { tmp3 = 0; } data = &gUnk_0810F874[tmp3 * 3]; - if (LoadExtraSpriteData(super, data) == 0) { + if (!LoadExtraSpriteData(super, data)) { return; } super->action++; diff --git a/src/npc/dog.c b/src/npc/dog.c index cacabce8..fef5cd27 100644 --- a/src/npc/dog.c +++ b/src/npc/dog.c @@ -4,32 +4,177 @@ #include "npc.h" #include "item.h" -extern void (*gUnk_08111D88[])(Entity*); void sub_08069FE8(Entity*); -u32 sub_08069EF0(Entity*); - -extern u8 gUnk_08111DA8[]; +bool32 sub_08069EF0(Entity*); bool32 sub_08069F90(Entity*); void sub_08069F6C(Entity*); void sub_08069D00(Entity*); void sub_08069CB8(Entity*); - -extern u8 gUnk_08111DB0[]; void sub_0806A028(Entity*); - void sub_08069FBC(Entity*); - -extern SpriteLoadData gUnk_08111D58[]; -extern u8 gUnk_08111E30[]; - void sub_0806A080(Entity*); -extern Dialog gUnk_08111E34[][10]; - -extern u16 gUnk_08111F74[][5]; - -extern u16 gUnk_08111FD8[]; - +const SpriteLoadData gUnk_08111D58[] = { +#ifdef EU + { 82, 67, 4 }, { 7250, 67, 4 }, { 0, 0, 0 }, { 64, 69, 4 }, { 7232, 69, 4 }, { 0, 0, 0 }, +#else + { 82, 67, 4 }, { 7250, 67, 4 }, { 0, 0, 0 }, { 1, 69, 4 }, { 7169, 69, 4 }, { 0, 0, 0 }, +#endif + { 4, 68, 4 }, { 7172, 68, 4 }, { 0, 0, 0 }, { 83, 69, 4 }, { 7251, 69, 4 }, { 0, 0, 0 }, +}; + +void sub_08069B44(Entity*); +void sub_08069C40(Entity*); +void sub_08069D54(Entity*); +void sub_08069DF8(Entity*); +void sub_08069E44(Entity*); +void sub_08069E50(Entity*); +void sub_08069ECC(Entity*); +void sub_08069EE0(Entity*); +void (*const gUnk_08111D88[])(Entity*) = { + sub_08069B44, sub_08069C40, sub_08069D54, sub_08069DF8, sub_08069E44, sub_08069E50, sub_08069ECC, sub_08069EE0, +}; + +const u8 gUnk_08111DA8[] = { 7, 23, 8, 24, 8, 24, 9, 25 }; +const u8 gUnk_08111DB0[] = { + 24, 24, 24, 24, 25, 25, 25, 25, 77, 77, 77, 77, 78, 78, 78, 146, 146, 214, 214, 214, 215, 215, + 215, 215, 27, 27, 27, 27, 24, 24, 24, 24, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, + 78, 78, 78, 78, 146, 146, 146, 146, 147, 147, 147, 215, 215, 27, 27, 27, 24, 24, 24, 24, 24, 76, + 76, 76, 77, 77, 77, 77, 145, 145, 145, 145, 146, 146, 146, 146, 146, 146, 146, 146, 147, 147, 147, 147, + 215, 215, 215, 215, 212, 212, 212, 24, 24, 24, 24, 24, 25, 25, 25, 77, 77, 145, 145, 145, 146, 146, + 146, 146, 214, 214, 214, 214, 215, 215, 215, 215, 215, 215, 215, 215, 212, 212, 212, 212, +}; +const u8 gUnk_08111E30[] = { 19, 13, 13, 13 }; + +void sub_0806A0A4(Entity*); +void sub_0806A144(Entity*); + +const Dialog gUnk_08111E34[][10] = { + { + { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_LON_LON, 0x8), TEXT_INDEX(TEXT_STOCKWELL, 0x23) } }, + { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_LON_LON, 0x8), TEXT_INDEX(TEXT_STOCKWELL, 0x23) } }, + { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_LON_LON, 0x8), TEXT_INDEX(TEXT_STOCKWELL, 0x23) } }, + { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_LON_LON, 0x8), TEXT_INDEX(TEXT_STOCKWELL, 0x23) } }, + { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_LON_LON, 0x8), TEXT_INDEX(TEXT_STOCKWELL, 0x23) } }, + { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_LON_LON, 0x8), TEXT_INDEX(TEXT_STOCKWELL, 0x23) } }, + { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_LON_LON, 0x8), TEXT_INDEX(TEXT_STOCKWELL, 0x23) } }, + { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_LON_LON, 0x8), TEXT_INDEX(TEXT_STOCKWELL, 0x23) } }, + { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_LON_LON, 0x8), TEXT_INDEX(TEXT_STOCKWELL, 0x23) } }, + { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_LON_LON, 0x8), TEXT_INDEX(TEXT_STOCKWELL, 0x23) } }, + }, + { + { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_TOWN, 0x18), TEXT_INDEX(TEXT_TOWN, 0x19) } }, + { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_TOWN, 0x18), TEXT_INDEX(TEXT_TOWN, 0x19) } }, + { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_TOWN, 0x18), TEXT_INDEX(TEXT_TOWN, 0x19) } }, + { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_TOWN, 0x18), TEXT_INDEX(TEXT_TOWN, 0x19) } }, + { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_TOWN2, 0x14), TEXT_INDEX(TEXT_TOWN2, 0x15) } }, + { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_TOWN3, 0x14), TEXT_INDEX(TEXT_TOWN3, 0x15) } }, + { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_TOWN4, 0x14), TEXT_INDEX(TEXT_TOWN4, 0x15) } }, + { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_TOWN5, 0x14), TEXT_INDEX(TEXT_TOWN5, 0x15) } }, + { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_TOWN6, 0x13), TEXT_INDEX(TEXT_TOWN6, 0x14) } }, + { 0, 0, DIALOG_MINISH, 1, { TEXT_INDEX(TEXT_TOWN6, 0x13), TEXT_INDEX(TEXT_TOWN6, 0x14) } }, + }, + { + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A0A4 } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A0A4 } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A0A4 } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A0A4 } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A0A4 } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A0A4 } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A0A4 } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A0A4 } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A0A4 } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A0A4 } }, + }, + { + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A144 } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A144 } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A144 } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A144 } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A144 } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A144 } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A144 } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A144 } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A144 } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806A144 } }, + } +}; +const u16 gUnk_08111F74[][5] = { + { + TEXT_INDEX(TEXT_TOWN, 0x3b), + TEXT_INDEX(TEXT_TOWN, 0x3c), + TEXT_INDEX(TEXT_TOWN2, 0x32), + TEXT_INDEX(TEXT_TOWN2, 0x33), + TEXT_INDEX(TEXT_TOWN2, 0x34), + }, + { + TEXT_INDEX(TEXT_TOWN, 0x3b), + TEXT_INDEX(TEXT_TOWN, 0x3c), + TEXT_INDEX(TEXT_TOWN2, 0x32), + TEXT_INDEX(TEXT_TOWN2, 0x33), + TEXT_INDEX(TEXT_TOWN2, 0x34), + }, + { + TEXT_INDEX(TEXT_TOWN, 0x3b), + TEXT_INDEX(TEXT_TOWN, 0x3c), + TEXT_INDEX(TEXT_TOWN2, 0x32), + TEXT_INDEX(TEXT_TOWN2, 0x33), + TEXT_INDEX(TEXT_TOWN2, 0x34), + }, + { + TEXT_INDEX(TEXT_TOWN, 0x3b), + TEXT_INDEX(TEXT_TOWN, 0x3c), + TEXT_INDEX(TEXT_TOWN2, 0x32), + TEXT_INDEX(TEXT_TOWN2, 0x33), + TEXT_INDEX(TEXT_TOWN2, 0x34), + }, + { + TEXT_INDEX(TEXT_TOWN2, 0x30), + TEXT_INDEX(TEXT_TOWN2, 0x31), + TEXT_INDEX(TEXT_TOWN2, 0x32), + TEXT_INDEX(TEXT_TOWN2, 0x33), + TEXT_INDEX(TEXT_TOWN2, 0x34), + }, + { + TEXT_INDEX(TEXT_TOWN3, 0x2c), + TEXT_INDEX(TEXT_TOWN3, 0x2d), + TEXT_INDEX(TEXT_TOWN3, 0x2e), + TEXT_INDEX(TEXT_TOWN2, 0x33), + TEXT_INDEX(TEXT_TOWN3, 0x2f), + }, + { + TEXT_INDEX(TEXT_TOWN4, 0x28), + TEXT_INDEX(TEXT_TOWN4, 0x29), + TEXT_INDEX(TEXT_TOWN4, 0x2a), + TEXT_INDEX(TEXT_TOWN2, 0x33), + TEXT_INDEX(TEXT_TOWN4, 0x2b), + }, + { + TEXT_INDEX(TEXT_TOWN5, 0x28), + TEXT_INDEX(TEXT_TOWN5, 0x29), + TEXT_INDEX(TEXT_TOWN5, 0x2a), + TEXT_INDEX(TEXT_TOWN2, 0x33), + TEXT_INDEX(TEXT_TOWN5, 0x2b), + }, + { + TEXT_INDEX(TEXT_TOWN6, 0x21), + TEXT_INDEX(TEXT_TOWN6, 0x22), + TEXT_INDEX(TEXT_TOWN6, 0x23), + TEXT_INDEX(TEXT_TOWN2, 0x33), + TEXT_INDEX(TEXT_TOWN6, 0x24), + }, + { + TEXT_INDEX(TEXT_TOWN6, 0x21), + TEXT_INDEX(TEXT_TOWN6, 0x22), + TEXT_INDEX(TEXT_TOWN6, 0x23), + TEXT_INDEX(TEXT_TOWN2, 0x33), + TEXT_INDEX(TEXT_TOWN6, 0x24), + }, +}; +const u16 gUnk_08111FD8[] = { + TEXT_INDEX(TEXT_TOWN8, 0x7), TEXT_INDEX(TEXT_TOWN8, 0x8), TEXT_INDEX(TEXT_TOWN8, 0x9), + TEXT_INDEX(TEXT_TOWN8, 0x11), TEXT_INDEX(TEXT_TOWN8, 0x3), +}; void Dog(Entity* this) { gUnk_08111D88[this->action](this); sub_0806ED78(this); @@ -41,7 +186,7 @@ void sub_08069B44(Entity* this) { u32 sVar3; u32 uVar4; u32 uVar5; - if (sub_08069EF0(this) != 0) { + if (sub_08069EF0(this)) { uVar5 = sub_0805ACC0(this); if (uVar5 == 0) { sVar3 = this->x.HALF.HI; @@ -234,13 +379,13 @@ void sub_08069EE8(Entity* this) { this->action = 5; } -u32 sub_08069EF0(Entity* this) { - if (LoadExtraSpriteData(this, &gUnk_08111D58[this->type * 3]) == 0) { - return 0; +bool32 sub_08069EF0(Entity* this) { + if (!LoadExtraSpriteData(this, &gUnk_08111D58[this->type * 3])) { + return FALSE; } this->action = 1; this->field_0x68.HWORD = gUnk_08111E30[this->type]; - return 1; + return TRUE; } void Dog_Head(Entity* this) { @@ -358,7 +503,7 @@ void sub_0806A144(Entity* this) { void Dog_Fusion(Entity* this) { if (this->action == 0) { - if (sub_08069EF0(this) != 0) { + if (sub_08069EF0(this)) { this->action++; this->spriteSettings.draw = 1; SetDefaultPriority(this, PRIO_MESSAGE); diff --git a/src/npc/farmers.c b/src/npc/farmers.c index 86838460..59de6957 100644 --- a/src/npc/farmers.c +++ b/src/npc/farmers.c @@ -11,7 +11,7 @@ void sub_0806BC58(Entity* this); void Farmers(Entity* this) { if (this->action == 0) { - if (LoadExtraSpriteData(this, &gUnk_08113140[this->type * 3]) == 0) { + if (!LoadExtraSpriteData(this, &gUnk_08113140[this->type * 3])) { return; } this->action++; @@ -81,8 +81,8 @@ void sub_0806BCE8(Entity* this) { void Farmers_Fusion(Entity* this) { if (this->action == 0) { - if (LoadExtraSpriteData(this, &gUnk_08113140[this->type * 3]) != 0) { - this->action = this->action + 1; + if (LoadExtraSpriteData(this, &gUnk_08113140[this->type * 3])) { + this->action++; this->spriteSettings.draw = 1; this->spriteSettings.flipX = 0; sub_0806BC58(this); diff --git a/src/npc/forestMinish.c b/src/npc/forestMinish.c index 1e833a02..7f3625f0 100644 --- a/src/npc/forestMinish.c +++ b/src/npc/forestMinish.c @@ -1,24 +1,510 @@ -#include "npc.h" -#include "object.h" #include "functions.h" -#include "playeritem.h" #include "item.h" #include "kinstone.h" - -extern SpriteLoadData gUnk_0810A348; -extern u8* gUnk_08109D18[]; -extern u8 gUnk_08109C98[]; -extern u16 gUnk_0810A354[]; -extern Dialog gUnk_08109DC8[]; -extern u16 gUnk_0810A35A[]; -extern u16 gUnk_0810A362[]; +#include "npc.h" +#include "object.h" +#include "playeritem.h" +#include "structures.h" + +const FrameStruct gUnk_08109C98[] = { + { 36, 26 }, { 37, 26 }, { 38, 26 }, { 39, 155 }, { 40, 155 }, { 41, 155 }, { 42, 155 }, { 43, 152 }, + { 28, 152 }, { 29, 152 }, { 30, 153 }, { 31, 153 }, { 32, 153 }, { 33, 153 }, { 34, 26 }, { 35, 26 }, + { 36, 154 }, { 37, 154 }, { 38, 27 }, { 39, 27 }, { 40, 27 }, { 41, 27 }, { 42, 27 }, { 43, 152 }, + { 28, 152 }, { 29, 152 }, { 30, 152 }, { 31, 153 }, { 32, 153 }, { 33, 153 }, { 34, 154 }, { 35, 154 }, + { 36, 154 }, { 37, 154 }, { 38, 155 }, { 39, 155 }, { 40, 155 }, { 41, 155 }, { 42, 24 }, { 43, 24 }, + { 28, 24 }, { 29, 24 }, { 30, 24 }, { 31, 153 }, { 32, 153 }, { 33, 153 }, { 34, 153 }, { 35, 154 }, + { 36, 154 }, { 37, 154 }, { 38, 154 }, { 39, 155 }, { 40, 155 }, { 41, 155 }, { 42, 152 }, { 43, 152 }, + { 28, 152 }, { 29, 152 }, { 30, 25 }, { 31, 25 }, { 32, 25 }, { 33, 25 }, { 34, 25 }, { 35, 154 }, +}; +extern Script script_BombMinish; +extern Script script_BombMinishKinstone; +extern Script script_ForestMinish1; +extern Script script_ForestMinish2; +extern Script script_ForestMinish3; +extern Script script_ForestMinish4; +extern Script script_ForestMinish5; +extern Script script_ForestMinish6; +extern Script script_ForestMinish7; +extern Script script_ForestMinish8; +extern Script script_ForestMinish9; +extern Script script_ForestMinish10; +extern Script script_ForestMinish11; +extern Script script_ForestMinish12; +extern Script script_ForestMinish13; +extern Script script_ForestMinish14; +extern Script script_ForestMinish15; +extern Script script_ForestMinish16; +extern Script script_ForestMinish17; +extern Script script_ForestMinish18; +extern Script script_ForestMinish19; +extern Script script_ForestMinish20; +extern Script script_ForestMinish21; +Script* const gUnk_08109D18[] = { + &script_BombMinish, &script_BombMinishKinstone, &script_ForestMinish12, &script_ForestMinish13, + &script_ForestMinish14, &script_ForestMinish15, &script_ForestMinish16, &script_ForestMinish17, + &script_ForestMinish18, &script_ForestMinish19, &script_ForestMinish20, &script_ForestMinish21, + &script_ForestMinish1, &script_ForestMinish1, &script_ForestMinish1, &script_ForestMinish2, + &script_ForestMinish3, &script_ForestMinish1, &script_ForestMinish1, &script_ForestMinish1, + &script_ForestMinish1, &script_ForestMinish1, &script_ForestMinish10, &script_ForestMinish4, + &script_ForestMinish4, &script_ForestMinish4, &script_ForestMinish4, &script_ForestMinish4, + &script_ForestMinish4, &script_ForestMinish4, &script_ForestMinish4, &script_ForestMinish4, + &script_ForestMinish4, &script_ForestMinish4, &script_ForestMinish4, &script_ForestMinish4, + &script_ForestMinish11, &script_ForestMinish11, &script_ForestMinish11, &script_ForestMinish5, + &script_ForestMinish6, &script_ForestMinish7, &script_ForestMinish8, &script_ForestMinish9, +}; + +void sub_080601D4(Entity*); +const Dialog gUnk_08109DC8[][4] = { + { + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + }, + { + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + }, + { + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + }, + { + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + }, + { + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + }, + { + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + }, + { + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + }, + { + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + }, + { + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + }, + { + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + }, + { + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + }, + { + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + }, + { + { KINSTONE_24, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0x4), TEXT_INDEX(TEXT_MINISH, 0x0) } }, + { KINSTONE_24, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0x4), TEXT_INDEX(TEXT_MINISH, 0x0) } }, + { KINSTONE_24, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0x4), TEXT_INDEX(TEXT_MINISH, 0x0) } }, + { KINSTONE_24, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0x4), TEXT_INDEX(TEXT_MINISH, 0x0) } }, + }, + { + { KINSTONE_14, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0x9), TEXT_INDEX(TEXT_MINISH, 0x5) } }, + { KINSTONE_14, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0x9), TEXT_INDEX(TEXT_MINISH, 0x5) } }, + { KINSTONE_14, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0x9), TEXT_INDEX(TEXT_MINISH, 0x5) } }, + { KINSTONE_14, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0x9), TEXT_INDEX(TEXT_MINISH, 0x5) } }, + }, + { +#if defined(USA) || defined(DEMO_USA) + { KINSTONE_3F, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0xe), TEXT_INDEX(TEXT_MINISH, 0xa) } }, + { KINSTONE_3F, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0xe), TEXT_INDEX(TEXT_MINISH, 0xa) } }, + { KINSTONE_3F, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0xe), TEXT_INDEX(TEXT_MINISH, 0xa) } }, + { KINSTONE_3F, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0xe), TEXT_INDEX(TEXT_MINISH, 0xa) } }, +#else + { KINSTONE_22, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0xe), TEXT_INDEX(TEXT_MINISH, 0xa) } }, + { KINSTONE_22, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0xe), TEXT_INDEX(TEXT_MINISH, 0xa) } }, + { KINSTONE_22, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0xe), TEXT_INDEX(TEXT_MINISH, 0xa) } }, + { KINSTONE_22, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0xe), TEXT_INDEX(TEXT_MINISH, 0xa) } }, +#endif + }, + { + { KINSTONE_2E, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0x22), TEXT_INDEX(TEXT_MINISH, 0x1e) } }, + { KINSTONE_2E, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0x22), TEXT_INDEX(TEXT_MINISH, 0x1e) } }, + { KINSTONE_2E, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0x22), TEXT_INDEX(TEXT_MINISH, 0x1e) } }, + { KINSTONE_2E, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0x22), TEXT_INDEX(TEXT_MINISH, 0x1e) } }, + }, + { + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x1) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x1) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x1) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x1) } }, + }, + { + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x25) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x25) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x25) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x25) } }, + }, + { + { KINSTONE_23, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0x13), TEXT_INDEX(TEXT_MINISH, 0xf) } }, + { KINSTONE_23, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0x13), TEXT_INDEX(TEXT_MINISH, 0xf) } }, + { KINSTONE_23, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0x13), TEXT_INDEX(TEXT_MINISH, 0xf) } }, + { KINSTONE_23, + DIALOG_KINSTONE, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_MINISH, 0x13), TEXT_INDEX(TEXT_MINISH, 0xf) } }, + }, + { + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x1a) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x1a) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x1a) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x1a) } }, + }, + { + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x15) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x15) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x15) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x15) } }, + }, + { + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_080601D4 } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_080601D4 } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_080601D4 } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_080601D4 } }, + }, + { + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x1) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x2) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x3) } }, + }, + { + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x23) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x24) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x6) } }, + }, + { + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0xe) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0xe) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0xe) } }, + }, + { + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x15) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x15) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x15) } }, + }, + { + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x1a) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x1a) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x1a) } }, + }, + { + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x1f) } }, + { ITEM_GREEN_SWORD, + DIALOG_INVENTORY, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_FOREST_MINISH, 0x21), TEXT_INDEX(TEXT_FOREST_MINISH, 0x20) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x21) } }, + }, + { + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x24) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x25) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x25) } }, + }, + { + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x29) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x2a) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x2b) } }, + }, + { + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x2e) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x2f) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x2f) } }, + }, + { + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x33) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x34) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x34) } }, + }, + { + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x38) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x39) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x39) } }, + }, + { + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x22) } }, + }, + { + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x32) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x32) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x32) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_BELARI, 0x32) } }, + }, + { + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x31) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x31) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x31) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FOREST_MINISH, 0x31) } }, + }, + { + { ITEM_FLIPPERS, + DIALOG_INVENTORY, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_TOWN_MINISH2, 0x9), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x3) } }, + { ITEM_FLIPPERS, + DIALOG_INVENTORY, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_TOWN_MINISH2, 0x9), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x3) } }, + { ITEM_FLIPPERS, + DIALOG_INVENTORY, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_TOWN_MINISH2, 0x9), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x3) } }, + { ITEM_FLIPPERS, + DIALOG_INVENTORY, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_TOWN_MINISH2, 0x9), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x3) } }, + }, + { + { ITEM_FLIPPERS, + DIALOG_INVENTORY, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_TOWN_MINISH2, 0xb), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x5) } }, + { ITEM_FLIPPERS, + DIALOG_INVENTORY, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_TOWN_MINISH2, 0xb), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x5) } }, + { ITEM_FLIPPERS, + DIALOG_INVENTORY, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_TOWN_MINISH2, 0xb), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x5) } }, + { ITEM_FLIPPERS, + DIALOG_INVENTORY, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_TOWN_MINISH2, 0xb), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x5) } }, + }, + { + { ITEM_FLIPPERS, + DIALOG_INVENTORY, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_TOWN_MINISH2, 0xc), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x6) } }, + { ITEM_FLIPPERS, + DIALOG_INVENTORY, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_TOWN_MINISH2, 0xc), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x6) } }, + { ITEM_FLIPPERS, + DIALOG_INVENTORY, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_TOWN_MINISH2, 0xc), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x6) } }, + { ITEM_FLIPPERS, + DIALOG_INVENTORY, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_TOWN_MINISH2, 0xc), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x6) } }, + }, + { + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + }, + { + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + }, + { + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + }, + { + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + }, + { + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + } +}; + +const SpriteLoadData gUnk_0810A348[] = { + { 48, 31, 4 }, + { 8240, 31, 4 }, + { 0, 0, 0 }, +}; +const u16 gUnk_0810A354[] = { + TEXT_INDEX(TEXT_MINISH, 0x14), + TEXT_INDEX(TEXT_MINISH, 0x18), + TEXT_INDEX(TEXT_ANSWER_HOUSE, 0x26), +}; +const u16 gUnk_0810A35A[] = { + TEXT_INDEX(TEXT_UNK_WISE, 0x1), + TEXT_INDEX(TEXT_UNK_WISE, 0x2), + TEXT_INDEX(TEXT_UNK_WISE, 0x3), + TEXT_INDEX(TEXT_UNK_WISE, 0x4), +}; +const u16 gUnk_0810A362[] = { + TEXT_INDEX(TEXT_BELARI, 0x2), + TEXT_INDEX(TEXT_BELARI, 0x3), + TEXT_INDEX(TEXT_BELARI, 0x9), + TEXT_INDEX(TEXT_BELARI, 0x8), +}; static void sub_080600F0(Entity* this); void ForestMinish(Entity* this) { switch (this->action) { case 0: - if (LoadExtraSpriteData(this, &gUnk_0810A348)) { + if (LoadExtraSpriteData(this, gUnk_0810A348)) { this->action = 1; this->spriteSettings.draw = TRUE; this->field_0x68.HALF.HI = this->animationState = this->timer << 1; @@ -100,7 +586,7 @@ void sub_0806014C(Entity* this) { void sub_08060158(Entity* this) { int index; - u8* idx3; + const FrameStruct* idx3; u8 tmp1, tmp2; if (this->timer) { @@ -114,9 +600,9 @@ void sub_08060158(Entity* this) { index = state * 4; } - idx3 = gUnk_08109C98 + (this->animationState / 2) * 0x20 + (index >> 1) * 2; - tmp1 = idx3[0]; - tmp2 = idx3[1]; + idx3 = gUnk_08109C98 + (this->animationState / 2) * 0x10 + (index >> 1); + tmp1 = idx3->frame; + tmp2 = idx3->frameIndex; if (tmp2 & 0x80) { this->animationState = sub_0806F5B0(index); @@ -144,7 +630,7 @@ void sub_080601D4(Entity* this) { } void sub_08060208(Entity* this) { - ShowNPCDialogue(this, &gUnk_08109DC8[this->type2 * 0x4]); + ShowNPCDialogue(this, gUnk_08109DC8[this->type2]); } void sub_0806021C(Entity* this) { @@ -161,11 +647,11 @@ void sub_0806021C(Entity* this) { if (GetInventoryValue(ITEM_MOLE_MITTS)) { uVar2 = 3; } - ShowNPCDialogue(this, gUnk_08109DC8 + this->type2 * 0x4 + uVar2); + ShowNPCDialogue(this, &gUnk_08109DC8[this->type2][uVar2]); } void sub_0806025C(Entity* this) { - ShowNPCDialogue(this, &gUnk_08109DC8[this->type2 * 0x4]); + ShowNPCDialogue(this, gUnk_08109DC8[this->type2]); } void sub_08060270(Entity* this) { @@ -249,7 +735,7 @@ u32 sub_08060354(void) { void ForestMinish_Fusion(Entity* this) { if (this->action == 0) { - if (LoadExtraSpriteData(this, &gUnk_0810A348)) { + if (LoadExtraSpriteData(this, gUnk_0810A348)) { this->action++; this->spriteSettings.draw = TRUE; SetDefaultPriority(this, PRIO_MESSAGE); diff --git a/src/npc/gorman.c b/src/npc/gorman.c index bfb30084..bec184f5 100644 --- a/src/npc/gorman.c +++ b/src/npc/gorman.c @@ -1,30 +1,57 @@ #include "functions.h" #include "npc.h" -extern void (*const gUnk_08111C48[])(Entity*); - void sub_080697A4(Entity* this); void sub_08069838(Entity* this); - -extern SpriteLoadData gUnk_08111C3C; - -extern u8 gUnk_08111C9C[]; - -extern u8 gUnk_08111CA8[]; - -extern u8 gUnk_08111CB4[]; - -extern u8 gUnk_08111CB8[]; - void sub_08069888(Entity* this); -extern u16 gUnk_08111C50[]; - -extern const s16 gUnk_08111C5C[]; -extern const u8 gUnk_08111C74[]; - -extern const s16 gUnk_08111C84[]; -extern const u8 gUnk_08111C8C[]; +const SpriteLoadData gUnk_08111C3C[] = { + { 193, 64, 4 }, + { 5313, 64, 4 }, + { 0, 0, 0 }, +}; +void sub_080697C4(Entity*); +void sub_080697EC(Entity*); +void (*const gUnk_08111C48[])(Entity*) = { + sub_080697C4, + sub_080697EC, +}; +const u16 gUnk_08111C50[] = { + TEXT_INDEX(TEXT_GORMAN_ORACLES, 0x1), TEXT_INDEX(TEXT_GORMAN_ORACLES, 0x2), TEXT_INDEX(TEXT_GORMAN_ORACLES, 0xc), + TEXT_INDEX(TEXT_GORMAN_ORACLES, 0xd), TEXT_INDEX(TEXT_GORMAN_ORACLES, 0xe), TEXT_INDEX(TEXT_GORMAN_ORACLES, 0x15), +}; +const Coords gUnk_08111C5C[] = { + { .HALF = { 0x68, 0x1c8 } }, { .HALF = { 0x28, 0x1c8 } }, { .HALF = { 0x68, 0x188 } }, + { .HALF = { 0x68, 0x1c8 } }, { .HALF = { 0x28, 0x188 } }, { .HALF = { 0x68, 0x188 } } +}; +const u8 gUnk_08111C74[] = { + 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 0, +}; +const Coords gUnk_08111C84[] = { + { .HALF = { 0x178, 0x108 } }, + { .HALF = { 0x138, 0x108 } }, +}; +const u8 gUnk_08111C8C[] = { + 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 0, +}; +const u8 gUnk_08111C9C[] = { + 0, 1, 0, 1, 2, 3, 2, 3, 4, 5, 4, 5, +}; +const u8 gUnk_08111CA8[] = { + 1, 2, 0, 0, 3, 4, 1, 2, 5, 5, 3, 4, +}; +const u8 gUnk_08111CB4[] = { + 0, + 1, + 0, + 1, +}; +const u8 gUnk_08111CB8[] = { + 1, + 1, + 0, + 0, +}; void Gorman(Entity* this) { if ((this->flags & ENT_SCRIPTED) != 0) { @@ -40,7 +67,7 @@ void sub_080697A4(Entity* this) { } void sub_080697C4(Entity* this) { - if (LoadExtraSpriteData(this, &gUnk_08111C3C) != 0) { + if (LoadExtraSpriteData(this, gUnk_08111C3C)) { this->action = 1; InitializeAnimation(this, 2); sub_08078778(this); @@ -69,7 +96,7 @@ void sub_080697EC(Entity* this) { void sub_08069838(Entity* this) { if (this->action == 0) { - if (LoadExtraSpriteData(this, &gUnk_08111C3C) == 0) { + if (!LoadExtraSpriteData(this, gUnk_08111C3C)) { return; } this->action++; @@ -107,11 +134,11 @@ void sub_08069888(Entity* this) { void sub_0806991C(Entity* this, ScriptExecutionContext* context) { u32 tmp; - const s16* ptr; + const Coords* ptr; this->field_0x68.HALF.LO = (Random() & 0x1f) + 0x3c; - ptr = &gUnk_08111C5C[*(s8*)&this->field_0x68.HALF.HI * 2]; - context->x.HALF.HI = gRoomControls.origin_x + ptr[0]; - context->y.HALF.HI = gRoomControls.origin_y + ptr[1]; + ptr = &gUnk_08111C5C[*(s8*)&this->field_0x68.HALF.HI]; + context->x.HALF.HI = gRoomControls.origin_x + ptr->HALF.x; + context->y.HALF.HI = gRoomControls.origin_y + ptr->HALF.y; context->unk_19 = 8; context->postScriptActions |= 2; context->condition = 0; @@ -123,11 +150,11 @@ void sub_0806991C(Entity* this, ScriptExecutionContext* context) { void sub_080699AC(Entity* this, ScriptExecutionContext* context) { u32 tmp; - const s16* ptr; + const Coords* ptr; this->field_0x68.HALF.LO = (Random() & 0x1f) + 0x3c; - ptr = &gUnk_08111C84[*(s8*)&this->field_0x68.HALF.HI * 2]; - context->x.HALF.HI = gRoomControls.origin_x + ptr[0]; - context->y.HALF.HI = gRoomControls.origin_y + ptr[1]; + ptr = &gUnk_08111C84[*(s8*)&this->field_0x68.HALF.HI]; + context->x.HALF.HI = gRoomControls.origin_x + ptr->HALF.x; + context->y.HALF.HI = gRoomControls.origin_y + ptr->HALF.y; context->unk_19 = 8; context->postScriptActions |= 2; context->condition = 0; diff --git a/src/npc/goron.c b/src/npc/goron.c index 497b8ab3..e046f7c9 100644 --- a/src/npc/goron.c +++ b/src/npc/goron.c @@ -1,8 +1,8 @@ -#include "global.h" +#include "effects.h" #include "entity.h" #include "functions.h" +#include "kinstone.h" #include "message.h" -#include "effects.h" #include "npc.h" void sub_08069310(Entity*); @@ -158,7 +158,7 @@ void sub_080694EC(Entity* this) { u32 anim; this->animationState = 4; anim = 2; - if (!CheckKinstoneFused(47)) + if (!CheckKinstoneFused(KINSTONE_2F)) anim = 8; InitAnimationForceUpdate(this, anim); this->field_0x80.HWORD = anim; diff --git a/src/npc/guard.c b/src/npc/guard.c index a3e9bf05..661739ee 100644 --- a/src/npc/guard.c +++ b/src/npc/guard.c @@ -24,12 +24,242 @@ extern void sub_08064428(Entity*); void sub_08063DC8(Entity*); void sub_08063F20(Entity*); -extern void (*const gUnk_0810F544[])(Entity*); -extern void (*const gUnk_0810F550[])(Entity*); +// TODO guardWithSpear rodata before this +const Dialog gUnk_0810CF4C[] = { + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FINDING_EZLO, 0x17) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FINDING_EZLO, 0x18) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_CARPENTERS, 0x6) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_CARPENTERS, 0x5) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_PROLOGUE, 0x3e) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_PROLOGUE, 0x40) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_PROLOGUE, 0x3c) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_PROLOGUE, 0x3b) } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { TABIDACHI, + DIALOG_GLOBAL_FLAG, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_PROLOGUE, 0x3f), TEXT_INDEX(TEXT_PROLOGUE, 0x3d) } }, + { TABIDACHI, + DIALOG_GLOBAL_FLAG, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_PROLOGUE, 0x3f), TEXT_INDEX(TEXT_PROLOGUE, 0x3d) } }, + { TABIDACHI, + DIALOG_GLOBAL_FLAG, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_PROLOGUE, 0x3f), TEXT_INDEX(TEXT_PROLOGUE, 0x3d) } }, + { TABIDACHI, + DIALOG_GLOBAL_FLAG, + DIALOG_CHECK_FLAG, + 1, + { TEXT_INDEX(TEXT_PROLOGUE, 0x3f), TEXT_INDEX(TEXT_PROLOGUE, 0x3d) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_VAATI, 0x20) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_VAATI, 0x20) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_VAATI, 0x20) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_VAATI, 0x22) } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_VAATI, 0x20) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FESTIVAL, 0x1d) } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_PROLOGUE, 0x63) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_PROLOGUE, 0x64) } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, +}; -// entity count -extern SpriteLoadData gUnk_0810F524[]; -extern void* gUnk_0810F6BC[]; +const Dialog gUnk_0810D0A4[] = { + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN, 0x32) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN, 0x32) } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN2, 0x2d) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN3, 0x29) } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN2, 0x29) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN3, 0x26) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x24) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN5, 0x24) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN6, 0x1d) } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN6, 0x20) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN7, 0xb) } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN2, 0x26) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN3, 0x23) } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN6, 0x1c) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN7, 0x8) } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN2, 0x35) } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN7, 0xc) } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN2, 0x24) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN3, 0x21) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x22) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN5, 0x22) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN6, 0x1b) } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN2, 0x38) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN3, 0x32) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x2d) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN5, 0x2d) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN6, 0x26) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN7, 0xd) } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN2, 0x16) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN3, 0x16) } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN7, 0x4) } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN6, 0x15) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN7, 0x6) } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN7, 0x5) } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN7, 0x1) } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN7, 0x9) } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN7, 0xa) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN, 0x33) } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN3, 0x30) } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, + { 0, 0, DIALOG_NONE, 0, { 0, 0 } }, +}; +// Seemingly wasted space. Is this ever indexed? +const u32 emptyDialogs[2048] = {}; + +const SpriteLoadData gUnk_0810F524[] = { + { 55, 43, 4 }, { 6199, 43, 4 }, { 22583, 43, 4 }, { 0, 0, 0 }, + { 4, 43, 4 }, { 16388, 43, 4 }, { 8196, 43, 4 }, { 0, 0, 0 }, +}; +void sub_08063E90(Entity*); +void sub_08063F20(Entity*); +void sub_08063F78(Entity*); +void (*const gUnk_0810F544[])(Entity*) = { + sub_08063E90, + sub_08063F20, + sub_08063F78, +}; +void sub_08063D44(Entity*); +void sub_08063DC8(Entity*); +void sub_08063E54(Entity*); +void sub_08063E6C(Entity*); +void (*const gUnk_0810F550[])(Entity*) = { + sub_08063D44, + sub_08063DC8, + sub_08063E54, + sub_08063E6C, +}; + +extern void* gUnk_0810F6BC[]; // TODO find out type of second param for sub_0806EE04 void Guard(Entity* this) { if ((this->flags & ENT_SCRIPTED) != 0) { diff --git a/src/npc/hurdyGurdyMan.c b/src/npc/hurdyGurdyMan.c index c56d745e..4decaced 100644 --- a/src/npc/hurdyGurdyMan.c +++ b/src/npc/hurdyGurdyMan.c @@ -13,7 +13,7 @@ void HurdyGurdyMan(Entity* this) { switch (this->action) { case 0: - if (LoadExtraSpriteData(this, gUnk_081144F0) != 0) { + if (LoadExtraSpriteData(this, gUnk_081144F0)) { this->action = 1; this->field_0x68.HALF.HI = 0; SetDefaultPriority(this, PRIO_MESSAGE); @@ -106,11 +106,8 @@ void sub_0806E440(Entity* this) { } void HurdyGurdyMan_Fusion(Entity* this) { - u32 uVar1; - if (this->action == 0) { - uVar1 = LoadExtraSpriteData(this, gUnk_081144F0); - if (uVar1 != 0) { + if (LoadExtraSpriteData(this, gUnk_081144F0)) { this->action++; this->spriteSettings.draw = 1; SetDefaultPriority(this, PRIO_MESSAGE); diff --git a/src/npc/kid.c b/src/npc/kid.c index 1371fb9d..59e1e87f 100644 --- a/src/npc/kid.c +++ b/src/npc/kid.c @@ -2,14 +2,184 @@ #include "message.h" #include "npc.h" -extern void (*const gUnk_0810BE0C[])(Entity*); -void sub_080621AC(Entity*); - -extern SpriteLoadData* gUnk_0810BDC4[]; +const SpriteLoadData gUnk_0810BD7C[] = { + { 58, 59, 4 }, + { 10298, 59, 4 }, + { 12288, 59, 4 }, + { 0, 0, 0 }, +}; +const SpriteLoadData gUnk_0810BD8C[] = { + { 58, 59, 4 }, + { 8250, 59, 4 }, + { 10241, 59, 4 }, + { 0, 0, 0 }, +}; +const SpriteLoadData gUnk_0810BD9C[] = { + { 16385, 59, 4 }, + { 58, 59, 4 }, + { 8250, 59, 4 }, + { 0, 0, 0 }, +}; +const SpriteLoadData gUnk_0810BDAC[] = { + { 58, 59, 4 }, + { 6202, 59, 4 }, + { 0, 0, 0 }, +}; +const SpriteLoadData gUnk_0810BDB8[] = { + { 58, 59, 4 }, + { 6202, 59, 4 }, + { 0, 0, 0 }, +}; + +const SpriteLoadData* const gUnk_0810BDC4[] = { + gUnk_0810BD7C, gUnk_0810BD7C, gUnk_0810BD7C, gUnk_0810BD7C, gUnk_0810BD8C, + gUnk_0810BD8C, gUnk_0810BD9C, gUnk_0810BDAC, gUnk_0810BDB8, +}; + +const u16 gUnk_0810BDE8[][2] = { { + TEXT_INDEX(TEXT_EMPTY, 0x1), + TEXT_INDEX(TEXT_EMPTY, 0x1), + }, + { + TEXT_INDEX(TEXT_EMPTY, 0x1), + TEXT_INDEX(TEXT_EMPTY, 0x1), + }, + { + TEXT_INDEX(TEXT_EMPTY, 0x1), + TEXT_INDEX(TEXT_EMPTY, 0x1), + }, + { + TEXT_INDEX(TEXT_EMPTY, 0x1), + TEXT_INDEX(TEXT_EMPTY, 0x1), + }, + { + TEXT_INDEX(TEXT_EMPTY, 0x1), + TEXT_INDEX(TEXT_EMPTY, 0x1), + }, + { + TEXT_INDEX(TEXT_EMPTY, 0x1), + TEXT_INDEX(TEXT_EMPTY, 0x1), + }, + { + TEXT_INDEX(TEXT_EMPTY, 0x1), + TEXT_INDEX(TEXT_EMPTY, 0x1), + }, + { + TEXT_INDEX(TEXT_EMPTY, 0x1), + TEXT_INDEX(TEXT_EMPTY, 0x1), + }, + { + TEXT_INDEX(TEXT_EMPTY, 0x1), + TEXT_INDEX(TEXT_EMPTY, 0x1), + } }; +void sub_080620F4(Entity*); +void sub_08062130(Entity*); +void sub_08062194(Entity*); +void (*const gUnk_0810BE0C[])(Entity*) = { sub_080620F4, sub_08062130, sub_08062194 }; + +void sub_08062194(Entity*); +const Dialog gUnk_0810BE10[] = { + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FESTIVAL, 0xf) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x33) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x33) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x33) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x33) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x33) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x7) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x1d) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x1d) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x4) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x4) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x4) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x4) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x4) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x4) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN5, 0x33) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0xb) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0xb) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x5) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x5) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x5) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x5) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x5) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x5) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN5, 0x34) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0xc) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0xc) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x34) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x34) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x34) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x34) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x34) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x34) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SCHOOL, 0x8) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN8, 0x2e) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN8, 0x2e) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FESTIVAL, 0xe) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x35) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x35) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x35) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x35) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x35) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN5, 0x35) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN8, 0x2d) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN8, 0x2d) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x36) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x36) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x36) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x36) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x36) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x36) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN5, 0x36) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SIMON, 0x13) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_SIMON, 0x13) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_FESTIVAL, 0x14) } }, + { 9, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x31), TEXT_INDEX(TEXT_TOWN, 0x30) } }, + { 9, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x31), TEXT_INDEX(TEXT_TOWN, 0x30) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x10) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN3, 0x35) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x16) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN5, 0x16) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x1e) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x1e) } }, + { 0, 0, DIALOG_CHECK_FLAG, 1, { TEXT_INDEX(TEXT_FESTIVAL, 0x20), TEXT_INDEX(TEXT_FESTIVAL, 0x13) } }, +#if defined(USA) || defined(DEMO_USA) + { 212, DIALOG_LOCAL_FLAG, DIALOG_SET_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x2a), TEXT_INDEX(TEXT_TOWN, 0x29) } }, + { 212, DIALOG_LOCAL_FLAG, DIALOG_SET_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x2a), TEXT_INDEX(TEXT_TOWN, 0x29) } }, +#else + { 209, DIALOG_LOCAL_FLAG, DIALOG_SET_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x2a), TEXT_INDEX(TEXT_TOWN, 0x29) } }, + { 209, DIALOG_LOCAL_FLAG, DIALOG_SET_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x2a), TEXT_INDEX(TEXT_TOWN, 0x29) } }, +#endif + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x11) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN3, 0x33) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x17) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN5, 0x17) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x20) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x20) } }, + { 0, 0, DIALOG_CHECK_FLAG, 1, { TEXT_INDEX(TEXT_FESTIVAL, 0x21), TEXT_INDEX(TEXT_FESTIVAL, 0x1e) } }, +#if defined(USA) || defined(DEMO_USA) + { 213, DIALOG_LOCAL_FLAG, DIALOG_SET_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x2c), TEXT_INDEX(TEXT_TOWN, 0x2b) } }, + { 213, DIALOG_LOCAL_FLAG, DIALOG_SET_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x2c), TEXT_INDEX(TEXT_TOWN, 0x2b) } }, +#else + { 210, DIALOG_LOCAL_FLAG, DIALOG_SET_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x2c), TEXT_INDEX(TEXT_TOWN, 0x2b) } }, + { 210, DIALOG_LOCAL_FLAG, DIALOG_SET_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x2c), TEXT_INDEX(TEXT_TOWN, 0x2b) } }, +#endif + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x12) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN3, 0x34) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x18) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN5, 0x18) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x21) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x21) } }, +}; +const FrameStruct gUnk_0810C0A0[] = { + { 25, 0 }, { 128, 15 }, { 37, 0 }, { 128, 15 }, { 46, 0 }, { 128, 15 }, + { 55, 0 }, { 128, 15 }, { 64, 15 }, { 128, 15 }, { 72, 15 }, { 128, 15 }, + { 120, 83 }, { 128, 15 }, { 131, 102 }, { 128, 15 }, { 139, 111 }, { 128, 15 }, +}; +void sub_080621AC(Entity*); void sub_080622F4(Entity*); void sub_0806265C(Entity*, ScriptExecutionContext*); - void sub_0806252C(Entity*); typedef struct { @@ -23,12 +193,6 @@ typedef struct { #define KID_HEAP_COUNT 0x14 typedef KidHeapItem KidHeap[KID_HEAP_COUNT]; -extern u16 gUnk_0810BDE8[][2]; - -extern Dialog gUnk_0810BE10[]; - -extern u8 gUnk_0810C0A0[]; - void Kid(Entity* this) { if ((this->flags & ENT_SCRIPTED) != 0) { sub_080621AC(this); @@ -38,7 +202,7 @@ void Kid(Entity* this) { } void sub_080620F4(Entity* this) { - if (LoadExtraSpriteData(this, gUnk_0810BDC4[this->type]) != 0) { + if (LoadExtraSpriteData(this, gUnk_0810BDC4[this->type])) { this->animationState = 4; this->field_0x68.HALF.LO = 0; this->action = 1; @@ -76,7 +240,7 @@ void sub_080621AC(Entity* this) { switch (this->action) { case 0: - if (LoadExtraSpriteData(this, gUnk_0810BDC4[this->type]) != 0) { + if (LoadExtraSpriteData(this, gUnk_0810BDC4[this->type])) { this->action = 1; this->animationState = this->timer; this->timer = 0; @@ -204,7 +368,7 @@ void sub_0806265C(Entity* this, ScriptExecutionContext* context) { if (gSave.global_progress == 0) { MessageNoOverlap(0, this); } else { - Dialog* pDialog = &gUnk_0810BE10[this->type * 9]; + const Dialog* pDialog = &gUnk_0810BE10[this->type * 9 - 1]; pDialog += gSave.global_progress; ShowNPCDialogue(this, pDialog); } @@ -273,17 +437,15 @@ void sub_080627E8(Entity* this, ScriptExecutionContext* context) { } void Kid_Head(Entity* this) { - u32 uVar1; u32 uVar2; u32 uVar3; u32 uVar4; u32 uVar5; - u8* ptr; + const FrameStruct* ptr; - uVar1 = this->type * 4; - ptr = &gUnk_0810C0A0[uVar1]; - uVar3 = ((u8)this->frame & 0x1f) + ptr[0]; - uVar4 = (this->frameIndex & 0x1f) + ptr[1]; + ptr = &gUnk_0810C0A0[this->type * 2]; + uVar3 = ((u8)this->frame & 0x1f) + ptr->frame; + uVar4 = (this->frameIndex & 0x1f) + ptr->frameIndex; switch (this->type) { case 0: case 1: @@ -400,7 +562,7 @@ void sub_08062A48(Entity* this, ScriptExecutionContext* context) { void Kid_Fusion(Entity* this) { u32 tmp; if (this->action == 0) { - if (LoadExtraSpriteData(this, gUnk_0810BDC4[this->type]) != 0) { + if (LoadExtraSpriteData(this, gUnk_0810BDC4[this->type])) { this->action = this->action + 1; this->spriteSettings.draw = 1; this->y.HALF.HI = this->y.HALF.HI + -8; diff --git a/src/npc/mama.c b/src/npc/mama.c index ffe8abb6..0cbda85b 100644 --- a/src/npc/mama.c +++ b/src/npc/mama.c @@ -46,7 +46,7 @@ void Mama(Entity* this) { } bool32 sub_0806C454(Entity* this) { - if (LoadExtraSpriteData(this, gUnk_08113754) == 0) { + if (!LoadExtraSpriteData(this, gUnk_08113754)) { return FALSE; } else { SetDefaultPriority(this, PRIO_MESSAGE); diff --git a/src/npc/melari.c b/src/npc/melari.c index 73b86a1a..7e20dbed 100644 --- a/src/npc/melari.c +++ b/src/npc/melari.c @@ -26,7 +26,7 @@ void Melari(Entity* this) { } void sub_08068708(Entity* this) { - if (LoadExtraSpriteData(this, gUnk_08111520) != 0) { + if (LoadExtraSpriteData(this, gUnk_08111520)) { this->action = 1; InitializeAnimation(this, 0); sub_08078778(this); @@ -60,7 +60,7 @@ void sub_08068780(Entity* this) { switch (this->action) { case 0: - if (LoadExtraSpriteData(this, gUnk_08111520) == 0) { + if (!LoadExtraSpriteData(this, gUnk_08111520)) { return; } this->action = 1; diff --git a/src/npc/minishEzlo.c b/src/npc/minishEzlo.c index 2296d384..921452de 100644 --- a/src/npc/minishEzlo.c +++ b/src/npc/minishEzlo.c @@ -22,7 +22,7 @@ void MinishEzlo(Entity* this) { { 0x0, 0x0, 0x0 }, }; if (this->action == 0) { - if (LoadExtraSpriteData(this, gUnk_0810C48C) == 0) { + if (!LoadExtraSpriteData(this, gUnk_0810C48C)) { return; } this->action++; diff --git a/src/npc/mountainMinish.c b/src/npc/mountainMinish.c index 92156995..647b550a 100644 --- a/src/npc/mountainMinish.c +++ b/src/npc/mountainMinish.c @@ -55,7 +55,7 @@ void MountainMinish(Entity* this) { } void sub_08067E60(Entity* this) { - if (LoadExtraSpriteData(this, gUnk_08111358) != 0) { + if (LoadExtraSpriteData(this, gUnk_08111358)) { this->action = 1; sub_08078778(this); InitializeAnimation(this, 2); @@ -106,7 +106,7 @@ void sub_08067EF0(Entity* this) { switch (this->action) { case 0: - if (LoadExtraSpriteData(this, gUnk_08111358) == 0) { + if (!LoadExtraSpriteData(this, gUnk_08111358)) { return; } this->action = 1; @@ -265,7 +265,7 @@ void MountainMinish_Head(Entity* this) { void MountainMinish_Fusion(Entity* this) { if (this->action == 0) { - if (LoadExtraSpriteData(this, gUnk_08111358) != 0) { + if (LoadExtraSpriteData(this, gUnk_08111358)) { this->action++; this->spriteSettings.draw = 1; InitializeAnimation(this, 6); diff --git a/src/npc/mutoh.c b/src/npc/mutoh.c index 5eb9bdba..d1d5a00a 100644 --- a/src/npc/mutoh.c +++ b/src/npc/mutoh.c @@ -89,7 +89,7 @@ void sub_08067100(Entity* this) { void Mutoh_Fusion(Entity* this) { if (this->action == 0) { - if (LoadExtraSpriteData(this, gUnk_08110C00) != 0) { + if (LoadExtraSpriteData(this, gUnk_08110C00)) { this->action++; this->spriteSettings.draw = TRUE; InitializeAnimation(this, 2); diff --git a/src/npc/npc58.c b/src/npc/npc58.c index 5b916583..0409dc4f 100644 --- a/src/npc/npc58.c +++ b/src/npc/npc58.c @@ -14,7 +14,7 @@ void NPC58(Entity* this) { Entity* entity; if (this->action == 0) { - if (LoadExtraSpriteData(this, gUnk_081146D0) == 0) { + if (!LoadExtraSpriteData(this, gUnk_081146D0)) { return; } this->action++; diff --git a/src/npc/percy.c b/src/npc/percy.c index bb318c3b..acb65a57 100644 --- a/src/npc/percy.c +++ b/src/npc/percy.c @@ -168,7 +168,7 @@ void sub_0806B60C(Entity* this) { void Percy_Fusion(Entity* this) { if (this->action == 0) { - if (LoadExtraSpriteData(this, gUnk_08112E1C) != 0) { + if (LoadExtraSpriteData(this, gUnk_08112E1C)) { this->action++; this->spriteSettings.draw = 1; InitializeAnimation(this, 2); diff --git a/src/npc/phonograph.c b/src/npc/phonograph.c index 26872a4c..071f5b6e 100644 --- a/src/npc/phonograph.c +++ b/src/npc/phonograph.c @@ -193,14 +193,14 @@ const static Font gUnk_081146B8 = { void sub_0806EABC(Entity* this) { sub_08050384(); sub_08057044((s16)this->field_0x68.HWORD, gUnk_020227E8, 0x202020); - sub_0805F46C(0x3302, &gUnk_081146B8); + ShowTextBox(0x3302, &gUnk_081146B8); gScreen.bg0.updated = 1; } #else void sub_0806EABC(Entity* this, u32 param) { sub_08050384(); sub_08057044(param, gUnk_020227E8, 0x202020); - sub_0805F46C(0x3302, &gUnk_081146B8); + ShowTextBox(0x3302, &gUnk_081146B8); gScreen.bg0.updated = 1; } #endif diff --git a/src/npc/postman.c b/src/npc/postman.c index dd1f2381..2bdeedd2 100644 --- a/src/npc/postman.c +++ b/src/npc/postman.c @@ -3,24 +3,151 @@ #include "entity.h" #include "functions.h" #include "npc.h" +#include "structures.h" extern void sub_08060528(Entity*); extern void sub_080604DC(Entity*); extern void sub_080606D8(Entity*); extern void sub_080606C0(Entity*); -extern const s8 gUnk_0810AA70[][4][4]; +const Coords gUnk_0810A66C[] = { + { .HALF = { 0x0, 0x0 } }, { .HALF = { 0x48, 0xa8 } }, { .HALF = { 0x0, 0xf0 } }, + { .HALF = { 0x1f8, 0x0 } }, { .HALF = { 0x3f8, 0xf0 } }, { .HALF = { 0x1f8, 0x3c8 } }, + { .HALF = { 0x48, 0xf0 } }, { .HALF = { 0x60, 0xf0 } }, { .HALF = { 0x60, 0x188 } }, + { .HALF = { 0x78, 0x188 } }, { .HALF = { 0x78, 0x270 } }, { .HALF = { 0x38, 0x270 } }, + { .HALF = { 0x38, 0x328 } }, { .HALF = { 0x98, 0x328 } }, { .HALF = { 0xd8, 0x328 } }, + { .HALF = { 0x108, 0x328 } }, { .HALF = { 0x188, 0x328 } }, { .HALF = { 0x188, 0x368 } }, + { .HALF = { 0x108, 0x278 } }, { .HALF = { 0x128, 0x278 } }, { .HALF = { 0x128, 0x1d0 } }, + { .HALF = { 0x1a8, 0x1d0 } }, { .HALF = { 0x1f8, 0x1d0 } }, { .HALF = { 0x1a8, 0x288 } }, + { .HALF = { 0x1f8, 0x288 } }, { .HALF = { 0x1f8, 0x328 } }, { .HALF = { 0x268, 0x328 } }, + { .HALF = { 0x268, 0x368 } }, { .HALF = { 0x268, 0x390 } }, { .HALF = { 0x1f8, 0xf0 } }, + { .HALF = { 0x248, 0x1d0 } }, { .HALF = { 0x248, 0x1c0 } }, { .HALF = { 0x248, 0x288 } }, + { .HALF = { 0x298, 0x288 } }, { .HALF = { 0x298, 0x328 } }, { .HALF = { 0x328, 0x328 } }, + { .HALF = { 0x328, 0x390 } }, { .HALF = { 0x368, 0x328 } }, { .HALF = { 0x368, 0x318 } }, + { .HALF = { 0x3a0, 0x318 } }, { .HALF = { 0x3a0, 0x290 } }, { .HALF = { 0x370, 0x290 } }, + { .HALF = { 0x370, 0x280 } }, { .HALF = { 0x360, 0x280 } }, { .HALF = { 0x360, 0x270 } }, + { .HALF = { 0x340, 0x270 } }, { .HALF = { 0x340, 0x248 } }, { .HALF = { 0x320, 0x248 } }, + { .HALF = { 0x2e0, 0x248 } }, { .HALF = { 0x2e0, 0x1d0 } }, { .HALF = { 0x2d0, 0x1d0 } }, + { .HALF = { 0x2d0, 0x1c0 } }, { .HALF = { 0x320, 0x168 } }, { .HALF = { 0x378, 0x168 } }, + { .HALF = { 0x378, 0xf0 } }, { .HALF = { 0x2b0, 0x288 } }, { .HALF = { 0x2b0, 0x280 } }, + { .HALF = { 0x2c0, 0x280 } }, { .HALF = { 0x2c0, 0x270 } }, { .HALF = { 0x2d0, 0x270 } }, + { .HALF = { 0x2d0, 0x248 } }, { .HALF = { 0x78, 0x1f0 } }, { .HALF = { 0x78, 0x230 } }, +}; -typedef struct { - s16 x; - s16 y; -} Coords16; +// Indices into the coords array above +const s8 gUnk_0810A768[] = { 1, -4, 0, 1, 2 }; +const s8 gUnk_0810A76D[] = { 6, 0, 2, 4, 21 }; +const s8 gUnk_0810A772[] = { 6, 0, 2, 1, 21 }; +const s8 gUnk_0810A777[] = { 2, -5, 3, 5, 7, 9 }; +const s8 gUnk_0810A77D[] = { 29, 0, 3, 20, 17, 16 }; +const s8 gUnk_0810A783[] = { 3, -5, 3, 3, 7, 9 }; +const s8 gUnk_0810A789[] = { 54, 0, 2, 18, 62 }; +const s8 gUnk_0810A78E[] = { 4, -5, 3, 3, 5, 9 }; +const s8 gUnk_0810A794[] = { 25, 0, 3, 46, 30, 31 }; +const s8 gUnk_0810A79A[] = { 5, -5, 3, 3, 5, 7 }; +const s8 gUnk_0810A7A0[] = { 24, 0, 3, 45, 47, 14 }; +const s8 gUnk_0810A7A6[] = { 22, 0, 3, 15, 66, 63 }; +const s8 gUnk_0810A7AC[] = { 23, 24, 0, 3, 12, 47, 45 }; +const s8 gUnk_0810A7B3[] = { 23, 21, 0, 2, 65, 26 }; +const s8 gUnk_0810A7B9[] = { 29, 0, 3, 6, 20, 17 }; +const s8 gUnk_0810A7BF[] = { 22, 0, 3, 66, 11, 63 }; +const s8 gUnk_0810A7C5[] = { 54, 0, 2, 8, 62 }; +const s8 gUnk_0810A7CA[] = { 29, 0, 3, 6, 20, 16 }; +const s8 gUnk_0810A7D0[] = { 29, 0, 3, 6, 17, 16 }; +const s8 gUnk_0810A7D6[] = { 7, 0, 2, 22, 23 }; +const s8 gUnk_0810A7DB[] = { 7, 0, 2, 23, 19 }; +const s8 gUnk_0810A7E0[] = { 6, 0, 2, 1, 4 }; +const s8 gUnk_0810A7E5[] = { 8, 9, 61, -1, 62, 10, 11, 12, 13, -1, 14, 15, 0, 2, 27, 25 }; +const s8 gUnk_0810A7F5[] = { 14, -1, 13, 12, 11, 10, 62, -1, 61, 9, 8, 7, 0, 2, 22, 19 }; +const s8 gUnk_0810A805[] = { 18, 19, 20, 21, 0, 2, 65, 13 }; +const s8 gUnk_0810A80D[] = { 20, 19, 18, 15, 0, 2, 24, 27 }; +const s8 gUnk_0810A815[] = { 16, 0, 2, 29, 33 }; +const s8 gUnk_0810A81A[] = { 15, 0, 2, 24, 25 }; +const s8 gUnk_0810A81F[] = { 25, 0, 3, 46, 31, 10 }; +const s8 gUnk_0810A825[] = { 16, 0, 2, 28, 33 }; +const s8 gUnk_0810A82A[] = { 26, 0, 2, 41, 43 }; +const s8 gUnk_0810A82F[] = { 25, 0, 3, 10, 46, 30 }; +const s8 gUnk_0810A835[] = { 17, 27, 0, 2, 42, 35 }; +const s8 gUnk_0810A83B[] = { 17, 16, 0, 2, 28, 29 }; +const s8 gUnk_0810A841[] = { 28, 36, 35, 0, 2, 40, 37 }; +const s8 gUnk_0810A848[] = { 36, 28, 27, 0, 2, 34, 42 }; +const s8 gUnk_0810A84F[] = { 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 0, 2, 57, 61 }; +const s8 gUnk_0810A85E[] = { 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 35, 0, 2, 36, 40 }; +const s8 gUnk_0810A86D[] = { 35, 0, 2, 36, 37 }; +const s8 gUnk_0810A872[] = { 34, 0, 2, 44, 52 }; +const s8 gUnk_0810A877[] = { 27, 0, 2, 34, 35 }; +const s8 gUnk_0810A87C[] = { 26, 0, 2, 32, 43 }; +const s8 gUnk_0810A881[] = { 34, 0, 2, 52, 39 }; +const s8 gUnk_0810A886[] = { 26, 0, 2, 32, 41 }; +const s8 gUnk_0810A88B[] = { 25, 0, 3, 10, 30, 31 }; +const s8 gUnk_0810A891[] = { 24, 0, 3, 14, 12, 47 }; +const s8 gUnk_0810A897[] = { 32, 0, 2, 54, 49 }; +const s8 gUnk_0810A89C[] = { 24, 0, 3, 14, 12, 45 }; +const s8 gUnk_0810A8A2[] = { 33, 0, 2, 51, 55 }; +const s8 gUnk_0810A8A7[] = { 32, 0, 2, 48, 54 }; +const s8 gUnk_0810A8AC[] = { 34, 0, 2, 44, 39 }; +const s8 gUnk_0810A8B1[] = { 33, 0, 2, 50, 55 }; +const s8 gUnk_0810A8B6[] = { 32, 0, 2, 48, 49 }; +const s8 gUnk_0810A8BB[] = { 30, 0, 2, 64, 59 }; +const s8 gUnk_0810A8C0[] = { 55, 56, 57, 58, 59, 60, 48, 0, 2, 60, 58 }; +const s8 gUnk_0810A8CB[] = { 60, 59, 58, 57, 56, 55, 33, 0, 2, 50, 51 }; +const s8 gUnk_0810A8D6[] = { 48, 0, 2, 60, 56 }; +const s8 gUnk_0810A8DB[] = { 47, 0, 2, 38, 61 }; +const s8 gUnk_0810A8E0[] = { 31, 51, 50, 49, 48, 0, 2, 56, 58 }; +const s8 gUnk_0810A8E9[] = { 49, 50, 51, 31, 30, 0, 2, 64, 53 }; +const s8 gUnk_0810A8F2[] = { 52, 53, 54, 0, 2, 8, 18 }; +const s8 gUnk_0810A8F9[] = { 53, 52, 47, 0, 2, 38, 57 }; +const s8 gUnk_0810A900[] = { 30, 0, 2, 53, 59 }; +const s8 gUnk_0810A905[] = { 22, 0, 3, 66, 11, 15 }; +const s8 gUnk_0810A90B[] = { 22, 0, 3, 11, 15, 63 }; +const s8 gUnk_0810A911[] = { 21, 0, 2, 26, 13, 0, 0 }; -extern Coords16 gUnk_0810A66C[]; -extern s8* gUnk_0810A918[]; +const s8* const gUnk_0810A918[] = { + gUnk_0810A768, gUnk_0810A768, gUnk_0810A76D, gUnk_0810A772, gUnk_0810A777, gUnk_0810A77D, gUnk_0810A783, + gUnk_0810A789, gUnk_0810A78E, gUnk_0810A794, gUnk_0810A79A, gUnk_0810A7A0, gUnk_0810A7A6, gUnk_0810A7AC, + gUnk_0810A7B3, gUnk_0810A7B9, gUnk_0810A7BF, gUnk_0810A7C5, gUnk_0810A7CA, gUnk_0810A7D0, gUnk_0810A7D6, + gUnk_0810A7DB, gUnk_0810A7E0, gUnk_0810A7E5, gUnk_0810A7F5, gUnk_0810A805, gUnk_0810A80D, gUnk_0810A815, + gUnk_0810A81A, gUnk_0810A81F, gUnk_0810A825, gUnk_0810A82A, gUnk_0810A82F, gUnk_0810A835, gUnk_0810A83B, + gUnk_0810A841, gUnk_0810A848, gUnk_0810A84F, gUnk_0810A85E, gUnk_0810A86D, gUnk_0810A872, gUnk_0810A877, + gUnk_0810A87C, gUnk_0810A881, gUnk_0810A886, gUnk_0810A88B, gUnk_0810A891, gUnk_0810A897, gUnk_0810A89C, + gUnk_0810A8A2, gUnk_0810A8A7, gUnk_0810A8AC, gUnk_0810A8B1, gUnk_0810A8B6, gUnk_0810A8BB, gUnk_0810A8C0, + gUnk_0810A8CB, gUnk_0810A8D6, gUnk_0810A8DB, gUnk_0810A8E0, gUnk_0810A8E9, gUnk_0810A8F2, gUnk_0810A8F9, + gUnk_0810A900, gUnk_0810A905, gUnk_0810A90B, gUnk_0810A911, +}; +void sub_08060428(Entity*); +void sub_0806045C(Entity*); +void sub_080604C8(Entity*); +void (*const gUnk_0810AA24[])(Entity*) = { + sub_08060428, + sub_0806045C, + sub_080604C8, +}; -extern void (*const gUnk_0810AA24[])(Entity*); -extern Dialog gUnk_0810AA30[]; +const Dialog gUnk_0810AA30[] = { + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_POST, 0xc) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_POST, 0xc) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_POST, 0xd) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_POST, 0xe) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_POST, 0xf) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_POST, 0x10) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_POST, 0x11) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_POST, 0x12) } }, +}; + +const Rect gUnk_0810AA70[][4] = { + { + { 0, -16, 16, 16 }, + { 16, 0, 16, 16 }, + { 0, 16, 16, 16 }, + { -16, 0, 16, 16 }, + }, + { + { 0, -16, 32, 32 }, + { 16, 0, 32, 32 }, + { 0, 16, 32, 32 }, + { -16, 0, 32, 32 }, + }, +}; void Postman(Entity* this) { if ((this->flags & ENT_SCRIPTED) != 0) { @@ -181,10 +308,10 @@ void sub_080606D8(Entity* this) { } void sub_08060700(Entity* entity, ScriptExecutionContext* context) { - s8* var0 = gUnk_0810A918[(s8)entity->field_0x68.HALF.LO]; - Coords16* coords = &gUnk_0810A66C[var0[(s8)entity->field_0x68.HALF.HI]]; - u32 x = coords->x + gRoomControls.origin_x; - u32 y = coords->y + gRoomControls.origin_y; + const s8* var0 = gUnk_0810A918[(s8)entity->field_0x68.HALF.LO]; + const Coords* coords = &gUnk_0810A66C[var0[(s8)entity->field_0x68.HALF.HI]]; + u32 x = coords->HALF.x + gRoomControls.origin_x; + u32 y = coords->HALF.y + gRoomControls.origin_y; sub_0807DEDC(entity, context, x, y); gActiveScriptInfo.flags |= 1; } @@ -200,8 +327,8 @@ void sub_0806076C(Entity* this, ScriptExecutionContext* context) { u32 uVar6; s32 uVar9; int local_24; - Coords16* ptr; - s8* pbVar10; + const Coords* ptr; + const s8* pbVar10; if (this->z.WORD < 0) { gActiveScriptInfo.commandSize = 0; @@ -244,8 +371,8 @@ void sub_0806076C(Entity* this, ScriptExecutionContext* context) { this->field_0x68.HALF.LO = pbVar10[local_24]; cVar2 = gUnk_0810A918[(s8)this->field_0x68.HALF.LO][0]; ptr = &gUnk_0810A66C[cVar2]; - this->x.HALF_U.HI = gRoomControls.origin_x + ptr->x; - this->y.HALF_U.HI = gRoomControls.origin_y + ptr->y; + this->x.HALF_U.HI = gRoomControls.origin_x + ptr->HALF.x; + this->y.HALF_U.HI = gRoomControls.origin_y + ptr->HALF.y; if (CheckOnScreen(this) == 0) break; local_24 = (s32)(local_24 + 1) % uVar9; @@ -265,14 +392,14 @@ void sub_080608E4(Entity* this, ScriptExecutionContext* context) { if (this->z.WORD >= 0) { if ((this->collisionLayer != 1 || gPlayerEntity.collisionLayer != 2) && (this->collisionLayer != 2 || gPlayerEntity.collisionLayer != 1)) { - const s8* ptr = gUnk_0810AA70[context->intVariable][this->animationState >> 1]; - u32 x = this->x.HALF.HI + ptr[0]; - u32 y = this->y.HALF.HI + ptr[1]; + const Rect* ptr = &gUnk_0810AA70[context->intVariable][this->animationState >> 1]; + u32 x = this->x.HALF.HI + ptr->x; + u32 y = this->y.HALF.HI + ptr->y; x = gPlayerEntity.x.HALF.HI - x; y = gPlayerEntity.y.HALF.HI - y; - x += ptr[2]; - y += ptr[3]; - if (ptr[2] * 2 > x && ptr[3] * 2 > y) { + x += ptr->width; + y += ptr->height; + if (ptr->width * 2 > x && ptr->height * 2 > y) { context->condition = 1; this->field_0x6a.HWORD += 2; } diff --git a/src/npc/sittingPerson.c b/src/npc/sittingPerson.c index 6f60f47e..6fc0ec00 100644 --- a/src/npc/sittingPerson.c +++ b/src/npc/sittingPerson.c @@ -1,15 +1,109 @@ #include "npc.h" #include "functions.h" -extern void (*SittingPersion_Actions[])(Entity*); +const SpriteLoadData gUnk_0810CB78[] = { + { 63, 61, 4 }, { 8255, 61, 4 }, { 0, 0, 0 }, { 62, 61, 4 }, { 8255, 61, 4 }, { 0, 0, 0 }, + { 64, 61, 4 }, { 8254, 61, 4 }, { 0, 0, 0 }, { 64, 61, 4 }, { 8256, 61, 4 }, { 0, 0, 0 }, + { 64, 61, 4 }, { 8255, 61, 4 }, { 0, 0, 0 }, { 62, 61, 4 }, { 8255, 61, 4 }, { 0, 0, 0 }, +}; +const FrameStruct gUnk_0810CBC0[] = { + { 4, 0 }, { 0, 0 }, { 12, 0 }, { 0, 0 }, { 20, 0 }, { 0, 0 }, + { 28, 1 }, { 0, 0 }, { 36, 1 }, { 0, 0 }, { 44, 0 }, { 0, 0 }, +}; +void SittingPersion_Init(Entity*); +void sub_080637B8(Entity*); +void sub_08063830(Entity*); +void (*const SittingPersion_Actions[])(Entity*) = { + SittingPersion_Init, + sub_080637B8, + sub_08063830, +}; -extern Dialog gUnk_0810CC08[]; +const u16 gUnk_0810CBE4[][4] = { { + TEXT_INDEX(TEXT_TOWN4, 0x2f), + TEXT_INDEX(TEXT_TOWN4, 0x30), + TEXT_INDEX(TEXT_TOWN4, 0x31), + TEXT_INDEX(TEXT_TOWN4, 0x32), + }, + { + TEXT_INDEX(TEXT_TOWN5, 0x2f), + TEXT_INDEX(TEXT_TOWN5, 0x30), + TEXT_INDEX(TEXT_TOWN5, 0x31), + TEXT_INDEX(TEXT_TOWN5, 0x32), + }, + { + TEXT_INDEX(TEXT_TOWN6, 0x28), + TEXT_INDEX(TEXT_TOWN6, 0x29), + TEXT_INDEX(TEXT_TOWN6, 0x2a), + TEXT_INDEX(TEXT_TOWN6, 0x2b), + }, + { + TEXT_INDEX(TEXT_TOWN7, 0xe), + TEXT_INDEX(TEXT_TOWN7, 0xf), + TEXT_INDEX(TEXT_TOWN7, 0x10), + TEXT_INDEX(TEXT_TOWN7, 0x11), + } }; -extern SpriteLoadData gUnk_0810CB78[]; -extern u16 gUnk_0810CC04[]; -extern u16 gUnk_0810CBE4[][4]; -extern u8 gUnk_0810CBC0[]; -extern u8 gUnk_0810CD88[][4]; +const u16 gUnk_0810CC04[] = { + TEXT_INDEX(TEXT_TOWN5, 0x37), + TEXT_INDEX(TEXT_TOWN5, 0x38), +}; + +void sub_0806387C(Entity*); +void sub_0806390C(Entity*); +const Dialog gUnk_0810CC08[] = { + { 2, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x5), TEXT_INDEX(TEXT_CAFE, 0x4) } }, + { 2, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x5), TEXT_INDEX(TEXT_CAFE, 0x4) } }, + { 2, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0xf), TEXT_INDEX(TEXT_CAFE, 0xe) } }, + { 2, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x1d), TEXT_INDEX(TEXT_CAFE, 0x1c) } }, + { 2, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x29), TEXT_INDEX(TEXT_CAFE, 0x28) } }, + { 2, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x35), TEXT_INDEX(TEXT_CAFE, 0x34) } }, + { 2, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x41), TEXT_INDEX(TEXT_CAFE, 0x40) } }, + { 2, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x4b), TEXT_INDEX(TEXT_CAFE, 0x4a) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_CAFE, 0x8) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_CAFE, 0x8) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_CAFE, 0x12) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_CAFE, 0x20) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_CAFE, 0x2c) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_CAFE, 0x38) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_CAFE, 0x44) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_CAFE, 0x4e) } }, + { 0, 0, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_HAPPY_HEARTH, 0xf), TEXT_INDEX(TEXT_HAPPY_HEARTH, 0xe) } }, + { 0, 0, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_HAPPY_HEARTH, 0xf), TEXT_INDEX(TEXT_HAPPY_HEARTH, 0xe) } }, + { 0, 0, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_HAPPY_HEARTH, 0xf), TEXT_INDEX(TEXT_HAPPY_HEARTH, 0xe) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x16) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x17) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x19) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x1b) } }, + { 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_HAPPY_HEARTH, 0x1b) } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806387C } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806387C } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806387C } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806387C } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806387C } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806387C } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806387C } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806387C } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806390C } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806390C } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806390C } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806390C } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806390C } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806390C } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806390C } }, + { 0, 0, DIALOG_CALL_FUNC, 0, { .func = sub_0806390C } }, + { 89, DIALOG_LOCAL_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x52), TEXT_INDEX(TEXT_CAFE, 0x51) } }, + { 89, DIALOG_LOCAL_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x52), TEXT_INDEX(TEXT_CAFE, 0x51) } }, + { 89, DIALOG_LOCAL_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x54), TEXT_INDEX(TEXT_CAFE, 0x53) } }, + { 89, DIALOG_LOCAL_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x56), TEXT_INDEX(TEXT_CAFE, 0x55) } }, + { 89, DIALOG_LOCAL_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x58), TEXT_INDEX(TEXT_CAFE, 0x57) } }, + { 89, DIALOG_LOCAL_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x5a), TEXT_INDEX(TEXT_CAFE, 0x59) } }, + { 89, DIALOG_LOCAL_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x5c), TEXT_INDEX(TEXT_CAFE, 0x5b) } }, + { 89, DIALOG_LOCAL_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_CAFE, 0x5e), TEXT_INDEX(TEXT_CAFE, 0x5d) } }, +}; +const u8 gUnk_0810CD88[][4] = { + { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 1, 2, 0 }, { 0, 1, 2, 0 }, { 0, 0, 0, 0 }, +}; extern void sub_08096208(Entity*, u32); void sub_080637B8(Entity* this); @@ -134,9 +228,9 @@ void SittingPersion_ShowDialogue(Entity* this, ScriptExecutionContext* context) } void SittingPerson_Head(Entity* this) { - u8* ptr = &gUnk_0810CBC0[this->type * 4]; - SetExtraSpriteFrame(this, 0, *ptr + (this->frame & 0xf)); - SetExtraSpriteFrame(this, 1, gUnk_0810CD88[this->type][this->frameIndex & 3] + *(ptr + 1)); + const FrameStruct* ptr = &gUnk_0810CBC0[this->type * 2]; + SetExtraSpriteFrame(this, 0, ptr->frame + (this->frame & 0xf)); + SetExtraSpriteFrame(this, 1, gUnk_0810CD88[this->type][this->frameIndex & 3] + ptr->frameIndex); SetSpriteSubEntryOffsetData1(this, 1, 0); sub_0807000C(this); } @@ -148,7 +242,7 @@ void sub_080639D0(Entity* this) { void SittingPerson_Fusion(Entity* this) { if (this->action == 0) { - if (LoadExtraSpriteData(this, &gUnk_0810CB78[this->type * 3]) != 0) { + if (LoadExtraSpriteData(this, &gUnk_0810CB78[this->type * 3])) { this->action++; this->spriteSettings.draw = 1; this->spriteSettings.flipX = 0; diff --git a/src/npc/smith.c b/src/npc/smith.c index 0ff8ef31..e6663737 100644 --- a/src/npc/smith.c +++ b/src/npc/smith.c @@ -71,7 +71,7 @@ void Smith_Head(Entity* this) { } void sub_080660EC(Entity* this) { - if (LoadExtraSpriteData(this, gUnk_08110354) != 0) { + if (LoadExtraSpriteData(this, gUnk_08110354)) { this->action = 1; this->field_0x68.HALF.LO = sub_0801E99C(this); InitAnimationForceUpdate(this, 2); @@ -106,7 +106,7 @@ void sub_08066170(Entity* this) { } void sub_08066178(Entity* this) { - if (LoadExtraSpriteData(this, gUnk_08110354) != 0) { + if (LoadExtraSpriteData(this, gUnk_08110354)) { this->action = 1; this->spriteSettings.draw = 1; this->field_0x68.HALF.LO = sub_0801E99C(this); @@ -221,7 +221,7 @@ void sub_08066288(Entity* this) { void Smith_Fusion(Entity* this) { if (this->action == 0) { - if (LoadExtraSpriteData(this, gUnk_08110354) != 0) { + if (LoadExtraSpriteData(this, gUnk_08110354)) { this->action++; this->spriteSettings.draw = 1; InitAnimationForceUpdate(this, 6); diff --git a/src/npc/sturgeon.c b/src/npc/sturgeon.c index 6d1c467d..7ee3e4bc 100644 --- a/src/npc/sturgeon.c +++ b/src/npc/sturgeon.c @@ -4,16 +4,32 @@ #include "object.h" #include "item.h" -extern u16 gUnk_0810FA54[]; +const SpriteLoadData gUnk_0810FA38[] = { + { 59, 140, 0 }, + { 59, 140, 0 }, + { 0, 0, 0 }, +}; +void sub_08064B44(Entity*); +void sub_08064B88(Entity*); +void sub_08064C2C(Entity*); +void sub_08064C50(Entity*); +void (*const gUnk_0810FA44[])(Entity*) = { + sub_08064B44, + sub_08064B88, + sub_08064C2C, + sub_08064C50, +}; + +extern const u16 gUnk_0810FA54[]; +// const u16 gUnk_0810FA54[] = { +// TEXT_INDEX(TEXT_LIBRARY, 0xe), +// TEXT_INDEX(TEXT_LIBRARY, 0x15), +// TEXT_INDEX(TEXT_LIBRARY, 0x11), +// }; +extern u32 gUnk_0810FA5A; // TODO second parameter of sub_0806EE04 -extern SpriteLoadData gUnk_0810FA38; - -extern u32 gUnk_0810FA5A; void sub_08064CC0(Entity* this); - -extern void (*const gUnk_0810FA44[])(Entity*); void sub_08064C9C(Entity* this); - void sub_08064CD8(Entity* this); void Sturgeon(Entity* this) { @@ -22,7 +38,7 @@ void Sturgeon(Entity* this) { sub_0806ED78(this); } else { if (this->action == 0) { - if (LoadExtraSpriteData(this, &gUnk_0810FA38) != 0) { + if (LoadExtraSpriteData(this, gUnk_0810FA38)) { this->action = 1; this->timer = 0; sub_0807DD50(this); @@ -30,13 +46,13 @@ void Sturgeon(Entity* this) { } else { u32 tmp = this->action & 0x80; if (tmp) { - if (UpdateFuseInteraction(this) != 0) { + if (UpdateFuseInteraction(this)) { this->action = 1; } } else { if (this->interactType == 2) { this->action = this->action | 0xff; - this->interactType = tmp; + this->interactType = 0; InitAnimationForceUpdate(this, sub_0806F5A4(GetFacingDirection(this, &gPlayerEntity))); sub_0806F118(this); } else { @@ -49,7 +65,7 @@ void Sturgeon(Entity* this) { } void sub_08064B44(Entity* this) { - if (LoadExtraSpriteData(this, &gUnk_0810FA38) != 0) { + if (LoadExtraSpriteData(this, gUnk_0810FA38)) { InitializeAnimation(this, 2); sub_0806EE04(this, &gUnk_0810FA5A, 0); sub_08064CC0(this); @@ -152,7 +168,7 @@ void sub_08064D10(Entity* this) { void Sturgeon_Fusion(Entity* this) { if (this->action == 0) { - if (LoadExtraSpriteData(this, &gUnk_0810FA38) != 0) { + if (LoadExtraSpriteData(this, gUnk_0810FA38)) { this->action++; this->spriteSettings.draw = 1; InitializeAnimation(this, 6); diff --git a/src/npc/syrup.c b/src/npc/syrup.c index 51c24059..05e90aee 100644 --- a/src/npc/syrup.c +++ b/src/npc/syrup.c @@ -29,13 +29,11 @@ void Syrup(Entity* this) { } void sub_0806A1F8(Entity* this) { - u32 iVar1; const SpriteLoadData* paVar2; this->type == 0 ? (paVar2 = gUnk_081121B4) : (paVar2 = gUnk_081121C4); - iVar1 = LoadExtraSpriteData(this, paVar2); - if (iVar1) { + if (LoadExtraSpriteData(this, paVar2)) { this->action = 1; SetDefaultPriority(this, PRIO_MESSAGE); sub_0807DD50(this); diff --git a/src/npc/talon.c b/src/npc/talon.c index 67845700..8de3c789 100644 --- a/src/npc/talon.c +++ b/src/npc/talon.c @@ -35,7 +35,7 @@ void Talon(Entity* this) { } void sub_08065570(Entity* this) { - if (LoadExtraSpriteData(this, gUnk_0810FEB0) != 0) { + if (LoadExtraSpriteData(this, gUnk_0810FEB0)) { InitializeAnimation(this, 0); sub_08078778(this); this->action = 1; @@ -75,7 +75,7 @@ void sub_0806559C(Entity* this) { } void sub_08065608(Entity* this) { - if (LoadExtraSpriteData(this, gUnk_0810FEB0) != 0) { + if (LoadExtraSpriteData(this, gUnk_0810FEB0)) { this->action = 1; this->spriteSettings.draw = 1; this->field_0x68.HALF.LO = sub_0801E99C(this); @@ -164,7 +164,7 @@ void Talon_Head(Entity* this) { void Talon_Fusion(Entity* this) { if (this->action == 0) { - if (LoadExtraSpriteData(this, gUnk_0810FEB0) != 0) { + if (LoadExtraSpriteData(this, gUnk_0810FEB0)) { this->action++; this->spriteSettings.draw = 1; InitializeAnimation(this, 6); diff --git a/src/npc/tingleSiblings.c b/src/npc/tingleSiblings.c index c3bb814b..7ca9c778 100644 --- a/src/npc/tingleSiblings.c +++ b/src/npc/tingleSiblings.c @@ -127,8 +127,8 @@ void sub_08064EE8(Entity* this) { void sub_08064F28(Entity* this, ScriptExecutionContext* context) { u32 roomFlag; u32 bVar2; - int iVar3; - int iVar4; + s32 iVar3; + s32 remainingFusions; u32 uVar5; context->condition = 0; @@ -148,35 +148,35 @@ void sub_08064F28(Entity* this, ScriptExecutionContext* context) { } } } - iVar4 = -1; + remainingFusions = -1; } else { if (CheckGlobalFlag(KAKERA_COMPLETE) == 0) { - iVar4 = 100 - gSave.unk117; - if (iVar4 < 1) { + remainingFusions = 100 - gSave.fusedKinstoneCount; + if (remainingFusions < 1) { uVar5 = 8; - iVar4 = 0; + remainingFusions = 0; SetGlobalFlag(KAKERA_COMPLETE); context->condition = 1; } else { uVar5 = 7; - if (9 < iVar4) { + if (9 < remainingFusions) { uVar5 = 6; } - if (0x27 < iVar4) { + if (0x27 < remainingFusions) { uVar5 = 5; } - if (0x45 < iVar4) { + if (0x45 < remainingFusions) { uVar5 = 4; } } } else { uVar5 = 8; - iVar4 = 0; + remainingFusions = 0; } } MessageNoOverlap(TingleSiblings_MessageIndices[this->type][uVar5], this); - if (iVar4 > 0) { - gMessage.rupees = (u16)iVar4; + if (remainingFusions > 0) { + gMessage.rupees = (u16)remainingFusions; } if (CheckRoomFlag(roomFlag) == 0) { diff --git a/src/npc/townMinish.c b/src/npc/townMinish.c index 10de6135..85630b7c 100644 --- a/src/npc/townMinish.c +++ b/src/npc/townMinish.c @@ -199,7 +199,7 @@ void sub_0806ACC4(Entity* this) { u8 delay; switch (this->action) { case 0: - if (LoadExtraSpriteData(this, gUnk_08112674[this->type]) == 0) + if (!LoadExtraSpriteData(this, gUnk_08112674[this->type])) return; this->action = 1; diff --git a/src/npc/townsperson.c b/src/npc/townsperson.c index 58299104..4def0fca 100644 --- a/src/npc/townsperson.c +++ b/src/npc/townsperson.c @@ -9,18 +9,18 @@ typedef struct { u8 unk3; } struct_0810B680; -extern void (*const gUnk_0810B774[])(Entity*); -extern void (*const gUnk_0810B77C[])(Entity*); extern void sub_08061CB4(Entity*, u32); extern void sub_08061D64(Entity*); extern void sub_08062048(Entity*); -extern SpriteLoadData* gUnk_0810B6EC[]; -extern u8 gUnk_0810B78C[]; extern struct_0810B680 gUnk_0810B680[]; +extern SpriteLoadData* gUnk_0810B6EC[]; +extern u32 gUnk_0810B740[]; // TODO fourth parameter of sub_08078850 +extern u8 gUnk_0810B748[]; // TODO third parameter of sub_08078850 extern u16 gUnk_0810B74A[]; -extern u8 gUnk_0810B748[]; -extern u32 gUnk_0810B740[]; +extern void (*const gUnk_0810B774[])(Entity*); +extern void (*const gUnk_0810B77C[])(Entity*); +extern u8 gUnk_0810B78C[]; extern u16 gUnk_0810B790[]; extern u16 gUnk_0810B7BA[]; extern Dialog gUnk_0810B7C0[]; @@ -283,7 +283,7 @@ void sub_08062048(Entity* this) { void Townsperson_Fusion(Entity* this) { if (this->action == 0) { - if (LoadExtraSpriteData(this, gUnk_0810B6EC[this->type]) == 0) { + if (!LoadExtraSpriteData(this, gUnk_0810B6EC[this->type])) { return; } this->action++; diff --git a/src/npc/windTribespeople.c b/src/npc/windTribespeople.c index 7951715c..2018581f 100644 --- a/src/npc/windTribespeople.c +++ b/src/npc/windTribespeople.c @@ -39,10 +39,7 @@ void WindTribespeople(Entity* this) { } void sub_0806C798(Entity* this) { - s32 iVar1; - - iVar1 = LoadExtraSpriteData(this, gUnk_08113A1C + (this->type * 4)); - if (iVar1 != 0) { + if (LoadExtraSpriteData(this, gUnk_08113A1C + (this->type * 4))) { this->action = 1; this->spriteSettings.draw = 1; this->animationState = this->timer; @@ -274,7 +271,7 @@ void sub_0806CA5C(Entity* this, ScriptExecutionContext* context) { void WindTribespeople_Fusion(Entity* this) { if (this->action == 0) { - if (LoadExtraSpriteData(this, &gUnk_08113A1C[this->type * 4]) != 0) { + if (LoadExtraSpriteData(this, &gUnk_08113A1C[this->type * 4])) { this->action++; this->spriteSettings.draw = 1; InitializeAnimation(this, 6); diff --git a/src/npc/zelda.c b/src/npc/zelda.c index df2ed8f3..64898ef7 100644 --- a/src/npc/zelda.c +++ b/src/npc/zelda.c @@ -5,8 +5,8 @@ #include "flags.h" #include "npc.h" -void sub_08068680(Entity*, Entity*); -void sub_08068694(Entity*, Entity*); +void ZeldaFollower_Hide(Entity*, Entity*); +void ZeldaFollower_Show(Entity*, Entity*); extern Entity* GetEntityByType(u32, u32); extern void sub_080686C4(Entity*, Entity*); void sub_08066CCC(Entity*); @@ -44,7 +44,7 @@ void sub_08066D14(Entity* this, ScriptExecutionContext* context) { this->animationState = parent->animationState; this->spriteSettings.draw = 1; CopyPosition(parent, this); - sub_08068680(this, this->parent); + ZeldaFollower_Hide(this, this->parent); context->condition = 1; } else { context->condition = 0; @@ -52,16 +52,14 @@ void sub_08066D14(Entity* this, ScriptExecutionContext* context) { } void sub_08066D4C(Entity* this, ScriptExecutionContext* context) { - Entity* parent; - - parent = this->parent; + Entity* parent = this->parent; if (this->parent != NULL) { CopyPosition(this, parent); this->parent->spriteSettings.draw = 1; this->parent->animationState = this->animationState; this->spriteSettings.draw = 0; this->followerFlag &= 0xFE; - sub_08068694(this, this->parent); + ZeldaFollower_Show(this, this->parent); context->condition = 1; } else { context->condition = 0; @@ -85,13 +83,11 @@ void sub_08066D94(Entity* this) { DeleteThisEntity(); } -void SetZeldaFollowTarget(Entity* this) { - Entity* pEVar1; - - pEVar1 = DeepFindEntityByID(NPC, ZELDA_FOLLOWER); - if (pEVar1 != NULL) { - CopyPosition(this, pEVar1); - sub_080686C4(this, pEVar1); +void SetZeldaFollowTarget(Entity* target) { + Entity* follower = DeepFindEntityByID(NPC, ZELDA_FOLLOWER); + if (follower != NULL) { + CopyPosition(target, follower); + sub_080686C4(target, follower); } } diff --git a/src/npc/zeldaFollower.c b/src/npc/zeldaFollower.c index 5cbaa03f..04153f4a 100644 --- a/src/npc/zeldaFollower.c +++ b/src/npc/zeldaFollower.c @@ -3,9 +3,8 @@ #include "functions.h" #include "common.h" -extern void sub_08068318(Entity*); -extern void sub_0806854C(Entity*, u32*); - +void sub_08068318(Entity*); +void sub_0806854C(Entity*, u32*); void sub_08068578(Entity* this); void ZeldaFollower(Entity* this) { @@ -40,20 +39,20 @@ void sub_0806854C(Entity* this, u32* none) { ASM_FUNC("asm/non_matching/zeldaFollower/sub_08068578.inc", void sub_08068578(Entity* this)) -void sub_08068680(Entity* this, Entity* entity) { - entity->field_0x68.HALF.LO = 0; - entity->spriteSettings.draw = 0; +void ZeldaFollower_Hide(Entity* zelda, Entity* follower) { + follower->field_0x68.HALF.LO = 0; + follower->spriteSettings.draw = 0; } -void sub_08068694(Entity* this, Entity* entity) { - entity->field_0x68.HALF.LO = 1; - entity->spriteSettings.draw = 1; - entity->animationState = this->animationState; - sub_08068578(entity); - InitAnimationForceUpdate(entity, entity->animationState / 2); +void ZeldaFollower_Show(Entity* zelda, Entity* follower) { + follower->field_0x68.HALF.LO = 1; + follower->spriteSettings.draw = 1; + follower->animationState = zelda->animationState; + sub_08068578(follower); + InitAnimationForceUpdate(follower, follower->animationState / 2); } -void sub_080686C4(Entity* this, Entity* entity) { - entity->y.HALF.HI -= 0x10; - sub_08068578(entity); +void sub_080686C4(Entity* zelda, Entity* follower) { + follower->y.HALF.HI -= 0x10; + sub_08068578(follower); } diff --git a/src/npcUtils.c b/src/npcUtils.c index 698cfaa8..190c9338 100644 --- a/src/npcUtils.c +++ b/src/npcUtils.c @@ -495,3 +495,16 @@ void ShowNPCDialogue(Entity* ent, const Dialog* dia) { MessageFromTarget(uVar2); } } + +const u8 gUnk_08114F30[] = { + 0, + 0, + 1, + 2, +}; +const u8 gUnk_08114F34[] = { + 1, + 2, + 3, + 3, +}; diff --git a/src/object/angryStatue.c b/src/object/angryStatue.c index 107ba864..0204c90e 100644 --- a/src/object/angryStatue.c +++ b/src/object/angryStatue.c @@ -6,13 +6,12 @@ */ #include "asm.h" #include "entity.h" +#include "hitbox.h" #include "physics.h" #include "projectile.h" #include "room.h" #include "sound.h" -extern Hitbox gUnk_080FD178; - void AngryStatue_Init(Entity*); void AngryStatue_Action1(Entity*); void AngryStatue_Action2(Entity*); @@ -29,7 +28,7 @@ void AngryStatue(Entity* this) { void AngryStatue_Init(Entity* this) { this->action = 1; - this->hitbox = &gUnk_080FD178; + this->hitbox = (Hitbox*)&gUnk_080FD178; SetTile(0x4022, COORD_TO_TILE(this), this->collisionLayer); InitializeAnimation(this, this->type); } diff --git a/src/object/cameraTarget.c b/src/object/cameraTarget.c index f08e9b43..79b56190 100644 --- a/src/object/cameraTarget.c +++ b/src/object/cameraTarget.c @@ -116,7 +116,7 @@ void CameraTarget_Action2(Entity* this) { u32 bVar3; u32 temp; u32 temp2; - const struct_080C9CBC* ptr; + const KinstoneWorldEvent* ptr; if ((this->type != 1) && (((u8)(gUnk_03003DF0.unk_4[3] - 1) >= 100 || (this->child != *(Entity**)(gUnk_03003DF0.unk_4 + 8))))) { @@ -132,7 +132,7 @@ void CameraTarget_Action2(Entity* this) { } else { bVar2 = this->type2; } - ptr = gUnk_080C9CBC + bVar2; + ptr = gKinstoneWorldEvents + bVar2; bVar1 = ptr->unk6; bVar3 = bVar1 & 1; this->palette.b.b0 = bVar3; diff --git a/src/object/cutsceneMiscObject.c b/src/object/cutsceneMiscObject.c index 8d971ba2..75911fe8 100644 --- a/src/object/cutsceneMiscObject.c +++ b/src/object/cutsceneMiscObject.c @@ -13,16 +13,25 @@ #include "screen.h" #include "script.h" -extern u8 gUnk_08114F30[]; -extern u8 gUnk_08114F34[]; extern u8 gUnk_08122AE0[]; extern u16 gUnk_08122AE8[]; -extern s8 gUnk_08122AF8[]; +extern s8 gUnk_08122AF8[]; // TODO struct s8XY extern u16 gUnk_08122B00[]; extern s16 gUnk_08122B0E[]; extern u16 gUnk_08122B1E[]; -extern s8 gUnk_08122B2E[]; +extern Coords8 gUnk_08122B2E[]; // TODO struct xy +typedef struct { + Hitbox hit; + u8 _8[4]; // TODO fourth param of sub_08078850 + u8 _c; +} HitboxCfg; +extern HitboxCfg gUnk_08122B3C[]; + +// npcUtils.c +extern u8 gUnk_08114F30[]; +extern u8 gUnk_08114F34[]; +// TODO use Script type extern u16 script_CutsceneMiscObjectTheLittleHat; extern u16 script_CutsceneMiscObjectSwordInChest; extern u16 script_08015B14; @@ -56,13 +65,6 @@ typedef struct { u32 anim; } Type1F; -typedef struct { - Hitbox hit; - u8 _8[4]; - u8 _c; -} HitboxCfg; -extern HitboxCfg gUnk_08122B3C[]; - typedef void(CutsceneMiscObjectTypeAction)(CutsceneMiscObjectEntity*); CutsceneMiscObjectTypeAction sub_08094A5C; @@ -1265,10 +1267,10 @@ void sub_080961F4(CutsceneMiscObjectEntity* this) { } void sub_08096208(CutsceneMiscObjectEntity* this, u32 x) { - s8* p = &gUnk_08122B2E[x * 2]; + Coords8* p = &gUnk_08122B2E[x]; Entity* e = CreateObject(CUTSCENE_MISC_OBJECT, 0x26, 0); if (e != NULL) { - PositionRelative(super, e, Q_16_16(p[0]), Q_16_16(p[1])); + PositionRelative(super, e, Q_16_16(p->x), Q_16_16(p->y)); } } diff --git a/src/object/figurineDevice.c b/src/object/figurineDevice.c index 75d626f3..d52ac049 100644 --- a/src/object/figurineDevice.c +++ b/src/object/figurineDevice.c @@ -6,9 +6,10 @@ */ #define NENT_DEPRECATED +#include "figurineMenu.h" #include "fileselect.h" #include "functions.h" -#include "global.h" +#include "kinstone.h" #include "item.h" #include "message.h" #include "object.h" @@ -43,13 +44,6 @@ typedef struct { extern void ModShells(s32); extern u8 gUnk_020227F0; -typedef struct { - u32 unk_0; - u16 unk_4; - u8 unk_6; - u8 unk_7; -} struct_080FC3E4; -extern const struct_080FC3E4 gUnk_080FC3E4[]; void sub_0808804C(FigurineDeviceEntity*); void sub_08087F58(FigurineDeviceEntity*); @@ -509,13 +503,13 @@ NONMATCH("asm/non_matching/figurineDevice/sub_08088160.inc", switch (ptr->unk_6) { case 0x8: case 0x40: - if (CheckLocalFlagByBank(ptr->unk_0, ptr->unk_4)) { + if (CheckLocalFlagByBank(ptr->bank, ptr->flag)) { result = TRUE; } return result; break; case 0x10: - if (CheckKinstoneFused(gUnk_080FC3E4[param_2].unk_4)) { + if (CheckKinstoneFused(gUnk_080FC3E4[param_2].flag)) { result = TRUE; } return result; @@ -523,30 +517,34 @@ NONMATCH("asm/non_matching/figurineDevice/sub_08088160.inc", default: return result; case 0x20: - switch (gUnk_080FC3E4[param_2].unk_4) { + switch (gUnk_080FC3E4[param_2].flag) { case 0: - if (CheckKinstoneFused(0x20) || CheckKinstoneFused(0x10) || CheckKinstoneFused(0x19)) { + if (CheckKinstoneFused(KINSTONE_20) || CheckKinstoneFused(KINSTONE_10) || + CheckKinstoneFused(KINSTONE_19)) { result = TRUE; } break; case 1: - if ((u8)this->unk_7c >= 5 && CheckKinstoneFused(0x28)) { + if ((u8)this->unk_7c >= 5 && CheckKinstoneFused(KINSTONE_28)) { result = TRUE; } break; case 2: - if (CheckKinstoneFused(0x54) || CheckKinstoneFused(0x56) || CheckKinstoneFused(0x3d)) { + if (CheckKinstoneFused(KINSTONE_54) || CheckKinstoneFused(KINSTONE_56) || + CheckKinstoneFused(KINSTONE_3D)) { result = TRUE; } break; case 3: - if (CheckKinstoneFused(0x3b) || CheckKinstoneFused(0x4a) || CheckKinstoneFused(0xd)) { + if (CheckKinstoneFused(KINSTONE_3B) || CheckKinstoneFused(KINSTONE_4A) || + CheckKinstoneFused(KINSTONE_D)) { result = TRUE; } break; case 4: - if (CheckKinstoneFused(0x49) || CheckKinstoneFused(0x55) || CheckKinstoneFused(0x3c)) { + if (CheckKinstoneFused(KINSTONE_49) || CheckKinstoneFused(KINSTONE_55) || + CheckKinstoneFused(KINSTONE_3C)) { result = TRUE; } break; @@ -598,9 +596,9 @@ void sub_080882A8(FigurineDeviceEntity* this) { sub_08057044(this->unk_83, &gUnk_020227E8[1], 0x202020); ptr = (u8*)0x02000000; if (ptr[7] == 0) { - sub_0805F46C((u32)gUnk_08120AE4[super->type2], (Font*)&gUnk_08120AB4); // TODO convert data + ShowTextBox(gUnk_08120AE4[super->type2], (Font*)&gUnk_08120AB4); // TODO convert data } else { - sub_0805F46C((u32)gUnk_08120AE4[super->type2], (Font*)&gUnk_08120ACC); // TODO convert data + ShowTextBox(gUnk_08120AE4[super->type2], (Font*)&gUnk_08120ACC); // TODO convert data } gScreen.bg0.updated = 1; } diff --git a/src/object/fileScreenObjects.c b/src/object/fileScreenObjects.c index 43dde1a2..23233f96 100644 --- a/src/object/fileScreenObjects.c +++ b/src/object/fileScreenObjects.c @@ -88,7 +88,7 @@ void sub_0808E7F0(Entity* this) { void sub_0808E818(Entity* this) { u32 var0; - u32 var1; + u32 offset; if (!sub_0808E950()) { int var2 = -1; @@ -104,8 +104,8 @@ void sub_0808E818(Entity* this) { this->field_0x68.HWORD = CheckGlobalFlag(EZERO_1ST) == 0 ? 0x400 : 0x100; this->field_0x70.BYTES.byte0 = 4; this->animationState = 2; - var1 = gUnk_08133368[GetPlayerPalette(TRUE) - 22] & 0xFFFFFF; - LoadPalettes(&gGlobalGfxAndPalettes[var1], 31, 1); + offset = gUnk_08133368[GetPlayerPalette(TRUE) - 22] & 0xFFFFFF; + LoadPalettes(&gGlobalGfxAndPalettes[offset], 31, 1); } if (gUI.lastState == 0) { diff --git a/src/object/frozenOctorok.c b/src/object/frozenOctorok.c index 85fbb2c0..fe537c4b 100644 --- a/src/object/frozenOctorok.c +++ b/src/object/frozenOctorok.c @@ -307,7 +307,7 @@ void FrozenOctorok_Action1SubAction5(FrozenOctorokEntity* this) { void FrozenOctorok_Action1SubAction6(FrozenOctorokEntity* this) { LinearMoveUpdate(super); if ((gRoomControls.origin_y + 0x1c8) < super->y.HALF.HI) { - gRoomControls.unk5 = 4; + gRoomControls.scrollSpeed = 4; gRoomControls.camera_target = &gPlayerEntity; SetLocalFlag(0x9b); DeleteEntity(super->parent); diff --git a/src/object/gleerokParticle.c b/src/object/gleerokParticle.c index 0ab61153..5595ccda 100644 --- a/src/object/gleerokParticle.c +++ b/src/object/gleerokParticle.c @@ -9,6 +9,7 @@ #include "effects.h" #include "entity.h" #include "functions.h" +#include "hitbox.h" #include "object.h" #include "player.h" #include "room.h" @@ -23,8 +24,6 @@ typedef struct { union SplitWord unk84; } GleerokParticleEntity; -extern Hitbox gUnk_080FD2E8; - void GleerokParticle_Init(GleerokParticleEntity*); void GleerokParticle_Action1(GleerokParticleEntity*); void GleerokParticle_Action2(GleerokParticleEntity*); diff --git a/src/object/greatFairy.c b/src/object/greatFairy.c index eca04021..fa4266c5 100644 --- a/src/object/greatFairy.c +++ b/src/object/greatFairy.c @@ -60,10 +60,10 @@ void GreatFairy_CallBehavior(Entity* this) { if ((gPlayerEntity.y.HALF.HI - gRoomControls.origin_y) < 168) { gRoomControls.camera_target = this; - gRoomControls.unk5 = 2; + gRoomControls.scrollSpeed = 2; } else { gRoomControls.camera_target = &gPlayerEntity; - gRoomControls.unk5 = 2; + gRoomControls.scrollSpeed = 2; } } diff --git a/src/object/kinstoneSpark.c b/src/object/kinstoneSpark.c index 9feb4c66..89126c82 100644 --- a/src/object/kinstoneSpark.c +++ b/src/object/kinstoneSpark.c @@ -52,7 +52,7 @@ void KinstoneSpark(Entity* this) { this->spriteRendering.b3 = 1; this->spritePriority.b0 = 0; this->spriteOrientation.flipY = 1; - ChangeObjPalette(this, gUnk_080C9CBC[gFuseInfo._3].unk0); + ChangeObjPalette(this, gKinstoneWorldEvents[gFuseInfo.kinstoneId].objPalette); } GetNextFrame(this); } diff --git a/src/object/lightRay.c b/src/object/lightRay.c index c353a862..c1e58d1a 100644 --- a/src/object/lightRay.c +++ b/src/object/lightRay.c @@ -42,7 +42,7 @@ void LightRay_Type0(LightRayEntity* this) { super->timer = 60; super->subtimer = 0; gRoomControls.camera_target = super; - gRoomControls.unk5 = 1; + gRoomControls.scrollSpeed = 1; if (super->x.HALF.HI > gPlayerEntity.x.HALF.HI) { tmp = 2; } else { @@ -76,7 +76,7 @@ void LightRay_Type0(LightRayEntity* this) { case 2: if (--super->timer == 0) { gScreen.lcd.displayControl |= 0x4800; - gRoomControls.unk5 = 4; + gRoomControls.scrollSpeed = 4; (super->parent)->subAction = 1; DeleteThisEntity(); } @@ -116,7 +116,7 @@ void LightRay_Type1(LightRayEntity* this) { super->timer = 60; super->subtimer = 32; gRoomControls.camera_target = super; - gRoomControls.unk5 = 1; + gRoomControls.scrollSpeed = 1; if (super->x.HALF.HI > gPlayerEntity.x.HALF.HI) { tmp = 2; } else { @@ -148,7 +148,7 @@ void LightRay_Type1(LightRayEntity* this) { break; case 2: if (--super->timer == 0) { - gRoomControls.unk5 = 4; + gRoomControls.scrollSpeed = 4; gScreen.lcd.displayControl &= 0xd7ff; (super->parent)->subAction = 1; DeleteThisEntity(); @@ -167,7 +167,7 @@ void LightRay_Type2(LightRayEntity* this) { super->timer = 60; super->subtimer = 0; gRoomControls.camera_target = super; - gRoomControls.unk5 = 1; + gRoomControls.scrollSpeed = 1; if (super->x.HALF.HI > gPlayerEntity.x.HALF.HI) { tmp = 2; } else { @@ -214,12 +214,12 @@ void LightRay_Type2(LightRayEntity* this) { if (--super->timer == 0) { super->action = 4; gRoomControls.camera_target = &gPlayerEntity; - gRoomControls.unk5 = 2; + gRoomControls.scrollSpeed = 2; } break; case 4: if (sub_0809BE78(this)) { - gRoomControls.unk5 = 4; + gRoomControls.scrollSpeed = 4; (super->parent)->subAction = 1; SetRoomFlag(100); DeleteThisEntity(); @@ -237,7 +237,7 @@ void LightRay_Type3(LightRayEntity* this) { super->timer = 60; super->subtimer = 0; gRoomControls.camera_target = super; - gRoomControls.unk5 = 1; + gRoomControls.scrollSpeed = 1; if (super->x.HALF.HI > gPlayerEntity.x.HALF.HI) { tmp = 2; } else { @@ -293,7 +293,7 @@ void LightRay_Type4(LightRayEntity* this) { super->timer = 60; super->subtimer = 128; gRoomControls.camera_target = super; - gRoomControls.unk5 = 1; + gRoomControls.scrollSpeed = 1; if (super->x.HALF.HI > gPlayerEntity.x.HALF.HI) { tmp = 2; } else { @@ -319,7 +319,7 @@ void LightRay_Type4(LightRayEntity* this) { break; case 2: if (--super->timer == 0) { - gRoomControls.unk5 = 4; + gRoomControls.scrollSpeed = 4; (super->parent)->subAction = 1; DeleteThisEntity(); } diff --git a/src/object/linkHoldingItem.c b/src/object/linkHoldingItem.c index d3a98df9..61982614 100644 --- a/src/object/linkHoldingItem.c +++ b/src/object/linkHoldingItem.c @@ -19,12 +19,6 @@ typedef struct { /*0x68*/ u16 unk_68; } LinkHoldingItemEntity; -typedef struct { - u8 unk_0[6]; - u16 unk_6; -} struct_080FD964; -extern const struct_080FD964 gUnk_080FD964[]; - void LinkHoldingItem_Init(LinkHoldingItemEntity*); void LinkHoldingItem_Action1(LinkHoldingItemEntity*); void LinkHoldingItem_Action2(LinkHoldingItemEntity*); @@ -74,7 +68,7 @@ void LinkHoldingItem_Action1(LinkHoldingItemEntity* this) { break; case 2: GiveItem(super->type, super->type2); - this->unk_68 = gUnk_080FD964[super->type].unk_6; + this->unk_68 = gUnk_080FD964[super->type].gotItemMessageId; SoundReq(SFX_ITEM_GET); break; case 5: diff --git a/src/object/lockedDoor.c b/src/object/lockedDoor.c index eff9e1c2..1b704f50 100644 --- a/src/object/lockedDoor.c +++ b/src/object/lockedDoor.c @@ -223,7 +223,7 @@ void LockedDoor_Action8(Entity* this) { this->timer = 20; sub_08083658(this); SetFlag(this->field_0x86.HWORD); - sub_080526F8(-1); + ModDungeonKeys(-1); } void sub_08083638(Entity* this) { diff --git a/src/object/minecart.c b/src/object/minecart.c index eba55180..3a4c434e 100644 --- a/src/object/minecart.c +++ b/src/object/minecart.c @@ -134,7 +134,7 @@ void Minecart_Action3(MinecartEntity* this) { u32 iVar2; u32 uVar3; - gRoomControls.unk5 = 7; + gRoomControls.scrollSpeed = 7; if ((gPlayerState.flags & PL_IN_MINECART) == 0) { super->action = 1; return; diff --git a/src/object/objectA.c b/src/object/objectA.c index 9ecf5a80..f9db55e0 100644 --- a/src/object/objectA.c +++ b/src/object/objectA.c @@ -40,7 +40,7 @@ void ObjectA(Entity* this) { SetTileType(*(u16*)&this->field_0x70.HALF.LO, COORD_TO_TILE(this), this->collisionLayer); SetFlag(this->field_0x86.HWORD); CreateDust(this); - sub_080526F8(-1); + ModDungeonKeys(-1); DeleteThisEntity(); } } diff --git a/src/object/pushableGrave.c b/src/object/pushableGrave.c index da643ccb..1cb2ecdf 100644 --- a/src/object/pushableGrave.c +++ b/src/object/pushableGrave.c @@ -96,7 +96,7 @@ void PushableGrave_Action2(PushableGraveEntity* this) { super->subAction = 1; super->subtimer = 120; gRoomControls.camera_target = super; - gRoomControls.unk5 = 2; + gRoomControls.scrollSpeed = 2; } } else { if (--super->subtimer == 0) { @@ -122,7 +122,7 @@ void PushableGrave_Action3(PushableGraveEntity* this) { sub_080977F4(this); if (super->type == 0) { gRoomControls.camera_target = &gPlayerEntity; - gRoomControls.unk5 = 4; + gRoomControls.scrollSpeed = 4; } } } diff --git a/src/object/warpPoint.c b/src/object/warpPoint.c index 905bf7b8..d89c91fd 100644 --- a/src/object/warpPoint.c +++ b/src/object/warpPoint.c @@ -10,8 +10,8 @@ #include "hitbox.h" #include "object.h" -extern void sub_0807CAC8(u32); -extern u32 sub_0807CAEC(u32); +extern void EnableDungeonWarp(u32); +extern u32 IsDungeonWarpActive(u32); void WarpPoint_Init(Entity*); void WarpPoint_Action1(Entity*); @@ -50,7 +50,7 @@ void WarpPoint_Init(Entity* this) { if (CheckFlags(this->field_0x86.HWORD)) { sub_0808B830(this); } else { - if (AreaIsDungeon() && sub_0807CAEC(this->type)) { + if (AreaIsDungeon() && IsDungeonWarpActive(this->type)) { sub_0808B830(this); } } @@ -69,7 +69,7 @@ void WarpPoint_Action1(Entity* this) { if (CheckFlags(this->field_0x86.HWORD)) { sub_0808B830(this); if (AreaIsDungeon()) { - sub_0807CAC8(this->type); + EnableDungeonWarp(this->type); } this->action = 2; this->subtimer = 60; diff --git a/src/objectUtils.c b/src/objectUtils.c index dd78655a..1c78c451 100644 --- a/src/objectUtils.c +++ b/src/objectUtils.c @@ -13,6 +13,19 @@ extern const ObjectDefinition gObjectDefinitions[]; static Entity* CreateSpeechBubble(Entity*, u32, s32, s32); +const s8 gUnk_08126EE4[] = { + 0, -32, // + 22, -6, // + 0, 12, // + -22, -6, +}; +const s8 gUnk_08126EEC[] = { + 0, -13, // + 13, 0, // + 0, 16, // + -13, 0, +}; + Entity* CreateLinkAnimation(Entity* parent, u32 type, u32 type2) { Entity* e = CreateItemGetEntity(); if (e != NULL) { @@ -253,7 +266,8 @@ void CreateSparkle(Entity* entity) { } } -NONMATCH("asm/non_matching/objectUtils/sub_080A2BE4.inc", void SyncPlayerToPlatform(Entity* this, bool32 param_2)) { +NONMATCH("asm/non_matching/objectUtils/SyncPlayerToPlatform.inc", + void SyncPlayerToPlatform(Entity* this, bool32 param_2)) { s16 oldValue; s32 diff; u16 newValue; diff --git a/src/physics.c b/src/physics.c index 9c740228..16763375 100644 --- a/src/physics.c +++ b/src/physics.c @@ -167,9 +167,9 @@ void LinearMoveUpdate(Entity* ent) { } } -void sub_0806F704(Entity* ent, u32 a2) { - ent->x.HALF.HI = (((16 * a2) & 0x3F0) | 8) + gRoomControls.origin_x; - ent->y.HALF.HI = (((a2 >> 2) & 0x3F0) | 8) + gRoomControls.origin_y; +void sub_0806F704(Entity* this, u32 tilePos) { + this->x.HALF.HI = (((16 * tilePos) & 0x3F0) | 8) + gRoomControls.origin_x; + this->y.HALF.HI = (((tilePos >> 2) & 0x3F0) | 8) + gRoomControls.origin_y; } /** Calculates the tile position of the player but modifies it by the hitbox depending on the animation state. */ @@ -509,30 +509,30 @@ bool32 sub_0806FDA0(Entity* this) { return 0; } -u32 LoadExtraSpriteData(Entity* ent, const SpriteLoadData* data) { +bool32 LoadExtraSpriteData(Entity* entity, const SpriteLoadData* spriteData) { const SpriteLoadData* ptr; u32 index; struct_gUnk_020000C0_1* ptr2; - if (sub_0806FDA0(ent) == 0) - return 0; + if (sub_0806FDA0(entity) == 0) + return FALSE; - UnloadOBJPalette(ent); - ptr2 = gUnk_020000C0[ent->spriteAnimation[2]].unk_00; - ptr = data; + UnloadOBJPalette(entity); + ptr2 = gUnk_020000C0[entity->spriteAnimation[2]].unk_00; + ptr = spriteData; for (index = 0; index < 4 && (((u16*)ptr)[1] & 0x3ff); index++) { - u32 pal = LoadObjPalette(ent, ((*(u32*)ptr) << 0x16) >> 0x16); + u32 pal = LoadObjPalette(entity, ((*(u32*)ptr) << 0x16) >> 0x16); sub_0806FEE8(ptr2, (*(u32*)ptr << 6) >> 0x16, pal, (*(u32*)ptr << 0x10) >> 0x1a); if (((u8*)ptr)[3] & 4) { - sub_0806FEFC(ptr2, ent); + sub_0806FEFC(ptr2, entity); } ptr2++; ptr++; } - ent->spriteAnimation[1] = 0; - return 1; + entity->spriteAnimation[1] = 0; + return TRUE; } void UnloadOBJPalette2(Entity* ent) { diff --git a/src/playerItem/playerItemBow.c b/src/playerItem/playerItemBow.c index ee32b950..acde02b6 100644 --- a/src/playerItem/playerItemBow.c +++ b/src/playerItem/playerItemBow.c @@ -262,3 +262,69 @@ void sub_08019468(PlayerItemBowEntity* this) { CreateFx(super, FX_REFLECT5, 0); } } + +// Probably belongs to collision.c, but needs to be placed at the end of playerItemBow.c or start of +// playerItemSwordBeam.c +const u8 gUnk_080B3E80[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 0, 255, 255, 255, + 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 255, + 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 48, 34, 34, 36, 0, 0, 29, 29, 29, 255, 255, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 255, 255, 255, 255, 255, 29, 29, 29, 255, 255, 29, 29, + 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 32, 32, + 15, 15, 15, 15, 0, 0, 0, 0, 21, 21, 20, 20, 95, 255, 255, 255, 255, 255, 255, 15, 41, 41, 41, + 41, 0, 36, 36, 36, 15, 15, 15, 15, 255, 255, 255, 255, 255, 255, 15, 15, 15, 15, 39, 39, 15, 15, + 15, 39, 15, 15, 35, 15, 15, 35, 15, 15, 15, 15, 15, 15, 15, 15, 15, 39, 15, 15, 39, 39, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 39, 15, 15, 255, 39, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 39, 39, 15, 15, 39, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 35, 15, 15, 35, + 35, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 35, 35, 15, 15, 35, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 15, 15, 15, 15, 15, 15, 95, 255, 255, 15, 15, 21, 15, 0, 0, 0, 255, 12, 0, 0, 12, + 12, 66, 96, 15, 29, 255, 15, 15, 15, 0, 15, 15, 15, 15, 10, 5, 10, 5, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 5, 15, 10, 0, 0, 5, 15, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, + 10, 4, 12, 8, 0, 0, 0, 5, 0, 10, 4, 12, 8, 15, 15, 15, 15, 15, 16, 17, 17, 16, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 27, 25, 28, 26, 43, 43, 97, 23, 23, 84, 23, 23, + 23, 0, 0, 84, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 18, 15, 15, 19, 15, 15, 15, 15, + 15, 15, 15, 15, 5, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 1, 3, 2, 0, 0, 5, 15, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 71, 15, 15, 15, 1, 3, 2, 15, 15, 5, 15, 10, 15, + 15, 4, 0, 8, 15, 12, 12, 0, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 16, 15, 17, 15, 15, 15, 15, 15, + 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 15, 0, 0, 5, 15, 15, 15, 15, 15, 15, 15, 15, + 39, 15, 15, 39, 255, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 39, 15, 15, 39, 255, 15, 15, + 15, 15, 255, 255, 255, 255, 255, 255, 15, 39, 15, 15, 255, 39, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 10, 4, 12, 8, 70, 75, 74, 72, 71, 96, 98, 97, 99, 100, 102, 15, 80, 48, + 48, 255, 0, 255, 0, 0, 0, 0, 255, 0, 0, 37, 15, 255, 255, 255, 255, 255, 255, 0, 0, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 255, 255, 255, 255, 255, + 40, 255, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 21, 20, 20, + 15, 15, 15, 15, 15, 15, 15, 15, 255, 1, 1, 1, 255, 255, 255, 255, 24, 24, 24, 24, 38, 15, 0, + 28, 26, 27, 25, 255, 0, 15, 21, 15, 15, 15, 19, 18, 15, 15, 15, 18, 19, 35, 39, 0, 0, 2, + 14, 13, 12, 3, 9, 6, 4, 8, 11, 7, 10, 5, 3, 107, 103, 106, 15, 12, 20, 21, 15, 0, 15, + 40, 95, 15, 5, 10, 16, 17, 18, 19, 71, 12, 13, 14, 71, 20, 92, 13, 5, 4, 8, 1, 2, 10, + 5, 10, 15, 4, 8, 15, 3, 2, 5, 15, 10, 4, 12, 8, 3, 2, 5, 15, 10, 4, 12, 8, 92, + 84, 81, 83, 81, 82, 83, 90, 87, 91, 95, 84, 88, 92, 85, 93, 94, 39, 88, 85, 10, 83, 90, 81, + 15, 89, 0, 0, 69, 71, 67, 70, 0, 3, 15, 1, 2, 3, 10, 12, 5, 4, 8, 4, 1, 3, 15, + 95, 97, 0, 3, 28, 27, 21, 69, 3, 96, 12, 102, 100, 101, 26, 25, 18, 17, 19, 16, 2, 4, 8, + 14, 15, 11, 84, 69, 68, 4, 13, 0, 0, 12, 12, 15, 15, 10, 5, 10, 5, 12, 97, 10, 5, 11, + 7, 67, 69, 1, 2, 4, 8, 13, 3, 3, 7, 15, 3, 0, 2, 84, 92, 88, 12, 67, 0, 0, 8, + 1, 2, 87, 95, 91, 82, 14, 18, 19, 10, 5, 0, 10, 5, 3, 63, 19, 18, 47, 46, 17, 16, 11, + 7, 15, 0, 3, 15, 15, 1, 8, 12, 12, 15, 1, 3, 2, 5, 10, 4, 12, 8, 9, 39, 2, 14, + 13, 12, 3, 6, 9, 4, 8, 11, 7, 10, 5, 34, 35, 4, 12, 3, 3, 1, 5, 10, 4, 8, 0, + 107, 103, 106, 18, 45, 44, 0, 15, 41, 40, 0, 0, 0, 0, 0, 0, 0, 20, 33, 39, 67, 4, 8, + 12, 3, 3, 1, 2, 0, 12, 3, 2, 5, 10, 14, 13, 4, 8, 11, 7, 12, 0, 0, 39, 1, 2, + 1, 2, 4, 12, 7, 11, 4, 8, 16, 17, 43, 43, 18, 19, 10, 5, 2, 1, 35, 1, 3, 2, 5, + 10, 14, 13, 11, 7, 4, 8, 10, 5, 10, 5, 13, 14, 8, 4, 7, 11, 0, 9, 6, 0, 15, 7, + 11, 3, 33, 33, 33, 33, 33, 33, 33, 15, 5, 10, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 3, 48, 48, 0, 0, 0, 0, 0, 0, 48, 48, + 33, 33, 0, 15, 83, 92, 85, 90, 96, 97, 95, 18, 19, 16, 10, 10, 35, 10, 5, 14, 13, 11, 7, + 10, 5, 14, 13, 11, 7, 0, 0, 3, 0, 39, 12, 12, 33, 0, 0, +}; diff --git a/src/playerItem/playerItemCellOverwriteSet.c b/src/playerItem/playerItemCellOverwriteSet.c index fbd53489..3c9e766a 100644 --- a/src/playerItem/playerItemCellOverwriteSet.c +++ b/src/playerItem/playerItemCellOverwriteSet.c @@ -4,6 +4,10 @@ #include "common.h" #include "asm.h" +extern const u8 gUnk_080B7910[]; +extern const u8 gUnk_080B79A7[]; +extern const u8 gUnk_080B7A3E[]; // TODO figure out type from arm_sub_080B1B84 and arm_sub_080B1BA4 + void PlayerItemCellOverwriteSet(Entity* this) { static const s8 gUnk_080B7B6C[] = { 0x0, -0x10, 0x10, 0x0, 0x0, 0x10, -0x10, 0x0 }; u32 tmp; diff --git a/src/playerItem/playerItemGustJar.c b/src/playerItem/playerItemGustJar.c index 2f4e574a..a63fdf3f 100644 --- a/src/playerItem/playerItemGustJar.c +++ b/src/playerItem/playerItemGustJar.c @@ -3,7 +3,11 @@ #include "functions.h" #include "sound.h" +extern const u8* gUnk_08132714[]; // Anim index lists? +// TODO spriteAnimations in here +// TODO sprite frame in here extern Hitbox gUnk_08132B28; + void sub_080ADC84(Entity*); void PlayerItemGustJar_Init(Entity*); void PlayerItemGustJar_Action1(Entity*); @@ -143,8 +147,6 @@ void sub_080ADC84(Entity* this) { this->spriteSettings.flipX = gPlayerEntity.spriteSettings.flipX; } -extern const u8* gUnk_08132714[]; - void sub_080ADCA0(Entity* this, u32 param_2) { const u8* pFVar1 = gUnk_08132714[(param_2 + (gPlayerEntity.animationState >> 1))]; const u8* pFVar2; diff --git a/src/playerItem/playerItemShield.c b/src/playerItem/playerItemShield.c index 74211ade..14f7a2aa 100644 --- a/src/playerItem/playerItemShield.c +++ b/src/playerItem/playerItemShield.c @@ -7,6 +7,8 @@ #include "collision.h" #include "playeritem.h" +const Hitbox gUnk_081271CC = { 0, 0, { 1, 0, 0, 1 }, 8, 8 }; + typedef struct { Entity base; u8 unk_68; @@ -17,9 +19,35 @@ typedef struct { u32 unk_78; u8* unk_7c; } PlayerItemShieldEntity; +void sub_080A2D98(PlayerItemShieldEntity*); +void sub_080A2E00(PlayerItemShieldEntity*); +void (*const gUnk_081271D4[])(PlayerItemShieldEntity*) = { + sub_080A2D98, + sub_080A2E00, +}; +const u8 gUnk_081271DC[] = { + 7, 60, 0, 0, 0, 2, 0, 0, 1, 2, 0, 0, 2, 2, 0, 0, 3, 2, 0, 0, 4, 2, 0, 0, 5, 2, 0, 0, 6, 2, 0, 0, 7, 20, + 0, 0, 0, 2, 0, 0, 1, 2, 0, 0, 2, 2, 0, 0, 3, 2, 0, 0, 4, 2, 0, 0, 5, 2, 0, 0, 6, 2, 0, 0, 255, 0, 0, 0, +}; +const u8 gUnk_08127220[] = { + 0, 1, 0, 0, 1, 2, 0, 0, 2, 4, 0, 0, 3, 2, 0, 0, 4, 3, 0, 0, 5, 2, 0, 0, 3, 2, 0, 0, 255, 0, 0, 0, +}; + +const Hitbox gUnk_08127250; +const Hitbox gUnk_08127258; +const Hitbox gUnk_08127260; +const Hitbox gUnk_08127268; +const Hitbox* const gUnk_08127240[] = { + &gUnk_08127250, + &gUnk_08127258, + &gUnk_08127260, + &gUnk_08127268, +}; +const Hitbox gUnk_08127250 = { 0, -7, { 0, 0, 0, 0 }, 6, 7 }; +const Hitbox gUnk_08127258 = { 5, -4, { 0, 0, 0, 0 }, 5, 7 }; +const Hitbox gUnk_08127260 = { 0, 0, { 0, 0, 0, 0 }, 6, 7 }; +const Hitbox gUnk_08127268 = { -5, -4, { 0, 0, 0, 0 }, 5, 7 }; -extern void (*const gUnk_081271D4[])(PlayerItemShieldEntity*); -extern u8 gUnk_081271DC[]; void sub_080A2E00(PlayerItemShieldEntity* this); void PlayerItemShield(PlayerItemShieldEntity* this) { @@ -38,7 +66,7 @@ void sub_080A2D98(PlayerItemShieldEntity* this) { this->unk_70 = 0x27; this->unk_78 = gUnk_081271DC[1]; this->unk_74 = 0; - this->unk_7c = gUnk_081271DC; + this->unk_7c = (u8*)gUnk_081271DC; } else { this->unk_70 = 0; } @@ -48,9 +76,6 @@ void sub_080A2D98(PlayerItemShieldEntity* this) { sub_080A2E00(this); } -extern Hitbox* gUnk_08127240[]; -extern u8 gUnk_08127220[]; - void sub_080A2E00(PlayerItemShieldEntity* this) { Entity* playerItem; u8* pbVar3; @@ -66,7 +91,7 @@ void sub_080A2E00(PlayerItemShieldEntity* this) { if ((gPlayerState.shield_status != 0) && (super == gPlayerState.item)) { if ((gPlayerState.shield_status & 0x80) != 0) { - super->hitbox = gUnk_08127240[super->animationState >> 1]; + super->hitbox = (Hitbox*)gUnk_08127240[super->animationState >> 1]; super->collisionFlags = (gPlayerEntity.collisionFlags + 1) | 0x20; COLLISION_ON(super); gPlayerState.shield_status &= ~0x80; @@ -84,7 +109,7 @@ void sub_080A2E00(PlayerItemShieldEntity* this) { } this->unk_78 = gUnk_08127220[1]; this->unk_74 = 0; - this->unk_7c = gUnk_08127220; + this->unk_7c = (u8*)gUnk_08127220; gPlayerState.shield_status |= 0x40; } if (this->bounceTimer == 0) { @@ -117,7 +142,7 @@ void sub_080A2E00(PlayerItemShieldEntity* this) { pbVar3 = &this->unk_7c[tmp2]; if (pbVar3[0] == 0xff) { if ((gPlayerState.shield_status & 0x40) != 0) { - this->unk_7c = gUnk_081271DC; + this->unk_7c = (u8*)gUnk_081271DC; gPlayerState.shield_status &= ~0x40; } this->unk_74 = 0; diff --git a/src/playerUtils.c b/src/playerUtils.c index 20dd5995..766da0ff 100644 --- a/src/playerUtils.c +++ b/src/playerUtils.c @@ -33,7 +33,6 @@ void sub_08079064(Entity*); extern u8 gMapData; extern const u8 gUnk_020176E0[]; -extern const s8* gUnk_0811C0E8[]; extern const u8 gUnk_0800851C[]; extern const u8 gUnk_080084BC[]; extern const u8 gUnk_0800845C[]; @@ -58,14 +57,7 @@ void sub_0807AAF8(Entity*, u32); void sub_0807A750(u32, u32, const u8*, u32); extern ItemDefinition gItemDefinitions[]; -extern void (*const gUnk_0811C27C[])(Entity*); -extern void (*const gUnk_0811C284[])(PlayerEntity*); -extern void (*const gUnk_0811C298[])(PlayerEntity*); -extern bool32 (*const gPlayerChargeActions[])(ChargeState*); -extern u8 gUnk_0811C000[]; -extern const u8 gUnk_0811C118[]; -extern void (*const gUnk_0811C120[])(Entity*); -extern u16 gUnk_0811C268[]; + extern ItemBehavior* (*const gCreateItemsFuncs[])(Item); extern void DeleteLoadedTileEntity(u32, u32); @@ -83,24 +75,15 @@ void sub_0807BFD0(void); void ForceSetPlayerState(u32 framestate); struct_03003DF8* sub_080784E4(void); -extern const u16 gUnk_0811C0F8[]; - u32 sub_08079778(void); u32 GetPlayerTilePos(void); -extern const u16 gUnk_0811C108[]; - -extern const u16 gUnk_0811C110[]; - extern const u16 gUnk_08007CAC[]; u32 sub_0807BEEC(u32 param_1, u32 param_2, u32 param_3); -extern const u16 gUnk_0811C466[]; bool32 sub_0807B434(u32 position, u32 layer); -extern const u16 gUnk_0811C2AC[]; - void sub_0807B820(u32); void sub_0807B8A8(u32); void sub_0807B930(u32); @@ -108,15 +91,10 @@ bool32 sub_0807B464(u32 param_1, u32 param_2); void sub_0807B55C(u32, u32, u16*); void sub_0807B480(u32, u32); -extern const s16 gUnk_0811C456[]; - bool32 sub_0807B600(u32); bool32 sub_0807B464(u32 tilePos, u32 param_2); -extern const u16 gUnk_0811C2CC[]; -extern const u16 gUnk_0811C2EC[]; - bool32 sub_0807B464(u32 param_1, u32 param_2); extern void CreateRandomWaterTrace(Entity* parent, int range); @@ -167,9 +145,6 @@ void sub_0807C5B0(void); extern u8 gUnk_080082DC[]; extern u32 sub_08004202(Entity*, u8*, u32); -extern s8* gUnk_0811C0B0[]; -extern u8 gUnk_0811C01C[]; - extern u32 gUnk_02022830[]; extern u16* gUnk_0800823C[]; @@ -294,6 +269,16 @@ bool32 IsTryingToPickupObject(void) { } } +ItemBehavior* CreateItemNone(Item); +ItemBehavior* CreateItem1(Item); +ItemBehavior* CreateItem2(Item); +ItemBehavior* CreateItem3(Item); +ItemBehavior* CreateItem4(Item); +ItemBehavior* CreateItem5(Item); +ItemBehavior* (*const gCreateItemsFuncs[])(Item) = { + CreateItemNone, CreateItem1, CreateItem2, CreateItem3, CreateItem4, CreateItem5, +}; + ItemBehavior* CreateItem(Item itemId) { if (((((gPlayerState.queued_action == PLAYER_ROLL) && (itemId != ITEM_TRY_PICKUP_OBJECT)) || (((gPlayerState.flags & (PL_ROLLING | PL_CLONING)) != 0 && (ITEM_FOURSWORD < itemId)))) || @@ -659,6 +644,215 @@ bool32 PlayerTryDropObject(ItemBehavior* this, u32 index) { // TODO move above into a itemUtils.c ? +const u8 gUnk_0811BFE0[] = { + 3, 10, 12, 3, 3, 14, 12, 3, +}; + +bool32 sub_08078008(ChargeState* state); +bool32 sub_08078124(ChargeState* state); +bool32 sub_08078140(ChargeState* state); +bool32 sub_08078070(ChargeState* state); +bool32 sub_080780E0(ChargeState* state); +bool32 sub_08078108(ChargeState* state); +bool32 (*const gPlayerChargeActions[])(ChargeState*) = { + sub_08078008, sub_08078124, sub_08078140, sub_08078070, sub_080780E0, sub_08078108, +}; + +const u8 gUnk_0811C000[] = { + 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; +const u8 gUnk_0811C00C[] = { + 0, 238, 14, 255, 0, 10, 241, 255, +}; +const u8 gUnk_0811C014[] = { + 0, 242, 10, 255, 0, 6, 245, 255, +}; +const u8 gUnk_0811C01C[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 3, 3, 4, 3, 0, 1, 2, 0, 3, 3, 4, 3, 10, 15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, 6, 6, 6, 5, 5, 5, 5, 5, 6, 6, 6, 5, 5, 5, 5, 11, 12, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, 8, 8, 8, 7, 9, 9, 7, 7, 8, 8, 8, 7, 9, 9, 7, 13, 14, 7, 0, 0, +}; + +const s8 gUnk_0811C070[] = { 0, 16, 0, 17, 0, 18, 0, 15, 0, 14, 25, -4, 25, -3, 0, -24, + 0, -23, 0, -25, 0, 10, 21, -4, 16, -4, 0, -18, 0, -14, 0, 6 }; +const s8 gUnk_0811C090[] = { 0, 18, 0, 19, 0, 20, 0, 17, 0, 16, 24, -2, 24, -1, 0, -22, + 0, -21, 0, -23, 0, 12, 20, -4, 15, -4, 0, -16, 0, -12, 0, 8 }; +const s8* const gUnk_0811C0B0[] = { + gUnk_0811C070, + gUnk_0811C090, +}; + +const s8 gUnk_0811C0B8[] = { 0, -9, 0, -15, 0, -16, 12, -3, 10, -9, 0, 7, 0, -17, 0, -18 }; +const s8 gUnk_0811C0C8[] = { 0, -5, 0, -11, 0, -15, 12, 1, 10, -5, 0, 11, 0, -17, 0, -18 }; +const s8 gUnk_0811C0D8[] = { 0, -19, 0, -19, 0, -24, 32, -7, 10, -13, 0, 26, 0, -25, 0, -26 }; +const s8* const gUnk_0811C0E8[] = { + gUnk_0811C0B8, + gUnk_0811C0D8, + gUnk_0811C0B8, + gUnk_0811C0C8, +}; + +const u16 gUnk_0811C0F8[] = { 1024, 256, 2048, 512 }; +const s8 gUnk_0811C100[] = { 0, -8, 8, 0, 0, 3, -8, 0 }; +const u16 gUnk_0811C108[] = { 6, 24576, 96, 1536 }; +const u16 gUnk_0811C110[] = { 6, 24576, 96, 1536 }; +const u8 gUnk_0811C118[] = { + 19, 18, 18, 16, 16, 17, 17, 19, +}; + +void SurfaceAction_DoNothing(Entity*); +void SurfaceAction_Pit(Entity*); +void SurfaceAction_SlopeGndGndVertical(Entity*); +void SurfaceAction_SlopeGndGndHorizontal(Entity*); +void SurfaceAction_6(Entity*); +void SurfaceAction_7(Entity*); +void SurfaceAction_MinishDoorFront(Entity*); +void SurfaceAction_MinishDoorBack(Entity*); +void SurfaceAction_A(Entity*); +void SurfaceAction_B(Entity*); +void SurfaceAction_SlopeGndWater(Entity*); +void SurfaceAction_ConveyerNorth(Entity*); +void SurfaceAction_ConveyerSouth(Entity*); +void SurfaceAction_ConveyerWest(Entity*); +void SurfaceAction_ConveyerEast(Entity*); +void SurfaceAction_Swamp(Entity*); +void SurfaceAction_14(Entity*); +void SurfaceAction_CloneTile(Entity*); +void SurfaceAction_16(Entity*); +void SurfaceAction_Ice(Entity*); +void SurfaceAction_ShallowWater(Entity*); +void SurfaceAction_Water(Entity*); +void SurfaceAction_Button(Entity*); +void SurfaceAction_1B(Entity*); +void SurfaceAction_1C(Entity*); +void SurfaceAction_Ladder(Entity*); +void SurfaceAction_20(Entity*); +void SurfaceAction_22(Entity*); +void SurfaceAction_Dust(Entity*); +void SurfaceAction_26(Entity*); +void SurfaceAction_Hole(Entity*); +void SurfaceAction_AutoLadder(Entity*); +void SurfaceAction_ClimbWall(Entity*); +void SurfaceAction_2C(Entity*); + +void (*const gUnk_0811C120[])(Entity*) = { + SurfaceAction_DoNothing, + SurfaceAction_Pit, + NULL, + NULL, + SurfaceAction_SlopeGndGndVertical, + SurfaceAction_SlopeGndGndHorizontal, + SurfaceAction_6, + SurfaceAction_7, + SurfaceAction_MinishDoorFront, + SurfaceAction_MinishDoorBack, + SurfaceAction_A, + SurfaceAction_B, + SurfaceAction_SlopeGndWater, + SurfaceAction_ConveyerNorth, + SurfaceAction_ConveyerSouth, + SurfaceAction_ConveyerWest, + SurfaceAction_ConveyerEast, + SurfaceAction_Swamp, + SurfaceAction_DoNothing, + SurfaceAction_DoNothing, + SurfaceAction_14, + SurfaceAction_CloneTile, + SurfaceAction_16, + SurfaceAction_Ice, + SurfaceAction_ShallowWater, + SurfaceAction_Water, + SurfaceAction_Button, + SurfaceAction_1B, + SurfaceAction_1C, + NULL, + SurfaceAction_Ladder, + NULL, + SurfaceAction_20, + SurfaceAction_16, + SurfaceAction_22, + SurfaceAction_6, + SurfaceAction_6, + SurfaceAction_Dust, + SurfaceAction_26, + SurfaceAction_Hole, + SurfaceAction_SlopeGndGndVertical, + SurfaceAction_SlopeGndGndHorizontal, + SurfaceAction_AutoLadder, + SurfaceAction_ClimbWall, + SurfaceAction_2C, + SurfaceAction_Dust, +}; + +const u16 gUnk_0811C240[]; +const u16 gUnk_0811C24A[]; +const u16 gUnk_0811C254[]; +const u16 gUnk_0811C25E[]; +const u16 gUnk_0811C1F8[]; +const u16 gUnk_0811C20A[]; +const u16 gUnk_0811C21C[]; +const u16 gUnk_0811C22E[]; + +const u16* const gUnk_0811C1D8[] = { + gUnk_0811C240, + gUnk_0811C24A, + gUnk_0811C254, + gUnk_0811C25E, +}; +const u16* const gUnk_0811C1E8[] = { + gUnk_0811C1F8, + gUnk_0811C20A, + gUnk_0811C21C, + gUnk_0811C22E, +}; + +const u16 gUnk_0811C1F8[] = { 43, 1, 65, 1, 78, 8, 76, 2, 0 }; +const u16 gUnk_0811C20A[] = { 44, 3, 66, 3, 76, 2, 77, 4, 0 }; +const u16 gUnk_0811C21C[] = { 42, 5, 64, 5, 79, 6, 77, 4, 0 }; +const u16 gUnk_0811C22E[] = { 45, 7, 67, 7, 78, 8, 79, 6, 0 }; +const u16 gUnk_0811C240[] = { 42, 1, 38, 1, 0 }; +const u16 gUnk_0811C24A[] = { 45, 1, 39, 1, 0 }; +const u16 gUnk_0811C254[] = { 43, 1, 38, 1, 0 }; +const u16 gUnk_0811C25E[] = { 44, 1, 39, 1, 0 }; +const u16 gUnk_0811C268[] = { 16, 1, 90, 1, 17, 1, 19, 1, 0, 0 }; +void sub_0807B114(PlayerEntity*); +void sub_0807B128(PlayerEntity*); +void (*const gUnk_0811C27C[])(PlayerEntity*) = { + sub_0807B114, + sub_0807B128, +}; +void sub_0807B1A8(PlayerEntity*); +void sub_0807B144(PlayerEntity*); +void nullsub_506(PlayerEntity*); +void sub_0807B178(PlayerEntity*); +void sub_0807B2F8(PlayerEntity*); + +void (*const gUnk_0811C284[])(PlayerEntity*) = { + sub_0807B1A8, sub_0807B144, nullsub_506, sub_0807B178, sub_0807B2F8, +}; +void sub_0807B1DC(PlayerEntity*); +void sub_0807B1EC(PlayerEntity*); +void sub_0807B21C(PlayerEntity*); +void sub_0807B264(PlayerEntity*); +void sub_0807B2B8(PlayerEntity*); +void (*const gUnk_0811C298[])(PlayerEntity*) = { + sub_0807B1DC, sub_0807B1EC, sub_0807B21C, sub_0807B264, sub_0807B2B8, +}; + +const u16 gUnk_0811C2AC[] = { 678, 693, 688, 685, 691, 692, 684, 682, 690, 687, 689, 681, 686, 683, 680, 679 }; +const u16 gUnk_0811C2CC[] = { 710, 747, 720, 717, 737, 744, 716, 714, 730, 719, 727, 713, 718, 715, 712, 711 }; +const u16 gUnk_0811C2EC[] = { + 694, 15, 0, 695, 0, 15, 696, 1, 14, 697, 4, 11, 698, 8, 7, 699, 2, 13, 700, 9, 6, 701, 12, 3, 702, 3, 12, + 703, 6, 9, 704, 13, 2, 705, 5, 10, 706, 7, 8, 707, 11, 4, 708, 10, 5, 709, 14, 1, 710, 0, 0, 711, 0, 15, + 712, 0, 14, 713, 0, 11, 714, 0, 7, 715, 0, 13, 716, 0, 6, 717, 0, 3, 718, 0, 12, 719, 0, 9, 720, 0, 2, + 721, 12, 2, 722, 5, 2, 723, 9, 2, 724, 4, 2, 725, 1, 2, 726, 8, 2, 727, 0, 10, 728, 4, 10, 729, 1, 10, + 730, 0, 8, 731, 6, 8, 732, 5, 8, 733, 3, 8, 734, 4, 8, 735, 1, 8, 736, 2, 8, 737, 0, 4, 738, 10, 4, + 739, 3, 4, 740, 9, 4, 741, 2, 4, 742, 8, 4, 743, 1, 4, 744, 0, 5, 745, 2, 5, 746, 8, 5, 747, 0, 1, + 748, 10, 1, 749, 6, 1, 750, 12, 1, 751, 2, 1, 752, 8, 1, 753, 4, 1, 0, +}; +const s16 gUnk_0811C456[] = { 0, -13, 13, 0, 0, 16, -13, 0 }; +const u16 gUnk_0811C466[] = { 803, 819, 822, 825, 820, 828, 826, 829, 821, 823, 831, 830, 824, 827, 832, 53, 0 }; + void sub_08077F84(void) { Entity* obj; @@ -1194,7 +1388,7 @@ void UpdateCarriedObject(void) { void sub_08078CD0(PlayerEntity* this) { Entity* entity; u32 tmp; - s8* ptr; + const s8* ptr; entity = this->unk_70; entity->z.HALF.HI = super->z.HALF.HI - 1; @@ -2610,8 +2804,8 @@ void sub_0807B0C8(void) { sub_0806FEBC(&gPlayerEntity, 3, 0); } -void PlayerWarp(Entity* player) { - gUnk_0811C27C[player->subAction](player); +void PlayerWarp(PlayerEntity* this) { + gUnk_0811C27C[super->subAction](this); } void sub_0807B114(PlayerEntity* this) { @@ -2632,7 +2826,7 @@ void sub_0807B144(PlayerEntity* this) { SetPlayerActionNormal(); } -void nullsub_506(void) { +void nullsub_506(PlayerEntity* this) { } void sub_0807B178(PlayerEntity* this) { @@ -3100,8 +3294,8 @@ void sub_0807BC84(void) { bool32 sub_0807BD14(Entity* this, u32 scrollDirection) { u32 room = sub_0807BEEC(this->x.HALF.HI, this->y.HALF.HI, scrollDirection); if (room != 0xff) { - gRoomControls.unk3 = 2; - gRoomControls.unk4 = 0; + gRoomControls.scrollAction = 2; + gRoomControls.scrollSubAction = 0; gRoomControls.reload_flags = 1; gRoomControls.room = room; gRoomControls.scroll_direction = scrollDirection; @@ -3696,12 +3890,12 @@ u32 SetInventoryValue(u32 item, u32 value) { return masked_value >> offset; } -void sub_0807CAC8(u32 param_1) { - gSave.unk47C[gArea.dungeon_idx] |= (1 << param_1); +void EnableDungeonWarp(u32 warp) { + gSave.dungeonWarps[gArea.dungeon_idx] |= (1 << warp); } -u32 sub_0807CAEC(u32 param_1) { - return gSave.unk47C[gArea.dungeon_idx] >> param_1 & 1; +u32 IsDungeonWarpActive(u32 warp) { + return gSave.dungeonWarps[gArea.dungeon_idx] >> warp & 1; } u32 CheckLocalFlagByBank(u32 bank, u32 flag) { diff --git a/src/projectile.c b/src/projectile.c index aaddbb1b..3cfe2511 100644 --- a/src/projectile.c +++ b/src/projectile.c @@ -50,8 +50,8 @@ const ProjectileDefinition gProjectileDefinitions[] = { { 16400, 288, { &gHitbox_0 }, 107, 2, { 0, 1, 1, 1 }, 4, 384, 3, 11 }, // TODO sprite index too high MULTI_FORM(gProjectileDefinition_14), { 16400, 1, { &gHitbox_0 }, SPRITE_SPIDERWEB, 0, { 0, 1, 1, 1 }, 65, 640, 159, 143 }, - { 0, 0, { &gHitbox_20 }, SPRITE_TORCHTRAPPROJECTILE_0, 0, { 0, 1, 1, 1 }, 66, 640, 146, 11 }, - { 399, 0, { &gHitbox_20 }, SPRITE_TORCHTRAPPROJECTILE_1, 0, { 0, 1, 1, 1 }, 65, 640, 10, 11 }, + { 0, 0, { (Hitbox*)&gHitbox_20 }, SPRITE_TORCHTRAPPROJECTILE_0, 0, { 0, 1, 1, 1 }, 66, 640, 146, 11 }, + { 399, 0, { (Hitbox*)&gHitbox_20 }, SPRITE_TORCHTRAPPROJECTILE_1, 0, { 0, 1, 1, 1 }, 65, 640, 10, 11 }, { 405, 0, { &gHitbox_0 }, SPRITE_V1DARKMAGICPROJECTILE, 0, { 3, 1, 1, 1 }, 66, 256, 46, 15 }, #ifdef EU { 401, 112, { &gHitbox_1 }, 488, 0, { 1, 1, 1, 1 }, 65, 640, 162, 11 }, // TODO sprite index too high @@ -64,8 +64,8 @@ const ProjectileDefinition gProjectileDefinitions[] = { MULTI_FORM(gProjectileDefinition_1D), MULTI_FORM(gProjectileDefinition_1E), MULTI_FORM(gProjectileDefinition_1F), - { 415, 4, { &gHitbox_20 }, SPRITE_V3HANDPROJECTILE, 0, { 1, 1, 1, 1 }, 66, 704, 60, 11 }, - { 415, 320, { &gHitbox_20 }, SPRITE_V3HANDPROJECTILE, 0, { 1, 1, 1, 1 }, 66, 512, 164, 11 }, + { 415, 4, { (Hitbox*)&gHitbox_20 }, SPRITE_V3HANDPROJECTILE, 0, { 1, 1, 1, 1 }, 66, 704, 60, 11 }, + { 415, 320, { (Hitbox*)&gHitbox_20 }, SPRITE_V3HANDPROJECTILE, 0, { 1, 1, 1, 1 }, 66, 512, 164, 11 }, MULTI_FORM(gProjectileDefinition_22), { 493, 0, { &gHitbox_22 }, SPRITE_GYORGMALEENERGYPROJECTILE, 0, { 0, 1, 1, 1 }, 66, 256, 31, 11 }, { 418, 1, { &gHitbox_22 }, SPRITE_WRATHEYE, 0, { 1, 1, 1, 1 }, 66, 512, 55, 11 }, @@ -113,18 +113,18 @@ const ProjectileDefinition gProjectileDefinition_F[] = { { 32992, 1, { &gHitbox_0 }, SPRITE_POT, 0, { 3, 1, 1, 1 }, 66, 384, 157, 11 }, }; const ProjectileDefinition gProjectileDefinition_10[] = { - { 33008, 1, { &gUnk_080FD3FC }, 167, 1, { 0, 0, 1, 0 }, 65, 640, 110, 4 }, - { 366, 0, { &gUnk_080FD3FC }, SPRITE_FLYINGSKULL, 0, { 0, 0, 1, 0 }, 65, 640, 110, 4 }, + { 33008, 1, { (Hitbox*)&gUnk_080FD3FC }, 167, 1, { 0, 0, 1, 0 }, 65, 640, 110, 4 }, + { 366, 0, { (Hitbox*)&gUnk_080FD3FC }, SPRITE_FLYINGSKULL, 0, { 0, 0, 1, 0 }, 65, 640, 110, 4 }, }; // TODO sprite index too high #ifdef EU const ProjectileDefinition gProjectileDefinition_14[] = { { 387, 20, { &gHitbox_2 }, 486, 0, { 0, 1, 1, 1 }, 65, 640, 110, 12 }, - { 387, 20, { &gUnk_080FD43C }, 486, 4, { 0, 1, 1, 1 }, 65, 640, 88, 5 }, + { 387, 20, { (Hitbox*)&gUnk_080FD43C }, 486, 4, { 0, 1, 1, 1 }, 65, 640, 88, 5 }, }; // TODO sprite index too high #else const ProjectileDefinition gProjectileDefinition_14[] = { { 387, 20, { &gHitbox_2 }, 487, 0, { 0, 1, 1, 1 }, 65, 640, 110, 12 }, - { 387, 20, { &gUnk_080FD43C }, 487, 4, { 0, 1, 1, 1 }, 65, 640, 88, 5 }, + { 387, 20, { (Hitbox*)&gUnk_080FD43C }, 487, 4, { 0, 1, 1, 1 }, 65, 640, 88, 5 }, }; // TODO sprite index too high #endif const ProjectileDefinition gProjectileDefinition_1B[] = { @@ -164,12 +164,12 @@ const ProjectileDefinition gProjectileDefinition_1F[] = { #ifdef EU const ProjectileDefinition gProjectileDefinition_22[] = { { 492, 372, { &gHitbox_1 }, 497, 0, { 0, 0, 1, 1 }, 65, 640, 29, 11 }, - { 491, 338, { &gHitbox_20 }, 496, 0, { 0, 1, 1, 1 }, 65, 640, 29, 11 }, + { 491, 338, { (Hitbox*)&gHitbox_20 }, 496, 0, { 0, 1, 1, 1 }, 65, 640, 29, 11 }, }; // TODO sprite index too high #else const ProjectileDefinition gProjectileDefinition_22[] = { { 492, 372, { &gHitbox_1 }, 498, 0, { 0, 0, 1, 1 }, 65, 640, 29, 11 }, - { 491, 338, { &gHitbox_20 }, 497, 0, { 0, 1, 1, 1 }, 65, 640, 29, 11 }, + { 491, 338, { (Hitbox*)&gHitbox_20 }, 497, 0, { 0, 1, 1, 1 }, 65, 640, 29, 11 }, }; // TODO sprite index too high #endif @@ -11,7 +11,6 @@ static void sub_0804B058(EntityData* dat); extern void sub_0801AC98(void); extern u32 sub_08049D1C(u32); -extern void* GetRoomProperty(u32, u32, u32); extern void** gCurrentRoomProperties; extern void*** gAreaTable[]; @@ -374,7 +373,7 @@ void sub_0804B388(u32 a1, u32 a2) { e->collisionLayer = a2; sub_0806F704(e, a1); } - sub_080526F8(-1); + ModDungeonKeys(-1); } void sub_0804B3C4(TileEntity* tile) { diff --git a/src/roomInit.c b/src/roomInit.c index fe7340a7..c77091db 100644 --- a/src/roomInit.c +++ b/src/roomInit.c @@ -2724,7 +2724,7 @@ extern EntityData gUnk_080E3850; void sub_StateChange_FortressOfWindsTop_Main(void) { SetGlobalFlag(LV3_CLEAR); UpdateGlobalProgress(); - sub_0805B4D0(3); + LoadStaticBackground(3); if (!GetInventoryValue(ITEM_OCARINA) && CheckLocalFlag(0x45)) { LoadRoomEntityList(&gUnk_080E3850); } @@ -3609,7 +3609,7 @@ u32 sub_unk3_DarkHyruleCastleBridge_Main(void) { } void sub_StateChange_DarkHyruleCastleBridge_Main(void) { - sub_0805B4D0(6); + LoadStaticBackground(6); } u32 sub_unk3_VaatisArms_First(void) { @@ -3635,7 +3635,7 @@ extern EntityData gUnk_080EAD68; extern EntityData gUnk_080EADB8; void sub_StateChange_DarkHyruleCastleOutside_ZeldaStatuePlatform(void) { - sub_0805B4D0(4); + LoadStaticBackground(4); if (!CheckLocalFlag(0x77)) { LoadRoomEntityList(&gUnk_080EAD68); } else if (!CheckLocalFlag(0x79)) { @@ -4405,7 +4405,7 @@ void sub_StateChange_HyruleTown_0(void) { } else { LoadRoomEntityList(&gUnk_080EE9DC); } - if ((gSave.global_progress > 4) && !CheckKinstoneFused(0xb) && + if ((gSave.global_progress > 4) && !CheckKinstoneFused(KINSTONE_B) && (CheckGlobalFlag(RENTED_HOUSE_DIN) || CheckGlobalFlag(RENTED_HOUSE_NAYRU) || CheckGlobalFlag(RENTED_HOUSE_FARORE))) { LoadRoomEntityList(&gUnk_080EEA5C); @@ -5543,7 +5543,7 @@ u32 sub_unk3_WindTribeTowerRoof_Main(void) { extern EntityData gUnk_080F66AC; void sub_StateChange_WindTribeTowerRoof_Main(void) { - sub_0805B4D0(5); + LoadStaticBackground(5); if (CheckGlobalFlag(LV5_CLEAR) && !CheckLocalFlagByBank(FLAG_BANK_1, 5)) { LoadRoomEntityList(&gUnk_080F66AC); } @@ -5972,7 +5972,7 @@ extern EntityData gUnk_080F8430; void sub_StateChange_HyruleField_WesternWoodsCenter(void) { CloudOverlayManager_Main(NULL); - if (CheckKinstoneFused(KINSTONE_21) && !CheckLocalFlagByBank(FLAG_BANK_2, 0x42)) { + if (CheckKinstoneFused(KINSTONE_21) && !CheckLocalFlagByBank(FLAG_BANK_2, MHOUSE08_03)) { LoadRoomEntityList(&gUnk_080F8430); } } @@ -6261,7 +6261,7 @@ u32 sub_unk3_VeilFallsTop_Main(void) { } void sub_StateChange_VeilFallsTop_Main(void) { - sub_0805B4D0(2); + LoadStaticBackground(2); sub_0806D0B0(0); } @@ -6555,12 +6555,12 @@ void sub_StateChange_MtCrenel_MountainTop(void) { } else { LoadRoomEntityList(&gUnk_080FACB8); } - sub_0805B4D0(0); + LoadStaticBackground(0); sub_08059994(); } void sub_unk1_MtCrenel_MountainTop(void) { - sub_0805B4D0(0); + LoadStaticBackground(0); } u32 sub_unk3_MtCrenel_WallClimb(void) { @@ -6578,7 +6578,7 @@ extern EntityData gUnk_080FAFE4; extern EntityData gUnk_080FB004; void sub_StateChange_MtCrenel_CaveOfFlamesEntrance(void) { - sub_0805B4D0(1); + LoadStaticBackground(1); if (CheckGlobalFlag(LV2_CLEAR) && !CheckLocalFlag(LV1_CLEAR)) { LoadRoomEntityList(&gUnk_080FAFE4); } @@ -46,7 +46,13 @@ const char gUnk_0811E470[4] = "LINK"; #if defined(DEMO_USA) || defined(DEMO_JP) const u8 demoUnknown0 = 0x0; #ifdef DEMO_USA -const u8 demoUnknown1[] = { 0x0f, 0x0a, 0x0a, 0x0f, 0x0f, 0x0f, 0x08, 0x05, 0x05, 0x00, 0x00 }; +const u8 demoUnknown1[] = { + // demo_timer for the three save files + 0x0f, 0x0a, 0x0a, // gUnk_02000010.field_0x7 == 0 + 0x0f, 0x0f, 0x0f, // gUnk_02000010.field_0x7 == 1 + 0x08, 0x05, 0x05, // gUnk_02000010.field_0x7 == 2 + 0x00, 0x00 +}; #else const u8 demoUnknown1[] = { 0 }; #endif diff --git a/src/script.c b/src/script.c index b59c8ef2..27bea866 100644 --- a/src/script.c +++ b/src/script.c @@ -10,7 +10,7 @@ #include "item.h" #include "ui.h" -void InitScriptExecutionContext(ScriptExecutionContext* context, u16* script); +void InitScriptExecutionContext(ScriptExecutionContext* context, Script* script); void sub_0807DE80(Entity*); void DisablePauseMenu(void); void ScriptCommandNop(Entity* entity, ScriptExecutionContext* context); @@ -149,7 +149,7 @@ void ScriptCommand_SetInventoryValue(Entity* entity, ScriptExecutionContext* con void ScriptCommand_InitItemGetSequence(Entity* entity, ScriptExecutionContext* context); void ScriptCommand_CameraTargetEntity(Entity* entity, ScriptExecutionContext* context); void ScriptCommand_CameraTargetPlayer(Entity* entity, ScriptExecutionContext* context); -void ScriptCommand_0807F0B4(Entity* entity, ScriptExecutionContext* context); +void ScriptCommand_SetScrollSpeed(Entity* entity, ScriptExecutionContext* context); void ScriptCommand_0807F0C8(Entity* entity, ScriptExecutionContext* context); typedef void (*ScriptCommand)(Entity*, ScriptExecutionContext*); @@ -185,7 +185,7 @@ void DestroyScriptExecutionContext(ScriptExecutionContext* context) { MemClear(context, sizeof(ScriptExecutionContext)); } -ScriptExecutionContext* StartCutscene(Entity* entity, u16* script) { +ScriptExecutionContext* StartCutscene(Entity* entity, Script* script) { ScriptExecutionContext* context; context = CreateScriptExecutionContext(); @@ -195,7 +195,7 @@ ScriptExecutionContext* StartCutscene(Entity* entity, u16* script) { return context; } -void InitScriptForEntity(Entity* entity, ScriptExecutionContext* context, u16* script) { +void InitScriptForEntity(Entity* entity, ScriptExecutionContext* context, Script* script) { entity->flags |= ENT_SCRIPTED; *(ScriptExecutionContext**)&entity->cutsceneBeh = context; InitScriptExecutionContext(context, script); @@ -209,7 +209,7 @@ void UnloadCutsceneData(Entity* entity) { } } -void StartPlayerScript(u16* script) { +void StartPlayerScript(Script* script) { Entity* player; MemClear(&gPlayerScriptExecutionContext, sizeof(gPlayerScriptExecutionContext)); @@ -222,7 +222,7 @@ void StartPlayerScript(u16* script) { gPlayerState.field_0x38 = 0; } -UNUSED ScriptExecutionContext* StartCutscene2(Entity* entity, u16* script) { +UNUSED ScriptExecutionContext* StartCutscene2(Entity* entity, Script* script) { ScriptExecutionContext* context; context = CreateScriptExecutionContext(); @@ -234,7 +234,7 @@ UNUSED ScriptExecutionContext* StartCutscene2(Entity* entity, u16* script) { return context; } -void InitScriptExecutionContext(ScriptExecutionContext* context, u16* script) { +void InitScriptExecutionContext(ScriptExecutionContext* context, Script* script) { MemClear(context, sizeof(ScriptExecutionContext)); context->scriptInstructionPointer = script; } @@ -325,7 +325,7 @@ void sub_0807DD64(Entity* entity) { entity->field_0x82.HWORD = 0; } -void sub_0807DD80(Entity* entity, u16* script) { +void sub_0807DD80(Entity* entity, Script* script) { InitScriptExecutionContext(*(ScriptExecutionContext**)&entity->cutsceneBeh, script); sub_0807DD64(entity); } @@ -597,7 +597,7 @@ void ExecuteScript(Entity* entity, ScriptExecutionContext* context) { ScriptCommand_InitItemGetSequence, ScriptCommand_CameraTargetEntity, ScriptCommand_CameraTargetPlayer, - ScriptCommand_0807F0B4, + ScriptCommand_SetScrollSpeed, ScriptCommand_0807F0C8, }; @@ -1516,8 +1516,8 @@ void ScriptCommand_CameraTargetPlayer(Entity* entity, ScriptExecutionContext* co gRoomControls.camera_target = &gPlayerEntity; } -void ScriptCommand_0807F0B4(Entity* entity, ScriptExecutionContext* context) { - gRoomControls.unk5 = context->scriptInstructionPointer[1] & 7; +void ScriptCommand_SetScrollSpeed(Entity* entity, ScriptExecutionContext* context) { + gRoomControls.scrollSpeed = context->scriptInstructionPointer[1] & 7; } void ScriptCommand_0807F0C8(Entity* entity, ScriptExecutionContext* context) { diff --git a/src/scroll.c b/src/scroll.c index 8e4d4018..c4c73049 100644 --- a/src/scroll.c +++ b/src/scroll.c @@ -72,13 +72,13 @@ void UpdateScroll(void) { }; gRoomControls.scroll_flags &= 0xfb; - gUnk_0811E768[gRoomControls.unk3](&gRoomControls); + gUnk_0811E768[gRoomControls.scrollAction](&gRoomControls); } void sub_0807FC64(RoomControls* controls) { - controls->unk3 = 1; + controls->scrollAction = 1; controls->reload_flags = 0; - controls->unk5 = 4; + controls->scrollSpeed = 4; sub_0807FC7C(controls); UpdateIsDiggingCave(); } @@ -98,8 +98,8 @@ void sub_0807FC7C(RoomControls* controls) { uVar5 = controls->scroll_x & 7; if (uVar3 >= 1) { if (controls->origin_x < controls->scroll_x) { - if (controls->unk5 <= uVar3) { - uVar3 = controls->unk5; + if (controls->scrollSpeed <= uVar3) { + uVar3 = controls->scrollSpeed; controls->scroll_flags |= 4; } controls->scroll_x = controls->scroll_x - uVar3; @@ -113,8 +113,8 @@ void sub_0807FC7C(RoomControls* controls) { } else { uVar2 = controls->origin_x + controls->width - 0xf0; if (controls->scroll_x < uVar2) { - if (-controls->unk5 >= uVar3) { - uVar3 = -controls->unk5; + if (-controls->scrollSpeed >= uVar3) { + uVar3 = -controls->scrollSpeed; controls->scroll_flags |= 4; } controls->scroll_x -= uVar3; @@ -135,8 +135,8 @@ void sub_0807FC7C(RoomControls* controls) { uVar5 = controls->scroll_y & 7; if (uVar3 >= 1) { if (controls->origin_y < controls->scroll_y) { - if (controls->unk5 <= uVar3) { - uVar3 = controls->unk5; + if (controls->scrollSpeed <= uVar3) { + uVar3 = controls->scrollSpeed; controls->scroll_flags |= 4; } controls->scroll_y = controls->scroll_y - uVar3; @@ -150,8 +150,8 @@ void sub_0807FC7C(RoomControls* controls) { } else { uVar2 = controls->origin_y + controls->height - DISPLAY_HEIGHT; if (controls->scroll_y < uVar2) { - if (-controls->unk5 >= uVar3) { - uVar3 = -controls->unk5; + if (-controls->scrollSpeed >= uVar3) { + uVar3 = -controls->scrollSpeed; controls->scroll_flags |= 4; } controls->scroll_y -= uVar3; @@ -174,19 +174,19 @@ void sub_0807FDB0(RoomControls* controls) { sub_0807FDE4, sub_0807FDF8, }; - gUnk_0811E780[controls->unk4](controls); + gUnk_0811E780[controls->scrollSubAction](controls); } void sub_0807FDC8(RoomControls* controls) { gUpdateVisibleTiles = 1; UpdateScrollVram(); - controls->unk4 = 1; + controls->scrollSubAction = 1; gUpdateVisibleTiles = 0; } void sub_0807FDE4(RoomControls* controls) { - controls->unk4 = 2; - controls->filler2[0] = 0; + controls->scrollSubAction = 2; + controls->unk_18 = 0; gUpdateVisibleTiles = 2; } @@ -196,7 +196,7 @@ void sub_0807FDF8(RoomControls* controls) { s32 iVar3; gUpdateVisibleTiles = 2; - controls->filler2[0]++; + controls->unk_18++; switch (controls->scroll_direction) { case 0: controls->scroll_y -= 4; @@ -204,7 +204,7 @@ void sub_0807FDF8(RoomControls* controls) { if (pEVar2 == &gPlayerEntity) { pEVar2->y.WORD = gPlayerEntity.y.WORD - Q_16_16(0.375); } - if (controls->filler2[0] == 0x28) { + if (controls->unk_18 == 0x28) { sub_0807FEC8(controls); } break; @@ -213,7 +213,7 @@ void sub_0807FDF8(RoomControls* controls) { if (controls->camera_target == &gPlayerEntity) { gPlayerEntity.x.WORD += Q_16_16(0.25); } - if (controls->filler2[0] == 0x3c) { + if (controls->unk_18 == 0x3c) { sub_0807FEC8(controls); } break; @@ -223,7 +223,7 @@ void sub_0807FDF8(RoomControls* controls) { if (pEVar2 == &gPlayerEntity) { pEVar2->y.WORD = gPlayerEntity.y.WORD + Q_16_16(0.375); } - if (controls->filler2[0] == 0x28) { + if (controls->unk_18 == 0x28) { sub_0807FEC8(controls); } break; @@ -232,7 +232,7 @@ void sub_0807FDF8(RoomControls* controls) { if (controls->camera_target == &gPlayerEntity) { gPlayerEntity.x.WORD -= Q_16_16(0.25); } - if (controls->filler2[0] == 0x3c) { + if (controls->unk_18 == 0x3c) { sub_0807FEC8(controls); } break; @@ -242,11 +242,11 @@ void sub_0807FDF8(RoomControls* controls) { sub_08080BC4(); } -void sub_0807FEC8(RoomControls* this) { - this->unk3 = 0; +void sub_0807FEC8(RoomControls* controls) { + controls->scrollAction = 0; MemFill32(0xffffffff, gPlayerState.path_memory, sizeof(gPlayerState.path_memory)); - gPlayerState.startPosX = this->camera_target->x.HALF.HI; - gPlayerState.startPosY = this->camera_target->y.HALF.HI; + gPlayerState.startPosX = controls->camera_target->x.HALF.HI; + gPlayerState.startPosY = controls->camera_target->y.HALF.HI; } void sub_0807FEF0(RoomControls* controls) { @@ -254,20 +254,20 @@ void sub_0807FEF0(RoomControls* controls) { sub_0807FF08, sub_0807FF1C, }; - gUnk_0811E78C[controls->unk4](controls); + gUnk_0811E78C[controls->scrollSubAction](controls); } void sub_0807FF08(RoomControls* controls) { - controls->unk4 = 1; - controls->filler2[0] = 0; + controls->scrollSubAction = 1; + controls->unk_18 = 0; gUpdateVisibleTiles = 3; } void sub_0807FF1C(RoomControls* controls) { if ((gRoomTransition.frameCount & 1U) == 0) { gUpdateVisibleTiles = 3; - if (++controls->filler2[0] > 0x13) { - controls->unk3 = 0; + if (++controls->unk_18 > 0x13) { + controls->scrollAction = 0; ResetSystemPriority(); } } @@ -277,11 +277,11 @@ void sub_0807FF54(RoomControls* controls) { static void (*const gUnk_0811E794[])(RoomControls*) = { sub_0807FF6C, sub_0807FFE4, sub_08080040, sub_08080108, sub_08080198, sub_080801BC, }; - gUnk_0811E794[controls->unk4](controls); + gUnk_0811E794[controls->scrollSubAction](controls); } void sub_0807FF6C(RoomControls* controls) { - controls->unk4 = 1; + controls->scrollSubAction = 1; gScreen.lcd.displayControl |= DISPCNT_WIN1_ON; gScreen.controls.windowInsideControl = (u8)gScreen.controls.windowInsideControl | 0x1700; gScreen.controls.windowOutsideControl = (gScreen.controls.windowOutsideControl & 0xff00) | 7; @@ -298,8 +298,8 @@ void sub_0807FF6C(RoomControls* controls) { } void sub_0807FFE4(RoomControls* controls) { - controls->unk4 = 2; - controls->filler2[0] = sub_080803D0() + 6; + controls->scrollSubAction = 2; + controls->unk_18 = sub_080803D0() + 6; gUnk_0200B640 = sub_08080278(); sub_080197D4(*gUnk_08109194[gDiggingCaveEntranceTransition.entrance->type]); sub_0807C8B0(gMapTop.mapData, controls->width >> 4, controls->height >> 4); @@ -314,32 +314,32 @@ void sub_08080040(RoomControls* controls) { s32 iVar7; s32 temp; - controls->filler2[0] -= 6; - controls->filler2[1] = (controls->filler2[0] << 1) / 3; - if (0x2a < controls->filler2[0]) { + controls->unk_18 -= 6; + controls->unk_1a = (controls->unk_18 << 1) / 3; + if (0x2a < controls->unk_18) { iVar2 = controls->camera_target->x.HALF.HI - controls->scroll_x; - uVar6 = (iVar2 - controls->filler2[0]) + 8; + uVar6 = (iVar2 - controls->unk_18) + 8; if (uVar6 < 0) { uVar6 = 0; } - iVar7 = iVar2 + controls->filler2[0] - 8; + iVar7 = iVar2 + controls->unk_18 - 8; if (DISPLAY_WIDTH < iVar7) { iVar7 = DISPLAY_WIDTH; } temp = controls->camera_target->y.HALF.HI - controls->scroll_y; - uVar5 = (temp - controls->filler2[1]) + 8; + uVar5 = (temp - controls->unk_1a) + 8; if (uVar5 < 0) { uVar5 = 0; } - iVar3 = temp + controls->filler2[1] - 8; + iVar3 = temp + controls->unk_1a - 8; if (DISPLAY_HEIGHT < iVar3) { iVar3 = DISPLAY_HEIGHT; } gScreen.controls.window1HorizontalDimensions = ((uVar6 & 0xff) << 8) | (iVar7 & 0xff); gScreen.controls.window1VerticalDimensions = ((uVar5 & 0xff) << 8) | (iVar3 & 0xff); } - if (controls->filler2[0] == 0) { - controls->unk4 = 3; + if (controls->unk_18 == 0) { + controls->scrollSubAction = 3; DeleteSleepingEntities(); sub_0807C810(); sub_08080C80(*(gUnk_08109194[gDiggingCaveEntranceTransition.entrance->type] + 1)); @@ -349,7 +349,7 @@ void sub_08080040(RoomControls* controls) { } void sub_08080108(RoomControls* controls) { - controls->unk4 = 4; + controls->scrollSubAction = 4; MemCopy(gMapBottom.mapData, gMapBottom.mapDataClone, sizeof(gMapBottom.mapData)); MemCopy(gMapTop.mapData, gMapTop.mapDataClone, sizeof(gMapTop.mapData)); sub_08080368(); @@ -365,8 +365,8 @@ void sub_08080108(RoomControls* controls) { } void sub_08080198(RoomControls* controls) { - controls->unk4 = 5; - controls->filler2[2] = 0xff; + controls->scrollSubAction = 5; + controls->unk_1c = 0xff; LoadRoom(); CallRoomProp5And7(); gUpdateVisibleTiles = 0; @@ -381,32 +381,32 @@ void sub_080801BC(RoomControls* controls) { s32 iVar7; s32 temp; - controls->filler2[0] += 6; - controls->filler2[1] = (controls->filler2[0] << 1) / 3; - if (0x1e < controls->filler2[0]) { + controls->unk_18 += 6; + controls->unk_1a = (controls->unk_18 << 1) / 3; + if (0x1e < controls->unk_18) { iVar2 = controls->camera_target->x.HALF.HI - controls->scroll_x; - uVar6 = (iVar2 - controls->filler2[0]); + uVar6 = (iVar2 - controls->unk_18); if (uVar6 < 0) { uVar6 = 0; } - iVar7 = iVar2 + controls->filler2[0]; + iVar7 = iVar2 + controls->unk_18; if (DISPLAY_WIDTH < iVar7) { iVar7 = DISPLAY_WIDTH; } temp = controls->camera_target->y.HALF.HI - controls->scroll_y; - uVar5 = (temp - controls->filler2[1]); + uVar5 = (temp - controls->unk_1a); if (uVar5 < 0) { uVar5 = 0; } - iVar3 = temp + controls->filler2[1]; + iVar3 = temp + controls->unk_1a; if (DISPLAY_HEIGHT < iVar3) { iVar3 = DISPLAY_HEIGHT; } gScreen.controls.window1HorizontalDimensions = ((uVar6 & 0xff) << 8) | (iVar7 & 0xff); gScreen.controls.window1VerticalDimensions = ((uVar5 & 0xff) << 8) | (iVar3 & 0xff); } - if (controls->filler2[2] == 0) { - controls->unk3 = 0; + if (controls->unk_1c == 0) { + controls->scrollAction = 0; controls->reload_flags = 0; ResetSystemPriority(); gScreen.lcd.displayControl &= ~DISPCNT_WIN1_ON; @@ -414,7 +414,7 @@ void sub_080801BC(RoomControls* controls) { gScreen.controls.windowOutsideControl &= 0xff00; } else { gUpdateVisibleTiles = 4; - controls->filler2[2] = 0; + controls->unk_1c = 0; } } @@ -461,7 +461,7 @@ void UpdateIsDiggingCave(void) { void ClearTilemaps(void) { MemClear(&gRoomControls, sizeof(gRoomControls)); MemClear(&gDiggingCaveEntranceTransition, sizeof(gDiggingCaveEntranceTransition)); - gRoomControls.filler3 = 0xffff; + gRoomControls.unk_22 = 0xffff; gDiggingCaveEntranceTransition.previousArea = 0xff; gUnk_02034480.unk_00 = 0; MemClear(&gMapDataBottomSpecial, 0x8000); @@ -630,8 +630,8 @@ void sub_0808091C(const ScreenTransitionData* screenTransition, u32 transitionTy } void sub_08080930(u32 unused) { - gRoomControls.unk3 = 5; - gRoomControls.unk4 = 0; + gRoomControls.scrollAction = 5; + gRoomControls.scrollSubAction = 0; gRoomControls.reload_flags = 2; gRoomControls.scroll_direction = 0; SetInitializationPriority(); @@ -821,8 +821,8 @@ NONMATCH("asm/non_matching/scroll/sub_08080CB4.inc", void sub_08080CB4(Entity* t if (this->type != this->animIndex) { InitAnimationForceUpdate(this, this->type); if (this->type == 0x5c) { - const struct_080C9CBC* ptr = &gUnk_080C9CBC[this->type2]; - this->palette.raw = ((ptr->unk0 & 0xf) << 4) | ptr->unk0; + const KinstoneWorldEvent* ptr = &gKinstoneWorldEvents[this->type2]; + this->palette.raw = ((ptr->objPalette & 0xf) << 4) | ptr->objPalette; } } else { diff --git a/src/staffroll.c b/src/staffroll.c index 0d64b765..65d2ad5a 100644 --- a/src/staffroll.c +++ b/src/staffroll.c @@ -1,13 +1,18 @@ -#include "global.h" -#include "room.h" +/** + * @file staffroll.c + * @ingroup Tasks + * + * @brief Staffroll task + */ +#include "common.h" +#include "fileselect.h" +#include "flags.h" +#include "game.h" #include "main.h" +#include "menu.h" +#include "room.h" #include "save.h" -#include "flags.h" -#include "fileselect.h" #include "screen.h" -#include "common.h" -#include "menu.h" -#include "game.h" #include "subtask.h" typedef struct { @@ -125,7 +130,7 @@ void StaffrollTask_State1MenuType2(void) { switch (gStaffrollMenu.base.overlayType) { case 0: MemClear(&gBG1Buffer, sizeof(gBG1Buffer)); - sub_0805F46C(gStaffrollMenu.unk_10, (Font*)gUnk_081272E0[gStaffrollMenu.unk_19]); + ShowTextBox(gStaffrollMenu.unk_10, gUnk_081272E0[gStaffrollMenu.unk_19]); gScreen.bg1.updated = 1; gStaffrollMenu.base.overlayType++; gStaffrollMenu.unk_18 = 0; diff --git a/src/sub_08055E08.c b/src/sub_08055E08.c deleted file mode 100644 index 7f9b9438..00000000 --- a/src/sub_08055E08.c +++ /dev/null @@ -1,36 +0,0 @@ -#include "global.h" -#include "menu.h" -#include "room.h" -#include "functions.h" -#include "screen.h" - -extern void (*const gUnk_080FF420[])(void); -extern void sub_0804B0B0(u32, u32); -extern void sub_08055B70(u32, u32, u32, u32); - -struct { - /*0x00*/ u8 unk0; - /*0x10*/ u8 filler1[0x1B]; - /*0x1c*/ u8 unk1C; - /*0x1d*/ u8 unk1D; - /*0x1e*/ u8 unk1E; - /*0x1f*/ u8 unk1F; -} gUpdateVisibleTiles; - -extern EntityData gUnk_080FF400; - -void sub_08055E08(void) { - gUnk_080FF420[gMenu.overlayType](); -} - -void sub_08055E24(void) { - gMenu.overlayType++; - gUpdateVisibleTiles.unk0 = 1; - sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]); - LoadRoomEntityList(&gUnk_080FF400); - sub_08055B70(gMenu.field_0x4, 0, 0, 0); - SetFade(FADE_INSTANT, 0x10); -} - -void nullsub_493(void) { -} diff --git a/src/subtask.c b/src/subtask.c index 950e7f3f..054d0c05 100644 --- a/src/subtask.c +++ b/src/subtask.c @@ -1,857 +1,297 @@ -#include "asm.h" #include "common.h" -#include "effects.h" -#include "fade.h" +#include "fileselect.h" #include "flags.h" #include "functions.h" -#include "global.h" +#include "game.h" +#include "item.h" +#include "itemMetaData.h" #include "kinstone.h" -#include "manager/bombableWallManager.h" +#include "main.h" #include "menu.h" #include "message.h" -#include "object.h" -#include "room.h" #include "save.h" #include "screen.h" -#include "sound.h" +#include "subtask.h" +#include "ui.h" -extern void (*const gUnk_080FEEB8[])(void); +extern u8 gUnk_020350F0[]; +extern Screen gUnk_03001020; +extern u8 gPaletteBufferBackup[]; +extern u8 gUnk_03000420[]; -extern void sub_0801876C(u32, u32); +void sub_080A70AC(const KeyButtonLayout* layout); +void sub_080A5F48(u32, u32); -extern u8 gUpdateVisibleTiles; -void sub_08055B70(u32, u32, u32, u32); +extern void sub_0805E974(void); +extern bool32 sub_080A51F4(void); +extern u32 sub_0807CB24(u32, u32); -extern void sub_08054974(u32, u32); +extern void (*const gUnk_0812901C[])(void); -extern void (*const gUnk_080FEEC8[])(void); +void sub_080A74F4(void); -void sub_080553E0(u32); +extern void UpdateCarriedObject(void); -extern void (*const gUnk_080FEF34[])(void); +extern void (*const gSubtasks[])(void); -extern EntityData gUnk_080FEED4[]; +// subtaskUtils? menuUtils? -extern void (*const gUnk_080FEF3C[])(void); +u32 sub_080A6F40(void) { + extern u8 gUnk_08128F38[]; + int iVar1; + u8* pcVar2; + u32 uVar3; + u32 uVar4; -extern void sub_0804B0E8(u32, u32); - -extern void (*const gUnk_080FF120[])(void); - -extern EntityData* gUnk_080FF108[]; - -extern void (*const gUnk_080FF148[])(void); - -extern EntityData gUnk_080FF128[]; - -extern void (*const gUnk_080FF174[])(void); - -extern EntityData gUnk_080FF154[]; - -extern void (*const gUnk_080FF1CC[])(void); - -extern EntityData gUnk_080FF17C[]; - -extern void (*const gUnk_080FF1F4[])(void); - -extern const s16 gUnk_080FF1D4[]; - -extern const u16 gUnk_080FF204[]; - -extern void (*const gUnk_080FF228[])(void); - -extern void (*const gUnk_080FF238[])(void); - -extern void (*const gUnk_080FF254[])(void); - -extern void (*const gUnk_080FF284[])(void); - -extern const EntityData gUnk_080FF264[]; - -extern void (*const gUnk_080FF28C[])(void); - -extern void sub_08054A14(u32); - -extern const EntityData gUnk_080FEE48[]; - -extern void (*const gUnk_080FF2B8[])(void); - -extern const EntityData gUnk_080FF298[]; - -extern void (*const gUnk_080FF300[])(void); - -extern const EntityData gUnk_080FF2C0[]; - -extern void (*const gUnk_080FF328[])(void); - -extern const EntityData gUnk_080FF308[]; - -extern void (*const gUnk_080FF330[])(void); - -void sub_08055994(void); - -extern void (*const gUnk_080FF35C[])(void); - -extern const EntityData gUnk_080FF33C[]; - -extern void (*const gUnk_080FF36C[])(void); - -extern const EntityData gUnk_080FED18[]; - -extern const EntityData gUnk_080FF378[]; - -extern void (*const gUnk_080FF3F4[])(void); - -void sub_08054C04(void) { - gUnk_080FEEB8[gMenu.overlayType](); -} - -void sub_08054C20(void) { - sub_08055B70(gMenu.field_0x4, 0, 0, 0); - sub_0801876C(gMenu.field_0x4, 0); - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - SetFade(FADE_INSTANT, 0x10); -} - -void sub_08054C58(void) { - if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { - SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10); - gMenu.overlayType++; - } -} - -void sub_08054C88(void) { - if (gFadeControl.active == 0) { - sub_08054974(gMenu.field_0x4, 0); - SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10); - SoundReq(SFX_SECRET_BIG); - gMenu.overlayType++; - gMenu.transitionTimer = 120; - } -} - -void sub_08054CC0(void) { - if ((gFadeControl.active == 0) && (--gMenu.transitionTimer == 0)) { - gMenu.menuType++; - } -} - -void sub_08054CE8(void) { - gUnk_080FEEC8[gMenu.overlayType](); -} - -void sub_08054D04(void) { - sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]); - sub_08055B70(gMenu.field_0x4, 0, 0, 0); - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - SetFade(FADE_INSTANT, 0x10); -} - -void sub_08054D3C(void) { - if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { - sub_0801876C(gMenu.field_0x4, 1); - sub_080553E0(gMenu.field_0x4); - gMenu.overlayType++; - gMenu.transitionTimer = 120; - } -} - -void sub_08054D74(void) { - if (--gMenu.transitionTimer == 0) { - gMenu.menuType++; - } -} - -void sub_08054D90(void) { - gUnk_080FEF34[gMenu.overlayType](); -} - -void sub_08054DAC(void) { - sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]); - LoadRoomEntityList(gUnk_080FEED4); - sub_0805B4D0(2); - sub_0806D0B0(NULL); - sub_08055B70(gMenu.field_0x4, 0, 0, 0); - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - SetFade(FADE_INSTANT, 0x10); -} - -void nullsub_484(void) { -} - -void sub_08054E00(void) { - gUnk_080FEF3C[gMenu.overlayType](); -} - -void sub_08054E1C(void) { - u8* ptr = gMenu.field_0xc; - sub_0804B0B0(ptr[2], ptr[3]); - sub_0804B0E8(ptr[2], ptr[3]); - sub_08055B70(gMenu.field_0x4, 0, 0, 0); - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - SetFade(FADE_INSTANT, 0x10); -} - -void sub_08054E5C(void) { - if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { - gMenu.overlayType++; - gMenu.transitionTimer = 180; - SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10); - sub_080553E0(gMenu.field_0x4); - sub_0801876C(gMenu.field_0x4, 1); - } -} - -void sub_08054E9C(void) { - if (--gMenu.transitionTimer == 0) { - gMenu.menuType++; - } -} - -void sub_08054EB8(Entity* this, ScriptExecutionContext* context) { - BombableWallManager* manager = (BombableWallManager*)GetEmptyManager(); - if (manager != NULL) { - manager->base.kind = MANAGER; - manager->base.id = BOMBABLE_WALL_MANAGER; - manager->x = this->x.HALF.HI - gRoomControls.origin_x; - manager->y = (this->y.HALF.HI - gRoomControls.origin_y) - 0x10; - manager->field_0x35 = 1; -#if defined(EU) || defined(JP) || defined(DEMO_JP) - manager->field_0x3e = 0x77; -#else - manager->field_0x3e = 0x79; -#endif - AppendEntityToList((Entity*)manager, 6); - } -} - -void sub_08054EFC(Entity* this) { - Entity* effect; - u32 tmp = COORD_TO_TILE(this) - 0x40; - SetTile(0x4074, tmp, 1); - this->collisionLayer = 2; - UpdateSpriteForCollisionLayer(this); - effect = CreateFx(this, FX_BIG_EXPLOSION, 0); - if (effect != NULL) { - effect->y.HALF.HI -= 0x10; - SortEntityBelow(this, effect); - } - SoundReq(SFX_ITEM_BOMB_EXPLODE); -} - -void sub_08054F64(Entity* this, ScriptExecutionContext* context) { - u32 tmp = this->type2; - if ((gActiveScriptInfo.syncFlags & tmp) != tmp) { - gActiveScriptInfo.commandSize = 0; - } else { - gActiveScriptInfo.syncFlags &= ~tmp; - gActiveScriptInfo.flags |= 1; - } -} - -void sub_08054F90(void) { - gUnk_080FF120[gMenu.overlayType](); -} - -void sub_08054FAC(void) { - u8* ptr; - u32 tmp; - - ptr = gMenu.field_0xc; - LoadRoomEntityList(gUnk_080FF108[ptr[1]]); - if (ptr[1] != 0) { - tmp = 3; - } else { - tmp = 0; - } - sub_08055B70(gMenu.field_0x4, tmp, 0, 0); - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - SetFade(FADE_INSTANT, 0x10); - gMenu.field_0xa = 0; - if (CheckLocalFlagByBank(FLAG_BANK_4, 0x77) && (ptr[2] == 0x2f)) { - gMenu.field_0xa = 1; + for (uVar3 = 0, pcVar2 = gUnk_08128F38, uVar4 = 0; *pcVar2 != 0; uVar3++, pcVar2 += 2) { + uVar4 |= sub_0807CB24(*pcVar2, pcVar2[1]) << uVar3; } + return ~uVar4; } -void sub_08055014(void) { - if (gMenu.field_0xa != 0) { - gMenu.field_0xa = 0; - SetTileType(0x74, 0x407, 1); - } -} - -void sub_08055038(void) { - gUnk_080FF148[gMenu.overlayType](); -} - -void sub_08055054(void) { - LoadRoomEntityList(gUnk_080FF128); - sub_08055B70(gMenu.field_0x4, 2, 0, 0); - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - SetFade(FADE_INSTANT, 0x10); -} - -void sub_0805508C(void) { -} - -void sub_08055090(void) { -} - -void sub_08055094(void) { - gUnk_080FF174[gMenu.overlayType](); -} - -void sub_080550B0(void) { - sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]); - LoadRoomEntityList(gUnk_080FF154); - sub_08055B70(gMenu.field_0x4, 0, 0, 0); - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - SetFade(FADE_INSTANT, 0x10); -} - -void nullsub_487(void) { -} - -void sub_080550F8(void) { - gUnk_080FF1CC[gMenu.overlayType](); -} - -void sub_08055114(void) { - LoadRoomEntityList(gUnk_080FF17C); - if (gSave.global_progress != 9) { - sub_08018C58(0xdb4); - } - sub_08055B70(gMenu.field_0x4, 0, 0, 0); - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - SetFade(FADE_INSTANT, 0x10); -} - -void nullsub_488(void) { -} - -void sub_08055168(void) { - gUnk_080FF1F4[gMenu.overlayType](); -} - -void sub_08055184(void) { - const s16* ptr = &gUnk_080FF1D4[(gMenu.field_0xc[1] & 0xf) * 3]; - LoadGfxGroup(ptr[0]); - gScreen.bg3.xOffset = ptr[1]; - gScreen.bg3.yOffset = ptr[2]; - gScreen.bg3.control = 0x1e05; - gScreen.controls.layerFXControl = 0x3648; - gScreen.controls.alphaBlend = 0x10; - gScreen.lcd.displayControl |= 0x800; - sub_0801876C(gMenu.field_0x4, 1); - sub_08055B70(gMenu.field_0x4, 0, 0, 0); - gMenu.overlayType++; - gMenu.storyPanelIndex = 0; - gMenu.transitionTimer = 60; - gMenu.field_0xa = 0; - gUpdateVisibleTiles = 1; - SetFade(FADE_INSTANT, 0x10); -} - -void sub_08055224(void) { - if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { - gMenu.overlayType++; - } -} - -void sub_0805524C(void) { - if (gMenu.storyPanelIndex == 0) { - gMenu.transitionTimer--; - if (gMenu.transitionTimer == 0) { - u32 tmp = gMenu.storyPanelIndex; - gMenu.storyPanelIndex = tmp + 1; - SoundReq(SFX_EVAPORATE); +void sub_080A6F6C(u32 textIndexOrPtr) { + extern Font gUnk_08128FA8; + if (gGenericMenu.unk2e.HWORD != textIndexOrPtr) { + gGenericMenu.unk2e.HWORD = textIndexOrPtr; + MemClear(gUnk_020350F0, 0x100); + if ((textIndexOrPtr & 0xff) != 0) { + ShowTextBox(textIndexOrPtr, &gUnk_08128FA8); } - } else if ((gRoomTransition.frameCount & 7U) == 0) { - if (gUnk_080FF204[gMenu.field_0xa] != 0xffff) { - gScreen.controls.alphaBlend = gUnk_080FF204[gMenu.field_0xa++]; - } else { - gScreen.lcd.displayControl &= 0xf7ff; - gScreen.controls.alphaBlend = 0x1000; - gMenu.transitionTimer = 120; - gMenu.overlayType++; -#ifndef EU - SoundReq(SFX_SECRET_BIG); -#endif + gScreen.bg0.updated = 1; + } + gScreen.bg0.yOffset = 2; +} + +void sub_080A6FB4(u32 param_1, u32 param_2) { + extern u16 gUnk_08128FF0[]; + extern Font gUnk_08128FD8; + extern Font gUnk_08128FC0; + u32 textIndexOrPtr; + Font* font; + + textIndexOrPtr = 0; + switch (param_2) { + case 0: + if ((gSave.windcrests & (1 << param_1)) == 0) + break; + case 2: + textIndexOrPtr = gUnk_08127F94[param_1]._6; + font = &gUnk_08128FC0; + break; + case 1: + textIndexOrPtr = gUnk_08128FF0[param_1]; + font = &gUnk_08128FD8; + break; + } + + if (gGenericMenu.unk2e.HWORD != textIndexOrPtr) { + gGenericMenu.unk2e.HWORD = textIndexOrPtr; + MemClear(&gUnk_020350F0, 0x100); + if ((textIndexOrPtr & 0xff) != 0) { + ShowTextBox(textIndexOrPtr, font); } + gScreen.bg0.updated = 1; } + gScreen.bg0.yOffset = 2; } -void sub_080552E0(void) { - if (--gMenu.transitionTimer == 0) { - gMenu.menuType++; - } -} - -void sub_080552FC(void) { - gUnk_080FF228[gMenu.overlayType](); -} - -void sub_08055318(void) { - sub_08055B70(gMenu.field_0x4, 0, 0, 0); - sub_0801876C(gMenu.field_0x4, 0); - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - SetFade(FADE_INSTANT, 0x10); -} - -void sub_08055350(void) { - if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { - SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10); - gMenu.overlayType++; - } -} - -void sub_08055380(void) { - if (gFadeControl.active == 0) { - sub_08054974(gMenu.field_0x4, 0); - SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10); - SoundReq(SFX_SECRET_BIG); - gMenu.overlayType++; - gMenu.transitionTimer = 120; - } -} - -void sub_080553B8(void) { - if ((gFadeControl.active == 0) && (--gMenu.transitionTimer == 0)) { - gMenu.menuType++; - } -} - -void sub_080553E0(u32 param_1) { - u8* ptr = gMenu.field_0xc; - Entity* effect = CreateObject(SPECIAL_FX, FX_BIG_EXPLOSION2, 0); - if (effect != NULL) { - effect->x.HALF.HI = *(s16*)(ptr + 8) + gRoomControls.origin_x; - effect->y.HALF.HI = *(s16*)(ptr + 10) + gRoomControls.origin_y; - } -} - -void sub_08055414(void) { - gUnk_080FF238[gMenu.overlayType](); -} - -void sub_08055430(void) { - sub_0804B0E8(gMenu.field_0xc[2], gMenu.field_0xc[3]); - sub_08055B70(gMenu.field_0x4, 0, 0, 0); - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - SetFade(FADE_INSTANT, 0x10); -} - -void sub_08055468(void) { - if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { - SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10); - gMenu.overlayType++; - } -} - -void sub_08055498(void) { - if (gFadeControl.active == 0) { - sub_0801876C(gMenu.field_0x4, 1); - sub_080553E0(gMenu.field_0x4); - SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10); - SoundReq(SFX_SECRET_BIG); - gMenu.overlayType++; - gMenu.transitionTimer = 120; - } -} - -void sub_080554D4(void) { - if ((gFadeControl.active == 0) && --gMenu.transitionTimer == 0) { - gMenu.menuType++; - } -} - -void sub_080554FC(void) { - extern void (*const gUnk_080FF248[])(void); - gUnk_080FF248[gMenu.overlayType](); -} - -void sub_08055518(void) { - sub_08055B70(gMenu.field_0x4, 0, 0, 0); - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - SetFade(FADE_INSTANT, 0x10); -} - -void sub_08055548(void) { - if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { - sub_0801876C(gMenu.field_0x4, 1); - sub_080553E0(gMenu.field_0x4); - gMenu.overlayType++; - gMenu.transitionTimer = 180; - } -} - -void sub_08055580(void) { - if (--gMenu.transitionTimer == 0) { - gMenu.menuType++; - } -} - -void sub_0805559C(void) { - gUnk_080FF254[gMenu.overlayType](); -} - -void sub_080555B8(void) { - u8* ptr = gMenu.field_0xc; - SetLocalFlagByBank(gLocalFlagBanks[gMenu.field_0xc[0x11]], (u32) * (u16*)(gMenu.field_0xc + 0x12)); - sub_0804B0E8(ptr[2], ptr[3]); - LoadGfxGroup(0x11); - sub_08055B70(gMenu.field_0x4, 0, 0, 0); - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - SetFade(FADE_INSTANT, 0x10); -} - -void sub_0805560C(void) { - if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { - gMenu.overlayType++; - } -} - -void sub_08055634(void) { - u8* ptr = gMenu.field_0xc; - Entity* obj = CreateObject(BEANSTALK, 0, 0); - if (obj != NULL) { - obj->x.HALF.HI = gRoomControls.origin_x + *(s16*)(ptr + 8); - obj->y.HALF.HI = gRoomControls.origin_y + *(s16*)(ptr + 10); - } - gMenu.overlayType++; - gMenu.transitionTimer = 390; -} - -void sub_08055674(void) { - if (--gMenu.transitionTimer == 0) { - gMenu.menuType++; - } -} - -void sub_08055690(void) { - gUnk_080FF284[gMenu.overlayType](); -} - -void sub_080556AC(void) { - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]); - LoadRoomEntityList((EntityData*)gUnk_080FF264); - sub_08055B70(gMenu.field_0x4, 0, 0, 0); - SetFade(FADE_INSTANT, 0x10); -} - -void nullsub_489(void) { -} - -void sub_080556F4(void) { - gUnk_080FF28C[gMenu.overlayType](); -} - -void sub_08055710(void) { - Entity* entity; - - sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]); - entity = LoadRoomEntity((EntityData*)gUnk_080FEE48); - if (entity != NULL) { - entity->type2 = 2; - entity->field_0x86.HWORD = 0x80ff; - } - sub_08054A14(gMenu.field_0x4); - sub_08055B70(gMenu.field_0x4, 0, 0, 0); - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - SetFade(FADE_INSTANT, 0x10); -} - -void sub_0805576C(void) { - if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { - gMenu.overlayType++; - gMenu.transitionTimer = 120; - } -} - -void sub_08055798(void) { - if (--gMenu.transitionTimer == 0) { - gMenu.menuType++; - } -} - -void sub_080557B4(void) { - gUnk_080FF2B8[gMenu.overlayType](); -} - -void sub_080557D0(void) { - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - sub_0804B0B0((u32)gMenu.field_0xc[2], gMenu.field_0xc[3]); - LoadRoomEntityList((EntityData*)gUnk_080FF298); - sub_08055B70(gMenu.field_0x4, 0, 0, 0); - SetFade(FADE_INSTANT, 0x10); -} - -void nullsub_490(void) { -} - -void sub_08055818(void) { - gUnk_080FF300[gMenu.overlayType](); -} - -void sub_08055834(void) { - LoadRoomEntityList((EntityData*)gUnk_080FF2C0); - if (gSave.global_progress != 9) { - sub_08018C58(0xdb4); - } - sub_08055B70(gMenu.field_0x4, 1, 0, 0); - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - SetFade(FADE_INSTANT, 0x10); -} - -void nullsub_491(void) { -} - -void sub_08055888(void) { - gUnk_080FF328[gMenu.overlayType](); -} - -void sub_080558A4(void) { - sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]); - LoadRoomEntityList((EntityData*)gUnk_080FF308); - sub_08055B70(gMenu.field_0x4, 0, 0, 0); - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - SetFade(FADE_INSTANT, 0x10); -} - -void nullsub_492(void) { -} - -void sub_080558EC(void) { - gUnk_080FF330[gMenu.overlayType](); -} - -void sub_08055908(void) { - u8* ptr = gMenu.field_0xc; - sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]); - sub_0804B0E8(ptr[2], ptr[3]); - sub_08055B70(gMenu.field_0x4, 0, 0, 0); - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - SetFade(FADE_INSTANT, 0x10); +void sub_080A7040(u32 param_1) { + extern Font gUnk_08129004; + extern u8 gUnk_02022130[]; + if (gGenericMenu.unk2e.HWORD != param_1) { + gGenericMenu.unk2e.HWORD = param_1; + MemClear(gUnk_02022130, 0x300); + MemCopy(gUnk_02022130 - 0x200, (void*)0x600e000, 0x800); + if (GetInventoryValue(gUnk_08128D70[param_1].item) != 0) { + ShowTextBox(gUnk_08128D70[param_1].textIndex, &gUnk_08129004); + } + gScreen.bg1.yOffset = 3; + gScreen.bg1.updated = 1; + } +} + +void sub_080A70AC(const KeyButtonLayout* layout) { + MemClear(&gUnk_0200AF00.elements, 0x300); + gUnk_0200AF00.unk_13 = 0x7f; + gUnk_0200AF00.unk_14 = 0x7f; + gUnk_0200AF00.buttonX[0] = layout->aButtonX; + gUnk_0200AF00.buttonY[0] = (s8)layout->aButtonY; + gUnk_0200AF00.unk_30[0] = layout->aButtonText; + gUnk_0200AF00.buttonX[1] = layout->bButtonX; + gUnk_0200AF00.buttonY[1] = (s8)layout->bButtonY; + gUnk_0200AF00.unk_30[1] = layout->bButtonText; + gUnk_0200AF00.buttonX[2] = layout->rButtonX; + gUnk_0200AF00.buttonY[2] = (s8)layout->rButtonY; + gUnk_0200AF00.unk_32 = layout->rButtonText; + layout++; + do { + CreateUIElement(layout->aButtonX, layout->aButtonY); + layout = (KeyButtonLayout*)&layout->aButtonText; + } while ((s8)layout->aButtonX != -1); +} + +void SetMenuType(u32 menuType) { + gMenu.menuType = menuType; + gMenu.overlayType = 0; + gMenu.storyPanelIndex = 0; } -void sub_08055948(void) { - if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { - sub_08055994(); - gMenu.overlayType++; - gMenu.transitionTimer = 120; - } +void ResetUI(void) { + MemClear(&gUI, sizeof(gUI)); } -void sub_08055978(void) { - if (--gMenu.transitionTimer == 0) { - gMenu.menuType++; - } -} - -void sub_08055994(void) { - u32 layer; - TileEntity* ptr = &gUnk_080FEAC8[gMenu.field_0x4]; - if ((ptr->_6 & 1) != 0) { - layer = 2; +void MenuFadeIn(u32 param_1, u32 param_2) { + if (gUI.nextToLoad == 0) { + MemClear(&gUI, sizeof(gUI)); + gUI.lastState = param_1; + gUI.field_0x3 = param_2; + gUI.pauseFadeIn = gMain.substate; } else { - layer = 1; - } - SetTileType(0x73, (*(u16*)(gMenu.field_0xc + 8) >> 4 & 0x3f) | (*(u16*)(gMenu.field_0xc + 10) >> 4 & 0x3f) << 6, - layer); - sub_080553E0((u32)gMenu.field_0x4); - SoundReq(SFX_SECRET_BIG); -} - -void sub_080559E0(void) { - gUnk_080FF35C[gMenu.overlayType](); -} - -void sub_080559FC(void) { - if (gMenu.field_0xc[1] != 0) { - LoadRoomEntityList((EntityData*)gUnk_080FF33C); - } - sub_08055B70(gMenu.field_0x4, 0, 0, 0); - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - SetFade(FADE_INSTANT, 0x10); -} - -void sub_08055A3C(void) { - if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { - SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10); - gMenu.overlayType++; - } -} - -void sub_08055A6C(void) { - if (gFadeControl.active == 0) { - sub_0801876C(gMenu.field_0x4, 1); - sub_080553E0(gMenu.field_0x4); - SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10); - SoundReq(SFX_SECRET_BIG); - gMenu.overlayType++; - gMenu.transitionTimer = 120; + gUI.state = param_1; + gUI.field_0x5 = param_2; + gUI.nextToLoad = 1; // Subtask_Init + } + gUI.field_0x6 = 0; + gUI.fadeType = -1; + gUI.fadeInTime = 0x20; + gMain.substate = GAMEMAIN_SUBTASK; + SetFade(FADE_IN_OUT | FADE_INSTANT, 0x20); + gUnk_02018EB0.unk_0 = 0; + gUnk_02018EB0.unk_1 = 0; +} + +void sub_080A71A4(u32 param_1, u32 param_2, u32 param_3) { + if (gUI.nextToLoad == 0) { + gUI.unk_e = param_3; + } else { + gUI.unk_f = param_3; } + MenuFadeIn(param_1, param_2); } -void sub_08055AA8(void) { - if ((gFadeControl.active == 0) && --gMenu.transitionTimer == 0) { - gMenu.menuType++; - } +void sub_080A71C4(u32 param_1, u32 param_2, u32 fadeType, u32 param_4) { + MenuFadeIn(param_1, param_2); + gUI.fadeType = fadeType; + gUI.fadeInTime = param_4; } -void sub_08055AD0(void) { - gUnk_080FF36C[gMenu.overlayType](); +void Subtask_Exit(void) { + gUI.nextToLoad = 3; // Subtask_FadeOut + SetFade(FADE_IN_OUT | FADE_INSTANT, 0x20); } -void sub_08055AEC(void) { - Entity* entity; - sub_08055B70(gMenu.field_0x4, 0, 0, 0); - entity = LoadRoomEntity((EntityData*)&gUnk_080FED18[gMenu.field_0xc[1]]); - if (entity != NULL) { - entity->type2 = 1; +// Used by Subtask_FastTravel and EnterPortalSubtask? +void sub_080A71F4(const ScreenTransitionData* exitTransition) { + if (exitTransition != NULL) { + DoExitTransition(exitTransition); } - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - SetFade(FADE_INSTANT, 0x10); + DeleteAllEntities(); + sub_0805E974(); + DeleteAllEntities(); + gMain.state = GAMETASK_INIT; + gMain.substate = GAMEMAIN_INITROOM; } -void sub_08055B38(void) { - if (gFadeControl.active == 0) { - gMenu.transitionTimer = 120; - } -} - -void sub_08055B54(void) { - if (--gMenu.transitionTimer == 0) { - gMenu.menuType++; - } -} - -void sub_08055B70(u32 param_1, u32 param_2, u32 param_3, u32 param_4) { - u8* ptr = gMenu.field_0xc; - Entity* entity = LoadRoomEntity((EntityData*)&gUnk_080FF378[param_2]); - if (entity != NULL) { - entity->x.HALF.HI = *(s16*)(ptr + 8) + param_3 + gRoomControls.origin_x; - entity->y.HALF.HI = *(s16*)(ptr + 10) + param_4 + gRoomControls.origin_y; +void GameMain_Subtask(void) { + if (gUI.nextToLoad < 3) { + if (gUI.state != 0) { + gUI.field_0x3 = gUI.field_0x5; + gUI.lastState = gUI.state; + gUI.state = 0; + } } + gUnk_0812901C[gUI.nextToLoad](); } -void sub_08055BB0(void) { - extern void (*const gUnk_080FF3C8[])(void); - gUnk_080FF3C8[gMenu.overlayType](); -} - -void sub_08055BCC(void) { - sub_08055B70(gMenu.field_0x4, 0, 0, 0); - sub_0801876C(gMenu.field_0x4, 0); - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - SetFade(FADE_INSTANT, 0x10); -} - -void sub_08055C04(void) { - if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { - SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10); - gMenu.overlayType++; +void Subtask_FadeIn(void) { + if (!gFadeControl.active) { + MemCopy(&gScreen, &gUnk_03001020, sizeof(Screen)); + MemCopy(gPaletteBuffer, gPaletteBufferBackup, 0x400); + MemCopy(&gGFXSlots, &gUI.gfxSlotList, sizeof(GfxSlotList)); + MemCopy(gPaletteList, gUI.palettes, sizeof(gUI.palettes)); + MemCopy(&gRoomControls, &gUI.roomControls, sizeof(RoomControls)); + MemCopy(gUnk_03000420, gUI.unk_2a8, sizeof(gUI.unk_2a8)); + MemCopy(&gActiveScriptInfo, &gUI.activeScriptInfo, sizeof(ActiveScriptInfo)); + sub_0805E958(); + gUI.unk_d = gRoomTransition.field_0x2c[2]; + gUI.controlMode = gPlayerState.controlMode; + gUI.currentRoomProperties = gCurrentRoomProperties; + gUI.mapBottomBgSettings = gMapBottom.bgSettings; + gUI.mapTopBgSettings = gMapTop.bgSettings; + gUI.nextToLoad = 1; // Subtask_Init } } -void sub_08055C34(void) { - u8* ptr; - Entity* entity; +void Subtask_Init(void) { if (gFadeControl.active == 0) { - ptr = gMenu.field_0xc; - sub_080553E0((u32)gMenu.field_0x4); - if ((ptr[1] & 0x80) != 0) { - sub_08054974(gMenu.field_0x4, 0); + DeleteAllEntities(); + MemClear(&gMenu, sizeof(FigurineMenu)); + MemClear(&gRoomControls, sizeof(gRoomControls)); + MemClear(gOAMControls.unk, 0x100); + MemClear(&gActiveScriptInfo, sizeof(gActiveScriptInfo)); + gActiveScriptInfo.fadeSpeed = 8; + DispReset(1); + MessageInitialize(); + ResetPalettes(); + ResetPaletteTable(0); + gGFXSlots.unk0 = 1; + gUI.nextToLoad = 2; // Subtask_Update + gRoomTransition.field_0x2c[3] = 1; + } +} + +void Subtask_FadeOut(void) { + if (!gFadeControl.active) { + DeleteAllEntities(); + sub_0805E974(); + gCurrentRoomProperties = gUI.currentRoomProperties; + gPlayerState.controlMode = gUI.controlMode; + gMapBottom.bgSettings = gUI.mapBottomBgSettings; + gMapTop.bgSettings = gUI.mapTopBgSettings; + MemCopy(&gUI.activeScriptInfo, &gActiveScriptInfo, sizeof(ActiveScriptInfo)); + MemCopy(gUI.unk_2a8, gUnk_03000420, sizeof(gUI.unk_2a8)); + MemCopy(gUI.palettes, gPaletteList, sizeof(gUI.palettes)); + MemCopy(&gUI.gfxSlotList, &gGFXSlots, sizeof(gGFXSlots)); + MemCopy(&gUI.roomControls, &gRoomControls, sizeof(RoomControls)); + MemCopy(&gUnk_03001020, &gScreen, sizeof(Screen)); + gArea.localFlagOffset = GetFlagBankOffset(gRoomControls.area); + gArea.pCurrentRoomInfo = GetCurrentRoomInfo(); + RestoreGameTask(gUI.field_0x6); + sub_0801D000(gUI.unk_d != 0); + sub_080A74F4(); + if (gUI.fadeType != 0xffff) { + SetFade(gUI.fadeType, gUI.fadeInTime); } else { - entity = FindEntity(OBJECT, TREE_THORNS, 6, 0, ptr[1] & 0x80); - if (entity != NULL) { - DeleteEntity(entity->child); - DeleteEntity(entity); - } + SetFadeInverted(gUI.fadeInTime); } - SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10); - SoundReq(SFX_SECRET_BIG); - gMenu.overlayType++; - gMenu.transitionTimer = 120; + gUI.nextToLoad = 4; // Subtask_Die + gRoomTransition.field_0x2c[3] = 0; } } -void sub_08055CB0(void) { - if ((gFadeControl.active == 0) && --gMenu.transitionTimer == 0) { - gMenu.menuType++; - } -} - -void sub_08055CD8(void) { - extern void (*const gUnk_080FF3E8[])(void); - gUnk_080FF3E8[gMenu.overlayType](); -} - -void sub_08055CF4(void) { - sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]); - sub_08055B70(gMenu.field_0x4, 0, 0, 0); - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - SetFade(FADE_INSTANT, 0x10); -} - -void sub_08055D2C(void) { - if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { - sub_0801876C(gMenu.field_0x4, 1); - sub_080553E0(gMenu.field_0x4); - gMenu.overlayType++; - gMenu.transitionTimer = 120; - } -} - -void sub_08055D64(void) { - if (--gMenu.transitionTimer == 0) { - gMenu.menuType++; +void Subtask_Die(void) { + sub_080A74F4(); + if (gFadeControl.active == 0) { + gMain.substate = gUI.pauseFadeIn; + gUI.nextToLoad = gFadeControl.active; + gUI.lastState = gFadeControl.active; + ResetSystemPriority(); } } -void sub_08055D80(void) { - gUnk_080FF3F4[gMenu.overlayType](); -} - -void sub_08055D9C(void) { - gMenu.overlayType++; - gUpdateVisibleTiles = 1; - SetFade(FADE_INSTANT, 0x10); -} - -void sub_08055DC0(void) { - if (gFadeControl.active == 0) { - MessageFromTarget(TEXT_INDEX(TEXT_EMPTY, 0x01)); - gMenu.overlayType++; - gMenu.transitionTimer = 120; - } +void sub_080A74F4(void) { + SetInitializationPriority(); + gMain.pad = 0; + FlushSprites(); + UpdateEntities(); + UpdateManagers(); + DrawUI(); + DrawUIElements(); + UpdateCarriedObject(); + DrawEntities(); + CopyOAM(); } -void sub_08055DEC(void) { - if (--gMenu.transitionTimer == 0) { - gMenu.menuType++; - } +void Subtask_Update(void) { + gSubtasks[gUI.lastState](); } diff --git a/src/subtask/subtaskAuxCutscene.c b/src/subtask/subtaskAuxCutscene.c new file mode 100644 index 00000000..f916ae62 --- /dev/null +++ b/src/subtask/subtaskAuxCutscene.c @@ -0,0 +1,157 @@ +/** + * @file subtaskAuxCutscene.c + * + * @brief Aux Cutscene Subtask + */ +#include "area.h" +#include "asm.h" +#include "common.h" +#include "fileselect.h" +#include "flags.h" +#include "functions.h" +#include "game.h" +#include "main.h" +#include "menu.h" +#include "message.h" +#include "room.h" +#include "screen.h" +#include "sound.h" +#include "subtask.h" + +typedef void(AuxCutsceneState)(void); +typedef void(CutsceneMainState)(void); + +static AuxCutsceneState AuxCutscene_Init; +static AuxCutsceneState AuxCutscene_Main; +static AuxCutsceneState AuxCutscene_Exit; + +CutsceneMainState CutsceneMain_Init; +CutsceneMainState CutsceneMain_Update; +CutsceneMainState CutsceneMain_Exit; + +typedef struct { + u8 area; + RoomID room : 8; + u8 _2; + u8 _3; + u16 x; + u16 y; +} CutsceneData; +static const CutsceneData sCutsceneData[]; + +void Subtask_AuxCutscene(void) { + static AuxCutsceneState* const sStates[] = { + AuxCutscene_Init, + AuxCutscene_Main, + AuxCutscene_Exit, + }; + + sStates[gMenu.menuType](); +} + +static void AuxCutscene_Init(void) { + const CutsceneData* p = &sCutsceneData[gUI.field_0x3]; + gRoomControls.area = p->area; + gRoomControls.room = p->room; + LoadGfxGroups(); + gArea.localFlagOffset = GetFlagBankOffset(gRoomControls.area); + SetCurrentRoomPropertyList(p->area, p->room); + LoadAuxiliaryRoom(p->area, p->room); + gRoomControls.scroll_x = gRoomControls.origin_x + p->x; + gRoomControls.scroll_y = gRoomControls.origin_y + p->y; + gMenu.field_0x0 = p->_2; + gMenu.field_0x3 = p->_3 & 0xf; + gMenu.field_0xc = (void*)p; + gMenu.menuType++; + gMenu.overlayType = 0; + gMenu.transitionTimer = 300; + AuxCutscene_Main(); // init +} + +static void AuxCutscene_Main(void) { + static CutsceneMainState* const sStates[] = { + CutsceneMain_Init, + CutsceneMain_Update, + CutsceneMain_Exit, + }; + + sStates[gMenu.field_0x0](); + FlushSprites(); + UpdateEntities(); + DrawEntities(); + CopyOAM(); + UpdateScroll(); + UpdateBgAnimations(); + UpdateManagers(); + UpdateScrollVram(); +} + +static const CutsceneData sCutsceneData[] = { + { AREA_MINISH_WOODS, 0, 0, 0, 336, 528 }, + { AREA_HYRULE_FIELD, 1, 1, 0, 472, 312 }, + { AREA_HYRULE_CASTLE, 2, 1, 1, 16, 16 }, + { AREA_SANCTUARY, 2, 1, 2, 0, 0 }, + { AREA_EZLO_CUTSCENE, 0, 1, 3, 0, 0 }, + { AREA_HOUSE_INTERIORS_2, 16, 1, 4, 0, 0 }, + { AREA_DARK_HYRULE_CASTLE_OUTSIDE, 0, 1, 5, 0, 40 }, + { AREA_FORTRESS_OF_WINDS, 28, 2, 0, 0, 0 }, + { AREA_FORTRESS_OF_WINDS, 29, 2, 1, 0, 0 }, + { AREA_DARK_HYRULE_CASTLE, 14, 2, 2, 16, 16 }, +}; + +static void AuxCutscene_Exit(void) { + u32 flag = sCutsceneData[gUI.field_0x3]._3; + if (flag & 0xF0) { + MenuFadeIn(2, flag >> 4); + } else { + gUI.nextToLoad = 3; // Subtask_FadeOut + SetFadeInverted(0x10); + MessageInitialize(); + } +} + +// end of auxCutscene? + +void sub_08051F78(void) { + u32 idx = gUI.field_0x3; + const CutsceneData* p = &sCutsceneData[idx]; + sub_08051F9C(p->area, p->room, p->x, p->y); +} + +void sub_08051F9C(u32 a1, u32 a2, u32 a3, u32 a4) { + u32 tmp = gScreen.lcd.displayControl & (DISPCNT_WIN0_ON | DISPCNT_WIN1_ON); + sub_08052FF4(a1, a2); + gRoomControls.scroll_x = gRoomControls.origin_x + a3; + gRoomControls.scroll_y = gRoomControls.origin_y + a4; + InitializeCamera(); + gUpdateVisibleTiles = 1; + gUsedPalettes = 0; + gScreen.lcd.displayControl |= tmp; +} + +void sub_08051FF0(void) { + sub_0804B0B0(gMenu.field_0xc[0], gMenu.field_0xc[1]); +} + +void sub_08052004(void) { + gMenu.menuType = 2; +} + +void sub_08052010(void) { + InitSoundPlayingInfo(); + MessageInitialize(); + DispReset(1); + MemClear(gBG1Buffer, sizeof(gBG1Buffer)); + MemClear(gBG2Buffer, sizeof(gBG2Buffer)); + sub_080A4D34(); + LoadPaletteGroup(0xA); + SetColor(0, 0); + LoadGfxGroup(4); + MemClear((void*)0x06000000, 0x20); + MemClear(&gGenericMenu, sizeof(gGenericMenu)); + gScreen.lcd.displayControl |= DISPCNT_OBJ_ON; + gScreen.bg1.control = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(28) | BGCNT_CHARBASE(0); + gScreen.bg2.control = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(29) | BGCNT_CHARBASE(1); + gScreen.bg1.updated = 1; + gScreen.bg2.updated = 1; +} diff --git a/src/subtask/subtaskFastTravel.c b/src/subtask/subtaskFastTravel.c new file mode 100644 index 00000000..0f657cb7 --- /dev/null +++ b/src/subtask/subtaskFastTravel.c @@ -0,0 +1,191 @@ +/** + * @file subtaskFastTravel.c + * @ingroup Subtasks + * + * @brief Fast Travel Subtask + */ +#include "subtask.h" +#include "common.h" +#include "menu.h" +#include "functions.h" +#include "message.h" +#include "sound.h" +#include "save.h" + +extern void (*const Subtask_FastTravel_Functions[])(void); +void sub_080A6E70(void); +u32 sub_080A6D74(u32); +void sub_080A6EE0(u32 param_1); + +extern const ScreenTransitionData gUnk_08128024[]; + +void Subtask_FastTravel(void) { + FlushSprites(); + Subtask_FastTravel_Functions[gMenu.menuType](); + if (gMenu.field_0x0 != 0) { + sub_080A6E70(); + } + sub_080A6498(); + CopyOAM(); +} + +void Subtask_FastTravel_0(void) { + sub_080A4D34(); + sub_080A4DB8(0xd); + sub_080A6290(); + gMenu.field_0x3 = sub_080A6D74(0); + SetMenuType(1); + SetFade(FADE_INSTANT, 8); +} + +void Subtask_FastTravel_1(void) { + u32 uVar1; + u32 uVar2; + + if (gFadeControl.active) { + return; + } + + gMenu.field_0x0 = 1; + uVar2 = 0; + + switch (gInput.newKeys) { + case DPAD_LEFT: + case DPAD_UP: + uVar2 = -1; + break; + case DPAD_RIGHT: + case DPAD_DOWN: + uVar2 = 1; + break; + case A_BUTTON: + case START_BUTTON: + gMenu.field_0x0 = 2; + SetMenuType(2); + MessageFromTarget(TEXT_INDEX(TEXT_WINDCRESTS, 0x04)); + break; + case B_BUTTON: + gMenu.field_0x0 = 3; + SetMenuType(3); + break; + } + + if (uVar2) { + uVar1 = sub_080A6D74(uVar2); + if (uVar1 != gMenu.field_0x3) { + gMenu.field_0x3 = uVar1; + SoundReq(SFX_TEXTBOX_CHOICE); + } + } +} + +u32 sub_080A6D74(u32 param_1) { + u32 uVar1; + u32 uVar2; + u32 uVar3; + + uVar3 = gSave.windcrests >> 0x18; + uVar2 = gMenu.field_0x3; + if (param_1 == 0) { + uVar2 = 0; + if ((uVar3 & 1) == 0) { + while (++uVar2 < 8 && ((1 << uVar2) & uVar3) == 0) {} + } + } else if (uVar3 != 0) { + do { + uVar2 = (uVar2 + param_1 + 8) & 7; + } while ((1 << uVar2 & uVar3) == 0); + } + return uVar2 & 7; +} + +void Subtask_FastTravel_2(void) { + u32 tmp; + switch (sub_08056338()) { +#ifdef EU + case 0: + gMenu.field_0x0 = 2; + break; + case 1: + gMenu.field_0x0 = 3; + tmp = 1; + break; + default: + return; + } + + if (tmp) { + SetMenuType(3); + } +#else + case 0: + gMenu.field_0x0 = 2; + tmp = 3; + break; + case 1: + tmp = 1; + break; + default: + return; + } + SetMenuType(tmp); +#endif +} + +void Subtask_FastTravel_3(void) { + if (gMenu.field_0x0 == 2) { + SetMenuType(4); + SetFade(FADE_IN_OUT | FADE_INSTANT, 8); + } else { + ResetPlayerAnimationAndAction(); + sub_080042D0(&gPlayerEntity, (u32)gPlayerEntity.animIndex, gPlayerEntity.spriteIndex); + Subtask_Exit(); + gPauseMenuOptions.disabled = 0; + SoundReq(SFX_MENU_CANCEL); + } +} + +void Subtask_FastTravel_4(void) { + if (gFadeControl.active == 0) { + sub_080A71F4(&gUnk_08128024[gMenu.field_0x3]); + } +} + +void sub_080A6E70(void) { + u32 frameIndex; + u32 i; + + gOamCmd._4 = 0; + gOamCmd._6 = 0; + gOamCmd._8 = 0x400; + gGenericMenu.unk2c++; + sub_080A6EE0(gMenu.field_0x3); + if ((gGenericMenu.unk2c & 0x10) != 0) { + frameIndex = 0x5d; + } else { + frameIndex = 0x5e; + } + + DrawDirect(DRAW_DIRECT_SPRITE_INDEX, frameIndex); + for (i = 0; i < 8; i++) { + if ((gSave.windcrests & (1 << (i + 0x18))) != 0) { + sub_080A6EE0(i); + DrawDirect(DRAW_DIRECT_SPRITE_INDEX, 0x5c); + } + } +} + +void sub_080A6EE0(u32 param_1) { + u32 x; + u32 y; + RoomHeader* roomHeader; + const ScreenTransitionData* ptr = &gUnk_08128024[param_1]; + + x = (u16)ptr->playerXPos; + y = (u16)ptr->playerYPos; + roomHeader = &gAreaRoomHeaders[ptr->area][ptr->room]; + x += roomHeader->map_x; + y += roomHeader->map_y; + gOamCmd.x = (s32)(x * DISPLAY_HEIGHT) / 0xf90 + 0x28; + gOamCmd.y = (s32)(y * DISPLAY_HEIGHT) / 0xf90 + 0xc; +} diff --git a/src/subtask/subtaskLocalMapHint.c b/src/subtask/subtaskLocalMapHint.c new file mode 100644 index 00000000..8f9bb133 --- /dev/null +++ b/src/subtask/subtaskLocalMapHint.c @@ -0,0 +1,96 @@ +/** + * @file subtaskLocalMapHint.c + * @ingroup Subtasks + * + * @brief Local Map Hint Subtask + */ +#include "menu.h" +#include "subtask.h" +#include "kinstone.h" +#include "functions.h" +#include "screen.h" +#include "sound.h" +#include "common.h" + +void Subtask_LocalMapHint() { + extern void (*const gUnk_08128F1C[])(void); + const struct_gUnk_08128E94* ptr; + FlushSprites(); + gUnk_08128F1C[gMenu.menuType](); + ptr = &gUnk_08128E94[gMenu.field_0x3]; + gScreen.bg1.yOffset = -ptr->unk5; + gScreen.bg2.yOffset = gMenu.field_0xa - (s8)ptr->unk6; + CopyOAM(); +} + +void sub_080A6B04(void) { + u32 bVar1; + u32 uVar2; + u32 uVar3; + u32 uVar4; + int uVar6; + u32 uVar7; + const KinstoneWorldEvent* ptr; + const WorldEvent* ptr2; + const struct_gUnk_08128E94* ptr3; + + sub_080A4D34(); + sub_080A4DB8(6); + ptr = &gKinstoneWorldEvents[gFuseInfo.kinstoneId]; + ptr2 = &gWorldEvents[ptr->worldEventId]; + bVar1 = ptr->unk7; + uVar3 = ptr2->_c; + uVar4 = ptr2->_e; + uVar2 = sub_080A6A80(uVar3, uVar4)->_4; + gMenu.field_0x3 = uVar2; + gGenericMenu.unk2b = 1; + sub_080A67C4(uVar2); + sub_080A6FB4(uVar2, 2); + SetColor(0, 0x475f); + SetColor(0x5f, 0x475f); + MemFill16(0x5001, &gBG3Buffer, sizeof(gBG3Buffer)); + if ((gPlayerState.flags & PL_NO_CAP) != 0) { + uVar7 = 101; + } else { + uVar7 = 100; + } + sub_080A698C(gRoomTransition.player_status.overworld_map_x, gRoomTransition.player_status.overworld_map_y, + DRAW_DIRECT_SPRITE_INDEX, uVar7 + 0x100); + sub_080A698C(uVar3, uVar4, DRAW_DIRECT_SPRITE_INDEX, bVar1 + 100); + uVar4 = sub_080A69E0(uVar3, uVar4) >> 0x10; + ptr3 = &gUnk_08128E94[gMenu.field_0x3]; + gMenu.field_0xa = 0; + if (ptr3->unk2 != 0) { + uVar6 = uVar4 - 0x3c; + if (uVar6 > 0) { + if (ptr3->unk2 < uVar6) { + uVar6 = ptr3->unk2; + } + gMenu.field_0xa = uVar6; + } + } + gMenu.transitionTimer = 30; + SetMenuType(1); + SetFade(FADE_INSTANT, 8); +} + +void sub_080A6C1C(void) { + if (!gFadeControl.active) { + switch (gMenu.transitionTimer) { + case 0: + sub_080A66D0(); + switch (gInput.newKeys) { + case A_BUTTON: + case B_BUTTON: + case START_BUTTON: + Subtask_Exit(); + break; + } + return; + case 1: + SoundReq(SFX_103); + break; + } + gMenu.transitionTimer--; + } +} diff --git a/src/subtask/subtaskMapHint.c b/src/subtask/subtaskMapHint.c new file mode 100644 index 00000000..2a802f2b --- /dev/null +++ b/src/subtask/subtaskMapHint.c @@ -0,0 +1,71 @@ +/** + * @file subtask.c + * @ingroup Subtasks + * + * @brief Map Hint Subtask + */ +#include "menu.h" +#include "functions.h" +#include "subtask.h" +#include "common.h" +#include "main.h" +#include "sound.h" +#include "save.h" +#include "flags.h" +#include "fileselect.h" +#include "kinstone.h" +#include "game.h" + +void sub_080A6438(); + +void Subtask_MapHint(void) { + extern void (*const Subtask_MapHint_Functions[])(void); + FlushSprites(); + Subtask_MapHint_Functions[gMenu.menuType](); + if ((gGenericMenu.unk2c & 0x20) != 0) { + sub_080A6438(); + } + sub_080A6498(); + CopyOAM(); +} + +void Subtask_MapHint_0(void) { + extern const u16 gUnk_08128F4C[]; + u32 val; + sub_080A4D34(); + sub_080A4DB8(4); + sub_080A6290(); + gScreen.lcd.displayControl = gScreen.lcd.displayControl & 0xf7ff; + SetColor(0, gPaletteBuffer[0x51]); + val = gUnk_08128F4C[gUI.field_0x3]; + gSave.field_0x20 |= val; + gGenericMenu.unk10.h[1] = val & gGenericMenu.unk10.h[0]; + gGenericMenu.unk10.h[0] = 0; + gMenu.transitionTimer = 60; + SetMenuType(1); + SetFade(FADE_INSTANT, 8); +} + +void Subtask_MapHint_1(void) { + if (!gFadeControl.active) { + gGenericMenu.unk2c++; + switch (gMenu.transitionTimer) { + case 0x1e: + gGenericMenu.unk10.h[0] = gGenericMenu.unk10.h[1]; + gGenericMenu.unk2c = 0x20; + SoundReq(SFX_103); + default: + gMenu.transitionTimer--; + break; + case 0: + switch (gInput.newKeys) { + case A_BUTTON: + case B_BUTTON: + case START_BUTTON: + Subtask_Exit(); + break; + } + break; + } + } +} diff --git a/src/subtask/subtaskWorldEvent.c b/src/subtask/subtaskWorldEvent.c new file mode 100644 index 00000000..bae3e921 --- /dev/null +++ b/src/subtask/subtaskWorldEvent.c @@ -0,0 +1,103 @@ +/** + * @file subtaskWorldEvent.c + * + * @brief World Event Subtask + */ +#include "area.h" +#include "asm.h" +#include "common.h" +#include "flags.h" +#include "functions.h" +#include "game.h" +#include "kinstone.h" +#include "main.h" +#include "menu.h" +#include "message.h" +#include "room.h" +#include "screen.h" +#include "subtask.h" + +void Subtask_WorldEvent_Update(void); + +extern void (*const gUnk_080FE2A0[])(void); +void Subtask_WorldEvent(void) { +#if !(defined(DEMO_USA) || defined(DEMO_JP)) + gUnk_080FE2A0[gMenu.menuType](); +#endif +} + +void Subtask_WorldEvent_Init(void) { + const WorldEvent* ptr = &gWorldEvents[gUI.field_0x3]; + gMenu.field_0x0 = ptr->type; + gMenu.field_0x3 = ptr->entity_idx; + gMenu.field_0x4 = gUI.field_0x3; + gMenu.field_0xc = (u8*)ptr; + gMenu.menuType++; + gMenu.overlayType = 0; + gMenu.transitionTimer = 300; + DispReset(0); + sub_08054974(gUI.field_0x3, 1); + sub_0806F364(); + ClearRoomFlag(0xff); + Subtask_WorldEvent_Update(); +} + +extern void (*const gWorldEventFunctions[])(void); + +void Subtask_WorldEvent_Update(void) { + gWorldEventFunctions[gMenu.field_0x0](); + FlushSprites(); + UpdateEntities(); + DrawEntities(); + CopyOAM(); + UpdateScroll(); + UpdateBgAnimations(); + UpdateScrollVram(); +} + +void Subtask_WorldEvent_End(void) { + MessageInitialize(); + sub_0806F38C(); + if (gKinstoneWorldEvents[gFuseInfo.kinstoneId].unk7 != 0) { + // Show the map hint. + MenuFadeIn(SUBTASK_LOCALMAPHINT, gUI.field_0x3); + } else { + gUI.nextToLoad = 3; // Subtask_FadeOut + SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10); + } +} + +void sub_08054968(void) { + gMenu.menuType = 2; +} + +// Controls showing the world event cutscene? +void sub_08054974(u32 worldEventId, bool32 param_2) { + const WorldEvent* ptr = &gWorldEvents[worldEventId]; + SetCurrentRoomPropertyList(ptr->area, ptr->room); + gRoomControls.area = ptr->area; + gRoomControls.room = ptr->room; + LoadGfxGroups(); + gArea.localFlagOffset = GetFlagBankOffset(gRoomControls.area); + if (param_2) { + LoadAuxiliaryRoom(ptr->area, ptr->room); + } else { + sub_08052FF4(ptr->area, ptr->room); + InitializeCamera(); + gUpdateVisibleTiles = 1; + } + gScreen.lcd.displayControl &= 0x1fff; + gRoomControls.scroll_x = gRoomControls.origin_x + ptr->offsetX; + gRoomControls.scroll_y = gRoomControls.origin_y + ptr->offsetY; + if (ptr->area == AREA_HYRULE_TOWN) { + TryLoadPrologueHyruleTown(); + } + sub_08018710(gUI.field_0x3); +} + +void sub_08054A14(s32 worldEventId) { + const WorldEvent* ptr = &gWorldEvents[worldEventId]; + if (ptr->bank < 0xe) { + SetLocalFlagByBank(gLocalFlagBanks[ptr->bank], ptr->flag); + } +} @@ -7,21 +7,10 @@ #include "message.h" #include "fileselect.h" -extern u16 gUnk_081092D4; -extern u8 gUnk_081094CE; extern u8 gUnk_02036AD8; extern u8 gUnk_02036A58; -extern void* gUnk_081092AC[]; -typedef struct { - u8 filler0[12][16]; -} VStruct; - -extern VStruct gUnk_0810942E[]; -extern u32 gUnk_0810926C[]; extern u32* Translations[]; -extern u32 gUnk_08109244; - typedef struct { u8 unk0; u8 unk1; @@ -29,7 +18,7 @@ typedef struct { void sub_0805F820(WStruct* r0, u32* r1); bool32 sub_0805EF40(Token* tok, const u8*); -void sub_0805F440(Token*, u8*); +void InitToken(Token* token, u32 textIndexOrPtr); u32 sub_0805F6A4(Token*, WStruct*); u32 GetCharacter(Token* tok); u32 GetFontStrWith(Token*, u32); @@ -55,10 +44,19 @@ typedef struct { extern struct_gUnk_02034330 gUnk_02034330; extern WStruct gUnk_02036540[4]; -extern u32* gUnk_08109248[]; -extern u8* gUnk_08109230[]; + extern u32* gTranslations[]; -extern u32 gUnk_08109244; +extern u8* gUnk_08109230[]; // TODO needs to be u8, but then is not passed correctly? +extern u32 gUnk_08109244; // TODO structure? +extern u32* gUnk_08109248[]; +extern u32 gUnk_0810926C[]; +extern void* gUnk_081092AC[]; // TODO structure? +extern u16 gUnk_081092D4; // TODO array? +typedef struct { + u8 filler0[12][16]; +} VStruct; +extern VStruct gUnk_0810942E[]; // TODO structure? +extern u8 gUnk_081094CE; // TODO structure? array? void sub_0805EEB4(Token* token, u32 textIndex) { u32 langIndex; @@ -424,16 +422,16 @@ u32 GetFontStrWith(Token* param_1, u32 param_2) { return rv; } -void sub_0805F440(Token* param_1, u8* param_2) { - MemClear(param_1, sizeof(Token)); - if ((u32)param_2 >= 0x10000) { - sub_0805EF40(param_1, param_2); +void InitToken(Token* token, u32 textIndexOrPtr) { + MemClear(token, sizeof(Token)); + if (textIndexOrPtr >= 0x10000) { + sub_0805EF40(token, (u8*)textIndexOrPtr); } else { - sub_0805EEB4(param_1, (u32)param_2); + sub_0805EEB4(token, textIndexOrPtr); } } -u32 sub_0805F46C(u32 param_1, const Font* param_2) { +u32 ShowTextBox(u32 textIndexOrPtr, const Font* paramFont) { u32 uVar1; WStruct* pWVar4; u32 uVar5; @@ -450,8 +448,8 @@ u32 sub_0805F46C(u32 param_1, const Font* param_2) { pWVar4 = sub_0805F2C8(); if (pWVar4 != NULL) { - MemCopy(param_2, &font, sizeof(Font)); - sub_0805F440(&token, (u8*)param_1); + MemCopy(paramFont, &font, sizeof(Font)); + InitToken(&token, textIndexOrPtr); token.unk05 = font.stylized & 3; pWVar4->unk04 = font.stylized; pWVar4->unk4 = font.width; @@ -482,16 +480,16 @@ u32 sub_0805F46C(u32 param_1, const Font* param_2) { font.dest++; } uVar8 = uVar8 >> 3; - param_1 = font.gfx_src; - DispMessageFrame(puVar9, uVar8, iVar10, param_1); + textIndexOrPtr = font.gfx_src; + DispMessageFrame(puVar9, uVar8, iVar10, textIndexOrPtr); puVar9 = puVar9 + 1; font.gfx_src = font.gfx_src + 7; - param_1 = font.gfx_src - 1; + textIndexOrPtr = font.gfx_src - 1; while (iVar10-- > 0) { puVar9 += 0x20; puVar6 = puVar9; for (uVar5 = uVar8; (s32)uVar5-- > 0;) { - *puVar6++ = param_1; + *puVar6++ = textIndexOrPtr; } } } @@ -602,14 +600,12 @@ u32 sub_0805F6A4(Token* param_1, WStruct* param_2) { return iVar4; } -u32 sub_0805F76C(u8* param_1, WStruct* param_2) { - u32 uVar1; - Token local_38; +u32 sub_0805F76C(u32 textIdOrPtr, WStruct* param_2) { + Token stackToken; - sub_0805F440(&local_38, param_1); - local_38.unk05 = param_2->unk04 & 3; - uVar1 = sub_0805F6A4(&local_38, param_2); - return uVar1; + InitToken(&stackToken, textIdOrPtr); + stackToken.unk05 = param_2->unk04 & 3; + return sub_0805F6A4(&stackToken, param_2); } static u32 sub_0805F7A0(u32 param_1) { diff --git a/src/title.c b/src/title.c index 28aae607..4473b24b 100644 --- a/src/title.c +++ b/src/title.c @@ -175,11 +175,11 @@ static void HandleNintendoCapcomLogos(void) { advance = ADVANCE_NONE; #if defined(DEMO_USA) if (gUnk_02000010.listenForKeyPresses == 0) { - if ((gInput.heldKeys & 0x204) == 0x204) { // TODO + if ((gInput.heldKeys & (L_BUTTON | SELECT_BUTTON)) == (L_BUTTON | SELECT_BUTTON)) { gUnk_02000010.field_0x7 = 1; SoundReq(SFX_SECRET_BIG); } else { - if ((gInput.heldKeys & 0x104) == 0x104) { // TODO + if ((gInput.heldKeys & (R_BUTTON | SELECT_BUTTON)) == (R_BUTTON | SELECT_BUTTON)) { gUnk_02000010.field_0x7 = 2; SoundReq(SFX_TASK_COMPLETE); } else { @@ -312,7 +312,7 @@ void DrawRupees(void) { } case 1: DrawDigits(0x70, gUnk_0200AF00.rupees, - gWalletSizes[(u32)gSave.stats.walletType * 2] <= gUnk_0200AF00.rupees, 3); + (u16)gWalletSizes[(u32)gSave.stats.walletType * 2] <= gUnk_0200AF00.rupees, 3); cVar1 = gUnk_0200AF00.unk_c + 1; default: gUnk_0200AF00.unk_c = cVar1; @@ -584,10 +584,10 @@ void DrawKeys(void) { ptr2->unk_6 = temp + 3; gScreen.bg0.updated = 1; } - if ((gUnk_0200AF00.unk_12 != gSave.unk45C[gArea.dungeon_idx]) || (gUnk_0200AF00.unk_10 == 0)) { + if ((gUnk_0200AF00.dungeonKeys != gSave.dungeonKeys[gArea.dungeon_idx]) || (gUnk_0200AF00.unk_10 == 0)) { gUnk_0200AF00.unk_10 = 2; - gUnk_0200AF00.unk_12 = gSave.unk45C[gArea.dungeon_idx]; - DrawDigits(0x76, gUnk_0200AF00.unk_12, 0, 2); + gUnk_0200AF00.dungeonKeys = gSave.dungeonKeys[gArea.dungeon_idx]; + DrawDigits(0x76, gUnk_0200AF00.dungeonKeys, 0, 2); } } } diff --git a/src/worldEvent/worldEvent0.c b/src/worldEvent/worldEvent0.c new file mode 100644 index 00000000..ac6d3bef --- /dev/null +++ b/src/worldEvent/worldEvent0.c @@ -0,0 +1,41 @@ +/** + * @file worldEvent0.c + * @ingroup WorldEvents + * + * @brief World Event 0 + */ +#include "fade.h" +#include "menu.h" +#include "message.h" + +void WorldEvent_0_0(void); +void WorldEvent_0_1(void); +void WorldEvent_0_2(void); +void (*const WorldEvent_0_Functions[])(void) = { + WorldEvent_0_0, + WorldEvent_0_1, + WorldEvent_0_2, +}; +void WorldEvent_0(void) { + WorldEvent_0_Functions[gMenu.overlayType](); +} + +void WorldEvent_0_0(void) { + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_0_1(void) { + if (gFadeControl.active == 0) { + MessageFromTarget(TEXT_INDEX(TEXT_EMPTY, 0x01)); + gMenu.overlayType++; + gMenu.transitionTimer = 120; + } +} + +void WorldEvent_0_2(void) { + if (--gMenu.transitionTimer == 0) { + gMenu.menuType++; + } +} diff --git a/src/worldEvent/worldEvent1.c b/src/worldEvent/worldEvent1.c new file mode 100644 index 00000000..92a17ddd --- /dev/null +++ b/src/worldEvent/worldEvent1.c @@ -0,0 +1,54 @@ +/** + * @file worldEvent1.c + * @ingroup WorldEvents + * + * @brief World Event 1 + */ +#include "asm.h" +#include "fade.h" +#include "flags.h" +#include "menu.h" +#include "physics.h" +#include "room.h" +#include "script.h" +#include "sound.h" +#include "subtask.h" + +void WorldEvent_1_0(void); +void WorldEvent_1_1(void); +void WorldEvent_1_2(void); +void (*const WorldEvent_1_Functions[])(void) = { + WorldEvent_1_0, + WorldEvent_1_1, + WorldEvent_1_2, +}; + +void WorldEvent_1(void) { + WorldEvent_1_Functions[gMenu.overlayType](); +} + +void WorldEvent_1_0(void) { + u8* ptr = gMenu.field_0xc; + sub_0804B0B0(ptr[2], ptr[3]); + sub_0804B0E8(ptr[2], ptr[3]); + sub_08055B70(gMenu.field_0x4, 0, 0, 0); + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_1_1(void) { + if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { + gMenu.overlayType++; + gMenu.transitionTimer = 180; + SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10); + sub_080553E0(gMenu.field_0x4); + sub_0801876C(gMenu.field_0x4, 1); + } +} + +void WorldEvent_1_2(void) { + if (--gMenu.transitionTimer == 0) { + gMenu.menuType++; + } +} diff --git a/src/worldEvent/worldEvent10.c b/src/worldEvent/worldEvent10.c new file mode 100644 index 00000000..69d7691e --- /dev/null +++ b/src/worldEvent/worldEvent10.c @@ -0,0 +1,58 @@ +/** + * @file worldEvent10.c + * @ingroup WorldEvents + * + * @brief World Event 10 + */ +#include "fade.h" +#include "menu.h" +#include "object.h" +#include "subtask.h" + +void WorldEvent_Beanstalk_0(void); +void WorldEvent_Beanstalk_1(void); +void WorldEvent_Beanstalk_2(void); +void WorldEvent_Beanstalk_3(void); +void (*const WorldEvent_Beanstalk_Functions[])(void) = { + WorldEvent_Beanstalk_0, + WorldEvent_Beanstalk_1, + WorldEvent_Beanstalk_2, + WorldEvent_Beanstalk_3, +}; +void WorldEvent_Beanstalk(void) { + WorldEvent_Beanstalk_Functions[gMenu.overlayType](); +} + +void WorldEvent_Beanstalk_0(void) { + u8* ptr = gMenu.field_0xc; + SetLocalFlagByBank(gLocalFlagBanks[gMenu.field_0xc[0x11]], (u32) * (u16*)(gMenu.field_0xc + 0x12)); + sub_0804B0E8(ptr[2], ptr[3]); + LoadGfxGroup(0x11); + sub_08055B70(gMenu.field_0x4, 0, 0, 0); + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_Beanstalk_1(void) { + if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { + gMenu.overlayType++; + } +} + +void WorldEvent_Beanstalk_2(void) { + u8* ptr = gMenu.field_0xc; + Entity* obj = CreateObject(BEANSTALK, 0, 0); + if (obj != NULL) { + obj->x.HALF.HI = gRoomControls.origin_x + *(s16*)(ptr + 8); + obj->y.HALF.HI = gRoomControls.origin_y + *(s16*)(ptr + 10); + } + gMenu.overlayType++; + gMenu.transitionTimer = 390; +} + +void WorldEvent_Beanstalk_3(void) { + if (--gMenu.transitionTimer == 0) { + gMenu.menuType++; + } +} diff --git a/src/worldEvent/worldEvent11.c b/src/worldEvent/worldEvent11.c new file mode 100644 index 00000000..06771f10 --- /dev/null +++ b/src/worldEvent/worldEvent11.c @@ -0,0 +1,45 @@ +/** + * @file worldEvent11.c + * @ingroup WorldEvents + * + * @brief World Event 11 + */ +#include "fade.h" +#include "flags.h" +#include "menu.h" +#include "subtask.h" + +void WorldEvent_11_0(void); +void WorldEvent_11_1(void); +void WorldEvent_11_2(void); +void (*const WorldEvent_11_Functions[])(void) = { + WorldEvent_11_0, + WorldEvent_11_1, + WorldEvent_11_2, +}; + +void WorldEvent_11(void) { + WorldEvent_11_Functions[gMenu.overlayType](); +} + +void WorldEvent_11_0(void) { + sub_08055B70(gMenu.field_0x4, 0, 0, 0); + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_11_1(void) { + if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { + sub_0801876C(gMenu.field_0x4, 1); + sub_080553E0(gMenu.field_0x4); + gMenu.overlayType++; + gMenu.transitionTimer = 180; + } +} + +void WorldEvent_11_2(void) { + if (--gMenu.transitionTimer == 0) { + gMenu.menuType++; + } +} diff --git a/src/worldEvent/worldEvent12.c b/src/worldEvent/worldEvent12.c new file mode 100644 index 00000000..3fa18c50 --- /dev/null +++ b/src/worldEvent/worldEvent12.c @@ -0,0 +1,47 @@ +/** + * @file worldEvent12.c + * @ingroup WorldEvents + * + * @brief World Event 12 + */ +#include "fade.h" +#include "kinstone.h" +#include "menu.h" +#include "npc.h" +#include "object.h" +#include "room.h" +#include "script.h" +#include "subtask.h" + +extern Script script_GormanFirstAppearance; +const EntityData gUnk_080FF2C0[] = { + // TODO what are these kinds? + { 0x10 + OBJECT, 15, HOUSE_DOOR_EXT, 0, 2, 0x2b8, 0x36b, 0 }, + { NPC, 79, GORMAN, 0, 0, 0x2f8, 0x308, (u32)&script_GormanFirstAppearance }, + { 0x10 + NPC, 15, NPC_UNK_4F, 0, 0, 0x2f8, 0x360, 0 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; +void WorldEvent_12_0(void); +void WorldEvent_12_1(void); +void (*const WorldEvent_12_Functions[])(void) = { + WorldEvent_12_0, + WorldEvent_12_1, +}; + +void WorldEvent_12(void) { + WorldEvent_12_Functions[gMenu.overlayType](); +} + +void WorldEvent_12_0(void) { + LoadRoomEntityList((EntityData*)gUnk_080FF2C0); + if (gSave.global_progress != 9) { + sub_08018C58(0xdb4); + } + sub_08055B70(gMenu.field_0x4, 1, 0, 0); + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_12_1(void) { +} diff --git a/src/worldEvent/worldEvent13.c b/src/worldEvent/worldEvent13.c new file mode 100644 index 00000000..d531e718 --- /dev/null +++ b/src/worldEvent/worldEvent13.c @@ -0,0 +1,39 @@ +/** + * @file worldEvent13.c + * @ingroup WorldEvents + * + * @brief World Event 13 + */ +#include "fade.h" +#include "menu.h" +#include "npc.h" +#include "room.h" +#include "script.h" +#include "subtask.h" + +extern Script script_MutohKinstone; +const EntityData gUnk_080FF154[] = { + { NPC, 79, MUTOH, 0, 0, 0x78, 0x70, (u32)&script_MutohKinstone }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; +void WorldEvent_13_0(void); +void WorldEvent_13_1(void); +void (*const WorldEvent_13_Functions[])(void) = { + WorldEvent_13_0, + WorldEvent_13_1, +}; +void WorldEvent_13(void) { + WorldEvent_13_Functions[gMenu.overlayType](); +} + +void WorldEvent_13_0(void) { + sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]); + LoadRoomEntityList(gUnk_080FF154); + sub_08055B70(gMenu.field_0x4, 0, 0, 0); + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_13_1(void) { +} diff --git a/src/worldEvent/worldEvent14.c b/src/worldEvent/worldEvent14.c new file mode 100644 index 00000000..249a7774 --- /dev/null +++ b/src/worldEvent/worldEvent14.c @@ -0,0 +1,48 @@ +/** + * @file worldEvent14.c + * @ingroup WorldEvents + * + * @brief World Event 14 + */ +#include "fade.h" +#include "kinstone.h" +#include "menu.h" +#include "npc.h" +#include "object.h" +#include "room.h" +#include "script.h" +#include "subtask.h" + +extern Script script_GhostBrotherKinstone; +const EntityData gUnk_080FF17C[] = { + { NPC, 79, GHOST_BROTHERS, 1, 0, 0x388, 0x338, (u32)&script_GhostBrotherKinstone }, + // TODO what are these kinds? + { 0x10 + OBJECT, 15, HOUSE_DOOR_EXT, 0, 2, 0x348, 0x303, 0 }, + { 0x10 + OBJECT, 15, HOUSE_DOOR_EXT, 0, 2, 0x3b8, 0x363, 0 }, + { 0x10 + NPC, 15, NPC_UNK_4F, 0, 0, 0x2f8, 0x360, 0 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; +void WorldEvent_14_0(void); +void WorldEvent_14_1(void); +void (*const WorldEvent_14_Functions[])(void) = { + WorldEvent_14_0, + WorldEvent_14_1, +}; + +void WorldEvent_14(void) { + WorldEvent_14_Functions[gMenu.overlayType](); +} + +void WorldEvent_14_0(void) { + LoadRoomEntityList(gUnk_080FF17C); + if (gSave.global_progress != 9) { + sub_08018C58(0xdb4); + } + sub_08055B70(gMenu.field_0x4, 0, 0, 0); + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_14_1(void) { +} diff --git a/src/worldEvent/worldEvent15.c b/src/worldEvent/worldEvent15.c new file mode 100644 index 00000000..f79420b9 --- /dev/null +++ b/src/worldEvent/worldEvent15.c @@ -0,0 +1,56 @@ +/** + * @file worldEvent15.c + * @ingroup WorldEvents + * + * @brief World Event 15 + */ +#include "fade.h" +#include "flags.h" +#include "menu.h" +#include "room.h" +#include "subtask.h" + +extern void sub_08054A14(u32); +extern const EntityData gUnk_080FEE48[]; + +void WorldEvent_15_0(void); +void WorldEvent_15_1(void); +void WorldEvent_15_2(void); +void (*const WorldEvent_15_Functions[])(void) = { + WorldEvent_15_0, + WorldEvent_15_1, + WorldEvent_15_2, +}; + +void WorldEvent_15(void) { + WorldEvent_15_Functions[gMenu.overlayType](); +} + +void WorldEvent_15_0(void) { + Entity* entity; + + sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]); + entity = LoadRoomEntity((EntityData*)gUnk_080FEE48); + if (entity != NULL) { + entity->type2 = 2; + entity->field_0x86.HWORD = 0x80ff; + } + sub_08054A14(gMenu.field_0x4); + sub_08055B70(gMenu.field_0x4, 0, 0, 0); + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_15_1(void) { + if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { + gMenu.overlayType++; + gMenu.transitionTimer = 120; + } +} + +void WorldEvent_15_2(void) { + if (--gMenu.transitionTimer == 0) { + gMenu.menuType++; + } +} diff --git a/src/worldEvent/worldEvent16.c b/src/worldEvent/worldEvent16.c new file mode 100644 index 00000000..4cdae208 --- /dev/null +++ b/src/worldEvent/worldEvent16.c @@ -0,0 +1,44 @@ +/** + * @file worldEvent16.c + * @ingroup WorldEvents + * + * @brief World Event 16 + */ +#include "fade.h" +#include "menu.h" +#include "npc.h" +#include "room.h" +#include "script.h" +#include "subtask.h" + +extern Script script_GoronMerchantArriving; +const EntityData gUnk_080FF128[] = { + { NPC, 79, GORON_MERCHANT, 0, 0, 0x410, 0xf8, (u32)&script_GoronMerchantArriving }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; +void WorldEvent_16_0(void); +void WorldEvent_16_1(void); +void WorldEvent_16_2(void); +void (*const WorldEvent_16_Functions[])(void) = { + WorldEvent_16_0, + WorldEvent_16_1, + WorldEvent_16_2, +}; + +void WorldEvent_16(void) { + WorldEvent_16_Functions[gMenu.overlayType](); +} + +void WorldEvent_16_0(void) { + LoadRoomEntityList(gUnk_080FF128); + sub_08055B70(gMenu.field_0x4, 2, 0, 0); + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_16_1(void) { +} + +void WorldEvent_16_2(void) { +} diff --git a/src/worldEvent/worldEvent17.c b/src/worldEvent/worldEvent17.c new file mode 100644 index 00000000..9b96ecb4 --- /dev/null +++ b/src/worldEvent/worldEvent17.c @@ -0,0 +1,161 @@ +/** + * @file worldEvent17.c + * @ingroup WorldEvents + * + * @brief World Event 17 + */ +#include "fade.h" +#include "manager.h" +#include "menu.h" +#include "npc.h" +#include "room.h" +#include "script.h" +#include "subtask.h" +#include "manager/bombableWallManager.h" + +// Called Goron Kinstone Fusion Script +void sub_08054EB8(Entity* this, ScriptExecutionContext* context) { + BombableWallManager* manager = (BombableWallManager*)GetEmptyManager(); + if (manager != NULL) { + manager->base.kind = MANAGER; + manager->base.id = BOMBABLE_WALL_MANAGER; + manager->x = this->x.HALF.HI - gRoomControls.origin_x; + manager->y = (this->y.HALF.HI - gRoomControls.origin_y) - 0x10; + manager->field_0x35 = 1; +#if defined(EU) || defined(JP) || defined(DEMO_JP) + manager->field_0x3e = 0x77; +#else + manager->field_0x3e = 0x79; +#endif + AppendEntityToList((Entity*)manager, 6); + } +} + +void sub_08054EFC(Entity* this, ScriptExecutionContext* context) { + Entity* effect; + u32 tmp = COORD_TO_TILE(this) - 0x40; + SetTile(0x4074, tmp, 1); + this->collisionLayer = 2; + UpdateSpriteForCollisionLayer(this); + effect = CreateFx(this, FX_BIG_EXPLOSION, 0); + if (effect != NULL) { + effect->y.HALF.HI -= 0x10; + SortEntityBelow(this, effect); + } + SoundReq(SFX_ITEM_BOMB_EXPLODE); +} + +void sub_08054F64(Entity* this, ScriptExecutionContext* context) { + u32 tmp = this->type2; + if ((gActiveScriptInfo.syncFlags & tmp) != tmp) { + gActiveScriptInfo.commandSize = 0; + } else { + gActiveScriptInfo.syncFlags &= ~tmp; + gActiveScriptInfo.flags |= 1; + } +} + +extern Script script_GoronKinstone; +const EntityData gUnk_080FEF48[] = { + { NPC, 79, GORON, 0, 0, 0x88, 0x368, (u32)&script_GoronKinstone }, +#if defined(USA) || defined(DEMO_USA) + // TODO 0x7c is a flag? + { MANAGER, 15, MOVEABLE_OBJECT_MANAGER, 0, 0x10e82e00, 0xd8, 0x388, 0x7c1388 }, +#else + { MANAGER, 15, MOVEABLE_OBJECT_MANAGER, 0, 0x10e82e00, 0xd8, 0x388, 0x7a1388 }, +#endif + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; + +extern Script script_Goron1Kinstone2; +extern Script script_Goron2Kinstone2; +const EntityData gUnk_080FEF78[] = { + { NPC, 79, GORON, 0, 0, 0x68, 0x228, (u32)&script_Goron1Kinstone2 }, + { NPC, 79, GORON, 0, 0, 0x88, 0x288, (u32)&script_Goron2Kinstone2 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; + +extern Script script_Goron1Kinstone3; +extern Script script_Goron2Kinstone3; +extern Script script_Goron3Kinstone3; +const EntityData gUnk_080FEFA8[] = { + { NPC, 79, GORON, 0, 4, 0x48, 0x178, (u32)&script_Goron1Kinstone3 }, + { NPC, 79, GORON, 0, 8, 0x68, 0x178, (u32)&script_Goron2Kinstone3 }, + { NPC, 79, GORON, 0, 2, 0x88, 0x1e8, (u32)&script_Goron3Kinstone3 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; +extern Script script_Goron1Kinstone4; +extern Script script_Goron2Kinstone4; +extern Script script_Goron4Kinstone4; +const EntityData gUnk_080FEFE8[] = { + { NPC, 79, GORON, 0, 4, 0x48, 0x178, (u32)&script_Goron1Kinstone4 }, + { NPC, 79, GORON, 0, 8, 0x68, 0x178, (u32)&script_Goron2Kinstone4 }, + { NPC, 79, GORON, 0, 16, 0x88, 0x178, (u32)&script_Goron2Kinstone4 }, + { NPC, 79, GORON, 0, 2, 0x88, 0x1e8, (u32)&script_Goron4Kinstone4 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; +extern Script script_Goron1Kinstone5; +extern Script script_Goron2Kinstone5; +extern Script script_Goron5Kinstone5; +const EntityData gUnk_080FF038[] = { + { NPC, 79, GORON, 0, 4, 0x28, 0xd8, (u32)&script_Goron1Kinstone5 }, + { NPC, 79, GORON, 0, 8, 0x48, 0xd8, (u32)&script_Goron2Kinstone5 }, + { NPC, 79, GORON, 0, 16, 0x68, 0xd8, (u32)&script_Goron2Kinstone5 }, + { NPC, 79, GORON, 0, 32, 0x88, 0xd8, (u32)&script_Goron2Kinstone5 }, + { NPC, 79, GORON, 0, 2, 0x98, 0x178, (u32)&script_Goron5Kinstone5 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; +extern Script script_Goron1Kinstone6; +extern Script script_Goron2Kinstone6; +extern Script script_Goron6Kindstone6; +const EntityData gUnk_080FF098[] = { + { NPC, 79, GORON, 0, 4, 0x28, 0xd8, (u32)&script_Goron1Kinstone6 }, + { NPC, 79, GORON, 0, 8, 0x48, 0xd8, (u32)&script_Goron2Kinstone6 }, + { NPC, 79, GORON, 0, 16, 0x68, 0xd8, (u32)&script_Goron2Kinstone6 }, + { NPC, 79, GORON, 0, 32, 0x88, 0xd8, (u32)&script_Goron2Kinstone6 }, + { NPC, 79, GORON, 0, 64, 0xa8, 0xd8, (u32)&script_Goron2Kinstone6 }, + { NPC, 79, GORON, 0, 2, 0x98, 0x178, (u32)&script_Goron6Kindstone6 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; +const EntityData* const gUnk_080FF108[] = { + gUnk_080FEF48, gUnk_080FEF78, gUnk_080FEFA8, gUnk_080FEFE8, gUnk_080FF038, gUnk_080FF098, +}; + +void WorldEvent_17_0(void); +void WorldEvent_17_1(void); +void (*const WorldEvent_17_Functions[])(void) = { + WorldEvent_17_0, + WorldEvent_17_1, +}; + +void WorldEvent_17(void) { + WorldEvent_17_Functions[gMenu.overlayType](); +} + +void WorldEvent_17_0(void) { + u8* ptr; + u32 tmp; + + ptr = gMenu.field_0xc; + LoadRoomEntityList(gUnk_080FF108[ptr[1]]); + if (ptr[1] != 0) { + tmp = 3; + } else { + tmp = 0; + } + sub_08055B70(gMenu.field_0x4, tmp, 0, 0); + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + SetFade(FADE_INSTANT, 0x10); + gMenu.field_0xa = 0; + if (CheckLocalFlagByBank(FLAG_BANK_4, GORON_DOUKUTU_01_T1) && (ptr[2] == 0x2f)) { + gMenu.field_0xa = 1; + } +} + +void WorldEvent_17_1(void) { + if (gMenu.field_0xa != 0) { + gMenu.field_0xa = 0; + SetTileType(0x74, 0x407, 1); + } +} diff --git a/src/worldEvent/worldEvent19.c b/src/worldEvent/worldEvent19.c new file mode 100644 index 00000000..12437991 --- /dev/null +++ b/src/worldEvent/worldEvent19.c @@ -0,0 +1,49 @@ +/** + * @file worldEvent19.c + * @ingroup WorldEvents + * + * @brief World Event 19 + */ +#include "fade.h" +#include "functions.h" +#include "menu.h" +#include "npc.h" +#include "room.h" +#include "script.h" +#include "subtask.h" + +extern Script script_BigGoronKinstone1; +extern Script script_BigGoronKinstone2; +extern Script script_BigGoronKinstone3; +const EntityData gUnk_080FEED4[] = { + { NPC, 79, BIG_GORON, 0, 0, 0x140, 0xf8, (u32)&script_BigGoronKinstone1 }, + { NPC, 79, BIG_GORON, 5, 0, 0xd0, 0xc8, (u32)&script_BigGoronKinstone2 }, + { NPC, 79, BIG_GORON, 10, 0, 0x1b0, 0x108, (u32)&script_BigGoronKinstone3 }, + { NPC, 15, BIG_GORON, 1, 0, 0x108, 0x88, 0 }, + { NPC, 15, BIG_GORON, 2, 0, 0x108, 0x88, 0 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; +void WorldEvent_19_0(void); +void WorldEvent_19_1(void); +void (*const WorldEvent_19_Functions[])(void) = { + WorldEvent_19_0, + WorldEvent_19_1, +}; + +void WorldEvent_19(void) { + WorldEvent_19_Functions[gMenu.overlayType](); +} + +void WorldEvent_19_0(void) { + sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]); + LoadRoomEntityList(gUnk_080FEED4); + LoadStaticBackground(2); + sub_0806D0B0(NULL); + sub_08055B70(gMenu.field_0x4, 0, 0, 0); + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_19_1(void) { +} diff --git a/src/worldEvent/worldEvent2.c b/src/worldEvent/worldEvent2.c new file mode 100644 index 00000000..aa347001 --- /dev/null +++ b/src/worldEvent/worldEvent2.c @@ -0,0 +1,65 @@ +/** + * @file worldEvent2.c + * @ingroup WorldEvents + * + * @brief World Event 2 + */ +#include "fade.h" +#include "flags.h" +#include "menu.h" +#include "room.h" +#include "sound.h" +#include "subtask.h" + +void sub_08055994(void); + +void WorldEvent_2_0(void); +void WorldEvent_2_1(void); +void WorldEvent_2_2(void); +void (*const WorldEvent_2_Functions[])(void) = { + WorldEvent_2_0, + WorldEvent_2_1, + WorldEvent_2_2, +}; + +void WorldEvent_2(void) { + WorldEvent_2_Functions[gMenu.overlayType](); +} + +void WorldEvent_2_0(void) { + u8* ptr = gMenu.field_0xc; + sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]); + sub_0804B0E8(ptr[2], ptr[3]); + sub_08055B70(gMenu.field_0x4, 0, 0, 0); + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_2_1(void) { + if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { + sub_08055994(); + gMenu.overlayType++; + gMenu.transitionTimer = 120; + } +} + +void WorldEvent_2_2(void) { + if (--gMenu.transitionTimer == 0) { + gMenu.menuType++; + } +} + +void sub_08055994(void) { + u32 layer; + TileEntity* ptr = &gUnk_080FEAC8[gMenu.field_0x4]; + if ((ptr->_6 & 1) != 0) { + layer = 2; + } else { + layer = 1; + } + SetTileType(0x73, (*(u16*)(gMenu.field_0xc + 8) >> 4 & 0x3f) | (*(u16*)(gMenu.field_0xc + 10) >> 4 & 0x3f) << 6, + layer); + sub_080553E0((u32)gMenu.field_0x4); + SoundReq(SFX_SECRET_BIG); +} diff --git a/src/worldEvent/worldEvent20.c b/src/worldEvent/worldEvent20.c new file mode 100644 index 00000000..b81833d1 --- /dev/null +++ b/src/worldEvent/worldEvent20.c @@ -0,0 +1,40 @@ +/** + * @file worldEvent20.c + * @ingroup WorldEvents + * + * @brief World Event 20 + */ +#include "fade.h" +#include "menu.h" +#include "npc.h" +#include "room.h" +#include "script.h" +#include "subtask.h" + +extern Script script_SyrupKinstone; +const EntityData gUnk_080FF308[] = { + { NPC, 79, SYRUP, 0, 0, 0x78, 0x38, (u32)&script_SyrupKinstone }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; +void WorldEvent_20_0(void); +void WorldEvent_20_1(void); +void (*const WorldEvent_20_Functions[])(void) = { + WorldEvent_20_0, + WorldEvent_20_1, +}; + +void WorldEvent_20(void) { + WorldEvent_20_Functions[gMenu.overlayType](); +} + +void WorldEvent_20_0(void) { + sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]); + LoadRoomEntityList((EntityData*)gUnk_080FF308); + sub_08055B70(gMenu.field_0x4, 0, 0, 0); + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_20_1(void) { +} diff --git a/src/worldEvent/worldEvent21.c b/src/worldEvent/worldEvent21.c new file mode 100644 index 00000000..e5540fa9 --- /dev/null +++ b/src/worldEvent/worldEvent21.c @@ -0,0 +1,39 @@ +/** + * @file worldEvent21.c + * @ingroup WorldEvents + * + * @brief World Event 21 + */ +#include "fade.h" +#include "menu.h" +#include "npc.h" +#include "room.h" +#include "subtask.h" + +extern Script script_CarlovKinstone; +const EntityData gUnk_080FF264[] = { + { NPC, 79, CARLOV, 1, 0, 0x78, 0x48, (u32)&script_CarlovKinstone }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; +void WorldEvent_21_0(void); +void WorldEvent_21_1(void); +void (*const WorldEvent_21_Functions[])(void) = { + WorldEvent_21_0, + WorldEvent_21_1, +}; + +void WorldEvent_21(void) { + WorldEvent_21_Functions[gMenu.overlayType](); +} + +void WorldEvent_21_0(void) { + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]); + LoadRoomEntityList((EntityData*)gUnk_080FF264); + sub_08055B70(gMenu.field_0x4, 0, 0, 0); + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_21_1(void) { +} diff --git a/src/worldEvent/worldEvent22.c b/src/worldEvent/worldEvent22.c new file mode 100644 index 00000000..367c47da --- /dev/null +++ b/src/worldEvent/worldEvent22.c @@ -0,0 +1,43 @@ +/** + * @file worldEvent.c + * @ingroup WorldEvents + * + * @brief World Event 22 + */ +#include "functions.h" +#include "menu.h" +#include "npc.h" +#include "room.h" +#include "screen.h" + +extern void sub_0804B0B0(u32, u32); +extern void sub_08055B70(u32, u32, u32, u32); + +extern u8 gUpdateVisibleTiles; +extern Script script_StampKinstone; +const EntityData gUnk_080FF400[] = { + { NPC, 79, STAMP, 0, 0, 0x48, 0x38, (u32)&script_StampKinstone }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; +void WorldEvent_22_0(void); +void WorldEvent_22_1(void); +void (*const WorldEvent_22_Functions[])(void) = { + WorldEvent_22_0, + WorldEvent_22_1, +}; + +void WorldEvent_22(void) { + WorldEvent_22_Functions[gMenu.overlayType](); +} + +void WorldEvent_22_0(void) { + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]); + LoadRoomEntityList(gUnk_080FF400); + sub_08055B70(gMenu.field_0x4, 0, 0, 0); + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_22_1(void) { +} diff --git a/src/worldEvent/worldEvent23.c b/src/worldEvent/worldEvent23.c new file mode 100644 index 00000000..90f7dbcc --- /dev/null +++ b/src/worldEvent/worldEvent23.c @@ -0,0 +1,37 @@ +/** + * @file worldEvent23.c + * @ingroup WorldEvents + * + * @brief World Event 23 + */ +#include "fade.h" +#include "menu.h" +#include "npc.h" +#include "subtask.h" + +const EntityData gUnk_080FF298[] = { + { NPC, 15, FOREST_MINISH, 0, 513, 0x78, 0x58, 0 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; +void WorldEvent_23_0(void); +void WorldEvent_23_1(void); +void (*const WorldEvent_23_Functions[])(void) = { + WorldEvent_23_0, + WorldEvent_23_1, +}; + +void WorldEvent_23(void) { + WorldEvent_23_Functions[gMenu.overlayType](); +} + +void WorldEvent_23_0(void) { + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + sub_0804B0B0((u32)gMenu.field_0xc[2], gMenu.field_0xc[3]); + LoadRoomEntityList((EntityData*)gUnk_080FF298); + sub_08055B70(gMenu.field_0x4, 0, 0, 0); + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_23_1(void) { +} diff --git a/src/worldEvent/worldEvent24.c b/src/worldEvent/worldEvent24.c new file mode 100644 index 00000000..7f065152 --- /dev/null +++ b/src/worldEvent/worldEvent24.c @@ -0,0 +1,47 @@ +/** + * @file worldEvent24.c + * @ingroup WorldEvents + * + * @brief World Event 24 + */ +#include "fade.h" +#include "flags.h" +#include "menu.h" +#include "room.h" +#include "subtask.h" + +void WorldEvent_24_0(void); +void WorldEvent_24_1(void); +void WorldEvent_24_2(void); +void (*const WorldEvent_24_Functions[])(void) = { + WorldEvent_24_0, + WorldEvent_24_1, + WorldEvent_24_2, +}; + +void WorldEvent_24(void) { + WorldEvent_24_Functions[gMenu.overlayType](); +} + +void WorldEvent_24_0(void) { + sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]); + sub_08055B70(gMenu.field_0x4, 0, 0, 0); + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_24_1(void) { + if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { + sub_0801876C(gMenu.field_0x4, 1); + sub_080553E0(gMenu.field_0x4); + gMenu.overlayType++; + gMenu.transitionTimer = 120; + } +} + +void WorldEvent_24_2(void) { + if (--gMenu.transitionTimer == 0) { + gMenu.menuType++; + } +} diff --git a/src/worldEvent/worldEvent25.c b/src/worldEvent/worldEvent25.c new file mode 100644 index 00000000..b50b5ce8 --- /dev/null +++ b/src/worldEvent/worldEvent25.c @@ -0,0 +1,71 @@ +/** + * @file worldEvent25.c + * @ingroup WorldEvents + * + * @brief World Event 25 + */ +#include "fade.h" +#include "menu.h" +#include "object.h" +#include "script.h" +#include "subtask.h" + +void WorldEvent_25_0(void); +void WorldEvent_25_1(void); +void WorldEvent_25_2(void); +void (*const WorldEvent_25_Functions[])(void) = { + WorldEvent_25_0, + WorldEvent_25_1, + WorldEvent_25_2, +}; + +extern Script script_KinstoneSparkKinstoneSpark; +extern Script script_KinstoneSparkKinstoneSparkFromBottom; +extern Script script_KinstoneSparkKinstoneSparkGoronMerchang; +extern Script script_KinstoneSparkKinstoneSparkGoron; +const EntityData gUnk_080FF378[] = { + { OBJECT, 79, KINSTONE_SPARK, 0, 0, 0x0, 0x0, (u32)&script_KinstoneSparkKinstoneSpark }, + { OBJECT, 79, KINSTONE_SPARK, 0, 0, 0x0, 0x0, (u32)&script_KinstoneSparkKinstoneSparkFromBottom }, + { OBJECT, 79, KINSTONE_SPARK, 0, 0, 0x0, 0x0, (u32)&script_KinstoneSparkKinstoneSparkGoronMerchang }, + { OBJECT, 79, KINSTONE_SPARK, 0, 0, 0x0, 0x0, (u32)&script_KinstoneSparkKinstoneSparkGoron }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; + +extern const EntityData gUnk_080FED18[]; + +void WorldEvent_25(void) { + WorldEvent_25_Functions[gMenu.overlayType](); +} + +void WorldEvent_25_0(void) { + Entity* entity; + sub_08055B70(gMenu.field_0x4, 0, 0, 0); + entity = LoadRoomEntity((EntityData*)&gUnk_080FED18[gMenu.field_0xc[1]]); + if (entity != NULL) { + entity->type2 = 1; + } + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_25_1(void) { + if (gFadeControl.active == 0) { + gMenu.transitionTimer = 120; + } +} + +void WorldEvent_25_2(void) { + if (--gMenu.transitionTimer == 0) { + gMenu.menuType++; + } +} + +void sub_08055B70(u32 param_1, u32 param_2, u32 param_3, u32 param_4) { + u8* ptr = gMenu.field_0xc; + Entity* entity = LoadRoomEntity((EntityData*)&gUnk_080FF378[param_2]); + if (entity != NULL) { + entity->x.HALF.HI = *(s16*)(ptr + 8) + param_3 + gRoomControls.origin_x; + entity->y.HALF.HI = *(s16*)(ptr + 10) + param_4 + gRoomControls.origin_y; + } +} diff --git a/src/worldEvent/worldEvent3.c b/src/worldEvent/worldEvent3.c new file mode 100644 index 00000000..adb20f68 --- /dev/null +++ b/src/worldEvent/worldEvent3.c @@ -0,0 +1,47 @@ +/** + * @file worldEvent3.c + * @ingroup WorldEvents + * + * @brief World Event 3 + */ +#include "fade.h" +#include "flags.h" +#include "functions.h" +#include "menu.h" +#include "subtask.h" + +void WorldEvent_3_0(void); +void WorldEvent_3_1(void); +void WorldEvent_3_2(void); +void (*const WorldEvent_3_Functions[])(void) = { + WorldEvent_3_0, + WorldEvent_3_1, + WorldEvent_3_2, +}; + +void WorldEvent_3(void) { + WorldEvent_3_Functions[gMenu.overlayType](); +} + +void WorldEvent_3_0(void) { + sub_0804B0B0(gMenu.field_0xc[2], gMenu.field_0xc[3]); + sub_08055B70(gMenu.field_0x4, 0, 0, 0); + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_3_1(void) { + if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { + sub_0801876C(gMenu.field_0x4, 1); + sub_080553E0(gMenu.field_0x4); + gMenu.overlayType++; + gMenu.transitionTimer = 120; + } +} + +void WorldEvent_3_2(void) { + if (--gMenu.transitionTimer == 0) { + gMenu.menuType++; + } +} diff --git a/src/worldEvent/worldEvent4.c b/src/worldEvent/worldEvent4.c new file mode 100644 index 00000000..114cec1c --- /dev/null +++ b/src/worldEvent/worldEvent4.c @@ -0,0 +1,62 @@ +/** + * @file worldEvent4.c + * @ingroup WorldEvents + * + * @brief World Event 4 + */ +#include "fade.h" +#include "flags.h" +#include "functions.h" +#include "kinstone.h" +#include "menu.h" +#include "screen.h" +#include "sound.h" +#include "subtask.h" + +void sub_08055B70(u32, u32, u32, u32); + +void WorldEvent_4_0(void); +void WorldEvent_4_1(void); +void WorldEvent_4_2(void); +void WorldEvent_4_3(void); +void (*const WorldEvent_4_Functions[])(void) = { + WorldEvent_4_0, + WorldEvent_4_1, + WorldEvent_4_2, + WorldEvent_4_3, +}; + +void WorldEvent_4(void) { + WorldEvent_4_Functions[gMenu.overlayType](); +} + +void WorldEvent_4_0(void) { + sub_08055B70(gMenu.field_0x4, 0, 0, 0); + sub_0801876C(gMenu.field_0x4, 0); + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_4_1(void) { + if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { + SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10); + gMenu.overlayType++; + } +} + +void WorldEvent_4_2(void) { + if (gFadeControl.active == 0) { + sub_08054974(gMenu.field_0x4, 0); + SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10); + SoundReq(SFX_SECRET_BIG); + gMenu.overlayType++; + gMenu.transitionTimer = 120; + } +} + +void WorldEvent_4_3(void) { + if ((gFadeControl.active == 0) && (--gMenu.transitionTimer == 0)) { + gMenu.menuType++; + } +} diff --git a/src/worldEvent/worldEvent5.c b/src/worldEvent/worldEvent5.c new file mode 100644 index 00000000..1032b3bc --- /dev/null +++ b/src/worldEvent/worldEvent5.c @@ -0,0 +1,94 @@ +/** + * @file worldEvent5.c + * @ingroup WorldEvents + * + * @brief World Event 5 + */ +#include "common.h" +#include "fade.h" +#include "flags.h" +#include "menu.h" +#include "room.h" +#include "screen.h" +#include "sound.h" +#include "subtask.h" + +const s16 gUnk_080FF1D4[] = { 19, 192, 224, // + 18, 176, 216, // + 18, 208, 216, // + 18, 240, 216, // + 19, 176, 224, // + 0 }; + +void WorldEvent_5_0(void); +void WorldEvent_5_1(void); +void WorldEvent_5_2(void); +void WorldEvent_5_3(void); +void (*const WorldEvent_5_Functions[])(void) = { + WorldEvent_5_0, + WorldEvent_5_1, + WorldEvent_5_2, + WorldEvent_5_3, +}; + +const u16 gUnk_080FF204[] = { 0x10, 0x10f, 0x20e, 0x30d, 0x40c, 0x50b, 0x60a, 0x709, 0x808, + 0x907, 0xa06, 0xb05, 0xc04, 0xd03, 0xe02, 0xf01, 0x1000, 0xffff }; + +void WorldEvent_5(void) { + WorldEvent_5_Functions[gMenu.overlayType](); +} + +void WorldEvent_5_0(void) { + // Doesn't work when put into a packed struct? + const s16* ptr = &gUnk_080FF1D4[(gMenu.field_0xc[1] & 0xf) * 3]; + LoadGfxGroup(ptr[0]); + gScreen.bg3.xOffset = ptr[1]; + gScreen.bg3.yOffset = ptr[2]; + gScreen.bg3.control = 0x1e05; + gScreen.controls.layerFXControl = 0x3648; + gScreen.controls.alphaBlend = 0x10; + gScreen.lcd.displayControl |= 0x800; + sub_0801876C(gMenu.field_0x4, 1); + sub_08055B70(gMenu.field_0x4, 0, 0, 0); + gMenu.overlayType++; + gMenu.storyPanelIndex = 0; + gMenu.transitionTimer = 60; + gMenu.field_0xa = 0; + gUpdateVisibleTiles = 1; + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_5_1(void) { + if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { + gMenu.overlayType++; + } +} + +void WorldEvent_5_2(void) { + if (gMenu.storyPanelIndex == 0) { + gMenu.transitionTimer--; + if (gMenu.transitionTimer == 0) { + u32 tmp = gMenu.storyPanelIndex; + gMenu.storyPanelIndex = tmp + 1; + SoundReq(SFX_EVAPORATE); + } + } else if ((gRoomTransition.frameCount & 7U) == 0) { + if (gUnk_080FF204[gMenu.field_0xa] != 0xffff) { + gScreen.controls.alphaBlend = gUnk_080FF204[gMenu.field_0xa++]; + } else { + gScreen.lcd.displayControl &= 0xf7ff; + gScreen.controls.alphaBlend = 0x1000; + gMenu.transitionTimer = 120; + gMenu.overlayType++; +#ifndef EU + SoundReq(SFX_SECRET_BIG); +#endif + } + } +} + +void WorldEvent_5_3(void) { + if (--gMenu.transitionTimer == 0) { + gMenu.menuType++; + } +} diff --git a/src/worldEvent/worldEvent6.c b/src/worldEvent/worldEvent6.c new file mode 100644 index 00000000..bfc96630 --- /dev/null +++ b/src/worldEvent/worldEvent6.c @@ -0,0 +1,66 @@ +/** + * @file worldEvent6.c + * @ingroup WorldEvents + * + * @brief World Event 6 + */ +#include "fade.h" +#include "menu.h" +#include "object.h" +#include "sound.h" +#include "subtask.h" + +void WorldEvent_6_0(void); +void WorldEvent_6_1(void); +void WorldEvent_6_2(void); +void WorldEvent_6_3(void); +void (*const WorldEvent_6_Functions[])(void) = { + WorldEvent_6_0, + WorldEvent_6_1, + WorldEvent_6_2, + WorldEvent_6_3, +}; + +void WorldEvent_6(void) { + WorldEvent_6_Functions[gMenu.overlayType](); +} + +void WorldEvent_6_0(void) { + sub_08055B70(gMenu.field_0x4, 0, 0, 0); + sub_0801876C(gMenu.field_0x4, 0); + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_6_1(void) { + if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { + SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10); + gMenu.overlayType++; + } +} + +void WorldEvent_6_2(void) { + if (gFadeControl.active == 0) { + sub_08054974(gMenu.field_0x4, 0); + SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10); + SoundReq(SFX_SECRET_BIG); + gMenu.overlayType++; + gMenu.transitionTimer = 120; + } +} + +void WorldEvent_6_3(void) { + if ((gFadeControl.active == 0) && (--gMenu.transitionTimer == 0)) { + gMenu.menuType++; + } +} + +void sub_080553E0(u32 param_1) { + u8* ptr = gMenu.field_0xc; + Entity* effect = CreateObject(SPECIAL_FX, FX_BIG_EXPLOSION2, 0); + if (effect != NULL) { + effect->x.HALF.HI = *(s16*)(ptr + 8) + gRoomControls.origin_x; + effect->y.HALF.HI = *(s16*)(ptr + 10) + gRoomControls.origin_y; + } +} diff --git a/src/worldEvent/worldEvent7.c b/src/worldEvent/worldEvent7.c new file mode 100644 index 00000000..601990ad --- /dev/null +++ b/src/worldEvent/worldEvent7.c @@ -0,0 +1,65 @@ +/** + * @file worldEvent7.c + * @ingroup WorldEvents + * + * @brief World Event 7 + */ +#include "fade.h" +#include "menu.h" +#include "object.h" +#include "sound.h" +#include "subtask.h" + +void WorldEvent_7_0(void); +void WorldEvent_7_1(void); +void WorldEvent_7_2(void); +void WorldEvent_7_3(void); +void (*const WorldEvent_7_Functions[])(void) = { WorldEvent_7_0, WorldEvent_7_1, WorldEvent_7_2, WorldEvent_7_3 }; +const u32 unused[] = { 0xff, 0, 0, 0 }; + +void WorldEvent_7(void) { + WorldEvent_7_Functions[gMenu.overlayType](); +} + +void WorldEvent_7_0(void) { + sub_08055B70(gMenu.field_0x4, 0, 0, 0); + sub_0801876C(gMenu.field_0x4, 0); + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_7_1(void) { + if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { + SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10); + gMenu.overlayType++; + } +} + +void WorldEvent_7_2(void) { + u8* ptr; + Entity* entity; + if (gFadeControl.active == 0) { + ptr = gMenu.field_0xc; + sub_080553E0((u32)gMenu.field_0x4); + if ((ptr[1] & 0x80) != 0) { + sub_08054974(gMenu.field_0x4, 0); + } else { + entity = FindEntity(OBJECT, TREE_THORNS, 6, 0, ptr[1] & 0x80); + if (entity != NULL) { + DeleteEntity(entity->child); + DeleteEntity(entity); + } + } + SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10); + SoundReq(SFX_SECRET_BIG); + gMenu.overlayType++; + gMenu.transitionTimer = 120; + } +} + +void WorldEvent_7_3(void) { + if ((gFadeControl.active == 0) && --gMenu.transitionTimer == 0) { + gMenu.menuType++; + } +} diff --git a/src/worldEvent/worldEvent8.c b/src/worldEvent/worldEvent8.c new file mode 100644 index 00000000..53193bd7 --- /dev/null +++ b/src/worldEvent/worldEvent8.c @@ -0,0 +1,58 @@ +/** + * @file worldEvent8.c + * @ingroup WorldEvents + * + * @brief World Event 8 + */ +#include "fade.h" +#include "flags.h" +#include "menu.h" +#include "sound.h" +#include "subtask.h" + +void WorldEvent_8_0(void); +void WorldEvent_8_1(void); +void WorldEvent_8_2(void); +void WorldEvent_8_3(void); +void (*const WorldEvent_8_Functions[])(void) = { + WorldEvent_8_0, + WorldEvent_8_1, + WorldEvent_8_2, + WorldEvent_8_3, +}; + +void WorldEvent_8(void) { + WorldEvent_8_Functions[gMenu.overlayType](); +} + +void WorldEvent_8_0(void) { + sub_0804B0E8(gMenu.field_0xc[2], gMenu.field_0xc[3]); + sub_08055B70(gMenu.field_0x4, 0, 0, 0); + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_8_1(void) { + if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { + SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10); + gMenu.overlayType++; + } +} + +void WorldEvent_8_2(void) { + if (gFadeControl.active == 0) { + sub_0801876C(gMenu.field_0x4, 1); + sub_080553E0(gMenu.field_0x4); + SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10); + SoundReq(SFX_SECRET_BIG); + gMenu.overlayType++; + gMenu.transitionTimer = 120; + } +} + +void WorldEvent_8_3(void) { + if ((gFadeControl.active == 0) && --gMenu.transitionTimer == 0) { + gMenu.menuType++; + } +} diff --git a/src/worldEvent/worldEvent9.c b/src/worldEvent/worldEvent9.c new file mode 100644 index 00000000..24a29dff --- /dev/null +++ b/src/worldEvent/worldEvent9.c @@ -0,0 +1,67 @@ +/** + * @file worldEvent9.c + * @ingroup WorldEvents + * + * @brief World Event 9 + */ +#include "fade.h" +#include "flags.h" +#include "menu.h" +#include "object.h" +#include "room.h" +#include "sound.h" +#include "subtask.h" + +const EntityData gUnk_080FF33C[] = { + { 0x10 + OBJECT, 15, HOUSE_DOOR_EXT, 0, 2, 0x98, 0x173, 0 }, + { 0xff, 0, 0, 0, 0, 0x0, 0x0, 0 }, +}; + +void WorldEvent_9_0(void); +void WorldEvent_9_1(void); +void WorldEvent_9_2(void); +void WorldEvent_9_3(void); +void (*const WorldEvent_9_Functions[])(void) = { + WorldEvent_9_0, + WorldEvent_9_1, + WorldEvent_9_2, + WorldEvent_9_3, +}; + +void WorldEvent_9(void) { + WorldEvent_9_Functions[gMenu.overlayType](); +} + +void WorldEvent_9_0(void) { + if (gMenu.field_0xc[1] != 0) { + LoadRoomEntityList((EntityData*)gUnk_080FF33C); + } + sub_08055B70(gMenu.field_0x4, 0, 0, 0); + gMenu.overlayType++; + gUpdateVisibleTiles = 1; + SetFade(FADE_INSTANT, 0x10); +} + +void WorldEvent_9_1(void) { + if ((gFadeControl.active == 0) && CheckRoomFlag(0xff)) { + SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10); + gMenu.overlayType++; + } +} + +void WorldEvent_9_2(void) { + if (gFadeControl.active == 0) { + sub_0801876C(gMenu.field_0x4, 1); + sub_080553E0(gMenu.field_0x4); + SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 0x10); + SoundReq(SFX_SECRET_BIG); + gMenu.overlayType++; + gMenu.transitionTimer = 120; + } +} + +void WorldEvent_9_3(void) { + if ((gFadeControl.active == 0) && --gMenu.transitionTimer == 0) { + gMenu.menuType++; + } +} |
