diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2019-10-29 12:58:40 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2019-10-29 12:58:40 -0400 |
commit | ce5c3fdd776a47d5d6c3790249c53afaff844553 (patch) | |
tree | 4a0b936cb0b017b4f7fac5c304c73f34c3dde0cc | |
parent | a1ec6ccff14cb0e95359b6595f35620ab606bc03 (diff) |
Trade through sub_804FFE4
-rw-r--r-- | asm/trade.s | 389 | ||||
-rw-r--r-- | data/trade.s | 2 | ||||
-rw-r--r-- | include/decompress.h | 1 | ||||
-rw-r--r-- | include/util.h | 1 | ||||
-rw-r--r-- | src/trade.c | 174 |
5 files changed, 170 insertions, 397 deletions
diff --git a/asm/trade.s b/asm/trade.s index 541572649..bcb88fdb7 100644 --- a/asm/trade.s +++ b/asm/trade.s @@ -5,395 +5,6 @@ .text - thumb_func_start sub_804FE24 -sub_804FE24: @ 804FE24 - push {r4,r5,lr} - sub sp, 0x20 - ldr r0, _0804FEB0 @ =gUnknown_2031DAC - ldr r0, [r0] - mov r12, r0 - adds r0, 0xD4 - ldrh r1, [r0] - lsls r1, 8 - adds r0, 0x2 - ldrh r2, [r0] - lsls r2, 8 - adds r0, 0x6 - movs r4, 0 - ldrsh r3, [r0, r4] - adds r0, 0x2 - movs r5, 0 - ldrsh r0, [r0, r5] - str r0, [sp] - mov r4, r12 - adds r4, 0xE8 - movs r5, 0 - ldrsh r0, [r4, r5] - str r0, [sp, 0x4] - movs r5, 0 - ldrsh r0, [r4, r5] - str r0, [sp, 0x8] - mov r0, r12 - adds r0, 0xEC - ldrh r0, [r0] - str r0, [sp, 0xC] - add r0, sp, 0x10 - bl DoBgAffineSet - add r0, sp, 0x10 - ldrh r1, [r0] - movs r0, 0x20 - bl SetGpuReg - add r0, sp, 0x10 - ldrh r1, [r0, 0x2] - movs r0, 0x22 - bl SetGpuReg - add r0, sp, 0x10 - ldrh r1, [r0, 0x4] - movs r0, 0x24 - bl SetGpuReg - add r0, sp, 0x10 - ldrh r1, [r0, 0x6] - movs r0, 0x26 - bl SetGpuReg - ldr r1, [sp, 0x18] - lsls r1, 16 - lsrs r1, 16 - movs r0, 0x28 - bl SetGpuReg - ldr r1, [sp, 0x1C] - lsls r1, 16 - lsrs r1, 16 - movs r0, 0x2C - bl SetGpuReg - add sp, 0x20 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0804FEB0: .4byte gUnknown_2031DAC - thumb_func_end sub_804FE24 - - thumb_func_start sub_804FEB4 -sub_804FEB4: @ 804FEB4 - push {r4,lr} - ldr r4, _0804FEFC @ =gUnknown_2031DAC - ldr r0, [r4] - adds r0, 0xE0 - ldrh r1, [r0] - movs r0, 0x16 - bl SetGpuReg - ldr r0, [r4] - adds r0, 0xE2 - ldrh r1, [r0] - movs r0, 0x14 - bl SetGpuReg - movs r0, 0 - bl GetGpuReg - lsls r0, 16 - movs r1, 0xE0 - lsls r1, 11 - ands r1, r0 - cmp r1, 0 - bne _0804FF00 - ldr r0, [r4] - adds r0, 0xE4 - ldrh r1, [r0] - movs r0, 0x1A - bl SetGpuReg - ldr r0, [r4] - adds r0, 0xE6 - ldrh r1, [r0] - movs r0, 0x18 - bl SetGpuReg - b _0804FF04 - .align 2, 0 -_0804FEFC: .4byte gUnknown_2031DAC -_0804FF00: - bl sub_804FE24 -_0804FF04: - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_804FEB4 - - thumb_func_start sub_804FF0C -sub_804FF0C: @ 804FF0C - push {lr} - bl sub_804FEB4 - bl LoadOam - bl ProcessSpriteCopyRequests - bl TransferPlttBuffer - pop {r0} - bx r0 - thumb_func_end sub_804FF0C - - thumb_func_start sub_804FF24 -sub_804FF24: @ 804FF24 - push {r4,lr} - ldr r3, _0804FF48 @ =gUnknown_2031DAC - ldr r1, [r3] - movs r0, 0x8A - adds r0, r1 - mov r12, r0 - movs r2, 0 - movs r0, 0 - mov r4, r12 - strh r0, [r4] - adds r1, 0x88 - strb r2, [r1] - ldr r0, [r3] - adds r0, 0x89 - strb r2, [r0] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0804FF48: .4byte gUnknown_2031DAC - thumb_func_end sub_804FF24 - - thumb_func_start sub_804FF4C -sub_804FF4C: @ 804FF4C - push {r4,r5,lr} - ldr r0, _0804FF70 @ =gUnknown_2031DAC - ldr r2, [r0] - adds r1, r2, 0 - adds r1, 0x88 - adds r3, r2, 0 - adds r3, 0x89 - ldrb r1, [r1] - adds r5, r0, 0 - ldrb r3, [r3] - cmp r1, r3 - bne _0804FF74 - adds r1, r2, 0 - adds r1, 0x8A - ldrh r0, [r1] - adds r0, 0x1 - b _0804FF7A - .align 2, 0 -_0804FF70: .4byte gUnknown_2031DAC -_0804FF74: - adds r1, r2, 0 - adds r1, 0x8A - movs r0, 0 -_0804FF7A: - strh r0, [r1] - adds r4, r5, 0 - ldr r0, [r4] - adds r0, 0x8A - ldrh r1, [r0] - movs r0, 0x96 - lsls r0, 1 - cmp r1, r0 - bls _0804FFAC - bl CloseLink - ldr r0, _0804FFC0 @ =CB2_LinkError - bl SetMainCallback2 - ldr r1, [r4] - adds r3, r1, 0 - adds r3, 0x8A - movs r2, 0 - movs r0, 0 - strh r0, [r3] - adds r1, 0x89 - strb r2, [r1] - ldr r0, [r4] - adds r0, 0x88 - strb r2, [r0] -_0804FFAC: - ldr r0, [r5] - adds r1, r0, 0 - adds r1, 0x88 - ldrb r1, [r1] - adds r0, 0x89 - strb r1, [r0] - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0804FFC0: .4byte CB2_LinkError - thumb_func_end sub_804FF4C - - thumb_func_start sub_804FFC4 -sub_804FFC4: @ 804FFC4 - push {lr} - ldr r0, _0804FFD4 @ =gReceivedRemoteLinkPlayers - ldrb r0, [r0] - cmp r0, 0 - bne _0804FFD8 - movs r0, 0 - b _0804FFE0 - .align 2, 0 -_0804FFD4: .4byte gReceivedRemoteLinkPlayers -_0804FFD8: - bl GetMultiplayerId - lsls r0, 24 - lsrs r0, 24 -_0804FFE0: - pop {r1} - bx r1 - thumb_func_end sub_804FFC4 - - thumb_func_start sub_804FFE4 -sub_804FFE4: @ 804FFE4 - push {r4-r7,lr} - mov r7, r8 - push {r7} - lsls r0, 24 - lsrs r6, r0, 24 - lsls r1, 24 - lsrs r5, r1, 24 - movs r4, 0 - mov r8, r4 - cmp r6, 0 - bne _0805000A - ldr r0, _08050034 @ =gUnknown_2031DA4 - ldrb r1, [r0] - movs r0, 0x64 - muls r1, r0 - ldr r0, _08050038 @ =gPlayerParty - adds r1, r0 - mov r8, r1 - movs r4, 0x1 -_0805000A: - cmp r6, 0x1 - bne _08050028 - ldr r0, _08050034 @ =gUnknown_2031DA4 - ldrb r0, [r0, 0x1] - movs r1, 0x6 - bl __umodsi3 - lsls r0, 24 - lsrs r0, 24 - movs r1, 0x64 - muls r1, r0 - ldr r0, _0805003C @ =gEnemyParty - adds r1, r0 - mov r8, r1 - movs r4, 0x3 -_08050028: - cmp r5, 0 - beq _08050040 - cmp r5, 0x1 - beq _080500C8 - b _0805011E - .align 2, 0 -_08050034: .4byte gUnknown_2031DA4 -_08050038: .4byte gPlayerParty -_0805003C: .4byte gEnemyParty -_08050040: - mov r0, r8 - movs r1, 0x41 - bl GetMonData - lsls r0, 16 - lsrs r5, r0, 16 - mov r0, r8 - movs r1, 0 - bl GetMonData - adds r7, r0, 0 - cmp r6, 0 - bne _0805007C - lsls r0, r5, 3 - ldr r1, _08050074 @ =gMonFrontPicTable - adds r0, r1 - ldr r1, _08050078 @ =gMonSpritesGfxPtr - ldr r1, [r1] - ldr r1, [r1, 0x8] - adds r2, r5, 0 - adds r3, r7, 0 - bl HandleLoadSpecialPokePic - movs r4, 0 - b _0805009A - .align 2, 0 -_08050074: .4byte gMonFrontPicTable -_08050078: .4byte gMonSpritesGfxPtr -_0805007C: - lsls r0, r5, 3 - ldr r1, _080500BC @ =gMonFrontPicTable - adds r0, r1 - ldr r1, _080500C0 @ =gMonSpritesGfxPtr - ldr r2, [r1] - lsls r4, r6, 1 - adds r1, r4, 0x1 - lsls r1, 2 - adds r2, 0x4 - adds r2, r1 - ldr r1, [r2] - adds r2, r5, 0 - adds r3, r7, 0 - bl HandleLoadSpecialPokePic_DontHandleDeoxys -_0805009A: - mov r0, r8 - bl GetMonSpritePalStruct - bl LoadCompressedSpritePalette - ldr r0, _080500C4 @ =gUnknown_2031DAC - ldr r1, [r0] - adds r0, r1, 0 - adds r0, 0xF0 - adds r0, r4 - strh r5, [r0] - lsls r0, r6, 2 - adds r1, 0x68 - adds r1, r0 - str r7, [r1] - b _0805011E - .align 2, 0 -_080500BC: .4byte gMonFrontPicTable -_080500C0: .4byte gMonSpritesGfxPtr -_080500C4: .4byte gUnknown_2031DAC -_080500C8: - mov r0, r8 - bl GetMonSpritePalStruct - ldrh r0, [r0, 0x4] - adds r1, r4, 0 - bl SetMultiuseSpriteTemplateToPokemon - ldr r0, _08050128 @ =gMultiuseSpriteTemplate - movs r1, 0x78 - movs r2, 0x3C - movs r3, 0x6 - bl CreateSprite - ldr r4, _0805012C @ =gUnknown_2031DAC - ldr r1, [r4] - adds r1, 0x8E - adds r1, r6 - strb r0, [r1] - ldr r3, _08050130 @ =gSprites - ldr r0, [r4] - adds r0, 0x8E - adds r0, r6 - ldrb r1, [r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r3 - adds r0, 0x3E - ldrb r1, [r0] - movs r2, 0x4 - orrs r1, r2 - strb r1, [r0] - ldr r0, [r4] - adds r0, 0x8E - adds r0, r6 - ldrb r1, [r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r3, 0x1C - adds r0, r3 - ldr r1, _08050134 @ =SpriteCallbackDummy - str r1, [r0] -_0805011E: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08050128: .4byte gMultiuseSpriteTemplate -_0805012C: .4byte gUnknown_2031DAC -_08050130: .4byte gSprites -_08050134: .4byte SpriteCallbackDummy - thumb_func_end sub_804FFE4 - thumb_func_start sub_8050138 sub_8050138: @ 8050138 push {r4-r6,lr} diff --git a/data/trade.s b/data/trade.s index 763b94e96..d778318a1 100644 --- a/data/trade.s +++ b/data/trade.s @@ -809,7 +809,7 @@ gUnknown_826CF30:: @ 826CF30 gUnknown_826CF48:: @ 826CF48 spr_template 5556, 5555, gOamData_826CED0, gSpriteAnimTable_826CF24, NULL, gDummySpriteAffineAnimTable, sub_804FE00 -gUnknown_826CF60:: @ 826CF60 +gTradeGlow2PaletteAnimTable:: @ 826CF60 .2byte RGB(18, 24, 31) .2byte RGB(18, 24, 31) .2byte RGB(18, 24, 31) diff --git a/include/decompress.h b/include/decompress.h index 03080fe48..37600e8d3 100644 --- a/include/decompress.h +++ b/include/decompress.h @@ -23,7 +23,6 @@ void DecompressPicFromTable_2(const struct CompressedSpriteSheet *src, void* buf void DecompressPicFromTable_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void* buffer, s32 species); void HandleLoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality); -void HandleLoadSpecialPokePic_2(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality); void HandleLoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality); void HandleLoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality); diff --git a/include/util.h b/include/util.h index 3884ab21c..db86c184c 100644 --- a/include/util.h +++ b/include/util.h @@ -16,5 +16,6 @@ u16 CalcCRC16(const u8 *data, u32 length); u16 CalcCRC16WithTable(const u8 *data, u32 length); u32 CalcByteArraySum(const u8* data, u32 length); void BlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor); +void DoBgAffineSet(struct BgAffineDstData * dest, u32 texX, u32 texY, s16 srcX, s16 srcY, s16 sx, s16 sy, u16 alpha); #endif // GUARD_UTIL_H 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; + } +} |