diff options
author | Diegoisawesome <Diegoisawesome@users.noreply.github.com> | 2018-10-13 12:53:09 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-13 12:53:09 -0500 |
commit | 0c1d33da4f6db7b90913586a39ed60ea2b13f39e (patch) | |
tree | 79eb899d0c0e3281a11f1d447879090dc208ef80 /src | |
parent | a2a6700966cc802185577e44ba88a9154429c93b (diff) | |
parent | a26380663c5acc636fb8c163c014187129afae8f (diff) |
Merge pull request #353 from Diegoisawesome/master
Port/decompile cable_club.s
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_controllers.c | 2 | ||||
-rw-r--r-- | src/battle_dome.c | 4 | ||||
-rw-r--r-- | src/cable_club.c | 1299 | ||||
-rwxr-xr-x | src/field_message_box.c | 2 | ||||
-rw-r--r-- | src/mystery_event_menu.c | 2 | ||||
-rw-r--r-- | src/rom_8011DC0.c | 4 | ||||
-rw-r--r-- | src/start_menu.c | 4 |
7 files changed, 1308 insertions, 9 deletions
diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 63154ae8b..56ff34528 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -1,6 +1,7 @@ #include "global.h" #include "battle.h" #include "battle_controllers.h" +#include "cable_club.h" #include "link.h" #include "task.h" #include "battle_ai_script_commands.h" @@ -18,7 +19,6 @@ extern u8 gUnknown_02022D0A; static EWRAM_DATA u8 sBattleBuffersTransferData[0x100] = {}; -extern void task00_08081A90(u8 taskId); // cable_club extern void sub_81B8D64(u8 battlerId, u8 arg1); // party_menu // this file's funcionts diff --git a/src/battle_dome.c b/src/battle_dome.c index 82384b43a..8de1c058c 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -68,7 +68,7 @@ extern bool8 sub_81A3610(void); extern u16 sub_81A4FF0(u8); extern u8 GetFrontierTrainerFrontSpriteId(u16); extern u8 GetFrontierOpponentClass(u16); -extern void sub_80F94E8(void); +extern void ReducePlayerPartyToThree(void); extern u8 gUnknown_0203CEF8[]; extern u16 gBattle_BG0_X; @@ -6132,7 +6132,7 @@ static void sub_8194E44(void) static void sub_8194EB4(void) { - sub_80F94E8(); + ReducePlayerPartyToThree(); } static void sub_8194EC0(void) diff --git a/src/cable_club.c b/src/cable_club.c new file mode 100644 index 000000000..c54df5f24 --- /dev/null +++ b/src/cable_club.c @@ -0,0 +1,1299 @@ +#include "global.h" +#include "main.h" +#include "battle.h" +#include "battle_records.h" +#include "battle_setup.h" +#include "cable_club.h" +#include "data2.h" +#include "event_data.h" +#include "field_message_box.h" +#include "field_specials.h" +#include "field_weather.h" +#include "international_string_util.h" +#include "link.h" +#include "link_rfu.h" +#include "load_save.h" +#include "m4a.h" +#include "menu.h" +#include "overworld.h" +#include "palette.h" +#include "rom_8011DC0.h" +#include "script.h" +#include "script_pokemon_util_80F87D8.h" +#include "sound.h" +#include "start_menu.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "trade.h" +#include "trainer_card.h" +#include "window.h" +#include "constants/songs.h" + +extern u8 gUnknown_02032298[2]; +extern u8 gUnknown_0203CEF8[]; + +static const struct WindowTemplate gUnknown_08550594 = { + .priority = 0, + .tilemapLeft = 16, + .tilemapTop = 11, + .width = 11, + .height = 2, + .paletteNum = 15, + .baseBlock = 0x0125, +}; +static const u8 *const gTrainerCardColorNames[] = { + gText_BronzeCard, + gText_CopperCard, + gText_SilverCard, + gText_GoldCard +}; + +static void sub_80B2634(u8 taskId); +static void sub_80B2688(u8 taskId); +static void sub_80B270C(u8 taskId); +static void sub_80B275C(u8 taskId); +static void sub_80B2804(u8 taskId); +static void sub_80B28A8(u8 taskId); +static void sub_80B2918(u8 taskId); +static void sub_80B2A08(u8 taskId); +static void sub_80B2C30(u8 taskId); +static void sub_80B2CB0(u8 taskId); +static void sub_80B2CEC(u8 taskId); +static void sub_80B2D2C(u8 taskId); +static bool8 sub_80B2D6C(u8 taskId); +static void sub_80B2EE4(u8 taskId); +static void sub_80B3144(u8 taskId); +static void sub_80B3194(u8 taskId); +static void sub_80B31E8(u8 taskId); +static void sub_80B3220(u8 taskId); + +static void sub_80B236C(u8 arg0, u8 arg1) +{ + if (FindTaskIdByFunc(sub_80B2634) == 0xFF) + { + u8 taskId1; + + taskId1 = CreateTask(sub_80B2634, 80); + gTasks[taskId1].data[1] = arg0; + gTasks[taskId1].data[2] = arg1; + } +} + +static void sub_80B23B0(u16 windowId, u32 value) +{ + u8 xPos; + + ConvertIntToDecimalStringN(gStringVar1, value, STR_CONV_MODE_LEFT_ALIGN, 1); + SetStandardWindowBorderStyle(windowId, 0); + StringExpandPlaceholders(gStringVar4, gText_XPLink); + xPos = GetStringCenterAlignXOffset(1, gStringVar4, 88); + AddTextPrinterParameterized(windowId, 1, gStringVar4, xPos, 1, 0xFF, NULL); + CopyWindowToVram(windowId, 3); +} + +static void sub_80B241C(u16 windowId) +{ + sub_819746C(windowId, FALSE); + CopyWindowToVram(windowId, 3); +} + +static void sub_80B243C(u8 taskId, u8 arg1) +{ + s16 *data = gTasks[taskId].data; + + if (arg1 != data[3]) + { + if (arg1 <= 1) + sub_80B241C(data[5]); + else + sub_80B23B0(data[5], arg1); + data[3] = arg1; + } +} + +static u32 sub_80B2478(u8 lower, u8 upper) +{ + int playerCount; + + switch (GetLinkPlayerDataExchangeStatusTimed(lower, upper)) + { + case EXCHANGE_COMPLETE: + return 1; + case EXCHANGE_IN_PROGRESS: + return 3; + case EXCHANGE_STAT_4: + return 7; + case EXCHANGE_STAT_5: + return 9; + case EXCHANGE_STAT_6: + ConvertIntToDecimalStringN(gStringVar1, GetLinkPlayerCount_2(), STR_CONV_MODE_LEFT_ALIGN, 1); + return 4; + case EXCHANGE_STAT_7: + return 10; + case EXCHANGE_TIMED_OUT: + default: + return 0; + } +} + +static bool32 sub_80B24F8(u8 taskId) +{ + if (HasLinkErrorOccurred() == TRUE) + { + gTasks[taskId].func = sub_80B2D2C; + return TRUE; + } + return FALSE; +} + +static bool32 sub_80B252C(u8 taskId) +{ + if ((gMain.newKeys & B_BUTTON) + && IsLinkConnectionEstablished() == FALSE) + { + gLinkType = 0; + gTasks[taskId].func = sub_80B2CEC; + return TRUE; + } + return FALSE; +} + +static bool32 sub_80B2578(u8 taskId) +{ + if (IsLinkConnectionEstablished()) + SetSuppressLinkErrorMessage(TRUE); + + if (gMain.newKeys & B_BUTTON) + { + gLinkType = 0; + gTasks[taskId].func = sub_80B2CEC; + return TRUE; + } + return FALSE; +} + +static bool32 sub_80B25CC(u8 taskId) +{ + if (GetSioMultiSI() == 1) + { + gTasks[taskId].func = sub_80B2D2C; + return TRUE; + } + return FALSE; +} + +static void sub_80B2600(u8 taskId) +{ + gTasks[taskId].data[0]++; + if (gTasks[taskId].data[0] == 10) + { + sub_800A4D8(2); + DestroyTask(taskId); + } +} + +static void sub_80B2634(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + if (data[0] == 0) + { + OpenLinkTimed(); + sub_800AB98(); + ResetLinkPlayers(); + data[5] = AddWindow(&gUnknown_08550594); + } + else if (data[0] > 9) + { + gTasks[taskId].func = sub_80B2688; + } + data[0]++; +} + +static void sub_80B2688(u8 taskId) +{ + u32 playerCount = GetLinkPlayerCount_2(); + + if (sub_80B252C(taskId) == TRUE + || sub_80B2578(taskId) == TRUE + || playerCount < 2) + return; + + SetSuppressLinkErrorMessage(TRUE); + gTasks[taskId].data[3] = 0; + if (IsLinkMaster() == TRUE) + { + PlaySE(SE_PIN); + ShowFieldAutoScrollMessage(gText_ConfirmLinkWhenPlayersReady); + gTasks[taskId].func = sub_80B270C; + } + else + { + PlaySE(SE_BOO); + ShowFieldAutoScrollMessage(gText_AwaitingLinkup); + gTasks[taskId].func = sub_80B2918; + } +} + +static void sub_80B270C(u8 taskId) +{ + if (sub_80B252C(taskId) == TRUE + || sub_80B25CC(taskId) == TRUE + || sub_80B24F8(taskId) == TRUE) + return; + + if (GetFieldMessageBoxMode() == FIELD_MESSAGE_BOX_HIDDEN) + { + gTasks[taskId].data[3] = 0; + gTasks[taskId].func = sub_80B275C; + } +} + +static void sub_80B275C(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + s32 linkPlayerCount = GetLinkPlayerCount_2(); + + if (sub_80B252C(taskId) == TRUE + || sub_80B25CC(taskId) == TRUE + || sub_80B24F8(taskId) == TRUE) + return; + + sub_80B243C(taskId, linkPlayerCount); + + if (!(gMain.newKeys & A_BUTTON)) + return; + + if (linkPlayerCount < data[1]) + return; + + sub_800AA04(linkPlayerCount); + sub_80B241C(data[5]); + ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1); + ShowFieldAutoScrollMessage(gText_ConfirmStartLinkWithXPlayers); + gTasks[taskId].func = sub_80B2804; +} + +static void sub_80B2804(u8 taskId) +{ + if (sub_80B252C(taskId) == TRUE + || sub_80B25CC(taskId) == TRUE + || sub_80B24F8(taskId) == TRUE) + return; + + if (GetFieldMessageBoxMode() == FIELD_MESSAGE_BOX_HIDDEN) + { + if (sub_800AA48() != GetLinkPlayerCount_2()) + { + ShowFieldAutoScrollMessage(gText_ConfirmLinkWhenPlayersReady); + gTasks[taskId].func = sub_80B270C; + } + else if (gMain.heldKeys & B_BUTTON) + { + ShowFieldAutoScrollMessage(gText_ConfirmLinkWhenPlayersReady); + gTasks[taskId].func = sub_80B270C; + } + else if (gMain.heldKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sub_800A620(); + gTasks[taskId].func = sub_80B28A8; + } + } +} + +static void sub_80B28A8(u8 taskId) +{ + u8 local1 = gTasks[taskId].data[1]; + u8 local2 = gTasks[taskId].data[2]; + + if (sub_80B24F8(taskId) == TRUE + || sub_80B2D6C(taskId) == TRUE) + return; + + if (GetLinkPlayerCount_2() != sub_800AA48()) + { + gTasks[taskId].func = sub_80B2D2C; + } + else + { + gSpecialVar_Result = sub_80B2478(local1, local2); + if (gSpecialVar_Result != 0) + gTasks[taskId].func = sub_80B2A08; + } +} + +static void sub_80B2918(u8 taskId) +{ + u8 local1, local2; + struct TrainerCard *card; + + local1 = gTasks[taskId].data[1]; + local2 = gTasks[taskId].data[2]; + + if (sub_80B252C(taskId) == TRUE + || sub_80B24F8(taskId) == TRUE) + return; + + gSpecialVar_Result = sub_80B2478(local1, local2); + if (gSpecialVar_Result == 0) + return; + if (gSpecialVar_Result == 3 || gSpecialVar_Result == 4) + { + sub_800AC34(); + HideFieldMessageBox(); + gTasks[taskId].func = sub_80B2CB0; + } + else if (gSpecialVar_Result == 7 || gSpecialVar_Result == 9) + { + CloseLink(); + HideFieldMessageBox(); + gTasks[taskId].func = sub_80B2CB0; + } + else + { + gFieldLinkPlayerCount = GetLinkPlayerCount_2(); + gUnknown_03005DB4 = GetMultiplayerId(); + sub_800AA04(gFieldLinkPlayerCount); + card = (struct TrainerCard *)gBlockSendBuffer; + TrainerCard_GenerateCardForPlayer(card); + card->monSpecies[0] = GetMonData(&gPlayerParty[gUnknown_0203CEF8[0] - 1], MON_DATA_SPECIES, NULL); + card->monSpecies[1] = GetMonData(&gPlayerParty[gUnknown_0203CEF8[1] - 1], MON_DATA_SPECIES, NULL); + gTasks[taskId].func = sub_80B2C30; + } +} + +static void sub_80B2A08(u8 taskId) +{ + struct TrainerCard *card; + + if (sub_80B24F8(taskId) == TRUE) + return; + + if (gSpecialVar_Result == 4) + { + if (!Link_AnyPartnersPlayingRubyOrSapphire()) + { + sub_800AC34(); + HideFieldMessageBox(); + gTasks[taskId].func = sub_80B2CB0; + } + else + { + CloseLink(); + HideFieldMessageBox(); + gTasks[taskId].func = sub_80B2CB0; + } + } + else if (gSpecialVar_Result == 3) + { + sub_800AC34(); + HideFieldMessageBox(); + gTasks[taskId].func = sub_80B2CB0; + } + else if (gSpecialVar_Result == 7 || gSpecialVar_Result == 9) + { + CloseLink(); + HideFieldMessageBox(); + gTasks[taskId].func = sub_80B2CB0; + } + else + { + gFieldLinkPlayerCount = GetLinkPlayerCount_2(); + gUnknown_03005DB4 = GetMultiplayerId(); + sub_800AA04(gFieldLinkPlayerCount); + card = (struct TrainerCard *)gBlockSendBuffer; + TrainerCard_GenerateCardForPlayer(card); + card->monSpecies[0] = GetMonData(&gPlayerParty[gUnknown_0203CEF8[0] - 1], MON_DATA_SPECIES, NULL); + card->monSpecies[1] = GetMonData(&gPlayerParty[gUnknown_0203CEF8[1] - 1], MON_DATA_SPECIES, NULL); + gTasks[taskId].func = sub_80B2C30; + sub_800A4D8(2); + } +} + +bool32 sub_80B2AF4(u16 *arg0, u16 *arg1) +{ + int i; + int j; + bool32 result = FALSE; + int k = 0; + + gStringVar1[0] = EOS; + gStringVar2[0] = EOS; + + for (i = 0; i < 2; i++) + { + for (j = 0; j < 2; j++) + { + if (arg0[i] == arg1[j]) + { + if (k == 0) + { + StringCopy(gStringVar1, gSpeciesNames[arg0[i]]); + result = TRUE; + } + + if (k == 1) + { + StringCopy(gStringVar2, gSpeciesNames[arg0[i]]); + result = TRUE; + } + + k++; + } + } + } + + gSpecialVar_0x8005 = k; + + return result; +} + +static void task_map_chg_seq_0807EC34(u16 *a0, u32 taskId) +{ + struct TrainerCard *trainerCards = gTrainerCards; + + if (*a0 == 1) + { + if (gLinkType == 0x2266 || gLinkType == 0x2277) + { + if (sub_80B2AF4(trainerCards[0].monSpecies, trainerCards[1].monSpecies)) + { + *a0 = 11; + sub_800AC34(); + gTasks[taskId].func = sub_80B2CB0; + } + else + { + sub_80B241C(gTasks[taskId].data[5]); + EnableBothScriptContexts(); + DestroyTask(taskId); + } + } + else + { + sub_80B241C(gTasks[taskId].data[5]); + EnableBothScriptContexts(); + DestroyTask(taskId); + } + } + else + { + sub_800AC34(); + gTasks[taskId].func = sub_80B2CB0; + } +} + +static void sub_80B2C30(u8 taskId) +{ + u8 index; + struct TrainerCard *trainerCards; + + if (sub_80B24F8(taskId) == TRUE) + return; + + if (GetBlockReceivedStatus() != sub_800A9A8()) + return; + + for (index = 0; index < GetLinkPlayerCount(); index++) + { + sub_80C3120(&gTrainerCards[index], gBlockRecvBuffer[index], gLinkPlayers[index].version); + } + + SetSuppressLinkErrorMessage(FALSE); + ResetBlockReceivedFlags(); + task_map_chg_seq_0807EC34(&gSpecialVar_Result, taskId); +} + +static void sub_80B2CB0(u8 taskId) +{ + if (gReceivedRemoteLinkPlayers == FALSE) + { + sub_80B241C(gTasks[taskId].data[5]); + EnableBothScriptContexts(); + RemoveWindow(gTasks[taskId].data[5]); + DestroyTask(taskId); + } +} + +static void sub_80B2CEC(u8 taskId) +{ + gSpecialVar_Result = 5; + sub_80B241C(gTasks[taskId].data[5]); + sub_8098374(); + RemoveWindow(gTasks[taskId].data[5]); + EnableBothScriptContexts(); + DestroyTask(taskId); +} + +static void sub_80B2D2C(u8 taskId) +{ + gSpecialVar_Result = 6; + sub_80B241C(gTasks[taskId].data[5]); + RemoveWindow(gTasks[taskId].data[5]); + HideFieldMessageBox(); + EnableBothScriptContexts(); + DestroyTask(taskId); +} + +static bool8 sub_80B2D6C(u8 taskId) +{ + gTasks[taskId].data[4]++; + if (gTasks[taskId].data[4] > 600) + { + gTasks[taskId].func = sub_80B2D2C; + return TRUE; + } + + return FALSE; +} + +void sub_80B2DA4(u8 arg0) +{ + u8 r3 = 2; + u8 r2 = 2; + + switch (gSpecialVar_0x8004) + { + case 1: + r3 = 2; + gLinkType = 0x2233; + break; + case 2: + r3 = 2; + gLinkType = 0x2244; + break; + case 5: + r3 = 4; + r2 = 4; + gLinkType = 0x2255; + break; + case 9: + r3 = 2; + if (gSaveBlock2Ptr->frontier.lvlMode == 0) + { + gLinkType = 0x2266; + } + else + { + gLinkType = 0x2277; + } + break; + } + + sub_80B236C(r3, r2); +} + +void sub_80B2E4C(void) +{ + gLinkType = 0x1133; + gBattleTypeFlags = 0; + sub_80B236C(2, 2); +} + +void sub_80B2E74(void) +{ + gSpecialVar_Result = 0; + gLinkType = 0x3311; + gBattleTypeFlags = 0; + sub_80B236C(2, 4); +} + +void sub_80B2EA8(void) +{ + u32 taskId = FindTaskIdByFunc(sub_80B2EE4); + + if (taskId == 0xFF) + { + taskId = CreateTask(sub_80B2EE4, 80); + gTasks[taskId].data[0] = 0; + } +} + +static void sub_80B2EE4(u8 taskId) +{ + int playerCount; + int i; + + switch (gTasks[taskId].data[0]) + { + case 0: + if (gSpecialVar_Result == 1) + { + bool32 unk = FALSE; + bool32 isEnglishRSLinked = FALSE; + bool32 isJapaneseEmeraldLinked = FALSE; + + playerCount = GetLinkPlayerCount(); + for (i = 0; i < playerCount; i++) + { + u32 version = (u8)gLinkPlayers[i].version; + u32 language = gLinkPlayers[i].language; + + if (version == VERSION_RUBY || version == VERSION_SAPPHIRE) + { + if (language == LANGUAGE_JAPANESE) + { + unk = TRUE; + break; + } + else + { + isEnglishRSLinked = TRUE; + } + } + else if (version == VERSION_EMERALD) + { + if (language == LANGUAGE_JAPANESE) + { + isJapaneseEmeraldLinked = TRUE; + } + } + } + + if (isEnglishRSLinked && isJapaneseEmeraldLinked) + { + unk = TRUE; + } + + if (unk) + { + gSpecialVar_Result = 12; + sub_800AD10(); + gTasks[taskId].data[0] = 1; + return; + } + } + EnableBothScriptContexts(); + DestroyTask(taskId); + break; + case 1: + if (gReceivedRemoteLinkPlayers == FALSE) + { + EnableBothScriptContexts(); + DestroyTask(taskId); + } + break; + } +} + +void sub_80B2FD8(void) +{ + gLinkType = 0x4411; + gBattleTypeFlags = 0; + sub_80B236C(2, 4); +} + +void sub_80B3000(void) +{ + gLinkType = 0x6601; + gBattleTypeFlags = 0; + sub_80B236C(4, 4); +} + +void sub_80B3028(void) +{ + gLinkType = 0x6602; + gBattleTypeFlags = 0; + sub_80B236C(2, 4); +} + +u8 sub_80B3050(void) +{ + if (FuncIsActiveTask(sub_80B3144) != FALSE) + return 0xFF; + + switch (gSpecialVar_0x8004) + { + case 1: + gLinkType = 0x2233; + break; + case 2: + gLinkType = 0x2244; + break; + case 5: + gLinkType = 0x2255; + break; + case 9: + if (gSaveBlock2Ptr->frontier.lvlMode == 0) + { + gLinkType = 0x2266; + } + else + { + gLinkType = 0x2277; + } + break; + case 3: + gLinkType = 0x1111; + break; + case 4: + gLinkType = 0x3322; + break; + } + + return CreateTask(sub_80B3144, 80); +} + +static void sub_80B3144(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + if (data[0] == 0) + { + OpenLink(); + ResetLinkPlayers(); + CreateTask(task00_08081A90, 80); + } + else if (data[0] >= 10) + { + gTasks[taskId].func = sub_80B3194; + } + data[0]++; +} + +static void sub_80B3194(u8 taskId) +{ + if (GetLinkPlayerCount_2() >= 2) + { + if (IsLinkMaster() == TRUE) + gTasks[taskId].func = sub_80B31E8; + else + gTasks[taskId].func = sub_80B3220; + } +} + +static void sub_80B31E8(u8 taskId) +{ + if (sub_800AA48() == GetLinkPlayerCount_2()) + { + sub_800A620(); + gTasks[taskId].func = sub_80B3220; + } +} + +static void sub_80B3220(u8 taskId) +{ + if (gReceivedRemoteLinkPlayers == TRUE + && IsLinkPlayerDataExchangeComplete() == TRUE) + { + sub_800AB18(); + sub_8009F18(); + DestroyTask(taskId); + } +} + +void sub_80B3254(void) +{ + SaveGame(); +} + +static void sub_80B3260(int a0) +{ + switch (a0) + { + case 1: + gBattleTypeFlags = BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER; + break; + case 2: + gBattleTypeFlags = BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER; + break; + case 5: + ReducePlayerPartyToThree(); + gBattleTypeFlags = BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER | BATTLE_TYPE_MULTI; + break; + case 9: + gBattleTypeFlags = BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER | BATTLE_TYPE_MULTI; + break; + } +} + +static void sub_80B32B4(u8 taskId) +{ + struct Task* task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + FadeScreen(1, 0); + gLinkType = 0x2211; + ClearLinkCallback_2(); + task->data[0]++; + break; + case 1: + if (!gPaletteFade.active) + task->data[0]++; + break; + case 2: + task->data[1]++; + if (task->data[1] > 20) + task->data[0]++; + break; + case 3: + sub_800AC34(); + task->data[0]++; + break; + case 4: + if (!gReceivedRemoteLinkPlayers) + task->data[0]++; + break; + case 5: + if (gLinkPlayers[0].trainerId & 1) + PlayMapChosenOrBattleBGM(MUS_BATTLE32); + else + PlayMapChosenOrBattleBGM(MUS_BATTLE20); + + sub_80B3260(gSpecialVar_0x8004); + overworld_free_bg_tilemaps(); + gTrainerBattleOpponent_A = 0x800; + SetMainCallback2(CB2_InitBattle); + gMain.savedCallback = sub_80B360C; + DestroyTask(taskId); + break; + } +} + +static void sub_80B33BC(u8 taskId) +{ + int i; + s16* data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + FadeScreen(1, 0); + gLinkType = 0x2211; + ClearLinkCallback_2(); + data[0] = 1; + break; + case 1: + if (!gPaletteFade.active) + data[0] = 2; + break; + case 2: + SendBlock(0, &gLocalLinkPlayer, sizeof(gLocalLinkPlayer)); + data[0] = 3; + break; + case 3: + if (GetBlockReceivedStatus() == sub_800A9D8()) + { + for (i = 0; i < GetLinkPlayerCount(); i++) + { + struct LinkPlayer *player = (struct LinkPlayer *)gBlockRecvBuffer[i]; + gLinkPlayers[i] = *player; + sub_800B524(&gLinkPlayers[i]); + ResetBlockReceivedFlag(i); + } + data[0] = 4; + } + break; + case 4: + data[1]++; + if (data[1] > 20) + data[0] = 5; + break; + case 5: + sub_800ADF8(); + data[0] = 6; + break; + case 6: + if (sub_800A520()) + { + data[0] = 7; + } + break; + case 7: + if (gLinkPlayers[0].trainerId & 1) + PlayMapChosenOrBattleBGM(MUS_BATTLE32); + else + PlayMapChosenOrBattleBGM(MUS_BATTLE20); + + gLinkPlayers[0].linkType = 0x2211; + sub_80B3260(gSpecialVar_0x8004); + overworld_free_bg_tilemaps(); + gTrainerBattleOpponent_A = 0x800; + SetMainCallback2(CB2_InitBattle); + gMain.savedCallback = sub_80B360C; + DestroyTask(taskId); + break; + } +} + +static void sub_80B3554(void) +{ + u8 playerCount; + int i; + bool32 r4; + + switch (gMain.state) + { + case 0: + playerCount = GetLinkPlayerCount(); + r4 = FALSE; + for (i = 0; i < playerCount; i++) + { + u32 version = (u8)gLinkPlayers[i].version; + if (version == VERSION_FIRE_RED || version == VERSION_LEAF_GREEN) + { + r4 = TRUE; + break; + } + } + + if (r4) + { + gMain.state = 2; + } + else + { + sub_800AC34(); + gMain.state = 1; + } + break; + case 1: + if (gReceivedRemoteLinkPlayers == FALSE) + { + SetMainCallback2(CB2_ReturnToField); + } + break; + case 2: + SetMainCallback2(CB2_ReturnToField); + break; + } + RunTasks(); +} + +void sub_80B360C(void) +{ + gBattleTypeFlags &= ~BATTLE_TYPE_20; + Overworld_ResetMapMusic(); + LoadPlayerParty(); + SavePlayerBag(); + sub_813BF10(); + + if (gSpecialVar_0x8004 == 1 || gSpecialVar_0x8004 == 2) + { + UpdatePlayerLinkBattleRecords(gUnknown_03005DB4 ^ 1); + if (gWirelessCommType) + { + switch (gBattleOutcome) + { + case B_OUTCOME_WON: + sub_801B990(0, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId); + break; + case B_OUTCOME_LOST: + sub_801B990(1, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId); + break; + } + } + } + + if (InUnionRoom() == TRUE) + { + gMain.savedCallback = sub_80B3554; + } + else + { + gMain.savedCallback = c2_8056854; + } + + SetMainCallback2(sub_80A0514); +} + +void sub_80B36EC(void) +{ + if (gSpecialVar_0x8004 == 1 || gSpecialVar_0x8004 == 2 || gSpecialVar_0x8004 == 5 || gSpecialVar_0x8004 == 9) + { + LoadPlayerParty(); + SavePlayerBag(); + } + copy_saved_warp2_bank_and_enter_x_to_warp1(0x7F); +} + +void sub_80B371C(void) +{ + sub_80872B0(); +} + +static void sub_80B3728(u8 taskId) +{ + struct Task* task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + ShowFieldMessage(gText_PleaseWaitForLink); + task->data[0] = 1; + break; + case 1: + if (IsFieldMessageBoxHidden()) + { + sub_8087288(); + sub_8009628(gSpecialVar_0x8005); + task->data[0] = 2; + } + break; + case 2: + switch (sub_8087214()) + { + case 0: + break; + case 1: + HideFieldMessageBox(); + task->data[0] = 0; + sub_80872C4(); + SwitchTaskToFollowupFunc(taskId); + break; + case 2: + task->data[0] = 3; + break; + } + break; + case 3: + sub_808729C(); + sub_8197AE8(TRUE); + DestroyTask(taskId); + EnableBothScriptContexts(); + break; + } +} + +void sub_80B37D4(TaskFunc followupFunc) +{ + u8 taskId = CreateTask(sub_80B3728, 80); + SetTaskFuncWithFollowupFunc(taskId, sub_80B3728, followupFunc); + ScriptContext1_Stop(); +} + +static void sub_80B37FC(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + ScriptContext2_Enable(); + FadeScreen(1, 0); + ClearLinkCallback_2(); + task->data[0]++; + break; + case 1: + if (!gPaletteFade.active) + task->data[0]++; + break; + case 2: + gUnknown_02032298[0] = 0; + gUnknown_02032298[1] = 0; + m4aMPlayAllStop(); + sub_800AC34(); + task->data[0]++; + break; + case 3: + if (!gReceivedRemoteLinkPlayers) + { + SetMainCallback2(sub_80773AC); + DestroyTask(taskId); + } + break; + } +} + +static void sub_80B3894(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + ScriptContext2_Enable(); + FadeScreen(1, 0); + Rfu_set_zero(); + data[0]++; + break; + case 1: + if (!gPaletteFade.active) + data[0]++; + break; + case 2: + gUnknown_02032298[0] = 0; + gUnknown_02032298[1] = 0; + m4aMPlayAllStop(); + sub_800ADF8(); + data[0]++; + break; + case 3: + if (sub_800A520()) + { + sub_8013F78(); + DestroyTask(taskId); + } + break; + } +} + +void sub_80B3924(void) +{ + if (gWirelessCommType != 0) + { + sub_80B37D4(sub_80B3894); + } + else + { + sub_80B37D4(sub_80B37FC); + } +} + +static void sub_80B3950(void) +{ + CreateTask(sub_80B37FC, 80); +} + +void nullsub_37(void) +{ + +} + +void sub_80B3968(void) +{ + gLinkType = 0x2211; + + if (gWirelessCommType != 0) + { + sub_80B37D4(sub_80B33BC); + } + else + { + sub_80B37D4(sub_80B32B4); + } +} + +static void sub_80B39A4(void) +{ + u8 taskId = CreateTask(sub_80B3728, 80); + ScriptContext1_Stop(); +} + +void sp02A_crash_sound(void) +{ + TrainerCard_ShowLinkCard(gSpecialVar_0x8006, CB2_ReturnToFieldContinueScriptPlayMapMusic); +} + +bool32 sub_80B39D4(u8 linkPlayerIndex) +{ + u32 trainerCardColorIndex; + + gSpecialVar_0x8006 = linkPlayerIndex; + StringCopy(gStringVar1, gLinkPlayers[linkPlayerIndex].name); + + trainerCardColorIndex = sub_80C4904(linkPlayerIndex); + if (trainerCardColorIndex == 0) + return FALSE; + + StringCopy(gStringVar2, gTrainerCardColorNames[trainerCardColorIndex - 1]); + return TRUE; +} + +void task00_08081A90(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + task->data[0]++; + if (task->data[0] > 300) + { + CloseLink(); + SetMainCallback2(CB2_LinkError); + DestroyTask(taskId); + } + + if (gReceivedRemoteLinkPlayers) + { + if (gWirelessCommType == 0) + { + if (!sub_800AA60()) + { + CloseLink(); + SetMainCallback2(CB2_LinkError); + } + DestroyTask(taskId); + } + else + { + DestroyTask(taskId); + } + } +} + +static void sub_80B3AAC(u8 taskId) +{ + if (!gReceivedRemoteLinkPlayers) + { + EnableBothScriptContexts(); + DestroyTask(taskId); + } +} + +static void sub_80B3AD0(u8 taskId) +{ + sub_800AC34(); + gTasks[taskId].func = sub_80B3AAC; +} + +void sub_80B3AF8(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + if (gWirelessCommType != 0) + { + DestroyTask(taskId); + } + else + { + OpenLink(); + CreateTask(task00_08081A90, 1); + data[0]++; + } + break; + case 1: + if (++data[1] > 11) + { + data[1] = 0; + data[0]++; + } + break; + case 2: + if (GetLinkPlayerCount_2() >= sub_800AA48()) + { + if (IsLinkMaster()) + { + if (++data[1] > 30) + { + sub_800A620(); + data[0]++; + } + } + else + { + data[0]++; + } + } + break; + case 3: + if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE) + { + DestroyTask(taskId); + } + break; + } +} + +void sub_80B3BC4(void) +{ + if (gWirelessCommType == 0) + { + gLinkType = 0x2288; + } +} diff --git a/src/field_message_box.c b/src/field_message_box.c index 19859ec0f..f45b6607d 100755 --- a/src/field_message_box.c +++ b/src/field_message_box.c @@ -131,7 +131,7 @@ void HideFieldMessageBox(void) gUnknown_020375BC = 0; } -u8 textbox_any_visible(void) +u8 GetFieldMessageBoxMode(void) { return gUnknown_020375BC; } diff --git a/src/mystery_event_menu.c b/src/mystery_event_menu.c index 8dcb960b7..7e09a4d70 100644 --- a/src/mystery_event_menu.c +++ b/src/mystery_event_menu.c @@ -151,7 +151,7 @@ static void CB2_MysteryEventMenu(void) if (!IsTextPrinterActive(0)) { gMain.state++; - gLinkType = 21761; + gLinkType = 0x5501; OpenLink(); } break; diff --git a/src/rom_8011DC0.c b/src/rom_8011DC0.c index 56c31f89f..dc94cb9d5 100644 --- a/src/rom_8011DC0.c +++ b/src/rom_8011DC0.c @@ -1609,7 +1609,7 @@ void sub_80141A4(void) break; case 1: if (!FuncIsActiveTask(sub_80140E0)) - sub_80C4E74(GetMultiplayerId() ^ 1, CB2_ReturnToField); + TrainerCard_ShowLinkCard(GetMultiplayerId() ^ 1, CB2_ReturnToField); break; } @@ -1675,7 +1675,7 @@ void sub_80143E4(void *arg0, bool32 arg1) { u16 *argAsU16Ptr = arg0; - sub_80C30A4(argAsU16Ptr); + TrainerCard_GenerateCardForPlayer((struct TrainerCard *)argAsU16Ptr); if (arg1) argAsU16Ptr[48] = sub_801B39C(); else diff --git a/src/start_menu.c b/src/start_menu.c index 9d10aeaa4..dcb2c4154 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -88,7 +88,7 @@ extern void CB2_PartyMenuFromStartMenu(void); extern void CB2_PokeNav(void); extern void sub_80C4DDC(void (*)(void)); extern void sub_80C51C4(void (*)(void)); -extern void sub_80C4E74(u8, void (*)(void)); +extern void TrainerCard_ShowLinkCard(u8, void (*)(void)); extern void ScriptUnfreezeEventObjects(void); extern void sub_81A9EC8(void); extern void save_serialize_map(void); @@ -750,7 +750,7 @@ static bool8 StartMenuLinkModePlayerNameCallback(void) { play_some_sound(); overworld_free_bg_tilemaps(); - sub_80C4E74(gUnknown_03005DB4, CB2_ReturnToFieldWithOpenMenu); + TrainerCard_ShowLinkCard(gUnknown_03005DB4, CB2_ReturnToFieldWithOpenMenu); return TRUE; } |