summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2019-10-29 12:58:40 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2019-10-29 12:58:40 -0400
commitce5c3fdd776a47d5d6c3790249c53afaff844553 (patch)
tree4a0b936cb0b017b4f7fac5c304c73f34c3dde0cc /src
parenta1ec6ccff14cb0e95359b6595f35620ab606bc03 (diff)
Trade through sub_804FFE4
Diffstat (limited to 'src')
-rw-r--r--src/trade.c174
1 files changed, 168 insertions, 6 deletions
diff --git a/src/trade.c b/src/trade.c
index 48f559861..716b74eb5 100644
--- a/src/trade.c
+++ b/src/trade.c
@@ -22,6 +22,7 @@
#include "overworld.h"
#include "battle_anim.h"
#include "party_menu.h"
+#include "util.h"
#include "daycare.h"
#include "event_data.h"
#include "battle_interface.h"
@@ -74,6 +75,52 @@ struct TradeResources
/*0x08F0*/ u16 tilemapBuffer[BG_SCREEN_SIZE / 2];
};
+struct TradeResources2 {
+ /*0x00*/ struct Pokemon mon;
+ /*0x64*/ u32 timer;
+ /*0x68*/ u32 unk_68[2];
+ /*0x70*/ u8 filler_70[2];
+ /*0x72*/ u8 unk_72;
+ /*0x73*/ u8 unk_73;
+ /*0x74*/ u16 linkData[10];
+ /*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 state;
+ /*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*/ u16 unk_DC;
+ /*0xDE*/ u16 unk_DE;
+ /*0xE0*/ s16 bg1vofs;
+ /*0xE2*/ s16 bg1hofs;
+ /*0xE4*/ s16 bg2vofs;
+ /*0xE6*/ s16 bg2hofs;
+ /*0xE8*/ u16 unk_E8;
+ /*0xEA*/ u16 unk_EA;
+ /*0xEC*/ u16 unk_EC;
+ /*0xEE*/ bool8 isLinkTrade;
+ /*0xF0*/ u16 tradeSpecies[2];
+ /*0xF4*/ u16 cachedMapMusic;
+ /*0xF6*/ u8 unk_F6[3];
+ /*0xF9*/ u8 filler_F9;
+ /*0xFA*/ u8 unk_FA;
+ /*0xFB*/ u8 unk_FB;
+ /*0xFC*/ u8 unk_FC;
+ /*0xFD*/ u8 unk_FD;
+ /*0xFE*/ u8 unk_FE;
+};
+
IWRAM_DATA vu16 gUnknown_3000E78;
EWRAM_DATA u8 *gUnknown_2031C90 = NULL;
@@ -81,7 +128,7 @@ EWRAM_DATA u8 *gUnknown_2031C94[14] = {};
EWRAM_DATA u8 gUnknown_2031CCC[216] = {};
EWRAM_DATA u8 gUnknown_2031DA4[2] = {0};
EWRAM_DATA struct TradeResources * gUnknown_2031DA8 = NULL;
-EWRAM_DATA void * gUnknown_2031DAC = NULL;
+EWRAM_DATA struct TradeResources2 * gUnknown_2031DAC = NULL;
void sub_804C728(void);
void sub_804D4F8(void);
@@ -137,7 +184,7 @@ extern const u8 *const gUnknown_8261EF4[];
extern const struct SpritePalette gUnknown_8261D00;
extern const struct SpritePalette gUnknown_8261C60;
extern const struct SpriteSheet gUnknown_8261C58;
-extern const u16 gUnknown_826CF60[];
+extern const u16 gTradeGlow2PaletteAnimTable[];
void sub_804C600(void)
{
@@ -3959,7 +4006,7 @@ int sub_804FCE0(struct UnkLinkRfuStruct_02022B14Substruct a0, u16 species, u16 a
return 0;
}
-// Sprite callback for link cable transfer glow
+// Sprite callback for link cable trade glow
void sub_804FD24(struct Sprite * sprite)
{
sprite->data[0]++;
@@ -3970,7 +4017,7 @@ void sub_804FD24(struct Sprite * sprite)
}
}
-// Sprite callback for wireless transfer glow
+// Sprite callback for wireless trade glow
void sub_804FD48(struct Sprite * sprite)
{
if (!sprite->invisible)
@@ -3984,7 +4031,7 @@ void sub_804FD48(struct Sprite * sprite)
}
}
-// Palette flash for transfer glow core
+// Palette flash for trade glow core
void sub_804FD78(struct Sprite * sprite)
{
if (sprite->data[1] == 0)
@@ -3992,7 +4039,7 @@ void sub_804FD78(struct Sprite * sprite)
sprite->data[0]++;
if (sprite->data[0] == 12)
sprite->data[0] = 0;
- LoadPalette(&gUnknown_826CF60[sprite->data[0]], 16 * (sprite->oam.paletteNum + 16) + 4, 2);
+ LoadPalette(&gTradeGlow2PaletteAnimTable[sprite->data[0]], 16 * (sprite->oam.paletteNum + 16) + 4, 2);
}
}
@@ -4021,3 +4068,118 @@ void sub_804FE00(struct Sprite * sprite)
sprite->data[0] = 0;
}
}
+
+void sub_804FE24(void)
+{
+ struct BgAffineDstData affine;
+ DoBgAffineSet(&affine, gUnknown_2031DAC->unk_D4 * 0x100, gUnknown_2031DAC->unk_D6 * 0x100, gUnknown_2031DAC->unk_DC, gUnknown_2031DAC->unk_DE, gUnknown_2031DAC->unk_E8, gUnknown_2031DAC->unk_E8, gUnknown_2031DAC->unk_EC);
+ SetGpuReg(REG_OFFSET_BG2PA, affine.pa);
+ SetGpuReg(REG_OFFSET_BG2PB, affine.pb);
+ SetGpuReg(REG_OFFSET_BG2PC, affine.pc);
+ SetGpuReg(REG_OFFSET_BG2PD, affine.pd);
+ SetGpuReg(REG_OFFSET_BG2X, affine.dx);
+ SetGpuReg(REG_OFFSET_BG2Y, affine.dy);
+}
+
+void sub_804FEB4(void)
+{
+ u16 dispcnt;
+
+ SetGpuReg(REG_OFFSET_BG1VOFS, gUnknown_2031DAC->bg1vofs);
+ SetGpuReg(REG_OFFSET_BG1HOFS, gUnknown_2031DAC->bg1hofs);
+
+ dispcnt = GetGpuReg(REG_OFFSET_DISPCNT);
+ if ((dispcnt & 7) == DISPCNT_MODE_0)
+ {
+ SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_2031DAC->bg2vofs);
+ SetGpuReg(REG_OFFSET_BG2HOFS, gUnknown_2031DAC->bg2hofs);
+ }
+ else
+ {
+ sub_804FE24();
+ }
+}
+
+void sub_804FF0C(void)
+{
+ sub_804FEB4();
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void sub_804FF24(void)
+{
+ gUnknown_2031DAC->unk_8A = 0;
+ gUnknown_2031DAC->unk_88 = 0;
+ gUnknown_2031DAC->unk_89 = 0;
+}
+
+void sub_804FF4C(void)
+{
+ if (gUnknown_2031DAC->unk_88 == gUnknown_2031DAC->unk_89)
+ gUnknown_2031DAC->unk_8A++;
+ else
+ gUnknown_2031DAC->unk_8A = 0;
+
+ if (gUnknown_2031DAC->unk_8A > 300)
+ {
+ CloseLink();
+ SetMainCallback2(CB2_LinkError);
+ gUnknown_2031DAC->unk_8A = 0;
+ gUnknown_2031DAC->unk_89 = 0;
+ gUnknown_2031DAC->unk_88 = 0;
+ }
+
+ gUnknown_2031DAC->unk_89 = gUnknown_2031DAC->unk_88;
+}
+
+u32 sub_804FFC4(void)
+{
+ if (gReceivedRemoteLinkPlayers)
+ return GetMultiplayerId();
+ return 0;
+}
+
+void sub_804FFE4(u8 whichParty, u8 a1)
+{
+ int pos = 0;
+ struct Pokemon *mon = NULL;
+ u16 species;
+ u32 personality;
+
+ if (whichParty == 0)
+ {
+ mon = &gPlayerParty[gUnknown_2031DA4[0]];
+ pos = 1;
+ }
+
+ if (whichParty == 1)
+ {
+ mon = &gEnemyParty[gUnknown_2031DA4[1] % PARTY_SIZE];
+ pos = 3;
+ }
+
+ switch (a1)
+ {
+ case 0:
+ species = GetMonData(mon, MON_DATA_SPECIES2);
+ personality = GetMonData(mon, MON_DATA_PERSONALITY);
+
+ if (whichParty == 0)
+ HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[1], species, personality);
+ else
+ HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[whichParty * 2 + 1], species, personality);
+
+ LoadCompressedSpritePalette(GetMonSpritePalStruct(mon));
+ gUnknown_2031DAC->tradeSpecies[whichParty] = species;
+ gUnknown_2031DAC->unk_68[whichParty] = personality;
+ break;
+ case 1:
+ SetMultiuseSpriteTemplateToPokemon(GetMonSpritePalStruct(mon)->tag, pos);
+ gUnknown_2031DAC->pokePicSpriteIdxs[whichParty] = CreateSprite(&gMultiuseSpriteTemplate, 120, 60, 6);
+ gSprites[gUnknown_2031DAC->pokePicSpriteIdxs[whichParty]].invisible = TRUE;
+ gSprites[gUnknown_2031DAC->pokePicSpriteIdxs[whichParty]].callback = SpriteCallbackDummy;
+ break;
+ }
+}