diff options
author | PikalaxALT <PikalaxALT@gmail.com> | 2020-01-20 14:46:01 -0500 |
---|---|---|
committer | PikalaxALT <PikalaxALT@gmail.com> | 2020-01-20 14:46:01 -0500 |
commit | ac5bfcf1ce9c0f1dfe240dca3aeb0f3fcaa83280 (patch) | |
tree | d5fc9e8f137d06ff17c7beb4f22744c318d19b4f /src | |
parent | 8d5af5332934f47f022907d2acb2e71d96b04449 (diff) |
through sub_8117A0C
Diffstat (limited to 'src')
-rw-r--r-- | src/credits.c | 4 | ||||
-rw-r--r-- | src/field_fadetransition.c | 22 | ||||
-rw-r--r-- | src/item_use.c | 10 | ||||
-rw-r--r-- | src/mevent.c | 4 | ||||
-rw-r--r-- | src/player_pc.c | 8 | ||||
-rw-r--r-- | src/quest_log.c | 4 | ||||
-rw-r--r-- | src/scrcmd.c | 4 | ||||
-rw-r--r-- | src/shop.c | 4 | ||||
-rw-r--r-- | src/start_menu.c | 4 | ||||
-rw-r--r-- | src/union_room.c | 767 |
10 files changed, 794 insertions, 37 deletions
diff --git a/src/credits.c b/src/credits.c index a0138e57a..ceb2028f9 100644 --- a/src/credits.c +++ b/src/credits.c @@ -920,7 +920,7 @@ static s32 RollCredits(void) case CREDITSSCRCMD_MON: sCreditsMgr->mainseqno = CREDITSSCENE_MON_DESTROY_ASSETS; sCreditsMgr->whichMon = sCreditsScript[sCreditsMgr->scrcmdidx].param; - fade_screen(1, 0); + FadeScreen(1, 0); break; case CREDITSSCRCMD_THEENDGFX: sCreditsMgr->mainseqno = CREDITSSCENE_THEEND_DESTROY_ASSETS; @@ -1342,7 +1342,7 @@ static s32 RollCredits(void) "\tstrb r0, [r2, 0x9]\n" "\tmovs r0, 0x1\n" "\tmovs r1, 0\n" - "\tbl fade_screen\n" + "\tbl FadeScreen\n" "\tb _080F3E94\n" "\t.align 2, 0\n" "_080F3E50: .4byte sCreditsMgr\n" diff --git a/src/field_fadetransition.c b/src/field_fadetransition.c index dbc5f23b5..0af5f462c 100644 --- a/src/field_fadetransition.c +++ b/src/field_fadetransition.c @@ -56,12 +56,12 @@ void pal_fill_for_maplights(void) { case 0: palette_bg_faded_fill_black(); - fade_screen(0, 0); + FadeScreen(0, 0); palette_bg_faded_fill_black(); break; case 1: palette_bg_faded_fill_white(); - fade_screen(2, 0); + FadeScreen(2, 0); palette_bg_faded_fill_white(); break; } @@ -73,12 +73,12 @@ static void sub_807DBAC(void) { case 0: palette_bg_faded_fill_black(); - fade_screen(0, 3); + FadeScreen(0, 3); palette_bg_faded_fill_black(); break; case 1: palette_bg_faded_fill_white(); - fade_screen(2, 3); + FadeScreen(2, 3); palette_bg_faded_fill_white(); break; } @@ -87,7 +87,7 @@ static void sub_807DBAC(void) void sub_807DC00(void) { palette_bg_faded_fill_black(); - fade_screen(0, 0); + FadeScreen(0, 0); palette_bg_faded_fill_black(); } @@ -95,16 +95,16 @@ void sub_807DC18(void) { const struct MapHeader *header = warp1_get_mapheader(); if (header->regionMapSectionId != gMapHeader.regionMapSectionId && sub_80F8110(header->regionMapSectionId, FALSE)) - fade_screen(1, 0); + FadeScreen(1, 0); else { switch (sub_80C9D7C(GetCurrentMapType(), header->mapType)) { case 0: - fade_screen(1, 0); + FadeScreen(1, 0); break; case 1: - fade_screen(3, 0); + FadeScreen(3, 0); break; } } @@ -115,10 +115,10 @@ static void sub_807DC70(void) switch (sub_80C9D7C(GetCurrentMapType(), warp1_get_mapheader()->mapType)) { case 0: - fade_screen(1, 3); + FadeScreen(1, 3); break; case 1: - fade_screen(3, 3); + FadeScreen(3, 3); break; } } @@ -654,7 +654,7 @@ static void sub_807E678(u8 taskId) { case 0: ClearLinkCallback_2(); - fade_screen(1, 0); + FadeScreen(1, 0); sub_8055F88(); PlaySE(SE_KAIDAN); data[0]++; diff --git a/src/item_use.c b/src/item_use.c index fc5703a75..57771754a 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -458,7 +458,7 @@ void FieldUseFunc_TmCase(u8 taskId) else { StopPokemonLeagueLightingEffectTask(); - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].func = Task_InitTMCaseFromField; } } @@ -489,7 +489,7 @@ void FieldUseFunc_BerryPouch(u8 taskId) else { StopPokemonLeagueLightingEffectTask(); - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].func = Task_InitBerryPouchFromField; } } @@ -532,7 +532,7 @@ void FieldUseFunc_TeachyTv(u8 taskId) else { StopPokemonLeagueLightingEffectTask(); - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].func = Task_InitTeachyTvFromField; } } @@ -662,7 +662,7 @@ void FieldUseFunc_TownMap(u8 taskId) else { StopPokemonLeagueLightingEffectTask(); - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].func = sub_80A1CC0; } } @@ -694,7 +694,7 @@ void FieldUseFunc_FameChecker(u8 taskId) else { StopPokemonLeagueLightingEffectTask(); - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].func = sub_80A1D68; } } diff --git a/src/mevent.c b/src/mevent.c index b22d02cbc..c8ce39e23 100644 --- a/src/mevent.c +++ b/src/mevent.c @@ -652,7 +652,7 @@ void BlankMEventBuffer2(void) gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.crc = 0; } -u16 sub_81440E8(void) +u16 GetWonderCardFlagID(void) { if (ValidateReceivedWonderCard()) return gSaveBlock1Ptr->mysteryEventBuffers.mecard.data.unk_00; @@ -674,7 +674,7 @@ bool32 sub_8144124(u16 a0) bool32 CheckReceivedGiftFromWonderCard(void) { - u16 value = sub_81440E8(); + u16 value = GetWonderCardFlagID(); if (!sub_8144124(value)) return FALSE; if (FlagGet(gUnknown_8466F00[value - 1000]) == TRUE) diff --git a/src/player_pc.c b/src/player_pc.c index 63870c86a..928676844 100644 --- a/src/player_pc.c +++ b/src/player_pc.c @@ -331,7 +331,7 @@ static void Task_DepositItem_WaitFadeAndGoToBag(u8 taskId) static void Task_PlayerPcDepositItem(u8 taskId) { gTasks[taskId].func = Task_DepositItem_WaitFadeAndGoToBag; - fade_screen(1, 0); + FadeScreen(1, 0); } static void Task_ReturnToItemStorageSubmenu(u8 taskId) @@ -394,7 +394,7 @@ static void Task_WithdrawItemBeginFade(u8 taskId) { gTasks[taskId].func = Task_WithdrawItem_WaitFadeAndGoToItemStorage; ItemPc_SetInitializedFlag(0); - fade_screen(1, 0); + FadeScreen(1, 0); } static void Task_PlayerPcCancel(u8 taskId) @@ -556,7 +556,7 @@ static void Task_MailSubmenuHandleInput(u8 taskId) static void Task_PlayerPcReadMail(u8 taskId) { - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].func = Task_WaitFadeAndReadSelectedMail; } @@ -663,7 +663,7 @@ static void Task_PlayerPcGiveMailToMon(u8 taskId) } else { - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].func = Task_WaitFadeAndGoToPartyMenu; } } diff --git a/src/quest_log.c b/src/quest_log.c index 38b3733ea..0cda4eb77 100644 --- a/src/quest_log.c +++ b/src/quest_log.c @@ -1049,7 +1049,7 @@ static void sub_811175C(u8 sceneNum, struct UnkStruct_203AE98 * a1) static void sub_81118F4(s8 a0) { - fade_screen(1, a0); + FadeScreen(1, a0); sQuestLogCB = QuestLog_AdvancePlayhead; } @@ -1309,7 +1309,7 @@ static void QuestLog_CloseTextWindow(void) static void QuestLog_SkipToEndOfPlayback(s8 a0) { - fade_screen(1, a0); + FadeScreen(1, a0); sQuestLogCB = QuestLog_WaitFadeAndCancelPlayback; } diff --git a/src/scrcmd.c b/src/scrcmd.c index 51e7d2c35..c083546eb 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -630,7 +630,7 @@ static bool8 IsPaletteNotActive(void) bool8 ScrCmd_fadescreen(struct ScriptContext *ctx) { - fade_screen(ScriptReadByte(ctx), 0); + FadeScreen(ScriptReadByte(ctx), 0); SetupNativeScript(ctx, IsPaletteNotActive); return TRUE; } @@ -640,7 +640,7 @@ bool8 ScrCmd_fadescreenspeed(struct ScriptContext *ctx) u8 mode = ScriptReadByte(ctx); u8 speed = ScriptReadByte(ctx); - fade_screen(mode, speed); + FadeScreen(mode, speed); SetupNativeScript(ctx, IsPaletteNotActive); return TRUE; } diff --git a/src/shop.c b/src/shop.c index 865688928..97061f8c0 100644 --- a/src/shop.c +++ b/src/shop.c @@ -294,14 +294,14 @@ static void Task_ShopMenu(u8 taskId) static void Task_HandleShopMenuBuy(u8 taskId) { SetWordTaskArg(taskId, 0xE, (u32)CB2_InitBuyMenu); - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].func = Task_GoToBuyOrSellMenu; } static void Task_HandleShopMenuSell(u8 taskId) { SetWordTaskArg(taskId, 0xE, (u32)CB2_GoToSellMenu); - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].func = Task_GoToBuyOrSellMenu; } diff --git a/src/start_menu.c b/src/start_menu.c index 59bfb8643..b159f0375 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -446,7 +446,7 @@ static void StartMenu_FadeScreenIfLeavingOverworld(void) && sStartMenuCallback != StartMenuSafariZoneRetireCallback) { StopPokemonLeagueLightingEffectTask(); - fade_screen(1, 0); + FadeScreen(1, 0); } } @@ -554,7 +554,7 @@ static bool8 StartMenuLinkPlayerCallback(void) { PlayRainStoppingSoundEffect(); CleanupOverworldWindowsAndTilemaps(); - ShowTrainerCardInLink(gUnknown_300502C, CB2_ReturnToFieldWithOpenMenu); + ShowTrainerCardInLink(gLocalLinkPlayerId, CB2_ReturnToFieldWithOpenMenu); return TRUE; } return FALSE; diff --git a/src/union_room.c b/src/union_room.c index 37c3e7c0a..6b6ef5b98 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -1,23 +1,41 @@ #include "global.h" #include "gflib.h" +#include "battle.h" +#include "berry_crush.h" +#include "cable_club.h" +#include "dodrio_berry_picking.h" #include "event_data.h" +#include "field_control_avatar.h" +#include "field_weather.h" #include "link.h" #include "link_rfu.h" #include "list_menu.h" +#include "load_save.h" +#include "mevent.h" +#include "mystery_gift_menu.h" #include "new_menu_helpers.h" +#include "overworld.h" +#include "party_menu.h" +#include "pokemon_jump.h" +#include "save_location.h" #include "script.h" +#include "script_pokemon_util.h" #include "task.h" +#include "trade.h" +#include "trade_scene.h" +#include "trainer_card.h" #include "union_room.h" +#include "union_room_chat.h" +#include "union_room_player_avatar.h" #include "constants/songs.h" - -#define sub_8018404(dest, arg1) ({ \ - StringCopy7(dest, (arg1).unk.playerName); \ - ConvertInternationalString(dest, (arg1).unk.field_0.unk_00.unk_00_0); \ -}) +#include "constants/maps.h" +#include "constants/cable_club.h" +#include "constants/field_weather.h" EWRAM_DATA union UnkUnion_Main gUnknown_203B05C = {}; EWRAM_DATA u8 gUnknown_203B058 = 0; EWRAM_DATA u8 gUnknown_203B059 = 0; +EWRAM_DATA struct UnionRoomTrade gUnknown_203B06C = {}; IWRAM_DATA struct UnkStruct_Leader *gUnknown_3002024; IWRAM_DATA struct UnkStruct_Group *gUnknown_3002028; @@ -30,8 +48,11 @@ u8 sub_81165E8(struct UnkStruct_Main0 * a0); void sub_8116738(u8 taskId); u32 sub_8116D10(struct UnkStruct_Group * group, s32 id); void sub_8116D60(struct UnkStruct_Group * group, s32 id); +void sub_8116E1C(u8 taskId); u8 sub_8116FE4(void); void sub_8117990(void); +void sub_81179A4(void); +void sub_8117A0C(u8 taskId); u16 sub_8118658(const u8 *data); u8 sub_811A054(struct UnkStruct_Main4 *arg0, u32 arg1); bool8 sub_811A0F8(u8 *textState, const u8 *str); @@ -40,9 +61,13 @@ void sub_811A41C(void); void sub_811A444(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx); void sub_811A5E4(struct UnkStruct_x20 *arg0, u8 count); void sub_811A650(struct UnkStruct_Main4 *arg0, u8 count); +bool32 sub_811A6DC(struct UnkStruct_Shared *arg0, struct UnkStruct_Shared *arg1); u32 sub_811A748(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *arg1); u8 sub_811A798(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *arg1, u8 arg2); +void sub_811A81C(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 *arg3, u8 arg4, u8 id); void sub_811A910(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 *arg3, u8 arg4, u8 id); +void sub_811B148(struct UnionRoomTrade *trade); +u32 sub_811B1EC(struct UnionRoomTrade *trade, u8 mpId); extern const u8 *const gUnknown_8456C74[]; extern const struct WindowTemplate gUnknown_8456CD0; @@ -54,8 +79,10 @@ extern const struct WindowTemplate gUnknown_8456D4C; extern const struct WindowTemplate gUnknown_8456D54; extern const struct ListMenuTemplate gUnknown_8456DDC; extern const struct UnkStruct_Shared gUnknown_8457034; +extern const u8 *const gUnknown_8457094[13]; extern const u8 gUnknown_84570C8[]; extern const u8 gUnknown_84571B4[]; +extern const u8 gUnknown_84571B8[]; extern const u8 gUnknown_8457234[]; extern const u8 gUnknown_8457264[]; extern const u8 *const gUnknown_845742C[][5]; @@ -74,6 +101,7 @@ extern const u8 gUnknown_84576C4[]; extern const u8 gUnknown_8457700[]; extern const u8 gUnknown_845771C[]; extern const u8 *const gUnknown_8457754[]; +extern const u8 gUnknown_84577F8[]; extern const u8 gUnknown_8457E28[]; extern const u8 gUnknown_8457E44[]; extern const u8 gUnknown_8458FC8[]; @@ -81,6 +109,18 @@ extern const u8 *const gUnknown_84591B8[]; extern const u8 gUnknown_8459238[]; extern const u8 gUnknown_8459250[]; +// These are functions in Emmerald but inlined in FireRed + +#define sub_8018404(dest, arg1) ({ \ + StringCopy7(dest, (arg1).unk.playerName); \ + ConvertInternationalString(dest, (arg1).unk.field_0.unk_00.unk_00_0); \ +}) + +#define CopyTrainerCardData(dest, src, _version) ({ \ + (dest) = *((struct TrainerCard *)(src)); \ + (dest).version = _version; \ +}) + void sub_811586C(u8 windowId, u8 arg1, u8 stringId) { FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); @@ -917,3 +957,720 @@ void sub_8116738(u8 taskId) break; } } + +u32 sub_8116D10(struct UnkStruct_Group *arg0, s32 id) +{ + struct UnkStruct_x20 *structPtr = &arg0->field_0->arr[id]; + + if (gUnknown_203B058 == 4 && structPtr->unk.field_0.unk_00.unk_01_2 != VERSION_FIRE_RED && structPtr->unk.field_0.unk_00.unk_01_2 != VERSION_LEAF_GREEN) + { + if (!(gSaveBlock2Ptr->specialSaveWarpFlags & CHAMPION_SAVEWARP)) + return 1; + else if (structPtr->unk.field_0.unk_00.isChampion) + return 0; + } + else + { + return 0; + } + + return 2; +} + +void sub_8116D60(struct UnkStruct_Group *data, s32 id) +{ + data->field_F = id; + LoadWirelessStatusIndicatorSpriteGfx(); + CreateWirelessStatusIndicatorSprite(0, 0); + RedrawListMenu(data->listTaskId); + sub_8018404(gStringVar1, data->field_0->arr[data->field_F]); + sub_80FB008(gUnknown_84570C8[gSpecialVar_0x8004], 0, 1); + sub_80FBF54(data->field_0->arr[data->field_F].unk.playerName, sub_8118658(data->field_0->arr[data->field_F].unk.field_0.unk_00.playerTrainerId)); +} + +u8 sub_8116DE0(void) +{ + u8 taskId; + struct UnkStruct_Group *dataPtr; + + taskId = CreateTask(sub_8116E1C, 0); + gUnknown_203B05C.group = dataPtr = (void*)(gTasks[taskId].data); + + dataPtr->state = 0; + dataPtr->textState = 0; + + gUnknown_3002028 = dataPtr; + + return taskId; +} + +void sub_8116E1C(u8 taskId) +{ + struct UnkStruct_Group *data = gUnknown_203B05C.group; + + switch (data->state) + { + case 0: + sub_80FAF58(0, 0, 0); + sub_800B1F4(); + OpenLink(); + sub_80FBBD8(); + sub_80FB128(TRUE); + data->field_4 = AllocZeroed(0x70); + data->field_0 = AllocZeroed(0x200); + data->state = 2; + break; + case 2: + sub_811A650(data->field_4, 4); + sub_811A5E4(data->field_0->arr, 16); + data->field_11 = sub_811A054(data->field_4, 0xFF); + data->field_F = 0; + data->state = 3; + break; + case 3: + if (sub_8116FE4() == 1) + PlaySE(SE_PC_LOGIN); + if (gTasks[taskId].data[15] == 0xFF) + data->state = 10; + break; + case 10: + DestroyTask(data->field_11); + Free(data->field_0); + Free(data->field_4); + sub_80F8DC0(); + data->state++; + break; + case 11: + sub_80F8DC0(); + DestroyTask(taskId); + break; + } +} + +bool32 sub_8116F28(u32 arg0, u32 id) +{ + if (id == 0xFF) + return TRUE; + + if (id <= NELEMS(gUnknown_8457094)) // UB: <= may access data outside the array + { + const u8 *bytes = gUnknown_8457094[id]; + + while ((*(bytes) != 0xFF)) + { + if ((*bytes) == arg0) + return TRUE; + bytes++; + } + } + + return FALSE; +} + +u8 sub_8116F5C(struct UnkStruct_Group *data, u32 id) +{ + if (data->field_0->arr[id].field_1A_0 == 1) + { + if (data->field_0->arr[id].unk.field_0.unk_0a_7) + return 3; + else if (data->field_0->arr[id].field_1A_1 != 0) + return 1; + else if (data->field_0->arr[id].field_1B != 0) + return 2; + } + + return 0; +} + +void sub_8116F94(u8 arg0, s32 id, u8 arg2) +{ + struct UnkStruct_Group *data = gUnknown_203B05C.group; + u8 var = sub_8116F5C(data, id); + + sub_811A81C(arg0, 8, arg2, &data->field_0->arr[id], var, id); +} + +u8 sub_8116FE4(void) +{ + struct UnkStruct_Group *data = gUnknown_203B05C.group; + u8 ret = 0; + u8 i; + s32 id; + + for (i = 0; i < 16; i++) + { + if (data->field_0->arr[i].field_1A_0 != 0) + { + id = sub_811A748(&data->field_0->arr[i], data->field_4->arr); + if (id != 0xFF) + { + if (data->field_0->arr[i].field_1A_0 == 1) + { + if (sub_811A6DC(&data->field_0->arr[i].unk, &data->field_4->arr[id].unk0)) + { + data->field_0->arr[i].unk = data->field_4->arr[id].unk0; + data->field_0->arr[i].field_1B = 0x40; + ret = 1; + } + else + { + if (data->field_0->arr[i].field_1B != 0) + { + data->field_0->arr[i].field_1B--; + if (data->field_0->arr[i].field_1B == 0) + ret = 2; + } + } + } + else + { + data->field_0->arr[i].field_1A_0 = 1; + data->field_0->arr[i].field_1B = 0x40; + ret = 1; + } + + data->field_0->arr[i].field_18 = 0; + } + else + { + if (data->field_0->arr[i].field_1A_0 != 2) + { + data->field_0->arr[i].field_18++; + if (data->field_0->arr[i].field_18 >= 300) + { + data->field_0->arr[i].field_1A_0 = 2; + ret = 2; + } + } + } + } + } + + for (id = 0; id < 4; id++) + { + if (sub_811A798(data->field_0->arr, &data->field_4->arr[id], 16) != 0xFF) + ret = 1; + } + + return ret; +} + +void sub_8117100(u8 taskId) +{ + CB2_ReturnFromLinkTrade(); + DestroyTask(taskId); +} + +u8 sub_8117118(void) +{ + u8 taskId = CreateTask(sub_8117100, 0); + + return taskId; +} + +void sub_8117130(u8 taskId) +{ + u32 monId = sub_811B1EC(&gUnknown_203B06C, GetMultiplayerId()); + + switch (gTasks[taskId].data[0]) + { + case 0: + gTasks[taskId].data[0]++; + SendBlock(0, &gPlayerParty[monId], sizeof(struct Pokemon)); + break; + case 1: + if (GetBlockReceivedStatus() == 3) + { + gEnemyParty[0] = *(struct Pokemon*)(gBlockRecvBuffer[GetMultiplayerId() ^ 1]); + IncrementGameStat(GAME_STAT_NUM_UNION_ROOM_BATTLES); + ResetBlockReceivedFlags(); + gTasks[taskId].data[0]++; + } + break; + case 2: + memcpy(gBlockSendBuffer, gSaveBlock1Ptr->mail, sizeof(struct MailStruct) * PARTY_SIZE + 4); + if (SendBlock(0, gBlockSendBuffer, sizeof(struct MailStruct) * PARTY_SIZE + 4)) + gTasks[taskId].data[0]++; + break; + case 3: + if (GetBlockReceivedStatus() == 3) + { + memcpy(gLinkPartnerMail, gBlockRecvBuffer[GetMultiplayerId() ^ 1], sizeof(struct MailStruct) * PARTY_SIZE); + ResetBlockReceivedFlags(); + gSelectedTradeMonPositions[TRADE_PLAYER] = monId; + gSelectedTradeMonPositions[TRADE_PARTNER] = PARTY_SIZE; + gMain.savedCallback = CB2_ReturnToField; + SetMainCallback2(CB2_InitTradeAnim_LinkTrade); + sub_811B148(&gUnknown_203B06C); + DestroyTask(taskId); + } + break; + } +} + +void sub_8117280(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + if (GetMultiplayerId() == 0) + sub_800A474(2); + gTasks[taskId].data[0]++; + break; + case 1: + if (GetBlockReceivedStatus() == sub_800A8D4()) + { + s32 i; + u16 *recvBuff; + + for (i = 0; i < GetLinkPlayerCount(); i++) + { + recvBuff = gBlockRecvBuffer[i]; + CopyTrainerCardData(gTrainerCards[i], recvBuff, gLinkPlayers[i].version); + } + + if (GetLinkPlayerCount() == 2) + { + recvBuff = gBlockRecvBuffer[GetMultiplayerId() ^ 1]; + sub_81446D0(recvBuff[48]); + } + else + { + sub_81446C4(); + } + + ResetBlockReceivedFlags(); + DestroyTask(taskId); + } + break; + } +} + +void sub_8117354(void) +{ + switch (gMain.state) + { + case 0: + CreateTask(sub_8117280, 5); + gMain.state++; + break; + case 1: + if (!FuncIsActiveTask(sub_8117280)) + ShowTrainerCardInLink(GetMultiplayerId() ^ 1, CB2_ReturnToField); + break; + } + + RunTasks(); + RunTextPrinters(); + AnimateSprites(); + BuildOamBuffer(); +} + +void sub_81173C0(u16 battleFlags) +{ + HealPlayerParty(); + SavePlayerParty(); + LoadPlayerBag(); + gLinkPlayers[0].linkType = LINKTYPE_BATTLE; + gLinkPlayers[GetMultiplayerId()].id = GetMultiplayerId(); + gLinkPlayers[GetMultiplayerId() ^ 1].id = GetMultiplayerId() ^ 1; + gMain.savedCallback = sub_8081668; + gBattleTypeFlags = battleFlags; + PlayBattleBGM(); +} + +void sub_8117440(u16 linkService, u16 x, u16 y) +{ + VarSet(VAR_CABLE_CLUB_STATE, linkService); + SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x, y); + SetDynamicWarpWithCoords(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x, y); + WarpIntoMap(); +} + +void sub_81174B4(s8 mapGroup, s8 mapNum, s32 x, s32 y, u16 linkService) +{ + gSpecialVar_0x8004 = linkService; + VarSet(VAR_CABLE_CLUB_STATE, linkService); + gFieldLinkPlayerCount = GetLinkPlayerCount(); + gLocalLinkPlayerId = GetMultiplayerId(); + SetCableClubWarp(); + SetWarpDestination(mapGroup, mapNum, -1, x, y); + WarpIntoMap(); +} + +void sub_8117534(void) +{ + switch (gMain.state) + { + case 0: + CreateTask(sub_8117280, 5); + gMain.state++; + break; + case 1: + if (!FuncIsActiveTask(sub_8117280)) + SetMainCallback2(sub_8056788); + break; + } + + RunTasks(); + RunTextPrinters(); + AnimateSprites(); + BuildOamBuffer(); +} + +void sub_8117594(void *arg0, bool32 arg1) +{ + TrainerCard_GenerateCardForLinkPlayer((struct TrainerCard *)arg0); + if (arg1) + *((u16 *)(arg0 + sizeof(struct TrainerCard))) = GetWonderCardFlagID(); + else + *((u16 *)(arg0 + sizeof(struct TrainerCard))) = 0; +} + +void sub_81175BC(u8 taskId) +{ + sub_81446C4(); + switch (gUnknown_203B058) + { + case 1 ... 4: + case 9 ... 11: + case 13: + case 14: + RecordMixTrainerNames(); + break; + } + + switch (gUnknown_203B058) + { + case 65: + case 81: + CleanupOverworldWindowsAndTilemaps(); + gMain.savedCallback = sub_811C1C8; + InitChooseHalfPartyForBattle(2); + break; + case 1: + CleanupOverworldWindowsAndTilemaps(); + sub_8117594(gBlockSendBuffer, TRUE); + HealPlayerParty(); + SavePlayerParty(); + LoadPlayerBag(); + sub_81174B4(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_SINGLE_BATTLE); + SetMainCallback2(sub_8117534); + break; + case 2: + CleanupOverworldWindowsAndTilemaps(); + HealPlayerParty(); + SavePlayerParty(); + LoadPlayerBag(); + sub_8117594(gBlockSendBuffer, TRUE); + sub_81174B4(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_DOUBLE_BATTLE); + SetMainCallback2(sub_8117534); + break; + case 3: + CleanupOverworldWindowsAndTilemaps(); + HealPlayerParty(); + SavePlayerParty(); + LoadPlayerBag(); + sub_8117594(gBlockSendBuffer, TRUE); + sub_81174B4(MAP_GROUP(BATTLE_COLOSSEUM_4P), MAP_NUM(BATTLE_COLOSSEUM_4P), 5, 8, USING_MULTI_BATTLE); + SetMainCallback2(sub_8117534); + break; + case 4: + sub_8117594(gBlockSendBuffer, TRUE); + CleanupOverworldWindowsAndTilemaps(); + sub_81174B4(MAP_GROUP(TRADE_CENTER), MAP_NUM(TRADE_CENTER), 5, 8, USING_TRADE_CENTER); + SetMainCallback2(sub_8117534); + break; + case 68: + CreateTask(sub_8117130, 0); + break; + case 5: + case 69: + if (GetMultiplayerId() == 0) + { + sub_80F8CFC(); + } + else + { + sub_80F8D14(); + sub_80FAF58(69, 0, 1); + } + sub_8128420(); + break; + case 8: + case 72: + sub_8117594(gBlockSendBuffer, FALSE); + SetMainCallback2(sub_8117354); + break; + case 9: + sub_8117440(USING_MINIGAME, 5, 1); + sub_8147AA8(GetCursorSelectionMonId(), CB2_LoadMap); + break; + case 10: + sub_8117440(USING_BERRY_CRUSH, 9, 1); + sub_814B754(CB2_LoadMap); + break; + case 11: + sub_8117440(USING_MINIGAME, 5, 1); + sub_81507FC(GetCursorSelectionMonId(), CB2_LoadMap); + break; + } + + DestroyTask(taskId); + gSpecialVar_Result = 1; + ScriptContext2_Disable(); +} + +void sub_8117900(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + u16 *sendBuff = (u16*)(gBlockSendBuffer); + + switch (data[0]) + { + case 0: + gSpecialVar_Result = 1; + EnableBothScriptContexts(); + data[0]++; + break; + case 1: + if (!ScriptContext1_IsScriptSetUp()) + { + FadeScreen(FADE_TO_BLACK, 0); + data[0]++; + } + break; + case 2: + if (!gPaletteFade.active) + { + sub_800AB9C(); + data[0]++; + } + break; + case 3: + if (IsLinkTaskFinished()) + { + DestroyTask(taskId); + sub_81179A4(); + } + break; + } +} + +void sub_8117990(void) +{ + CreateTask(sub_8117900, 0); +} + +void sub_81179A4(void) +{ + u8 taskId = CreateTask(sub_81175BC, 0); + gTasks[taskId].data[0] = 0; +} + +void MEvent_CreateTask_Leader(u32 arg0) +{ + u8 taskId; + struct UnkStruct_Leader *dataPtr; + + taskId = CreateTask(sub_8117A0C, 0); + gUnknown_203B05C.leader = dataPtr = (void*)(gTasks[taskId].data); + + dataPtr->state = 0; + dataPtr->textState = 0; + dataPtr->field_18 = arg0; + gSpecialVar_Result = 0; +} + +void sub_8117A0C(u8 taskId) +{ + struct UnkStruct_Leader *data = gUnknown_203B05C.leader; + struct WindowTemplate winTemplate; + s32 val; + + switch (data->state) + { + case 0: + gUnknown_203B058 = data->field_18; + gUnknown_203B059 = 2; + sub_80FAF58(data->field_18, 0, 0); + sub_80FAF74(FALSE, FALSE); + sub_800B1F4(); + OpenLink(); + sub_80FBB8C(2); + data->state = 1; + break; + case 1: + data->field_4 = AllocZeroed(0x70); + data->field_0 = AllocZeroed(0xA0); + data->field_8 = AllocZeroed(0xA0); + sub_811A650(data->field_4, 4); + sub_811A5E4(data->field_0->arr, 5); + LinkRfu3_SetGnameUnameFromStaticBuffers(&data->field_0->arr[0].unk.field_0, data->field_0->arr[0].unk.playerName); + data->field_0->arr[0].field_18 = 0; + data->field_0->arr[0].field_1A_0 = 1; + data->field_0->arr[0].field_1A_1 = 0; + data->field_0->arr[0].field_1B = 0; + data->field_17 = sub_811A054(data->field_4, 0xFF); + + winTemplate = gUnknown_8456CFC; + winTemplate.baseBlock = GetMysteryGiftBaseBlock(); + data->listWindowId = AddWindow(&winTemplate); + MG_DrawTextBorder(data->listWindowId); + gMultiuseListMenuTemplate = gUnknown_8456D34; + gMultiuseListMenuTemplate.windowId = data->listWindowId; + data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); + + CopyBgTilemapBufferToVram(0); + data->field_13 = 1; + data->state = 2; + break; + case 2: + StringCopy(gStringVar1, gUnknown_8456C74[gUnknown_203B058]); + sub_811599C(gStringVar4, gUnknown_203B058); + data->state = 3; + break; + case 3: + AddTextPrinterToWindow1(gStringVar4); + data->state = 4; + break; + case 4: + sub_8116444(data, 5, 6); + if (gMain.newKeys & B_BUTTON) + { + data->state = 13; + DestroyWirelessStatusIndicatorSprite(); + } + break; + case 6: + if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gUnknown_84577F8)) + { + data->field_13 = sub_81165E8(data->field_0); + RedrawListMenu(data->listTaskId); + data->state = 2; + } + break; + case 5: + data->state = 7; + break; + case 7: + switch (mevent_message_print_and_prompt_yes_no(&data->textState, (u16 *)&data->field_14, FALSE, gStringVar4)) + { + case 0: + LoadWirelessStatusIndicatorSpriteGfx(); + CreateWirelessStatusIndicatorSprite(0, 0); + data->field_0->arr[data->field_13].field_1B = 0; + RedrawListMenu(data->listTaskId); + data->field_19 = 5; + sub_80FA670(5, sub_8118658(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName); + data->state = 8; + break; + case 1: + case -1: + data->field_19 = 6; + sub_80FA670(6, sub_8118658(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName); + data->state = 8; + break; + } + break; + case 8: + val = sub_80FA6FC(sub_8118658(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName); + if (val == 1) + { + if (data->field_19 == 5) + { + data->field_0->arr[data->field_13].field_1B = 0; + RedrawListMenu(data->listTaskId); + data->field_13++; + sub_8018404(gStringVar1, data->field_0->arr[data->field_13 - 1]); + StringExpandPlaceholders(gStringVar4, gUnknown_8457554); + data->state = 9; + sub_80F8F5C(); + } + else + { + sub_80FBD4C(data->field_0->arr[data->field_13].unk.playerName, sub_8118658(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId)); + data->field_0->arr[data->field_13].field_1A_0 = 0; + sub_81165E8(data->field_0); + RedrawListMenu(data->listTaskId); + data->state = 2; + } + + data->field_19 = 0; + } + else if (val == 2) + { + sub_80FB9E4(0, 0); + data->state = 2; + } + break; + case 9: + AddTextPrinterToWindow1(gStringVar4); + data->state = 10; + break; + case 10: + if (++data->field_E > 120) + data->state = 11; + break; + case 11: + if (!sub_8116444(data, 5, 6)) + data->state = 12; + break; + case 12: + if (sub_80F8F40()) + { + sub_80F8F7C(FALSE); + data->state = 15; + } + else + { + data->state = 6; + } + break; + case 13: + DestroyWirelessStatusIndicatorSprite(); + sub_80F8DC0(); + DestroyListMenuTask(data->listTaskId, 0, 0); + CopyBgTilemapBufferToVram(0); + RemoveWindow(data->listWindowId); + DestroyTask(data->field_17); + Free(data->field_8); + Free(data->field_0); + Free(data->field_4); + data->state++; + break; + case 14: + if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gUnknown_84571B8)) + { + DestroyTask(taskId); + gSpecialVar_Result = 5; + } + break; + case 15: + if (sub_80FB9F4() == 1 || sub_80FB9F4() == 2) + { + data->state = 13; + } + else if (gReceivedRemoteLinkPlayers != 0) + { + sub_80FAFE0(1); + data->state++; + } + break; + case 16: + DestroyListMenuTask(data->listTaskId, 0, 0); + CopyBgTilemapBufferToVram(0); + RemoveWindow(data->listWindowId); + DestroyTask(data->field_17); + Free(data->field_8); + Free(data->field_0); + Free(data->field_4); + sub_800AB9C(); + data->state++; + break; + case 17: + if (IsLinkTaskFinished()) + DestroyTask(taskId); + break; + } +} |