diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2019-10-29 11:40:48 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2019-10-29 11:40:48 -0400 |
commit | a1ec6ccff14cb0e95359b6595f35620ab606bc03 (patch) | |
tree | 8b36ba14fe3f4909b3fb583b88dcbcfb7ffb58c1 | |
parent | 4c5e645e90fbbcc902346404fefef38d1c1ddbf3 (diff) |
Port through sub_804FE00
-rw-r--r-- | asm/trade.s | 427 | ||||
-rw-r--r-- | src/trade.c | 231 |
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; + } +} |