summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/oak_speech.c2
-rw-r--r--src/trade.c810
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;
+}