summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/trade.c913
1 files changed, 754 insertions, 159 deletions
diff --git a/src/trade.c b/src/trade.c
index 4d5edffd7..c996c3348 100644
--- a/src/trade.c
+++ b/src/trade.c
@@ -8,6 +8,7 @@
#include "daycare.h"
#include "decompress.h"
#include "event_data.h"
+#include "evolution_scene.h"
#include "gpu_regs.h"
#include "graphics.h"
#include "international_string_util.h"
@@ -19,11 +20,13 @@
#include "overworld.h"
#include "palette.h"
#include "party_menu.h"
+#include "pokeball.h"
#include "pokedex.h"
#include "pokemon_icon.h"
#include "pokemon_summary_screen.h"
#include "sound.h"
#include "string_util.h"
+#include "strings.h"
#include "task.h"
#include "text.h"
#include "text_window.h"
@@ -31,92 +34,113 @@
#include "trade.h"
#include "util.h"
#include "window.h"
+#include "constants/items.h"
#include "constants/moves.h"
#include "constants/species.h"
#include "constants/songs.h"
#include "constants/rgb.h"
+struct InGameTrade {
+ /*0x00*/ u8 name[11];
+ /*0x0C*/ u16 species;
+ /*0x0E*/ u8 ivs[6];
+ /*0x14*/ bool8 secondAbility;
+ /*0x18*/ u32 otId;
+ /*0x1C*/ u8 stats[5];
+ /*0x24*/ u32 personality;
+ /*0x28*/ u16 heldItem;
+ /*0x2A*/ u8 mailNum;
+ /*0x2B*/ u8 otName[11];
+ /*0x36*/ u8 otGender;
+ /*0x37*/ u8 sheen;
+ /*0x38*/ u16 playerSpecies;
+};
+
extern u8 gUnknown_02022C2C;
extern struct {
- u8 unk_0;
- u8 unk_1;
- u8 filler_2[0x28 - 2];
- u8 unk_28[2][PARTY_SIZE];
- u8 unk_34;
- u8 unk_35;
- u8 unk_36[2];
- u8 unk_38[12];
- u8 unk_44;
- u8 unk_45[2][PARTY_SIZE];
- u8 unk_51[2][PARTY_SIZE];
- u8 unk_5D[PARTY_SIZE];
- u8 unk_63[PARTY_SIZE];
- u8 unk_69;
- u8 filler_6A[0x6F - 0x6A];
- u8 unk_6F;
- u8 unk_70;
- u8 filler_71;
- u16 unk_72;
- u8 unk_74[2];
- u8 unk_76[2];
- u8 unk_78;
- u8 unk_79;
- u8 unk_7A;
- u8 unk_7B;
- u8 filler_7C[0x7E - 0x7C];
- u8 unk_7E;
- u8 filler_7F;
- u16 unk_80[2];
- u8 filler_84[0xA8 - 0x84];
- u8 unk_A8;
- u8 unk_A9[11];
- u8 filler_B4[0x8D0-0xB4];
- struct {
+ /*0x0000*/ u8 unk_0;
+ /*0x0001*/ u8 unk_1;
+ /*0x0002*/ u8 filler_2[0x28 - 2];
+ /*0x0028*/ u8 unk_28[2][PARTY_SIZE];
+ /*0x0034*/ u8 unk_34;
+ /*0x0035*/ u8 unk_35;
+ /*0x0036*/ u8 partyCounts[2];
+ /*0x0038*/ u8 unk_38[12];
+ /*0x0044*/ u8 unk_44;
+ /*0x0045*/ u8 unk_45[2][PARTY_SIZE];
+ /*0x0051*/ u8 unk_51[2][PARTY_SIZE];
+ /*0x005D*/ u8 unk_5D[2][PARTY_SIZE];
+ /*0x0069*/ u8 unk_69;
+ /*0x006A*/ u8 filler_6A[0x6F - 0x6A];
+ /*0x006F*/ u8 unk_6F;
+ /*0x0070*/ u8 unk_70;
+ /*0x0071*/ u8 filler_71;
+ /*0x0072*/ u16 unk_72;
+ /*0x0074*/ u8 unk_74[2];
+ /*0x0076*/ u8 unk_76[2];
+ /*0x0078*/ u8 unk_78;
+ /*0x0079*/ u8 unk_79;
+ /*0x007A*/ u8 unk_7A;
+ /*0x007B*/ u8 unk_7B;
+ /*0x007C*/ u8 filler_7C[0x7E - 0x7C];
+ /*0x007E*/ u8 unk_7E;
+ /*0x007F*/ u8 filler_7F;
+ /*0x0080*/ u16 unk_80[2];
+ /*0x0084*/ u8 filler_84[0xA8 - 0x84];
+ /*0x00A8*/ u8 unk_A8;
+ /*0x00A9*/ u8 unk_A9[11];
+ /*0x00B4*/ u8 filler_B4[0x8D0-0xB4];
+ /*0x08D0*/ struct {
bool8 unk_0;
u16 unk_2;
u8 unk_4;
} unk_8D0[4];
- u16 tilemapBuffer[0x400]; // 8F0
+ /*0x08F0*/ u16 tilemapBuffer[0x400];
} *gUnknown_0203229C;
extern u8 *gUnknown_02032184;
extern u8 *gUnknown_02032188[14];
extern u8 gUnknown_02032298[2];
extern struct {
- struct Pokemon mon;
- u32 unk_64;
- u32 unk_68[2];
- u8 filler_70[2];
- u8 unk_72;
- u8 unk_73;
- u8 unk_74[20];
- u8 unk_88;
- u8 unk_89;
- u16 unk_8A;
- u16 unk_8C;
- u8 unk_8E[2];
- u8 filler_90[3];
- u8 unk_93;
- u16 unk_94;
- u8 filler_96[0xD4 - 0x96];
- u16 unk_D4;
- u16 unk_D6;
- u16 unk_D8;
- u16 unk_DA;
- s16 unk_DC;
- s16 unk_DE;
- u16 unk_E0;
- u16 unk_E2;
- u16 unk_E4;
- u16 unk_E6;
- s16 unk_E8;
- u16 unk_EA;
- u16 unk_EC;
- u8 unk_EE;
- u8 filler_EF;
- u16 unk_F0[2];
- u8 filler_F4[0xFA - 0xF4];
- u8 unk_FA;
- u8 filler_FB[0x100 - 0xFB];
+ /*0x00*/ struct Pokemon mon;
+ /*0x64*/ u32 unk_64;
+ /*0x68*/ u32 unk_68[2];
+ /*0x70*/ u8 filler_70[2];
+ /*0x72*/ u8 unk_72;
+ /*0x73*/ u8 unk_73;
+ /*0x74*/ u8 unk_74[20];
+ /*0x88*/ u8 unk_88;
+ /*0x89*/ u8 unk_89;
+ /*0x8A*/ u16 unk_8A;
+ /*0x8C*/ u16 unk_8C;
+ /*0x8E*/ u8 pokePicSpriteIdxs[2];
+ /*0x90*/ u8 unk_90;
+ /*0x91*/ u8 unk_91;
+ /*0x92*/ u8 unk_92;
+ /*0x93*/ u8 unk_93;
+ /*0x94*/ u16 unk_94;
+ /*0x96*/ u8 filler_96[0xD2 - 0x96];
+ /*0xD2*/ u8 unk_D2;
+ /*0xD3*/ u8 unk_D3;
+ /*0xD4*/ u16 unk_D4;
+ /*0xD6*/ u16 unk_D6;
+ /*0xD8*/ u16 unk_D8;
+ /*0xDA*/ u16 unk_DA;
+ /*0xDC*/ s16 unk_DC;
+ /*0xDE*/ s16 unk_DE;
+ /*0xE0*/ s16 bg1vofs;
+ /*0xE2*/ s16 bg1hofs;
+ /*0xE4*/ s16 bg2vofs;
+ /*0xE6*/ s16 bg2hofs;
+ /*0xE8*/ s16 unk_E8;
+ /*0xEA*/ u16 unk_EA;
+ /*0xEC*/ u16 unk_EC;
+ /*0xEE*/ bool8 isLinkTrade;
+ /*0xEF*/ u8 filler_EF;
+ /*0xF0*/ u16 tradeSpecies[2];
+ /*0xF4*/ u16 unk_F4;
+ /*0xF6*/ u8 filler_F6[0xFA - 0xF6];
+ /*0xFA*/ u8 unk_FA;
+ /*0xFB*/ u8 filler_FB[0x100 - 0xFB];
} *gUnknown_020322A0;
extern u8 gUnknown_0203CF20;
@@ -162,8 +186,24 @@ extern const u32 gUnknown_08338550[];
extern const u8 gUnknown_08332F60[];
extern const u8 gUnknown_083357A0[];
extern const u8 gUnknown_083358A0[];
-
+extern const struct SpriteSheet gUnknown_08338D70;
+extern const struct SpriteSheet gUnknown_08338DC0;
+extern const struct SpriteSheet gUnknown_08338DF4;
+extern const struct SpriteSheet gUnknown_08338E6C;
+extern const struct SpritePalette gUnknown_08338D78;
+extern const struct SpritePalette gUnknown_08338D80;
+extern const struct InGameTrade gIngameTrades[];
+extern const struct SpriteTemplate gSpriteTemplate_8338D28;
+extern const struct SpriteTemplate gSpriteTemplate_8338E74;
+extern const struct SpriteTemplate gSpriteTemplate_8338DFC;
+extern const struct SpriteTemplate gUnknown_08338D88;
+extern const struct SpriteTemplate gSpriteTemplate_8338DC8;
+extern const union AffineAnimCmd *const gSpriteAffineAnimTable_8338ECC[];
+extern const struct SpriteTemplate gSpriteTemplate_8338E74;
+
+// external to this file
extern const struct CompressedSpriteSheet gMonFrontPicTable[];
+extern const struct MonCoords gMonFrontPicCoords[];
bool32 sub_8077260(void);
void sub_80773D0(void);
@@ -202,7 +242,16 @@ void sub_807BAD8(void);
void sub_807EA2C(void);
void sub_807B62C(u8);
void sub_807B60C(void);
-void sub_807BBC8(void);
+u8 sub_807BBC8(void);
+u8 sub_807CFC8(void);
+u8 sub_807BBEC(void);
+void sub_807F1A8(u8, u8 *, u8);
+void sub_807E5D8(struct Sprite *);
+void sub_807AAE0(struct Sprite *);
+void sub_807E6AC(struct Sprite *);
+void sub_807F14C(void);
+void sub_807E784(void);
+void c3_0805465C(u8);
bool8 sub_8077170(const void *a0, u32 a1)
{
@@ -462,10 +511,10 @@ void sub_80773D0(void)
CalculateEnemyPartyCount();
SetGpuReg(REG_OFFSET_DISPCNT, 0);
SetGpuReg(REG_OFFSET_BLDCNT, 0);
- gUnknown_0203229C->unk_36[0] = gPlayerPartyCount;
- gUnknown_0203229C->unk_36[1] = gEnemyPartyCount;
+ gUnknown_0203229C->partyCounts[0] = gPlayerPartyCount;
+ gUnknown_0203229C->partyCounts[1] = gEnemyPartyCount;
- for (i = 0; i < gUnknown_0203229C->unk_36[0]; i++)
+ for (i = 0; i < gUnknown_0203229C->partyCounts[0]; i++)
{
struct Pokemon *mon = &gPlayerParty[i];
gUnknown_0203229C->unk_28[0][i] = CreateMonIcon(GetMonData(mon, MON_DATA_SPECIES2),
@@ -477,7 +526,7 @@ void sub_80773D0(void)
TRUE);
}
- for (i = 0; i < gUnknown_0203229C->unk_36[1]; i++)
+ for (i = 0; i < gUnknown_0203229C->partyCounts[1]; i++)
{
struct Pokemon *mon = &gEnemyParty[i];
gUnknown_0203229C->unk_28[1][i] = CreateMonIcon(GetMonData(mon, MON_DATA_SPECIES2, NULL),
@@ -492,11 +541,11 @@ void sub_80773D0(void)
break;
case 8:
LoadHeldItemIcons();
- sub_81B5D4C(&gUnknown_0203229C->unk_36[0], gUnknown_0203229C->unk_28[0], 0);
+ sub_81B5D4C(&gUnknown_0203229C->partyCounts[0], gUnknown_0203229C->unk_28[0], 0);
gMain.state++;
break;
case 9:
- sub_81B5D4C(&gUnknown_0203229C->unk_36[0], gUnknown_0203229C->unk_28[0], 1);
+ sub_81B5D4C(&gUnknown_0203229C->partyCounts[0], gUnknown_0203229C->unk_28[0], 1);
gMain.state++;
break;
case 10:
@@ -645,13 +694,13 @@ void sub_8077B74(void)
break;
case 7:
CalculateEnemyPartyCount();
- gUnknown_0203229C->unk_36[0] = gPlayerPartyCount;
- gUnknown_0203229C->unk_36[1] = gEnemyPartyCount;
+ gUnknown_0203229C->partyCounts[0] = gPlayerPartyCount;
+ gUnknown_0203229C->partyCounts[1] = gEnemyPartyCount;
ClearWindowTilemap(0);
sub_8079BE0(0);
sub_8079BE0(1);
- for (i = 0; i < gUnknown_0203229C->unk_36[0]; i++)
+ for (i = 0; i < gUnknown_0203229C->partyCounts[0]; i++)
{
struct Pokemon *mon = &gPlayerParty[i];
gUnknown_0203229C->unk_28[0][i] = CreateMonIcon(GetMonData(mon, MON_DATA_SPECIES2, NULL),
@@ -663,7 +712,7 @@ void sub_8077B74(void)
TRUE);
}
- for (i = 0; i < gUnknown_0203229C->unk_36[1]; i++)
+ for (i = 0; i < gUnknown_0203229C->partyCounts[1]; i++)
{
struct Pokemon *mon = &gEnemyParty[i];
gUnknown_0203229C->unk_28[1][i] = CreateMonIcon(GetMonData(mon, MON_DATA_SPECIES2, NULL),
@@ -678,11 +727,11 @@ void sub_8077B74(void)
break;
case 8:
LoadHeldItemIcons();
- sub_81B5D4C(&gUnknown_0203229C->unk_36[0], gUnknown_0203229C->unk_28[0], 0);
+ sub_81B5D4C(&gUnknown_0203229C->partyCounts[0], gUnknown_0203229C->unk_28[0], 0);
gMain.state++;
break;
case 9:
- sub_81B5D4C(&gUnknown_0203229C->unk_36[0], gUnknown_0203229C->unk_28[0], 1);
+ sub_81B5D4C(&gUnknown_0203229C->partyCounts[0], gUnknown_0203229C->unk_28[0], 1);
gMain.state++;
break;
case 10:
@@ -906,7 +955,7 @@ void sub_8078388(void)
for (i = 0; i < PARTY_SIZE; i++)
{
- if (i < gUnknown_0203229C->unk_36[0])
+ if (i < gUnknown_0203229C->partyCounts[0])
{
gSprites[gUnknown_0203229C->unk_28[0][i]].invisible = FALSE;
gUnknown_0203229C->unk_38[i] = TRUE;
@@ -916,7 +965,7 @@ void sub_8078388(void)
gUnknown_0203229C->unk_38[i] = FALSE;
}
- if (i < gUnknown_0203229C->unk_36[1])
+ if (i < gUnknown_0203229C->partyCounts[1])
{
gSprites[gUnknown_0203229C->unk_28[1][i]].invisible = FALSE;
gUnknown_0203229C->unk_38[i + PARTY_SIZE] = TRUE;
@@ -1452,11 +1501,11 @@ void sub_807905C(void)
{
if (gUnknown_0203229C->unk_35 < PARTY_SIZE)
{
- ShowPokemonSummaryScreen(PSS_MODE_UNK1, gPlayerParty, gUnknown_0203229C->unk_35, gUnknown_0203229C->unk_36[0] - 1, sub_8077B74);
+ ShowPokemonSummaryScreen(PSS_MODE_UNK1, gPlayerParty, gUnknown_0203229C->unk_35, gUnknown_0203229C->partyCounts[0] - 1, sub_8077B74);
}
else
{
- ShowPokemonSummaryScreen(PSS_MODE_UNK1, gEnemyParty, gUnknown_0203229C->unk_35 - PARTY_SIZE, gUnknown_0203229C->unk_36[1] - 1, sub_8077B74);
+ ShowPokemonSummaryScreen(PSS_MODE_UNK1, gEnemyParty, gUnknown_0203229C->unk_35 - PARTY_SIZE, gUnknown_0203229C->partyCounts[1] - 1, sub_8077B74);
}
FreeAllWindowBuffers();
}
@@ -1508,12 +1557,12 @@ bool32 sub_8079174(void)
int i;
u8 arr[12];
- for (i = 0; i < gUnknown_0203229C->unk_36[0]; i++)
+ for (i = 0; i < gUnknown_0203229C->partyCounts[0]; i++)
{
arr[i] = gUnknown_0203229C->unk_45[0][i];
}
- switch (sub_80790D4(arr, gUnknown_0203229C->unk_36[0], gUnknown_0203229C->unk_35, gUnknown_0203229C->unk_7E))
+ switch (sub_80790D4(arr, gUnknown_0203229C->partyCounts[0], gUnknown_0203229C->unk_35, gUnknown_0203229C->unk_7E))
{
case 0:
sub_807A048(3, 3);
@@ -1563,7 +1612,7 @@ void sub_807929C(void)
{
int i;
- for (i = 0; i < gUnknown_0203229C->unk_36[1] - 4; i++)
+ for (i = 0; i < gUnknown_0203229C->partyCounts[1] - 4; i++)
{
PutWindowTilemap(i + 12);
CopyWindowToVram(i + 12, 1);
@@ -1793,7 +1842,7 @@ void sub_80796B4(u8 a0)
switch (gUnknown_0203229C->unk_74[a0])
{
case 1:
- for (i = 0; i < gUnknown_0203229C->unk_36[a0]; i++)
+ for (i = 0; i < gUnknown_0203229C->partyCounts[a0]; i++)
{
gSprites[gUnknown_0203229C->unk_28[0][i + (sp60 * 6)]].invisible = TRUE;
}
@@ -1921,7 +1970,7 @@ void sub_8079BE0(u8 a0)
u8 sp14[32];
struct Pokemon *mons = a0 == 0 ? gPlayerParty : gEnemyParty;
- for (i = 0; i < gUnknown_0203229C->unk_36[a0]; i++)
+ for (i = 0; i < gUnknown_0203229C->partyCounts[a0]; i++)
{
GetMonData(&mons[i], MON_DATA_NICKNAME, sp);
StringCopy10(sp14, sp);
@@ -1999,18 +2048,18 @@ extern const u8 gUnknown_0832DE3E[][6][2];
extern const u8 gUnknown_0832DE56[][6][2];
// Very close but loop preamble not working.
#ifdef NONMATCHING
-void sub_8079E44(u8 a0)
+void sub_8079E44(u8 whichParty)
{
int i;
- for (i = 0; i < gUnknown_0203229C->unk_36[a0]; i++)
+ for (i = 0; i < gUnknown_0203229C->partyCounts[whichParty]; i++)
{
- sub_8079C4C(a0, i, gUnknown_0832DE3E[a0][i][0], gUnknown_0832DE3E[a0][i][1], gUnknown_0832DE56[a0][i][0], gUnknown_0832DE56[a0][i][1]);
+ sub_8079C4C(whichParty, i, gUnknown_0832DE3E[whichParty][i][0], gUnknown_0832DE3E[whichParty][i][1], gUnknown_0832DE56[whichParty][i][0], gUnknown_0832DE56[whichParty][i][1]);
}
}
#else
NAKED
-void sub_8079E44(u8 a0)
+void sub_8079E44(u8 whichParty)
{
asm_unified("push {r4-r7,lr}\n\
sub sp, 0x8\n\
@@ -2065,7 +2114,7 @@ void sub_8079EA8(u8 a0)
{
int i;
- for (i = 0; i < gUnknown_0203229C->unk_36[a0]; i++)
+ for (i = 0; i < gUnknown_0203229C->partyCounts[a0]; i++)
{
gSprites[gUnknown_0203229C->unk_28[a0][i]].invisible = FALSE;
gSprites[gUnknown_0203229C->unk_28[a0][i]].pos1.x = gUnknown_0832DE24[(a0 * 6) + i][0] * 8 + 14;
@@ -2238,75 +2287,75 @@ void sub_807A308(const u8 *a0, u8 *a1, u8 unused)
sub_80C6D80(a0, a1, 0, 0, 6);
}
-void sub_807A320(u8 a0)
+void sub_807A320(u8 who)
{
int i;
- switch (a0)
+ switch (who)
{
case 0:
- for (i = 0; i < gUnknown_0203229C->unk_36[a0]; i++)
+ for (i = 0; i < gUnknown_0203229C->partyCounts[who]; i++)
{
if (GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) == TRUE)
{
- gUnknown_0203229C->unk_45[a0][i] = 0;
- gUnknown_0203229C->unk_51[a0][i] = 1;
+ gUnknown_0203229C->unk_45[who][i] = 0;
+ gUnknown_0203229C->unk_51[who][i] = 1;
}
else if (GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0)
{
- gUnknown_0203229C->unk_45[a0][i] = 0;
- gUnknown_0203229C->unk_51[a0][i] = 0;
+ gUnknown_0203229C->unk_45[who][i] = 0;
+ gUnknown_0203229C->unk_51[who][i] = 0;
}
else
{
- gUnknown_0203229C->unk_45[a0][i] = 1;
- gUnknown_0203229C->unk_51[a0][i] = 0;
+ gUnknown_0203229C->unk_45[who][i] = 1;
+ gUnknown_0203229C->unk_51[who][i] = 0;
}
}
break;
case 1:
- for (i = 0; i < gUnknown_0203229C->unk_36[a0]; i++)
+ for (i = 0; i < gUnknown_0203229C->partyCounts[who]; i++)
{
if (GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG) == TRUE)
{
- gUnknown_0203229C->unk_45[a0][i] = 0;
- gUnknown_0203229C->unk_51[a0][i] = 1;
+ gUnknown_0203229C->unk_45[who][i] = 0;
+ gUnknown_0203229C->unk_51[who][i] = 1;
}
else if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0)
{
- gUnknown_0203229C->unk_45[a0][i] = 0;
- gUnknown_0203229C->unk_51[a0][i] = 0;
+ gUnknown_0203229C->unk_45[who][i] = 0;
+ gUnknown_0203229C->unk_51[who][i] = 0;
}
else
{
- gUnknown_0203229C->unk_45[a0][i] = 1;
- gUnknown_0203229C->unk_51[a0][i] = 0;
+ gUnknown_0203229C->unk_45[who][i] = 1;
+ gUnknown_0203229C->unk_51[who][i] = 0;
}
}
break;
}
}
-void sub_807A468(u8 a0)
+void sub_807A468(u8 who)
{
- u16 i, hp, maxHp;
+ u16 i, curHp, maxHp;
- switch (a0)
+ switch (who)
{
case 0:
- for (i = 0; i < gUnknown_0203229C->unk_36[0]; i++)
+ for (i = 0; i < gUnknown_0203229C->partyCounts[0]; i++)
{
- hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);
+ curHp = GetMonData(&gPlayerParty[i], MON_DATA_HP);
maxHp = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP);
- gUnknown_0203229C->unk_5D[i] = GetHPBarLevel(hp, maxHp);
+ gUnknown_0203229C->unk_5D[0][i] = GetHPBarLevel(curHp, maxHp);
}
break;
case 1:
- for (i = 0; i < gUnknown_0203229C->unk_36[1]; i++)
+ for (i = 0; i < gUnknown_0203229C->partyCounts[1]; i++)
{
- hp = GetMonData(&gEnemyParty[i], MON_DATA_HP);
+ curHp = GetMonData(&gEnemyParty[i], MON_DATA_HP);
maxHp = GetMonData(&gEnemyParty[i], MON_DATA_MAX_HP);
- gUnknown_0203229C->unk_63[i] = GetHPBarLevel(hp, maxHp);
+ gUnknown_0203229C->unk_5D[1][i] = GetHPBarLevel(curHp, maxHp);
}
break;
}
@@ -2318,9 +2367,9 @@ void sub_807A53C(void)
for (i = 0; i < 2; i++)
{
- for (j = 0; j < gUnknown_0203229C->unk_36[i]; j++)
+ for (j = 0; j < gUnknown_0203229C->partyCounts[i]; j++)
{
- sub_80D32C8(&gSprites[gUnknown_0203229C->unk_28[i][j]], 4 - gUnknown_0203229C->unk_5D[i * 6 + j]);
+ sub_80D32C8(&gSprites[gUnknown_0203229C->unk_28[i][j]], 4 - gUnknown_0203229C->unk_5D[i][j]);
}
}
}
@@ -2959,14 +3008,14 @@ void sub_807ABCC(void)
{
u16 dispcnt;
- SetGpuReg(REG_OFFSET_BG1VOFS, gUnknown_020322A0->unk_E0);
- SetGpuReg(REG_OFFSET_BG1HOFS, gUnknown_020322A0->unk_E2);
+ SetGpuReg(REG_OFFSET_BG1VOFS, gUnknown_020322A0->bg1vofs);
+ SetGpuReg(REG_OFFSET_BG1HOFS, gUnknown_020322A0->bg1hofs);
dispcnt = GetGpuReg(REG_OFFSET_DISPCNT);
if (!(dispcnt & (DISPCNT_MODE_1 | DISPCNT_MODE_2 | DISPCNT_MODE_3 | DISPCNT_MODE_4 | DISPCNT_MODE_5)))
{
- SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_020322A0->unk_E4);
- SetGpuReg(REG_OFFSET_BG2HOFS, gUnknown_020322A0->unk_E6);
+ SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_020322A0->bg2vofs);
+ SetGpuReg(REG_OFFSET_BG2HOFS, gUnknown_020322A0->bg2hofs);
}
else
{
@@ -3055,15 +3104,16 @@ void sub_807ACFC(u8 a0, u8 a1)
{
HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[a0 * 2 + 1], species, personality);
}
+
LoadCompressedSpritePalette(GetMonSpritePalStruct(mon));
- gUnknown_020322A0->unk_F0[a0] = species;
+ gUnknown_020322A0->tradeSpecies[a0] = species;
gUnknown_020322A0->unk_68[a0] = personality;
break;
case 1:
SetMultiuseSpriteTemplateToPokemon(GetMonSpritePalStruct(mon)->tag, unk);
- gUnknown_020322A0->unk_8E[a0] = CreateSprite(&gMultiuseSpriteTemplate, 120, 60, 6);
- gSprites[gUnknown_020322A0->unk_8E[a0]].invisible = TRUE;
- gSprites[gUnknown_020322A0->unk_8E[a0]].callback = SpriteCallbackDummy;
+ gUnknown_020322A0->pokePicSpriteIdxs[a0] = CreateSprite(&gMultiuseSpriteTemplate, 120, 60, 6);
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[a0]].invisible = TRUE;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[a0]].callback = SpriteCallbackDummy;
break;
}
}
@@ -3089,7 +3139,7 @@ void sub_807AE50(void)
gMain.state++;
gUnknown_020322A0->unk_8C = 0;
gUnknown_020322A0->unk_94 = 0;
- gUnknown_020322A0->unk_EE = 1;
+ gUnknown_020322A0->isLinkTrade = TRUE;
gUnknown_020322A0->unk_D4 = 64;
gUnknown_020322A0->unk_D6 = 64;
gUnknown_020322A0->unk_D8 = 0;
@@ -3237,9 +3287,10 @@ void sub_807B170(void)
LoadCompressedPalette(gBattleTextboxPalette, 0, 0x20);
}
+// In-game trade init
void sub_807B270(void)
{
- u8 name[12];
+ u8 name[11];
switch (gMain.state)
{
@@ -3258,7 +3309,7 @@ void sub_807B270(void)
FreeAllSpritePalettes();
SetVBlankCallback(sub_807AC24);
sub_807B170();
- gUnknown_020322A0->unk_EE = 0;
+ gUnknown_020322A0->isLinkTrade = FALSE;
gUnknown_020322A0->unk_8C = 0;
gUnknown_020322A0->unk_94 = 0;
gUnknown_020322A0->unk_D4 = 64;
@@ -3322,14 +3373,12 @@ void sub_807B270(void)
void sub_807B464(u8 a0)
{
- u16 species;
- u32 personality;
struct Pokemon *mon = &gPlayerParty[a0];
-
+
if (!GetMonData(mon, MON_DATA_IS_EGG))
{
- species = GetMonData(mon, MON_DATA_SPECIES, NULL);
- personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
+ u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
+ u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
species = SpeciesToNationalPokedexNum(species);
GetSetPokedexFlag(species, FLAG_SET_SEEN);
HandleSetPokedexFlag(species, FLAG_SET_CAUGHT, personality);
@@ -3338,7 +3387,10 @@ void sub_807B464(u8 a0)
void sub_807B4C4(void)
{
- GetMultiplayerId();
+ u8 mpId = GetMultiplayerId();
+ // Originally in Ruby but commented out
+ /*if (gLinkPlayers[mpId ^ 1].lp_field_2 == 0x8000)
+ EnableNationalPokedex();*/
}
void sub_807B4D0(u8 a0, u8 a1)
@@ -3358,9 +3410,9 @@ void sub_807B4D0(u8 a0, u8 a1)
ClearMailStruct(&gSaveBlock1Ptr->mail[mailId1]);
}
- memcpy(&gUnknown_020322A0->mon, mon1, sizeof(struct Pokemon));
- memcpy(mon1, mon2, sizeof(struct Pokemon));
- memcpy(mon2, &gUnknown_020322A0->mon, sizeof(struct Pokemon));
+ gUnknown_020322A0->mon = *mon1;
+ *mon1 = *mon2;
+ *mon2 = gUnknown_020322A0->mon;
friendship = 70;
if (!GetMonData(mon1, MON_DATA_IS_EGG))
@@ -3407,14 +3459,13 @@ void sub_807B60C(void)
UpdatePaletteFade();
}
-// DmaCopy16Defvars in cases 4 and 6 tail merge, when they shouldn't
void sub_807B62C(u8 a0)
{
switch (a0)
{
case 0:
- gUnknown_020322A0->unk_E4 = 0;
- gUnknown_020322A0->unk_E6 = 180;
+ gUnknown_020322A0->bg2vofs = 0;
+ gUnknown_020322A0->bg2hofs = 180;
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
DISPCNT_OBJ_1D_MAP |
DISPCNT_BG0_ON |
@@ -3427,11 +3478,11 @@ void sub_807B62C(u8 a0)
BGCNT_TXT512x256);
LoadPalette(gTradeGba2_Pal, 16, 0x60);
DmaCopyLarge16(3, gTradeGba_Gfx, (void *) BG_CHAR_ADDR(1), 0x1420, 0x1000);
- DmaCopy16(3, gUnknown_08331F60, (void *) BG_SCREEN_ADDR(18), 0x1000);
+ DmaCopy16Defvars(3, gUnknown_08331F60, (void *) BG_SCREEN_ADDR(18), 0x1000);
break;
case 1:
- gUnknown_020322A0->unk_E2 = 0;
- gUnknown_020322A0->unk_E0 = 348;
+ gUnknown_020322A0->bg1hofs = 0;
+ gUnknown_020322A0->bg1vofs = 348;
SetGpuReg(REG_OFFSET_BG1VOFS, 348);
SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(2) |
BGCNT_CHARBASE(0) |
@@ -3460,8 +3511,8 @@ void sub_807B62C(u8 a0)
DISPCNT_OBJ_ON);
break;
case 2:
- gUnknown_020322A0->unk_E0 = 0;
- gUnknown_020322A0->unk_E2 = 0;
+ gUnknown_020322A0->bg1vofs = 0;
+ gUnknown_020322A0->bg1hofs = 0;
if (!gUnknown_020322A0->unk_FA)
{
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 |
@@ -3485,7 +3536,7 @@ void sub_807B62C(u8 a0)
LoadPalette(gUnknown_08337EA0, 48, 0x20);
LZ77UnCompVram(gUnknown_08337EC0, (void *) BG_CHAR_ADDR(1));
LZ77UnCompVram(gUnknown_08338550, (void *) BG_SCREEN_ADDR(18));
- gUnknown_020322A0->unk_E4 = 80;
+ gUnknown_020322A0->bg2vofs = 80;
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
DISPCNT_OBJ_1D_MAP |
DISPCNT_BG1_ON |
@@ -3520,8 +3571,8 @@ void sub_807B62C(u8 a0)
}
break;
case 5:
- gUnknown_020322A0->unk_E0 = 0;
- gUnknown_020322A0->unk_E2 = 0;
+ gUnknown_020322A0->bg1vofs = 0;
+ gUnknown_020322A0->bg1hofs = 0;
break;
case 6:
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 |
@@ -3553,8 +3604,8 @@ void sub_807B62C(u8 a0)
}
break;
case 7:
- gUnknown_020322A0->unk_E4 = 0;
- gUnknown_020322A0->unk_E6 = 0;
+ gUnknown_020322A0->bg2vofs = 0;
+ gUnknown_020322A0->bg2hofs = 0;
SetGpuReg(REG_OFFSET_BLDCNT, 0);
SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) |
BGCNT_CHARBASE(1) |
@@ -3563,7 +3614,551 @@ void sub_807B62C(u8 a0)
BGCNT_TXT512x256);
LoadPalette(gTradeGba2_Pal, 16, 0x60);
DmaCopyLarge16(3, gTradeGba_Gfx, (void *) BG_CHAR_ADDR(1), 0x1420, 0x1000);
- DmaCopy16(3, gUnknown_08331F60, (void *) BG_SCREEN_ADDR(18), 0x1000);
+ DmaCopy16Defvars(3, gUnknown_08331F60, (void *) BG_SCREEN_ADDR(18), 0x1000);
break;
}
}
+
+void sub_807BA94(void)
+{
+ LoadSpriteSheet(&gUnknown_08338D70);
+ LoadSpriteSheet(&gUnknown_08338DC0);
+ LoadSpriteSheet(&gUnknown_08338DF4);
+ LoadSpriteSheet(&gUnknown_08338E6C);
+ LoadSpritePalette(&gUnknown_08338D78);
+ LoadSpritePalette(&gUnknown_08338D80);
+}
+
+void sub_807BAD8(void)
+{
+ /*Sets the variable strings printed on the
+ *actual trading screen. For use in strings
+ *like "[Pokemon] will be sent to [Trainer]."
+ */
+ u8 mpId;
+ u8 name[20];
+ const struct InGameTrade *ingameTrade;
+
+ if (gUnknown_020322A0->isLinkTrade)
+ {
+ mpId = GetMultiplayerId();
+ StringCopy(gStringVar1, gLinkPlayers[mpId ^ 1].name);
+ GetMonData(&gEnemyParty[gUnknown_02032298[1] % PARTY_SIZE], MON_DATA_NICKNAME, name);
+ StringCopy10(gStringVar3, name);
+ GetMonData(&gPlayerParty[gUnknown_02032298[0]], MON_DATA_NICKNAME, name);
+ StringCopy10(gStringVar2, name);
+ }
+ else
+ {
+ ingameTrade = &gIngameTrades[gSpecialVar_0x8004];
+ StringCopy(gStringVar1, ingameTrade->otName);
+ StringCopy10(gStringVar3, ingameTrade->name);
+ GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_NICKNAME, name);
+ StringCopy10(gStringVar2, name);
+ }
+}
+
+u8 sub_807BBC8(void)
+{
+ if (gUnknown_020322A0->unk_FA)
+ {
+ return sub_807BBEC();
+ }
+ else
+ {
+ return sub_807CFC8();
+ }
+}
+
+bool8 sub_807BBEC(void)
+{
+ u16 evoTarget;
+
+ switch (gUnknown_020322A0->unk_94)
+ {
+ case 0:
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].invisible = FALSE;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.x = -180;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y = gMonFrontPicCoords[gUnknown_020322A0->tradeSpecies[0]].y_offset;
+ gUnknown_020322A0->unk_94++;
+ gUnknown_020322A0->unk_F4 = GetCurrentMapMusic();
+ PlayNewMapMusic(MUS_SHINKA);
+ break;
+ case 1:
+ if (gUnknown_020322A0->bg2hofs > 0)
+ {
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.x += 3;
+ gUnknown_020322A0->bg2hofs -= 3;
+ }
+ else
+ {
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.x = 0;
+ gUnknown_020322A0->bg2hofs = 0;
+ gUnknown_020322A0->unk_94 = 10;
+ }
+ break;
+ case 10:
+ StringExpandPlaceholders(gStringVar4, gText_XWillBeSentToY);
+ sub_807F1A8(0, gStringVar4, 0);
+
+ if (gUnknown_020322A0->tradeSpecies[0] != SPECIES_EGG)
+ {
+ PlayCry1(gUnknown_020322A0->tradeSpecies[0], 0);
+ }
+
+ gUnknown_020322A0->unk_94 = 11;
+ gUnknown_020322A0->unk_64 = 0;
+ break;
+ case 11:
+ if (++gUnknown_020322A0->unk_64 == 80)
+ {
+ gUnknown_020322A0->unk_D2 = sub_807671C(gUnknown_020322A0->pokePicSpriteIdxs[0], gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff);
+ gUnknown_020322A0->unk_94++;
+ StringExpandPlaceholders(gStringVar4, gText_ByeByeVar1);
+ sub_807F1A8(0, gStringVar4, 0);
+ }
+ break;
+ case 12:
+ if (gSprites[gUnknown_020322A0->unk_D2].callback == SpriteCallbackDummy)
+ {
+ gUnknown_020322A0->unk_D3 = CreateSprite(&gSpriteTemplate_8338D28, 120, 32, 0);
+ gSprites[gUnknown_020322A0->unk_D3].callback = sub_807E5D8;
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_D2]);
+ gUnknown_020322A0->unk_94++;
+ }
+ 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);
+ gUnknown_020322A0->unk_94 = 20;
+ break;
+
+ case 20:
+ if (!gPaletteFade.active)
+ {
+ sub_807B62C(4);
+ FillWindowPixelBuffer(0, 0xFF);
+ CopyWindowToVram(0, 3);
+ gUnknown_020322A0->unk_94++;
+ }
+ break;
+ case 21:
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
+ gUnknown_020322A0->unk_94++;
+ break;
+ case 22:
+ if (!gPaletteFade.active)
+ {
+ gUnknown_020322A0->unk_94 = 23;
+ }
+ break;
+ case 23:
+ if (gUnknown_020322A0->unk_EA > 0x100)
+ {
+ gUnknown_020322A0->unk_EA -= 0x34;
+ }
+ else
+ {
+ sub_807B62C(1);
+ gUnknown_020322A0->unk_EA = 0x80;
+ gUnknown_020322A0->unk_94++;
+ gUnknown_020322A0->unk_64 = 0;
+ }
+ gUnknown_020322A0->unk_E8 = 0x8000 / gUnknown_020322A0->unk_EA;
+ break;
+ case 24:
+ if (++gUnknown_020322A0->unk_64 > 20)
+ {
+ sub_807AB28();
+ gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338E74, 120, 80, 0);
+ gUnknown_020322A0->unk_94++;
+ }
+ break;
+ case 25:
+ if (gSprites[gUnknown_020322A0->unk_91].animEnded)
+ {
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_91]);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND |
+ BLDCNT_TGT2_BG1 |
+ BLDCNT_TGT2_BG2);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 4));
+ gUnknown_020322A0->unk_94++;
+ }
+ break;
+ case 26:
+ if (--gUnknown_020322A0->bg1vofs == 316)
+ {
+ gUnknown_020322A0->unk_94++;
+ }
+ if (gUnknown_020322A0->bg1vofs == 328)
+ {
+ gUnknown_020322A0->unk_92 = CreateSprite(&gSpriteTemplate_8338DFC, 128, 65, 0);
+ }
+ break;
+ case 27:
+ gUnknown_020322A0->unk_90 = CreateSprite(&gUnknown_08338D88, 128, 80, 3);
+ gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338DC8, 128, 80, 0);
+ StartSpriteAnim(&gSprites[gUnknown_020322A0->unk_91], 1);
+ gUnknown_020322A0->unk_94++;
+ break;
+ case 28:
+ if ((gUnknown_020322A0->bg1vofs -= 2) == 166)
+ {
+ gUnknown_020322A0->unk_94 = 200;
+ }
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 |
+ DISPCNT_OBJ_1D_MAP |
+ DISPCNT_BG1_ON |
+ DISPCNT_OBJ_ON);
+ break;
+ case 200:
+ gSprites[gUnknown_020322A0->unk_90].pos1.y -= 2;
+ gSprites[gUnknown_020322A0->unk_91].pos1.y -= 2;
+ if (gSprites[gUnknown_020322A0->unk_90].pos1.y < -8)
+ {
+ gUnknown_020322A0->unk_94 = 29;
+ }
+ break;
+ case 29:
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK);
+ gUnknown_020322A0->unk_94 = 30;
+ break;
+ case 30:
+ if (!gPaletteFade.active)
+ {
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_90]);
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_91]);
+ sub_807B62C(2);
+ gUnknown_020322A0->unk_94++;
+ }
+ break;
+ case 31:
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
+ gUnknown_020322A0->unk_90 = CreateSprite(&gSpriteTemplate_8338DC8, 111, 170, 0);
+ gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338DC8, 129, -10, 0);
+ gUnknown_020322A0->unk_94++;
+ break;
+ case 32:
+ if (!gPaletteFade.active)
+ {
+ PlaySE(SE_TK_WARPOUT);
+ gUnknown_020322A0->unk_94++;
+ }
+ gSprites[gUnknown_020322A0->unk_90].pos2.y -= 3;
+ gSprites[gUnknown_020322A0->unk_91].pos2.y += 3;
+ break;
+ case 33:
+ gSprites[gUnknown_020322A0->unk_90].pos2.y -= 3;
+ gSprites[gUnknown_020322A0->unk_91].pos2.y += 3;
+ if (gSprites[gUnknown_020322A0->unk_90].pos2.y <= -90)
+ {
+ gSprites[gUnknown_020322A0->unk_90].data[1] = 1;
+ gSprites[gUnknown_020322A0->unk_91].data[1] = 1;
+ gUnknown_020322A0->unk_94++;
+ }
+ break;
+ case 34:
+ BlendPalettes(0x1, 16, RGB_WHITEALPHA);
+ gUnknown_020322A0->unk_94++;
+ break;
+ case 35:
+ BlendPalettes(0x1, 0, RGB_WHITEALPHA);
+ gUnknown_020322A0->unk_94++;
+ break;
+ case 36:
+ BlendPalettes(0x1, 16, RGB_WHITEALPHA);
+ gUnknown_020322A0->unk_94++;
+ break;
+ case 37:
+ if (!IsMonSpriteNotFlipped(gUnknown_020322A0->tradeSpecies[0]))
+ {
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].affineAnims = gSpriteAffineAnimTable_8338ECC;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].oam.affineMode = 3;
+ CalcCenterToCornerVec(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]], 0, 3, 3);
+ StartSpriteAffineAnim(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]], 0);
+ }
+ else
+ {
+ StartSpriteAffineAnim(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]], 0);
+ }
+ StartSpriteAffineAnim(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]], 0);
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos1.x = 60;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos1.x = 180;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos1.y = 192;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos1.y = -32;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].invisible = FALSE;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].invisible = FALSE;
+ gUnknown_020322A0->unk_94++;
+ break;
+ case 38:
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y -= 3;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos2.y += 3;
+ if (gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y < -160 && gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y >= -163)
+ {
+ PlaySE(SE_TK_WARPIN);
+ }
+ if (gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y < -222)
+ {
+ gSprites[gUnknown_020322A0->unk_90].data[1] = 0;
+ gSprites[gUnknown_020322A0->unk_91].data[1] = 0;
+ gUnknown_020322A0->unk_94++;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].invisible = TRUE;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].invisible = TRUE;
+ BlendPalettes(0x1, 0, RGB_WHITEALPHA);
+ }
+ break;
+ case 39:
+ gSprites[gUnknown_020322A0->unk_90].pos2.y -= 3;
+ gSprites[gUnknown_020322A0->unk_91].pos2.y += 3;
+ if (gSprites[gUnknown_020322A0->unk_90].pos2.y <= -222)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK);
+ gUnknown_020322A0->unk_94++;
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_90]);
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_91]);
+ }
+ break;
+ case 40:
+ if (!gPaletteFade.active)
+ {
+ gUnknown_020322A0->unk_94++;
+ sub_807B62C(1);
+ gUnknown_020322A0->bg1vofs = 166;
+ gUnknown_020322A0->unk_90 = CreateSprite(&gUnknown_08338D88, 128, -20, 3);
+ gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338DC8, 128, -20, 0);
+ StartSpriteAnim(&gSprites[gUnknown_020322A0->unk_91], 1);
+ }
+ break;
+ case 41:
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
+ gUnknown_020322A0->unk_94++;
+ break;
+ case 42:
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
+ DISPCNT_OBJ_1D_MAP |
+ DISPCNT_BG1_ON |
+ DISPCNT_OBJ_ON);
+ if (!gPaletteFade.active)
+ {
+ gUnknown_020322A0->unk_94++;
+ }
+ break;
+ case 43:
+ gSprites[gUnknown_020322A0->unk_90].pos2.y += 3;
+ gSprites[gUnknown_020322A0->unk_91].pos2.y += 3;
+ if (gSprites[gUnknown_020322A0->unk_90].pos2.y + gSprites[gUnknown_020322A0->unk_90].pos1.y == 64)
+ {
+ gUnknown_020322A0->unk_94++;
+ }
+ break;
+ case 44:
+ if ((gUnknown_020322A0->bg1vofs += 2) > 316)
+ {
+ gUnknown_020322A0->bg1vofs = 316;
+ gUnknown_020322A0->unk_94++;
+ }
+ break;
+ case 45:
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_90]);
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_91]);
+ gUnknown_020322A0->unk_94++;
+ gUnknown_020322A0->unk_64 = 0;
+ break;
+ case 46:
+ if (++gUnknown_020322A0->unk_64 == 10)
+ {
+ gUnknown_020322A0->unk_94++;
+ }
+ break;
+ case 47:
+ if (++gUnknown_020322A0->bg1vofs > 348)
+ {
+ gUnknown_020322A0->bg1vofs = 348;
+ gUnknown_020322A0->unk_94++;
+ }
+ if (gUnknown_020322A0->bg1vofs == 328 && gUnknown_020322A0->unk_FA)
+ {
+ gUnknown_020322A0->unk_92 = CreateSprite(&gSpriteTemplate_8338DFC, 128, 65, 0);
+ gSprites[gUnknown_020322A0->unk_92].callback = sub_807AAE0;
+ }
+ break;
+ case 48:
+ gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338E74, 120, 80, 0);
+ gUnknown_020322A0->unk_94 = 50;
+ break;
+ case 50:
+ if (gSprites[gUnknown_020322A0->unk_91].animEnded)
+ {
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_91]);
+ sub_807B62C(6);
+ gUnknown_020322A0->unk_94++;
+ PlaySE(SE_W028);
+ }
+ break;
+ case 51:
+ if (gUnknown_020322A0->unk_EA < 0x400)
+ {
+ gUnknown_020322A0->unk_EA += 0x34;
+ }
+ else
+ {
+ gUnknown_020322A0->unk_EA = 0x400;
+ gUnknown_020322A0->unk_94++;
+ }
+ gUnknown_020322A0->unk_E8 = 0x8000 / gUnknown_020322A0->unk_EA;
+ break;
+ case 52:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gUnknown_020322A0->unk_94 = 60;
+ break;
+
+ case 60:
+ if (!gPaletteFade.active)
+ {
+ sub_807B62C(5);
+ sub_807B62C(7);
+ gPaletteFade.bufferTransferDisabled = TRUE;
+ gUnknown_020322A0->unk_94++;
+ }
+ break;
+ case 61:
+ gPaletteFade.bufferTransferDisabled = FALSE;
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ gUnknown_020322A0->unk_94++;
+ break;
+ case 62:
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
+ DISPCNT_OBJ_1D_MAP |
+ DISPCNT_BG2_ON |
+ DISPCNT_OBJ_ON);
+ if (!gPaletteFade.active)
+ {
+ gUnknown_020322A0->unk_94++;
+ }
+ break;
+ case 63:
+ gUnknown_020322A0->unk_D3 = CreateSprite(&gSpriteTemplate_8338D28, 120, -8, 0);
+ gSprites[gUnknown_020322A0->unk_D3].data[3] = 74;
+ gSprites[gUnknown_020322A0->unk_D3].callback = sub_807E6AC;
+ StartSpriteAnim(&gSprites[gUnknown_020322A0->unk_D3], 1);
+ StartSpriteAffineAnim(&gSprites[gUnknown_020322A0->unk_D3], 2);
+ BlendPalettes(1 << (16 + gSprites[gUnknown_020322A0->unk_D3].oam.paletteNum), 16, RGB_WHITEALPHA);
+ gUnknown_020322A0->unk_94++;
+ gUnknown_020322A0->unk_64 = 0;
+ break;
+ case 64:
+ BeginNormalPaletteFade(1 << (16 + gSprites[gUnknown_020322A0->unk_D3].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA);
+ gUnknown_020322A0->unk_94++;
+ break;
+ case 65:
+ if (gSprites[gUnknown_020322A0->unk_D3].callback == SpriteCallbackDummy)
+ {
+ HandleLoadSpecialPokePic_2(&gMonFrontPicTable[gUnknown_020322A0->tradeSpecies[1]], gMonSpritesGfxPtr->sprites[3], gUnknown_020322A0->tradeSpecies[1], gUnknown_020322A0->unk_68[1]);
+ gUnknown_020322A0->unk_94++;
+ }
+ break;
+ case 66:
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos1.x = 120;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos1.y = gMonFrontPicCoords[gUnknown_020322A0->tradeSpecies[1]].y_offset + 60;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos2.x = 0;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos2.y = 0;
+ StartSpriteAnim(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]], 0);
+ CreatePokeballSpriteToReleaseMon(gUnknown_020322A0->pokePicSpriteIdxs[1], gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF, gUnknown_020322A0->tradeSpecies[1]);
+ FreeSpriteOamMatrix(&gSprites[gUnknown_020322A0->unk_D3]);
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_D3]);
+ gUnknown_020322A0->unk_94++;
+ 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);
+ sub_807F1A8(0, gStringVar4, 0);
+ gUnknown_020322A0->unk_94 = 167;
+ gUnknown_020322A0->unk_64 = 0;
+ break;
+ // 167 and 267 are extra cases added in for animations
+ case 167:
+ if (++gUnknown_020322A0->unk_64 > 60)
+ {
+ gUnknown_020322A0->unk_94 = 267;
+ gUnknown_020322A0->unk_64 = 0;
+ }
+ break;
+ case 267:
+ if (IsCryFinished())
+ {
+ gUnknown_020322A0->unk_94 = 68;
+ }
+ break;
+ case 68:
+ if (++gUnknown_020322A0->unk_64 == 10)
+ {
+ PlayFanfare(MUS_FANFA5);
+ }
+ if (gUnknown_020322A0->unk_64 == 250)
+ {
+ gUnknown_020322A0->unk_94++;
+ StringExpandPlaceholders(gStringVar4, gText_TakeGoodCareOfX);
+ sub_807F1A8(0, gStringVar4, 0);
+ gUnknown_020322A0->unk_64 = 0;
+ }
+ break;
+ case 69:
+ if (++gUnknown_020322A0->unk_64 == 60)
+ {
+ gUnknown_020322A0->unk_94++;
+ }
+ break;
+ case 70:
+ sub_807F14C();
+ gUnknown_020322A0->unk_94++;
+ break;
+ case 71:
+ if (gUnknown_020322A0->isLinkTrade)
+ {
+ return TRUE;
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ gUnknown_020322A0->unk_94++;
+ }
+ break;
+ case 72: // Only if in-game trade
+ sub_807B4D0(gSpecialVar_0x8005, 0);
+ gCB2_AfterEvolution = sub_807B60C;
+ evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gUnknown_02032298[0]], TRUE, ITEM_NONE);
+ if (evoTarget != SPECIES_NONE)
+ {
+ TradeEvolutionScene(&gPlayerParty[gUnknown_02032298[0]], evoTarget, gUnknown_020322A0->pokePicSpriteIdxs[1], gUnknown_02032298[0]);
+ }
+ gUnknown_020322A0->unk_94++;
+ break;
+ case 73:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gUnknown_020322A0->unk_94++;
+ break;
+ case 74:
+ if (!gPaletteFade.active)
+ {
+ PlayNewMapMusic(gUnknown_020322A0->unk_F4);
+ if (gUnknown_020322A0)
+ {
+ FreeAllWindowBuffers();
+ Free(GetBgTilemapBuffer(3));
+ Free(GetBgTilemapBuffer(1));
+ Free(GetBgTilemapBuffer(0));
+ FreeMonSpritesGfx();
+ FREE_AND_SET_NULL(gUnknown_020322A0);
+ }
+ SetMainCallback2(CB2_ReturnToField);
+ sub_807E784();
+ }
+ break;
+ }
+ return FALSE;
+}