diff options
Diffstat (limited to 'src/dodrio_berry_picking.c')
-rw-r--r-- | src/dodrio_berry_picking.c | 2902 |
1 files changed, 2295 insertions, 607 deletions
diff --git a/src/dodrio_berry_picking.c b/src/dodrio_berry_picking.c index 1860f1917..ea6d46df2 100644 --- a/src/dodrio_berry_picking.c +++ b/src/dodrio_berry_picking.c @@ -1,162 +1,145 @@ #include "global.h" -#include "bg.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 "window.h" - -/*static*/ void sub_8150C78(void); -/*static*/ void sub_8150CBC(void); -/*static*/ void sub_8150CF4(void); -/*static*/ void sub_8150D7C(void); -/*static*/ void sub_8150DA4(void); -/*static*/ void sub_8150FDC(void); -/*static*/ void sub_8151198(void); -/*static*/ void sub_81512B4(void); -/*static*/ void sub_8151488(void); -/*static*/ void sub_81514F0(void); -/*static*/ void sub_815159C(void); -/*static*/ void sub_8150F40(void); -/*static*/ void sub_8150E68(void); -/*static*/ void sub_815109C(void); -/*static*/ void sub_8150FC4(void); -/*static*/ void nullsub_97(struct Sprite *sprite); -/*static*/ void sub_81543E8(struct Sprite *sprite); -/*static*/ void sub_8154A2C(void); -/*static*/ void sub_8154B34(void); -/*static*/ void sub_8154F80(void); -/*static*/ void sub_81556E0(void); -/*static*/ void sub_8155A78(void); -/*static*/ void sub_8155B4C(void); -/*static*/ void sub_8155C2C(void); -/*static*/ void sub_8155C80(void); -/*static*/ void unused_0(void); -/*static*/ void nullsub_98(void); - -// const rom data -/*static*/ const u8 sUnknown_8471F50[5][5][11] = +#include "task.h" +#include "text_window.h" +#include "constants/songs.h" +#include "constants/fanfares.h" +#include "constants/items.h" +#include "constants/species.h" + +struct DodrioStruct { - { - {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}, - }, -}; + /*0x0000*/ void (*savedCallback)(void); + /*0x0004*/ u8 ALIGNED(4) unk04; + /*0x0008*/ u8 ALIGNED(4) unk08; + /*0x000C*/ u8 ALIGNED(4) unk0C; + /*0x0010*/ u8 ALIGNED(4) unk10; + /*0x0014*/ u8 ALIGNED(4) unk14; + /*0x0018*/ u8 ALIGNED(4) unk18; + /*0x001C*/ u8 ALIGNED(4) unk1C; + /*0x0020*/ u8 ALIGNED(4) unk20; + /*0x0024*/ u8 ALIGNED(4) unk24; + /*0x0028*/ u8 ALIGNED(4) multiplayerId; + /*0x0030*/ u8 ALIGNED(8) unk30; + /*0x0034*/ u8 ALIGNED(4) unk34[5]; + /*0x003C*/ u8 ALIGNED(4) unk3C; + /*0x0040*/ u8 ALIGNED(4) unk40; + /*0x0044*/ u8 ALIGNED(4) unk44; + /*0x0048*/ u8 ALIGNED(4) unk48; + /*0x004A*/ u16 unk4A[5][6]; + /*0x0086*/ u16 unk86[5]; + /*0x0090*/ u8 ALIGNED(4) unk90[5]; + /*0x0098*/ u8 ALIGNED(4) unk98[4]; + /*0x009C*/ u8 ALIGNED(4) unk9C[11]; + /*0x00A8*/ u8 ALIGNED(4) unkA8[5]; + /*0x00B0*/ u8 ALIGNED(4) unkB0[5]; + /*0x00B8*/ u8 ALIGNED(4) unkB8[11]; + /*0x00C4*/ u8 ALIGNED(4) unkC4[11]; + /*0x00D0*/ u8 ALIGNED(4) unkD0[11]; + /*0x00DC*/ u8 ALIGNED(4) unkDC[11]; + /*0x00E8*/ u8 ALIGNED(4) unkE8[11]; + /*0x00F4*/ u8 ALIGNED(4) unkF4[11][2]; + /*0x010C*/ u8 ALIGNED(4) unk10C[5]; + /*0x0112*/ u16 unk112; + /*0x0114*/ u16 unk114; + /*0x0118*/ u32 unk118; + /*0x011C*/ u32 unk11C; + /*0x0120*/ u32 unk120; + /*0x0124*/ u8 ALIGNED(4) unk124; + /*0x0128*/ u8 ALIGNED(4) unk128; + /*0x012C*/ u32 unk12C; + /*0x0130*/ u32 unk130[5]; + /*0x0144*/ u8 ALIGNED(4) unk144; + /*0x0148*/ u8 ALIGNED(4) unk148[11]; + /*0x0154*/ u8 ALIGNED(4) unk154; + /*0x0158*/ u8 ALIGNED(4) unk158[5]; + /*0x0160*/ struct DodrioSubstruct_0160 unk160; + /*0x318C*/ struct DodrioSubstruct_318C unk318C[5]; + /*0x31A0*/ struct DodrioSubstruct_31A0 unk31A0[5]; + /*0x32CC*/ struct DodrioSubstruct_31A0 unk32CC; + /*0x3308*/ struct DodrioSubstruct_3308 unk3308[5]; +}; // size = 0x3330 + +static EWRAM_DATA struct DodrioStruct * gUnknown_203F3E0 = NULL; + +static bool32 gUnknown_3002044; + +static void sub_81508D8(void); +static void sub_81508EC(struct DodrioStruct * dodrio); +static void sub_8150A84(u8 taskId); +static void sub_8150C78(void); +static void sub_8150CBC(void); +static void sub_8150CF4(void); +static void sub_8150D7C(void); +static void sub_8150DA4(void); +static void sub_8150E68(void); +static void sub_8150F40(void); +static void sub_8150FC4(void); +static void sub_8150FDC(void); +static void sub_815109C(void); +static void sub_8151198(void); +static void sub_81512B4(void); +static void sub_8151488(void); +static void sub_81514F0(void); +static void sub_815159C(void); +static void sub_81516DC(u8 taskId); +static void sub_8151750(u8 taskId); +static void sub_8151B54(void); +static void sub_8151BA0(void); +static void sub_8151C5C(void); +static void sub_8151D28(void); +static void sub_8151D98(void); +static void sub_8151E94(void); +static void sub_815201C(void); +static void sub_8152034(void); +static void sub_8152048(struct DodrioSubstruct_318C * dodrioMon, struct Pokemon * partyMon); +static void sub_815205C(TaskFunc func, u8 priority); +static void sub_815206C(TaskFunc func); +static void sub_8152090(u8 a0); +static bool32 sub_81520B4(void); +static void sub_8152110(void); +static bool32 sub_8152484(u8 a0, u8 a1, u8 a2); +static void sub_815256C(void); +static void sub_815293C(void); +static void sub_8152970(void); +static bool32 sub_8152A00(void); +static void sub_8152A70(void); +static void sub_81529A4(u8 a0, u8 *a1, u8 *a2); +static bool32 sub_8152A98(void); +static bool32 sub_8152AD8(void); +static void sub_8152B64(u8 a0); +static u8 sub_8152BD4(u8 a0); +static u8 sub_8152BF8(u8 a0, u8 a1); +static u8 sub_8152CB8(u8 arg0, u8 arg1); +static void sub_8152D34(u8 a0, u8 a1, u8 a2); +static void sub_8152F94(bool32 a0); +static void sub_8153004(void); +static void sub_8153048(void); +static void sub_8153150(void); +static void sub_81531FC(void); +static u8 sub_815327C(u8); +static void sub_81532B8(void); +static void sub_815336C(void); +static u32 sub_8153424(u8 mpId); +static void Task_ShowDodrioBerryPickingRecords(u8 taskId); +static void sub_81538D0(u8 windowId); -/*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}, -}; +// const rom data -/*static*/ const u8 sUnknown_8472133[5][5] = -{ - {5}, - {4, 6}, - {3, 5, 7}, - {2, 4, 6, 8}, - {1, 3, 5, 6, 9}, -}; +// Assets in this header are duplicated +#include "data/dodrio_berry_picking.h" -// Duplicate and unused gfx. Feel free to remove. -/*static*/ 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"); - -/*static*/ const u8 sUnknown_847553C[][3] = +static const u8 sUnknown_847553C[][3] = { {40, 24, 13}, {32, 19, 10}, @@ -164,20 +147,20 @@ ALIGNED(4) }; ALIGNED(4) -/*static*/ const u8 sUnknown_8475548[] = {8, 5, 8, 11, 15}; +static const u8 sUnknown_8475548[] = {8, 5, 8, 11, 15}; ALIGNED(4) -/*static*/ const u8 sUnknown_8475550[] = {5, 10, 20, 30, 50, 70, 100}; +static const u8 sUnknown_8475550[] = {5, 10, 20, 30, 50, 70, 100}; ALIGNED(4) -/*static*/ const u8 sUnknown_8475558[][10] = +static const u8 sUnknown_8475558[][10] = { {15, 16, 17, 18, 19, 19, 18, 17, 16, 15}, {20, 21, 22, 23, 24, 25, 26, 27, 28, 29}, {30, 31, 32, 33, 34, 34, 33, 32, 31, 30}, }; -/*static*/ void (*const sUnknown_8475578[])(void) = +static void (*const sUnknown_8475578[])(void) = { sub_8150C78, sub_8150CBC, @@ -193,7 +176,7 @@ ALIGNED(4) sub_8150F40 }; -/*static*/ void (*const sUnknown_84755A8[])(void) = +static void (*const sUnknown_84755A8[])(void) = { sub_8150C78, sub_8150CBC, @@ -209,540 +192,2245 @@ ALIGNED(4) sub_8150FC4 }; -/*static*/ const s16 sUnknown_84755D8[] = {10, 30, 50, 50}; +void StartDodrioBerryPicking(u16 a0, MainCallback callback) +{ + gUnknown_3002044 = FALSE; -// Data related to printing saved results. -/*static*/ const struct WindowTemplate sUnknown_84755E0 = + if (gReceivedRemoteLinkPlayers && (gUnknown_203F3E0 = AllocZeroed(sizeof(*gUnknown_203F3E0))) != NULL) + { + sub_81508D8(); + sub_81508EC(gUnknown_203F3E0); + gUnknown_203F3E0->savedCallback = callback; + gUnknown_203F3E0->multiplayerId = GetMultiplayerId(); + gUnknown_203F3E0->unk32CC = gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId]; + sub_8152048(&gUnknown_203F3E0->unk318C[gUnknown_203F3E0->multiplayerId], &gPlayerParty[a0]); + CreateTask(sub_8150A84, 1); + SetMainCallback2(sub_815201C); + sub_8153150(); + sub_81529A4(gUnknown_203F3E0->unk24, &gUnknown_203F3E0->unk44, &gUnknown_203F3E0->unk48); + StopMapMusic(); + PlayNewMapMusic(MUS_KINOMIKUI); + } + else + { + SetMainCallback2(callback); + return; + } +} + +static void sub_81508D8(void) { - .bg = 0, - .tilemapLeft = 1, - .tilemapTop = 1, - .width = 28, - .height = 11, - .paletteNum = 15, - .baseBlock = 1, -}; + ResetTasks(); + ResetSpriteData(); + FreeAllSpritePalettes(); +} -/*static*/ const u8 *const sUnknown_84755E8[] = {gText_BerryPickingRecords, gText_BerriesPicked, gText_BestScore, gText_BerriesInRowFivePlayers}; -/*static*/ const u8 sUnknown_84755F8[] = {4, 7, 4}; +static void sub_81508EC(struct DodrioStruct * data) +{ + u8 i; + + data->unk0C = 0; + data->unk10 = 0; + data->unk14 = 0; + data->unk18 = 0; + data->unk1C = 0; + data->unk11C = 0; + data->unk120 = 0; + data->unk30 = 0; + data->unk40 = 0; + data->unk3C = 0; + data->unk12C = 0; + + for (i = 0; i < 4; i++) + { + data->unk98[i] = 0; + } -ALIGNED(4) -/*static*/ const u8 sUnknown_84755FC[][2] = {{24}, {40}, {56}}; -/*static*/ const u8 sUnknown_8475602[][2] = {{24}, {40}, {70}}; + for (i = 0; i < 5; i++) + { + data->unkA8[i] = 0; + data->unkB0[i] = 0; + data->unk4A[i][0] = 0; + data->unk4A[i][1] = 0; + data->unk4A[i][2] = 0; + data->unk4A[i][3] = 0; + data->unk4A[i][5] = 0; + data->unk10C[i] = 0; + data->unk130[i] = 0; + } -// Debug functions? -/*static*/ const u16 sUnknown_8475608[][4] = + for (i = 0; i < 11; i++) + { + data->unkD0[i] = 0; + data->unkDC[i] = 0; + data->unkC4[i] = 0; + data->unkF4[i][0] = 0xFF; + data->unkF4[i][1] = 0xFF; + } + + data->unk20 = GetMultiplayerId() == 0 ? 1 : 0; + data->unk24 = GetLinkPlayerCount(); + data->unk34[0] = GetMultiplayerId(); + for (i = 1; i < data->unk24; i++) + { + data->unk34[i] = data->unk34[i - 1] + 1; + if (data->unk34[i] > data->unk24 - 1) + data->unk34[i] %= data->unk24; + } +} + +static void sub_8150A84(u8 taskId) { - {9999, 0, 90, 9999}, - {9999, 9999, 70, 9999}, - {9999, 0, 9999, 0}, - {9999, 9999, 60, 0}, - {9999, 9999, 9999, 0}, -}; + u8 r4, r5; -/*static*/ const u8 sUnknown_8475630[] = _("あいうえおかき"); -/*static*/ const u8 sUnknown_8475638[] = _("ABCDEFG"); -/*static*/ const u8 sUnknown_8475640[] = _("0123456"); + switch (gUnknown_203F3E0->unk0C) + { + case 0: + SetVBlankCallback(NULL); + sub_815205C(sub_8151750, 4); + gUnknown_203F3E0->unk0C++; + break; + case 1: + if (!FuncIsActiveTask(sub_8151750)) + { + sub_8154968(&gUnknown_203F3E0->unk160); + gUnknown_203F3E0->unk0C++; + } + break; + case 2: + if (!sub_8155E68()) + { + LinkRfu_SetRfuFuncToSend6600(); + gUnknown_203F3E0->unk0C++; + } + break; + case 3: + if (IsLinkTaskFinished()) + { + if (gReceivedRemoteLinkPlayers) + { + LoadWirelessStatusIndicatorSpriteGfx(); + CreateWirelessStatusIndicatorSprite(0, 0); + } + gUnknown_203F3E0->unk0C++; + } + break; + case 4: + r5 = gUnknown_203F3E0->unk24; + sub_8153A9C(); + for (r4 = 0; r4 < r5; r4++) + { + sub_8153AFC(&gUnknown_203F3E0->unk318C[gUnknown_203F3E0->unk34[r4]], r4, gUnknown_203F3E0->unk34[r4], gUnknown_203F3E0->unk24); + } + sub_8153D80(FALSE, gUnknown_203F3E0->unk24); + gUnknown_203F3E0->unk0C++; + break; + case 5: + sub_8154128(); + sub_815417C(); + sub_8154438(); + sub_8153E28(); + gUnknown_203F3E0->unk0C++; + break; + case 6: + BlendPalettes(0xFFFFFFFF, 0x10, RGB_BLACK); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + SetVBlankCallback(sub_8152034); + gUnknown_203F3E0->unk0C++; + break; + case 7: + UpdatePaletteFade(); + if (!gPaletteFade.active) + { + gUnknown_203F3E0->unk0C++; + } + break; + default: + DestroyTask(taskId); + sub_815206C(sub_81516DC); + break; + } +} -/*static*/ const u8 *const sUnknown_8475648[] = +static void sub_8150C08(u8 taskId) { - sUnknown_8475630, - sUnknown_8475630, - sUnknown_8475630, - sUnknown_8475638, - sUnknown_8475640 -}; + sub_8151B54(); + sUnknown_8475578[gUnknown_203F3E0->unk18](); + if (!gUnknown_3002044) + { + sub_815293C(); + } + sub_8151BA0(); +} -// Large chunk of data -/*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 - }, -}; +static void sub_8150C40(u8 taskId) +{ + sub_8151C5C(); + sUnknown_84755A8[gUnknown_203F3E0->unk18](); + if (!gUnknown_3002044) + { + sub_8152970(); + } + sub_8151D28(); +} -// Unknown unreferenced data, feel free to remove. -/*static*/ const u32 sUnused[] = {255, 0}; +static void sub_8150C78(void) +{ + switch (gUnknown_203F3E0->unk10) + { + case 0: + sub_8153BF8(1); + sub_81549D4(1); + gUnknown_203F3E0->unk10++; + break; + case 1: + if (!sub_8155E68()) + sub_8152090(1); + break; + } +} -/*static*/ const struct WindowTemplate sUnknown_8475674[] = +static void sub_8150CBC(void) { + if (gUnknown_203F3E0->unk10 == 0) { - .bg = 0, - .tilemapLeft = 1, - .tilemapTop = 1, - .width = 28, - .height = 3, - .paletteNum = 13, - .baseBlock = 0x13, - }, + sub_8152110(); + gUnknown_203F3E0->unk10++; + } + else { - .bg = 0, - .tilemapLeft = 1, - .tilemapTop = 6, - .width = 28, - .height = 13, - .paletteNum = 13, - .baseBlock = 0x67, + gUnknown_203F3E0->unk118 = 1; + sub_8152090(2); } -}; +} -/*static*/ const struct WindowTemplate sUnknown_8475684 = +static void sub_8150CF4(void) { - .bg = 0, - .tilemapLeft = 1, - .tilemapTop = 6, - .width = 28, - .height = 7, - .paletteNum = 13, - .baseBlock = 0x67, -}; + switch (gUnknown_203F3E0->unk10) + { + case 0: + StartMinigameCountdown(7, 8, 120, 80, 0); + gUnknown_203F3E0->unk10++; + break; + case 1: + LinkRfu_SetRfuFuncToSend6600(); + gUnknown_203F3E0->unk10++; + break; + case 2: + if (IsLinkTaskFinished()) + { + gUnknown_203F3E0->unk10++; + } + break; + case 3: + if (!IsMinigameCountdownRunning()) + { + LinkRfu_SetRfuFuncToSend6600(); + gUnknown_203F3E0->unk10++; + } + break; + case 4: + if (IsLinkTaskFinished()) + { + sub_8152090(3); + } + break; + } +} -/*static*/ const struct WindowTemplate sUnknown_847568C[] = +static void sub_8150D7C(void) { + if (gUnknown_203F3E0->unk10 == 0) { - .bg = 0, - .tilemapLeft = 1, - .tilemapTop = 8, - .width = 19, - .height = 3, - .paletteNum = 13, - .baseBlock = 0x13, - }, + if (gUnknown_203F3E0->unk11C != 0) + { + sub_8152090(4); + } + } +} + +static void sub_8150DA4(void) +{ + if (gUnknown_203F3E0->unk10 == 0) { - .bg = 0, - .tilemapLeft = 22, - .tilemapTop = 7, - .width = 6, - .height = 4, - .paletteNum = 13, - .baseBlock = 0x4C, + if (gUnknown_203F3E0->unk40 < 10) + { + if (gUnknown_203F3E0->unkA8[0] == 0) + { + if (JOY_NEW(DPAD_UP)) + { + if (gUnknown_203F3E0->unk31A0[0].unk2C.unk0 == 0) + { + gUnknown_203F3E0->unk31A0[0].unk2C.unk4 = 0; + gUnknown_203F3E0->unk31A0[0].unk2C.unk0 = sub_815327C(2); + } + } + else if (JOY_NEW(DPAD_RIGHT)) + { + if (gUnknown_203F3E0->unk31A0[0].unk2C.unk0 == 0) + { + gUnknown_203F3E0->unk31A0[0].unk2C.unk4 = 0; + gUnknown_203F3E0->unk31A0[0].unk2C.unk0 = sub_815327C(1); + } + } + else if (JOY_NEW(DPAD_LEFT)) + { + if (gUnknown_203F3E0->unk31A0[0].unk2C.unk0 == 0) + { + gUnknown_203F3E0->unk31A0[0].unk2C.unk4 = 0; + gUnknown_203F3E0->unk31A0[0].unk2C.unk0 = sub_815327C(3); + } + } + else + { + gUnknown_203F3E0->unk31A0[0].unk2C.unk0 = sub_815327C(0); + } + } + } + else + { + sub_8152090(11); + } + sub_815256C(); + sub_8151D98(); } -}; +} +static void sub_8150E68(void) +{ + if (gUnknown_203F3E0->unk40 < 10) + { + if (JOY_NEW(DPAD_UP)) + { + if (gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk0 == 0) + { + gUnknown_203F3E0->unk32CC.unk2C.unk0 = 2; + } + } + else if (JOY_NEW(DPAD_RIGHT)) + { + if (gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk0 == 0) + { + gUnknown_203F3E0->unk32CC.unk2C.unk0 = 1; + } + } + else if (JOY_NEW(DPAD_LEFT)) + { + if (gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk0 == 0) + { + gUnknown_203F3E0->unk32CC.unk2C.unk0 = 3; + } + } + else + { + gUnknown_203F3E0->unk32CC.unk2C.unk0 = 0; + } + } + else + { + sub_8152090(11); + } + sub_8151E94(); +} -/*static*/ const struct WindowTemplate sUnknown_847569C = +static void sub_8150F40(void) { - .bg = 0, - .tilemapLeft = 4, - .tilemapTop = 6, - .width = 22, - .height = 5, - .paletteNum = 13, - .baseBlock = 0x13, -}; + u8 i; -/*static*/ const struct WindowTemplate sUnknown_84756A4 = + sub_815256C(); + sub_8151D98(); + if (sub_8152A98() == 1) + { + sub_8153004(); + sub_8152090(5); + } + else + { + gUnknown_203F3E0->unk12C = 1; + for (i = 1; i < gUnknown_203F3E0->unk24; i++) + { + if (gUnknown_203F3E0->unk130[i] != 1) + { + gUnknown_203F3E0->unk12C = 0; + break; + } + } + } +} + +static void sub_8150FC4(void) { - .bg = 0, - .tilemapLeft = 5, - .tilemapTop = 8, - .width = 19, - .height = 3, - .paletteNum = 13, - .baseBlock = 0x13, -}; + sub_8151E94(); + if (sub_8152AD8() == 1) + sub_8152090(5); +} -// This is an unused copy of the tables from the top of the file. Feel free to remove. -/*static*/ const u8 sDuplicateArray[] = -{ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 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, 1, 2, 3, 4, 5, 6, 3, 8, 9, 0, 0, 1, 2, 5, 6, 3, 4, 5, 8, 9, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 4, 5, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 5, 5, 6, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 6, 7, 2, 2, 3, 4, 0, 0, 0, 0, 0, 0, - 3, 4, 5, 5, 6, 7, 7, 8, 1, 1, 2, 3, 0, 0, 0, 4, 5, 6, 6, 7, 8, 8, 9, 0, 0, 1, 2, 2, 3, 4, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 1, - 2, 1, 2, 3, 2, 3, 0, 0, 0, 0, 4, 0, 1, 0, 1, 2, 1, 2, 3, 2, 3, 4, 3, 4, 0, 0, 0, 0, 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, 5, 0, 0, 0, 0, 4, 6, 0, 0, 0, 3, 5, 7, 0, 0, 2, 4, 6, 8, 0, 1, 3, 5, 6, 9 -}; +static void sub_8150FDC(void) +{ + u8 blockReceivedStatus; + u8 i; + switch (gUnknown_203F3E0->unk10) + { + case 0: + SendBlock(0, gUnknown_203F3E0->unk4A, sizeof(gUnknown_203F3E0->unk4A)); + gUnknown_203F3E0->unk08 = 0; + gUnknown_203F3E0->unk10++; + break; + case 1: + if (IsLinkTaskFinished()) + { + gUnknown_203F3E0->unk10++; + } + break; + case 2: + blockReceivedStatus = GetBlockReceivedStatus(); + for (i = 0; i < gUnknown_203F3E0->unk24; blockReceivedStatus >>= 1, i++) + { + if (blockReceivedStatus & 1) + { + ResetBlockReceivedFlag(i); + gUnknown_203F3E0->unk08++; + } + } + if (gUnknown_203F3E0->unk08 >= gUnknown_203F3E0->unk24) + { + gUnknown_203F3E0->unk14++; + gUnknown_203F3E0->unk10++; + } + break; + default: + if (WaitFanfare(TRUE)) + { + sub_8152090(6); + FadeOutAndPlayNewMapMusic(MUS_WIN_YASEI, 4); + } + break; + } +} -/*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"); - -/*static*/ 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 -}; +static void sub_815109C(void) +{ + u8 i; + u8 blockReceivedStatus; + + switch (gUnknown_203F3E0->unk10) { + case 0: + SendBlock(0, gUnknown_203F3E0->unk4A[gUnknown_203F3E0->unk14], sizeof(gUnknown_203F3E0->unk4A)); + gUnknown_203F3E0->unk08 = 0; + gUnknown_203F3E0->unk10++; + break; + case 1: + if (IsLinkTaskFinished()) { + gUnknown_203F3E0->unk10++; + } + break; + case 2: + blockReceivedStatus = GetBlockReceivedStatus(); + for (i = 0; i < gUnknown_203F3E0->unk24; blockReceivedStatus >>= 1, i++) + { + if (blockReceivedStatus & 1) + { + memcpy(gUnknown_203F3E0->unk4A, gBlockRecvBuffer, sizeof(gUnknown_203F3E0->unk4A)); + ResetBlockReceivedFlag(i); + gUnknown_203F3E0->unk08++; + } + } + if (gUnknown_203F3E0->unk08 >= gUnknown_203F3E0->unk24) { + gUnknown_203F3E0->unk14++; + gUnknown_203F3E0->unk10++; + } + break; + default: + if (WaitFanfare(TRUE)) { + gUnknown_203F3E0->unk114 = gUnknown_203F3E0->unk4A[gUnknown_203F3E0->multiplayerId][5]; + sub_8152090(6); + FadeOutAndPlayNewMapMusic(MUS_WIN_YASEI, 4); + } + break; + } +} -/*static*/ 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 -}; +static void sub_8151198(void) +{ + u8 sp00; + u8 i; + u8 blockReceivedStatus; -/*static*/ 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 -}; + switch (gUnknown_203F3E0->unk10) + { + case 0: + sub_81531FC(); + sub_81540DC(TRUE); + sub_81544F0(); + sub_81545BC(TRUE); + sub_81549D4(2); + gUnknown_203F3E0->unk10++; + break; + case 1: + if (!sub_8155E68()) + { + sp00 = 1; + sub_81549D4(5); + sp00 = sub_8155E8C(); + SendBlock(0, &sp00, sizeof(sp00)); + gUnknown_203F3E0->unk10++; + } + break; + case 2: + if (IsLinkTaskFinished()) + { + gUnknown_203F3E0->unk10++; + gUnknown_203F3E0->unk08 = 0; + } + break; + case 3: + blockReceivedStatus = GetBlockReceivedStatus(); + for (i = 0; i < gUnknown_203F3E0->unk24; blockReceivedStatus >>= 1, i++) + { + if (blockReceivedStatus & 1) + { + *(gUnknown_203F3E0->unk10C + i) = *(u8 *)gBlockRecvBuffer[i]; + ResetBlockReceivedFlag(i); + gUnknown_203F3E0->unk08++; + } + } + if (gUnknown_203F3E0->unk08 >= gUnknown_203F3E0->unk24) { + if (++gUnknown_203F3E0->unk14 >= 120) + { + sub_81549D4(6); + gUnknown_203F3E0->unk10++; + } + } + break; + default: + if (!sub_8155E68()) + { + sub_8152090(7); + } + break; + } +} -/*static*/ 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 -}; +static void sub_81512B4(void) +{ + u8 sp0; + u8 i; + u8 blockReceivedStatus; -/*static*/ const union AnimCmd sSpriteAnim_8478CB8[] = + switch (gUnknown_203F3E0->unk10) + { + case 0: + if (sub_81534AC() >= 3000) + { + sub_81549D4(4); + } + gUnknown_203F3E0->unk10++; + break; + case 1: + if (!sub_8155E68()) + { + sub_81549D4(3); + gUnknown_203F3E0->unk10++; + } + break; + case 2: + sub_81546C0(); + sub_8153048(); + gUnknown_203F3E0->unk10++; + break; + case 3: + if ((sp0 = sub_8155E8C()) != 0) + { + gUnknown_203F3E0->unk10++; + } + break; + case 4: + if (!sub_8155E68()) + { + sub_81549D4(5); + sp0 = sub_8155E8C(); + SendBlock(0, &sp0, sizeof(sp0)); + gUnknown_203F3E0->unk10++; + } + break; + case 5: + if (IsLinkTaskFinished()) + { + gUnknown_203F3E0->unk10++; + gUnknown_203F3E0->unk08 = 0; + } + break; + case 6: + blockReceivedStatus = GetBlockReceivedStatus(); + for (i = 0; i < gUnknown_203F3E0->unk24; blockReceivedStatus >>= 1, i++) + { + if (blockReceivedStatus & 1) + { + *(gUnknown_203F3E0->unk10C + i) = *(u8 *)gBlockRecvBuffer[i]; + ResetBlockReceivedFlag(i); + gUnknown_203F3E0->unk08++; + } + } + if (gUnknown_203F3E0->unk08 >= gUnknown_203F3E0->unk24) { + if (++gUnknown_203F3E0->unk14 >= 120) + { + sub_815336C(); + sub_81549D4(6); + gUnknown_203F3E0->unk10++; + } + } + else + { + sub_81532B8(); + } + break; + default: + if (!sub_8155E68()) + { + for (i = 0; i < gUnknown_203F3E0->unk24; i++) + { + if (gUnknown_203F3E0->unk10C[i] == 2) + { + sub_8152090(8); + return; + } + } + sub_8152090(10); + } + break; + } +} + +static void sub_8151488(void) { - ANIMCMD_FRAME(0, 20), - ANIMCMD_JUMP(0) -}; + switch (gUnknown_203F3E0->unk10) + { + case 0: + Link_TryStartSend5FFF(); + sub_81549D4(7); + gUnknown_203F3E0->unk10++; + break; + case 1: + if (!sub_8155E68()) + { + gUnknown_203F3E0->unk10++; + } + break; + case 2: + if (sub_8155E8C() == 5) + { + gUnknown_203F3E0->unk10++; + } + break; + default: + if (!gReceivedRemoteLinkPlayers) + { + sub_8152090(9); + } + break; + } +} -/*static*/ const union AnimCmd sSpriteAnim_8478CC0[] = +static void sub_81514F0(void) { - ANIMCMD_FRAME(64, 20), - ANIMCMD_JUMP(0) -}; + switch (gUnknown_203F3E0->unk10) + { + case 0: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gUnknown_203F3E0->unk10++; + break; + case 1: + UpdatePaletteFade(); + if (!gPaletteFade.active) + { + gUnknown_203F3E0->unk10++; + } + break; + case 2: + sub_8154274(); + sub_8153ED8(); + sub_8153D08(gUnknown_203F3E0->unk24); + sub_8154578(); + gUnknown_3002044 = TRUE; + sub_81549D4(8); + gUnknown_203F3E0->unk10++; + break; + default: + if (!sub_8155E68()) + { + SetMainCallback2(gUnknown_203F3E0->savedCallback); + DestroyTask(gUnknown_203F3E0->unk04); + Free(gUnknown_203F3E0); + FreeAllWindowBuffers(); + } + break; + } +} -/*static*/ const union AnimCmd sSpriteAnim_8478CC8[] = +static void sub_815159C(void) { - ANIMCMD_FRAME(128, 20), - ANIMCMD_JUMP(0) -}; + switch (gUnknown_203F3E0->unk10) + { + case 0: + sub_81549D4(9); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gUnknown_203F3E0->unk10++; + break; + case 1: + UpdatePaletteFade(); + if (!gPaletteFade.active) + { + gUnknown_203F3E0->unk10++; + } + break; + case 2: + ChangeBgX(0, 0, 0); + ChangeBgY(0, 0, 0); + ChangeBgX(1, 0, 0); + ChangeBgY(1, 0, 0); + ChangeBgX(2, 0, 0); + ChangeBgY(2, 0, 0); + ChangeBgX(3, 0, 0); + ChangeBgY(3, 0, 0); + gUnknown_203F3E0->unk10++; + break; + case 3: + StopMapMusic(); + gUnknown_203F3E0->unk10++; + break; + case 4: + PlayNewMapMusic(MUS_KINOMIKUI); + sub_8154540(); + gUnknown_203F3E0->unk10++; + break; + case 5: + BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + gUnknown_203F3E0->unk10++; + break; + case 6: + UpdatePaletteFade(); + if (!gPaletteFade.active) + { + gUnknown_203F3E0->unk10++; + } + break; + default: + DestroyTask(gUnknown_203F3E0->unk04); + sub_815206C(sub_81516DC); + sub_8154730(); + sub_81508EC(gUnknown_203F3E0); + if (!gReceivedRemoteLinkPlayers) + { + gUnknown_203F3E0->unk24 = 1; + } + sub_8153150(); + sub_81545BC(FALSE); + break; + } +} -/*static*/ const union AnimCmd sSpriteAnim_8478CD0[] = +static void sub_81516DC(u8 taskId) { - ANIMCMD_FRAME(192, 20), - ANIMCMD_JUMP(0) -}; + switch (gUnknown_203F3E0->unk10) + { + case 0: + if (sub_81520B4() == 1) + { + gUnknown_203F3E0->unk10++; + } + break; + case 1: + sub_8153DD8(); + gUnknown_203F3E0->unk10++; + break; + case 2: + if (sub_8153F1C() == TRUE) + { + gUnknown_203F3E0->unk10++; + } + break; + default: + if (gUnknown_203F3E0->unk20 != 0) + { + sub_815206C(sub_8150C08); + } + else + { + sub_815206C(sub_8150C40); + } + DestroyTask(taskId); + break; + } +} -/*static*/ const union AnimCmd sSpriteAnim_8478CD8[] = +static void sub_8151750(u8 taskId) { - ANIMCMD_FRAME(256, 20), - ANIMCMD_JUMP(0) -}; + s16 * data = gTasks[taskId].data; + u8 i; + u8 blockReceivedStatus; + + switch (data[0]) + { + case 0: + SendBlock(0, &gUnknown_203F3E0->unk318C[gUnknown_203F3E0->multiplayerId].isShiny, sizeof(gUnknown_203F3E0->unk318C[gUnknown_203F3E0->multiplayerId].isShiny)); + gUnknown_203F3E0->unk08 = 0; + data[0]++; + break; + case 1: + if (IsLinkTaskFinished()) + { + data[0]++; + } + break; + case 2: + blockReceivedStatus = GetBlockReceivedStatus(); + for (i = 0; i < gUnknown_203F3E0->unk24; blockReceivedStatus >>= 1, i++) + { + if (blockReceivedStatus & 1) + { + *(u8 *)&gUnknown_203F3E0->unk318C[i] = *(u8 *)gBlockRecvBuffer[i]; + ResetBlockReceivedFlag(i); + gUnknown_203F3E0->unk08++; + } + } + if (gUnknown_203F3E0->unk08 >= gUnknown_203F3E0->unk24) + { + DestroyTask(taskId); + sub_81549D4(6); + gUnknown_203F3E0->unk10++; + } + break; + } +} -/*static*/ const union AnimCmd *const sSpriteAnimTable_8478CE0[] = +static void sub_815184C(void) { - sSpriteAnim_8478CB8, - sSpriteAnim_8478CC0, - sSpriteAnim_8478CC8, - sSpriteAnim_8478CD0, - sSpriteAnim_8478CD8 -}; + u8 i; + u8 r7 = gUnknown_203F3E0->unk24; -/*static*/ const union AnimCmd sSpriteAnim_8478CF4[] = + gUnknown_203F3E0->unk31A0[0].unk10 = sub_815A950(0, &gUnknown_203F3E0->unk31A0[0], &gUnknown_203F3E0->unk31A0[0].unk2C, &gUnknown_203F3E0->unk31A0[1].unk2C, &gUnknown_203F3E0->unk31A0[2].unk2C, &gUnknown_203F3E0->unk31A0[3].unk2C, &gUnknown_203F3E0->unk31A0[4].unk2C, &gUnknown_203F3E0->unk40, &gUnknown_203F3E0->unk120, &gUnknown_203F3E0->unk12C); + gUnknown_203F3E0->unk128 = 1; + + for (i = 1; i < r7; i++) + { + if ( gUnknown_203F3E0->unkA8[i] == 0 + && sub_815AB04(i, &gUnknown_203F3E0->unk31A0[i].unk2C.unk0) == 0) + { + gUnknown_203F3E0->unk31A0[i].unk2C.unk0 = 0; + gUnknown_203F3E0->unk128 = 0; + } + } + if (++gUnknown_203F3E0->unk124 >= 60) + { + if (gUnknown_203F3E0->unk128 != 0) + { + sub_80FBA44(); + gUnknown_203F3E0->unk124 = 0; + } + else if (gUnknown_203F3E0->unk124 > 70) + { + sub_80FBA44(); + gUnknown_203F3E0->unk124 = 0; + } + } + + for (i = 0; i < r7; i++) + { + if ( gUnknown_203F3E0->unk31A0[i].unk2C.unk0 != 0 + && gUnknown_203F3E0->unkA8[i] == 0) + { + gUnknown_203F3E0->unkA8[i] = 1; + } + switch (gUnknown_203F3E0->unkA8[i]) + { + case 0: + default: + break; + case 1 ... 3: + if (++gUnknown_203F3E0->unkB0[i] >= 6) + { + gUnknown_203F3E0->unkB0[i] = 0; + gUnknown_203F3E0->unkA8[i] = 0; + gUnknown_203F3E0->unk31A0[i].unk2C.unk0 = 0; + gUnknown_203F3E0->unk31A0[i].unk2C.unk4 = 0; + gUnknown_203F3E0->unk31A0[i].unk2C.unk8 = 0; + } + break; + case 4: + if (++gUnknown_203F3E0->unkB0[i] >= 40) + { + gUnknown_203F3E0->unkB0[i] = 0; + gUnknown_203F3E0->unkA8[i] = 0; + gUnknown_203F3E0->unk31A0[i].unk2C.unk0 = 0; + gUnknown_203F3E0->unk31A0[i].unk2C.unk4 = 0; + gUnknown_203F3E0->unk31A0[i].unk2C.unk8 = 0; + } + break; + } + } +} + +static void sub_8151A5C(void) { - ANIMCMD_FRAME(0, 20), - ANIMCMD_JUMP(0) -}; + u8 i; + u8 r6 = gUnknown_203F3E0->unk24; -/*static*/ const union AnimCmd sSpriteAnim_8478CFC[] = + gUnknown_203F3E0->unk31A0[0].unk10 = sub_815A950(0, &gUnknown_203F3E0->unk31A0[0], &gUnknown_203F3E0->unk31A0[0].unk2C, &gUnknown_203F3E0->unk31A0[1].unk2C, &gUnknown_203F3E0->unk31A0[2].unk2C, &gUnknown_203F3E0->unk31A0[3].unk2C, &gUnknown_203F3E0->unk31A0[4].unk2C, &gUnknown_203F3E0->unk40, &gUnknown_203F3E0->unk120, &gUnknown_203F3E0->unk12C); + gUnknown_203F3E0->unk128 = 1; + + for (i = 1; i < r6; i++) + { + if (sub_815AB60(i) != 0) + { + gUnknown_203F3E0->unk130[i] = 1; + gUnknown_203F3E0->unk128 = 0; + } + } + if (++gUnknown_203F3E0->unk124 >= 60) + { + if (gUnknown_203F3E0->unk128 != 0) + { + sub_80FBA44(); + gUnknown_203F3E0->unk124 = 0; + } + else if (gUnknown_203F3E0->unk124 > 70) + { + sub_80FBA44(); + gUnknown_203F3E0->unk124 = 0; + } + } +} + +static void sub_8151B54(void) { - ANIMCMD_FRAME(4, 20), - ANIMCMD_JUMP(0) -}; + switch (gUnknown_203F3E0->unk18) + { + case 3: + if (sub_8152A00() == TRUE) + { + sub_8152A70(); + gUnknown_203F3E0->unk11C = 1; + } + break; + case 4: + sub_815184C(); + break; + case 11: + sub_8151A5C(); + break; + } +} -/*static*/ const union AnimCmd sSpriteAnim_8478D04[] = +static void sub_8151BA0(void) { - ANIMCMD_FRAME(8, 20), - ANIMCMD_JUMP(0) -}; + switch (gUnknown_203F3E0->unk18) + { + case 4: + sub_815A61C(&gUnknown_203F3E0->unk32CC, &gUnknown_203F3E0->unk31A0[0].unk2C, &gUnknown_203F3E0->unk31A0[1].unk2C, &gUnknown_203F3E0->unk31A0[2].unk2C, &gUnknown_203F3E0->unk31A0[3].unk2C, &gUnknown_203F3E0->unk31A0[4].unk2C, gUnknown_203F3E0->unk40, gUnknown_203F3E0->unk120, gUnknown_203F3E0->unk12C); + break; + case 11: + sub_815A61C(&gUnknown_203F3E0->unk32CC, &gUnknown_203F3E0->unk31A0[0].unk2C, &gUnknown_203F3E0->unk31A0[1].unk2C, &gUnknown_203F3E0->unk31A0[2].unk2C, &gUnknown_203F3E0->unk31A0[3].unk2C, &gUnknown_203F3E0->unk31A0[4].unk2C, gUnknown_203F3E0->unk40, gUnknown_203F3E0->unk120, gUnknown_203F3E0->unk12C); + break; + } +} -/*static*/ const union AnimCmd *const sSpriteAnimTable_8478D0C[] = +static void sub_8151C5C(void) { - sSpriteAnim_8478CF4, - sSpriteAnim_8478CFC, - sSpriteAnim_8478D04 -}; + switch (gUnknown_203F3E0->unk18) + { + case 4: + sub_815A950(gUnknown_203F3E0->multiplayerId, &gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId], &gUnknown_203F3E0->unk31A0[0].unk2C, &gUnknown_203F3E0->unk31A0[1].unk2C, &gUnknown_203F3E0->unk31A0[2].unk2C, &gUnknown_203F3E0->unk31A0[3].unk2C, &gUnknown_203F3E0->unk31A0[4].unk2C, &gUnknown_203F3E0->unk40, &gUnknown_203F3E0->unk120, &gUnknown_203F3E0->unk12C); + break; + case 11: + sub_815A950(gUnknown_203F3E0->multiplayerId, &gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId], &gUnknown_203F3E0->unk31A0[0].unk2C, &gUnknown_203F3E0->unk31A0[1].unk2C, &gUnknown_203F3E0->unk31A0[2].unk2C, &gUnknown_203F3E0->unk31A0[3].unk2C, &gUnknown_203F3E0->unk31A0[4].unk2C, &gUnknown_203F3E0->unk40, &gUnknown_203F3E0->unk120, &gUnknown_203F3E0->unk12C); + break; + } +} -/*static*/ const union AnimCmd sSpriteAnim_8478D18[] = +static void sub_8151D28(void) { - ANIMCMD_FRAME(0, 20), - ANIMCMD_JUMP(0) -}; + switch (gUnknown_203F3E0->unk18) + { + case 3: + sub_815A5BC(1); + gUnknown_203F3E0->unk11C = 1; + break; + case 4: + if (gUnknown_203F3E0->unk32CC.unk2C.unk0 != 0) + { + sub_815AAD8(gUnknown_203F3E0->unk32CC.unk2C.unk0); + } + break; + case 11: + if (gUnknown_203F3E0->unk120 == 0 && gUnknown_203F3E0->unk12C == 0) + { + sub_815AB3C(1); + } + break; + } +} -/*static*/ const union AnimCmd sSpriteAnim_8478D20[] = +static void sub_8151D98(void) { - ANIMCMD_FRAME(4, 20), - ANIMCMD_JUMP(0) -}; + if (gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk0 == 0) + { + if (!IsSEPlaying()) + { + gUnknown_203F3E0->unk144 = 0; + } + } + else if (gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk4 == 1) + { + if (gUnknown_203F3E0->unk144 == 0) + { + m4aSongNumStop(SE_SEIKAI); + PlaySE(SE_SEIKAI); + gUnknown_203F3E0->unk144 = 1; + } + } + else if (gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk8 == 1) + { + if (gUnknown_203F3E0->unk144 == 0 && !IsSEPlaying()) + { + PlaySE(SE_BOO); + sub_8153BC0(1); + gUnknown_203F3E0->unk144 = 1; + } + } -/*static*/ const union AnimCmd sSpriteAnim_8478D28[] = + if (gUnknown_203F3E0->unk154 == 0 && gUnknown_203F3E0->unk40 >= 10) + { + StopMapMusic(); + gUnknown_203F3E0->unk154 = 1; + } + else if (gUnknown_203F3E0->unk154 == 1) + { + PlayFanfareByFanfareNum(FANFARE_10); // MUS_ME_ZANNEN + gUnknown_203F3E0->unk154 = 2; + } +} + +static void sub_8151E94(void) { - ANIMCMD_FRAME(8, 20), - ANIMCMD_JUMP(0) -}; + u8 r8 = gUnknown_203F3E0->unk44; + u8 r7 = gUnknown_203F3E0->unk48; + u8 r4; + if (gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk0 == 0) + { + if (gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk4 != 1 && gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk8 != 1) + { + gUnknown_203F3E0->unk144 = 0; + } + } + else if (gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk4 == 1) + { + if (gUnknown_203F3E0->unk144 == 0) + { + m4aSongNumStop(SE_SEIKAI); + PlaySE(SE_SEIKAI); + gUnknown_203F3E0->unk144 = 1; + } + } + else if (gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk8 == 1) + { + if (gUnknown_203F3E0->unk144 == 0 && !IsSEPlaying()) + { + PlaySE(SE_BOO); + sub_8153BC0(1); + gUnknown_203F3E0->unk144 = 1; + } + } + for (r4 = r8; r4 < r7; r4++) + { + struct DodrioSubstruct_31A0_14 * ptr = &gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk14; + if (ptr->unkB[r4] >= 10) + { + if (gUnknown_203F3E0->unk148[r4] == 0) + { + PlaySE(SE_FUUSEN1 + ptr->unk0[r4]); + gUnknown_203F3E0->unk148[r4] = 1; + } + } + else + { + gUnknown_203F3E0->unk148[r4] = 0; + } + } + if (gUnknown_203F3E0->unk154 == 0 && gUnknown_203F3E0->unk40 >= 10) + { + StopMapMusic(); + gUnknown_203F3E0->unk154 = 1; + } + else if (gUnknown_203F3E0->unk154 == 1) + { + PlayFanfareByFanfareNum(FANFARE_10); // MUS_ME_ZANNEN + gUnknown_203F3E0->unk154 = 2; + } +} -/*static*/ const union AnimCmd sSpriteAnim_8478D30[] = +static void sub_815201C(void) { - ANIMCMD_FRAME(12, 20), - ANIMCMD_JUMP(0) -}; + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} -/*static*/ const union AnimCmd sSpriteAnim_8478D38[] = +static void sub_8152034(void) { - ANIMCMD_FRAME(16, 20), - ANIMCMD_JUMP(0) -}; + TransferPlttBuffer(); + LoadOam(); + ProcessSpriteCopyRequests(); +} -/*static*/ const union AnimCmd sSpriteAnim_8478D40[] = +static void sub_8152048(struct DodrioSubstruct_318C * a0, struct Pokemon * a1) { - ANIMCMD_FRAME(20, 20), - ANIMCMD_JUMP(0) -}; + a0->isShiny = IsMonShiny(a1); +} -/*static*/ const union AnimCmd sSpriteAnim_8478D48[] = +static void sub_815205C(TaskFunc func, u8 priority) { - ANIMCMD_FRAME(24, 20), - ANIMCMD_JUMP(0) -}; + CreateTask(func, priority); +} -/*static*/ const union AnimCmd sSpriteAnim_8478D50[] = +static void sub_815206C(TaskFunc func) { - ANIMCMD_FRAME(28, 20), - ANIMCMD_JUMP(0) -}; + gUnknown_203F3E0->unk04 = CreateTask(func, 1); + gUnknown_203F3E0->unk10 = 0; + gUnknown_203F3E0->unk0C = 0; + gUnknown_203F3E0->unk14 = 0; +} -/*static*/ const union AnimCmd sSpriteAnim_8478D58[] = +static void sub_8152090(u8 a0) { - ANIMCMD_FRAME(32, 20), - ANIMCMD_JUMP(0) -}; + gUnknown_203F3E0->unk1C = gUnknown_203F3E0->unk18; + gUnknown_203F3E0->unk18 = a0; + gUnknown_203F3E0->unk10 = 0; + gUnknown_203F3E0->unk14 = 0; +} -/*static*/ const union AnimCmd *const sSpriteAnimTable_8478D60[] = -{ - sSpriteAnim_8478D18, - sSpriteAnim_8478D20, - sSpriteAnim_8478D28, - sSpriteAnim_8478D30, - sSpriteAnim_8478D38, - sSpriteAnim_8478D40, - sSpriteAnim_8478D48, - sSpriteAnim_8478D50, - sSpriteAnim_8478D58 -}; +static bool32 sub_81520B4(void) +{ + u8 r2 = gUnknown_203F3E0->unk14 / 4; + gUnknown_203F3E0->unk14++; + if (r2 != 0 && gUnknown_203F3E0->unk14 % 4 == 0) + { + if (r2 < sUnknown_8475548[gUnknown_203F3E0->unk24 - 1]) + { + SetGpuReg(REG_OFFSET_BG1HOFS, (r2 * 8)); + SetGpuReg(REG_OFFSET_BG2HOFS, -(r2 * 8)); + return FALSE; + } + else + { + return TRUE; + } + } + else + { + return FALSE; + } +} -/*static*/ const union AnimCmd sSpriteAnim_8478D84[] = +static void sub_8152110(void) { - ANIMCMD_FRAME(0, 20), - ANIMCMD_JUMP(0) -}; + u8 i; + u8 start = gUnknown_203F3E0->unk44; + u8 finish = gUnknown_203F3E0->unk48; + + for (i = start; i < finish; i++) + { + struct DodrioSubstruct_31A0_14 * ptr = &gUnknown_203F3E0->unk32CC.unk14; + ptr->unkB[i] = (i % 2 == 0) ? 1 : 0; + ptr->unk0[i] = 0; + } +} -/*static*/ const union AnimCmd *const sSpriteAnimTable_8478D8C[] = +static void sub_8152174(void) { - sSpriteAnim_8478D84 -}; + u8 sp0 = gUnknown_203F3E0->unk44; + u8 sp4 = gUnknown_203F3E0->unk48; + u8 sp8 = gUnknown_203F3E0->unk24; + u8 i, j, k, r5; -// These are declared inside pokeemerald's sub_80283A8 -const struct SpritePalette gUnknown_8478D90 = {sDodrioBerryPkmnPal, 0}; -const struct SpritePalette gUnknown_8478D98 = {sDodrioBerryShinyPal, 1}; - -// These are declared inside pokeemerald's sub_8028734 -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. -/*static*/ const u8 sUnused2[] = {0xCD, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0xF4, 0x0, 0x0}; - -// This is declared inside pokeemerald's sub_8028A34 -const struct SpritePalette gUnknown_8478DCC = {sDodrioBerrySpritesPal, 3}; - -/*static*/ const s16 sUnknown_8478DD4[] = {88, 128, 168, 208}; - -// These are declared inside pokeemerald's sub_8028A88 -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 -/*static*/ const u8 gUnknown_8478E0C[] = {30, 20}; - -/*static*/ const s16 gUnknown_8478E0E[][2] = {{230, 55}, {30, 74}}; - -// These are declared inside pokeemerald's sub_8028D44 -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; -}; + if (gUnknown_203F3E0->unk40 >= 10) + return; + + for (i = 0; i < sp8; i++) + { + u8 *ptr = &gUnknown_203F3E0->unk31A0[i].unk2C.unk0; + if (*ptr != 0 && gUnknown_203F3E0->unkA8[i] == 1) + { + for (j = sp0; j < sp4; j++) + { + r5 = sUnknown_8471F50[0][0][j]; + if (gUnknown_203F3E0->unkF4[r5][0] == i || gUnknown_203F3E0->unkF4[r5][1] == i) + break; + if (sub_8152484(i, *ptr, r5) == TRUE) + { + for (k = 0; k < 2; k++) + { + if (gUnknown_203F3E0->unkF4[r5][k] == 0xFF) + { + gUnknown_203F3E0->unkF4[r5][k] = i; + gUnknown_203F3E0->unkA8[i] = 2; + gUnknown_203F3E0->unkC4[r5] = 1; + break; + } + } + break; + } + if (gUnknown_203F3E0->unk31A0[i].unk2C.unk8 == 1) + break; + } + } + } + + for (j = sp0; j < sp4; j++) + { + u8 id = 0xFF; + r5 = sUnknown_8471F50[0][0][j]; + if (gUnknown_203F3E0->unkC4[r5] == 1) + { + s32 r2; + u8 r4, r3 = gUnknown_203F3E0->unk90[sub_8152BD4(r5)] / 7; + if (r3 >= NELEMS(sUnknown_847553C) - 1) + r3 = NELEMS(sUnknown_847553C) - 1; + + r2 = sUnknown_847553C[r3][gUnknown_203F3E0->unk31A0[0].unk14.unk0[r5]] - gUnknown_203F3E0->unkD0[r5]; + if (r2 < 6) + gUnknown_203F3E0->unk9C[r5] += r2; + + if (++gUnknown_203F3E0->unk9C[r5] >= 6) + { + gUnknown_203F3E0->unk9C[r5] = 0; + if (gUnknown_203F3E0->unkF4[r5][0] == 0xFF && gUnknown_203F3E0->unkF4[r5][1] == 0xFF) + { + continue; + } + else if (gUnknown_203F3E0->unkF4[r5][0] != 0xFF && gUnknown_203F3E0->unkF4[r5][1] == 0xFF) + { + r4 = gUnknown_203F3E0->unkF4[r5][0]; + } + else + { + u8 unk0 = gUnknown_203F3E0->unkF4[r5][0]; + i = gUnknown_203F3E0->unkF4[r5][1]; // Have to re-use the variable to match. + if (!(Random() & 1)) + { + r4 = unk0; + id = i; + } + else + { + r4 = i; + id = unk0; + } + } + gUnknown_203F3E0->unk32CC.unk14.unkB[r5] = 7; + gUnknown_203F3E0->unkC4[r5] = 2; + gUnknown_203F3E0->unkA8[r4] = 3; + gUnknown_203F3E0->unkB8[r5] = r4; + gUnknown_203F3E0->unk31A0[r4].unk2C.unk4 = 1; + gUnknown_203F3E0->unk31A0[id].unk2C.unk8 = 1; + gUnknown_203F3E0->unk86[r4]++; + sub_8152D34(0, r5, r4); + sub_8152F94(TRUE); + sub_8152B64(r4); + gUnknown_203F3E0->unkE8[r5] = gUnknown_203F3E0->unk32CC.unk14.unk0[r5]; + gUnknown_203F3E0->unk32CC.unk14.unk0[r5] = 3; + gUnknown_203F3E0->unkF4[r5][0] = 0xFF; + gUnknown_203F3E0->unkF4[r5][1] = 0xFF; + } + } + } +} -/*static*/ const u8 sUnknown_8478E38[][3] = +static bool32 sub_8152484(u8 a0, u8 a1, u8 a2) { - {1, 2, 3}, - {1, 4, 5}, - {1, 8, 9}, - {1, 6, 7}, -}; + s32 r7 = 0; + u8 r5 = gUnknown_203F3E0->unk24 - 1; + struct DodrioSubstruct_31A0_14 * ptr = &gUnknown_203F3E0->unk32CC.unk14; + + switch (a1) + { + case 3: + default: + r7 = 0; + break; + case 2: + r7 = 1; + break; + case 1: + r7 = 2; + break; + } + if (ptr->unkB[a2] == 6 || ptr->unkB[a2] == 7) + { + if (a2 == sUnknown_8472063[r5][a0][r7]) + { + if (gUnknown_203F3E0->unkC4[a2] == 1 || gUnknown_203F3E0->unkC4[a2] == 2) + { + gUnknown_203F3E0->unk31A0[a0].unk2C.unk8 = 1; + return FALSE; + } + else + { + return TRUE; + } + } + } + else + { + if (a2 == sUnknown_8472063[r5][a0][r7]) + { + gUnknown_203F3E0->unkA8[a0] = 4; + gUnknown_203F3E0->unk31A0[a0].unk2C.unk8 = 1; + } + } + return FALSE; +} + +static void sub_815256C(void) +{ + u8 r1 = gUnknown_203F3E0->unk44; + u8 r9 = gUnknown_203F3E0->unk48; + u8 r3 = 0; + u8 r10 = 0; + u8 i; + u8 r2; + struct DodrioStruct * ptr; + + gUnknown_203F3E0->unk120 = 0; + + for (i = r1; i < r9 - 1; i++) + { + ptr = gUnknown_203F3E0; + + if (gUnknown_203F3E0->unkC4[i] == 0 || gUnknown_203F3E0->unkC4[i] == 1) + { + gUnknown_203F3E0->unk120 = 1; + if (ptr->unk32CC.unk14.unkB[i] >= 10) + { + ptr->unk32CC.unk14.unkB[i] = 10; + gUnknown_203F3E0->unkC4[i] = 3; + if (gUnknown_203F3E0->unk148[i] == 0) + { + gUnknown_203F3E0->unk148[i] = 1; + PlaySE(SE_FUUSEN1 + ptr->unk32CC.unk14.unk0[i]); + } + if (gUnknown_203F3E0->unk40 < 10 || r10 == 1) + { + r10 = 1; + gUnknown_203F3E0->unk148[i] = 0; + if (gUnknown_203F3E0->unk40 < 10) + { + gUnknown_203F3E0->unk40++; + } + sub_8152D34(3, i, 0); + sub_8152F94(FALSE); + } + } + else + { + r3 = gUnknown_203F3E0->unk90[sub_8152BD4(i)] / 7; + if (r3 >= NELEMS(sUnknown_847553C) - 1) + { + r3 = NELEMS(sUnknown_847553C) - 1; + } + r2 = sUnknown_847553C[r3][ptr->unk32CC.unk14.unk0[i]]; + if (++gUnknown_203F3E0->unkD0[i] >= r2) + { + ptr->unk32CC.unk14.unkB[i]++; + gUnknown_203F3E0->unkD0[i] = 0; + } + sub_8152174(); + } + } + else if (gUnknown_203F3E0->unkC4[i] == 2) + { + // gUnknown_203F3E0->unk120 = 1; + if (++gUnknown_203F3E0->unkDC[i] >= 20) + { + gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->unkB8[i]].unk2C.unk4 = 0; + gUnknown_203F3E0->unkDC[i] = 0; + gUnknown_203F3E0->unkD0[i] = 0; + gUnknown_203F3E0->unkC4[i] = 0; + ptr->unk32CC.unk14.unkB[i] = 1; + ptr->unk32CC.unk14.unk0[i] = sub_8152BF8(sub_8152BD4(i), i); + } + } + else if (gUnknown_203F3E0->unkC4[i] == 3) + { + if (++gUnknown_203F3E0->unkDC[i] >= 20) + { + if (gUnknown_203F3E0->unk40 < 10) + { + gUnknown_203F3E0->unkDC[i] = 0; + gUnknown_203F3E0->unkD0[i] = 0; + gUnknown_203F3E0->unkC4[i] = 0; + ptr->unk32CC.unk14.unkB[i] = 1; + gUnknown_203F3E0->unkE8[i] = ptr->unk32CC.unk14.unk0[i]; + ptr->unk32CC.unk14.unk0[i] = sub_8152BF8(sub_8152BD4(i), i); + } + } + } + } +} + +static void sub_81527D0(void) +{ + u8 i, first, count; + + first = gUnknown_203F3E0->unk44; + count = gUnknown_203F3E0->unk48; + for (i = first; i < count; i++) + { + struct DodrioSubstruct_31A0 * ptr = &gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId]; + u8 var = sUnknown_8471F50[gUnknown_203F3E0->unk24 - 1][gUnknown_203F3E0->multiplayerId][i]; + + if (ptr->unk14.unkB[var] != 0) + sub_81542EC(i, FALSE); + else + sub_81542EC(i, TRUE); + + if (ptr->unk14.unkB[var] > 9) + { + sub_8154398(i, ptr->unk14.unk0[var] + 3); + sub_8154370(i, ptr->unk14.unkB[var] * 2 - 1); + } + else if (ptr->unk14.unk0[var] == 3) + { + ptr->unk14.unkB[var] = 7; + sub_8154398(i, 6); + sub_8154370(i, ptr->unk14.unkB[var] * 2 - 1); + } + else + { + sub_8154398(i, ptr->unk14.unk0[var]); + sub_8154370(i, ptr->unk14.unkB[var] * 2); + } + } +} + +static void sub_81528D0(void) +{ + u8 i, count; + + count = gUnknown_203F3E0->unk24; + for (i = 0; i < count; i++) + { + struct DodrioSubstruct_31A0 * ptr = &gUnknown_203F3E0->unk31A0[i]; + sub_8153DA8(i, ptr->unk2C.unk0); + } +} + +static void sub_8152910(void) +{ + u8 i, count; + + count = gUnknown_203F3E0->unk24; + for (i = 0; i < count; i++) + sub_8153DA8(i, 4); +} + +static void sub_815293C(void) +{ + sub_81527D0(); + if (gUnknown_203F3E0->unk40 > 9) + sub_8152910(); + else + sub_81528D0(); + + sub_8153FC8(gUnknown_203F3E0->unk40); +} + +// This function is literally the same as the one above...Why? +static void sub_8152970(void) +{ + sub_81527D0(); + if (gUnknown_203F3E0->unk40 > 9) + sub_8152910(); + else + sub_81528D0(); + + sub_8153FC8(gUnknown_203F3E0->unk40); +} + +static void sub_81529A4(u8 arg0, u8 *arg1, u8 *arg2) +{ + switch (arg0) + { + case 1: + *arg1 = 4, *arg2 = 7; + break; + case 2: + *arg1 = 3, *arg2 = 8; + break; + case 3: + *arg1 = 2, *arg2 = 9; + break; + case 4: + *arg1 = 1, *arg2 = 10; + break; + case 5: + *arg1 = 0, *arg2 = 11; + break; + } +} + +static bool32 sub_8152A00(void) +{ + u8 i, count; + + count = gUnknown_203F3E0->unk24; + for (i = 1; i < count; i++) + { + if (gUnknown_203F3E0->unk158[i] == 0) + gUnknown_203F3E0->unk158[i] = sub_815A5E8(i); + } + + // This loop won't ever run, the seemingly pointless assingment below is to make the compiler + // generate code for it. + count = count; + for (; i < count; i++) + { + if (gUnknown_203F3E0->unk158[i] == 0) + return FALSE; + } + + return TRUE; +} + +static void sub_8152A70(void) +{ + u8 i; + + for (i = 0; i < 5; i++) + gUnknown_203F3E0->unk158[i] = 0; +} + +static bool32 sub_8152A98(void) +{ + if (gUnknown_203F3E0->unk40 > 9 && gUnknown_203F3E0->unk120 == 0) + { + gUnknown_203F3E0->unk40 = 10; + if (gUnknown_203F3E0->unk12C != 0) + return TRUE; + } + + return FALSE; +} + +static bool32 sub_8152AD8(void) +{ + u8 i, first, count; + + if (gUnknown_203F3E0->unk40 > 9) + { + first = gUnknown_203F3E0->unk44; + count = gUnknown_203F3E0->unk48; + gUnknown_203F3E0->unk40 = 10; + if (gUnknown_203F3E0->unk12C != 0) + { + for (i = first; i < count; i++) + { + struct DodrioSubstruct_31A0 * ptr = &gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId]; + u8 var = sUnknown_8471F50[gUnknown_203F3E0->unk24 - 1][gUnknown_203F3E0->multiplayerId][i]; + + if (ptr->unk14.unkB[var] != 10) + return FALSE; + } + return TRUE; + } + } + + return FALSE; +} + +static void sub_8152B64(u8 arg0) +{ + u8 var = sUnknown_8475550[gUnknown_203F3E0->unk90[arg0] % 7] + (gUnknown_203F3E0->unk90[arg0] / 7) * 100; + if (gUnknown_203F3E0->unk86[arg0] >= var) + gUnknown_203F3E0->unk90[arg0]++; +} + +static u8 sub_8152BD4(u8 arg0) +{ + return sUnknown_84720FC[gUnknown_203F3E0->unk24 - 1][arg0]; +} + +static u8 sub_8152BF8(u8 arg0, u8 arg1) +{ + u8 i, var3; + u8 count = gUnknown_203F3E0->unk24 - 1; + u8 var0 = sUnknown_84720AE[count][arg0][0]; + u8 var1 = sUnknown_84720AE[count][arg0][1]; + u8 var2 = sUnknown_84720AE[count][arg0][2]; + + for (i = 0; sUnknown_8472133[count][i] != 0; i++) + { + if (arg1 == sUnknown_8472133[count][i]) + return sub_8152CB8(gUnknown_203F3E0->unk90[var1], arg1); + } + + // Gets the highest of the three. + if (gUnknown_203F3E0->unk90[var0] > gUnknown_203F3E0->unk90[var1]) + var3 = gUnknown_203F3E0->unk90[var0]; + else + var3 = gUnknown_203F3E0->unk90[var1]; + + if (gUnknown_203F3E0->unk90[var2] > var3) + var3 = gUnknown_203F3E0->unk90[var2]; + + return sub_8152CB8(var3, arg1); +} + +static u8 sub_8152CB8(u8 arg0, u8 arg1) +{ + u8 var = gUnknown_203F3E0->unkE8[arg1]; + switch (arg0 % 7) + { + default: return 0; + case 0: return 0; + case 1: return 1; + case 2: return 2; + case 3: + if (var == 0) + return 1; + else + return 0; + case 4: + if (var == 0) + return 2; + else + return 0; + case 5: + if (var == 2) + return 1; + else + return 2; + case 6: + if (var == 0) + return 1; + else if (var == 1) + return 2; + else + return 0; + } +} + +static void sub_8152D34(u8 arg0, u8 arg1, u8 arg2) +{ + u8 var; + u8 count = gUnknown_203F3E0->unk24; + switch (arg0) + { + case 0: + case 1: + case 2: + var = gUnknown_203F3E0->unk31A0[0].unk14.unk0[arg1]; + gUnknown_203F3E0->unk4A[arg2][var] = IncrementWithLimit(gUnknown_203F3E0->unk4A[arg2][var], 20000); + break; + case 3: + switch (count) + { + case 5: + switch (arg1) + { + case 0: + gUnknown_203F3E0->unk4A[2][3]++; + gUnknown_203F3E0->unk4A[3][3]++; + break; + case 1: + gUnknown_203F3E0->unk4A[3][3]++; + break; + case 2: + gUnknown_203F3E0->unk4A[3][3]++; + gUnknown_203F3E0->unk4A[4][3]++; + break; + case 3: + gUnknown_203F3E0->unk4A[4][3]++; + break; + case 4: + gUnknown_203F3E0->unk4A[4][3]++; + gUnknown_203F3E0->unk4A[0][3]++; + break; + case 5: + gUnknown_203F3E0->unk4A[0][3]++; + break; + case 6: + gUnknown_203F3E0->unk4A[0][3]++; + gUnknown_203F3E0->unk4A[1][3]++; + break; + case 7: + gUnknown_203F3E0->unk4A[1][3]++; + break; + case 8: + gUnknown_203F3E0->unk4A[1][3]++; + gUnknown_203F3E0->unk4A[2][3]++; + break; + case 9: + gUnknown_203F3E0->unk4A[2][3]++; + break; + } + break; + case 4: + switch (arg1) + { + case 1: + gUnknown_203F3E0->unk4A[2][3]++; + gUnknown_203F3E0->unk4A[3][3]++; + break; + case 2: + gUnknown_203F3E0->unk4A[3][3]++; + break; + case 3: + gUnknown_203F3E0->unk4A[3][3]++; + gUnknown_203F3E0->unk4A[0][3]++; + break; + case 4: + gUnknown_203F3E0->unk4A[0][3]++; + break; + case 5: + gUnknown_203F3E0->unk4A[0][3]++; + gUnknown_203F3E0->unk4A[1][3]++; + break; + case 6: + gUnknown_203F3E0->unk4A[1][3]++; + break; + case 7: + gUnknown_203F3E0->unk4A[1][3]++; + gUnknown_203F3E0->unk4A[2][3]++; + break; + case 8: + gUnknown_203F3E0->unk4A[2][3]++; + break; + } + break; + case 3: + switch (arg1) + { + case 2: + gUnknown_203F3E0->unk4A[1][3]++; + gUnknown_203F3E0->unk4A[2][3]++; + break; + case 3: + gUnknown_203F3E0->unk4A[2][3]++; + break; + case 4: + gUnknown_203F3E0->unk4A[2][3]++; + gUnknown_203F3E0->unk4A[0][3]++; + break; + case 5: + gUnknown_203F3E0->unk4A[0][3]++; + break; + case 6: + gUnknown_203F3E0->unk4A[0][3]++; + gUnknown_203F3E0->unk4A[1][3]++; + break; + case 7: + gUnknown_203F3E0->unk4A[1][3]++; + break; + } + break; + case 2: + switch (arg1) + { + case 3: + gUnknown_203F3E0->unk4A[0][3]++; + gUnknown_203F3E0->unk4A[1][3]++; + break; + case 4: + gUnknown_203F3E0->unk4A[0][3]++; + break; + case 5: + gUnknown_203F3E0->unk4A[0][3]++; + gUnknown_203F3E0->unk4A[1][3]++; + break; + case 6: + gUnknown_203F3E0->unk4A[1][3]++; + break; + } + break; + } + break; + } +} + +static void sub_8152F94(bool32 arg0) +{ + if (gUnknown_203F3E0->unk24 != 5) + return; + + if (arg0 == TRUE) + { + if (++gUnknown_203F3E0->unk112 > gUnknown_203F3E0->unk114) + gUnknown_203F3E0->unk114 = gUnknown_203F3E0->unk112; + if (gUnknown_203F3E0->unk112 > 9999) + gUnknown_203F3E0->unk112 = 9999; + } + else + { + if (gUnknown_203F3E0->unk112 > gUnknown_203F3E0->unk114) + gUnknown_203F3E0->unk114 = gUnknown_203F3E0->unk112; + gUnknown_203F3E0->unk112 = 0; + } +} + +static void sub_8153004(void) +{ + u8 i; + for (i = 0; i < gUnknown_203F3E0->unk24; i++) + gUnknown_203F3E0->unk4A[i][5] = gUnknown_203F3E0->unk114; +} + +static void sub_8153048(void) +{ + u8 i, j; -/*static*/ const struct WinCoords sUnknown_8478E44[] = {{12, 6}}; -/*static*/ const struct WinCoords sUnknown_8478E48[] = {{9, 10}, {15, 6}}; -/*static*/ const struct WinCoords sUnknown_8478E50[] = {{12, 6}, {18, 10}, {6, 10}}; -/*static*/ const struct WinCoords sUnknown_8478E5C[] = {{9, 10}, {15, 6}, {21, 10}, {3, 6}}; -/*static*/ const struct WinCoords sUnknown_8478E6C[] = {{12, 6}, {18, 10}, {23, 6}, {1, 6}, {6, 10}}; + for (i = 0; i < 5; i++) + { + for (j = 0; j < 11; j++) + gUnknown_203F3E0->unk31A0[i].unk14.unkB[j] = 0; + gUnknown_203F3E0->unk31A0[i].unk2C.unk0 = 0; + gUnknown_203F3E0->unk31A0[i].unk2C.unk4 = 0; + gUnknown_203F3E0->unk90[i] = 0; + gUnknown_203F3E0->unk86[i] = 0; + gUnknown_203F3E0->unk3308[i].unk0 = 0; + gUnknown_203F3E0->unk3308[i].unk4 = 0; + gUnknown_203F3E0->unk4A[i][0] = 0; + gUnknown_203F3E0->unk4A[i][1] = 0; + gUnknown_203F3E0->unk4A[i][2] = 0; + gUnknown_203F3E0->unk4A[i][3] = 0; + gUnknown_203F3E0->unk4A[i][4] = 0; + gUnknown_203F3E0->unk4A[i][5] = 0; + } + gUnknown_203F3E0->unk154 = 0; + gUnknown_203F3E0->unk112 = 0; + gUnknown_203F3E0->unk40 = 0; + sub_81528D0(); + sub_81527D0(); +} + +static const s16 sUnknown_84755D8[] = {10, 30, 50, 50}; + +static void sub_8153150(void) +{ + u8 i, var = 0, var2 = 0; + + switch (gUnknown_203F3E0->unk24) + { + case 4: var = 1; break; + case 5: var = 2; break; + } + + var2 = Random() % 10; + for (i = 0; i < 5; i++) + gUnknown_203F3E0->unk4A[i][4] = sUnknown_8475558[var][var2]; +} + +static u32 sub_81531BC(u8 arg0) +{ + u32 sum = gUnknown_203F3E0->unk4A[arg0][0] + + gUnknown_203F3E0->unk4A[arg0][1] + + gUnknown_203F3E0->unk4A[arg0][2]; + return min(sum, 9999); +} + +static void sub_81531FC(void) +{ + u32 berriesPicked = Min(sub_81531BC(gUnknown_203F3E0->multiplayerId), 9999); + u32 score = Min(sub_8153424(gUnknown_203F3E0->multiplayerId), 999990); + + if (gSaveBlock2Ptr->berryPick.bestScore < score) + gSaveBlock2Ptr->berryPick.bestScore = score; + if (gSaveBlock2Ptr->berryPick.berriesPicked < berriesPicked) + gSaveBlock2Ptr->berryPick.berriesPicked = berriesPicked; + if (gSaveBlock2Ptr->berryPick.berriesPickedInRow < gUnknown_203F3E0->unk114) + gSaveBlock2Ptr->berryPick.berriesPickedInRow = gUnknown_203F3E0->unk114; +} + +static u8 sub_815327C(u8 arg0) +{ + u8 i, saved; + + saved = gUnknown_203F3E0->unk98[3]; + for (i = 3; i != 0; i--) + gUnknown_203F3E0->unk98[i] = gUnknown_203F3E0->unk98[i - 1]; + gUnknown_203F3E0->unk98[0] = arg0; + return saved; +} + +static void sub_81532B8(void) +{ + if (gUnknown_203F3E0->unkB0[gUnknown_203F3E0->multiplayerId] == 0) + { + if (JOY_NEW(DPAD_UP)) + { + gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk0 = 2; + gUnknown_203F3E0->unkB0[gUnknown_203F3E0->multiplayerId] = 6; + PlaySE(SE_W204); + } + else if (JOY_NEW(DPAD_LEFT)) + { + gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk0 = 3; + gUnknown_203F3E0->unkB0[gUnknown_203F3E0->multiplayerId] = 6; + PlaySE(SE_W204); + } + else if (JOY_NEW(DPAD_RIGHT)) + { + gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk0 = 1; + gUnknown_203F3E0->unkB0[gUnknown_203F3E0->multiplayerId] = 6; + PlaySE(SE_W204); + } + else + { + gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk0 = 0; + } + } + else + { + gUnknown_203F3E0->unkB0[gUnknown_203F3E0->multiplayerId]--; + } +} + +static void sub_815336C(void) +{ + gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk0 = 0; +} + +u16 sub_8153390(void) +{ + return gUnknown_203F3E0->unk4A[gUnknown_203F3E0->multiplayerId][4] + FIRST_BERRY_INDEX; +} + +u8 sub_81533B4(void) +{ + return gUnknown_203F3E0->unk24; +} + +u8 *sub_81533C4(u8 id) +{ + if (gReceivedRemoteLinkPlayers) + return gLinkPlayers[id].name; + else + return gUnknown_203F3E0->unk31A0[id].name; +} -/*static*/ const struct WinCoords *const sUnknown_8478E80[] = +u16 sub_8153404(u8 arg0, u8 arg1) +{ + return gUnknown_203F3E0->unk4A[arg0][arg1]; +} + +static u32 sub_8153424(u8 arg0) +{ + u8 i; + u32 var, sum = 0; + + for (i = 0; i < 3; i++) + sum += gUnknown_203F3E0->unk4A[arg0][i] * sUnknown_84755D8[i]; + + var = gUnknown_203F3E0->unk4A[arg0][3] * sUnknown_84755D8[3]; + if (sum <= var) + return 0; + else + return sum - var; +} + +u32 sub_81534AC(void) +{ + u8 i, count = gUnknown_203F3E0->unk24; + u32 maxVar = sub_8153424(0); + + for (i = 1; i < count; i++) + { + u32 var = sub_8153424(i); + if (var > maxVar) + maxVar = var; + } + return Min(maxVar, 999990); +} + +u32 sub_81534F0(u8 arg0) +{ + u8 i, count = gUnknown_203F3E0->unk24; + u16 maxVar = gUnknown_203F3E0->unk4A[0][arg0]; + + for (i = 0; i < count; i++) + { + u16 var = gUnknown_203F3E0->unk4A[i][arg0]; + if (var > maxVar) + maxVar = var; + } + return maxVar; +} + +static u32 sub_8153534(u8 arg0) +{ + u32 vals[5], temp; + s16 r6 = TRUE; + u8 i, count = gUnknown_203F3E0->unk24; + + for (i = 0; i < count; i++) + vals[i] = temp = sub_8153424(i); + + while (r6) + { + r6 = FALSE; + for (i = 0; i < count - 1; i++) + { + if (vals[i] < vals[i + 1]) + { + SWAP(vals[i], vals[i + 1], temp); + r6 = TRUE; + } + } + } + + return vals[arg0]; +} + +u32 sub_81535B0(void) +{ + u8 i, r10 = 0, r8 = 0, r9 = 0, count = gUnknown_203F3E0->unk24; + + // Function called two times for some reason. + sub_81534AC(); + if (sub_81534AC() == 0) + { + for (i = 0; i < count; i++) + { + gUnknown_203F3E0->unk3308[i].unk0 = 4; + gUnknown_203F3E0->unk3308[i].unk4 = 0; + } + } + + for (i = 0; i < count; i++) + gUnknown_203F3E0->unk3308[i].unk4 = Min(sub_8153424(i), 999990); + + do + { + u32 r6 = sub_8153534(r10); + u8 r3 = r8; + for (i = 0; i < count; i++) + { + if (r6 == gUnknown_203F3E0->unk3308[i].unk4) + { + gUnknown_203F3E0->unk3308[i].unk0 = r3; + r8++; + r9++; + } + } + r10 = r8; + } while (r9 < count); + + return 0; +} + +void sub_81536A0(struct DodrioSubstruct_3308 * dst, u8 id) { - sUnknown_8478E44, - sUnknown_8478E48, - sUnknown_8478E50, - sUnknown_8478E5C, - sUnknown_8478E6C, + *dst = gUnknown_203F3E0->unk3308[id]; +} + +static u8 sub_81536C0(u8 arg0) +{ + u8 i, ret = 0, count = gUnknown_203F3E0->unk24; + u32 var, vars[5] = {0}; + + for (i = 0; i < count; i++) + vars[i] = sub_8153424(i); + + var = vars[arg0]; + for (i = 0; i < 5; i++) + { + if (i != arg0 && var < vars[i]) + ret++; + } + + return ret; +} + +u8 sub_815372C(void) +{ + u8 multiplayerId = gUnknown_203F3E0->multiplayerId; + u16 itemId = sub_8153390(); + + if (sub_8153424(multiplayerId) != sub_81534AC()) + return 3; + if (!CheckBagHasSpace(itemId, 1)) + return 2; + + AddBagItem(itemId, 1); + if (!CheckBagHasSpace(itemId, 1)) + return 1; + return 0; +} + +// Really? What next, u32 Add(u32 a)return a+1;? +u32 IncrementWithLimit(u32 a, u32 max) +{ + if (a < max) + return a + 1; + else + return max; +} + +// Gamefreak pls, min(a, b) ((a) < (b) ? (a) : (b)) is a well-known macro +u32 Min(u32 a, u32 b) +{ + if (a < b) + return a; + else + return b; +} + +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. +static const struct WindowTemplate sUnknown_84755E0 = +{ + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 28, + .height = 11, + .paletteNum = 15, + .baseBlock = 1, }; -/*static*/ const u8 *const sUnknown_8478E94[] = +static const u8 *const sUnknown_84755E8[] = {gText_BerryPickingRecords, gText_BerriesPicked, gText_BestScore, gText_BerriesInRowFivePlayers}; +static const u8 sUnknown_84755F8[] = {4, 7, 4}; + +ALIGNED(4) +static const u8 sUnknown_84755FC[][2] = {{24}, {40}, {56}}; +static const u8 sUnknown_8475602[][2] = {{24}, {40}, {70}}; + +static 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 (JOY_NEW(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; + } +} + +static void sub_81538D0(u8 windowId) { - gText_1Colon, - gText_2Colon, - gText_3Colon, - gText_4Colon, - gText_5Colon, + 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? +static const u16 sUnknown_8475608[][4] = +{ + {9999, 0, 90, 9999}, + {9999, 9999, 70, 9999}, + {9999, 0, 9999, 0}, + {9999, 9999, 60, 0}, + {9999, 9999, 9999, 0}, }; -/*static*/ const u16 sUnknown_8478EA8[] = {92, 132, 172, 212}; -/*static*/ const u16 sUnknown_8478EB0[] = {30, 45, 60, 75, 90}; -/*static*/ 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}, +static const u8 sUnknown_8475630[] = _("あいうえおかき"); +static const u8 sUnknown_8475638[] = _("ABCDEFG"); +static const u8 sUnknown_8475640[] = _("0123456"); + +static const u8 *const sPlaceholderPlayerNames[] = +{ + sUnknown_8475630, + sUnknown_8475630, + sUnknown_8475630, + sUnknown_8475638, + sUnknown_8475640 }; -// This is declared inside pokeemerald's sub_80296A8 -const u8 gUnknown_8478F14[5] = {0, 1, 2, 3, 4}; +static void sub_81539EC(void) +{ + gUnknown_203F3E0->unk24 = GetLinkPlayerCount(); +} + +static void sub_8153A04(void) +{ + u8 i, playerId; + + for (playerId = gUnknown_203F3E0->unk24; playerId < NELEMS(sPlaceholderPlayerNames); playerId++) + StringCopy(gLinkPlayers[playerId].name, sPlaceholderPlayerNames[playerId]); + + gUnknown_203F3E0->unk24 = 5; + for (i = 0; i < 4; i++) + { + for (playerId = 0; playerId < gUnknown_203F3E0->unk24; playerId++) + gUnknown_203F3E0->unk4A[playerId][i] = sUnknown_8475608[playerId][i]; + } +} |