1618 lines
44 KiB
C
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;
|
|
}
|