diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/data/dodrio_berry_picking.h | 247 | ||||
-rw-r--r-- | src/dodrio_berry_picking.c | 1000 | ||||
-rw-r--r-- | src/dodrio_berry_picking_2.c | 1043 | ||||
-rw-r--r-- | src/dodrio_berry_picking_3.c | 23 |
4 files changed, 1404 insertions, 909 deletions
diff --git a/src/data/dodrio_berry_picking.h b/src/data/dodrio_berry_picking.h new file mode 100644 index 000000000..e71ce13cf --- /dev/null +++ b/src/data/dodrio_berry_picking.h @@ -0,0 +1,247 @@ +#ifndef GUARD_DATA_DODRIO_BERRY_PICKING_H +#define GUARD_DATA_DODRIO_BERRY_PICKING_H + +static const struct BgTemplate sUnknown_847565C[] = +{ + { + .bg = 0, + .charBaseIndex = 0, + .mapBaseIndex = 30, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0 + }, + { + .bg = 1, + .charBaseIndex = 2, + .mapBaseIndex = 12, + .screenSize = 1, + .paletteMode = 0, + .priority = 1, + .baseTile = 0 + }, + { + .bg = 2, + .charBaseIndex = 2, + .mapBaseIndex = 14, + .screenSize = 1, + .paletteMode = 0, + .priority = 1, + .baseTile = 0 + }, + { + .bg = 3, + .charBaseIndex = 3, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0 + }, +}; + +// Unknown unreferenced data, feel free to remove. +static const u32 sUnused[] = {255, 0}; + +static const struct WindowTemplate sUnknown_8475674[] = +{ + { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 28, + .height = 3, + .paletteNum = 13, + .baseBlock = 0x13, + }, + { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 6, + .width = 28, + .height = 13, + .paletteNum = 13, + .baseBlock = 0x67, + } +}; + +static const struct WindowTemplate sUnknown_8475684 = +{ + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 6, + .width = 28, + .height = 7, + .paletteNum = 13, + .baseBlock = 0x67, +}; + +static const struct WindowTemplate sUnknown_847568C[] = +{ + { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 8, + .width = 19, + .height = 3, + .paletteNum = 13, + .baseBlock = 0x13, + }, + { + .bg = 0, + .tilemapLeft = 22, + .tilemapTop = 7, + .width = 6, + .height = 4, + .paletteNum = 13, + .baseBlock = 0x4C, + } +}; + +static const struct WindowTemplate sUnknown_847569C = +{ + .bg = 0, + .tilemapLeft = 4, + .tilemapTop = 6, + .width = 22, + .height = 5, + .paletteNum = 13, + .baseBlock = 0x13, +}; + +static const struct WindowTemplate sUnknown_84756A4 = +{ + .bg = 0, + .tilemapLeft = 5, + .tilemapTop = 8, + .width = 19, + .height = 3, + .paletteNum = 13, + .baseBlock = 0x13, +}; + +static const u8 sUnknown_8471F50[5][5][11] = +{ + { + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, + }, + { + {0, 1, 2, 3, 4, 5, 6, 3, 8, 9, 0}, + {0, 1, 2, 5, 6, 3, 4, 5, 8, 9, 0}, + }, + { + {0, 1, 2, 3, 4, 5, 6, 7, 2, 9, 0}, + {0, 1, 4, 5, 6, 7, 2, 3, 4, 9, 0}, + {0, 1, 6, 7, 2, 3, 4, 5, 6, 9, 0}, + }, + { + {0, 1, 2, 3, 4, 5, 6, 7, 8, 1, 0}, + {0, 3, 4, 5, 6, 7, 8, 1, 2, 3, 0}, + {0, 5, 6, 7, 8, 1, 2, 3, 4, 5, 0}, + {0, 7, 8, 1, 2, 3, 4, 5, 6, 7, 0}, + }, + { + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, + {2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2}, + {4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4}, + {6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6}, + {8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8}, + }, +}; + +static const u8 sUnknown_8472063[5][5][3] = +{ + { + {4, 5, 6}, + }, + { + {3, 4, 5}, + {5, 6, 3}, + }, + { + {4, 5, 6}, + {6, 7, 2}, + {2, 3, 4}, + }, + { + {3, 4, 5}, + {5, 6, 7}, + {7, 8, 1}, + {1, 2, 3}, + }, + { + {4, 5, 6}, + {6, 7, 8}, + {8, 9, 0}, + {0, 1, 2}, + {2, 3, 4}, + }, +}; + +static const u8 sUnknown_84720AE[5][5][3] = +{ + { + {1, 0, 1}, + }, + { + {1, 0, 1}, + {0, 1, 0}, + }, + { + {2, 0, 1}, + {0, 1, 2}, + {1, 2, 0}, + }, + { + {3, 0, 1}, + {0, 1, 2}, + {1, 2, 3}, + {2, 3, 0}, + }, + { + {4, 0, 1}, + {0, 1, 2}, + {1, 2, 3}, + {2, 3, 4}, + {3, 4, 0}, + }, +}; + +ALIGNED(4) +static const u8 sUnknown_84720FC[5][11] = +{ + {9, 9, 9, 9, 1, 1, 1, 9, 9, 9, 9}, + {9, 9, 9, 0, 0, 1, 1, 0, 9, 9, 9}, + {9, 9, 2, 2, 0, 0, 1, 1, 1, 9, 9}, + {9, 3, 3, 0, 0, 1, 1, 2, 2, 3, 9}, + {3, 3, 4, 4, 0, 0, 1, 1, 2, 2, 3}, +}; + +static const u8 sUnknown_8472133[5][5] = +{ + {5}, + {4, 6}, + {3, 5, 7}, + {2, 4, 6, 8}, + {1, 3, 5, 6, 9}, +}; + +static const u16 sDodrioBerryBgPal1[] = INCBIN_U16("graphics/link_games/dodrioberry_bg1.gbapal", + "graphics/link_games/dodrioberry_bg2.gbapal"); +static const u16 sDodrioBerryPkmnPal[] = INCBIN_U16("graphics/link_games/dodrioberry_pkmn.gbapal"); +static const u16 sDodrioBerryShinyPal[] = INCBIN_U16("graphics/link_games/dodrioberry_shiny.gbapal"); +static const u16 sDodrioBerryStatusPal[] = INCBIN_U16("graphics/link_games/dodrioberry_status.gbapal"); +static const u16 sDodrioBerrySpritesPal[] = INCBIN_U16("graphics/link_games/dodrioberry_berrysprites.gbapal"); +static const u32 sDodrioBerrySpritesGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_berrysprites.4bpp.lz"); +static const u16 sDodrioBerryPlatformPal[] = INCBIN_U16("graphics/link_games/dodrioberry_platform.gbapal"); +static const u32 sDodrioBerryBgGfx1[] = INCBIN_U32("graphics/link_games/dodrioberry_bg1.4bpp.lz"); +static const u32 sDodrioBerryBgGfx2[] = INCBIN_U32("graphics/link_games/dodrioberry_bg2.4bpp.lz"); +static const u32 sDodrioBerryStatusGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_status.4bpp.lz"); +static const u32 sDodrioBerryPlatformGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_platform.4bpp.lz"); +static const u32 sDodrioBerryPkmnGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_pkmn.4bpp.lz"); +static const u32 sDodrioBerryBgTilemap1[] = INCBIN_U32("graphics/link_games/dodrioberry_bg1.bin.lz"); +static const u32 sDodrioBerryBgTilemap2Right[] = INCBIN_U32("graphics/link_games/dodrioberry_bg2right.bin.lz"); +static const u32 sDodrioBerryBgTilemap2Left[] = INCBIN_U32("graphics/link_games/dodrioberry_bg2left.bin.lz"); + +#endif //GUARD_DATA_DODRIO_BERRY_PICKING_H diff --git a/src/dodrio_berry_picking.c b/src/dodrio_berry_picking.c index 40cf4ccb5..294b73053 100644 --- a/src/dodrio_berry_picking.c +++ b/src/dodrio_berry_picking.c @@ -1,45 +1,21 @@ #include "global.h" #include "gflib.h" #include "dodrio_berry_picking.h" +#include "event_data.h" #include "item.h" #include "link.h" #include "link_rfu.h" #include "m4a.h" #include "minigame_countdown.h" #include "random.h" +#include "script.h" #include "strings.h" #include "task.h" +#include "text_window.h" #include "constants/songs.h" #include "constants/fanfares.h" #include "constants/items.h" - -struct DodrioSubstruct_0160 -{ - /*0x0000 : 0x3000*/ u16 ALIGNED(4) tilemapBuffers[3][BG_SCREEN_SIZE]; - /*0x3000 : 0x3160*/ bool32 finished; - /*0x3004 : 0x3164*/ u8 ALIGNED(4) unk3004; - /*0x3008 : 0x3168*/ u8 ALIGNED(4) unk3008[10]; - /*0x3014 : 0x3174*/ u8 ALIGNED(4) state; - /*0x3018 : 0x3178*/ u8 ALIGNED(4) unk3018; - /*0x301C : 0x317C*/ u16 ALIGNED(4) unk301C; - /*0x3020 : 0x3180*/ u8 ALIGNED(4) unk3020; - /*0x3024 : 0x3184*/ u8 ALIGNED(4) unk3024; - /*0x3024 : 0x3184*/ void (*unk3028)(void); -}; // size = 0x302C - -struct DodrioStruct_2022CF4 -{ - u8 filler_00[0xc]; - u8 unkC[10]; - s16 unk16[10]; - u16 unk2A[10]; - u16 unk3E; -}; // size = 0x40 - -struct DodrioSubstruct_318C -{ - bool8 isShiny; -}; +#include "constants/species.h" struct DodrioSubstruct_3308 { @@ -102,12 +78,6 @@ struct DodrioStruct }; // size = 0x3330 EWRAM_DATA struct DodrioStruct * gUnknown_203F3E0 = NULL; -EWRAM_DATA u16 *gUnknown_203F3E4[5] = {NULL}; -EWRAM_DATA u16 *gUnknown_203F3F8[2] = {NULL}; -EWRAM_DATA u16 *gUnknown_203F400[11] = {NULL}; -EWRAM_DATA u16 *gUnknown_203F42C[4] = {NULL}; -EWRAM_DATA struct DodrioStruct_2022CF4 *gUnknown_203F43C = NULL; -EWRAM_DATA struct DodrioSubstruct_0160 *gUnknown_203F440 = NULL; IWRAM_DATA bool32 gUnknown_3002044; @@ -171,294 +141,12 @@ void sub_815336C(void); u32 sub_8153424(u8 mpId); u32 sub_81534AC(void); u32 Min(u32 x, u32 y); -void sub_8153A9C(void); -void sub_8153AFC(struct DodrioSubstruct_318C * unk318C, u8 a1, u8 a2, u8 a3); -void sub_8153BC0(u8 a0); -void sub_8153BF8(u8 a0); -void sub_8153D08(u8 playerCount); -void sub_8153D80(bool8 a0, u8 a1); -void sub_8153DA8(u8 a0, u8 a1); -void sub_8153FC8(u8 a0); -void sub_8153DD8(void); -void nullsub_97(struct Sprite *sprite); -void sub_8153E28(void); -void sub_8153ED8(void); -bool32 sub_8153F1C(void); -void sub_81540DC(bool8 a0); -void sub_8154128(void); -void sub_815417C(void); -void sub_8154274(void); -void sub_81542EC(u8 a0, u8 a1); -void sub_8154370(u8 a0, u8 a1); -void sub_8154398(u8 a0, u8 a1); -void sub_81543E8(struct Sprite *sprite); -void sub_8154438(void); -void sub_81544F0(void); -void sub_8154540(void); -void sub_8154578(void); -void sub_81545BC(bool8 a0); -void sub_81546C0(void); -void sub_8154730(void); -void sub_8154968(struct DodrioSubstruct_0160 * unk0160); -void sub_81549D4(u8 a0); -void sub_8154A2C(void); -void sub_8154B34(void); -void sub_8154F80(void); -void sub_81556E0(void); -void sub_8155A78(void); -void sub_8155B4C(void); -void sub_8155C2C(void); -void sub_8155C80(void); -void unused_0(void); -void nullsub_98(void); -u8 sub_8155E8C(void); +void Task_ShowDodrioBerryPickingRecords(u8 taskId); +void sub_81538D0(u8 windowId); // const rom data -// Large chunk of data -const struct BgTemplate sUnknown_847565C_Unref_Dupe[] = -{ - { - .bg = 0, - .charBaseIndex = 0, - .mapBaseIndex = 30, - .screenSize = 0, - .paletteMode = 0, - .priority = 0, - .baseTile = 0 - }, - { - .bg = 1, - .charBaseIndex = 2, - .mapBaseIndex = 12, - .screenSize = 1, - .paletteMode = 0, - .priority = 1, - .baseTile = 0 - }, - { - .bg = 2, - .charBaseIndex = 2, - .mapBaseIndex = 14, - .screenSize = 1, - .paletteMode = 0, - .priority = 1, - .baseTile = 0 - }, - { - .bg = 3, - .charBaseIndex = 3, - .mapBaseIndex = 31, - .screenSize = 0, - .paletteMode = 0, - .priority = 2, - .baseTile = 0 - }, -}; - -// Unknown unreferenced data, feel free to remove. -const u32 sUnused_Unref_Dupe[] = {255, 0}; - -const struct WindowTemplate sUnknown_8475674_Unref_Dupe[] = -{ - { - .bg = 0, - .tilemapLeft = 1, - .tilemapTop = 1, - .width = 28, - .height = 3, - .paletteNum = 13, - .baseBlock = 0x13, - }, - { - .bg = 0, - .tilemapLeft = 1, - .tilemapTop = 6, - .width = 28, - .height = 13, - .paletteNum = 13, - .baseBlock = 0x67, - } -}; - -const struct WindowTemplate sUnknown_8475684_Unref_Dupe = -{ - .bg = 0, - .tilemapLeft = 1, - .tilemapTop = 6, - .width = 28, - .height = 7, - .paletteNum = 13, - .baseBlock = 0x67, -}; - -const struct WindowTemplate sUnknown_847568C_Unref_Dupe[] = -{ - { - .bg = 0, - .tilemapLeft = 1, - .tilemapTop = 8, - .width = 19, - .height = 3, - .paletteNum = 13, - .baseBlock = 0x13, - }, - { - .bg = 0, - .tilemapLeft = 22, - .tilemapTop = 7, - .width = 6, - .height = 4, - .paletteNum = 13, - .baseBlock = 0x4C, - } -}; - -const struct WindowTemplate sUnknown_847569C_Unref_Dupe = -{ - .bg = 0, - .tilemapLeft = 4, - .tilemapTop = 6, - .width = 22, - .height = 5, - .paletteNum = 13, - .baseBlock = 0x13, -}; - -const struct WindowTemplate sUnknown_84756A4_Unref_Dupe = -{ - .bg = 0, - .tilemapLeft = 5, - .tilemapTop = 8, - .width = 19, - .height = 3, - .paletteNum = 13, - .baseBlock = 0x13, -}; - -const u8 sUnknown_8471F50[5][5][11] = -{ - { - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, - }, - { - {0, 1, 2, 3, 4, 5, 6, 3, 8, 9, 0}, - {0, 1, 2, 5, 6, 3, 4, 5, 8, 9, 0}, - }, - { - {0, 1, 2, 3, 4, 5, 6, 7, 2, 9, 0}, - {0, 1, 4, 5, 6, 7, 2, 3, 4, 9, 0}, - {0, 1, 6, 7, 2, 3, 4, 5, 6, 9, 0}, - }, - { - {0, 1, 2, 3, 4, 5, 6, 7, 8, 1, 0}, - {0, 3, 4, 5, 6, 7, 8, 1, 2, 3, 0}, - {0, 5, 6, 7, 8, 1, 2, 3, 4, 5, 0}, - {0, 7, 8, 1, 2, 3, 4, 5, 6, 7, 0}, - }, - { - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, - {2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2}, - {4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4}, - {6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6}, - {8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8}, - }, -}; - -const u8 sUnknown_8472063[5][5][3] = -{ - { - {4, 5, 6}, - }, - { - {3, 4, 5}, - {5, 6, 3}, - }, - { - {4, 5, 6}, - {6, 7, 2}, - {2, 3, 4}, - }, - { - {3, 4, 5}, - {5, 6, 7}, - {7, 8, 1}, - {1, 2, 3}, - }, - { - {4, 5, 6}, - {6, 7, 8}, - {8, 9, 0}, - {0, 1, 2}, - {2, 3, 4}, - }, -}; - -const u8 sUnknown_84720AE[5][5][3] = -{ - { - {1, 0, 1}, - }, - { - {1, 0, 1}, - {0, 1, 0}, - }, - { - {2, 0, 1}, - {0, 1, 2}, - {1, 2, 0}, - }, - { - {3, 0, 1}, - {0, 1, 2}, - {1, 2, 3}, - {2, 3, 0}, - }, - { - {4, 0, 1}, - {0, 1, 2}, - {1, 2, 3}, - {2, 3, 4}, - {3, 4, 0}, - }, -}; - -ALIGNED(4) -const u8 sUnknown_84720FC[5][11] = -{ - {9, 9, 9, 9, 1, 1, 1, 9, 9, 9, 9}, - {9, 9, 9, 0, 0, 1, 1, 0, 9, 9, 9}, - {9, 9, 2, 2, 0, 0, 1, 1, 1, 9, 9}, - {9, 3, 3, 0, 0, 1, 1, 2, 2, 3, 9}, - {3, 3, 4, 4, 0, 0, 1, 1, 2, 2, 3}, -}; - -const u8 sUnknown_8472133[5][5] = -{ - {5}, - {4, 6}, - {3, 5, 7}, - {2, 4, 6, 8}, - {1, 3, 5, 6, 9}, -}; - -// Duplicate and unused gfx. Feel free to remove. -const u32 sDuplicateGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_bg1.gbapal", - "graphics/link_games/dodrioberry_bg2.gbapal", - "graphics/link_games/dodrioberry_pkmn.gbapal", - "graphics/link_games/dodrioberry_shiny.gbapal", - "graphics/link_games/dodrioberry_status.gbapal", - "graphics/link_games/dodrioberry_berrysprites.gbapal", - "graphics/link_games/dodrioberry_berrysprites.4bpp.lz", - "graphics/link_games/dodrioberry_platform.gbapal", - "graphics/link_games/dodrioberry_bg1.4bpp.lz", - "graphics/link_games/dodrioberry_bg2.4bpp.lz", - "graphics/link_games/dodrioberry_status.4bpp.lz", - "graphics/link_games/dodrioberry_platform.4bpp.lz", - "graphics/link_games/dodrioberry_pkmn.4bpp.lz", - "graphics/link_games/dodrioberry_bg1.bin.lz", - "graphics/link_games/dodrioberry_bg2right.bin.lz", - "graphics/link_games/dodrioberry_bg2left.bin.lz"); +#include "data/dodrio_berry_picking.h" const u8 sUnknown_847553C[][3] = { @@ -2611,6 +2299,28 @@ u8 sub_81537AC(u8 id) return gUnknown_203F3E0->unk34[id]; } +void IsDodrioInParty(void) +{ + int i; + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_HAS_SPECIES) + && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_DODRIO) + { + gSpecialVar_Result = TRUE; + return; + } + } + + gSpecialVar_Result = FALSE; +} + +void ShowDodrioBerryPickingRecords(void) +{ + u8 taskId = CreateTask(Task_ShowDodrioBerryPickingRecords, 0); + Task_ShowDodrioBerryPickingRecords(taskId); +} + // Data related to printing saved results. const struct WindowTemplate sUnknown_84755E0 = { @@ -2630,6 +2340,67 @@ ALIGNED(4) const u8 sUnknown_84755FC[][2] = {{24}, {40}, {56}}; const u8 sUnknown_8475602[][2] = {{24}, {40}, {70}}; +void Task_ShowDodrioBerryPickingRecords(u8 taskId) +{ + struct WindowTemplate window; + s32 i, width, widthCurr; + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + data[1] = AddWindow(&sUnknown_84755E0); + sub_81538D0(data[1]); + CopyWindowToVram(data[1], 3); + data[0]++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + data[0]++; + break; + case 2: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + rbox_fill_rectangle(data[1]); + CopyWindowToVram(data[1], 1); + data[0]++; + } + break; + case 3: + if (!IsDma3ManagerBusyWithBgCopy()) + { + RemoveWindow(data[1]); + DestroyTask(taskId); + EnableBothScriptContexts(); + } + break; + } +} + +void sub_81538D0(u8 windowId) +{ + s32 i, x, numWidth; + s32 results[3]; + u8 strbuf[20]; + results[0] = gSaveBlock2Ptr->berryPick.berriesPicked; + results[1] = gSaveBlock2Ptr->berryPick.bestScore; + results[2] = gSaveBlock2Ptr->berryPick.berriesPickedInRow; + + TextWindow_SetStdFrame0_WithPal(windowId, 0x21D, 0xD0); + DrawTextBorderOuter(windowId, 0x21D, 0xD); + FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); + AddTextPrinterParameterized(windowId, 2, sUnknown_84755E8[0], 1, 1, TEXT_SPEED_FF, NULL); + for (i = 0; i < 3; i++) + { + ConvertIntToDecimalStringN(strbuf, results[i], STR_CONV_MODE_LEFT_ALIGN, sUnknown_84755F8[i]); + numWidth = GetStringWidth(2, strbuf, -1); + AddTextPrinterParameterized(windowId, 2, sUnknown_84755E8[i + 1], 1, sUnknown_84755FC[i][0], TEXT_SPEED_FF, NULL); + x = 224 - numWidth; + AddTextPrinterParameterized(windowId, 2, strbuf, x, sUnknown_8475602[i][0], TEXT_SPEED_FF, NULL); + } + PutWindowTilemap(windowId); +} + // Debug functions? const u16 sUnknown_8475608[][4] = { @@ -2644,7 +2415,7 @@ const u8 sUnknown_8475630[] = _("あいうえおかき"); const u8 sUnknown_8475638[] = _("ABCDEFG"); const u8 sUnknown_8475640[] = _("0123456"); -const u8 *const sUnknown_8475648[] = +const u8 *const sPlaceholderPlayerNames[] = { sUnknown_8475630, sUnknown_8475630, @@ -2653,585 +2424,22 @@ const u8 *const sUnknown_8475648[] = sUnknown_8475640 }; -// Large chunk of data -const struct BgTemplate sUnknown_847565C[] = -{ - { - .bg = 0, - .charBaseIndex = 0, - .mapBaseIndex = 30, - .screenSize = 0, - .paletteMode = 0, - .priority = 0, - .baseTile = 0 - }, - { - .bg = 1, - .charBaseIndex = 2, - .mapBaseIndex = 12, - .screenSize = 1, - .paletteMode = 0, - .priority = 1, - .baseTile = 0 - }, - { - .bg = 2, - .charBaseIndex = 2, - .mapBaseIndex = 14, - .screenSize = 1, - .paletteMode = 0, - .priority = 1, - .baseTile = 0 - }, - { - .bg = 3, - .charBaseIndex = 3, - .mapBaseIndex = 31, - .screenSize = 0, - .paletteMode = 0, - .priority = 2, - .baseTile = 0 - }, -}; - -// Unknown unreferenced data, feel free to remove. -const u32 sUnused[] = {255, 0}; - -const struct WindowTemplate sUnknown_8475674[] = +void sub_81539EC(void) { - { - .bg = 0, - .tilemapLeft = 1, - .tilemapTop = 1, - .width = 28, - .height = 3, - .paletteNum = 13, - .baseBlock = 0x13, - }, - { - .bg = 0, - .tilemapLeft = 1, - .tilemapTop = 6, - .width = 28, - .height = 13, - .paletteNum = 13, - .baseBlock = 0x67, - } -}; - -const struct WindowTemplate sUnknown_8475684 = -{ - .bg = 0, - .tilemapLeft = 1, - .tilemapTop = 6, - .width = 28, - .height = 7, - .paletteNum = 13, - .baseBlock = 0x67, -}; - -const struct WindowTemplate sUnknown_847568C[] = -{ - { - .bg = 0, - .tilemapLeft = 1, - .tilemapTop = 8, - .width = 19, - .height = 3, - .paletteNum = 13, - .baseBlock = 0x13, - }, - { - .bg = 0, - .tilemapLeft = 22, - .tilemapTop = 7, - .width = 6, - .height = 4, - .paletteNum = 13, - .baseBlock = 0x4C, - } -}; - -const struct WindowTemplate sUnknown_847569C = -{ - .bg = 0, - .tilemapLeft = 4, - .tilemapTop = 6, - .width = 22, - .height = 5, - .paletteNum = 13, - .baseBlock = 0x13, -}; - -const struct WindowTemplate sUnknown_84756A4 = -{ - .bg = 0, - .tilemapLeft = 5, - .tilemapTop = 8, - .width = 19, - .height = 3, - .paletteNum = 13, - .baseBlock = 0x13, -}; + gUnknown_203F3E0->unk24 = GetLinkPlayerCount(); +} -// This is an unused copy of the tables from the top of the file. Feel free to remove. -const u8 sUnknown_8471F50_UnrefDup[5][5][11] = +void sub_8153A04(void) { - { - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, - }, - { - {0, 1, 2, 3, 4, 5, 6, 3, 8, 9, 0}, - {0, 1, 2, 5, 6, 3, 4, 5, 8, 9, 0}, - }, - { - {0, 1, 2, 3, 4, 5, 6, 7, 2, 9, 0}, - {0, 1, 4, 5, 6, 7, 2, 3, 4, 9, 0}, - {0, 1, 6, 7, 2, 3, 4, 5, 6, 9, 0}, - }, - { - {0, 1, 2, 3, 4, 5, 6, 7, 8, 1, 0}, - {0, 3, 4, 5, 6, 7, 8, 1, 2, 3, 0}, - {0, 5, 6, 7, 8, 1, 2, 3, 4, 5, 0}, - {0, 7, 8, 1, 2, 3, 4, 5, 6, 7, 0}, - }, - { - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, - {2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2}, - {4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4}, - {6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6}, - {8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8}, - }, -}; + u8 i, playerId; -const u8 sUnknown_8472063_UnrefDup[5][5][3] = -{ - { - {4, 5, 6}, - }, - { - {3, 4, 5}, - {5, 6, 3}, - }, - { - {4, 5, 6}, - {6, 7, 2}, - {2, 3, 4}, - }, - { - {3, 4, 5}, - {5, 6, 7}, - {7, 8, 1}, - {1, 2, 3}, - }, - { - {4, 5, 6}, - {6, 7, 8}, - {8, 9, 0}, - {0, 1, 2}, - {2, 3, 4}, - }, -}; + for (playerId = gUnknown_203F3E0->unk24; playerId < NELEMS(sPlaceholderPlayerNames); playerId++) + StringCopy(gLinkPlayers[playerId].name, sPlaceholderPlayerNames[playerId]); -const u8 sUnknown_84720AE_UnrefDup[5][5][3] = -{ - { - {1, 0, 1}, - }, - { - {1, 0, 1}, - {0, 1, 0}, - }, - { - {2, 0, 1}, - {0, 1, 2}, - {1, 2, 0}, - }, - { - {3, 0, 1}, - {0, 1, 2}, - {1, 2, 3}, - {2, 3, 0}, - }, + gUnknown_203F3E0->unk24 = 5; + for (i = 0; i < 4; i++) { - {4, 0, 1}, - {0, 1, 2}, - {1, 2, 3}, - {2, 3, 4}, - {3, 4, 0}, - }, -}; - -ALIGNED(4) -const u8 sUnknown_84720FC_UnrefDup[5][11] = -{ - {9, 9, 9, 9, 1, 1, 1, 9, 9, 9, 9}, - {9, 9, 9, 0, 0, 1, 1, 0, 9, 9, 9}, - {9, 9, 2, 2, 0, 0, 1, 1, 1, 9, 9}, - {9, 3, 3, 0, 0, 1, 1, 2, 2, 3, 9}, - {3, 3, 4, 4, 0, 0, 1, 1, 2, 2, 3}, -}; - -const u8 sUnknown_8472133_UnrefDup[5][5] = -{ - {5}, - {4, 6}, - {3, 5, 7}, - {2, 4, 6, 8}, - {1, 3, 5, 6, 9}, -}; - -const u16 sDodrioBerryBgPal1[] = INCBIN_U16("graphics/link_games/dodrioberry_bg1.gbapal", - "graphics/link_games/dodrioberry_bg2.gbapal"); -const u16 sDodrioBerryPkmnPal[] = INCBIN_U16("graphics/link_games/dodrioberry_pkmn.gbapal"); -const u16 sDodrioBerryShinyPal[] = INCBIN_U16("graphics/link_games/dodrioberry_shiny.gbapal"); -const u16 sDodrioBerryStatusPal[] = INCBIN_U16("graphics/link_games/dodrioberry_status.gbapal"); -const u16 sDodrioBerrySpritesPal[] = INCBIN_U16("graphics/link_games/dodrioberry_berrysprites.gbapal"); -const u32 sDodrioBerrySpritesGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_berrysprites.4bpp.lz"); -const u16 sDodrioBerryPlatformPal[] = INCBIN_U16("graphics/link_games/dodrioberry_platform.gbapal"); -const u32 sDodrioBerryBgGfx1[] = INCBIN_U32("graphics/link_games/dodrioberry_bg1.4bpp.lz"); -const u32 sDodrioBerryBgGfx2[] = INCBIN_U32("graphics/link_games/dodrioberry_bg2.4bpp.lz"); -const u32 sDodrioBerryStatusGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_status.4bpp.lz"); -const u32 sDodrioBerryPlatformGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_platform.4bpp.lz"); -const u32 sDodrioBerryPkmnGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_pkmn.4bpp.lz"); -const u32 sDodrioBerryBgTilemap1[] = INCBIN_U32("graphics/link_games/dodrioberry_bg1.bin.lz"); -const u32 sDodrioBerryBgTilemap2Right[] = INCBIN_U32("graphics/link_games/dodrioberry_bg2right.bin.lz"); -const u32 sDodrioBerryBgTilemap2Left[] = INCBIN_U32("graphics/link_games/dodrioberry_bg2left.bin.lz"); - -const struct OamData sOamData_8478C98 = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .mosaic = FALSE, - .bpp = ST_OAM_4BPP, - .shape = SPRITE_SHAPE(64x64), - .x = 0, - .matrixNum = 0, - .size = SPRITE_SIZE(64x64), - .tileNum = 0, - .priority = 2, - .paletteNum = 0, - .affineParam = 0 -}; - -const struct OamData sOamData_8478CA0 = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .mosaic = FALSE, - .bpp = ST_OAM_4BPP, - .shape = SPRITE_SHAPE(16x16), - .x = 0, - .matrixNum = 0, - .size = SPRITE_SIZE(16x16), - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0 -}; - -const struct OamData sOamData_8478CA8 = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .mosaic = FALSE, - .bpp = ST_OAM_4BPP, - .shape = SPRITE_SHAPE(16x16), - .x = 0, - .matrixNum = 0, - .size = SPRITE_SIZE(16x16), - .tileNum = 0, - .priority = 2, - .paletteNum = 0, - .affineParam = 0 -}; - -const struct OamData sOamData_8478CB0 = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .mosaic = FALSE, - .bpp = ST_OAM_4BPP, - .shape = SPRITE_SHAPE(64x32), - .x = 0, - .matrixNum = 0, - .size = SPRITE_SIZE(64x32), - .tileNum = 0, - .priority = 3, - .paletteNum = 0, - .affineParam = 0 -}; - -const union AnimCmd sSpriteAnim_8478CB8[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd sSpriteAnim_8478CC0[] = -{ - ANIMCMD_FRAME(64, 20), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd sSpriteAnim_8478CC8[] = -{ - ANIMCMD_FRAME(128, 20), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd sSpriteAnim_8478CD0[] = -{ - ANIMCMD_FRAME(192, 20), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd sSpriteAnim_8478CD8[] = -{ - ANIMCMD_FRAME(256, 20), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd *const sSpriteAnimTable_8478CE0[] = -{ - sSpriteAnim_8478CB8, - sSpriteAnim_8478CC0, - sSpriteAnim_8478CC8, - sSpriteAnim_8478CD0, - sSpriteAnim_8478CD8 -}; - -const union AnimCmd sSpriteAnim_8478CF4[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd sSpriteAnim_8478CFC[] = -{ - ANIMCMD_FRAME(4, 20), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd sSpriteAnim_8478D04[] = -{ - ANIMCMD_FRAME(8, 20), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd *const sSpriteAnimTable_8478D0C[] = -{ - sSpriteAnim_8478CF4, - sSpriteAnim_8478CFC, - sSpriteAnim_8478D04 -}; - -const union AnimCmd sSpriteAnim_8478D18[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd sSpriteAnim_8478D20[] = -{ - ANIMCMD_FRAME(4, 20), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd sSpriteAnim_8478D28[] = -{ - ANIMCMD_FRAME(8, 20), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd sSpriteAnim_8478D30[] = -{ - ANIMCMD_FRAME(12, 20), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd sSpriteAnim_8478D38[] = -{ - ANIMCMD_FRAME(16, 20), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd sSpriteAnim_8478D40[] = -{ - ANIMCMD_FRAME(20, 20), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd sSpriteAnim_8478D48[] = -{ - ANIMCMD_FRAME(24, 20), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd sSpriteAnim_8478D50[] = -{ - ANIMCMD_FRAME(28, 20), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd sSpriteAnim_8478D58[] = -{ - ANIMCMD_FRAME(32, 20), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd *const sSpriteAnimTable_8478D60[] = -{ - sSpriteAnim_8478D18, - sSpriteAnim_8478D20, - sSpriteAnim_8478D28, - sSpriteAnim_8478D30, - sSpriteAnim_8478D38, - sSpriteAnim_8478D40, - sSpriteAnim_8478D48, - sSpriteAnim_8478D50, - sSpriteAnim_8478D58 -}; - -const union AnimCmd sSpriteAnim_8478D84[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd *const sSpriteAnimTable_8478D8C[] = -{ - sSpriteAnim_8478D84 -}; - -// These are declared inside pokeemerald's sub_8153A9C -const struct SpritePalette gUnknown_8478D90 = {sDodrioBerryPkmnPal, 0}; -const struct SpritePalette gUnknown_8478D98 = {sDodrioBerryShinyPal, 1}; - -// These are declared inside pokeemerald's sub_8153E28 -const struct SpritePalette gUnknown_8478DA0 = {sDodrioBerryStatusPal, 2}; -const struct SpriteTemplate gUnknown_8478DA8 = - { - .tileTag = 1, - .paletteTag = 2, - .oam = &sOamData_8478CA0, - .anims = sSpriteAnimTable_8478D0C, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = nullsub_97, - }; - -// Unknown unused data, feel free to remove. -const u8 sUnused2[] = {0xCD, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0xF4, 0x0, 0x0}; - -// This is declared inside pokeemerald's sub_8154128 -const struct SpritePalette gUnknown_8478DCC = {sDodrioBerrySpritesPal, 3}; - -const s16 sUnknown_8478DD4[] = {88, 128, 168, 208}; - -// These are declared inside pokeemerald's sub_815417C -const struct SpriteTemplate gUnknown_8478DDC = - { - .tileTag = 2, - .paletteTag = 3, - .oam = &sOamData_8478CA8, - .anims = sSpriteAnimTable_8478D60, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - }; -const struct SpriteTemplate gUnknown_8478DF4 = - { - .tileTag = 2, - .paletteTag = 3, - .oam = &sOamData_8478CA0, - .anims = sSpriteAnimTable_8478D60, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - }; - -// This is declared inside pokeemerald's sub_8028CF4 -const u8 gUnknown_8478E0C[] = {30, 20}; - -const s16 gUnknown_8478E0E[][2] = {{230, 55}, {30, 74}}; - -// These are declared inside pokeemerald's sub_8154438 -const struct SpritePalette gUnknown_8478E18 = {sDodrioBerryPlatformPal, 6}; -const struct SpriteTemplate gUnknown_8478E20 = - { - .tileTag = 5, - .paletteTag = 6, - .oam = &sOamData_8478CB0, - .anims = sSpriteAnimTable_8478D8C, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_81543E8, - }; - -struct WinCoords -{ - u8 left; - u8 top; -}; - -const u8 sUnknown_8478E38[][3] = -{ - {1, 2, 3}, - {1, 4, 5}, - {1, 8, 9}, - {1, 6, 7}, -}; - -const struct WinCoords sUnknown_8478E44[] = {{12, 6}}; -const struct WinCoords sUnknown_8478E48[] = {{9, 10}, {15, 6}}; -const struct WinCoords sUnknown_8478E50[] = {{12, 6}, {18, 10}, {6, 10}}; -const struct WinCoords sUnknown_8478E5C[] = {{9, 10}, {15, 6}, {21, 10}, {3, 6}}; -const struct WinCoords sUnknown_8478E6C[] = {{12, 6}, {18, 10}, {23, 6}, {1, 6}, {6, 10}}; - -const struct WinCoords *const sUnknown_8478E80[] = -{ - sUnknown_8478E44, - sUnknown_8478E48, - sUnknown_8478E50, - sUnknown_8478E5C, - sUnknown_8478E6C, -}; - -const u8 *const sUnknown_8478E94[] = -{ - gText_1Colon, - gText_2Colon, - gText_3Colon, - gText_4Colon, - gText_5Colon, -}; - -const u16 sUnknown_8478EA8[] = {92, 132, 172, 212}; -const u16 sUnknown_8478EB0[] = {30, 45, 60, 75, 90}; -const u16 sUnknown_8478EBA[] = {12, 28, 44, 60, 76}; - -struct -{ - u8 id; - void (*func)(void); -} const gUnknown_8478EC4[] = -{ - {0, sub_8154A2C}, - {1, sub_8154B34}, - {2, sub_8154F80}, - {3, sub_81556E0}, - {4, sub_8155A78}, - {5, sub_8155B4C}, - {6, sub_8155C2C}, - {7, sub_8155C80}, - {8, unused_0}, - {9, nullsub_98}, -}; - -// This is declared inside pokeemerald's sub_80296A8 -const u8 gUnknown_8478F14[5] = {0, 1, 2, 3, 4}; + for (playerId = 0; playerId < gUnknown_203F3E0->unk24; playerId++) + gUnknown_203F3E0->unk4A[playerId][i] = sUnknown_8475608[playerId][i]; + } +} diff --git a/src/dodrio_berry_picking_2.c b/src/dodrio_berry_picking_2.c index 4260c6f2f..1589b13b8 100644 --- a/src/dodrio_berry_picking_2.c +++ b/src/dodrio_berry_picking_2.c @@ -1,23 +1,1040 @@ #include "global.h" +#include "gflib.h" +#include "dodrio_berry_picking.h" #include "link.h" -#include "link_rfu.h" +#include "strings.h" +#include "task.h" +#include "text_window.h" +#include "text_window_graphics.h" +#include "constants/songs.h" -void sub_815A5BC(s32 a0) +// Temporary stopgap to export duplicate data +// included from data/dodrio_berry_picking.h +asm(".global sDodrioBerryStatusGfx\n" + "\t.global sDodrioBerrySpritesGfx\n" + "\t.global sDodrioBerryPlatformGfx\n" + "\t.global sDodrioBerryBgTilemap1\n" + "\t.global sDodrioBerryBgTilemap2Left\n" + "\t.global sDodrioBerryBgTilemap2Right\n" + "\t.global sUnknown_8475674\n" + "\t.global sUnknown_8475684\n" + "\t.global sUnknown_847568C\n" + "\t.global sUnknown_84756A4\n" + "\t.global sUnknown_847569C\n" + "\t.global sUnknown_847565C\n" + "\t.global sDodrioBerryBgPal1\n" + "\t.global sDodrioBerryBgGfx1\n" + "\t.global sDodrioBerryBgGfx2"); + +struct DodrioStruct_2022CF4 +{ + u8 filler_00[0xc]; + u8 unkC[10]; + s16 unk16[10]; + u16 unk2A[10]; + u16 unk3E; +}; // size = 0x40 + +EWRAM_DATA u16 *gUnknown_203F3E4[5] = {NULL}; +EWRAM_DATA u16 *gUnknown_203F3F8[2] = {NULL}; +EWRAM_DATA u16 *gUnknown_203F400[11] = {NULL}; +EWRAM_DATA u16 *gUnknown_203F42C[4] = {NULL}; +EWRAM_DATA struct DodrioStruct_2022CF4 *gUnknown_203F43C = NULL; +EWRAM_DATA struct DodrioSubstruct_0160 *gUnknown_203F440 = NULL; + +void sub_8153B9C(struct Sprite * sprite); +u32 sub_8153C30(struct Sprite * sprite); +u32 sub_8153CA0(struct Sprite * sprite); +void sub_8153D48(bool8 a0, u8 a1); +void nullsub_97(struct Sprite *sprite); +void sub_8154324(bool8 a0); +void sub_81543E8(struct Sprite *sprite); +s16 sub_8154608(u8 a0, u8 a1); +void sub_8154A08(u8 taskId); +void sub_8154A2C(void); +void sub_8154B34(void); +void sub_8154F80(void); +void sub_81556E0(void); +void sub_8155A78(void); +void sub_8155B4C(void); +void sub_8155C2C(void); +void sub_8155C80(void); +void unused_0(void); +void nullsub_98(void); +void sub_8155E24(MainCallback cb); +MainCallback sub_8155E54(void); +void sub_8155EA0(void); +bool32 sub_8155FE0(void); + +#include "data/dodrio_berry_picking.h" + +const struct OamData sOamData_8478C98 = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(64x64), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(64x64), + .tileNum = 0, + .priority = 2, + .paletteNum = 0, + .affineParam = 0 +}; + +const struct OamData sOamData_8478CA0 = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(16x16), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(16x16), + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +const struct OamData sOamData_8478CA8 = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(16x16), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(16x16), + .tileNum = 0, + .priority = 2, + .paletteNum = 0, + .affineParam = 0 +}; + +const struct OamData sOamData_8478CB0 = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(64x32), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(64x32), + .tileNum = 0, + .priority = 3, + .paletteNum = 0, + .affineParam = 0 +}; + +const union AnimCmd sSpriteAnim_8478CB8[] = +{ + ANIMCMD_FRAME(0, 20), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd sSpriteAnim_8478CC0[] = +{ + ANIMCMD_FRAME(64, 20), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd sSpriteAnim_8478CC8[] = +{ + ANIMCMD_FRAME(128, 20), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd sSpriteAnim_8478CD0[] = +{ + ANIMCMD_FRAME(192, 20), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd sSpriteAnim_8478CD8[] = +{ + ANIMCMD_FRAME(256, 20), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd *const sSpriteAnimTable_8478CE0[] = +{ + sSpriteAnim_8478CB8, + sSpriteAnim_8478CC0, + sSpriteAnim_8478CC8, + sSpriteAnim_8478CD0, + sSpriteAnim_8478CD8 +}; + +const union AnimCmd sSpriteAnim_8478CF4[] = +{ + ANIMCMD_FRAME(0, 20), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd sSpriteAnim_8478CFC[] = +{ + ANIMCMD_FRAME(4, 20), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd sSpriteAnim_8478D04[] = +{ + ANIMCMD_FRAME(8, 20), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd *const sSpriteAnimTable_8478D0C[] = +{ + sSpriteAnim_8478CF4, + sSpriteAnim_8478CFC, + sSpriteAnim_8478D04 +}; + +const union AnimCmd sSpriteAnim_8478D18[] = +{ + ANIMCMD_FRAME(0, 20), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd sSpriteAnim_8478D20[] = +{ + ANIMCMD_FRAME(4, 20), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd sSpriteAnim_8478D28[] = +{ + ANIMCMD_FRAME(8, 20), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd sSpriteAnim_8478D30[] = +{ + ANIMCMD_FRAME(12, 20), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd sSpriteAnim_8478D38[] = +{ + ANIMCMD_FRAME(16, 20), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd sSpriteAnim_8478D40[] = { - struct Padded_U8 data[2]; - data[0].value = 1; - data[1].value = a0; - RfuPrepareSend0x2f00(data); + ANIMCMD_FRAME(20, 20), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd sSpriteAnim_8478D48[] = +{ + ANIMCMD_FRAME(24, 20), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd sSpriteAnim_8478D50[] = +{ + ANIMCMD_FRAME(28, 20), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd sSpriteAnim_8478D58[] = +{ + ANIMCMD_FRAME(32, 20), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd *const sSpriteAnimTable_8478D60[] = +{ + sSpriteAnim_8478D18, + sSpriteAnim_8478D20, + sSpriteAnim_8478D28, + sSpriteAnim_8478D30, + sSpriteAnim_8478D38, + sSpriteAnim_8478D40, + sSpriteAnim_8478D48, + sSpriteAnim_8478D50, + sSpriteAnim_8478D58 +}; + +const union AnimCmd sSpriteAnim_8478D84[] = +{ + ANIMCMD_FRAME(0, 20), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd *const sSpriteAnimTable_8478D8C[] = +{ + sSpriteAnim_8478D84 +}; + +// Code + +void sub_8153A9C(void) +{ + void *ptr = AllocZeroed(0x3000); + struct SpritePalette pal1 = {sDodrioBerryPkmnPal, 0}; + struct SpritePalette pal2 = {sDodrioBerryShinyPal, 1}; + + LZ77UnCompWram(sDodrioBerryPkmnGfx, ptr); + // This check should be one line up. + if (ptr != NULL) + { + struct SpriteSheet sheet = {ptr, 0x3000, 0}; + LoadSpriteSheet(&sheet); + Free(ptr); + } + LoadSpritePalette(&pal1); + LoadSpritePalette(&pal2); +} + +void sub_8153AFC(struct DodrioSubstruct_318C *arg0, u8 arg1, u8 id, u8 arg3) +{ + struct SpriteTemplate sprTemplate = + { + .tileTag = 0, + .paletteTag = arg0->isShiny, + .oam = &sOamData_8478C98, + .anims = sSpriteAnimTable_8478CE0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_8153B9C, + }; + + gUnknown_203F3E4[id] = AllocZeroed(4); + *gUnknown_203F3E4[id] = CreateSprite(&sprTemplate, sub_8154608(arg1, arg3), 136, 3); + sub_8153D48(TRUE, id); +} + +void sub_8153B9C(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + break; + case 1: + sub_8153C30(sprite); + break; + case 2: + sub_8153CA0(sprite); + break; + } +} + +void sub_8153BC0(u8 unused) +{ + struct Sprite *sprite = &gSprites[*gUnknown_203F3E4[GetMultiplayerId()]]; + sprite->data[0] = 1; + sprite->data[1] = 0; + sprite->data[2] = 0; + sprite->data[3] = 0; + sprite->data[4] = 0; +} + +void sub_8153BF8(u8 unused) +{ + struct Sprite *sprite = &gSprites[*gUnknown_203F3E4[GetMultiplayerId()]]; + sprite->data[0] = 2; + sprite->data[1] = 0; + sprite->data[2] = 0; + sprite->data[3] = 0; + sprite->data[4] = 0; } -u8 sub_815A5E8(s32 a0) +u32 sub_8153C30(struct Sprite *sprite) { - u8 * r1; - if ((gRecvCmds[0][0] & 0xFF00) != 0x2F00) - return 0; - r1 = (u8 *)&gRecvCmds[a0][1]; - if (r1[0] == 1) - return r1[4]; + s8 var; + u8 mod = (++sprite->data[1] / 2) % 4; + + if (sprite->data[1] >= 3) + { + switch (mod) + { + default: + var = 1; + break; + case 1: + case 2: + var = -1; + break; + } + + sprite->pos1.x += var; + if (++sprite->data[1] >= 40) + { + sprite->data[0] = 0; + sprite->pos1.x = sub_8154608(0, sub_81533B4()); + } + } + + return 0; +} + +u32 sub_8153CA0(struct Sprite *sprite) +{ + u8 mod = (++sprite->data[1] / 13) % 4; + + if (sprite->data[1] % 13 == 0 && mod != 0) + PlaySE(SE_W204); + if (sprite->data[1] >= 104) + { + sprite->data[0] = 0; + mod = 0; + } + sub_8153DA8(GetMultiplayerId(), mod); return 0; } +void sub_8153D08(u8 count) +{ + u8 i; + for (i = 0; i < count; i++) + { + struct Sprite *sprite = &gSprites[*gUnknown_203F3E4[i]]; + if (sprite != NULL) + DestroySpriteAndFreeResources(sprite); + // Memory should be freed here but is not. + } +} + +void sub_8153D48(bool8 invisible, u8 id) +{ + gSprites[*gUnknown_203F3E4[id]].invisible = invisible; +} + +void sub_8153D80(bool8 invisible, u8 count) +{ + u8 i; + for (i = 0; i < count; i++) + sub_8153D48(invisible, i); +} + +void sub_8153DA8(u8 id, u8 frameNum) +{ + StartSpriteAnim(&gSprites[*gUnknown_203F3E4[id]], frameNum); +} + +void nullsub_97(struct Sprite * sprite) +{ + +} + +void sub_8153DD8(void) +{ + u8 i; + for (i = 0; i < 10; i++) + { + struct Sprite *sprite = &gSprites[gUnknown_203F43C->unk2A[i]]; + sprite->pos1.x = (i * 16) + 48; + sprite->pos1.y = -8 - (i * 8); + gUnknown_203F43C->unkC[i] = 0; + } +} + +void sub_8153E28(void) +{ + u8 i; + void *ptr = AllocZeroed(0x180); + struct SpritePalette spPal = {sDodrioBerryStatusPal, 2}; + + LZ77UnCompWram(sDodrioBerryStatusGfx, ptr); + // This check should be one line up. + if (ptr != NULL) + { + struct SpriteSheet spSheet = {ptr, 0x180, 1}; + struct SpriteTemplate spTemplate = + { + .tileTag = 1, + .paletteTag = 2, + .oam = &sOamData_8478CA0, + .anims = sSpriteAnimTable_8478D0C, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = nullsub_97, + }; + + gUnknown_203F43C = AllocZeroed(sizeof(*gUnknown_203F43C)); + LoadSpriteSheet(&spSheet); + LoadSpritePalette(&spPal); + for (i = 0; i < 10; i++) + gUnknown_203F43C->unk2A[i] = CreateSprite(&spTemplate, (i * 16) + 48, -8 - (i * 8), 0); + } + + Free(ptr); +} + +void sub_8153ED8(void) +{ + u8 i; + for (i = 0; i < 10; i++) + { + struct Sprite *sprite = &gSprites[gUnknown_203F43C->unk2A[i]]; + if (sprite != NULL) + DestroySpriteAndFreeResources(sprite); + } + FREE_AND_SET_NULL(gUnknown_203F43C); +} + +bool32 sub_8153F1C(void) +{ + u8 i; + bool32 r3 = FALSE; + for (i = 0; i < 10; i++) + { + struct Sprite *sprite = &gSprites[gUnknown_203F43C->unk2A[i]]; + gUnknown_203F43C->unk16[i] = 2; + if (gUnknown_203F43C->unkC[i] != 0 && sprite->pos1.y == 8) + continue; + r3 = TRUE; + if (sprite->pos1.y == 8) + { + if (gUnknown_203F43C->unkC[i] != 0) + continue; + gUnknown_203F43C->unkC[i] = 1; + gUnknown_203F43C->unk16[i] = -16; + PlaySE(SE_TK_KASYA); + } + sprite->pos1.y += gUnknown_203F43C->unk16[i]; + } + + if (r3) + return FALSE; + else + return TRUE; +} + +void sub_8153FC8(u8 arg0) +{ + u8 i; + + if (arg0 > 10) + { + for (i = 0; i < 10; i++) + StartSpriteAnim(&gSprites[gUnknown_203F43C->unk2A[i]], 1); + } + else + { + for (i = 0; i < 10 - arg0; i++) + { + if (arg0 > 6) + { + gUnknown_203F43C->unk3E += arg0 - 6; + if (gUnknown_203F43C->unk3E > 30) + gUnknown_203F43C->unk3E = 0; + else if (gUnknown_203F43C->unk3E > 10) + StartSpriteAnim(&gSprites[gUnknown_203F43C->unk2A[i]], 2); + else + StartSpriteAnim(&gSprites[gUnknown_203F43C->unk2A[i]], 0); + } + else + { + StartSpriteAnim(&gSprites[gUnknown_203F43C->unk2A[i]], 0); + } + } + for (; i < 10; i++) + StartSpriteAnim(&gSprites[gUnknown_203F43C->unk2A[i]], 1); + } +} + +void sub_81540DC(bool8 invisible) +{ + u8 i; + for (i = 0; i < 10; i++) + gSprites[gUnknown_203F43C->unk2A[i]].invisible = invisible; +} + +// Unknown unused data, feel free to remove. +const u8 sUnused2[] = { + SE_W204, + SE_TOY_C, + SE_TOY_D, + SE_TOY_E, + SE_TOY_F, + SE_TOY_G, + SE_TOY_A, + SE_TOY_B, + SE_TOY_C1, + SE_CARD3 +}; + +void sub_8154128(void) +{ + void *ptr = AllocZeroed(0x480); + struct SpritePalette sprPal = {sDodrioBerrySpritesPal, 3}; + + LZ77UnCompWram(sDodrioBerrySpritesGfx, ptr); + if (ptr != NULL) + { + struct SpriteSheet sprSheet = {ptr, 0x480, 2}; + LoadSpriteSheet(&sprSheet); + } + + LoadSpritePalette(&sprPal); + Free(ptr); +} + +const s16 sUnknown_8478DD4[] = {88, 128, 168, 208}; + +void sub_815417C(void) +{ + u8 i; + s16 x; + + struct SpriteTemplate sprTemplate1 = + { + .tileTag = 2, + .paletteTag = 3, + .oam = &sOamData_8478CA8, + .anims = sSpriteAnimTable_8478D60, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }; + struct SpriteTemplate sprTemplate2 = + { + .tileTag = 2, + .paletteTag = 3, + .oam = &sOamData_8478CA0, + .anims = sSpriteAnimTable_8478D60, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }; + + for (i = 0; i < 11; i++) + { + gUnknown_203F400[i] = AllocZeroed(4); + x = i * 16; + *gUnknown_203F400[i] = CreateSprite(&sprTemplate1, x + (i * 8), 8, 1); + sub_81542EC(i, TRUE); + } + for (i = 0; i < 4; i++) + { + gUnknown_203F42C[i] = AllocZeroed(4); + if (i == 3) + *gUnknown_203F42C[i] = CreateSprite(&sprTemplate2, sUnknown_8478DD4[i], 57, 0); + else + *gUnknown_203F42C[i] = CreateSprite(&sprTemplate2, sUnknown_8478DD4[i], 60, 0); + StartSpriteAnim(&gSprites[*gUnknown_203F42C[i]], i); + } + + sub_8154324(TRUE); +} + +void sub_8154274(void) +{ + struct Sprite *sprite; + u8 i; + + for (i = 0; i < 11; i++) + { + sprite = &gSprites[*gUnknown_203F400[i]]; + if (sprite != NULL) + DestroySprite(sprite); + FREE_AND_SET_NULL(gUnknown_203F400[i]); + } + for (i = 0; i < 4; i++) + { + sprite = &gSprites[*gUnknown_203F42C[i]]; + if (sprite != NULL) + DestroySprite(sprite); + FREE_AND_SET_NULL(gUnknown_203F42C[i]); + } +} + +void sub_81542EC(u8 id, bool8 invisible) +{ + gSprites[*gUnknown_203F400[id]].invisible = invisible; +} + +void sub_8154324(bool8 invisible) +{ + u8 i; + for (i = 0; i < 4; i++) + gSprites[*gUnknown_203F42C[i]].invisible = invisible; +} + +void sub_8154370(u8 id, u8 y) +{ + gSprites[*gUnknown_203F400[id]].pos1.y = y * 8; +} + +void sub_8154398(u16 id, u8 frameNum) +{ + StartSpriteAnim(&gSprites[*gUnknown_203F400[id]], frameNum); +} + +// Unused +void sub_81543C4(u8 spriteId) +{ + gSprites[spriteId].pos1.x = 20 * spriteId + 50; + gSprites[spriteId].pos1.y = 50; +} + +// Gamefreak made a mistake there and goes out of bounds for the data array as it holds 8 elements +// in turn overwriting sprite's subpriority and subsprites fields. +#if defined(NONMATCHING) +#define sKeepPosX data[1] +#else +#define sKeepPosX data[10] +#endif // NONMATCHING + +void sub_81543E8(struct Sprite *sprite) +{ + u8 i; + static const u8 array[] = {30, 20}; + + if (sprite->sKeepPosX != TRUE) + { + for (i = 0; i < 2; i++) + { + if (++gUnknown_203F3F8[i][1] > array[i]) + { + sprite->pos1.x--; + gUnknown_203F3F8[i][1] = 0; + } + } + } +} + +const s16 gUnknown_8478E0E[][2] = {{230, 55}, {30, 74}}; + +void sub_8154438(void) +{ + u8 i; + void *ptr = AllocZeroed(0x400); + struct SpritePalette sprPal = {sDodrioBerryPlatformPal, 6}; + + LZ77UnCompWram(sDodrioBerryPlatformGfx, ptr); + if (ptr != NULL) + { + struct SpriteSheet sprSheet = {ptr, 0x400, 5}; + struct SpriteTemplate sprTemplate = + { + .tileTag = 5, + .paletteTag = 6, + .oam = &sOamData_8478CB0, + .anims = sSpriteAnimTable_8478D8C, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_81543E8, + }; + + LoadSpriteSheet(&sprSheet); + LoadSpritePalette(&sprPal); + for (i = 0; i < 2; i++) + { + gUnknown_203F3F8[i] = AllocZeroed(4); + *gUnknown_203F3F8[i] = CreateSprite(&sprTemplate, gUnknown_8478E0E[i][0], gUnknown_8478E0E[i][1], 4); + } + } + + Free(ptr); +} + +void sub_81544F0(void) +{ + u8 i; + for (i = 0; i < 2; i++) + { + struct Sprite *sprite = &gSprites[*gUnknown_203F3F8[i]]; + sprite->sKeepPosX = TRUE; + sprite->pos1.x = gUnknown_8478E0E[i][0]; + sprite->pos1.y = gUnknown_8478E0E[i][1]; + } +} + +void sub_8154540(void) +{ + u8 i; + for (i = 0; i < 2; i++) + { + struct Sprite *sprite = &gSprites[*gUnknown_203F3F8[i]]; + sprite->sKeepPosX = FALSE; + } +} + +void sub_8154578(void) +{ + u8 i; + for (i = 0; i < 2; i++) + { + struct Sprite *sprite = &gSprites[*gUnknown_203F3F8[i]]; + if (sprite) + DestroySprite(sprite); + FREE_AND_SET_NULL(gUnknown_203F3F8[i]); + } +} + +void sub_81545BC(bool8 invisible) +{ + u8 i; + for (i = 0; i < 2; i++) + gSprites[*gUnknown_203F3F8[i]].invisible = invisible; +} + +#undef sKeepPosX + +s16 sub_8154608(u8 arg0, u8 arg1) +{ + s16 x = 0; + switch (arg1) + { + case 1: + x = 15; + break; + case 2: + switch (arg0) + { + case 0: x = 12; break; + case 1: x = 18; break; + } + break; + case 3: + switch (arg0) + { + case 0: x = 15; break; + case 1: x = 21; break; + case 2: x = 9; break; + } + break; + case 4: + switch (arg0) + { + case 0: x = 12; break; + case 1: x = 18; break; + case 2: x = 24; break; + case 3: x = 6; break; + } + break; + case 5: + switch (arg0) + { + case 0: x = 15; break; + case 1: x = 21; break; + case 2: x = 27; break; + case 3: x = 3; break; + case 4: x = 9; break; + } + break; + } + + return x * 8; +} + +void sub_81546C0(void) +{ + u8 i; + for (i = 0; i < 11; i++) + { + sub_81542EC(i, TRUE); + sub_8154370(i, 1); + } + sub_81540DC(FALSE); +} + +void sub_81546EC(u8 frameId) +{ + LoadBgTiles(0, GetUserFrameGraphicsInfo(frameId)->tiles, 0x120, 1); + LoadPalette(GetUserFrameGraphicsInfo(frameId)->palette, 0xA0, 0x20); +} + +void sub_8154720(void) +{ + TextWindow_SetStdFrame0_WithPal(0, 0xA, 0xB0); +} + +void sub_8154730(void) +{ + gUnknown_203F440->finished = FALSE; + gUnknown_203F440->state = 0; + gUnknown_203F440->unk3018 = 0; + gUnknown_203F440->unk3020 = 0; + gUnknown_203F440->unk3024 = 0; +} + +void sub_8154768(const struct WindowTemplate *winTempl) +{ + u8 pal = 0xA; + + FillBgTilemapBufferRect(0, 1, winTempl->tilemapLeft - 1, winTempl->tilemapTop - 1, 1, 1, pal); + FillBgTilemapBufferRect(0, 2, winTempl->tilemapLeft, winTempl->tilemapTop - 1, winTempl->width, 1, pal); + FillBgTilemapBufferRect(0, 3, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop - 1, 1, 1, pal); + FillBgTilemapBufferRect(0, 4, winTempl->tilemapLeft - 1, winTempl->tilemapTop, 1, winTempl->height, pal); + FillBgTilemapBufferRect(0, 6, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop, 1, winTempl->height, pal); + FillBgTilemapBufferRect(0, 7, winTempl->tilemapLeft - 1, winTempl->tilemapTop + winTempl->height, 1, 1, pal); + FillBgTilemapBufferRect(0, 8, winTempl->tilemapLeft, winTempl->tilemapTop + winTempl->height, winTempl->width, 1, pal); + FillBgTilemapBufferRect(0, 9, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop + winTempl->height, 1, 1, pal); +} + +void sub_8154868(const struct WindowTemplate *winTempl) +{ + u8 pal = 0xB; + + FillBgTilemapBufferRect(0, 10, winTempl->tilemapLeft - 1, winTempl->tilemapTop - 1, 1, 1, pal); + FillBgTilemapBufferRect(0, 11, winTempl->tilemapLeft, winTempl->tilemapTop - 1, winTempl->width, 1, pal); + FillBgTilemapBufferRect(0, 12, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop - 1, 1, 1, pal); + FillBgTilemapBufferRect(0, 13, winTempl->tilemapLeft - 1, winTempl->tilemapTop, 1, winTempl->height, pal); + FillBgTilemapBufferRect(0, 15, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop, 1, winTempl->height, pal); + FillBgTilemapBufferRect(0, 16, winTempl->tilemapLeft - 1, winTempl->tilemapTop + winTempl->height, 1, 1, pal); + FillBgTilemapBufferRect(0, 17, winTempl->tilemapLeft, winTempl->tilemapTop + winTempl->height, winTempl->width, 1, pal); + FillBgTilemapBufferRect(0, 18, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop + winTempl->height, 1, 1, pal); +} + +void sub_8154968(struct DodrioSubstruct_0160 *ptr) +{ + gUnknown_203F440 = ptr; + gUnknown_203F440->finished = FALSE; + gUnknown_203F440->state = 0; + gUnknown_203F440->unk3018 = 0; + gUnknown_203F440->unk3020 = 0; + gUnknown_203F440->unk3024 = 0; + gUnknown_203F440->unk3004 = CreateTask(sub_8154A08, 3); + sub_8155E24(sub_8154A2C); +} + +void sub_81549C8(void) +{ + FreeAllWindowBuffers(); +} + +struct WinCoords +{ + u8 left; + u8 top; +}; + +const u8 sUnknown_8478E38[][3] = +{ + { + TEXT_COLOR_WHITE, + TEXT_COLOR_DARK_GREY, + TEXT_COLOR_LIGHT_GREY + }, { + TEXT_COLOR_WHITE, + TEXT_COLOR_RED, + TEXT_COLOR_LIGHT_RED + }, { + TEXT_COLOR_WHITE, + TEXT_COLOR_BLUE, + TEXT_COLOR_LIGHT_BLUE + }, { + TEXT_COLOR_WHITE, + TEXT_COLOR_GREEN, + TEXT_COLOR_LIGHT_GREEN + } +}; + +const struct WinCoords sUnknown_8478E44[] = {{12, 6}}; +const struct WinCoords sUnknown_8478E48[] = {{9, 10}, {15, 6}}; +const struct WinCoords sUnknown_8478E50[] = {{12, 6}, {18, 10}, {6, 10}}; +const struct WinCoords sUnknown_8478E5C[] = {{9, 10}, {15, 6}, {21, 10}, {3, 6}}; +const struct WinCoords sUnknown_8478E6C[] = {{12, 6}, {18, 10}, {23, 6}, {1, 6}, {6, 10}}; + +const struct WinCoords *const sUnknown_8478E80[] = +{ + sUnknown_8478E44, + sUnknown_8478E48, + sUnknown_8478E50, + sUnknown_8478E5C, + sUnknown_8478E6C, +}; + +const u8 *const sUnknown_8478E94[] = +{ + gText_1Colon, + gText_2Colon, + gText_3Colon, + gText_4Colon, + gText_5Colon, +}; + +const u16 sUnknown_8478EA8[] = {92, 132, 172, 212}; +const u16 sUnknown_8478EB0[] = {30, 45, 60, 75, 90}; +const u16 sUnknown_8478EBA[] = {12, 28, 44, 60, 76}; + +struct +{ + u8 id; + void (*func)(void); +} const gUnknown_8478EC4[] = +{ + {0, sub_8154A2C}, + {1, sub_8154B34}, + {2, sub_8154F80}, + {3, sub_81556E0}, + {4, sub_8155A78}, + {5, sub_8155B4C}, + {6, sub_8155C2C}, + {7, sub_8155C80}, + {8, unused_0}, + {9, nullsub_98}, +}; + +void sub_81549D4(u8 arg0) +{ + u8 i; + for (i = 0; i < 10; i++) + { + if (gUnknown_8478EC4[i].id == arg0) + sub_8155E24(gUnknown_8478EC4[i].func); + } +} + +void sub_8154A08(u8 taskId) +{ + if (!gUnknown_203F440->finished) + sub_8155E54()(); +} + +void sub_8154A2C(void) +{ + switch (gUnknown_203F440->state) + { + case 0: + sub_8155EA0(); + gUnknown_203F440->state++; + break; + case 1: + if (sub_8155FE0() == TRUE) + gUnknown_203F440->state++; + break; + case 2: + CopyToBgTilemapBuffer(3, sDodrioBerryBgTilemap1, 0, 0); + CopyToBgTilemapBuffer(1, sDodrioBerryBgTilemap2Left, 0, 0); + CopyToBgTilemapBuffer(2, sDodrioBerryBgTilemap2Right, 0, 0); + CopyBgTilemapBufferToVram(3); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(2); + gUnknown_203F440->state++; + break; + case 3: + ShowBg(0); + ShowBg(3); + ShowBg(1); + ShowBg(2); + gUnknown_203F440->state++; + break; + case 4: + sub_81546EC(gSaveBlock2Ptr->optionsWindowFrameType); + sub_8154720(); + gUnknown_203F440->state++; + break; + default: + gUnknown_203F440->finished = TRUE; + break; + } +} + +// This is declared inside pokeemerald's sub_80296A8 +const u8 gUnknown_8478F14[5] = {0, 1, 2, 3, 4}; diff --git a/src/dodrio_berry_picking_3.c b/src/dodrio_berry_picking_3.c new file mode 100644 index 000000000..4260c6f2f --- /dev/null +++ b/src/dodrio_berry_picking_3.c @@ -0,0 +1,23 @@ +#include "global.h" +#include "link.h" +#include "link_rfu.h" + +void sub_815A5BC(s32 a0) +{ + struct Padded_U8 data[2]; + data[0].value = 1; + data[1].value = a0; + RfuPrepareSend0x2f00(data); +} + +u8 sub_815A5E8(s32 a0) +{ + u8 * r1; + if ((gRecvCmds[0][0] & 0xFF00) != 0x2F00) + return 0; + r1 = (u8 *)&gRecvCmds[a0][1]; + if (r1[0] == 1) + return r1[4]; + return 0; +} + |