diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/oak_speech.c | 2 | ||||
-rw-r--r-- | src/trade.c | 810 |
2 files changed, 695 insertions, 117 deletions
diff --git a/src/oak_speech.c b/src/oak_speech.c index c39ff262e..3f946e13f 100644 --- a/src/oak_speech.c +++ b/src/oak_speech.c @@ -977,7 +977,7 @@ static void Task_OakSpeech15(u8 taskId) { ClearDialogWindowAndFrame(0, 1); spriteId = gTasks[taskId].data[4]; - gTasks[taskId].data[6] = sub_804BB98(spriteId, gSprites[spriteId].oam.paletteNum, 0x64, 0x42, 0, 0, 32, 0xFFFF1F3F); + gTasks[taskId].data[6] = CreateTradePokeballSprite(spriteId, gSprites[spriteId].oam.paletteNum, 0x64, 0x42, 0, 0, 32, 0xFFFF1F3F); gTasks[taskId].data[3] = 48; gTasks[taskId].data[0] = 64; gTasks[taskId].func = Task_OakSpeech16; diff --git a/src/trade.c b/src/trade.c index 19f6e47f6..a21781753 100644 --- a/src/trade.c +++ b/src/trade.c @@ -9,11 +9,13 @@ #include "window.h" #include "librfu.h" #include "text_window.h" +#include "evolution_scene.h" #include "pokemon_icon.h" #include "pokedex.h" #include "mail_data.h" #include "graphics.h" #include "link.h" +#include "help_system.h" #include "link_rfu.h" #include "cable_club.h" #include "data.h" @@ -23,6 +25,7 @@ #include "menu.h" #include "overworld.h" #include "battle_anim.h" +#include "pokeball.h" #include "party_menu.h" #include "util.h" #include "daycare.h" @@ -37,6 +40,22 @@ #include "constants/songs.h" #include "constants/moves.h" +struct InGameTrade { + /*0x00*/ u8 nickname[POKEMON_NAME_LENGTH + 1]; + /*0x0C*/ u16 species; + /*0x0E*/ u8 ivs[NUM_STATS]; + /*0x14*/ u8 abilityNum; + /*0x18*/ u32 otId; + /*0x1C*/ u8 conditions[5]; + /*0x24*/ u32 personality; + /*0x28*/ u16 heldItem; + /*0x2A*/ u8 mailNum; + /*0x2B*/ u8 otName[11]; + /*0x36*/ u8 otGender; + /*0x37*/ u8 sheen; + /*0x38*/ u16 requestedSpecies; +}; + struct TradeMenuResources { /*0x0000*/ u8 unk_0; @@ -80,7 +99,7 @@ struct TradeMenuResources struct TradeAnimationResources { /*0x00*/ struct Pokemon mon; /*0x64*/ u32 timer; - /*0x68*/ u32 unk_68[2]; + /*0x68*/ u32 monPersonalities[2]; /*0x70*/ u8 filler_70[2]; /*0x72*/ u8 unk_72; /*0x73*/ u8 unk_73; @@ -96,7 +115,7 @@ struct TradeAnimationResources { /*0x93*/ u8 unk_93; /*0x94*/ u16 state; /*0x96*/ u8 filler_96[0xD2 - 0x96]; - /*0xD2*/ u8 unk_D2; + /*0xD2*/ u8 pokeballSpriteId; /*0xD3*/ u8 unk_D3; /*0xD4*/ u16 unk_D4; /*0xD6*/ u16 unk_D6; @@ -108,18 +127,17 @@ struct TradeAnimationResources { /*0xE2*/ s16 bg1hofs; /*0xE4*/ s16 bg2vofs; /*0xE6*/ s16 bg2hofs; - /*0xE8*/ u16 unk_E8; + /*0xE8*/ u16 sXY; /*0xEA*/ u16 unk_EA; /*0xEC*/ u16 unk_EC; /*0xEE*/ bool8 isLinkTrade; /*0xF0*/ u16 tradeSpecies[2]; /*0xF4*/ u16 cachedMapMusic; /*0xF6*/ u8 unk_F6; - /*0xF8*/ u16 unk_F8; - /*0xFA*/ u16 unk_FA; + /*0xF8*/ u16 monSpecies[2]; /*0xFC*/ u8 unk_FC[7]; /*0x103*/ u8 filler_103[5]; - /*0x108*/ u8 unk_108; + /*0x108*/ u8 isCableTrade; /*0x109*/ u8 filler_109[7]; }; @@ -141,9 +159,9 @@ IWRAM_DATA vu16 gUnknown_3000E78; EWRAM_DATA u8 *gUnknown_2031C90 = NULL; EWRAM_DATA u8 *gUnknown_2031C94[14] = {}; EWRAM_DATA struct MailStruct gLinkPartnerMail[6] = {}; -EWRAM_DATA u8 gUnknown_2031DA4[2] = {0}; +EWRAM_DATA u8 gSelectedTradeMonPositions[2] = {0}; EWRAM_DATA struct TradeMenuResources * sTradeMenuResourcesPtr = NULL; -EWRAM_DATA struct TradeAnimationResources * sTradeAnimationResourcesPtr = NULL; +EWRAM_DATA struct TradeAnimationResources * sTradeData = NULL; void sub_804C728(void); void sub_804D4F8(void); @@ -177,12 +195,19 @@ void sub_805049C(void); void sub_80504B0(void); void TradeAnimInit_LoadGfx(void); void CB2_RunTradeAnim_InGameTrade(void); -void sub_8050968(u8 idx); +void SetTradeSequenceBgGpuRegs(u8 idx); void sub_8050DE0(void); void sub_8050E24(void); -void sub_8050F14(void); +u8 sub_8050F14(void); +u8 sub_8050F3C(void); +u8 sub_805232C(void); void CB2_RunTradeAnim_LinkTrade(void); void LoadHeldItemIcons(void); +void DrawTextOnTradeWindow(u8 windowId, const u8 *str, s8 speed); +void CheckPartnersMonForRibbons(void); +void BufferInGameTradeMonName(void); +void SpriteCB_TradePokeball_Outbound(struct Sprite * sprite); +void SpriteCB_TradePokeball_Inbound(struct Sprite * sprite); extern const u16 gUnknown_8260C30[]; extern const u16 gUnknown_8261430[]; @@ -224,6 +249,19 @@ extern const u16 gUnknown_826985C[]; extern const u16 gUnknown_826995C[]; extern const u32 gWirelessSignal4bpp[]; extern const u32 gUnknown_826C60C[]; +extern const struct SpriteSheet gUnknown_826CE2C; +extern const struct SpriteSheet gUnknown_826CE7C; +extern const struct SpriteSheet gUnknown_826CEB0; +extern const struct SpriteSheet gUnknown_826CF28; +extern const struct SpritePalette gUnknown_826CE34; +extern const struct SpritePalette gUnknown_826CE3C; +extern const struct InGameTrade gIngameTrades[]; +extern const struct SpriteTemplate sTradePokeballSpriteTemplate; +extern const struct SpriteTemplate gUnknown_826CF30; +extern const struct SpriteTemplate sGameLinkCableEndSpriteTemplate; +extern const struct SpriteTemplate gUnknown_826CE44; +extern const struct SpriteTemplate sGlowBallSpriteTemplate; +extern const union AffineAnimCmd *const gUnknown_826CF88[]; void sub_804C600(void) { @@ -2353,8 +2391,8 @@ void sub_804D548(void) { if (!gPaletteFade.active) { - gUnknown_2031DA4[0] = sTradeMenuResourcesPtr->tradeMenuCursorPosition; - gUnknown_2031DA4[1] = sTradeMenuResourcesPtr->unk_7E; + gSelectedTradeMonPositions[0] = sTradeMenuResourcesPtr->tradeMenuCursorPosition; + gSelectedTradeMonPositions[1] = sTradeMenuResourcesPtr->unk_7E; if (gWirelessCommType != 0) { sTradeMenuResourcesPtr->unk_6F = 16; @@ -4108,10 +4146,10 @@ void sub_804FE00(struct Sprite * sprite) } } -void TradeAnim_UpdateBgAffine(void) +void SetTradeBGAffine(void) { struct BgAffineDstData affine; - DoBgAffineSet(&affine, sTradeAnimationResourcesPtr->unk_D4 * 0x100, sTradeAnimationResourcesPtr->unk_D6 * 0x100, sTradeAnimationResourcesPtr->unk_DC, sTradeAnimationResourcesPtr->unk_DE, sTradeAnimationResourcesPtr->unk_E8, sTradeAnimationResourcesPtr->unk_E8, sTradeAnimationResourcesPtr->unk_EC); + DoBgAffineSet(&affine, sTradeData->unk_D4 * 0x100, sTradeData->unk_D6 * 0x100, sTradeData->unk_DC, sTradeData->unk_DE, sTradeData->sXY, sTradeData->sXY, sTradeData->unk_EC); SetGpuReg(REG_OFFSET_BG2PA, affine.pa); SetGpuReg(REG_OFFSET_BG2PB, affine.pb); SetGpuReg(REG_OFFSET_BG2PC, affine.pc); @@ -4124,18 +4162,18 @@ static void TradeAnim_UpdateBgRegs(void) { u16 dispcnt; - SetGpuReg(REG_OFFSET_BG1VOFS, sTradeAnimationResourcesPtr->bg1vofs); - SetGpuReg(REG_OFFSET_BG1HOFS, sTradeAnimationResourcesPtr->bg1hofs); + SetGpuReg(REG_OFFSET_BG1VOFS, sTradeData->bg1vofs); + SetGpuReg(REG_OFFSET_BG1HOFS, sTradeData->bg1hofs); dispcnt = GetGpuReg(REG_OFFSET_DISPCNT); if ((dispcnt & 7) == DISPCNT_MODE_0) { - SetGpuReg(REG_OFFSET_BG2VOFS, sTradeAnimationResourcesPtr->bg2vofs); - SetGpuReg(REG_OFFSET_BG2HOFS, sTradeAnimationResourcesPtr->bg2hofs); + SetGpuReg(REG_OFFSET_BG2VOFS, sTradeData->bg2vofs); + SetGpuReg(REG_OFFSET_BG2HOFS, sTradeData->bg2hofs); } else { - TradeAnim_UpdateBgAffine(); + SetTradeBGAffine(); } } @@ -4149,28 +4187,28 @@ static void VBlankCB_TradeAnim(void) void sub_804FF24(void) { - sTradeAnimationResourcesPtr->unk_8A = 0; - sTradeAnimationResourcesPtr->unk_88 = 0; - sTradeAnimationResourcesPtr->unk_89 = 0; + sTradeData->unk_8A = 0; + sTradeData->unk_88 = 0; + sTradeData->unk_89 = 0; } void sub_804FF4C(void) { - if (sTradeAnimationResourcesPtr->unk_88 == sTradeAnimationResourcesPtr->unk_89) - sTradeAnimationResourcesPtr->unk_8A++; + if (sTradeData->unk_88 == sTradeData->unk_89) + sTradeData->unk_8A++; else - sTradeAnimationResourcesPtr->unk_8A = 0; + sTradeData->unk_8A = 0; - if (sTradeAnimationResourcesPtr->unk_8A > 300) + if (sTradeData->unk_8A > 300) { CloseLink(); SetMainCallback2(CB2_LinkError); - sTradeAnimationResourcesPtr->unk_8A = 0; - sTradeAnimationResourcesPtr->unk_89 = 0; - sTradeAnimationResourcesPtr->unk_88 = 0; + sTradeData->unk_8A = 0; + sTradeData->unk_89 = 0; + sTradeData->unk_88 = 0; } - sTradeAnimationResourcesPtr->unk_89 = sTradeAnimationResourcesPtr->unk_88; + sTradeData->unk_89 = sTradeData->unk_88; } u32 sub_804FFC4(void) @@ -4189,13 +4227,13 @@ void sub_804FFE4(u8 whichParty, u8 a1) if (whichParty == 0) { - mon = &gPlayerParty[gUnknown_2031DA4[0]]; + mon = &gPlayerParty[gSelectedTradeMonPositions[0]]; pos = 1; } if (whichParty == 1) { - mon = &gEnemyParty[gUnknown_2031DA4[1] % PARTY_SIZE]; + mon = &gEnemyParty[gSelectedTradeMonPositions[1] % PARTY_SIZE]; pos = 3; } @@ -4211,14 +4249,14 @@ void sub_804FFE4(u8 whichParty, u8 a1) HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[whichParty * 2 + 1], species, personality); LoadCompressedSpritePalette(GetMonSpritePalStruct(mon)); - sTradeAnimationResourcesPtr->tradeSpecies[whichParty] = species; - sTradeAnimationResourcesPtr->unk_68[whichParty] = personality; + sTradeData->tradeSpecies[whichParty] = species; + sTradeData->monPersonalities[whichParty] = personality; break; case 1: SetMultiuseSpriteTemplateToPokemon(GetMonSpritePalStruct(mon)->tag, pos); - sTradeAnimationResourcesPtr->pokePicSpriteIdxs[whichParty] = CreateSprite(&gMultiuseSpriteTemplate, 120, 60, 6); - gSprites[sTradeAnimationResourcesPtr->pokePicSpriteIdxs[whichParty]].invisible = TRUE; - gSprites[sTradeAnimationResourcesPtr->pokePicSpriteIdxs[whichParty]].callback = SpriteCallbackDummy; + sTradeData->pokePicSpriteIdxs[whichParty] = CreateSprite(&gMultiuseSpriteTemplate, 120, 60, 6); + gSprites[sTradeData->pokePicSpriteIdxs[whichParty]].invisible = TRUE; + gSprites[sTradeData->pokePicSpriteIdxs[whichParty]].callback = SpriteCallbackDummy; break; } } @@ -4233,7 +4271,7 @@ void CB2_InitTradeAnim_LinkTrade(void) gLinkType = 0x1144; CloseLink(); } - sTradeAnimationResourcesPtr = AllocZeroed(sizeof(struct TradeAnimationResources)); + sTradeData = AllocZeroed(sizeof(struct TradeAnimationResources)); AllocateMonSpritesGfx(); ResetTasks(); ResetSpriteData(); @@ -4242,25 +4280,25 @@ void CB2_InitTradeAnim_LinkTrade(void) TradeAnimInit_LoadGfx(); sub_804FF24(); gMain.state++; - sTradeAnimationResourcesPtr->unk_8C = 0; - sTradeAnimationResourcesPtr->state = 0; - sTradeAnimationResourcesPtr->isLinkTrade = TRUE; - sTradeAnimationResourcesPtr->unk_D4 = 64; - sTradeAnimationResourcesPtr->unk_D6 = 64; - sTradeAnimationResourcesPtr->unk_D8 = 0; - sTradeAnimationResourcesPtr->unk_DA = 0; - sTradeAnimationResourcesPtr->unk_DC = 120; - sTradeAnimationResourcesPtr->unk_DE = 80; - sTradeAnimationResourcesPtr->unk_E8 = 256; - sTradeAnimationResourcesPtr->unk_EC = 0; + sTradeData->unk_8C = 0; + sTradeData->state = 0; + sTradeData->isLinkTrade = TRUE; + sTradeData->unk_D4 = 64; + sTradeData->unk_D6 = 64; + sTradeData->unk_D8 = 0; + sTradeData->unk_DA = 0; + sTradeData->unk_DC = 120; + sTradeData->unk_DE = 80; + sTradeData->sXY = 256; + sTradeData->unk_EC = 0; break; case 1: if (!gReceivedRemoteLinkPlayers) { - sTradeAnimationResourcesPtr->unk_108 = TRUE; + sTradeData->isCableTrade = TRUE; OpenLink(); gMain.state++; - sTradeAnimationResourcesPtr->timer = 0; + sTradeData->timer = 0; } else { @@ -4268,10 +4306,10 @@ void CB2_InitTradeAnim_LinkTrade(void) } break; case 2: - sTradeAnimationResourcesPtr->timer++; - if (sTradeAnimationResourcesPtr->timer > 60) + sTradeData->timer++; + if (sTradeData->timer > 60) { - sTradeAnimationResourcesPtr->timer = 0; + sTradeData->timer = 0; gMain.state++; } break; @@ -4280,8 +4318,8 @@ void CB2_InitTradeAnim_LinkTrade(void) { if (GetLinkPlayerCount_2() >= GetSavedPlayerCount()) { - sTradeAnimationResourcesPtr->timer++; - if (sTradeAnimationResourcesPtr->timer > 30) + sTradeData->timer++; + if (sTradeData->timer > 30) { CheckShouldAdvanceLinkState(); gMain.state++; @@ -4305,9 +4343,9 @@ void CB2_InitTradeAnim_LinkTrade(void) } break; case 5: - sTradeAnimationResourcesPtr->unk_72 = 0; - sTradeAnimationResourcesPtr->unk_73 = 0; - sTradeAnimationResourcesPtr->unk_93 = 0; + sTradeData->unk_72 = 0; + sTradeData->unk_73 = 0; + sTradeData->unk_93 = 0; sub_804FFE4(0, 0); gMain.state++; break; @@ -4333,9 +4371,9 @@ void CB2_InitTradeAnim_LinkTrade(void) case 10: BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); ShowBg(0); - sTradeAnimationResourcesPtr->unk_F8 = GetMonData(&gPlayerParty[gUnknown_2031DA4[0]], MON_DATA_SPECIES2); - sTradeAnimationResourcesPtr->unk_FA = GetMonData(&gEnemyParty[gUnknown_2031DA4[1] % 6], MON_DATA_SPECIES2); - memcpy(sTradeAnimationResourcesPtr->unk_FC, gLinkPlayers[GetMultiplayerId() ^ 1].name, 7); + sTradeData->monSpecies[0] = GetMonData(&gPlayerParty[gSelectedTradeMonPositions[0]], MON_DATA_SPECIES2); + sTradeData->monSpecies[1] = GetMonData(&gEnemyParty[gSelectedTradeMonPositions[1] % 6], MON_DATA_SPECIES2); + memcpy(sTradeData->unk_FC, gLinkPlayers[GetMultiplayerId() ^ 1].name, 7); gMain.state++; break; case 11: @@ -4364,8 +4402,8 @@ void CB2_InitTradeAnim_LinkTrade(void) void sub_805049C(void) { - sub_8050968(5); - sub_8050968(0); + SetTradeSequenceBgGpuRegs(5); + SetTradeSequenceBgGpuRegs(0); } void sub_80504B0(void) @@ -4406,30 +4444,30 @@ void CB2_InitTradeAnim_InGameTrade(void) switch (gMain.state) { case 0: - gUnknown_2031DA4[0] = gSpecialVar_0x8005; - gUnknown_2031DA4[1] = 6; + gSelectedTradeMonPositions[0] = gSpecialVar_0x8005; + gSelectedTradeMonPositions[1] = 6; StringCopy(gLinkPlayers[0].name, gSaveBlock2Ptr->playerName); GetMonData(&gEnemyParty[0], MON_DATA_OT_NAME, otName); StringCopy(gLinkPlayers[1].name, otName); - sTradeAnimationResourcesPtr = AllocZeroed(sizeof(*sTradeAnimationResourcesPtr)); + sTradeData = AllocZeroed(sizeof(*sTradeData)); AllocateMonSpritesGfx(); ResetTasks(); ResetSpriteData(); FreeAllSpritePalettes(); SetVBlankCallback(VBlankCB_TradeAnim); TradeAnimInit_LoadGfx(); - sTradeAnimationResourcesPtr->isLinkTrade = FALSE; - sTradeAnimationResourcesPtr->unk_8C = 0; - sTradeAnimationResourcesPtr->state = 0; - sTradeAnimationResourcesPtr->unk_D4 = 64; - sTradeAnimationResourcesPtr->unk_D6 = 64; - sTradeAnimationResourcesPtr->unk_D8 = 0; - sTradeAnimationResourcesPtr->unk_DA = 0; - sTradeAnimationResourcesPtr->unk_DC = 120; - sTradeAnimationResourcesPtr->unk_DE = 80; - sTradeAnimationResourcesPtr->unk_E8 = 256; - sTradeAnimationResourcesPtr->unk_EC = 0; - sTradeAnimationResourcesPtr->timer = 0; + sTradeData->isLinkTrade = FALSE; + sTradeData->unk_8C = 0; + sTradeData->state = 0; + sTradeData->unk_D4 = 64; + sTradeData->unk_D6 = 64; + sTradeData->unk_D8 = 0; + sTradeData->unk_DA = 0; + sTradeData->unk_DC = 120; + sTradeData->unk_DE = 80; + sTradeData->sXY = 256; + sTradeData->unk_EC = 0; + sTradeData->timer = 0; gMain.state = 5; break; case 5: @@ -4463,8 +4501,8 @@ void CB2_InitTradeAnim_InGameTrade(void) gMain.state++; break; case 11: - sub_8050968(5); - sub_8050968(0); + SetTradeSequenceBgGpuRegs(5); + SetTradeSequenceBgGpuRegs(0); sub_8050E24(); gMain.state++; break; @@ -4502,7 +4540,7 @@ static void RS_TryEnableNationalPokedex(void) EnableNationalPokedex();*/ } -void Trade_SwapPlayerAndParterMonData(u8 playerPartyIdx, u8 partnerPartyIdx) +void TradeMons(u8 playerPartyIdx, u8 partnerPartyIdx) { u8 friendship; @@ -4518,9 +4556,9 @@ void Trade_SwapPlayerAndParterMonData(u8 playerPartyIdx, u8 partnerPartyIdx) ClearMailStruct(&gSaveBlock1Ptr->mail[playerMail]); // This is where the actual trade happens!! - sTradeAnimationResourcesPtr->mon = *playerMon; + sTradeData->mon = *playerMon; *playerMon = *partnerMon; - *partnerMon = sTradeAnimationResourcesPtr->mon; + *partnerMon = sTradeData->mon; // By default, a Pokemon received from a trade will have 70 Friendship. friendship = 70; @@ -4538,16 +4576,16 @@ void Trade_SwapPlayerAndParterMonData(u8 playerPartyIdx, u8 partnerPartyIdx) void sub_80508F4(void) { - switch (sTradeAnimationResourcesPtr->unk_93) + switch (sTradeData->unk_93) { case 1: if (IsLinkTaskFinished()) { - SendBlock(bitmask_all_link_players_but_self(), sTradeAnimationResourcesPtr->linkData, 20); - sTradeAnimationResourcesPtr->unk_93++; + SendBlock(bitmask_all_link_players_but_self(), sTradeData->linkData, 20); + sTradeData->unk_93++; } case 2: - sTradeAnimationResourcesPtr->unk_93 = 0; + sTradeData->unk_93 = 0; break; } } @@ -4562,13 +4600,13 @@ void CB2_RunTradeAnim_InGameTrade(void) UpdatePaletteFade(); } -void sub_8050968(u8 state) +void SetTradeSequenceBgGpuRegs(u8 state) { switch (state) { case 0: - sTradeAnimationResourcesPtr->bg2vofs = 0; - sTradeAnimationResourcesPtr->bg2hofs = 0xB4; + sTradeData->bg2vofs = 0; + sTradeData->bg2hofs = 0xB4; SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT512x256); LoadPalette(gTradeGba2_Pal, 0x10, 0x60); @@ -4576,12 +4614,12 @@ void sub_8050968(u8 state) DmaCopy16Defvars(3, gUnknown_826601C, (void *)BG_SCREEN_ADDR(18), 0x1000); break; case 1: - sTradeAnimationResourcesPtr->bg1hofs = 0; - sTradeAnimationResourcesPtr->bg1vofs = 0x15C; + sTradeData->bg1hofs = 0; + sTradeData->bg1vofs = 0x15C; SetGpuReg(REG_OFFSET_BG1VOFS, 0x15C); SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(5) | BGCNT_TXT256x512); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT256x512); - if (sTradeAnimationResourcesPtr->unk_108) + if (sTradeData->isCableTrade) { DmaCopy16Defvars(3, gUnknown_826AA5C, (void *)BG_SCREEN_ADDR(5), 0x1000); } @@ -4593,9 +4631,9 @@ void sub_8050968(u8 state) SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); break; case 2: - sTradeAnimationResourcesPtr->bg1vofs = 0; - sTradeAnimationResourcesPtr->bg1hofs = 0; - if (sTradeAnimationResourcesPtr->unk_108 == FALSE) + sTradeData->bg1vofs = 0; + sTradeData->bg1hofs = 0; + if (sTradeData->isCableTrade == FALSE) { SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); LZ77UnCompVram(gUnknown_3379A0Bin, (void *)BG_SCREEN_ADDR(5)); @@ -4612,19 +4650,19 @@ void sub_8050968(u8 state) LoadPalette(gUnknown_826BF5C, 0x30, 0x20); LZ77UnCompVram(gWirelessSignal4bpp, BG_CHAR_ADDR(1)); LZ77UnCompVram(gUnknown_826C60C, BG_SCREEN_ADDR(18)); - sTradeAnimationResourcesPtr->bg2vofs = 0x50; + sTradeData->bg2vofs = 0x50; SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); break; case 4: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_256COLOR | BGCNT_SCREENBASE(18) | BGCNT_AFF128x128); - sTradeAnimationResourcesPtr->unk_D4 = 0x40; - sTradeAnimationResourcesPtr->unk_D6 = 0x5C; - sTradeAnimationResourcesPtr->unk_E8 = 0x20; - sTradeAnimationResourcesPtr->unk_EA = 0x400; - sTradeAnimationResourcesPtr->unk_EC = 0; + sTradeData->unk_D4 = 0x40; + sTradeData->unk_D6 = 0x5C; + sTradeData->sXY = 0x20; + sTradeData->unk_EA = 0x400; + sTradeData->unk_EC = 0; DmaCopyLarge16(3, gUnknown_826701C, (void *)BG_CHAR_ADDR(1), 0x2840, 0x1000); - if (sTradeAnimationResourcesPtr->unk_108) + if (sTradeData->isCableTrade) { DmaCopy16Defvars(3, gUnknown_826985C, (void *)BG_SCREEN_ADDR(18), 0x100); } @@ -4634,21 +4672,21 @@ void sub_8050968(u8 state) } break; case 5: - sTradeAnimationResourcesPtr->bg1vofs = 0; - sTradeAnimationResourcesPtr->bg1hofs = 0; + sTradeData->bg1vofs = 0; + sTradeData->bg1hofs = 0; break; case 6: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_256COLOR | BGCNT_SCREENBASE(18) | BGCNT_TXT256x256); - sTradeAnimationResourcesPtr->unk_D4 = 0x40; - sTradeAnimationResourcesPtr->unk_D6 = 0x5C; - sTradeAnimationResourcesPtr->unk_E8 = 0x100; - sTradeAnimationResourcesPtr->unk_EA = 0x80; - sTradeAnimationResourcesPtr->unk_DC = 0x78; - sTradeAnimationResourcesPtr->unk_DE = 0x50; - sTradeAnimationResourcesPtr->unk_EC = 0; + sTradeData->unk_D4 = 0x40; + sTradeData->unk_D6 = 0x5C; + sTradeData->sXY = 0x100; + sTradeData->unk_EA = 0x80; + sTradeData->unk_DC = 0x78; + sTradeData->unk_DE = 0x50; + sTradeData->unk_EC = 0; DmaCopyLarge16(3, gUnknown_826701C, BG_CHAR_ADDR(1), 0x2840, 0x1000); - if (sTradeAnimationResourcesPtr->unk_108) + if (sTradeData->isCableTrade) { DmaCopy16Defvars(3, gUnknown_826985C, (void *)BG_SCREEN_ADDR(18), 0x100); } @@ -4658,8 +4696,8 @@ void sub_8050968(u8 state) } break; case 7: - sTradeAnimationResourcesPtr->bg2vofs = 0; - sTradeAnimationResourcesPtr->bg2hofs = 0; + sTradeData->bg2vofs = 0; + sTradeData->bg2hofs = 0; SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT512x256); LoadPalette(gTradeGba2_Pal, 0x10, 0x60); @@ -4668,3 +4706,543 @@ void sub_8050968(u8 state) break; } } + +void sub_8050DE0(void) +{ + LoadSpriteSheet(&gUnknown_826CE2C); + LoadSpriteSheet(&gUnknown_826CE7C); + LoadSpriteSheet(&gUnknown_826CEB0); + LoadSpriteSheet(&gUnknown_826CF28); + LoadSpritePalette(&gUnknown_826CE34); + LoadSpritePalette(&gUnknown_826CE3C); +} + +void sub_8050E24(void) +{ + u8 nickname[20]; + u8 mpId; + const struct InGameTrade * inGameTrade; + if (sTradeData->isLinkTrade) + { + mpId = GetMultiplayerId(); + StringCopy(gStringVar1, gLinkPlayers[mpId ^ 1].name); + GetMonData(&gEnemyParty[gSelectedTradeMonPositions[1] % 6], MON_DATA_NICKNAME, nickname); + StringCopy10(gStringVar3, nickname); + GetMonData(&gPlayerParty[gSelectedTradeMonPositions[0]], MON_DATA_NICKNAME, nickname); + StringCopy10(gStringVar2, nickname); + } + else + { + inGameTrade = &gIngameTrades[gSpecialVar_0x8004]; + StringCopy(gStringVar1, inGameTrade->otName); + StringCopy10(gStringVar3, inGameTrade->nickname); + GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_NICKNAME, nickname); + StringCopy10(gStringVar2, nickname); + } +} + +bool8 sub_8050F14(void) +{ + if (sTradeData->isCableTrade) + return sub_8050F3C(); + else + return sub_805232C(); +} + + +bool8 sub_8050F3C(void) +{ + u16 evoTarget; + + switch (sTradeData->state) + { + case 0: + gSprites[sTradeData->pokePicSpriteIdxs[0]].invisible = FALSE; + gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.x = -180; + gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y = gMonFrontPicCoords[sTradeData->tradeSpecies[0]].y_offset; + sTradeData->state++; + sTradeData->cachedMapMusic = GetCurrentMapMusic(); + PlayNewMapMusic(MUS_SHINKA); + break; + case 1: + if (sTradeData->bg2hofs > 0) + { + gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.x += 3; + sTradeData->bg2hofs -= 3; + } + else + { + gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.x = 0; + sTradeData->bg2hofs = 0; + sTradeData->state = 10; + } + break; + case 10: + StringExpandPlaceholders(gStringVar4, gText_XWillBeSentToY); + DrawTextOnTradeWindow(0, gStringVar4, 0); + + if (sTradeData->tradeSpecies[0] != SPECIES_EGG) + { + PlayCry1(sTradeData->tradeSpecies[0], 0); + } + + sTradeData->state = 11; + sTradeData->timer = 0; + break; + case 11: + if (++sTradeData->timer == 80) + { + sTradeData->pokeballSpriteId = CreateTradePokeballSprite(sTradeData->pokePicSpriteIdxs[0], gSprites[sTradeData->pokePicSpriteIdxs[0]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff); + sTradeData->state++; + StringExpandPlaceholders(gStringVar4, gText_ByeByeVar1); + DrawTextOnTradeWindow(0, gStringVar4, 0); + } + break; + case 12: + if (gSprites[sTradeData->pokeballSpriteId].callback == SpriteCallbackDummy) + { + sTradeData->unk_D3 = CreateSprite(&sTradePokeballSpriteTemplate, 120, 32, 0); + gSprites[sTradeData->unk_D3].callback = SpriteCB_TradePokeball_Outbound; + DestroySprite(&gSprites[sTradeData->pokeballSpriteId]); + sTradeData->state++; + } + break; + case 13: + // The game waits here for the sprite to finish its animation sequence. + break; + case 14: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + sTradeData->state = 20; + break; + case 20: + if (!gPaletteFade.active) + { + SetTradeSequenceBgGpuRegs(4); + FillWindowPixelBuffer(0, PIXEL_FILL(15)); + CopyWindowToVram(0, 3); + sTradeData->state++; + } + break; + case 21: + BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); + sTradeData->state++; + break; + case 22: + if (!gPaletteFade.active) + { + sTradeData->state = 23; + } + break; + case 23: + if (sTradeData->unk_EA > 0x100) + { + sTradeData->unk_EA -= 0x34; + } + else + { + SetTradeSequenceBgGpuRegs(1); + sTradeData->unk_EA = 0x80; + sTradeData->state++; + sTradeData->timer = 0; + } + sTradeData->sXY = 0x8000 / sTradeData->unk_EA; + break; + case 24: + if (++sTradeData->timer > 20) + { + SetTradeBGAffine(); + sTradeData->unk_91 = CreateSprite(&gUnknown_826CF30, 120, 80, 0); + sTradeData->state++; + } + break; + case 25: + if (gSprites[sTradeData->unk_91].animEnded) + { + DestroySprite(&gSprites[sTradeData->unk_91]); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | + BLDCNT_TGT2_BG1 | + BLDCNT_TGT2_BG2); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 4)); + sTradeData->state++; + } + break; + case 26: + if (--sTradeData->bg1vofs == 316) + { + sTradeData->state++; + } + if (sTradeData->bg1vofs == 328) + { + sTradeData->unk_92 = CreateSprite(&sGameLinkCableEndSpriteTemplate, 128, 65, 0); + } + break; + case 27: + sTradeData->unk_90 = CreateSprite(&gUnknown_826CE44, 128, 80, 3); + sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 128, 80, 0); + StartSpriteAnim(&gSprites[sTradeData->unk_91], 1); + sTradeData->state++; + break; + case 28: + if ((sTradeData->bg1vofs -= 2) == 166) + { + sTradeData->state = 200; + } + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG1_ON | + DISPCNT_OBJ_ON); + break; + case 200: + gSprites[sTradeData->unk_90].pos1.y -= 2; + gSprites[sTradeData->unk_91].pos1.y -= 2; + if (gSprites[sTradeData->unk_90].pos1.y < -8) + { + sTradeData->state = 29; + } + break; + case 29: + BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); + sTradeData->state = 30; + break; + case 30: + if (!gPaletteFade.active) + { + DestroySprite(&gSprites[sTradeData->unk_90]); + DestroySprite(&gSprites[sTradeData->unk_91]); + SetTradeSequenceBgGpuRegs(2); + sTradeData->state++; + } + break; + case 31: + BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); + sTradeData->unk_90 = CreateSprite(&sGlowBallSpriteTemplate, 111, 170, 0); + sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 129, -10, 0); + sTradeData->state++; + break; + case 32: + if (!gPaletteFade.active) + { + PlaySE(SE_TK_WARPOUT); + sTradeData->state++; + } + gSprites[sTradeData->unk_90].pos2.y -= 3; + gSprites[sTradeData->unk_91].pos2.y += 3; + break; + case 33: + gSprites[sTradeData->unk_90].pos2.y -= 3; + gSprites[sTradeData->unk_91].pos2.y += 3; + if (gSprites[sTradeData->unk_90].pos2.y <= -90) + { + gSprites[sTradeData->unk_90].data[1] = 1; + gSprites[sTradeData->unk_91].data[1] = 1; + sTradeData->state++; + } + break; + case 34: + BlendPalettes(0x1, 16, RGB_WHITEALPHA); + sTradeData->state++; + break; + case 35: + BlendPalettes(0x1, 0, RGB_WHITEALPHA); + sTradeData->state++; + break; + case 36: + BlendPalettes(0x1, 16, RGB_WHITEALPHA); + sTradeData->state++; + break; + case 37: + if (!IsPokeSpriteNotFlipped(sTradeData->tradeSpecies[0])) + { + gSprites[sTradeData->pokePicSpriteIdxs[0]].affineAnims = gUnknown_826CF88; + gSprites[sTradeData->pokePicSpriteIdxs[0]].oam.affineMode = 3; + CalcCenterToCornerVec(&gSprites[sTradeData->pokePicSpriteIdxs[0]], 0, 3, 3); + StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[0]], 0); + } + else + { + StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[0]], 0); + } + StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[1]], 0); + gSprites[sTradeData->pokePicSpriteIdxs[0]].pos1.x = 60; + gSprites[sTradeData->pokePicSpriteIdxs[1]].pos1.x = 180; + gSprites[sTradeData->pokePicSpriteIdxs[0]].pos1.y = 192; + gSprites[sTradeData->pokePicSpriteIdxs[1]].pos1.y = -32; + gSprites[sTradeData->pokePicSpriteIdxs[0]].invisible = FALSE; + gSprites[sTradeData->pokePicSpriteIdxs[1]].invisible = FALSE; + sTradeData->state++; + break; + case 38: + gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y -= 3; + gSprites[sTradeData->pokePicSpriteIdxs[1]].pos2.y += 3; + if (gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y < -160 && gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y >= -163) + { + PlaySE(SE_TK_WARPIN); + } + if (gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y < -222) + { + gSprites[sTradeData->unk_90].data[1] = 0; + gSprites[sTradeData->unk_91].data[1] = 0; + sTradeData->state++; + gSprites[sTradeData->pokePicSpriteIdxs[0]].invisible = TRUE; + gSprites[sTradeData->pokePicSpriteIdxs[1]].invisible = TRUE; + BlendPalettes(0x1, 0, RGB_WHITEALPHA); + } + break; + case 39: + gSprites[sTradeData->unk_90].pos2.y -= 3; + gSprites[sTradeData->unk_91].pos2.y += 3; + if (gSprites[sTradeData->unk_90].pos2.y <= -222) + { + BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); + sTradeData->state++; + DestroySprite(&gSprites[sTradeData->unk_90]); + DestroySprite(&gSprites[sTradeData->unk_91]); + } + break; + case 40: + if (!gPaletteFade.active) + { + sTradeData->state++; + SetTradeSequenceBgGpuRegs(1); + sTradeData->bg1vofs = 166; + sTradeData->unk_90 = CreateSprite(&gUnknown_826CE44, 128, -20, 3); + sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 128, -20, 0); + StartSpriteAnim(&gSprites[sTradeData->unk_91], 1); + } + break; + case 41: + BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); + sTradeData->state++; + break; + case 42: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG1_ON | + DISPCNT_OBJ_ON); + if (!gPaletteFade.active) + { + sTradeData->state++; + } + break; + case 43: + gSprites[sTradeData->unk_90].pos2.y += 3; + gSprites[sTradeData->unk_91].pos2.y += 3; + if (gSprites[sTradeData->unk_90].pos2.y + gSprites[sTradeData->unk_90].pos1.y == 64) + { + sTradeData->state++; + } + break; + case 44: + if ((sTradeData->bg1vofs += 2) > 316) + { + sTradeData->bg1vofs = 316; + sTradeData->state++; + } + break; + case 45: + DestroySprite(&gSprites[sTradeData->unk_90]); + DestroySprite(&gSprites[sTradeData->unk_91]); + sTradeData->state++; + sTradeData->timer = 0; + break; + case 46: + if (++sTradeData->timer == 10) + { + sTradeData->state++; + } + break; + case 47: + if (++sTradeData->bg1vofs > 348) + { + sTradeData->bg1vofs = 348; + sTradeData->state++; + } + if (sTradeData->bg1vofs == 328 && sTradeData->isCableTrade) + { + sTradeData->unk_92 = CreateSprite(&sGameLinkCableEndSpriteTemplate, 128, 65, 0); + gSprites[sTradeData->unk_92].callback = SpriteCB_GameLinkCableEnd_Inbound; + } + break; + case 48: + sTradeData->unk_91 = CreateSprite(&gUnknown_826CF30, 120, 80, 0); + sTradeData->state = 50; + break; + case 50: + if (gSprites[sTradeData->unk_91].animEnded) + { + DestroySprite(&gSprites[sTradeData->unk_91]); + SetTradeSequenceBgGpuRegs(6); + sTradeData->state++; + PlaySE(SE_W028); + } + break; + case 51: + if (sTradeData->unk_EA < 0x400) + { + sTradeData->unk_EA += 0x34; + } + else + { + sTradeData->unk_EA = 0x400; + sTradeData->state++; + } + sTradeData->sXY = 0x8000 / sTradeData->unk_EA; + break; + case 52: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + sTradeData->state = 60; + break; + + case 60: + if (!gPaletteFade.active) + { + SetTradeSequenceBgGpuRegs(5); + SetTradeSequenceBgGpuRegs(7); + gPaletteFade.bufferTransferDisabled = TRUE; + sTradeData->state++; + } + break; + case 61: + gPaletteFade.bufferTransferDisabled = FALSE; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + sTradeData->state++; + break; + case 62: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG2_ON | + DISPCNT_OBJ_ON); + if (!gPaletteFade.active) + { + sTradeData->state++; + } + break; + case 63: + sTradeData->unk_D3 = CreateSprite(&sTradePokeballSpriteTemplate, 120, -8, 0); + gSprites[sTradeData->unk_D3].data[3] = 74; + gSprites[sTradeData->unk_D3].callback = SpriteCB_TradePokeball_Inbound; + StartSpriteAnim(&gSprites[sTradeData->unk_D3], 1); + StartSpriteAffineAnim(&gSprites[sTradeData->unk_D3], 2); + BlendPalettes(1 << (16 + gSprites[sTradeData->unk_D3].oam.paletteNum), 16, RGB_WHITEALPHA); + sTradeData->state++; + sTradeData->timer = 0; + break; + case 64: + BeginNormalPaletteFade(1 << (16 + gSprites[sTradeData->unk_D3].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA); + sTradeData->state++; + break; + case 65: + if (gSprites[sTradeData->unk_D3].callback == SpriteCallbackDummy) + { + HandleLoadSpecialPokePic(&gMonFrontPicTable[sTradeData->tradeSpecies[1]], gMonSpritesGfxPtr->sprites[3], sTradeData->tradeSpecies[1], sTradeData->monPersonalities[1]); + sTradeData->state++; + } + break; + case 66: + gSprites[sTradeData->pokePicSpriteIdxs[1]].pos1.x = 120; + gSprites[sTradeData->pokePicSpriteIdxs[1]].pos1.y = gMonFrontPicCoords[sTradeData->tradeSpecies[1]].y_offset + 60; + gSprites[sTradeData->pokePicSpriteIdxs[1]].pos2.x = 0; + gSprites[sTradeData->pokePicSpriteIdxs[1]].pos2.y = 0; + StartSpriteAnim(&gSprites[sTradeData->pokePicSpriteIdxs[1]], 0); + CreatePokeballSpriteToReleaseMon(sTradeData->pokePicSpriteIdxs[1], gSprites[sTradeData->pokePicSpriteIdxs[1]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF); + FreeSpriteOamMatrix(&gSprites[sTradeData->unk_D3]); + DestroySprite(&gSprites[sTradeData->unk_D3]); + sTradeData->state++; + break; + case 67: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG0_ON | + DISPCNT_BG2_ON | + DISPCNT_OBJ_ON); + StringExpandPlaceholders(gStringVar4, gText_XSentOverY); + DrawTextOnTradeWindow(0, gStringVar4, 0); + sTradeData->state = 167; + sTradeData->timer = 0; + break; + // 167 and 267 are extra cases added in for animations + case 167: + if (++sTradeData->timer > 60) + { + if (sTradeData->tradeSpecies[1] != SPECIES_EGG) + { + PlayCry1(sTradeData->tradeSpecies[1], 0); + } + sTradeData->state = 267; + sTradeData->timer = 0; + } + break; + case 267: + if (IsCryFinished()) + { + sTradeData->state = 68; + } + break; + case 68: + if (++sTradeData->timer == 10) + { + PlayFanfare(MUS_FANFA5); + } + if (sTradeData->timer == 250) + { + sTradeData->state++; + StringExpandPlaceholders(gStringVar4, gText_TakeGoodCareOfX); + DrawTextOnTradeWindow(0, gStringVar4, 0); + sTradeData->timer = 0; + } + break; + case 69: + if (++sTradeData->timer == 60) + { + sTradeData->state++; + } + break; + case 70: + CheckPartnersMonForRibbons(); + sTradeData->state++; + break; + case 71: + if (sTradeData->isLinkTrade) + { + return TRUE; + } + else if (JOY_NEW(A_BUTTON)) + { + sTradeData->state++; + } + break; + case 72: // Only if in-game trade + TradeMons(gSpecialVar_0x8005, 0); + gCB2_AfterEvolution = CB2_RunTradeAnim_InGameTrade; + evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[0]], TRUE, ITEM_NONE); + if (evoTarget != SPECIES_NONE) + { + TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[0]], evoTarget, sTradeData->pokePicSpriteIdxs[1], gSelectedTradeMonPositions[0]); + } + sTradeData->state++; + break; + case 73: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + sTradeData->state++; + break; + case 74: + if (!gPaletteFade.active) + { + PlayNewMapMusic(sTradeData->cachedMapMusic); + if (sTradeData) + { + FreeAllWindowBuffers(); + Free(GetBgTilemapBuffer(3)); + Free(GetBgTilemapBuffer(1)); + Free(GetBgTilemapBuffer(0)); + FreeMonSpritesGfx(); + FREE_AND_SET_NULL(sTradeData); + } + SetMainCallback2(CB2_ReturnToField); + BufferInGameTradeMonName(); + HelpSystem_Enable(); + } + break; + } + return FALSE; +} |