summaryrefslogtreecommitdiff
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
parent4c5e645e90fbbcc902346404fefef38d1c1ddbf3 (diff)
Port through sub_804FE00
-rw-r--r--asm/trade.s427
-rw-r--r--src/trade.c231
2 files changed, 231 insertions, 427 deletions
diff --git a/asm/trade.s b/asm/trade.s
index 80d527445..541572649 100644
--- a/asm/trade.s
+++ b/asm/trade.s
@@ -5,433 +5,6 @@
.text
- thumb_func_start sub_804FB34
-sub_804FB34: @ 804FB34
- push {r4-r7,lr}
- ldr r0, _0804FBB4 @ =gReceivedRemoteLinkPlayers
- ldrb r0, [r0]
- cmp r0, 0
- beq _0804FBC0
- bl GetMultiplayerId
- ldr r6, _0804FBB8 @ =gLinkPlayers
- movs r7, 0x1
- eors r0, r7
- lsls r0, 24
- lsrs r0, 24
- lsls r1, r0, 3
- subs r1, r0
- lsls r1, 2
- adds r1, r6
- ldrb r1, [r1]
- subs r0, r1, 0x4
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x1
- bls _0804FBC0
- subs r0, r1, 0x1
- lsls r0, 16
- lsrs r0, 16
- movs r4, 0x2
- cmp r0, 0x1
- bhi _0804FB6E
- movs r4, 0x1
-_0804FB6E:
- cmp r4, 0
- ble _0804FBC0
- bl GetMultiplayerId
- lsls r0, 24
- lsrs r0, 24
- lsls r1, r0, 3
- subs r1, r0
- lsls r1, 2
- adds r1, r6
- ldrb r1, [r1, 0x12]
- movs r5, 0xF0
- adds r0, r5, 0
- ands r0, r1
- cmp r0, 0
- beq _0804FBBC
- cmp r4, 0x2
- bne _0804FBC0
- bl GetMultiplayerId
- eors r0, r7
- lsls r0, 24
- lsrs r0, 24
- lsls r1, r0, 3
- subs r1, r0
- lsls r1, 2
- adds r1, r6
- ldrb r1, [r1, 0x12]
- adds r0, r5, 0
- ands r0, r1
- cmp r0, 0
- bne _0804FBC0
- movs r0, 0x2
- b _0804FBC2
- .align 2, 0
-_0804FBB4: .4byte gReceivedRemoteLinkPlayers
-_0804FBB8: .4byte gLinkPlayers
-_0804FBBC:
- movs r0, 0x1
- b _0804FBC2
-_0804FBC0:
- movs r0, 0
-_0804FBC2:
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_804FB34
-
- thumb_func_start sub_804FBC8
-sub_804FBC8: @ 804FBC8
- push {lr}
- lsls r0, 16
- lsrs r2, r0, 16
- lsls r1, 24
- lsrs r1, 24
- movs r0, 0xCD
- lsls r0, 1
- cmp r2, r0
- beq _0804FBDE
- cmp r2, 0x97
- bne _0804FBE6
-_0804FBDE:
- cmp r1, 0
- bne _0804FBE6
- movs r0, 0x1
- b _0804FBE8
-_0804FBE6:
- movs r0, 0
-_0804FBE8:
- pop {r1}
- bx r1
- thumb_func_end sub_804FBC8
-
- thumb_func_start sub_804FBEC
-sub_804FBEC: @ 804FBEC
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x4
- ldr r4, [sp, 0x24]
- ldr r5, [sp, 0x28]
- ldr r6, [sp, 0x2C]
- lsls r2, 16
- lsrs r7, r2, 16
- lsls r3, 16
- lsrs r3, 16
- lsls r4, 24
- lsrs r4, 24
- mov r8, r4
- lsls r5, 16
- lsrs r5, 16
- lsls r6, 24
- lsrs r6, 24
- lsls r2, r0, 23
- lsrs r2, 31
- mov r9, r2
- lsls r0, 24
- lsrs r4, r0, 31
- lsls r0, r1, 23
- lsrs r0, 31
- mov r10, r0
- lsls r0, r1, 24
- lsrs r0, 31
- lsls r1, 18
- lsrs r1, 28
- subs r1, 0x4
- lsls r1, 24
- lsrs r1, 24
- movs r2, 0x1
- cmp r1, 0x1
- bhi _0804FC3A
- movs r2, 0
-_0804FC3A:
- cmp r2, 0
- beq _0804FC4E
- cmp r4, 0
- bne _0804FC46
- movs r0, 0x8
- b _0804FCCE
-_0804FC46:
- cmp r0, 0
- bne _0804FC4E
- movs r0, 0x9
- b _0804FCCE
-_0804FC4E:
- adds r0, r5, 0
- adds r1, r6, 0
- str r3, [sp]
- bl sub_804FBC8
- ldr r3, [sp]
- cmp r0, 0
- bne _0804FCB2
- movs r0, 0xCE
- lsls r0, 1
- cmp r3, r0
- bne _0804FC6E
- cmp r7, r3
- beq _0804FC8C
- movs r0, 0x2
- b _0804FCCE
-_0804FC6E:
- ldr r0, _0804FC88 @ =gBaseStats
- lsls r1, r7, 3
- subs r1, r7
- lsls r1, 2
- adds r1, r0
- ldrb r0, [r1, 0x6]
- cmp r0, r8
- beq _0804FC8C
- ldrb r0, [r1, 0x7]
- cmp r0, r8
- beq _0804FC8C
- movs r0, 0x1
- b _0804FCCE
- .align 2, 0
-_0804FC88: .4byte gBaseStats
-_0804FC8C:
- movs r0, 0xCE
- lsls r0, 1
- cmp r7, r0
- bne _0804FC9C
- cmp r7, r3
- beq _0804FC9C
- movs r0, 0x3
- b _0804FCCE
-_0804FC9C:
- mov r0, r9
- cmp r0, 0
- bne _0804FCBE
- movs r0, 0xCE
- lsls r0, 1
- cmp r7, r0
- bne _0804FCAE
- movs r0, 0x6
- b _0804FCCE
-_0804FCAE:
- cmp r7, 0x97
- bls _0804FCB6
-_0804FCB2:
- movs r0, 0x4
- b _0804FCCE
-_0804FCB6:
- cmp r3, 0x97
- bls _0804FCBE
- movs r0, 0x5
- b _0804FCCE
-_0804FCBE:
- mov r0, r10
- cmp r0, 0
- bne _0804FCCC
- cmp r7, 0x97
- bls _0804FCCC
- movs r0, 0x7
- b _0804FCCE
-_0804FCCC:
- movs r0, 0
-_0804FCCE:
- add sp, 0x4
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_804FBEC
-
- thumb_func_start sub_804FCE0
-sub_804FCE0: @ 804FCE0
- push {r4-r6,lr}
- lsls r1, 16
- lsrs r5, r1, 16
- adds r6, r5, 0
- lsls r2, 16
- lsrs r2, 16
- lsls r3, 24
- lsrs r3, 24
- lsls r0, 23
- lsrs r4, r0, 31
- adds r0, r2, 0
- adds r1, r3, 0
- bl sub_804FBC8
- cmp r0, 0
- bne _0804FD18
- cmp r4, 0
- bne _0804FD1C
- movs r0, 0xCE
- lsls r0, 1
- cmp r5, r0
- bne _0804FD10
- movs r0, 0x2
- b _0804FD1E
-_0804FD10:
- cmp r6, 0x97
- bls _0804FD1C
- cmp r6, r0
- beq _0804FD1C
-_0804FD18:
- movs r0, 0x1
- b _0804FD1E
-_0804FD1C:
- movs r0, 0
-_0804FD1E:
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end sub_804FCE0
-
- thumb_func_start sub_804FD24
-sub_804FD24: @ 804FD24
- push {r4,lr}
- adds r4, r0, 0
- ldrh r0, [r4, 0x2E]
- adds r0, 0x1
- strh r0, [r4, 0x2E]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0xA
- bne _0804FD40
- movs r0, 0x17
- bl PlaySE
- movs r0, 0
- strh r0, [r4, 0x2E]
-_0804FD40:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_804FD24
-
- thumb_func_start sub_804FD48
-sub_804FD48: @ 804FD48
- push {r4,r5,lr}
- adds r4, r0, 0
- adds r0, 0x3E
- ldrb r1, [r0]
- movs r0, 0x4
- ands r0, r1
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0
- bne _0804FD72
- ldrh r0, [r4, 0x2E]
- adds r0, 0x1
- strh r0, [r4, 0x2E]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0xA
- bne _0804FD72
- movs r0, 0xBB
- bl PlaySE
- strh r5, [r4, 0x2E]
-_0804FD72:
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end sub_804FD48
-
- thumb_func_start sub_804FD78
-sub_804FD78: @ 804FD78
- push {lr}
- adds r2, r0, 0
- movs r0, 0x30
- ldrsh r1, [r2, r0]
- cmp r1, 0
- bne _0804FDAE
- ldrh r0, [r2, 0x2E]
- adds r0, 0x1
- strh r0, [r2, 0x2E]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0xC
- bne _0804FD94
- strh r1, [r2, 0x2E]
-_0804FD94:
- movs r1, 0x2E
- ldrsh r0, [r2, r1]
- lsls r0, 1
- ldr r1, _0804FDB4 @ =gUnknown_826CF60
- adds r0, r1
- ldrb r1, [r2, 0x5]
- lsrs r1, 4
- adds r1, 0x10
- lsls r1, 4
- adds r1, 0x4
- movs r2, 0x2
- bl LoadPalette
-_0804FDAE:
- pop {r0}
- bx r0
- .align 2, 0
-_0804FDB4: .4byte gUnknown_826CF60
- thumb_func_end sub_804FD78
-
- thumb_func_start sub_804FDB8
-sub_804FDB8: @ 804FDB8
- push {lr}
- adds r2, r0, 0
- ldrh r1, [r2, 0x2E]
- adds r1, 0x1
- strh r1, [r2, 0x2E]
- ldrh r0, [r2, 0x26]
- adds r0, 0x1
- strh r0, [r2, 0x26]
- lsls r1, 16
- asrs r1, 16
- cmp r1, 0xA
- bne _0804FDD6
- adds r0, r2, 0
- bl DestroySprite
-_0804FDD6:
- pop {r0}
- bx r0
- thumb_func_end sub_804FDB8
-
- thumb_func_start sub_804FDDC
-sub_804FDDC: @ 804FDDC
- push {lr}
- adds r2, r0, 0
- ldrh r1, [r2, 0x2E]
- adds r1, 0x1
- strh r1, [r2, 0x2E]
- ldrh r0, [r2, 0x26]
- subs r0, 0x1
- strh r0, [r2, 0x26]
- lsls r1, 16
- asrs r1, 16
- cmp r1, 0xA
- bne _0804FDFA
- adds r0, r2, 0
- bl DestroySprite
-_0804FDFA:
- pop {r0}
- bx r0
- thumb_func_end sub_804FDDC
-
- thumb_func_start sub_804FE00
-sub_804FE00: @ 804FE00
- push {r4,lr}
- adds r4, r0, 0
- ldrh r0, [r4, 0x2E]
- adds r0, 0x1
- strh r0, [r4, 0x2E]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0xF
- bne _0804FE1C
- movs r0, 0xC5
- bl PlaySE
- movs r0, 0
- strh r0, [r4, 0x2E]
-_0804FE1C:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_804FE00
-
thumb_func_start sub_804FE24
sub_804FE24: @ 804FE24
push {r4,r5,lr}
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;
+ }
+}