diff options
-rw-r--r-- | asm/trade.s | 861 | ||||
-rw-r--r-- | data/ingame_trades.inc | 4 | ||||
-rw-r--r-- | include/constants/flags.h | 12 | ||||
-rw-r--r-- | include/constants/region_map.h | 2 | ||||
-rw-r--r-- | src/trade.c | 274 |
5 files changed, 280 insertions, 873 deletions
diff --git a/asm/trade.s b/asm/trade.s index 0fd2e5c57..a90af0130 100644 --- a/asm/trade.s +++ b/asm/trade.s @@ -5,867 +5,6 @@ .text - thumb_func_start sub_8053788 -sub_8053788: @ 8053788 - push {r4-r7,lr} - mov r7, r8 - push {r7} - ldr r0, _080537A4 @ =gMain - movs r2, 0x87 - lsls r2, 3 - adds r1, r0, r2 - ldrb r0, [r1] - cmp r0, 0 - beq _080537A8 - cmp r0, 0x4 - beq _080537B8 - b _08053814 - .align 2, 0 -_080537A4: .4byte gMain -_080537A8: - movs r0, 0x4 - strb r0, [r1] - ldr r1, _080537B4 @ =gSoftResetDisabled - movs r0, 0x1 - b _08053812 - .align 2, 0 -_080537B4: .4byte gSoftResetDisabled -_080537B8: - ldr r0, _080537F4 @ =gCB2_AfterEvolution - ldr r1, _080537F8 @ =sub_8053E8C - mov r8, r1 - str r1, [r0] - ldr r7, _080537FC @ =gSelectedTradeMonPositions - ldrb r0, [r7] - movs r6, 0x64 - muls r0, r6 - ldr r5, _08053800 @ =gPlayerParty - adds r0, r5 - movs r1, 0x1 - movs r2, 0 - bl GetEvolutionTargetSpecies - lsls r0, 16 - lsrs r4, r0, 16 - cmp r4, 0 - beq _08053808 - ldrb r3, [r7] - adds r0, r3, 0 - muls r0, r6 - adds r0, r5 - ldr r1, _08053804 @ =sTradeData - ldr r1, [r1] - adds r1, 0x8F - ldrb r2, [r1] - adds r1, r4, 0 - bl TradeEvolutionScene - b _0805380E - .align 2, 0 -_080537F4: .4byte gCB2_AfterEvolution -_080537F8: .4byte sub_8053E8C -_080537FC: .4byte gSelectedTradeMonPositions -_08053800: .4byte gPlayerParty -_08053804: .4byte sTradeData -_08053808: - mov r0, r8 - bl SetMainCallback2 -_0805380E: - ldr r1, _08053838 @ =gSelectedTradeMonPositions - movs r0, 0xFF -_08053812: - strb r0, [r1] -_08053814: - bl HasLinkErrorOccurred - lsls r0, 24 - cmp r0, 0 - bne _08053822 - bl RunTasks -_08053822: - bl AnimateSprites - bl BuildOamBuffer - bl UpdatePaletteFade - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08053838: .4byte gSelectedTradeMonPositions - thumb_func_end sub_8053788 - - thumb_func_start sub_805383C -sub_805383C: @ 805383C - push {r4-r6,lr} - bl sub_804FFC4 - bl GetBlockReceivedStatus - lsls r0, 24 - lsrs r5, r0, 24 - movs r6, 0x1 - adds r0, r5, 0 - ands r0, r6 - cmp r0, 0 - beq _0805387A - ldr r4, _080538A8 @ =gBlockRecvBuffer - ldrh r1, [r4] - ldr r0, _080538AC @ =0x0000dcba - cmp r1, r0 - bne _08053864 - ldr r0, _080538B0 @ =sub_8053788 - bl SetMainCallback2 -_08053864: - ldrh r1, [r4] - ldr r0, _080538B4 @ =0x0000abcd - cmp r1, r0 - bne _08053874 - ldr r0, _080538B8 @ =sTradeData - ldr r0, [r0] - adds r0, 0x72 - strb r6, [r0] -_08053874: - movs r0, 0 - bl ResetBlockReceivedFlag -_0805387A: - movs r0, 0x2 - ands r0, r5 - cmp r0, 0 - beq _080538A2 - ldr r0, _080538A8 @ =gBlockRecvBuffer - movs r1, 0x80 - lsls r1, 1 - adds r0, r1 - ldrh r1, [r0] - ldr r0, _080538B4 @ =0x0000abcd - cmp r1, r0 - bne _0805389C - ldr r0, _080538B8 @ =sTradeData - ldr r0, [r0] - adds r0, 0x73 - movs r1, 0x1 - strb r1, [r0] -_0805389C: - movs r0, 0x1 - bl ResetBlockReceivedFlag -_080538A2: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080538A8: .4byte gBlockRecvBuffer -_080538AC: .4byte 0x0000dcba -_080538B0: .4byte sub_8053788 -_080538B4: .4byte 0x0000abcd -_080538B8: .4byte sTradeData - thumb_func_end sub_805383C - - thumb_func_start SpriteCB_TradePokeball_Default -SpriteCB_TradePokeball_Default: @ 80538BC - push {r4,r5,lr} - adds r5, r0, 0 - movs r1, 0x2E - ldrsh r0, [r5, r1] - movs r1, 0xA - bl __divsi3 - ldrh r4, [r5, 0x22] - adds r4, r0 - strh r4, [r5, 0x22] - ldrh r0, [r5, 0x30] - ldrh r2, [r5, 0x38] - adds r0, r2 - strh r0, [r5, 0x38] - movs r1, 0x38 - ldrsh r0, [r5, r1] - movs r1, 0xA - bl __divsi3 - strh r0, [r5, 0x20] - lsls r4, 16 - asrs r4, 16 - cmp r4, 0x4C - ble _0805390A - movs r0, 0x4C - strh r0, [r5, 0x22] - movs r2, 0x2E - ldrsh r1, [r5, r2] - movs r2, 0x32 - ldrsh r0, [r5, r2] - muls r0, r1 - negs r0, r0 - movs r1, 0x64 - bl __divsi3 - strh r0, [r5, 0x2E] - ldrh r0, [r5, 0x34] - adds r0, 0x1 - strh r0, [r5, 0x34] -_0805390A: - movs r1, 0x20 - ldrsh r0, [r5, r1] - cmp r0, 0x78 - bne _08053916 - movs r0, 0 - strh r0, [r5, 0x30] -_08053916: - ldrh r0, [r5, 0x36] - ldrh r2, [r5, 0x2E] - adds r0, r2 - strh r0, [r5, 0x2E] - movs r1, 0x34 - ldrsh r0, [r5, r1] - cmp r0, 0x4 - bne _0805392E - movs r0, 0x1 - strh r0, [r5, 0x3C] - ldr r0, _08053934 @ =SpriteCallbackDummy - str r0, [r5, 0x1C] -_0805392E: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08053934: .4byte SpriteCallbackDummy - thumb_func_end SpriteCB_TradePokeball_Default - - thumb_func_start SpriteCB_TradePokeball_Outbound -SpriteCB_TradePokeball_Outbound: @ 8053938 - push {r4,lr} - sub sp, 0x4 - adds r4, r0, 0 - ldr r1, _080539A0 @ =gUnknown_826D1E4 - movs r2, 0x2E - ldrsh r0, [r4, r2] - adds r0, r1 - ldrb r0, [r0] - lsls r0, 24 - asrs r0, 24 - ldrh r1, [r4, 0x26] - adds r0, r1 - strh r0, [r4, 0x26] - movs r2, 0x2E - ldrsh r0, [r4, r2] - cmp r0, 0x16 - bne _08053960 - movs r0, 0x31 - bl PlaySE -_08053960: - ldrh r0, [r4, 0x2E] - adds r0, 0x1 - strh r0, [r4, 0x2E] - lsls r0, 16 - asrs r0, 16 - cmp r0, 0x2C - bne _08053996 - movs r0, 0x85 - bl PlaySE - ldr r0, _080539A4 @ =SpriteCB_TradePokeball_Outbound2 - str r0, [r4, 0x1C] - movs r0, 0 - strh r0, [r4, 0x2E] - ldrb r1, [r4, 0x5] - lsrs r1, 4 - adds r1, 0x10 - movs r0, 0x1 - lsls r0, r1 - movs r1, 0x1 - negs r1, r1 - ldr r2, _080539A8 @ =0x0000ffff - str r2, [sp] - movs r2, 0 - movs r3, 0x10 - bl BeginNormalPaletteFade -_08053996: - add sp, 0x4 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080539A0: .4byte gUnknown_826D1E4 -_080539A4: .4byte SpriteCB_TradePokeball_Outbound2 -_080539A8: .4byte 0x0000ffff - thumb_func_end SpriteCB_TradePokeball_Outbound - - thumb_func_start SpriteCB_TradePokeball_Outbound2 -SpriteCB_TradePokeball_Outbound2: @ 80539AC - push {r4,lr} - adds r4, r0, 0 - movs r1, 0x30 - ldrsh r0, [r4, r1] - cmp r0, 0x14 - bne _080539C0 - adds r0, r4, 0 - movs r1, 0x1 - bl StartSpriteAffineAnim -_080539C0: - ldrh r0, [r4, 0x30] - adds r0, 0x1 - strh r0, [r4, 0x30] - lsls r0, 16 - asrs r0, 16 - cmp r0, 0x14 - ble _080539FE - ldr r1, _08053A04 @ =gUnknown_826D1E4 - movs r2, 0x2E - ldrsh r0, [r4, r2] - adds r0, r1 - movs r1, 0 - ldrsb r1, [r0, r1] - ldrh r0, [r4, 0x26] - subs r0, r1 - strh r0, [r4, 0x26] - ldrh r0, [r4, 0x2E] - adds r0, 0x1 - strh r0, [r4, 0x2E] - lsls r0, 16 - asrs r0, 16 - cmp r0, 0x17 - bne _080539FE - adds r0, r4, 0 - bl DestroySprite - ldr r0, _08053A08 @ =sTradeData - ldr r0, [r0] - adds r0, 0x94 - movs r1, 0xE - strh r1, [r0] -_080539FE: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08053A04: .4byte gUnknown_826D1E4 -_08053A08: .4byte sTradeData - thumb_func_end SpriteCB_TradePokeball_Outbound2 - - thumb_func_start SpriteCB_TradePokeball_Inbound -SpriteCB_TradePokeball_Inbound: @ 8053A0C - push {r4,lr} - adds r4, r0, 0 - ldrh r2, [r4, 0x32] - movs r1, 0x32 - ldrsh r0, [r4, r1] - cmp r0, 0 - bne _08053A3C - ldrh r0, [r4, 0x22] - adds r0, 0x4 - strh r0, [r4, 0x22] - lsls r0, 16 - asrs r0, 16 - movs r3, 0x34 - ldrsh r1, [r4, r3] - cmp r0, r1 - ble _08053A8C - adds r0, r2, 0x1 - strh r0, [r4, 0x32] - movs r0, 0x16 - strh r0, [r4, 0x2E] - movs r0, 0x31 - bl PlaySE - b _08053A8C -_08053A3C: - movs r1, 0x2E - ldrsh r0, [r4, r1] - cmp r0, 0x42 - bne _08053A4A - movs r0, 0x32 - bl PlaySE -_08053A4A: - movs r2, 0x2E - ldrsh r0, [r4, r2] - cmp r0, 0x5C - bne _08053A58 - movs r0, 0x33 - bl PlaySE -_08053A58: - movs r3, 0x2E - ldrsh r0, [r4, r3] - cmp r0, 0x6B - bne _08053A66 - movs r0, 0x34 - bl PlaySE -_08053A66: - ldr r1, _08053A94 @ =gUnknown_826D1E4 - movs r2, 0x2E - ldrsh r0, [r4, r2] - adds r0, r1 - ldrb r0, [r0] - lsls r0, 24 - asrs r0, 24 - ldrh r3, [r4, 0x26] - adds r0, r3 - strh r0, [r4, 0x26] - ldrh r0, [r4, 0x2E] - adds r0, 0x1 - strh r0, [r4, 0x2E] - lsls r0, 16 - asrs r0, 16 - cmp r0, 0x6C - bne _08053A8C - ldr r0, _08053A98 @ =SpriteCallbackDummy - str r0, [r4, 0x1C] -_08053A8C: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08053A94: .4byte gUnknown_826D1E4 -_08053A98: .4byte SpriteCallbackDummy - thumb_func_end SpriteCB_TradePokeball_Inbound - - thumb_func_start GetInGameTradeSpeciesInfo -GetInGameTradeSpeciesInfo: @ 8053A9C - push {r4-r6,lr} - ldr r0, _08053AD0 @ =gSpecialVar_0x8004 - ldrh r0, [r0] - lsls r4, r0, 4 - subs r4, r0 - lsls r4, 2 - ldr r0, _08053AD4 @ =gIngameTrades - adds r4, r0 - ldr r0, _08053AD8 @ =gStringVar1 - ldrh r1, [r4, 0x38] - movs r6, 0xB - muls r1, r6 - ldr r5, _08053ADC @ =gSpeciesNames - adds r1, r5 - bl StringCopy - ldr r0, _08053AE0 @ =gStringVar2 - ldrh r1, [r4, 0xC] - muls r1, r6 - adds r1, r5 - bl StringCopy - ldrh r0, [r4, 0x38] - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_08053AD0: .4byte gSpecialVar_0x8004 -_08053AD4: .4byte gIngameTrades -_08053AD8: .4byte gStringVar1 -_08053ADC: .4byte gSpeciesNames -_08053AE0: .4byte gStringVar2 - thumb_func_end GetInGameTradeSpeciesInfo - - thumb_func_start BufferInGameTradeMonName -BufferInGameTradeMonName: @ 8053AE4 - push {r4,lr} - sub sp, 0x20 - ldr r0, _08053B2C @ =gSpecialVar_0x8004 - ldrh r0, [r0] - lsls r4, r0, 4 - subs r4, r0 - lsls r4, 2 - ldr r0, _08053B30 @ =gIngameTrades - adds r4, r0 - ldr r0, _08053B34 @ =gSpecialVar_0x8005 - ldrh r1, [r0] - movs r0, 0x64 - muls r0, r1 - ldr r1, _08053B38 @ =gPlayerParty - adds r0, r1 - movs r1, 0x2 - mov r2, sp - bl GetMonData - ldr r0, _08053B3C @ =gStringVar1 - mov r1, sp - bl StringCopy10 - ldr r0, _08053B40 @ =gStringVar2 - ldrh r2, [r4, 0xC] - movs r1, 0xB - muls r1, r2 - ldr r2, _08053B44 @ =gSpeciesNames - adds r1, r2 - bl StringCopy - add sp, 0x20 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08053B2C: .4byte gSpecialVar_0x8004 -_08053B30: .4byte gIngameTrades -_08053B34: .4byte gSpecialVar_0x8005 -_08053B38: .4byte gPlayerParty -_08053B3C: .4byte gStringVar1 -_08053B40: .4byte gStringVar2 -_08053B44: .4byte gSpeciesNames - thumb_func_end BufferInGameTradeMonName - - thumb_func_start sub_8053B48 -sub_8053B48: @ 8053B48 - push {r4-r7,lr} - sub sp, 0x38 - lsls r0, 24 - lsrs r0, 24 - lsls r1, 24 - lsrs r1, 24 - lsls r2, r1, 4 - subs r2, r1 - lsls r2, 2 - ldr r1, _08053CA4 @ =gIngameTrades - adds r5, r2, r1 - movs r1, 0x64 - muls r0, r1 - ldr r1, _08053CA8 @ =gPlayerParty - adds r0, r1 - movs r1, 0x38 - bl GetMonData - adds r2, r0, 0 - lsls r2, 24 - lsrs r2, 24 - add r4, sp, 0x34 - movs r0, 0xFE - strb r0, [r4] - ldr r6, _08053CAC @ =gEnemyParty - ldrh r1, [r5, 0xC] - movs r3, 0x1 - str r3, [sp] - ldr r0, [r5, 0x24] - str r0, [sp, 0x4] - str r3, [sp, 0x8] - ldr r0, [r5, 0x18] - str r0, [sp, 0xC] - adds r0, r6, 0 - movs r3, 0x20 - bl CreateMon - adds r2, r5, 0 - adds r2, 0xE - adds r0, r6, 0 - movs r1, 0x27 - bl SetMonData - adds r2, r5, 0 - adds r2, 0xF - adds r0, r6, 0 - movs r1, 0x28 - bl SetMonData - adds r2, r5, 0 - adds r2, 0x10 - adds r0, r6, 0 - movs r1, 0x29 - bl SetMonData - adds r2, r5, 0 - adds r2, 0x11 - adds r0, r6, 0 - movs r1, 0x2A - bl SetMonData - adds r2, r5, 0 - adds r2, 0x12 - adds r0, r6, 0 - movs r1, 0x2B - bl SetMonData - adds r2, r5, 0 - adds r2, 0x13 - adds r0, r6, 0 - movs r1, 0x2C - bl SetMonData - adds r0, r6, 0 - movs r1, 0x2 - adds r2, r5, 0 - bl SetMonData - adds r2, r5, 0 - adds r2, 0x2B - adds r0, r6, 0 - movs r1, 0x7 - bl SetMonData - adds r2, r5, 0 - adds r2, 0x36 - adds r0, r6, 0 - movs r1, 0x31 - bl SetMonData - adds r2, r5, 0 - adds r2, 0x14 - adds r0, r6, 0 - movs r1, 0x2E - bl SetMonData - adds r2, r5, 0 - adds r2, 0x1D - adds r0, r6, 0 - movs r1, 0x17 - bl SetMonData - adds r2, r5, 0 - adds r2, 0x1E - adds r0, r6, 0 - movs r1, 0x18 - bl SetMonData - adds r2, r5, 0 - adds r2, 0x1C - adds r0, r6, 0 - movs r1, 0x16 - bl SetMonData - adds r2, r5, 0 - adds r2, 0x1F - adds r0, r6, 0 - movs r1, 0x21 - bl SetMonData - adds r2, r5, 0 - adds r2, 0x20 - adds r0, r6, 0 - movs r1, 0x2F - bl SetMonData - adds r2, r5, 0 - adds r2, 0x37 - adds r0, r6, 0 - movs r1, 0x30 - bl SetMonData - adds r0, r6, 0 - movs r1, 0x23 - adds r2, r4, 0 - bl SetMonData - mov r4, sp - adds r4, 0x35 - movs r0, 0 - strb r0, [r4] - ldrh r0, [r5, 0x28] - cmp r0, 0 - beq _08053CC0 - bl ItemIsMail - lsls r0, 24 - cmp r0, 0 - beq _08053CB4 - add r0, sp, 0x10 - adds r1, r5, 0 - bl sub_8053CD4 - ldr r0, _08053CB0 @ =gLinkPartnerMail - add r1, sp, 0x10 - ldm r1!, {r2,r3,r7} - stm r0!, {r2,r3,r7} - ldm r1!, {r2,r3,r7} - stm r0!, {r2,r3,r7} - ldm r1!, {r2,r3,r7} - stm r0!, {r2,r3,r7} - adds r0, r6, 0 - movs r1, 0x40 - adds r2, r4, 0 - bl SetMonData - adds r2, r5, 0 - adds r2, 0x28 - adds r0, r6, 0 - movs r1, 0xC - bl SetMonData - b _08053CC0 - .align 2, 0 -_08053CA4: .4byte gIngameTrades -_08053CA8: .4byte gPlayerParty -_08053CAC: .4byte gEnemyParty -_08053CB0: .4byte gLinkPartnerMail -_08053CB4: - adds r2, r5, 0 - adds r2, 0x28 - adds r0, r6, 0 - movs r1, 0xC - bl SetMonData -_08053CC0: - ldr r0, _08053CD0 @ =gEnemyParty - bl CalculateMonStats - add sp, 0x38 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08053CD0: .4byte gEnemyParty - thumb_func_end sub_8053B48 - - thumb_func_start sub_8053CD4 -sub_8053CD4: @ 8053CD4 - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - ldr r2, _08053D28 @ =gUnknown_826D1A8 - adds r0, r5, 0 - adds r0, 0x2A - ldrb r1, [r0] - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 2 - adds r2, r0, r2 - adds r1, r4, 0 - movs r3, 0x8 -_08053CEE: - ldrh r0, [r2] - strh r0, [r1] - adds r2, 0x2 - adds r1, 0x2 - subs r3, 0x1 - cmp r3, 0 - bge _08053CEE - adds r0, r4, 0 - adds r0, 0x12 - adds r1, r5, 0 - adds r1, 0x2B - bl StringCopy - ldr r1, [r5, 0x18] - lsrs r0, r1, 24 - strb r0, [r4, 0x1A] - lsrs r0, r1, 16 - strb r0, [r4, 0x1B] - lsrs r0, r1, 8 - strb r0, [r4, 0x1C] - strb r1, [r4, 0x1D] - ldrh r0, [r5, 0xC] - strh r0, [r4, 0x1E] - ldrh r0, [r5, 0x28] - strh r0, [r4, 0x20] - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08053D28: .4byte gUnknown_826D1A8 - thumb_func_end sub_8053CD4 - - thumb_func_start GetTradeSpecies -GetTradeSpecies: @ 8053D2C - push {r4-r6,lr} - ldr r6, _08053D58 @ =gSpecialVar_0x8005 - ldrh r0, [r6] - movs r5, 0x64 - muls r0, r5 - ldr r4, _08053D5C @ =gPlayerParty - adds r0, r4 - movs r1, 0x2D - bl GetMonData - cmp r0, 0 - bne _08053D60 - ldrh r0, [r6] - muls r0, r5 - adds r0, r4 - movs r1, 0xB - bl GetMonData - lsls r0, 16 - lsrs r0, 16 - b _08053D62 - .align 2, 0 -_08053D58: .4byte gSpecialVar_0x8005 -_08053D5C: .4byte gPlayerParty -_08053D60: - movs r0, 0 -_08053D62: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end GetTradeSpecies - - thumb_func_start CreateInGameTradePokemon -CreateInGameTradePokemon: @ 8053D68 - push {lr} - ldr r0, _08053D7C @ =gSpecialVar_0x8005 - ldrb r0, [r0] - ldr r1, _08053D80 @ =gSpecialVar_0x8004 - ldrb r1, [r1] - bl sub_8053B48 - pop {r0} - bx r0 - .align 2, 0 -_08053D7C: .4byte gSpecialVar_0x8005 -_08053D80: .4byte gSpecialVar_0x8004 - thumb_func_end CreateInGameTradePokemon - - thumb_func_start CB2_RunTradeAnim_LinkTrade -CB2_RunTradeAnim_LinkTrade: @ 8053D84 - push {r4-r6,lr} - bl sub_8050F14 - lsls r0, 24 - lsrs r6, r0, 24 - cmp r6, 0x1 - bne _08053DE6 - ldr r5, _08053E08 @ =sTradeData - ldr r0, [r5] - adds r0, 0x8E - ldrb r1, [r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - ldr r4, _08053E0C @ =gSprites - adds r0, r4 - bl DestroySprite - ldr r0, [r5] - adds r0, 0x8F - ldrb r1, [r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r4 - bl FreeSpriteOamMatrix - ldr r0, _08053E10 @ =gSelectedTradeMonPositions - ldrb r4, [r0] - ldrb r0, [r0, 0x1] - movs r1, 0x6 - bl __umodsi3 - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - bl TradeMons - ldr r0, [r5] - adds r2, r0, 0 - adds r2, 0x74 - ldr r1, _08053E14 @ =0x0000abcd - strh r1, [r2] - adds r0, 0x93 - strb r6, [r0] - ldr r0, _08053E18 @ =sub_8053E1C - bl SetMainCallback2 -_08053DE6: - bl sub_80508F4 - bl sub_805383C - bl RunTasks - bl RunTextPrinters - bl AnimateSprites - bl BuildOamBuffer - bl UpdatePaletteFade - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08053E08: .4byte sTradeData -_08053E0C: .4byte gSprites -_08053E10: .4byte gSelectedTradeMonPositions -_08053E14: .4byte 0x0000abcd -_08053E18: .4byte sub_8053E1C - thumb_func_end CB2_RunTradeAnim_LinkTrade - - thumb_func_start sub_8053E1C -sub_8053E1C: @ 8053E1C - push {r4,lr} - bl sub_804FFC4 - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - bl sub_805383C - cmp r4, 0 - bne _08053E68 - ldr r4, _08053E80 @ =sTradeData - ldr r2, [r4] - adds r0, r2, 0 - adds r0, 0x72 - ldrh r1, [r0] - ldr r0, _08053E84 @ =0x00000101 - cmp r1, r0 - bne _08053E68 - adds r1, r2, 0 - adds r1, 0x74 - ldr r0, _08053E88 @ =0x0000dcba - strh r0, [r1] - bl bitmask_all_link_players_but_self - lsls r0, 24 - lsrs r0, 24 - ldr r1, [r4] - adds r1, 0x74 - movs r2, 0x14 - bl SendBlock - ldr r0, [r4] - adds r0, 0x72 - movs r1, 0x2 - strb r1, [r0] - ldr r0, [r4] - adds r0, 0x73 - strb r1, [r0] -_08053E68: - bl RunTasks - bl AnimateSprites - bl BuildOamBuffer - bl UpdatePaletteFade - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08053E80: .4byte sTradeData -_08053E84: .4byte 0x00000101 -_08053E88: .4byte 0x0000dcba - thumb_func_end sub_8053E1C - thumb_func_start sub_8053E8C sub_8053E8C: @ 8053E8C push {r4,lr} diff --git a/data/ingame_trades.inc b/data/ingame_trades.inc index c3447d79b..ef0bf0993 100644 --- a/data/ingame_trades.inc +++ b/data/ingame_trades.inc @@ -1,4 +1,4 @@ -gIngameTrades:: @ 826CF8C +gInGameTrades:: @ 826CF8C .string "MIMIEN$", 11 .align 1 .2byte SPECIES_MR_MIME @ species @@ -161,7 +161,7 @@ gIngameTrades:: @ 826CF8C .2byte SPECIES_PONYTA @ species requested .align 2 -gUnknown_826D1A8:: @ 826D1A8 +sInGameTradeMailMessages:: @ 826D1A8 .2byte EC_WORD_THAT_S .2byte EC_WORD_A .2byte EC_WORD_HEALTHY diff --git a/include/constants/flags.h b/include/constants/flags.h index 082e12f87..80eaca3e0 100644 --- a/include/constants/flags.h +++ b/include/constants/flags.h @@ -1,7 +1,7 @@ #ifndef GUARD_CONSTANTS_FLAGS_H #define GUARD_CONSTANTS_FLAGS_H -// TODO: Get correct names and numbers +#include "constants/trainers.h" #define FLAG_TEMP_1 0x001 #define FLAG_TEMP_2 0x002 @@ -1309,10 +1309,12 @@ #define FLAG_TRAINER_FLAG_START 0x500 -#define TRAINERS_FLAG_NO 0x2E7 // 743 -#define TRAINER_FLAGS_WORDS 0x300 - -#define SYS_FLAGS (FLAG_TRAINER_FLAG_START + TRAINER_FLAGS_WORDS) // 0x800 +// Vanilla: SYS_FLAGS = 0x800 +#if (NUM_TRAINERS) & 31 +#define SYS_FLAGS (FLAG_TRAINER_FLAG_START + ((NUM_TRAINERS) + 31) / 32 * 32) +#else +#define SYS_FLAGS (FLAG_TRAINER_FLAG_START + (NUM_TRAINERS)) +#endif // SYSTEM FLAGS diff --git a/include/constants/region_map.h b/include/constants/region_map.h index 527acf2c9..0957a72ee 100644 --- a/include/constants/region_map.h +++ b/include/constants/region_map.h @@ -200,4 +200,6 @@ #define MAPSEC_SPECIAL_AREA 0xC4 #define MAPSEC_NONE 0xC5 +#define MAPSEC_IN_GAME_TRADE 0xFE + #endif //GUARD_CONSTANTS_REGION_MAP_H diff --git a/src/trade.c b/src/trade.c index 40be0774b..f33388eed 100644 --- a/src/trade.c +++ b/src/trade.c @@ -38,6 +38,7 @@ #include "constants/items.h" #include "constants/easy_chat.h" #include "constants/songs.h" +#include "constants/region_map.h" #include "constants/moves.h" struct InGameTrade { @@ -201,13 +202,17 @@ void sub_8050E24(void); u8 sub_8050F14(void); u8 sub_8050F3C(void); u8 sub_805232C(void); +void SpriteCB_TradePokeball_Outbound(struct Sprite * sprite); +void SpriteCB_TradePokeball_Outbound2(struct Sprite * sprite); +void SpriteCB_TradePokeball_Inbound(struct Sprite * sprite); +void BufferInGameTradeMonName(void); +static void GetInGameTradeMail(struct MailStruct * mail, const struct InGameTrade * inGameTrade); void CB2_RunTradeAnim_LinkTrade(void); +void sub_8053E1C(void); +void sub_8053E8C(void); void LoadHeldItemIcons(void); void DrawTextOnTradeWindow(u8 windowId, const u8 *str, s8 speed); void CheckPartnersMonForRibbons(void); -void BufferInGameTradeMonName(void); -void SpriteCB_TradePokeball_Outbound(struct Sprite * sprite); -void SpriteCB_TradePokeball_Inbound(struct Sprite * sprite); void Task_AnimateWirelessSignal(u8 taskId); void c3_0805465C(u8 taskId); void sub_8054734(u8 taskId); @@ -258,7 +263,7 @@ extern const struct SpriteSheet gUnknown_826CEB0; extern const struct SpriteSheet gUnknown_826CF28; extern const struct SpritePalette gUnknown_826CE34; extern const struct SpritePalette gUnknown_826CE3C; -extern const struct InGameTrade gIngameTrades[]; +extern const struct InGameTrade gInGameTrades[]; extern const struct SpriteTemplate sTradePokeballSpriteTemplate; extern const struct SpriteTemplate gUnknown_826CF30; extern const struct SpriteTemplate sGameLinkCableEndSpriteTemplate; @@ -266,6 +271,8 @@ extern const struct SpriteTemplate gUnknown_826CE44; extern const struct SpriteTemplate sGlowBallSpriteTemplate; extern const union AffineAnimCmd *const gUnknown_826CF88[]; extern const struct SpriteTemplate gUnknown_826CF48; +extern const s8 gUnknown_826D1E4[]; +extern const u16 sInGameTradeMailMessages[][10]; void sub_804C600(void) { @@ -4737,7 +4744,7 @@ void sub_8050E24(void) } else { - inGameTrade = &gIngameTrades[gSpecialVar_0x8004]; + inGameTrade = &gInGameTrades[gSpecialVar_0x8004]; StringCopy(gStringVar1, inGameTrade->otName); StringCopy10(gStringVar3, inGameTrade->nickname); GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_NICKNAME, nickname); @@ -5770,3 +5777,260 @@ bool8 sub_805232C(void) } return FALSE; } + +void sub_8053788(void) +{ + u16 evoSpecies; + switch (gMain.state) + { + case 0: + gMain.state = 4; + gSoftResetDisabled = TRUE; + break; + case 4: + gCB2_AfterEvolution = sub_8053E8C; + evoSpecies = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[0]], 1, 0); + if (evoSpecies != SPECIES_NONE) + TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[0]], evoSpecies, sTradeData->pokePicSpriteIdxs[1], gSelectedTradeMonPositions[0]); + else + SetMainCallback2(sub_8053E8C); + gSelectedTradeMonPositions[0] = 0xFF; + break; + } + if (!HasLinkErrorOccurred()) + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void sub_805383C(void) +{ + u8 recvStatus; + sub_804FFC4(); + recvStatus = GetBlockReceivedStatus(); + if (recvStatus & (1 << 0)) + { + if (gBlockRecvBuffer[0][0] == 0xDCBA) + SetMainCallback2(sub_8053788); + if (gBlockRecvBuffer[0][0] == 0xABCD) + sTradeData->unk_72 = 1; + ResetBlockReceivedFlag(0); + } + if (recvStatus & (1 << 1)) + { + if (gBlockRecvBuffer[1][0] == 0xABCD) + sTradeData->unk_73 = 1; + ResetBlockReceivedFlag(1); + } +} + +void SpriteCB_TradePokeball_Default(struct Sprite * sprite) +{ + sprite->pos1.y += sprite->data[0] / 10; + sprite->data[5] += sprite->data[1]; + sprite->pos1.x = sprite->data[5] / 10; + if (sprite->pos1.y > 76) + { + sprite->pos1.y = 76; + sprite->data[0] = -(sprite->data[0] * sprite->data[2]) / 100; + sprite->data[3]++; + } + if (sprite->pos1.x == 120) + sprite->data[1] = 0; + sprite->data[0] += sprite->data[4]; + if (sprite->data[3] == 4) + { + sprite->data[7] = 1; + sprite->callback = SpriteCallbackDummy; + } +} + +void SpriteCB_TradePokeball_Outbound(struct Sprite * sprite) +{ + sprite->pos2.y += gUnknown_826D1E4[sprite->data[0]]; + if (sprite->data[0] == 22) + PlaySE(SE_KON); + sprite->data[0]++; + if (sprite->data[0] == 44) + { + PlaySE(SE_W025); + sprite->callback = SpriteCB_TradePokeball_Outbound2; + sprite->data[0] = 0; + BeginNormalPaletteFade(1 << (sprite->oam.paletteNum + 16), -1, 0, 16, RGB_WHITEALPHA); + } +} + +void SpriteCB_TradePokeball_Outbound2(struct Sprite * sprite) +{ + if (sprite->data[1] == 20) + StartSpriteAffineAnim(sprite, 1); + sprite->data[1]++; + if (sprite->data[1] > 20) + { + sprite->pos2.y -= gUnknown_826D1E4[sprite->data[0]]; + sprite->data[0]++; + if (sprite->data[0] == 23) + { + DestroySprite(sprite); + sTradeData->state = 14; + } + } +} + +void SpriteCB_TradePokeball_Inbound(struct Sprite * sprite) +{ + if (sprite->data[2] == 0) + { + sprite->pos1.y += 4; + if (sprite->pos1.y > sprite->data[3]) + { + sprite->data[2]++; + sprite->data[0] = 22; + PlaySE(SE_KON); + } + } + else + { + if (sprite->data[0] == 66) + PlaySE(SE_KON2); + if (sprite->data[0] == 92) + PlaySE(SE_KON3); + if (sprite->data[0] == 107) + PlaySE(SE_KON4); + sprite->pos2.y += gUnknown_826D1E4[sprite->data[0]]; + sprite->data[0]++; + if (sprite->data[0] == 108) + sprite->callback = SpriteCallbackDummy; + } +} + +u16 GetInGameTradeSpeciesInfo(void) +{ + // Populates gStringVar1 with the name of the requested species and + // gStringVar2 with the name of the offered species. + // Returns the requested species. + const struct InGameTrade * inGameTrade = &gInGameTrades[gSpecialVar_0x8004]; + StringCopy(gStringVar1, gSpeciesNames[inGameTrade->requestedSpecies]); + StringCopy(gStringVar2, gSpeciesNames[inGameTrade->species]); + return inGameTrade->requestedSpecies; +} + +void BufferInGameTradeMonName(void) +{ + // Populates gStringVar1 with the nickname of the sent Pokemon and + // gStringVar2 with the name of the offered species. + u8 nickname[30]; + const struct InGameTrade * inGameTrade = &gInGameTrades[gSpecialVar_0x8004]; + GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_NICKNAME, nickname); + StringCopy10(gStringVar1, nickname); + StringCopy(gStringVar2, gSpeciesNames[inGameTrade->species]); +} + +void CreateInGameTradePokemonInternal(u8 playerSlot, u8 inGameTradeIdx) +{ + const struct InGameTrade *inGameTrade = &gInGameTrades[inGameTradeIdx]; + u8 level = GetMonData(&gPlayerParty[playerSlot], MON_DATA_LEVEL); + struct MailStruct mail; + u8 metLocation = MAPSEC_IN_GAME_TRADE; + struct Pokemon * tradeMon = &gEnemyParty[0]; + u8 mailNum; + CreateMon(tradeMon, inGameTrade->species, level, 32, TRUE, inGameTrade->personality, TRUE, inGameTrade->otId); + SetMonData(tradeMon, MON_DATA_HP_IV, &inGameTrade->ivs[0]); + SetMonData(tradeMon, MON_DATA_ATK_IV, &inGameTrade->ivs[1]); + SetMonData(tradeMon, MON_DATA_DEF_IV, &inGameTrade->ivs[2]); + SetMonData(tradeMon, MON_DATA_SPEED_IV, &inGameTrade->ivs[3]); + SetMonData(tradeMon, MON_DATA_SPATK_IV, &inGameTrade->ivs[4]); + SetMonData(tradeMon, MON_DATA_SPDEF_IV, &inGameTrade->ivs[5]); + SetMonData(tradeMon, MON_DATA_NICKNAME, inGameTrade->nickname); + SetMonData(tradeMon, MON_DATA_OT_NAME, inGameTrade->otName); + SetMonData(tradeMon, MON_DATA_OT_GENDER, &inGameTrade->otGender); + SetMonData(tradeMon, MON_DATA_ABILITY_NUM, &inGameTrade->abilityNum); + SetMonData(tradeMon, MON_DATA_BEAUTY, &inGameTrade->conditions[1]); + SetMonData(tradeMon, MON_DATA_CUTE, &inGameTrade->conditions[2]); + SetMonData(tradeMon, MON_DATA_COOL, &inGameTrade->conditions[0]); + SetMonData(tradeMon, MON_DATA_SMART, &inGameTrade->conditions[3]); + SetMonData(tradeMon, MON_DATA_TOUGH, &inGameTrade->conditions[4]); + SetMonData(tradeMon, MON_DATA_SHEEN, &inGameTrade->sheen); + SetMonData(tradeMon, MON_DATA_MET_LOCATION, &metLocation); + mailNum = 0; + if (inGameTrade->heldItem != ITEM_NONE) + { + if (ItemIsMail(inGameTrade->heldItem)) + { + GetInGameTradeMail(&mail, inGameTrade); + gLinkPartnerMail[0] = mail; + SetMonData(tradeMon, MON_DATA_MAIL, &mailNum); + SetMonData(tradeMon, MON_DATA_HELD_ITEM, &inGameTrade->heldItem); + } + else + { + SetMonData(tradeMon, MON_DATA_HELD_ITEM, &inGameTrade->heldItem); + } + } + CalculateMonStats(&gEnemyParty[0]); +} + +static void GetInGameTradeMail(struct MailStruct * mail, const struct InGameTrade * inGameTrade) +{ + int i; + for (i = 0; i < 9; i++) + mail->words[i] = sInGameTradeMailMessages[inGameTrade->mailNum][i]; + StringCopy(mail->playerName, inGameTrade->otName); + mail->trainerId[0] = inGameTrade->otId >> 24; + mail->trainerId[1] = inGameTrade->otId >> 16; + mail->trainerId[2] = inGameTrade->otId >> 8; + mail->trainerId[3] = inGameTrade->otId; + mail->species = inGameTrade->species; + mail->itemId = inGameTrade->heldItem; +} + +u16 GetTradeSpecies(void) +{ + if (GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_IS_EGG)) + return SPECIES_NONE; + else + return GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_SPECIES); +} + +void CreateInGameTradePokemon(void) +{ + CreateInGameTradePokemonInternal(gSpecialVar_0x8005, gSpecialVar_0x8004); +} + +void CB2_RunTradeAnim_LinkTrade(void) +{ + if (sub_8050F14() == TRUE) + { + DestroySprite(&gSprites[sTradeData->pokePicSpriteIdxs[0]]); + FreeSpriteOamMatrix(&gSprites[sTradeData->pokePicSpriteIdxs[1]]); + TradeMons(gSelectedTradeMonPositions[0], gSelectedTradeMonPositions[1] % 6); + sTradeData->linkData[0] = 0xABCD; + sTradeData->unk_93 = 1; + SetMainCallback2(sub_8053E1C); + } + sub_80508F4(); + sub_805383C(); + RunTasks(); + RunTextPrinters(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void sub_8053E1C(void) +{ + u8 mpId = sub_804FFC4(); + sub_805383C(); + if (mpId == 0 && sTradeData->unk_72 == 1 && sTradeData->unk_73 == 1) + { + sTradeData->linkData[0] = 0xDCBA; + SendBlock(bitmask_all_link_players_but_self(), sTradeData->linkData, 20); + sTradeData->unk_72 = 2; + sTradeData->unk_73 = 2; + } + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} |