pokeemerald/src/pokenav_unk_4.c

1284 lines
29 KiB
C
Raw Normal View History

2019-04-16 00:51:11 +02:00
#include "global.h"
#include "bg.h"
2019-04-16 18:00:13 +02:00
#include "data.h"
#include "decompress.h"
#include "dma3.h"
#include "international_string_util.h"
#include "main.h"
#include "match_call.h"
#include "menu.h"
2019-04-16 18:00:13 +02:00
#include "overworld.h"
#include "palette.h"
2019-04-16 00:51:11 +02:00
#include "pokenav.h"
2019-04-16 18:00:13 +02:00
#include "region_map.h"
#include "sound.h"
2019-04-16 18:00:13 +02:00
#include "sprite.h"
#include "string_util.h"
#include "strings.h"
#include "task.h"
#include "text.h"
#include "text_window.h"
#include "trig.h"
2019-04-16 00:51:11 +02:00
#include "window.h"
2019-04-16 18:00:13 +02:00
#include "constants/game_stat.h"
#include "constants/region_map_sections.h"
#include "constants/songs.h"
2019-04-16 18:00:13 +02:00
#include "constants/species.h"
2019-04-16 00:51:11 +02:00
struct Pokenav4Struct
{
2019-04-16 21:18:01 +02:00
bool32 (*unk0)(void);
2019-04-16 00:51:11 +02:00
u32 unk4;
2019-04-16 18:00:13 +02:00
u8 filler8[0x6];
u8 unkE;
u8 unkF;
u16 unk10;
u16 unk12;
u16 unk14;
s16 unk16;
u8 unused18;
2019-04-16 00:51:11 +02:00
u8 unk19;
2019-04-16 18:00:13 +02:00
u16 unk1A;
struct Sprite *unk1C;
struct Sprite *unk20;
u8 unk24[0x800];
u8 unk824[0x800];
u8 unk1024[0x800];
2019-04-16 18:00:13 +02:00
u8 *unk1824;
u8 unk1828[0x800];
u8 unk2028[0x20];
2019-04-16 00:51:11 +02:00
};
static bool32 sub_81CB310(void);
2019-07-19 02:46:00 +02:00
static u32 sub_81CB324(s32);
2019-04-16 18:00:13 +02:00
static void sub_81CBBB8(void);
static void sub_81CBC1C(void);
static void sub_81CC2B4(void);
static void sub_81CC034(struct Pokenav4Struct *);
static void sub_81CBD78(struct Pokenav4Struct *);
static void sub_81CBDC0(struct Pokenav4Struct *);
static void sub_81CBEF8(struct Pokenav4Struct *, int);
static void sub_81CC214(void);
static void sub_81CBC38(int);
static void sub_81CBF60(struct Pokenav4Struct *);
static bool32 sub_81CBFC4(struct Pokenav4Struct *);
static void sub_81CC344(struct Pokenav4Struct *, int);
static bool32 sub_81CC004(struct Pokenav4Struct *);
static void sub_81CBFF0(struct Pokenav4Struct *);
static void sub_81CC058(struct Pokenav4Struct *);
static bool32 sub_81CC0D0(struct Pokenav4Struct *);
static void sub_81CC0E0(struct Pokenav4Struct *);
static bool32 sub_81CC104(struct Pokenav4Struct *);
static void sub_81CC158(struct Pokenav4Struct *);
static bool32 sub_81CC194(struct Pokenav4Struct *);
static void sub_81CC09C(struct Pokenav4Struct *);
static void sub_81CC11C(struct Pokenav4Struct *);
static bool32 sub_81CC140(struct Pokenav4Struct *);
static void sub_81CC1DC(struct Pokenav4Struct *);
static bool32 sub_81CC204(struct Pokenav4Struct *);
static void sub_81CC014(struct Pokenav4Struct *);
static void sub_81CC39C(struct Pokenav4Struct *);
static bool32 sub_81CC42C(struct Pokenav4Struct *);
static void sub_81CC420(struct Pokenav4Struct *);
static void sub_81CBC64(u8 taskId);
static void sub_81CBCEC(u16 windowId, u32, u32);
static void sub_81CBDF4(u16 windowId);
static void sub_81CBE0C(u16 windowId);
static void sub_81CBE38(u16 windowId);
static void sub_81CBE50(u16 windowId);
static void sub_81CBE88(u16 windowId, const u8 *str, int top);
static void sub_81CBEB4(u16 windowId, const u8 *str, int top);
static void sub_81CC2F0(struct Pokenav4Struct *, int);
static void sub_81CC330(struct Pokenav4Struct *);
static struct Sprite *sub_81CC370(void);
static void sub_81CC440(struct Sprite *sprite);
static void sub_81CC4A4(struct Sprite *sprite);
2019-07-20 01:36:17 +02:00
void sub_81CC34C(struct Sprite *sprite);
2019-07-20 19:11:04 +02:00
u32 sub_81CB510(s32);
u32 sub_81CB588(s32);
u32 sub_81CB600(s32);
u32 sub_81CB678(s32);
u32 sub_81CB6F0(s32);
u32 sub_81CB734(s32);
u32 sub_81CB75C(s32);
u32 sub_81CB7A0(s32);
u32 sub_81CB824(s32);
u32 sub_81CB888(s32);
u32 sub_81CB93C(s32);
u32 sub_81CBAD4(s32);
u32 sub_81CB9C8(s32);
u32 sub_81CBA68(s32);
u32 sub_81CBB74(s32);
2019-04-16 00:51:11 +02:00
2019-04-16 18:00:13 +02:00
extern const struct WindowTemplate gUnknown_08622808;
extern const struct SpriteTemplate gUnknown_08622830;
extern const struct SpriteTemplate gUnknown_08622850;
2019-04-16 00:51:11 +02:00
2019-07-20 01:36:17 +02:00
const u16 gUnknown_08622510[] = INCBIN_U16("graphics/pokenav/ui_matchcall.gbapal");
const u32 gUnknown_08622530[] = INCBIN_U32("graphics/pokenav/ui_matchcall.4bpp.lz");
const u32 gUnknown_086225D4[] = INCBIN_U32("graphics/pokenav/ui_matchcall.bin.lz");
const u16 gUnknown_08622698[] = INCBIN_U16("graphics/pokenav/arrow2.gbapal");
const u32 gUnknown_086226B8[] = INCBIN_U32("graphics/pokenav/arrow2.4bpp.lz");
const u16 gUnknown_086226E0[] = INCBIN_U16("graphics/pokenav/86226E0.gbapal");
const u16 gUnknown_08622700[] = INCBIN_U16("graphics/pokenav/8622700.gbapal");
const u16 gUnknown_08622720[] = INCBIN_U16("graphics/pokenav/pokeball_matchcall.gbapal");
const u32 gUnknown_08622760[] = INCBIN_U32("graphics/pokenav/pokeball_matchcall.4bpp.lz");
const struct BgTemplate gUnknown_0862278C[3] =
{
{
.bg = 1,
.charBaseIndex = 3,
.mapBaseIndex = 0x1F,
.screenSize = 0,
.paletteMode = 0,
.priority = 1,
.baseTile = 0
},
{
.bg = 2,
.charBaseIndex = 2,
.mapBaseIndex = 0x06,
.screenSize = 0,
.paletteMode = 0,
.priority = 2,
.baseTile = 0x80
},
{
.bg = 3,
.charBaseIndex = 1,
.mapBaseIndex = 0x07,
.screenSize = 0,
.paletteMode = 0,
.priority = 3,
.baseTile = 0
}
};
const LoopedTask gUnknown_08622798[] =
{
NULL,
sub_81CB510,
sub_81CB588,
sub_81CB600,
sub_81CB678,
sub_81CB6F0,
sub_81CB734,
sub_81CB75C,
sub_81CB7A0,
sub_81CB824,
sub_81CB888,
sub_81CB93C,
sub_81CBAD4,
sub_81CB9C8,
sub_81CBA68,
sub_81CBB74
};
const struct WindowTemplate gUnknown_086227D8 =
{
.bg = 2,
.tilemapLeft = 0,
.tilemapTop = 5,
.width = 11,
.height = 2,
.paletteNum = 2,
.baseBlock = 16
};
const struct WindowTemplate gUnknown_086227E0 =
{
.bg = 2,
.tilemapLeft = 0,
.tilemapTop = 9,
.width = 11,
.height = 8,
.paletteNum = 2,
.baseBlock = 38
};
const u8 *const gUnknown_086227E8[] =
{
gUnknown_085EC017,
gUnknown_085EC01C,
gUnknown_085EC022
};
const u8 gUnknown_086227F4[] = _("·{PAUSE 0x04}·{PAUSE 0x04}·{PAUSE 0x04}·{PAUSE 0x04}·\p");
const struct WindowTemplate gUnknown_08622808 =
{
.bg = 1,
.tilemapLeft = 1,
.tilemapTop = 12,
.width = 0x1C,
.height = 0x04,
.paletteNum = 1,
.baseBlock = 10
};
const struct CompressedSpriteSheet gUnknown_08622810[1] =
{
{gUnknown_086226B8, 0x40, 7}
};
const struct SpritePalette gUnknown_08622818[] =
{
{gUnknown_08622698, 12},
{}
};
const struct OamData gUnknown_08622828 =
{
.y = 0,
.affineMode = 0,
.objMode = 0,
.bpp = 0,
2019-07-20 03:05:55 +02:00
.shape = SPRITE_SHAPE(8x16),
2019-07-20 01:36:17 +02:00
.x = 0,
2019-07-20 03:05:55 +02:00
.size = SPRITE_SIZE(8x16),
2019-07-20 01:36:17 +02:00
.tileNum = 0,
.priority = 1,
.paletteNum = 0,
};
const struct SpriteTemplate gUnknown_08622830 =
{
.tileTag = 7,
.paletteTag = 12,
.oam = &gUnknown_08622828,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_81CC34C,
};
const struct OamData gUnknown_08622848 =
{
.y = 0,
.affineMode = 0,
.objMode = 0,
.bpp = 0,
2019-07-20 03:05:55 +02:00
.shape = SPRITE_SHAPE(64x64),
2019-07-20 01:36:17 +02:00
.x = 0,
2019-07-20 03:05:55 +02:00
.size = SPRITE_SIZE(64x64),
2019-07-20 01:36:17 +02:00
.tileNum = 0,
.priority = 1,
.paletteNum = 0,
};
const struct SpriteTemplate gUnknown_08622850 =
{
.tileTag = 8,
.paletteTag = 13,
.oam = &gUnknown_08622848,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy,
};
2019-04-16 00:51:11 +02:00
bool32 sub_81CB260(void)
{
struct Pokenav4Struct *state = AllocSubstruct(6, sizeof(struct Pokenav4Struct));
if (!state)
return FALSE;
state->unk19 = 0;
state->unk4 = CreateLoopedTask(sub_81CB324, 1);
state->unk0 = sub_81CB310;
return TRUE;
}
void sub_81CB29C(int index)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
state->unk4 = CreateLoopedTask(gUnknown_08622798[index], 1);
state->unk0 = sub_81CB310;
}
u32 sub_81CB2CC(void)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
return state->unk0();
}
void sub_81CB2E0(void)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
sub_81CC2B4();
sub_81CBC1C();
RemoveWindow(state->unk12);
RemoveWindow(state->unk10);
RemoveWindow(state->unk14);
FreePokenavSubstruct(6);
}
static bool32 sub_81CB310(void)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
return IsLoopedTaskActive(state->unk4);
}
2019-07-19 02:46:00 +02:00
static u32 sub_81CB324(s32 taskState)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
{
case 0:
InitBgTemplates(gUnknown_0862278C, ARRAY_COUNT(gUnknown_0862278C));
ChangeBgX(2, 0, 0);
ChangeBgY(2, 0, 0);
decompress_and_copy_tile_data_to_vram(2, gUnknown_08622530, 0, 0, 0);
SetBgTilemapBuffer(2, state->unk1024);
CopyToBgTilemapBuffer(2, gUnknown_086225D4, 0, 0);
CopyBgTilemapBufferToVram(2);
CopyPaletteIntoBufferUnfaded(gUnknown_08622510, 0x20, 0x20);
CopyBgTilemapBufferToVram(2);
return 0;
case 1:
if (free_temp_tile_data_buffers_if_possible())
return 2;
sub_8199DF0(1, 0, 0, 1);
SetBgTilemapBuffer(1, state->unk24);
FillBgTilemapBufferRect_Palette0(1, 0x1000, 0, 0, 32, 20);
CopyPaletteIntoBufferUnfaded(gUnknown_086226E0, 0x10, 0x20);
CopyBgTilemapBufferToVram(1);
return 0;
case 2:
if (free_temp_tile_data_buffers_if_possible())
return 2;
sub_81CC034(state);
decompress_and_copy_tile_data_to_vram(3, gUnknown_08622760, 0, 0, 0);
CopyPaletteIntoBufferUnfaded(gUnknown_08622700, 0x30, 0x20);
CopyPaletteIntoBufferUnfaded(gUnknown_08622720, 0x50, 0x20);
return 0;
case 3:
if (free_temp_tile_data_buffers_if_possible() || !sub_81CAE28())
return 2;
sub_81CBBB8();
return 0;
case 4:
if (sub_81C8224())
return 2;
sub_81CBD78(state);
return 0;
case 5:
sub_81CBDC0(state);
sub_81CBEF8(state, 0);
return 0;
case 6:
ChangeBgX(1, 0, 0);
ChangeBgY(1, 0, 0);
ShowBg(2);
ShowBg(3);
ShowBg(1);
sub_81CC214();
LoadLeftHeaderGfxForIndex(3);
sub_81C7FA0(3, 1, 0);
sub_81C7AC0(1);
return 0;
case 7:
if (IsPaletteFadeActive() || sub_81C8010())
return 2;
sub_81CBC38(1);
return 4;
default:
return 4;
}
}
2019-07-19 02:46:00 +02:00
u32 sub_81CB510(s32 taskState)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
{
case 0:
switch (MatchCall_MoveCursorDown())
{
case 0:
break;
case 1:
PlaySE(SE_SELECT);
return 7;
case 2:
PlaySE(SE_SELECT);
// fall through
default:
return 0;
}
break;
case 1:
if (sub_81C8630())
return 2;
sub_81CBEF8(state, 0);
return 0;
case 2:
sub_81CBEF8(state, 0);
return 0;
case 3:
if (IsDma3ManagerBusyWithBgCopy())
return 2;
break;
}
return 4;
}
2019-07-19 02:46:00 +02:00
u32 sub_81CB588(s32 taskState)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
{
case 0:
switch (MatchCall_MoveCursorUp())
{
case 0:
break;
case 1:
PlaySE(SE_SELECT);
return 7;
case 2:
PlaySE(SE_SELECT);
// fall through
default:
return 0;
}
break;
case 1:
if (sub_81C8630())
return 2;
sub_81CBEF8(state, 0);
return 0;
case 2:
sub_81CBEF8(state, 0);
return 0;
case 3:
if (IsDma3ManagerBusyWithBgCopy())
return 2;
break;
}
return 4;
}
2019-07-19 02:46:00 +02:00
u32 sub_81CB600(s32 taskState)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
{
case 0:
switch (MatchCall_PageDown())
{
case 0:
break;
case 1:
PlaySE(SE_SELECT);
return 7;
case 2:
PlaySE(SE_SELECT);
// fall through
default:
return 0;
}
break;
case 1:
if (sub_81C8630())
return 2;
sub_81CBEF8(state, 0);
return 0;
case 2:
sub_81CBEF8(state, 0);
return 0;
case 3:
if (IsDma3ManagerBusyWithBgCopy())
return 2;
break;
}
return 4;
}
2019-07-19 02:46:00 +02:00
u32 sub_81CB678(s32 taskState)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
{
case 0:
switch (MatchCall_PageUp())
{
case 0:
break;
case 1:
PlaySE(SE_SELECT);
return 7;
case 2:
PlaySE(SE_SELECT);
// fall through
default:
return 0;
}
break;
case 1:
if (sub_81C8630())
return 2;
sub_81CBEF8(state, 0);
return 0;
case 2:
sub_81CBEF8(state, 0);
return 0;
case 3:
if (IsDma3ManagerBusyWithBgCopy())
return 2;
break;
}
return 4;
}
2019-04-16 18:00:13 +02:00
2019-07-19 02:46:00 +02:00
u32 sub_81CB6F0(s32 taskState)
2019-04-16 18:00:13 +02:00
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
{
case 0:
PlaySE(SE_SELECT);
sub_81CBF60(state);
sub_81C7BA4(7);
return 0;
case 1:
if (sub_81CBFC4(state))
return 2;
break;
}
return 4;
}
2019-07-19 02:46:00 +02:00
u32 sub_81CB734(s32 taskState)
2019-04-16 18:00:13 +02:00
{
struct Pokenav4Struct *state;
u16 var0;
PlaySE(SE_SELECT);
state = GetSubstructPtr(6);
var0 = sub_81CB01C();
sub_81CC344(state, var0);
return 4;
}
2019-07-19 02:46:00 +02:00
u32 sub_81CB75C(s32 taskState)
2019-04-16 18:00:13 +02:00
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
{
case 0:
PlaySE(SE_SELECT);
sub_81CBFF0(state);
sub_81C7BA4(6);
return 0;
case 1:
if (sub_81CC004(state))
return 2;
break;
}
return 4;
}
2019-07-19 02:46:00 +02:00
u32 sub_81CB7A0(s32 taskState)
2019-04-16 18:00:13 +02:00
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
{
case 0:
ToggleMatchCallVerticalArrows(TRUE);
sub_81CC058(state);
return 0;
case 1:
if (sub_81CC0D0(state))
return 2;
sub_81CC0E0(state);
PlaySE(SE_TOREEYE);
state->unkE = 0;
return 0;
case 2:
if (sub_81CC104(state))
return 2;
sub_81CC158(state);
return 0;
case 3:
if (sub_81CC194(state))
return 2;
break;
}
return 4;
}
2019-07-19 02:46:00 +02:00
u32 sub_81CB824(s32 taskState)
2019-04-16 18:00:13 +02:00
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
{
case 0:
PlaySE(SE_SELECT);
sub_81CC09C(state);
ToggleMatchCallVerticalArrows(TRUE);
state->unkE = 1;
return 0;
case 1:
if (sub_81CC0D0(state))
return 2;
sub_81CC11C(state);
return 0;
case 2:
if (sub_81CC140(state))
return 2;
break;
}
return 4;
}
2019-07-19 02:46:00 +02:00
u32 sub_81CB888(s32 taskState)
2019-04-16 18:00:13 +02:00
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
u32 result = 0;
switch (taskState)
{
case 0:
if (!state->unkE)
PlaySE(SE_TOREOFF);
PlaySE(SE_SELECT);
break;
case 1:
sub_81CC1DC(state);
break;
case 2:
if (sub_81CC204(state))
result = 2;
break;
case 3:
sub_81CBFF0(state);
break;
case 4:
if (sub_81CC004(state))
result = 2;
sub_81C7BA4(6);
break;
case 5:
if (IsDma3ManagerBusyWithBgCopy_())
{
result = 2;
}
else
{
if (state->unkF)
{
sub_81C8838();
result = 1;
}
else
{
ToggleMatchCallVerticalArrows(FALSE);
result = 4;
}
}
break;
case 6:
if (IsDma3ManagerBusyWithBgCopy())
{
result = 2;
}
else
{
ToggleMatchCallVerticalArrows(FALSE);
result = 4;
}
break;
}
return result;
}
2019-07-19 02:46:00 +02:00
u32 sub_81CB93C(s32 taskState)
2019-04-16 18:00:13 +02:00
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
{
case 0:
PlaySE(SE_SELECT);
sub_81C877C();
sub_81CC014(state);
return 0;
case 1:
if (sub_81C8820() || sub_81CC004(state))
return 2;
sub_81C7BA4(8);
return 0;
case 2:
sub_81C87AC(0);
sub_81CC39C(state);
return 0;
case 3:
if (sub_81C8820() || sub_81CC42C(state) || IsDma3ManagerBusyWithBgCopy_())
return 2;
break;
}
return 4;
}
2019-07-19 02:46:00 +02:00
u32 sub_81CB9C8(s32 taskState)
2019-04-16 18:00:13 +02:00
{
int index;
int var0;
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
{
case 0:
index = GetMatchCallListTopIndex();
var0 = sub_81CB0E4(index);
if (var0)
{
PlaySE(SE_SELECT);
state->unk16 = var0;
sub_81CC420(state);
return 0;
}
break;
case 1:
if (sub_81CC42C(state))
return 2;
sub_81CBEF8(state, state->unk16);
return 0;
case 2:
sub_81C87AC(state->unk16);
return 0;
case 3:
sub_81CC39C(state);
return 0;
case 4:
if (sub_81C8820() || sub_81CC42C(state))
return 2;
break;
}
return 4;
}
2019-07-19 02:46:00 +02:00
u32 sub_81CBA68(s32 taskState)
2019-04-16 18:00:13 +02:00
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
{
case 0:
PlaySE(SE_SELECT);
sub_81CC420(state);
sub_81C87F0();
return 0;
case 1:
if (sub_81C8820() || sub_81CC42C(state))
return 2;
sub_81C7BA4(6);
sub_81CBDC0(state);
return 0;
case 2:
if (IsDma3ManagerBusyWithBgCopy())
return 2;
break;
}
return 4;
}
2019-07-19 02:46:00 +02:00
u32 sub_81CBAD4(s32 taskState)
2019-04-16 18:00:13 +02:00
{
int index;
int var0;
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
{
case 0:
index = GetMatchCallListTopIndex();
var0 = sub_81CB128(index);
if (var0)
{
PlaySE(SE_SELECT);
state->unk16 = var0;
sub_81CC420(state);
return 0;
}
break;
case 1:
if (sub_81CC42C(state))
return 2;
sub_81CBEF8(state, state->unk16);
return 0;
case 2:
sub_81C87AC(state->unk16);
return 0;
case 3:
sub_81CC39C(state);
return 0;
case 4:
if (sub_81C8820() || sub_81CC42C(state))
return 2;
break;
}
return 4;
}
2019-07-19 02:46:00 +02:00
u32 sub_81CBB74(s32 taskState)
2019-04-16 18:00:13 +02:00
{
switch (taskState)
{
case 0:
PlaySE(SE_SELECT);
sub_81CBC38(0);
sub_81C7AC0(0);
sub_81C78A0();
return 0;
case 1:
if (IsPaletteFadeActive() || MainMenuLoopedTaskIsBusy())
return 2;
sub_81C7FDC();
break;
}
return 4;
}
static void sub_81CBBB8(void)
{
struct MatchCallListTemplate template;
2019-08-05 19:47:04 +02:00
template.unk0 = sub_81CAE94();
2019-04-16 18:00:13 +02:00
template.unk4 = sub_81CAE38();
template.unk8 = 4;
template.unk6 = 0;
template.unk9 = 13;
template.unkA = 16;
template.unkB = 1;
template.unkC = 8;
template.unkD = 3;
template.unkE = 7;
template.unk10 = sub_81CB050;
template.unk14 = sub_81CBCEC;
2019-07-20 01:36:17 +02:00
sub_81C81D4(&gUnknown_0862278C[2], &template, 2);
2019-04-16 18:00:13 +02:00
CreateTask(sub_81CBC64, 7);
}
static void sub_81CBC1C(void)
{
sub_81C8234();
DestroyTask(FindTaskIdByFunc(sub_81CBC64));
}
static void sub_81CBC38(int arg0)
{
u8 taskId = FindTaskIdByFunc(sub_81CBC64);
if (taskId != 0xFF)
gTasks[taskId].data[15] = arg0;
}
static void sub_81CBC64(u8 taskId)
{
s16 *taskData = gTasks[taskId].data;
if (taskData[15])
{
taskData[0] += 4;
taskData[0] &= 0x7F;
taskData[1] = gSineTable[taskData[0]] >> 4;
sub_81C79BC(gUnknown_08622720, gUnknown_08622720 + 0x10, 0x10, 0x10, taskData[1], gPlttBufferUnfaded + 0x50);
if (!gPaletteFade.active)
CpuCopy32(gPlttBufferUnfaded + 0x50, gPlttBufferFaded + 0x50, 0x20);
}
}
static void sub_81CBCEC(u16 windowId, u32 arg1, u32 arg2)
{
u8 bg = GetWindowAttribute(windowId, WINDOW_BG);
u16 *tilemap = GetBgTilemapBuffer(bg);
tilemap += arg2 * 0x40 + 0x1D;
if (sub_81CAEBC(arg1))
{
tilemap[0] = 0x5000;
tilemap[0x20] = 0x5001;
}
else
{
tilemap[0] = 0x5002;
tilemap[0x20] = 0x5002;
}
}
void sub_81CBD48(u16 windowId, u32 arg0)
{
u8 bg = GetWindowAttribute(windowId, WINDOW_BG);
u16 *tilemap = GetBgTilemapBuffer(bg);
tilemap += arg0 * 0x40 + 0x1D;
tilemap[0] = 0x5002;
tilemap[0x20] = 0x5002;
}
static void sub_81CBD78(struct Pokenav4Struct *state)
{
state->unk10 = AddWindow(&gUnknown_086227D8);
state->unk12 = AddWindow(&gUnknown_086227E0);
FillWindowPixelBuffer(state->unk10, PIXEL_FILL(1));
PutWindowTilemap(state->unk10);
FillWindowPixelBuffer(state->unk12, PIXEL_FILL(1));
PutWindowTilemap(state->unk12);
CopyWindowToVram(state->unk10, 1);
}
static void sub_81CBDC0(struct Pokenav4Struct *state)
{
FillWindowPixelBuffer(state->unk12, PIXEL_FILL(1));
sub_81CBDF4(state->unk12);
sub_81CBE0C(state->unk12);
sub_81CBE38(state->unk12);
sub_81CBE50(state->unk12);
CopyWindowToVram(state->unk12, 2);
}
static void sub_81CBDF4(u16 windowId)
{
sub_81CBE88(windowId, gText_NumberRegistered, 0);
}
static void sub_81CBE0C(u16 windowId)
{
u8 str[3];
ConvertIntToDecimalStringN(str, sub_81CAE38(), STR_CONV_MODE_LEFT_ALIGN, 3);
sub_81CBEB4(windowId, str, 1);
}
static void sub_81CBE38(u16 windowId)
{
sub_81CBE88(windowId, gText_NumberOfBattles, 2);
}
static void sub_81CBE50(u16 windowId)
{
u8 str[5];
int numTrainerBattles = GetGameStat(GAME_STAT_TRAINER_BATTLES);
if (numTrainerBattles > 99999)
numTrainerBattles = 99999;
ConvertIntToDecimalStringN(str, numTrainerBattles, STR_CONV_MODE_LEFT_ALIGN, 5);
sub_81CBEB4(windowId, str, 3);
}
static void sub_81CBE88(u16 windowId, const u8 *str, int top)
{
int y = top * 16 + 1;
AddTextPrinterParameterized(windowId, 7, str, 2, y, TEXT_SPEED_FF, NULL);
}
static void sub_81CBEB4(u16 windowId, const u8 *str, int top)
{
int x = GetStringRightAlignXOffset(7, str, 86);
int y = top * 16 + 1;
AddTextPrinterParameterized(windowId, 7, str, x, y, TEXT_SPEED_FF, NULL);
}
static void sub_81CBEF8(struct Pokenav4Struct *state, int arg1)
{
u8 mapName[32];
int x;
int index = GetSelectedMatchCall() + arg1;
int regionMapSection = sub_81CAEA4(index);
if (regionMapSection != MAPSEC_NONE)
GetMapName(mapName, regionMapSection, 0);
else
StringCopy(mapName, gText_Unknown);
x = GetStringCenterAlignXOffset(7, mapName, 88);
FillWindowPixelBuffer(state->unk10, PIXEL_FILL(1));
AddTextPrinterParameterized(state->unk10, 7, mapName, x, 1, 0, NULL);
}
static void sub_81CBF60(struct Pokenav4Struct *state)
{
u32 i;
FillWindowPixelBuffer(state->unk12, PIXEL_FILL(1));
for (i = 0; i < 3; i++)
{
int messageId = sub_81CB02C(i);
if (messageId == 3)
break;
AddTextPrinterParameterized(state->unk12, 7, gUnknown_086227E8[messageId], 16, i * 16 + 1, TEXT_SPEED_FF, NULL);
}
CopyWindowToVram(state->unk12, 2);
}
static bool32 sub_81CBFC4(struct Pokenav4Struct *state)
{
if (!IsDma3ManagerBusyWithBgCopy())
{
sub_81CC2F0(state, sub_81CB01C());
return FALSE;
}
return TRUE;
}
static void sub_81CBFF0(struct Pokenav4Struct *state)
{
sub_81CC330(state);
sub_81CBDC0(state);
}
static bool32 sub_81CC004(struct Pokenav4Struct *state)
{
return IsDma3ManagerBusyWithBgCopy();
}
static void sub_81CC014(struct Pokenav4Struct *state)
{
sub_81CC330(state);
FillWindowPixelBuffer(state->unk12, PIXEL_FILL(1));
CopyWindowToVram(state->unk12, 2);
}
static void sub_81CC034(struct Pokenav4Struct *state)
{
state->unk14 = AddWindow(&gUnknown_08622808);
sub_8197184(state->unk14, 1, 4);
sub_81C7B40();
}
static void sub_81CC058(struct Pokenav4Struct *state)
{
struct Sprite *sprite;
sub_8197184(state->unk14, 1, 4);
sub_81971C4(state->unk14, 1, 4);
FillWindowPixelBuffer(state->unk14, PIXEL_FILL(1));
PutWindowTilemap(state->unk14);
CopyWindowToVram(state->unk14, 3);
sprite = PauseSpinningPokenavSprite();
sprite->pos1.x = 24;
sprite->pos1.y = 112;
sprite->pos2.y = 0;
}
static void sub_81CC09C(struct Pokenav4Struct *state)
{
LoadUserWindowBorderGfx(state->unk14, 1, 0x40);
DrawTextBorderOuter(state->unk14, 1, 4);
FillWindowPixelBuffer(state->unk14, PIXEL_FILL(1));
PutWindowTilemap(state->unk14);
CopyWindowToVram(state->unk14, 3);
}
static bool32 sub_81CC0D0(struct Pokenav4Struct *state)
{
return IsDma3ManagerBusyWithBgCopy();
}
static void sub_81CC0E0(struct Pokenav4Struct *state)
{
AddTextPrinterParameterized(state->unk14, 1, gUnknown_086227F4, 32, 1, 1, NULL);
}
static bool32 sub_81CC104(struct Pokenav4Struct *state)
{
RunTextPrinters();
return IsTextPrinterActive(state->unk14);
}
static void sub_81CC11C(struct Pokenav4Struct *state)
{
AddTextPrinterParameterized(state->unk14, 1, gText_TrainerCloseBy, 0, 1, 1, NULL);
}
static bool32 sub_81CC140(struct Pokenav4Struct *state)
{
RunTextPrinters();
return IsTextPrinterActive(state->unk14);
}
static void sub_81CC158(struct Pokenav4Struct *state)
{
int index = GetSelectedMatchCall();
const u8 *str = sub_81CAF78(index, &state->unkF);
u8 speed = GetPlayerTextSpeedDelay();
AddTextPrinterParameterized(state->unk14, 1, str, 32, 1, speed, NULL);
}
static bool32 sub_81CC194(struct Pokenav4Struct *state)
{
if (gMain.heldKeys & A_BUTTON)
gTextFlags.canABSpeedUpPrint = 1;
else
gTextFlags.canABSpeedUpPrint = 0;
RunTextPrinters();
return IsTextPrinterActive(state->unk14);
}
static void sub_81CC1DC(struct Pokenav4Struct *state)
{
ResumeSpinningPokenavSprite();
FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 20);
CopyBgTilemapBufferToVram(1);
}
static bool32 sub_81CC204(struct Pokenav4Struct *state)
{
return IsDma3ManagerBusyWithBgCopy();
}
static void sub_81CC214(void)
{
int i;
u8 paletteNum;
struct SpriteSheet spriteSheet;
struct Pokenav4Struct *state = GetSubstructPtr(6);
for (i = 0; i < ARRAY_COUNT(gUnknown_08622810); i++)
LoadCompressedSpriteSheet(&gUnknown_08622810[i]);
Pokenav_AllocAndLoadPalettes(gUnknown_08622818);
state->unk1C = NULL;
spriteSheet.data = state->unk1828;
spriteSheet.size = 0x800;
spriteSheet.tag = 8;
state->unk1824 = (u8 *)OBJ_VRAM0 + LoadSpriteSheet(&spriteSheet) * 0x20;
paletteNum = AllocSpritePalette(13);
state->unk1A = 0x100 + paletteNum * 0x10;
state->unk20 = sub_81CC370();
state->unk20->invisible = 1;
}
static void sub_81CC2B4(void)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
if (state->unk1C)
DestroySprite(state->unk1C);
if (state->unk20)
DestroySprite(state->unk20);
FreeSpriteTilesByTag(8);
FreeSpriteTilesByTag(7);
FreeSpritePaletteByTag(12);
FreeSpritePaletteByTag(13);
}
static void sub_81CC2F0(struct Pokenav4Struct *state, int top)
{
if (!state->unk1C)
{
u8 spriteId = CreateSprite(&gUnknown_08622830, 4, 80, 5);
state->unk1C = &gSprites[spriteId];
sub_81CC344(state, top);
}
}
static void sub_81CC330(struct Pokenav4Struct *state)
{
DestroySprite(state->unk1C);
state->unk1C = NULL;
}
static void sub_81CC344(struct Pokenav4Struct *state, int top)
{
state->unk1C->pos2.y = top * 16;
}
void sub_81CC34C(struct Sprite *sprite)
{
if (++sprite->data[0] > 3)
{
sprite->data[0] = 0;
sprite->pos2.x = (sprite->pos2.x + 1) & 0x7;
}
}
static struct Sprite *sub_81CC370(void)
{
u8 spriteId = CreateSprite(&gUnknown_08622850, 44, 104, 6);
return &gSprites[spriteId];
}
static void sub_81CC39C(struct Pokenav4Struct *state)
{
u16 cursor;
int trainerId = sub_81CAF04(GetSelectedMatchCall());
if (trainerId >= 0)
{
DecompressPicFromTable(&gTrainerFrontPicTable[trainerId], state->unk1828, SPECIES_NONE);
LZ77UnCompWram(gTrainerFrontPicPaletteTable[trainerId].data, state->unk2028);
cursor = RequestDma3Copy(state->unk1828, state->unk1824, 0x800, 1);
LoadPalette(state->unk2028, state->unk1A, 0x20);
state->unk20->data[0] = 0;
state->unk20->data[7] = cursor;
state->unk20->callback = sub_81CC440;
}
}
static void sub_81CC420(struct Pokenav4Struct *state)
{
state->unk20->callback = sub_81CC4A4;
}
static bool32 sub_81CC42C(struct Pokenav4Struct *state)
{
return state->unk20->callback != SpriteCallbackDummy;
}
static void sub_81CC440(struct Sprite *sprite)
{
switch (sprite->data[0])
{
case 0:
if (CheckForSpaceForDma3Request(sprite->data[7]) != -1)
{
sprite->pos2.x = -80;
sprite->invisible = 0;
sprite->data[0]++;
}
break;
case 1:
sprite->pos2.x += 8;
if (sprite->pos2.x >= 0)
{
sprite->pos2.x = 0;
sprite->callback = SpriteCallbackDummy;
}
break;
}
}
static void sub_81CC4A4(struct Sprite *sprite)
{
sprite->pos2.x -= 8;
if (sprite->pos2.x <= -80)
{
sprite->invisible = 1;
sprite->callback = SpriteCallbackDummy;
}
}