summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2019-10-29 11:40:48 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2019-10-29 11:40:48 -0400
commita1ec6ccff14cb0e95359b6595f35620ab606bc03 (patch)
tree8b36ba14fe3f4909b3fb583b88dcbcfb7ffb58c1 /src
parent4c5e645e90fbbcc902346404fefef38d1c1ddbf3 (diff)
Port through sub_804FE00
Diffstat (limited to 'src')
-rw-r--r--src/trade.c231
1 files changed, 231 insertions, 0 deletions
diff --git a/src/trade.c b/src/trade.c
index 765eb394d..48f559861 100644
--- a/src/trade.c
+++ b/src/trade.c
@@ -7,6 +7,7 @@
#include "bg.h"
#include "text.h"
#include "window.h"
+#include "librfu.h"
#include "text_window.h"
#include "pokemon_icon.h"
#include "graphics.h"
@@ -136,6 +137,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[];
void sub_804C600(void)
{
@@ -3790,3 +3792,232 @@ u32 sub_804FA14(struct Pokemon *party, int partyCount, int cursorPos)
return 1;
}
}
+
+s32 sub_804FB34(void)
+{
+ s32 val;
+ u16 version;
+
+ if (gReceivedRemoteLinkPlayers != 0)
+ {
+ val = 0;
+ version = (gLinkPlayers[GetMultiplayerId() ^ 1].version & 0xFF);
+
+ if (version == VERSION_FIRE_RED || version == VERSION_LEAF_GREEN)
+ {
+ // this value could actually be anything 0 or less
+ val = 0;
+ }
+ else if (version == VERSION_RUBY || version == VERSION_SAPPHIRE)
+ {
+ val = 1;
+ }
+ else
+ {
+ val = 2;
+ }
+
+ if (val > 0)
+ {
+ if (gLinkPlayers[GetMultiplayerId()].name[10] & 0xF0)
+ {
+ if (val == 2)
+ {
+ if (gLinkPlayers[GetMultiplayerId() ^ 1].name[10] & 0xF0)
+ {
+ return 0;
+ }
+ else
+ {
+ return 2;
+ }
+ }
+ }
+ else
+ {
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+bool32 IsDeoxysOrMewUntradable(u16 species, bool8 isObedientBitSet)
+{
+ if (species == SPECIES_DEOXYS || species == SPECIES_MEW)
+ {
+ if (!isObedientBitSet)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+int sub_804FBEC(struct UnkLinkRfuStruct_02022B14Substruct a0, struct UnkLinkRfuStruct_02022B14Substruct a1, u16 species1, u16 species2, u8 type, u16 species3, u8 isObedientBitSet)
+{
+ u8 r9 = a0.unk_01_0;
+ u8 r4 = a0.unk_00_7;
+ u8 r10 = a1.unk_01_0;
+ u8 r0 = a1.unk_00_7;
+ u8 r1 = a1.unk_01_2;
+ u8 r2;
+
+ if (r1 == VERSION_FIRE_RED || r1 == VERSION_LEAF_GREEN)
+ {
+ r2 = 0;
+ }
+ else
+ {
+ r2 = 1;
+ }
+ if (r2)
+ {
+ if (!r4)
+ {
+ return 8;
+ }
+ else if (!r0)
+ {
+ return 9;
+ }
+ }
+
+ if (IsDeoxysOrMewUntradable(species3, isObedientBitSet))
+ {
+ return 4;
+ }
+
+ if (species2 == SPECIES_EGG)
+ {
+ if (species1 != species2)
+ {
+ return 2;
+ }
+ }
+ else
+ {
+ if (gBaseStats[species1].type1 != type && gBaseStats[species1].type2 != type)
+ {
+ return 1;
+ }
+ }
+
+ if (species1 == SPECIES_EGG && species1 != species2)
+ {
+ return 3;
+ }
+
+ if (!r9)
+ {
+ if (species1 == SPECIES_EGG)
+ {
+ return 6;
+ }
+
+ if (species1 > SPECIES_MEW)
+ {
+ return 4;
+ }
+
+ if (species2 > SPECIES_MEW)
+ {
+ return 5;
+ }
+ }
+
+ if (!r10 && species1 > SPECIES_MEW)
+ {
+ return 7;
+ }
+
+ return 0;
+}
+
+int sub_804FCE0(struct UnkLinkRfuStruct_02022B14Substruct a0, u16 species, u16 a2, u8 a3)
+{
+ u8 unk = a0.unk_01_0;
+
+ if (IsDeoxysOrMewUntradable(a2, a3))
+ {
+ return 1;
+ }
+
+ if (unk)
+ {
+ return 0;
+ }
+
+ if (species == SPECIES_EGG)
+ {
+ return 2;
+ }
+
+ if (species > SPECIES_MEW && species != SPECIES_EGG)
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
+// Sprite callback for link cable transfer glow
+void sub_804FD24(struct Sprite * sprite)
+{
+ sprite->data[0]++;
+ if (sprite->data[0] == 10)
+ {
+ PlaySE(SE_BOWA);
+ sprite->data[0] = 0;
+ }
+}
+
+// Sprite callback for wireless transfer glow
+void sub_804FD48(struct Sprite * sprite)
+{
+ if (!sprite->invisible)
+ {
+ sprite->data[0]++;
+ if (sprite->data[0] == 10)
+ {
+ PlaySE(SE_W207B);
+ sprite->data[0] = 0;
+ }
+ }
+}
+
+// Palette flash for transfer glow core
+void sub_804FD78(struct Sprite * sprite)
+{
+ if (sprite->data[1] == 0)
+ {
+ 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);
+ }
+}
+
+void sub_804FDB8(struct Sprite * sprite)
+{
+ sprite->data[0]++;
+ sprite->pos2.y++;
+ if (sprite->data[0] == 10)
+ DestroySprite(sprite);
+}
+
+void sub_804FDDC(struct Sprite * sprite)
+{
+ sprite->data[0]++;
+ sprite->pos2.y--;
+ if (sprite->data[0] == 10)
+ DestroySprite(sprite);
+}
+
+void sub_804FE00(struct Sprite * sprite)
+{
+ sprite->data[0]++;
+ if (sprite->data[0] == 15)
+ {
+ PlaySE(SE_W107);
+ sprite->data[0] = 0;
+ }
+}