Files
Pokemon-Firered/src/dodrio_berry_picking_2.c
T
2021-05-05 13:03:39 -04:00

1618 lines
44 KiB
C

#include "global.h"
#include "gflib.h"
#include "dodrio_berry_picking.h"
#include "dynamic_placeholder_text_util.h"
#include "item.h"
#include "link.h"
#include "menu.h"
#include "new_menu_helpers.h"
#include "save.h"
#include "strings.h"
#include "task.h"
#include "text_window.h"
#include "text_window_graphics.h"
#include "constants/songs.h"
struct DodrioStruct_2022CF4
{
u8 filler_00[0xc];
u8 unkC[10];
s16 unk16[10];
u16 unk2A[10];
u16 unk3E;
}; // size = 0x40
static EWRAM_DATA u16 *gUnknown_203F3E4[5] = {NULL};
static EWRAM_DATA u16 *gUnknown_203F3F8[2] = {NULL};
static EWRAM_DATA u16 *gUnknown_203F400[11] = {NULL};
static EWRAM_DATA u16 *gUnknown_203F42C[4] = {NULL};
static EWRAM_DATA struct DodrioStruct_2022CF4 * gUnknown_203F43C = NULL;
static EWRAM_DATA struct DodrioSubstruct_0160 * gUnknown_203F440 = NULL;
static void sub_8153B9C(struct Sprite * sprite);
static u32 sub_8153C30(struct Sprite * sprite);
static u32 sub_8153CA0(struct Sprite * sprite);
static void sub_8153D48(bool8 a0, u8 a1);
static void nullsub_97(struct Sprite * sprite);
static void sub_8154324(bool8 a0);
static void sub_81543E8(struct Sprite * sprite);
static s16 sub_8154608(u8 a0, u8 a1);
static void sub_8154A08(u8 taskId);
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);
static void sub_8155E24(MainCallback cb);
MainCallback sub_8155E54(void);
static void sub_8155EA0(void);
static bool32 sub_8155FE0(void);
// Assets in this header are duplicated
#include "data/dodrio_berry_picking.h"
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 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 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
};
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 const union AnimCmd sSpriteAnim_8478CB8[] =
{
ANIMCMD_FRAME(0, 20),
ANIMCMD_JUMP(0)
};
static const union AnimCmd sSpriteAnim_8478CC0[] =
{
ANIMCMD_FRAME(64, 20),
ANIMCMD_JUMP(0)
};
static const union AnimCmd sSpriteAnim_8478CC8[] =
{
ANIMCMD_FRAME(128, 20),
ANIMCMD_JUMP(0)
};
static const union AnimCmd sSpriteAnim_8478CD0[] =
{
ANIMCMD_FRAME(192, 20),
ANIMCMD_JUMP(0)
};
static const union AnimCmd sSpriteAnim_8478CD8[] =
{
ANIMCMD_FRAME(256, 20),
ANIMCMD_JUMP(0)
};
static const union AnimCmd *const sSpriteAnimTable_8478CE0[] =
{
sSpriteAnim_8478CB8,
sSpriteAnim_8478CC0,
sSpriteAnim_8478CC8,
sSpriteAnim_8478CD0,
sSpriteAnim_8478CD8
};
static const union AnimCmd sSpriteAnim_8478CF4[] =
{
ANIMCMD_FRAME(0, 20),
ANIMCMD_JUMP(0)
};
static const union AnimCmd sSpriteAnim_8478CFC[] =
{
ANIMCMD_FRAME(4, 20),
ANIMCMD_JUMP(0)
};
static const union AnimCmd sSpriteAnim_8478D04[] =
{
ANIMCMD_FRAME(8, 20),
ANIMCMD_JUMP(0)
};
static const union AnimCmd *const sSpriteAnimTable_8478D0C[] =
{
sSpriteAnim_8478CF4,
sSpriteAnim_8478CFC,
sSpriteAnim_8478D04
};
static const union AnimCmd sSpriteAnim_8478D18[] =
{
ANIMCMD_FRAME(0, 20),
ANIMCMD_JUMP(0)
};
static const union AnimCmd sSpriteAnim_8478D20[] =
{
ANIMCMD_FRAME(4, 20),
ANIMCMD_JUMP(0)
};
static const union AnimCmd sSpriteAnim_8478D28[] =
{
ANIMCMD_FRAME(8, 20),
ANIMCMD_JUMP(0)
};
static const union AnimCmd sSpriteAnim_8478D30[] =
{
ANIMCMD_FRAME(12, 20),
ANIMCMD_JUMP(0)
};
static const union AnimCmd sSpriteAnim_8478D38[] =
{
ANIMCMD_FRAME(16, 20),
ANIMCMD_JUMP(0)
};
static const union AnimCmd sSpriteAnim_8478D40[] =
{
ANIMCMD_FRAME(20, 20),
ANIMCMD_JUMP(0)
};
static const union AnimCmd sSpriteAnim_8478D48[] =
{
ANIMCMD_FRAME(24, 20),
ANIMCMD_JUMP(0)
};
static const union AnimCmd sSpriteAnim_8478D50[] =
{
ANIMCMD_FRAME(28, 20),
ANIMCMD_JUMP(0)
};
static const union AnimCmd sSpriteAnim_8478D58[] =
{
ANIMCMD_FRAME(32, 20),
ANIMCMD_JUMP(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 const union AnimCmd sSpriteAnim_8478D84[] =
{
ANIMCMD_FRAME(0, 20),
ANIMCMD_JUMP(0)
};
static 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);
}
static 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;
}
static u32 sub_8153C30(struct Sprite * sprite)
{
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;
}
static u32 sub_8153CA0(struct Sprite * sprite)
{
u8 mod = (++sprite->data[1] / 13) % 4;
if (sprite->data[1] % 13 == 0 && mod != 0)
PlaySE(SE_M_CHARM);
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.
}
}
static 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);
}
static 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_CLICK);
}
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.
static const u8 sUnused2[] = {
SE_M_CHARM,
SE_NOTE_C,
SE_NOTE_D,
SE_NOTE_E,
SE_NOTE_F,
SE_NOTE_G,
SE_NOTE_A,
SE_NOTE_B,
SE_NOTE_C_HIGH,
SE_CARD_OPEN
};
void sub_8154128(void)
{
void *ptr = AllocZeroed(0x480);
struct SpritePalette sprPal = {sDodrioBerrySpritesPal, 3};
LZ77UnCompWram(sDodrioBerrySpritesGfx, ptr);
if (ptr != NULL) // This should be one line up
{
struct SpriteSheet sprSheet = {ptr, 0x480, 2};
LoadSpriteSheet(&sprSheet);
}
LoadSpritePalette(&sprPal);
Free(ptr);
}
static 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;
}
static 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
static 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(BUGFIX)
#define sKeepPosX data[1]
#else
#define sKeepPosX data[10]
#endif // BUGFIX
static 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;
}
}
}
}
static 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) // This should be one line up
{
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
static 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);
}
static void sub_81546EC(u8 frameId)
{
LoadBgTiles(0, GetUserFrameGraphicsInfo(frameId)->tiles, 0x120, 1);
LoadPalette(GetUserFrameGraphicsInfo(frameId)->palette, 0xA0, 0x20);
}
static 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;
}
static 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);
}
static 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);
}
static void sub_81549C8(void)
{
FreeAllWindowBuffers();
}
struct WinCoords
{
u8 left;
u8 top;
};
static const u8 sTextColorTable[][3] =
{
{
TEXT_COLOR_WHITE,
TEXT_COLOR_DARK_GRAY,
TEXT_COLOR_LIGHT_GRAY
}, {
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
}
};
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}};
static const struct WinCoords * const sUnknown_8478E80[] =
{
sUnknown_8478E44,
sUnknown_8478E48,
sUnknown_8478E50,
sUnknown_8478E5C,
sUnknown_8478E6C,
};
static const u8 *const sUnknown_8478E94[] =
{
gText_1Colon,
gText_2Colon,
gText_3Colon,
gText_4Colon,
gText_5Colon,
};
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},
};
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);
}
}
static void sub_8154A08(u8 taskId)
{
if (!gUnknown_203F440->finished)
sub_8155E54()();
}
static 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;
}
}
static void sub_8154B34(void)
{
u8 i, playersCount, id, colorsId, *name;
u32 left;
struct WindowTemplate window;
const struct WinCoords * ptr;
switch (gUnknown_203F440->state)
{
case 0:
playersCount = sub_81533B4();
ptr = sUnknown_8478E80[playersCount - 1];
window.bg = 0;
window.width = 7;
window.height = 2;
window.paletteNum = 0xD;
window.baseBlock = 0x13;
for (i = 0; i < playersCount; ptr++, i++)
{
colorsId = 0;
id = sub_81537AC(i);
left = (56 - GetStringWidth(0, sub_81533C4(id), -1)) / 2u;
window.tilemapLeft = ptr->left;
window.tilemapTop = ptr->top;
gUnknown_203F440->unk3008[i] = AddWindow(&window);
ClearWindowTilemap(gUnknown_203F440->unk3008[i]);
FillWindowPixelBuffer(gUnknown_203F440->unk3008[i], PIXEL_FILL(1));
if (id == GetMultiplayerId())
colorsId = 2;
name = sub_81533C4(id);
AddTextPrinterParameterized3(gUnknown_203F440->unk3008[i], 0, left, 1, sTextColorTable[colorsId], -1, name);
CopyWindowToVram(gUnknown_203F440->unk3008[i], COPYWIN_GFX);
window.baseBlock += 0xE;
sub_8154868(&window);
}
gUnknown_203F440->state++;
break;
case 1:
if (!IsDma3ManagerBusyWithBgCopy())
{
playersCount = sub_81533B4();
for (i = 0; i < playersCount; i++)
PutWindowTilemap(gUnknown_203F440->unk3008[i]);
CopyBgTilemapBufferToVram(0);
gUnknown_203F440->state++;
}
break;
default:
if (++gUnknown_203F440->state > 180)
{
playersCount = sub_81533B4();
for (i = 0; i < playersCount; i++)
{
ClearWindowTilemap(gUnknown_203F440->unk3008[i]);
RemoveWindow(gUnknown_203F440->unk3008[i]);
}
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
CopyBgTilemapBufferToVram(0);
gUnknown_203F440->finished = TRUE;
}
break;
}
}
static void sub_8154D9C(u8 playersCount_)
{
u8 i, r8 = 0, r6 = 0;
u8 playersCount = playersCount_; // Pointless variable, I know, but it's needed to match.
u8 *name;
u32 x, numWidth;
u8 numString[32];
u8 array[5] = {0, 1, 2, 3, 4};
struct DodrioSubstruct_3308 temp, structArray[5];
for (i = 0; i < playersCount; i++)
{
array[i] = i;
sub_81536A0(&temp, i);
structArray[i] = temp;
}
if (sub_81534AC() != 0)
{
do
{
for (i = 0; i < playersCount; i++)
{
if (structArray[i].unk0 == r8)
{
array[r6] = i;
r6++;
}
}
r8 = r6;
} while (r6 < playersCount);
}
for (i = 0; i < playersCount; i++)
{
if (structArray[i].unk4 == 0)
structArray[i].unk0 = playersCount - 1;
}
x = 216 - GetStringWidth(0, gText_SpacePoints, 0);
for (i = 0; i < playersCount; i++)
{
u8 colorsId = 0;
u8 id = array[i];
u32 points = structArray[id].unk4;
AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 0, sUnknown_8478E94[structArray[id].unk0], 8, sUnknown_8478EBA[i], -1, NULL);
if (id == GetMultiplayerId())
colorsId = 2;
name = sub_81533C4(id);
AddTextPrinterParameterized3(gUnknown_203F440->unk3008[1], 0, 28, sUnknown_8478EBA[i], sTextColorTable[colorsId], -1, name);
ConvertIntToDecimalStringN(numString, points, STR_CONV_MODE_RIGHT_ALIGN, 7);
numWidth = GetStringWidth(0, numString, -1);
AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 0, numString, x - 35, sUnknown_8478EBA[i], -1, NULL);
AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 0, gText_SpacePoints, x, sUnknown_8478EBA[i], -1, NULL);
}
}
static void sub_8154F80(void)
{
u8 i, j, itemGiveRet, playersCount = sub_81533B4();
u8 *name;
u32 strWidth, x;
u8 sp0C[100];
u8 sp70[20];
switch (gUnknown_203F440->state)
{
case 0:
sub_81535B0();
gUnknown_203F440->unk301C = 0;
gUnknown_203F440->state++;
break;
case 1:
gUnknown_203F440->unk3008[0] = AddWindow(&sUnknown_8475674[0]);
gUnknown_203F440->unk3008[1] = AddWindow(&sUnknown_8475674[1]);
ClearWindowTilemap(gUnknown_203F440->unk3008[0]);
ClearWindowTilemap(gUnknown_203F440->unk3008[1]);
sub_8154868(&sUnknown_8475674[0]);
sub_8154868(&sUnknown_8475674[1]);
gUnknown_203F440->state++;
break;
case 2:
FillWindowPixelBuffer(gUnknown_203F440->unk3008[0], PIXEL_FILL(1));
FillWindowPixelBuffer(gUnknown_203F440->unk3008[1], PIXEL_FILL(1));
strWidth = GetStringWidth(0, gText_BerryPickingResults, -1);
x = (224 - strWidth) / 2;
AddTextPrinterParameterized(gUnknown_203F440->unk3008[0], 0, gText_BerryPickingResults, x, 2, -1, NULL);
AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 0, gText_10P30P50P50P, 68, 16, -1, NULL);
for (i = 0; i < playersCount; i++)
{
u8 colorsId = 0;
if (i == GetMultiplayerId())
colorsId = 2;
name = sub_81533C4(i);
AddTextPrinterParameterized3(gUnknown_203F440->unk3008[1], 0, 2, sUnknown_8478EB0[i], sTextColorTable[colorsId], -1, name);
for (j = 0; j < 4; j++)
{
u32 width;
u16 result1 = Min(sub_8153404(i, j), 9999);
u16 result2 = Min(sub_81534F0(j), 9999);
ConvertIntToDecimalStringN(sp0C, result1, STR_CONV_MODE_LEFT_ALIGN, 4);
width = GetStringWidth(0, sp0C, -1);
if (result2 == result1 && result2 != 0)
AddTextPrinterParameterized3(gUnknown_203F440->unk3008[1], 0, sUnknown_8478EA8[j] - width, sUnknown_8478EB0[i], sTextColorTable[1], -1, sp0C);
else
AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 0, sp0C, sUnknown_8478EA8[j] - width, sUnknown_8478EB0[i], -1, NULL);
}
}
CopyWindowToVram(gUnknown_203F440->unk3008[0], COPYWIN_GFX);
CopyWindowToVram(gUnknown_203F440->unk3008[1], COPYWIN_GFX);
gUnknown_203F440->state++;
break;
case 3:
if (!IsDma3ManagerBusyWithBgCopy())
{
PutWindowTilemap(gUnknown_203F440->unk3008[0]);
PutWindowTilemap(gUnknown_203F440->unk3008[1]);
}
CopyBgTilemapBufferToVram(0);
sub_8154324(FALSE);
gUnknown_203F440->state++;
break;
case 4:
if (++gUnknown_203F440->unk301C >= 30 && JOY_NEW(A_BUTTON))
{
gUnknown_203F440->unk301C = 0;
PlaySE(SE_SELECT);
sub_8154324(TRUE);
gUnknown_203F440->state++;
}
break;
case 5:
FillWindowPixelBuffer(gUnknown_203F440->unk3008[0], PIXEL_FILL(1));
FillWindowPixelBuffer(gUnknown_203F440->unk3008[1], PIXEL_FILL(1));
strWidth = GetStringWidth(0, gText_AnnouncingRankings, -1);
x = (224 - strWidth) / 2;
AddTextPrinterParameterized(gUnknown_203F440->unk3008[0], 0, gText_AnnouncingRankings, x, 2, -1, NULL);
gUnknown_203F440->state++;
break;
case 6:
sub_8154D9C(playersCount);
CopyWindowToVram(gUnknown_203F440->unk3008[0], COPYWIN_GFX);
CopyWindowToVram(gUnknown_203F440->unk3008[1], COPYWIN_GFX);
gUnknown_203F440->state++;
break;
case 7:
if (!IsDma3ManagerBusyWithBgCopy())
{
PutWindowTilemap(gUnknown_203F440->unk3008[0]);
PutWindowTilemap(gUnknown_203F440->unk3008[1]);
}
CopyBgTilemapBufferToVram(0);
gUnknown_203F440->state++;
break;
case 8:
if (++gUnknown_203F440->unk301C >= 30 && JOY_NEW(A_BUTTON))
{
gUnknown_203F440->unk301C = 0;
PlaySE(SE_SELECT);
if (sub_81534AC() < 3000)
{
gUnknown_203F440->state = 127;
}
else
{
StopMapMusic();
gUnknown_203F440->state++;
}
FillBgTilemapBufferRect_Palette0(0, 0, 0, 5, 30, 15);
RemoveWindow(gUnknown_203F440->unk3008[1]);
gUnknown_203F440->unk3008[1] = AddWindow(&sUnknown_8475684);
ClearWindowTilemap(gUnknown_203F440->unk3008[1]);
sub_8154868(&sUnknown_8475684);
}
break;
case 9:
PlayNewMapMusic(MUS_LEVEL_UP);
FillWindowPixelBuffer(gUnknown_203F440->unk3008[0], PIXEL_FILL(1));
FillWindowPixelBuffer(gUnknown_203F440->unk3008[1], PIXEL_FILL(1));
strWidth = GetStringWidth(0, gText_AnnouncingPrizes, -1);
x = (224 - strWidth) / 2;
AddTextPrinterParameterized(gUnknown_203F440->unk3008[0], 0, gText_AnnouncingPrizes, x, 2, -1, NULL);
DynamicPlaceholderTextUtil_Reset();
CopyItemName(sub_8153390(), sp70);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sp70);
DynamicPlaceholderTextUtil_ExpandPlaceholders(sp0C, gText_FirstPlacePrize);
AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 0, sp0C, 8, 2, -1, NULL);
itemGiveRet = sub_815372C();
if (itemGiveRet != 0 && itemGiveRet != 3)
{
DynamicPlaceholderTextUtil_Reset();
CopyItemName(sub_8153390(), sp70);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sp70);
if (itemGiveRet == 2)
DynamicPlaceholderTextUtil_ExpandPlaceholders(sp0C, gText_CantHoldAnyMore);
else if (itemGiveRet == 1)
DynamicPlaceholderTextUtil_ExpandPlaceholders(sp0C, gText_FilledStorageSpace);
AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 0, sp0C, 8, 40, -1, NULL);
}
CopyWindowToVram(gUnknown_203F440->unk3008[0], COPYWIN_GFX);
CopyWindowToVram(gUnknown_203F440->unk3008[1], COPYWIN_GFX);
gUnknown_203F440->state++;
break;
case 10:
if (!IsDma3ManagerBusyWithBgCopy())
{
PutWindowTilemap(gUnknown_203F440->unk3008[0]);
PutWindowTilemap(gUnknown_203F440->unk3008[1]);
}
CopyBgTilemapBufferToVram(0);
FadeOutAndFadeInNewMapMusic(MUS_VICTORY_WILD, 20, 10);
gUnknown_203F440->state++;
break;
case 11:
if (++gUnknown_203F440->unk301C >= 30 && JOY_NEW(A_BUTTON))
{
gUnknown_203F440->unk301C = 0;
PlaySE(SE_SELECT);
gUnknown_203F440->state++;
}
break;
default:
ClearWindowTilemap(gUnknown_203F440->unk3008[0]);
ClearWindowTilemap(gUnknown_203F440->unk3008[1]);
RemoveWindow(gUnknown_203F440->unk3008[0]);
RemoveWindow(gUnknown_203F440->unk3008[1]);
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
CopyBgTilemapBufferToVram(0);
gUnknown_203F440->finished = TRUE;
break;
}
}
static void sub_81556E0(void)
{
u8 y;
switch (gUnknown_203F440->state)
{
case 0:
gUnknown_203F440->unk3008[0] = AddWindow(&sUnknown_847568C[0]);
gUnknown_203F440->unk3008[1] = AddWindow(&sUnknown_847568C[1]);
ClearWindowTilemap(gUnknown_203F440->unk3008[0]);
ClearWindowTilemap(gUnknown_203F440->unk3008[1]);
sub_8154868(&sUnknown_847568C[0]);
sub_8154768(&sUnknown_847568C[1]);
gUnknown_203F440->state++;
gUnknown_203F440->unk3020 = 0;
gUnknown_203F440->unk3024 = 0;
break;
case 1:
FillWindowPixelBuffer(gUnknown_203F440->unk3008[0], PIXEL_FILL(1));
FillWindowPixelBuffer(gUnknown_203F440->unk3008[1], PIXEL_FILL(1));
AddTextPrinterParameterized(gUnknown_203F440->unk3008[0], 2, gText_WantToPlayAgain, 0, 6, -1, NULL);
AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 2, gText_Yes, 8, 2, -1, NULL);
AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 2, gText_No, 8, 16, -1, NULL);
AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 2, gText_SelectorArrow2, 0, 2, -1, NULL);
CopyWindowToVram(gUnknown_203F440->unk3008[0], COPYWIN_GFX);
CopyWindowToVram(gUnknown_203F440->unk3008[1], COPYWIN_GFX);
gUnknown_203F440->state++;
break;
case 2:
if (!IsDma3ManagerBusyWithBgCopy())
{
PutWindowTilemap(gUnknown_203F440->unk3008[0]);
PutWindowTilemap(gUnknown_203F440->unk3008[1]);
}
CopyBgTilemapBufferToVram(0);
gUnknown_203F440->state++;
break;
case 3:
y = gUnknown_203F440->unk3020;
if (y == 0)
y = 1;
FillWindowPixelBuffer(gUnknown_203F440->unk3008[1], PIXEL_FILL(1));
AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 2, gText_Yes, 8, 2, -1, NULL);
AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 2, gText_No, 8, 16, -1, NULL);
AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 2, gText_SelectorArrow2, 0, y == 1 ? 2 : 16, -1, NULL);
CopyWindowToVram(gUnknown_203F440->unk3008[1], COPYWIN_BOTH);
// Increment state only if A or B button have been pressed.
if (JOY_NEW(A_BUTTON))
{
PlaySE(SE_SELECT);
if (gUnknown_203F440->unk3020 == 0)
gUnknown_203F440->unk3020 = 1;
gUnknown_203F440->state++;
}
else if (JOY_NEW(DPAD_UP | DPAD_DOWN))
{
PlaySE(SE_SELECT);
switch (gUnknown_203F440->unk3020)
{
case 0:
gUnknown_203F440->unk3020 = 2;
break;
case 1:
gUnknown_203F440->unk3020 = 2;
break;
case 2:
gUnknown_203F440->unk3020 = 1;
break;
}
}
else if (JOY_NEW(B_BUTTON))
{
PlaySE(SE_SELECT);
gUnknown_203F440->unk3020 = 2;
gUnknown_203F440->state++;
}
break;
default:
gUnknown_203F440->unk3024 = gUnknown_203F440->unk3020;
ClearWindowTilemap(gUnknown_203F440->unk3008[0]);
ClearWindowTilemap(gUnknown_203F440->unk3008[1]);
RemoveWindow(gUnknown_203F440->unk3008[0]);
RemoveWindow(gUnknown_203F440->unk3008[1]);
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
CopyBgTilemapBufferToVram(0);
gUnknown_203F440->finished = TRUE;
break;
}
}
static void sub_8155A78(void)
{
switch (gUnknown_203F440->state)
{
case 0:
DrawDialogueFrame(0, FALSE);
AddTextPrinterParameterized2(0, 2, gText_SavingDontTurnOffThePower2, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);
gUnknown_203F440->state++;
break;
case 1:
CopyWindowToVram(0, COPYWIN_BOTH);
gUnknown_203F440->state++;
break;
case 2:
if (!IsDma3ManagerBusyWithBgCopy())
{
CreateTask(Task_LinkSave, 0);
gUnknown_203F440->state++;
}
break;
case 3:
if (!FuncIsActiveTask(Task_LinkSave))
gUnknown_203F440->state++;
break;
default:
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
CopyBgTilemapBufferToVram(0);
gUnknown_203F440->finished = TRUE;
break;
}
}
static void sub_8155B4C(void)
{
switch (gUnknown_203F440->state)
{
case 0:
gUnknown_203F440->unk3008[0] = AddWindow(&sUnknown_84756A4);
ClearWindowTilemap(gUnknown_203F440->unk3008[0]);
sub_8154868(&sUnknown_84756A4);
gUnknown_203F440->state++;
break;
case 1:
FillWindowPixelBuffer(gUnknown_203F440->unk3008[0], PIXEL_FILL(1));
AddTextPrinterParameterized(gUnknown_203F440->unk3008[0], 2, gText_CommunicationStandby3, 0, 6, -1, NULL);
CopyWindowToVram(gUnknown_203F440->unk3008[0], COPYWIN_GFX);
gUnknown_203F440->state++;
break;
case 2:
if (!IsDma3ManagerBusyWithBgCopy())
PutWindowTilemap(gUnknown_203F440->unk3008[0]);
CopyBgTilemapBufferToVram(0);
gUnknown_203F440->state++;
break;
default:
gUnknown_203F440->finished = TRUE;
break;
}
}
static void sub_8155C2C(void)
{
ClearWindowTilemap(gUnknown_203F440->unk3008[0]);
RemoveWindow(gUnknown_203F440->unk3008[0]);
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
CopyBgTilemapBufferToVram(0);
gUnknown_203F440->finished = TRUE;
}
static void sub_8155C80(void)
{
switch (gUnknown_203F440->state)
{
case 0:
gUnknown_203F440->unk3008[0] = AddWindow(&sUnknown_847569C);
ClearWindowTilemap(gUnknown_203F440->unk3008[0]);
sub_8154868(&sUnknown_847569C);
gUnknown_203F440->state++;
gUnknown_203F440->unk301C = 0;
gUnknown_203F440->unk3020 = 0;
gUnknown_203F440->unk3024 = 0;
break;
case 1:
FillWindowPixelBuffer(gUnknown_203F440->unk3008[0], PIXEL_FILL(1));
AddTextPrinterParameterized(gUnknown_203F440->unk3008[0], 2, gText_SomeoneDroppedOut, 0, 6, TEXT_SPEED_FF, NULL);
CopyWindowToVram(gUnknown_203F440->unk3008[0], COPYWIN_GFX);
gUnknown_203F440->state++;
break;
case 2:
if (!IsDma3ManagerBusyWithBgCopy())
PutWindowTilemap(gUnknown_203F440->unk3008[0]);
CopyBgTilemapBufferToVram(0);
gUnknown_203F440->state++;
break;
case 3:
if (++gUnknown_203F440->unk301C >= 120)
gUnknown_203F440->state++;
break;
default:
gUnknown_203F440->unk3024 = 5;
ClearWindowTilemap(gUnknown_203F440->unk3008[0]);
RemoveWindow(gUnknown_203F440->unk3008[0]);
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
CopyBgTilemapBufferToVram(0);
gUnknown_203F440->finished = TRUE;
break;
}
}
static void unused_0(void)
{
DestroyTask(gUnknown_203F440->unk3004);
gUnknown_203F440->finished = TRUE;
}
static void nullsub_98(void)
{
}
static void sub_8155E24(void (*func)(void))
{
gUnknown_203F440->state = 0;
gUnknown_203F440->finished = FALSE;
gUnknown_203F440->unk3028 = func;
}
void (*sub_8155E54(void))(void)
{
return gUnknown_203F440->unk3028;
}
bool32 sub_8155E68(void)
{
if (gUnknown_203F440->finished == TRUE)
return FALSE;
else
return TRUE;
}
u8 sub_8155E8C(void)
{
return gUnknown_203F440->unk3024;
}
static void sub_8155EA0(void)
{
DmaClearLarge16(3, (void *)VRAM, VRAM_SIZE, 0x1000);
DmaClear32(3,(void *)OAM, OAM_SIZE);
DmaClear16(3, (void *)PLTT, PLTT_SIZE);
SetGpuReg(REG_OFFSET_DISPCNT, 0);
ResetBgsAndClearDma3BusyFlags(FALSE);
InitBgsFromTemplates(0, sUnknown_847565C, NELEMS(sUnknown_847565C));
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);
InitStandardTextBoxWindows();
InitTextBoxGfxAndPrinters();
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
SetBgTilemapBuffer(3, gUnknown_203F440->tilemapBuffers[0]);
SetBgTilemapBuffer(1, gUnknown_203F440->tilemapBuffers[1]);
SetBgTilemapBuffer(2, gUnknown_203F440->tilemapBuffers[2]);
}
static bool32 sub_8155FE0(void)
{
switch (gUnknown_203F440->unk3018)
{
case 0:
LoadPalette(sDodrioBerryBgPal1, 0, sizeof(sDodrioBerryBgPal1));
break;
case 1:
ResetTempTileDataBuffers();
break;
case 2:
DecompressAndCopyTileDataToVram(3, sDodrioBerryBgGfx1, 0, 0, 0);
break;
case 3:
DecompressAndCopyTileDataToVram(1, sDodrioBerryBgGfx2, 0, 0, 0);
break;
case 4:
if (FreeTempTileDataBuffersIfPossible() == TRUE)
return FALSE;
break;
case 5:
LoadPalette(stdpal_get(3), 0xD0, 0x20);
break;
default:
gUnknown_203F440->unk3018 = 0;
return TRUE;
}
gUnknown_203F440->unk3018++;
return FALSE;
}