diff options
Diffstat (limited to 'src/trade.c')
-rw-r--r-- | src/trade.c | 487 |
1 files changed, 456 insertions, 31 deletions
diff --git a/src/trade.c b/src/trade.c index 874a203ba..392ab881a 100644 --- a/src/trade.c +++ b/src/trade.c @@ -9,6 +9,7 @@ #include "easy_chat.h" #include "link.h" #include "strings2.h" +#include "graphics.h" struct InGameTrade { /*0x00*/ u8 name[11]; @@ -41,14 +42,9 @@ struct UnkStructD { /*0x12*/ u16 var12[1]; }; -struct UnkStructE { - u8 *unk00; - u8 fil04[8]; - u8 *unk0C; - u8 fil10[8]; - u8 *unk18; - u8 fil1C[4]; - void *unk20; +struct TradeEwramStruct { + /*0x00000*/ u8 filler_00000[0xd000]; + /*0x0d000*/ u8 tileBuffers[13][256]; }; void sub_8047EC0(void); @@ -56,7 +52,143 @@ void sub_804AFB8(const struct WindowConfig *, u8 *, const u8 *, u8); void sub_804ACD8(const u8 *, u8 *, u8); void nullsub_5(u8, u8); -extern struct UnkStructE gUnknown_020296CC; +extern u8 *gUnknown_020296CC[13]; + +extern u8 ewram[]; +#define ewram_2010000 (*(struct TradeEwramStruct *)(ewram + 0x10000)) + + +const u32 unref_data_820ABD4[] = { + 0x00000890, + 0x00003AC0, + 0x0000001C, + 0x00000530, + 0x00000024, + 0x00000064, + 0x000004D8 +}; + +const u16 gTradeMovesBoxTilemap[] = INCBIN_U16("graphics/trade/moves_box_map.bin"); +const u16 gTradePartyBoxTilemap[] = INCBIN_U16("graphics/trade/party_box_map.bin"); +const u16 gTradeStripesBG2Tilemap[] = INCBIN_U16("graphics/trade/stripes_bg2_map.bin"); +const u16 gTradeStripesBG3Tilemap[] = INCBIN_U16("graphics/trade/stripes_bg3_map.bin"); + +const struct OamData gOamData_820BFEC = { + .shape = ST_OAM_H_RECTANGLE, + .size = 2, + .priority = 1 +}; + +const union AnimCmd gSpriteAnim_820BFF4[] = { + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_820BFFC[] = { + ANIMCMD_FRAME(8, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_820C004[] = { + ANIMCMD_FRAME(16, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_820C00C[] = { + ANIMCMD_FRAME(24, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_820C014[] = { + ANIMCMD_FRAME(32, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_820C01C[] = { + ANIMCMD_FRAME(40, 5), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_820C024[] = { + gSpriteAnim_820BFF4, + gSpriteAnim_820BFFC, + gSpriteAnim_820C004, + gSpriteAnim_820C00C, + gSpriteAnim_820C014, + gSpriteAnim_820C01C +}; + +const u16 TradeScreenTextPalette[] = INCBIN_U16("graphics/trade/text1.gbapal"); +const u16 UnrefTradeScreenTextPalette[] = INCBIN_U16("graphics/trade/text2.gbapal"); + +const struct SpriteSheet gUnknown_0820C07C[] = { + {ewram_2010000.tileBuffers[ 0], 256, 200}, + {ewram_2010000.tileBuffers[ 1], 256, 201}, + {ewram_2010000.tileBuffers[ 2], 256, 202}, + {ewram_2010000.tileBuffers[ 3], 256, 203}, + {ewram_2010000.tileBuffers[ 4], 256, 204}, + {ewram_2010000.tileBuffers[ 5], 256, 205}, + {ewram_2010000.tileBuffers[ 6], 256, 206}, + {ewram_2010000.tileBuffers[ 7], 256, 207}, + {ewram_2010000.tileBuffers[ 8], 256, 208}, + {ewram_2010000.tileBuffers[ 9], 256, 209}, + {ewram_2010000.tileBuffers[10], 256, 210}, + {ewram_2010000.tileBuffers[11], 256, 211}, + {ewram_2010000.tileBuffers[12], 256, 212}, +}; + +const struct SpritePalette gSpritePalette_TradeScreenText = { + TradeScreenTextPalette, 4925 +}; + +const struct SpriteTemplate gSpriteTemplate_820C0EC = { + 200, + 4925, + &gOamData_820BFEC, + gSpriteAnimTable_820C024, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy +}; + +const struct OamData gOamData_820C104 = { + .shape = ST_OAM_H_RECTANGLE, + .size = 3, + .priority = 1 +}; + +const union AnimCmd gSpriteAnim_820C10C[] = { + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_820C114[] = { + ANIMCMD_FRAME(32, 5), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_820C11C[] = { + gSpriteAnim_820C10C, + gSpriteAnim_820C114 +}; + +const struct SpriteSheet gUnknown_0820C124 = { + gUnknown_08EA1DEC, 0x800, 300 +}; + +const struct SpritePalette gUnknown_0820C12C = { + gUnknown_08EA0328, 2345 +}; + +const struct SpriteTemplate gSpriteTemplate_820C134 = { + 300, + 2345, + &gOamData_820C104, + gSpriteAnimTable_820C11C, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy +}; const u8 *const gUnknown_0820C14C[] = { TradeText_Cancel, @@ -67,6 +199,153 @@ const u8 *const gUnknown_0820C14C[] = { TradeText_PressBToExit }; +// This is used to determine the next mon to select when the D-Pad is +// pressed in a given direction. +// Note that the mons are laid out like this. +// 0-5 are the player's party and 6-11 are the trading partner's party. +// 12 is the cancel button. +// 0 1 6 7 +// 2 3 8 9 +// 4 5 10 11 +// 12 + +const u8 gTradeNextSelectedMonTable[][4][6] = { + { + {4, 2, 12, 12, 0, 0}, + {2, 4, 12, 12, 0, 0}, + {7, 6, 1, 0, 0, 0}, + {1, 6, 7, 0, 0, 0} + }, { + {5, 3, 12, 12, 0, 0}, + {3, 5, 12, 12, 0, 0}, + {0, 7, 6, 1, 0, 0}, + {6, 7, 0, 1, 0, 0} + }, { + {0, 0, 0, 0, 0, 0}, + {4, 0, 0, 0, 0, 0}, + {9, 8, 7, 6, 0, 0}, + {3, 1, 0, 0, 0, 0} + }, { + {1, 1, 1, 1, 0, 0}, + {5, 1, 1, 1, 0, 0}, + {2, 9, 8, 7, 0, 0}, + {8, 9, 6, 6, 0, 0} + }, { + {2, 2, 2, 2, 0, 0}, + {0, 0, 0, 0, 0, 0}, + {11, 10, 9, 8, 7, 6}, + {5, 3, 1, 0, 0, 0} + }, { + {3, 3, 3, 3, 0, 0}, + {1, 1, 1, 1, 0, 0}, + {4, 4, 4, 4, 0, 0}, + {10, 8, 6, 0, 0, 0} + }, { + {10, 8, 12, 0, 0, 0}, + {8, 10, 12, 0, 0, 0}, + {1, 0, 0, 0, 0, 0}, + {7, 0, 1, 0, 0, 0} + }, { + {12, 0, 0, 0, 0, 0}, + {9, 12, 0, 0, 0, 0}, + {6, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0} + }, { + {6, 0, 0, 0, 0, 0}, + {10, 6, 0, 0, 0, 0}, + {3, 2, 1, 0, 0, 0}, + {9, 7, 0, 0, 0, 0} + }, { + {7, 0, 0, 0, 0, 0}, + {11, 12, 0, 0, 0, 0}, + {8, 0, 0, 0, 0, 0}, + {2, 1, 0, 0, 0, 0} + }, { + {8, 0, 0, 0, 0, 0}, + {6, 0, 0, 0, 0, 0}, + {5, 4, 3, 2, 1, 0}, + {11, 9, 7, 0, 0, 0} + }, { + {9, 0, 0, 0, 0, 0}, + {12, 0, 0, 0, 0, 0}, + {10, 0, 0, 0, 0, 0}, + {4, 2, 0, 0, 0, 0} + }, { + {11, 9, 7, 6, 0, 0}, + {7, 6, 0, 0, 0, 0}, + {12, 0, 0, 0, 0, 0}, + {12, 0, 0, 0, 0, 0} + } +}; + +const u8 gTradeMonSpriteCoords[][2] = { + // Your party + {1, 5}, + {8, 5}, + {1, 10}, + {8, 10}, + {1, 15}, + {8, 15}, + + // Friend's party + {16, 5}, + {23, 5}, + {16, 10}, + {23, 10}, + {16, 15}, + {23, 15}, + + {23, 18} // CANCEL +}; + +const u8 gTradeLevelDisplayCoords[][2] = { + // Your party + { 5, 4}, + {12, 4}, + { 5, 9}, + {12, 9}, + { 5, 14}, + {12, 14}, + + // Friend's party + {20, 4}, + {27, 4}, + {20, 9}, + {27, 9}, + {20, 14}, + {27, 14} +}; + +const u8 gTradeMonBoxCoords[][2] = { + // Your party + { 1, 3}, + { 8, 3}, + { 1, 8}, + { 8, 8}, + { 1, 13}, + { 8, 13}, + + // Friend's party + {16, 3}, + {23, 3}, + {16, 8}, + {23, 8}, + {16, 13}, + {23, 13} +}; + +const u8 gTradeUnknownSpriteCoords[][2][2] = { + { + { 59, 10}, + {179, 10}, + }, + { + { 59, 10}, + {179, 10} + } +}; + + asm(".section .rodata.igt"); const struct InGameTrade gIngameTrades[] = { { @@ -127,33 +406,33 @@ const u16 gIngameTradeMail[][10] = { }; const s8 gTradeBallVerticalVelocityTable[] = { - 0, 0, 1, 0, - 1, 0, 1, 1, - 1, 1, 2, 2, - 2, 2, 3, 3, - 3, 3, 4, 4, - 4, 4, -4, -4, + 0, 0, 1, 0, + 1, 0, 1, 1, + 1, 1, 2, 2, + 2, 2, 3, 3, + 3, 3, 4, 4, + 4, 4, -4, -4, -4, -3, -3, -3, -3, -2, -2, -2, -2, -1, -1, -1, -1, 0, -1, 0, -1, 0, 0, 0, - 0, 0, 1, 0, - 1, 0, 1, 1, - 1, 1, 2, 2, - 2, 2, 3, 3, - 3, 3, 4, 4, - 4, 4, -4, -3, + 0, 0, 1, 0, + 1, 0, 1, 1, + 1, 1, 2, 2, + 2, 2, 3, 3, + 3, 3, 4, 4, + 4, 4, -4, -3, -3, -2, -2, -1, -1, -1, 0, -1, - 0, 0, 0, 0, - 0, 0, 1, 0, - 1, 1, 1, 2, - 2, 3, 3, 4, + 0, 0, 0, 0, + 0, 0, 1, 0, + 1, 1, 1, 2, + 2, 3, 3, 4, -4, -3, -2, -1, -1, -1, 0, 0, - 0, 0, 1, 0, - 1, 1, 2, 3 + 0, 0, 1, 0, + 1, 1, 2, 3 }; void sub_8047CD8(void) @@ -164,14 +443,160 @@ void sub_8047CD8(void) void sub_8047CE8(void) { u8 mpId; - sub_804AFB8(&gWindowConfig_81E725C, gUnknown_020296CC.unk00, gSaveBlock2.playerName, 0xC); + sub_804AFB8(&gWindowConfig_81E725C, gUnknown_020296CC[0], gSaveBlock2.playerName, 0xC); mpId = GetMultiplayerId(); - sub_804AFB8(&gWindowConfig_81E725C, gUnknown_020296CC.unk0C, gLinkPlayers[mpId ^ 1].name, 0xC); - sub_804AFB8(&gWindowConfig_81E725C, gUnknown_020296CC.unk18, gUnknown_0820C14C[0], 0x8); - sub_804ACD8(gUnknown_0820C14C[1], gUnknown_020296CC.unk20, 0x14); + sub_804AFB8(&gWindowConfig_81E725C, gUnknown_020296CC[3], gLinkPlayers[mpId ^ 1].name, 0xC); + sub_804AFB8(&gWindowConfig_81E725C, gUnknown_020296CC[6], gUnknown_0820C14C[0], 0x8); + sub_804ACD8(gUnknown_0820C14C[1], gUnknown_020296CC[8], 0x14); nullsub_5(3, 0); } +#ifdef NONMATCHING +void sub_8047D58(void) +{ + u8 language; + struct SpriteTemplate spriteTemplate; + int i; + s16 x; + u8 mpId; + + language = StringLength(gSaveBlock2.playerName) <= 5 ? 0 : 1; + for (i = 0, x = gTradeUnknownSpriteCoords[language][0][0]; i < 3; x += 32, i ++) + { + spriteTemplate = gSpriteTemplate_820C0EC; + spriteTemplate.tileTag += i; + CreateSprite(&spriteTemplate, x, gTradeUnknownSpriteCoords[language][0][1], 1); + } + + mpId = GetMultiplayerId(); + language = StringLength(gLinkPlayers[mpId ^ 1].name) <= 5 ? 0 : 1; + for (i = 0, x = gTradeUnknownSpriteCoords[language][1][0]; i < 3; x += 32, i ++) + { + spriteTemplate = gSpriteTemplate_820C0EC; + spriteTemplate.tileTag += i + 3; + CreateSprite(&spriteTemplate, x, gTradeUnknownSpriteCoords[language][1][1], 1); + } + nullsub_5(5, 0); +} +#else +__attribute__((naked)) +void sub_8047D58(void) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r8\n" + "\tpush {r7}\n" + "\tsub sp, 0x18\n" + "\tldr r0, _08047E30 @ =gSaveBlock2\n" + "\tbl StringLength\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tmovs r1, 0\n" + "\tcmp r0, 0x5\n" + "\tbls _08047D72\n" + "\tmovs r1, 0x1\n" + "_08047D72:\n" + "\tmovs r5, 0\n" + "\tlsls r2, r1, 2\n" + "\tmov r6, sp\n" + "\tldr r0, _08047E34 @ =gTradeUnknownSpriteCoords\n" + "\tadds r1, r0, 0x1\n" + "\tadds r1, r2\n" + "\tmov r8, r1\n" + "\tadds r0, r2, r0\n" + "\tldrb r0, [r0]\n" + "\tlsls r4, r0, 16\n" + "_08047D86:\n" + "\tmov r1, sp\n" + "\tldr r0, _08047E38 @ =gSpriteTemplate_820C0EC\n" + "\tldm r0!, {r2,r3,r7}\n" + "\tstm r1!, {r2,r3,r7}\n" + "\tldm r0!, {r2,r3,r7}\n" + "\tstm r1!, {r2,r3,r7}\n" + "\tldrh r0, [r6]\n" + "\tadds r0, r5\n" + "\tstrh r0, [r6]\n" + "\tasrs r1, r4, 16\n" + "\tmov r0, sp\n" + "\tmov r3, r8\n" + "\tldrb r2, [r3]\n" + "\tmovs r3, 0x1\n" + "\tbl CreateSprite\n" + "\tmovs r7, 0x80\n" + "\tlsls r7, 14\n" + "\tadds r4, r7\n" + "\tadds r5, 0x1\n" + "\tcmp r5, 0x2\n" + "\tble _08047D86\n" + "\tbl GetMultiplayerId\n" + "\tlsls r0, 24\n" + "\tmovs r1, 0x80\n" + "\tlsls r1, 17\n" + "\teors r1, r0\n" + "\tlsrs r1, 24\n" + "\tlsls r0, r1, 3\n" + "\tsubs r0, r1\n" + "\tlsls r0, 2\n" + "\tldr r1, _08047E3C @ =gLinkPlayers + 0x8\n" + "\tadds r0, r1\n" + "\tbl StringLength\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tmovs r1, 0\n" + "\tcmp r0, 0x5\n" + "\tbls _08047DDA\n" + "\tmovs r1, 0x1\n" + "_08047DDA:\n" + "\tmovs r5, 0\n" + "\tlsls r2, r1, 2\n" + "\tmov r6, sp\n" + "\tldr r0, _08047E40 @ =gTradeUnknownSpriteCoords + 0x3\n" + "\tadds r1, r2, r0\n" + "\tmov r8, r1\n" + "\tsubs r0, 0x1\n" + "\tadds r0, r2, r0\n" + "\tldrb r0, [r0]\n" + "\tlsls r4, r0, 16\n" + "_08047DEE:\n" + "\tmov r1, sp\n" + "\tldr r0, _08047E38 @ =gSpriteTemplate_820C0EC\n" + "\tldm r0!, {r2,r3,r7}\n" + "\tstm r1!, {r2,r3,r7}\n" + "\tldm r0!, {r2,r3,r7}\n" + "\tstm r1!, {r2,r3,r7}\n" + "\tadds r0, r5, 0x3\n" + "\tldrh r1, [r6]\n" + "\tadds r0, r1\n" + "\tstrh r0, [r6]\n" + "\tasrs r1, r4, 16\n" + "\tmov r0, sp\n" + "\tmov r3, r8\n" + "\tldrb r2, [r3]\n" + "\tmovs r3, 0x1\n" + "\tbl CreateSprite\n" + "\tmovs r7, 0x80\n" + "\tlsls r7, 14\n" + "\tadds r4, r7\n" + "\tadds r5, 0x1\n" + "\tcmp r5, 0x2\n" + "\tble _08047DEE\n" + "\tmovs r0, 0x5\n" + "\tmovs r1, 0\n" + "\tbl nullsub_5\n" + "\tadd sp, 0x18\n" + "\tpop {r3}\n" + "\tmov r8, r3\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_08047E30: .4byte gSaveBlock2\n" + "_08047E34: .4byte gTradeUnknownSpriteCoords\n" + "_08047E38: .4byte gSpriteTemplate_820C0EC\n" + "_08047E3C: .4byte gLinkPlayers + 0x8\n" + "_08047E40: .4byte gTradeUnknownSpriteCoords + 0x3"); +} +#endif + asm(".section .text.sub_804A96C"); void sub_804A96C(struct UnkStructD *arg0, u8 left, u8 top, u16 *tilemap, u8 width, u8 height, u16 sp8) { |