diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_2.c | 2182 | ||||
-rw-r--r-- | src/credits.c | 1175 | ||||
-rw-r--r-- | src/daycare.c | 367 | ||||
-rw-r--r-- | src/easy_chat.c | 233 | ||||
-rw-r--r-- | src/intro.c | 1 | ||||
-rw-r--r-- | src/item.c | 19 | ||||
-rw-r--r-- | src/mori_debug_menu.c | 4 | ||||
-rw-r--r-- | src/record_mixing.c | 190 | ||||
-rw-r--r-- | src/rom3.c | 48 | ||||
-rw-r--r-- | src/rom_8077ABC.c | 1 | ||||
-rw-r--r-- | src/secret_base.c | 1056 | ||||
-rw-r--r-- | src/tv.c | 2773 |
12 files changed, 6652 insertions, 1397 deletions
diff --git a/src/battle_2.c b/src/battle_2.c index a9f0fd57a..f2ce737d6 100644 --- a/src/battle_2.c +++ b/src/battle_2.c @@ -1,4 +1,5 @@ #include "global.h" +#include "asm.h" #include "battle.h" #include "main.h" #include "text.h" @@ -10,6 +11,16 @@ #include "link.h" #include "name_string_util.h" #include "battle_setup.h" +#include "rng.h" +#include "sound.h" +#include "songs.h" +#include "trig.h" +#include "abilities.h" + +struct MonCoords +{ + u8 x, y; +}; struct UnknownStruct5 { @@ -55,35 +66,198 @@ struct UnknownPokemonStruct2 /*0x1D*/ u8 language; }; +struct UnknownStruct9 +{ + u8 unk0; + u16 unk2; +}; + +struct UnknownStruct10 +{ + u8 unk0_0:1; + u8 unk0_1:1; + u8 unk0_2:1; + u8 filler1[1]; + u8 unk2; + u8 unk3; + u8 filler4[8]; +}; + +struct UnknownStruct11 +{ + u8 unk0; + u8 unk1; + u8 unk2; + u8 unk3; + u8 unk4; + u8 unk5_0:1; + u8 unk5_1:1; + u16 unk6; + u8 unk8[10]; + u8 unk12; + u8 unk13; + u8 unk14[10]; + u8 filler1E[2]; + u16 unk20; + u16 unk22; + u16 unk24; + u16 unk26; + u16 unk28; + u8 unk2A[10]; + u8 filler34[2]; + u8 unk36[10]; +}; + +struct UnknownStruct12 +{ + u32 unk0; + u8 filler4[0x54]; +}; + +struct UnknownStruct13 +{ + u32 unk0_0:1; + u32 unk0_1:1; + u32 unk0_2:1; + u32 unk0_3:1; + u32 unk0_4:1; + u32 unk0_5:1; + u32 unk0_6:1; + u32 unk0_7:1; + u32 unk1_0:1; + u32 unk1_1:1; + u32 unk1_2:1; + u32 unk1_3:2; + u32 unk1_5:1; + u32 unk1_6:1; + u32 unk1_7:1; + u32 unk2_0:1; + u32 unk2_1:1; + u32 unk2_2:1; + u32 unk2_3:1; + u8 filler4[12]; +}; + extern const struct UnknownStruct5 gUnknown_081F9674; extern const u8 gUnknown_081F96C8[]; +extern void *const gUnknown_081FAF4C[]; +extern const u16 gUnknown_08D004E0[]; extern const struct Trainer gTrainers[]; extern const u8 gSpeciesNames[][11]; extern const struct BattleMove gBattleMoves[]; +extern const struct MonCoords gMonFrontPicCoords[]; +extern const struct MonCoords gCastformFrontSpriteCoords[]; +extern const struct BaseStats gBaseStats[]; +extern const u32 gBitTable[]; extern u8 ewram[]; #define ewram0 (*(struct UnknownStruct7 *)(ewram + 0x0)) #define ewram4 (*(struct UnknownStruct8 *)(ewram + 0x4)) +#define ewram16000 (ewram[0x16000]) +#define ewram16001 (ewram[0x16001]) +#define ewram16002 (ewram[0x16002]) +#define ewram16003 (ewram[0x16003]) +#define ewram1600C (ewram[0x1600C]) +#define ewram1600E (ewram[0x1600E]) +#define ewram1601B (ewram[0x1601B]) +#define ewram16020 ((u8 *)(ewram + 0x16020)) +#define ewram16056 (ewram[0x16056]) +#define ewram16058 (ewram[0x16058]) +#define ewram16059 (ewram[0x16059]) +#define ewram16078 (ewram[0x16078]) +#define ewram16084 (ewram[0x16084]) +#define ewram16086 (ewram[0x16086]) +#define ewram16087 (ewram[0x16087]) +#define ewram16088 (ewram[0x16088]) +#define ewram16089 (ewram[0x16089]) +#define ewram160A1 (ewram[0x160A1]) +#define ewram160A6 (ewram[0x160A6]) +#define ewram160AC ((u8 *)(ewram + 0x160AC)) +#define ewram160BC ((u16 *)(ewram + 0x160BC)) // hp +#define ewram160C8 (ewram[0x160C8]) +#define ewram160C9 (ewram[0x160C9]) #define ewram160CB (ewram[0x160CB]) +#define ewram160CC ((u8 *)(ewram + 0x160CC)) +#define ewram160E6 (ewram[0x160E6]) +#define ewram160E8 ((u8 *)(ewram + 0x160E8)) +#define ewram160F0 ((u8 *)(ewram + 0x160F0)) +#define ewram160F9 (ewram[0x160F9]) +#define ewram16100 ((u8 *)(ewram + 0x16100)) +#define ewram16108 ((u8 *)(ewram + 0x16108)) +#define ewram16110 (ewram[0x16110]) +#define ewram16111 (ewram[0x16111]) +#define ewram16113 (ewram[0x16113]) +#define ewram17100 ((u32 *)(ewram + 0x17100)) +#define ewram17130 (ewram[0x17130]) +#define ewram17160 (ewram[0x17160]) +#define ewram17800 ((struct UnknownStruct9 *)(ewram + 0x17800)) +#define ewram17810 ((struct UnknownStruct10 *)(ewram + 0x17810)) #define ewram1D000 ((struct Pokemon *)(ewram + 0x1D000)) extern struct UnknownPokemonStruct2 gUnknown_02023A00[]; +extern u8 gUnknown_02024260[][0x200]; +extern u8 gUnknown_02024A60; +extern u32 gUnknown_02024A64; +extern u8 gUnknown_02024A68; +extern u16 gUnknown_02024A6A[]; +extern u8 gUnknown_02024A7F; +extern u8 gUnknown_02024A7A[]; +extern struct UnknownStruct12 gUnknown_02024AD0[]; +extern u8 gUnknown_02024BE0[]; +extern u16 gUnknown_02024BE6; +extern u8 byte_2024C06; +extern u8 gUnknown_02024C0B; +extern u8 gUnknown_02024C0C; +extern u8 gUnknown_02024C0E; +extern u8 gUnknown_02024C18[]; +extern u16 gUnknown_02024C2C[]; +extern u16 gUnknown_02024C34[]; +extern u16 gUnknown_02024C3C[]; +extern u16 gUnknown_02024C44[]; +extern u16 gUnknown_02024C4C[]; +extern u16 gUnknown_02024C54[]; +extern u8 gUnknown_02024C5C[]; +extern u16 gUnknown_02024C60[]; +extern u32 gUnknown_02024C6C; +extern u8 gUnknown_02024C70[]; +extern u16 gUnknown_02024C7A[]; +extern u8 gUnknown_02024C80[][12]; +extern u32 gUnknown_02024C98[]; +//extern u8 gUnknown_02024CA8[][0x1C]; +extern u16 gUnknown_02024D18; +extern u16 gUnknown_02024D1A; +extern u16 gUnknown_02024D1C; extern u8 gUnknown_02024D1E[]; extern u8 gUnknown_02024D1F[]; // I don't actually know what type this is. +extern u8 gUnknown_02024D26; +extern struct UnknownStruct13 gUnknown_02024D28[]; +extern u8 gUnknown_02024DBC[]; +extern u16 gUnknown_02024DE8; +extern u8 gUnknown_02024E60[]; +extern u8 gUnknown_02024E64[]; +extern u8 gUnknown_02038470[]; extern u16 gUnknown_030041B0; extern u16 gUnknown_030041B4; extern u16 gUnknown_030041B8; extern struct Window gUnknown_030041D0; +extern u16 gUnknown_03004200; extern struct Window gUnknown_03004210; +extern u16 gUnknown_03004244; extern struct Window gUnknown_03004250; extern u16 gUnknown_03004240; extern u16 gUnknown_03004280; +extern u32 gUnknown_03004284; extern u16 gUnknown_03004288; extern u16 gUnknown_030042A0; extern u16 gUnknown_030042A4; extern u16 gUnknown_030042C0; extern u16 gUnknown_030042C4; extern MainCallback gUnknown_030042D0; +extern void (*gUnknown_030042D4)(void); +extern struct UnknownStruct11 gUnknown_030042E0; +extern u8 gUnknown_03004324; +extern void (*gUnknown_03004330[])(void); +extern u8 gUnknown_03004340[]; extern struct UnknownStruct6 gUnknown_03004DE0; //extern u16 gUnknown_03004DE0[][0xA0]; // possibly? extern u16 gBattleTypeFlags; @@ -92,6 +266,13 @@ extern u8 gReservedSpritePaletteCount; extern u16 gTrainerBattleOpponent; extern struct BattleEnigmaBerry gEnigmaBerries[]; extern u16 gBlockRecvBuffer[MAX_LINK_PLAYERS][BLOCK_BUFFER_SIZE / 2]; +extern u8 gBattleMonForms[]; +extern u8 gPlayerMonIndex; +extern u8 gEnemyMonIndex; +extern u16 gBattleWeather; +extern u32 gBattleMoveDamage; +extern struct BattlePokemon gBattleMons[]; +extern u8 gBattleMoveFlags; extern void sub_800B858(void); extern void dp12_8087EA4(void); @@ -106,6 +287,29 @@ extern void sub_800DE30(u8); extern void sub_800B950(void); extern u8 battle_load_something(); extern void OpenPartyMenu(); +extern void sub_8089668(); +extern void sub_800D74C(); +extern void sub_804777C(u8); +extern void sub_8043DFC(); +extern u8 CreateInvisibleSpriteWithCallback(void (*)(struct Sprite *)); +extern void dp01_build_cmdbuf_x00_a_b_0(u8 a, u8 b, u8 c); +extern void dp01_build_cmdbuf_x04_4_4_4(u8 a); +extern void dp01_build_cmdbuf_x07_7_7_7(u8 a); +extern void dp01_build_cmdbuf_x12_a_bb(u8 a, u8 b, u16 c); +extern void dp01_build_cmdbuf_x2E_a(u8 a, u8 b); +extern void dp01_build_cmdbuf_x2F_2F_2F_2F(u8 a); +extern void dp01_build_cmdbuf_x30_TODO(u8 a, u8 *b, u8 c); +extern void dp01_battle_side_mark_buffer_for_execution(); +extern u8 sub_8090D90(); +extern void sub_800C704(u8, u8, u8); +extern u8 sub_8018324(); +extern u8 sub_801A02C(); +extern u8 sub_8015DFC(); +extern u8 sub_8016558(); +extern u8 sub_80173A4(); +extern u8 sub_80170DC(); +extern u8 ItemId_GetHoldEffect(u16); +extern void sub_8094C98(); void sub_800E7F8(void); void sub_800EC9C(void); @@ -116,6 +320,40 @@ void sub_800F838(struct Sprite *); u8 CreateNPCTrainerParty(struct Pokemon *, u16); void sub_800FCFC(void); void sub_8010824(void); +void sub_80101B8(void); +void c2_081284E0(void); +void sub_8010278(struct Sprite *); +void sub_80102AC(struct Sprite *); +void nullsub_37(struct Sprite *); +void sub_8010320(struct Sprite *); +void sub_8010494(struct Sprite *); +void sub_801053C(struct Sprite *); +void oac_poke_ally_(struct Sprite *); +void nullsub_86(struct Sprite *); +void objc_dp11b_pingpong(struct Sprite *); +void sub_8010874(void); +void bc_8012FAC(void); +void bc_load_battlefield(void); +void sub_8011384(void); +void bc_801333C(void); +void bc_battle_begin_message(void); +void bc_8013568(void); +void sub_8011800(void); +void sub_8011834(void); +void bc_801362C(void); +void sub_8011970(void); +void sub_80119B4(void); +void sub_8011B00(void); +void sub_8011E8C(void); +void sub_8012324(void); +void sub_8012FBC(u8, u8); +u8 b_first_side(); +void sub_801365C(u8); +void sub_801377C(void); +void sub_80138F0(void); +void b_cancel_multi_turn_move_maybe(u8); +void b_std_message(); +void sub_80156DC(); void sub_800E7C4(void) { @@ -565,25 +803,42 @@ void sub_800F298(void) BuildOamBuffer(); switch (gUnknown_02024D1E[0]) { - case 0: - if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC()) + case 0: + if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC()) + { + ewram0.unk0 = 1; + ewram0.unk1 = 1; + sub_800E9EC(); + sub_800EAAC(); + SendBlock(bitmask_all_link_players_but_self(), ewram, 0x20); + gUnknown_02024D1E[0]++; + } + break; + case 1: + if ((GetBlockReceivedStatus() & 0xF) == 0xF) + { + u8 taskId; + + ResetBlockReceivedFlags(); + id = 0; + if (gBlockRecvBuffer[0][0] == 0x100) { - ewram0.unk0 = 1; - ewram0.unk1 = 1; - sub_800E9EC(); - sub_800EAAC(); - SendBlock(bitmask_all_link_players_but_self(), ewram, 0x20); - gUnknown_02024D1E[0]++; + if (playerId == 0) + gBattleTypeFlags |= 12; + else + gBattleTypeFlags |= 8; + id++; } - break; - case 1: - if ((GetBlockReceivedStatus() & 0xF) == 0xF) + if (id == 0) { - u8 taskId; + s32 i; - ResetBlockReceivedFlags(); - id = 0; - if (gBlockRecvBuffer[0][0] == 0x100) + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + if (gBlockRecvBuffer[0][0] != gBlockRecvBuffer[i][0]) + break; + } + if (i == MAX_LINK_PLAYERS) { if (playerId == 0) gBattleTypeFlags |= 12; @@ -593,231 +848,214 @@ void sub_800F298(void) } if (id == 0) { - s32 i; - - for (i = 0; i < MAX_LINK_PLAYERS; i++) + while (id < MAX_LINK_PLAYERS) { - if (gBlockRecvBuffer[0][0] != gBlockRecvBuffer[i][0]) + if (gBlockRecvBuffer[id][0] == 0x0101 && id != playerId) + if (id < playerId) + break; + if (gBlockRecvBuffer[id][0] > 0x0101 && id != playerId) break; - } - if (i == MAX_LINK_PLAYERS) - { - if (playerId == 0) - gBattleTypeFlags |= 12; - else - gBattleTypeFlags |= 8; id++; } - if (id == 0) - { - while (id < MAX_LINK_PLAYERS) - { - if (gBlockRecvBuffer[id][0] == 0x0101 && id != playerId) - if (id < playerId) - break; - if (gBlockRecvBuffer[id][0] > 0x0101 && id != playerId) - break; - id++; - } - if (id == MAX_LINK_PLAYERS) - gBattleTypeFlags |= 12; - else - gBattleTypeFlags |= 8; - } + if (id == MAX_LINK_PLAYERS) + gBattleTypeFlags |= 12; + else + gBattleTypeFlags |= 8; + } + } + sub_800EB08(); + memcpy(ewram1D000, gPlayerParty, sizeof(struct Pokemon) * 3); + taskId = CreateTask(sub_800DE30, 0); + gTasks[taskId].data[1] = 0x10E; + gTasks[taskId].data[2] = 0x5A; + gTasks[taskId].data[5] = 0; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[4] = 0; + for (id = 0; id < MAX_LINK_PLAYERS; id++) + { + switch (gLinkPlayers[id].lp_field_18) + { + case 0: + gTasks[taskId].data[3] |= gBlockRecvBuffer[id][1] & 0x3F; + break; + case 1: + gTasks[taskId].data[4] |= gBlockRecvBuffer[id][1] & 0x3F; + break; + case 2: + gTasks[taskId].data[3] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6; + break; + case 3: + gTasks[taskId].data[4] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6; + break; } - sub_800EB08(); - memcpy(ewram1D000, gPlayerParty, sizeof(struct Pokemon) * 3); - taskId = CreateTask(sub_800DE30, 0); - gTasks[taskId].data[1] = 0x10E; - gTasks[taskId].data[2] = 0x5A; - gTasks[taskId].data[5] = 0; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[4] = 0; - for (id = 0; id < MAX_LINK_PLAYERS; id++) + } + ZeroPlayerPartyMons(); + ZeroEnemyPartyMons(); + gUnknown_02024D1E[0]++; + goto step_2; + } + break; + case 2: + step_2: + if (sub_8007ECC()) + { + SendBlock(bitmask_all_link_players_but_self(), ewram1D000, sizeof(struct Pokemon) * 2); + gUnknown_02024D1E[0]++; + } + break; + case 3: + if ((GetBlockReceivedStatus() & 0xF) == 0xF) + { + ResetBlockReceivedFlags(); + for (id = 0; id < MAX_LINK_PLAYERS; id++) + { + if (id == playerId) { switch (gLinkPlayers[id].lp_field_18) { - case 0: - gTasks[taskId].data[3] |= gBlockRecvBuffer[id][1] & 0x3F; - break; - case 1: - gTasks[taskId].data[4] |= gBlockRecvBuffer[id][1] & 0x3F; - break; - case 2: - gTasks[taskId].data[3] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6; - break; - case 3: - gTasks[taskId].data[4] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6; - break; + case 0: + case 3: + memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); + break; + case 1: + case 2: + memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); + break; } } - ZeroPlayerPartyMons(); - ZeroEnemyPartyMons(); - gUnknown_02024D1E[0]++; - goto step_2; - } - break; - case 2: - step_2: - if (sub_8007ECC()) - { - SendBlock(bitmask_all_link_players_but_self(), ewram1D000, sizeof(struct Pokemon) * 2); - gUnknown_02024D1E[0]++; - } - break; - case 3: - if ((GetBlockReceivedStatus() & 0xF) == 0xF) - { - ResetBlockReceivedFlags(); - for (id = 0; id < MAX_LINK_PLAYERS; id++) + else { - if (id == playerId) + if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1)) + || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1))) { switch (gLinkPlayers[id].lp_field_18) { - case 0: - case 3: - memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); - break; - case 1: - case 2: - memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); - break; + case 0: + case 3: + memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); + break; + case 1: + case 2: + memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); + break; } } else { - if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1)) - || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1))) - { - switch (gLinkPlayers[id].lp_field_18) - { - case 0: - case 3: - memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); - break; - case 1: - case 2: - memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); - break; - } - } - else + switch (gLinkPlayers[id].lp_field_18) { - switch (gLinkPlayers[id].lp_field_18) - { - case 0: - case 3: - memcpy(gEnemyParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); - break; - case 1: - case 2: - memcpy(gEnemyParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); - break; - } + case 0: + case 3: + memcpy(gEnemyParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); + break; + case 1: + case 2: + memcpy(gEnemyParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); + break; } } } - gUnknown_02024D1E[0]++; } - break; - case 4: - if (sub_8007ECC()) - { - SendBlock(bitmask_all_link_players_but_self(), ewram1D000 + 2, sizeof(struct Pokemon)); - gUnknown_02024D1E[0]++; - } - break; - case 5: - if ((GetBlockReceivedStatus() & 0xF) == 0xF) + gUnknown_02024D1E[0]++; + } + break; + case 4: + if (sub_8007ECC()) + { + SendBlock(bitmask_all_link_players_but_self(), ewram1D000 + 2, sizeof(struct Pokemon)); + gUnknown_02024D1E[0]++; + } + break; + case 5: + if ((GetBlockReceivedStatus() & 0xF) == 0xF) + { + ResetBlockReceivedFlags(); + for (id = 0; id < MAX_LINK_PLAYERS; id++) { - ResetBlockReceivedFlags(); - for (id = 0; id < MAX_LINK_PLAYERS; id++) + if (id == playerId) + { + switch (gLinkPlayers[id].lp_field_18) + { + case 0: + case 3: + memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon)); + break; + case 1: + case 2: + memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon)); + break; + } + } + else { - if (id == playerId) + if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1)) + || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1))) { switch (gLinkPlayers[id].lp_field_18) { - case 0: - case 3: - memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon)); - break; - case 1: - case 2: - memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon)); - break; + case 0: + case 3: + memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon)); + break; + case 1: + case 2: + memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon)); + break; } } else { - if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1)) - || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1))) - { - switch (gLinkPlayers[id].lp_field_18) - { - case 0: - case 3: - memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon)); - break; - case 1: - case 2: - memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon)); - break; - } - } - else + switch (gLinkPlayers[id].lp_field_18) { - switch (gLinkPlayers[id].lp_field_18) - { - case 0: - case 3: - memcpy(gEnemyParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon)); - break; - case 1: - case 2: - memcpy(gEnemyParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon)); - break; - } + case 0: + case 3: + memcpy(gEnemyParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon)); + break; + case 1: + case 2: + memcpy(gEnemyParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon)); + break; } } } + } - shedinja_something(&gPlayerParty[0]); - shedinja_something(&gPlayerParty[1]); - shedinja_something(&gPlayerParty[2]); - shedinja_something(&gPlayerParty[3]); - shedinja_something(&gPlayerParty[4]); - shedinja_something(&gPlayerParty[5]); + shedinja_something(&gPlayerParty[0]); + shedinja_something(&gPlayerParty[1]); + shedinja_something(&gPlayerParty[2]); + shedinja_something(&gPlayerParty[3]); + shedinja_something(&gPlayerParty[4]); + shedinja_something(&gPlayerParty[5]); - shedinja_something(&gEnemyParty[0]); - shedinja_something(&gEnemyParty[1]); - shedinja_something(&gEnemyParty[2]); - shedinja_something(&gEnemyParty[3]); - shedinja_something(&gEnemyParty[4]); - shedinja_something(&gEnemyParty[5]); + shedinja_something(&gEnemyParty[0]); + shedinja_something(&gEnemyParty[1]); + shedinja_something(&gEnemyParty[2]); + shedinja_something(&gEnemyParty[3]); + shedinja_something(&gEnemyParty[4]); + shedinja_something(&gEnemyParty[5]); - gUnknown_02024D1E[0]++; - } - break; - case 6: - sub_800B950(); gUnknown_02024D1E[0]++; - gUnknown_02024D1E[1] = 0; - gUnknown_02024D1E[2] = 0; - break; - case 7: - if (battle_load_something(gUnknown_02024D1F, gUnknown_02024D1F + 1) != 0) + } + break; + case 6: + sub_800B950(); + gUnknown_02024D1E[0]++; + gUnknown_02024D1E[1] = 0; + gUnknown_02024D1E[2] = 0; + break; + case 7: + if (battle_load_something(gUnknown_02024D1F, gUnknown_02024D1F + 1) != 0) + { + gUnknown_030042D0 = gMain.callback1; + gMain.callback1 = sub_8010824; + SetMainCallback2(sub_800F808); + if (gBattleTypeFlags & BATTLE_TYPE_LINK) { - gUnknown_030042D0 = gMain.callback1; - gMain.callback1 = sub_8010824; - SetMainCallback2(sub_800F808); - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - gTrainerBattleOpponent = 0x800; - gBattleTypeFlags |= BATTLE_TYPE_20; - } + gTrainerBattleOpponent = 0x800; + gBattleTypeFlags |= BATTLE_TYPE_20; } - break; + } + break; } } @@ -842,42 +1080,42 @@ void sub_800F838(struct Sprite *sprite) switch (sprite->data0) { - case 0: - sprite->data0++; - sprite->data1 = 0; - sprite->data2 = 0x281; - sprite->data3 = 0; - sprite->data4 = 1; - // fall through - case 1: - sprite->data4--; - if (sprite->data4 == 0) - { - s32 i; - s32 r2; - s32 r0; + case 0: + sprite->data0++; + sprite->data1 = 0; + sprite->data2 = 0x281; + sprite->data3 = 0; + sprite->data4 = 1; + // fall through + case 1: + sprite->data4--; + if (sprite->data4 == 0) + { + s32 i; + s32 r2; + s32 r0; - sprite->data4 = 2; - r2 = sprite->data1 + sprite->data3 * 32; - r0 = sprite->data2 - sprite->data3 * 32; - for (i = 0; i < 29; i += 2) - { - arr[r2 + i] = 0x3D; - arr[r0 + i] = 0x3D; - } - sprite->data3++; - if (sprite->data3 == 21) - { - sprite->data0++; - sprite->data1 = 32; - } + sprite->data4 = 2; + r2 = sprite->data1 + sprite->data3 * 32; + r0 = sprite->data2 - sprite->data3 * 32; + for (i = 0; i < 29; i += 2) + { + arr[r2 + i] = 0x3D; + arr[r0 + i] = 0x3D; } - break; - case 2: - sprite->data1--; - if (sprite->data1 == 20) - SetMainCallback2(sub_800E7C4); - break; + sprite->data3++; + if (sprite->data3 == 21) + { + sprite->data0++; + sprite->data1 = 32; + } + } + break; + case 2: + sprite->data1--; + if (sprite->data1 == 20) + SetMainCallback2(sub_800E7C4); + break; } } @@ -910,68 +1148,1454 @@ u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum) switch (gTrainers[trainerNum].partyFlags) { - case 0: + case 0: + { + struct TrainerPartyMember0 *partyData = gTrainers[trainerNum].party; + + for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++) + nameHash += gSpeciesNames[partyData[i].species][j]; + personalityValue += nameHash << 8; + fixedIV = partyData[i].iv * 31 / 255; + CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0); + break; + } + case 1: + { + struct TrainerPartyMember1 *partyData = gTrainers[trainerNum].party; + + for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++) + nameHash += gSpeciesNames[partyData[i].species][j]; + personalityValue += nameHash << 8; + fixedIV = partyData[i].iv * 31 / 255; + CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0); + + for (j = 0; j < 4; j++) { - struct TrainerPartyMember0 *partyData = gTrainers[trainerNum].party; + SetMonData(&party[i], MON_DATA_MOVE1 + j, (u8 *)&partyData[i].moves[j]); + SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp); + } + break; + } + case 2: + { + struct TrainerPartyMember2 *partyData = gTrainers[trainerNum].party; - for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++) - nameHash += gSpeciesNames[partyData[i].species][j]; - personalityValue += nameHash << 8; - fixedIV = partyData[i].iv * 31 / 255; - CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0); - break; + for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++) + nameHash += gSpeciesNames[partyData[i].species][j]; + personalityValue += nameHash << 8; + fixedIV = partyData[i].iv * 31 / 255; + CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0); + + SetMonData(&party[i], MON_DATA_HELD_ITEM, (u8 *)&partyData[i].heldItem); + break; + } + case 3: + { + struct TrainerPartyMember3 *partyData = gTrainers[trainerNum].party; + + for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++) + nameHash += gSpeciesNames[partyData[i].species][j]; + personalityValue += nameHash << 8; + fixedIV = partyData[i].iv * 31 / 255; + CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0); + + SetMonData(&party[i], MON_DATA_HELD_ITEM, (u8 *)&partyData[i].heldItem); + for (j = 0; j < 4; j++) + { + SetMonData(&party[i], MON_DATA_MOVE1 + j, (u8 *)&partyData[i].moves[j]); + SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp); } - case 1: + break; + } + } + } + gBattleTypeFlags |= gTrainers[trainerNum].doubleBattle; + } + return gTrainers[trainerNum].partySize; +} + +void sub_800FCD4(void) +{ + if (REG_VCOUNT < 0xA0 && REG_VCOUNT >= 0x6F ) + REG_BG0CNT = 0x9800; +} + +void sub_800FCFC(void) +{ + Random(); // unused return value + REG_BG0HOFS = gUnknown_030042A4; + REG_BG0VOFS = gUnknown_030042A0; + REG_BG1HOFS = gUnknown_030042C0; + REG_BG1VOFS = gUnknown_030041B4; + REG_BG2HOFS = gUnknown_03004288; + REG_BG2VOFS = gUnknown_03004280; + REG_BG3HOFS = gUnknown_030041B0; + REG_BG3VOFS = gUnknown_030041B8; + REG_WIN0H = gUnknown_030042C4; + REG_WIN0V = gUnknown_03004240; + REG_WIN1H = gUnknown_03004200; + REG_WIN1V = gUnknown_03004244; + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + sub_8089668(); +} + +void nullsub_36(struct Sprite *sprite) +{ +} + +void sub_800FDB0(struct Sprite *sprite) +{ + if (sprite->data0 != 0) + sprite->pos1.x = sprite->data1 + ((sprite->data2 & 0xFF00) >> 8); + else + sprite->pos1.x = sprite->data1 - ((sprite->data2 & 0xFF00) >> 8); + sprite->data2 += 0x180; + if (sprite->affineAnimEnded) + { + FreeSpriteTilesByTag(0x2710); + FreeSpritePaletteByTag(0x2710); + FreeSpriteOamMatrix(sprite); + DestroySprite(sprite); + } +} + +void sub_800FE20(struct Sprite *sprite) +{ + StartSpriteAffineAnim(sprite, 1); + sprite->callback = sub_800FDB0; + PlaySE(SE_BT_START); +} + +void sub_800FE40(u8 taskId) +{ + struct Pokemon *sp4 = NULL; + struct Pokemon *sp8 = NULL; + u8 r2 = ewram160CB; + u32 r7; + s32 i; + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + switch (gLinkPlayers[r2].lp_field_18) + { + case 0: + case 2: + sp4 = gPlayerParty; + sp8 = gEnemyParty; + break; + case 1: + case 3: + sp4 = gEnemyParty; + sp8 = gPlayerParty; + break; + } + } + else + { + sp4 = gPlayerParty; + sp8 = gEnemyParty; + } + + r7 = 0; + for (i = 0; i < 6; i++) + { + u16 species = GetMonData(&sp4[i], MON_DATA_SPECIES2); + u16 hp = GetMonData(&sp4[i], MON_DATA_HP); + u32 status = GetMonData(&sp4[i], MON_DATA_STATUS); + + if (species == 0) + continue; + if (species != SPECIES_EGG && hp != 0 && status == 0) + r7 |= 1 << i * 2; + + if (species == 0) + continue; + if (hp != 0 && (species == SPECIES_EGG || status != 0)) + r7 |= 2 << i * 2; + + if (species == 0) + continue; + if (species != SPECIES_EGG && hp == 0) + r7 |= 3 << i * 2; + } + gTasks[taskId].data[3] = r7; + + r7 = 0; + for (i = 0; i < 6; i++) + { + u16 species = GetMonData(&sp8[i], MON_DATA_SPECIES2); + u16 hp = GetMonData(&sp8[i], MON_DATA_HP); + u32 status = GetMonData(&sp8[i], MON_DATA_STATUS); + + if (species == 0) + continue; + if (species != SPECIES_EGG && hp != 0 && status == 0) + r7 |= 1 << i * 2; + + if (species == 0) + continue; + if (hp != 0 && (species == SPECIES_EGG || status != 0)) + r7 |= 2 << i * 2; + + if (species == 0) + continue; + if (species != SPECIES_EGG && hp == 0) + r7 |= 3 << i * 2; + } + gTasks[taskId].data[4] = r7; +} + +void c2_8011A1C(void) +{ + s32 i; + u8 taskId; + + SetHBlankCallback(NULL); + SetVBlankCallback(NULL); + CpuFill32(0, (void *)VRAM, VRAM_SIZE); + REG_MOSAIC = 0; + REG_WIN0H = 0xF0; + REG_WIN0V = 0x5051; + REG_WININ = 0; + REG_WINOUT = 0; + gUnknown_030042C4 = 0xF0; + gUnknown_03004240 = 0x5051; + dp12_8087EA4(); + + for (i = 0; i < 80; i++) + { + gUnknown_03004DE0.unk0[i] = 0xF0; + gUnknown_03004DE0.unk780[i] = 0xF0; + } + for (i = 80; i < 160; i++) + { + asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter + gUnknown_03004DE0.unk0[i] = 0xFF10; + gUnknown_03004DE0.unk780[i] = 0xFF10; + } + SetUpWindowConfig(&gWindowConfig_81E6C58); + ResetPaletteFade(); + gUnknown_030042A4 = 0; + gUnknown_030042A0 = 0; + gUnknown_030042C0 = 0; + gUnknown_030041B4 = 0; + gUnknown_03004288 = 0; + gUnknown_03004280 = 0; + gUnknown_030041B0 = 0; + gUnknown_030041B8 = 0; + + InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C58); + InitWindowFromConfig(&gUnknown_030041D0, &gWindowConfig_81E71D0); + InitWindowFromConfig(&gUnknown_03004250, &gWindowConfig_81E71EC); + sub_800D6D4(); + LoadCompressedPalette(gUnknown_08D004E0, 0, 64); + sub_800D74C(); + ResetSpriteData(); + ResetTasks(); + sub_800E23C(); + REG_WINOUT = 0x37; + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 4; + SetVBlankCallback(sub_800FCFC); + taskId = CreateTask(sub_800DE30, 0); + gTasks[taskId].data[1] = 0x10E; + gTasks[taskId].data[2] = 0x5A; + gTasks[taskId].data[5] = 1; + sub_800FE40(taskId); + SetMainCallback2(sub_80101B8); + gUnknown_02024D1E[0] = 0; +} + +void sub_80101B8(void) +{ + c2_081284E0(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + RunTasks(); +} + +void c2_081284E0(void) +{ + switch (gUnknown_02024D1E[0]) + { + case 0: + gUnknown_02024D1E[1] = 0xFF; + gUnknown_02024D1E[0]++; + break; + case 1: + gUnknown_02024D1E[1]--; + if (gUnknown_02024D1E[1] == 0) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gUnknown_02024D1E[0]++; + } + break; + case 2: + if (!gPaletteFade.active) + SetMainCallback2(gMain.savedCallback); + break; + } +} + +void oac_poke_opponent(struct Sprite *sprite) +{ + sprite->callback = sub_8010278; + StartSpriteAnimIfDifferent(sprite, 0); + BeginNormalPaletteFade(0x00020000, 0, 10, 10, 0x3DEF); +} + +void sub_8010278(struct Sprite *sprite) +{ + if ((gUnknown_02024DE8 & 1) == 0) + { + sprite->pos2.x += 2; + if (sprite->pos2.x == 0) + { + sprite->callback = sub_80102AC; + PlayCry1(sprite->data2, 25); + } + } +} + +void sub_80102AC(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + sub_804777C(sprite->data0); + sub_8043DFC(gUnknown_03004340[sprite->data0]); + sprite->callback = nullsub_37; + StartSpriteAnimIfDifferent(sprite, 0); + BeginNormalPaletteFade(0x00020000, 0, 10, 0, 0x3DEF); + } +} + +void nullsub_37(struct Sprite *sprite) +{ +} + +void unref_sub_801030C(struct Sprite *sprite) +{ + sprite->data3 = 6; + sprite->data4 = 1; + sprite->callback = sub_8010320; +} + +void sub_8010320(struct Sprite *sprite) +{ + sprite->data4--; + if (sprite->data4 == 0) + { + sprite->data4 = 8; + sprite->invisible ^= 1; + sprite->data3--; + if (sprite->data3 == 0) + { + sprite->invisible = FALSE; + sprite->callback = nullsub_37; + gUnknown_03004284 = 0; + } + } +} + +void sub_8010384(struct Sprite *sprite) +{ + u8 r6 = sprite->data0; + u16 species; + u8 yOffset; + + if (ewram17800[r6].unk2 != 0) + species = ewram17800[r6].unk2; + else + species = sprite->data2; + + GetMonData(&gEnemyParty[gUnknown_02024A6A[r6]], MON_DATA_PERSONALITY); // Unused return value + + if (species == SPECIES_UNOWN) + { + u32 personalityValue = GetMonData(&gEnemyParty[gUnknown_02024A6A[r6]], MON_DATA_PERSONALITY); + u16 unownForm = ((((personalityValue & 0x3000000) >> 18) | ((personalityValue & 0x30000) >> 12) | ((personalityValue & 0x300) >> 6) | (personalityValue & 3)) % 0x1C); + u16 unownSpecies; + + if (unownForm == 0) + unownSpecies = SPECIES_UNOWN; // Use the A Unown form + else + unownSpecies = NUM_SPECIES + unownForm; // Use one of the other Unown letters + + yOffset = gMonFrontPicCoords[unownSpecies].y; + } + else if (species == SPECIES_CASTFORM) + { + yOffset = gCastformFrontSpriteCoords[gBattleMonForms[r6]].y; + } + else if (species > NUM_SPECIES) + { + yOffset = gMonFrontPicCoords[SPECIES_NONE].y; + } + else + { + yOffset = gMonFrontPicCoords[species].y; + } + + sprite->data3 = 8 - yOffset / 8; + sprite->data4 = 1; + sprite->callback = sub_8010494; +} + +void sub_8010494(struct Sprite *sprite) +{ + s32 i; + + sprite->data4--; + if (sprite->data4 == 0) + { + sprite->data4 = 2; + sprite->pos2.y += 8; + sprite->data3--; + if (sprite->data3 < 0) + { + FreeSpriteOamMatrix(sprite); + DestroySprite(sprite); + } + else + { + u8 *dst = (u8 *)gUnknown_081FAF4C[battle_get_per_side_status(sprite->data0)] + (gBattleMonForms[sprite->data0] << 11) + (sprite->data3 << 8); + + for (i = 0; i < 0x100; i++) + *(dst++) = 0; + StartSpriteAnim(sprite, gBattleMonForms[sprite->data0]); + } + } +} + +void sub_8010520(struct Sprite *sprite) +{ + sprite->data3 = 8; + sprite->data4 = sprite->invisible; + sprite->callback = sub_801053C; +} + +void sub_801053C(struct Sprite *sprite) +{ + sprite->data3--; + if (sprite->data3 == 0) + { + sprite->invisible ^= 1; + sprite->data3 = 8; + } +} + +void sub_8010574(struct Sprite *sprite) +{ + sprite->invisible = sprite->data4; + sprite->data4 = FALSE; + sprite->callback = nullsub_37; +} + +void sub_80105A0(struct Sprite *sprite) +{ + sprite->callback = oac_poke_ally_; +} + +void oac_poke_ally_(struct Sprite *sprite) +{ + if ((gUnknown_02024DE8 & 1) == 0) + { + sprite->pos2.x -= 2; + if (sprite->pos2.x == 0) + { + sprite->callback = nullsub_86; + sprite->data1 = 0; + } + } +} + +void sub_80105DC(struct Sprite *sprite) +{ + sprite->callback = nullsub_86; +} + +void nullsub_86(struct Sprite *sprite) +{ +} + +void sub_80105EC(struct Sprite *sprite) +{ + if ((gUnknown_02024DE8 & 1) == 0) + { + sprite->pos2.x += sprite->data1; + sprite->pos2.y += sprite->data2; + } +} + +void dp11b_obj_instanciate(u8 a, u8 b, s8 c, s8 d) +{ + u8 spriteId; + u8 r7; + + if (b) + { + if (ewram17810[a].unk0_1) + return; + } + else + { + if (ewram17810[a].unk0_2) + return; + } + + spriteId = CreateInvisibleSpriteWithCallback(objc_dp11b_pingpong); + if (b == TRUE) + { + r7 = gUnknown_03004340[a]; + ewram17810[a].unk2 = spriteId; + ewram17810[a].unk0_1 = 1; + gSprites[spriteId].data0 = 0x80; + } + else + { + r7 = gUnknown_02024BE0[a]; + ewram17810[a].unk3 = spriteId; + ewram17810[a].unk0_2 = 1; + gSprites[spriteId].data0 = 0xC0; + } + gSprites[spriteId].data1 = c; + gSprites[spriteId].data2 = d; + gSprites[spriteId].data3 = r7; + gSprites[spriteId].data4 = b; + gSprites[r7].pos2.x = 0; + gSprites[r7].pos2.y = 0; +} + +void dp11b_obj_free(u8 a, u8 b) +{ + u8 r4; + + if (b == TRUE) + { + if (!ewram17810[a].unk0_1) + return; + r4 = gSprites[ewram17810[a].unk2].data3; + DestroySprite(&gSprites[ewram17810[a].unk2]); + ewram17810[a].unk0_1 = 0; + } + else + { + if (!ewram17810[a].unk0_2) + return; + r4 = gSprites[ewram17810[a].unk3].data3; + DestroySprite(&gSprites[ewram17810[a].unk3]); + ewram17810[a].unk0_2 = 0; + } + gSprites[r4].pos2.x = 0; + gSprites[r4].pos2.y = 0; +} + +void objc_dp11b_pingpong(struct Sprite *sprite) +{ + u8 spriteId = sprite->data3; + s32 var; + + if (sprite->data4 == 1) + var = sprite->data0; + else + var = sprite->data0; + + gSprites[spriteId].pos2.y = Sin(var, sprite->data2) + sprite->data2; + sprite->data0 = (sprite->data0 + sprite->data1) & 0xFF; +} + +void nullsub_41(void) +{ +} + +void sub_8010800(void) +{ + sub_8010874(); + gUnknown_02024D1E[1] = 0; + gUnknown_030042D4 = bc_8012FAC; +} + +void sub_8010824(void) +{ + gUnknown_030042D4(); + gUnknown_02024A60 = 0; + + for (gUnknown_02024A60 = 0; gUnknown_02024A60 < gUnknown_02024A68; gUnknown_02024A60++) + gUnknown_03004330[gUnknown_02024A60](); +} + +void sub_8010874(void) +{ + s32 i; + s32 j; + u8 *r4; + + sub_801365C(0); + sub_801377C(); + + for (i = 0; i < 4; i++) + { + gUnknown_02024C98[i] = 0; + + r4 = (u8 *)&gUnknown_02024CA8[i]; + for (j = 0; j < (u32)0x1C; j++) + r4[j] = 0; + + gUnknown_02024CA8[i].unk16 = 2; + gUnknown_02024C70[i] = 0; + gUnknown_02024C34[i] = 0; + gUnknown_02024C3C[i] = 0; + gUnknown_02024C44[i] = 0; + gUnknown_02024C4C[i] = 0; + gUnknown_02024C5C[i] = 0xFF; + gUnknown_02024C54[i] = 0; + gUnknown_02024C2C[i] = 0; + ewram17100[i] = 0; + } + + for (i = 0; i < 2; i++) + { + gUnknown_02024C7A[i] = 0; + + r4 = (u8 *)&gUnknown_02024C80[i]; + for (j = 0; j < (u32)12; j++) + r4[j] = 0; + } + + gPlayerMonIndex = 0; + gEnemyMonIndex = 0; + gBattleWeather = 0; + + r4 = (u8 *)&gUnknown_02024DBC; + for (i = 0; i < (u32)0x2C; i++) + r4[i] = 0; + + gUnknown_02024C6C = 0; + if ((gBattleTypeFlags & 2) == 0 && gSaveBlock2.optionsBattleSceneOff == TRUE) + gUnknown_02024C6C = 0x80; + ewram16084 = gSaveBlock2.optionsBattleStyle; + gUnknown_02024C0E = 0; + gUnknown_02024D26 = 0; + gUnknown_02024A64 = 0; + gUnknown_02024D1A = 0; + ewram17130 = 0; + ewram17160 = 0; + for (i = 0; i < 8; i++) + gUnknown_02024D1E[i] = 0; + gUnknown_02024D18 = 0; + gBattleMoveDamage = 0; + gUnknown_02024DE8 = 0; + ewram16002 = 0; + ewram160A1 = 0; + gUnknown_03004324 = 0; + gUnknown_02024C0C = 0; + ewram16078 = 0; + ewram16086 = 0; + ewram16087 = 0; + ewram16089 = gBaseStats[GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)].catchRate * 100 / 1275; + ewram16088 = 3; + ewram1601B = 0; + ewram16056 = 1; + + for (i = 0; i < 8; i++) + { + ewram[i + 0x160AC] = 0; + ewram[i + 0x160CC] = 0; + ewram[i + 0x160E8] = 0; + ewram[i + 0x160F0] = 0; + ewram[i + 0x16100] = 0; + ewram[i + 0x16108] = 0; + } + + ewram160C8 = 6; + ewram160C9 = 6; + ewram16113 = 0; + for (i = 0; i < 11; i++) + gUnknown_030042E0.unk36[i] = 0; + gUnknown_030042E0.unk13 = 0; + gUnknown_030042E0.unk0 = 0; + gUnknown_030042E0.unk1 = 0; + gUnknown_030042E0.unk2 = 0; + gUnknown_030042E0.unk3 = 0; + gUnknown_030042E0.unk4 = 0; + gUnknown_030042E0.unk5_0 = 0; + gUnknown_030042E0.unk5_1 = 0; + gUnknown_030042E0.unk20 = 0; + gUnknown_030042E0.unk22 = 0; + gUnknown_030042E0.unk24 = 0; + gUnknown_030042E0.unk6 = 0; + gUnknown_030042E0.unk26 = 0; + gUnknown_030042E0.unk28 = 0; + for (i = 0; i < 10; i++) + { + gUnknown_030042E0.unk8[i] = 0; + gUnknown_030042E0.unk14[i] = 0; + gUnknown_030042E0.unk2A[i] = 0; + } +} + +void sub_8010B88(void) +{ + struct UnknownStruct4 sp0 = gUnknown_02024CA8[gUnknown_02024A60]; + s32 i; + u8 *ptr; + u32 *ptr2; + + if (gBattleMoves[gUnknown_02024BE6].effect != 0x7F) + { + for (i = 0; i < 8; i++) + gBattleMons[gUnknown_02024A60].statStages[i] = 6; + for (i = 0; i < gUnknown_02024A68; i++) + { + struct UnknownStruct12 *sp20 = &gUnknown_02024AD0[i]; + + if ((sp20->unk0 & 0x04000000) && gUnknown_02024CA8[i].unk14 == gUnknown_02024A60) + sp20->unk0 &= ~0x04000000; + if ((gUnknown_02024C98[i] & 0x18) && gUnknown_02024CA8[i].unk15 == gUnknown_02024A60) + { + gUnknown_02024C98[i] &= ~0x18; + gUnknown_02024CA8[i].unk15 = 0; + } + } + } + if (gBattleMoves[gUnknown_02024BE6].effect == 0x7F) + { + gBattleMons[gUnknown_02024A60].status2 &= 0x15100007; + gUnknown_02024C98[gUnknown_02024A60] &= 0x3043F; + + for (i = 0; i < gUnknown_02024A68; i++) + { + if (battle_side_get_owner(gUnknown_02024A60) != battle_side_get_owner(i) + && (gUnknown_02024C98[i] & 0x18) != 0 + && (gUnknown_02024CA8[i].unk15 == gUnknown_02024A60)) + { + gUnknown_02024C98[i] &= ~0x18; + gUnknown_02024C98[i] |= 0x10; + } + } + } + else + { + gBattleMons[gUnknown_02024A60].status2 = 0; + gUnknown_02024C98[gUnknown_02024A60] = 0; + } + + for (i = 0; i < gUnknown_02024A68; i++) + { + if (gUnknown_02024AD0[i].unk0 & (gBitTable[gUnknown_02024A60] << 16)) + gUnknown_02024AD0[i].unk0 &= ~(gBitTable[gUnknown_02024A60] << 16); + if ((gUnknown_02024AD0[i].unk0 & 0xE000) && ewram[0x16020 + i] == gUnknown_02024A60) + gUnknown_02024AD0[i].unk0 &= ~0xE000; + } + + gUnknown_02024E60[gUnknown_02024A60] = 0; + gUnknown_02024E64[gUnknown_02024A60] = 0; + + ptr = (u8 *)&gUnknown_02024CA8[gUnknown_02024A60]; + for (i = 0; i < (u32)0x1C; i++) + ptr[i] = 0; + + if (gBattleMoves[gUnknown_02024BE6].effect == 0x7F) + { + gUnknown_02024CA8[gUnknown_02024A60].unkA = sp0.unkA; + gUnknown_02024CA8[gUnknown_02024A60].unk15 = sp0.unk15; + gUnknown_02024CA8[gUnknown_02024A60].unkF_0 = sp0.unkF_0; + gUnknown_02024CA8[gUnknown_02024A60].unkF_4 = sp0.unkF_4; + } + + gUnknown_02024CA8[gUnknown_02024A60].unk16 = 2; + gUnknown_02024C34[gUnknown_02024A60] = 0; + gUnknown_02024C3C[gUnknown_02024A60] = 0; + gUnknown_02024C44[gUnknown_02024A60] = 0; + gUnknown_02024C4C[gUnknown_02024A60] = 0; + gUnknown_02024C2C[gUnknown_02024A60] = 0; + gUnknown_02024C5C[gUnknown_02024A60] = 0xFF; + + ewram[0x160AC + gUnknown_02024A60 * 2 + 0] = 0; + ewram[0x160AC + gUnknown_02024A60 * 2 + 1] = 0; + ewram[0x16100 + gUnknown_02024A60 * 4 + 0] = 0; + ewram[0x16100 + gUnknown_02024A60 * 4 + 1] = 0; + ewram[0x16100 + gUnknown_02024A60 * 4 + 2] = 0; + ewram[0x16100 + gUnknown_02024A60 * 4 + 3] = 0; + ewram[0x160E8 + gUnknown_02024A60 * 2 + 0] = 0; + ewram[0x160E8 + gUnknown_02024A60 * 2 + 1] = 0; + + ptr2 = (u32 *)(ewram + 0x17100); + ptr2[gUnknown_02024A60] = 0; + + gUnknown_02024BE6 = 0; +} + +void sub_8010F48(void) +{ + s32 i; + u8 *ptr; + u32 *ptr2; + + for (i = 0; i < 8; i++) + gBattleMons[gUnknown_02024A60].statStages[i] = 6; + gBattleMons[gUnknown_02024A60].status2 = 0; + gUnknown_02024C98[gUnknown_02024A60] = 0; + for (i = 0; i < gUnknown_02024A68; i++) + { + if ((gBattleMons[i].status2 & 0x4000000) && gUnknown_02024CA8[i].unk14 == gUnknown_02024A60) + gBattleMons[i].status2 &= ~0x4000000; + if (gBattleMons[i].status2 & (gBitTable[gUnknown_02024A60] << 16)) + gBattleMons[i].status2 &= ~(gBitTable[gUnknown_02024A60] << 16); + if ((gBattleMons[i].status2 & 0xE000) && ewram[0x16020 + i] == gUnknown_02024A60) + gBattleMons[i].status2 &= ~0xE000; + } + gUnknown_02024E60[gUnknown_02024A60] = 0; + gUnknown_02024E64[gUnknown_02024A60] = 0; + + ptr = (u8 *)&gUnknown_02024CA8[gUnknown_02024A60]; + for (i = 0; i < (u32)0x1C; i++) + ptr[i] = 0; + gUnknown_02024D28[gUnknown_02024A60].unk0_0 = 0; + gUnknown_02024D28[gUnknown_02024A60].unk0_1 = 0; + gUnknown_02024D28[gUnknown_02024A60].unk0_2 = 0; + gUnknown_02024D28[gUnknown_02024A60].unk0_3 = 0; + gUnknown_02024D28[gUnknown_02024A60].unk0_4 = 0; + gUnknown_02024D28[gUnknown_02024A60].unk0_5 = 0; + gUnknown_02024D28[gUnknown_02024A60].unk0_6 = 0; + gUnknown_02024D28[gUnknown_02024A60].unk0_7 = 0; + gUnknown_02024D28[gUnknown_02024A60].unk1_0 = 0; + gUnknown_02024D28[gUnknown_02024A60].unk1_1 = 0; + gUnknown_02024D28[gUnknown_02024A60].unk1_2 = 0; + gUnknown_02024D28[gUnknown_02024A60].unk1_3 = 0; + gUnknown_02024D28[gUnknown_02024A60].unk1_5 = 0; + gUnknown_02024D28[gUnknown_02024A60].unk1_6 = 0; + gUnknown_02024D28[gUnknown_02024A60].unk1_7 = 0; + gUnknown_02024D28[gUnknown_02024A60].unk2_0 = 0; + gUnknown_02024D28[gUnknown_02024A60].unk2_1 = 0; + gUnknown_02024D28[gUnknown_02024A60].unk2_2 = 0; + gUnknown_02024D28[gUnknown_02024A60].unk2_3 = 0; + + gUnknown_02024CA8[gUnknown_02024A60].unk16 = 2; + gUnknown_02024C34[gUnknown_02024A60] = 0; + gUnknown_02024C3C[gUnknown_02024A60] = 0; + gUnknown_02024C44[gUnknown_02024A60] = 0; + gUnknown_02024C4C[gUnknown_02024A60] = 0; + gUnknown_02024C2C[gUnknown_02024A60] = 0; + gUnknown_02024C5C[gUnknown_02024A60] = 0xFF; + + ewram[0x160E8 + gUnknown_02024A60 * 2 + 0] = 0; + ewram[0x160E8 + gUnknown_02024A60 * 2 + 1] = 0; + ewram[0x160AC + gUnknown_02024A60 * 2 + 0] = 0; + ewram[0x160AC + gUnknown_02024A60 * 2 + 1] = 0; + ewram[0x16100 + gUnknown_02024A60 * 4 + 0] = 0; + ewram[0x16100 + gUnknown_02024A60 * 4 + 1] = 0; + ewram[0x16100 + gUnknown_02024A60 * 4 + 2] = 0; + ewram[0x16100 + gUnknown_02024A60 * 4 + 3] = 0; + + ptr2 = (u32 *)(ewram + 0x17100); + ptr2[gUnknown_02024A60] = 0; + + gBattleMons[gUnknown_02024A60].type1 = gBaseStats[gBattleMons[gUnknown_02024A60].species].type1; + gBattleMons[gUnknown_02024A60].type2 = gBaseStats[gBattleMons[gUnknown_02024A60].species].type2; +} + +void bc_8012FAC(void) +{ + switch (gUnknown_02024D1E[0]) + { + case 0: + gUnknown_02024A60 = gUnknown_02024D1E[1]; + dp01_build_cmdbuf_x00_a_b_0(0, 0, 0); + dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60); + gUnknown_02024D1E[0]++; + break; + case 1: + if (gUnknown_02024A64 == 0) + { + gUnknown_02024D1E[1]++; + if (gUnknown_02024D1E[1] == gUnknown_02024A68) + gUnknown_030042D4 = bc_load_battlefield; + else + gUnknown_02024D1E[0] = 0; + } + break; + } +} + +void bc_load_battlefield(void) +{ + if (gUnknown_02024A64 == 0) + { + gUnknown_02024A60 = battle_get_side_with_given_state(0); + dp01_build_cmdbuf_x2E_a(0, gBattleTerrain); + dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60); + gUnknown_030042D4 = sub_8011384; + gUnknown_02024D1E[0] = 0; + gUnknown_02024D1E[1] = 0; + } +} + +void sub_8011384(void) +{ + u8 *ptr; + s32 i; + + if (gUnknown_02024A64 == 0) + { + for (gUnknown_02024A60 = 0; gUnknown_02024A60 < gUnknown_02024A68; gUnknown_02024A60++) + { + if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) + && battle_side_get_owner(gUnknown_02024A60) == 0) + { + ptr = (u8 *)&gBattleMons[gUnknown_02024A60]; + for (i = 0; i < (u32)0x58; i++) + ptr[i] = 0; + } + else + { + u8 r0; + + ptr = (u8 *)&gBattleMons[gUnknown_02024A60]; + for (i = 0; i < (u32)0x58; i++) + ptr[i] = gUnknown_02024260[gUnknown_02024A60][4 + i]; + + gBattleMons[gUnknown_02024A60].type1 = gBaseStats[gBattleMons[gUnknown_02024A60].species].type1; + gBattleMons[gUnknown_02024A60].type2 = gBaseStats[gBattleMons[gUnknown_02024A60].species].type2; + gBattleMons[gUnknown_02024A60].ability = GetAbilityBySpecies(gBattleMons[gUnknown_02024A60].species, gBattleMons[gUnknown_02024A60].altAbility); + r0 = battle_side_get_owner(gUnknown_02024A60); + ewram160BC[r0] = gBattleMons[gUnknown_02024A60].hp; + for (i = 0; i < 8; i++) + gBattleMons[gUnknown_02024A60].statStages[i] = 6; + gBattleMons[gUnknown_02024A60].status2 = 0; + } + + if (battle_get_per_side_status(gUnknown_02024A60) == 0) + { + dp01_build_cmdbuf_x07_7_7_7(0); + dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60); + } + + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + if (battle_get_per_side_status(gUnknown_02024A60) == 1) { - struct TrainerPartyMember1 *partyData = gTrainers[trainerNum].party; + dp01_build_cmdbuf_x07_7_7_7(0); + dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60); + } + if (battle_side_get_owner(gUnknown_02024A60) == 1 + && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) + sub_8090D90(SpeciesToNationalPokedexNum(gBattleMons[gUnknown_02024A60].species), 2); + } + else + { + if (battle_side_get_owner(gUnknown_02024A60) == 1 + && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) + { + sub_8090D90(SpeciesToNationalPokedexNum(gBattleMons[gUnknown_02024A60].species), 2); + dp01_build_cmdbuf_x04_4_4_4(0); + dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60); + } + } + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if (battle_get_per_side_status(gUnknown_02024A60) == 2 + || battle_get_per_side_status(gUnknown_02024A60) == 3) + { + dp01_build_cmdbuf_x07_7_7_7(0); + dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60); + } + } + } + gUnknown_030042D4 = bc_801333C; + } +} - for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++) - nameHash += gSpeciesNames[partyData[i].species][j]; - personalityValue += nameHash << 8; - fixedIV = partyData[i].iv * 31 / 255; - CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0); +void bc_801333C(void) +{ + s32 i; - for (j = 0; j < 4; j++) - { - SetMonData(&party[i], MON_DATA_MOVE1 + j, (u8 *)&partyData[i].moves[j]); - SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp); - } - break; + if (gUnknown_02024A64 == 0) + { + struct + { + u16 hp; + u32 status; + } sp0[6]; + + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + for (i = 0; i < 6; i++) + { + if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == 0 + || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) + { + sp0[i].hp = 0xFFFF; + sp0[i].status = 0; } - case 2: + else { - struct TrainerPartyMember2 *partyData = gTrainers[trainerNum].party; + sp0[i].hp = GetMonData(&gEnemyParty[i], MON_DATA_HP); + sp0[i].status = GetMonData(&gEnemyParty[i], MON_DATA_STATUS); + } + } + gUnknown_02024A60 = battle_get_side_with_given_state(1); + dp01_build_cmdbuf_x30_TODO(0, (u8 *)sp0, 0x80); + dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60); - for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++) - nameHash += gSpeciesNames[partyData[i].species][j]; - personalityValue += nameHash << 8; - fixedIV = partyData[i].iv * 31 / 255; - CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0); + for (i = 0; i < 6; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == 0 + || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) + { + sp0[i].hp = 0xFFFF; + sp0[i].status = 0; + } + else + { + sp0[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); + sp0[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); + } + } + gUnknown_02024A60 = battle_get_side_with_given_state(0); + dp01_build_cmdbuf_x30_TODO(0, (u8 *)sp0, 0x80); + dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60); - SetMonData(&party[i], MON_DATA_HELD_ITEM, (u8 *)&partyData[i].heldItem); - break; + gUnknown_030042D4 = bc_battle_begin_message; + } + else + { + // The array gets set here, but nothing is ever done with it. + // Likely unfinished code. + + for (i = 0; i < 6; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == 0 + || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) + { + sp0[i].hp = 0xFFFF; + sp0[i].status = 0; } - case 3: + else { - struct TrainerPartyMember3 *partyData = gTrainers[trainerNum].party; + sp0[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); + sp0[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); + } + } - for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++) - nameHash += gSpeciesNames[partyData[i].species][j]; - personalityValue += nameHash << 8; - fixedIV = partyData[i].iv * 31 / 255; - CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0); + gUnknown_030042D4 = bc_8013568; + } + } +} - SetMonData(&party[i], MON_DATA_HELD_ITEM, (u8 *)&partyData[i].heldItem); - for (j = 0; j < 4; j++) - { - SetMonData(&party[i], MON_DATA_MOVE1 + j, (u8 *)&partyData[i].moves[j]); - SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp); - } - break; +void bc_battle_begin_message(void) +{ + if (gUnknown_02024A64 == 0) + { + gUnknown_02024A60 = battle_get_side_with_given_state(1); + b_std_message(0, gUnknown_02024A60); + gUnknown_030042D4 = sub_8011800; + } +} + +void bc_8013568(void) +{ + if (gUnknown_02024A64 == 0) + { + gUnknown_030042D4 = sub_8011970; + b_std_message(0, 0); + } +} + +void sub_8011800(void) +{ + if (gUnknown_02024A64 == 0) + { + b_std_message(1, battle_get_side_with_given_state(1)); + gUnknown_030042D4 = sub_8011834; + } +} + +void sub_8011834(void) +{ + if (gUnknown_02024A64 == 0) + { + for (gUnknown_02024A60 = 0; gUnknown_02024A60 < gUnknown_02024A68; gUnknown_02024A60++) + { + if (battle_get_per_side_status(gUnknown_02024A60) == 1) + { + dp01_build_cmdbuf_x2F_2F_2F_2F(0); + dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60); + } + if ((gBattleTypeFlags & BATTLE_TYPE_MULTI) + && battle_get_per_side_status(gUnknown_02024A60) == 3) + { + dp01_build_cmdbuf_x2F_2F_2F_2F(0); + dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60); + } + } + gUnknown_030042D4 = bc_801362C; + } +} + +void bc_801362C(void) +{ + if (gUnknown_02024A64 == 0) + { + for (gUnknown_02024A60 = 0; gUnknown_02024A60 < gUnknown_02024A68; gUnknown_02024A60++) + { + if (battle_side_get_owner(gUnknown_02024A60) == 1 + && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) + sub_8090D90(SpeciesToNationalPokedexNum(gBattleMons[gUnknown_02024A60].species), 2); + } + gUnknown_030042D4 = sub_8011970; + } +} + +void unref_sub_8011950(void) +{ + if (gUnknown_02024A64 == 0) + gUnknown_030042D4 = sub_8011970; +} + +void sub_8011970(void) +{ + if (gUnknown_02024A64 == 0) + { + if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) + b_std_message(1, battle_get_side_with_given_state(0)); + gUnknown_030042D4 = sub_80119B4; + } +} + +void sub_80119B4(void) +{ + if (gUnknown_02024A64 == 0) + { + for (gUnknown_02024A60 = 0; gUnknown_02024A60 < gUnknown_02024A68; gUnknown_02024A60++) + { + if (battle_get_per_side_status(gUnknown_02024A60) == 0) + { + dp01_build_cmdbuf_x2F_2F_2F_2F(0); + dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60); + } + if ((gBattleTypeFlags & BATTLE_TYPE_MULTI) + && battle_get_per_side_status(gUnknown_02024A60) == 2) + { + dp01_build_cmdbuf_x2F_2F_2F_2F(0); + dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60); + } + } + ewram16058 = 0; + ewram160F9 = 0; + ewram160E6 = 0; + gUnknown_030042D4 = sub_8011B00; + } +} + +void unref_sub_8011A68(void) +{ + if (gUnknown_02024A64 == 0) + { + for (gUnknown_02024A60 = 0; gUnknown_02024A60 < gUnknown_02024A68; gUnknown_02024A60++) + { + if (battle_side_get_owner(gUnknown_02024A60) == 0) + { + sub_800C704(0, gUnknown_02024A6A[gUnknown_02024A60], 0); + dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60); + } + } + ewram16058 = 0; + ewram160F9 = 0; + ewram160E6 = 0; + gUnknown_030042D4 = sub_8011B00; + } +} + +void sub_8011B00(void) +{ + s32 i; + s32 j; + u8 r9 = 0; + + if (gUnknown_02024A64 == 0) + { + if (ewram16058 == 0) + { + for (i = 0; i < gUnknown_02024A68; i++) + gUnknown_02024A7A[i] = i; + for (i = 0; i < gUnknown_02024A68 - 1; i++) + { + for (j = i + 1; j < gUnknown_02024A68; j++) + { + if (b_first_side(gUnknown_02024A7A[i], gUnknown_02024A7A[j], 1) != 0) + sub_8012FBC(i, j); } } } - gBattleTypeFlags |= gTrainers[trainerNum].doubleBattle; + if (ewram160E6 == 0 && sub_8018324(0, 0, 0, 0xFF, 0) != 0) + { + ewram160E6 = 1; + return; + } + while (ewram16058 < gUnknown_02024A68) + { + if (sub_8018324(0, gUnknown_02024A7A[ewram16058], 0, 0, 0) != 0) + r9++; + ewram16058++; + if (r9 != 0) + return; + } + if (sub_8018324(9, 0, 0, 0, 0) != 0) + return; + if (sub_8018324(11, 0, 0, 0, 0) != 0) + return; + while (ewram160F9 < gUnknown_02024A68) + { + if (sub_801A02C(0, gUnknown_02024A7A[ewram160F9], 0) != 0) + r9++; + ewram160F9++; + if (r9 != 0) + return; + } + // Absolutely pointless for-loop that somehow doesn't get optimized out + for (i = 0; i < gUnknown_02024A68; i++) + ; + for (i = 0; i < 4; i++) + { + ewram[0x16068 + i] = 6; + gUnknown_02024C18[i] = 0xFF; + gUnknown_02024C60[i] = 0; + } + sub_801365C(0); + sub_801377C(); + ewram160A6 = gUnknown_02024C0C; + gUnknown_030042D4 = sub_8012324; + sub_80156DC(); + for (i = 0; i < 8; i++) + gUnknown_02024D1E[i] = 0; + for (i = 0; i < gUnknown_02024A68; i++) + gBattleMons[i].status2 &= ~8; + ewram16000 = 0; + ewram16001 = 0; + ewram16110 = 0; + ewram16111 = 0; + ewram1600C = 0; + ewram16059 = 0; + ewram1600E = 0; + gBattleMoveFlags = 0; + gUnknown_02024D1C = Random(); } - return gTrainers[trainerNum].partySize; -}
\ No newline at end of file +} + +void bc_8013B1C(void) +{ + s32 i; + + if (gUnknown_02024A64 == 0) + { + gUnknown_030042D4 = sub_8011E8C; + for (i = 0; i < 8; i++) + gUnknown_02024D1E[i] = 0; + for (i = 0; i < gUnknown_02024A68; i++) + { + gBattleMons[i].status2 &= ~8; + if ((gBattleMons[i].status1 & 7) && (gBattleMons[i].status2 & 0x1000)) + b_cancel_multi_turn_move_maybe(i); + } + ewram16000 = 0; + ewram16001 = 0; + ewram16110 = 0; + ewram16111 = 0; + ewram1600E = 0; + gBattleMoveFlags = 0; + } +} + +void sub_8011E8C(void) +{ + s32 i; + + sub_801365C(1); + if (gUnknown_02024D26 == 0) + { + if (sub_8015DFC() != 0) + return; + if (sub_8016558() != 0) + return; + } + if (sub_80173A4() != 0) + return; + ewram16059 = 0; + if (sub_80170DC() != 0) + return; + sub_801365C(0); + gUnknown_02024C6C &= ~0x200; + gUnknown_02024C6C &= ~0x80000; + gUnknown_02024C6C &= ~0x400000; + gUnknown_02024C6C &= ~0x100000; + ewram16002 = 0; + ewram160A1 = 0; + ewram1600C = 0; + gBattleMoveDamage = 0; + gBattleMoveFlags = 0; + for (i = 0; i < 5; i++) + gUnknown_02024D1E[i] = 0; + if (gUnknown_02024D26 != 0) + { + gUnknown_02024A7F = 12; + gUnknown_030042D4 = sub_80138F0; + return; + } + if (gUnknown_030042E0.unk13 < 0xFF) + gUnknown_030042E0.unk13++; + for (i = 0; i < gUnknown_02024A68; i++) + { + gUnknown_02024C18[i] = 0xFF; + gUnknown_02024C60[i] = 0; + } + for (i = 0; i < 4; i++) + ewram[0x16068 + i] = 6; + ewram160A6 = gUnknown_02024C0C; + gUnknown_030042D4 = sub_8012324; + gUnknown_02024D1C = Random(); +} + +u8 sub_8012028(void) +{ + u8 r2; + u8 r6; + s32 i; + + if (gBattleMons[gUnknown_02024A60].item == 0xAF) + r2 = gEnigmaBerries[gUnknown_02024A60].holdEffect; + else + r2 = ItemId_GetHoldEffect(gBattleMons[gUnknown_02024A60].item); + gUnknown_02024C0B = gUnknown_02024A60; + if (r2 == 0x25) + return 0; + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + return 0; + if (gBattleMons[gUnknown_02024A60].ability == ABILITY_RUN_AWAY) + return 0; + r6 = battle_side_get_owner(gUnknown_02024A60); + for (i = 0; i < gUnknown_02024A68; i++) + { + if (r6 != battle_side_get_owner(i) + && gBattleMons[i].ability == 0x17) + { + ewram16003 = i; + byte_2024C06 = gBattleMons[i].ability; + gUnknown_02024D1E[5] = 2; + return 2; + } + if (r6 != battle_side_get_owner(i) + && gBattleMons[gUnknown_02024A60].ability != ABILITY_LEVITATE + && gBattleMons[gUnknown_02024A60].type1 != 2 + && gBattleMons[gUnknown_02024A60].type2 != 2 + && gBattleMons[i].ability == 0x47) + { + ewram16003 = i; + byte_2024C06 = gBattleMons[i].ability; + gUnknown_02024D1E[5] = 2; + return 2; + } + } + i = sub_8018324(15, gUnknown_02024A60, 0x2A, 0, 0); + if (i != 0 && (gBattleMons[gUnknown_02024A60].type1 == 8 || gBattleMons[gUnknown_02024A60].type2 == 8)) + { + ewram16003 = i - 1; + byte_2024C06 = gBattleMons[i - 1].ability; + gUnknown_02024D1E[5] = 2; + return 2; + } + if ((gBattleMons[gUnknown_02024A60].status2 & 0x0400E000) || (gUnknown_02024C98[gUnknown_02024A60] & 0x400)) + { + gUnknown_02024D1E[5] = 0; + return 1; + } + if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) + { + gUnknown_02024D1E[5] = 1; + return 1; + } + return 0; +} + +void sub_8012258(u8 a) +{ + s32 i; + u8 r4; + u8 r1; + + for (i = 0; i < 3; i++) + gUnknown_02038470[i] = ewram[0x1606C + i + a * 3]; + r4 = pokemon_order_func(gUnknown_02024A6A[a]); + r1 = pokemon_order_func(ewram[0x16068 + a]); + sub_8094C98(r4, r1); + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + for (i = 0; i < 3; i++) + { + ewram[0x1606C + i + a * 3] = gUnknown_02038470[i]; + ewram[0x1606C + i + (a ^ 2) * 3] = gUnknown_02038470[i]; + } + } + else + { + for (i = 0; i < 3; i++) + { + ewram[0x1606C + i + a * 3] = gUnknown_02038470[i]; + } + } +} + +/* +void sub_8012324(void) +{ + u8 r5; + + gUnknown_02024D1E[4] = 0; + // inverted loop + //_0801234C + for (gUnknown_02024A60 = 0; gUnknown_02024A60 < gUnknown_02024A68; gUnknown_02024A60++) + { + r5 = battle_get_per_side_status(gUnknown_02024A60); + switch (gUnknown_02024D1E[gUnknown_02024A60]) + { + case 0: + ewram[0x016068 + gUnknown_02024A60] = 6; + if (!(gBattleTypeFlags & 0x40) + && (r5 & 2) + && !(ewram160A6 & gBitTable[battle_get_side_with_given_state(r5 ^ 2)]) + && gUnknown_02024D1E[battle_get_side_with_given_state(r5)] != 4) + break; + //_080123F8 + if (ewram160A6 & gBitTable[gUnknown_02024A60]) + { + gUnknown_02024C18[gUnknown_02024A60] = 13; + if (!(gBattleTypeFlags & 0x40)) + gUnknown_02024D1E[gUnknown_02024A60] = 4; + //_08012454 + else + gUnknown_02024D1E[gUnknown_02024A60] = 3; + break; + } + //_08012468 + if ((gBattleMons[gUnknown_02024A60].status2 & 0x1000) + || (gBattleMons[gUnknown_02024A60].status2 & 0x10000000)) + { + gUnknown_02024C18[gUnknown_02024A60] = 0; + gUnknown_02024D1E[gUnknown_02024A60] = 3; + } + else + { + dp01_build_cmdbuf_x12_a_bb(0, gUnknown_02024C18[0], gUnknown_02024260[0][1] | (gUnknown_02024260[0][2] << 8)); + dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60); + gUnknown_02024D1E[gUnknown_02024A60]++; + } + break; + case 1: + } + } +} +*/ diff --git a/src/credits.c b/src/credits.c index 01af78bce..ca5553c2e 100644 --- a/src/credits.c +++ b/src/credits.c @@ -1,12 +1,17 @@ #include "global.h" #include "asm.h" #include "decompress.h" +#include "event_data.h" #include "m4a.h" #include "main.h" #include "menu.h" #include "palette.h" +#include "pokedex.h" +#include "rng.h" #include "songs.h" #include "sound.h" +#include "species.h" +#include "starter_choose.h" #include "trig.h" asm(".set REG_BASE, 0x4000000"); @@ -15,8 +20,6 @@ asm(".set OFFSET_REG_BLDALPHA, 0x52"); asm(".set REG_BLDCNT, REG_BASE + OFFSET_REG_BLDCNT"); asm(".set REG_BLDALPHA, REG_BASE + OFFSET_REG_BLDALPHA"); -u32 NationalPokedexNumToSpecies(u16 nationalNum); - struct MonCoords { u8 x, y; @@ -126,14 +129,17 @@ enum TDE_TASK_A_ID = 2, }; +#define POKEMON_TILE_COUNT 68 + struct Unk201C000 { - u16 unk0[8]; - u8 pad_10[0x78]; + u16 unk0[POKEMON_TILE_COUNT]; u16 unk88; u16 unk8A; u16 unk8C; u16 unk8E; + u16 unk90[386]; + u16 unk394; }; struct CreditsEntry @@ -226,12 +232,12 @@ static u8 sub_8144454(u8 page, u8 taskIdA); static void task_d_8144514(u8 taskIdD); static bool8 sub_8144ECC(u8 data, u8 taskIdA); static void sub_81450AC(u8 taskIdA); -void sub_8145128(u16, u16, u16); -static void sub_81452D0(u16 arg0, u16 arg1); +static void sub_8145128(u16, u16, u16); +static void sub_81452D0(u16 arg0, u16 palette); static void spritecb_player_8145378(struct Sprite *sprite); static void spritecb_rival_8145420(struct Sprite *sprite); -u8 sub_81456B4(u16 nationalNum, u16 x, u16 y, u16 arg3); -void sub_81458DC(void); +static u8 sub_81456B4(u16 nationalNum, u16 x, u16 y, u16 position); +static void sub_81458DC(void); static void vblank_8143948(void) { @@ -666,8 +672,7 @@ static void task_b_81441B8(u8 taskIdB) for (i = 0; i < 5; i++) { - sub_8072BD8(gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->text, 0, - 9 + i * 2, 240); + sub_8072BD8(gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->text, 0, 9 + i * 2, 240); } gTasks[taskIdB].data[TDB_CURRENT_PAGE] += 1; @@ -816,8 +821,6 @@ static u8 sub_8144454(u8 page, u8 taskIdA) return FALSE; } -#define UNK_DEFINE_44 (0x44) - static void task_d_8144514(u8 taskIdD) { struct Unk201C000 *r6 = &ewram1c000; @@ -834,7 +837,7 @@ static void task_d_8144514(u8 taskIdD) gTasks[taskIdD].data[TDD_STATE]++; break; case 2: - if (r6->unk88 == UNK_DEFINE_44 || gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].func != task_a_8143B68) + if (r6->unk88 == POKEMON_TILE_COUNT || gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].func != task_a_8143B68) break; r2 = sub_81456B4(r6->unk0[r6->unk8C], gUnknown_0840CA00[r6->unk8A][0], gUnknown_0840CA00[r6->unk8A][1], r6->unk8A); if (r6->unk8C < r6->unk8E - 1) @@ -866,83 +869,83 @@ static void task_d_8144514(u8 taskIdD) void task_c_8144664(u8 taskIdC) { - switch (gTasks[taskIdC].data[0]) + switch (gTasks[taskIdC].data[TDC_0]) { case 0: - gUnknown_0203935A = Sin((gTasks[taskIdC].data[5] >> 1) & 0x7F, 12); - gTasks[taskIdC].data[5]++; + gUnknown_0203935A = Sin((gTasks[taskIdC].data[TDC_5] >> 1) & 0x7F, 12); + gTasks[taskIdC].data[TDC_5]++; break; case 1: if (gUnknown_0203935A != 0) { - gUnknown_0203935A = Sin((gTasks[taskIdC].data[5] >> 1) & 0x7F, 12); - gTasks[taskIdC].data[5]++; + gUnknown_0203935A = Sin((gTasks[taskIdC].data[TDC_5] >> 1) & 0x7F, 12); + gTasks[taskIdC].data[TDC_5]++; } else { - gSprites[gTasks[taskIdC].data[2]].data0 = 2; - gTasks[taskIdC].data[5] = 0; - gTasks[taskIdC].data[0]++; + gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 2; + gTasks[taskIdC].data[TDC_5] = 0; + gTasks[taskIdC].data[TDC_0]++; } break; case 2: - if (gTasks[taskIdC].data[5] < 64) + if (gTasks[taskIdC].data[TDC_5] < 64) { - gTasks[taskIdC].data[5]++; - gUnknown_0203935A = Sin(gTasks[taskIdC].data[5] & 0x7F, 20); + gTasks[taskIdC].data[TDC_5]++; + gUnknown_0203935A = Sin(gTasks[taskIdC].data[TDC_5] & 0x7F, 20); } else { - gTasks[taskIdC].data[0]++; + gTasks[taskIdC].data[TDC_0]++; } break; case 3: - gSprites[gTasks[taskIdC].data[2]].data0 = 3; - gSprites[gTasks[taskIdC].data[3]].data0 = 1; - gTasks[taskIdC].data[4] = 120; - gTasks[taskIdC].data[0]++; + gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 3; + gSprites[gTasks[taskIdC].data[TDC_3]].data0 = 1; + gTasks[taskIdC].data[TDC_4] = 120; + gTasks[taskIdC].data[TDC_0]++; break; case 4: - if (gTasks[taskIdC].data[4] != 0) + if (gTasks[taskIdC].data[TDC_4] != 0) { - gTasks[taskIdC].data[4]--; + gTasks[taskIdC].data[TDC_4]--; } else { - gTasks[taskIdC].data[5] = 64; - gTasks[taskIdC].data[0]++; + gTasks[taskIdC].data[TDC_5] = 64; + gTasks[taskIdC].data[TDC_0]++; } break; case 5: - if (gTasks[taskIdC].data[5] > 0) + if (gTasks[taskIdC].data[TDC_5] > 0) { - gTasks[taskIdC].data[5]--; - gUnknown_0203935A = Sin(gTasks[taskIdC].data[5] & 0x7F, 20); + gTasks[taskIdC].data[TDC_5]--; + gUnknown_0203935A = Sin(gTasks[taskIdC].data[TDC_5] & 0x7F, 20); } else { - gSprites[gTasks[taskIdC].data[2]].data0 = 1; - gTasks[taskIdC].data[0]++; + gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 1; + gTasks[taskIdC].data[TDC_0]++; } break; case 6: - gTasks[taskIdC].data[0] = 50; + gTasks[taskIdC].data[TDC_0] = 50; break; case 10: - gSprites[gTasks[taskIdC].data[3]].data0 = 2; - gTasks[taskIdC].data[0] = 50; + gSprites[gTasks[taskIdC].data[TDC_3]].data0 = 2; + gTasks[taskIdC].data[TDC_0] = 50; break; case 20: - gSprites[gTasks[taskIdC].data[2]].data0 = 4; - gTasks[taskIdC].data[0] = 50; + gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 4; + gTasks[taskIdC].data[TDC_0] = 50; break; case 30: - gSprites[gTasks[taskIdC].data[2]].data0 = 5; - gSprites[gTasks[taskIdC].data[3]].data0 = 3; - gTasks[taskIdC].data[0] = 50; + gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 5; + gSprites[gTasks[taskIdC].data[TDC_3]].data0 = 3; + gTasks[taskIdC].data[TDC_0] = 50; break; case 50: - gTasks[taskIdC].data[0] = 0; + gTasks[taskIdC].data[TDC_0] = 0; break; } } @@ -1205,119 +1208,39 @@ static void sub_81450AC(u8 taskIdA) gUnknown_0203935C = 1; } -__attribute__((naked)) -void sub_8145128(u16 arg0, u16 arg1, u16 arg2) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - adds r3, r0, 0\n\ - adds r4, r2, 0\n\ - lsls r3, 16\n\ - lsrs r3, 16\n\ - lsls r1, 16\n\ - lsrs r7, r1, 16\n\ - lsls r4, 16\n\ - lsrs r5, r4, 16\n\ - ldr r0, _081451EC @ =gCreditsCopyrightEnd_Gfx\n\ - movs r6, 0xC0\n\ - lsls r6, 19\n\ - adds r3, r6\n\ - adds r1, r3, 0\n\ - bl LZ77UnCompVram\n\ - ldr r0, _081451F0 @ =gIntroCopyright_Pal\n\ - adds r1, r5, 0\n\ - movs r2, 0x20\n\ - bl LoadPalette\n\ - lsrs r4, 20\n\ - lsls r4, 28\n\ - lsrs r4, 16\n\ - movs r2, 0\n\ - adds r1, r4, 0x1\n\ - ldr r3, _081451F4 @ =0x000003ff\n\ -_0814515E:\n\ - lsls r0, r2, 1\n\ - adds r0, r7\n\ - adds r0, r6\n\ - strh r1, [r0]\n\ - adds r0, r2, 0x1\n\ - lsls r0, 16\n\ - lsrs r2, r0, 16\n\ - cmp r2, r3\n\ - bls _0814515E\n\ - movs r2, 0\n\ - adds r0, r4, 0x2\n\ - adds r6, r4, 0\n\ - adds r6, 0x17\n\ - movs r1, 0x2B\n\ - adds r1, r4\n\ - mov r12, r1\n\ - adds r4, 0x42\n\ - ldr r5, _081451F8 @ =0x060001c8\n\ - adds r3, r0, 0\n\ -_08145184:\n\ - lsls r0, r2, 1\n\ - adds r0, r7\n\ - adds r0, r5\n\ - adds r1, r2, r3\n\ - strh r1, [r0]\n\ - adds r0, r2, 0x1\n\ - lsls r0, 16\n\ - lsrs r2, r0, 16\n\ - cmp r2, 0x14\n\ - bls _08145184\n\ - movs r2, 0\n\ - ldr r5, _081451FC @ =0x06000248\n\ - adds r3, r6, 0\n\ -_0814519E:\n\ - lsls r0, r2, 1\n\ - adds r0, r7\n\ - adds r0, r5\n\ - adds r1, r2, r3\n\ - strh r1, [r0]\n\ - adds r0, r2, 0x1\n\ - lsls r0, 16\n\ - lsrs r2, r0, 16\n\ - cmp r2, 0x13\n\ - bls _0814519E\n\ - movs r2, 0\n\ - ldr r5, _08145200 @ =0x060002c8\n\ - mov r3, r12\n\ -_081451B8:\n\ - lsls r0, r2, 1\n\ - adds r0, r7\n\ - adds r0, r5\n\ - adds r1, r2, r3\n\ - strh r1, [r0]\n\ - adds r0, r2, 0x1\n\ - lsls r0, 16\n\ - lsrs r2, r0, 16\n\ - cmp r2, 0x16\n\ - bls _081451B8\n\ - movs r2, 0\n\ - ldr r3, _08145204 @ =0x06000348\n\ -_081451D0:\n\ - lsls r0, r2, 1\n\ - adds r0, r7\n\ - adds r0, r3\n\ - adds r1, r2, r4\n\ - strh r1, [r0]\n\ - adds r0, r2, 0x1\n\ - lsls r0, 16\n\ - lsrs r2, r0, 16\n\ - cmp r2, 0xB\n\ - bls _081451D0\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_081451EC: .4byte gCreditsCopyrightEnd_Gfx\n\ -_081451F0: .4byte gIntroCopyright_Pal\n\ -_081451F4: .4byte 0x000003ff\n\ -_081451F8: .4byte 0x060001c8\n\ -_081451FC: .4byte 0x06000248\n\ -_08145200: .4byte 0x060002c8\n\ -_08145204: .4byte 0x06000348\n\ - .syntax divided\n"); +static void sub_8145128(u16 arg0, u16 arg1, u16 arg2) { + u16 baseTile; + u16 i; + + LZ77UnCompVram(gCreditsCopyrightEnd_Gfx, (void *) (VRAM + arg0)); + LoadPalette(gIntroCopyright_Pal, arg2, sizeof(gIntroCopyright_Pal)); + + baseTile = (arg2 / 16) << 12; + + for (i = 0; i < 32 * 32; i++) + { + ((u16 *) (VRAM + arg1))[i] = baseTile + 1; + } + + for (i = 0; i < 21; i++) + { + ((u16 *) (VRAM + arg1))[7 * 32 + 4 + i] = i + 2 + baseTile; + } + + for (i = 0; i < 20; i++) + { + ((u16 *) (VRAM + arg1))[9 * 32 + 4 + i] = i + 23 + baseTile; + } + + for (i = 0; i < 23; i++) + { + ((u16 *) (VRAM + arg1))[11 * 32 + 4 + i] = i + 43 + baseTile; + } + + for (i = 0; i < 12; i++) + { + ((u16 *) (VRAM + arg1))[13 * 32 + 4 + i] = i + 66 + baseTile; + } } u16 sub_8145208(u8 arg0) @@ -1332,106 +1255,45 @@ u16 sub_8145208(u8 arg0) if (arg0 & (1 << 7)) { - out |= 0x800; + out |= 1 << 11; } if (arg0 & (1 << 6)) { - out |= 0x400; + out |= 1 << 10; } return out; } -__attribute__((naked)) -void sub_814524C(void *arg0, u8 arg1, u8 arg2, u16 arg3, int arg4) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0xC\n\ - str r0, [sp]\n\ - ldr r0, [sp, 0x2C]\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - mov r10, r1\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - str r2, [sp, 0x4]\n\ - lsls r3, 16\n\ - lsrs r3, 16\n\ - str r3, [sp, 0x8]\n\ - lsls r0, 16\n\ - lsrs r0, 20\n\ - lsls r0, 28\n\ - lsrs r0, 16\n\ - mov r9, r0\n\ - movs r5, 0\n\ -_0814527A:\n\ - movs r4, 0\n\ - lsls r7, r5, 1\n\ - ldr r1, [sp, 0x4]\n\ - adds r0, r1, r5\n\ - adds r2, r5, 0x1\n\ - mov r8, r2\n\ - lsls r0, 6\n\ - ldr r1, [sp, 0x8]\n\ - adds r6, r0, r1\n\ -_0814528C:\n\ - adds r0, r7, r5\n\ - adds r0, r4\n\ - ldr r2, [sp]\n\ - adds r0, r2, r0\n\ - ldrb r0, [r0]\n\ - bl sub_8145208\n\ - mov r2, r10\n\ - adds r1, r2, r4\n\ - lsls r1, 1\n\ - adds r1, r6\n\ - movs r2, 0xC0\n\ - lsls r2, 19\n\ - adds r1, r2\n\ - add r0, r9\n\ - strh r0, [r1]\n\ - adds r0, r4, 0x1\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - cmp r4, 0x2\n\ - bls _0814528C\n\ - mov r1, r8\n\ - lsls r0, r1, 24\n\ - lsrs r5, r0, 24\n\ - cmp r5, 0x4\n\ - bls _0814527A\n\ - add sp, 0xC\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); +void sub_814524C(u8 arg0[], u8 baseX, u8 baseY, u16 arg3, u16 palette) { + u8 y, x; + + const u16 tileOffset = (palette / 16) << 12; + + for (y = 0; y < 5; y++) + { + for (x = 0; x < 3; x++) + { + ((u16 *) (VRAM + arg3 + (baseY + y) * 64))[baseX + x] = tileOffset + sub_8145208(arg0[y * 3 + x]); + } + } } -static void sub_81452D0(u16 arg0, u16 arg1) +static void sub_81452D0(u16 arg0, u16 palette) { - u16 i; - u16 foo = arg1 / 16; - u16 bar = foo * 4096; - - for (i = 0; i < 0x400; i++) - ((u16 *)(VRAM + arg0))[i] = bar + 1; - - sub_814524C(&gUnknown_0840B83C, 3, 7, arg0, arg1); - sub_814524C(&gUnknown_0840B84B, 7, 7, arg0, arg1); - sub_814524C(&gUnknown_0840B85A, 11, 7, arg0, arg1); - sub_814524C(&gUnknown_0840B85A, 16, 7, arg0, arg1); - sub_814524C(&gUnknown_0840B869, 20, 7, arg0, arg1); - sub_814524C(&gUnknown_0840B878, 24, 7, arg0, arg1); + u16 pos; + u16 baseTile = (palette / 16) << 12; + + for (pos = 0; pos < 32 * 32; pos++) + ((u16 *) (VRAM + arg0))[pos] = baseTile + 1; + + sub_814524C(gUnknown_0840B83C, 3, 7, arg0, palette); + sub_814524C(gUnknown_0840B84B, 7, 7, arg0, palette); + sub_814524C(gUnknown_0840B85A, 11, 7, arg0, palette); + sub_814524C(gUnknown_0840B85A, 16, 7, arg0, palette); + sub_814524C(gUnknown_0840B869, 20, 7, arg0, palette); + sub_814524C(gUnknown_0840B878, 24, 7, arg0, palette); } static void spritecb_player_8145378(struct Sprite *sprite) @@ -1538,268 +1400,121 @@ static void spritecb_rival_8145420(struct Sprite *sprite) } } -__attribute__((naked)) -void spritecb_81454E0(struct Sprite *sprite) -{ - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - sub sp, 0x4\n\ - adds r5, r0, 0\n\ - ldr r0, _081454F8 @ =gUnknown_0203935C\n\ - movs r1, 0\n\ - ldrsh r0, [r0, r1]\n\ - cmp r0, 0\n\ - beq _081454FC\n\ - adds r0, r5, 0\n\ - bl DestroySprite\n\ - b _081456A6\n\ - .align 2, 0\n\ -_081454F8: .4byte gUnknown_0203935C\n\ -_081454FC:\n\ - ldrh r0, [r5, 0x3C]\n\ - adds r0, 0x1\n\ - strh r0, [r5, 0x3C]\n\ - movs r2, 0x2E\n\ - ldrsh r0, [r5, r2]\n\ - cmp r0, 0xA\n\ - bhi _08145544\n\ - lsls r0, 2\n\ - ldr r1, _08145514 @ =_08145518\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_08145514: .4byte _08145518\n\ - .align 2, 0\n\ -_08145518:\n\ - .4byte _08145544\n\ - .4byte _0814559E\n\ - .4byte _08145620\n\ - .4byte _08145660\n\ - .4byte _08145544\n\ - .4byte _08145544\n\ - .4byte _08145544\n\ - .4byte _08145544\n\ - .4byte _08145544\n\ - .4byte _08145544\n\ - .4byte _08145696\n\ -_08145544:\n\ - ldrb r1, [r5, 0x1]\n\ - movs r0, 0x4\n\ - negs r0, r0\n\ - ands r0, r1\n\ - movs r1, 0x1\n\ - orrs r0, r1\n\ - strb r0, [r5, 0x1]\n\ - movs r0, 0x30\n\ - ldrsh r1, [r5, r0]\n\ - movs r0, 0x1F\n\ - ands r1, r0\n\ - lsls r1, 1\n\ - ldrb r2, [r5, 0x3]\n\ - movs r0, 0x3F\n\ - negs r0, r0\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strb r0, [r5, 0x3]\n\ - movs r0, 0x10\n\ - strh r0, [r5, 0x32]\n\ - ldrh r4, [r5, 0x30]\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - movs r0, 0x80\n\ - lsls r0, 9\n\ - movs r1, 0x10\n\ - bl __divsi3\n\ - adds r1, r0, 0\n\ - str r1, [sp]\n\ - adds r0, r4, 0\n\ - movs r2, 0\n\ - movs r3, 0\n\ - bl SetOamMatrix\n\ - adds r2, r5, 0\n\ - adds r2, 0x3E\n\ - ldrb r1, [r2]\n\ - movs r0, 0x5\n\ - negs r0, r0\n\ - ands r0, r1\n\ - strb r0, [r2]\n\ - movs r0, 0x1\n\ - strh r0, [r5, 0x2E]\n\ - b _081456A6\n\ -_0814559E:\n\ - ldrh r1, [r5, 0x32]\n\ - movs r2, 0x32\n\ - ldrsh r0, [r5, r2]\n\ - cmp r0, 0xFF\n\ - bgt _081455D4\n\ - adds r0, r1, 0\n\ - adds r0, 0x8\n\ - strh r0, [r5, 0x32]\n\ - ldrh r4, [r5, 0x30]\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - movs r0, 0x32\n\ - ldrsh r1, [r5, r0]\n\ - movs r0, 0x80\n\ - lsls r0, 9\n\ - bl __divsi3\n\ - adds r1, r0, 0\n\ - lsls r1, 16\n\ - lsrs r1, 16\n\ - str r1, [sp]\n\ - adds r0, r4, 0\n\ - movs r2, 0\n\ - movs r3, 0\n\ - bl SetOamMatrix\n\ - b _081455DA\n\ -_081455D4:\n\ - ldrh r0, [r5, 0x2E]\n\ - adds r0, 0x1\n\ - strh r0, [r5, 0x2E]\n\ -_081455DA:\n\ - movs r2, 0x30\n\ - ldrsh r1, [r5, r2]\n\ - cmp r1, 0x2\n\ - beq _081456A6\n\ - cmp r1, 0x2\n\ - bgt _081455EC\n\ - cmp r1, 0x1\n\ - beq _081455F2\n\ - b _081456A6\n\ -_081455EC:\n\ - cmp r1, 0x3\n\ - beq _0814560A\n\ - b _081456A6\n\ -_081455F2:\n\ - ldrh r1, [r5, 0x3C]\n\ - movs r0, 0x3\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08145602\n\ - ldrh r0, [r5, 0x22]\n\ - adds r0, 0x1\n\ - strh r0, [r5, 0x22]\n\ -_08145602:\n\ - ldrh r0, [r5, 0x20]\n\ - subs r0, 0x2\n\ - strh r0, [r5, 0x20]\n\ - b _081456A6\n\ -_0814560A:\n\ - ldrh r0, [r5, 0x3C]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _08145618\n\ - ldrh r0, [r5, 0x22]\n\ - adds r0, 0x1\n\ - strh r0, [r5, 0x22]\n\ -_08145618:\n\ - ldrh r0, [r5, 0x20]\n\ - adds r0, 0x2\n\ - strh r0, [r5, 0x20]\n\ - b _081456A6\n\ -_08145620:\n\ - ldrh r1, [r5, 0x34]\n\ - movs r2, 0x34\n\ - ldrsh r0, [r5, r2]\n\ - cmp r0, 0\n\ - beq _08145630\n\ - subs r0, r1, 0x1\n\ - strh r0, [r5, 0x34]\n\ - b _081456A6\n\ -_08145630:\n\ - ldr r1, _0814565C @ =REG_BLDCNT\n\ - movs r2, 0xF4\n\ - lsls r2, 4\n\ - adds r0, r2, 0\n\ - strh r0, [r1]\n\ - adds r1, 0x2\n\ - movs r0, 0x10\n\ - strh r0, [r1]\n\ - ldrb r1, [r5, 0x1]\n\ - movs r0, 0xD\n\ - negs r0, r0\n\ - ands r0, r1\n\ - movs r1, 0x4\n\ - orrs r0, r1\n\ - strb r0, [r5, 0x1]\n\ - movs r0, 0x10\n\ - strh r0, [r5, 0x34]\n\ - ldrh r0, [r5, 0x2E]\n\ - adds r0, 0x1\n\ - strh r0, [r5, 0x2E]\n\ - b _081456A6\n\ - .align 2, 0\n\ -_0814565C: .4byte REG_BLDCNT\n\ -_08145660:\n\ - ldrh r1, [r5, 0x34]\n\ - movs r2, 0x34\n\ - ldrsh r0, [r5, r2]\n\ - cmp r0, 0\n\ - beq _08145684\n\ - subs r1, 0x1\n\ - strh r1, [r5, 0x34]\n\ - ldr r3, _08145680 @ =REG_BLDALPHA\n\ - movs r0, 0x34\n\ - ldrsh r2, [r5, r0]\n\ - movs r0, 0x10\n\ - subs r0, r2\n\ - lsls r0, 8\n\ - adds r1, r0\n\ - strh r1, [r3]\n\ - b _081456A6\n\ - .align 2, 0\n\ -_08145680: .4byte REG_BLDALPHA\n\ -_08145684:\n\ - adds r2, r5, 0\n\ - adds r2, 0x3E\n\ - ldrb r0, [r2]\n\ - movs r1, 0x4\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - movs r0, 0xA\n\ - strh r0, [r5, 0x2E]\n\ - b _081456A6\n\ -_08145696:\n\ - ldr r0, _081456B0 @ =REG_BLDCNT\n\ - movs r1, 0\n\ - strh r1, [r0]\n\ - adds r0, 0x2\n\ - strh r1, [r0]\n\ - adds r0, r5, 0\n\ - bl DestroySprite\n\ -_081456A6:\n\ - add sp, 0x4\n\ - pop {r4,r5}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_081456B0: .4byte REG_BLDCNT\n\ - .syntax divided\n"); +void spritecb_81454E0(struct Sprite *sprite) { + if (gUnknown_0203935C) + { + DestroySprite(sprite); + return; + } + + sprite->data7 += 1; + switch (sprite->data0) + { + case 0: + default: + sprite->oam.affineMode = 1; + sprite->oam.matrixNum = sprite->data1; + sprite->data2 = 16; + SetOamMatrix(sprite->data1, 0x10000 / sprite->data2, 0, 0, 0x10000 / sprite->data2); + sprite->invisible = FALSE; + sprite->data0 = 1; + break; + + case 1: + if (sprite->data2 < 256) + { + sprite->data2 += 8; + SetOamMatrix(sprite->data1, 0x10000 / sprite->data2, 0, 0, 0x10000 / sprite->data2); + } + else + { + sprite->data0 += 1; + } + switch (sprite->data1) + { + case 1: + if ((sprite->data7 & 3) == 0) + { + sprite->pos1.y += 1; + } + sprite->pos1.x -= 2; + break; + case 2: + break; + case 3: + if ((sprite->data7 & 3) == 0) + { + sprite->pos1.y += 1; + } + sprite->pos1.x += 2; + break; + } + break; + + case 2: + if (sprite->data3 != 0) + { + sprite->data3 -= 1; + } + else + { + REG_BLDCNT = 0xF40; + REG_BLDALPHA = 0x10; + sprite->oam.objMode = 1; + sprite->data3 = 16; + sprite->data0 += 1; + } + break; + + case 3: + if (sprite->data3 != 0) + { + int data3; + vu16 *reg; + + sprite->data3 -= 1; + + reg = ®_BLDALPHA; + data3 = 16 - sprite->data3; + *reg = (data3 << 8) + sprite->data3; + } + else + { + sprite->invisible = TRUE; + sprite->data0 = 10; + } + break; + + case 10: + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + DestroySprite(sprite); + break; + + } } -#ifdef NONMATCHING -u8 sub_81456B4(u16 nationalNum, u16 x, u16 y, u16 arg3) +static u8 sub_81456B4(u16 species, u16 x, u16 y, u16 position) { - u32 species; u32 personality; void *palette; u8 spriteId; u8 spriteId2; - species = NationalPokedexNumToSpecies(nationalNum); + species = NationalPokedexNumToSpecies(species); + switch (species) { - case SPECIES_UNOWN: - personality = gSaveBlock2.pokedex.unownPersonality; + default: + personality = 0; break; case SPECIES_SPINDA: personality = gSaveBlock2.pokedex.spindaPersonality; break; - default: - personality = 0; + case SPECIES_UNOWN: + personality = gSaveBlock2.pokedex.unownPersonality; break; } @@ -1808,196 +1523,30 @@ u8 sub_81456B4(u16 nationalNum, u16 x, u16 y, u16 arg3) gMonFrontPicCoords[species].x, gMonFrontPicCoords[species].y, 0x2000000, - gUnknown_0840B5A0[arg3], + gUnknown_0840B5A0[position], species, personality, 1 ); palette = species_and_otid_get_pal(species, 0, 0xFFFF); - LoadCompressedPalette(palette, 0x100 + (arg3 * 16), 0x20); - sub_8143648(arg3, arg3); + LoadCompressedPalette(palette, 0x100 + (position * 16), 0x20); + sub_8143648(position, position); spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0); - gSprites[spriteId].oam.paletteNum = arg3; + gSprites[spriteId].oam.paletteNum = position; gSprites[spriteId].oam.priority = 1; - gSprites[spriteId].data1 = arg3 + 1; + gSprites[spriteId].data1 = position + 1; gSprites[spriteId].invisible = TRUE; gSprites[spriteId].callback = spritecb_81454E0; spriteId2 = CreateSprite(&gSpriteTemplate_840CAEC, gSprites[spriteId].pos1.x, gSprites[spriteId].pos1.y, 1); gSprites[spriteId2].data0 = spriteId; - StartSpriteAnimIfDifferent(&gSprites[spriteId2], arg3); + StartSpriteAnimIfDifferent(&gSprites[spriteId2], position); return spriteId; } -#else -__attribute__((naked)) -u8 sub_81456B4(u16 nationalNum, u16 x, u16 y, u16 arg3) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x14\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ - lsls r1, 16\n\ - lsrs r1, 16\n\ - mov r10, r1\n\ - lsls r2, 16\n\ - lsrs r2, 16\n\ - str r2, [sp, 0x10]\n\ - lsls r3, 16\n\ - lsrs r3, 16\n\ - mov r9, r3\n\ - adds r0, r6, 0\n\ - bl NationalPokedexNumToSpecies\n\ - adds r6, r0, 0\n\ - cmp r6, 0xC9\n\ - beq _081456F8\n\ - movs r0, 0x9A\n\ - lsls r0, 1\n\ - cmp r6, r0\n\ - beq _081456EE\n\ - movs r7, 0\n\ - b _081456FC\n\ -_081456EE:\n\ - ldr r0, _081456F4 @ =gSaveBlock2\n\ - ldr r7, [r0, 0x20]\n\ - b _081456FC\n\ - .align 2, 0\n\ -_081456F4: .4byte gSaveBlock2\n\ -_081456F8:\n\ - ldr r0, _081457E8 @ =gSaveBlock2\n\ - ldr r7, [r0, 0x1C]\n\ -_081456FC:\n\ - lsls r0, r6, 3\n\ - ldr r1, _081457EC @ =gMonFrontPicTable\n\ - adds r0, r1\n\ - ldr r1, _081457F0 @ =gMonFrontPicCoords\n\ - lsls r2, r6, 2\n\ - adds r2, r1\n\ - ldrb r1, [r2]\n\ - ldrb r2, [r2, 0x1]\n\ - movs r3, 0x80\n\ - lsls r3, 18\n\ - ldr r4, _081457F4 @ =gUnknown_0840B5A0\n\ - mov r8, r4\n\ - mov r5, r9\n\ - lsls r4, r5, 2\n\ - add r4, r8\n\ - ldr r4, [r4]\n\ - str r4, [sp]\n\ - str r6, [sp, 0x4]\n\ - str r7, [sp, 0x8]\n\ - movs r4, 0x1\n\ - str r4, [sp, 0xC]\n\ - bl LoadSpecialPokePic\n\ - ldr r2, _081457F8 @ =0x0000ffff\n\ - adds r0, r6, 0\n\ - movs r1, 0\n\ - bl species_and_otid_get_pal\n\ - lsls r5, 4\n\ - mov r8, r5\n\ - movs r1, 0x80\n\ - lsls r1, 1\n\ - add r1, r8\n\ - lsls r1, 16\n\ - lsrs r1, 16\n\ - movs r2, 0x20\n\ - bl LoadCompressedPalette\n\ - mov r7, r9\n\ - lsls r6, r7, 24\n\ - lsrs r6, 24\n\ - mov r0, r9\n\ - adds r1, r6, 0\n\ - bl sub_8143648\n\ - ldr r0, _081457FC @ =gUnknown_02024E8C\n\ - mov r2, r10\n\ - lsls r1, r2, 16\n\ - asrs r1, 16\n\ - ldr r3, [sp, 0x10]\n\ - lsls r2, r3, 16\n\ - asrs r2, 16\n\ - movs r3, 0\n\ - bl CreateSprite\n\ - adds r4, r0, 0\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - ldr r5, _08145800 @ =gSprites\n\ - lsls r2, r4, 4\n\ - adds r2, r4\n\ - lsls r2, 2\n\ - adds r3, r2, r5\n\ - ldrb r1, [r3, 0x5]\n\ - movs r0, 0xF\n\ - ands r0, r1\n\ - mov r7, r8\n\ - orrs r0, r7\n\ - movs r1, 0xD\n\ - negs r1, r1\n\ - ands r0, r1\n\ - movs r1, 0x4\n\ - orrs r0, r1\n\ - strb r0, [r3, 0x5]\n\ - mov r0, r9\n\ - adds r0, 0x1\n\ - strh r0, [r3, 0x30]\n\ - movs r0, 0x3E\n\ - adds r0, r3\n\ - mov r8, r0\n\ - ldrb r0, [r0]\n\ - orrs r0, r1\n\ - mov r1, r8\n\ - strb r0, [r1]\n\ - adds r0, r5, 0\n\ - adds r0, 0x1C\n\ - adds r2, r0\n\ - ldr r0, _08145804 @ =spritecb_81454E0\n\ - str r0, [r2]\n\ - ldr r0, _08145808 @ =gSpriteTemplate_840CAEC\n\ - movs r2, 0x20\n\ - ldrsh r1, [r3, r2]\n\ - movs r7, 0x22\n\ - ldrsh r2, [r3, r7]\n\ - movs r3, 0x1\n\ - bl CreateSprite\n\ - adds r1, r0, 0\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r5\n\ - strh r4, [r0, 0x2E]\n\ - adds r1, r6, 0\n\ - bl StartSpriteAnimIfDifferent\n\ - adds r0, r4, 0\n\ - add sp, 0x14\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_081457E8: .4byte gSaveBlock2\n\ -_081457EC: .4byte gMonFrontPicTable\n\ -_081457F0: .4byte gMonFrontPicCoords\n\ -_081457F4: .4byte gUnknown_0840B5A0\n\ -_081457F8: .4byte 0x0000ffff\n\ -_081457FC: .4byte gUnknown_02024E8C\n\ -_08145800: .4byte gSprites\n\ -_08145804: .4byte spritecb_81454E0\n\ -_08145808: .4byte gSpriteTemplate_840CAEC\n\ - .syntax divided\n"); -} -#endif void spritecb_814580C(struct Sprite *sprite) { @@ -2015,223 +1564,79 @@ void spritecb_814580C(struct Sprite *sprite) sprite->pos1.y = gSprites[sprite->data0].pos1.y; } -__attribute__((naked)) -void sub_81458DC(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - ldr r7, _0814597C @ =0x0201c000\n\ - ldr r0, _08145980 @ =0x00004023\n\ - bl VarGet\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - bl GetStarterPokemon\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - bl SpeciesToNationalPokedexNum\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - mov r10, r0\n\ - movs r4, 0x1\n\ - movs r5, 0\n\ - ldr r0, _08145984 @ =0x00000181\n\ - mov r8, r0\n\ -_0814590E:\n\ - adds r0, r4, 0\n\ - movs r1, 0x1\n\ - bl sub_8090D90\n\ - lsls r0, 24\n\ - adds r6, r7, 0\n\ - adds r6, 0x90\n\ - cmp r0, 0\n\ - beq _0814592C\n\ - lsls r0, r5, 1\n\ - adds r0, r6, r0\n\ - strh r4, [r0]\n\ - adds r0, r5, 0x1\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ -_0814592C:\n\ - adds r0, r4, 0x1\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - cmp r4, r8\n\ - bls _0814590E\n\ - adds r4, r5, 0\n\ - ldr r0, _08145984 @ =0x00000181\n\ - lsls r1, r4, 16\n\ - mov r9, r1\n\ - movs r2, 0x8E\n\ - adds r2, r7\n\ - mov r8, r2\n\ - adds r1, r7, 0\n\ - adds r1, 0x86\n\ - str r1, [sp]\n\ - cmp r4, r0\n\ - bhi _08145964\n\ - adds r1, r6, 0\n\ - movs r3, 0\n\ - adds r2, r0, 0\n\ -_08145954:\n\ - lsls r0, r4, 1\n\ - adds r0, r1, r0\n\ - strh r3, [r0]\n\ - adds r0, r4, 0x1\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - cmp r4, r2\n\ - bls _08145954\n\ -_08145964:\n\ - movs r2, 0xE5\n\ - lsls r2, 2\n\ - adds r0, r7, r2\n\ - strh r5, [r0]\n\ - mov r1, r9\n\ - lsrs r0, r1, 16\n\ - cmp r0, 0x43\n\ - bhi _08145988\n\ - mov r2, r8\n\ - strh r5, [r2]\n\ - b _0814598E\n\ - .align 2, 0\n\ -_0814597C: .4byte 0x0201c000\n\ -_08145980: .4byte 0x00004023\n\ -_08145984: .4byte 0x00000181\n\ -_08145988:\n\ - movs r0, 0x44\n\ - mov r1, r8\n\ - strh r0, [r1]\n\ -_0814598E:\n\ - movs r5, 0\n\ - movs r2, 0xE5\n\ - lsls r2, 2\n\ - adds r4, r7, r2\n\ - mov r9, r5\n\ - b _0814599E\n\ -_0814599A:\n\ - cmp r5, 0x43\n\ - bhi _081459EE\n\ -_0814599E:\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - ldrh r1, [r4]\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - lsrs r2, r0, 16\n\ - lsls r1, r5, 1\n\ - adds r1, r7, r1\n\ - lsls r0, r2, 1\n\ - adds r3, r6, r0\n\ - ldrh r0, [r3]\n\ - strh r0, [r1]\n\ - adds r0, r5, 0x1\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - mov r0, r9\n\ - strh r0, [r3]\n\ - ldrh r0, [r4]\n\ - subs r0, 0x1\n\ - strh r0, [r4]\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r2, r0\n\ - beq _081459E8\n\ - ldrh r0, [r4]\n\ - lsls r0, 1\n\ - adds r0, r6, r0\n\ - ldrh r0, [r0]\n\ - strh r0, [r3]\n\ - ldrh r0, [r4]\n\ - lsls r0, 1\n\ - adds r0, r6, r0\n\ - mov r1, r9\n\ - strh r1, [r0]\n\ -_081459E8:\n\ - ldrh r0, [r4]\n\ - cmp r0, 0\n\ - bne _0814599A\n\ -_081459EE:\n\ - mov r2, r8\n\ - ldrh r0, [r2]\n\ - cmp r0, 0x43\n\ - bhi _08145A26\n\ - adds r5, r0, 0\n\ - movs r2, 0\n\ - cmp r5, 0x43\n\ - bhi _08145A5C\n\ - mov r3, r8\n\ -_08145A00:\n\ - lsls r1, r5, 1\n\ - adds r1, r7, r1\n\ - lsls r0, r2, 1\n\ - adds r0, r7, r0\n\ - ldrh r0, [r0]\n\ - strh r0, [r1]\n\ - adds r0, r2, 0x1\n\ - lsls r0, 16\n\ - lsrs r2, r0, 16\n\ - ldrh r0, [r3]\n\ - cmp r2, r0\n\ - bne _08145A1A\n\ - movs r2, 0\n\ -_08145A1A:\n\ - adds r0, r5, 0x1\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - cmp r5, 0x43\n\ - bls _08145A00\n\ - b _08145A5C\n\ -_08145A26:\n\ - movs r4, 0\n\ - ldrh r0, [r7]\n\ - cmp r0, r10\n\ - beq _08145A42\n\ -_08145A2E:\n\ - adds r0, r4, 0x1\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - lsls r0, r4, 1\n\ - adds r0, r7, r0\n\ - ldrh r0, [r0]\n\ - cmp r0, r10\n\ - beq _08145A42\n\ - cmp r4, 0x43\n\ - bls _08145A2E\n\ -_08145A42:\n\ - mov r1, r8\n\ - ldrh r0, [r1]\n\ - subs r0, 0x1\n\ - cmp r4, r0\n\ - bge _08145A5C\n\ - lsls r0, r4, 1\n\ - adds r0, r7, r0\n\ - ldr r2, [sp]\n\ - ldrh r1, [r2]\n\ - strh r1, [r0]\n\ - mov r0, r10\n\ - strh r0, [r2]\n\ - b _08145A62\n\ -_08145A5C:\n\ - mov r2, r10\n\ - ldr r1, [sp]\n\ - strh r2, [r1]\n\ -_08145A62:\n\ - movs r0, 0x44\n\ - mov r1, r8\n\ - strh r0, [r1]\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); +static void sub_81458DC(void) { + struct Unk201C000 *unk201C000 = &ewram1c000; + u16 starter = SpeciesToNationalPokedexNum(GetStarterPokemon(VarGet(VAR_FIRST_POKE))); + u16 seenTypesCount; + u16 page; + u16 dexNum; + u16 j; + + for (dexNum = 1, seenTypesCount = 0; dexNum < 386; dexNum++) + { + if (sub_8090D90(dexNum, 1)) + { + unk201C000->unk90[seenTypesCount] = dexNum; + seenTypesCount++; + } + } + + for (dexNum = seenTypesCount; dexNum < 386; dexNum++) + { + unk201C000->unk90[dexNum] = 0; + } + + unk201C000->unk394 = seenTypesCount; + if (unk201C000->unk394 < POKEMON_TILE_COUNT) + { + unk201C000->unk8E = seenTypesCount; + } + else + { + unk201C000->unk8E = POKEMON_TILE_COUNT; + } + + j = 0; + do + { + page = Random() % unk201C000->unk394; + unk201C000->unk0[j] = unk201C000->unk90[page]; + + j++; + unk201C000->unk90[page] = 0; + unk201C000->unk394--; + if (page != unk201C000->unk394) + { + unk201C000->unk90[page] = unk201C000->unk90[unk201C000->unk394]; + unk201C000->unk90[unk201C000->unk394] = 0; + } + } + while (unk201C000->unk394 != 0 && j < POKEMON_TILE_COUNT); + + if (unk201C000->unk8E < POKEMON_TILE_COUNT) + { + for (j = unk201C000->unk8E, page = 0; j < POKEMON_TILE_COUNT; j++) + { + unk201C000->unk0[j] = unk201C000->unk0[page]; + + page++; + if (page == unk201C000->unk8E) + page = 0; + } + unk201C000->unk0[POKEMON_TILE_COUNT - 1] = starter; + } + else + { + + for (dexNum = 0; unk201C000->unk0[dexNum] != starter && dexNum < POKEMON_TILE_COUNT; dexNum++); + + if (dexNum < unk201C000->unk8E - 1) + { + unk201C000->unk0[dexNum] = unk201C000->unk0[POKEMON_TILE_COUNT - 1]; + unk201C000->unk0[POKEMON_TILE_COUNT - 1] = starter; + } + else + unk201C000->unk0[POKEMON_TILE_COUNT - 1] = starter; + } + unk201C000->unk8E = POKEMON_TILE_COUNT; } diff --git a/src/daycare.c b/src/daycare.c index 1729efb2a..92be45cfa 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -1,8 +1,11 @@ #include "global.h" #include "pokemon.h" #include "string_util.h" +#include "asm.h" -u8 *pokemon_get_nick(struct Pokemon *mon, u8 *dest) +extern u8 gLastFieldPokeMenuOpened; + +u8 *GetMonNick(struct Pokemon *mon, u8 *dest) { s8 nickname[POKEMON_NAME_LENGTH * 2]; @@ -10,7 +13,7 @@ u8 *pokemon_get_nick(struct Pokemon *mon, u8 *dest) return StringCopy10(dest, nickname); } -u8 *pokemon_get_nick_(struct BoxPokemon *mon, u8 *dest) +u8 *GetBoxMonNick(struct BoxPokemon *mon, u8 *dest) { s8 nickname[POKEMON_NAME_LENGTH * 2]; @@ -18,14 +21,368 @@ u8 *pokemon_get_nick_(struct BoxPokemon *mon, u8 *dest) return StringCopy10(dest, nickname); } -u8 daycare_count_pokemon(struct BoxPokemon *daycare_data) +u8 Daycare_CountPokemon(struct BoxPokemon *daycare_data) { u8 i, count; count = 0; - for (i = 0; i <= 1; i++) - if (GetBoxMonData(daycare_data + i, MON_DATA_SPECIES) != 0) + for(i = 0;i <= 1;i++) + if(GetBoxMonData(daycare_data + i, MON_DATA_SPECIES) != 0) count++; return count; } + +#ifndef ASDF +__attribute__((naked)) +void sub_8041324(struct BoxPokemon * box_pokemon, void * void_pointer) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + mov r9, r0\n\ + mov r10, r1\n\ + movs r7, 0\n\ + movs r5, 0\n\ + mov r6, r10\n\ + adds r6, 0x74\n\ + movs r0, 0x1\n\ + mov r8, r0\n\ +_0804133E:\n\ + lsls r0, r5, 2\n\ + adds r0, r5\n\ + lsls r0, 4\n\ + mov r1, r9\n\ + adds r4, r1, r0\n\ + adds r0, r4, 0\n\ + movs r1, 0xB\n\ + bl GetBoxMonData\n\ + cmp r0, 0\n\ + beq _0804136E\n\ + adds r0, r7, 0x1\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + adds r0, r4, 0\n\ + movs r1, 0xC\n\ + bl GetBoxMonData\n\ + adds r1, r0, 0\n\ + cmp r1, 0\n\ + bne _0804136E\n\ + lsls r0, r5, 1\n\ + adds r0, r6, r0\n\ + b _08041374\n\ +_0804136E:\n\ + lsls r0, r5, 1\n\ + adds r0, r6, r0\n\ + mov r1, r8\n\ +_08041374:\n\ + strh r1, [r0]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x1\n\ + bls _0804133E\n\ + mov r0, r10\n\ + str r7, [r0, 0x70]\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif + +s8 Daycare_FindEmptySpot(struct BoxPokemon * daycare_data) +{ + u8 i; + + for(i = 0;i <= 1;i++) + if(GetBoxMonData(daycare_data + i, MON_DATA_SPECIES) == 0) + return i; + + return -1; +} + +/*void Daycare_SendPokemon(struct Pokemon * mon, struct BoxPokemon * daycare_data){ // unfinished + s8 empty_slot; + + empty_slot = Daycare_FindEmptySpot(daycare_data); + if(MonHasMail(mon) != 0){ // if the mon holds a mail? + u8 empty_slot_times_56 = empty_slot * 56; + u8 * something2 = ((u8 *) (daycare_data + 2)) + empty_slot_times_56 + 36; + StringCopy(something2, gSaveBlock2.playerName); + PadNameString(something2, 0xFC); + something2 += 8; + GetMonNick(mon, something2); + u8 pokerus = GetMonData(mon, MON_DATA_64); + something1 += (u8 * daycare_data) +}*/ + +__attribute__((naked)) +void Daycare_SendPokemon() +{ + // strange stack usage - happens because THUMB ARM only allows R0-R7 to be pushed/popped: + // all registers in reglist must be Lo registers, except that PUSH can include the LR, and POP can include the PC + // the ldm/stm section probably copies some struct, but I'm not sure how the code would look + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6,r7}\n\ + adds r7, r0, 0\n\ + mov r8, r1\n\ + mov r0, r8\n\ + bl Daycare_FindEmptySpot\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + mov r9, r4\n\ + adds r0, r7, 0\n\ + bl MonHasMail\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _0804144A\n\ + lsls r0, r4, 24\n\ + asrs r0, 24\n\ + lsls r4, r0, 3\n\ + subs r4, r0\n\ + lsls r4, 3\n\ + adds r5, r4, 0\n\ + adds r5, 0xA0\n\ + add r5, r8\n\ + adds r6, r5, 0\n\ + adds r6, 0x24\n\ + ldr r1, _08041490 @ =gSaveBlock2\n\ + adds r0, r6, 0\n\ + bl StringCopy\n\ + adds r0, r6, 0\n\ + movs r1, 0xFC\n\ + bl PadNameString\n\ + adds r6, 0x8\n\ + adds r0, r7, 0\n\ + adds r1, r6, 0\n\ + bl GetMonNick\n\ + adds r0, r7, 0\n\ + movs r1, 0x40\n\ + bl GetMonData\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + add r4, r8\n\ + ldr r2, _08041494 @ =gSaveBlock1\n\ + lsls r1, r0, 3\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + adds r1, r2\n\ + adds r4, 0xA0\n\ + ldr r0, _08041498 @ =0x00002b4c\n\ + adds r1, r0\n\ + ldm r1!, {r0,r2,r3}\n\ + stm r4!, {r0,r2,r3}\n\ + ldm r1!, {r0,r2,r3}\n\ + stm r4!, {r0,r2,r3}\n\ + ldm r1!, {r0,r2,r3}\n\ + stm r4!, {r0,r2,r3}\n\ + adds r0, r7, 0\n\ + bl TakeMailFromMon\n\ +_0804144A:\n\ + mov r2, r9\n\ + lsls r4, r2, 24\n\ + asrs r4, 24\n\ + lsls r5, r4, 2\n\ + adds r4, r5, r4\n\ + lsls r4, 4\n\ + add r4, r8\n\ + adds r0, r4, 0\n\ + adds r1, r7, 0\n\ + movs r2, 0x50\n\ + bl memcpy\n\ + adds r0, r4, 0\n\ + bl BoxMonRestorePP\n\ + movs r0, 0x88\n\ + lsls r0, 1\n\ + add r0, r8\n\ + adds r0, r5\n\ + movs r1, 0\n\ + str r1, [r0]\n\ + adds r0, r7, 0\n\ + bl ZeroMonData\n\ + bl party_compaction\n\ + bl CalculatePlayerPartyCount\n\ + pop {r3,r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08041490: .4byte gSaveBlock2\n\ +_08041494: .4byte gSaveBlock1\n\ +_08041498: .4byte 0x00002b4c\n\ + .syntax divided\n"); +} + +void Daycare_SendPokemon_Special() +{ + Daycare_SendPokemon(gPlayerParty + gLastFieldPokeMenuOpened, gSaveBlock1.daycareData); +} + +void sub_80417F4(u8 *); + +void sub_80414C0(struct BoxPokemon * daycare_data) +{ + u32 second_species; + if((GetBoxMonData(&daycare_data[1], MON_DATA_SPECIES) != 0) && ((second_species = GetBoxMonData(&daycare_data[0], MON_DATA_SPECIES)) == 0)){ + daycare_data[0] = daycare_data[1]; + ZeroBoxMonData(&daycare_data[1]); + memcpy(daycare_data + 2, (u8 *) (daycare_data + 1) + 0x88, 0x38); + *((u32 *)(daycare_data) + 68) = *((u32 *)(daycare_data) + 69); + *((u32 *)(daycare_data) + 69) = second_species; + sub_80417F4((u8 *) (daycare_data + 1) + 0x88); + } +} + +u8 TryIncrementMonLevel(struct Pokemon *); +extern u16 word_2024E82; + +void sub_804151C(struct Pokemon * mon) +{ + s32 i; + u8 r6; + u16 temp; + + for(i = 0; i < 100; i++){ + if(TryIncrementMonLevel(mon) == FALSE) goto end; + + r6 = 1; + while((temp = sub_803B7C8(mon, r6)) != 0){ + r6 = 0; + if(temp == 0xffff){ + DeleteFirstMoveAndGiveMoveToMon(mon, word_2024E82); + } + } + } + + end: + + CalculateMonStats(mon); +} + +__attribute__((naked)) +u16 sub_8041570(struct BoxPokemon * daycare_data, u8 a2){ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6,r7}\n\ + sub sp, 0x68\n\ + adds r5, r0, 0\n\ + lsls r1, 24\n\ + lsrs r4, r1, 24\n\ + lsls r7, r4, 2\n\ + adds r0, r7, r4\n\ + lsls r0, 4\n\ + adds r6, r5, r0\n\ + ldr r1, _08041640 @ =gStringVar1\n\ + adds r0, r6, 0\n\ + bl GetBoxMonNick\n\ + adds r0, r6, 0\n\ + movs r1, 0xB\n\ + bl GetBoxMonData\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + mov r9, r0\n\ + adds r0, r6, 0\n\ + mov r1, sp\n\ + bl sub_803B4B4\n\ + mov r0, sp\n\ + movs r1, 0x38\n\ + bl GetMonData\n\ + cmp r0, 0x64\n\ + beq _080415D8\n\ + mov r0, sp\n\ + movs r1, 0x19\n\ + bl GetMonData\n\ + movs r2, 0x88\n\ + lsls r2, 1\n\ + adds r1, r5, r2\n\ + adds r1, r7\n\ + ldr r1, [r1]\n\ + adds r0, r1\n\ + str r0, [sp, 0x64]\n\ + add r2, sp, 0x64\n\ + mov r0, sp\n\ + movs r1, 0x19\n\ + bl SetMonData\n\ + mov r0, sp\n\ + bl sub_804151C\n\ +_080415D8:\n\ + ldr r0, _08041644 @ =gPlayerParty\n\ + movs r1, 0xFA\n\ + lsls r1, 1\n\ + adds r1, r0\n\ + mov r8, r1\n\ + mov r0, r8\n\ + mov r1, sp\n\ + movs r2, 0x64\n\ + bl memcpy\n\ + lsls r0, r4, 3\n\ + subs r0, r4\n\ + lsls r1, r0, 3\n\ + adds r0, r5, r1\n\ + adds r0, 0xC0\n\ + ldrh r0, [r0]\n\ + cmp r0, 0\n\ + beq _08041610\n\ + adds r4, r1, 0\n\ + adds r4, 0xA0\n\ + adds r4, r5, r4\n\ + mov r0, r8\n\ + adds r1, r4, 0\n\ + bl GiveMailToMon2\n\ + adds r0, r4, 0\n\ + bl sub_80417F4\n\ +_08041610:\n\ + bl party_compaction\n\ + adds r0, r6, 0\n\ + bl ZeroBoxMonData\n\ + movs r2, 0x88\n\ + lsls r2, 1\n\ + adds r0, r5, r2\n\ + adds r0, r7\n\ + movs r1, 0\n\ + str r1, [r0]\n\ + adds r0, r5, 0\n\ + bl sub_80414C0\n\ + bl CalculatePlayerPartyCount\n\ + mov r0, r9\n\ + add sp, 0x68\n\ + pop {r3,r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_08041640: .4byte gStringVar1\n\ +_08041644: .4byte gPlayerParty\n\ + .syntax divided"); +} + +extern u8 gSpecialVar_0x8004; + +u16 sub_8041648() +{ + return sub_8041570(gSaveBlock1.daycareData, gSpecialVar_0x8004); +} + +u8 Daycare_GetLevelAfterSteps(struct BoxPokemon * mon, u32 steps){ + struct BoxPokemon temp = *mon; + u32 new_exp = GetBoxMonData(mon, MON_DATA_EXP) + steps; + SetBoxMonData(&temp, MON_DATA_EXP, (u8 *) &new_exp); + return GetLevelFromBoxMonExp(&temp); +} diff --git a/src/easy_chat.c b/src/easy_chat.c index 380fe6e4d..86719a2ae 100644 --- a/src/easy_chat.c +++ b/src/easy_chat.c @@ -5,24 +5,254 @@ #include "field_message_box.h" #include "pokedex.h" #include "rng.h" +#include "string_util.h" +#include "strings.h" #include "text.h" +u8 sub_80EB37C(u16); u8 sub_80EB8C0(void); u8 sub_80EB868(u8); u16 sub_80EAE88(u8); void sub_80EB890(u8); u16 sub_80EB784(u16 group); u8 sub_80EAD7C(u8 group); -u8 sub_80EB680(u16 *, u16, u16, u16); +static bool8 sub_80EB680(u16 *, u16, u16, u16); static u16 sub_80EB9D8(void); static u16 sub_80EB960(void); u16 sub_80EB72C(u16); +extern const u8 gSpeciesNames[][11]; +extern u8 gMoveNames[][13]; extern void *gEasyChatGroupWords[]; extern const u8 gEasyChatGroupSizes[]; extern u16 gSpecialVar_0x8004; +extern const u8 gOtherText_ThreeQuestions[]; + +#ifdef NONMATCHING +u8 *sub_80EB3FC(u8 *dst, u16 word) { + int group, wordIndex; + u8 *src; + u16 i; + + + if (sub_80EB37C(word)) + { + return StringCopy(dst, gOtherText_ThreeQuestions); + } + + if (word != 0xFFFF) + { + group = word >> 9; + wordIndex = word & 0x1FF; + switch (group) + { + case EC_GROUP_POKEMON: // 0 + case EC_GROUP_POKEMON_2: // 21 + dst = StringCopy(dst, gSpeciesNames[wordIndex]); + break; + + case EC_GROUP_MOVE_1: // 18 + case EC_GROUP_MOVE_2: // 19 + dst = StringCopy(dst, gMoveNames[wordIndex]); + break; + + default: + src = gEasyChatGroupWords[group]; + + i = wordIndex - 1; + while (i != 0xFFFF) + { + while (*src++ != EOS) + { + } + i--; + } + dst = StringCopy(dst, src); + break; + } + } + + dst[0] = EOS; + return dst; +} +#endif + +u8 *ConvertEasyChatWordsToString(u8 *dst, u16 *words, u16 arg2, u16 arg3) { + u16 i; + u16 n; + + const u16 i1 = arg2 - 1; + + for (i = 0; i < arg3; i++) + { + u16 word; + + for (n = 0; n < i1; n++) + { + dst = sub_80EB3FC(dst, words[0]); + + if (words[0] != 0xFFFF) + { + dst[0] = CHAR_SPACE; + dst++; + } + + words++; + } + + word = words[0]; + words++; + dst = sub_80EB3FC(dst, word); + + dst[0] = 0xFE; + dst++; + } + + dst--; + dst[0] = EOS; + + return dst; +} + +u8 *sub_80EB544(u8 *dst, u16 *words, u16 arg2, u16 arg3) { + u16 i; + u16 n; + + const u16 i1 = arg2 - 1; + + for (i = 0; i < arg3; i++) + { + u16 word; + + for (n = 0; n < i1; n++) + { + dst = sub_80EB3FC(dst, words[0]); + + if (words[0] != 0xFFFF) + { + dst[0] = CHAR_SPACE; + dst++; + } + + words++; + } + + word = words[0]; + words++; + dst = sub_80EB3FC(dst, word); + + // Only difference with ConvertEasyChatWordsToString + dst[0] = (i == 0) ? 0xFE : 0xFA; + dst++; + } + + dst--; + dst[0] = EOS; + + return dst; +} + + +u16 unref_sub_80EB5E0(u16 arg0) { + u8 *chars; + u16 i; + u16 strlen; + int group, word; + + + if (arg0 == 0xFFFF) + { + return 0; + } + + group = arg0 >> 9; + word = arg0 & 0x1FF; + switch (group) + { + case EC_GROUP_POKEMON: // 0 + case EC_GROUP_POKEMON_2: // 21 + chars = (u8 *) gSpeciesNames[word]; + break; + + case EC_GROUP_MOVE_1: // 18 + case EC_GROUP_MOVE_2: // 19 + chars = gMoveNames[word]; + break; + + default: + chars = gEasyChatGroupWords[group]; + + i = word - 1; + while (i != 0xFFFF) + { + while (*chars++ != EOS) + { + } + i--; + } + break; + } + + strlen = 0; + while (*chars != EOS) + { + chars++; + strlen += 1; + } + + return strlen; +} + +static bool8 sub_80EB680(u16 *arg0, u16 arg1, u16 arg2, u16 arg3) { + return FALSE; +} + +void unref_sub_80EB684(u8 arg0, u16 arg1) { + u16 *ptr; + u16 c; + + // FIXME: find actual tv shows used + switch (arg0) + { + case 5: + c = 6; + ptr = (u16*)((void *)&gSaveBlock1.tvShows.shows[arg1] + 0x04); + break; + case 7: + c = 2; + ptr = (u16*)((void *)&gSaveBlock1.tvShows.shows[arg1] + 0x1C); + break; + case 8: + c = 1; + ptr = (u16*)((void *)&gSaveBlock1.tvShows.shows[arg1] + 0x02); + break; + + default: + return; + } + + c -= 1; + while (c != 0xFFFF) + { + *ptr = -1; + ptr++; + c -= 1; + } +} + +void sub_80EB6FC(u16 *arg0, u16 arg1) { + u16 i; + + for (i = arg1 - 1; i != 0xFFFF; i--) + { + *arg0 = 0xFFFF; + arg0++; + } + +} + u16 sub_80EB72C(u16 group) { u16 local1; @@ -260,3 +490,4 @@ static u16 sub_80EB9D8(void) { return -1; } + diff --git a/src/intro.c b/src/intro.c index ea6edba3d..2a62892ba 100644 --- a/src/intro.c +++ b/src/intro.c @@ -19,7 +19,6 @@ #include "trig.h" extern void *species_and_otid_get_pal(/*TODO: arg types*/); -extern void sub_8143648(int, u8); extern void sub_8143680(int, u8); struct MonCoords diff --git a/src/item.c b/src/item.c index 656563ad4..7257c3649 100644 --- a/src/item.c +++ b/src/item.c @@ -6,25 +6,6 @@ extern struct Berry *GetBerryInfo(u8 berry); extern u8 gOtherText_Berry2[]; extern u8 gUnknown_02038560; - -struct Item -{ - u8 name[14]; - u16 itemId; - u16 price; - u8 holdEffect; - u8 holdEffectParam; - u8 *description; - u8 importance; - u8 unk19; - u8 pocket; - u8 type; - ItemUseFunc fieldUseFunc; - u8 battleUsage; - ItemUseFunc battleUseFunc; - u8 secondaryId; -}; - extern struct Item gItems[]; struct BagPocket diff --git a/src/mori_debug_menu.c b/src/mori_debug_menu.c index 9f586dcb9..fd0ad773b 100644 --- a/src/mori_debug_menu.c +++ b/src/mori_debug_menu.c @@ -65,7 +65,7 @@ u8 MoriDebugMenu_SearchChild(u8 a1, u8 a2, u8 *ptr) s8 MoriDebugMenu_Egg(void) { - if ( daycare_count_pokemon(gSaveBlock1.filler_2F9C) == 2 && daycare_relationship_score_from_savegame() ) + if ( Daycare_CountPokemon(gSaveBlock1.daycareData) == 2 && daycare_relationship_score_from_savegame() ) sub_8041940(); CloseMenu(); @@ -74,7 +74,7 @@ s8 MoriDebugMenu_Egg(void) s8 MoriDebugMenu_MaleEgg(void) { - if ( daycare_count_pokemon(gSaveBlock1.filler_2F9C) == 2 && daycare_relationship_score_from_savegame() ) + if ( Daycare_CountPokemon(gSaveBlock1.daycareData) == 2 && daycare_relationship_score_from_savegame() ) sub_8041950(); CloseMenu(); diff --git a/src/record_mixing.c b/src/record_mixing.c index 76fe13059..58722010f 100644 --- a/src/record_mixing.c +++ b/src/record_mixing.c @@ -23,7 +23,7 @@ extern u8 gUnknown_083D0288[2]; extern u8 gUnknown_083D028A[2][3]; extern u8 gUnknown_083D0290[9][4]; -extern u8 gUnknown_02038738[]; //Don't know what type this points to +extern struct RecordMixing_UnknownStruct gUnknown_02038738[2]; //Don't know what type this points to extern u16 gSpecialVar_0x8005; extern u32 gUnknown_03005D2C; extern u8 gUnknown_03000718; @@ -36,7 +36,7 @@ extern bool8 gReceivedRemoteLinkPlayers; void sub_80B929C(void) { - sub_8083A84(sub_80B9484); + sub_8083A84(Task_RecordMixing_Main); } struct PlayerRecords { @@ -53,8 +53,10 @@ struct PlayerRecords { extern struct PlayerRecords unk_2008000; extern struct PlayerRecords unk_2018000; -#ifdef NONMATCHING -void sub_80B92AC(void) +void sub_80BC300(); +void sub_80C045C(); + +void RecordMixing_PrepareExchangePacket(void) { sub_80BC300(); sub_80C045C(); @@ -64,128 +66,20 @@ void sub_80B92AC(void) memcpy(unk_2018000.filler1004, gUnknown_083D0274, 0x40); memcpy(unk_2018000.filler1044, gUnknown_083D0278, 0x40); memcpy(unk_2018000.easyChatPairs, recordMixingEasyChatPairs, 0x28); - memcpy(gUnknown_02038738, gSaveBlock1.filler_303C, 0x38); - memcpy(gUnknown_02038738 + 0x38, gSaveBlock1.filler_3074, 0x38); - sub_8041324(gSaveBlock1.filler_2F9C, gUnknown_02038738); + gUnknown_02038738[0] = gSaveBlock1.filler_303C[0]; + gUnknown_02038738[1] = gSaveBlock1.filler_303C[1]; + sub_8041324(gSaveBlock1.daycareData, gUnknown_02038738); memcpy(unk_2018000.filler10AC, gUnknown_083D0280, 0x78); memcpy(unk_2018000.filler1124, gUnknown_083D0284, 0xA4); if (GetMultiplayerId() == 0) unk_2018000.filler11C8[0] = sub_8126338(); } -#else -__attribute__((naked)) -void sub_80B92AC(void) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - bl sub_80BC300\n\ - bl sub_80C045C\n\ - ldr r6, _080B9364 @ =0x02018000\n\ - ldr r0, _080B9368 @ =recordMixingSecretBases\n\ - ldr r1, [r0]\n\ - movs r2, 0xC8\n\ - lsls r2, 4\n\ - adds r0, r6, 0\n\ - bl memcpy\n\ - movs r1, 0xC8\n\ - lsls r1, 4\n\ - adds r0, r6, r1\n\ - ldr r1, _080B936C @ =recordMixingTvShows\n\ - ldr r1, [r1]\n\ - movs r2, 0xE1\n\ - lsls r2, 2\n\ - bl memcpy\n\ - ldr r2, _080B9370 @ =0x00001004\n\ - adds r0, r6, r2\n\ - ldr r1, _080B9374 @ =gUnknown_083D0274\n\ - ldr r1, [r1]\n\ - movs r2, 0x40\n\ - bl memcpy\n\ - ldr r1, _080B9378 @ =0x00001044\n\ - adds r0, r6, r1\n\ - ldr r1, _080B937C @ =gUnknown_083D0278\n\ - ldr r1, [r1]\n\ - movs r2, 0x40\n\ - bl memcpy\n\ - ldr r2, _080B9380 @ =0x00001084\n\ - adds r0, r6, r2\n\ - ldr r1, _080B9384 @ =recordMixingEasyChatPairs\n\ - ldr r1, [r1]\n\ - movs r2, 0x28\n\ - bl memcpy\n\ - ldr r5, _080B9388 @ =gUnknown_02038738\n\ - ldr r4, _080B938C @ =gSaveBlock1\n\ - ldr r0, _080B9390 @ =0x0000303c\n\ - adds r1, r4, r0\n\ - adds r0, r5, 0\n\ - movs r2, 0x38\n\ - bl memcpy\n\ - ldr r2, _080B9394 @ =0x00003074\n\ - adds r1, r4, r2\n\ - adds r0, r5, 0\n\ - adds r0, 0x38\n\ - movs r2, 0x38\n\ - bl memcpy\n\ - ldr r0, _080B9398 @ =0x00002f9c\n\ - adds r4, r0\n\ - adds r0, r4, 0\n\ - adds r1, r5, 0\n\ - bl sub_8041324\n\ - ldr r1, _080B939C @ =0x000010ac\n\ - adds r0, r6, r1\n\ - ldr r1, _080B93A0 @ =gUnknown_083D0280\n\ - ldr r1, [r1]\n\ - movs r2, 0x78\n\ - bl memcpy\n\ - ldr r2, _080B93A4 @ =0x00001124\n\ - adds r0, r6, r2\n\ - ldr r1, _080B93A8 @ =gUnknown_083D0284\n\ - ldr r1, [r1]\n\ - movs r2, 0xA4\n\ - bl memcpy\n\ - bl GetMultiplayerId\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _080B935C\n\ - bl sub_8126338\n\ - ldr r2, _080B93AC @ =0x000011c8\n\ - adds r1, r6, r2\n\ - strh r0, [r1]\n\ -_080B935C:\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080B9364: .4byte 0x02018000\n\ -_080B9368: .4byte recordMixingSecretBases\n\ -_080B936C: .4byte recordMixingTvShows\n\ -_080B9370: .4byte 0x00001004\n\ -_080B9374: .4byte gUnknown_083D0274\n\ -_080B9378: .4byte 0x00001044\n\ -_080B937C: .4byte gUnknown_083D0278\n\ -_080B9380: .4byte 0x00001084\n\ -_080B9384: .4byte recordMixingEasyChatPairs\n\ -_080B9388: .4byte gUnknown_02038738\n\ -_080B938C: .4byte gSaveBlock1\n\ -_080B9390: .4byte 0x0000303c\n\ -_080B9394: .4byte 0x00003074\n\ -_080B9398: .4byte 0x00002f9c\n\ -_080B939C: .4byte 0x000010ac\n\ -_080B93A0: .4byte gUnknown_083D0280\n\ -_080B93A4: .4byte 0x00001124\n\ -_080B93A8: .4byte gUnknown_083D0284\n\ -_080B93AC: .4byte 0x000011c8\n\ - .syntax divided\n"); -} -#endif -#undef NONMATCHING - -void sub_80B93B0(u32 a) +void RecordMixing_ReceiveExchangePacket(u32 a) { sub_80BD674(unk_2008000.secretBases, sizeof(struct PlayerRecords), a); - sub_80BFD44(unk_2008000.tvShows, sizeof(struct PlayerRecords), a); + sub_80BFD44((u8 *)unk_2008000.tvShows, sizeof(struct PlayerRecords), a); sub_80C0514(unk_2008000.filler1004, sizeof(struct PlayerRecords), a); sub_80B9B1C(unk_2008000.filler1044, sizeof(struct PlayerRecords), a); //UB: Too many arguments for function "sub_80FA4E4" @@ -195,7 +89,7 @@ void sub_80B93B0(u32 a) sub_80B9F3C(unk_2008000.filler11C8, a); } -void sub_80B9450(u8 taskId) +void Task_RecordMixing_SoundEffect(u8 taskId) { gTasks[taskId].data[0]++; if (gTasks[taskId].data[0] == 50) @@ -206,24 +100,23 @@ void sub_80B9450(u8 taskId) } #define TD_STATE 0 - -void sub_80B9484(u8 taskId) +void Task_RecordMixing_Main(u8 taskId) { s16 *taskData = gTasks[taskId].data; switch (taskData[TD_STATE]) { - case 0: + case 0: // init sub_8007270(gSpecialVar_0x8005); VarSet(0x4000, 1); gUnknown_03000718 = 0; - sub_80B92AC(); + RecordMixing_PrepareExchangePacket(); CreateRecordMixingSprite(); taskData[TD_STATE] = 1; taskData[10] = CreateTask(sub_80B95F0, 0x50); - taskData[15] = CreateTask(sub_80B9450, 0x51); + taskData[15] = CreateTask(Task_RecordMixing_SoundEffect, 0x51); break; - case 1: + case 1: // wait for sub_80B95F0 if (!gTasks[taskData[10]].isActive) { taskData[TD_STATE] = 2; @@ -237,7 +130,7 @@ void sub_80B9484(u8 taskId) taskData[TD_STATE] = 3; PlaySE(SE_W226); break; - case 3: + case 3: // wait for sub_80BA00C if (!gTasks[taskData[10]].isActive) { taskData[TD_STATE] = 4; @@ -247,7 +140,7 @@ void sub_80B9484(u8 taskId) taskData[8] = 0; } break; - case 4: + case 4: // wait 60 frames taskData[8]++; if (taskData[8] > 60) taskData[TD_STATE] = 5; @@ -275,10 +168,10 @@ void sub_80B95F0(u8 taskId) MenuDisplayMessageBox(); MenuPrint(gOtherText_MixingRecordsWithFriend, 2, 15); task->data[8] = 0x708; - task->data[TD_STATE] = 0x190; + task->data[TD_STATE] = 400; ClearLinkCallback_2(); break; - case 100: + case 100: // wait 20 frames task->data[12]++; if (task->data[12] > 20) { @@ -320,7 +213,7 @@ void sub_80B95F0(u8 taskId) if (sub_800820C() == GetLinkPlayerCount_2()) task->data[TD_STATE] = 1; break; - case 400: + case 400: // wait 20 frames task->data[12]++; if (task->data[12] > 20) { @@ -328,7 +221,7 @@ void sub_80B95F0(u8 taskId) task->data[12] = 0; } break; - case 1: + case 1: // wait for handshake if (gReceivedRemoteLinkPlayers) { ConvertIntToDecimalStringN(gStringVar1, GetMultiplayerId_(), 2, 2); @@ -342,16 +235,16 @@ void sub_80B95F0(u8 taskId) task->data[6] = GetLinkPlayerCount_2(); task->data[TD_STATE] = 0; task->data[5] = GetMultiplayerId_(); - task->func = sub_80B97DC; + task->func = Task_RecordMixing_SendPacket; StorePtrInTaskData(&unk_2018000, &task->data[2]); - subTaskId = CreateTask(Task_CopyRecvBuffer, 0x50); + subTaskId = CreateTask(Task_RecordMixing_CopyReceiveBuffer, 0x50); task->data[10] = subTaskId; gTasks[subTaskId].data[0] = taskId; //StorePtrInTaskData((void*)0x2008000, &gTasks[subTaskId].data[5]); StorePtrInTaskData((u8 *)&unk_2018000 - 0x10000, &gTasks[subTaskId].data[5]); break; } - case 5: + case 5: // wait 60 frames task->data[10]++; if (task->data[10] > 60) { @@ -362,9 +255,10 @@ void sub_80B95F0(u8 taskId) } } -void sub_80B97DC(u8 taskId) +void Task_RecordMixing_SendPacket(u8 taskId) { struct Task *task = &gTasks[taskId]; + // does this send the data 24 times? switch (task->data[TD_STATE]) { @@ -392,15 +286,15 @@ void sub_80B97DC(u8 taskId) break; case 4: if (!gTasks[task->data[10]].isActive) - task->func = sub_80B9A1C; + task->func = Task_RecordMixing_SendPacket_SwitchToReceive; } } -void Task_CopyRecvBuffer(u8 taskId) +void Task_RecordMixing_CopyReceiveBuffer(u8 taskId) { struct Task *task = &gTasks[taskId]; s32 recvStatus = GetBlockReceivedStatus(); - u32 sp8 = 0; + u8 handledPlayers = 0; if (recvStatus == sub_8008198()) { @@ -408,32 +302,27 @@ void Task_CopyRecvBuffer(u8 taskId) for (player = 0; player < GetLinkPlayerCount(); player++) { - //_080B98D4 - u8 *ptr; void *src; u8 *dst; if ((recvStatus >> player) & 1) { - ptr = LoadPtrFromTaskData(&task->data[5]); - dst = ptr + task->data[player + 1] * BUFFER_CHUNK_SIZE + player * sizeof(struct PlayerRecords); + dst = LoadPtrFromTaskData(&task->data[5]) + task->data[player + 1] * BUFFER_CHUNK_SIZE + player * sizeof(struct PlayerRecords); src = GetPlayerRecvBuffer(player); - if ((u32)(task->data[player + 1] + 1) * BUFFER_CHUNK_SIZE > sizeof(struct PlayerRecords)) + if ((task->data[player + 1] + 1) * BUFFER_CHUNK_SIZE > sizeof(struct PlayerRecords)) memcpy(dst, src, sizeof(struct PlayerRecords) - task->data[player + 1] * BUFFER_CHUNK_SIZE); else memcpy(dst, src, BUFFER_CHUNK_SIZE); - //_080B993C ResetBlockReceivedFlag(player); task->data[player + 1]++; if ((u16)task->data[player + 1] == 0x18) - sp8 = (u8)(sp8 + 1); + handledPlayers++; } } - //line 828 gTasks[task->data[0]].data[0]++; } //_080B998A - if (sp8 == GetLinkPlayerCount()) + if (handledPlayers == GetLinkPlayerCount()) DestroyTask(taskId); } @@ -445,18 +334,18 @@ void sub_80B99B4(u8 taskId) DestroyTask(taskId); } -void sub_80B99E8(u8 taskId) +void Task_RecordMixing_ReceivePacket(u8 taskId) { struct Task *task = &gTasks[taskId]; task->func = sub_80B99B4; if (gUnknown_03000718 == 1) - sub_80B93B0(task->data[5]); + RecordMixing_ReceiveExchangePacket(task->data[5]); } -void sub_80B9A1C(u8 taskId) +void Task_RecordMixing_SendPacket_SwitchToReceive(u8 taskId) { - gTasks[taskId].func = sub_80B99E8; + gTasks[taskId].func = Task_RecordMixing_ReceivePacket; gUnknown_03000718 = 1; } @@ -537,6 +426,7 @@ u8 sub_80B9BBC(u16 *a) return a[16]; } +#undef NONMATCHING #ifdef NONMATCHING void sub_80B9BC4(u32 a, u32 b, u32 c, u32 d) diff --git a/src/rom3.c b/src/rom3.c index 0169128cb..ef7b9a7ed 100644 --- a/src/rom3.c +++ b/src/rom3.c @@ -582,7 +582,7 @@ void sub_800C47C(u8 taskId) } } -void dp01_build_cmdbuf_x00_a_b_0(u8 a, int b, int c) +void dp01_build_cmdbuf_x00_a_b_0(u8 a, u8 b, u8 c) { gUnknown_03004040[0] = 0; gUnknown_03004040[1] = b; @@ -591,7 +591,7 @@ void dp01_build_cmdbuf_x00_a_b_0(u8 a, int b, int c) dp01_prepare_buffer(a, gUnknown_03004040, 4); } -void dp01_build_cmdbuf_x01_a_b_0(u8 a, int b, int c) +void dp01_build_cmdbuf_x01_a_b_0(u8 a, u8 b, u8 c) { gUnknown_03004040[0] = 1; gUnknown_03004040[1] = b; @@ -600,7 +600,7 @@ void dp01_build_cmdbuf_x01_a_b_0(u8 a, int b, int c) dp01_prepare_buffer(a, gUnknown_03004040, 4); } -void dp01_build_cmdbuf_x02_a_b_varargs(u8 a, int b, int c, u8 d, u8 *e) +void dp01_build_cmdbuf_x02_a_b_varargs(u8 a, u8 b, u8 c, u8 d, u8 *e) { int i; @@ -612,7 +612,7 @@ void dp01_build_cmdbuf_x02_a_b_varargs(u8 a, int b, int c, u8 d, u8 *e) dp01_prepare_buffer(a, gUnknown_03004040, d + 3); } -void unref_sub_800C6A4(u8 a, int b, u8 c, u8 *d) +void unref_sub_800C6A4(u8 a, u8 b, u8 c, u8 *d) { int i; @@ -633,7 +633,7 @@ void dp01_build_cmdbuf_x04_4_4_4(u8 a) dp01_prepare_buffer(a, gUnknown_03004040, 4); } -void sub_800C704(u8 a, int b, int c) +void sub_800C704(u8 a, u8 b, u8 c) { gUnknown_03004040[0] = 5; gUnknown_03004040[1] = b; @@ -642,7 +642,7 @@ void sub_800C704(u8 a, int b, int c) dp01_prepare_buffer(a, gUnknown_03004040, 4); } -void dp01_build_cmdbuf_x06_a(u8 a, int b) +void dp01_build_cmdbuf_x06_a(u8 a, u8 b) { gUnknown_03004040[0] = 6; gUnknown_03004040[1] = b; @@ -703,7 +703,7 @@ void dp01_build_cmdbuf_x0C_C_C_C(u8 a) dp01_prepare_buffer(a, gUnknown_03004040, 4); } -void dp01_build_cmdbuf_x0D_a(u8 a, int b) +void dp01_build_cmdbuf_x0D_a(u8 a, u8 b) { gUnknown_03004040[0] = 13; gUnknown_03004040[1] = b; @@ -721,7 +721,7 @@ void unref_sub_800C828(u8 a, u8 b, u8 *c) dp01_prepare_buffer(a, gUnknown_03004040, b * 3 + 2); } -void dp01_build_cmdbuf_x0F_aa_b_cc_dddd_e_mlc_weather_00_x1Cbytes(u8 a, u16 b, u8 c, u16 d, int e, u8 f, u8 *g) +void dp01_build_cmdbuf_x0F_aa_b_cc_dddd_e_mlc_weather_00_x1Cbytes(u8 a, u16 b, u8 c, u16 d, s32 e, u8 f, u8 *g) { gUnknown_03004040[0] = 15; gUnknown_03004040[1] = b; @@ -1039,7 +1039,7 @@ _0800CB54: .4byte gUnknown_030041C0\n\ .syntax divided\n"); } -void dp01_build_cmdbuf_x12_a_bb(u8 a, int b, u16 c) +void dp01_build_cmdbuf_x12_a_bb(u8 a, u8 b, u16 c) { gUnknown_03004040[0] = 18; gUnknown_03004040[1] = b; @@ -1048,14 +1048,14 @@ void dp01_build_cmdbuf_x12_a_bb(u8 a, int b, u16 c) dp01_prepare_buffer(a, gUnknown_03004040, 4); } -void unref_sub_800CB84(u8 a, int b) +void unref_sub_800CB84(u8 a, u8 b) { gUnknown_03004040[0] = 19; gUnknown_03004040[1] = b; dp01_prepare_buffer(a, gUnknown_03004040, 2); } -void sub_800CBA4(u8 a, int b, int c, u8 *d) +void sub_800CBA4(u8 a, u8 b, u8 c, u8 *d) { u32 i; @@ -1078,7 +1078,7 @@ void sub_800CBE0(u8 a, u8 *b) dp01_prepare_buffer(a, gUnknown_03004040, 4); } -void dp01_build_cmdbuf_x16_a_b_c_ptr_d_e_f(u8 a, int b, int c, int d, u8 *e) +void dp01_build_cmdbuf_x16_a_b_c_ptr_d_e_f(u8 a, u8 b, u8 c, u8 d, u8 *e) { int i; @@ -1109,7 +1109,7 @@ void dp01_build_cmdbuf_x18_0_aa_health_bar_update(u8 a, s16 b) dp01_prepare_buffer(a, gUnknown_03004040, 4); } -void dp01_build_cmdbuf_x19_a_bb(u8 a, int b, s16 c) +void dp01_build_cmdbuf_x19_a_bb(u8 a, u8 b, s16 c) { gUnknown_03004040[0] = 25; gUnknown_03004040[1] = b; @@ -1132,7 +1132,7 @@ void dp01_build_cmdbuf_x1A_aaaa_bbbb(u8 a, u32 b, u32 c) dp01_prepare_buffer(a, gUnknown_03004040, 9); } -void dp01_build_cmdbuf_x1B_aaaa_b(u8 a, int b, u32 c) +void dp01_build_cmdbuf_x1B_aaaa_b(u8 a, u8 b, u32 c) { gUnknown_03004040[0] = 27; gUnknown_03004040[1] = b; @@ -1143,7 +1143,7 @@ void dp01_build_cmdbuf_x1B_aaaa_b(u8 a, int b, u32 c) dp01_prepare_buffer(a, gUnknown_03004040, 6); } -void dp01_build_cmdbuf_x1C_a(u8 a, int b) +void dp01_build_cmdbuf_x1C_a(u8 a, u8 b) { gUnknown_03004040[0] = 28; gUnknown_03004040[1] = b; @@ -1203,7 +1203,7 @@ void unref_sub_800CE84(u8 a, u16 b, u8 *c) dp01_prepare_buffer(a, gUnknown_03004040, b + 3); } -void dp01_build_cmdbuf_x21_a_bb(u8 a, int b, u16 c) +void dp01_build_cmdbuf_x21_a_bb(u8 a, u8 b, u16 c) { gUnknown_03004040[0] = 33; gUnknown_03004040[1] = b; @@ -1212,7 +1212,7 @@ void dp01_build_cmdbuf_x21_a_bb(u8 a, int b, u16 c) dp01_prepare_buffer(a, gUnknown_03004040, 4); } -void dp01_build_cmdbuf_x22_a_three_bytes(u8 a, int b, u8 *c) +void dp01_build_cmdbuf_x22_a_three_bytes(u8 a, u8 b, u8 *c) { int i; @@ -1250,7 +1250,7 @@ void dp01_build_cmdbuf_x25_25_25_25(u8 a) dp01_prepare_buffer(a, gUnknown_03004040, 4); } -void dp01_build_cmdbuf_x26_a(u8 a, int b) +void dp01_build_cmdbuf_x26_a(u8 a, u8 b) { gUnknown_03004040[0] = 38; gUnknown_03004040[1] = b; @@ -1320,7 +1320,7 @@ void dp01_build_cmdbuf_x2D_2D_2D_2D(u8 a) dp01_prepare_buffer(a, gUnknown_03004040, 4); } -void dp01_build_cmdbuf_x2E_a(u8 a, int b) +void dp01_build_cmdbuf_x2E_a(u8 a, u8 b) { gUnknown_03004040[0] = 46; gUnknown_03004040[1] = b; @@ -1367,7 +1367,7 @@ void dp01_build_cmdbuf_x32_32_32_32(u8 a) dp01_prepare_buffer(a, gUnknown_03004040, 4); } -void dp01_build_cmdbuf_x33_a_33_33(u8 a, int b) +void dp01_build_cmdbuf_x33_a_33_33(u8 a, u8 b) { gUnknown_03004040[0] = 51; gUnknown_03004040[1] = b; @@ -1376,7 +1376,7 @@ void dp01_build_cmdbuf_x33_a_33_33(u8 a, int b) dp01_prepare_buffer(a, gUnknown_03004040, 4); } -void dp01_build_cmdbuf_x34_a_bb_aka_battle_anim(u8 a, int b, u16 c) +void dp01_build_cmdbuf_x34_a_bb_aka_battle_anim(u8 a, u8 b, u16 c) { gUnknown_03004040[0] = 52; gUnknown_03004040[1] = b; @@ -1385,21 +1385,21 @@ void dp01_build_cmdbuf_x34_a_bb_aka_battle_anim(u8 a, int b, u16 c) dp01_prepare_buffer(a, gUnknown_03004040, 4); } -void sub_800D1D8(u8 a, int b) +void sub_800D1D8(u8 a, u8 b) { gUnknown_03004040[0] = 53; gUnknown_03004040[1] = b; dp01_prepare_buffer(a, gUnknown_03004040, 2); } -void dp01_build_cmdbuf_x38_a(u8 a, int b) +void dp01_build_cmdbuf_x38_a(u8 a, u8 b) { gUnknown_03004040[0] = 54; gUnknown_03004040[1] = b; dp01_prepare_buffer(a, gUnknown_03004040, 2); } -void dp01_build_cmdbuf_x37_a(u8 a, int b) +void dp01_build_cmdbuf_x37_a(u8 a, u8 b) { gUnknown_03004040[0] = 55; gUnknown_03004040[1] = b; diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c index b216bbe97..437c62400 100644 --- a/src/rom_8077ABC.c +++ b/src/rom_8077ABC.c @@ -20,7 +20,6 @@ #define NUM_BATTLE_SLOTS 4 #define gBattleMonPartyPositions gUnknown_02024A6A -#define gCastformFrontSpriteCoords gUnknownCastformCoords_0837F598 #define gCastformElevations gUnknownCastformData_0837F5A8 #define gCastformBackSpriteYCoords gUnknown_0837F5AC #define gTransformPersonalities gUnknown_02024E70 diff --git a/src/secret_base.c b/src/secret_base.c index 572dfaa1d..2769806f6 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -2,10 +2,831 @@ #include "string_util.h" #include "strings.h" #include "text.h" +#include "event_data.h" +#include "vars.h" +#include "rom4.h" +#include "asm.h" +#include "script.h" +#include "field_player_avatar.h" +#include "field_camera.h" +#include "map_constants.h" +#include "task.h" +#include "palette.h" +#include "decoration.h" +#include "field_weather.h" +#include "metatile_behavior.h" +#include "pokemon.h" -u8 sub_80BB8A8(void *); +extern u8 gUnknown_020387DC; +extern u16 gSpecialVar_0x8004; +extern u16 gSpecialVar_0x8005; +extern u16 gSpecialVar_0x8006; +extern u16 gSpecialVar_0x8007; +extern u16 gScriptResult; +extern const struct +{ + u16 unk_083D1358_0; + u16 unk_083D1358_1; +} gUnknown_083D1358[7]; +extern const u8 gUnknown_083D1374[4 * 16]; +extern void *gUnknown_0300485C; +extern const u8 sub_807D770(void); +extern const u8 gUnknown_083D13EC[12]; +extern const u8 sub_80BCCA4(u8); +extern u8 gUnknown_081A2E14[]; -u8 *sub_80BC190(u8 *dest, u8 arg1) { + +void sub_80BB4AC(struct SecretBaseRecord *record) // 080bb4ac +{ + u16 i; + u16 j; + record->sbr_field_0 = 0; + for (i=0; i<7; i++) + record->sbr_field_2[i] = 0xff; + for (i=0; i<4; i++) + record->trainerId[i] = 0x00; + record->sbr_field_e = 0; + record->sbr_field_10 = 0; + record->sbr_field_11 = 0; + record->sbr_field_1_0 = 0; + record->gender = 0; + record->sbr_field_1_5 = 0; + record->sbr_field_1_6 = 0; + for (i=0; i<16; i++) { + record->decorations[i] = 0; + record->decorationPos[i] = 0; + } + for (i=0; i<6; i++) { + for (j=0; j<4; j++) { + record->partyMoves[i * 4 + j] = 0; + } + record->partyPersonality[i] = 0; + record->partyEVs[i] = 0; + record->partySpecies[i] = 0; + record->partyHeldItems[i] = 0; + record->partyLevels[i] = 0; + } +} + +void ResetSecretBase(u8 idx) // 80bb594 +{ + sub_80BB4AC(&(gSaveBlock1.secretBases[idx])); +} + +void ResetSecretBases(void) // 080bb5b4 +{ + u16 i; + for (i=0; i<20; i++) + ResetSecretBase(i); +} + +void sub_80BB5D0(void) // 080bb5d0 +{ + gUnknown_020387DC = gSpecialVar_0x8004; +} + +void sub_80BB5E4(void) // 80bb5e4 +{ + u16 idx; + gScriptResult = 0; + for (idx=0; idx<20; idx++) { + if (gUnknown_020387DC != gSaveBlock1.secretBases[idx].sbr_field_0) + continue; + gScriptResult = 1; + VarSet(VAR_0x4054, idx); + break; + } +} + +void sub_80BB63C(void) // 80bb63c +{ + if (gSaveBlock1.secretBases[0].sbr_field_0) + gScriptResult = 1; + else + gScriptResult = 0; +} + +u8 sub_80BB66C(void) // 80bb66c +{ + s16 x, y; + s16 v0; + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + v0 = MapGridGetMetatileBehaviorAt(x, y) & 0xFFF; + if (v0 == 0x90 || v0 == 0x91) + return 1; + else if (v0 == 0x92 || v0 == 0x93) + return 2; + else if (v0 == 0x9a || v0 == 0x9b) + return 3; + else if (v0 == 0x94 || v0 == 0x95) + return 4; + else if (v0 == 0x96 || v0 == 0x97 || v0 == 0x9c || v0 == 0x9d) + return 5; + else if (v0 == 0x98 || v0 == 0x99) + return 6; + return 0; +} + +void sub_80BB70C(void) // 80bb70c +{ + gSpecialVar_0x8007 = sub_80BB66C(); +} + +s16 unref_sub_80BB724(u16 *a0, u8 a1) +{ + u16 v2; + for (v2=0; v2<0x200; v2++) { + if ((a0[v2] & 0xFFF) == a1) + return (s16)v2; + } + return -1; +} + +void sub_80BB764(s16 *arg1, s16 *arg2, u16 arg3) +{ + s16 x, y; + for (y=0; y<gMapHeader.mapData->height; y++) { + for (x=0; x<gMapHeader.mapData->width; x++) { + if ((gMapHeader.mapData->map[y * gMapHeader.mapData->width + x] & 0x3ff) == arg3) { + *arg1 = x; + *arg2 = y; + return; + } + } + } +} + +void sub_80BB800(void) +{ + s16 x, y; + s16 tile_id; + u16 idx; + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + tile_id = MapGridGetMetatileIdAt(x, y); + for (idx=0; idx<7; idx++) { + if (gUnknown_083D1358[idx].unk_083D1358_0 == tile_id) { + MapGridSetMetatileIdAt(x, y, gUnknown_083D1358[idx].unk_083D1358_1 | 0xc00); + CurrentMapDrawMetatileAt(x, y); + return; + } + } + for (idx=0; idx<7; idx++) { + if (gUnknown_083D1358[idx].unk_083D1358_1 == tile_id) { + MapGridSetMetatileIdAt(x, y, gUnknown_083D1358[idx].unk_083D1358_0 | 0xc00); + CurrentMapDrawMetatileAt(x, y); + return; + } + } +} + +u8 sub_80BB8A8(u8 *arg1) +{ + u8 idx; + for (idx=0; idx<7; idx++) { + if (arg1[idx] == EOS) + return idx; + } + return 7; +} + +void sub_80BB8CC(void) +{ + u8 nameLength; + u16 idx; + gSaveBlock1.secretBases[0].sbr_field_0 = gUnknown_020387DC; + for (idx=0; idx<4; idx++) { + gSaveBlock1.secretBases[0].trainerId[idx] = gSaveBlock2.playerTrainerId[idx]; + } + VarSet(VAR_0x4054, 0); + nameLength = sub_80BB8A8(gSaveBlock2.playerName); + memset(gSaveBlock1.secretBases[0].sbr_field_2, 0xFF, 7); + StringCopyN(gSaveBlock1.secretBases[0].sbr_field_2, gSaveBlock2.playerName, nameLength); + gSaveBlock1.secretBases[0].gender = gSaveBlock2.playerGender; + VarSet(VAR_SECRET_BASE_MAP, gMapHeader.name); +} + +void sub_80BB970(struct MapEvents *events) +{ + u16 bgevidx, idx, jdx; + s16 tile_id; + for (bgevidx=0; bgevidx<events->bgEventCount; bgevidx++) { + if (events->bgEvents[bgevidx].kind == 8) { + for (jdx=0; jdx<20; jdx++) { + if (gSaveBlock1.secretBases[jdx].sbr_field_0 == events->bgEvents[bgevidx].bgUnion.secretBaseId) { + tile_id = MapGridGetMetatileIdAt(events->bgEvents[bgevidx].x + 7, events->bgEvents[bgevidx].y + 7); + for (idx=0; idx<7; idx++) { + if (gUnknown_083D1358[idx].unk_083D1358_0 == tile_id) { + MapGridSetMetatileIdAt(events->bgEvents[bgevidx].x + 7, events->bgEvents[bgevidx].y + 7, gUnknown_083D1358[idx].unk_083D1358_1 | 0xc00); + break; + } + } + break; + } + } + } + } +} + +void sub_80BBA14(void) +{ + s8 idx = 4 * (gUnknown_020387DC / 10); + warp1_set_2(MAP_GROUP_SECRET_BASE_RED_CAVE1, gUnknown_083D1374[idx], gUnknown_083D1374[idx + 1]); +} + +void sub_80BBA48(u8 taskid) +{ + u16 curbaseid; + switch (gTasks[taskid].data[0]) { + case 0: + gTasks[taskid].data[0] = 1; + break; + case 1: + if (!gPaletteFade.active) { + gTasks[taskid].data[0] = 2; + } + break; + case 2: + curbaseid = VarGet(VAR_0x4054); + if (gSaveBlock1.secretBases[curbaseid].sbr_field_10 < 0xff) + gSaveBlock1.secretBases[curbaseid].sbr_field_10 ++; + sub_80BBA14(); + warp_in(); + gUnknown_0300485C = sub_8080990; + SetMainCallback2(CB2_LoadMap); + DestroyTask(taskid); + break; + } +} + +void sub_80BBAF0(void) +{ + CreateTask(sub_80BBA48, 0); + fade_screen(1, 0); + saved_warp2_set(0, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1); +} + +bool8 sub_80BBB24(void) +{ + if (gMapHeader.mapType == 9 && VarGet(VAR_0x4097) == 0) + return FALSE; + return TRUE; +} + +void sub_80BBB50(u8 taskid) +{ + FieldObjectTurn(&(gMapObjects[gPlayerAvatar.mapObjectId]), 2); + if (sub_807D770() == 1) { + EnableBothScriptContexts(); + DestroyTask(taskid); + } +} + +void sub_80BBB90(void) +{ + s16 x, y; + ScriptContext2_Enable(); + HideMapNamePopup(); + sub_80BB764(&x, &y, 0x220); + MapGridSetMetatileIdAt(x + 7, y + 7, 0xe20); + CurrentMapDrawMetatileAt(x + 7, y + 7); + pal_fill_black(); + CreateTask(sub_80BBB50, 0); +} + +void sub_80BBBEC(u8 taskid) +{ + s8 idx; + if (!gPaletteFade.active) { + idx = 4 * (gUnknown_020387DC / 10); + warp1_set(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, gUnknown_083D1374[idx + 2], gUnknown_083D1374[idx + 3]); + warp_in(); + gUnknown_0300485C = sub_80BBB90; + SetMainCallback2(CB2_LoadMap); + DestroyTask(taskid); + } +} + +void sub_80BBC78(void) +{ + u8 taskid = CreateTask(sub_80BBBEC, 0); + gTasks[taskid].data[0] = 0; + fade_screen(1, 0); +} + +bool8 CurrentMapIsSecretBase(void) +{ + if (gSaveBlock1.location.mapGroup == MAP_GROUP_SECRET_BASE_SHRUB4 && (u8)(gSaveBlock1.location.mapNum) <= MAP_ID_SECRET_BASE_SHRUB4) + return TRUE; + return FALSE; +} + +#ifdef NONMATCHING +void sub_80BBCCC(u8 flagIn) +{ + u16 curBaseId; + u16 x, y; + if (CurrentMapIsSecretBase()) { + curBaseId = VarGet(VAR_0x4054); + for (x=0; x<16; x++) { + if ((u8)(gSaveBlock1.secretBases[curBaseId].decorations[x] - 1) <= 0x77 && gDecorations[gSaveBlock1.secretBases[curBaseId].decorations[x]].decor_field_11 != 4) { + sub_80FF394((gSaveBlock1.secretBases[0].decorationPos[x] >> 4) + 7, (gSaveBlock1.secretBases[0].decorationPos[x] & 0xF) + 7, gSaveBlock1.secretBases[curBaseId].decorations[x]); + } + } + if (curBaseId != 0) { + sub_80BB764(&x, &y, 0x220); + MapGridSetMetatileIdAt(x + 7, y + 7, 0xe21); + } else if (flagIn == 1 && VarGet(VAR_0x4089) == 1) { + sub_80BB764(&x, &y, 0x220); + MapGridSetMetatileIdAt(x + 7, y + 7, 0xe0a); + } + } +} + +void sub_80BBDD0(void) +{ + u8 *roomdecor; + u8 *roomdecorpos; + u8 ndecor; + u8 decidx; + u8 objid = 0; + u8 metatile; + u16 curBase = VarGet(VAR_0x4054); + if (!CurrentMapIsSecretBase()) { + roomdecor = gSaveBlock1.playerRoomDecor; + roomdecorpos = gSaveBlock1.playerRoomDecorPos; + ndecor = 12; + } else { + roomdecor = gSaveBlock1.secretBases[curBase].decorations; + roomdecorpos = gSaveBlock1.secretBases[curBase].decorationPos; + ndecor = 16; + } + for (decidx=0; decidx<ndecor; decidx++) { + if (roomdecor[decidx] == 0) + continue; + if (gDecorations[roomdecor[decidx]].decor_field_11 != 4) + continue; + for (objid=0; objid<gMapHeader.events->mapObjectCount; objid++) { + if (gMapHeader.events->mapObjects[objid].flagId == gSpecialVar_0x8004 + 0xAE) + break; + } + if (objid != gMapHeader.events->mapObjectCount) { + gSpecialVar_0x8006 = roomdecorpos[decidx] >> 4; + gSpecialVar_0x8007 = roomdecorpos[decidx] & 0xF; + metatile = MapGridGetMetatileBehaviorAt(gSpecialVar_0x8006 + 7, gSpecialVar_0x8007 + 7); + if (sub_80572D8(metatile) == 1 || sub_80572EC(metatile) == 1) { + gScriptResult = gMapHeader.events->mapObjects[objid].graphicsId + 0x3f20; + VarSet(gScriptResult, gDecorations[roomdecor[decidx]].tiles[0]); + gScriptResult = gMapHeader.events->mapObjects[objid].localId; + FlagReset(gSpecialVar_0x8004 + 0xAE); + show_sprite(gScriptResult, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + sub_805C0F8(gScriptResult, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, gSpecialVar_0x8006, gSpecialVar_0x8007); + sub_805C78C(gScriptResult, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + gSpecialVar_0x8004 ++; + } + } + } +} + +#else +__attribute__((naked)) +void sub_80BBCCC(u8 flagIn) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + sub sp, 0x4\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + bl CurrentMapIsSecretBase\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080BBDBC\n\ + ldr r0, _080BBD70 @ =0x00004054\n\ + bl VarGet\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + movs r1, 0\n\ + mov r0, sp\n\ + strh r1, [r0]\n\ + ldr r6, _080BBD74 @ =gSaveBlock1\n\ + mov r4, sp\n\ + ldr r0, _080BBD78 @ =0x00001a2a\n\ + adds r7, r6, r0\n\ +_080BBCFC:\n\ + lsls r0, r5, 2\n\ + adds r0, r5\n\ + lsls r0, 5\n\ + ldrh r1, [r4]\n\ + adds r2, r0, r1\n\ + ldr r1, _080BBD7C @ =0x00001a1a\n\ + adds r0, r6, r1\n\ + adds r1, r2, r0\n\ + ldrb r0, [r1]\n\ + subs r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x77\n\ + bhi _080BBD3A\n\ + ldr r0, _080BBD80 @ =gDecorations\n\ + ldrb r3, [r1]\n\ + lsls r1, r3, 5\n\ + adds r1, r0\n\ + ldrb r0, [r1, 0x11]\n\ + cmp r0, 0x4\n\ + beq _080BBD3A\n\ + adds r0, r2, r7\n\ + ldrb r2, [r0]\n\ + lsrs r0, r2, 4\n\ + adds r0, 0x7\n\ + movs r1, 0xF\n\ + ands r1, r2\n\ + adds r1, 0x7\n\ + adds r2, r3, 0\n\ + bl sub_80FF394\n\ +_080BBD3A:\n\ + ldrh r0, [r4]\n\ + adds r0, 0x1\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + strh r0, [r4]\n\ + cmp r0, 0xF\n\ + bls _080BBCFC\n\ + cmp r5, 0\n\ + beq _080BBD88\n\ + mov r4, sp\n\ + adds r4, 0x2\n\ + movs r2, 0x88\n\ + lsls r2, 2\n\ + mov r0, sp\n\ + adds r1, r4, 0\n\ + bl sub_80BB764\n\ + mov r0, sp\n\ + ldrh r0, [r0]\n\ + adds r0, 0x7\n\ + ldrh r1, [r4]\n\ + adds r1, 0x7\n\ + ldr r2, _080BBD84 @ =0x00000e21\n\ + bl MapGridSetMetatileIdAt\n\ + b _080BBDBC\n\ + .align 2, 0\n\ +_080BBD70: .4byte 0x00004054\n\ +_080BBD74: .4byte gSaveBlock1\n\ +_080BBD78: .4byte 0x00001a2a\n\ +_080BBD7C: .4byte 0x00001a1a\n\ +_080BBD80: .4byte gDecorations\n\ +_080BBD84: .4byte 0x00000e21\n\ +_080BBD88:\n\ + mov r0, r8\n\ + cmp r0, 0x1\n\ + bne _080BBDBC\n\ + ldr r0, _080BBDC8 @ =0x00004089\n\ + bl VarGet\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0x1\n\ + bne _080BBDBC\n\ + mov r4, sp\n\ + adds r4, 0x2\n\ + movs r2, 0x88\n\ + lsls r2, 2\n\ + mov r0, sp\n\ + adds r1, r4, 0\n\ + bl sub_80BB764\n\ + mov r0, sp\n\ + ldrh r0, [r0]\n\ + adds r0, 0x7\n\ + ldrh r1, [r4]\n\ + adds r1, 0x7\n\ + ldr r2, _080BBDCC @ =0x00000e0a\n\ + bl MapGridSetMetatileIdAt\n\ +_080BBDBC:\n\ + add sp, 0x4\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080BBDC8: .4byte 0x00004089\n\ +_080BBDCC: .4byte 0x00000e0a\n\ +.syntax divided\n"); +} + +__attribute__((naked)) +void sub_80BBDD0(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x14\n\ + ldr r0, _080BBE00 @ =0x00004054\n\ + bl VarGet\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + bl CurrentMapIsSecretBase\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _080BBE08\n\ + ldr r0, _080BBE04 @ =gSaveBlock1 + 0x2688\n\ + str r0, [sp, 0x4]\n\ + adds r0, 0xC\n\ + str r0, [sp, 0x8]\n\ + movs r1, 0xC\n\ + str r1, [sp, 0xC]\n\ + b _080BBE1E\n\ + .align 2, 0\n\ +_080BBE00: .4byte 0x00004054\n\ +_080BBE04: .4byte gSaveBlock1 + 0x2688\n\ +_080BBE08:\n\ + lsls r1, r4, 2\n\ + adds r1, r4\n\ + lsls r1, 5\n\ + ldr r0, _080BBF7C @ =gSaveBlock1 + 0x1A1A\n\ + adds r2, r1, r0\n\ + str r2, [sp, 0x4]\n\ + adds r0, 0x10\n\ + adds r1, r0\n\ + str r1, [sp, 0x8]\n\ + movs r3, 0x10\n\ + str r3, [sp, 0xC]\n\ +_080BBE1E:\n\ + movs r6, 0\n\ + ldr r4, [sp, 0xC]\n\ + cmp r6, r4\n\ + bcc _080BBE28\n\ + b _080BBF6C\n\ +_080BBE28:\n\ + ldr r5, _080BBF80 @ =gSaveBlock1\n\ + mov r10, r5\n\ +_080BBE2C:\n\ + ldr r1, [sp, 0x4]\n\ + adds r0, r1, r6\n\ + ldrb r1, [r0]\n\ + mov r9, r0\n\ + adds r2, r6, 0x1\n\ + str r2, [sp, 0x10]\n\ + cmp r1, 0\n\ + bne _080BBE3E\n\ + b _080BBF5E\n\ +_080BBE3E:\n\ + ldrb r0, [r0]\n\ + lsls r0, 5\n\ + ldr r3, _080BBF84 @ =gDecorations\n\ + adds r0, r3\n\ + ldrb r0, [r0, 0x11]\n\ + cmp r0, 0x4\n\ + beq _080BBE4E\n\ + b _080BBF5E\n\ +_080BBE4E:\n\ + movs r5, 0\n\ + ldr r0, _080BBF88 @ =gMapHeader\n\ + ldr r2, [r0, 0x4]\n\ + ldrb r3, [r2]\n\ + mov r8, r0\n\ + cmp r5, r3\n\ + bcs _080BBE8E\n\ + ldr r0, [r2, 0x4]\n\ + ldrh r1, [r0, 0x14]\n\ + ldr r4, _080BBF8C @ =gSpecialVar_0x8004\n\ + ldrh r0, [r4]\n\ + adds r0, 0xAE\n\ + adds r7, r4, 0\n\ + cmp r1, r0\n\ + beq _080BBE8E\n\ + adds r4, r2, 0\n\ + adds r2, r3, 0\n\ +_080BBE70:\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, r2\n\ + bcs _080BBE8E\n\ + ldr r1, [r4, 0x4]\n\ + lsls r0, r5, 1\n\ + adds r0, r5\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + ldrh r1, [r0, 0x14]\n\ + ldrh r0, [r7]\n\ + adds r0, 0xAE\n\ + cmp r1, r0\n\ + bne _080BBE70\n\ +_080BBE8E:\n\ + mov r1, r8\n\ + ldr r0, [r1, 0x4]\n\ + ldrb r0, [r0]\n\ + cmp r5, r0\n\ + beq _080BBF5E\n\ + ldr r7, _080BBF90 @ =gSpecialVar_0x8006\n\ + ldr r2, [sp, 0x8]\n\ + adds r1, r2, r6\n\ + ldrb r0, [r1]\n\ + lsrs r0, 4\n\ + strh r0, [r7]\n\ + ldr r6, _080BBF94 @ =gSpecialVar_0x8007\n\ + ldrb r1, [r1]\n\ + movs r0, 0xF\n\ + ands r0, r1\n\ + strh r0, [r6]\n\ + ldrh r0, [r7]\n\ + adds r0, 0x7\n\ + ldrh r1, [r6]\n\ + adds r1, 0x7\n\ + bl MapGridGetMetatileBehaviorAt\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + adds r0, r4, 0\n\ + bl sub_80572D8\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + beq _080BBEDA\n\ + adds r0, r4, 0\n\ + bl sub_80572EC\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _080BBF5E\n\ +_080BBEDA:\n\ + mov r3, r8\n\ + ldr r0, [r3, 0x4]\n\ + ldr r1, [r0, 0x4]\n\ + lsls r4, r5, 1\n\ + adds r4, r5\n\ + lsls r4, 3\n\ + adds r1, r4, r1\n\ + ldr r5, _080BBF98 @ =0x00003f20\n\ + adds r0, r5, 0\n\ + ldrb r1, [r1, 0x1]\n\ + adds r0, r1\n\ + ldr r1, _080BBF9C @ =gScriptResult\n\ + strh r0, [r1]\n\ + ldrh r0, [r1]\n\ + mov r2, r9\n\ + ldrb r1, [r2]\n\ + lsls r1, 5\n\ + ldr r3, _080BBFA0 @ =gDecorations + 0x1C\n\ + adds r1, r3\n\ + ldr r1, [r1]\n\ + ldrh r1, [r1]\n\ + bl VarSet\n\ + mov r5, r8\n\ + ldr r0, [r5, 0x4]\n\ + ldr r0, [r0, 0x4]\n\ + adds r4, r0\n\ + ldrb r0, [r4]\n\ + ldr r1, _080BBF9C @ =gScriptResult\n\ + strh r0, [r1]\n\ + ldr r2, _080BBF8C @ =gSpecialVar_0x8004\n\ + ldrh r0, [r2]\n\ + adds r0, 0xAE\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + bl FlagReset\n\ + ldr r3, _080BBF9C @ =gScriptResult\n\ + ldrb r0, [r3]\n\ + mov r4, r10\n\ + ldrb r1, [r4, 0x5]\n\ + ldrb r2, [r4, 0x4]\n\ + bl show_sprite\n\ + ldr r5, _080BBF9C @ =gScriptResult\n\ + ldrb r0, [r5]\n\ + ldrb r1, [r4, 0x5]\n\ + ldrb r2, [r4, 0x4]\n\ + movs r4, 0\n\ + ldrsh r3, [r7, r4]\n\ + movs r5, 0\n\ + ldrsh r4, [r6, r5]\n\ + str r4, [sp]\n\ + bl sub_805C0F8\n\ + ldr r1, _080BBF9C @ =gScriptResult\n\ + ldrb r0, [r1]\n\ + mov r2, r10\n\ + ldrb r1, [r2, 0x5]\n\ + ldrb r2, [r2, 0x4]\n\ + bl sub_805C78C\n\ + ldr r3, _080BBF8C @ =gSpecialVar_0x8004\n\ + ldrh r0, [r3]\n\ + adds r0, 0x1\n\ + strh r0, [r3]\n\ +_080BBF5E:\n\ + ldr r4, [sp, 0x10]\n\ + lsls r0, r4, 24\n\ + lsrs r6, r0, 24\n\ + ldr r5, [sp, 0xC]\n\ + cmp r6, r5\n\ + bcs _080BBF6C\n\ + b _080BBE2C\n\ +_080BBF6C:\n\ + add sp, 0x14\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080BBF7C: .4byte gSaveBlock1 + 0x1A1A\n\ +_080BBF80: .4byte gSaveBlock1\n\ +_080BBF84: .4byte gDecorations\n\ +_080BBF88: .4byte gMapHeader\n\ +_080BBF8C: .4byte gSpecialVar_0x8004\n\ +_080BBF90: .4byte gSpecialVar_0x8006\n\ +_080BBF94: .4byte gSpecialVar_0x8007\n\ +_080BBF98: .4byte 0x00003f20\n\ +_080BBF9C: .4byte gScriptResult\n\ +_080BBFA0: .4byte gDecorations + 0x1C\n\ +.syntax divided\n"); +} +#endif + +void sub_80BBFA4(void) +{ + int curBase = VarGet(VAR_0x4054); + VarSet(VAR_0x401F, gUnknown_083D13EC[sub_80BCCA4(curBase)]); +} + +void sub_80BBFD8(s16 *position, struct MapEvents *events) +{ + s16 bgevtidx; + for (bgevtidx=0; bgevtidx<events->bgEventCount; bgevtidx++) { + if (events->bgEvents[bgevtidx].kind == 8 && position[0] == events->bgEvents[bgevtidx].x + 7 && position[1] == events->bgEvents[bgevtidx].y + 7) { + gUnknown_020387DC = events->bgEvents[bgevtidx].bgUnion.secretBaseId; + break; + } + } +} + +void sub_80BC038(s16 *position, struct MapEvents *events) +{ + sub_80BBFD8(position, events); + sub_80BB5E4(); + ScriptContext1_SetupScript(gUnknown_081A2E14); +} + +bool8 sub_80BC050(void) +{ + sub_80BB5D0(); + sub_80BB5E4(); + if (gScriptResult == 1) + return FALSE; + return TRUE; +} + +void sub_80BC074(u8 taskid) +{ + switch (gTasks[taskid].data[0]) { + case 0: + ScriptContext2_Enable(); + gTasks[taskid].data[0] = 1; + break; + case 1: + if (!gPaletteFade.active) { + gTasks[taskid].data[0] = 2; + } + break; + case 2: + copy_saved_warp2_bank_and_enter_x_to_warp1(0x7E); + warp_in(); + gUnknown_0300485C = mapldr_default; + SetMainCallback2(CB2_LoadMap); + ScriptContext2_Disable(); + DestroyTask(taskid); + break; + } +} + +void sub_80BC0F8(void) { + CreateTask(sub_80BC074, 0); + fade_screen(1, 0); +} + +void sub_80BC114(void) { + if (gSaveBlock1.secretBases[0].sbr_field_0 != gUnknown_020387DC) + gScriptResult = 1; + else + gScriptResult = 0; +} + +u8 sub_80BC14C(u8 sbid) +{ + s16 idx; + for (idx=0; idx<20; idx++) { + if (gSaveBlock1.secretBases[idx].sbr_field_0 == sbid) + return idx; + } + return 0; +} + + + +u8 *sub_80BC190(u8 *dest, u8 arg1) { // 80bc190 u8 local1; u8 *str; @@ -16,3 +837,234 @@ u8 *sub_80BC190(u8 *dest, u8 arg1) { return StringAppend(dest, gOtherText_PlayersBase); } + +u8 *GetSecretBaseMapName(u8 *dest) { + gUnknown_020387DC = gSaveBlock1.secretBases[VarGet(VAR_0x4054)].sbr_field_0; + return sub_80BC190(dest, VarGet(VAR_0x4054)); +} + +void sub_80BC224(void) { + u8 *var0 = gSaveBlock1.secretBases[(u8)VarGet(VAR_0x4054)].sbr_field_2; + u8 *var1 = gStringVar1; + u8 var2 = sub_80BB8A8(var0); + u8 *var3 = StringCopyN(var1, var0, var2); + *var3 = EOS; +} + +u8 sub_80BC268(u8 foo) { // 80bc268 + if (gSaveBlock1.secretBases[foo].sbr_field_1_6) + return 1; + return 0; +} + +u8 sub_80BC298(struct Pokemon *mon) { // 80bc298 + u16 evsum = GetMonData(mon, MON_DATA_HP_EV); + evsum += GetMonData(mon, MON_DATA_ATK_EV); + evsum += GetMonData(mon, MON_DATA_DEF_EV); + evsum += GetMonData(mon, MON_DATA_SPD_EV); + evsum += GetMonData(mon, MON_DATA_SPATK_EV); + evsum += GetMonData(mon, MON_DATA_SPDEF_EV); + return (u8)(evsum / 6); +} + +#ifdef NONMATCHING +void sub_80BC300(void) +{ + u16 moveidx; + u16 sbpartyidx = 0; + int resetVal = 0; + u16 partyidx = 0; + while (partyidx < 6) { + partyidx ++; + for (moveidx=0; moveidx<4; moveidx++) { + gSaveBlock1.secretBases[0].partyMoves[(partyidx - 1) * 6 + moveidx] = resetVal; + } + gSaveBlock1.secretBases[0].partySpecies[partyidx - 1] = resetVal; + gSaveBlock1.secretBases[0].partyHeldItems[partyidx - 1] = resetVal; + gSaveBlock1.secretBases[0].partyLevels[partyidx - 1] = resetVal; + gSaveBlock1.secretBases[0].partyPersonality[partyidx - 1] = resetVal; + gSaveBlock1.secretBases[0].partyEVs[partyidx - 1] = resetVal; + if (GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_SPECIES) != 0 && !GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_IS_EGG)) { + sbpartyidx ++; + for (moveidx=0; moveidx<4; moveidx++) { + gSaveBlock1.secretBases[0].partyMoves[(sbpartyidx - 1) * 6 + moveidx] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_MOVE1 + moveidx); + } + gSaveBlock1.secretBases[0].partySpecies[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_SPECIES); + gSaveBlock1.secretBases[0].partyHeldItems[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_HELD_ITEM); + gSaveBlock1.secretBases[0].partyLevels[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_LEVEL); + gSaveBlock1.secretBases[0].partyPersonality[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_PERSONALITY); + gSaveBlock1.secretBases[0].partyEVs[sbpartyidx - 1] = sub_80BC298(&(gPlayerParty[partyidx - 1])); + } + } +} +#else +__attribute__((naked)) +void sub_80BC300(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0xC\n\ + movs r0, 0\n\ + mov r10, r0\n\ + movs r6, 0\n\ + mov r9, r6\n\ +_080BC314:\n\ + movs r4, 0\n\ + lsls r3, r6, 2\n\ + lsls r2, r6, 1\n\ + ldr r7, _080BC424 @ =gPlayerParty\n\ + adds r1, r6, 0x1\n\ + str r1, [sp]\n\ + adds r1, r3, 0\n\ +_080BC322:\n\ + adds r0, r1, r4\n\ + lsls r0, 1\n\ + ldr r5, _080BC428 @ =gSaveBlock1 + 0x1A54\n\ + adds r0, r5, r0\n\ + mov r5, r9\n\ + strh r5, [r0]\n\ + adds r0, r4, 0x1\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + cmp r4, 0x3\n\ + bls _080BC322\n\ + ldr r1, _080BC42C @ =gSaveBlock1 + 0x1A84\n\ + adds r0, r1, r2\n\ + strh r5, [r0]\n\ + ldr r5, _080BC430 @ =gSaveBlock1 + 0x1A90\n\ + adds r0, r5, r2\n\ + mov r1, r9\n\ + strh r1, [r0]\n\ + ldr r2, _080BC434 @ =gSaveBlock1 + 0x1A9C\n\ + adds r0, r2, r6\n\ + mov r5, r9\n\ + strb r5, [r0]\n\ + ldr r1, _080BC438 @ =gSaveBlock1 + 0x1A3C\n\ + adds r0, r1, r3\n\ + mov r2, r9\n\ + str r2, [r0]\n\ + ldr r3, _080BC43C @ =gSaveBlock1 + 0x1AA2\n\ + adds r0, r3, r6\n\ + strb r2, [r0]\n\ + movs r0, 0x64\n\ + adds r5, r6, 0\n\ + muls r5, r0\n\ + adds r4, r5, r7\n\ + adds r0, r4, 0\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _080BC408\n\ + adds r0, r4, 0\n\ + movs r1, 0x2D\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + bne _080BC408\n\ + movs r4, 0\n\ + mov r0, r10\n\ + lsls r0, 2\n\ + mov r8, r0\n\ + mov r1, r10\n\ + lsls r7, r1, 1\n\ + adds r1, 0x1\n\ + str r1, [sp, 0x4]\n\ + ldr r2, _080BC424 @ =gPlayerParty\n\ +_080BC38E:\n\ + adds r1, r4, 0\n\ + adds r1, 0xD\n\ + adds r0, r5, r2\n\ + str r2, [sp, 0x8]\n\ + bl GetMonData\n\ + mov r3, r8\n\ + adds r1, r3, r4\n\ + lsls r1, 1\n\ + ldr r3, _080BC428 @ =gSaveBlock1 + 0x1A54\n\ + adds r1, r3, r1\n\ + strh r0, [r1]\n\ + adds r0, r4, 0x1\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + ldr r2, [sp, 0x8]\n\ + cmp r4, 0x3\n\ + bls _080BC38E\n\ + movs r0, 0x64\n\ + adds r4, r6, 0\n\ + muls r4, r0\n\ + ldr r0, _080BC424 @ =gPlayerParty\n\ + adds r4, r0\n\ + adds r0, r4, 0\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + ldr r5, _080BC42C @ =gSaveBlock1 + 0x1A84\n\ + adds r1, r5, r7\n\ + strh r0, [r1]\n\ + adds r0, r4, 0\n\ + movs r1, 0xC\n\ + bl GetMonData\n\ + ldr r2, _080BC430 @ =gSaveBlock1 + 0x1A90\n\ + adds r1, r2, r7\n\ + strh r0, [r1]\n\ + adds r0, r4, 0\n\ + movs r1, 0x38\n\ + bl GetMonData\n\ + ldr r1, _080BC434 @ =gSaveBlock1 + 0x1A9C\n\ + add r1, r10\n\ + strb r0, [r1]\n\ + adds r0, r4, 0\n\ + movs r1, 0\n\ + bl GetMonData\n\ + ldr r1, _080BC438 @ =gSaveBlock1 + 0x1A3C\n\ + add r1, r8\n\ + str r0, [r1]\n\ + adds r0, r4, 0\n\ + bl sub_80BC298\n\ + ldr r1, _080BC43C @ =gSaveBlock1 + 0x1AA2\n\ + add r1, r10\n\ + strb r0, [r1]\n\ + ldr r3, [sp, 0x4]\n\ + lsls r0, r3, 16\n\ + lsrs r0, 16\n\ + mov r10, r0\n\ +_080BC408:\n\ + ldr r5, [sp]\n\ + lsls r0, r5, 16\n\ + lsrs r6, r0, 16\n\ + cmp r6, 0x5\n\ + bls _080BC314\n\ + add sp, 0xC\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080BC424: .4byte gPlayerParty\n\ +_080BC428: .4byte gSaveBlock1 + 0x1A54\n\ +_080BC42C: .4byte gSaveBlock1 + 0x1A84\n\ +_080BC430: .4byte gSaveBlock1 + 0x1A90\n\ +_080BC434: .4byte gSaveBlock1 + 0x1A9C\n\ +_080BC438: .4byte gSaveBlock1 + 0x1A3C\n\ +_080BC43C: .4byte gSaveBlock1 + 0x1AA2\n\ +.syntax divided\n"); +} +#endif + +void sub_80BC440(void) +{ + u16 backupValue = gSaveBlock1.secretBases[0].sbr_field_e; + ResetSecretBase(0); + gSaveBlock1.secretBases[0].sbr_field_e = backupValue; + sub_80BC0F8(); +} + +void SecretBasePC_PackUp(void) +{ + IncrementGameStat(20); + sub_80BC440(); +} @@ -1,26 +1,48 @@ #include "global.h" #include "asm.h" +#include "tv.h" #include "event_data.h" #include "field_message_box.h" #include "flags.h" #include "rng.h" #include "string_util.h" #include "text.h" - -enum -{ - TVSHOW_FAN_CLUB_LETTER = 1, - TVSHOW_RECENT_HAPPENINGS = 2, - TVSHOW_PKMN_FAN_CLUB_OPINIONS = 3, - TVSHOW_NAME_RATER_SHOW = 5, - TVSHOW_MASS_OUTBREAK = 41, -}; +#include "species.h" +#include "pokedex.h" +#include "naming_screen.h" +#include "rom4.h" +#include "map_constants.h" +#include "strings.h" +#include "link.h" +#include "easy_chat.h" +#include "item.h" +#include "items.h" +#include "contest_painting.h" +#include "rtc.h" struct UnkTvStruct { s8 var0; }; +struct UnkBattleStruct { + u16 var00; + u8 var02[3]; + u8 var05_0:1; + u8 var05_1:1; + u8 var05_pad2:6; + u16 var06; + u8 pad08[24]; + u16 var20; + u8 pad22[6]; + u16 var28; + u8 var2a[11]; + u8 var35; + u8 var36[11]; +}; +extern struct UnkBattleStruct gUnknown_030042E0; +extern u8 gUnknown_0300430A[11]; + struct OutbreakPokemon { /*0x00*/ u16 species; @@ -29,7 +51,18 @@ struct OutbreakPokemon /*0x0B*/ u8 location; }; +extern u8 *gUnknown_083D1464[3]; +extern u8 gUnknown_02038694; + +struct TVSaleItem { + u16 item_id; + u16 item_amount; +}; +extern struct TVSaleItem gUnknown_02038724[3]; + extern u16 gSpecialVar_0x8004; +extern u16 gSpecialVar_0x8005; +extern u16 gSpecialVar_0x8006; extern u8 gSpecialVar_0x8007; extern u16 gScriptResult; extern u8 gUnknown_020387E8; @@ -37,9 +70,472 @@ extern u8 gUnknown_020387E8; extern struct UnkTvStruct gUnknown_03005D38; extern u8 gSpeciesNames[][11]; +extern u8 gMoveNames[][13]; + +extern u8 *gTVBravoTrainerTextGroup[]; +extern u8 *gTVBravoTrainerBattleTowerTextGroup[]; +extern u8 *gTVSmartShopperTextGroup[]; +extern u8 *gTVNameRaterTextGroup[]; +extern u8 *gTVPokemonTodayTextGroup[]; +extern u8 *gTVPokemonTodayFailedCaptureTextGroup[]; +extern u8 *gTVFanClubTextGroup[]; +extern u8 *gTVRecentHappeningsTextGroup[]; +extern u8 *gTVFanClubOpinionsTextGroup[]; extern u8 *gTVPokemonOutbreakTextGroup[]; +extern u8 *gTVGabbyAndTyTextGroup[]; +extern u8 *gTVFishingGuruAdviceTextGroup[]; +extern u8 *gTVWorldOfMastersTextGroup[]; extern struct OutbreakPokemon gPokeOutbreakSpeciesList[5]; +extern void sub_80BEBF4(void); + +extern u16 gUnknown_020387E0; +extern u16 gUnknown_020387E2; +extern const u8 *gUnknown_083CE048[]; + +extern const u8 *gTVNewsTextGroup1[]; +extern const u8 *gTVNewsTextGroup2[]; +extern const u8 *gTVNewsTextGroup3[]; + +extern u16 gScriptLastTalked; + +u32 GetPlayerTrainerId(void); + +void ClearTVShowData(void) +{ + u8 showidx; + u8 extradataidx; + for (showidx=0; showidx<25; showidx++) { + gSaveBlock1.tvShows.shows[showidx].common.var00 = 0; + gSaveBlock1.tvShows.shows[showidx].common.var01 = 0; + for (extradataidx=0; extradataidx<34; extradataidx++) { + gSaveBlock1.tvShows.shows[showidx].common.pad02[extradataidx] = 0; + } + } + sub_80BEBF4(); +} + +bool8 sub_80BF1B4(u8); +void sub_80BF20C(void); +extern u16 sub_8135D3C(u8); +extern u8 gScriptContestCategory; +extern u8 gScriptContestRank; +extern u8 gUnknown_03004316[11]; +extern u8 gUnknown_02024D26; + +void sub_80BF334(void); +void sub_80BF3A4(void); +void sub_80BF3DC(void); +void sub_80BF46C(void); +void sub_80BF478(void); +void sub_80BF484(void); +void sub_80BF4BC(void); + +void sub_80BE028(void); +void sub_80BE074(void); +void sub_80BE778(void); +void sub_80BEB20(void); + +asm(".section .text_a"); +s8 sub_80BF74C(TVShow tvShow[]); + +void sub_80BF55C(TVShow tvShow[], u8 showidx); +void sub_80BEA88(void); + +void sub_80BE138(TVShow *show); +void sub_80BE160(TVShow *show); +extern u16 gUnknown_02024C04; + +void sub_80BE5FC(void); +void sub_80BE65C(void); +void sub_80BE6A0(void); +void nullsub_21(void); +void sub_80BE188(void); +void sub_80BE320(void); + +extern u8 GabbyAndTyGetBattleNum(void); + +void GabbyAndTySetScriptVarsToFieldObjectLocalIds(void) { + switch (GabbyAndTyGetBattleNum()) { + case 1: + gSpecialVar_0x8004 = 0xE; + gSpecialVar_0x8005 = 0xD; + break; + case 2: + gSpecialVar_0x8004 = 0x5; + gSpecialVar_0x8005 = 0x6; + break; + case 3: + gSpecialVar_0x8004 = 0x12; + gSpecialVar_0x8005 = 0x11; + break; + case 4: + gSpecialVar_0x8004 = 0x15; + gSpecialVar_0x8005 = 0x16; + break; + case 5: + gSpecialVar_0x8004 = 0x8; + gSpecialVar_0x8005 = 0x9; + break; + case 6: + gSpecialVar_0x8004 = 0x13; + gSpecialVar_0x8005 = 0x14; + break; + case 7: + gSpecialVar_0x8004 = 0x17; + gSpecialVar_0x8005 = 0x18; + break; + case 8: + gSpecialVar_0x8004 = 0xA; + gSpecialVar_0x8005 = 0xB; + break; + } +} + +void sub_80BDE48(void) { + switch (gSpecialVar_0x8005) { + case TVSHOW_FAN_CLUB_LETTER: + sub_80BE5FC(); + break; + case TVSHOW_RECENT_HAPPENINGS: + sub_80BE65C(); + break; + case TVSHOW_PKMN_FAN_CLUB_OPINIONS: + sub_80BE6A0(); + break; + case TVSHOW_UNKN_SHOWTYPE_04: + nullsub_21(); + break; + case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: + sub_80BE188(); + break; + case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: + sub_80BE320(); + break; + } +} + +u8 sub_80BDEAC(u8 *a0) { + u8 lang; + lang = GAME_LANGUAGE; + if (a0[0] == 0xFC && a0[1] == 0x15) { + lang = LANGUAGE_JAPANESE; + } + return lang; +} + +void sub_80BDEC8(void) { + TVShow *show; + u8 i; + u16 total; + u16 item; + total = 0; + sub_80BEB20(); + sub_80BE778(); + if (gUnknown_030042E0.var28 == 0) { + sub_80BE074(); + } else { + sub_80BE028(); + if (sub_80BF77C(0xffff) == 0 && StringCompareWithoutExtCtrlCodes(gSpeciesNames[gUnknown_030042E0.var28], gUnknown_030042E0.var2a) != 0) { + gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows.shows); + if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_POKEMON_TODAY_CAUGHT) != 1) { + for (i=0; i<11; i++) { + total += gUnknown_030042E0.var36[i]; + } + if (total != 0 || gUnknown_030042E0.var05_1 != 0) { + total = FALSE; + show = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0]; + show->pokemonToday.var00 = TVSHOW_POKEMON_TODAY_CAUGHT; + show->pokemonToday.var01 = total; + if (gUnknown_030042E0.var05_1 != 0) { + total = 1; + item = ITEM_MASTER_BALL; + } else { + for (i=0; i<11; i++) { + total += gUnknown_030042E0.var36[i]; + } + if (total > 0xff) { + total = 0xff; + } + item = gUnknown_02024C04; + } + show->pokemonToday.var12 = total; + show->pokemonToday.ball = item; + StringCopy(show->pokemonToday.playerName, gSaveBlock2.playerName); + StringCopy(show->pokemonToday.nickname, gUnknown_030042E0.var2a); + show->pokemonToday.species = gUnknown_030042E0.var28; + sub_80BE138(show); + show->pokemonToday.language = GAME_LANGUAGE; + show->pokemonToday.language2 = sub_80BDEAC(show->pokemonToday.nickname); + StripExtCtrlCodes(show->pokemonToday.nickname); + } + } + } + } +} + +void sub_80BE028(void) { + TVShow *buffer; + buffer = &gSaveBlock1.tvShows.unknown_2A98; + if (buffer->worldOfMasters.var00 != TVSHOW_WORLD_OF_MASTERS) { + sub_80BF55C(gSaveBlock1.tvShows.shows, 24); + buffer->worldOfMasters.var06 = GetGameStat(GAME_STAT_STEPS); + buffer->worldOfMasters.var00 = TVSHOW_WORLD_OF_MASTERS; + } + buffer->worldOfMasters.var02++; + buffer->worldOfMasters.var04 = gUnknown_030042E0.var28; + buffer->worldOfMasters.var08 = gUnknown_030042E0.var06; + buffer->worldOfMasters.var0a = gMapHeader.name; +} + +#ifdef NONMATCHING +void sub_80BE074(void) { + u8 i; + u16 total; + u8 flag; + TVShow *show; + if (sub_80BF77C(0xffff) == 0) { + for (i=0, total=0; i<ARRAY_COUNT(gUnknown_03004316); i++) { + total += gUnknown_03004316[i]; + } + if (total > 0xff) { + total = 0xff; + } + if (total > 2 && gUnknown_02024D26 == 1) { + gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows.shows); + if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_POKEMON_TODAY_FAILED) != 1) { + flag = FALSE; + show = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0]; + asm_comment("Here the wrong registers are used to hold the show ID and flag."); + show->pokemonTodayFailed.var00 = TVSHOW_POKEMON_TODAY_FAILED; + show->pokemonTodayFailed.var01 = flag; + show->pokemonTodayFailed.species = gUnknown_030042E0.var06; + show->pokemonTodayFailed.species2 = gUnknown_030042E0.var20; + show->pokemonTodayFailed.var10 = total; + show->pokemonTodayFailed.var11 = gUnknown_02024D26; + show->pokemonTodayFailed.var12 = gMapHeader.name; + StringCopy(show->pokemonTodayFailed.playerName, gSaveBlock2.playerName); + sub_80BE138(show); + show->pokemonTodayFailed.language = GAME_LANGUAGE; + } + } + } +} +#else +__attribute__((naked)) +void sub_80BE074(void) { + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + ldr r0, _080BE118 @ =0x0000ffff\n\ + bl sub_80BF77C\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _080BE112\n\ + movs r1, 0\n\ + movs r5, 0\n\ + ldr r2, _080BE11C @ =gUnknown_03004316\n\ +_080BE088:\n\ + adds r0, r1, r2\n\ + ldrb r0, [r0]\n\ + adds r0, r5, r0\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + adds r0, r1, 0x1\n\ + lsls r0, 24\n\ + lsrs r1, r0, 24\n\ + cmp r1, 0xA\n\ + bls _080BE088\n\ + cmp r5, 0xFF\n\ + bls _080BE0A2\n\ + movs r5, 0xFF\n\ +_080BE0A2:\n\ + cmp r5, 0x2\n\ + bls _080BE112\n\ + ldr r7, _080BE120 @ =gUnknown_02024D26\n\ + ldrb r0, [r7]\n\ + cmp r0, 0x1\n\ + bne _080BE112\n\ + ldr r6, _080BE124 @ =gSaveBlock1 + 0x2738\n\ + adds r0, r6, 0\n\ + bl sub_80BF74C\n\ + ldr r4, _080BE128 @ =gUnknown_03005D38\n\ + strb r0, [r4]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + movs r1, 0x1\n\ + negs r1, r1\n\ + cmp r0, r1\n\ + beq _080BE112\n\ + movs r0, 0x17\n\ + bl sub_80BF1B4\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + beq _080BE112\n\ + movs r0, 0\n\ + ldrsb r0, [r4, r0]\n\ + lsls r4, r0, 3\n\ + adds r4, r0\n\ + lsls r4, 2\n\ + adds r4, r6\n\ + @ -- Here the compiler puts the status flag in the wrong register. --\n\ + movs r1, 0\n\ + movs r0, 0x17\n\ + strb r0, [r4]\n\ + strb r1, [r4, 0x1]\n\ + ldr r1, _080BE12C @ =gUnknown_030042E0\n\ + ldrh r0, [r1, 0x6]\n\ + strh r0, [r4, 0xC]\n\ + ldrh r0, [r1, 0x20]\n\ + strh r0, [r4, 0xE]\n\ + strb r5, [r4, 0x10]\n\ + ldrb r0, [r7]\n\ + strb r0, [r4, 0x11]\n\ + ldr r0, _080BE130 @ =gMapHeader\n\ + ldrb r0, [r0, 0x14]\n\ + strb r0, [r4, 0x12]\n\ + adds r0, r4, 0\n\ + adds r0, 0x13\n\ + ldr r1, _080BE134 @ =gSaveBlock2\n\ + bl StringCopy\n\ + adds r0, r4, 0\n\ + bl sub_80BE138\n\ + movs r0, 2 @ GAME_LANGUAGE\n\ + strb r0, [r4, 0x2]\n\ +_080BE112:\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080BE118: .4byte 0x0000ffff\n\ +_080BE11C: .4byte gUnknown_03004316\n\ +_080BE120: .4byte gUnknown_02024D26\n\ +_080BE124: .4byte gSaveBlock1 + 0x2738\n\ +_080BE128: .4byte gUnknown_03005D38\n\ +_080BE12C: .4byte gUnknown_030042E0\n\ +_080BE130: .4byte gMapHeader\n\ +_080BE134: .4byte gSaveBlock2\n\ +.syntax divided\n"); +} +#endif + +void sub_80BE138(TVShow *show) { + u32 playerId; + playerId = GetPlayerTrainerId(); + show->common.srcTrainerId2Lo = playerId & 0xFF; + show->common.srcTrainerId2Hi = playerId >> 8; + show->common.srcTrainerIdLo = playerId & 0xFF; + show->common.srcTrainerIdHi = playerId >> 8; + show->common.trainerIdLo = playerId & 0xFF; + show->common.trainerIdHi = playerId >> 8; +} + +void sub_80BE160(TVShow *show) { + u32 playerId; + playerId = GetPlayerTrainerId(); + show->common.srcTrainerIdLo = playerId & 0xFF; + show->common.srcTrainerIdHi = playerId >> 8; + show->common.trainerIdLo = playerId & 0xFF; + show->common.trainerIdHi = playerId >> 8; +} + +void sub_80BE188(void) { + TVShow *show; + TVShow *buffer; + buffer = &gSaveBlock1.tvShows.unknown_2A98; + if (buffer->bravoTrainer.var00 == TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE) { + show = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0]; + show->bravoTrainer.var00 = TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE; + show->bravoTrainer.var01 = 1; + show->bravoTrainer.species = buffer->bravoTrainer.species; + StringCopy(show->bravoTrainer.playerName, gSaveBlock2.playerName); + StringCopy(show->bravoTrainer.pokemonNickname, buffer->bravoTrainer.pokemonNickname); + show->bravoTrainer.contestCategory = buffer->bravoTrainer.contestCategory; + show->bravoTrainer.contestRank = buffer->bravoTrainer.contestRank; + show->bravoTrainer.var14 = buffer->bravoTrainer.var14; + show->bravoTrainer.var13_5 = buffer->bravoTrainer.var13_5; + show->bravoTrainer.contestCategory = buffer->bravoTrainer.contestCategory; + sub_80BE160(show); + show->bravoTrainer.language = GAME_LANGUAGE; + show->bravoTrainer.var1f = sub_80BDEAC(show->bravoTrainer.pokemonNickname); + StripExtCtrlCodes(show->bravoTrainer.pokemonNickname); + } +} + +void sub_80BE23C(u16 a0) { + TVShow *show; + show = &gSaveBlock1.tvShows.unknown_2A98; + sub_80BF484(); + gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows.shows); + if (gUnknown_03005D38.var0 != -1) { + sub_80BF55C(gSaveBlock1.tvShows.shows, 24); + show->bravoTrainer.var14 = a0; + show->bravoTrainer.var00 = TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE; + } +} + +void sub_80BE284(u8 a0) { + TVShow *show; + show = &gSaveBlock1.tvShows.unknown_2A98; + gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows.shows); + if (gUnknown_03005D38.var0 != -1) { + show->bravoTrainer.var13_5 = a0; + show->bravoTrainer.contestCategory = gScriptContestCategory; + show->bravoTrainer.contestRank = gScriptContestRank; + show->bravoTrainer.species = GetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_SPECIES, NULL); + GetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_NICKNAME, show->bravoTrainer.pokemonNickname); + } +} + +void sub_80BE320(void) { + TVShow *show; + show = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0]; + show->bravoTrainerTower.var00 = TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE; + show->bravoTrainerTower.var01 = 1; + StringCopy(show->bravoTrainerTower.trainerName, gSaveBlock2.playerName); + StringCopy(show->bravoTrainerTower.pokemonName, gSaveBlock2.filler_A8.filler_3DC); + show->bravoTrainerTower.species = gSaveBlock2.filler_A8.var_480; + show->bravoTrainerTower.winningMove = gSaveBlock2.filler_A8.var_482; + show->bravoTrainerTower.var16 = sub_8135D3C(gSaveBlock2.filler_A8.var_4D0); + show->bravoTrainerTower.var1c = gSaveBlock2.filler_A8.var_4AD; + if (gSaveBlock2.filler_A8.var_4D0 == 0) { + show->bravoTrainerTower.btLevel = 50; + } else { + show->bravoTrainerTower.btLevel = 100; + } + show->bravoTrainerTower.var1b = gSpecialVar_0x8004; + sub_80BE160(show); + show->bravoTrainerTower.language = GAME_LANGUAGE; +} + +void sub_80BE3BC(void) { + u8 rval; + TVShow *tvShow; + u8 i; + + rval = sub_80BF77C(0x5555); + if (rval == 0) { + gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows.shows); + if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_SMART_SHOPPER) != 1) { + sub_80BF20C(); + if (gUnknown_02038724[0].item_amount >= 20) { + tvShow = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0]; + tvShow->smartshopperShow.var00 = TVSHOW_SMART_SHOPPER; + tvShow->smartshopperShow.var01 = rval; + tvShow->smartshopperShow.shopLocation = gMapHeader.name; + for (i=0; i<3; i++) { + tvShow->smartshopperShow.itemIds[i] = gUnknown_02038724[i].item_id; + tvShow->smartshopperShow.itemAmounts[i] = gUnknown_02038724[i].item_amount; + } + tvShow->smartshopperShow.priceReduced = GetPriceReduction(1); + StringCopy(tvShow->smartshopperShow.playerName, gSaveBlock2.playerName); + sub_80BE138(tvShow); + tvShow->smartshopperShow.language = GAME_LANGUAGE; + } + } + } +} + void sub_80BE478(void) { u16 playerNameLength; @@ -67,7 +563,7 @@ void sub_80BE478(void) return; } - tvShow = &gSaveBlock1.tvShows[gUnknown_03005D38.var0]; + tvShow = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0]; tvShow->nameRaterShow.var00 = TVSHOW_NAME_RATER_SHOW; tvShow->nameRaterShow.var01 = 1; @@ -85,7 +581,7 @@ void sub_80BE478(void) sub_80BE160(tvShow); tvShow->nameRaterShow.language = GAME_LANGUAGE; - tvShow->nameRaterShow.var1F = sub_80BDEAC(tvShow->nameRaterShow.pokemonName); + tvShow->nameRaterShow.pokemonNameLanguage = sub_80BDEAC(tvShow->nameRaterShow.pokemonName); StripExtCtrlCodes(tvShow->nameRaterShow.pokemonName); } @@ -94,7 +590,7 @@ void StartMassOutbreak(void) { TVShow *tvShow; - tvShow = &gSaveBlock1.tvShows[gSpecialVar_0x8004]; + tvShow = &gSaveBlock1.tvShows.shows[gSpecialVar_0x8004]; gSaveBlock1.outbreakPokemonSpecies = tvShow->massOutbreak.species; gSaveBlock1.outbreakLocationMapNum = tvShow->massOutbreak.locationMapNum; @@ -116,7 +612,7 @@ void sub_80BE5FC(void) TVShow *tvShow; u16 species; - tvShow = &gSaveBlock1.tvShows[gUnknown_03005D38.var0]; + tvShow = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0]; tvShow->fanclubLetter.var00 = TVSHOW_FAN_CLUB_LETTER; tvShow->fanclubLetter.var01 = 1; @@ -125,22 +621,22 @@ void sub_80BE5FC(void) species = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL); tvShow->fanclubLetter.species = species; sub_80BE160(tvShow); - tvShow->fanclubLetter.var18 = GAME_LANGUAGE; + tvShow->fanclubLetter.language = GAME_LANGUAGE; } void sub_80BE65C(void) { TVShow *tvShow; - tvShow = &gSaveBlock1.tvShows[gUnknown_03005D38.var0]; + tvShow = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0]; tvShow->recentHappenings.var00 = TVSHOW_RECENT_HAPPENINGS; tvShow->recentHappenings.var01 = 1; - StringCopy(&tvShow->recentHappenings.var10[0], &gSaveBlock2.playerName[0]); + StringCopy(tvShow->recentHappenings.playerName, gSaveBlock2.playerName); tvShow->recentHappenings.var02 = 0; sub_80BE160(tvShow); - tvShow->recentHappenings.var18 = GAME_LANGUAGE; + tvShow->recentHappenings.language = GAME_LANGUAGE; } void sub_80BE6A0(void) @@ -148,7 +644,7 @@ void sub_80BE6A0(void) TVShow *tvShow; u8 monIndex; - tvShow = &gSaveBlock1.tvShows[gUnknown_03005D38.var0]; + tvShow = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0]; tvShow->fanclubOpinions.var00 = TVSHOW_PKMN_FAN_CLUB_OPINIONS; tvShow->fanclubOpinions.var01 = 1; @@ -159,13 +655,13 @@ void sub_80BE6A0(void) tvShow->fanclubOpinions.var04B = gSpecialVar_0x8007; - StringCopy(tvShow->fanclubOpinions.var05, gSaveBlock2.playerName); + StringCopy(tvShow->fanclubOpinions.playerName, gSaveBlock2.playerName); GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_NICKNAME, tvShow->fanclubOpinions.var10); tvShow->fanclubOpinions.var02 = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL); sub_80BE160(tvShow); - tvShow->fanclubOpinions.var0D = GAME_LANGUAGE; + tvShow->fanclubOpinions.language = GAME_LANGUAGE; tvShow->fanclubOpinions.var0E = sub_80BDEAC(tvShow->fanclubOpinions.var10); StripExtCtrlCodes(tvShow->fanclubOpinions.var10); } @@ -186,7 +682,7 @@ void sub_80BE778(void) for (i = 0; i < 24; i++) { - if (gSaveBlock1.tvShows[i].massOutbreak.var00 == TVSHOW_MASS_OUTBREAK) + if (gSaveBlock1.tvShows.shows[i].massOutbreak.var00 == TVSHOW_MASS_OUTBREAK) { return; } @@ -197,7 +693,7 @@ void sub_80BE778(void) return; } - gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows); + gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows.shows); if (gUnknown_03005D38.var0 == -1) { return; @@ -213,7 +709,7 @@ void sub_80BE778(void) val2 = gUnknown_03005D38.var0; - tvShow = &gSaveBlock1.tvShows[val2]; + tvShow = &gSaveBlock1.tvShows.shows[val2]; tvShow->massOutbreak.var00 = TVSHOW_MASS_OUTBREAK; tvShow->massOutbreak.var01 = 1; @@ -235,7 +731,7 @@ void sub_80BE778(void) tvShow->massOutbreak.var16 = 0x01; sub_80BE160(tvShow); - tvShow->massOutbreak.var18 = GAME_LANGUAGE; + tvShow->massOutbreak.language = GAME_LANGUAGE; } } @@ -264,7 +760,593 @@ void UpdateTVShowsPerDay(u16 arg0) sub_80BEA5C(arg0); } -asm(".section .text_b"); +void sub_80BE8EC(u16 arg0) +{ + u8 showidx; + TVShow *tvShow; + if (gSaveBlock1.outbreakPokemonSpecies == 0) { + for (showidx=0; showidx<24; showidx++) { + if (gSaveBlock1.tvShows.shows[showidx].massOutbreak.var00 == TVSHOW_MASS_OUTBREAK && gSaveBlock1.tvShows.shows[showidx].massOutbreak.var01 == 0x01) { + tvShow = &(gSaveBlock1.tvShows.shows[showidx]); + if (tvShow->massOutbreak.var16 < arg0) + tvShow->massOutbreak.var16 = 0; + else + tvShow->massOutbreak.var16 -= arg0; + break; + } + } + } +} + +void UpdateMassOutbreakTimeLeft(u16 arg0) +{ + if (gSaveBlock1.outbreakUnk5 <= arg0) + EndMassOutbreak(); + else + gSaveBlock1.outbreakUnk5 -= arg0; +} + +void sub_80BE9D4(); + +void sub_80BE97C(bool8 flag) +{ + u8 var0, var1; + if (flag != 0) { + var0 = gUnknown_020387E2 >> 8; + if (var0 > 4) + sub_80BE9D4(); + gUnknown_020387E2 &= 0xFF; + var1 = gUnknown_020387E2 & 0xFF; + if (var1 != 0xFF) + gUnknown_020387E2++; + } else { + var0 = gUnknown_020387E2 & 0xFF; + if (var0 > 4) + sub_80BE9D4(); + gUnknown_020387E2 &= 0xFF00; + var1 = gUnknown_020387E2 >> 8; + if (var1 != 0xFF) + gUnknown_020387E2 += 0x100; + } +} + +void sub_80BE9D4() +{ + TVShow *show; + gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows.shows); + if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_FISHING_ADVICE) != 1) { + show = &(gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0]); +#ifdef NONMATCHING + show->pokemonAngler.var00 = TVSHOW_FISHING_ADVICE; + show->pokemonAngler.var01 = 0; +#else + asm(".syntax unified\n\ + movs r1, 0\n\ + movs r0, 24\n\ + strb r0, [r4]\n\ + strb r1, [r4, 1]\n\ + .syntax divided\n"); +#endif + show->pokemonAngler.var02 = gUnknown_020387E2 & 0xFF; + show->pokemonAngler.var03 = gUnknown_020387E2 >> 8; + show->pokemonAngler.var04 = gUnknown_020387E0; + StringCopy(show->pokemonAngler.playerName, gSaveBlock2.playerName); + sub_80BE138(show); + show->pokemonAngler.language = GAME_LANGUAGE; + } +} + +void sub_80BEA50(u16 var) +{ + gUnknown_020387E0 = var; +} + +void sub_80BF55C(TVShow tvShow[], u8 showidx); +void sub_80BEA88(void); + +void sub_80BEA5C(u16 arg0) +{ + TVShow *unk_2a98; + unk_2a98 = &gSaveBlock1.tvShows.unknown_2A98; + if (unk_2a98->common.var00 == TVSHOW_WORLD_OF_MASTERS) + { + if (unk_2a98->worldOfMasters.var02 < 20) + { + sub_80BF55C(gSaveBlock1.tvShows.shows, 0x18); + } + else + { + sub_80BEA88(); + } + } +} +void sub_80BEA88(void) +{ + TVShow *unk_2a98; + TVShow *tvShow; + u8 rval; + unk_2a98 = &gSaveBlock1.tvShows.unknown_2A98; + rval = sub_80BF77C(0xFFFF); + if (rval == 0) + { + gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows.shows); + if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_WORLD_OF_MASTERS) != 1) + { + tvShow = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0]; + tvShow->worldOfMasters.var00 = TVSHOW_WORLD_OF_MASTERS; + tvShow->worldOfMasters.var01 = rval; + tvShow->worldOfMasters.var02 = unk_2a98->worldOfMasters.var02; + tvShow->worldOfMasters.var06 = GetGameStat(GAME_STAT_STEPS) - unk_2a98->worldOfMasters.var06; + tvShow->worldOfMasters.var04 = unk_2a98->worldOfMasters.var04; + tvShow->worldOfMasters.var08 = unk_2a98->worldOfMasters.var08; + tvShow->worldOfMasters.var0a = unk_2a98->worldOfMasters.var0a; + StringCopy(tvShow->worldOfMasters.playerName, gSaveBlock2.playerName); + sub_80BE138(tvShow); + tvShow->worldOfMasters.language = GAME_LANGUAGE; + } + } +} + +int sub_80BEBC8(struct UnknownSaveStruct2ABC *arg0); +void sub_80BEC10(u8); +void sub_80BF588(TVShow tvShows[]); +void sub_80BF6D8(void); +bool8 sub_80BF77C(u16); +bool8 sub_80BEE48(u8); + +bool8 IsPriceDiscounted(u8); + +void sub_80BEB20(void) { + u16 rval; + struct SaveBlock1 *save; + struct UnknownSaveStruct2ABC *unk2abc; + if (FlagGet(SYS_GAME_CLEAR) != 0) { + unk2abc = gSaveBlock1.unknown_2ABC; + gUnknown_03005D38.var0 = sub_80BEBC8(unk2abc); + if (gUnknown_03005D38.var0 != -1 && sub_80BF77C(0x28f) != 1) { + rval = (Random() % 3) + 1; + if (sub_80BEE48(rval) != 1) { + save = &gSaveBlock1; + save->unknown_2ABC[gUnknown_03005D38.var0].val0 = rval; + save->unknown_2ABC[gUnknown_03005D38.var0].val2 = 4; + save->unknown_2ABC[gUnknown_03005D38.var0].val1 = 1; + } + } + } +} + +int sub_80BEBC8(struct UnknownSaveStruct2ABC *arg0) { + s8 i; + for (i=0; i<16; i++) { + if (arg0[i].val0 == 0) { + return i; + } + } + return -1; +} + +void sub_80BEBF4(void) { + u8 i; + for (i=0; i<16; i++) { + sub_80BEC10(i); + } +} + +void sub_80BEC10(u8 arg0) { + gSaveBlock1.unknown_2ABC[arg0].val0 = 0; + gSaveBlock1.unknown_2ABC[arg0].val1 = 0; + gSaveBlock1.unknown_2ABC[arg0].val2 = 0; +} + +void sub_80BEC40(void) { + u8 i, j; + for (i = 0; i < 15; i++) { + if (gSaveBlock1.unknown_2ABC[i].val0 == 0) { + for (j = i + 1; j < 16; j++) { + if (gSaveBlock1.unknown_2ABC[j].val0 != 0) { + gSaveBlock1.unknown_2ABC[i] = gSaveBlock1.unknown_2ABC[j]; + sub_80BEC10(j); + break; + } + } + } + } +} + +u8 sub_80BECA0(void) +{ + u8 i; + for (i=0; i<16; i++) + { + if (gSaveBlock1.unknown_2ABC[i].val0 != 0 && gSaveBlock1.unknown_2ABC[i].val1 == 1 && gSaveBlock1.unknown_2ABC[i].val2 < 3) + { + return i; + } + } + return 0xFF; +} + +void sub_80BECE8(void) +{ + u8 arg0; + arg0 = sub_80BECA0(); + if (arg0 == 0xff) + { + gScriptResult = 0; + return; + } + if (gSaveBlock1.unknown_2ABC[arg0].val2 == 0) + { + gSaveBlock1.unknown_2ABC[arg0].val1 = 2; + if (gLocalTime.hours < 20) + { + ShowFieldMessage(gTVNewsTextGroup2[gSaveBlock1.unknown_2ABC[arg0].val0]); + } + else + { + ShowFieldMessage(gTVNewsTextGroup3[gSaveBlock1.unknown_2ABC[arg0].val0]); + } + } + else + { + u16 value = gSaveBlock1.unknown_2ABC[arg0].val2; + ConvertIntToDecimalStringN(gStringVar1, value, 0, 1); + gSaveBlock1.unknown_2ABC[arg0].val1 = 0; + ShowFieldMessage(gTVNewsTextGroup1[gSaveBlock1.unknown_2ABC[arg0].val0]); + } + gScriptResult = 1; +} + +bool8 GetPriceReduction(u8 arg0) +{ + u8 i; + if (arg0 == 0) + { + return FALSE; + } + for (i=0; i<16; i++) + { + if (gSaveBlock1.unknown_2ABC[i].val0 == arg0) + { + if (gSaveBlock1.unknown_2ABC[i].val1 == 2 && IsPriceDiscounted(arg0) != 0) + { + return TRUE; + } + else + { + return FALSE; + } + } + } + return FALSE; +} + +bool8 IsPriceDiscounted(u8 arg0) +{ + switch (arg0) + { + case 1: + if (gSaveBlock1.location.mapGroup == MAP_GROUP_SLATEPORT_CITY && gSaveBlock1.location.mapNum == MAP_ID_SLATEPORT_CITY && gScriptLastTalked == 0x1a) + { + return TRUE; + } + else + { + return FALSE; + } + break; + case 3: + if (gSaveBlock1.location.mapGroup == MAP_GROUP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP && gSaveBlock1.location.mapNum == MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP) + { + return TRUE; + } + else + { + return FALSE; + } + break; + default: + return TRUE; + } +} + +bool8 sub_80BEE48(u8 arg0) +{ + u8 i; + if (arg0 == 0) + { + return TRUE; + } + else + { + for (i=0; i<16; i++) + { + if (gSaveBlock1.unknown_2ABC[i].val0 == arg0) + { + return TRUE; + } + } + } + return FALSE; +} + +void sub_80BEE84(u16 var0) +{ + u8 i; + for (i=0; i<16; i++) + { + if (gSaveBlock1.unknown_2ABC[i].val0) + { + if (gSaveBlock1.unknown_2ABC[i].val2 < var0) + { + sub_80BEC10(i); + } + else + { + if (!gSaveBlock1.unknown_2ABC[i].val1 && FlagGet(SYS_GAME_CLEAR) == 1) + { + gSaveBlock1.unknown_2ABC[i].val1 = 1; + } + gSaveBlock1.unknown_2ABC[i].val2 -= var0; + } + } + } + sub_80BEC40(); +} + +void sub_80BEF10(u8 strvaridx, u8 rank) +{ + switch (rank) + { + case NORMAL_RANK: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[NORMAL_RANK + 5]); + break; + case SUPER_RANK: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[SUPER_RANK + 5]); + break; + case HYPER_RANK: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[HYPER_RANK + 5]); + break; + case MASTER_RANK: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[MASTER_RANK + 5]); + break; + } +} + +void CopyContestCategoryToStringVar(u8 strvaridx, u8 category) +{ + switch (category) + { + case CONTEST_COOL: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_COOL]); + break; + case CONTEST_BEAUTY: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_BEAUTY]); + break; + case CONTEST_CUTE: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_CUTE]); + break; + case CONTEST_SMART: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_SMART]); + break; + case CONTEST_TOUGH: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_TOUGH]); + break; + } +} + +void SetContestCategoryStringVarForInterview(void) +{ + TVShow *tvShow; + tvShow = &gSaveBlock1.tvShows.shows[gSpecialVar_0x8004]; + CopyContestCategoryToStringVar(1, tvShow->bravoTrainer.contestCategory); +} + +void sub_80BF088(u8 arg0, s32 price) +{ + size_t log10val; + log10val = sub_80BF0B8(price); + ConvertIntToDecimalStringN(gUnknown_083D1464[arg0], price, 0, log10val); +} + +size_t sub_80BF0B8(int value) +{ + if (value / 10 == 0) + return 1; + else if (value / 100 == 0) + return 2; + else if (value / 1000 == 0) + return 3; + else if (value / 10000 == 0) + return 4; + else if (value / 100000 == 0) + return 5; + else if (value / 1000000 == 0) + return 6; + else if (value / 10000000 == 0) + return 7; + else if (value / 100000000 == 0) + return 8; + else + return 1; +} + +void sub_80BF154(u8 arg0, struct TVShowSmartShopper *arg1) +{ + u8 i; + s32 price; + price = 0; + for (i=0; i<3; i++) + { + if (arg1->itemIds[i]) + { + price += ItemId_GetPrice(arg1->itemIds[i]) * arg1->itemAmounts[i]; + } + } + if (arg1->priceReduced == 1) + { + sub_80BF088(arg0, price >> 1); + } + else + { + sub_80BF088(arg0, price); + } +} + +bool8 sub_80BF1B4(u8 showIdx) +{ + TVShow *tvShows; + u8 i; + u32 trainerId; + tvShows = gSaveBlock1.tvShows.shows; + trainerId = GetPlayerTrainerId(); + for (i=5; i<24; i++) + { + if (tvShows[i].common.var00 == showIdx) + { + if ((trainerId & 0xFF) == tvShows[i].common.trainerIdLo && ((trainerId >> 8) & 0xFF) == tvShows[i].common.trainerIdHi) + { + return TRUE; + } + } + } + return FALSE; +} + +void sub_80BF20C(void) +{ + u8 i, j; + u16 tmpId, tmpAmount; + for (i=0; i<2; i++) + { + for (j=i+1; j<3; j++) + { + if (gUnknown_02038724[i].item_amount < gUnknown_02038724[j].item_amount) + { + tmpId = gUnknown_02038724[i].item_id; + tmpAmount = gUnknown_02038724[i].item_amount; + gUnknown_02038724[i].item_id = gUnknown_02038724[j].item_id; + gUnknown_02038724[i].item_amount = gUnknown_02038724[j].item_amount; + gUnknown_02038724[j].item_id = tmpId; + gUnknown_02038724[j].item_amount = tmpAmount; + } + } + } +} + +void sub_80BF25C(u8 showType) +{ + u8 i; + for (i=0; i<5; i++) + { + if (gSaveBlock1.tvShows.shows[i].common.var00 == showType) { + if(gSaveBlock1.tvShows.shows[i].common.var01 == 1) + { + gScriptResult = 1; + } + else + { + sub_80BF55C(gSaveBlock1.tvShows.shows, i); + sub_80BF588(gSaveBlock1.tvShows.shows); + sub_80BF6D8(); + } + return; + } + } + sub_80BF6D8(); +} + +void sub_80BF2C4(void) +{ + gScriptResult = 0; + switch (gSpecialVar_0x8005) { + case TVSHOW_FAN_CLUB_LETTER: + sub_80BF334(); + break; + case TVSHOW_RECENT_HAPPENINGS: + sub_80BF3A4(); + break; + case TVSHOW_PKMN_FAN_CLUB_OPINIONS: + sub_80BF3DC(); + break; + case TVSHOW_UNKN_SHOWTYPE_04: + sub_80BF46C(); + break; + case TVSHOW_NAME_RATER_SHOW: + sub_80BF478(); + break; + case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: + sub_80BF484(); + break; + case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: + sub_80BF4BC(); + break; + } +} + +void sub_80BF334(void) +{ + TVShow *show; + sub_80BF25C(TVSHOW_FAN_CLUB_LETTER); + if (gScriptResult == 0) { + StringCopy(gStringVar1, gSpeciesNames[GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, 0)]); + show = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0]; + sub_80EB6FC(show->fanclubLetter.pad04, 6); + } +} + +void sub_80BF3A4(void) +{ + TVShow *show; + sub_80BF25C(TVSHOW_RECENT_HAPPENINGS); + if (gScriptResult == 0) { + show = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0]; + sub_80EB6FC(show->recentHappenings.var04, 6); + } +} + +void sub_80BF3DC(void) +{ + TVShow *show; + sub_80BF25C(TVSHOW_PKMN_FAN_CLUB_OPINIONS); + if (gScriptResult == 0) { + StringCopy(gStringVar1, gSpeciesNames[GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, 0)]); + GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_NICKNAME, gStringVar2); + StringGetEnd10(gStringVar2); + show = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0]; + sub_80EB6FC(show->fanclubOpinions.var1C, 2); + } +} + +void sub_80BF46C(void) +{ + gScriptResult = 1; +} + +void sub_80BF478(void) +{ + sub_80BF25C(TVSHOW_NAME_RATER_SHOW); +} + +void sub_80BF484(void) +{ + TVShow *show; + sub_80BF25C(TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE); + if (gScriptResult == 0) { + show = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0]; + sub_80EB6FC(show->bravoTrainer.var04, 2); + } +} + +void sub_80BF4BC(void) +{ + TVShow *show; + sub_80BF25C(TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE); + if (gScriptResult == 0) { + show = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0]; + sub_80EB6FC(show->bravoTrainerTower.var18, 1); // wrong struct ident, fix later + } +} u8 sub_80BF4F4(u8 arg0) { @@ -282,13 +1364,1540 @@ u8 sub_80BF4F4(u8 arg0) return TRUE; } +u8 sub_80BF544(void) +{ + return sub_80BF4F4(GetLeadMonIndex()); +} + +void sub_80BF55C(TVShow tvShow[], u8 showidx) +{ + u8 idx; + tvShow[showidx].common.var00 = 0; + tvShow[showidx].common.var01 = 0; + for (idx=0; idx<34; idx++) { + tvShow[showidx].common.pad02[idx] = 0; + } +} + +void sub_80BF588(TVShow tvShow[]) +{ + u8 showidx; + u8 showidx2; + for (showidx=0; showidx<4; showidx++) { + if (tvShow[showidx].common.var00 == 0) { + for (showidx2=showidx+1; showidx2<5; showidx2++) { + if (tvShow[showidx2].common.var00 != 0) { + tvShow[showidx] = tvShow[showidx2]; + sub_80BF55C(tvShow, showidx2); + break; + } + } + } + } + for (showidx=5; showidx<24; showidx++) { + if (tvShow[showidx].common.var00 == 0) { + for (showidx2=showidx+1; showidx2<24; showidx2++) { + if (tvShow[showidx2].common.var00 != 0) { + tvShow[showidx] = tvShow[showidx2]; + sub_80BF55C(gSaveBlock1.tvShows.shows, showidx2); + break; + } + } + } + } +} + +u16 sub_80BF638(u8 arg0, u16 arg1) +{ + u16 retval = sub_80BF674(arg1); + StringCopy(gUnknown_083D1464[arg0], gSpeciesNames[retval]); + return retval; +} + +u16 sub_80BF674(u16 species) +{ + u16 rspecies; + u16 cspecies; + rspecies = (Random() % (NUM_SPECIES - 1)) + 1; + cspecies = rspecies; + while ((s8)sub_8090D90(SpeciesToNationalPokedexNum(cspecies), 0) != 1 || cspecies == species) { + if (cspecies == SPECIES_BULBASAUR) + cspecies = NUM_SPECIES - 1; + else + cspecies --; + if (cspecies == rspecies) { + cspecies = species; + return cspecies; + } + } + return cspecies; +} + +void sub_80BF6D8(void) +{ + gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows.shows); + gSpecialVar_0x8006 = gUnknown_03005D38.var0; + if (gUnknown_03005D38.var0 == -1) + gScriptResult = 1; + else + gScriptResult = 0; +} + +s8 sub_80BF720(TVShow tvShow[]) +{ + u8 idx; + for (idx=0; idx<5; idx++) { + if (tvShow[idx].common.var00 == 0) + return idx; + } + return -1; +} + +s8 sub_80BF74C(TVShow tvShow[]) +{ + s8 idx; + for (idx=5; idx<24; idx++) { + if (tvShow[idx].common.var00 == 0) + return idx; + } + return -1; +} + +bool8 sub_80BF77C(u16 value) +{ + if (Random() <= value) + return FALSE; + return TRUE; +} + +void sub_80BF79C(TVShow *arg0) +{ + u8 i = Random() % 6; + while (1) { + if (i == 6) + i = 0; + if (arg0->recentHappenings.var04[i] != 0xFFFF) + break; + i ++; + } + sub_80EB3FC(gStringVar3, arg0->recentHappenings.var04[i]); +} + +u8 sub_80BF7E8(struct TVShowNameRaterShow *arg0) +{ + u16 flagsum = 0; + u8 i = 0; + if (arg0->pokemonName[0] != 0xFF) { + while (i < 11 && arg0->pokemonName[i] != 0xFF) { + flagsum += arg0->pokemonName[i]; + i++; + } + } + return flagsum & 0x7; +} + +void sub_80BF820(u8 arg0, u8 arg1, u8 arg2, u16 arg3, u16 arg4, struct TVShowNameRaterShow *tvShow) +{ + u8 flags[3]; + u16 nameLength; + u8 i; + for (i=0; i<3; i++) + flags[i] = EOS; + if (arg3 == 0) { + nameLength = StringLength(tvShow->trainerName); + if (arg2 == 0) { + flags[0] = tvShow->trainerName[arg1]; + } else if (arg2 == 1) { + flags[0] = tvShow->trainerName[nameLength - arg1]; + } else if (arg2 == 2) { + flags[0] = tvShow->trainerName[arg1]; + flags[1] = tvShow->trainerName[arg1 + 1]; + } else { + flags[0] = tvShow->trainerName[nameLength - (arg1 + 2)]; + flags[1] = tvShow->trainerName[nameLength - (arg1 + 1)]; + } + } else if (arg3 == 1) { + nameLength = StringLength(tvShow->pokemonName); + if (arg2 == 0) { + flags[0] = tvShow->pokemonName[arg1]; + } else if (arg2 == 1) { + flags[0] = tvShow->pokemonName[nameLength - arg1]; + } else if (arg2 == 2) { + flags[0] = tvShow->pokemonName[arg1]; + flags[1] = tvShow->pokemonName[arg1 + 1]; + } else { + flags[0] = tvShow->pokemonName[nameLength - (arg1 + 2)]; + flags[1] = tvShow->pokemonName[nameLength - (arg1 + 1)]; + } + } else { + nameLength = StringLength(gSpeciesNames[arg4]); + if (arg2 == 0) { + flags[0] = gSpeciesNames[arg4][arg1]; + } else if (arg2 == 1) { + flags[0] = gSpeciesNames[arg4][nameLength - arg1]; + } else if (arg2 == 2) { + flags[0] = gSpeciesNames[arg4][arg1]; + flags[1] = gSpeciesNames[arg4][arg1 + 1]; + } else { + flags[0] = gSpeciesNames[arg4][nameLength - (arg1 + 2)]; + flags[1] = gSpeciesNames[arg4][nameLength - (arg1 + 1)]; + } + } + StringCopy(gUnknown_083D1464[arg0], flags); +} + +bool8 sub_80BF974(void) +{ + u8 i; + for (i=0; i<5; i++) + { + if (gSaveBlock1.tvShows.shows[i].common.var00 == gSpecialVar_0x8004) + return TRUE; + } + return FALSE; +} + +bool8 sub_80BF9B4(void) +{ + GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar1); + if (!StringCompareWithoutExtCtrlCodes(gStringVar3, gStringVar1)) + return FALSE; + sub_80BE478(); + return TRUE; +} + +void c2_080CC144(void); + +void sub_80BF9F8(void) +{ + u16 spec; + u16 gender; + u32 pval; + GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar3); + GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar2); + spec = GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_SPECIES, 0); + gender = GetMonGender(&(gPlayerParty[gSpecialVar_0x8004])); + pval = GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_PERSONALITY, 0); + DoNamingScreen(3, gStringVar2, spec, gender, pval, c2_080CC144); +} + +void c2_080CC144(void) +{ + SetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, gStringVar2); + c2_exit_to_overworld_1_continue_scripts_restart_music(); +} + +void sub_80BFAE0(void) +{ + GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar1); + StringGetEnd10(gStringVar1); +} + +void sub_80BFB10(void) +{ + if (GetPlayerTrainerId() == GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_OT_ID, 0)) + gScriptResult = 0; + else + gScriptResult = 1; +} + +u8 sub_80BFB54(u8 arg0) +{ + if (arg0 == 0) + return 0; + else if (arg0 > 0 && arg0 <= 20) + return 2; + else if (arg0 > 20 && arg0 <= 40) + return 3; + else if (arg0 > 40 && arg0 <= 60) + return 4; + else + return 0; +} + +u32 GetPlayerTrainerId(void) +{ + return (gSaveBlock2.playerTrainerId[3] << 24) | (gSaveBlock2.playerTrainerId[2] << 16) | (gSaveBlock2.playerTrainerId[1] << 8) | (gSaveBlock2.playerTrainerId[0]); +} + +u8 CheckForBigMovieOrEmergencyNewsOnTV(void) +{ + if (gSaveBlock1.location.mapGroup != MAP_GROUP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F) + return 0; + if (gSaveBlock2.playerGender == MALE) { + if (gSaveBlock1.location.mapNum != MAP_ID_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F) + return 0; + } else { + if (gSaveBlock1.location.mapNum != MAP_ID_LITTLEROOT_TOWN_MAYS_HOUSE_1F) + return 0; + } + if (FlagGet(SYS_TV_LATI) == 1) + return 1; + if (FlagGet(SYS_TV_HOME) == 1) + return 2; + return 1; +} + +#ifdef NONMATCHING +void GetMomOrDadStringForTVMessage(void) +{ + if (gSaveBlock1.location.mapGroup == MAP_GROUP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F) { + if (gSaveBlock2.playerGender == MALE) { + if (gSaveBlock1.location.mapNum == MAP_ID_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F) { + StringCopy(gStringVar1, gOtherText_Mom); + VarSet(VAR_0x4003, 1); + } + } else { + if (gSaveBlock1.location.mapNum == MAP_ID_LITTLEROOT_TOWN_MAYS_HOUSE_1F) { + StringCopy(gStringVar1, gOtherText_Mom); + VarSet(VAR_0x4003, 1); + } + } + } + if (VarGet(VAR_0x4003) == 1) { + StringCopy(gStringVar1, gOtherText_Mom); + } else if (VarGet(VAR_0x4003) == 2) { + StringCopy(gStringVar1, gOtherText_Dad); + } else if (VarGet(VAR_0x4003) > 2) { + if ((u16)(VarGet(VAR_0x4003) & 1) == 0) { + StringCopy(gStringVar1, gOtherText_Mom); + } else { + StringCopy(gStringVar1, gOtherText_Dad); + } + } else { + if ((u16)(Random() & 1) != 0) { + StringCopy(gStringVar1, gOtherText_Mom); + VarSet(VAR_0x4003, 1); + } else { + StringCopy(gStringVar1, gOtherText_Dad); + VarSet(VAR_0x4003, 2); + } + } +} +#else +__attribute__((naked)) +void GetMomOrDadStringForTVMessage(void) +{ + asm(".syntax unified\n\ + push {r4,lr}\n\ + ldr r1, _080BFC40 @ =gSaveBlock1\n\ + movs r0, 0x4\n\ + ldrsb r0, [r1, r0]\n\ + cmp r0, 0x1\n\ + bne _080BFC6C\n\ + ldr r0, _080BFC44 @ =gSaveBlock2\n\ + ldrb r0, [r0, 0x8]\n\ + cmp r0, 0\n\ + bne _080BFC54\n\ + movs r0, 0x5\n\ + ldrsb r0, [r1, r0]\n\ + cmp r0, 0\n\ + bne _080BFC6C\n\ + ldr r0, _080BFC48 @ =gStringVar1\n\ + ldr r1, _080BFC4C @ =gOtherText_Mom\n\ + bl StringCopy\n\ + ldr r0, _080BFC50 @ =0x00004003\n\ + movs r1, 0x1\n\ + bl VarSet\n\ + b _080BFC6C\n\ + .align 2, 0\n\ +_080BFC40: .4byte gSaveBlock1\n\ +_080BFC44: .4byte gSaveBlock2\n\ +_080BFC48: .4byte gStringVar1\n\ +_080BFC4C: .4byte gOtherText_Mom\n\ +_080BFC50: .4byte 0x00004003\n\ +_080BFC54:\n\ + movs r0, 0x5\n\ + ldrsb r0, [r1, r0]\n\ + cmp r0, 0x2\n\ + bne _080BFC6C\n\ + ldr r0, _080BFCB4 @ =gStringVar1\n\ + ldr r1, _080BFCB8 @ =gOtherText_Mom\n\ + bl StringCopy\n\ + ldr r0, _080BFCBC @ =0x00004003\n\ + movs r1, 0x1\n\ + bl VarSet\n\ +_080BFC6C:\n\ + ldr r4, _080BFCBC @ =0x00004003\n\ + adds r0, r4, 0\n\ + bl VarGet\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0x1\n\ + beq _080BFCAA\n\ + adds r0, r4, 0\n\ + bl VarGet\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0x2\n\ + beq _080BFCC0\n\ + adds r0, r4, 0\n\ + bl VarGet\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0x2\n\ + bls _080BFCD4\n\ + adds r0, r4, 0\n\ + bl VarGet\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + movs r1, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _080BFCC0\n\ +_080BFCAA:\n\ + ldr r0, _080BFCB4 @ =gStringVar1\n\ + ldr r1, _080BFCB8 @ =gOtherText_Mom\n\ + bl StringCopy\n\ + b _080BFD10\n\ + .align 2, 0\n\ +_080BFCB4: .4byte gStringVar1\n\ +_080BFCB8: .4byte gOtherText_Mom\n\ +_080BFCBC: .4byte 0x00004003\n\ +_080BFCC0:\n\ + ldr r0, _080BFCCC @ =gStringVar1\n\ + ldr r1, _080BFCD0 @ =gOtherText_Dad\n\ + bl StringCopy\n\ + b _080BFD10\n\ + .align 2, 0\n\ +_080BFCCC: .4byte gStringVar1\n\ +_080BFCD0: .4byte gOtherText_Dad\n\ +_080BFCD4:\n\ + bl Random\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + movs r1, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080BFD00\n\ + ldr r0, _080BFCF8 @ =gStringVar1\n\ + ldr r1, _080BFCFC @ =gOtherText_Mom\n\ + bl StringCopy\n\ + adds r0, r4, 0\n\ + movs r1, 0x1\n\ + bl VarSet\n\ + b _080BFD10\n\ + .align 2, 0\n\ +_080BFCF8: .4byte gStringVar1\n\ +_080BFCFC: .4byte gOtherText_Mom\n\ +_080BFD00:\n\ + ldr r0, _080BFD18 @ =gStringVar1\n\ + ldr r1, _080BFD1C @ =gOtherText_Dad\n\ + bl StringCopy\n\ + adds r0, r4, 0\n\ + movs r1, 0x2\n\ + bl VarSet\n\ +_080BFD10:\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080BFD18: .4byte gStringVar1\n\ +_080BFD1C: .4byte gOtherText_Dad\n\ +.syntax divided\n"); +} +#endif + +void sub_80BFD20(void) +{ + VarSet(VAR_0x40BC, 0); + RemoveFieldObjectByLocalIdAndMap(5, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); +} + +extern u8 ewram[]; +#define gUnknown_02007000 (*(struct ewramStruct_0207000 *)(ewram + 0x7000)) +extern u8 gUnknown_020387E4; + +struct ewramStruct_0207000 { + struct SaveTVStruct tvshows[4]; +}; + +void sub_80BFE24(struct SaveTVStruct *arg0, struct SaveTVStruct *arg1, struct SaveTVStruct *arg2, struct SaveTVStruct *arg3); + +void sub_80C04A0(void); +void sub_80C01D4(void); +void sub_80C0408(void); + +void sub_80BFD44(u8 *arg0, u32 arg1, u8 arg2) +{ + u8 i; + struct ewramStruct_0207000 *ewramTVShows; + for (i=0; i<4; i++) { + memcpy(&gUnknown_02007000.tvshows[i], &arg0[i * arg1], sizeof(struct SaveTVStruct)); + } + ewramTVShows = &gUnknown_02007000; + switch (arg2) { + case 0: + sub_80BFE24(&gSaveBlock1.tvShows, &ewramTVShows->tvshows[1], &ewramTVShows->tvshows[2], &ewramTVShows->tvshows[3]); + break; + case 1: + sub_80BFE24(&ewramTVShows->tvshows[0], &gSaveBlock1.tvShows, &ewramTVShows->tvshows[2], &ewramTVShows->tvshows[3]); + break; + case 2: + sub_80BFE24(&ewramTVShows->tvshows[0], &ewramTVShows->tvshows[1], &gSaveBlock1.tvShows, &ewramTVShows->tvshows[3]); + break; + case 3: + sub_80BFE24(&ewramTVShows->tvshows[0], &ewramTVShows->tvshows[1], &ewramTVShows->tvshows[2], &gSaveBlock1.tvShows); + break; + } + sub_80BF588(gSaveBlock1.tvShows.shows); + sub_80C04A0(); + sub_80BF588(gSaveBlock1.tvShows.shows); + sub_80C01D4(); + sub_80C0408(); +} + +extern u8 gUnknown_03000720; +extern s8 gUnknown_03000722; +s8 sub_80C019C(TVShow tvShows[]); +bool8 sub_80BFF68(struct SaveTVStruct ** tv1, struct SaveTVStruct ** tv2, u8 idx); +u8 sub_80C004C(TVShow *tv1, TVShow *tv2, u8 idx); +u8 sub_80C00B4(TVShow *tv1, TVShow *tv2, u8 idx); +u8 sub_80C0134(TVShow *tv1, TVShow *tv2, u8 idx); + +void sub_80BFE24(struct SaveTVStruct *arg0, struct SaveTVStruct *arg1, struct SaveTVStruct *arg2, struct SaveTVStruct *arg3) +{ + u8 i, j; + struct SaveTVStruct ** argslist[4]; + argslist[0] = &arg0; + argslist[1] = &arg1; + argslist[2] = &arg2; + argslist[3] = &arg3; + gUnknown_03000720 = GetLinkPlayerCount(); + while (1) { + for (i=0; i<gUnknown_03000720; i++) { + if (i == 0) + gUnknown_020387E4 = i; + gUnknown_03000722 = sub_80C019C(argslist[i][0]->shows); + if (gUnknown_03000722 == -1) { + gUnknown_020387E4++; + if (gUnknown_020387E4 == gUnknown_03000720) + return; + } else { + for (j=0; j<gUnknown_03000720-1; j++) { + gUnknown_03005D38.var0 = sub_80BF74C(argslist[(i + j + 1) % gUnknown_03000720][0]->shows); + if (gUnknown_03005D38.var0 != -1 && sub_80BFF68(argslist[(i + j + 1) % gUnknown_03000720], argslist[i], (i + j + 1) % gUnknown_03000720) == 1) { + break; + } + } + if (j == gUnknown_03000720 - 1) { + sub_80BF55C(argslist[i][0]->shows, gUnknown_03000722); + } + } + } + } +} + +#ifdef NONMATCHING +bool8 sub_80BFF68(struct SaveTVStruct ** arg1, struct SaveTVStruct ** arg2, u8 idx) { + u8 value; + u8 switchval; + struct SaveTVStruct *tv1; + struct SaveTVStruct *tv2; + tv1 = *arg1; + tv2 = *arg2; + value = FALSE; + switchval = sub_80BFB54(tv2->shows[gUnknown_03000722].common.var00); + switch (switchval) { + case 2: + value = sub_80C004C(&tv1->shows[gUnknown_03005D38.var0], &tv2->shows[gUnknown_03000722], idx); + break; + case 3: + value = sub_80C00B4(&tv1->shows[gUnknown_03005D38.var0], &tv2->shows[gUnknown_03000722], idx); + break; + case 4: + value = sub_80C0134(&tv1->shows[gUnknown_03005D38.var0], &tv2->shows[gUnknown_03000722], idx); + break; + } + if (value == TRUE) { + sub_80BF55C(tv2->shows, gUnknown_03000722); + return TRUE; + } else { + return FALSE; + } +} +#else +__attribute__((naked)) +bool8 sub_80BFF68(struct SaveTVStruct ** arg1, struct SaveTVStruct ** arg2, u8 idx) { + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + sub sp, 0x4\n\ + lsls r2, 24\n\ + lsrs r7, r2, 24\n\ + ldr r4, [r0]\n\ + ldr r6, [r1]\n\ + movs r5, 0\n\ + ldr r2, _080BFFA4 @ =gUnknown_03000722\n\ + movs r1, 0\n\ + ldrsb r1, [r2, r1]\n\ + lsls r0, r1, 3\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r6 @ this is the only mimsmatch\n\ + ldrb r0, [r0]\n\ + str r2, [sp]\n\ + bl sub_80BFB54\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + adds r1, r0, 0\n\ + ldr r2, [sp]\n\ + cmp r0, 0x3\n\ + beq _080BFFD8\n\ + cmp r0, 0x3\n\ + bgt _080BFFA8\n\ + cmp r0, 0x2\n\ + beq _080BFFAE\n\ + b _080C0026\n\ + .align 2, 0\n\ +_080BFFA4: .4byte gUnknown_03000722\n\ +_080BFFA8:\n\ + cmp r1, 0x4\n\ + beq _080C0000\n\ + b _080C0026\n\ +_080BFFAE:\n\ + ldr r0, _080BFFD4 @ =gUnknown_03005D38\n\ + movs r1, 0\n\ + ldrsb r1, [r0, r1]\n\ + lsls r0, r1, 3\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r4, r0\n\ + ldrb r2, [r2]\n\ + lsls r2, 24\n\ + asrs r2, 24\n\ + lsls r1, r2, 3\n\ + adds r1, r2\n\ + lsls r1, 2\n\ + adds r1, r6, r1\n\ + adds r2, r7, 0\n\ + bl sub_80C004C\n\ + b _080C0022\n\ + .align 2, 0\n\ +_080BFFD4: .4byte gUnknown_03005D38\n\ +_080BFFD8:\n\ + ldr r0, _080BFFFC @ =gUnknown_03005D38\n\ + movs r1, 0\n\ + ldrsb r1, [r0, r1]\n\ + lsls r0, r1, 3\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r4, r0\n\ + ldrb r2, [r2]\n\ + lsls r2, 24\n\ + asrs r2, 24\n\ + lsls r1, r2, 3\n\ + adds r1, r2\n\ + lsls r1, 2\n\ + adds r1, r6, r1\n\ + adds r2, r7, 0\n\ + bl sub_80C00B4\n\ + b _080C0022\n\ + .align 2, 0\n\ +_080BFFFC: .4byte gUnknown_03005D38\n\ +_080C0000:\n\ + ldr r0, _080C0030 @ =gUnknown_03005D38\n\ + movs r1, 0\n\ + ldrsb r1, [r0, r1]\n\ + lsls r0, r1, 3\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r4, r0\n\ + ldrb r2, [r2]\n\ + lsls r2, 24\n\ + asrs r2, 24\n\ + lsls r1, r2, 3\n\ + adds r1, r2\n\ + lsls r1, 2\n\ + adds r1, r6, r1\n\ + adds r2, r7, 0\n\ + bl sub_80C0134\n\ +_080C0022:\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ +_080C0026:\n\ + cmp r5, 0x1\n\ + beq _080C0034\n\ + movs r0, 0\n\ + b _080C0040\n\ + .align 2, 0\n\ +_080C0030: .4byte gUnknown_03005D38\n\ +_080C0034:\n\ + ldr r0, _080C0048 @ =gUnknown_03000722\n\ + ldrb r1, [r0]\n\ + adds r0, r6, 0\n\ + bl sub_80BF55C\n\ + movs r0, 0x1\n\ +_080C0040:\n\ + add sp, 0x4\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_080C0048: .4byte gUnknown_03000722\n\ +.syntax divided\n"); +} +#endif + +u8 sub_80C004C(TVShow *tv1, TVShow *tv2, u8 idx) { + u32 linkTrainerId = GetLinkPlayerTrainerId(idx); + if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi) { + return FALSE; + } + tv2->common.trainerIdLo = tv2->common.srcTrainerIdLo; + tv2->common.trainerIdHi = tv2->common.srcTrainerIdHi; + tv2->common.srcTrainerIdLo = linkTrainerId & 0xFF; + tv2->common.srcTrainerIdHi = linkTrainerId >> 8; + *tv1 = *tv2; + tv1->common.var01 = 1; + return TRUE; +} + +u8 sub_80C00B4(TVShow *tv1, TVShow *tv2, u8 idx) { + u32 linkTrainerId = GetLinkPlayerTrainerId(idx); + if ((linkTrainerId & 0xFF) == tv2->common.srcTrainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.srcTrainerIdHi) { + return FALSE; + } + if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi) { + return FALSE; + } + tv2->common.srcTrainerIdLo = tv2->common.srcTrainerId2Lo; + tv2->common.srcTrainerIdHi = tv2->common.srcTrainerId2Hi; + tv2->common.srcTrainerId2Lo = linkTrainerId & 0xFF; + tv2->common.srcTrainerId2Hi = linkTrainerId >> 8; + *tv1 = *tv2; + tv1->common.var01 = 1; + return TRUE; +} + +u8 sub_80C0134(TVShow *tv1, TVShow *tv2, u8 idx) { + u32 linkTrainerId = GetLinkPlayerTrainerId(idx); + if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi) { + return FALSE; + } + tv2->common.trainerIdLo = tv2->common.srcTrainerIdLo; + tv2->common.trainerIdHi = tv2->common.srcTrainerIdHi; + tv2->common.srcTrainerIdLo = linkTrainerId & 0xFF; + tv2->common.srcTrainerIdHi = linkTrainerId >> 8; + *tv1 = *tv2; + tv1->common.var01 = 1; + tv1->common.var16[0] = 1; + return TRUE; +} + +s8 sub_80C019C(TVShow tvShows[]) { + u8 i; + for (i=0; i<24; i++) { + if (tvShows[i].common.var01 == 0 && (u8)(tvShows[i].common.var00 - 1) < 60) { + return i; + } + } + return -1; +} + +void sub_80C03A8(u8 showidx); +void sub_80C03C8(u16 species, u8 showidx); + +#ifdef NONMATCHING +void sub_80C01D4(void) { + u8 i; + for (i=0; i<24; i++) { + switch (gSaveBlock1.tvShows.shows[i].common.var00) { + case 0: + break; + case TVSHOW_FAN_CLUB_LETTER: + sub_80C03C8(gSaveBlock1.tvShows.shows[i].fanclubLetter.species, i); + break; + case TVSHOW_RECENT_HAPPENINGS: + break; + case TVSHOW_PKMN_FAN_CLUB_OPINIONS: + sub_80C03C8(gSaveBlock1.tvShows.shows[i].fanclubOpinions.var02, i); + break; + case TVSHOW_UNKN_SHOWTYPE_04: + sub_80C03C8(gSaveBlock1.tvShows.shows[i].worldOfMasters.var06, i); + break; + case TVSHOW_NAME_RATER_SHOW: + sub_80C03C8(gSaveBlock1.tvShows.shows[i].nameRaterShow.species, i); + sub_80C03C8(gSaveBlock1.tvShows.shows[i].nameRaterShow.var1C, i); + break; + case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: + sub_80C03C8(gSaveBlock1.tvShows.shows[i].bravoTrainer.species, i); + break; + case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: + sub_80C03C8(gSaveBlock1.tvShows.shows[i].bravoTrainerTower.var0a, i); + sub_80C03C8(gSaveBlock1.tvShows.shows[i].bravoTrainerTower.var14, i); + break; + case TVSHOW_POKEMON_TODAY_CAUGHT: + sub_80C03C8(gSaveBlock1.tvShows.shows[i].pokemonToday.species, i); + break; + case TVSHOW_SMART_SHOPPER: + break; + case TVSHOW_POKEMON_TODAY_FAILED: + sub_80C03C8(gSaveBlock1.tvShows.shows[i].pokemonTodayFailed.species, i); + sub_80C03C8(gSaveBlock1.tvShows.shows[i].pokemonTodayFailed.species2, i); + break; + case TVSHOW_FISHING_ADVICE: + sub_80C03C8(gSaveBlock1.tvShows.shows[i].pokemonAngler.var04, i); + break; + case TVSHOW_WORLD_OF_MASTERS: + sub_80C03C8(gSaveBlock1.tvShows.shows[i].worldOfMasters.var08, i); + sub_80C03C8(gSaveBlock1.tvShows.shows[i].worldOfMasters.var04, i); + break; + case TVSHOW_MASS_OUTBREAK: + break; + default: + sub_80C03A8(i); + } + } +} +#else +__attribute__((naked)) +void sub_80C01D4(void) { + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + movs r6, 0\n\ +_080C01D8:\n\ + ldr r0, _080C01F8 @ =gSaveBlock1\n\ + lsls r2, r6, 3\n\ + adds r1, r2, r6\n\ + lsls r1, 2\n\ + adds r1, r0\n\ + ldr r0, _080C01FC @ =0x00002738\n\ + adds r1, r0\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x29\n\ + bls _080C01EE\n\ + b _default\n\ +_080C01EE:\n\ + lsls r0, 2\n\ + ldr r1, _080C0200 @ =_080C0204\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ +_080C01F8: .4byte gSaveBlock1\n\ +_080C01FC: .4byte 0x00002738\n\ +_080C0200: .4byte _080C0204\n\ + .align 2, 0\n\ +_080C0204:\n\ + .4byte _break\n\ + .4byte _fanclubLetter @ TVSHOW_FAN_CLUB_LETTER\n\ + .4byte _break @ TVSHOW_RECENT_HAPPENINGS\n\ + .4byte _fanclubOpinions @ TVSHOW_PKMN_FAN_CLUB_OPINIONS\n\ + .4byte _showtype4 @ TVSHOW_UNKN_SHOWTYPE_04\n\ + .4byte _nameRater @ TVSHOW_NAME_RATER_SHOW\n\ + .4byte _bravoTrainerContest @ TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE\n\ + .4byte _bravoTrainerTower @ TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _pokemonTodayS @ TVSHOW_POKEMON_TODAY_CAUGHT\n\ + .4byte _break @ TVSHOW_SMART_SHOPPER\n\ + .4byte _pokemonTodayF @ TVSHOW_POKEMON_TODAY_FAILED\n\ + .4byte _fishing @ TVSHOW_FISHING_ADVICE\n\ + .4byte _worldOfMasters @ TVSHOW_WORLD_OF_MASTERS\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _break @ TVSHOW_MASS_OUTBREAK\n\ +_fanclubLetter:\n\ + adds r0, r2, r6\n\ + lsls r0, 2\n\ + ldr r1, _080C02B8 @ =gSaveBlock1 + 0x2738\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x2]\n\ + b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C02B8: .4byte gSaveBlock1 + 0x2738\n\ +_fanclubOpinions:\n\ + adds r0, r2, r6\n\ + lsls r0, 2\n\ + ldr r1, _080C02C8 @ =gSaveBlock1 + 0x2738\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x2]\n\ + b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C02C8: .4byte gSaveBlock1 + 0x2738\n\ +_showtype4:\n\ + adds r0, r2, r6\n\ + lsls r0, 2\n\ + ldr r1, _080C02D8 @ =gSaveBlock1 + 0x2738\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x6]\n\ + b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C02D8: .4byte gSaveBlock1 + 0x2738\n\ +_nameRater:\n\ + adds r4, r2, r6\n\ + lsls r4, 2\n\ + ldr r0, _080C02F4 @ =gSaveBlock1 + 0x2738\n\ + adds r4, r0\n\ + ldrh r0, [r4, 0x2]\n\ + lsls r5, r6, 24\n\ + lsrs r5, 24\n\ + adds r1, r5, 0\n\ + bl sub_80C03C8\n\ + ldrh r0, [r4, 0x1C]\n\ + b _checkSpecies2 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C02F4: .4byte gSaveBlock1 + 0x2738\n\ +_bravoTrainerContest:\n\ + adds r0, r2, r6\n\ + lsls r0, 2\n\ + ldr r1, _080C0304 @ =gSaveBlock1 + 0x2738\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x2]\n\ + b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C0304: .4byte gSaveBlock1 + 0x2738\n\ +_bravoTrainerTower:\n\ + adds r4, r2, r6\n\ + lsls r4, 2\n\ + ldr r0, _080C0320 @ =gSaveBlock1 + 0x2738\n\ + adds r4, r0\n\ + ldrh r0, [r4, 0xA]\n\ + lsls r5, r6, 24\n\ + lsrs r5, 24\n\ + adds r1, r5, 0\n\ + bl sub_80C03C8\n\ + ldrh r0, [r4, 0x14]\n\ + b _checkSpecies2 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C0320: .4byte gSaveBlock1 + 0x2738\n\ +_pokemonTodayS:\n\ + adds r0, r2, r6\n\ + lsls r0, 2\n\ + ldr r1, _080C0330 @ =gSaveBlock1 + 0x2738\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x10]\n\ + b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C0330: .4byte gSaveBlock1 + 0x2738\n\ +_pokemonTodayF:\n\ + adds r4, r2, r6\n\ + lsls r4, 2\n\ + ldr r0, _080C034C @ =gSaveBlock1 + 0x2738\n\ + adds r4, r0\n\ + ldrh r0, [r4, 0xC]\n\ + lsls r5, r6, 24\n\ + lsrs r5, 24\n\ + adds r1, r5, 0\n\ + bl sub_80C03C8\n\ + ldrh r0, [r4, 0xE]\n\ + b _checkSpecies2 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C034C: .4byte gSaveBlock1 + 0x2738\n\ +_fishing:\n\ + adds r0, r2, r6\n\ + lsls r0, 2\n\ + ldr r1, _080C0364 @ =gSaveBlock1 + 0x2738\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x4]\n\ +_checkSpecies1:\n\ + lsls r1, r6, 24\n\ + lsrs r1, 24\n\ + bl sub_80C03C8\n\ + b _break\n\ + .align 2, 0\n\ +_080C0364: .4byte gSaveBlock1 + 0x2738\n\ +_worldOfMasters:\n\ + adds r4, r2, r6\n\ + lsls r4, 2\n\ + ldr r0, _080C0388 @ =gSaveBlock1 + 0x2738\n\ + adds r4, r0\n\ + ldrh r0, [r4, 0x8]\n\ + lsls r5, r6, 24\n\ + lsrs r5, 24\n\ + adds r1, r5, 0\n\ + bl sub_80C03C8\n\ + ldrh r0, [r4, 0x4]\n\ +_checkSpecies2:\n\ + adds r1, r5, 0\n\ + bl sub_80C03C8\n\ + b _break\n\ + .align 2, 0\n\ +_080C0388: .4byte gSaveBlock1 + 0x2738\n\ +_default:\n\ + lsls r0, r6, 24\n\ + lsrs r0, 24\n\ + bl sub_80C03A8\n\ +_break:\n\ + adds r0, r6, 0x1\n\ + lsls r0, 16\n\ + lsrs r6, r0, 16\n\ + cmp r6, 0x17\n\ + bhi _080C03A0\n\ + b _080C01D8\n\ +_080C03A0:\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ +.syntax divided\n"); +} +#endif + +void sub_80C03A8(u8 showidx) { + gSaveBlock1.tvShows.shows[showidx].common.var01 = 0; +} + +void sub_80C03C8(u16 species, u8 showidx) { + if (sub_8090D90(SpeciesToNationalPokedexNum(species), 0) == 0) { + gSaveBlock1.tvShows.shows[showidx].common.var01 = 0; + } +} + +#ifdef NONMATCHING +void sub_80C0408(void) { + u16 i; + if (FlagGet(SYS_GAME_CLEAR) != 1) { + for (i=0; i<24; i++) { + if (gSaveBlock1.tvShows.shows[i].common.var00 == TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE || gSaveBlock1.tvShows.shows[i].common.var00 == TVSHOW_MASS_OUTBREAK) { + gSaveBlock1.tvShows.shows[i].common.var01 = 0; + } + } + } +} +#else +__attribute__((naked)) +void sub_80C0408(void) { + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + ldr r0, _080C044C @ =0x00000804\n\ + bl FlagGet\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + beq _080C0444\n\ + movs r2, 0\n\ + ldr r6, _080C0450 @ =gSaveBlock1\n\ + ldr r4, _080C0454 @ =0x00002739\n\ + movs r3, 0\n\ + ldr r5, _080C0458 @ =0x00002738\n\ +_080C0422:\n\ + lsls r0, r2, 3\n\ + adds r0, r2\n\ + lsls r0, 2\n\ + adds r1, r0, r6\n\ + adds r0, r1, r5\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x7\n\ + beq _080C0436\n\ + cmp r0, 0x29\n\ + bne _080C043A\n\ +_080C0436:\n\ + adds r0, r1, r4\n\ + strb r3, [r0]\n\ +_080C043A:\n\ + adds r0, r2, 0x1\n\ + lsls r0, 16\n\ + lsrs r2, r0, 16\n\ + cmp r2, 0x17\n\ + bls _080C0422\n\ +_080C0444:\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080C044C: .4byte 0x00000804\n\ +_080C0450: .4byte gSaveBlock1\n\ +_080C0454: .4byte 0x00002739\n\ +_080C0458: .4byte 0x00002738\n\ +.syntax divided\n"); +} +#endif + +void sub_80C045C(void) { + u8 i; + for (i=0; i<5; i++) { + if (sub_80BFB54(gSaveBlock1.tvShows.shows[i].common.var00) == 2) { + gSaveBlock1.tvShows.shows[i].common.var01 = 0; + } + } +} + +asm(".section .dotvshow\n"); + +void DoTVShowPokemonFanClubLetter(void); +void DoTVShowRecentHappenings(void); +void DoTVShowPokemonFanClubOpinions(void); +void nullsub_22(void); +void DoTVShowPokemonNewsMassOutbreak(void); +void DoTVShowBravoTrainerPokemonProfile(void); +void DoTVShowBravoTrainerBattleTowerProfile(void); +void DoTVShowPokemonTodaySuccessfulCapture(void); +void DoTVShowTodaysSmartShopper(void); +void DoTVShowTheNameRaterShow(void); +void DoTVShowPokemonTodayFailedCapture(void); +void DoTVShowPokemonAngler(void); +void DoTVShowTheWorldOfMasters(void); + +bool8 sub_80C06E8(struct UnknownSaveStruct2ABC *arg0, struct UnknownSaveStruct2ABC *arg1, s8 arg2); + +void sub_80C06BC(int *arg0, int *arg1) { + struct UnknownSaveStruct2ABC *str0; + struct UnknownSaveStruct2ABC *str1; + str0 = (void *)arg0[0]; + str1 = (void *)arg1[0]; + str1 += gUnknown_03000722; + sub_80C06E8(str0, str1, gUnknown_03005D38.var0); +} + +bool8 sub_80C06E8(struct UnknownSaveStruct2ABC *arg0, struct UnknownSaveStruct2ABC *arg1, s8 arg2) { + u8 i; + if (arg1->val0 == 0) { + return FALSE; + } + for (i=0; i<16; i++) { + if (arg0[i].val0 == arg1->val0) { + return FALSE; + } + } + arg0[arg2].val0 = arg1->val0; + arg0[arg2].val1 = 1; + arg0[arg2].val2 = arg1->val2; + return TRUE; +} + +s8 sub_80C0730(struct UnknownSaveStruct2ABC *arg0, u8 arg1) { + if (arg0[arg1].val0 == 0) { + return -1; + } + return arg1; +} + +void sub_80C0750(void) { + u8 i; + for (i=0; i<16; i++) { + if (gSaveBlock1.unknown_2ABC[i].val0 > 3) { + sub_80BEC10(i); + } + } + sub_80BEC40(); +} + +void sub_80C0788(void) { + u8 i; + if (FlagGet(SYS_GAME_CLEAR) != 1) { + for (i=0; i<16; i++) { + gSaveBlock1.unknown_2ABC[i].val1 = 0; + } + } +} + +void DoTVShow(void) { + if (gSaveBlock1.tvShows.shows[gSpecialVar_0x8004].common.var01 != 0) { + switch (gSaveBlock1.tvShows.shows[gSpecialVar_0x8004].common.var00) { + case TVSHOW_FAN_CLUB_LETTER: + DoTVShowPokemonFanClubLetter(); + break; + case TVSHOW_RECENT_HAPPENINGS: + DoTVShowRecentHappenings(); + break; + case TVSHOW_PKMN_FAN_CLUB_OPINIONS: + DoTVShowPokemonFanClubOpinions(); + break; + case TVSHOW_UNKN_SHOWTYPE_04: + nullsub_22(); + break; + case TVSHOW_MASS_OUTBREAK: + DoTVShowPokemonNewsMassOutbreak(); + break; + case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: + DoTVShowBravoTrainerPokemonProfile(); + break; + case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: + DoTVShowBravoTrainerBattleTowerProfile(); + break; + case TVSHOW_POKEMON_TODAY_CAUGHT: + DoTVShowPokemonTodaySuccessfulCapture(); + break; + case TVSHOW_SMART_SHOPPER: + DoTVShowTodaysSmartShopper(); + break; + case TVSHOW_NAME_RATER_SHOW: + DoTVShowTheNameRaterShow(); + break; + case TVSHOW_POKEMON_TODAY_FAILED: + DoTVShowPokemonTodayFailedCapture(); + break; + case TVSHOW_FISHING_ADVICE: + DoTVShowPokemonAngler(); + break; + case TVSHOW_WORLD_OF_MASTERS: + DoTVShowTheWorldOfMasters(); + break; + } + } +} + +void TVShowConvertInternationalString(u8 *dest, u8 *src, u8 language) { + StringCopy(dest, src); + if (language < LANGUAGE_ENGLISH) { + ConvertInternationalString(dest, LANGUAGE_JAPANESE); + } +} + asm(".section .text_c"); +void TVShowConvertInternationalString(u8 *, u8 *, u8); + +void TakeTVShowInSearchOfTrainersOffTheAir(void); + +void DoTVShowTheNameRaterShow(void) { + TVShow *tvShow; + u8 switchval; + tvShow = &gSaveBlock1.tvShows.shows[gSpecialVar_0x8004]; + gScriptResult = 0; + switchval = gUnknown_020387E8; + switch (switchval) { + case 0: + TVShowConvertInternationalString(gStringVar1, tvShow->nameRaterShow.trainerName, tvShow->nameRaterShow.language); + StringCopy(gStringVar2, gSpeciesNames[tvShow->nameRaterShow.species]); + TVShowConvertInternationalString(gStringVar3, tvShow->nameRaterShow.pokemonName, tvShow->nameRaterShow.pokemonNameLanguage); + gUnknown_020387E8 = sub_80BF7E8(&tvShow->nameRaterShow) + 1; + break; + case 1: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + if (tvShow->nameRaterShow.random == 0) { + gUnknown_020387E8 = 9; + } else if (tvShow->nameRaterShow.random == 1) { + gUnknown_020387E8 = 10; + } else if (tvShow->nameRaterShow.random == 2) { + gUnknown_020387E8 = 11; + } + break; + case 2: + TVShowConvertInternationalString(gStringVar1, tvShow->nameRaterShow.trainerName, tvShow->nameRaterShow.language); + if (tvShow->nameRaterShow.random == 0) { + gUnknown_020387E8 = 9; + } else if (tvShow->nameRaterShow.random == 1) { + gUnknown_020387E8 = 10; + } else if (tvShow->nameRaterShow.random == 2) { + gUnknown_020387E8 = 11; + } + break; + case 9: + case 10: + case 11: + sub_80BF820(0, 1, 0, 1, 0, &tvShow->nameRaterShow); + TVShowConvertInternationalString(gStringVar3, gStringVar1, tvShow->nameRaterShow.pokemonNameLanguage); + sub_80BF820(0, 0, 0, 1, 0, &tvShow->nameRaterShow); + TVShowConvertInternationalString(gStringVar2, gStringVar1, tvShow->nameRaterShow.pokemonNameLanguage); + TVShowConvertInternationalString(gStringVar1, tvShow->nameRaterShow.pokemonName, tvShow->nameRaterShow.pokemonNameLanguage); + gUnknown_020387E8 = 12; + break; + case 13: + sub_80BF820(0, 0, 3, 1, 0, &tvShow->nameRaterShow); + TVShowConvertInternationalString(gStringVar3, gStringVar1, tvShow->nameRaterShow.pokemonNameLanguage); + sub_80BF820(0, 0, 2, 0, 0, &tvShow->nameRaterShow); + TVShowConvertInternationalString(gStringVar2, gStringVar1, tvShow->nameRaterShow.language); + TVShowConvertInternationalString(gStringVar1, tvShow->nameRaterShow.trainerName, tvShow->nameRaterShow.language); + gUnknown_020387E8 = 14; + break; + case 14: + sub_80BF820(0, 0, 3, 0, 0, &tvShow->nameRaterShow); + TVShowConvertInternationalString(gStringVar3, gStringVar1, tvShow->nameRaterShow.language); + sub_80BF820(0, 0, 2, 1, 0, &tvShow->nameRaterShow); + TVShowConvertInternationalString(gStringVar2, gStringVar1, tvShow->nameRaterShow.pokemonNameLanguage); + TVShowConvertInternationalString(gStringVar1, tvShow->nameRaterShow.trainerName, tvShow->nameRaterShow.language); + gUnknown_020387E8 = 18; + break; + case 15: + sub_80BF820(1, 0, 2, 1, 0, &tvShow->nameRaterShow); + TVShowConvertInternationalString(gStringVar1, gStringVar2, tvShow->nameRaterShow.pokemonNameLanguage); + StringCopy(gStringVar2, gSpeciesNames[tvShow->nameRaterShow.species]); + sub_80BF820(2, 0, 3, 2, tvShow->nameRaterShow.species, &tvShow->nameRaterShow); + gUnknown_020387E8 = 16; + break; + case 16: + sub_80BF820(0, 0, 3, 1, 0, &tvShow->nameRaterShow); + TVShowConvertInternationalString(gStringVar3, gStringVar1, tvShow->nameRaterShow.pokemonNameLanguage); + sub_80BF820(0, 0, 2, 2, tvShow->nameRaterShow.species, &tvShow->nameRaterShow); + gUnknown_020387E8 = 17; + break; + case 17: + sub_80BF820(1, 0, 2, 1, 0, &tvShow->nameRaterShow); + TVShowConvertInternationalString(gStringVar1, gStringVar2, tvShow->nameRaterShow.pokemonNameLanguage); + sub_80BF820(2, 0, 3, 2, tvShow->nameRaterShow.var1C, &tvShow->nameRaterShow); + StringCopy(gStringVar2, gSpeciesNames[tvShow->nameRaterShow.var1C]); + gUnknown_020387E8 = 18; + break; + case 12: + switchval = 18; + gUnknown_020387E8 = 18; + case 18: + TVShowConvertInternationalString(gStringVar1, tvShow->nameRaterShow.pokemonName, tvShow->nameRaterShow.pokemonNameLanguage); + TVShowConvertInternationalString(gStringVar2, tvShow->nameRaterShow.trainerName, tvShow->nameRaterShow.language); + TVShowDone(); + break; + } + ShowFieldMessage(gTVNameRaterTextGroup[switchval]); +} + +void DoTVShowPokemonTodaySuccessfulCapture(void) { + TVShow *tvShow; + u8 switchval; + tvShow = &gSaveBlock1.tvShows.shows[gSpecialVar_0x8004]; + gScriptResult = 0; + switchval = gUnknown_020387E8; + switch (switchval) { + case 0: + TVShowConvertInternationalString(gStringVar1, tvShow->pokemonToday.playerName, tvShow->pokemonToday.language); + StringCopy(gStringVar2, gSpeciesNames[tvShow->pokemonToday.species]); + TVShowConvertInternationalString(gStringVar3, tvShow->pokemonToday.nickname, tvShow->pokemonToday.language2); + if (tvShow->pokemonToday.ball == ITEM_MASTER_BALL) { + gUnknown_020387E8 = 5; + } else { + gUnknown_020387E8 = 1; + } + break; + case 1: + gUnknown_020387E8 = 2; + break; + case 2: + StringCopy(gStringVar2, ItemId_GetItem(tvShow->pokemonToday.ball)->name); + sub_80BF088(2, tvShow->pokemonToday.var12); + if (tvShow->pokemonToday.var12 < 4) { + gUnknown_020387E8 = 3; + } else { + gUnknown_020387E8 = 4; + } + break; + case 3: + TVShowConvertInternationalString(gStringVar1, tvShow->pokemonToday.playerName, tvShow->pokemonToday.language); + StringCopy(gStringVar2, gSpeciesNames[tvShow->pokemonToday.species]); + TVShowConvertInternationalString(gStringVar3, tvShow->pokemonToday.nickname, tvShow->pokemonToday.language2); + gUnknown_020387E8 = 6; + break; + case 4: + gUnknown_020387E8 = 6; + break; + case 5: + TVShowConvertInternationalString(gStringVar1, tvShow->pokemonToday.playerName, tvShow->pokemonToday.language); + StringCopy(gStringVar2, gSpeciesNames[tvShow->pokemonToday.species]); + gUnknown_020387E8 = 6; + break; + case 6: + TVShowConvertInternationalString(gStringVar1, tvShow->pokemonToday.playerName, tvShow->pokemonToday.language); + StringCopy(gStringVar2, gSpeciesNames[tvShow->pokemonToday.species]); + TVShowConvertInternationalString(gStringVar3, tvShow->pokemonToday.nickname, tvShow->pokemonToday.language2); + gUnknown_020387E8 += (Random() % 4) + 1; + break; + case 7: + case 8: + StringCopy(gStringVar1, gSpeciesNames[tvShow->pokemonToday.species]); + TVShowConvertInternationalString(gStringVar2, tvShow->pokemonToday.nickname, tvShow->pokemonToday.language2); + sub_80BF638(2, tvShow->pokemonToday.species); + gUnknown_020387E8 = 11; + break; + case 9: + case 10: + StringCopy(gStringVar1, gSpeciesNames[tvShow->pokemonToday.species]); + TVShowConvertInternationalString(gStringVar2, tvShow->pokemonToday.nickname, tvShow->pokemonToday.language2); + gUnknown_020387E8 = 11; + break; + case 11: + TVShowDone(); + break; + } + ShowFieldMessage(gTVPokemonTodayTextGroup[switchval]); +} + +void DoTVShowPokemonTodayFailedCapture(void) { + TVShow *tvShow; + u8 switchval; + u16 rval; + tvShow = &gSaveBlock1.tvShows.shows[gSpecialVar_0x8004]; + gScriptResult = 0; + switchval = gUnknown_020387E8; + switch (switchval) { + case 0: + TVShowConvertInternationalString(gStringVar1, tvShow->pokemonTodayFailed.playerName, tvShow->pokemonTodayFailed.language); + StringCopy(gStringVar2, gSpeciesNames[tvShow->pokemonTodayFailed.species]); + gUnknown_020387E8 = 1; + break; + case 1: + TVShowConvertInternationalString(gStringVar1, tvShow->pokemonTodayFailed.playerName, tvShow->pokemonTodayFailed.language); + sub_80FBFB4(gStringVar2, tvShow->pokemonTodayFailed.var12, 0); + StringCopy(gStringVar3, gSpeciesNames[tvShow->pokemonTodayFailed.species2]); + if (tvShow->pokemonTodayFailed.var11 == 1) { + gUnknown_020387E8 = 3; + } else { + gUnknown_020387E8 = 2; + } + break; + case 2: + case 3: + TVShowConvertInternationalString(gStringVar1, tvShow->pokemonTodayFailed.playerName, tvShow->pokemonTodayFailed.language); + sub_80BF088(1, tvShow->pokemonTodayFailed.var10); + rval = (Random() % 3); + if (rval == 0) { + gUnknown_020387E8 = 5; + } else { + gUnknown_020387E8 = 4; + } + break; + case 4: + case 5: + TVShowConvertInternationalString(gStringVar1, tvShow->pokemonTodayFailed.playerName, tvShow->pokemonTodayFailed.language); + gUnknown_020387E8 = 6; + break; + case 6: + TVShowDone(); + break; + } + ShowFieldMessage(gTVPokemonTodayFailedCaptureTextGroup[switchval]); +} + +void DoTVShowPokemonFanClubLetter(void) { + TVShow *tvShow; + u8 switchval; + u16 rval; + tvShow = &gSaveBlock1.tvShows.shows[gSpecialVar_0x8004]; + gScriptResult = 0; + switchval = gUnknown_020387E8; + switch (switchval) { + case 0: + TVShowConvertInternationalString(gStringVar1, tvShow->fanclubLetter.playerName, tvShow->fanclubLetter.language); + StringCopy(gStringVar2, gSpeciesNames[tvShow->fanclubLetter.species]); + gUnknown_020387E8 = 50; + break; + case 1: + rval = (Random() % 4) + 1; + if (rval == 1) { + gUnknown_020387E8 = 2; + } else { + gUnknown_020387E8 = rval + 2; + } + break; + case 2: + gUnknown_020387E8 = 51; + break; + case 3: + gUnknown_020387E8 += (Random() % 3) + 1; + break; + case 4: + case 5: + case 6: + sub_80BF79C(tvShow); + gUnknown_020387E8 = 7; + break; + case 7: + rval = (Random() % 0x1f) + 0x46; + sub_80BF088(2, rval); + TVShowDone(); + break; + case 50: + ConvertEasyChatWordsToString(gStringVar4, tvShow->fanclubLetter.pad04, 2, 2); + ShowFieldMessage(gStringVar4); + gUnknown_020387E8 = 1; + return; + case 51: + ConvertEasyChatWordsToString(gStringVar4, tvShow->fanclubLetter.pad04, 2, 2); + ShowFieldMessage(gStringVar4); + gUnknown_020387E8 = 3; + return; + } + ShowFieldMessage(gTVFanClubTextGroup[switchval]); +} + +void DoTVShowRecentHappenings(void) { + TVShow *tvShow; + u8 switchval; + tvShow = &gSaveBlock1.tvShows.shows[gSpecialVar_0x8004]; + gScriptResult = 0; + switchval = gUnknown_020387E8; + switch (switchval) { + case 0: + TVShowConvertInternationalString(gStringVar1, tvShow->recentHappenings.playerName, tvShow->recentHappenings.language); + sub_80BF79C(tvShow); + gUnknown_020387E8 = 50; + break; + case 1: + gUnknown_020387E8 += 1 + (Random() % 3); + break; + case 2: + case 3: + case 4: + gUnknown_020387E8 = 5; + break; + case 5: + TVShowDone(); + break; + case 50: + ConvertEasyChatWordsToString(gStringVar4, tvShow->recentHappenings.var04, 2, 2); + ShowFieldMessage(gStringVar4); + gUnknown_020387E8 = 1; + return; + } + ShowFieldMessage(gTVRecentHappeningsTextGroup[switchval]); +} + +void DoTVShowPokemonFanClubOpinions(void) { + TVShow *tvShow; + u8 switchval; + tvShow = &gSaveBlock1.tvShows.shows[gSpecialVar_0x8004]; + gScriptResult = 0; + switchval = gUnknown_020387E8; + switch (switchval) { + case 0: + TVShowConvertInternationalString(gStringVar1, tvShow->fanclubOpinions.playerName, tvShow->fanclubOpinions.language); + StringCopy(gStringVar2, gSpeciesNames[tvShow->fanclubOpinions.var02]); + TVShowConvertInternationalString(gStringVar3, tvShow->fanclubOpinions.var10, tvShow->fanclubOpinions.var0E); + gUnknown_020387E8 = tvShow->fanclubOpinions.var04B + 1; + break; + case 1: + case 2: + case 3: + TVShowConvertInternationalString(gStringVar1, tvShow->fanclubOpinions.playerName, tvShow->fanclubOpinions.language); + StringCopy(gStringVar2, gSpeciesNames[tvShow->fanclubOpinions.var02]); + sub_80EB3FC(gStringVar3, tvShow->fanclubOpinions.var1C[0]); + gUnknown_020387E8 = 4; + break; + case 4: + TVShowConvertInternationalString(gStringVar1, tvShow->fanclubOpinions.playerName, tvShow->fanclubOpinions.language); + sub_80EB3FC(gStringVar3, tvShow->fanclubOpinions.var1C[1]); + TVShowDone(); + break; + } + ShowFieldMessage(gTVFanClubOpinionsTextGroup[switchval]); +} + +void nullsub_22(void) { + +} + void DoTVShowPokemonNewsMassOutbreak(void) { TVShow *tvShow; - tvShow = &gSaveBlock1.tvShows[gSpecialVar_0x8004]; + tvShow = &gSaveBlock1.tvShows.shows[gSpecialVar_0x8004]; sub_80FBFB4(gStringVar1, tvShow->massOutbreak.locationMapNum, 0); @@ -300,14 +2909,122 @@ void DoTVShowPokemonNewsMassOutbreak(void) ShowFieldMessage(gTVPokemonOutbreakTextGroup[gUnknown_020387E8]); } -asm(".section .text_d"); +void DoTVShowInSearchOfTrainers(void) { + u8 switchval; + gScriptResult = 0; + switchval = gUnknown_020387E8; + switch (switchval) { + case 0: + sub_80FBFB4(gStringVar1, gSaveBlock1.gabbyAndTyData.mapnum, 0); + if (gSaveBlock1.gabbyAndTyData.val9 > 1) { + gUnknown_020387E8 = 1; + } else { + gUnknown_020387E8 = 2; + } + break; + case 1: + gUnknown_020387E8 = 2; + break; + case 2: + if (gSaveBlock1.gabbyAndTyData.valA_0 == 0) { + gUnknown_020387E8 = 4; + } else if (gSaveBlock1.gabbyAndTyData.valA_3 != 0) { + gUnknown_020387E8 = 5; + } else if (gSaveBlock1.gabbyAndTyData.valA_2 != 0) { + gUnknown_020387E8 = 6; + } else if (gSaveBlock1.gabbyAndTyData.valA_1 != 0) { + gUnknown_020387E8 = 7; + } else { + gUnknown_020387E8 = 3; + } + break; + case 3: + StringCopy(gStringVar1, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon1]); + StringCopy(gStringVar2, gMoveNames[gSaveBlock1.gabbyAndTyData.move1]); + StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon2]); + gUnknown_020387E8 = 8; + break; + case 4: + case 5: + case 6: + case 7: + gUnknown_020387E8 = 8; + break; + case 8: + sub_80EB3FC(gStringVar1, gSaveBlock1.gabbyAndTyData.move2); + StringCopy(gStringVar2, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon1]); + StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon2]); + gScriptResult = 1; + gUnknown_020387E8 = 0;; + TakeTVShowInSearchOfTrainersOffTheAir(); + break; + } + ShowFieldMessage(gTVGabbyAndTyTextGroup[switchval]); +} + +void DoTVShowPokemonAngler(void) { + TVShow *tvShow; + u8 switchval; + tvShow = &gSaveBlock1.tvShows.shows[gSpecialVar_0x8004]; + gScriptResult = 0; + if (tvShow->pokemonAngler.var02 < tvShow->pokemonAngler.var03) { + gUnknown_020387E8 = 0; + } else { + gUnknown_020387E8 = 1; + } + switchval = gUnknown_020387E8; + switch (switchval) { + case 0: + TVShowConvertInternationalString(gStringVar1, tvShow->pokemonAngler.playerName, tvShow->pokemonAngler.language); + StringCopy(gStringVar2, gSpeciesNames[tvShow->pokemonAngler.var04]); + sub_80BF088(2, tvShow->pokemonAngler.var03); + TVShowDone(); + break; + case 1: + TVShowConvertInternationalString(gStringVar1, tvShow->pokemonAngler.playerName, tvShow->pokemonAngler.language); + StringCopy(gStringVar2, gSpeciesNames[tvShow->pokemonAngler.var04]); + sub_80BF088(2, tvShow->pokemonAngler.var02); + TVShowDone(); + break; + } + ShowFieldMessage(gTVFishingGuruAdviceTextGroup[switchval]); +} + +void DoTVShowTheWorldOfMasters(void) { + TVShow *tvShow; + u8 switchval; + tvShow = &gSaveBlock1.tvShows.shows[gSpecialVar_0x8004]; + gScriptResult = 0; + switchval = gUnknown_020387E8; + switch (switchval) { + case 0: + TVShowConvertInternationalString(gStringVar1, tvShow->worldOfMasters.playerName, + tvShow->worldOfMasters.language); + sub_80BF088(1, tvShow->worldOfMasters.var06); + sub_80BF088(2, tvShow->worldOfMasters.var02); + gUnknown_020387E8 = 1; + break; + case 1: + StringCopy(gStringVar1, gSpeciesNames[tvShow->worldOfMasters.var08]); + gUnknown_020387E8 = 2; + break; + case 2: + TVShowConvertInternationalString(gStringVar1, tvShow->worldOfMasters.playerName, + tvShow->worldOfMasters.language); + sub_80FBFB4(gStringVar2, tvShow->worldOfMasters.var0a, 0); + StringCopy(gStringVar3, gSpeciesNames[tvShow->worldOfMasters.var04]); + TVShowDone(); + break; + } + ShowFieldMessage(gTVWorldOfMastersTextGroup[switchval]); +} void TVShowDone(void) { gScriptResult = 1; gUnknown_020387E8 = 0; - gSaveBlock1.tvShows[gSpecialVar_0x8004].common.var01 = 0; + gSaveBlock1.tvShows.shows[gSpecialVar_0x8004].common.var01 = 0; } void sub_80C2014(void) |