From 75b2298d37fa39077f7d5b930c0629ad5064ab84 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 21 Jun 2021 10:19:41 -0400 Subject: Start syncing contest code documentation from Emerald --- src/battle_controller_link_opponent.c | 2 +- src/battle_controller_link_partner.c | 2 +- src/battle_controller_player.c | 2 +- src/battle_main.c | 2 +- src/battle_setup.c | 18 +- src/battle_tower.c | 18 +- src/berry_blender.c | 2 +- src/cable_club.c | 20 +- src/contest.c | 42 +- src/contest_ai.c | 5 +- src/contest_link.c | 755 +++++++++ src/contest_link_80C2020.c | 2906 -------------------------------- src/contest_link_80C857C.c | 755 --------- src/contest_link_util.c | 2911 +++++++++++++++++++++++++++++++++ src/contest_util.c | 576 +++++++ src/debug/matsuda_debug_menu.c | 38 +- src/field_fadetransition.c | 2 +- src/link.c | 4 +- src/mystery_event_menu.c | 4 +- src/new_game.c | 10 +- src/overworld.c | 16 +- src/post_battle_event_funcs.c | 6 +- src/record_mixing.c | 2 +- src/scrcmd.c | 14 +- src/script_pokemon_util_80C4BF0.c | 570 ------- src/trade.c | 6 +- src/trainer_card.c | 12 +- 27 files changed, 4356 insertions(+), 4344 deletions(-) create mode 100644 src/contest_link.c delete mode 100644 src/contest_link_80C2020.c delete mode 100644 src/contest_link_80C857C.c create mode 100644 src/contest_link_util.c create mode 100644 src/contest_util.c delete mode 100644 src/script_pokemon_util_80C4BF0.c (limited to 'src') diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index eafe78b42..90af47511 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -519,7 +519,7 @@ void sub_8037F34(void) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) { - sub_800832C(); + SetCloseLinkCallback(); gBattlerControllerFuncs[gActiveBattler] = sub_8037EF0; } else diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index 946e943e4..45b2afae9 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -456,7 +456,7 @@ void sub_811E29C(void) { if (gBattleTypeFlags & 2) { - sub_800832C(); + SetCloseLinkCallback(); gBattlerControllerFuncs[gActiveBattler] = sub_811E258; } else diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 271f5cfd1..967ff347b 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -975,7 +975,7 @@ void sub_802D18C(void) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) { - sub_800832C(); + SetCloseLinkCallback(); gBattlerControllerFuncs[gActiveBattler] = sub_802D148; } else diff --git a/src/battle_main.c b/src/battle_main.c index 3c490e626..9ec46033d 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -666,7 +666,7 @@ void sub_800F104(void) if (!gPaletteFade.active) { gBattleCommunication[0] = 3; - sub_800832C(); + SetCloseLinkCallback(); } break; case 3: diff --git a/src/battle_setup.c b/src/battle_setup.c index d8319e620..bc569dff7 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -2,6 +2,14 @@ #include "battle_setup.h" #include "battle.h" #include "battle_transition.h" +#include "constants/battle_setup.h" +#include "constants/items.h" +#include "constants/map_types.h" +#include "constants/maps.h" +#include "constants/opponents.h" +#include "constants/songs.h" +#include "constants/species.h" +#include "contest_util.h" #include "data2.h" #include "event_data.h" #include "field_control_avatar.h" @@ -13,12 +21,11 @@ #include "fldeff_poison.h" #include "main.h" #include "metatile_behavior.h" +#include "overworld.h" #include "palette.h" #include "random.h" -#include "overworld.h" #include "safari_zone.h" #include "script.h" -#include "script_pokemon_80C4.h" #include "secret_base.h" #include "sound.h" #include "starter_choose.h" @@ -27,13 +34,6 @@ #include "task.h" #include "text.h" #include "trainer.h" -#include "constants/battle_setup.h" -#include "constants/map_types.h" -#include "constants/maps.h" -#include "constants/opponents.h" -#include "constants/songs.h" -#include "constants/species.h" -#include "constants/items.h" extern u16 gSpecialVar_Result; diff --git a/src/battle_tower.c b/src/battle_tower.c index 5d3bc207d..6b8af4d86 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -1,31 +1,31 @@ #include "global.h" +#include "battle_tower.h" #include "battle.h" #include "battle_setup.h" -#include "battle_tower.h" #include "battle_transition.h" +#include "constants/easy_chat.h" +#include "constants/event_objects.h" +#include "constants/items.h" +#include "constants/moves.h" +#include "constants/species.h" +#include "constants/vars.h" +#include "contest_util.h" #include "data2.h" #include "easy_chat.h" -#include "constants/easy_chat.h" #include "event_data.h" +#include "ewram.h" #include "item.h" -#include "constants/items.h" #include "main.h" -#include "constants/event_objects.h" -#include "constants/moves.h" #include "new_game.h" #include "overworld.h" #include "pokedex.h" #include "random.h" #include "save.h" -#include "script_pokemon_80C4.h" -#include "constants/species.h" #include "string_util.h" #include "task.h" #include "text.h" #include "trainer.h" #include "tv.h" -#include "constants/vars.h" -#include "ewram.h" #if ENGLISH #include "data/battle_tower/trainers.h" diff --git a/src/berry_blender.c b/src/berry_blender.c index 7955c1458..b8897f964 100644 --- a/src/berry_blender.c +++ b/src/berry_blender.c @@ -2479,7 +2479,7 @@ static void sub_8050E30(void) case 11: if (++gBerryBlenderData->framesToWait > 30) { - sub_800832C(); + SetCloseLinkCallback(); gBerryBlenderData->field_6F++; } break; diff --git a/src/cable_club.c b/src/cable_club.c index aeae50f50..961ab739f 100644 --- a/src/cable_club.c +++ b/src/cable_club.c @@ -1,7 +1,9 @@ #include "global.h" +#include "cable_club.h" #include "battle.h" #include "battle_records.h" -#include "cable_club.h" +#include "constants/songs.h" +#include "contest_util.h" #include "event_data.h" #include "field_message_box.h" #include "field_specials.h" @@ -11,12 +13,10 @@ #include "m4a.h" #include "main.h" #include "menu.h" +#include "overworld.h" #include "palette.h" #include "record_mixing.h" -#include "overworld.h" #include "script.h" -#include "script_pokemon_80C4.h" -#include "constants/songs.h" #include "sound.h" #include "start_menu.h" #include "string_util.h" @@ -431,7 +431,7 @@ static void sub_80831F8(u8 taskId) return; if (gSpecialVar_Result == 3) { - sub_800832C(); + SetCloseLinkCallback(); HideFieldMessageBox(); gTasks[taskId].func = sub_80833C4; } @@ -452,7 +452,7 @@ static void sub_8083288(u8 taskId) if (gSpecialVar_Result == 3) { - sub_800832C(); + SetCloseLinkCallback(); HideFieldMessageBox(); gTasks[taskId].func = sub_80833C4; } @@ -511,7 +511,7 @@ static void sub_8083314(u8 taskId) return; } - sub_800832C(); + SetCloseLinkCallback(); gTasks[taskId].func = sub_80833C4; } @@ -757,7 +757,7 @@ static void sub_808382C(u8 taskId) task->data[0]++; break; case 3: - sub_800832C(); + SetCloseLinkCallback(); task->data[0]++; break; case 4: @@ -890,7 +890,7 @@ static void sub_8083AAC(u8 taskId) gUnknown_020297D8.field0 = 0; gUnknown_020297D8.field1 = 0; m4aMPlayAllStop(); - sub_800832C(); + SetCloseLinkCallback(); task->data[0]++; break; case 3: @@ -1009,7 +1009,7 @@ static void sub_8083CA4(u8 taskId) void unref_sub_8083CC8(u8 taskId) { - sub_800832C(); + SetCloseLinkCallback(); gTasks[taskId].func = sub_8083CA4; } diff --git a/src/contest.c b/src/contest.c index 20e25e829..cea968738 100644 --- a/src/contest.c +++ b/src/contest.c @@ -1,15 +1,16 @@ #include "global.h" -#include "constants/items.h" +#include "contest.h" +#include "battle.h" +#include "battle_anim.h" +#include "blend_palette.h" #include "constants/event_objects.h" +#include "constants/items.h" #include "constants/moves.h" #include "constants/songs.h" #include "constants/species.h" -#include "battle.h" -#include "battle_anim.h" -#include "blend_palette.h" -#include "contest.h" +#include "contest_ai.h" #include "contest_effect.h" -#include "contest_link_80C857C.h" +#include "contest_link.h" #include "data2.h" #include "decompress.h" #include "ewram.h" @@ -23,6 +24,7 @@ #include "palette.h" #include "random.h" #include "rom_8077ABC.h" +#include "scanline_effect.h" #include "script.h" #include "sound.h" #include "sprite.h" @@ -30,9 +32,7 @@ #include "task.h" #include "text.h" #include "tv.h" -#include "scanline_effect.h" #include "util.h" -#include "contest_ai.h" extern u8 gUnknown_020297ED; @@ -267,8 +267,8 @@ void SelectContestMoveBankTarget(u16); EWRAM_DATA u8 gUnknown_0203856C = 0; EWRAM_DATA struct ContestPokemon gContestMons[4] = {0}; -EWRAM_DATA s16 gContestMonConditions[4] = {0}; -EWRAM_DATA s16 gUnknown_02038678[4] = {0}; +EWRAM_DATA s16 gContestMonRound1Points[4] = {0}; +EWRAM_DATA s16 gContestMonTotalPoints[4] = {0}; EWRAM_DATA s16 gUnknown_02038680[4] = {0}; EWRAM_DATA s16 gUnknown_02038688[4] = {0}; EWRAM_DATA u8 gContestFinalStandings[4] = {0}; // What "place" each participant came in. @@ -276,7 +276,7 @@ EWRAM_DATA u8 gContestMonPartyIndex = 0; EWRAM_DATA u8 gContestPlayerMonIndex = 0; EWRAM_DATA u8 gUnknown_02038696[4] = {0}; EWRAM_DATA u8 gIsLinkContest = 0; -EWRAM_DATA u8 gUnknown_0203869B = 0; +EWRAM_DATA u8 gContestLinkLeaderIndex = 0; EWRAM_DATA u16 gSpecialVar_ContestCategory = 0; EWRAM_DATA u16 gSpecialVar_ContestRank = 0; @@ -380,7 +380,7 @@ void ClearContestVars(void) memset(&shared19328, 0, sizeof(shared19328)); memset(shared19338, 0, 4 * sizeof(*shared19338)); if (!(gIsLinkContest & 1)) - sub_80B0F28(0); + SortContestants(0); for (i = 0; i < 4; i++) { sContestantStatus[i].nextTurnOrder = 0xFF; @@ -2093,7 +2093,7 @@ void sub_80AE054(void) bool8 sub_80AE074(void) { - if (gContestPlayerMonIndex == gUnknown_0203869B) + if (gContestPlayerMonIndex == gContestLinkLeaderIndex) return TRUE; else return FALSE; @@ -2420,7 +2420,7 @@ void InitContestMonConditions(u8 a) u8 i; for (i = 0; i < 4; i++) - gContestMonConditions[i] = InitContestMonConditionI(i, a); + gContestMonRound1Points[i] = InitContestMonConditionI(i, a); } u8 CreateJudgeSprite(void) @@ -2896,7 +2896,7 @@ void sub_80AF2FC(void) } } } - sub_80B0F28(1); + SortContestants(1); sub_80B159C(); } @@ -3021,7 +3021,7 @@ bool8 unref_sub_80AF5D0(u8 a, u8 b) void sub_80AF630(u8 a) { gUnknown_02038688[a] = sub_80AF688(a); - gUnknown_02038678[a] = gContestMonConditions[a] + gUnknown_02038688[a]; + gContestMonTotalPoints[a] = gContestMonRound1Points[a] + gUnknown_02038688[a]; } void sub_80AF668(void) @@ -3063,8 +3063,8 @@ void DetermineFinalStandings(void) for (i = 0; i < 4; i++) { - sp8[i].unk0 = gUnknown_02038678[i]; - sp8[i].unk4 = gContestMonConditions[i]; + sp8[i].unk0 = gContestMonTotalPoints[i]; + sp8[i].unk4 = gContestMonRound1Points[i]; sp8[i].unk8 = sp0[i]; sp8[i].unkC = i; } @@ -4397,7 +4397,7 @@ void unref_sub_80B0EE8(s32 *a, s32 b) } // something to do with contest NPC opponents, I think. -void sub_80B0F28(u8 a) +void SortContestants(u8 a) { u8 sp0[4]; u16 sp4[4] = {0}; @@ -4425,8 +4425,8 @@ void sub_80B0F28(u8 a) gUnknown_02038696[i] = i; for (r4 = 0; r4 < i; r4++) { - if (gContestMonConditions[gUnknown_02038696[r4]] < gContestMonConditions[i] - || (gContestMonConditions[gUnknown_02038696[r4]] == gContestMonConditions[i] && sp4[gUnknown_02038696[r4]] < sp4[i])) + if (gContestMonRound1Points[gUnknown_02038696[r4]] < gContestMonRound1Points[i] + || (gContestMonRound1Points[gUnknown_02038696[r4]] == gContestMonRound1Points[i] && sp4[gUnknown_02038696[r4]] < sp4[i])) { for (r2 = i; r2 > r4; r2--) gUnknown_02038696[r2] = gUnknown_02038696[r2 - 1]; diff --git a/src/contest_ai.c b/src/contest_ai.c index 06d4c11ca..77bfa40b6 100644 --- a/src/contest_ai.c +++ b/src/contest_ai.c @@ -632,7 +632,7 @@ static void ContestAICmd_unk_19(void) static void ContestAICmd_unk_1A(void) { - eContestAI->scriptResult = gContestMonConditions[eContestAI->unk41]; + eContestAI->scriptResult = gContestMonRound1Points[eContestAI->unk41]; gAIScriptPtr += 1; } @@ -1353,7 +1353,8 @@ static void ContestAICmd_unk_5E(void) { u8 var = sub_8128A7C(gAIScriptPtr[1]); - eContestAI->scriptResult = gContestMonConditions[var] - gContestMonConditions[eContestAI->unk41]; + eContestAI->scriptResult = + gContestMonRound1Points[var] - gContestMonRound1Points[eContestAI->unk41]; gAIScriptPtr += 2; } diff --git a/src/contest_link.c b/src/contest_link.c new file mode 100644 index 000000000..be2be27ff --- /dev/null +++ b/src/contest_link.c @@ -0,0 +1,755 @@ +#include "global.h" +#include "ewram.h" +#include "random.h" +#include "task.h" +#include "contest.h" +#include "text.h" +#include "string_util.h" +#include "link.h" + +static void sub_80C8644(u8 taskId); +static void sub_80C8660(u8 taskId); +#if GERMAN +static void de_sub_80C9274(bool32 arg0); +static void de_sub_80C9294(bool32 arg0); +#endif + +static void SendBlockToAllOpponents(const void *data, u16 size) +{ + memcpy(eContestLinkSendBuffer, data, size); + SendBlock(bitmask_all_link_players_but_self(), eContestLinkSendBuffer, size); +} + +static bool8 HasPlayerReceivedBlock(u8 who) +{ + u8 flag = 1 << who; + if (!(GetBlockReceivedStatus() & flag)) + return FALSE; + ResetBlockReceivedFlag(flag); + return TRUE; +} + +static bool8 HaveAllPlayersReceivedBlock(void) +{ + int i; + + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + if (!((GetBlockReceivedStatus() >> i) & 1)) + return FALSE; + } + ResetBlockReceivedFlags(); + return TRUE; +} + +void Task_LinkContest_Init(u8 taskId) +{ +#if ENGLISH + u8 i; + + for (i = 0; i < 4; i++) + gBlockRecvBuffer[i][0] = 0xff; +#endif + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = sub_80C8644; +} + +static void sub_80C8644(u8 taskId) +{ + gTasks[taskId].func = sub_80C8660; +} + +static void sub_80C8660(u8 taskId) +{ + if (gReceivedRemoteLinkPlayers) + { + gContestPlayerMonIndex = GetMultiplayerId(); + if (GetLinkPlayerCount() == MAX_LINK_PLAYERS) + { + gIsLinkContest = TRUE; + SwitchTaskToFollowupFunc(taskId); + } + } +} + +#ifdef NONMATCHING +u8 GetStringLanguage(const u8 *string) +{ + u8 language = GAME_LANGUAGE; + if (string[0] == EXT_CTRL_CODE_BEGIN && string[1] == 0x15) + return language; + if (StringLength(string) > 5) + return language; + for (; *string != EOS; string++) + { + if (!((*string >= CHAR_A && *string <= CHAR_z) || + (*string >= CHAR_0 + 0 && *string <= CHAR_0 + 9) || + *string == CHAR_SPACE || + *string == CHAR_PERIOD || + *string == CHAR_COMMA || + *string == 0xAB || + *string == CHAR_QUESTION_MARK || + *string == CHAR_MALE || + *string == CHAR_FEMALE || + *string == CHAR_SLASH || + *string == CHAR_HYPHEN || + *string == CHAR_ELLIPSIS || + *string == 0xB1 || + *string == 0xB2 || + *string == 0xB3 || + *string == 0xB1 + )) + { + language = LANGUAGE_JAPANESE; + break; + } + } + return language; +} +#else +NAKED u8 GetStringLanguage(const u8 *string) +{ + asm_unified("\tpush {r4,r5,lr}\n" + "\tadds r4, r0, 0\n" + ".ifdef ENGLISH\n" + "\tmovs r5, 0x2\n" + ".else\n" + "\tmovs r5, 0x5\n" + ".endif\n" + "\tldrb r0, [r4]\n" + "\tcmp r0, 0xFC\n" + "\tbne _080C86B6\n" + "\tldrb r0, [r4, 0x1]\n" + "\tcmp r0, 0x15\n" + "\tbne _080C86B6\n" + ".ifdef ENGLISH\n" + "\tmovs r0, 0x2\n" + ".else\n" + "\tmovs r0, 0x5\n" + ".endif\n" + "\tb _080C872C\n" + "_080C86B6:\n" + "\tadds r0, r4, 0\n" + "\tbl StringLength\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r0, 0x5\n" + "\tbhi _080C872A\n" + "\tldrb r0, [r4]\n" + "\tcmp r0, 0xFF\n" + "\tbeq _080C872A\n" + "_080C86CA:\n" + "\tldrb r1, [r4]\n" + "\tadds r0, r1, 0\n" + "\tadds r0, 0x45\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0x33\n" + "\tbls _080C871E\n" + "\tadds r0, r1, 0\n" + "\tadds r0, 0x5F\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0x9\n" + "\tbls _080C871E\n" + "\tadds r0, r1, 0\n" + "\tcmp r0, 0\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xAD\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB8\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xAB\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xAC\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB5\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB6\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xBA\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xAE\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB0\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB1\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB2\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB3\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB1\n" + "\tbne _080C8728\n" + "_080C871E:\n" + "\tadds r4, 0x1\n" + "\tldrb r0, [r4]\n" + "\tcmp r0, 0xFF\n" + "\tbne _080C86CA\n" + "\tb _080C872A\n" + "_080C8728:\n" + "\tmovs r5, 0x1\n" + "_080C872A:\n" + "\tadds r0, r5, 0\n" + "_080C872C:\n" + "\tpop {r4,r5}\n" + "\tpop {r1}\n" + "\tbx r1"); +} +#endif + +void sub_80C8734(u8 taskId) +{ + int i; + u8 *name; + + switch (gTasks[taskId].data[0]) { +#if ENGLISH + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; +#elif GERMAN + case 8: +#endif + case 0: + if (GetMultiplayerId() == 0) { + if (IsLinkTaskFinished()) { +#if ENGLISH + memcpy(gBlockSendBuffer, gContestMons + gContestPlayerMonIndex, sizeof(struct ContestPokemon)); + sub_8007E9C(2); + gTasks[taskId].data[0]++; +#elif GERMAN + if (gTasks[taskId].data[0] == 0) + { + gTasks[taskId].data[0] = 3; + } + else + { + memcpy(gBlockSendBuffer, gContestMons + gContestPlayerMonIndex, sizeof(struct ContestPokemon)); + de_sub_80C9274(FALSE); + sub_8007E9C(2); + gTasks[taskId].data[0] = 1; + } +#endif + } + } + else + { + memcpy(gBlockSendBuffer, gContestMons + gContestPlayerMonIndex, sizeof(struct ContestPokemon)); +#if GERMAN + de_sub_80C9294(FALSE); +#endif + gTasks[taskId].data[0]++; + } + break; + case 1: + if (HaveAllPlayersReceivedBlock()) + { + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + memcpy(gContestMons + i, gBlockRecvBuffer[i], sizeof(struct ContestPokemon)); + name = gContestMons[i].nickname; + if (gLinkPlayers[i].language == LANGUAGE_JAPANESE) + { + ConvertInternationalString(name, GetStringLanguage(name)); + } + else if (name[10] == EXT_CTRL_CODE_BEGIN) + { + ConvertInternationalString(name, LANGUAGE_JAPANESE); + } else + { + name[5] = name[10]; + name[10] = EOS; + } + name = gContestMons[i].trainerName; + if (gLinkPlayers[i].language == LANGUAGE_JAPANESE) + { + name[7] = EOS; + name[6] = name[4]; + name[5] = name[3]; + name[4] = name[2]; + name[3] = name[1]; + name[2] = name[0]; + name[1] = 0x15; + name[0] = EXT_CTRL_CODE_BEGIN; + } + else + { + name[5] = name[7]; + name[7] = EOS; + } + } + gTasks[taskId].data[0]++; + } + break; +#if GERMAN + case 2: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + default: + gTasks[taskId].data[0]++; + break; +#endif + } +} + +void Task_LinkContest_CommunicateRng(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + case 0: + if (GetMultiplayerId() == 0) + { + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(&gRngValue, sizeof(u32)); + gTasks[taskId].data[0]++; + } + } + else + { + gTasks[taskId].data[0]++; + } + break; + case 1: + if (HasPlayerReceivedBlock(0)) + { + memcpy(&gRngValue, gBlockRecvBuffer[0], sizeof(u32)); + memcpy(&gContestRngValue, gBlockRecvBuffer[0], sizeof(u32)); + gTasks[taskId].data[0]++; + } + break; + } +} + +void Task_LinkContest_CommunicateCategory(u8 taskId) +{ + int i; + + switch (gTasks[taskId].data[0]) + { +#if ENGLISH + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; +#elif GERMAN + case 8: +#endif + case 0: + gBlockSendBuffer[0] = gTasks[taskId].data[9]; + if (GetMultiplayerId() == 0) + { + if (IsLinkTaskFinished()) + { +#if ENGLISH + sub_8007E9C(2); + gTasks[taskId].data[0]++; +#elif GERMAN + if (gTasks[taskId].data[0] == 0) + { + gTasks[taskId].data[0] = 3; + } + else + { + de_sub_80C9274(TRUE); + sub_8007E9C(2); + gTasks[taskId].data[0] = 1; + } +#endif + } + } + else + { +#if GERMAN + de_sub_80C9294(TRUE); +#endif + gTasks[taskId].data[0]++; + } + break; + case 1: + if (HaveAllPlayersReceivedBlock()) + { + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + gTasks[taskId].data[i + 1] = gBlockRecvBuffer[i][0]; + } + gTasks[taskId].data[0]++; + } + break; +#if GERMAN + case 2: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + default: + gTasks[taskId].data[0]++; + break; +#endif + } +} + +void sub_80C89DC(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + case 0: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(&gContestPlayerMonIndex, sizeof(u8)); + gTasks[taskId].data[0]++; + } + break; + case 1: + if (HaveAllPlayersReceivedBlock()) + { + gTasks[taskId].data[0]++; + } + break; + } +} + +void sub_80C8A38(u8 taskId) +{ + int i; + + switch (gTasks[taskId].data[0]) + { + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + case 0: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(&sContestantStatus[gContestPlayerMonIndex].currMove, sizeof(u16)); + gTasks[taskId].data[0]++; + } + break; + case 1: + if (HaveAllPlayersReceivedBlock()) + { + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + *&sContestantStatus[i].currMove = gBlockRecvBuffer[i][0]; + } + gTasks[taskId].data[0]++; + } + break; + } +} + +void sub_80C8AD0(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(gContestMonTotalPoints, sizeof gContestMonTotalPoints); + gTasks[taskId].data[0]++; + } + break; + case 1: + if (HaveAllPlayersReceivedBlock()) + { + memcpy(gContestMonTotalPoints, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof gContestMonTotalPoints); + gTasks[taskId].data[0]++; + } + break; + case 2: + case 5: + case 8: + case 11: + if (gTasks[taskId].data[1]++ > 10) + { + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[0]++; + } + break; + case 3: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(gUnknown_02038680, sizeof gUnknown_02038680); + gTasks[taskId].data[0]++; + } + break; + case 4: + if (HaveAllPlayersReceivedBlock()) + { + memcpy(gUnknown_02038680, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof gUnknown_02038680); + gTasks[taskId].data[0]++; + } + break; + case 6: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(gUnknown_02038688, sizeof gUnknown_02038688); + gTasks[taskId].data[0]++; + } + break; + case 7: + if (HaveAllPlayersReceivedBlock()) + { + memcpy(gUnknown_02038688, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof gUnknown_02038688); + gTasks[taskId].data[0]++; + } + break; + case 9: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(gContestFinalStandings, sizeof gContestFinalStandings); + gTasks[taskId].data[0]++; + } + break; + case 10: + if (HaveAllPlayersReceivedBlock()) + { + memcpy(gContestFinalStandings, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof gContestFinalStandings); + gTasks[taskId].data[0]++; + } + break; + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + } +} + +void sub_80C8C80(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(sContestantStatus, 4 * sizeof(struct ContestantStatus)); + gTasks[taskId].data[0]++; + } + break; + case 1: + if (HaveAllPlayersReceivedBlock()) + { + memcpy(sContestantStatus, gBlockRecvBuffer[gContestLinkLeaderIndex], 4 * sizeof(struct ContestantStatus)); + gTasks[taskId].data[0]++; + } + break; + case 2: + case 5: + case 8: + case 11: + if (gTasks[taskId].data[1]++ > 10) + { + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[0]++; + } + break; + case 3: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(&shared192D0, sizeof shared192D0); + gTasks[taskId].data[0]++; + } + break; + case 4: + if (HaveAllPlayersReceivedBlock()) + { + memcpy(&shared192D0, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof shared192D0); + gTasks[taskId].data[0]++; + } + break; + case 6: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(&shared19328, sizeof shared19328); + gTasks[taskId].data[0]++; + } + break; + case 7: + if (HaveAllPlayersReceivedBlock()) + { + memcpy(&shared19328, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof shared19328); + gTasks[taskId].data[0]++; + } + break; + case 9: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(gUnknown_02038696, sizeof gUnknown_02038696); + gTasks[taskId].data[0]++; + } + break; + case 10: + if (HaveAllPlayersReceivedBlock()) + { + memcpy(gUnknown_02038696, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof gUnknown_02038696); + gTasks[taskId].data[0]++; + } + break; + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + } +} + +void Task_LinkContest_CommunicateLeaderIds(u8 taskId) +{ + int i; + + switch (gTasks[taskId].data[0]) + { +#if ENGLISH + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; +#elif GERMAN + case 8: +#endif + case 0: + gBlockSendBuffer[0] = 0x64; + if (GetMultiplayerId() == 0) + { + if (IsLinkTaskFinished()) + { +#if ENGLISH + sub_8007E9C(2); + gTasks[taskId].data[0]++; +#elif GERMAN + if (gTasks[taskId].data[0] == 0) + { + gTasks[taskId].data[0] = 3; + } + else + { + de_sub_80C9274(FALSE); + sub_8007E9C(2); + gTasks[taskId].data[0] = 1; + } +#endif + } + } + else + { +#if GERMAN + de_sub_80C9294(FALSE); +#endif + gTasks[taskId].data[0]++; + } + break; + case 1: + if (HaveAllPlayersReceivedBlock()) + { + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + gTasks[taskId].data[5 + i] = gBlockRecvBuffer[i][0]; + } + gTasks[taskId].data[0]++; + } + break; +#if GERMAN + case 2: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + default: + gTasks[taskId].data[0]++; + break; +#endif + } +} + +void Task_LinkContest_CommunicateRound1Points(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + case 0: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(gContestMonRound1Points, sizeof gContestMonRound1Points); + gTasks[taskId].data[0]++; + } + break; + case 1: + if (HaveAllPlayersReceivedBlock()) + { + memcpy(gContestMonRound1Points, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof gContestMonRound1Points); + gTasks[taskId].data[0]++; + } + break; + } +} + +void Task_LinkContest_CommunicateTurnOrder(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + case 0: + if (IsLinkTaskFinished()) + { + SendBlockToAllOpponents(gUnknown_02038696, sizeof gUnknown_02038696); + gTasks[taskId].data[0]++; + } + break; + case 1: + if (HaveAllPlayersReceivedBlock()) + { + memcpy(gUnknown_02038696, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof gUnknown_02038696); + gTasks[taskId].data[0]++; + } + break; + } +} + +#if GERMAN + +static void de_sub_80C9274(bool32 arg0) +{ + if (deUnkValue2 == 1) + { + if (arg0) + deUnkValue2 = 3; + else + deUnkValue2 = 2; + } +} + +static void de_sub_80C9294(bool32 arg0) +{ + if (deUnkValue2 == 1) + { + if (arg0) + deUnkValue2 = 3; + else + deUnkValue2 = 2; + } + else if (deUnkValue2 == 2) + { + SendBlock(0, sBlockRequestLookupTable[deUnkValue1].address, sBlockRequestLookupTable[deUnkValue1].size); + if (arg0) + deUnkValue2 = 0; + else + deUnkValue2 = 1; + } +} + +#endif diff --git a/src/contest_link_80C2020.c b/src/contest_link_80C2020.c deleted file mode 100644 index 579ee3688..000000000 --- a/src/contest_link_80C2020.c +++ /dev/null @@ -1,2906 +0,0 @@ -#include "global.h" -#include "data2.h" -#include "util.h" -#include "random.h" -#include "overworld.h" -#include "constants/songs.h" -#include "ewram.h" -#include "main.h" -#include "scanline_effect.h" -#include "decompress.h" -#include "palette.h" -#include "blend_palette.h" -#include "graphics.h" -#include "strings2.h" -#include "text.h" -#include "string_util.h" -#include "menu.h" -#include "sound.h" -#include "pokedex.h" -#include "pokemon_icon.h" -#include "tv.h" -#include "battle.h" -#include "contest.h" -#include "link.h" -#include "field_effect.h" -#include "field_specials.h" -#include "contest_link_80C857C.h" -#include "contest_link_80C2020.h" -#include "pokemon_storage_system.h" -#include "event_data.h" -#include "script.h" -#include "trig.h" - -#define ABS(x) ((x) < 0 ? -(x) : (x)) - -#define GET_CONTEST_WINNER(var) { \ - for ((var) = 0; (var) < 4; (var)++) \ - { \ - if (gContestFinalStandings[i] == 0) \ - break; \ - } \ -} - -struct UnkEwramStruct18000 { - u8 unk_00; - u8 unk_01; - u8 unk_02; - u8 unk_03; - u8 unk_04; - u8 unk_05; - u8 unk_06; - u8 unk_07; - u8 unk_08; - u8 unk_09; - u8 unk_0a; - s16 unk_0c[4]; - u8 unk_14; -}; - -struct UnkEwramStruct18018 { - s32 unk_00; - s32 unk_04; - u32 unk_08; - u32 unk_0c; - u8 unk_10; - u8 unk_11; - u8 unk_12; -}; - -#define eContestLink80C2020Struct2018000 (*(struct UnkEwramStruct18000 *)(gSharedMem + 0x18000)) -#define eContestLink80C2020Struct2018018 ((struct UnkEwramStruct18018 *)(gSharedMem + 0x18018)) -#define eContestLink80C2020Struct2018068 (gSharedMem + 0x18068) - -static void sub_80C2430(void); -static void sub_80C2448(void); -static void sub_80C24F4(u8 taskId); -static void sub_80C255C(u8 taskId); -static void sub_80C25A4(u8 taskId); -static void sub_80C25C0(u8 taskId); -static void sub_80C2600(u8 taskId); -static void sub_80C26E4(u8 taskId); -static void sub_80C2770(u8 taskId); -static void sub_80C27EC(u8 taskId); -static void sub_80C2878(u8 taskId); -static void sub_80C2A8C(u8 taskId); -static void sub_80C2D1C(u8 taskId); -static void sub_80C2D80(u8 taskId); -static void sub_80C2DD8(u8 taskId); -static void sub_80C2E14(u8 taskId); -static void sub_80C2EA0(u8 taskId); -static void sub_80C2F28(u8 taskId); -static void sub_80C2F64(u8 taskId); -static void LoadAllContestMonIcons(u8 srcOffset, bool8 useDmaNow); -void sub_80C310C(void); -void sub_80C3158(const u8 *string, u8 spriteId); -void sub_80C33DC(void); -u16 sub_80C34AC(const u8 *string); -void sub_80C34CC(s16 data4, u16 pos0y, u16 data5, u16 data6); -void sub_80C3520(u16 a0); -void sub_80C3588(struct Sprite *sprite); -void sub_80C35FC(struct Sprite *sprite); -void sub_80C3630(struct Sprite *sprite); -void sub_80C3698(const u8 *string); -void sub_80C3764(void); -void sub_80C37E4(void); -u8 sub_80C3990(u8 a0, u8 a1); -s8 sub_80C39E4(u8 a0, u8 a1); -void sub_80C3A5C(u8 taskId); -void sub_80C3BD8(u8 taskId); -void sub_80C3B30(u8 taskId); -void sub_80C3C44(struct Sprite *sprite); -void sub_80C3CB8(struct Sprite *sprite); -void sub_80C3D04(u8 taskId); -void sub_80C3DF0(struct Sprite *sprite); -void sub_80C3E60(u8 a0, u8 a1); -void sub_80C3EA4(u8 taskId); -void sub_80C3F00(void); -void sub_80C40D4(u8 a0, u8 a1); -void sub_80C42C0(u8 taskId); -void sub_80C49C4(u8 taskId); -void sub_80C49F0(u8 taskId); -void sub_80C4A0C(u8 taskId); -void sub_80C4A28(u8 taskId); -void sub_80C4A44(u8 taskId); -void sub_80C4B0C(u8 taskId); -void sub_80C4B5C(u8 taskId); -void sub_80C4BA4(u8 taskId); -void sub_80C4BCC(u8 taskId); - -const u16 gUnknown_083D1624[] = INCBIN_U16("graphics/unknown/unknown_3D1624/0.4bpp"); -const u16 gUnknown_083D1644[] = INCBIN_U16("graphics/unknown/unknown_3D1624/1.4bpp"); -const u16 gUnknown_083D1664[] = INCBIN_U16("graphics/unknown/unknown_3D1624/2.4bpp"); -const u16 gUnknown_083D1684[] = INCBIN_U16("graphics/unknown/unknown_3D1624/3.4bpp"); -const u16 gUnknown_083D16A4[] = INCBIN_U16("graphics/unknown/unknown_3D1624/4.4bpp"); -const u16 gUnknown_083D16C4[] = INCBIN_U16("graphics/unknown/unknown_3D1624/5.4bpp"); -const u16 gUnknown_083D16E4[] = INCBIN_U16("graphics/unknown/unknown_3D1624/6.4bpp"); -const u16 gUnknown_083D1704[] = INCBIN_U16("graphics/unknown/unknown_3D1624/7.4bpp"); -const u16 gMiscBlank_Pal[] = INCBIN_U16("graphics/interface/blank.gbapal"); - -const struct OamData gOamData_83D1744 = { - .shape = ST_OAM_H_RECTANGLE, - .size = 3, - .priority = 3, - .paletteNum = 2 -}; - -const struct SpriteTemplate gSpriteTemplate_83D174C = { - 0xbc1, - 0xbc1, - &gOamData_83D1744, - gDummySpriteAnimTable, - NULL, - gDummySpriteAffineAnimTable, - SpriteCallbackDummy -}; - -const struct SpriteSheet gUnknown_083D1764[] = { - {gMiscBlank_Gfx, 0x400, 0xbc1}, - {gMiscBlank_Gfx, 0x400, 0xbc2}, - {gMiscBlank_Gfx, 0x400, 0xbc3}, - {gMiscBlank_Gfx, 0x400, 0xbc4}, - {gMiscBlank_Gfx, 0x400, 0xbc5}, - {gMiscBlank_Gfx, 0x400, 0xbc6}, - {gMiscBlank_Gfx, 0x400, 0xbc7}, - {gMiscBlank_Gfx, 0x400, 0xbc8}, -}; - -const struct SpritePalette gUnknown_083D17A4 = { - gMiscBlank_Pal, 0xbc1 -}; - -const struct OamData gOamData_83D17AC = {}; - -const struct SpriteTemplate gSpriteTemplate_83D17B4 = { - 0xbc9, - 0xbc9, - &gOamData_83D17AC, - gDummySpriteAnimTable, - NULL, - gDummySpriteAffineAnimTable, - sub_80C3DF0 -}; - -const struct CompressedSpriteSheet gUnknown_083D17CC = {gContestConfetti_Gfx, 0x220, 0xbc9}; - -const struct CompressedSpritePalette gUnknown_083D17D4 = {gContestConfetti_Pal, 0xbc9}; - -const u8 gUnknown_083D17DC[] = _("{COLOR RED}"); -const u8 gUnknown_083D17E0[] = _("/"); -const u8 gUnknown_083D17E2[] = _("{SIZE 3}{COLOR_HIGHLIGHT_SHADOW WHITE2 DARK_GREY LIGHT_BLUE}"); - -void sub_80C2020(void) -{ - REG_DISPCNT = DISPCNT_OBJ_1D_MAP; - Text_LoadWindowTemplate(&gWindowTemplate_81E6FA0); - Text_InitWindowWithTemplate(&gMenuWindow, &gWindowTemplate_81E6FA0); - REG_BG0CNT = BGCNT_WRAP | BGCNT_SCREENBASE(30); - REG_BG1CNT = BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(24); - REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(28); - REG_BG3CNT = BGCNT_WRAP | BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(26); - REG_MOSAIC = 0; - REG_WININ = 0x3f3f; - REG_WINOUT = 0x3f2e; - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WIN1H = 0; - REG_WIN1V = 0; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_DISPCNT |= DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_WIN1_ON; - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - gBattle_BG1_X = 0; - gBattle_BG1_Y = 0; - gBattle_BG2_X = 0; - gBattle_BG2_Y = 0; - gBattle_BG3_X = 0; - gBattle_BG3_Y = 0; - gBattle_WIN0H = 0; - gBattle_WIN0V = 0; - gBattle_WIN1H = 0; - gBattle_WIN1V = 0; -} - -void sub_80C2144(void) -{ - int i; - int j; - s8 r7; - s8 r4; - u16 r6; - u16 r3; - - DmaFill32Large(3, 0, VRAM, VRAM_SIZE, 0x1000); - LZDecompressVram(gUnknown_08D1977C, BG_SCREEN_ADDR(0)); - LZDecompressVram(gUnknown_08D1A490, BG_SCREEN_ADDR(26)); - LZDecompressVram(gUnknown_08D1A364, BG_SCREEN_ADDR(28)); - LZDecompressVram(gUnknown_08D1A250, BG_SCREEN_ADDR(30)); - sub_80C37E4(); - LoadCompressedPalette(gUnknown_08D1A618, 0, 0x200); - LoadFontDefaultPalette(&gWindowTemplate_81E6FA0); - for (i = 0; i < 4; i++) - { - r7 = sub_80C3990(i, 1); - r4 = sub_80C39E4(i, 1); - for (j = 0; j < 10; j++) - { - r6 = 0x60b2; - if (j < r7) - r6 = 0x60b4; - if (j < ABS(r4)) - { - r3 = 0x60a4; - if (r4 < 0) - r3 = 0x60a6; - } - else - r3 = 0x60a2; - ((u16 *)BG_VRAM)[i * 0x60 + j + 0x60b3] = r6; - ((u16 *)BG_VRAM)[i * 0x60 + j + 0x60d3] = r3; - } - } -} - -void sub_80C226C(u8 a0) -{ - u8 *strbuf; - - if (a0 == gContestPlayerMonIndex) - strbuf = StringCopy(gDisplayedStringBattle, gUnknown_083D17DC); - else - strbuf = gDisplayedStringBattle; - strbuf[0] = EXT_CTRL_CODE_BEGIN; - strbuf[1] = 0x06; - strbuf[2] = 0x04; - strbuf += 3; - strbuf = StringCopy(strbuf, gContestMons[a0].nickname); - strbuf[0] = EXT_CTRL_CODE_BEGIN; - strbuf[1] = 0x13; - strbuf[2] = 0x32; - strbuf += 3; - strbuf = StringCopy(strbuf, gUnknown_083D17E0); - if (gIsLinkContest & 1) - StringCopy(strbuf, gLinkPlayers[a0].name); - else - StringCopy(strbuf, gContestMons[a0].trainerName); - Text_InitWindowAndPrintText(&gMenuWindow, gDisplayedStringBattle, a0 * 36 + 770, 7, a0 * 3 + 4); -} - -void sub_80C2340(void) -{ - int i; - - for (i = 0; i < 4; i++) - sub_80C226C(i); -} - -void sub_80C2358(void) -{ - gPaletteFade.bufferTransferDisabled = TRUE; - SetVBlankCallback(NULL); - sub_80C2020(); - ScanlineEffect_Clear(); - ResetPaletteFade(); - ResetSpriteData(); - ResetTasks(); - FreeAllSpritePalettes(); - sub_80C2144(); - sub_80C310C(); - LoadAllContestMonIcons(0, TRUE); - sub_80C2340(); - eContestLink80C2020Struct2018000 = (struct UnkEwramStruct18000){}; - memset(eContestLink80C2020Struct2018018, 0, 4 * sizeof(struct UnkEwramStruct18018)); - sub_80C33DC(); - BeginNormalPaletteFade(0xffffffff, 0, 16, 0, 0); - gPaletteFade.bufferTransferDisabled = FALSE; - eContestLink80C2020Struct2018000.unk_02 = CreateTask(sub_80C24F4, 5); - SetMainCallback2(sub_80C2430); - gBattle_WIN1H = 0xf0; - gBattle_WIN1V = 0x80a0; - CreateTask(sub_80C2F28, 20); - sub_80C3F00(); - PlayBGM(MUS_CONTEST_RESULTS); - SetVBlankCallback(sub_80C2448); -} - -static void sub_80C2430(void) -{ - AnimateSprites(); - BuildOamBuffer(); - RunTasks(); - UpdatePaletteFade(); -} - -static void sub_80C2448(void) -{ - REG_BG0HOFS = gBattle_BG0_X; - REG_BG0VOFS = gBattle_BG0_Y; - REG_BG1HOFS = gBattle_BG1_X; - REG_BG1VOFS = gBattle_BG1_Y; - REG_BG2HOFS = gBattle_BG2_X; - REG_BG2VOFS = gBattle_BG2_Y; - REG_BG3HOFS = gBattle_BG3_X; - REG_BG3VOFS = gBattle_BG3_Y; - REG_WIN0H = gBattle_WIN0H; - REG_WIN0V = gBattle_WIN0V; - REG_WIN1H = gBattle_WIN1H; - REG_WIN1V = gBattle_WIN1V; - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - ScanlineEffect_InitHBlankDmaTransfer(); -} - -static void sub_80C24F4(u8 taskId) -{ - if (!gPaletteFade.active) - { - if (gIsLinkContest & 1) - { - sub_80C3698(gOtherText_LinkStandby); - gTasks[taskId].func = sub_80C255C; - } - else - { - gTasks[taskId].func = sub_80C2600; - } - } -} - -static void sub_80C255C(u8 taskId) -{ - if (gReceivedRemoteLinkPlayers && GetLinkPlayerCount() == MAX_LINK_PLAYERS) - { - CreateTask(sub_80C25A4, 0); - gTasks[taskId].func = TaskDummy; - } -} - -static void sub_80C25A4(u8 taskId) -{ - SetTaskFuncWithFollowupFunc(taskId, sub_80C89DC, sub_80C25C0); -} - -static void sub_80C25C0(u8 taskId) -{ - if (IsLinkTaskFinished()) - { - DestroyTask(taskId); - gTasks[eContestLink80C2020Struct2018000.unk_02].func = sub_80C2600; - sub_80C3764(); - } -} - -static void sub_80C2600(u8 taskId) -{ - if (gTasks[taskId].data[0] == 0) - { - CreateTask(sub_80C2F64, 20); - sub_80C3158(gContestText_AnnounceResults, eContestLink80C2020Struct2018000.unk_00); - sub_80C34CC(sub_80C34AC(gContestText_AnnounceResults), 0x90, 0x78, 0x440); - gTasks[taskId].data[0]++; - } - else if (gTasks[taskId].data[0] == 1) - { - if (eContestLink80C2020Struct2018000.unk_04 == 0) - { - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[0]++; - } - } - else if (gTasks[taskId].data[0] == 2) - { - if (++gTasks[taskId].data[1] == 0x15) - { - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[0]++; - } - } - else if (gTasks[taskId].data[0] == 3) - { - sub_80C3158(gContestText_PreliminaryResults, eContestLink80C2020Struct2018000.unk_00); - sub_80C34CC(sub_80C34AC(gContestText_PreliminaryResults), 0x90, 0xffff, 0x440); - gTasks[taskId].data[0]++; - } - else if (gTasks[taskId].data[0] == 4) - { - if (eContestLink80C2020Struct2018000.unk_04 == 2) - { - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_80C26E4; - } - } -} - -static void sub_80C26E4(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - case 0: - if (eContestLink80C2020Struct2018000.unk_0a == 0) - { - sub_80C40D4(0, gTasks[taskId].data[2]++); - if (eContestLink80C2020Struct2018000.unk_14 == 0) - { - gTasks[taskId].data[0] = 2; - } - else - { - gTasks[taskId].data[0]++; - } - } - break; - case 1: - if (eContestLink80C2020Struct2018000.unk_14 == 0) - { - gTasks[taskId].data[0] = 0; - } - break; - case 2: - sub_80C3520(0x440); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[2] = 0; - gTasks[taskId].func = sub_80C2770; - break; - } -} - -static void sub_80C2770(u8 taskId) -{ - if (eContestLink80C2020Struct2018000.unk_04 == 0) - { - if (++gTasks[taskId].data[1] == 21) - { - gTasks[taskId].data[1] = 0; - sub_80C3158(gContestText_Round2Results, eContestLink80C2020Struct2018000.unk_00); - sub_80C34CC(sub_80C34AC(gContestText_Round2Results), 0x90, 0xffff, 0x440); - } - } - else if (eContestLink80C2020Struct2018000.unk_04 == 2) - { - gTasks[taskId].func = sub_80C27EC; - } -} - -static void sub_80C27EC(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - case 0: - if (eContestLink80C2020Struct2018000.unk_0a == 0) - { - sub_80C40D4(1, gTasks[taskId].data[2]++); - if (eContestLink80C2020Struct2018000.unk_14 == 0) - { - gTasks[taskId].data[0] = 2; - } - else - { - gTasks[taskId].data[0]++; - } - } - break; - case 1: - if (eContestLink80C2020Struct2018000.unk_14 == 0) - { - gTasks[taskId].data[0] = 0; - } - break; - case 2: - sub_80C3520(0x440); - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_80C2878; - break; - } -} - -static void sub_80C2878(u8 taskId) -{ - int i; - u8 taskId2; - u8 strbuf[100]; - - switch (gTasks[taskId].data[0]) - { - case 0: - if (eContestLink80C2020Struct2018000.unk_04 == 0) - gTasks[taskId].data[0]++; - break; - case 1: - if (++gTasks[taskId].data[1] == 31) - { - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[0]++; - } - break; - case 2: - for (i = 0; i < 4; i++) - { - taskId2 = CreateTask(sub_80C3A5C, 10); - gTasks[taskId2].data[0] = gContestFinalStandings[i]; - gTasks[taskId2].data[1] = i; - } - gTasks[taskId].data[0]++; - break; - case 3: - if (eContestLink80C2020Struct2018000.unk_05 == 4) - { - if (++gTasks[taskId].data[1] == 31) - { - gTasks[taskId].data[1] = 0; - CreateTask(sub_80C3B30, 10); - gTasks[taskId].data[0]++; - GET_CONTEST_WINNER(i); - sub_80C3E60(i, 14); - } - } - break; - case 4: - if (++gTasks[taskId].data[1] == 21) - { - gTasks[taskId].data[1] = 0; - GET_CONTEST_WINNER(i); - if (gIsLinkContest & 1) - { - StringCopy(gStringVar1, gLinkPlayers[i].name); - } - else - { - StringCopy(gStringVar1, gContestMons[i].trainerName); - } - StringCopy(gStringVar2, gContestMons[i].nickname); - StringExpandPlaceholders(strbuf, gContestText_PokeWon); - sub_80C3158(strbuf, eContestLink80C2020Struct2018000.unk_00); - sub_80C34CC(sub_80C34AC(strbuf), 0x90, 0xffff, 0x440); - gTasks[taskId].data[0]++; - } - break; - case 5: - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_80C2A8C; - break; - } -} - -static void sub_80C2A8C(u8 taskId) -{ - int i; - u8 spriteId; - u16 species; - u32 personality; - u32 otId; - const struct CompressedSpritePalette *monPal; - - switch (gTasks[taskId].data[0]) - { - case 0: - gBattle_WIN0H = 0xf0; - gBattle_WIN0V = 0x5050; - GET_CONTEST_WINNER(i); - species = gContestMons[i].species; - personality = gContestMons[i].personality; - otId = gContestMons[i].otId; - HandleLoadSpecialPokePic(gMonFrontPicTable + species, gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (intptr_t)gSharedMem, gMonSpriteGfx_Sprite_ptr[1], species, personality); - monPal = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality); - LoadCompressedObjectPalette(monPal); - GetMonSpriteTemplate_803C56C(species, 1); - gUnknown_02024E8C.paletteTag = monPal->tag; - spriteId = CreateSprite(&gUnknown_02024E8C, 0x110, 0x50, 10); - gSprites[spriteId].data[1] = species; - gSprites[spriteId].oam.priority = 0; - gSprites[spriteId].callback = sub_80C3C44; - eContestLink80C2020Struct2018000.unk_08 = spriteId; - LoadCompressedObjectPic(&gUnknown_083D17CC); - LoadCompressedObjectPalette(&gUnknown_083D17D4); - CreateTask(sub_80C3D04, 10); - gTasks[taskId].data[0]++; - break; - case 1: - if (++gTasks[taskId].data[3] == 1) - { - u8 win0v; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[2] += 2; - if (gTasks[taskId].data[2] > 0x20) - gTasks[taskId].data[2] = 0x20; - win0v = gTasks[taskId].data[2]; - gBattle_WIN0V = ((0x50 - win0v) << 8) | (0x50 + win0v); - if (win0v == 0x20) - { - gTasks[taskId].data[0]++; - } - } - break; - case 2: - if (eContestLink80C2020Struct2018000.unk_06 == 1) - { - gTasks[taskId].data[0]++; - } - break; - case 3: - if (++gTasks[taskId].data[1] == 121) - { - gTasks[taskId].data[1] = 0; - gSprites[eContestLink80C2020Struct2018000.unk_08].callback = sub_80C3CB8; - gTasks[taskId].data[0]++; - } - break; - case 4: - if (eContestLink80C2020Struct2018000.unk_06 == 2) - { - u8 win0v = (gBattle_WIN0V >> 8); - win0v += 2; - if (win0v > 0x50) - win0v = 0x50; - gBattle_WIN0V = (win0v << 8) | (0xa0 - win0v); - if (win0v == 0x50) - { - gTasks[taskId].data[0]++; - } - } - break; - case 5: - if (eContestLink80C2020Struct2018000.unk_06 == 2) - { - eContestLink80C2020Struct2018000.unk_09 = 1; - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_80C2D1C; - } - break; - } -} - -static void sub_80C2D1C(u8 taskId) -{ - int i; - - if (gMain.newKeys & A_BUTTON) - { - if (!(gIsLinkContest & 1)) - { - for (i = 0; i < 4; i++) - { - GetSetPokedexFlag(SpeciesToNationalPokedexNum(gContestMons[i].species), FLAG_SET_SEEN); - } - } - gTasks[taskId].func = sub_80C2D80; - } -} - -static void sub_80C2D80(u8 taskId) -{ - if (gIsLinkContest & 1) - { - sub_80C3698(gOtherText_LinkStandby); - sub_800832C(); - gTasks[taskId].func = sub_80C2DD8; - } - else - { - gTasks[taskId].func = sub_80C2E14; - } -} - -static void sub_80C2DD8(u8 taskId) -{ - if (gReceivedRemoteLinkPlayers == 0) - { - gIsLinkContest = 0; - sub_80C3764(); - gTasks[taskId].func = sub_80C2E14; - } -} - -static void sub_80C2E14(u8 taskId) -{ - sub_80BE284(gContestFinalStandings[gContestPlayerMonIndex]); - sub_810FB10(2); - Contest_SaveWinner(gSpecialVar_ContestRank); - Contest_SaveWinner(0xFE); - eCurContestWinnerIsForArtist = TRUE; - eCurContestWinnerSaveIdx = sub_80B2C4C(0xfe, 0); - BeginHardwarePaletteFade(0xff, 0, 0, 16, 0); - gTasks[taskId].func = sub_80C2EA0; -} - -static void sub_80C2EA0(u8 taskId) -{ - if (!gPaletteFade.active) - { - if (gTasks[taskId].data[1] == 0) - { - DestroyTask(eContestLink80C2020Struct2018000.unk_03); - BlendPalettes(0x0000ffff, 16, 0); - gTasks[taskId].data[1]++; - } - else if (gTasks[taskId].data[1] == 1) - { - BlendPalettes(0xffff0000, 16, 0); - gTasks[taskId].data[1]++; - } - else - { - REG_BLDCNT = 0; - REG_BLDY = 0; - DestroyTask(taskId); - SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); - } - } -} - -static void sub_80C2F28(u8 taskId) -{ - gBattle_BG3_X += 2; - gBattle_BG3_Y++; - if (gBattle_BG3_X > 0xff) - gBattle_BG3_X -= 0xff; - if (gBattle_BG3_Y > 0xff) - gBattle_BG3_Y -= 0xff; -} - -static void sub_80C2F64(u8 taskId) -{ - if (++gTasks[taskId].data[0] == 2) - { - gTasks[taskId].data[0] = 0; - if (gTasks[taskId].data[2] == 0) - gTasks[taskId].data[1]++; - else - gTasks[taskId].data[1]--; - if (gTasks[taskId].data[1] == 16) - gTasks[taskId].data[2] = 1; - else if (gTasks[taskId].data[1] == 0) - gTasks[taskId].data[2] = 0; - BlendPalette(0x6b, 0x01, gTasks[taskId].data[1], RGB(30, 22, 11)); - BlendPalette(0x68, 0x01, gTasks[taskId].data[1], RGB(31, 31, 31)); - BlendPalette(0x6e, 0x01, gTasks[taskId].data[1], RGB(30, 29, 29)); - } - if (gTasks[taskId].data[1] == 0) - eContestLink80C2020Struct2018000.unk_0a = 0; - else - eContestLink80C2020Struct2018000.unk_0a = 1; -} - -void sub_80C3024(u16 species, u8 destOffset, u8 srcOffset, bool8 useDmaNow, u32 personality) -{ - int i; - int j; - u16 tile; - u16 offset; - u16 var0; - u16 var1; - - if (useDmaNow) - { - DmaCopy32Defvars(3, GetMonIconPtr(species, personality) + (srcOffset << 9) + 0x80, BG_CHAR_ADDR(1) + (destOffset << 9), 0x180); - var0 = ((destOffset + 10) << 12); - var1 = (destOffset * 16 + 0x200); - tile = var1 | var0; - offset = destOffset * 0x60 + 0x83; - for (i = 0; i < 3; i++) - { - for (j = 0; j < 4; j++) - { - ((u16 *)BG_CHAR_ADDR(3))[(i << 5) + j + offset] = tile; - tile++; - } - } - } - else - { - RequestSpriteCopy(GetMonIconPtr(species, personality) + (srcOffset << 9) + 0x80, BG_CHAR_ADDR(1) + (destOffset << 9), 0x180); - } -} - -static void LoadAllContestMonIcons(u8 srcOffset, bool8 useDmaNow) -{ - int i; - - for (i = 0; i < 4; i++) - { - sub_80C3024(gContestMons[i].species, i, srcOffset, useDmaNow, gContestMons[i].personality); - } -} - -void sub_80C310C(void) -{ - int i; - register u16 species asm("r0"); - - for (i = 0; i < 4; i++) - { - species = mon_icon_convert_unown_species_id(gContestMons[i].species, 0); - LoadPalette(gMonIconPalettes[gMonIconPaletteIndices[species]], 0xa0 + 0x10 * i, 0x20); - } -} - -#ifdef NONMATCHING -void sub_80C3158(const u8 *string, u8 spriteId) -{ - int i, j; - u8 width; - u8 * displayedStringBattle; - void * dest; - u8 * d1; - u8 * d2; - void *d3; - void *d4; - void *d5; - void *d6; - int w; - u16 sp00[4]; - struct Sprite *sprite = &gSprites[spriteId]; - sp00[0] = gSprites[spriteId].oam.tileNum; - sp00[1] = gSprites[sprite->data[0]].oam.tileNum; - sp00[2] = gSprites[sprite->data[1]].oam.tileNum; - sp00[3] = gSprites[sprite->data[2]].oam.tileNum; - - for (i = 0; i < 4; i++) - { - DmaClear32(3, (void *)VRAM + 0x10000 + 32 * sp00[i], 0x400); - } - - width = Text_GetStringWidthFromWindowTemplate(&gWindowTemplate_81E7278, string); - displayedStringBattle = gDisplayedStringBattle; - displayedStringBattle = StringCopy(displayedStringBattle, gUnknown_083D17E2); - if ((~width + 1) & 7) - { - displayedStringBattle[0] = EXT_CTRL_CODE_BEGIN; - displayedStringBattle[1] = 0x11; - displayedStringBattle[2] = ((~width + 1) & 7) / 2; - displayedStringBattle += 3; - } - - width += -8 & (width + 7); - displayedStringBattle = StringCopy(displayedStringBattle, string); - - displayedStringBattle[0] = EXT_CTRL_CODE_BEGIN; - displayedStringBattle[1] = 0x13; - displayedStringBattle[2] = width; - displayedStringBattle[3] = EOS; - - sub_80034D4(eContestLink80C2020Struct2018068, gDisplayedStringBattle); - - CpuCopy32(&gUnknown_083D1624[0x0], (void *)(VRAM + 0x10000) + 32 * sp00[0], 32); - CpuCopy32(&gUnknown_083D1624[0x40], (void *)(VRAM + 0x10000) + 32 * sp00[0] + 0x100, 32); - CpuCopy32(&gUnknown_083D1624[0x40], (void *)(VRAM + 0x10000) + 32 * sp00[0] + 0x200, 32); - CpuCopy32(&gUnknown_083D1624[0x20], (void *)(VRAM + 0x10000) + 32 * sp00[0] + 0x300, 32); - - w = width / 8; - j = 0; - if (j <= w) - { - d2 = eContestLink80C2020Struct2018068 + 0x20; - d1 = eContestLink80C2020Struct2018068; - d3 = (void *)VRAM + 0x0FD20; - d4 = (void *)VRAM + 0x0FE20; - d5 = (void *)VRAM + 0x0FF20; - d6 = (void *)VRAM + 0x10020; - while (j <= w) - { - if (j < 7) - dest = 32 * sp00[0] + d6; - else if (j < 15) - dest = 32 * sp00[1] + d5; - else if (j < 23) - dest = 32 * sp00[2] + d4; - else - dest = 32 * sp00[3] + d3; - - if (j == w) - break; - - CpuCopy32(gUnknown_083D16E4, dest, 32); - CpuCopy32(gUnknown_083D16E4 + 0x10, dest + 0x300, 32); - CpuCopy32(j * 0x40 + d2, dest + 0x100, 32); - CpuCopy32(j * 0x40 + d1, dest + 0x200, 32); - - d3 += 0x20; - d4 += 0x20; - d5 += 0x20; - d6 += 0x20; - j++; - } - } - - CpuCopy32(gUnknown_083D1644, dest, 32); - CpuCopy32(gUnknown_083D1644 + 0x40, dest + 0x100, 32); - CpuCopy32(gUnknown_083D1644 + 0x40, dest + 0x200, 32); - CpuCopy32(gUnknown_083D1644 + 0x20, dest + 0x300, 32); -} -#else -asm(".include \"constants/gba_constants.inc\""); -asm(".include \"include/macros.inc\""); -NAKED -void sub_80C3158(const u8 * string, u8 spriteId) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x1C\n" - "\tmov r9, r0\n" - "\tlsls r1, 24\n" - "\tlsrs r1, 24\n" - "\tlsls r2, r1, 4\n" - "\tadds r2, r1\n" - "\tlsls r2, 2\n" - "\tldr r3, _080C32C0 @ =gSprites\n" - "\tadds r2, r3\n" - "\tmov r1, sp\n" - "\tldrh r0, [r2, 0x4]\n" - "\tlsls r0, 22\n" - "\tlsrs r0, 22\n" - "\tstrh r0, [r1]\n" - "\tmov r4, sp\n" - "\tmovs r0, 0x2E\n" - "\tldrsh r1, [r2, r0]\n" - "\tlsls r0, r1, 4\n" - "\tadds r0, r1\n" - "\tlsls r0, 2\n" - "\tadds r0, r3\n" - "\tldrh r0, [r0, 0x4]\n" - "\tlsls r0, 22\n" - "\tlsrs r0, 22\n" - "\tstrh r0, [r4, 0x2]\n" - "\tmovs r0, 0x30\n" - "\tldrsh r1, [r2, r0]\n" - "\tlsls r0, r1, 4\n" - "\tadds r0, r1\n" - "\tlsls r0, 2\n" - "\tadds r0, r3\n" - "\tldrh r0, [r0, 0x4]\n" - "\tlsls r0, 22\n" - "\tlsrs r0, 22\n" - "\tstrh r0, [r4, 0x4]\n" - "\tmovs r0, 0x32\n" - "\tldrsh r1, [r2, r0]\n" - "\tlsls r0, r1, 4\n" - "\tadds r0, r1\n" - "\tlsls r0, 2\n" - "\tadds r0, r3\n" - "\tldrh r0, [r0, 0x4]\n" - "\tlsls r0, 22\n" - "\tlsrs r0, 22\n" - "\tstrh r0, [r4, 0x6]\n" - "\tldr r1, _080C32C4 @ =gWindowTemplate_81E7278\n" - "\tmov r8, r1\n" - "\tldr r7, _080C32C8 @ =0x06010000\n" - "\tldr r2, _080C32CC @ =0x040000d4\n" - "\tldr r6, _080C32D0 @ =0x85000100\n" - "\tmov r1, sp\n" - "\tmovs r5, 0\n" - "\tadd r3, sp, 0x8\n" - "\tmovs r4, 0x3\n" - "_080C31CE:\n" - "\tldrh r0, [r1]\n" - "\tlsls r0, 5\n" - "\tadds r0, r7\n" - "\tstr r5, [sp, 0x8]\n" - "\tstr r3, [r2]\n" - "\tstr r0, [r2, 0x4]\n" - "\tstr r6, [r2, 0x8]\n" - "\tldr r0, [r2, 0x8]\n" - "\tadds r1, 0x2\n" - "\tsubs r4, 0x1\n" - "\tcmp r4, 0\n" - "\tbge _080C31CE\n" - "\tmov r0, r8\n" - "\tmov r1, r9\n" - "\tbl Text_GetStringWidthFromWindowTemplate\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tldr r2, _080C32D4 @ =gDisplayedStringBattle\n" - "\tldr r1, _080C32D8 @ =gUnknown_083D17E2\n" - "\tadds r0, r2, 0\n" - "\tbl StringCopy\n" - "\tadds r2, r0, 0\n" - "\tmvns r0, r5\n" - "\tadds r1, r0, 0x1\n" - "\tmovs r0, 0x7\n" - "\tands r1, r0\n" - "\tcmp r1, 0\n" - "\tbeq _080C3218\n" - "\tmovs r0, 0xFC\n" - "\tstrb r0, [r2]\n" - "\tmovs r0, 0x11\n" - "\tstrb r0, [r2, 0x1]\n" - "\tlsrs r0, r1, 1\n" - "\tstrb r0, [r2, 0x2]\n" - "\tadds r2, 0x3\n" - "_080C3218:\n" - "\tadds r6, r5, 0x7\n" - "\tmovs r1, 0x8\n" - "\tnegs r1, r1\n" - "\tadds r0, r1, 0\n" - "\tands r6, r0\n" - "\tlsls r6, 24\n" - "\tlsrs r5, r6, 24\n" - "\tadds r0, r2, 0\n" - "\tmov r1, r9\n" - "\tbl StringCopy\n" - "\tadds r2, r0, 0\n" - "\tmovs r0, 0xFC\n" - "\tstrb r0, [r2]\n" - "\tmovs r0, 0x13\n" - "\tstrb r0, [r2, 0x1]\n" - "\tstrb r5, [r2, 0x2]\n" - "\tmovs r0, 0xFF\n" - "\tstrb r0, [r2, 0x3]\n" - "\tldr r0, _080C32DC @ =gSharedMem + 0x18068\n" - "\tmov r10, r0\n" - "\tldr r1, _080C32D4 @ =gDisplayedStringBattle\n" - "\tbl sub_80034D4\n" - "\tmov r0, sp\n" - "\tldrh r4, [r0]\n" - "\tlsls r4, 5\n" - "\tldr r1, _080C32C8 @ =0x06010000\n" - "\tadds r7, r4, r1\n" - "\tldr r0, _080C32E0 @ =gUnknown_083D1624\n" - "\tmov r9, r0\n" - "\tldr r1, _080C32E4 @ =REG_BG0CNT\n" - "\tmov r8, r1\n" - "\tadds r1, r7, 0\n" - "\tmov r2, r8\n" - "\tbl CpuSet\n" - "\tmov r5, r9\n" - "\tadds r5, 0x80\n" - "\tldr r0, _080C32E8 @ =0x06010100\n" - "\tadds r1, r4, r0\n" - "\tadds r0, r5, 0\n" - "\tmov r2, r8\n" - "\tbl CpuSet\n" - "\tldr r0, _080C32EC @ =0x06010200\n" - "\tadds r1, r4, r0\n" - "\tadds r0, r5, 0\n" - "\tmov r2, r8\n" - "\tbl CpuSet\n" - "\tmov r0, r9\n" - "\tadds r0, 0x40\n" - "\tldr r1, _080C32F0 @ =0x06010300\n" - "\tadds r4, r1\n" - "\tadds r1, r4, 0\n" - "\tmov r2, r8\n" - "\tbl CpuSet\n" - "\tlsrs r5, r6, 27\n" - "\tmovs r4, 0\n" - "\tcmp r4, r5\n" - "\tbgt _080C3382\n" - "\tmov r6, sp\n" - "\tmov r0, r10\n" - "\tadds r0, 0x20\n" - "\tstr r0, [sp, 0xC]\n" - "\tmov r1, r10\n" - "\tstr r1, [sp, 0x10]\n" - "\tldr r0, _080C32F4 @ =0x0600fd20\n" - "\tstr r0, [sp, 0x14]\n" - "\tldr r1, _080C32F8 @ =0x0600fe20\n" - "\tstr r1, [sp, 0x18]\n" - "\tldr r0, _080C32FC @ =0x0600ff20\n" - "\tmov r10, r0\n" - "\tldr r1, _080C3300 @ =0x06010020\n" - "\tmov r9, r1\n" - "_080C32B2:\n" - "\tcmp r4, 0x6\n" - "\tbgt _080C3304\n" - "\tldrh r0, [r6]\n" - "\tlsls r0, 5\n" - "\tmov r1, r9\n" - "\tb _080C3322\n" - "\t.align 2, 0\n" - "_080C32C0: .4byte gSprites\n" - "_080C32C4: .4byte gWindowTemplate_81E7278\n" - "_080C32C8: .4byte 0x06010000\n" - "_080C32CC: .4byte 0x040000d4\n" - "_080C32D0: .4byte 0x85000100\n" - "_080C32D4: .4byte gDisplayedStringBattle\n" - "_080C32D8: .4byte gUnknown_083D17E2\n" - "_080C32DC: .4byte gSharedMem + 0x18068\n" - "_080C32E0: .4byte gUnknown_083D1624\n" - "_080C32E4: .4byte REG_BG0CNT\n" - "_080C32E8: .4byte 0x06010100\n" - "_080C32EC: .4byte 0x06010200\n" - "_080C32F0: .4byte 0x06010300\n" - "_080C32F4: .4byte 0x0600fd20\n" - "_080C32F8: .4byte 0x0600fe20\n" - "_080C32FC: .4byte 0x0600ff20\n" - "_080C3300: .4byte 0x06010020\n" - "_080C3304:\n" - "\tcmp r4, 0xE\n" - "\tbgt _080C3310\n" - "\tldrh r0, [r6, 0x2]\n" - "\tlsls r0, 5\n" - "\tmov r1, r10\n" - "\tb _080C3322\n" - "_080C3310:\n" - "\tcmp r4, 0x16\n" - "\tbgt _080C331C\n" - "\tldrh r0, [r6, 0x4]\n" - "\tlsls r0, 5\n" - "\tldr r1, [sp, 0x18]\n" - "\tb _080C3322\n" - "_080C331C:\n" - "\tldrh r0, [r6, 0x6]\n" - "\tlsls r0, 5\n" - "\tldr r1, [sp, 0x14]\n" - "_080C3322:\n" - "\tadds r7, r0, r1\n" - "\tcmp r4, r5\n" - "\tbeq _080C3382\n" - "\tldr r0, _080C33D0 @ =gUnknown_083D16E4\n" - "\tadds r1, r7, 0\n" - "\tmov r2, r8\n" - "\tbl CpuSet\n" - "\tmovs r0, 0xC0\n" - "\tlsls r0, 2\n" - "\tadds r1, r7, r0\n" - "\tldr r0, _080C33D0 @ =gUnknown_083D16E4\n" - "\tadds r0, 0x20\n" - "\tmov r2, r8\n" - "\tbl CpuSet\n" - "\tmovs r0, 0x80\n" - "\tlsls r0, 1\n" - "\tadds r1, r7, r0\n" - "\tldr r0, [sp, 0x10]\n" - "\tmov r2, r8\n" - "\tbl CpuSet\n" - "\tmovs r0, 0x80\n" - "\tlsls r0, 2\n" - "\tadds r1, r7, r0\n" - "\tldr r0, [sp, 0xC]\n" - "\tmov r2, r8\n" - "\tbl CpuSet\n" - "\tldr r1, [sp, 0xC]\n" - "\tadds r1, 0x40\n" - "\tstr r1, [sp, 0xC]\n" - "\tldr r0, [sp, 0x10]\n" - "\tadds r0, 0x40\n" - "\tstr r0, [sp, 0x10]\n" - "\tldr r1, [sp, 0x14]\n" - "\tadds r1, 0x20\n" - "\tstr r1, [sp, 0x14]\n" - "\tldr r0, [sp, 0x18]\n" - "\tadds r0, 0x20\n" - "\tstr r0, [sp, 0x18]\n" - "\tmovs r1, 0x20\n" - "\tadd r10, r1\n" - "\tadd r9, r1\n" - "\tadds r4, 0x1\n" - "\tcmp r4, r5\n" - "\tble _080C32B2\n" - "_080C3382:\n" - "\tldr r4, _080C33D4 @ =gUnknown_083D1644\n" - "\tldr r5, _080C33D8 @ =REG_BG0CNT\n" - "\tadds r0, r4, 0\n" - "\tadds r1, r7, 0\n" - "\tadds r2, r5, 0\n" - "\tbl CpuSet\n" - "\tadds r6, r4, 0\n" - "\tadds r6, 0x80\n" - "\tmovs r0, 0x80\n" - "\tlsls r0, 1\n" - "\tadds r1, r7, r0\n" - "\tadds r0, r6, 0\n" - "\tadds r2, r5, 0\n" - "\tbl CpuSet\n" - "\tmovs r0, 0x80\n" - "\tlsls r0, 2\n" - "\tadds r1, r7, r0\n" - "\tadds r0, r6, 0\n" - "\tadds r2, r5, 0\n" - "\tbl CpuSet\n" - "\tadds r4, 0x40\n" - "\tmovs r0, 0xC0\n" - "\tlsls r0, 2\n" - "\tadds r1, r7, r0\n" - "\tadds r0, r4, 0\n" - "\tadds r2, r5, 0\n" - "\tbl CpuSet\n" - "\tadd sp, 0x1C\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_080C33D0: .4byte gUnknown_083D16E4\n" - "_080C33D4: .4byte gUnknown_083D1644\n" - "_080C33D8: .4byte REG_BG0CNT"); -} -#endif //NONMATCHING - -void sub_80C33DC(void) -{ - int i; - struct SpriteTemplate template; - u8 spriteIds[8]; - - template = gSpriteTemplate_83D174C; - for (i = 0; i <8; i++) - LoadSpriteSheet(&gUnknown_083D1764[i]); - - LoadSpritePalette(&gUnknown_083D17A4); - for (i = 0; i < 8; i++) - { - spriteIds[i] = CreateSprite(&template, 272, 144, 10); - template.tileTag++; - } - - gSprites[spriteIds[0]].data[0] = spriteIds[1]; - gSprites[spriteIds[0]].data[1] = spriteIds[2]; - gSprites[spriteIds[0]].data[2] = spriteIds[3]; - - gSprites[spriteIds[4]].data[0] = spriteIds[5]; - gSprites[spriteIds[4]].data[1] = spriteIds[6]; - gSprites[spriteIds[4]].data[2] = spriteIds[7]; - - eContestLink80C2020Struct2018000.unk_00 = spriteIds[0]; - eContestLink80C2020Struct2018000.unk_04 = 0; - eContestLink80C2020Struct2018000.unk_01 = spriteIds[4]; - sub_80C3764(); -} - -u16 sub_80C34AC(const u8 * string) -{ - u8 width = (StringLength(string) * 6); - return 0x70 - (width / 2); -} - -void sub_80C34CC(s16 arg0, u16 y, u16 arg2, u16 arg3) -{ - struct Sprite *sprite = &gSprites[eContestLink80C2020Struct2018000.unk_00]; - sprite->pos1.x = 272; - sprite->pos1.y = y; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - sprite->data[4] = arg0 + 32; - sprite->data[5] = arg2; - sprite->data[6] = arg3; - sprite->data[7] = 0; - sprite->callback = sub_80C3588; - eContestLink80C2020Struct2018000.unk_04 = 1; -} - -void sub_80C3520(u16 arg0) -{ - struct Sprite *sprite = &gSprites[eContestLink80C2020Struct2018000.unk_00]; - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.y = 0; - sprite->pos2.x = 0; - sprite->data[6] = arg0; - sprite->data[7] = 0; - sprite->callback = sub_80C3630; - eContestLink80C2020Struct2018000.unk_04 = 3; -} - -void sub_80C3564(struct Sprite *sprite) -{ - sprite->pos1.x = 272; - sprite->pos1.y = 144; - sprite->pos2.y = 0; - sprite->pos2.x = 0; - sprite->callback = SpriteCallbackDummy; - eContestLink80C2020Struct2018000.unk_04 = 0; -} - - -void sub_80C3588(struct Sprite *sprite) -{ - int i; - s16 var0; - - var0 = (u16)sprite->data[7] + (u16)sprite->data[6]; - sprite->pos1.x -= var0 >> 8; - sprite->data[7] = (sprite->data[6] + sprite->data[7]) & 0xFF; - if (sprite->pos1.x < sprite->data[4]) - sprite->pos1.x = sprite->data[4]; - - for (i = 0; i < 3; i++) - { - struct Sprite *sprite2 = &gSprites[sprite->data[i]]; - sprite2->pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64; - } - - if (sprite->pos1.x == sprite->data[4]) - sprite->callback = sub_80C35FC; -} - -void sub_80C35FC(struct Sprite *sprite) -{ - eContestLink80C2020Struct2018000.unk_04 = 2; - if ((u16)sprite->data[5] != 0xFFFF) - { - if (--sprite->data[5] == -1) - sub_80C3520(sprite->data[6]); - } -} - -void sub_80C3630(struct Sprite *sprite) -{ - int i; - s16 var0; - - var0 = (u16)sprite->data[7] + (u16)sprite->data[6]; - sprite->pos1.x -= var0 >> 8; - sprite->data[7] = (sprite->data[6] + sprite->data[7]) & 0xFF; - for (i = 0; i < 3; i++) - { - struct Sprite *sprite2 = &gSprites[sprite->data[i]]; - sprite2->pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64; - } - - if (sprite->pos1.x + sprite->pos2.x < -224) - sub_80C3564(sprite); -} - -void sub_80C3698(const u8 *text) -{ - int i; - u16 x; - struct Sprite *sprite; - - sub_80C3158(text, eContestLink80C2020Struct2018000.unk_01); - x = sub_80C34AC(text); - sprite = &gSprites[eContestLink80C2020Struct2018000.unk_01]; - sprite->pos1.x = x + 32; - sprite->pos1.y = 80; - sprite->invisible = FALSE; - for (i = 0; i < 3; i++) - { - gSprites[sprite->data[i]].pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64; - gSprites[sprite->data[i]].pos1.y = sprite->pos1.y; - gSprites[sprite->data[i]].invisible = FALSE; - } - - gBattle_WIN0H = 0x00F0; - gBattle_WIN0V = ((sprite->pos1.y - 16) << 8) | (sprite->pos1.y + 16); - REG_WININ = WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR; -} - -void sub_80C3764(void) -{ - int i; - struct Sprite *sprite; - - sprite = &gSprites[eContestLink80C2020Struct2018000.unk_01]; - sprite->invisible = TRUE; - for (i = 0; i < 3; i++) - gSprites[sprite->data[i]].invisible = TRUE; - - gBattle_WIN0H = 0; - gBattle_WIN0V = 0; - REG_WIN0H = gBattle_WIN0H; - REG_WIN0V = gBattle_WIN0V; - REG_WININ = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR; -} - -#ifdef ENGLISH -#ifdef NONMATCHING -static inline s32 de_sub_80C39A8(s32 a0) -{ - s32 result = 0; - if (gIsLinkContest & 0x1) - { - sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 9, 2, 8, 2); - result = 8; - } - else if (gSpecialVar_ContestRank == 0) - { - sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 0, 0, 9, 2); - result = 9; - } - else if (gSpecialVar_ContestRank == 1) - { - sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 9, 0, 8, 2); - result = 8; - } - else if (gSpecialVar_ContestRank == 2) - { - sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 17, 0, 8, 2); - result = 8; - } - else - { - sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 0, 2, 9, 2); - result = 9; - } - return result; -} - -static inline s32 de_sub_80C3A84(s32 a0, s32 * a1) -{ - s32 result; - if (gSpecialVar_ContestCategory == 0) - { - *a1 = 0; - sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 17, 2, 10, 2); - result = 10; - } - else if (gSpecialVar_ContestCategory == 1) - { - *a1 = 1; - sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 0, 4, 11, 2); - result = 11; - } - else if (gSpecialVar_ContestCategory == 2) - { - *a1 = 2; - sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 11, 4, 10, 2); - result = 10; - } - else if (gSpecialVar_ContestCategory == 3) - { - *a1 = 3; - sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 21, 4, 10, 2); - result = 10; - } - else - { - *a1 = 4; - sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 0, 6, 10, 2); - result = 10; - } - return result; -} - -void sub_80C37E4(void) -{ - s32 sp0; - s32 i; - de_sub_80C3A84(de_sub_80C39A8(5) + 5, &sp0); - for (i = 0; i < 0x80; i++) - { - ((vu16 *)(VRAM + 0xE000))[i] &= 0xFFF; - ((vu16 *)(VRAM + 0xE000))[i] |= sp0 << 12;; - } -} -#else -NAKED -void sub_80C37E4(void) -{ - asm_unified("\tpush {r4-r6,lr}\n" - "\tsub sp, 0x10\n" - "\tmovs r5, 0x1\n" - "\tmovs r4, 0\n" - "\tldr r0, _080C3808 @ =gIsLinkContest\n" - "\tldrb r0, [r0]\n" - "\tadds r1, r5, 0\n" - "\tands r1, r0\n" - "\tcmp r1, 0\n" - "\tbeq _080C3814\n" - "\tldr r0, _080C380C @ =0x0600e000\n" - "\tldr r3, _080C3810 @ =gUnknown_08E964B8\n" - "\tmovs r1, 0x9\n" - "\tstr r1, [sp]\n" - "\tmovs r2, 0x2\n" - "\tstr r2, [sp, 0x4]\n" - "\tb _080C386A\n" - "\t.align 2, 0\n" - "_080C3808: .4byte gIsLinkContest\n" - "_080C380C: .4byte 0x0600e000\n" - "_080C3810: .4byte gUnknown_08E964B8\n" - "_080C3814:\n" - "\tldr r0, _080C3830 @ =gSpecialVar_ContestRank\n" - "\tldrh r2, [r0]\n" - "\tcmp r2, 0\n" - "\tbne _080C383C\n" - "\tmovs r4, 0x1\n" - "\tldr r0, _080C3834 @ =0x0600e000\n" - "\tldr r3, _080C3838 @ =gUnknown_08E964B8\n" - "\tstr r2, [sp]\n" - "\tstr r2, [sp, 0x4]\n" - "\tmovs r1, 0x9\n" - "\tstr r1, [sp, 0x8]\n" - "\tmovs r1, 0x2\n" - "\tstr r1, [sp, 0xC]\n" - "\tb _080C3870\n" - "\t.align 2, 0\n" - "_080C3830: .4byte gSpecialVar_ContestRank\n" - "_080C3834: .4byte 0x0600e000\n" - "_080C3838: .4byte gUnknown_08E964B8\n" - "_080C383C:\n" - "\tcmp r2, 0x1\n" - "\tbne _080C385C\n" - "\tldr r0, _080C3854 @ =0x0600e000\n" - "\tldr r3, _080C3858 @ =gUnknown_08E964B8\n" - "\tmovs r1, 0x9\n" - "\tstr r1, [sp]\n" - "\tstr r4, [sp, 0x4]\n" - "\tmovs r1, 0x8\n" - "\tstr r1, [sp, 0x8]\n" - "\tmovs r1, 0x2\n" - "\tstr r1, [sp, 0xC]\n" - "\tb _080C3870\n" - "\t.align 2, 0\n" - "_080C3854: .4byte 0x0600e000\n" - "_080C3858: .4byte gUnknown_08E964B8\n" - "_080C385C:\n" - "\tcmp r2, 0x2\n" - "\tbne _080C3884\n" - "\tldr r0, _080C387C @ =0x0600e000\n" - "\tldr r3, _080C3880 @ =gUnknown_08E964B8\n" - "\tmovs r1, 0x11\n" - "\tstr r1, [sp]\n" - "\tstr r4, [sp, 0x4]\n" - "_080C386A:\n" - "\tmovs r1, 0x8\n" - "\tstr r1, [sp, 0x8]\n" - "\tstr r2, [sp, 0xC]\n" - "_080C3870:\n" - "\tmovs r1, 0x5\n" - "\tmovs r2, 0x1\n" - "\tbl sub_809D104\n" - "\tb _080C389E\n" - "\t.align 2, 0\n" - "_080C387C: .4byte 0x0600e000\n" - "_080C3880: .4byte gUnknown_08E964B8\n" - "_080C3884:\n" - "\tmovs r4, 0x1\n" - "\tldr r0, _080C38C0 @ =0x0600e000\n" - "\tldr r3, _080C38C4 @ =gUnknown_08E964B8\n" - "\tstr r1, [sp]\n" - "\tmovs r2, 0x2\n" - "\tstr r2, [sp, 0x4]\n" - "\tmovs r1, 0x9\n" - "\tstr r1, [sp, 0x8]\n" - "\tstr r2, [sp, 0xC]\n" - "\tmovs r1, 0x5\n" - "\tmovs r2, 0x1\n" - "\tbl sub_809D104\n" - "_080C389E:\n" - "\tadds r4, 0xD\n" - "\tldr r0, _080C38C8 @ =gSpecialVar_ContestCategory\n" - "\tldrh r0, [r0]\n" - "\tcmp r0, 0\n" - "\tbne _080C38CC\n" - "\tmovs r6, 0\n" - "\tldr r0, _080C38C0 @ =0x0600e000\n" - "\tldr r3, _080C38C4 @ =gUnknown_08E964B8\n" - "\tmovs r1, 0x11\n" - "\tstr r1, [sp]\n" - "\tmovs r2, 0x2\n" - "\tstr r2, [sp, 0x4]\n" - "\tmovs r1, 0xA\n" - "\tstr r1, [sp, 0x8]\n" - "\tstr r2, [sp, 0xC]\n" - "\tb _080C392A\n" - "\t.align 2, 0\n" - "_080C38C0: .4byte 0x0600e000\n" - "_080C38C4: .4byte gUnknown_08E964B8\n" - "_080C38C8: .4byte gSpecialVar_ContestCategory\n" - "_080C38CC:\n" - "\tcmp r0, 0x1\n" - "\tbne _080C38EC\n" - "\tmovs r6, 0x1\n" - "\tldr r0, _080C38E4 @ =0x0600e000\n" - "\tldr r3, _080C38E8 @ =gUnknown_08E964B8\n" - "\tmovs r1, 0\n" - "\tstr r1, [sp]\n" - "\tmovs r1, 0x4\n" - "\tstr r1, [sp, 0x4]\n" - "\tmovs r1, 0xB\n" - "\tb _080C3924\n" - "\t.align 2, 0\n" - "_080C38E4: .4byte 0x0600e000\n" - "_080C38E8: .4byte gUnknown_08E964B8\n" - "_080C38EC:\n" - "\tcmp r0, 0x2\n" - "\tbne _080C3910\n" - "\tmovs r6, 0x2\n" - "\tldr r0, _080C3908 @ =0x0600e000\n" - "\tldr r3, _080C390C @ =gUnknown_08E964B8\n" - "\tmovs r1, 0xB\n" - "\tstr r1, [sp]\n" - "\tmovs r1, 0x4\n" - "\tstr r1, [sp, 0x4]\n" - "\tmovs r1, 0xA\n" - "\tstr r1, [sp, 0x8]\n" - "\tstr r6, [sp, 0xC]\n" - "\tb _080C392A\n" - "\t.align 2, 0\n" - "_080C3908: .4byte 0x0600e000\n" - "_080C390C: .4byte gUnknown_08E964B8\n" - "_080C3910:\n" - "\tcmp r0, 0x3\n" - "\tbne _080C393C\n" - "\tmovs r6, 0x3\n" - "\tldr r0, _080C3934 @ =0x0600e000\n" - "\tldr r3, _080C3938 @ =gUnknown_08E964B8\n" - "\tmovs r1, 0x15\n" - "\tstr r1, [sp]\n" - "\tmovs r1, 0x4\n" - "\tstr r1, [sp, 0x4]\n" - "\tmovs r1, 0xA\n" - "_080C3924:\n" - "\tstr r1, [sp, 0x8]\n" - "\tmovs r1, 0x2\n" - "\tstr r1, [sp, 0xC]\n" - "_080C392A:\n" - "\tadds r1, r4, 0\n" - "\tadds r2, r5, 0\n" - "\tbl sub_809D104\n" - "\tb _080C395A\n" - "\t.align 2, 0\n" - "_080C3934: .4byte 0x0600e000\n" - "_080C3938: .4byte gUnknown_08E964B8\n" - "_080C393C:\n" - "\tmovs r6, 0x4\n" - "\tldr r0, _080C3984 @ =0x0600e000\n" - "\tldr r3, _080C3988 @ =gUnknown_08E964B8\n" - "\tmovs r1, 0\n" - "\tstr r1, [sp]\n" - "\tmovs r1, 0x6\n" - "\tstr r1, [sp, 0x4]\n" - "\tmovs r1, 0xA\n" - "\tstr r1, [sp, 0x8]\n" - "\tmovs r1, 0x2\n" - "\tstr r1, [sp, 0xC]\n" - "\tadds r1, r4, 0\n" - "\tadds r2, r5, 0\n" - "\tbl sub_809D104\n" - "_080C395A:\n" - "\tldr r5, _080C398C @ =0x00000fff\n" - "\tlsls r4, r6, 12\n" - "\tldr r2, _080C3984 @ =0x0600e000\n" - "\tmovs r3, 0x7F\n" - "_080C3962:\n" - "\tldrh r1, [r2]\n" - "\tadds r0, r5, 0\n" - "\tands r0, r1\n" - "\tstrh r0, [r2]\n" - "\tldrh r1, [r2]\n" - "\tadds r0, r4, 0\n" - "\torrs r0, r1\n" - "\tstrh r0, [r2]\n" - "\tadds r2, 0x2\n" - "\tsubs r3, 0x1\n" - "\tcmp r3, 0\n" - "\tbge _080C3962\n" - "\tadd sp, 0x10\n" - "\tpop {r4-r6}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_080C3984: .4byte 0x0600e000\n" - "_080C3988: .4byte gUnknown_08E964B8\n" - "_080C398C: .4byte 0x00000fff"); -} -#endif // NONMATCHING - -#elif defined(GERMAN) -s16 de_sub_80C39A8(s32 a0) -{ - s16 result; - if (gIsLinkContest & 1) - { - sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 11, 3, 8, 3); - result = 8; - } - else if (gSpecialVar_ContestRank == 0) - { - sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 0, 0, 11, 3); - result = 11; - } - else if (gSpecialVar_ContestRank == 1) - { - sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 11, 0, 10, 3); - result = 10; - } - else if (gSpecialVar_ContestRank == 2) - { - sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 21, 0, 10, 3); - result = 10; - } - else - { - sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 0, 3, 11, 3); - result = 11; - } - return result; -} - -s16 de_sub_80C3A84(s32 a0, s32 * a1) -{ - s16 result; - if (gSpecialVar_ContestCategory == 0) - { - *a1 = 0; - sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 19, 3, 7, 3); - result = 7; - } - else if (gSpecialVar_ContestCategory == 1) - { - *a1 = 1; - sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 0, 6, 7, 3); - result = 7; - } - else if (gSpecialVar_ContestCategory == 2) - { - *a1 = 2; - sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 7, 6, 4, 3); - result = 4; - } - else if (gSpecialVar_ContestCategory == 3) - { - *a1 = 3; - sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 11, 6, 6, 3); - result = 6; - } - else - { - *a1 = 4; - sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 17, 6, 5, 3); - result = 5; - } - return result; -} - -void sub_80C37E4(void) -{ - s32 sp0; - s32 i; - de_sub_80C3A84(de_sub_80C39A8(6) + 6, &sp0); - for (i = 0; i < 0x80; i++) - { - ((vu16 *)(VRAM + 0xE000))[i] &= 0xFFF; - ((vu16 *)(VRAM + 0xE000))[i] |= sp0 << 12;; - } -} -#endif - -// fakematching? -u8 sub_80C3990(u8 monIndex, u8 arg1) -{ - u32 var0; - u32 var1; - - var0 = gContestMonConditions[monIndex] << 16; - var1 = var0 / 0x3F; - if (var1 & 0xFFFF) - var1 += 0x10000; - - var1 >>= 16; - if (var1 == 0 && var0) - var1 = 1; - - if (arg1 && var1 > 10) - var1 = 10; - - return var1; -} - -s8 sub_80C39E4(u8 arg0, u8 arg1) -{ - u32 r4; - u32 r2; - s16 val; - s8 ret; - - val = gUnknown_02038688[arg0]; - if (val < 0) - r4 = -val << 16; - else - r4 = val << 16; - r2 = r4 / 80; - if (r2 & 0xFFFF) - r2 += 0x10000; - - r2 >>= 16; - if (r2 == 0 && r4 != 0) - r2 = 1; - - if (arg1 != 0 && r2 > 10) - r2 = 10; - - if (gUnknown_02038688[arg0] < 0) - ret = -r2; - else - ret = r2; - - return ret; -} - -void sub_80C3A5C(u8 taskId) -{ - u16 firstTileNum; - - if (gTasks[taskId].data[10] == 0) - { - gTasks[taskId].data[11] = (3 - gTasks[taskId].data[0]) * 40; - gTasks[taskId].data[10]++; - } - else if (gTasks[taskId].data[10] == 1) - { - if (--gTasks[taskId].data[11] == -1) - { - firstTileNum = gTasks[taskId].data[0] * 2 + 0x5043; - *(vu16 *)((VRAM + 0xE142) + gTasks[taskId].data[1] * 192) = firstTileNum + 0x00; - *(vu16 *)((VRAM + 0xE144) + gTasks[taskId].data[1] * 192) = firstTileNum + 0x01; - *(vu16 *)((VRAM + 0xE182) + gTasks[taskId].data[1] * 192) = firstTileNum + 0x10; - *(vu16 *)((VRAM + 0xE184) + gTasks[taskId].data[1] * 192) = firstTileNum + 0x11; - eContestLink80C2020Struct2018000.unk_05++; - DestroyTask(taskId); - PlaySE(SE_CONTEST_PLACE); - } - } -} - -#ifdef NONMATCHING -void sub_80C3B30(u8 taskId) -{ - int i, j, k; - - for (i = 0; i < 4 && gContestFinalStandings[i] != 0; i++) - ; - - for (j = 0; j < 3; j++) - { - for (k = 0; k < 30; k++) - { - ((u16 *)((VRAM + 0xE100) + 2 * (96 * i + 32 * j)))[k] &= 0x0FFF; - ((u16 *)((VRAM + 0xE100) + 2 * (96 * i + 32 * j)))[k] |= 0x9000; - } - } - gTasks[taskId].data[10] = i; - gTasks[taskId].data[12] = 1; - gTasks[taskId].func = sub_80C3BD8; - eContestLink80C2020Struct2018000.unk_03 = taskId; -} -#else -NAKED -void sub_80C3B30(u8 taskId) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmov r12, r0\n" - "\tmovs r5, 0\n" - "\tldr r1, _080C3BC0 @ =gContestFinalStandings\n" - "\tldrb r0, [r1]\n" - "\tldr r2, _080C3BC4 @ =gTasks\n" - "\tmov r10, r2\n" - "\tcmp r0, 0\n" - "\tbeq _080C3B5C\n" - "_080C3B4E:\n" - "\tadds r5, 0x1\n" - "\tcmp r5, 0x3\n" - "\tbgt _080C3B5C\n" - "\tadds r0, r5, r1\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0\n" - "\tbne _080C3B4E\n" - "_080C3B5C:\n" - "\tmovs r1, 0\n" - "\tlsls r0, r5, 1\n" - "\tmov r2, r12\n" - "\tlsls r2, 2\n" - "\tmov r9, r2\n" - "\tadds r0, r5\n" - "\tlsls r0, 5\n" - "\tmov r8, r0\n" - "\tldr r7, _080C3BC8 @ =0x00000fff\n" - "\tmovs r0, 0x90\n" - "\tlsls r0, 8\n" - "\tadds r6, r0, 0\n" - "_080C3B74:\n" - "\tlsls r0, r1, 5\n" - "\tadds r4, r1, 0x1\n" - "\tadd r0, r8\n" - "\t@ the next two instructions are swapped\n" - "\tmovs r3, 0x1D\n" - "\tlsls r0, 1\n" - "\tldr r1, _080C3BCC @ =0x0600e100\n" - "\tadds r2, r0, r1\n" - "_080C3B82:\n" - "\tldrh r1, [r2]\n" - "\tadds r0, r7, 0\n" - "\tands r0, r1\n" - "\torrs r0, r6\n" - "\tstrh r0, [r2]\n" - "\tadds r2, 0x2\n" - "\tsubs r3, 0x1\n" - "\tcmp r3, 0\n" - "\tbge _080C3B82\n" - "\tadds r1, r4, 0\n" - "\tcmp r1, 0x2\n" - "\tble _080C3B74\n" - "\tmov r0, r9\n" - "\tadd r0, r12\n" - "\tlsls r0, 3\n" - "\tadd r0, r10\n" - "\tstrh r5, [r0, 0x1C]\n" - "\tmovs r1, 0x1\n" - "\tstrh r1, [r0, 0x20]\n" - "\tldr r2, _080C3BD0 @ =sub_80C3BD8\n" - "\tstr r2, [r0]\n" - "\tmov r1, r12\n" - "\tldr r0, _080C3BD4 @ =gSharedMem + 0x18000\n" - "\tstrb r1, [r0, 0x3]\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_080C3BC0: .4byte gContestFinalStandings\n" - "_080C3BC4: .4byte gTasks\n" - "_080C3BC8: .4byte 0x00000fff\n" - "_080C3BCC: .4byte 0x0600e100\n" - "_080C3BD0: .4byte sub_80C3BD8\n" - "_080C3BD4: .4byte gSharedMem + 0x18000"); -} -#endif //NONMATCHING - -void sub_80C3BD8(u8 taskId) -{ - if (++gTasks[taskId].data[11] == 1) - { - gTasks[taskId].data[11] = 0; - BlendPalette(0x91, 1, gTasks[taskId].data[12], RGB(13, 28, 27)); - if (gTasks[taskId].data[13] == 0) - { - if (++gTasks[taskId].data[12] == 16) - gTasks[taskId].data[13] = 1; - } - else - { - if (--gTasks[taskId].data[12] == 0) - gTasks[taskId].data[13] = 0; - } - } -} - -void sub_80C3C44(struct Sprite *sprite) -{ - if (sprite->data[0] < 10) - { - if (++sprite->data[0] == 10) - { - PlayCry1(sprite->data[1], 0); - sprite->data[1] = 0; - } - } - else - { - s16 delta = (u16)sprite->data[1] + 0x600; - sprite->pos1.x -= delta >> 8; - sprite->data[1] = (sprite->data[1] + 0x600) & 0xFF; - if (sprite->pos1.x < 120) - sprite->pos1.x = 120; - - if (sprite->pos1.x == 120) - { - sprite->callback = SpriteCallbackDummy; - sprite->data[1] = 0; - eContestLink80C2020Struct2018000.unk_06 = 1; - } - } -} - -void sub_80C3CB8(struct Sprite *sprite) -{ - s16 delta = (u16)sprite->data[1] + 0x600; - sprite->pos1.x -= delta >> 8; - sprite->data[1] = (sprite->data[1] + 0x600) & 0xFF; - if (sprite->pos1.x < -32) - { - sprite->callback = SpriteCallbackDummy; - sprite->invisible = TRUE; - eContestLink80C2020Struct2018000.unk_06 = 2; - } -} - -void sub_80C3D04(u8 taskId) -{ - if (++gTasks[taskId].data[0] == 5) - { - gTasks[taskId].data[0] = 0; - if (eContestLink80C2020Struct2018000.unk_07 < 40) - { - u8 spriteId = CreateSprite(&gSpriteTemplate_83D17B4, (Random() % 240) - 20, 44, 5); - gSprites[spriteId].data[0] = Random() % 512; - gSprites[spriteId].data[1] = (Random() % 24) + 16; - gSprites[spriteId].data[2] = (Random() % 256) + 48; - gSprites[spriteId].oam.tileNum += Random() % 17; - eContestLink80C2020Struct2018000.unk_07++; - } - } - - if (eContestLink80C2020Struct2018000.unk_09) - DestroyTask(taskId); -} - -void sub_80C3DF0(struct Sprite *sprite) -{ - register s16 var0 asm("r1"); - - sprite->data[3] += sprite->data[0]; - sprite->pos2.x = Sin(sprite->data[3] >> 8, sprite->data[1]); - var0 = sprite->data[4] + sprite->data[2]; - sprite->pos1.x += var0 >> 8; - var0 = var0 & 0xFF; - sprite->data[4] = var0; - sprite->pos1.y++; - if (eContestLink80C2020Struct2018000.unk_09) - sprite->invisible = TRUE; - - if (sprite->pos1.x > 248 || sprite->pos1.y > 116) - { - DestroySprite(sprite); - eContestLink80C2020Struct2018000.unk_07--; - } -} - -void sub_80C3E60(u8 monIndex, u8 numFrames) -{ - u8 taskId = CreateTask(sub_80C3EA4, 8); - gTasks[taskId].data[0] = monIndex; - gTasks[taskId].data[1] = numFrames; - gTasks[taskId].data[2] = gContestMons[monIndex].species; -} - -void sub_80C3EA4(u8 taskId) -{ - u8 monIndex = gTasks[taskId].data[0]; - if (gTasks[taskId].data[10]++ == gTasks[taskId].data[1]) - { - gTasks[taskId].data[10] = 0; - sub_80C3024(gTasks[taskId].data[2], monIndex, gTasks[taskId].data[11], FALSE, gContestMons[monIndex].personality); - gTasks[taskId].data[11] ^= 1; - } -} - -void sub_80C3F00(void) -{ - s32 i; - s16 r2 = gUnknown_02038678[0]; - s32 r4; - u32 r5; - s8 r0; - - for (i = 1; i < 4; i++) - { - if (r2 < gUnknown_02038678[i]) - r2 = gUnknown_02038678[i]; - } - - if (r2 < 0) - { - r2 = gUnknown_02038678[0]; - - for (i = 1; i < 4; i++) - { - if (r2 > gUnknown_02038678[i]) - r2 = gUnknown_02038678[i]; - } - } - - for (i = 0; i < 4; i++) - { - r4 = 1000 * gContestMonConditions[i] / ABS(r2); - if ((r4 % 10) >= 5) - r4 += 10; - eContestLink80C2020Struct2018018[i].unk_00 = r4 / 10; - - r4 = 1000 * ABS(gUnknown_02038688[i]) / ABS(r2); - if ((r4 % 10) >= 5) - r4 += 10; - eContestLink80C2020Struct2018018[i].unk_04 = r4 / 10; - - if (gUnknown_02038688[i] < 0) - eContestLink80C2020Struct2018018[i].unk_10 = 1; - - r5 = 22528 * eContestLink80C2020Struct2018018[i].unk_00 / 100; - if ((r5 % 256) >= 128) - r5 += 256; - eContestLink80C2020Struct2018018[i].unk_08 = r5 / 256; - - r5 = eContestLink80C2020Struct2018018[i].unk_04 * 22528 / 100; - if ((r5 % 256) >= 128) - r5 += 256; - eContestLink80C2020Struct2018018[i].unk_0c = r5 / 256; - - eContestLink80C2020Struct2018018[i].unk_11 = sub_80C3990(i, 1); - r0 = sub_80C39E4(i, 1); - eContestLink80C2020Struct2018018[i].unk_12 = ABS(r0); - - if (gContestFinalStandings[i]) - { - s16 r2__ = eContestLink80C2020Struct2018018[i].unk_08; - s16 r1__ = eContestLink80C2020Struct2018018[i].unk_0c; - if (eContestLink80C2020Struct2018018[i].unk_10) - r1__ = -r1__; - if (r2__ + r1__ == 88) - { - if (r1__ > 0) - eContestLink80C2020Struct2018018[i].unk_0c--; - else if (r2__ > 0) - eContestLink80C2020Struct2018018[i].unk_08--; - } - } - } -} - -#ifdef NONMATCHING -void sub_80C40D4(u8 arg0, u8 arg1) -{ - int i; - u8 taskId; - u8 sp8, spC; - - sp8 = 0; - spC = 0; - if (!arg0) - { - u32 var0; - for (i = 0; i < 4; i++) - { - u8 var1 = eContestLink80C2020Struct2018018[i].unk_11; - if (arg1 < var1) - { - int x = var1 + 19; - x += 32 * (i * 3 + 5); - x -= arg1; - x--; - *(vu16 *)((VRAM + 0xC000) + 2 * x) = 0x60B3; - taskId = CreateTask(sub_80C42C0, 10); - var0 = ((eContestLink80C2020Struct2018018[i].unk_08 << 16) / eContestLink80C2020Struct2018018[i].unk_11) * (arg1 + 1); - if ((var0 % 0x10000) >= 0x8000) - var0 += 0x10000; - - gTasks[taskId].data[0] = i; - gTasks[taskId].data[1] = var0 >> 16; - eContestLink80C2020Struct2018000.unk_14++; - sp8++; - } - } - } - else - { - u32 var0; - for (i = 0; i < 4; i++) - { - int tile; - s8 var1 = eContestLink80C2020Struct2018018[i].unk_12; - tile = eContestLink80C2020Struct2018018[i].unk_10 ? 0x60A5 : 0x60A3; - if (arg1 < var1) - { - int x = var1 + 19; - x += 32 * (i * 3 + 6); - x -= arg1; - x--; - *(vu16 *)((VRAM + 0xC000) + 2 * x) = tile; - taskId = CreateTask(sub_80C42C0, 10); - var0 = ((eContestLink80C2020Struct2018018[i].unk_0c << 16) / eContestLink80C2020Struct2018018[i].unk_12) * (arg1 + 1); - if ((var0 % 0x10000) >= 0x8000) - var0 += 0x10000; - - gTasks[taskId].data[0] = i; - if (eContestLink80C2020Struct2018018[i].unk_10) - { - gTasks[taskId].data[2] = 1; - spC++; - } - else - { - sp8++; - } - - if (eContestLink80C2020Struct2018018[i].unk_10) - gTasks[taskId].data[1] = -(var0 >> 16) + eContestLink80C2020Struct2018018[i].unk_08; - else - gTasks[taskId].data[1] = (var0 >> 16) + eContestLink80C2020Struct2018018[i].unk_08; - - eContestLink80C2020Struct2018000.unk_14++; - } - } - } - - if (spC) - PlaySE(SE_BOO); - - if (sp8) - PlaySE(SE_PIN); -} -#else -// Assorted register differences -NAKED -void sub_80C40D4(u8 arg0, u8 arg1) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x8\n" - "\tlsls r0, 24\n" - "\tlsls r1, 24\n" - "\tlsrs r7, r1, 24\n" - "\tmovs r1, 0\n" - "\tmov r10, r1\n" - "\tmovs r2, 0\n" - "\tstr r2, [sp]\n" - "\tcmp r0, 0\n" - "\tbne _080C4198\n" - "\tmov r8, r2\n" - "\tldr r0, _080C417C @ =gSharedMem + 0x18018\n" - "\tsubs r1, 0x18\n" - "\tadds r1, r0\n" - "\tmov r9, r1\n" - "\tadds r4, r0, 0\n" - "\tadds r4, 0x8\n" - "\tmovs r6, 0xA0\n" - "_080C4102:\n" - "\tldrb r0, [r4, 0x9]\n" - "\tcmp r7, r0\n" - "\tbcs _080C416A\n" - "\tadds r0, 0x13\n" - "\tadds r0, r6, r0\n" - "\tsubs r0, r7\n" - "\tlsls r0, 1\n" - "\tldr r2, _080C4180 @ =0x0600bffe\n" - "\tadds r0, r2\n" - "\tldr r2, _080C4184 @ =0x000060b3\n" - "\tadds r1, r2, 0\n" - "\tstrh r1, [r0]\n" - "\tldr r0, _080C4188 @ =sub_80C42C0\n" - "\tmovs r1, 0xA\n" - "\tbl CreateTask\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tldr r0, [r4]\n" - "\tlsls r0, 16\n" - "\tldrb r1, [r4, 0x9]\n" - "\tbl __udivsi3\n" - "\tadds r1, r7, 0x1\n" - "\tadds r3, r0, 0\n" - "\tmuls r3, r1\n" - "\tldr r0, _080C418C @ =0x0000ffff\n" - "\tands r0, r3\n" - "\tldr r1, _080C4190 @ =0x00007fff\n" - "\tcmp r0, r1\n" - "\tbls _080C4146\n" - "\tmovs r0, 0x80\n" - "\tlsls r0, 9\n" - "\tadds r3, r0\n" - "_080C4146:\n" - "\tldr r1, _080C4194 @ =gTasks\n" - "\tlsls r0, r5, 2\n" - "\tadds r0, r5\n" - "\tlsls r0, 3\n" - "\tadds r0, r1\n" - "\tmov r1, r8\n" - "\tstrh r1, [r0, 0x8]\n" - "\tlsrs r1, r3, 16\n" - "\tstrh r1, [r0, 0xA]\n" - "\tmov r2, r9\n" - "\tldrb r0, [r2, 0x14]\n" - "\tadds r0, 0x1\n" - "\tstrb r0, [r2, 0x14]\n" - "\tmov r0, r10\n" - "\tadds r0, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmov r10, r0\n" - "_080C416A:\n" - "\tadds r4, 0x14\n" - "\tadds r6, 0x60\n" - "\tmovs r0, 0x1\n" - "\tadd r8, r0\n" - "\tmov r1, r8\n" - "\tcmp r1, 0x3\n" - "\tble _080C4102\n" - "\tb _080C4292\n" - "\t.align 2, 0\n" - "_080C417C: .4byte gSharedMem + 0x18018\n" - "_080C4180: .4byte 0x0600bffe\n" - "_080C4184: .4byte 0x000060b3\n" - "_080C4188: .4byte sub_80C42C0\n" - "_080C418C: .4byte 0x0000ffff\n" - "_080C4190: .4byte 0x00007fff\n" - "_080C4194: .4byte gTasks\n" - "_080C4198:\n" - "\tmovs r2, 0\n" - "\tmov r8, r2\n" - "\tldr r0, _080C4220 @ =gSharedMem + 0x18018\n" - "\tmov r12, r0\n" - "\tmov r9, r2\n" - "\tmovs r1, 0xC0\n" - "\tstr r1, [sp, 0x4]\n" - "_080C41A6:\n" - "\tmov r6, r9\n" - "\tadd r6, r12\n" - "\tldrb r1, [r6, 0x12]\n" - "\tldrb r0, [r6, 0x10]\n" - "\tldr r2, _080C4224 @ =0x000060a3\n" - "\tcmp r0, 0\n" - "\tbeq _080C41B6\n" - "\tadds r2, 0x2\n" - "_080C41B6:\n" - "\tlsls r0, r1, 24\n" - "\tasrs r0, 24\n" - "\tcmp r7, r0\n" - "\tbge _080C427E\n" - "\tadds r0, 0x13\n" - "\tldr r1, [sp, 0x4]\n" - "\tadds r0, r1, r0\n" - "\tsubs r0, r7\n" - "\tlsls r0, 1\n" - "\tldr r1, _080C4228 @ =0x0600bffe\n" - "\tadds r0, r1\n" - "\tstrh r2, [r0]\n" - "\tldr r0, _080C422C @ =sub_80C42C0\n" - "\tmovs r1, 0xA\n" - "\tbl CreateTask\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tldr r0, [r6, 0xC]\n" - "\tlsls r0, 16\n" - "\tldrb r1, [r6, 0x12]\n" - "\tbl __udivsi3\n" - "\tadds r1, r7, 0x1\n" - "\tadds r3, r0, 0\n" - "\tmuls r3, r1\n" - "\tldr r0, _080C4230 @ =0x0000ffff\n" - "\tands r0, r3\n" - "\tldr r1, _080C4234 @ =0x00007fff\n" - "\tcmp r0, r1\n" - "\tbls _080C41FA\n" - "\tmovs r2, 0x80\n" - "\tlsls r2, 9\n" - "\tadds r3, r2\n" - "_080C41FA:\n" - "\tldr r1, _080C4238 @ =gTasks\n" - "\tlsls r2, r5, 2\n" - "\tadds r0, r2, r5\n" - "\tlsls r0, 3\n" - "\tadds r4, r0, r1\n" - "\tmov r0, r8\n" - "\tstrh r0, [r4, 0x8]\n" - "\tldrb r0, [r6, 0x10]\n" - "\tadds r6, r1, 0\n" - "\tcmp r0, 0\n" - "\tbeq _080C423C\n" - "\tmovs r0, 0x1\n" - "\tstrh r0, [r4, 0xC]\n" - "\tldr r0, [sp]\n" - "\tadds r0, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tstr r0, [sp]\n" - "\tb _080C4246\n" - "\t.align 2, 0\n" - "_080C4220: .4byte gSharedMem + 0x18018\n" - "_080C4224: .4byte 0x000060a3\n" - "_080C4228: .4byte 0x0600bffe\n" - "_080C422C: .4byte sub_80C42C0\n" - "_080C4230: .4byte 0x0000ffff\n" - "_080C4234: .4byte 0x00007fff\n" - "_080C4238: .4byte gTasks\n" - "_080C423C:\n" - "\tmov r0, r10\n" - "\tadds r0, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmov r10, r0\n" - "_080C4246:\n" - "\tldr r0, _080C4264 @ =gSharedMem + 0x18018\n" - "\tmov r1, r9\n" - "\tadds r4, r1, r0\n" - "\tldrb r1, [r4, 0x10]\n" - "\tmov r12, r0\n" - "\tcmp r1, 0\n" - "\tbeq _080C4268\n" - "\tadds r0, r2, r5\n" - "\tlsls r0, 3\n" - "\tadds r0, r6\n" - "\tlsrs r2, r3, 16\n" - "\tldr r1, [r4, 0x8]\n" - "\tsubs r1, r2\n" - "\tb _080C4274\n" - "\t.align 2, 0\n" - "_080C4264: .4byte gSharedMem + 0x18018\n" - "_080C4268:\n" - "\tadds r0, r2, r5\n" - "\tlsls r0, 3\n" - "\tadds r0, r6\n" - "\tlsrs r2, r3, 16\n" - "\tldr r1, [r4, 0x8]\n" - "\tadds r1, r2\n" - "_080C4274:\n" - "\tstrh r1, [r0, 0xA]\n" - "\tldr r1, _080C42BC @ =gSharedMem + 0x18000\n" - "\tldrb r0, [r1, 0x14]\n" - "\tadds r0, 0x1\n" - "\tstrb r0, [r1, 0x14]\n" - "_080C427E:\n" - "\tmovs r2, 0x14\n" - "\tadd r9, r2\n" - "\tldr r0, [sp, 0x4]\n" - "\tadds r0, 0x60\n" - "\tstr r0, [sp, 0x4]\n" - "\tmovs r1, 0x1\n" - "\tadd r8, r1\n" - "\tmov r2, r8\n" - "\tcmp r2, 0x3\n" - "\tble _080C41A6\n" - "_080C4292:\n" - "\tldr r0, [sp]\n" - "\tcmp r0, 0\n" - "\tbeq _080C429E\n" - "\tmovs r0, 0x16\n" - "\tbl PlaySE\n" - "_080C429E:\n" - "\tmov r1, r10\n" - "\tcmp r1, 0\n" - "\tbeq _080C42AA\n" - "\tmovs r0, 0x15\n" - "\tbl PlaySE\n" - "_080C42AA:\n" - "\tadd sp, 0x8\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_080C42BC: .4byte gSharedMem + 0x18000"); -} -#endif //NONMATCHING - -void sub_80C42C0(u8 taskId /*r12*/) -{ - bool32 r6 = FALSE; - bool32 r9 = FALSE; - u8 r5 = gTasks[taskId].data[0]; - s16 r7 = gTasks[taskId].data[1]; - s16 r1 = gTasks[taskId].data[2]; - s32 i; - - if (r1 != 0) - { - if (eContestLink80C2020Struct2018000.unk_0c[r5] <= 0) - r6 = TRUE; - } - else - { - if (eContestLink80C2020Struct2018000.unk_0c[r5] >= 88) - r6 = TRUE; - } - if (eContestLink80C2020Struct2018000.unk_0c[r5] == r7) - r9 = TRUE; - - if (!r9) - { - if (r6) - { - eContestLink80C2020Struct2018000.unk_0c[r5] = r7; - } - else if (r1 != 0) - { - eContestLink80C2020Struct2018000.unk_0c[r5]--; - } - else - { - eContestLink80C2020Struct2018000.unk_0c[r5]++; - } - } - if (!r6) - { - if (!r9) - { - for (i = 0; i < 11; i++) - { - u8 r0; - u16 tile; - if (eContestLink80C2020Struct2018000.unk_0c[r5] >= 8 * (i + 1)) - { - r0 = 8; - } - else if (eContestLink80C2020Struct2018000.unk_0c[r5] >= 8 * i) - { - r0 = eContestLink80C2020Struct2018000.unk_0c[r5] % 8; - } - else - { - r0 = 0; - } - if (r0 < 4) - tile = 0x504C + r0; - else - tile = 0x5057 + r0; - *(vu16 *)((VRAM + 0xE18E) + 2 * (96 * r5 + i)) = tile; - } - } - } - if (r9) - { - eContestLink80C2020Struct2018000.unk_14--; - DestroyTask(taskId); - } -} - -void ScrSpecial_CheckSelectedMonAndInitContest(void) -{ - u8 result = CanMonParticipateInContest(&gPlayerParty[gContestMonPartyIndex]); - if (result != 0) - { - Contest_InitAllPokemon(gSpecialVar_ContestCategory, gSpecialVar_ContestRank); - InitContestMonConditions(gSpecialVar_ContestCategory); - } - gSpecialVar_Result = result; -} - -u16 ScrSpecial_CanMonParticipateInSelectedLinkContest(void) -{ - u16 result = 0; - struct Pokemon *mon = &gPlayerParty[gContestMonPartyIndex]; - switch (gSpecialVar_ContestCategory) - { - case CONTEST_CATEGORY_COOL: - if (GetMonData(mon, MON_DATA_COOL_RIBBON) > gSpecialVar_ContestRank) - result = 1; - break; - case CONTEST_CATEGORY_BEAUTY: - if (GetMonData(mon, MON_DATA_BEAUTY_RIBBON) > gSpecialVar_ContestRank) - result = 1; - break; - case CONTEST_CATEGORY_CUTE: - if (GetMonData(mon, MON_DATA_CUTE_RIBBON) > gSpecialVar_ContestRank) - result = 1; - break; - case CONTEST_CATEGORY_SMART: - if (GetMonData(mon, MON_DATA_SMART_RIBBON) > gSpecialVar_ContestRank) - result = 1; - break; - case CONTEST_CATEGORY_TOUGH: - if (GetMonData(mon, MON_DATA_TOUGH_RIBBON) > gSpecialVar_ContestRank) - result = 1; - break; - } - - return result; -} - - -void ScrSpecial_GiveContestRibbon(void) -{ - u8 ribbonData; - - if (gContestFinalStandings[gContestPlayerMonIndex] != 0) - return; - - switch (gSpecialVar_ContestCategory) - { - case CONTEST_CATEGORY_COOL: - ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_COOL_RIBBON); - if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) - { - ribbonData++; - SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_COOL_RIBBON, &ribbonData); - } - break; - case CONTEST_CATEGORY_BEAUTY: - ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_BEAUTY_RIBBON); - if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) - { - ribbonData++; - SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_BEAUTY_RIBBON, &ribbonData); - } - break; - case CONTEST_CATEGORY_CUTE: - ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_CUTE_RIBBON); - if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) - { - ribbonData++; - SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_CUTE_RIBBON, &ribbonData); - } - break; - case CONTEST_CATEGORY_SMART: - ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SMART_RIBBON); - if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) - { - ribbonData++; - SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SMART_RIBBON, &ribbonData); - } - break; - case CONTEST_CATEGORY_TOUGH: - ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_TOUGH_RIBBON); - if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) - { - ribbonData++; - SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_TOUGH_RIBBON, &ribbonData); - } - break; - } -} - -void Contest_CopyAndConvertTrainerName_Intl(u8 * dest, const u8 * src) -{ - StringCopy(dest, src); - if (dest[0] == EXT_CTRL_CODE_BEGIN && dest[1] == 0x15) - ConvertInternationalString(dest, LANGUAGE_JAPANESE); -} - -void Contest_CopyAndConvertNicknameI_Intl(u8 * dest, u8 idx) -{ - StringCopy(dest, gContestMons[idx].nickname); - if (gIsLinkContest & 1) - { - if (gLinkPlayers[idx].language == LANGUAGE_JAPANESE) - { - ConvertInternationalString(dest, GetStringLanguage(dest)); - } - } -} - -void Contest_GetTrainerNameI_StringVar1(void) -{ - if (gIsLinkContest & 1) - { - Contest_CopyAndConvertTrainerName_Intl(gStringVar1, gLinkPlayers[gSpecialVar_0x8006].name); - } - else - { - Contest_CopyAndConvertTrainerName_Intl(gStringVar1, gContestMons[gSpecialVar_0x8006].trainerName); - } -} - -void Contest_GetNicknameI_StringVar1(void) -{ - Contest_CopyAndConvertNicknameI_Intl(gStringVar3, gSpecialVar_0x8006); -} - -void ScrSpecial_CountContestMonsWithBetterCondition(void) -{ - u8 i; - u8 count; - - for (i = 0, count = 0; i < 4; i++) - { - if (gContestMonConditions[gSpecialVar_0x8006] < gContestMonConditions[i]) - count++; - } - - gSpecialVar_0x8004 = count; -} - -void ScrSpecial_GetMonCondition(void) -{ - gSpecialVar_0x8004 = gContestMonConditions[gSpecialVar_0x8006]; -} - -void ScrSpecial_GetContestWinnerIdx(void) -{ - u8 i; - - for (i = 0; i < 4 && gContestFinalStandings[i] != 0; i++) - ; - - gSpecialVar_0x8005 = i; -} - -void ScrSpecial_GetContestWinnerTrainerName(void) -{ - u8 i; - - for (i = 0; i < 4 && gContestFinalStandings[i] != 0; i++) - ; - - if (gIsLinkContest & 1) - { - Contest_CopyAndConvertTrainerName_Intl(gStringVar3, gLinkPlayers[i].name); - } - else - { - Contest_CopyAndConvertTrainerName_Intl(gStringVar3, gContestMons[i].trainerName); - } -} - -void ScrSpecial_GetContestWinnerNick(void) -{ - u8 i; - - for (i = 0; i < 4 && gContestFinalStandings[i] != 0; i++) - ; - - Contest_CopyAndConvertNicknameI_Intl(gStringVar1, i); -} - -void sub_80C488C(void) -{ - SetMainCallback2(CB2_StartContest); -} - -void sub_80C489C(u8 taskId) -{ - if (!gPaletteFade.active) - { - DestroyTask(taskId); - SetMainCallback2(sub_80C488C); - } -} - -void sub_80C48C8(void) -{ - ScriptContext2_Enable(); - CreateTask(sub_80C489C, 10); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); -} - -void sub_80C48F4(void) -{ - gSpecialVar_0x8004 = gContestMons[gSpecialVar_0x8006].species; -} - -void sub_80C4914(u8 taskId) -{ - if (!gPaletteFade.active) - { - DestroyTask(taskId); - SetMainCallback2(sub_80C2358); - } -} - -void sub_80C4940(void) -{ - ScriptContext2_Enable(); - CreateTask(sub_80C4914, 10); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); -} - -void ScrSpecial_GetContestPlayerMonIdx(void) -{ - gSpecialVar_0x8004 = gContestPlayerMonIndex; -} - -void sub_80C4980(u8 taskId) -{ - u8 taskId2; - ScriptContext2_Enable(); - taskId2 = CreateTask(sub_80C8604, 0); - SetTaskFuncWithFollowupFunc(taskId2, sub_80C8604, sub_80C49C4); - gTasks[taskId2].data[9] = taskId; -} - -void sub_80C49C4(u8 taskId) -{ - Contest_CreatePlayerMon(gContestMonPartyIndex); - SetTaskFuncWithFollowupFunc(taskId, sub_80C8734, sub_80C49F0); -} - -void sub_80C49F0(u8 taskId) -{ - SetTaskFuncWithFollowupFunc(taskId, sub_80C88AC, sub_80C4A0C); -} - -void sub_80C4A0C(u8 taskId) -{ - SetTaskFuncWithFollowupFunc(taskId, sub_80C8E1C, sub_80C4A28); -} - -void sub_80C4A28(u8 taskId) -{ - SetTaskFuncWithFollowupFunc(taskId, sub_80C8938, sub_80C4A44); -} - -void sub_80C4A44(u8 taskId) -{ - u8 i; - u8 sp0[4]; - u8 sp4[4]; - - for (i = 0; i < 4; i++) - sp0[i] = gTasks[taskId].data[i + 1]; - - for (i = 0; i < 4; i++) - { - if (sp0[0] != sp0[i]) - break; - } - - if (i == 4) - gSpecialVar_0x8004 = 0; - else - gSpecialVar_0x8004 = 1; - - for (i = 0; i < 4; i++) - sp4[i] = gTasks[taskId].data[i + 5]; - - gUnknown_0203869B = sub_80C4B34(sp4); - InitContestMonConditions(gSpecialVar_ContestCategory); - SetTaskFuncWithFollowupFunc(taskId, sub_80C8EBC, sub_80C4B0C); -} - -void sub_80C4B0C(u8 taskId) -{ - sub_80B0F28(0); - SetTaskFuncWithFollowupFunc(taskId, sub_80C8F34, sub_80C4B5C); -} - -u8 sub_80C4B34(u8 * a0) -{ - s32 i; - u8 result = 0; - - for (i = 1; i < 4; i++) - { - if (a0[result] < a0[i]) - result = i; - } - - return result; -} - -void sub_80C4B5C(u8 taskId) -{ - if (gSpecialVar_0x8004 == 1) - { - if (IsLinkTaskFinished()) - gTasks[taskId].func = sub_80C4BA4; - } - else - { - DestroyTask(taskId); - ScriptContext2_Disable(); - EnableBothScriptContexts(); - } -} - -void sub_80C4BA4(u8 taskId) -{ - sub_800832C(); - gTasks[taskId].func = sub_80C4BCC; -} - -void sub_80C4BCC(u8 taskId) -{ - if (!gReceivedRemoteLinkPlayers) - { - DestroyTask(taskId); - ScriptContext2_Disable(); - EnableBothScriptContexts(); - } -} diff --git a/src/contest_link_80C857C.c b/src/contest_link_80C857C.c deleted file mode 100644 index a694380df..000000000 --- a/src/contest_link_80C857C.c +++ /dev/null @@ -1,755 +0,0 @@ -#include "global.h" -#include "ewram.h" -#include "random.h" -#include "task.h" -#include "contest.h" -#include "text.h" -#include "string_util.h" -#include "link.h" - -static void sub_80C8644(u8 taskId); -static void sub_80C8660(u8 taskId); -#if GERMAN -static void de_sub_80C9274(bool32 arg0); -static void de_sub_80C9294(bool32 arg0); -#endif - -static void SendBlockToAllOpponents(const void *data, u16 size) -{ - memcpy(eContestLinkSendBuffer, data, size); - SendBlock(bitmask_all_link_players_but_self(), eContestLinkSendBuffer, size); -} - -static bool8 HasPlayerReceivedBlock(u8 who) -{ - u8 flag = 1 << who; - if (!(GetBlockReceivedStatus() & flag)) - return FALSE; - ResetBlockReceivedFlag(flag); - return TRUE; -} - -static bool8 HaveAllPlayersReceivedBlock(void) -{ - int i; - - for (i = 0; i < MAX_LINK_PLAYERS; i++) - { - if (!((GetBlockReceivedStatus() >> i) & 1)) - return FALSE; - } - ResetBlockReceivedFlags(); - return TRUE; -} - -void sub_80C8604(u8 taskId) -{ -#if ENGLISH - u8 i; - - for (i = 0; i < 4; i++) - gBlockRecvBuffer[i][0] = 0xff; -#endif - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_80C8644; -} - -static void sub_80C8644(u8 taskId) -{ - gTasks[taskId].func = sub_80C8660; -} - -static void sub_80C8660(u8 taskId) -{ - if (gReceivedRemoteLinkPlayers) - { - gContestPlayerMonIndex = GetMultiplayerId(); - if (GetLinkPlayerCount() == MAX_LINK_PLAYERS) - { - gIsLinkContest = TRUE; - SwitchTaskToFollowupFunc(taskId); - } - } -} - -#ifdef NONMATCHING -u8 GetStringLanguage(const u8 *string) -{ - u8 language = GAME_LANGUAGE; - if (string[0] == EXT_CTRL_CODE_BEGIN && string[1] == 0x15) - return language; - if (StringLength(string) > 5) - return language; - for (; *string != EOS; string++) - { - if (!((*string >= CHAR_A && *string <= CHAR_z) || - (*string >= CHAR_0 + 0 && *string <= CHAR_0 + 9) || - *string == CHAR_SPACE || - *string == CHAR_PERIOD || - *string == CHAR_COMMA || - *string == 0xAB || - *string == CHAR_QUESTION_MARK || - *string == CHAR_MALE || - *string == CHAR_FEMALE || - *string == CHAR_SLASH || - *string == CHAR_HYPHEN || - *string == CHAR_ELLIPSIS || - *string == 0xB1 || - *string == 0xB2 || - *string == 0xB3 || - *string == 0xB1 - )) - { - language = LANGUAGE_JAPANESE; - break; - } - } - return language; -} -#else -NAKED u8 GetStringLanguage(const u8 *string) -{ - asm_unified("\tpush {r4,r5,lr}\n" - "\tadds r4, r0, 0\n" - ".ifdef ENGLISH\n" - "\tmovs r5, 0x2\n" - ".else\n" - "\tmovs r5, 0x5\n" - ".endif\n" - "\tldrb r0, [r4]\n" - "\tcmp r0, 0xFC\n" - "\tbne _080C86B6\n" - "\tldrb r0, [r4, 0x1]\n" - "\tcmp r0, 0x15\n" - "\tbne _080C86B6\n" - ".ifdef ENGLISH\n" - "\tmovs r0, 0x2\n" - ".else\n" - "\tmovs r0, 0x5\n" - ".endif\n" - "\tb _080C872C\n" - "_080C86B6:\n" - "\tadds r0, r4, 0\n" - "\tbl StringLength\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tcmp r0, 0x5\n" - "\tbhi _080C872A\n" - "\tldrb r0, [r4]\n" - "\tcmp r0, 0xFF\n" - "\tbeq _080C872A\n" - "_080C86CA:\n" - "\tldrb r1, [r4]\n" - "\tadds r0, r1, 0\n" - "\tadds r0, 0x45\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x33\n" - "\tbls _080C871E\n" - "\tadds r0, r1, 0\n" - "\tadds r0, 0x5F\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x9\n" - "\tbls _080C871E\n" - "\tadds r0, r1, 0\n" - "\tcmp r0, 0\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xAD\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xB8\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xAB\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xAC\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xB5\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xB6\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xBA\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xAE\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xB0\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xB1\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xB2\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xB3\n" - "\tbeq _080C871E\n" - "\tcmp r0, 0xB1\n" - "\tbne _080C8728\n" - "_080C871E:\n" - "\tadds r4, 0x1\n" - "\tldrb r0, [r4]\n" - "\tcmp r0, 0xFF\n" - "\tbne _080C86CA\n" - "\tb _080C872A\n" - "_080C8728:\n" - "\tmovs r5, 0x1\n" - "_080C872A:\n" - "\tadds r0, r5, 0\n" - "_080C872C:\n" - "\tpop {r4,r5}\n" - "\tpop {r1}\n" - "\tbx r1"); -} -#endif - -void sub_80C8734(u8 taskId) -{ - int i; - u8 *name; - - switch (gTasks[taskId].data[0]) { -#if ENGLISH - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; -#elif GERMAN - case 8: -#endif - case 0: - if (GetMultiplayerId() == 0) { - if (IsLinkTaskFinished()) { -#if ENGLISH - memcpy(gBlockSendBuffer, gContestMons + gContestPlayerMonIndex, sizeof(struct ContestPokemon)); - sub_8007E9C(2); - gTasks[taskId].data[0]++; -#elif GERMAN - if (gTasks[taskId].data[0] == 0) - { - gTasks[taskId].data[0] = 3; - } - else - { - memcpy(gBlockSendBuffer, gContestMons + gContestPlayerMonIndex, sizeof(struct ContestPokemon)); - de_sub_80C9274(FALSE); - sub_8007E9C(2); - gTasks[taskId].data[0] = 1; - } -#endif - } - } - else - { - memcpy(gBlockSendBuffer, gContestMons + gContestPlayerMonIndex, sizeof(struct ContestPokemon)); -#if GERMAN - de_sub_80C9294(FALSE); -#endif - gTasks[taskId].data[0]++; - } - break; - case 1: - if (HaveAllPlayersReceivedBlock()) - { - for (i = 0; i < MAX_LINK_PLAYERS; i++) - { - memcpy(gContestMons + i, gBlockRecvBuffer[i], sizeof(struct ContestPokemon)); - name = gContestMons[i].nickname; - if (gLinkPlayers[i].language == LANGUAGE_JAPANESE) - { - ConvertInternationalString(name, GetStringLanguage(name)); - } - else if (name[10] == EXT_CTRL_CODE_BEGIN) - { - ConvertInternationalString(name, LANGUAGE_JAPANESE); - } else - { - name[5] = name[10]; - name[10] = EOS; - } - name = gContestMons[i].trainerName; - if (gLinkPlayers[i].language == LANGUAGE_JAPANESE) - { - name[7] = EOS; - name[6] = name[4]; - name[5] = name[3]; - name[4] = name[2]; - name[3] = name[1]; - name[2] = name[0]; - name[1] = 0x15; - name[0] = EXT_CTRL_CODE_BEGIN; - } - else - { - name[5] = name[7]; - name[7] = EOS; - } - } - gTasks[taskId].data[0]++; - } - break; -#if GERMAN - case 2: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - default: - gTasks[taskId].data[0]++; - break; -#endif - } -} - -void sub_80C88AC(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - case 0: - if (GetMultiplayerId() == 0) - { - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(&gRngValue, sizeof(u32)); - gTasks[taskId].data[0]++; - } - } - else - { - gTasks[taskId].data[0]++; - } - break; - case 1: - if (HasPlayerReceivedBlock(0)) - { - memcpy(&gRngValue, gBlockRecvBuffer[0], sizeof(u32)); - memcpy(&gContestRngValue, gBlockRecvBuffer[0], sizeof(u32)); - gTasks[taskId].data[0]++; - } - break; - } -} - -void sub_80C8938(u8 taskId) -{ - int i; - - switch (gTasks[taskId].data[0]) - { -#if ENGLISH - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; -#elif GERMAN - case 8: -#endif - case 0: - gBlockSendBuffer[0] = gTasks[taskId].data[9]; - if (GetMultiplayerId() == 0) - { - if (IsLinkTaskFinished()) - { -#if ENGLISH - sub_8007E9C(2); - gTasks[taskId].data[0]++; -#elif GERMAN - if (gTasks[taskId].data[0] == 0) - { - gTasks[taskId].data[0] = 3; - } - else - { - de_sub_80C9274(TRUE); - sub_8007E9C(2); - gTasks[taskId].data[0] = 1; - } -#endif - } - } - else - { -#if GERMAN - de_sub_80C9294(TRUE); -#endif - gTasks[taskId].data[0]++; - } - break; - case 1: - if (HaveAllPlayersReceivedBlock()) - { - for (i = 0; i < MAX_LINK_PLAYERS; i++) - { - gTasks[taskId].data[i + 1] = gBlockRecvBuffer[i][0]; - } - gTasks[taskId].data[0]++; - } - break; -#if GERMAN - case 2: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - default: - gTasks[taskId].data[0]++; - break; -#endif - } -} - -void sub_80C89DC(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - case 0: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(&gContestPlayerMonIndex, sizeof(u8)); - gTasks[taskId].data[0]++; - } - break; - case 1: - if (HaveAllPlayersReceivedBlock()) - { - gTasks[taskId].data[0]++; - } - break; - } -} - -void sub_80C8A38(u8 taskId) -{ - int i; - - switch (gTasks[taskId].data[0]) - { - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - case 0: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(&sContestantStatus[gContestPlayerMonIndex].currMove, sizeof(u16)); - gTasks[taskId].data[0]++; - } - break; - case 1: - if (HaveAllPlayersReceivedBlock()) - { - for (i = 0; i < MAX_LINK_PLAYERS; i++) - { - *&sContestantStatus[i].currMove = gBlockRecvBuffer[i][0]; - } - gTasks[taskId].data[0]++; - } - break; - } -} - -void sub_80C8AD0(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - case 0: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(gUnknown_02038678, sizeof gUnknown_02038678); - gTasks[taskId].data[0]++; - } - break; - case 1: - if (HaveAllPlayersReceivedBlock()) - { - memcpy(gUnknown_02038678, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038678); - gTasks[taskId].data[0]++; - } - break; - case 2: - case 5: - case 8: - case 11: - if (gTasks[taskId].data[1]++ > 10) - { - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[0]++; - } - break; - case 3: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(gUnknown_02038680, sizeof gUnknown_02038680); - gTasks[taskId].data[0]++; - } - break; - case 4: - if (HaveAllPlayersReceivedBlock()) - { - memcpy(gUnknown_02038680, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038680); - gTasks[taskId].data[0]++; - } - break; - case 6: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(gUnknown_02038688, sizeof gUnknown_02038688); - gTasks[taskId].data[0]++; - } - break; - case 7: - if (HaveAllPlayersReceivedBlock()) - { - memcpy(gUnknown_02038688, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038688); - gTasks[taskId].data[0]++; - } - break; - case 9: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(gContestFinalStandings, sizeof gContestFinalStandings); - gTasks[taskId].data[0]++; - } - break; - case 10: - if (HaveAllPlayersReceivedBlock()) - { - memcpy(gContestFinalStandings, gBlockRecvBuffer[gUnknown_0203869B], sizeof gContestFinalStandings); - gTasks[taskId].data[0]++; - } - break; - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - } -} - -void sub_80C8C80(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - case 0: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(sContestantStatus, 4 * sizeof(struct ContestantStatus)); - gTasks[taskId].data[0]++; - } - break; - case 1: - if (HaveAllPlayersReceivedBlock()) - { - memcpy(sContestantStatus, gBlockRecvBuffer[gUnknown_0203869B], 4 * sizeof(struct ContestantStatus)); - gTasks[taskId].data[0]++; - } - break; - case 2: - case 5: - case 8: - case 11: - if (gTasks[taskId].data[1]++ > 10) - { - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[0]++; - } - break; - case 3: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(&shared192D0, sizeof shared192D0); - gTasks[taskId].data[0]++; - } - break; - case 4: - if (HaveAllPlayersReceivedBlock()) - { - memcpy(&shared192D0, gBlockRecvBuffer[gUnknown_0203869B], sizeof shared192D0); - gTasks[taskId].data[0]++; - } - break; - case 6: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(&shared19328, sizeof shared19328); - gTasks[taskId].data[0]++; - } - break; - case 7: - if (HaveAllPlayersReceivedBlock()) - { - memcpy(&shared19328, gBlockRecvBuffer[gUnknown_0203869B], sizeof shared19328); - gTasks[taskId].data[0]++; - } - break; - case 9: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(gUnknown_02038696, sizeof gUnknown_02038696); - gTasks[taskId].data[0]++; - } - break; - case 10: - if (HaveAllPlayersReceivedBlock()) - { - memcpy(gUnknown_02038696, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038696); - gTasks[taskId].data[0]++; - } - break; - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - } -} - -void sub_80C8E1C(u8 taskId) -{ - int i; - - switch (gTasks[taskId].data[0]) - { -#if ENGLISH - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; -#elif GERMAN - case 8: -#endif - case 0: - gBlockSendBuffer[0] = 0x64; - if (GetMultiplayerId() == 0) - { - if (IsLinkTaskFinished()) - { -#if ENGLISH - sub_8007E9C(2); - gTasks[taskId].data[0]++; -#elif GERMAN - if (gTasks[taskId].data[0] == 0) - { - gTasks[taskId].data[0] = 3; - } - else - { - de_sub_80C9274(FALSE); - sub_8007E9C(2); - gTasks[taskId].data[0] = 1; - } -#endif - } - } - else - { -#if GERMAN - de_sub_80C9294(FALSE); -#endif - gTasks[taskId].data[0]++; - } - break; - case 1: - if (HaveAllPlayersReceivedBlock()) - { - for (i = 0; i < MAX_LINK_PLAYERS; i++) - { - gTasks[taskId].data[5 + i] = gBlockRecvBuffer[i][0]; - } - gTasks[taskId].data[0]++; - } - break; -#if GERMAN - case 2: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - default: - gTasks[taskId].data[0]++; - break; -#endif - } -} - -void sub_80C8EBC(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - case 0: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(gContestMonConditions, sizeof gContestMonConditions); - gTasks[taskId].data[0]++; - } - break; - case 1: - if (HaveAllPlayersReceivedBlock()) - { - memcpy(gContestMonConditions, gBlockRecvBuffer[gUnknown_0203869B], sizeof gContestMonConditions); - gTasks[taskId].data[0]++; - } - break; - } -} - -void sub_80C8F34(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - case 0: - if (IsLinkTaskFinished()) - { - SendBlockToAllOpponents(gUnknown_02038696, sizeof gUnknown_02038696); - gTasks[taskId].data[0]++; - } - break; - case 1: - if (HaveAllPlayersReceivedBlock()) - { - memcpy(gUnknown_02038696, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038696); - gTasks[taskId].data[0]++; - } - break; - } -} - -#if GERMAN - -static void de_sub_80C9274(bool32 arg0) -{ - if (deUnkValue2 == 1) - { - if (arg0) - deUnkValue2 = 3; - else - deUnkValue2 = 2; - } -} - -static void de_sub_80C9294(bool32 arg0) -{ - if (deUnkValue2 == 1) - { - if (arg0) - deUnkValue2 = 3; - else - deUnkValue2 = 2; - } - else if (deUnkValue2 == 2) - { - SendBlock(0, sBlockRequestLookupTable[deUnkValue1].address, sBlockRequestLookupTable[deUnkValue1].size); - if (arg0) - deUnkValue2 = 0; - else - deUnkValue2 = 1; - } -} - -#endif diff --git a/src/contest_link_util.c b/src/contest_link_util.c new file mode 100644 index 000000000..0e4ff15b2 --- /dev/null +++ b/src/contest_link_util.c @@ -0,0 +1,2911 @@ +#include "global.h" +#include "contest_link_util.h" +#include "battle.h" +#include "blend_palette.h" +#include "constants/songs.h" +#include "contest.h" +#include "contest_link.h" +#include "data2.h" +#include "decompress.h" +#include "event_data.h" +#include "ewram.h" +#include "field_effect.h" +#include "field_specials.h" +#include "graphics.h" +#include "link.h" +#include "main.h" +#include "menu.h" +#include "overworld.h" +#include "palette.h" +#include "pokedex.h" +#include "pokemon_icon.h" +#include "pokemon_storage_system.h" +#include "random.h" +#include "scanline_effect.h" +#include "script.h" +#include "sound.h" +#include "string_util.h" +#include "strings2.h" +#include "text.h" +#include "trig.h" +#include "tv.h" +#include "util.h" + +#define ABS(x) ((x) < 0 ? -(x) : (x)) + +#define GET_CONTEST_WINNER(var) { \ + for ((var) = 0; (var) < 4; (var)++) \ + { \ + if (gContestFinalStandings[i] == 0) \ + break; \ + } \ +} + +struct UnkEwramStruct18000 { + u8 unk_00; + u8 unk_01; + u8 unk_02; + u8 unk_03; + u8 unk_04; + u8 unk_05; + u8 unk_06; + u8 unk_07; + u8 unk_08; + u8 unk_09; + u8 unk_0a; + s16 unk_0c[4]; + u8 unk_14; +}; + +struct UnkEwramStruct18018 { + s32 unk_00; + s32 unk_04; + u32 unk_08; + u32 unk_0c; + u8 unk_10; + u8 unk_11; + u8 unk_12; +}; + +#define eContestLink80C2020Struct2018000 (*(struct UnkEwramStruct18000 *)(gSharedMem + 0x18000)) +#define eContestLink80C2020Struct2018018 ((struct UnkEwramStruct18018 *)(gSharedMem + 0x18018)) +#define eContestLink80C2020Struct2018068 (gSharedMem + 0x18068) + +static void sub_80C2430(void); +static void sub_80C2448(void); +static void sub_80C24F4(u8 taskId); +static void sub_80C255C(u8 taskId); +static void sub_80C25A4(u8 taskId); +static void sub_80C25C0(u8 taskId); +static void sub_80C2600(u8 taskId); +static void sub_80C26E4(u8 taskId); +static void sub_80C2770(u8 taskId); +static void sub_80C27EC(u8 taskId); +static void sub_80C2878(u8 taskId); +static void sub_80C2A8C(u8 taskId); +static void sub_80C2D1C(u8 taskId); +static void sub_80C2D80(u8 taskId); +static void sub_80C2DD8(u8 taskId); +static void sub_80C2E14(u8 taskId); +static void sub_80C2EA0(u8 taskId); +static void sub_80C2F28(u8 taskId); +static void sub_80C2F64(u8 taskId); +static void LoadAllContestMonIcons(u8 srcOffset, bool8 useDmaNow); +void sub_80C310C(void); +void sub_80C3158(const u8 *string, u8 spriteId); +void sub_80C33DC(void); +u16 sub_80C34AC(const u8 *string); +void sub_80C34CC(s16 data4, u16 pos0y, u16 data5, u16 data6); +void sub_80C3520(u16 a0); +void sub_80C3588(struct Sprite *sprite); +void sub_80C35FC(struct Sprite *sprite); +void sub_80C3630(struct Sprite *sprite); +void sub_80C3698(const u8 *string); +void sub_80C3764(void); +void sub_80C37E4(void); +u8 sub_80C3990(u8 a0, u8 a1); +s8 sub_80C39E4(u8 a0, u8 a1); +void sub_80C3A5C(u8 taskId); +void sub_80C3BD8(u8 taskId); +void sub_80C3B30(u8 taskId); +void sub_80C3C44(struct Sprite *sprite); +void sub_80C3CB8(struct Sprite *sprite); +void sub_80C3D04(u8 taskId); +void sub_80C3DF0(struct Sprite *sprite); +void sub_80C3E60(u8 a0, u8 a1); +void sub_80C3EA4(u8 taskId); +void sub_80C3F00(void); +void sub_80C40D4(u8 a0, u8 a1); +void sub_80C42C0(u8 taskId); +void Task_StartCommunication(u8 taskId); +void Task_StartCommunicateRng(u8 taskId); +void Task_StartCommunicateLeaderIds(u8 taskId); +void Task_StartCommunicateCategory(u8 taskId); +void Task_LinkContest_SetUpContest(u8 taskId); +void Task_LinkContest_CalculateTurnOrder(u8 taskId); +void Task_LinkContest_FinalizeConnection(u8 taskId); +void Task_LinkContest_Disconnect(u8 taskId); +void Task_LinkContest_WaitDisconnect(u8 taskId); + +const u16 gUnknown_083D1624[] = INCBIN_U16("graphics/unknown/unknown_3D1624/0.4bpp"); +const u16 gUnknown_083D1644[] = INCBIN_U16("graphics/unknown/unknown_3D1624/1.4bpp"); +const u16 gUnknown_083D1664[] = INCBIN_U16("graphics/unknown/unknown_3D1624/2.4bpp"); +const u16 gUnknown_083D1684[] = INCBIN_U16("graphics/unknown/unknown_3D1624/3.4bpp"); +const u16 gUnknown_083D16A4[] = INCBIN_U16("graphics/unknown/unknown_3D1624/4.4bpp"); +const u16 gUnknown_083D16C4[] = INCBIN_U16("graphics/unknown/unknown_3D1624/5.4bpp"); +const u16 gUnknown_083D16E4[] = INCBIN_U16("graphics/unknown/unknown_3D1624/6.4bpp"); +const u16 gUnknown_083D1704[] = INCBIN_U16("graphics/unknown/unknown_3D1624/7.4bpp"); +const u16 gMiscBlank_Pal[] = INCBIN_U16("graphics/interface/blank.gbapal"); + +const struct OamData gOamData_83D1744 = { + .shape = ST_OAM_H_RECTANGLE, + .size = 3, + .priority = 3, + .paletteNum = 2 +}; + +const struct SpriteTemplate gSpriteTemplate_83D174C = { + 0xbc1, + 0xbc1, + &gOamData_83D1744, + gDummySpriteAnimTable, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy +}; + +const struct SpriteSheet gUnknown_083D1764[] = { + {gMiscBlank_Gfx, 0x400, 0xbc1}, + {gMiscBlank_Gfx, 0x400, 0xbc2}, + {gMiscBlank_Gfx, 0x400, 0xbc3}, + {gMiscBlank_Gfx, 0x400, 0xbc4}, + {gMiscBlank_Gfx, 0x400, 0xbc5}, + {gMiscBlank_Gfx, 0x400, 0xbc6}, + {gMiscBlank_Gfx, 0x400, 0xbc7}, + {gMiscBlank_Gfx, 0x400, 0xbc8}, +}; + +const struct SpritePalette gUnknown_083D17A4 = { + gMiscBlank_Pal, 0xbc1 +}; + +const struct OamData gOamData_83D17AC = {}; + +const struct SpriteTemplate gSpriteTemplate_83D17B4 = { + 0xbc9, + 0xbc9, + &gOamData_83D17AC, + gDummySpriteAnimTable, + NULL, + gDummySpriteAffineAnimTable, + sub_80C3DF0 +}; + +const struct CompressedSpriteSheet gUnknown_083D17CC = {gContestConfetti_Gfx, 0x220, 0xbc9}; + +const struct CompressedSpritePalette gUnknown_083D17D4 = {gContestConfetti_Pal, 0xbc9}; + +const u8 gUnknown_083D17DC[] = _("{COLOR RED}"); +const u8 gUnknown_083D17E0[] = _("/"); +const u8 gUnknown_083D17E2[] = _("{SIZE 3}{COLOR_HIGHLIGHT_SHADOW WHITE2 DARK_GREY LIGHT_BLUE}"); + +void sub_80C2020(void) +{ + REG_DISPCNT = DISPCNT_OBJ_1D_MAP; + Text_LoadWindowTemplate(&gWindowTemplate_81E6FA0); + Text_InitWindowWithTemplate(&gMenuWindow, &gWindowTemplate_81E6FA0); + REG_BG0CNT = BGCNT_WRAP | BGCNT_SCREENBASE(30); + REG_BG1CNT = BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(24); + REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(28); + REG_BG3CNT = BGCNT_WRAP | BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(26); + REG_MOSAIC = 0; + REG_WININ = 0x3f3f; + REG_WINOUT = 0x3f2e; + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WIN1H = 0; + REG_WIN1V = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_DISPCNT |= DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_WIN1_ON; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + gBattle_BG2_X = 0; + gBattle_BG2_Y = 0; + gBattle_BG3_X = 0; + gBattle_BG3_Y = 0; + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + gBattle_WIN1H = 0; + gBattle_WIN1V = 0; +} + +void sub_80C2144(void) +{ + int i; + int j; + s8 r7; + s8 r4; + u16 r6; + u16 r3; + + DmaFill32Large(3, 0, VRAM, VRAM_SIZE, 0x1000); + LZDecompressVram(gUnknown_08D1977C, BG_SCREEN_ADDR(0)); + LZDecompressVram(gUnknown_08D1A490, BG_SCREEN_ADDR(26)); + LZDecompressVram(gUnknown_08D1A364, BG_SCREEN_ADDR(28)); + LZDecompressVram(gUnknown_08D1A250, BG_SCREEN_ADDR(30)); + sub_80C37E4(); + LoadCompressedPalette(gUnknown_08D1A618, 0, 0x200); + LoadFontDefaultPalette(&gWindowTemplate_81E6FA0); + for (i = 0; i < 4; i++) + { + r7 = sub_80C3990(i, 1); + r4 = sub_80C39E4(i, 1); + for (j = 0; j < 10; j++) + { + r6 = 0x60b2; + if (j < r7) + r6 = 0x60b4; + if (j < ABS(r4)) + { + r3 = 0x60a4; + if (r4 < 0) + r3 = 0x60a6; + } + else + r3 = 0x60a2; + ((u16 *)BG_VRAM)[i * 0x60 + j + 0x60b3] = r6; + ((u16 *)BG_VRAM)[i * 0x60 + j + 0x60d3] = r3; + } + } +} + +void sub_80C226C(u8 a0) +{ + u8 *strbuf; + + if (a0 == gContestPlayerMonIndex) + strbuf = StringCopy(gDisplayedStringBattle, gUnknown_083D17DC); + else + strbuf = gDisplayedStringBattle; + strbuf[0] = EXT_CTRL_CODE_BEGIN; + strbuf[1] = 0x06; + strbuf[2] = 0x04; + strbuf += 3; + strbuf = StringCopy(strbuf, gContestMons[a0].nickname); + strbuf[0] = EXT_CTRL_CODE_BEGIN; + strbuf[1] = 0x13; + strbuf[2] = 0x32; + strbuf += 3; + strbuf = StringCopy(strbuf, gUnknown_083D17E0); + if (gIsLinkContest & 1) + StringCopy(strbuf, gLinkPlayers[a0].name); + else + StringCopy(strbuf, gContestMons[a0].trainerName); + Text_InitWindowAndPrintText(&gMenuWindow, gDisplayedStringBattle, a0 * 36 + 770, 7, a0 * 3 + 4); +} + +void sub_80C2340(void) +{ + int i; + + for (i = 0; i < 4; i++) + sub_80C226C(i); +} + +void sub_80C2358(void) +{ + gPaletteFade.bufferTransferDisabled = TRUE; + SetVBlankCallback(NULL); + sub_80C2020(); + ScanlineEffect_Clear(); + ResetPaletteFade(); + ResetSpriteData(); + ResetTasks(); + FreeAllSpritePalettes(); + sub_80C2144(); + sub_80C310C(); + LoadAllContestMonIcons(0, TRUE); + sub_80C2340(); + eContestLink80C2020Struct2018000 = (struct UnkEwramStruct18000){}; + memset(eContestLink80C2020Struct2018018, 0, 4 * sizeof(struct UnkEwramStruct18018)); + sub_80C33DC(); + BeginNormalPaletteFade(0xffffffff, 0, 16, 0, 0); + gPaletteFade.bufferTransferDisabled = FALSE; + eContestLink80C2020Struct2018000.unk_02 = CreateTask(sub_80C24F4, 5); + SetMainCallback2(sub_80C2430); + gBattle_WIN1H = 0xf0; + gBattle_WIN1V = 0x80a0; + CreateTask(sub_80C2F28, 20); + sub_80C3F00(); + PlayBGM(MUS_CONTEST_RESULTS); + SetVBlankCallback(sub_80C2448); +} + +static void sub_80C2430(void) +{ + AnimateSprites(); + BuildOamBuffer(); + RunTasks(); + UpdatePaletteFade(); +} + +static void sub_80C2448(void) +{ + REG_BG0HOFS = gBattle_BG0_X; + REG_BG0VOFS = gBattle_BG0_Y; + REG_BG1HOFS = gBattle_BG1_X; + REG_BG1VOFS = gBattle_BG1_Y; + REG_BG2HOFS = gBattle_BG2_X; + REG_BG2VOFS = gBattle_BG2_Y; + REG_BG3HOFS = gBattle_BG3_X; + REG_BG3VOFS = gBattle_BG3_Y; + REG_WIN0H = gBattle_WIN0H; + REG_WIN0V = gBattle_WIN0V; + REG_WIN1H = gBattle_WIN1H; + REG_WIN1V = gBattle_WIN1V; + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + ScanlineEffect_InitHBlankDmaTransfer(); +} + +static void sub_80C24F4(u8 taskId) +{ + if (!gPaletteFade.active) + { + if (gIsLinkContest & 1) + { + sub_80C3698(gOtherText_LinkStandby); + gTasks[taskId].func = sub_80C255C; + } + else + { + gTasks[taskId].func = sub_80C2600; + } + } +} + +static void sub_80C255C(u8 taskId) +{ + if (gReceivedRemoteLinkPlayers && GetLinkPlayerCount() == MAX_LINK_PLAYERS) + { + CreateTask(sub_80C25A4, 0); + gTasks[taskId].func = TaskDummy; + } +} + +static void sub_80C25A4(u8 taskId) +{ + SetTaskFuncWithFollowupFunc(taskId, sub_80C89DC, sub_80C25C0); +} + +static void sub_80C25C0(u8 taskId) +{ + if (IsLinkTaskFinished()) + { + DestroyTask(taskId); + gTasks[eContestLink80C2020Struct2018000.unk_02].func = sub_80C2600; + sub_80C3764(); + } +} + +static void sub_80C2600(u8 taskId) +{ + if (gTasks[taskId].data[0] == 0) + { + CreateTask(sub_80C2F64, 20); + sub_80C3158(gContestText_AnnounceResults, eContestLink80C2020Struct2018000.unk_00); + sub_80C34CC(sub_80C34AC(gContestText_AnnounceResults), 0x90, 0x78, 0x440); + gTasks[taskId].data[0]++; + } + else if (gTasks[taskId].data[0] == 1) + { + if (eContestLink80C2020Struct2018000.unk_04 == 0) + { + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[0]++; + } + } + else if (gTasks[taskId].data[0] == 2) + { + if (++gTasks[taskId].data[1] == 0x15) + { + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[0]++; + } + } + else if (gTasks[taskId].data[0] == 3) + { + sub_80C3158(gContestText_PreliminaryResults, eContestLink80C2020Struct2018000.unk_00); + sub_80C34CC(sub_80C34AC(gContestText_PreliminaryResults), 0x90, 0xffff, 0x440); + gTasks[taskId].data[0]++; + } + else if (gTasks[taskId].data[0] == 4) + { + if (eContestLink80C2020Struct2018000.unk_04 == 2) + { + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = sub_80C26E4; + } + } +} + +static void sub_80C26E4(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + if (eContestLink80C2020Struct2018000.unk_0a == 0) + { + sub_80C40D4(0, gTasks[taskId].data[2]++); + if (eContestLink80C2020Struct2018000.unk_14 == 0) + { + gTasks[taskId].data[0] = 2; + } + else + { + gTasks[taskId].data[0]++; + } + } + break; + case 1: + if (eContestLink80C2020Struct2018000.unk_14 == 0) + { + gTasks[taskId].data[0] = 0; + } + break; + case 2: + sub_80C3520(0x440); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = sub_80C2770; + break; + } +} + +static void sub_80C2770(u8 taskId) +{ + if (eContestLink80C2020Struct2018000.unk_04 == 0) + { + if (++gTasks[taskId].data[1] == 21) + { + gTasks[taskId].data[1] = 0; + sub_80C3158(gContestText_Round2Results, eContestLink80C2020Struct2018000.unk_00); + sub_80C34CC(sub_80C34AC(gContestText_Round2Results), 0x90, 0xffff, 0x440); + } + } + else if (eContestLink80C2020Struct2018000.unk_04 == 2) + { + gTasks[taskId].func = sub_80C27EC; + } +} + +static void sub_80C27EC(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + if (eContestLink80C2020Struct2018000.unk_0a == 0) + { + sub_80C40D4(1, gTasks[taskId].data[2]++); + if (eContestLink80C2020Struct2018000.unk_14 == 0) + { + gTasks[taskId].data[0] = 2; + } + else + { + gTasks[taskId].data[0]++; + } + } + break; + case 1: + if (eContestLink80C2020Struct2018000.unk_14 == 0) + { + gTasks[taskId].data[0] = 0; + } + break; + case 2: + sub_80C3520(0x440); + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = sub_80C2878; + break; + } +} + +static void sub_80C2878(u8 taskId) +{ + int i; + u8 taskId2; + u8 strbuf[100]; + + switch (gTasks[taskId].data[0]) + { + case 0: + if (eContestLink80C2020Struct2018000.unk_04 == 0) + gTasks[taskId].data[0]++; + break; + case 1: + if (++gTasks[taskId].data[1] == 31) + { + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[0]++; + } + break; + case 2: + for (i = 0; i < 4; i++) + { + taskId2 = CreateTask(sub_80C3A5C, 10); + gTasks[taskId2].data[0] = gContestFinalStandings[i]; + gTasks[taskId2].data[1] = i; + } + gTasks[taskId].data[0]++; + break; + case 3: + if (eContestLink80C2020Struct2018000.unk_05 == 4) + { + if (++gTasks[taskId].data[1] == 31) + { + gTasks[taskId].data[1] = 0; + CreateTask(sub_80C3B30, 10); + gTasks[taskId].data[0]++; + GET_CONTEST_WINNER(i); + sub_80C3E60(i, 14); + } + } + break; + case 4: + if (++gTasks[taskId].data[1] == 21) + { + gTasks[taskId].data[1] = 0; + GET_CONTEST_WINNER(i); + if (gIsLinkContest & 1) + { + StringCopy(gStringVar1, gLinkPlayers[i].name); + } + else + { + StringCopy(gStringVar1, gContestMons[i].trainerName); + } + StringCopy(gStringVar2, gContestMons[i].nickname); + StringExpandPlaceholders(strbuf, gContestText_PokeWon); + sub_80C3158(strbuf, eContestLink80C2020Struct2018000.unk_00); + sub_80C34CC(sub_80C34AC(strbuf), 0x90, 0xffff, 0x440); + gTasks[taskId].data[0]++; + } + break; + case 5: + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = sub_80C2A8C; + break; + } +} + +static void sub_80C2A8C(u8 taskId) +{ + int i; + u8 spriteId; + u16 species; + u32 personality; + u32 otId; + const struct CompressedSpritePalette *monPal; + + switch (gTasks[taskId].data[0]) + { + case 0: + gBattle_WIN0H = 0xf0; + gBattle_WIN0V = 0x5050; + GET_CONTEST_WINNER(i); + species = gContestMons[i].species; + personality = gContestMons[i].personality; + otId = gContestMons[i].otId; + HandleLoadSpecialPokePic(gMonFrontPicTable + species, gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (intptr_t)gSharedMem, gMonSpriteGfx_Sprite_ptr[1], species, personality); + monPal = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality); + LoadCompressedObjectPalette(monPal); + GetMonSpriteTemplate_803C56C(species, 1); + gUnknown_02024E8C.paletteTag = monPal->tag; + spriteId = CreateSprite(&gUnknown_02024E8C, 0x110, 0x50, 10); + gSprites[spriteId].data[1] = species; + gSprites[spriteId].oam.priority = 0; + gSprites[spriteId].callback = sub_80C3C44; + eContestLink80C2020Struct2018000.unk_08 = spriteId; + LoadCompressedObjectPic(&gUnknown_083D17CC); + LoadCompressedObjectPalette(&gUnknown_083D17D4); + CreateTask(sub_80C3D04, 10); + gTasks[taskId].data[0]++; + break; + case 1: + if (++gTasks[taskId].data[3] == 1) + { + u8 win0v; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[2] += 2; + if (gTasks[taskId].data[2] > 0x20) + gTasks[taskId].data[2] = 0x20; + win0v = gTasks[taskId].data[2]; + gBattle_WIN0V = ((0x50 - win0v) << 8) | (0x50 + win0v); + if (win0v == 0x20) + { + gTasks[taskId].data[0]++; + } + } + break; + case 2: + if (eContestLink80C2020Struct2018000.unk_06 == 1) + { + gTasks[taskId].data[0]++; + } + break; + case 3: + if (++gTasks[taskId].data[1] == 121) + { + gTasks[taskId].data[1] = 0; + gSprites[eContestLink80C2020Struct2018000.unk_08].callback = sub_80C3CB8; + gTasks[taskId].data[0]++; + } + break; + case 4: + if (eContestLink80C2020Struct2018000.unk_06 == 2) + { + u8 win0v = (gBattle_WIN0V >> 8); + win0v += 2; + if (win0v > 0x50) + win0v = 0x50; + gBattle_WIN0V = (win0v << 8) | (0xa0 - win0v); + if (win0v == 0x50) + { + gTasks[taskId].data[0]++; + } + } + break; + case 5: + if (eContestLink80C2020Struct2018000.unk_06 == 2) + { + eContestLink80C2020Struct2018000.unk_09 = 1; + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = sub_80C2D1C; + } + break; + } +} + +static void sub_80C2D1C(u8 taskId) +{ + int i; + + if (gMain.newKeys & A_BUTTON) + { + if (!(gIsLinkContest & 1)) + { + for (i = 0; i < 4; i++) + { + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gContestMons[i].species), FLAG_SET_SEEN); + } + } + gTasks[taskId].func = sub_80C2D80; + } +} + +static void sub_80C2D80(u8 taskId) +{ + if (gIsLinkContest & 1) + { + sub_80C3698(gOtherText_LinkStandby); + SetCloseLinkCallback(); + gTasks[taskId].func = sub_80C2DD8; + } + else + { + gTasks[taskId].func = sub_80C2E14; + } +} + +static void sub_80C2DD8(u8 taskId) +{ + if (gReceivedRemoteLinkPlayers == 0) + { + gIsLinkContest = 0; + sub_80C3764(); + gTasks[taskId].func = sub_80C2E14; + } +} + +static void sub_80C2E14(u8 taskId) +{ + sub_80BE284(gContestFinalStandings[gContestPlayerMonIndex]); + sub_810FB10(2); + Contest_SaveWinner(gSpecialVar_ContestRank); + Contest_SaveWinner(0xFE); + eCurContestWinnerIsForArtist = TRUE; + eCurContestWinnerSaveIdx = sub_80B2C4C(0xfe, 0); + BeginHardwarePaletteFade(0xff, 0, 0, 16, 0); + gTasks[taskId].func = sub_80C2EA0; +} + +static void sub_80C2EA0(u8 taskId) +{ + if (!gPaletteFade.active) + { + if (gTasks[taskId].data[1] == 0) + { + DestroyTask(eContestLink80C2020Struct2018000.unk_03); + BlendPalettes(0x0000ffff, 16, 0); + gTasks[taskId].data[1]++; + } + else if (gTasks[taskId].data[1] == 1) + { + BlendPalettes(0xffff0000, 16, 0); + gTasks[taskId].data[1]++; + } + else + { + REG_BLDCNT = 0; + REG_BLDY = 0; + DestroyTask(taskId); + SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); + } + } +} + +static void sub_80C2F28(u8 taskId) +{ + gBattle_BG3_X += 2; + gBattle_BG3_Y++; + if (gBattle_BG3_X > 0xff) + gBattle_BG3_X -= 0xff; + if (gBattle_BG3_Y > 0xff) + gBattle_BG3_Y -= 0xff; +} + +static void sub_80C2F64(u8 taskId) +{ + if (++gTasks[taskId].data[0] == 2) + { + gTasks[taskId].data[0] = 0; + if (gTasks[taskId].data[2] == 0) + gTasks[taskId].data[1]++; + else + gTasks[taskId].data[1]--; + if (gTasks[taskId].data[1] == 16) + gTasks[taskId].data[2] = 1; + else if (gTasks[taskId].data[1] == 0) + gTasks[taskId].data[2] = 0; + BlendPalette(0x6b, 0x01, gTasks[taskId].data[1], RGB(30, 22, 11)); + BlendPalette(0x68, 0x01, gTasks[taskId].data[1], RGB(31, 31, 31)); + BlendPalette(0x6e, 0x01, gTasks[taskId].data[1], RGB(30, 29, 29)); + } + if (gTasks[taskId].data[1] == 0) + eContestLink80C2020Struct2018000.unk_0a = 0; + else + eContestLink80C2020Struct2018000.unk_0a = 1; +} + +void sub_80C3024(u16 species, u8 destOffset, u8 srcOffset, bool8 useDmaNow, u32 personality) +{ + int i; + int j; + u16 tile; + u16 offset; + u16 var0; + u16 var1; + + if (useDmaNow) + { + DmaCopy32Defvars(3, GetMonIconPtr(species, personality) + (srcOffset << 9) + 0x80, BG_CHAR_ADDR(1) + (destOffset << 9), 0x180); + var0 = ((destOffset + 10) << 12); + var1 = (destOffset * 16 + 0x200); + tile = var1 | var0; + offset = destOffset * 0x60 + 0x83; + for (i = 0; i < 3; i++) + { + for (j = 0; j < 4; j++) + { + ((u16 *)BG_CHAR_ADDR(3))[(i << 5) + j + offset] = tile; + tile++; + } + } + } + else + { + RequestSpriteCopy(GetMonIconPtr(species, personality) + (srcOffset << 9) + 0x80, BG_CHAR_ADDR(1) + (destOffset << 9), 0x180); + } +} + +static void LoadAllContestMonIcons(u8 srcOffset, bool8 useDmaNow) +{ + int i; + + for (i = 0; i < 4; i++) + { + sub_80C3024(gContestMons[i].species, i, srcOffset, useDmaNow, gContestMons[i].personality); + } +} + +void sub_80C310C(void) +{ + int i; + register u16 species asm("r0"); + + for (i = 0; i < 4; i++) + { + species = mon_icon_convert_unown_species_id(gContestMons[i].species, 0); + LoadPalette(gMonIconPalettes[gMonIconPaletteIndices[species]], 0xa0 + 0x10 * i, 0x20); + } +} + +#ifdef NONMATCHING +void sub_80C3158(const u8 *string, u8 spriteId) +{ + int i, j; + u8 width; + u8 * displayedStringBattle; + void * dest; + u8 * d1; + u8 * d2; + void *d3; + void *d4; + void *d5; + void *d6; + int w; + u16 sp00[4]; + struct Sprite *sprite = &gSprites[spriteId]; + sp00[0] = gSprites[spriteId].oam.tileNum; + sp00[1] = gSprites[sprite->data[0]].oam.tileNum; + sp00[2] = gSprites[sprite->data[1]].oam.tileNum; + sp00[3] = gSprites[sprite->data[2]].oam.tileNum; + + for (i = 0; i < 4; i++) + { + DmaClear32(3, (void *)VRAM + 0x10000 + 32 * sp00[i], 0x400); + } + + width = Text_GetStringWidthFromWindowTemplate(&gWindowTemplate_81E7278, string); + displayedStringBattle = gDisplayedStringBattle; + displayedStringBattle = StringCopy(displayedStringBattle, gUnknown_083D17E2); + if ((~width + 1) & 7) + { + displayedStringBattle[0] = EXT_CTRL_CODE_BEGIN; + displayedStringBattle[1] = 0x11; + displayedStringBattle[2] = ((~width + 1) & 7) / 2; + displayedStringBattle += 3; + } + + width += -8 & (width + 7); + displayedStringBattle = StringCopy(displayedStringBattle, string); + + displayedStringBattle[0] = EXT_CTRL_CODE_BEGIN; + displayedStringBattle[1] = 0x13; + displayedStringBattle[2] = width; + displayedStringBattle[3] = EOS; + + sub_80034D4(eContestLink80C2020Struct2018068, gDisplayedStringBattle); + + CpuCopy32(&gUnknown_083D1624[0x0], (void *)(VRAM + 0x10000) + 32 * sp00[0], 32); + CpuCopy32(&gUnknown_083D1624[0x40], (void *)(VRAM + 0x10000) + 32 * sp00[0] + 0x100, 32); + CpuCopy32(&gUnknown_083D1624[0x40], (void *)(VRAM + 0x10000) + 32 * sp00[0] + 0x200, 32); + CpuCopy32(&gUnknown_083D1624[0x20], (void *)(VRAM + 0x10000) + 32 * sp00[0] + 0x300, 32); + + w = width / 8; + j = 0; + if (j <= w) + { + d2 = eContestLink80C2020Struct2018068 + 0x20; + d1 = eContestLink80C2020Struct2018068; + d3 = (void *)VRAM + 0x0FD20; + d4 = (void *)VRAM + 0x0FE20; + d5 = (void *)VRAM + 0x0FF20; + d6 = (void *)VRAM + 0x10020; + while (j <= w) + { + if (j < 7) + dest = 32 * sp00[0] + d6; + else if (j < 15) + dest = 32 * sp00[1] + d5; + else if (j < 23) + dest = 32 * sp00[2] + d4; + else + dest = 32 * sp00[3] + d3; + + if (j == w) + break; + + CpuCopy32(gUnknown_083D16E4, dest, 32); + CpuCopy32(gUnknown_083D16E4 + 0x10, dest + 0x300, 32); + CpuCopy32(j * 0x40 + d2, dest + 0x100, 32); + CpuCopy32(j * 0x40 + d1, dest + 0x200, 32); + + d3 += 0x20; + d4 += 0x20; + d5 += 0x20; + d6 += 0x20; + j++; + } + } + + CpuCopy32(gUnknown_083D1644, dest, 32); + CpuCopy32(gUnknown_083D1644 + 0x40, dest + 0x100, 32); + CpuCopy32(gUnknown_083D1644 + 0x40, dest + 0x200, 32); + CpuCopy32(gUnknown_083D1644 + 0x20, dest + 0x300, 32); +} +#else +asm(".include \"constants/gba_constants.inc\""); +asm(".include \"include/macros.inc\""); +NAKED +void sub_80C3158(const u8 * string, u8 spriteId) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x1C\n" + "\tmov r9, r0\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tlsls r2, r1, 4\n" + "\tadds r2, r1\n" + "\tlsls r2, 2\n" + "\tldr r3, _080C32C0 @ =gSprites\n" + "\tadds r2, r3\n" + "\tmov r1, sp\n" + "\tldrh r0, [r2, 0x4]\n" + "\tlsls r0, 22\n" + "\tlsrs r0, 22\n" + "\tstrh r0, [r1]\n" + "\tmov r4, sp\n" + "\tmovs r0, 0x2E\n" + "\tldrsh r1, [r2, r0]\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tadds r0, r3\n" + "\tldrh r0, [r0, 0x4]\n" + "\tlsls r0, 22\n" + "\tlsrs r0, 22\n" + "\tstrh r0, [r4, 0x2]\n" + "\tmovs r0, 0x30\n" + "\tldrsh r1, [r2, r0]\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tadds r0, r3\n" + "\tldrh r0, [r0, 0x4]\n" + "\tlsls r0, 22\n" + "\tlsrs r0, 22\n" + "\tstrh r0, [r4, 0x4]\n" + "\tmovs r0, 0x32\n" + "\tldrsh r1, [r2, r0]\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tadds r0, r3\n" + "\tldrh r0, [r0, 0x4]\n" + "\tlsls r0, 22\n" + "\tlsrs r0, 22\n" + "\tstrh r0, [r4, 0x6]\n" + "\tldr r1, _080C32C4 @ =gWindowTemplate_81E7278\n" + "\tmov r8, r1\n" + "\tldr r7, _080C32C8 @ =0x06010000\n" + "\tldr r2, _080C32CC @ =0x040000d4\n" + "\tldr r6, _080C32D0 @ =0x85000100\n" + "\tmov r1, sp\n" + "\tmovs r5, 0\n" + "\tadd r3, sp, 0x8\n" + "\tmovs r4, 0x3\n" + "_080C31CE:\n" + "\tldrh r0, [r1]\n" + "\tlsls r0, 5\n" + "\tadds r0, r7\n" + "\tstr r5, [sp, 0x8]\n" + "\tstr r3, [r2]\n" + "\tstr r0, [r2, 0x4]\n" + "\tstr r6, [r2, 0x8]\n" + "\tldr r0, [r2, 0x8]\n" + "\tadds r1, 0x2\n" + "\tsubs r4, 0x1\n" + "\tcmp r4, 0\n" + "\tbge _080C31CE\n" + "\tmov r0, r8\n" + "\tmov r1, r9\n" + "\tbl Text_GetStringWidthFromWindowTemplate\n" + "\tlsls r0, 24\n" + "\tlsrs r5, r0, 24\n" + "\tldr r2, _080C32D4 @ =gDisplayedStringBattle\n" + "\tldr r1, _080C32D8 @ =gUnknown_083D17E2\n" + "\tadds r0, r2, 0\n" + "\tbl StringCopy\n" + "\tadds r2, r0, 0\n" + "\tmvns r0, r5\n" + "\tadds r1, r0, 0x1\n" + "\tmovs r0, 0x7\n" + "\tands r1, r0\n" + "\tcmp r1, 0\n" + "\tbeq _080C3218\n" + "\tmovs r0, 0xFC\n" + "\tstrb r0, [r2]\n" + "\tmovs r0, 0x11\n" + "\tstrb r0, [r2, 0x1]\n" + "\tlsrs r0, r1, 1\n" + "\tstrb r0, [r2, 0x2]\n" + "\tadds r2, 0x3\n" + "_080C3218:\n" + "\tadds r6, r5, 0x7\n" + "\tmovs r1, 0x8\n" + "\tnegs r1, r1\n" + "\tadds r0, r1, 0\n" + "\tands r6, r0\n" + "\tlsls r6, 24\n" + "\tlsrs r5, r6, 24\n" + "\tadds r0, r2, 0\n" + "\tmov r1, r9\n" + "\tbl StringCopy\n" + "\tadds r2, r0, 0\n" + "\tmovs r0, 0xFC\n" + "\tstrb r0, [r2]\n" + "\tmovs r0, 0x13\n" + "\tstrb r0, [r2, 0x1]\n" + "\tstrb r5, [r2, 0x2]\n" + "\tmovs r0, 0xFF\n" + "\tstrb r0, [r2, 0x3]\n" + "\tldr r0, _080C32DC @ =gSharedMem + 0x18068\n" + "\tmov r10, r0\n" + "\tldr r1, _080C32D4 @ =gDisplayedStringBattle\n" + "\tbl sub_80034D4\n" + "\tmov r0, sp\n" + "\tldrh r4, [r0]\n" + "\tlsls r4, 5\n" + "\tldr r1, _080C32C8 @ =0x06010000\n" + "\tadds r7, r4, r1\n" + "\tldr r0, _080C32E0 @ =gUnknown_083D1624\n" + "\tmov r9, r0\n" + "\tldr r1, _080C32E4 @ =REG_BG0CNT\n" + "\tmov r8, r1\n" + "\tadds r1, r7, 0\n" + "\tmov r2, r8\n" + "\tbl CpuSet\n" + "\tmov r5, r9\n" + "\tadds r5, 0x80\n" + "\tldr r0, _080C32E8 @ =0x06010100\n" + "\tadds r1, r4, r0\n" + "\tadds r0, r5, 0\n" + "\tmov r2, r8\n" + "\tbl CpuSet\n" + "\tldr r0, _080C32EC @ =0x06010200\n" + "\tadds r1, r4, r0\n" + "\tadds r0, r5, 0\n" + "\tmov r2, r8\n" + "\tbl CpuSet\n" + "\tmov r0, r9\n" + "\tadds r0, 0x40\n" + "\tldr r1, _080C32F0 @ =0x06010300\n" + "\tadds r4, r1\n" + "\tadds r1, r4, 0\n" + "\tmov r2, r8\n" + "\tbl CpuSet\n" + "\tlsrs r5, r6, 27\n" + "\tmovs r4, 0\n" + "\tcmp r4, r5\n" + "\tbgt _080C3382\n" + "\tmov r6, sp\n" + "\tmov r0, r10\n" + "\tadds r0, 0x20\n" + "\tstr r0, [sp, 0xC]\n" + "\tmov r1, r10\n" + "\tstr r1, [sp, 0x10]\n" + "\tldr r0, _080C32F4 @ =0x0600fd20\n" + "\tstr r0, [sp, 0x14]\n" + "\tldr r1, _080C32F8 @ =0x0600fe20\n" + "\tstr r1, [sp, 0x18]\n" + "\tldr r0, _080C32FC @ =0x0600ff20\n" + "\tmov r10, r0\n" + "\tldr r1, _080C3300 @ =0x06010020\n" + "\tmov r9, r1\n" + "_080C32B2:\n" + "\tcmp r4, 0x6\n" + "\tbgt _080C3304\n" + "\tldrh r0, [r6]\n" + "\tlsls r0, 5\n" + "\tmov r1, r9\n" + "\tb _080C3322\n" + "\t.align 2, 0\n" + "_080C32C0: .4byte gSprites\n" + "_080C32C4: .4byte gWindowTemplate_81E7278\n" + "_080C32C8: .4byte 0x06010000\n" + "_080C32CC: .4byte 0x040000d4\n" + "_080C32D0: .4byte 0x85000100\n" + "_080C32D4: .4byte gDisplayedStringBattle\n" + "_080C32D8: .4byte gUnknown_083D17E2\n" + "_080C32DC: .4byte gSharedMem + 0x18068\n" + "_080C32E0: .4byte gUnknown_083D1624\n" + "_080C32E4: .4byte REG_BG0CNT\n" + "_080C32E8: .4byte 0x06010100\n" + "_080C32EC: .4byte 0x06010200\n" + "_080C32F0: .4byte 0x06010300\n" + "_080C32F4: .4byte 0x0600fd20\n" + "_080C32F8: .4byte 0x0600fe20\n" + "_080C32FC: .4byte 0x0600ff20\n" + "_080C3300: .4byte 0x06010020\n" + "_080C3304:\n" + "\tcmp r4, 0xE\n" + "\tbgt _080C3310\n" + "\tldrh r0, [r6, 0x2]\n" + "\tlsls r0, 5\n" + "\tmov r1, r10\n" + "\tb _080C3322\n" + "_080C3310:\n" + "\tcmp r4, 0x16\n" + "\tbgt _080C331C\n" + "\tldrh r0, [r6, 0x4]\n" + "\tlsls r0, 5\n" + "\tldr r1, [sp, 0x18]\n" + "\tb _080C3322\n" + "_080C331C:\n" + "\tldrh r0, [r6, 0x6]\n" + "\tlsls r0, 5\n" + "\tldr r1, [sp, 0x14]\n" + "_080C3322:\n" + "\tadds r7, r0, r1\n" + "\tcmp r4, r5\n" + "\tbeq _080C3382\n" + "\tldr r0, _080C33D0 @ =gUnknown_083D16E4\n" + "\tadds r1, r7, 0\n" + "\tmov r2, r8\n" + "\tbl CpuSet\n" + "\tmovs r0, 0xC0\n" + "\tlsls r0, 2\n" + "\tadds r1, r7, r0\n" + "\tldr r0, _080C33D0 @ =gUnknown_083D16E4\n" + "\tadds r0, 0x20\n" + "\tmov r2, r8\n" + "\tbl CpuSet\n" + "\tmovs r0, 0x80\n" + "\tlsls r0, 1\n" + "\tadds r1, r7, r0\n" + "\tldr r0, [sp, 0x10]\n" + "\tmov r2, r8\n" + "\tbl CpuSet\n" + "\tmovs r0, 0x80\n" + "\tlsls r0, 2\n" + "\tadds r1, r7, r0\n" + "\tldr r0, [sp, 0xC]\n" + "\tmov r2, r8\n" + "\tbl CpuSet\n" + "\tldr r1, [sp, 0xC]\n" + "\tadds r1, 0x40\n" + "\tstr r1, [sp, 0xC]\n" + "\tldr r0, [sp, 0x10]\n" + "\tadds r0, 0x40\n" + "\tstr r0, [sp, 0x10]\n" + "\tldr r1, [sp, 0x14]\n" + "\tadds r1, 0x20\n" + "\tstr r1, [sp, 0x14]\n" + "\tldr r0, [sp, 0x18]\n" + "\tadds r0, 0x20\n" + "\tstr r0, [sp, 0x18]\n" + "\tmovs r1, 0x20\n" + "\tadd r10, r1\n" + "\tadd r9, r1\n" + "\tadds r4, 0x1\n" + "\tcmp r4, r5\n" + "\tble _080C32B2\n" + "_080C3382:\n" + "\tldr r4, _080C33D4 @ =gUnknown_083D1644\n" + "\tldr r5, _080C33D8 @ =REG_BG0CNT\n" + "\tadds r0, r4, 0\n" + "\tadds r1, r7, 0\n" + "\tadds r2, r5, 0\n" + "\tbl CpuSet\n" + "\tadds r6, r4, 0\n" + "\tadds r6, 0x80\n" + "\tmovs r0, 0x80\n" + "\tlsls r0, 1\n" + "\tadds r1, r7, r0\n" + "\tadds r0, r6, 0\n" + "\tadds r2, r5, 0\n" + "\tbl CpuSet\n" + "\tmovs r0, 0x80\n" + "\tlsls r0, 2\n" + "\tadds r1, r7, r0\n" + "\tadds r0, r6, 0\n" + "\tadds r2, r5, 0\n" + "\tbl CpuSet\n" + "\tadds r4, 0x40\n" + "\tmovs r0, 0xC0\n" + "\tlsls r0, 2\n" + "\tadds r1, r7, r0\n" + "\tadds r0, r4, 0\n" + "\tadds r2, r5, 0\n" + "\tbl CpuSet\n" + "\tadd sp, 0x1C\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_080C33D0: .4byte gUnknown_083D16E4\n" + "_080C33D4: .4byte gUnknown_083D1644\n" + "_080C33D8: .4byte REG_BG0CNT"); +} +#endif //NONMATCHING + +void sub_80C33DC(void) +{ + int i; + struct SpriteTemplate template; + u8 spriteIds[8]; + + template = gSpriteTemplate_83D174C; + for (i = 0; i <8; i++) + LoadSpriteSheet(&gUnknown_083D1764[i]); + + LoadSpritePalette(&gUnknown_083D17A4); + for (i = 0; i < 8; i++) + { + spriteIds[i] = CreateSprite(&template, 272, 144, 10); + template.tileTag++; + } + + gSprites[spriteIds[0]].data[0] = spriteIds[1]; + gSprites[spriteIds[0]].data[1] = spriteIds[2]; + gSprites[spriteIds[0]].data[2] = spriteIds[3]; + + gSprites[spriteIds[4]].data[0] = spriteIds[5]; + gSprites[spriteIds[4]].data[1] = spriteIds[6]; + gSprites[spriteIds[4]].data[2] = spriteIds[7]; + + eContestLink80C2020Struct2018000.unk_00 = spriteIds[0]; + eContestLink80C2020Struct2018000.unk_04 = 0; + eContestLink80C2020Struct2018000.unk_01 = spriteIds[4]; + sub_80C3764(); +} + +u16 sub_80C34AC(const u8 * string) +{ + u8 width = (StringLength(string) * 6); + return 0x70 - (width / 2); +} + +void sub_80C34CC(s16 arg0, u16 y, u16 arg2, u16 arg3) +{ + struct Sprite *sprite = &gSprites[eContestLink80C2020Struct2018000.unk_00]; + sprite->pos1.x = 272; + sprite->pos1.y = y; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + sprite->data[4] = arg0 + 32; + sprite->data[5] = arg2; + sprite->data[6] = arg3; + sprite->data[7] = 0; + sprite->callback = sub_80C3588; + eContestLink80C2020Struct2018000.unk_04 = 1; +} + +void sub_80C3520(u16 arg0) +{ + struct Sprite *sprite = &gSprites[eContestLink80C2020Struct2018000.unk_00]; + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.y = 0; + sprite->pos2.x = 0; + sprite->data[6] = arg0; + sprite->data[7] = 0; + sprite->callback = sub_80C3630; + eContestLink80C2020Struct2018000.unk_04 = 3; +} + +void sub_80C3564(struct Sprite *sprite) +{ + sprite->pos1.x = 272; + sprite->pos1.y = 144; + sprite->pos2.y = 0; + sprite->pos2.x = 0; + sprite->callback = SpriteCallbackDummy; + eContestLink80C2020Struct2018000.unk_04 = 0; +} + + +void sub_80C3588(struct Sprite *sprite) +{ + int i; + s16 var0; + + var0 = (u16)sprite->data[7] + (u16)sprite->data[6]; + sprite->pos1.x -= var0 >> 8; + sprite->data[7] = (sprite->data[6] + sprite->data[7]) & 0xFF; + if (sprite->pos1.x < sprite->data[4]) + sprite->pos1.x = sprite->data[4]; + + for (i = 0; i < 3; i++) + { + struct Sprite *sprite2 = &gSprites[sprite->data[i]]; + sprite2->pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64; + } + + if (sprite->pos1.x == sprite->data[4]) + sprite->callback = sub_80C35FC; +} + +void sub_80C35FC(struct Sprite *sprite) +{ + eContestLink80C2020Struct2018000.unk_04 = 2; + if ((u16)sprite->data[5] != 0xFFFF) + { + if (--sprite->data[5] == -1) + sub_80C3520(sprite->data[6]); + } +} + +void sub_80C3630(struct Sprite *sprite) +{ + int i; + s16 var0; + + var0 = (u16)sprite->data[7] + (u16)sprite->data[6]; + sprite->pos1.x -= var0 >> 8; + sprite->data[7] = (sprite->data[6] + sprite->data[7]) & 0xFF; + for (i = 0; i < 3; i++) + { + struct Sprite *sprite2 = &gSprites[sprite->data[i]]; + sprite2->pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64; + } + + if (sprite->pos1.x + sprite->pos2.x < -224) + sub_80C3564(sprite); +} + +void sub_80C3698(const u8 *text) +{ + int i; + u16 x; + struct Sprite *sprite; + + sub_80C3158(text, eContestLink80C2020Struct2018000.unk_01); + x = sub_80C34AC(text); + sprite = &gSprites[eContestLink80C2020Struct2018000.unk_01]; + sprite->pos1.x = x + 32; + sprite->pos1.y = 80; + sprite->invisible = FALSE; + for (i = 0; i < 3; i++) + { + gSprites[sprite->data[i]].pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64; + gSprites[sprite->data[i]].pos1.y = sprite->pos1.y; + gSprites[sprite->data[i]].invisible = FALSE; + } + + gBattle_WIN0H = 0x00F0; + gBattle_WIN0V = ((sprite->pos1.y - 16) << 8) | (sprite->pos1.y + 16); + REG_WININ = WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR; +} + +void sub_80C3764(void) +{ + int i; + struct Sprite *sprite; + + sprite = &gSprites[eContestLink80C2020Struct2018000.unk_01]; + sprite->invisible = TRUE; + for (i = 0; i < 3; i++) + gSprites[sprite->data[i]].invisible = TRUE; + + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + REG_WIN0H = gBattle_WIN0H; + REG_WIN0V = gBattle_WIN0V; + REG_WININ = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR; +} + +#ifdef ENGLISH +#ifdef NONMATCHING +static inline s32 de_sub_80C39A8(s32 a0) +{ + s32 result = 0; + if (gIsLinkContest & 0x1) + { + sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 9, 2, 8, 2); + result = 8; + } + else if (gSpecialVar_ContestRank == 0) + { + sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 0, 0, 9, 2); + result = 9; + } + else if (gSpecialVar_ContestRank == 1) + { + sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 9, 0, 8, 2); + result = 8; + } + else if (gSpecialVar_ContestRank == 2) + { + sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 17, 0, 8, 2); + result = 8; + } + else + { + sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 0, 2, 9, 2); + result = 9; + } + return result; +} + +static inline s32 de_sub_80C3A84(s32 a0, s32 * a1) +{ + s32 result; + if (gSpecialVar_ContestCategory == 0) + { + *a1 = 0; + sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 17, 2, 10, 2); + result = 10; + } + else if (gSpecialVar_ContestCategory == 1) + { + *a1 = 1; + sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 0, 4, 11, 2); + result = 11; + } + else if (gSpecialVar_ContestCategory == 2) + { + *a1 = 2; + sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 11, 4, 10, 2); + result = 10; + } + else if (gSpecialVar_ContestCategory == 3) + { + *a1 = 3; + sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 21, 4, 10, 2); + result = 10; + } + else + { + *a1 = 4; + sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 0, 6, 10, 2); + result = 10; + } + return result; +} + +void sub_80C37E4(void) +{ + s32 sp0; + s32 i; + de_sub_80C3A84(de_sub_80C39A8(5) + 5, &sp0); + for (i = 0; i < 0x80; i++) + { + ((vu16 *)(VRAM + 0xE000))[i] &= 0xFFF; + ((vu16 *)(VRAM + 0xE000))[i] |= sp0 << 12;; + } +} +#else +NAKED +void sub_80C37E4(void) +{ + asm_unified("\tpush {r4-r6,lr}\n" + "\tsub sp, 0x10\n" + "\tmovs r5, 0x1\n" + "\tmovs r4, 0\n" + "\tldr r0, _080C3808 @ =gIsLinkContest\n" + "\tldrb r0, [r0]\n" + "\tadds r1, r5, 0\n" + "\tands r1, r0\n" + "\tcmp r1, 0\n" + "\tbeq _080C3814\n" + "\tldr r0, _080C380C @ =0x0600e000\n" + "\tldr r3, _080C3810 @ =gUnknown_08E964B8\n" + "\tmovs r1, 0x9\n" + "\tstr r1, [sp]\n" + "\tmovs r2, 0x2\n" + "\tstr r2, [sp, 0x4]\n" + "\tb _080C386A\n" + "\t.align 2, 0\n" + "_080C3808: .4byte gIsLinkContest\n" + "_080C380C: .4byte 0x0600e000\n" + "_080C3810: .4byte gUnknown_08E964B8\n" + "_080C3814:\n" + "\tldr r0, _080C3830 @ =gSpecialVar_ContestRank\n" + "\tldrh r2, [r0]\n" + "\tcmp r2, 0\n" + "\tbne _080C383C\n" + "\tmovs r4, 0x1\n" + "\tldr r0, _080C3834 @ =0x0600e000\n" + "\tldr r3, _080C3838 @ =gUnknown_08E964B8\n" + "\tstr r2, [sp]\n" + "\tstr r2, [sp, 0x4]\n" + "\tmovs r1, 0x9\n" + "\tstr r1, [sp, 0x8]\n" + "\tmovs r1, 0x2\n" + "\tstr r1, [sp, 0xC]\n" + "\tb _080C3870\n" + "\t.align 2, 0\n" + "_080C3830: .4byte gSpecialVar_ContestRank\n" + "_080C3834: .4byte 0x0600e000\n" + "_080C3838: .4byte gUnknown_08E964B8\n" + "_080C383C:\n" + "\tcmp r2, 0x1\n" + "\tbne _080C385C\n" + "\tldr r0, _080C3854 @ =0x0600e000\n" + "\tldr r3, _080C3858 @ =gUnknown_08E964B8\n" + "\tmovs r1, 0x9\n" + "\tstr r1, [sp]\n" + "\tstr r4, [sp, 0x4]\n" + "\tmovs r1, 0x8\n" + "\tstr r1, [sp, 0x8]\n" + "\tmovs r1, 0x2\n" + "\tstr r1, [sp, 0xC]\n" + "\tb _080C3870\n" + "\t.align 2, 0\n" + "_080C3854: .4byte 0x0600e000\n" + "_080C3858: .4byte gUnknown_08E964B8\n" + "_080C385C:\n" + "\tcmp r2, 0x2\n" + "\tbne _080C3884\n" + "\tldr r0, _080C387C @ =0x0600e000\n" + "\tldr r3, _080C3880 @ =gUnknown_08E964B8\n" + "\tmovs r1, 0x11\n" + "\tstr r1, [sp]\n" + "\tstr r4, [sp, 0x4]\n" + "_080C386A:\n" + "\tmovs r1, 0x8\n" + "\tstr r1, [sp, 0x8]\n" + "\tstr r2, [sp, 0xC]\n" + "_080C3870:\n" + "\tmovs r1, 0x5\n" + "\tmovs r2, 0x1\n" + "\tbl sub_809D104\n" + "\tb _080C389E\n" + "\t.align 2, 0\n" + "_080C387C: .4byte 0x0600e000\n" + "_080C3880: .4byte gUnknown_08E964B8\n" + "_080C3884:\n" + "\tmovs r4, 0x1\n" + "\tldr r0, _080C38C0 @ =0x0600e000\n" + "\tldr r3, _080C38C4 @ =gUnknown_08E964B8\n" + "\tstr r1, [sp]\n" + "\tmovs r2, 0x2\n" + "\tstr r2, [sp, 0x4]\n" + "\tmovs r1, 0x9\n" + "\tstr r1, [sp, 0x8]\n" + "\tstr r2, [sp, 0xC]\n" + "\tmovs r1, 0x5\n" + "\tmovs r2, 0x1\n" + "\tbl sub_809D104\n" + "_080C389E:\n" + "\tadds r4, 0xD\n" + "\tldr r0, _080C38C8 @ =gSpecialVar_ContestCategory\n" + "\tldrh r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _080C38CC\n" + "\tmovs r6, 0\n" + "\tldr r0, _080C38C0 @ =0x0600e000\n" + "\tldr r3, _080C38C4 @ =gUnknown_08E964B8\n" + "\tmovs r1, 0x11\n" + "\tstr r1, [sp]\n" + "\tmovs r2, 0x2\n" + "\tstr r2, [sp, 0x4]\n" + "\tmovs r1, 0xA\n" + "\tstr r1, [sp, 0x8]\n" + "\tstr r2, [sp, 0xC]\n" + "\tb _080C392A\n" + "\t.align 2, 0\n" + "_080C38C0: .4byte 0x0600e000\n" + "_080C38C4: .4byte gUnknown_08E964B8\n" + "_080C38C8: .4byte gSpecialVar_ContestCategory\n" + "_080C38CC:\n" + "\tcmp r0, 0x1\n" + "\tbne _080C38EC\n" + "\tmovs r6, 0x1\n" + "\tldr r0, _080C38E4 @ =0x0600e000\n" + "\tldr r3, _080C38E8 @ =gUnknown_08E964B8\n" + "\tmovs r1, 0\n" + "\tstr r1, [sp]\n" + "\tmovs r1, 0x4\n" + "\tstr r1, [sp, 0x4]\n" + "\tmovs r1, 0xB\n" + "\tb _080C3924\n" + "\t.align 2, 0\n" + "_080C38E4: .4byte 0x0600e000\n" + "_080C38E8: .4byte gUnknown_08E964B8\n" + "_080C38EC:\n" + "\tcmp r0, 0x2\n" + "\tbne _080C3910\n" + "\tmovs r6, 0x2\n" + "\tldr r0, _080C3908 @ =0x0600e000\n" + "\tldr r3, _080C390C @ =gUnknown_08E964B8\n" + "\tmovs r1, 0xB\n" + "\tstr r1, [sp]\n" + "\tmovs r1, 0x4\n" + "\tstr r1, [sp, 0x4]\n" + "\tmovs r1, 0xA\n" + "\tstr r1, [sp, 0x8]\n" + "\tstr r6, [sp, 0xC]\n" + "\tb _080C392A\n" + "\t.align 2, 0\n" + "_080C3908: .4byte 0x0600e000\n" + "_080C390C: .4byte gUnknown_08E964B8\n" + "_080C3910:\n" + "\tcmp r0, 0x3\n" + "\tbne _080C393C\n" + "\tmovs r6, 0x3\n" + "\tldr r0, _080C3934 @ =0x0600e000\n" + "\tldr r3, _080C3938 @ =gUnknown_08E964B8\n" + "\tmovs r1, 0x15\n" + "\tstr r1, [sp]\n" + "\tmovs r1, 0x4\n" + "\tstr r1, [sp, 0x4]\n" + "\tmovs r1, 0xA\n" + "_080C3924:\n" + "\tstr r1, [sp, 0x8]\n" + "\tmovs r1, 0x2\n" + "\tstr r1, [sp, 0xC]\n" + "_080C392A:\n" + "\tadds r1, r4, 0\n" + "\tadds r2, r5, 0\n" + "\tbl sub_809D104\n" + "\tb _080C395A\n" + "\t.align 2, 0\n" + "_080C3934: .4byte 0x0600e000\n" + "_080C3938: .4byte gUnknown_08E964B8\n" + "_080C393C:\n" + "\tmovs r6, 0x4\n" + "\tldr r0, _080C3984 @ =0x0600e000\n" + "\tldr r3, _080C3988 @ =gUnknown_08E964B8\n" + "\tmovs r1, 0\n" + "\tstr r1, [sp]\n" + "\tmovs r1, 0x6\n" + "\tstr r1, [sp, 0x4]\n" + "\tmovs r1, 0xA\n" + "\tstr r1, [sp, 0x8]\n" + "\tmovs r1, 0x2\n" + "\tstr r1, [sp, 0xC]\n" + "\tadds r1, r4, 0\n" + "\tadds r2, r5, 0\n" + "\tbl sub_809D104\n" + "_080C395A:\n" + "\tldr r5, _080C398C @ =0x00000fff\n" + "\tlsls r4, r6, 12\n" + "\tldr r2, _080C3984 @ =0x0600e000\n" + "\tmovs r3, 0x7F\n" + "_080C3962:\n" + "\tldrh r1, [r2]\n" + "\tadds r0, r5, 0\n" + "\tands r0, r1\n" + "\tstrh r0, [r2]\n" + "\tldrh r1, [r2]\n" + "\tadds r0, r4, 0\n" + "\torrs r0, r1\n" + "\tstrh r0, [r2]\n" + "\tadds r2, 0x2\n" + "\tsubs r3, 0x1\n" + "\tcmp r3, 0\n" + "\tbge _080C3962\n" + "\tadd sp, 0x10\n" + "\tpop {r4-r6}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_080C3984: .4byte 0x0600e000\n" + "_080C3988: .4byte gUnknown_08E964B8\n" + "_080C398C: .4byte 0x00000fff"); +} +#endif // NONMATCHING + +#elif defined(GERMAN) +s16 de_sub_80C39A8(s32 a0) +{ + s16 result; + if (gIsLinkContest & 1) + { + sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 11, 3, 8, 3); + result = 8; + } + else if (gSpecialVar_ContestRank == 0) + { + sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 0, 0, 11, 3); + result = 11; + } + else if (gSpecialVar_ContestRank == 1) + { + sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 11, 0, 10, 3); + result = 10; + } + else if (gSpecialVar_ContestRank == 2) + { + sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 21, 0, 10, 3); + result = 10; + } + else + { + sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 0, 3, 11, 3); + result = 11; + } + return result; +} + +s16 de_sub_80C3A84(s32 a0, s32 * a1) +{ + s16 result; + if (gSpecialVar_ContestCategory == 0) + { + *a1 = 0; + sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 19, 3, 7, 3); + result = 7; + } + else if (gSpecialVar_ContestCategory == 1) + { + *a1 = 1; + sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 0, 6, 7, 3); + result = 7; + } + else if (gSpecialVar_ContestCategory == 2) + { + *a1 = 2; + sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 7, 6, 4, 3); + result = 4; + } + else if (gSpecialVar_ContestCategory == 3) + { + *a1 = 3; + sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 11, 6, 6, 3); + result = 6; + } + else + { + *a1 = 4; + sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 17, 6, 5, 3); + result = 5; + } + return result; +} + +void sub_80C37E4(void) +{ + s32 sp0; + s32 i; + de_sub_80C3A84(de_sub_80C39A8(6) + 6, &sp0); + for (i = 0; i < 0x80; i++) + { + ((vu16 *)(VRAM + 0xE000))[i] &= 0xFFF; + ((vu16 *)(VRAM + 0xE000))[i] |= sp0 << 12;; + } +} +#endif + +// fakematching? +u8 sub_80C3990(u8 monIndex, u8 arg1) +{ + u32 var0; + u32 var1; + + var0 = gContestMonRound1Points[monIndex] << 16; + var1 = var0 / 0x3F; + if (var1 & 0xFFFF) + var1 += 0x10000; + + var1 >>= 16; + if (var1 == 0 && var0) + var1 = 1; + + if (arg1 && var1 > 10) + var1 = 10; + + return var1; +} + +s8 sub_80C39E4(u8 arg0, u8 arg1) +{ + u32 r4; + u32 r2; + s16 val; + s8 ret; + + val = gUnknown_02038688[arg0]; + if (val < 0) + r4 = -val << 16; + else + r4 = val << 16; + r2 = r4 / 80; + if (r2 & 0xFFFF) + r2 += 0x10000; + + r2 >>= 16; + if (r2 == 0 && r4 != 0) + r2 = 1; + + if (arg1 != 0 && r2 > 10) + r2 = 10; + + if (gUnknown_02038688[arg0] < 0) + ret = -r2; + else + ret = r2; + + return ret; +} + +void sub_80C3A5C(u8 taskId) +{ + u16 firstTileNum; + + if (gTasks[taskId].data[10] == 0) + { + gTasks[taskId].data[11] = (3 - gTasks[taskId].data[0]) * 40; + gTasks[taskId].data[10]++; + } + else if (gTasks[taskId].data[10] == 1) + { + if (--gTasks[taskId].data[11] == -1) + { + firstTileNum = gTasks[taskId].data[0] * 2 + 0x5043; + *(vu16 *)((VRAM + 0xE142) + gTasks[taskId].data[1] * 192) = firstTileNum + 0x00; + *(vu16 *)((VRAM + 0xE144) + gTasks[taskId].data[1] * 192) = firstTileNum + 0x01; + *(vu16 *)((VRAM + 0xE182) + gTasks[taskId].data[1] * 192) = firstTileNum + 0x10; + *(vu16 *)((VRAM + 0xE184) + gTasks[taskId].data[1] * 192) = firstTileNum + 0x11; + eContestLink80C2020Struct2018000.unk_05++; + DestroyTask(taskId); + PlaySE(SE_CONTEST_PLACE); + } + } +} + +#ifdef NONMATCHING +void sub_80C3B30(u8 taskId) +{ + int i, j, k; + + for (i = 0; i < 4 && gContestFinalStandings[i] != 0; i++) + ; + + for (j = 0; j < 3; j++) + { + for (k = 0; k < 30; k++) + { + ((u16 *)((VRAM + 0xE100) + 2 * (96 * i + 32 * j)))[k] &= 0x0FFF; + ((u16 *)((VRAM + 0xE100) + 2 * (96 * i + 32 * j)))[k] |= 0x9000; + } + } + gTasks[taskId].data[10] = i; + gTasks[taskId].data[12] = 1; + gTasks[taskId].func = sub_80C3BD8; + eContestLink80C2020Struct2018000.unk_03 = taskId; +} +#else +NAKED +void sub_80C3B30(u8 taskId) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tmov r12, r0\n" + "\tmovs r5, 0\n" + "\tldr r1, _080C3BC0 @ =gContestFinalStandings\n" + "\tldrb r0, [r1]\n" + "\tldr r2, _080C3BC4 @ =gTasks\n" + "\tmov r10, r2\n" + "\tcmp r0, 0\n" + "\tbeq _080C3B5C\n" + "_080C3B4E:\n" + "\tadds r5, 0x1\n" + "\tcmp r5, 0x3\n" + "\tbgt _080C3B5C\n" + "\tadds r0, r5, r1\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _080C3B4E\n" + "_080C3B5C:\n" + "\tmovs r1, 0\n" + "\tlsls r0, r5, 1\n" + "\tmov r2, r12\n" + "\tlsls r2, 2\n" + "\tmov r9, r2\n" + "\tadds r0, r5\n" + "\tlsls r0, 5\n" + "\tmov r8, r0\n" + "\tldr r7, _080C3BC8 @ =0x00000fff\n" + "\tmovs r0, 0x90\n" + "\tlsls r0, 8\n" + "\tadds r6, r0, 0\n" + "_080C3B74:\n" + "\tlsls r0, r1, 5\n" + "\tadds r4, r1, 0x1\n" + "\tadd r0, r8\n" + "\t@ the next two instructions are swapped\n" + "\tmovs r3, 0x1D\n" + "\tlsls r0, 1\n" + "\tldr r1, _080C3BCC @ =0x0600e100\n" + "\tadds r2, r0, r1\n" + "_080C3B82:\n" + "\tldrh r1, [r2]\n" + "\tadds r0, r7, 0\n" + "\tands r0, r1\n" + "\torrs r0, r6\n" + "\tstrh r0, [r2]\n" + "\tadds r2, 0x2\n" + "\tsubs r3, 0x1\n" + "\tcmp r3, 0\n" + "\tbge _080C3B82\n" + "\tadds r1, r4, 0\n" + "\tcmp r1, 0x2\n" + "\tble _080C3B74\n" + "\tmov r0, r9\n" + "\tadd r0, r12\n" + "\tlsls r0, 3\n" + "\tadd r0, r10\n" + "\tstrh r5, [r0, 0x1C]\n" + "\tmovs r1, 0x1\n" + "\tstrh r1, [r0, 0x20]\n" + "\tldr r2, _080C3BD0 @ =sub_80C3BD8\n" + "\tstr r2, [r0]\n" + "\tmov r1, r12\n" + "\tldr r0, _080C3BD4 @ =gSharedMem + 0x18000\n" + "\tstrb r1, [r0, 0x3]\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_080C3BC0: .4byte gContestFinalStandings\n" + "_080C3BC4: .4byte gTasks\n" + "_080C3BC8: .4byte 0x00000fff\n" + "_080C3BCC: .4byte 0x0600e100\n" + "_080C3BD0: .4byte sub_80C3BD8\n" + "_080C3BD4: .4byte gSharedMem + 0x18000"); +} +#endif //NONMATCHING + +void sub_80C3BD8(u8 taskId) +{ + if (++gTasks[taskId].data[11] == 1) + { + gTasks[taskId].data[11] = 0; + BlendPalette(0x91, 1, gTasks[taskId].data[12], RGB(13, 28, 27)); + if (gTasks[taskId].data[13] == 0) + { + if (++gTasks[taskId].data[12] == 16) + gTasks[taskId].data[13] = 1; + } + else + { + if (--gTasks[taskId].data[12] == 0) + gTasks[taskId].data[13] = 0; + } + } +} + +void sub_80C3C44(struct Sprite *sprite) +{ + if (sprite->data[0] < 10) + { + if (++sprite->data[0] == 10) + { + PlayCry1(sprite->data[1], 0); + sprite->data[1] = 0; + } + } + else + { + s16 delta = (u16)sprite->data[1] + 0x600; + sprite->pos1.x -= delta >> 8; + sprite->data[1] = (sprite->data[1] + 0x600) & 0xFF; + if (sprite->pos1.x < 120) + sprite->pos1.x = 120; + + if (sprite->pos1.x == 120) + { + sprite->callback = SpriteCallbackDummy; + sprite->data[1] = 0; + eContestLink80C2020Struct2018000.unk_06 = 1; + } + } +} + +void sub_80C3CB8(struct Sprite *sprite) +{ + s16 delta = (u16)sprite->data[1] + 0x600; + sprite->pos1.x -= delta >> 8; + sprite->data[1] = (sprite->data[1] + 0x600) & 0xFF; + if (sprite->pos1.x < -32) + { + sprite->callback = SpriteCallbackDummy; + sprite->invisible = TRUE; + eContestLink80C2020Struct2018000.unk_06 = 2; + } +} + +void sub_80C3D04(u8 taskId) +{ + if (++gTasks[taskId].data[0] == 5) + { + gTasks[taskId].data[0] = 0; + if (eContestLink80C2020Struct2018000.unk_07 < 40) + { + u8 spriteId = CreateSprite(&gSpriteTemplate_83D17B4, (Random() % 240) - 20, 44, 5); + gSprites[spriteId].data[0] = Random() % 512; + gSprites[spriteId].data[1] = (Random() % 24) + 16; + gSprites[spriteId].data[2] = (Random() % 256) + 48; + gSprites[spriteId].oam.tileNum += Random() % 17; + eContestLink80C2020Struct2018000.unk_07++; + } + } + + if (eContestLink80C2020Struct2018000.unk_09) + DestroyTask(taskId); +} + +void sub_80C3DF0(struct Sprite *sprite) +{ + register s16 var0 asm("r1"); + + sprite->data[3] += sprite->data[0]; + sprite->pos2.x = Sin(sprite->data[3] >> 8, sprite->data[1]); + var0 = sprite->data[4] + sprite->data[2]; + sprite->pos1.x += var0 >> 8; + var0 = var0 & 0xFF; + sprite->data[4] = var0; + sprite->pos1.y++; + if (eContestLink80C2020Struct2018000.unk_09) + sprite->invisible = TRUE; + + if (sprite->pos1.x > 248 || sprite->pos1.y > 116) + { + DestroySprite(sprite); + eContestLink80C2020Struct2018000.unk_07--; + } +} + +void sub_80C3E60(u8 monIndex, u8 numFrames) +{ + u8 taskId = CreateTask(sub_80C3EA4, 8); + gTasks[taskId].data[0] = monIndex; + gTasks[taskId].data[1] = numFrames; + gTasks[taskId].data[2] = gContestMons[monIndex].species; +} + +void sub_80C3EA4(u8 taskId) +{ + u8 monIndex = gTasks[taskId].data[0]; + if (gTasks[taskId].data[10]++ == gTasks[taskId].data[1]) + { + gTasks[taskId].data[10] = 0; + sub_80C3024(gTasks[taskId].data[2], monIndex, gTasks[taskId].data[11], FALSE, gContestMons[monIndex].personality); + gTasks[taskId].data[11] ^= 1; + } +} + +void sub_80C3F00(void) +{ + s32 i; + s16 r2 = gContestMonTotalPoints[0]; + s32 r4; + u32 r5; + s8 r0; + + for (i = 1; i < 4; i++) + { + if (r2 < gContestMonTotalPoints[i]) + r2 = gContestMonTotalPoints[i]; + } + + if (r2 < 0) + { + r2 = gContestMonTotalPoints[0]; + + for (i = 1; i < 4; i++) + { + if (r2 > gContestMonTotalPoints[i]) + r2 = gContestMonTotalPoints[i]; + } + } + + for (i = 0; i < 4; i++) + { + r4 = 1000 * gContestMonRound1Points[i] / ABS(r2); + if ((r4 % 10) >= 5) + r4 += 10; + eContestLink80C2020Struct2018018[i].unk_00 = r4 / 10; + + r4 = 1000 * ABS(gUnknown_02038688[i]) / ABS(r2); + if ((r4 % 10) >= 5) + r4 += 10; + eContestLink80C2020Struct2018018[i].unk_04 = r4 / 10; + + if (gUnknown_02038688[i] < 0) + eContestLink80C2020Struct2018018[i].unk_10 = 1; + + r5 = 22528 * eContestLink80C2020Struct2018018[i].unk_00 / 100; + if ((r5 % 256) >= 128) + r5 += 256; + eContestLink80C2020Struct2018018[i].unk_08 = r5 / 256; + + r5 = eContestLink80C2020Struct2018018[i].unk_04 * 22528 / 100; + if ((r5 % 256) >= 128) + r5 += 256; + eContestLink80C2020Struct2018018[i].unk_0c = r5 / 256; + + eContestLink80C2020Struct2018018[i].unk_11 = sub_80C3990(i, 1); + r0 = sub_80C39E4(i, 1); + eContestLink80C2020Struct2018018[i].unk_12 = ABS(r0); + + if (gContestFinalStandings[i]) + { + s16 r2__ = eContestLink80C2020Struct2018018[i].unk_08; + s16 r1__ = eContestLink80C2020Struct2018018[i].unk_0c; + if (eContestLink80C2020Struct2018018[i].unk_10) + r1__ = -r1__; + if (r2__ + r1__ == 88) + { + if (r1__ > 0) + eContestLink80C2020Struct2018018[i].unk_0c--; + else if (r2__ > 0) + eContestLink80C2020Struct2018018[i].unk_08--; + } + } + } +} + +#ifdef NONMATCHING +void sub_80C40D4(u8 arg0, u8 arg1) +{ + int i; + u8 taskId; + u8 sp8, spC; + + sp8 = 0; + spC = 0; + if (!arg0) + { + u32 var0; + for (i = 0; i < 4; i++) + { + u8 var1 = eContestLink80C2020Struct2018018[i].unk_11; + if (arg1 < var1) + { + int x = var1 + 19; + x += 32 * (i * 3 + 5); + x -= arg1; + x--; + *(vu16 *)((VRAM + 0xC000) + 2 * x) = 0x60B3; + taskId = CreateTask(sub_80C42C0, 10); + var0 = ((eContestLink80C2020Struct2018018[i].unk_08 << 16) / eContestLink80C2020Struct2018018[i].unk_11) * (arg1 + 1); + if ((var0 % 0x10000) >= 0x8000) + var0 += 0x10000; + + gTasks[taskId].data[0] = i; + gTasks[taskId].data[1] = var0 >> 16; + eContestLink80C2020Struct2018000.unk_14++; + sp8++; + } + } + } + else + { + u32 var0; + for (i = 0; i < 4; i++) + { + int tile; + s8 var1 = eContestLink80C2020Struct2018018[i].unk_12; + tile = eContestLink80C2020Struct2018018[i].unk_10 ? 0x60A5 : 0x60A3; + if (arg1 < var1) + { + int x = var1 + 19; + x += 32 * (i * 3 + 6); + x -= arg1; + x--; + *(vu16 *)((VRAM + 0xC000) + 2 * x) = tile; + taskId = CreateTask(sub_80C42C0, 10); + var0 = ((eContestLink80C2020Struct2018018[i].unk_0c << 16) / eContestLink80C2020Struct2018018[i].unk_12) * (arg1 + 1); + if ((var0 % 0x10000) >= 0x8000) + var0 += 0x10000; + + gTasks[taskId].data[0] = i; + if (eContestLink80C2020Struct2018018[i].unk_10) + { + gTasks[taskId].data[2] = 1; + spC++; + } + else + { + sp8++; + } + + if (eContestLink80C2020Struct2018018[i].unk_10) + gTasks[taskId].data[1] = -(var0 >> 16) + eContestLink80C2020Struct2018018[i].unk_08; + else + gTasks[taskId].data[1] = (var0 >> 16) + eContestLink80C2020Struct2018018[i].unk_08; + + eContestLink80C2020Struct2018000.unk_14++; + } + } + } + + if (spC) + PlaySE(SE_BOO); + + if (sp8) + PlaySE(SE_PIN); +} +#else +// Assorted register differences +NAKED +void sub_80C40D4(u8 arg0, u8 arg1) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x8\n" + "\tlsls r0, 24\n" + "\tlsls r1, 24\n" + "\tlsrs r7, r1, 24\n" + "\tmovs r1, 0\n" + "\tmov r10, r1\n" + "\tmovs r2, 0\n" + "\tstr r2, [sp]\n" + "\tcmp r0, 0\n" + "\tbne _080C4198\n" + "\tmov r8, r2\n" + "\tldr r0, _080C417C @ =gSharedMem + 0x18018\n" + "\tsubs r1, 0x18\n" + "\tadds r1, r0\n" + "\tmov r9, r1\n" + "\tadds r4, r0, 0\n" + "\tadds r4, 0x8\n" + "\tmovs r6, 0xA0\n" + "_080C4102:\n" + "\tldrb r0, [r4, 0x9]\n" + "\tcmp r7, r0\n" + "\tbcs _080C416A\n" + "\tadds r0, 0x13\n" + "\tadds r0, r6, r0\n" + "\tsubs r0, r7\n" + "\tlsls r0, 1\n" + "\tldr r2, _080C4180 @ =0x0600bffe\n" + "\tadds r0, r2\n" + "\tldr r2, _080C4184 @ =0x000060b3\n" + "\tadds r1, r2, 0\n" + "\tstrh r1, [r0]\n" + "\tldr r0, _080C4188 @ =sub_80C42C0\n" + "\tmovs r1, 0xA\n" + "\tbl CreateTask\n" + "\tlsls r0, 24\n" + "\tlsrs r5, r0, 24\n" + "\tldr r0, [r4]\n" + "\tlsls r0, 16\n" + "\tldrb r1, [r4, 0x9]\n" + "\tbl __udivsi3\n" + "\tadds r1, r7, 0x1\n" + "\tadds r3, r0, 0\n" + "\tmuls r3, r1\n" + "\tldr r0, _080C418C @ =0x0000ffff\n" + "\tands r0, r3\n" + "\tldr r1, _080C4190 @ =0x00007fff\n" + "\tcmp r0, r1\n" + "\tbls _080C4146\n" + "\tmovs r0, 0x80\n" + "\tlsls r0, 9\n" + "\tadds r3, r0\n" + "_080C4146:\n" + "\tldr r1, _080C4194 @ =gTasks\n" + "\tlsls r0, r5, 2\n" + "\tadds r0, r5\n" + "\tlsls r0, 3\n" + "\tadds r0, r1\n" + "\tmov r1, r8\n" + "\tstrh r1, [r0, 0x8]\n" + "\tlsrs r1, r3, 16\n" + "\tstrh r1, [r0, 0xA]\n" + "\tmov r2, r9\n" + "\tldrb r0, [r2, 0x14]\n" + "\tadds r0, 0x1\n" + "\tstrb r0, [r2, 0x14]\n" + "\tmov r0, r10\n" + "\tadds r0, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tmov r10, r0\n" + "_080C416A:\n" + "\tadds r4, 0x14\n" + "\tadds r6, 0x60\n" + "\tmovs r0, 0x1\n" + "\tadd r8, r0\n" + "\tmov r1, r8\n" + "\tcmp r1, 0x3\n" + "\tble _080C4102\n" + "\tb _080C4292\n" + "\t.align 2, 0\n" + "_080C417C: .4byte gSharedMem + 0x18018\n" + "_080C4180: .4byte 0x0600bffe\n" + "_080C4184: .4byte 0x000060b3\n" + "_080C4188: .4byte sub_80C42C0\n" + "_080C418C: .4byte 0x0000ffff\n" + "_080C4190: .4byte 0x00007fff\n" + "_080C4194: .4byte gTasks\n" + "_080C4198:\n" + "\tmovs r2, 0\n" + "\tmov r8, r2\n" + "\tldr r0, _080C4220 @ =gSharedMem + 0x18018\n" + "\tmov r12, r0\n" + "\tmov r9, r2\n" + "\tmovs r1, 0xC0\n" + "\tstr r1, [sp, 0x4]\n" + "_080C41A6:\n" + "\tmov r6, r9\n" + "\tadd r6, r12\n" + "\tldrb r1, [r6, 0x12]\n" + "\tldrb r0, [r6, 0x10]\n" + "\tldr r2, _080C4224 @ =0x000060a3\n" + "\tcmp r0, 0\n" + "\tbeq _080C41B6\n" + "\tadds r2, 0x2\n" + "_080C41B6:\n" + "\tlsls r0, r1, 24\n" + "\tasrs r0, 24\n" + "\tcmp r7, r0\n" + "\tbge _080C427E\n" + "\tadds r0, 0x13\n" + "\tldr r1, [sp, 0x4]\n" + "\tadds r0, r1, r0\n" + "\tsubs r0, r7\n" + "\tlsls r0, 1\n" + "\tldr r1, _080C4228 @ =0x0600bffe\n" + "\tadds r0, r1\n" + "\tstrh r2, [r0]\n" + "\tldr r0, _080C422C @ =sub_80C42C0\n" + "\tmovs r1, 0xA\n" + "\tbl CreateTask\n" + "\tlsls r0, 24\n" + "\tlsrs r5, r0, 24\n" + "\tldr r0, [r6, 0xC]\n" + "\tlsls r0, 16\n" + "\tldrb r1, [r6, 0x12]\n" + "\tbl __udivsi3\n" + "\tadds r1, r7, 0x1\n" + "\tadds r3, r0, 0\n" + "\tmuls r3, r1\n" + "\tldr r0, _080C4230 @ =0x0000ffff\n" + "\tands r0, r3\n" + "\tldr r1, _080C4234 @ =0x00007fff\n" + "\tcmp r0, r1\n" + "\tbls _080C41FA\n" + "\tmovs r2, 0x80\n" + "\tlsls r2, 9\n" + "\tadds r3, r2\n" + "_080C41FA:\n" + "\tldr r1, _080C4238 @ =gTasks\n" + "\tlsls r2, r5, 2\n" + "\tadds r0, r2, r5\n" + "\tlsls r0, 3\n" + "\tadds r4, r0, r1\n" + "\tmov r0, r8\n" + "\tstrh r0, [r4, 0x8]\n" + "\tldrb r0, [r6, 0x10]\n" + "\tadds r6, r1, 0\n" + "\tcmp r0, 0\n" + "\tbeq _080C423C\n" + "\tmovs r0, 0x1\n" + "\tstrh r0, [r4, 0xC]\n" + "\tldr r0, [sp]\n" + "\tadds r0, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tstr r0, [sp]\n" + "\tb _080C4246\n" + "\t.align 2, 0\n" + "_080C4220: .4byte gSharedMem + 0x18018\n" + "_080C4224: .4byte 0x000060a3\n" + "_080C4228: .4byte 0x0600bffe\n" + "_080C422C: .4byte sub_80C42C0\n" + "_080C4230: .4byte 0x0000ffff\n" + "_080C4234: .4byte 0x00007fff\n" + "_080C4238: .4byte gTasks\n" + "_080C423C:\n" + "\tmov r0, r10\n" + "\tadds r0, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tmov r10, r0\n" + "_080C4246:\n" + "\tldr r0, _080C4264 @ =gSharedMem + 0x18018\n" + "\tmov r1, r9\n" + "\tadds r4, r1, r0\n" + "\tldrb r1, [r4, 0x10]\n" + "\tmov r12, r0\n" + "\tcmp r1, 0\n" + "\tbeq _080C4268\n" + "\tadds r0, r2, r5\n" + "\tlsls r0, 3\n" + "\tadds r0, r6\n" + "\tlsrs r2, r3, 16\n" + "\tldr r1, [r4, 0x8]\n" + "\tsubs r1, r2\n" + "\tb _080C4274\n" + "\t.align 2, 0\n" + "_080C4264: .4byte gSharedMem + 0x18018\n" + "_080C4268:\n" + "\tadds r0, r2, r5\n" + "\tlsls r0, 3\n" + "\tadds r0, r6\n" + "\tlsrs r2, r3, 16\n" + "\tldr r1, [r4, 0x8]\n" + "\tadds r1, r2\n" + "_080C4274:\n" + "\tstrh r1, [r0, 0xA]\n" + "\tldr r1, _080C42BC @ =gSharedMem + 0x18000\n" + "\tldrb r0, [r1, 0x14]\n" + "\tadds r0, 0x1\n" + "\tstrb r0, [r1, 0x14]\n" + "_080C427E:\n" + "\tmovs r2, 0x14\n" + "\tadd r9, r2\n" + "\tldr r0, [sp, 0x4]\n" + "\tadds r0, 0x60\n" + "\tstr r0, [sp, 0x4]\n" + "\tmovs r1, 0x1\n" + "\tadd r8, r1\n" + "\tmov r2, r8\n" + "\tcmp r2, 0x3\n" + "\tble _080C41A6\n" + "_080C4292:\n" + "\tldr r0, [sp]\n" + "\tcmp r0, 0\n" + "\tbeq _080C429E\n" + "\tmovs r0, 0x16\n" + "\tbl PlaySE\n" + "_080C429E:\n" + "\tmov r1, r10\n" + "\tcmp r1, 0\n" + "\tbeq _080C42AA\n" + "\tmovs r0, 0x15\n" + "\tbl PlaySE\n" + "_080C42AA:\n" + "\tadd sp, 0x8\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_080C42BC: .4byte gSharedMem + 0x18000"); +} +#endif //NONMATCHING + +void sub_80C42C0(u8 taskId /*r12*/) +{ + bool32 r6 = FALSE; + bool32 r9 = FALSE; + u8 r5 = gTasks[taskId].data[0]; + s16 r7 = gTasks[taskId].data[1]; + s16 r1 = gTasks[taskId].data[2]; + s32 i; + + if (r1 != 0) + { + if (eContestLink80C2020Struct2018000.unk_0c[r5] <= 0) + r6 = TRUE; + } + else + { + if (eContestLink80C2020Struct2018000.unk_0c[r5] >= 88) + r6 = TRUE; + } + if (eContestLink80C2020Struct2018000.unk_0c[r5] == r7) + r9 = TRUE; + + if (!r9) + { + if (r6) + { + eContestLink80C2020Struct2018000.unk_0c[r5] = r7; + } + else if (r1 != 0) + { + eContestLink80C2020Struct2018000.unk_0c[r5]--; + } + else + { + eContestLink80C2020Struct2018000.unk_0c[r5]++; + } + } + if (!r6) + { + if (!r9) + { + for (i = 0; i < 11; i++) + { + u8 r0; + u16 tile; + if (eContestLink80C2020Struct2018000.unk_0c[r5] >= 8 * (i + 1)) + { + r0 = 8; + } + else if (eContestLink80C2020Struct2018000.unk_0c[r5] >= 8 * i) + { + r0 = eContestLink80C2020Struct2018000.unk_0c[r5] % 8; + } + else + { + r0 = 0; + } + if (r0 < 4) + tile = 0x504C + r0; + else + tile = 0x5057 + r0; + *(vu16 *)((VRAM + 0xE18E) + 2 * (96 * r5 + i)) = tile; + } + } + } + if (r9) + { + eContestLink80C2020Struct2018000.unk_14--; + DestroyTask(taskId); + } +} + +void ScrSpecial_CheckSelectedMonAndInitContest(void) +{ + u8 result = CanMonParticipateInContest(&gPlayerParty[gContestMonPartyIndex]); + if (result != 0) + { + Contest_InitAllPokemon(gSpecialVar_ContestCategory, gSpecialVar_ContestRank); + InitContestMonConditions(gSpecialVar_ContestCategory); + } + gSpecialVar_Result = result; +} + +u16 ScrSpecial_CanMonParticipateInSelectedLinkContest(void) +{ + u16 result = 0; + struct Pokemon *mon = &gPlayerParty[gContestMonPartyIndex]; + switch (gSpecialVar_ContestCategory) + { + case CONTEST_CATEGORY_COOL: + if (GetMonData(mon, MON_DATA_COOL_RIBBON) > gSpecialVar_ContestRank) + result = 1; + break; + case CONTEST_CATEGORY_BEAUTY: + if (GetMonData(mon, MON_DATA_BEAUTY_RIBBON) > gSpecialVar_ContestRank) + result = 1; + break; + case CONTEST_CATEGORY_CUTE: + if (GetMonData(mon, MON_DATA_CUTE_RIBBON) > gSpecialVar_ContestRank) + result = 1; + break; + case CONTEST_CATEGORY_SMART: + if (GetMonData(mon, MON_DATA_SMART_RIBBON) > gSpecialVar_ContestRank) + result = 1; + break; + case CONTEST_CATEGORY_TOUGH: + if (GetMonData(mon, MON_DATA_TOUGH_RIBBON) > gSpecialVar_ContestRank) + result = 1; + break; + } + + return result; +} + + +void ScrSpecial_GiveContestRibbon(void) +{ + u8 ribbonData; + + if (gContestFinalStandings[gContestPlayerMonIndex] != 0) + return; + + switch (gSpecialVar_ContestCategory) + { + case CONTEST_CATEGORY_COOL: + ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_COOL_RIBBON); + if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) + { + ribbonData++; + SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_COOL_RIBBON, &ribbonData); + } + break; + case CONTEST_CATEGORY_BEAUTY: + ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_BEAUTY_RIBBON); + if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) + { + ribbonData++; + SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_BEAUTY_RIBBON, &ribbonData); + } + break; + case CONTEST_CATEGORY_CUTE: + ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_CUTE_RIBBON); + if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) + { + ribbonData++; + SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_CUTE_RIBBON, &ribbonData); + } + break; + case CONTEST_CATEGORY_SMART: + ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SMART_RIBBON); + if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) + { + ribbonData++; + SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SMART_RIBBON, &ribbonData); + } + break; + case CONTEST_CATEGORY_TOUGH: + ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_TOUGH_RIBBON); + if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) + { + ribbonData++; + SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_TOUGH_RIBBON, &ribbonData); + } + break; + } +} + +void Contest_CopyAndConvertTrainerName_Intl(u8 * dest, const u8 * src) +{ + StringCopy(dest, src); + if (dest[0] == EXT_CTRL_CODE_BEGIN && dest[1] == 0x15) + ConvertInternationalString(dest, LANGUAGE_JAPANESE); +} + +void Contest_CopyAndConvertNicknameI_Intl(u8 * dest, u8 idx) +{ + StringCopy(dest, gContestMons[idx].nickname); + if (gIsLinkContest & 1) + { + if (gLinkPlayers[idx].language == LANGUAGE_JAPANESE) + { + ConvertInternationalString(dest, GetStringLanguage(dest)); + } + } +} + +void Contest_GetTrainerNameI_StringVar1(void) +{ + if (gIsLinkContest & 1) + { + Contest_CopyAndConvertTrainerName_Intl(gStringVar1, gLinkPlayers[gSpecialVar_0x8006].name); + } + else + { + Contest_CopyAndConvertTrainerName_Intl(gStringVar1, gContestMons[gSpecialVar_0x8006].trainerName); + } +} + +void Contest_GetNicknameI_StringVar1(void) +{ + Contest_CopyAndConvertNicknameI_Intl(gStringVar3, gSpecialVar_0x8006); +} + +void ScrSpecial_CountContestMonsWithBetterCondition(void) +{ + u8 i; + u8 count; + + for (i = 0, count = 0; i < 4; i++) + { + if (gContestMonRound1Points[gSpecialVar_0x8006] < gContestMonRound1Points[i]) + count++; + } + + gSpecialVar_0x8004 = count; +} + +void ScrSpecial_GetMonCondition(void) +{ + gSpecialVar_0x8004 = gContestMonRound1Points[gSpecialVar_0x8006]; +} + +void ScrSpecial_GetContestWinnerIdx(void) +{ + u8 i; + + for (i = 0; i < 4 && gContestFinalStandings[i] != 0; i++) + ; + + gSpecialVar_0x8005 = i; +} + +void ScrSpecial_GetContestWinnerTrainerName(void) +{ + u8 i; + + for (i = 0; i < 4 && gContestFinalStandings[i] != 0; i++) + ; + + if (gIsLinkContest & 1) + { + Contest_CopyAndConvertTrainerName_Intl(gStringVar3, gLinkPlayers[i].name); + } + else + { + Contest_CopyAndConvertTrainerName_Intl(gStringVar3, gContestMons[i].trainerName); + } +} + +void ScrSpecial_GetContestWinnerNick(void) +{ + u8 i; + + for (i = 0; i < 4 && gContestFinalStandings[i] != 0; i++) + ; + + Contest_CopyAndConvertNicknameI_Intl(gStringVar1, i); +} + +void sub_80C488C(void) +{ + SetMainCallback2(CB2_StartContest); +} + +void sub_80C489C(u8 taskId) +{ + if (!gPaletteFade.active) + { + DestroyTask(taskId); + SetMainCallback2(sub_80C488C); + } +} + +void sub_80C48C8(void) +{ + ScriptContext2_Enable(); + CreateTask(sub_80C489C, 10); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); +} + +void Contest_GetSpeciesNameI_StringVar1(void) +{ + gSpecialVar_0x8004 = gContestMons[gSpecialVar_0x8006].species; +} + +void sub_80C4914(u8 taskId) +{ + if (!gPaletteFade.active) + { + DestroyTask(taskId); + SetMainCallback2(sub_80C2358); + } +} + +void sub_80C4940(void) +{ + ScriptContext2_Enable(); + CreateTask(sub_80C4914, 10); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); +} + +void ScrSpecial_GetContestPlayerMonIdx(void) +{ + gSpecialVar_0x8004 = gContestPlayerMonIndex; +} + +void ContestLinkTransfer(u8 category) +{ + u8 taskId; + ScriptContext2_Enable(); + taskId = CreateTask(Task_LinkContest_Init, 0); + SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_Init, Task_StartCommunication); + gTasks[taskId].data[9] = category; +} + +void Task_StartCommunication(u8 taskId) +{ + Contest_CreatePlayerMon(gContestMonPartyIndex); + SetTaskFuncWithFollowupFunc(taskId, sub_80C8734, Task_StartCommunicateRng); +} + +void Task_StartCommunicateRng(u8 taskId) +{ + SetTaskFuncWithFollowupFunc( + taskId, Task_LinkContest_CommunicateRng, Task_StartCommunicateLeaderIds); +} + +void Task_StartCommunicateLeaderIds(u8 taskId) +{ + SetTaskFuncWithFollowupFunc( + taskId, Task_LinkContest_CommunicateLeaderIds, Task_StartCommunicateCategory); +} + +void Task_StartCommunicateCategory(u8 taskId) +{ + SetTaskFuncWithFollowupFunc( + taskId, Task_LinkContest_CommunicateCategory, Task_LinkContest_SetUpContest); +} + +void Task_LinkContest_SetUpContest(u8 taskId) +{ + u8 i; + u8 sp0[4]; + u8 sp4[4]; + + for (i = 0; i < 4; i++) + sp0[i] = gTasks[taskId].data[i + 1]; + + for (i = 0; i < 4; i++) + { + if (sp0[0] != sp0[i]) + break; + } + + if (i == 4) + gSpecialVar_0x8004 = 0; + else + gSpecialVar_0x8004 = 1; + + for (i = 0; i < 4; i++) + sp4[i] = gTasks[taskId].data[i + 5]; + + gContestLinkLeaderIndex = LinkContest_GetLeaderIndex(sp4); + InitContestMonConditions(gSpecialVar_ContestCategory); + SetTaskFuncWithFollowupFunc( + taskId, Task_LinkContest_CommunicateRound1Points, Task_LinkContest_CalculateTurnOrder); +} + +void Task_LinkContest_CalculateTurnOrder(u8 taskId) +{ + SortContestants(0); + SetTaskFuncWithFollowupFunc( + taskId, Task_LinkContest_CommunicateTurnOrder, Task_LinkContest_FinalizeConnection); +} + +u8 LinkContest_GetLeaderIndex(u8 * a0) +{ + s32 i; + u8 result = 0; + + for (i = 1; i < 4; i++) + { + if (a0[result] < a0[i]) + result = i; + } + + return result; +} + +void Task_LinkContest_FinalizeConnection(u8 taskId) +{ + if (gSpecialVar_0x8004 == 1) + { + if (IsLinkTaskFinished()) + gTasks[taskId].func = Task_LinkContest_Disconnect; + } + else + { + DestroyTask(taskId); + ScriptContext2_Disable(); + EnableBothScriptContexts(); + } +} + +void Task_LinkContest_Disconnect(u8 taskId) +{ + SetCloseLinkCallback(); + gTasks[taskId].func = Task_LinkContest_WaitDisconnect; +} + +void Task_LinkContest_WaitDisconnect(u8 taskId) +{ + if (!gReceivedRemoteLinkPlayers) + { + DestroyTask(taskId); + ScriptContext2_Disable(); + EnableBothScriptContexts(); + } +} diff --git a/src/contest_util.c b/src/contest_util.c new file mode 100644 index 000000000..5fa98a453 --- /dev/null +++ b/src/contest_util.c @@ -0,0 +1,576 @@ +#include "global.h" +#include "contest_util.h" +#include "battle.h" +#include "berry.h" +#include "choose_party.h" +#include "constants/items.h" +#include "constants/species.h" +#include "contest.h" +#include "contest_link_util.h" +#include "contest_painting.h" +#include "data2.h" +#include "daycare.h" +#include "debug.h" +#include "decompress.h" +#include "event_data.h" +#include "ewram.h" +#include "link.h" +#include "load_save.h" +#include "main.h" +#include "menu.h" +#include "overworld.h" +#include "pokedex.h" +#include "pokemon.h" +#include "random.h" +#include "task.h" + +#define CONTEST_ENTRY_PIC_LEFT 10 +#define CONTEST_ENTRY_PIC_TOP 3 + +extern struct SpriteTemplate gUnknown_02024E8C; + +extern u8 gSelectedOrderFromParty[]; + +extern u16 gSpecialVar_ContestCategory; +extern u16 gSpecialVar_ContestRank; + +extern u8 gContestMonPartyIndex; +extern u8 gUnknown_0203856C; + +void SetContestTrainerGfxIds(void) +{ + gSaveBlock1.vars[VAR_OBJ_GFX_ID_0 - VARS_START] = gContestMons[0].trainerGfxId; + gSaveBlock1.vars[VAR_OBJ_GFX_ID_1 - VARS_START] = gContestMons[1].trainerGfxId; + gSaveBlock1.vars[VAR_OBJ_GFX_ID_2 - VARS_START] = gContestMons[2].trainerGfxId; +} + +void GetNpcContestantLocalId(void) +{ + u16 localId; + u8 specialVar = gSpecialVar_0x8005; + + switch(specialVar) + { + case 0: + localId = 3; + break; + case 1: + localId = 4; + break; + case 2: + localId = 5; + break; + default: + localId = 100; + break; + } + gSpecialVar_0x8004 = localId; +} + +void BufferContestTrainerAndMonNames(void) +{ + Contest_GetTrainerNameI_StringVar1(); + Contest_GetNicknameI_StringVar1(); + Contest_GetSpeciesNameI_StringVar1(); +} + +void DoesContestCategoryHaveMuseumPainting(void) +{ + u16 contestWinner; + + switch(gSpecialVar_ContestCategory) + { + case CONTEST_CATEGORY_COOL: + contestWinner = CONTEST_WINNER_MUSEUM_COOL - 1; + break; + case CONTEST_CATEGORY_BEAUTY: + contestWinner = CONTEST_WINNER_MUSEUM_BEAUTY - 1; + break; + case CONTEST_CATEGORY_CUTE: + contestWinner = CONTEST_WINNER_MUSEUM_CUTE - 1; + break; + case CONTEST_CATEGORY_SMART: + contestWinner = CONTEST_WINNER_MUSEUM_SMART - 1; + break; + case CONTEST_CATEGORY_TOUGH: + default: + contestWinner = CONTEST_WINNER_MUSEUM_TOUGH - 1; + break; + } + + if (gSaveBlock1.contestWinners[contestWinner].species == SPECIES_NONE) + gSpecialVar_0x8004 = FALSE; + else + gSpecialVar_0x8004 = TRUE; +} + +void SaveMuseumContestPainting(void) +{ + Contest_SaveWinner(CONTEST_SAVE_FOR_MUSEUM); +} + +void ShouldReadyContestArtist(void) +{ + if(!gContestFinalStandings[gContestPlayerMonIndex] + && gSpecialVar_ContestRank == CONTEST_RANK_MASTER + && + gContestMonTotalPoints[gContestPlayerMonIndex] >= 800) + { + gSpecialVar_0x8004 = TRUE; + } + else + { + gSpecialVar_0x8004 = FALSE; + } +} + +u8 CountPlayerMuseumPaintings(void) +{ + u8 retVar = 0; + int i; + + for (i = 0; i < 5; i++) + if (gSaveBlock1.museumPortraits[i].species != 0) + retVar++; + + return retVar; +} + +void GetContestantNamesAtRank(void) +{ + s16 conditions[4]; + s32 i; + s32 j; + s16 condition; + u8 contestantOffset; + u8 tieRank; + s8 numAtCondition; + u8 rank; + + // Get round 1 points + for (i = 0; i < 4; i++) + conditions[i] = gContestMonRound1Points[i]; + + // Sort round 1 points + for (i = 0; i < 3; i++) + { + for (j = 3; j > i; j--) + { + if (conditions[j - 1] < conditions[j]) + { + int temp; + SWAP(conditions[j], conditions[j - 1], temp) + } + } + } + + // Get round1 points at specified rank + condition = conditions[gSpecialVar_0x8006]; + + // Count number of contestants with the same number of points + numAtCondition = 0; + tieRank = 0; + + for (i = 0; i < 4; i++) + { + if (conditions[i] == condition) + { + numAtCondition++; + if (i == gSpecialVar_0x8006) + tieRank = numAtCondition; + } + } + + // Get rank of first contestant with the same number of points + for (i = 0; i < 4; i++) + { + if (conditions[i] == condition) + break; + } + rank = i; + + // Get contestant id of player at rank (taking ties into account) + contestantOffset = tieRank; + for (i = 0; i < 4; i++) + { + if (condition == gContestMonRound1Points[i]) + { + if (contestantOffset == 1) + break; + contestantOffset--; + } + } + + // Use contestant id to get names + Contest_CopyAndConvertNicknameI_Intl(gStringVar1, i); + + if (gIsLinkContest & 1) + Contest_CopyAndConvertTrainerName_Intl(gStringVar2, gLinkPlayers[i].name); + else + Contest_CopyAndConvertTrainerName_Intl(gStringVar2, gContestMons[i].trainerName); + + // Return adjusted rank + if (numAtCondition == 1) + gSpecialVar_0x8006 = rank; + else if (tieRank == numAtCondition) + gSpecialVar_0x8006 = rank; + else + gSpecialVar_0x8006 = rank + 4; +} + +void ShowContestWinnerCleanup(void) +{ + SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); +} + +void ShowContestWinner(void) +{ + if(gUnknown_0203856C) + { + sub_80AAF30(); + eCurContestWinnerIsForArtist = TRUE; + eCurContestWinnerSaveIdx = sub_80B2C4C(254, 0); + Contest_SaveWinner(3); + gUnknown_0203856C = 0; + } + SetMainCallback2(CB2_ContestPainting); + gMain.savedCallback = ShowContestWinnerCleanup; +} + +void ScrSpecial_SetLinkContestTrainerGfxIdx(void) +{ + VarSet(VAR_OBJ_GFX_ID_0, gContestMons[0].trainerGfxId); + VarSet(VAR_OBJ_GFX_ID_1, gContestMons[1].trainerGfxId); + VarSet(VAR_OBJ_GFX_ID_2, gContestMons[2].trainerGfxId); + VarSet(VAR_OBJ_GFX_ID_3, gContestMons[3].trainerGfxId); +} + +bool8 GiveMonArtistRibbon(void) +{ + u8 ribbon = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_ARTIST_RIBBON); + + if(ribbon == FALSE + && gContestFinalStandings[gContestPlayerMonIndex] == 0 + && gSpecialVar_ContestRank == 3 + && gContestMonTotalPoints[gContestPlayerMonIndex] >= 800) + { + ribbon = TRUE; + SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_ARTIST_RIBBON, &ribbon); + return TRUE; + } + else + { + return FALSE; + } +} + +u8 sub_80C5044(void) +{ + return gUnknown_0203856C; +} + +void ShowContestEntryMonPic(void) +{ + const struct CompressedSpritePalette *palette; + u32 var1, var2; + u16 species; + u8 spriteId; + u8 taskId; + + if(FindTaskIdByFunc(sub_80C5190) == 0xFF) + { + u8 left = CONTEST_ENTRY_PIC_LEFT; + u8 top = CONTEST_ENTRY_PIC_TOP; + + Menu_DrawStdWindowFrame(left, top, 19, 13); + species = gContestMons[gSpecialVar_0x8006].species; + var1 = gContestMons[gSpecialVar_0x8006].personality; + var2 = gContestMons[gSpecialVar_0x8006].otId; + taskId = CreateTask(sub_80C5190, 0x50); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = species; + HandleLoadSpecialPokePic( + &gMonFrontPicTable[species], + gMonFrontPicCoords[species].coords, + gMonFrontPicCoords[species].y_offset, + (u32)gMonSpriteGfx_Sprite_ptr[0], + gMonSpriteGfx_Sprite_ptr[1], + species, + var1); + palette = GetMonSpritePalStructFromOtIdPersonality(species, var2, var1); + LoadCompressedObjectPalette(palette); + GetMonSpriteTemplate_803C56C(species, 1); + gUnknown_02024E8C.paletteTag = palette->tag; + spriteId = CreateSprite(&gUnknown_02024E8C, 0x78, 0x40, 0); + gTasks[taskId].data[2] = spriteId; + gTasks[taskId].data[3] = left; + gTasks[taskId].data[4] = top; + gSprites[spriteId].callback = SpriteCallbackDummy; + gSprites[spriteId].oam.priority = 0; + } +} + +void sub_80C5164(void) +{ + u8 taskId = FindTaskIdByFunc(sub_80C5190); + + if(taskId != 0xFF) + gTasks[taskId].data[0]++; +} + +void sub_80C5190(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + struct Sprite *sprite; + + switch(task->data[0]) + { + case 2: + sprite = &gSprites[task->data[2]]; + FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); + + if(sprite->oam.affineMode) + FreeOamMatrix(sprite->oam.matrixNum); + + DestroySprite(sprite); + task->data[0]++; + break; + case 0: + task->data[0]++; + break; + case 3: + Menu_EraseWindowRect(task->data[3], task->data[4], task->data[3] + 9, task->data[4] + 10); + DestroyTask(taskId); + break; + case 1: + default: + break; + } +} + +void ScriptGetMultiplayerId(void) +{ + if(gIsLinkContest & 1) + gSpecialVar_Result = GetMultiplayerId(); + else + gSpecialVar_Result = 4; +} + +void ScriptRandom(void) +{ + u16 random; + u16 *scriptPtr; + + if(gIsLinkContest & 1) + { + gContestRngValue = 1103515245 * gContestRngValue + 24691; + random = gContestRngValue >> 16; + scriptPtr = &gSpecialVar_Result; + } + else + { + scriptPtr = &gSpecialVar_Result; + random = Random(); + } + *scriptPtr = random % *scriptPtr; +} + +void ScrSpecial_HealPlayerParty(void) +{ + u8 i, j; + u8 ppBonuses; + u8 arg[4]; + + // restore HP. + for(i = 0; i < gPlayerPartyCount; i++) + { + u16 maxHP = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP); + arg[0] = maxHP; + arg[1] = maxHP >> 8; + SetMonData(&gPlayerParty[i], MON_DATA_HP, arg); + ppBonuses = GetMonData(&gPlayerParty[i], MON_DATA_PP_BONUSES); + + // restore PP. + for(j = 0; j < 4; j++) + { + arg[0] = CalculatePPWithBonus(GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + j), ppBonuses, j); + SetMonData(&gPlayerParty[i], MON_DATA_PP1 + j, arg); + } + + // since status is u32, the four 0 assignments here are probably for safety to prevent undefined data from reaching SetMonData. + arg[0] = 0; + arg[1] = 0; + arg[2] = 0; + arg[3] = 0; + SetMonData(&gPlayerParty[i], MON_DATA_STATUS, arg); + } +} + +u8 ScriptGiveMon(u16 species, u8 level, u16 item, u32 unused1, u32 unused2, u8 unused3) +{ + u16 nationalDexNum; + int sentToPc; + u8 heldItem[2]; + struct Pokemon mon; + + CreateMon(&mon, species, level, 32, 0, 0, 0, 0); + heldItem[0] = item; + heldItem[1] = item >> 8; + SetMonData(&mon, MON_DATA_HELD_ITEM, heldItem); + sentToPc = GiveMonToPlayer(&mon); + nationalDexNum = SpeciesToNationalPokedexNum(species); + + switch(sentToPc) + { + case 0: + case 1: + GetSetPokedexFlag(nationalDexNum, 2); + GetSetPokedexFlag(nationalDexNum, 3); + break; + } + return sentToPc; +} + +u8 ScriptGiveEgg(u16 species) +{ + struct Pokemon mon; + u8 isEgg; + + CreateEgg(&mon, species, TRUE); + isEgg = TRUE; + SetMonData(&mon, MON_DATA_IS_EGG, &isEgg); + + return GiveMonToPlayer(&mon); +} + +void HasEnoughMonsForDoubleBattle(void) +{ + switch (GetMonsStateToDoubles()) + { + case PLAYER_HAS_TWO_USABLE_MONS: + gSpecialVar_Result = PLAYER_HAS_TWO_USABLE_MONS; + break; + case PLAYER_HAS_ONE_MON: + gSpecialVar_Result = PLAYER_HAS_ONE_MON; + break; + case PLAYER_HAS_ONE_USABLE_MON: + gSpecialVar_Result = PLAYER_HAS_ONE_USABLE_MON; + break; + } +} + +bool8 CheckPartyMonHasHeldItem(u16 item) +{ + int i; + + for(i = 0; i < 6; i++) + { + u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); + if(species != SPECIES_NONE && species != SPECIES_EGG && GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM) == item) + return TRUE; + } + return FALSE; +} + +bool8 GetNameOfEnigmaBerryInPlayerParty(void) +{ + bool8 hasItem = CheckPartyMonHasHeldItem(ITEM_ENIGMA_BERRY); + + if(hasItem == TRUE) + GetBerryNameByBerryType(ItemIdToBerryType(ITEM_ENIGMA_BERRY), gStringVar1); + + return hasItem; +} + +void CreateScriptedWildMon(u16 species, u8 level, u16 item) +{ + u8 heldItem[2]; + + ZeroEnemyPartyMons(); + CreateMon(&gEnemyParty[0], species, level, 0x20, 0, 0, 0, 0); + + if(item) + { + heldItem[0] = item; + heldItem[1] = item >> 8; + SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem); + } +} + +void ScriptSetMonMoveSlot(u8 monIndex, u16 move, u8 slot) +{ + if(monIndex > 6) + monIndex = gPlayerPartyCount - 1; + + SetMonMoveSlot(&gPlayerParty[monIndex], move, slot); +} + +void sub_80C5568(void) +{ + gMain.savedCallback = sub_80C5580; + sub_8121E10(); +} + +void sub_80C5580(void) +{ + u8 var = gSelectedOrderFromParty[0]; + + switch(var) + { + case 0: + gSpecialVar_Result = 0; + break; + default: + gSpecialVar_Result = 1; + break; + } + + SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); +} + +void ChooseBattleTowerPlayerParty(void) +{ + gMain.savedCallback = SetBattleTowerPlayerParty; + sub_8121E34(); +} + +void SetBattleTowerPlayerParty(void) +{ + u8 var = gSelectedOrderFromParty[0]; + + switch(var) + { + case 0: // player quit battle tower? + LoadPlayerParty(); + gSpecialVar_Result = 0; + break; + default: // load battle tower. + ReducePlayerPartyToThree(); + gSpecialVar_Result = 1; + break; + } + + SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); +} + +void ReducePlayerPartyToThree(void) +{ + struct Pokemon party[3]; + int i; + + CpuFill32(0, party, sizeof party); + + // copy the selected pokemon according to the order. + for(i = 0; i < 3; i++) + if(gSelectedOrderFromParty[i]) // as long as the order keeps going (did the player select 1 mon? 2? 3?), do not stop + party[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1]; // index is 0 based, not literal + + // delete the last 3 pokemon + CpuFill32(0, gPlayerParty, sizeof gPlayerParty); + + // overwrite the first 3 with the order copied to. + for(i = 0; i < 3; i++) + gPlayerParty[i] = party[i]; + + CalculatePlayerPartyCount(); +} diff --git a/src/debug/matsuda_debug_menu.c b/src/debug/matsuda_debug_menu.c index 27d2db66b..b3a0e0ffc 100644 --- a/src/debug/matsuda_debug_menu.c +++ b/src/debug/matsuda_debug_menu.c @@ -2,21 +2,21 @@ #include "matsuda_debug_menu.h" #include "battle.h" #include "contest.h" -#include "contest_link_80C2020.h" -#include "contest_link_80C857C.h" +#include "contest_link.h" +#include "contest_link_util.h" #include "data2.h" +#include "ewram.h" #include "link.h" #include "main.h" #include "menu.h" -#include "palette.h" #include "overworld.h" +#include "palette.h" +#include "scanline_effect.h" #include "sprite.h" #include "start_menu.h" #include "string_util.h" #include "task.h" #include "text.h" -#include "scanline_effect.h" -#include "ewram.h" extern u8 gUnknown_0203856C; extern u8 gContestMonPartyIndex; @@ -149,12 +149,12 @@ static void sub_80A9C98(u8 taskId) static void sub_80A9CC0(u8 taskId) { - SetTaskFuncWithFollowupFunc(taskId, sub_80C88AC, sub_80A9CDC); + SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateRng, sub_80A9CDC); } static void sub_80A9CDC(u8 taskId) { - SetTaskFuncWithFollowupFunc(taskId, sub_80C8E1C, sub_80A9D58); + SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateLeaderIds, sub_80A9D58); } static void sub_80A9CF8(u8 taskId) @@ -169,7 +169,7 @@ static void sub_80A9CF8(u8 taskId) static void sub_80A9D30(u8 taskId) { - sub_800832C(); + SetCloseLinkCallback(); gTasks[taskId].func = sub_80A9CF8; } @@ -181,15 +181,15 @@ static void sub_80A9D58(u8 taskId) for (i = 0; i < 4; i++) dest[i] = gTasks[taskId].data[5 + i]; - gUnknown_0203869B = sub_80C4B34(dest); + gContestLinkLeaderIndex = LinkContest_GetLeaderIndex(dest); InitContestMonConditions((u8)gSpecialVar_ContestCategory); - sub_80B0F28(0); - SetTaskFuncWithFollowupFunc(taskId, sub_80C8EBC, sub_80A9DBC); + SortContestants(0); + SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateRound1Points, sub_80A9DBC); } static void sub_80A9DBC(u8 taskId) { - SetTaskFuncWithFollowupFunc(taskId, sub_80C8F34, sub_80A9DD8); + SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateTurnOrder, sub_80A9DD8); } static void sub_80A9DD8(u8 taskId) @@ -882,7 +882,7 @@ void sub_80AAD44(struct Sprite *sprite, s8 var2) SetDebugMonForContest(); for (i = 0; i < 4; i++) - gContestMonConditions[i] = InitContestMonConditionI(i, gSpecialVar_ContestCategory); + gContestMonRound1Points[i] = InitContestMonConditionI(i, gSpecialVar_ContestCategory); SetMainCallback2(c2_exit_to_overworld_1_sub_8080DEC); } } @@ -950,15 +950,15 @@ void sub_80AAF30(void) for (i = 0; i < 3; i++) { - gContestMonConditions[i] = 0; + gContestMonRound1Points[i] = 0; gUnknown_02038680[i] = 0; - gUnknown_02038678[i] = 0; + gContestMonTotalPoints[i] = 0; gContestMons[i] = gContestMons[3]; } - gContestMonConditions[3] = 0x12C; + gContestMonRound1Points[3] = 0x12C; gUnknown_02038680[3] = 0x190; - gUnknown_02038678[3] = 0x190; + gContestMonTotalPoints[3] = 0x190; Contest_SaveWinner(0xFE); } @@ -976,9 +976,9 @@ u8 MatsudaDebugMenu_ResetHighScore(void) gUnknown_0203856C = 0; for (i = 0; i < 4; i++) { - gContestMonConditions[i] = 0; + gContestMonRound1Points[i] = 0; gUnknown_02038680[i] = 0; - gUnknown_02038678[i] = 0; + gContestMonTotalPoints[i] = 0; } CloseMenu(); return 1; diff --git a/src/field_fadetransition.c b/src/field_fadetransition.c index fea93f215..5ca114f49 100644 --- a/src/field_fadetransition.c +++ b/src/field_fadetransition.c @@ -490,7 +490,7 @@ void sub_8081050(u8 taskId) case 1: if (!PaletteFadeActive() && BGMusicStopped()) { - sub_800832C(); + SetCloseLinkCallback(); data[0]++; } break; diff --git a/src/link.c b/src/link.c index 73652a194..213f9f7e3 100644 --- a/src/link.c +++ b/src/link.c @@ -414,7 +414,7 @@ static void LinkTestProcessKeyInput(void) if (gMain.newKeys & R_BUTTON) Save_WriteData(SAVE_LINK); if (gMain.newKeys & SELECT_BUTTON) - sub_800832C(); + SetCloseLinkCallback(); if (gLinkTestDebugValuesEnabled) { u32 vblankCounter1 = gMain.vblankCounter1; @@ -1145,7 +1145,7 @@ u8 GetDummy2(void) return sDummy2; } -void sub_800832C(void) +void SetCloseLinkCallback(void) { if (!gLinkCallback) { diff --git a/src/mystery_event_menu.c b/src/mystery_event_menu.c index b39804b79..8383ae88a 100644 --- a/src/mystery_event_menu.c +++ b/src/mystery_event_menu.c @@ -220,7 +220,7 @@ static void CB2_MysteryEventMenu(void) if (GetLinkPlayerDataExchangeStatusTimed() == 3) { - sub_800832C(); + SetCloseLinkCallback(); Menu_EraseWindowRect(6, 5, 23, 8); GetEventLoadMessage(gStringVar4, 1); MenuPrintMessageDefaultCoords(gStringVar4); @@ -282,7 +282,7 @@ static void CB2_MysteryEventMenu(void) gMain.state++; break; case 10: - sub_800832C(); + SetCloseLinkCallback(); gMain.state++; break; case 11: diff --git a/src/new_game.c b/src/new_game.c index 63a13be5e..5d69a56c8 100644 --- a/src/new_game.c +++ b/src/new_game.c @@ -1,11 +1,12 @@ #include "global.h" -#include "constants/maps.h" -#include "constants/species.h" -#include "clock.h" #include "new_game.h" #include "battle_records.h" #include "berry.h" +#include "clock.h" +#include "constants/maps.h" +#include "constants/species.h" #include "contest.h" +#include "contest_util.h" #include "decoration_inventory.h" #include "dewford_trend.h" #include "easy_chat.h" @@ -15,6 +16,7 @@ #include "lottery_corner.h" #include "mail_data.h" #include "mauville_man.h" +#include "overworld.h" #include "play_time.h" #include "player_pc.h" #include "pokeblock.h" @@ -23,8 +25,6 @@ #include "pokemon_storage_system.h" #include "random.h" #include "roamer.h" -#include "script_pokemon_80C4.h" -#include "overworld.h" #include "rtc.h" #include "script.h" #include "secret_base.h" diff --git a/src/overworld.c b/src/overworld.c index a0e7939f5..8bd3825b5 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -4,12 +4,17 @@ #include "berry.h" #include "cable_club.h" #include "clock.h" +#include "constants/map_types.h" +#include "constants/maps.h" +#include "constants/songs.h" +#include "constants/species.h" +#include "contest_util.h" #include "event_data.h" +#include "event_object_movement.h" #include "field_camera.h" #include "field_control_avatar.h" #include "field_effect.h" #include "field_fadetransition.h" -#include "event_object_movement.h" #include "field_message_box.h" #include "field_player_avatar.h" #include "field_screen_effect.h" @@ -22,8 +27,8 @@ #include "heal_location.h" #include "link.h" #include "load_save.h" -#include "main.h" #include "m4a.h" +#include "main.h" #include "map_name_popup.h" #include "menu.h" #include "metatile_behavior.h" @@ -34,8 +39,8 @@ #include "roamer.h" #include "rotating_gate.h" #include "safari_zone.h" +#include "scanline_effect.h" #include "script.h" -#include "script_pokemon_80C4.h" #include "secret_base.h" #include "sound.h" #include "start_menu.h" @@ -43,12 +48,7 @@ #include "tileset_anim.h" #include "time_events.h" #include "tv.h" -#include "scanline_effect.h" #include "wild_encounter.h" -#include "constants/map_types.h" -#include "constants/maps.h" -#include "constants/songs.h" -#include "constants/species.h" #ifdef SAPPHIRE #define LEGENDARY_MUSIC MUS_WEATHER_KYOGRE // Heavy Rain diff --git a/src/post_battle_event_funcs.c b/src/post_battle_event_funcs.c index d0fbbec85..a30856c3f 100644 --- a/src/post_battle_event_funcs.c +++ b/src/post_battle_event_funcs.c @@ -1,12 +1,12 @@ #include "global.h" +#include "constants/heal_locations.h" +#include "contest_util.h" #include "event_data.h" #include "hall_of_fame.h" #include "load_save.h" #include "main.h" -#include "pokemon.h" #include "overworld.h" -#include "script_pokemon_80C4.h" -#include "constants/heal_locations.h" +#include "pokemon.h" extern u8 gUnknown_02039324; diff --git a/src/record_mixing.c b/src/record_mixing.c index 1bf92bb41..f04c2ecb0 100644 --- a/src/record_mixing.c +++ b/src/record_mixing.c @@ -677,7 +677,7 @@ void sub_80BA00C(u8 taskId) task->data[1]++; if (task->data[1] > 10) { - sub_800832C(); + SetCloseLinkCallback(); task->data[0]++; } break; diff --git a/src/scrcmd.c b/src/scrcmd.c index 3f65d0f02..c51bd2b10 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -3,16 +3,19 @@ #include "berry.h" #include "clock.h" #include "coins.h" -#include "contest_link_80C2020.h" +#include "constants/maps.h" +#include "contest_link_util.h" #include "contest_painting.h" +#include "contest_util.h" #include "data2.h" #include "decoration.h" #include "decoration_inventory.h" #include "event_data.h" +#include "event_object_lock.h" +#include "event_object_movement.h" #include "field_door.h" #include "field_effect.h" #include "field_fadetransition.h" -#include "event_object_movement.h" #include "field_message_box.h" #include "field_player_avatar.h" #include "field_screen_effect.h" @@ -22,27 +25,24 @@ #include "fieldmap.h" #include "item.h" #include "main.h" -#include "event_object_lock.h" #include "menu.h" #include "money.h" #include "mystery_event_script.h" +#include "overworld.h" #include "palette.h" #include "party_menu.h" #include "pokemon.h" #include "random.h" -#include "overworld.h" #include "rtc.h" #include "script.h" #include "script_menu.h" #include "script_movement.h" -#include "script_pokemon_80C4.h" #include "script_pokemon_80F9.h" #include "shop.h" #include "slot_machine.h" #include "sound.h" #include "string_util.h" #include "tv.h" -#include "constants/maps.h" typedef u16 (*SpecialFunc)(void); typedef void (*NativeFunc)(void); @@ -1831,7 +1831,7 @@ bool8 ScrCmd_showcontestresults(struct ScriptContext *ctx) bool8 ScrCmd_contestlinktransfer(struct ScriptContext *ctx) { - sub_80C4980(gSpecialVar_ContestCategory); + ContestLinkTransfer(gSpecialVar_ContestCategory); ScriptContext1_Stop(); return TRUE; } diff --git a/src/script_pokemon_util_80C4BF0.c b/src/script_pokemon_util_80C4BF0.c deleted file mode 100644 index c1d226958..000000000 --- a/src/script_pokemon_util_80C4BF0.c +++ /dev/null @@ -1,570 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "berry.h" -#include "choose_party.h" -#include "contest.h" -#include "contest_link_80C2020.h" -#include "contest_painting.h" -#include "data2.h" -#include "daycare.h" -#include "debug.h" -#include "decompress.h" -#include "event_data.h" -#include "constants/items.h" -#include "link.h" -#include "load_save.h" -#include "main.h" -#include "menu.h" -#include "pokedex.h" -#include "pokemon.h" -#include "random.h" -#include "overworld.h" -#include "script_pokemon_80C4.h" -#include "constants/species.h" -#include "task.h" -#include "ewram.h" - -#define CONTEST_ENTRY_PIC_LEFT 10 -#define CONTEST_ENTRY_PIC_TOP 3 - -extern struct SpriteTemplate gUnknown_02024E8C; - -extern u8 gSelectedOrderFromParty[]; - -extern u16 gSpecialVar_ContestCategory; -extern u16 gSpecialVar_ContestRank; - -extern u8 gContestMonPartyIndex; -extern u8 gUnknown_0203856C; - -void SetContestTrainerGfxIds(void) -{ - gSaveBlock1.vars[VAR_OBJ_GFX_ID_0 - VARS_START] = gContestMons[0].trainerGfxId; - gSaveBlock1.vars[VAR_OBJ_GFX_ID_1 - VARS_START] = gContestMons[1].trainerGfxId; - gSaveBlock1.vars[VAR_OBJ_GFX_ID_2 - VARS_START] = gContestMons[2].trainerGfxId; -} - -void sub_80C4C28(void) -{ - u16 var; - u8 specialVar = gSpecialVar_0x8005; - - switch(specialVar) - { - case 0: - var = 3; - break; - case 1: - var = 4; - break; - case 2: - var = 5; - break; - default: - var = 100; - break; - } - gSpecialVar_0x8004 = var; -} - -void sub_80C4C64(void) -{ - Contest_GetTrainerNameI_StringVar1(); - Contest_GetNicknameI_StringVar1(); - sub_80C48F4(); -} - -void sub_80C4C78(void) -{ - u16 var; - u16 returnVar; - - switch(gSpecialVar_ContestCategory) - { - case CONTEST_CATEGORY_COOL: - var = 8; - break; - case CONTEST_CATEGORY_BEAUTY: - var = 9; - break; - case CONTEST_CATEGORY_CUTE: - var = 10; - break; - case CONTEST_CATEGORY_SMART: - var = 11; - break; - case CONTEST_CATEGORY_TOUGH: - default: - var = 12; - break; - } - - returnVar = gSaveBlock1.contestWinners[var].species; - - if(returnVar == 0) - gSpecialVar_0x8004 = returnVar; - else - gSpecialVar_0x8004 = 1; -} - -void sub_80C4CEC(void) -{ - Contest_SaveWinner(0xFF); -} - -void sub_80C4CF8(void) -{ - if(!gContestFinalStandings[gContestPlayerMonIndex] - && gSpecialVar_ContestRank == 3 - && gUnknown_02038678[gContestPlayerMonIndex] >= 800) - { - gSpecialVar_0x8004 = 1; - } - else - { - gSpecialVar_0x8004 = 0; - } -} - -u8 sub_80C4D50(void) -{ - u8 retVar = 0; - int i; - - for (i = 0; i < 5; i++) - if (gSaveBlock1.museumPortraits[i].species != 0) - retVar++; - - return retVar; -} - -void sub_80C4D80(void) -{ - s16 sp0[4]; - s32 i; - s32 j; - s16 r4; - u8 r2; - u8 r7; - s8 r10; - u8 r4_; - - for (i = 0; i < 4; i++) - sp0[i] = gContestMonConditions[i]; - - for (i = 0; i < 3; i++) - { - for (j = 3; j > i; j--) - { - if (sp0[j - 1] < sp0[j]) - { - s32 temp = sp0[j]; - - sp0[j] = sp0[j - 1]; - sp0[j - 1] = temp; - } - } - } - - r4 = sp0[gSpecialVar_0x8006]; - r10 = 0; - r7 = 0; - - for (i = 0; i < 4; i++) - { - if (sp0[i] == r4) - { - r10++; - if (i == gSpecialVar_0x8006) - r7 = r10; - } - } - - for (i = 0; i < 4; i++) - { - if (sp0[i] == r4) - break; - } - - r4_ = i; - r2 = r7; - - for (i = 0; i < 4; i++) - { - if (r4 == gContestMonConditions[i]) - { - if (r2 == 1) - break; - r2--; - } - } - - Contest_CopyAndConvertNicknameI_Intl(gStringVar1, i); - - if (gIsLinkContest & 1) - Contest_CopyAndConvertTrainerName_Intl(gStringVar2, gLinkPlayers[i].name); - else - Contest_CopyAndConvertTrainerName_Intl(gStringVar2, gContestMons[i].trainerName); - - if (r10 == 1 || r7 == r10) - gSpecialVar_0x8006 = r4_; - else - gSpecialVar_0x8006 = r4_ + 4; -} - -void ShowContestWinnerCleanup(void) -{ - SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); -} - -void ShowContestWinner(void) -{ - if(gUnknown_0203856C) - { - sub_80AAF30(); - eCurContestWinnerIsForArtist = TRUE; - eCurContestWinnerSaveIdx = sub_80B2C4C(254, 0); - Contest_SaveWinner(3); - gUnknown_0203856C = 0; - } - SetMainCallback2(CB2_ContestPainting); - gMain.savedCallback = ShowContestWinnerCleanup; -} - -void ScrSpecial_SetLinkContestTrainerGfxIdx(void) -{ - VarSet(VAR_OBJ_GFX_ID_0, gContestMons[0].trainerGfxId); - VarSet(VAR_OBJ_GFX_ID_1, gContestMons[1].trainerGfxId); - VarSet(VAR_OBJ_GFX_ID_2, gContestMons[2].trainerGfxId); - VarSet(VAR_OBJ_GFX_ID_3, gContestMons[3].trainerGfxId); -} - -bool8 GiveMonArtistRibbon(void) -{ - u8 ribbon = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_ARTIST_RIBBON); - - if(ribbon == FALSE - && gContestFinalStandings[gContestPlayerMonIndex] == 0 - && gSpecialVar_ContestRank == 3 - && gUnknown_02038678[gContestPlayerMonIndex] >= 800) - { - ribbon = TRUE; - SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_ARTIST_RIBBON, &ribbon); - return TRUE; - } - else - { - return FALSE; - } -} - -u8 sub_80C5044(void) -{ - return gUnknown_0203856C; -} - -void ShowContestEntryMonPic(void) -{ - const struct CompressedSpritePalette *palette; - u32 var1, var2; - u16 species; - u8 spriteId; - u8 taskId; - - if(FindTaskIdByFunc(sub_80C5190) == 0xFF) - { - u8 left = CONTEST_ENTRY_PIC_LEFT; - u8 top = CONTEST_ENTRY_PIC_TOP; - - Menu_DrawStdWindowFrame(left, top, 19, 13); - species = gContestMons[gSpecialVar_0x8006].species; - var1 = gContestMons[gSpecialVar_0x8006].personality; - var2 = gContestMons[gSpecialVar_0x8006].otId; - taskId = CreateTask(sub_80C5190, 0x50); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = species; - HandleLoadSpecialPokePic( - &gMonFrontPicTable[species], - gMonFrontPicCoords[species].coords, - gMonFrontPicCoords[species].y_offset, - (u32)gMonSpriteGfx_Sprite_ptr[0], - gMonSpriteGfx_Sprite_ptr[1], - species, - var1); - palette = GetMonSpritePalStructFromOtIdPersonality(species, var2, var1); - LoadCompressedObjectPalette(palette); - GetMonSpriteTemplate_803C56C(species, 1); - gUnknown_02024E8C.paletteTag = palette->tag; - spriteId = CreateSprite(&gUnknown_02024E8C, 0x78, 0x40, 0); - gTasks[taskId].data[2] = spriteId; - gTasks[taskId].data[3] = left; - gTasks[taskId].data[4] = top; - gSprites[spriteId].callback = SpriteCallbackDummy; - gSprites[spriteId].oam.priority = 0; - } -} - -void sub_80C5164(void) -{ - u8 taskId = FindTaskIdByFunc(sub_80C5190); - - if(taskId != 0xFF) - gTasks[taskId].data[0]++; -} - -void sub_80C5190(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - struct Sprite *sprite; - - switch(task->data[0]) - { - case 2: - sprite = &gSprites[task->data[2]]; - FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); - - if(sprite->oam.affineMode) - FreeOamMatrix(sprite->oam.matrixNum); - - DestroySprite(sprite); - task->data[0]++; - break; - case 0: - task->data[0]++; - break; - case 3: - Menu_EraseWindowRect(task->data[3], task->data[4], task->data[3] + 9, task->data[4] + 10); - DestroyTask(taskId); - break; - case 1: - default: - break; - } -} - -void ScriptGetMultiplayerId(void) -{ - if(gIsLinkContest & 1) - gSpecialVar_Result = GetMultiplayerId(); - else - gSpecialVar_Result = 4; -} - -void ScriptRandom(void) -{ - u16 random; - u16 *scriptPtr; - - if(gIsLinkContest & 1) - { - gContestRngValue = 1103515245 * gContestRngValue + 24691; - random = gContestRngValue >> 16; - scriptPtr = &gSpecialVar_Result; - } - else - { - scriptPtr = &gSpecialVar_Result; - random = Random(); - } - *scriptPtr = random % *scriptPtr; -} - -void ScrSpecial_HealPlayerParty(void) -{ - u8 i, j; - u8 ppBonuses; - u8 arg[4]; - - // restore HP. - for(i = 0; i < gPlayerPartyCount; i++) - { - u16 maxHP = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP); - arg[0] = maxHP; - arg[1] = maxHP >> 8; - SetMonData(&gPlayerParty[i], MON_DATA_HP, arg); - ppBonuses = GetMonData(&gPlayerParty[i], MON_DATA_PP_BONUSES); - - // restore PP. - for(j = 0; j < 4; j++) - { - arg[0] = CalculatePPWithBonus(GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + j), ppBonuses, j); - SetMonData(&gPlayerParty[i], MON_DATA_PP1 + j, arg); - } - - // since status is u32, the four 0 assignments here are probably for safety to prevent undefined data from reaching SetMonData. - arg[0] = 0; - arg[1] = 0; - arg[2] = 0; - arg[3] = 0; - SetMonData(&gPlayerParty[i], MON_DATA_STATUS, arg); - } -} - -u8 ScriptGiveMon(u16 species, u8 level, u16 item, u32 unused1, u32 unused2, u8 unused3) -{ - u16 nationalDexNum; - int sentToPc; - u8 heldItem[2]; - struct Pokemon mon; - - CreateMon(&mon, species, level, 32, 0, 0, 0, 0); - heldItem[0] = item; - heldItem[1] = item >> 8; - SetMonData(&mon, MON_DATA_HELD_ITEM, heldItem); - sentToPc = GiveMonToPlayer(&mon); - nationalDexNum = SpeciesToNationalPokedexNum(species); - - switch(sentToPc) - { - case 0: - case 1: - GetSetPokedexFlag(nationalDexNum, 2); - GetSetPokedexFlag(nationalDexNum, 3); - break; - } - return sentToPc; -} - -u8 ScriptGiveEgg(u16 species) -{ - struct Pokemon mon; - u8 isEgg; - - CreateEgg(&mon, species, TRUE); - isEgg = TRUE; - SetMonData(&mon, MON_DATA_IS_EGG, &isEgg); - - return GiveMonToPlayer(&mon); -} - -void HasEnoughMonsForDoubleBattle(void) -{ - switch (GetMonsStateToDoubles()) - { - case PLAYER_HAS_TWO_USABLE_MONS: - gSpecialVar_Result = PLAYER_HAS_TWO_USABLE_MONS; - break; - case PLAYER_HAS_ONE_MON: - gSpecialVar_Result = PLAYER_HAS_ONE_MON; - break; - case PLAYER_HAS_ONE_USABLE_MON: - gSpecialVar_Result = PLAYER_HAS_ONE_USABLE_MON; - break; - } -} - -bool8 CheckPartyMonHasHeldItem(u16 item) -{ - int i; - - for(i = 0; i < 6; i++) - { - u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); - if(species != SPECIES_NONE && species != SPECIES_EGG && GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM) == item) - return TRUE; - } - return FALSE; -} - -bool8 GetNameOfEnigmaBerryInPlayerParty(void) -{ - bool8 hasItem = CheckPartyMonHasHeldItem(ITEM_ENIGMA_BERRY); - - if(hasItem == TRUE) - GetBerryNameByBerryType(ItemIdToBerryType(ITEM_ENIGMA_BERRY), gStringVar1); - - return hasItem; -} - -void CreateScriptedWildMon(u16 species, u8 level, u16 item) -{ - u8 heldItem[2]; - - ZeroEnemyPartyMons(); - CreateMon(&gEnemyParty[0], species, level, 0x20, 0, 0, 0, 0); - - if(item) - { - heldItem[0] = item; - heldItem[1] = item >> 8; - SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem); - } -} - -void ScriptSetMonMoveSlot(u8 monIndex, u16 move, u8 slot) -{ - if(monIndex > 6) - monIndex = gPlayerPartyCount - 1; - - SetMonMoveSlot(&gPlayerParty[monIndex], move, slot); -} - -void sub_80C5568(void) -{ - gMain.savedCallback = sub_80C5580; - sub_8121E10(); -} - -void sub_80C5580(void) -{ - u8 var = gSelectedOrderFromParty[0]; - - switch(var) - { - case 0: - gSpecialVar_Result = 0; - break; - default: - gSpecialVar_Result = 1; - break; - } - - SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); -} - -void ChooseBattleTowerPlayerParty(void) -{ - gMain.savedCallback = SetBattleTowerPlayerParty; - sub_8121E34(); -} - -void SetBattleTowerPlayerParty(void) -{ - u8 var = gSelectedOrderFromParty[0]; - - switch(var) - { - case 0: // player quit battle tower? - LoadPlayerParty(); - gSpecialVar_Result = 0; - break; - default: // load battle tower. - ReducePlayerPartyToThree(); - gSpecialVar_Result = 1; - break; - } - - SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); -} - -void ReducePlayerPartyToThree(void) -{ - struct Pokemon party[3]; - int i; - - CpuFill32(0, party, sizeof party); - - // copy the selected pokemon according to the order. - for(i = 0; i < 3; i++) - if(gSelectedOrderFromParty[i]) // as long as the order keeps going (did the player select 1 mon? 2? 3?), do not stop - party[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1]; // index is 0 based, not literal - - // delete the last 3 pokemon - CpuFill32(0, gPlayerParty, sizeof gPlayerParty); - - // overwrite the first 3 with the order copied to. - for(i = 0; i < 3; i++) - gPlayerParty[i] = party[i]; - - CalculatePlayerPartyCount(); -} diff --git a/src/trade.c b/src/trade.c index 06a65e33a..a28efd39d 100644 --- a/src/trade.c +++ b/src/trade.c @@ -1406,7 +1406,7 @@ static void sub_80489F4(void) { gUnknown_020297D8[0] = gUnknown_03004824->tradeMenuCursorPosition; gUnknown_020297D8[1] = gUnknown_03004824->unk_008a; - sub_800832C(); + SetCloseLinkCallback(); gUnknown_03004824->unk_007b = 13; } } @@ -2158,7 +2158,7 @@ static void sub_8049D9C(void) { if (!gPaletteFade.active) { - sub_800832C(); + SetCloseLinkCallback(); gUnknown_03004824->unk_007b = 12; } } @@ -5168,7 +5168,7 @@ static void sub_804DC88(void) case 8: if (IsBGMStopped() == TRUE) { - sub_800832C(); + SetCloseLinkCallback(); gMain.state ++; } break; diff --git a/src/trainer_card.c b/src/trainer_card.c index 3e653a5d9..18f3db9bb 100644 --- a/src/trainer_card.c +++ b/src/trainer_card.c @@ -1,7 +1,10 @@ #include "global.h" #include "trainer_card.h" +#include "constants/songs.h" +#include "contest_util.h" #include "easy_chat.h" #include "event_data.h" +#include "ewram.h" #include "field_effect.h" #include "graphics.h" #include "link.h" @@ -9,19 +12,16 @@ #include "main.h" #include "menu.h" #include "money.h" +#include "overworld.h" #include "palette.h" #include "pokedex.h" -#include "overworld.h" -#include "script_pokemon_80C4.h" -#include "constants/songs.h" +#include "scanline_effect.h" #include "sound.h" #include "sprite.h" #include "string_util.h" #include "strings2.h" #include "task.h" -#include "scanline_effect.h" #include "util.h" -#include "ewram.h" typedef void (*Callback)(void); @@ -417,7 +417,7 @@ void TrainerCard_GenerateCardForPlayer(struct TrainerCard *trainerCard) } r4 = FALSE; - if (sub_80C4D50() > 4) + if (CountPlayerMuseumPaintings() > 4) { r4 = TRUE; } -- cgit v1.2.3