diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2019-10-30 14:20:32 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2019-10-30 14:20:32 -0400 |
commit | f6d768d5ed9899f5814349cb232da861f85cbc60 (patch) | |
tree | e14411a8f5705d1e631ab50aa2dc8dca70587f69 | |
parent | 2c2c179eb9b92d0998922cc96a115d3d1671a64b (diff) |
Trade data; split off trade_scene
-rw-r--r-- | data/trade.s | 542 | ||||
-rw-r--r-- | include/graphics.h | 2 | ||||
-rw-r--r-- | include/strings.h | 18 | ||||
-rw-r--r-- | include/trade.h | 5 | ||||
-rw-r--r-- | include/trade_scene.h | 6 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/trade.c | 2975 | ||||
-rw-r--r-- | src/trade_scene.c | 2444 | ||||
-rw-r--r-- | sym_ewram.txt | 2 |
9 files changed, 3017 insertions, 2979 deletions
diff --git a/data/trade.s b/data/trade.s index 8ce10a337..f3c6f8b7e 100644 --- a/data/trade.s +++ b/data/trade.s @@ -8,548 +8,6 @@ .section .rodata .align 2, 0 -gTradeMovesBoxTilemap:: @ 8260834 - .incbin "data/trade/unk_8260834.bin" - -gTradePartyBoxTilemap:: @ 8260A32 - .incbin "data/trade/unk_8260A32.bin" - -gUnknown_8260C30:: @ 8260C30 - .incbin "data/trade/unk_8260C30.bin" - -gUnknown_8261430:: @ 8261430 - .incbin "data/trade/unk_8261430.bin" - -gOamdata_8261C30:: - .4byte 0x80004000, 0x00000400 - -gOamData_8261C38:: - .4byte 0xc0004000, 0x00000400 - -gSpriteAnim_8261C40:: - obj_image_anim_frame 0x00, 5 - obj_image_anim_end - -gSpriteAnim_8261C48:: - obj_image_anim_frame 0x20, 5 - obj_image_anim_end - -gSpriteAnimTable_8261C50:: - .4byte gSpriteAnim_8261C40 - .4byte gSpriteAnim_8261C48 - -gUnknown_8261C58:: @ 8261C58 - obj_tiles gUnknown_8E9E1DC, 0x0800, 300 - -gUnknown_8261C60:: @ 8261C60 - obj_pal gUnknown_8E9CF3C, 2345 - -gSpriteAnim_8261C68:: - obj_image_anim_frame 0x00, 5 - obj_image_anim_end - -gSpriteAnim_8261C70:: - obj_image_anim_frame 0x08, 5 - obj_image_anim_end - -gSpriteAnim_8261C78:: - obj_image_anim_frame 0x10, 5 - obj_image_anim_end - -gSpriteAnim_8261C80:: - obj_image_anim_frame 0x18, 5 - obj_image_anim_end - -gSpriteAnim_8261C88:: - obj_image_anim_frame 0x20, 5 - obj_image_anim_end - -gSpriteAnim_8261C90:: - obj_image_anim_frame 0x28, 5 - obj_image_anim_end - -gSpriteAnimTable_8261C98:: - .4byte gSpriteAnim_8261C68 - .4byte gSpriteAnim_8261C70 - .4byte gSpriteAnim_8261C78 - .4byte gSpriteAnim_8261C80 - .4byte gSpriteAnim_8261C88 - .4byte gSpriteAnim_8261C90 - -gUnknown_8261CB0:: @ 8261CB0 - spr_template 300, 2345, gOamData_8261C38, gSpriteAnimTable_8261C50, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy - -gUnknown_8261CC8:: @ 8261CC8 - spr_template 200, 4925, gOamdata_8261C30, gSpriteAnimTable_8261C98, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy - -gUnknown_8261CE0:: - .incbin "data/trade/unk_8261CE0.gbapal" - -gUnknown_8261D00:: @ 8261D00 - obj_pal gUnknown_8261CE0, 4925 - -gUnknown_8261D08:: @ 8261D08 - .byte 0x04, 0x02, 0x0c, 0x0c, 0x00, 0x00 - .byte 0x02, 0x04, 0x0c, 0x0c, 0x00, 0x00 - .byte 0x07, 0x06, 0x01, 0x00, 0x00, 0x00 - .byte 0x01, 0x06, 0x07, 0x00, 0x00, 0x00 - - .byte 0x05, 0x03, 0x0c, 0x0c, 0x00, 0x00 - .byte 0x03, 0x05, 0x0c, 0x0c, 0x00, 0x00 - .byte 0x00, 0x07, 0x06, 0x01, 0x00, 0x00 - .byte 0x06, 0x07, 0x00, 0x01, 0x00, 0x00 - - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x04, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x09, 0x08, 0x07, 0x06, 0x00, 0x00 - .byte 0x03, 0x01, 0x00, 0x00, 0x00, 0x00 - - .byte 0x01, 0x01, 0x01, 0x01, 0x00, 0x00 - .byte 0x05, 0x01, 0x01, 0x01, 0x00, 0x00 - .byte 0x02, 0x09, 0x08, 0x07, 0x00, 0x00 - .byte 0x08, 0x09, 0x06, 0x06, 0x00, 0x00 - - .byte 0x02, 0x02, 0x02, 0x02, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06 - .byte 0x05, 0x03, 0x01, 0x00, 0x00, 0x00 - - .byte 0x03, 0x03, 0x03, 0x03, 0x00, 0x00 - .byte 0x01, 0x01, 0x01, 0x01, 0x00, 0x00 - .byte 0x04, 0x04, 0x04, 0x04, 0x00, 0x00 - .byte 0x0a, 0x08, 0x06, 0x00, 0x00, 0x00 - - .byte 0x0a, 0x08, 0x0c, 0x00, 0x00, 0x00 - .byte 0x08, 0x0a, 0x0c, 0x00, 0x00, 0x00 - .byte 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x07, 0x00, 0x01, 0x00, 0x00, 0x00 - - .byte 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x09, 0x0c, 0x00, 0x00, 0x00, 0x00 - .byte 0x06, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - - .byte 0x06, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00 - .byte 0x03, 0x02, 0x01, 0x00, 0x00, 0x00 - .byte 0x09, 0x07, 0x00, 0x00, 0x00, 0x00 - - .byte 0x07, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00 - .byte 0x08, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x02, 0x01, 0x00, 0x00, 0x00, 0x00 - - .byte 0x08, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x06, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 - .byte 0x0b, 0x09, 0x07, 0x00, 0x00, 0x00 - - .byte 0x09, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x04, 0x02, 0x00, 0x00, 0x00, 0x00 - - .byte 0x0b, 0x09, 0x07, 0x06, 0x00, 0x00 - .byte 0x07, 0x06, 0x00, 0x00, 0x00, 0x00 - .byte 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00 - -gTradeMonSpriteCoords:: @ 8261E40 - .byte 0x01, 0x05 - .byte 0x08, 0x05 - .byte 0x01, 0x0a - .byte 0x08, 0x0a - .byte 0x01, 0x0f - .byte 0x08, 0x0f - .byte 0x10, 0x05 - .byte 0x17, 0x05 - .byte 0x10, 0x0a - .byte 0x17, 0x0a - .byte 0x10, 0x0f - .byte 0x17, 0x0f - .byte 0x17, 0x12 - -gUnknown_8261E5A:: @ 8261E5A - .byte 0x05, 0x04 - .byte 0x0c, 0x04 - .byte 0x05, 0x09 - .byte 0x0c, 0x09 - .byte 0x05, 0x0e - .byte 0x0c, 0x0e - .byte 0x14, 0x04 - .byte 0x1b, 0x04 - .byte 0x14, 0x09 - .byte 0x1b, 0x09 - .byte 0x14, 0x0e - .byte 0x1b, 0x0e - -gUnknown_8261E72:: @ 8261E72 - .byte 0x01, 0x03 - .byte 0x08, 0x03 - .byte 0x01, 0x08 - .byte 0x08, 0x08 - .byte 0x01, 0x0d - .byte 0x08, 0x0d - - .byte 0x10, 0x03 - .byte 0x17, 0x03 - .byte 0x10, 0x08 - .byte 0x17, 0x08 - .byte 0x10, 0x0d - .byte 0x17, 0x0d - -gTradeUnknownSpriteCoords:: @ 8261E8A - .byte 0x3c, 0x09, 0xb4, 0x09 - .byte 0x30, 0x09, 0xa8, 0x09 - -gUnknown_8261E92:: - .byte 0x00, 0x0e, 0x0f, 0x1d - .byte 0x03, 0x05, 0x03, 0x07 - .byte 0x12, 0x05, 0x12, 0x07 - .byte 0x08, 0x07, 0x16, 0x0c - .byte 0x08, 0x07, 0x16, 0x0c - .byte 0x06, 0x07, 0x18, 0x0c - .byte 0x06, 0x07, 0x18, 0x0c - .byte 0x08, 0x07, 0x16, 0x0c - .byte 0x07, 0x07, 0x17, 0x0c - -gUnknown_8261EB6:: @ 8261EB6 - .string "$" - -gUnknown_8261EB7:: - .string "{COLOR DARK_GREY}{HIGHLIGHT TRANSPARENT}{SHADOW RED}$" - -gText_MaleSymbol4:: @ 8261EC1 - .string "♂$" - -gText_FemaleSymbol4:: @ 8261EC3 - .string "♀$" - -gText_GenderlessSymbol:: @ 8261EC5 - .string "$" - -gUnknown_8261EC6:: - .string "$" - -gUnknown_8261EC7:: @ 8261EC7 - .string "\n$" - -gUnknown_8261EC9:: - .string "/$" - - .align 2 -gUnknown_8261ECC:: @ 8261ECC - .4byte gUnknown_841E0B9 - .4byte gUnknown_841E0C0 - .4byte gUnknown_841E0D2 - .4byte gUnknown_841E0DA - .4byte gUnknown_841E0E0 - .4byte gUnknown_841E0EE - -gUnknown_8261EE4:: @ 8261EE4 - .4byte gUnknown_841E10A, sub_804F440 - .4byte gUnknown_841E112, sub_804F464 - -sTradeErrorOrStatusMessagePtrs:: @ 8261EF4 - .4byte gUnknown_841E118 @ Communication standby - .4byte gUnknown_841E145 @ The trade has been canceled. - .4byte gUnknown_841E16B @ That's your only POKéMON for battle - .4byte gUnknown_8417094 @ That's your only POKéMON for battle - .4byte gUnknown_841E199 @ Waiting for your friend to finish - .4byte gUnknown_841E1C5 @ Your friend wants to trade POKéMON - .4byte gUnknown_84170BC @ That POKéMON can't be traded now - .4byte gUnknown_84170E0 @ An EGG can't be traded now - .4byte gUnknown_84170FC @ The other TRAINER's POKéMON can't be traded now - -gUnknown_8261F18:: @ 8261F18 - .byte 0, 1, 2 - - .align 2 -gUnknown_8261F1C:: @ 8261F1C - .4byte 0x000001f8 - @ { - @ .bg = 0, - @ .charBaseIndex = 2, - @ .mapBaseIndex = 31, - @ .screenSize = 0, - @ .paletteMode = 0, - @ .priority = 0, - @ .baseTile = 0x0000 - @ } - .4byte 0x00001051 - @ { - @ .bg = 1, - @ .charBaseIndex = 0, - @ .mapBaseIndex = 5, - @ .screenSize = 0, - @ .paletteMode = 0, - @ .priority = 1, - @ .baseTile = 0x0000 - @ } - .4byte 0x00002062 - @ { - @ .bg = 2, - @ .charBaseIndex = 0, - @ .mapBaseIndex = 6, - @ .screenSize = 0, - @ .paletteMode = 0, - @ .priority = 2, - @ .baseTile = 0x0000 - @ } - .4byte 0x00003073 - @ { - @ .bg = 3, - @ .charBaseIndex = 0, - @ .mapBaseIndex = 7, - @ .screenSize = 0, - @ .paletteMode = 0, - @ .priority = 3, - @ .baseTile = 0x0000 - @ } - -gUnknown_8261F2C:: @ 8261F2C - .byte 0, 4, 7, 22, 4, 15 - .2byte 0x001e - @ { - @ .bg = 0, - @ .tilemapLeft = 4, - @ .tilemapTop = 7, - @ .width = 22, - @ .height = 4, - @ .paletteNum = 15, - @ .baseBlock = 0x001e - @ } - .byte 0, 17, 15, 12, 4, 15 - .2byte 0x0076 - @ { - @ .bg = 0, - @ .tilemapLeft = 17, - @ .tilemapTop = 15, - @ .width = 12, - @ .height = 4, - @ .paletteNum = 15, - @ .baseBlock = 0x0076 - @ } - .byte 0, 0, 5, 8, 2, 13 - .2byte 0x00a6 - @ { - @ .bg = 0, - @ .tilemapLeft = 0, - @ .tilemapTop = 5, - @ .width = 8, - @ .height = 2, - @ .paletteNum = 13, - @ .baseBlock = 0x00a6 - @ } - .byte 0, 7, 5, 8, 2, 13 - .2byte 0x00b6 - @ { - @ .bg = 0, - @ .tilemapLeft = 7, - @ .tilemapTop = 5, - @ .width = 8, - @ .height = 2, - @ .paletteNum = 13, - @ .baseBlock = 0x00b6 - @ } - .byte 0, 0, 10, 8, 2, 13 - .2byte 0x00c6 - @ { - @ .bg = 0, - @ .tilemapLeft = 0, - @ .tilemapTop = 10, - @ .width = 8, - @ .height = 2, - @ .paletteNum = 13, - @ .baseBlock = 0x00c6 - @ } - .byte 0, 7, 10, 8, 2, 13 - .2byte 0x00d6 - @ { - @ .bg = 0, - @ .tilemapLeft = 7, - @ .tilemapTop = 10, - @ .width = 8, - @ .height = 2, - @ .paletteNum = 13, - @ .baseBlock = 0x00d6 - @ } - .byte 0, 0, 15, 8, 2, 13 - .2byte 0x00e6 - @ { - @ .bg = 0, - @ .tilemapLeft = 0, - @ .tilemapTop = 15, - @ .width = 8, - @ .height = 2, - @ .paletteNum = 13, - @ .baseBlock = 0x00e6 - @ } - .byte 0, 7, 15, 8, 2, 13 - .2byte 0x00f6 - @ { - @ .bg = 0, - @ .tilemapLeft = 7, - @ .tilemapTop = 15, - @ .width = 8, - @ .height = 2, - @ .paletteNum = 13, - @ .baseBlock = 0x00f6 - @ } - .byte 0, 15, 5, 8, 2, 13 - .2byte 0x0106 - @ { - @ .bg = 0, - @ .tilemapLeft = 15, - @ .tilemapTop = 5, - @ .width = 8, - @ .height = 2, - @ .paletteNum = 13, - @ .baseBlock = 0x0106 - @ } - .byte 0, 22, 5, 8, 2, 13 - .2byte 0x0116 - @ { - @ .bg = 0, - @ .tilemapLeft = 22, - @ .tilemapTop = 5, - @ .width = 8, - @ .height = 2, - @ .paletteNum = 13, - @ .baseBlock = 0x0116 - @ } - .byte 0, 15, 10, 8, 2, 13 - .2byte 0x0126 - @ { - @ .bg = 0, - @ .tilemapLeft = 15, - @ .tilemapTop = 10, - @ .width = 8, - @ .height = 2, - @ .paletteNum = 13, - @ .baseBlock = 0x0126 - @ } - .byte 0, 22, 10, 8, 2, 13 - .2byte 0x0136 - @ { - @ .bg = 0, - @ .tilemapLeft = 22, - @ .tilemapTop = 10, - @ .width = 8, - @ .height = 2, - @ .paletteNum = 13, - @ .baseBlock = 0x0136 - @ } - .byte 0, 15, 15, 8, 2, 13 - .2byte 0x0146 - @ { - @ .bg = 0, - @ .tilemapLeft = 15, - @ .tilemapTop = 15, - @ .width = 8, - @ .height = 2, - @ .paletteNum = 13, - @ .baseBlock = 0x0146 - @ } - .byte 0, 22, 15, 8, 2, 13 - .2byte 0x0156 - @ { - @ .bg = 0, - @ .tilemapLeft = 22, - @ .tilemapTop = 15, - @ .width = 8, - @ .height = 2, - @ .paletteNum = 13, - @ .baseBlock = 0x0156 - @ } - .byte 0, 2, 5, 14, 2, 13 - .2byte 0x0166 - @ { - @ .bg = 0, - @ .tilemapLeft = 2, - @ .tilemapTop = 5, - @ .width = 14, - @ .height = 2, - @ .paletteNum = 13, - @ .baseBlock = 0x0166 - @ } - .byte 0, 3, 8, 11, 8, 15 - .2byte 0x0182 - @ { - @ .bg = 0, - @ .tilemapLeft = 3, - @ .tilemapTop = 8, - @ .width = 11, - @ .height = 8, - @ .paletteNum = 15, - @ .baseBlock = 0x0182 - @ } - .byte 0, 17, 5, 14, 2, 15 - .2byte 0x01da - @ { - @ .bg = 0, - @ .tilemapLeft = 17, - @ .tilemapTop = 5, - @ .width = 14, - @ .height = 2, - @ .paletteNum = 15, - @ .baseBlock = 0x01da - @ } - .byte 0, 18, 8, 11, 8, 15 - .2byte 0x01f6 - @ { - @ .bg = 0, - @ .tilemapLeft = 18, - @ .tilemapTop = 8, - @ .width = 11, - @ .height = 8, - @ .paletteNum = 15, - @ .baseBlock = 0x01f6 - @ } - .byte 255, 0, 0, 0, 0, 0 - .2byte 0x0000 - @ { - @ .bg = 255, - @ .tilemapLeft = 0, - @ .tilemapTop = 0, - @ .width = 0, - @ .height = 0, - @ .paletteNum = 0, - @ .baseBlock = 0x0000 - @ } - -gUnknown_8261FC4:: @ 8261FC4 - .byte 0, 21, 13, 6, 4, 15 - .2byte 0x024e - @ { - @ .bg = 0, - @ .tilemapLeft = 21, - @ .tilemapTop = 13, - @ .width = 6, - @ .height = 4, - @ .paletteNum = 15, - @ .baseBlock = 0x024e - @ } - - .string "かいめの そうしん$", 13 - .string "かいめの じゅしん$", 13 - .string "ポケモンアイコンセット$", 13 - .string "OBJテキストセット$", 13 - .string "セルセット$", 13 - .string "OBJテキストADD$", 13 - .string "システムメッセージADD$", 13 - .string "はいけいセット$", 13 - -gJPText_Shedinja:: @ 8262034 - .string "ヌケニン$" - .string "こうかんせいりつ $" - .string "だめだたらしいよ $" - -gUnknown_8262055:: @ 8262055 - .byte 0x04, 0x03 - .byte 0x13, 0x03 - - .align 2 gUnknown_826205C:: .incbin "data/trade/unk_826207C.gbapal" diff --git a/include/graphics.h b/include/graphics.h index ba174b348..20e322bc1 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -4216,8 +4216,10 @@ extern const u8 gMonIcon_QuestionMark[]; // trade extern const u16 gUnknown_8E9CEDC[]; +extern const u16 gUnknown_8E9CF3C[]; extern const u16 gUnknown_8E9CF5C[]; extern const u16 gUnknown_8E9E9FC[]; +extern const u16 gUnknown_8E9E1DC[]; extern const u16 gUnknown_8E9F1FC[]; #endif //GUARD_GRAPHICS_H diff --git a/include/strings.h b/include/strings.h index ce5744a04..301bfb9c6 100644 --- a/include/strings.h +++ b/include/strings.h @@ -667,5 +667,23 @@ extern const u8 gText_ByeByeVar1[]; extern const u8 gText_XSentOverY[]; extern const u8 gText_TakeGoodCareOfX[]; extern const u8 gUnknown_841E325[]; +extern const u8 gUnknown_841E0B9[]; +extern const u8 gUnknown_841E0C0[]; +extern const u8 gUnknown_841E0D2[]; +extern const u8 gUnknown_841E0DA[]; +extern const u8 gUnknown_841E0E0[]; +extern const u8 gUnknown_841E0EE[]; +extern const u8 gUnknown_841E10A[]; +extern const u8 gUnknown_841E112[]; +extern const u8 gUnknown_841E118[]; +extern const u8 gUnknown_841E145[]; +extern const u8 gUnknown_841E16B[]; +extern const u8 gUnknown_8417094[]; +extern const u8 gUnknown_841E199[]; +extern const u8 gUnknown_841E1C5[]; +extern const u8 gUnknown_84170BC[]; +extern const u8 gUnknown_84170E0[]; +extern const u8 gUnknown_84170FC[]; +extern const u8 gUnknown_841E09F[]; #endif //GUARD_STRINGS_H diff --git a/include/trade.h b/include/trade.h index 02ed7d8c4..b1ae5669e 100644 --- a/include/trade.h +++ b/include/trade.h @@ -1,6 +1,11 @@ #ifndef GUARD_TRADE_H #define GUARD_TRADE_H +extern struct MailStruct gLinkPartnerMail[6]; +extern u8 gSelectedTradeMonPositions[2]; + +extern const u16 gUnknown_826601C[]; +void sub_804C718(void); s32 sub_804FB34(void); #endif //GUARD_TRADE_H diff --git a/include/trade_scene.h b/include/trade_scene.h new file mode 100644 index 000000000..025e2b237 --- /dev/null +++ b/include/trade_scene.h @@ -0,0 +1,6 @@ +#ifndef GUARD_TRADE_SCENE_H +#define GUARD_TRADE_SCENE_H + +void CB2_InitTradeAnim_LinkTrade(void); + +#endif //GUARD_TRADE_SCENE_H diff --git a/ld_script.txt b/ld_script.txt index 78c7d089d..b66aa6b85 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -86,6 +86,7 @@ SECTIONS { asm/pokeball.o(.text); src/load_save.o(.text); src/trade.o(.text); + src/trade_scene.o(.text); src/play_time.o(.text); src/new_game.o(.text); asm/overworld.o(.text); @@ -400,6 +401,7 @@ SECTIONS { data/battle_interface.o(.rodata); data/pokeball.o(.rodata); src/trade.o(.rodata); + src/trade_scene.o(.rodata); data/trade.o(.rodata); data/overworld.o(.rodata); data/tilesets.o(.rodata); diff --git a/src/trade.c b/src/trade.c index 6f35c1880..728258a50 100644 --- a/src/trade.c +++ b/src/trade.c @@ -41,6 +41,8 @@ #include "pokemon_summary_screen.h" #include "pokemon_storage_system.h" #include "new_menu_helpers.h" +#include "trade.h" +#include "trade_scene.h" #include "constants/species.h" #include "constants/items.h" #include "constants/easy_chat.h" @@ -48,22 +50,6 @@ #include "constants/region_map.h" #include "constants/moves.h" -struct InGameTrade { - /*0x00*/ u8 nickname[POKEMON_NAME_LENGTH + 1]; - /*0x0C*/ u16 species; - /*0x0E*/ u8 ivs[NUM_STATS]; - /*0x14*/ u8 abilityNum; - /*0x18*/ u32 otId; - /*0x1C*/ u8 conditions[5]; - /*0x24*/ u32 personality; - /*0x28*/ u16 heldItem; - /*0x2A*/ u8 mailNum; - /*0x2B*/ u8 otName[11]; - /*0x36*/ u8 otGender; - /*0x37*/ u8 sheen; - /*0x38*/ u16 requestedSpecies; -}; - struct TradeMenuResources { /*0x0000*/ u8 unk_0; @@ -104,56 +90,6 @@ struct TradeMenuResources /*0x08F0*/ u16 tilemapBuffer[BG_SCREEN_SIZE / 2]; }; -struct TradeAnimationResources { - /*0x00*/ struct Pokemon mon; - /*0x64*/ u32 timer; - /*0x68*/ u32 monPersonalities[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 pokeballSpriteId; - /*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 sXY; - /*0xEA*/ u16 unk_EA; - /*0xEC*/ u16 unk_EC; - /*0xEE*/ bool8 isLinkTrade; - /*0xF0*/ u16 tradeSpecies[2]; - /*0xF4*/ u16 cachedMapMusic; - /*0xF6*/ u8 unk_F6; - /*0xF8*/ u16 monSpecies[2]; - /*0xFC*/ u8 unk_FC[7]; - /*0x103*/ u8 filler_103[1]; - /*0x104*/ u8 textColor[3]; - /*0x107*/ u8 filler_107[1]; - /*0x108*/ u8 isCableTrade; - /*0x109*/ u8 win0left; - /*0x10A*/ u8 win0top; - /*0x10B*/ u8 win0right; - /*0x10C*/ u8 win0bottom; -}; - enum TradeStatusMsg { TRADESTATMSG_COMMSTANDBY = 0, @@ -174,7 +110,6 @@ EWRAM_DATA u8 *gUnknown_2031C94[14] = {}; EWRAM_DATA struct MailStruct gLinkPartnerMail[6] = {}; EWRAM_DATA u8 gSelectedTradeMonPositions[2] = {0}; EWRAM_DATA struct TradeMenuResources * sTradeMenuResourcesPtr = NULL; -EWRAM_DATA struct TradeAnimationResources * sTradeData = NULL; void sub_804C728(void); void sub_804D4F8(void); @@ -193,6 +128,8 @@ void sub_804F08C(u8 a0, u8 partyIdx, u8 a2, u8 a3, u8 a4, u8 a5); void sub_804F284(u8 side); void sub_804F3B4(void); void sub_804F3C8(u8 a0); +void TradeMenuAction_Summary(u8 taskId); +void TradeMenuAction_Trade(u8 taskId); void sub_804F488(u16 a0, u8 a1); static void sub_804F4DC(void); void PrintTradeErrorOrStatusMessage(u8 str_idx); @@ -203,32 +140,6 @@ void sub_804F890(u8 side); void sub_804F964(void); void sub_804F9D8(void); u32 sub_804FA14(struct Pokemon * party, int partyCount, int cursorPos); -void CB2_InitTradeAnim_LinkTrade(void); -void sub_805049C(void); -void sub_80504B0(void); -void TradeAnimInit_LoadGfx(void); -void CB2_RunTradeAnim_InGameTrade(void); -void SetTradeSequenceBgGpuRegs(u8 idx); -void sub_8050DE0(void); -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 sub_80543C4(void); -void sub_8054470(u8 taskId); -void CheckPartnersMonForRibbons(void); -void DrawTextOnTradeWindow(u8 windowId, const u8 *str, s8 speed); -void Task_AnimateWirelessSignal(u8 taskId); -void c3_0805465C(u8 taskId); -void sub_8054734(u8 taskId); static const size_t gUnknown_8260814[] = { sizeof(struct SaveBlock2), @@ -241,65 +152,524 @@ static const size_t gUnknown_8260814[] = { 0x528 // unk }; -extern const u16 gUnknown_8260C30[]; -extern const u16 gUnknown_8261430[]; -extern const struct BgTemplate gUnknown_8261F1C[4]; -extern const struct WindowTemplate gUnknown_8261F2C[18]; -extern const u8 gTradeMonSpriteCoords[][2]; -extern const u8 *gUnknown_8261ECC[]; -extern const u8 gTradeUnknownSpriteCoords[][4]; -extern const struct SpriteTemplate gUnknown_8261CB0; -extern const struct SpriteTemplate gUnknown_8261CC8; -extern const u8 gJPText_Shedinja[]; -extern const u8 gUnknown_8261D08[][4][6]; -extern const u16 gTradePartyBoxTilemap[]; -extern const u16 gTradeMovesBoxTilemap[]; -extern const u8 gUnknown_8262055[][2]; -extern const u8 gUnknown_8261E5A[][12]; -extern const u8 gUnknown_8261E72[][12]; -extern const u8 gUnknown_8261F18[]; -extern const u8 gUnknown_8261EB6[]; -extern const u8 gUnknown_8261EC7[]; -extern const u8 gUnknown_841E09F[]; -extern const u8 *const sTradeErrorOrStatusMessagePtrs[]; -extern const struct SpritePalette gUnknown_8261D00; -extern const struct SpritePalette gUnknown_8261C60; -extern const struct SpriteSheet gUnknown_8261C58; -extern const u16 gTradeGlow2PaletteAnimTable[]; -extern const struct SpriteSheet gUnknown_826CDD4; -extern const struct SpritePalette gUnknown_826CDDC; -extern const struct BgTemplate gUnknown_826D1D4[4]; -extern const struct WindowTemplate gUnknown_826D1BC[]; -extern const u16 gUnknown_826AA5C[]; -extern const u16 gUnknown_8269A5C[]; -extern const u32 gUnknown_3379A0Bin[]; -extern const u16 gUnknown_826407C[]; -extern const u16 gUnknown_826601C[]; -extern const u16 gUnknown_826BB5C[]; -extern const u16 gUnknown_826BD5C[]; -extern const u16 gUnknown_826BF5C[]; -extern const u16 gUnknown_826701C[]; -extern const u16 gUnknown_826985C[]; -extern const u16 gUnknown_826995C[]; -extern const u32 gWirelessSignal4bpp[]; -extern const u32 gUnknown_826C60C[]; -extern const struct SpriteSheet gUnknown_826CE2C; -extern const struct SpriteSheet gUnknown_826CE7C; -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 SpriteTemplate sTradePokeballSpriteTemplate; -extern const struct SpriteTemplate gUnknown_826CF30; -extern const struct SpriteTemplate sGameLinkCableEndSpriteTemplate; -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]; -extern const u8 gUnknown_826D250[][2]; +const u16 gTradeMovesBoxTilemap[] = INCBIN_U16("data/trade/unk_8260834.bin"); +const u16 gTradePartyBoxTilemap[] = INCBIN_U16("data/trade/unk_8260A32.bin"); +const u16 gUnknown_8260C30[] = INCBIN_U16("data/trade/unk_8260C30.bin"); +const u16 gUnknown_8261430[] = INCBIN_U16("data/trade/unk_8261430.bin"); + +const struct OamData gOamData_8261C30 = { + .shape = SPRITE_SHAPE(32x16), + .size = SPRITE_SIZE(32x16), + .priority = 1 +}; + +const struct OamData gOamData_8261C38 = { + .shape = SPRITE_SHAPE(64x32), + .size = SPRITE_SIZE(64x32), + .priority = 1 +}; + +const union AnimCmd gSpriteAnim_8261C40[] = { + ANIMCMD_FRAME(0x00, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_8261C48[] = { + ANIMCMD_FRAME(0x20, 5), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_8261C50[] = { + gSpriteAnim_8261C40, + gSpriteAnim_8261C48 +}; + +const struct SpriteSheet gUnknown_8261C58 = { + gUnknown_8E9E1DC, + 0x800, + 300 +}; + +const struct SpritePalette gUnknown_8261C60 = { + gUnknown_8E9CF3C, + 2345 +}; + + +const union AnimCmd gSpriteAnim_8261C68[] = { + ANIMCMD_FRAME(0x00, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_8261C70[] = { + ANIMCMD_FRAME(0x08, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_8261C78[] = { + ANIMCMD_FRAME(0x10, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_8261C80[] = { + ANIMCMD_FRAME(0x18, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_8261C88[] = { + ANIMCMD_FRAME(0x20, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_8261C90[] = { + ANIMCMD_FRAME(0x28, 5), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_8261C98[] = { + gSpriteAnim_8261C68, + gSpriteAnim_8261C70, + gSpriteAnim_8261C78, + gSpriteAnim_8261C80, + gSpriteAnim_8261C88, + gSpriteAnim_8261C90 +}; + +const struct SpriteTemplate gUnknown_8261CB0 = { + .tileTag = 300, + .paletteTag = 2345, + .oam = &gOamData_8261C38, + .anims = gSpriteAnimTable_8261C50, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +const struct SpriteTemplate gUnknown_8261CC8 = { + .tileTag = 200, + .paletteTag = 4925, + .oam = &gOamData_8261C30, + .anims = gSpriteAnimTable_8261C98, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +const u16 gUnknown_8261CE0[] = INCBIN_U16("data/trade/unk_8261CE0.gbapal"); + +const struct SpritePalette gUnknown_8261D00 = { + gUnknown_8261CE0, + 4925 +}; + +#define DIR_UP 0 +#define DIR_DOWN 1 +#define DIR_LEFT 2 +#define DIR_RIGHT 3 + +const u8 sCursorMoveDestinations[][4][6] = { + // Player's party + [0] = { + [DIR_UP] = { 4, 2, 12, 12, 0, 0}, + [DIR_DOWN] = { 2, 4, 12, 12, 0, 0}, + [DIR_LEFT] = { 7, 6, 1, 0, 0, 0}, + [DIR_RIGHT] = { 1, 6, 7, 0, 0, 0} + }, + [1] = { + [DIR_UP] = { 5, 3, 12, 12, 0, 0}, + [DIR_DOWN] = { 3, 5, 12, 12, 0, 0}, + [DIR_LEFT] = { 0, 7, 6, 1, 0, 0}, + [DIR_RIGHT] = { 6, 7, 0, 1, 0, 0} + }, + [2] = { + [DIR_UP] = { 0, 0, 0, 0, 0, 0}, + [DIR_DOWN] = { 4, 0, 0, 0, 0, 0}, + [DIR_LEFT] = { 9, 8, 7, 6, 0, 0}, + [DIR_RIGHT] = { 3, 1, 0, 0, 0, 0} + }, + [3] = { + [DIR_UP] = { 1, 1, 1, 1, 0, 0}, + [DIR_DOWN] = { 5, 1, 1, 1, 0, 0}, + [DIR_LEFT] = { 2, 9, 8, 7, 0, 0}, + [DIR_RIGHT] = { 8, 9, 6, 6, 0, 0} + }, + [4] = { + [DIR_UP] = { 2, 2, 2, 2, 0, 0}, + [DIR_DOWN] = { 0, 0, 0, 0, 0, 0}, + [DIR_LEFT] = {11, 10, 9, 8, 7, 6}, + [DIR_RIGHT] = { 5, 3, 1, 0, 0, 0} + }, + [5] = { + [DIR_UP] = { 3, 3, 3, 3, 0, 0}, + [DIR_DOWN] = { 1, 1, 1, 1, 0, 0}, + [DIR_LEFT] = { 4, 4, 4, 4, 0, 0}, + [DIR_RIGHT] = {10, 8, 6, 0, 0, 0} + }, + // Partner's party + [6] = { + [DIR_UP] = {10, 8, 12, 0, 0, 0}, + [DIR_DOWN] = { 8, 10, 12, 0, 0, 0}, + [DIR_LEFT] = { 1, 0, 0, 0, 0, 0}, + [DIR_RIGHT] = { 7, 0, 1, 0, 0, 0} + }, + [7] = { + [DIR_UP] = {12, 0, 0, 0, 0, 0}, + [DIR_DOWN] = { 9, 12, 0, 0, 0, 0}, + [DIR_LEFT] = { 6, 0, 0, 0, 0, 0}, + [DIR_RIGHT] = { 0, 0, 0, 0, 0, 0} + }, + [8] = { + [DIR_UP] = { 6, 0, 0, 0, 0, 0}, + [DIR_DOWN] = {10, 6, 0, 0, 0, 0}, + [DIR_LEFT] = { 3, 2, 1, 0, 0, 0}, + [DIR_RIGHT] = { 9, 7, 0, 0, 0, 0} + }, + [9] = { + [DIR_UP] = { 7, 0, 0, 0, 0, 0}, + [DIR_DOWN] = {11, 12, 0, 0, 0, 0}, + [DIR_LEFT] = { 8, 0, 0, 0, 0, 0}, + [DIR_RIGHT] = { 2, 1, 0, 0, 0, 0} + }, + [10] = { + [DIR_UP] = { 8, 0, 0, 0, 0, 0}, + [DIR_DOWN] = { 6, 0, 0, 0, 0, 0}, + [DIR_LEFT] = { 5, 4, 3, 2, 1, 0}, + [DIR_RIGHT] = {11, 9, 7, 0, 0, 0} + }, + [11] = { + [DIR_UP] = { 9, 0, 0, 0, 0, 0}, + [DIR_DOWN] = {12, 0, 0, 0, 0, 0}, + [DIR_LEFT] = {10, 0, 0, 0, 0, 0}, + [DIR_RIGHT] = { 4, 2, 0, 0, 0, 0} + }, + // Cancel + [12] = { + [DIR_UP] = {11, 9, 7, 6, 0, 0}, + [DIR_DOWN] = { 7, 6, 0, 0, 0, 0}, + [DIR_LEFT] = {12, 0, 0, 0, 0, 0}, + [DIR_RIGHT] = {12, 0, 0, 0, 0, 0} + } +}; + +const u8 gTradeMonSpriteCoords[][2] = { + {0x01, 0x05}, + {0x08, 0x05}, + {0x01, 0x0a}, + {0x08, 0x0a}, + {0x01, 0x0f}, + {0x08, 0x0f}, + + {0x10, 0x05}, + {0x17, 0x05}, + {0x10, 0x0a}, + {0x17, 0x0a}, + {0x10, 0x0f}, + {0x17, 0x0f}, + + {0x17, 0x12}, +}; + +const u8 gUnknown_8261E5A[][2][6][2] = { + { + { + {0x05, 0x04}, + {0x0c, 0x04}, + {0x05, 0x09}, + {0x0c, 0x09}, + {0x05, 0x0e}, + {0x0c, 0x0e} + }, { + {0x14, 0x04}, + {0x1b, 0x04}, + {0x14, 0x09}, + {0x1b, 0x09}, + {0x14, 0x0e}, + {0x1b, 0x0e} + } + }, { + { + {0x01, 0x03}, + {0x08, 0x03}, + {0x01, 0x08}, + {0x08, 0x08}, + {0x01, 0x0d}, + {0x08, 0x0d} + }, { + {0x10, 0x03}, + {0x17, 0x03}, + {0x10, 0x08}, + {0x17, 0x08}, + {0x10, 0x0d}, + {0x17, 0x0d} + } + } +}; + +const u8 gTradeUnknownSpriteCoords[][4] = { + {0x3c, 0x09, 0xb4, 0x09}, + {0x30, 0x09, 0xa8, 0x09} +}; + +const u8 gUnknown_8261E92[] = { + 0x00, 0x0e, 0x0f, 0x1d, + 0x03, 0x05, 0x03, 0x07, + 0x12, 0x05, 0x12, 0x07, + 0x08, 0x07, 0x16, 0x0c, + 0x08, 0x07, 0x16, 0x0c, + 0x06, 0x07, 0x18, 0x0c, + 0x06, 0x07, 0x18, 0x0c, + 0x08, 0x07, 0x16, 0x0c, + 0x07, 0x07, 0x17, 0x0c +}; + +const u8 gUnknown_8261EB6[] = _(""); +const u8 gUnknown_8261EB7[] = _("{COLOR DARK_GREY}{HIGHLIGHT TRANSPARENT}{SHADOW RED}"); +const u8 gText_MaleSymbol4[] = _("♂"); +const u8 gText_FemaleSymbol4[] = _("♀"); +const u8 gText_GenderlessSymbol[] = _(""); +const u8 gUnknown_8261EC6[] = _(""); +const u8 gUnknown_8261EC7[] = _("\n"); +const u8 gUnknown_8261EC9[] = _("/"); + +const u8 *const gUnknown_8261ECC[] = { + gUnknown_841E0B9, + gUnknown_841E0C0, + gUnknown_841E0D2, + gUnknown_841E0DA, + gUnknown_841E0E0, + gUnknown_841E0EE +}; + +const struct MenuAction gUnknown_8261EE4[] = { + {gUnknown_841E10A, { .void_u8 = TradeMenuAction_Summary }}, + {gUnknown_841E112, { .void_u8 = TradeMenuAction_Trade }} +}; + +const u8 *const sTradeErrorOrStatusMessagePtrs[] = { + gUnknown_841E118, // Communication standby + gUnknown_841E145, // The trade has been canceled. + gUnknown_841E16B, // That's your only POKéMON for battle + gUnknown_8417094, // That's your only POKéMON for battle + gUnknown_841E199, // Waiting for your friend to finish + gUnknown_841E1C5, // Your friend wants to trade POKéMON + gUnknown_84170BC, // That POKéMON can't be traded now + gUnknown_84170E0, // An EGG can't be traded now + gUnknown_84170FC // The other TRAINER's POKéMON can't be traded now +}; + +const u8 gUnknown_8261F18[] = { 0, 1, 2 }; + +const struct BgTemplate gUnknown_8261F1C[] = { + { + .bg = 0, + .charBaseIndex = 2, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0x000 + }, { + .bg = 1, + .charBaseIndex = 0, + .mapBaseIndex = 5, + .screenSize = 0, + .paletteMode = 0, + .priority = 1, + .baseTile = 0x000 + }, { + .bg = 2, + .charBaseIndex = 0, + .mapBaseIndex = 6, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0x000 + }, { + .bg = 3, + .charBaseIndex = 0, + .mapBaseIndex = 7, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0x000 + } +}; + +const struct WindowTemplate gUnknown_8261F2C[] = { + { + .bg = 0, + .tilemapLeft = 4, + .tilemapTop = 7, + .width = 22, + .height = 4, + .paletteNum = 15, + .baseBlock = 0x01e + }, { + .bg = 0, + .tilemapLeft = 17, + .tilemapTop = 15, + .width = 12, + .height = 4, + .paletteNum = 15, + .baseBlock = 0x076 + }, { + .bg = 0, + .tilemapLeft = 0, + .tilemapTop = 5, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 0x0a6 + }, { + .bg = 0, + .tilemapLeft = 7, + .tilemapTop = 5, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 0x0b6 + }, { + .bg = 0, + .tilemapLeft = 0, + .tilemapTop = 10, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 0x0c6 + }, { + .bg = 0, + .tilemapLeft = 7, + .tilemapTop = 10, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 0x0d6 + }, { + .bg = 0, + .tilemapLeft = 0, + .tilemapTop = 15, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 0x0e6 + }, { + .bg = 0, + .tilemapLeft = 7, + .tilemapTop = 15, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 0x0f6 + }, { + .bg = 0, + .tilemapLeft = 15, + .tilemapTop = 5, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 0x106 + }, { + .bg = 0, + .tilemapLeft = 22, + .tilemapTop = 5, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 0x116 + }, { + .bg = 0, + .tilemapLeft = 15, + .tilemapTop = 10, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 0x126 + }, { + .bg = 0, + .tilemapLeft = 22, + .tilemapTop = 10, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 0x136 + }, { + .bg = 0, + .tilemapLeft = 15, + .tilemapTop = 15, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 0x146 + }, { + .bg = 0, + .tilemapLeft = 22, + .tilemapTop = 15, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 0x156 + }, { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 5, + .width = 14, + .height = 2, + .paletteNum = 13, + .baseBlock = 0x166 + }, { + .bg = 0, + .tilemapLeft = 3, + .tilemapTop = 8, + .width = 11, + .height = 8, + .paletteNum = 15, + .baseBlock = 0x182 + }, { + .bg = 0, + .tilemapLeft = 17, + .tilemapTop = 5, + .width = 14, + .height = 2, + .paletteNum = 15, + .baseBlock = 0x1da + }, { + .bg = 0, + .tilemapLeft = 18, + .tilemapTop = 8, + .width = 11, + .height = 8, + .paletteNum = 15, + .baseBlock = 0x1f6 + }, DUMMY_WIN_TEMPLATE +}; + +const struct WindowTemplate gUnknown_8261FC4 = { + .bg = 0, + .tilemapLeft = 21, + .tilemapTop = 13, + .width = 6, + .height = 4, + .paletteNum = 15, + .baseBlock = 0x24e +}; + +const u8 gUnknown_8261FCC[][13] = { + _("かいめの そうしん"), + _("かいめの じゅしん"), + _("ポケモンアイコンセット"), + _("OBJテキストセット"), + _("セルセット"), + _("OBJテキストADD"), + _("システムメッセージADD"), + _("はいけいセット") +}; + +const u8 gJPText_Shedinja[] = _("ヌケニン"); +const u8 gUnknown_8262039[] = _("こうかんせいりつ "); +const u8 gUnknown_8262047[] = _("だめだたらしいよ "); + +const u8 gUnknown_8262055[][2] = { + { 4, 3}, + {19, 3} +}; void sub_804C600(void) { @@ -320,7 +690,7 @@ void sub_804C600(void) { DeactivateAllTextPrinters(); gUnknown_3000E78 = 590; // ? - for (i = 0; i < NELEMS(gUnknown_8261F2C); i++) + for (i = 0; i < NELEMS(gUnknown_8261F2C) - 1; i++) { ClearWindowTilemap(i); FillWindowPixelBuffer(i, PIXEL_FILL(0)); @@ -2882,11 +3252,11 @@ u8 sub_804E028(u8 oldPosition, u8 direction) int i; u8 newPosition = 0; - for (i = 0; i < PARTY_SIZE; i++) + for (i = 0; i < 6; i++) { - if (sTradeMenuResourcesPtr->tradeMenuOptionsActive[gUnknown_8261D08[oldPosition][direction][i]] == TRUE) + if (sTradeMenuResourcesPtr->tradeMenuOptionsActive[sCursorMoveDestinations[oldPosition][direction][i]] == TRUE) { - newPosition = gUnknown_8261D08[oldPosition][direction][i]; + newPosition = sCursorMoveDestinations[oldPosition][direction][i]; break; } } @@ -2937,9 +3307,6 @@ void sub_804E134(void) } } -extern const struct MenuAction gUnknown_8261EE4[]; -extern const struct WindowTemplate gUnknown_8261FC4; - void sub_804E194(void) { int i; @@ -3554,13 +3921,16 @@ void sub_804F08C(u8 whichParty, u8 monIdx, u8 a2, u8 a3, u8 a4, u8 a5) void sub_804F284(u8 whichParty) { s32 i; - const u8 *r5; - const u8 *r4; for (i = 0; i < sTradeMenuResourcesPtr->partyCounts[whichParty]; i++) { - r5 = gUnknown_8261E5A[whichParty]; - r4 = gUnknown_8261E72[whichParty]; - sub_804F08C(whichParty, i, r5[2 * i + 0], r5[2 * i + 1], r4[2 * i + 0], r4[2 * i + 1]); + sub_804F08C( + whichParty, + i, + gUnknown_8261E5A[0][whichParty][i][0], + gUnknown_8261E5A[0][whichParty][i][1], + gUnknown_8261E5A[1][whichParty][i][0], + gUnknown_8261E5A[1][whichParty][i][1] + ); } } #else @@ -3584,7 +3954,7 @@ void sub_804F284(u8 whichParty) "\tldr r1, _0804F2E0 @ =gUnknown_8261E5A\n" "\tlsls r0, 2\n" "\tadds r5, r0, r1\n" - "\tldr r1, _0804F2E4 @ =gUnknown_8261E72\n" + "\tldr r1, _0804F2E4 @ =gUnknown_8261E5A+24\n" "\tadds r4, r0, r1\n" "_0804F2AA:\n" "\tlsls r1, r7, 24\n" @@ -3615,7 +3985,7 @@ void sub_804F284(u8 whichParty) "\t.align 2, 0\n" "_0804F2DC: .4byte sTradeMenuResourcesPtr\n" "_0804F2E0: .4byte gUnknown_8261E5A\n" - "_0804F2E4: .4byte gUnknown_8261E72"); + "_0804F2E4: .4byte gUnknown_8261E5A+24"); } #endif //NONMATCHING @@ -3650,13 +4020,13 @@ void sub_804F3C8(u8 whichParty) sTradeMenuResourcesPtr->unk_74[whichParty] = 0; } -void sub_804F440(void) +void TradeMenuAction_Summary(u8 taskId) { FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(0); } -void sub_804F464(void) +void TradeMenuAction_Trade(u8 taskId) { FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(0); @@ -4120,2272 +4490,3 @@ int Trade_CanTradeSelectedMon(struct UnkLinkRfuStruct_02022B14Substruct a0, u16 return 0; } - -// Sprite callback for link cable trade glow -void SpriteCB_TradeGlowCable(struct Sprite * sprite) -{ - sprite->data[0]++; - if (sprite->data[0] == 10) - { - PlaySE(SE_BOWA); - sprite->data[0] = 0; - } -} - -// Sprite callback for wireless trade glow -void SpriteCB_TradeGlowWireless(struct Sprite * sprite) -{ - if (!sprite->invisible) - { - sprite->data[0]++; - if (sprite->data[0] == 10) - { - PlaySE(SE_W207B); - sprite->data[0] = 0; - } - } -} - -// Palette flash for trade glow core -void SpriteCB_TradeGlowCore(struct Sprite * sprite) -{ - if (sprite->data[1] == 0) - { - sprite->data[0]++; - if (sprite->data[0] == 12) - sprite->data[0] = 0; - LoadPalette(&gTradeGlow2PaletteAnimTable[sprite->data[0]], 16 * (sprite->oam.paletteNum + 16) + 4, 2); - } -} - -void SpriteCB_GameLinkCableEnd_Outbound(struct Sprite * sprite) -{ - sprite->data[0]++; - sprite->pos2.y++; - if (sprite->data[0] == 10) - DestroySprite(sprite); -} - -void SpriteCB_GameLinkCableEnd_Inbound(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; - } -} - -void SetTradeBGAffine(void) -{ - struct BgAffineDstData affine; - DoBgAffineSet(&affine, sTradeData->unk_D4 * 0x100, sTradeData->unk_D6 * 0x100, sTradeData->unk_DC, sTradeData->unk_DE, sTradeData->sXY, sTradeData->sXY, sTradeData->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); -} - -static void TradeAnim_UpdateBgRegs(void) -{ - u16 dispcnt; - - SetGpuReg(REG_OFFSET_BG1VOFS, sTradeData->bg1vofs); - SetGpuReg(REG_OFFSET_BG1HOFS, sTradeData->bg1hofs); - - dispcnt = GetGpuReg(REG_OFFSET_DISPCNT); - if ((dispcnt & 7) == DISPCNT_MODE_0) - { - SetGpuReg(REG_OFFSET_BG2VOFS, sTradeData->bg2vofs); - SetGpuReg(REG_OFFSET_BG2HOFS, sTradeData->bg2hofs); - } - else - { - SetTradeBGAffine(); - } -} - -static void VBlankCB_TradeAnim(void) -{ - TradeAnim_UpdateBgRegs(); - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -void sub_804FF24(void) -{ - sTradeData->unk_8A = 0; - sTradeData->unk_88 = 0; - sTradeData->unk_89 = 0; -} - -void sub_804FF4C(void) -{ - if (sTradeData->unk_88 == sTradeData->unk_89) - sTradeData->unk_8A++; - else - sTradeData->unk_8A = 0; - - if (sTradeData->unk_8A > 300) - { - CloseLink(); - SetMainCallback2(CB2_LinkError); - sTradeData->unk_8A = 0; - sTradeData->unk_89 = 0; - sTradeData->unk_88 = 0; - } - - sTradeData->unk_89 = sTradeData->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[gSelectedTradeMonPositions[0]]; - pos = 1; - } - - if (whichParty == 1) - { - mon = &gEnemyParty[gSelectedTradeMonPositions[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)); - sTradeData->tradeSpecies[whichParty] = species; - sTradeData->monPersonalities[whichParty] = personality; - break; - case 1: - SetMultiuseSpriteTemplateToPokemon(GetMonSpritePalStruct(mon)->tag, pos); - sTradeData->pokePicSpriteIdxs[whichParty] = CreateSprite(&gMultiuseSpriteTemplate, 120, 60, 6); - gSprites[sTradeData->pokePicSpriteIdxs[whichParty]].invisible = TRUE; - gSprites[sTradeData->pokePicSpriteIdxs[whichParty]].callback = SpriteCallbackDummy; - break; - } -} - -void CB2_InitTradeAnim_LinkTrade(void) -{ - switch (gMain.state) - { - case 0: - if (!gReceivedRemoteLinkPlayers) - { - gLinkType = 0x1144; - CloseLink(); - } - sTradeData = AllocZeroed(sizeof(struct TradeAnimationResources)); - AllocateMonSpritesGfx(); - ResetTasks(); - ResetSpriteData(); - FreeAllSpritePalettes(); - SetVBlankCallback(VBlankCB_TradeAnim); - TradeAnimInit_LoadGfx(); - sub_804FF24(); - gMain.state++; - sTradeData->unk_8C = 0; - sTradeData->state = 0; - sTradeData->isLinkTrade = TRUE; - sTradeData->unk_D4 = 64; - sTradeData->unk_D6 = 64; - sTradeData->unk_D8 = 0; - sTradeData->unk_DA = 0; - sTradeData->unk_DC = 120; - sTradeData->unk_DE = 80; - sTradeData->sXY = 256; - sTradeData->unk_EC = 0; - break; - case 1: - if (!gReceivedRemoteLinkPlayers) - { - sTradeData->isCableTrade = TRUE; - OpenLink(); - gMain.state++; - sTradeData->timer = 0; - } - else - { - gMain.state = 4; - } - break; - case 2: - sTradeData->timer++; - if (sTradeData->timer > 60) - { - sTradeData->timer = 0; - gMain.state++; - } - break; - case 3: - if (IsLinkMaster()) - { - if (GetLinkPlayerCount_2() >= GetSavedPlayerCount()) - { - sTradeData->timer++; - if (sTradeData->timer > 30) - { - CheckShouldAdvanceLinkState(); - gMain.state++; - } - } - else - { - sub_804FF4C(); - } - } - else - { - gMain.state++; - } - break; - case 4: - sub_804FF4C(); - if (gReceivedRemoteLinkPlayers == 1 && IsLinkPlayerDataExchangeComplete() == 1) - { - gMain.state++; - } - break; - case 5: - sTradeData->unk_72 = 0; - sTradeData->unk_73 = 0; - sTradeData->unk_93 = 0; - sub_804FFE4(0, 0); - gMain.state++; - break; - case 6: - sub_804FFE4(0, 1); - gMain.state++; - break; - case 7: - sub_804FFE4(1, 0); - gMain.state++; - break; - case 8: - sub_804FFE4(1, 1); - sub_80504B0(); - gMain.state++; - break; - case 9: - sub_8050DE0(); - LoadSpriteSheet(&gUnknown_826CDD4); - LoadSpritePalette(&gUnknown_826CDDC); - gMain.state++; - break; - case 10: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); - ShowBg(0); - sTradeData->monSpecies[0] = GetMonData(&gPlayerParty[gSelectedTradeMonPositions[0]], MON_DATA_SPECIES2); - sTradeData->monSpecies[1] = GetMonData(&gEnemyParty[gSelectedTradeMonPositions[1] % 6], MON_DATA_SPECIES2); - memcpy(sTradeData->unk_FC, gLinkPlayers[GetMultiplayerId() ^ 1].name, 7); - gMain.state++; - break; - case 11: - sub_805049C(); - sub_8050E24(); - gMain.state++; - break; - case 12: - if (!gPaletteFade.active) - { - if (gWirelessCommType != 0) - { - LoadWirelessStatusIndicatorSpriteGfx(); - CreateWirelessStatusIndicatorSprite(0, 0); - } - SetMainCallback2(CB2_RunTradeAnim_LinkTrade); - } - break; - } - RunTasks(); - RunTextPrinters(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -void sub_805049C(void) -{ - SetTradeSequenceBgGpuRegs(5); - SetTradeSequenceBgGpuRegs(0); -} - -void sub_80504B0(void) -{ - FillWindowPixelBuffer(0, PIXEL_FILL(15)); - PutWindowTilemap(0); - CopyWindowToVram(0, 3); -} - -void TradeAnimInit_LoadGfx(void) -{ - SetGpuReg(REG_OFFSET_DISPCNT, 0); - ResetBgsAndClearDma3BusyFlags(FALSE); - InitBgsFromTemplates(0, gUnknown_826D1D4, NELEMS(gUnknown_826D1D4)); - ChangeBgX(0, 0, 0); - ChangeBgY(0, 0, 0); - SetBgTilemapBuffer(0, Alloc(BG_SCREEN_SIZE)); - SetBgTilemapBuffer(1, Alloc(BG_SCREEN_SIZE)); - SetBgTilemapBuffer(3, Alloc(BG_SCREEN_SIZE)); - DeactivateAllTextPrinters(); - // Doing the graphics load... - DecompressAndLoadBgGfxUsingHeap(0, gBattleTextboxTiles, 0, 0, 0); - LZDecompressWram(gFile_graphics_interface_menu_map_tilemap, gDecompressionBuffer); - CopyToBgTilemapBuffer(0, gDecompressionBuffer, BG_SCREEN_SIZE, 0); - LoadCompressedPalette(gBattleTextboxPalette, 0x000, 0x20); - InitWindows(gUnknown_826D1BC); - // ... and doing the same load again - DecompressAndLoadBgGfxUsingHeap(0, gBattleTextboxTiles, 0, 0, 0); - LZDecompressWram(gFile_graphics_interface_menu_map_tilemap, gDecompressionBuffer); - CopyToBgTilemapBuffer(0, gDecompressionBuffer, BG_SCREEN_SIZE, 0); - LoadCompressedPalette(gBattleTextboxPalette, 0x000, 0x20); -} - -void CB2_InitTradeAnim_InGameTrade(void) -{ - u8 otName[11]; - - switch (gMain.state) - { - case 0: - gSelectedTradeMonPositions[0] = gSpecialVar_0x8005; - gSelectedTradeMonPositions[1] = 6; - StringCopy(gLinkPlayers[0].name, gSaveBlock2Ptr->playerName); - GetMonData(&gEnemyParty[0], MON_DATA_OT_NAME, otName); - StringCopy(gLinkPlayers[1].name, otName); - sTradeData = AllocZeroed(sizeof(*sTradeData)); - AllocateMonSpritesGfx(); - ResetTasks(); - ResetSpriteData(); - FreeAllSpritePalettes(); - SetVBlankCallback(VBlankCB_TradeAnim); - TradeAnimInit_LoadGfx(); - sTradeData->isLinkTrade = FALSE; - sTradeData->unk_8C = 0; - sTradeData->state = 0; - sTradeData->unk_D4 = 64; - sTradeData->unk_D6 = 64; - sTradeData->unk_D8 = 0; - sTradeData->unk_DA = 0; - sTradeData->unk_DC = 120; - sTradeData->unk_DE = 80; - sTradeData->sXY = 256; - sTradeData->unk_EC = 0; - sTradeData->timer = 0; - gMain.state = 5; - break; - case 5: - sub_804FFE4(0, 0); - gMain.state++; - break; - case 6: - sub_804FFE4(0, 1); - gMain.state++; - break; - case 7: - sub_804FFE4(1, 0); - ShowBg(0); - gMain.state++; - break; - case 8: - sub_804FFE4(1, 1); - FillWindowPixelBuffer(0, PIXEL_FILL(15)); - PutWindowTilemap(0); - CopyWindowToVram(0, 3); - gMain.state++; - break; - case 9: - sub_8050DE0(); - LoadSpriteSheet(&gUnknown_826CDD4); - LoadSpritePalette(&gUnknown_826CDDC); - gMain.state++; - break; - case 10: - ShowBg(0); - gMain.state++; - break; - case 11: - SetTradeSequenceBgGpuRegs(5); - SetTradeSequenceBgGpuRegs(0); - sub_8050E24(); - gMain.state++; - break; - case 12: - SetMainCallback2(CB2_RunTradeAnim_InGameTrade); - break; - } - - RunTasks(); - RunTextPrinters(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void ReceivedMonSetPokedexFlags(u8 partyIdx) -{ - struct Pokemon *mon = &gPlayerParty[partyIdx]; - - if (!GetMonData(mon, MON_DATA_IS_EGG)) - { - u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); - u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); - species = SpeciesToNationalPokedexNum(species); - GetSetPokedexFlag(species, FLAG_SET_SEEN); - HandleSetPokedexFlag(species, FLAG_SET_CAUGHT, personality); - } -} - -static void RS_TryEnableNationalPokedex(void) -{ - u8 mpId = GetMultiplayerId(); - // Originally in Ruby but commented out - /*if (gLinkPlayers[mpId ^ 1].lp_field_2 == 0x8000) - EnableNationalPokedex();*/ -} - -void TradeMons(u8 playerPartyIdx, u8 partnerPartyIdx) -{ - u8 friendship; - - // Get whether the offered Pokemon have mail - struct Pokemon *playerMon = &gPlayerParty[playerPartyIdx]; - u16 playerMail = GetMonData(playerMon, MON_DATA_MAIL); - - struct Pokemon *partnerMon = &gEnemyParty[partnerPartyIdx]; - u16 partnerMail = GetMonData(partnerMon, MON_DATA_MAIL); - - // The mail attached to the sent Pokemon no longer exists in your file. - if (playerMail != 0xFF) - ClearMailStruct(&gSaveBlock1Ptr->mail[playerMail]); - - // This is where the actual trade happens!! - sTradeData->mon = *playerMon; - *playerMon = *partnerMon; - *partnerMon = sTradeData->mon; - - // By default, a Pokemon received from a trade will have 70 Friendship. - friendship = 70; - if (!GetMonData(playerMon, MON_DATA_IS_EGG)) - SetMonData(playerMon, MON_DATA_FRIENDSHIP, &friendship); - - // Associate your partner's mail with the Pokemon they sent over. - if (partnerMail != 0xFF) - GiveMailToMon2(playerMon, &gLinkPartnerMail[partnerMail]); - - ReceivedMonSetPokedexFlags(playerPartyIdx); - if (gReceivedRemoteLinkPlayers) - RS_TryEnableNationalPokedex(); -} - -void sub_80508F4(void) -{ - switch (sTradeData->unk_93) - { - case 1: - if (IsLinkTaskFinished()) - { - SendBlock(bitmask_all_link_players_but_self(), sTradeData->linkData, 20); - sTradeData->unk_93++; - } - case 2: - sTradeData->unk_93 = 0; - break; - } -} - -void CB2_RunTradeAnim_InGameTrade(void) -{ - sub_8050F14(); - RunTasks(); - RunTextPrinters(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -void SetTradeSequenceBgGpuRegs(u8 state) -{ - switch (state) - { - case 0: - sTradeData->bg2vofs = 0; - sTradeData->bg2hofs = 0xB4; - SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); - SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT512x256); - LoadPalette(gTradeGba2_Pal, 0x10, 0x60); - DmaCopyLarge16(3, gTradeGba_Gfx, (void *)BG_CHAR_ADDR(1), 0x1420, 0x1000); - DmaCopy16Defvars(3, gUnknown_826601C, (void *)BG_SCREEN_ADDR(18), 0x1000); - break; - case 1: - sTradeData->bg1hofs = 0; - sTradeData->bg1vofs = 0x15C; - SetGpuReg(REG_OFFSET_BG1VOFS, 0x15C); - SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(5) | BGCNT_TXT256x512); - SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT256x512); - if (sTradeData->isCableTrade) - { - DmaCopy16Defvars(3, gUnknown_826AA5C, (void *)BG_SCREEN_ADDR(5), 0x1000); - } - else - { - DmaCopy16Defvars(3, gUnknown_8269A5C, (void *)BG_SCREEN_ADDR(5), 0x1000); - } - DmaCopyLarge16(3, gTradeGba_Gfx, (void *)BG_CHAR_ADDR(0), 0x1420, 0x1000); - SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); - break; - case 2: - sTradeData->bg1vofs = 0; - sTradeData->bg1hofs = 0; - if (sTradeData->isCableTrade == FALSE) - { - SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); - LZ77UnCompVram(gUnknown_3379A0Bin, (void *)BG_SCREEN_ADDR(5)); - BlendPalettes(0x000000008, 0x10, RGB_BLACK); - } - else - { - SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); - DmaCopy16Defvars(3, gUnknown_826407C, (void *)BG_SCREEN_ADDR(5), 0x800); - BlendPalettes(0x00000001, 0x10, RGB_BLACK); - } - break; - case 3: - LoadPalette(gUnknown_826BF5C, 0x30, 0x20); - LZ77UnCompVram(gWirelessSignal4bpp, BG_CHAR_ADDR(1)); - LZ77UnCompVram(gUnknown_826C60C, BG_SCREEN_ADDR(18)); - sTradeData->bg2vofs = 0x50; - SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); - break; - case 4: - SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); - SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_256COLOR | BGCNT_SCREENBASE(18) | BGCNT_AFF128x128); - sTradeData->unk_D4 = 0x40; - sTradeData->unk_D6 = 0x5C; - sTradeData->sXY = 0x20; - sTradeData->unk_EA = 0x400; - sTradeData->unk_EC = 0; - DmaCopyLarge16(3, gUnknown_826701C, (void *)BG_CHAR_ADDR(1), 0x2840, 0x1000); - if (sTradeData->isCableTrade) - { - DmaCopy16Defvars(3, gUnknown_826985C, (void *)BG_SCREEN_ADDR(18), 0x100); - } - else - { - DmaCopy16Defvars(3, gUnknown_826995C, (void *)BG_SCREEN_ADDR(18), 0x100); - } - break; - case 5: - sTradeData->bg1vofs = 0; - sTradeData->bg1hofs = 0; - break; - case 6: - SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); - SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_256COLOR | BGCNT_SCREENBASE(18) | BGCNT_TXT256x256); - sTradeData->unk_D4 = 0x40; - sTradeData->unk_D6 = 0x5C; - sTradeData->sXY = 0x100; - sTradeData->unk_EA = 0x80; - sTradeData->unk_DC = 0x78; - sTradeData->unk_DE = 0x50; - sTradeData->unk_EC = 0; - DmaCopyLarge16(3, gUnknown_826701C, BG_CHAR_ADDR(1), 0x2840, 0x1000); - if (sTradeData->isCableTrade) - { - DmaCopy16Defvars(3, gUnknown_826985C, (void *)BG_SCREEN_ADDR(18), 0x100); - } - else - { - DmaCopy16Defvars(3, gUnknown_826995C, (void *)BG_SCREEN_ADDR(18), 0x100); - } - break; - case 7: - sTradeData->bg2vofs = 0; - sTradeData->bg2hofs = 0; - SetGpuReg(REG_OFFSET_BLDCNT, 0); - SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT512x256); - LoadPalette(gTradeGba2_Pal, 0x10, 0x60); - DmaCopyLarge16(3, gTradeGba_Gfx, (void *)BG_CHAR_ADDR(1), 0x1420, 0x1000); - DmaCopy16Defvars(3, gUnknown_826601C, (void *)BG_SCREEN_ADDR(18), 0x1000); - break; - } -} - -void sub_8050DE0(void) -{ - LoadSpriteSheet(&gUnknown_826CE2C); - LoadSpriteSheet(&gUnknown_826CE7C); - LoadSpriteSheet(&gUnknown_826CEB0); - LoadSpriteSheet(&gUnknown_826CF28); - LoadSpritePalette(&gUnknown_826CE34); - LoadSpritePalette(&gUnknown_826CE3C); -} - -void sub_8050E24(void) -{ - u8 nickname[20]; - u8 mpId; - const struct InGameTrade * inGameTrade; - if (sTradeData->isLinkTrade) - { - mpId = GetMultiplayerId(); - StringCopy(gStringVar1, gLinkPlayers[mpId ^ 1].name); - GetMonData(&gEnemyParty[gSelectedTradeMonPositions[1] % 6], MON_DATA_NICKNAME, nickname); - StringCopy10(gStringVar3, nickname); - GetMonData(&gPlayerParty[gSelectedTradeMonPositions[0]], MON_DATA_NICKNAME, nickname); - StringCopy10(gStringVar2, nickname); - } - else - { - inGameTrade = &gInGameTrades[gSpecialVar_0x8004]; - StringCopy(gStringVar1, inGameTrade->otName); - StringCopy10(gStringVar3, inGameTrade->nickname); - GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_NICKNAME, nickname); - StringCopy10(gStringVar2, nickname); - } -} - -bool8 sub_8050F14(void) -{ - if (sTradeData->isCableTrade) - return sub_8050F3C(); - else - return sub_805232C(); -} - -bool8 sub_8050F3C(void) -{ - u16 evoTarget; - - switch (sTradeData->state) - { - case 0: - gSprites[sTradeData->pokePicSpriteIdxs[0]].invisible = FALSE; - gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.x = -180; - gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y = gMonFrontPicCoords[sTradeData->tradeSpecies[0]].y_offset; - sTradeData->state++; - sTradeData->cachedMapMusic = GetCurrentMapMusic(); - PlayNewMapMusic(MUS_SHINKA); - break; - case 1: - if (sTradeData->bg2hofs > 0) - { - gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.x += 3; - sTradeData->bg2hofs -= 3; - } - else - { - gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.x = 0; - sTradeData->bg2hofs = 0; - sTradeData->state = 10; - } - break; - case 10: - StringExpandPlaceholders(gStringVar4, gText_XWillBeSentToY); - DrawTextOnTradeWindow(0, gStringVar4, 0); - - if (sTradeData->tradeSpecies[0] != SPECIES_EGG) - { - PlayCry1(sTradeData->tradeSpecies[0], 0); - } - - sTradeData->state = 11; - sTradeData->timer = 0; - break; - case 11: - if (++sTradeData->timer == 80) - { - sTradeData->pokeballSpriteId = CreateTradePokeballSprite(sTradeData->pokePicSpriteIdxs[0], gSprites[sTradeData->pokePicSpriteIdxs[0]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff); - sTradeData->state++; - StringExpandPlaceholders(gStringVar4, gText_ByeByeVar1); - DrawTextOnTradeWindow(0, gStringVar4, 0); - } - break; - case 12: - if (gSprites[sTradeData->pokeballSpriteId].callback == SpriteCallbackDummy) - { - sTradeData->unk_D3 = CreateSprite(&sTradePokeballSpriteTemplate, 120, 32, 0); - gSprites[sTradeData->unk_D3].callback = SpriteCB_TradePokeball_Outbound; - DestroySprite(&gSprites[sTradeData->pokeballSpriteId]); - sTradeData->state++; - } - break; - case 13: - // The game waits here for the sprite to finish its animation sequence. - break; - case 14: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); - sTradeData->state = 20; - break; - case 20: - if (!gPaletteFade.active) - { - SetTradeSequenceBgGpuRegs(4); - FillWindowPixelBuffer(0, PIXEL_FILL(15)); - CopyWindowToVram(0, 3); - sTradeData->state++; - } - break; - case 21: - BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); - sTradeData->state++; - break; - case 22: - if (!gPaletteFade.active) - { - sTradeData->state = 23; - } - break; - case 23: - if (sTradeData->unk_EA > 0x100) - { - sTradeData->unk_EA -= 0x34; - } - else - { - SetTradeSequenceBgGpuRegs(1); - sTradeData->unk_EA = 0x80; - sTradeData->state++; - sTradeData->timer = 0; - } - sTradeData->sXY = 0x8000 / sTradeData->unk_EA; - break; - case 24: - if (++sTradeData->timer > 20) - { - SetTradeBGAffine(); - sTradeData->unk_91 = CreateSprite(&gUnknown_826CF30, 120, 80, 0); - sTradeData->state++; - } - break; - case 25: - if (gSprites[sTradeData->unk_91].animEnded) - { - DestroySprite(&gSprites[sTradeData->unk_91]); - SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | - BLDCNT_TGT2_BG1 | - BLDCNT_TGT2_BG2); - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 4)); - sTradeData->state++; - } - break; - case 26: - if (--sTradeData->bg1vofs == 316) - { - sTradeData->state++; - } - if (sTradeData->bg1vofs == 328) - { - sTradeData->unk_92 = CreateSprite(&sGameLinkCableEndSpriteTemplate, 128, 65, 0); - } - break; - case 27: - sTradeData->unk_90 = CreateSprite(&gUnknown_826CE44, 128, 80, 3); - sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 128, 80, 0); - StartSpriteAnim(&gSprites[sTradeData->unk_91], 1); - sTradeData->state++; - break; - case 28: - if ((sTradeData->bg1vofs -= 2) == 166) - { - sTradeData->state = 200; - } - SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | - DISPCNT_OBJ_1D_MAP | - DISPCNT_BG1_ON | - DISPCNT_OBJ_ON); - break; - case 200: - gSprites[sTradeData->unk_90].pos1.y -= 2; - gSprites[sTradeData->unk_91].pos1.y -= 2; - if (gSprites[sTradeData->unk_90].pos1.y < -8) - { - sTradeData->state = 29; - } - break; - case 29: - BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); - sTradeData->state = 30; - break; - case 30: - if (!gPaletteFade.active) - { - DestroySprite(&gSprites[sTradeData->unk_90]); - DestroySprite(&gSprites[sTradeData->unk_91]); - SetTradeSequenceBgGpuRegs(2); - sTradeData->state++; - } - break; - case 31: - BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); - sTradeData->unk_90 = CreateSprite(&sGlowBallSpriteTemplate, 111, 170, 0); - sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 129, -10, 0); - sTradeData->state++; - break; - case 32: - if (!gPaletteFade.active) - { - PlaySE(SE_TK_WARPOUT); - sTradeData->state++; - } - gSprites[sTradeData->unk_90].pos2.y -= 3; - gSprites[sTradeData->unk_91].pos2.y += 3; - break; - case 33: - gSprites[sTradeData->unk_90].pos2.y -= 3; - gSprites[sTradeData->unk_91].pos2.y += 3; - if (gSprites[sTradeData->unk_90].pos2.y <= -90) - { - gSprites[sTradeData->unk_90].data[1] = 1; - gSprites[sTradeData->unk_91].data[1] = 1; - sTradeData->state++; - } - break; - case 34: - BlendPalettes(0x1, 16, RGB_WHITEALPHA); - sTradeData->state++; - break; - case 35: - BlendPalettes(0x1, 0, RGB_WHITEALPHA); - sTradeData->state++; - break; - case 36: - BlendPalettes(0x1, 16, RGB_WHITEALPHA); - sTradeData->state++; - break; - case 37: - if (!IsPokeSpriteNotFlipped(sTradeData->tradeSpecies[0])) - { - gSprites[sTradeData->pokePicSpriteIdxs[0]].affineAnims = gUnknown_826CF88; - gSprites[sTradeData->pokePicSpriteIdxs[0]].oam.affineMode = 3; - CalcCenterToCornerVec(&gSprites[sTradeData->pokePicSpriteIdxs[0]], 0, 3, 3); - StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[0]], 0); - } - else - { - StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[0]], 0); - } - StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[1]], 0); - gSprites[sTradeData->pokePicSpriteIdxs[0]].pos1.x = 60; - gSprites[sTradeData->pokePicSpriteIdxs[1]].pos1.x = 180; - gSprites[sTradeData->pokePicSpriteIdxs[0]].pos1.y = 192; - gSprites[sTradeData->pokePicSpriteIdxs[1]].pos1.y = -32; - gSprites[sTradeData->pokePicSpriteIdxs[0]].invisible = FALSE; - gSprites[sTradeData->pokePicSpriteIdxs[1]].invisible = FALSE; - sTradeData->state++; - break; - case 38: - gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y -= 3; - gSprites[sTradeData->pokePicSpriteIdxs[1]].pos2.y += 3; - if (gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y < -160 && gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y >= -163) - { - PlaySE(SE_TK_WARPIN); - } - if (gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y < -222) - { - gSprites[sTradeData->unk_90].data[1] = 0; - gSprites[sTradeData->unk_91].data[1] = 0; - sTradeData->state++; - gSprites[sTradeData->pokePicSpriteIdxs[0]].invisible = TRUE; - gSprites[sTradeData->pokePicSpriteIdxs[1]].invisible = TRUE; - BlendPalettes(0x1, 0, RGB_WHITEALPHA); - } - break; - case 39: - gSprites[sTradeData->unk_90].pos2.y -= 3; - gSprites[sTradeData->unk_91].pos2.y += 3; - if (gSprites[sTradeData->unk_90].pos2.y <= -222) - { - BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); - sTradeData->state++; - DestroySprite(&gSprites[sTradeData->unk_90]); - DestroySprite(&gSprites[sTradeData->unk_91]); - } - break; - case 40: - if (!gPaletteFade.active) - { - sTradeData->state++; - SetTradeSequenceBgGpuRegs(1); - sTradeData->bg1vofs = 166; - sTradeData->unk_90 = CreateSprite(&gUnknown_826CE44, 128, -20, 3); - sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 128, -20, 0); - StartSpriteAnim(&gSprites[sTradeData->unk_91], 1); - } - break; - case 41: - BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); - sTradeData->state++; - break; - case 42: - SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | - DISPCNT_OBJ_1D_MAP | - DISPCNT_BG1_ON | - DISPCNT_OBJ_ON); - if (!gPaletteFade.active) - { - sTradeData->state++; - } - break; - case 43: - gSprites[sTradeData->unk_90].pos2.y += 3; - gSprites[sTradeData->unk_91].pos2.y += 3; - if (gSprites[sTradeData->unk_90].pos2.y + gSprites[sTradeData->unk_90].pos1.y == 64) - { - sTradeData->state++; - } - break; - case 44: - if ((sTradeData->bg1vofs += 2) > 316) - { - sTradeData->bg1vofs = 316; - sTradeData->state++; - } - break; - case 45: - DestroySprite(&gSprites[sTradeData->unk_90]); - DestroySprite(&gSprites[sTradeData->unk_91]); - sTradeData->state++; - sTradeData->timer = 0; - break; - case 46: - if (++sTradeData->timer == 10) - { - sTradeData->state++; - } - break; - case 47: - if (++sTradeData->bg1vofs > 348) - { - sTradeData->bg1vofs = 348; - sTradeData->state++; - } - if (sTradeData->bg1vofs == 328 && sTradeData->isCableTrade) - { - sTradeData->unk_92 = CreateSprite(&sGameLinkCableEndSpriteTemplate, 128, 65, 0); - gSprites[sTradeData->unk_92].callback = SpriteCB_GameLinkCableEnd_Inbound; - } - break; - case 48: - sTradeData->unk_91 = CreateSprite(&gUnknown_826CF30, 120, 80, 0); - sTradeData->state = 50; - break; - case 50: - if (gSprites[sTradeData->unk_91].animEnded) - { - DestroySprite(&gSprites[sTradeData->unk_91]); - SetTradeSequenceBgGpuRegs(6); - sTradeData->state++; - PlaySE(SE_W028); - } - break; - case 51: - if (sTradeData->unk_EA < 0x400) - { - sTradeData->unk_EA += 0x34; - } - else - { - sTradeData->unk_EA = 0x400; - sTradeData->state++; - } - sTradeData->sXY = 0x8000 / sTradeData->unk_EA; - break; - case 52: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); - sTradeData->state = 60; - break; - - case 60: - if (!gPaletteFade.active) - { - SetTradeSequenceBgGpuRegs(5); - SetTradeSequenceBgGpuRegs(7); - gPaletteFade.bufferTransferDisabled = TRUE; - sTradeData->state++; - } - break; - case 61: - gPaletteFade.bufferTransferDisabled = FALSE; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); - sTradeData->state++; - break; - case 62: - SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | - DISPCNT_OBJ_1D_MAP | - DISPCNT_BG2_ON | - DISPCNT_OBJ_ON); - if (!gPaletteFade.active) - { - sTradeData->state++; - } - break; - case 63: - sTradeData->unk_D3 = CreateSprite(&sTradePokeballSpriteTemplate, 120, -8, 0); - gSprites[sTradeData->unk_D3].data[3] = 74; - gSprites[sTradeData->unk_D3].callback = SpriteCB_TradePokeball_Inbound; - StartSpriteAnim(&gSprites[sTradeData->unk_D3], 1); - StartSpriteAffineAnim(&gSprites[sTradeData->unk_D3], 2); - BlendPalettes(1 << (16 + gSprites[sTradeData->unk_D3].oam.paletteNum), 16, RGB_WHITEALPHA); - sTradeData->state++; - sTradeData->timer = 0; - break; - case 64: - BeginNormalPaletteFade(1 << (16 + gSprites[sTradeData->unk_D3].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA); - sTradeData->state++; - break; - case 65: - if (gSprites[sTradeData->unk_D3].callback == SpriteCallbackDummy) - { - HandleLoadSpecialPokePic(&gMonFrontPicTable[sTradeData->tradeSpecies[1]], gMonSpritesGfxPtr->sprites[3], sTradeData->tradeSpecies[1], sTradeData->monPersonalities[1]); - sTradeData->state++; - } - break; - case 66: - gSprites[sTradeData->pokePicSpriteIdxs[1]].pos1.x = 120; - gSprites[sTradeData->pokePicSpriteIdxs[1]].pos1.y = gMonFrontPicCoords[sTradeData->tradeSpecies[1]].y_offset + 60; - gSprites[sTradeData->pokePicSpriteIdxs[1]].pos2.x = 0; - gSprites[sTradeData->pokePicSpriteIdxs[1]].pos2.y = 0; - StartSpriteAnim(&gSprites[sTradeData->pokePicSpriteIdxs[1]], 0); - CreatePokeballSpriteToReleaseMon(sTradeData->pokePicSpriteIdxs[1], gSprites[sTradeData->pokePicSpriteIdxs[1]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF); - FreeSpriteOamMatrix(&gSprites[sTradeData->unk_D3]); - DestroySprite(&gSprites[sTradeData->unk_D3]); - sTradeData->state++; - break; - case 67: - SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | - DISPCNT_OBJ_1D_MAP | - DISPCNT_BG0_ON | - DISPCNT_BG2_ON | - DISPCNT_OBJ_ON); - StringExpandPlaceholders(gStringVar4, gText_XSentOverY); - DrawTextOnTradeWindow(0, gStringVar4, 0); - sTradeData->state = 167; - sTradeData->timer = 0; - break; - // 167 and 267 are extra cases added in for animations - case 167: - if (++sTradeData->timer > 60) - { - if (sTradeData->tradeSpecies[1] != SPECIES_EGG) - { - PlayCry1(sTradeData->tradeSpecies[1], 0); - } - sTradeData->state = 267; - sTradeData->timer = 0; - } - break; - case 267: - if (IsCryFinished()) - { - sTradeData->state = 68; - } - break; - case 68: - if (++sTradeData->timer == 10) - { - PlayFanfare(MUS_FANFA5); - } - if (sTradeData->timer == 250) - { - sTradeData->state++; - StringExpandPlaceholders(gStringVar4, gText_TakeGoodCareOfX); - DrawTextOnTradeWindow(0, gStringVar4, 0); - sTradeData->timer = 0; - } - break; - case 69: - if (++sTradeData->timer == 60) - { - sTradeData->state++; - } - break; - case 70: - CheckPartnersMonForRibbons(); - sTradeData->state++; - break; - case 71: - if (sTradeData->isLinkTrade) - { - return TRUE; - } - else if (JOY_NEW(A_BUTTON)) - { - sTradeData->state++; - } - break; - case 72: // Only if in-game trade - TradeMons(gSpecialVar_0x8005, 0); - gCB2_AfterEvolution = CB2_RunTradeAnim_InGameTrade; - evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[0]], TRUE, ITEM_NONE); - if (evoTarget != SPECIES_NONE) - { - TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[0]], evoTarget, sTradeData->pokePicSpriteIdxs[1], gSelectedTradeMonPositions[0]); - } - sTradeData->state++; - break; - case 73: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); - sTradeData->state++; - break; - case 74: - if (!gPaletteFade.active) - { - PlayNewMapMusic(sTradeData->cachedMapMusic); - if (sTradeData) - { - FreeAllWindowBuffers(); - Free(GetBgTilemapBuffer(3)); - Free(GetBgTilemapBuffer(1)); - Free(GetBgTilemapBuffer(0)); - FreeMonSpritesGfx(); - FREE_AND_SET_NULL(sTradeData); - } - SetMainCallback2(CB2_ReturnToField); - BufferInGameTradeMonName(); - HelpSystem_Enable(); - } - break; - } - return FALSE; -} - -bool8 sub_805232C(void) -{ - u16 evoTarget; - - switch (sTradeData->state) - { - case 0: - gSprites[sTradeData->pokePicSpriteIdxs[0]].invisible = FALSE; - gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.x = -180; - gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y = gMonFrontPicCoords[sTradeData->tradeSpecies[0]].y_offset; - sTradeData->state++; - sTradeData->cachedMapMusic = GetCurrentMapMusic(); - PlayNewMapMusic(MUS_SHINKA); - break; - case 1: - if (sTradeData->bg2hofs > 0) - { - gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.x += 3; - sTradeData->bg2hofs -= 3; - } - else - { - gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.x = 0; - sTradeData->bg2hofs = 0; - sTradeData->state = 10; - } - break; - case 10: - StringExpandPlaceholders(gStringVar4, gText_XWillBeSentToY); - DrawTextOnTradeWindow(0, gStringVar4, 0); - - if (sTradeData->tradeSpecies[0] != SPECIES_EGG) - { - PlayCry1(sTradeData->tradeSpecies[0], 0); - } - - sTradeData->state = 11; - sTradeData->timer = 0; - break; - case 11: - if (++sTradeData->timer == 80) - { - sTradeData->pokeballSpriteId = CreateTradePokeballSprite(sTradeData->pokePicSpriteIdxs[0], gSprites[sTradeData->pokePicSpriteIdxs[0]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff); - sTradeData->state++; - StringExpandPlaceholders(gStringVar4, gText_ByeByeVar1); - DrawTextOnTradeWindow(0, gStringVar4, 0); - } - break; - case 12: - if (gSprites[sTradeData->pokeballSpriteId].callback == SpriteCallbackDummy) - { - sTradeData->unk_D3 = CreateSprite(&sTradePokeballSpriteTemplate, 120, 32, 0); - gSprites[sTradeData->unk_D3].callback = SpriteCB_TradePokeball_Outbound; - DestroySprite(&gSprites[sTradeData->pokeballSpriteId]); - sTradeData->state++; - } - break; - case 13: - // The game waits here for the sprite to finish its animation sequence. - break; - case 14: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); - sTradeData->state = 20; - break; - case 20: - if (!gPaletteFade.active) - { - SetTradeSequenceBgGpuRegs(4); - FillWindowPixelBuffer(0, PIXEL_FILL(15)); - CopyWindowToVram(0, 3); - sTradeData->state++; - } - break; - case 21: - BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); - sTradeData->state++; - break; - case 22: - if (!gPaletteFade.active) - { - sTradeData->state = 23; - } - break; - case 23: - if (sTradeData->unk_EA > 0x100) - { - sTradeData->unk_EA -= 0x34; - } - else - { - SetTradeSequenceBgGpuRegs(1); - sTradeData->unk_EA = 0x80; - sTradeData->state = 124; - sTradeData->timer = 0; - } - sTradeData->sXY = 0x8000 / sTradeData->unk_EA; - break; - case 124: - if (++sTradeData->timer > 20) - { - SetTradeSequenceBgGpuRegs(3); - sTradeData->unk_91 = CreateSprite(&gUnknown_826CF48, 120, 80, 0); - sTradeData->state++; - } - break; - case 125: - if (gSprites[sTradeData->unk_91].animEnded) - { - DestroySprite(&gSprites[sTradeData->unk_91]); - SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | - BLDCNT_TGT1_OBJ | - BLDCNT_EFFECT_BLEND | - BLDCNT_TGT2_BG2); - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 4)); - CreateTask(Task_AnimateWirelessSignal, 5); - sTradeData->state++; - } - break; - case 126: - if (!FuncIsActiveTask(Task_AnimateWirelessSignal)) - { - sTradeData->state = 26; - } - break; - case 26: - if (--sTradeData->bg1vofs == 316) - { - sTradeData->state++; - } - break; - case 27: - sTradeData->unk_90 = CreateSprite(&gUnknown_826CE44, 120, 80, 3); - gSprites[sTradeData->unk_90].callback = SpriteCB_TradeGlowWireless; - sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 120, 80, 0); - StartSpriteAnim(&gSprites[sTradeData->unk_91], 1); - sTradeData->state++; - break; - case 28: - if ((sTradeData->bg1vofs -= 3) == 166) - { - sTradeData->state = 200; - } - SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | - DISPCNT_OBJ_1D_MAP | - DISPCNT_BG1_ON | - DISPCNT_OBJ_ON); - break; - case 200: - gSprites[sTradeData->unk_90].pos1.y -= 2; - gSprites[sTradeData->unk_91].pos1.y -= 2; - if (gSprites[sTradeData->unk_90].pos1.y < -8) - { - sTradeData->state = 29; - } - break; - case 29: - BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); - sTradeData->state = 30; - break; - case 30: - if (!gPaletteFade.active) - { - DestroySprite(&gSprites[sTradeData->unk_90]); - DestroySprite(&gSprites[sTradeData->unk_91]); - SetTradeSequenceBgGpuRegs(2); - sTradeData->state++; - } - break; - case 31: - BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); - sTradeData->unk_90 = CreateSprite(&sGlowBallSpriteTemplate, 111, 170, 0); - sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 129, -10, 0); - sTradeData->state++; - break; - case 32: - if (!gPaletteFade.active) - { - PlaySE(SE_TK_WARPOUT); - sTradeData->state++; - } - gSprites[sTradeData->unk_90].pos2.y -= 3; - gSprites[sTradeData->unk_91].pos2.y += 3; - break; - case 33: - gSprites[sTradeData->unk_90].pos2.y -= 3; - gSprites[sTradeData->unk_91].pos2.y += 3; - if (gSprites[sTradeData->unk_90].pos2.y <= -90) - { - gSprites[sTradeData->unk_90].data[1] = 1; - gSprites[sTradeData->unk_91].data[1] = 1; - sTradeData->state++; - CreateTask(c3_0805465C, 5); - } - break; - case 34: - BlendPalettes(0x8, 16, RGB_WHITEALPHA); - sTradeData->state++; - break; - case 35: - BlendPalettes(0x8, 16, RGB_WHITEALPHA); - sTradeData->state++; - break; - case 36: - BlendPalettes(0x8, 16, RGB_WHITEALPHA); - sTradeData->state++; - break; - case 37: - if (!IsPokeSpriteNotFlipped(sTradeData->tradeSpecies[0])) - { - gSprites[sTradeData->pokePicSpriteIdxs[0]].affineAnims = gUnknown_826CF88; - gSprites[sTradeData->pokePicSpriteIdxs[0]].oam.affineMode = 3; - CalcCenterToCornerVec(&gSprites[sTradeData->pokePicSpriteIdxs[0]], 0, 3, 3); - StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[0]], 0); - } - else - { - StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[0]], 0); - } - StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[1]], 0); - gSprites[sTradeData->pokePicSpriteIdxs[0]].pos1.x = 40; - gSprites[sTradeData->pokePicSpriteIdxs[1]].pos1.x = 200; - gSprites[sTradeData->pokePicSpriteIdxs[0]].pos1.y = 192; - gSprites[sTradeData->pokePicSpriteIdxs[1]].pos1.y = -32; - gSprites[sTradeData->pokePicSpriteIdxs[0]].invisible = FALSE; - gSprites[sTradeData->pokePicSpriteIdxs[1]].invisible = FALSE; - sTradeData->state++; - break; - case 38: - gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y -= 3; - gSprites[sTradeData->pokePicSpriteIdxs[1]].pos2.y += 3; - if (gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y < -160 && gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y >= -163) - { - PlaySE(SE_TK_WARPIN); - } - if (gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y < -222) - { - gSprites[sTradeData->unk_90].data[1] = 0; - gSprites[sTradeData->unk_91].data[1] = 0; - sTradeData->state++; - gSprites[sTradeData->pokePicSpriteIdxs[0]].invisible = TRUE; - gSprites[sTradeData->pokePicSpriteIdxs[1]].invisible = TRUE; - CreateTask(sub_8054734, 5); - } - break; - case 39: - gSprites[sTradeData->unk_90].pos2.y -= 3; - gSprites[sTradeData->unk_91].pos2.y += 3; - if (gSprites[sTradeData->unk_90].pos2.y <= -222) - { - BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); - sTradeData->state++; - DestroySprite(&gSprites[sTradeData->unk_90]); - DestroySprite(&gSprites[sTradeData->unk_91]); - } - break; - case 40: - if (!gPaletteFade.active) - { - sTradeData->state++; - SetTradeSequenceBgGpuRegs(1); - sTradeData->bg1vofs = 166; - SetTradeSequenceBgGpuRegs(3); - sTradeData->bg2vofs = 412; - sTradeData->unk_90 = CreateSprite(&gUnknown_826CE44, 120, -20, 3); - gSprites[sTradeData->unk_90].callback = SpriteCB_TradeGlowWireless; - sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 120, -20, 0); - StartSpriteAnim(&gSprites[sTradeData->unk_91], 1); - } - break; - case 41: - BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); - sTradeData->state++; - break; - case 42: - SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | - DISPCNT_OBJ_1D_MAP | - DISPCNT_BG1_ON | - DISPCNT_OBJ_ON); - if (!gPaletteFade.active) - { - sTradeData->state++; - } - break; - case 43: - gSprites[sTradeData->unk_90].pos2.y += 4; - gSprites[sTradeData->unk_91].pos2.y += 4; - if (gSprites[sTradeData->unk_90].pos2.y + gSprites[sTradeData->unk_90].pos1.y == 64) - { - sTradeData->state = 144; - sTradeData->timer = 0; - } - break; - case 144: - SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | - DISPCNT_OBJ_1D_MAP | - DISPCNT_BG1_ON | - DISPCNT_BG2_ON | - DISPCNT_OBJ_ON); - sTradeData->bg1vofs += 3; - sTradeData->bg2vofs += 3; - if (++sTradeData->timer == 10) - { - u8 taskId = CreateTask(Task_AnimateWirelessSignal, 5); - gTasks[taskId].data[2] = TRUE; - } - if (sTradeData->bg1vofs > 316) - { - sTradeData->bg1vofs = 316; - sTradeData->state++; - } - break; - case 145: - DestroySprite(&gSprites[sTradeData->unk_90]); - DestroySprite(&gSprites[sTradeData->unk_91]); - sTradeData->state++; - sTradeData->timer = 0; - break; - case 146: - if (!FuncIsActiveTask(Task_AnimateWirelessSignal)) - { - sTradeData->state = 46; - sTradeData->timer = 0; - } - break; - case 46: - if (++sTradeData->timer == 10) - { - sTradeData->state++; - } - break; - case 47: - if (++sTradeData->bg1vofs > 348) - { - sTradeData->bg1vofs = 348; - sTradeData->state++; - } - break; - case 48: - sTradeData->unk_91 = CreateSprite(&gUnknown_826CF30, 120, 80, 0); - sTradeData->state = 50; - break; - case 50: - if (gSprites[sTradeData->unk_91].animEnded) - { - DestroySprite(&gSprites[sTradeData->unk_91]); - SetTradeSequenceBgGpuRegs(6); - sTradeData->state++; - PlaySE(SE_W028); - } - break; - case 51: - if (sTradeData->unk_EA < 0x400) - { - sTradeData->unk_EA += 0x34; - } - else - { - sTradeData->unk_EA = 0x400; - sTradeData->state++; - } - sTradeData->sXY = 0x8000 / sTradeData->unk_EA; - break; - case 52: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); - sTradeData->state = 60; - break; - - case 60: - if (!gPaletteFade.active) - { - SetTradeSequenceBgGpuRegs(5); - SetTradeSequenceBgGpuRegs(7); - gPaletteFade.bufferTransferDisabled = TRUE; - sTradeData->state++; - } - break; - case 61: - gPaletteFade.bufferTransferDisabled = FALSE; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); - sTradeData->state++; - break; - case 62: - SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | - DISPCNT_OBJ_1D_MAP | - DISPCNT_BG2_ON | - DISPCNT_OBJ_ON); - if (!gPaletteFade.active) - { - sTradeData->state++; - } - break; - case 63: - sTradeData->unk_D3 = CreateSprite(&sTradePokeballSpriteTemplate, 120, -8, 0); - gSprites[sTradeData->unk_D3].data[3] = 74; - gSprites[sTradeData->unk_D3].callback = SpriteCB_TradePokeball_Inbound; - StartSpriteAnim(&gSprites[sTradeData->unk_D3], 1); - StartSpriteAffineAnim(&gSprites[sTradeData->unk_D3], 2); - BlendPalettes(1 << (16 + gSprites[sTradeData->unk_D3].oam.paletteNum), 16, RGB_WHITEALPHA); - sTradeData->state++; - sTradeData->timer = 0; - break; - case 64: - BeginNormalPaletteFade(1 << (16 + gSprites[sTradeData->unk_D3].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA); - sTradeData->state++; - break; - case 65: - if (gSprites[sTradeData->unk_D3].callback == SpriteCallbackDummy) - { - HandleLoadSpecialPokePic(&gMonFrontPicTable[sTradeData->tradeSpecies[1]], gMonSpritesGfxPtr->sprites[3], sTradeData->tradeSpecies[1], sTradeData->monPersonalities[1]); - sTradeData->state++; - } - break; - case 66: - gSprites[sTradeData->pokePicSpriteIdxs[1]].pos1.x = 120; - gSprites[sTradeData->pokePicSpriteIdxs[1]].pos1.y = gMonFrontPicCoords[sTradeData->tradeSpecies[1]].y_offset + 60; - gSprites[sTradeData->pokePicSpriteIdxs[1]].pos2.x = 0; - gSprites[sTradeData->pokePicSpriteIdxs[1]].pos2.y = 0; - StartSpriteAnim(&gSprites[sTradeData->pokePicSpriteIdxs[1]], 0); - CreatePokeballSpriteToReleaseMon(sTradeData->pokePicSpriteIdxs[1], gSprites[sTradeData->pokePicSpriteIdxs[1]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF); - FreeSpriteOamMatrix(&gSprites[sTradeData->unk_D3]); - DestroySprite(&gSprites[sTradeData->unk_D3]); - sTradeData->state++; - break; - case 67: - SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | - DISPCNT_OBJ_1D_MAP | - DISPCNT_BG0_ON | - DISPCNT_BG2_ON | - DISPCNT_OBJ_ON); - StringExpandPlaceholders(gStringVar4, gText_XSentOverY); - DrawTextOnTradeWindow(0, gStringVar4, 0); - sTradeData->state = 167; - sTradeData->timer = 0; - break; - // 167 and 267 are extra cases added in for animations - case 167: - if (++sTradeData->timer > 60) - { - if (sTradeData->tradeSpecies[1] != SPECIES_EGG) - { - PlayCry1(sTradeData->tradeSpecies[1], 0); - } - sTradeData->state = 267; - sTradeData->timer = 0; - } - break; - case 267: - if (IsCryFinished()) - { - sTradeData->state = 68; - } - break; - case 68: - if (++sTradeData->timer == 10) - { - PlayFanfare(MUS_FANFA5); - } - if (sTradeData->timer == 250) - { - sTradeData->state++; - StringExpandPlaceholders(gStringVar4, gText_TakeGoodCareOfX); - DrawTextOnTradeWindow(0, gStringVar4, 0); - sTradeData->timer = 0; - } - break; - case 69: - if (++sTradeData->timer == 60) - { - sTradeData->state++; - } - break; - case 70: - CheckPartnersMonForRibbons(); - sTradeData->state++; - break; - case 71: - if (sTradeData->isLinkTrade) - { - return TRUE; - } - else if (JOY_NEW(A_BUTTON)) - { - sTradeData->state++; - } - break; - case 72: // Only if in-game trade - TradeMons(gSpecialVar_0x8005, 0); - gCB2_AfterEvolution = CB2_RunTradeAnim_InGameTrade; - evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[0]], TRUE, ITEM_NONE); - if (evoTarget != SPECIES_NONE) - { - TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[0]], evoTarget, sTradeData->pokePicSpriteIdxs[1], gSelectedTradeMonPositions[0]); - } - sTradeData->state++; - break; - case 73: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); - sTradeData->state++; - break; - case 74: - if (!gPaletteFade.active) - { - PlayNewMapMusic(sTradeData->cachedMapMusic); - if (sTradeData) - { - FreeAllWindowBuffers(); - Free(GetBgTilemapBuffer(3)); - Free(GetBgTilemapBuffer(1)); - Free(GetBgTilemapBuffer(0)); - FreeMonSpritesGfx(); - FREE_AND_SET_NULL(sTradeData); - } - SetMainCallback2(CB2_ReturnToField); - BufferInGameTradeMonName(); - HelpSystem_Enable(); - } - break; - } - 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(); -} - -void sub_8053E8C(void) -{ - switch (gMain.state) - { - case 0: - gMain.state++; - StringExpandPlaceholders(gStringVar4, gUnknown_841E325); - DrawTextOnTradeWindow(0, gStringVar4, 0); - break; - case 1: - sub_800AB9C(); - gMain.state = 100; - sTradeData->timer = 0; - break; - case 100: - if (++sTradeData->timer > 180) - { - gMain.state = 101; - sTradeData->timer = 0; - } - if (IsLinkTaskFinished()) - { - gMain.state = 2; - } - break; - case 101: - if (IsLinkTaskFinished()) - { - gMain.state = 2; - } - break; - case 2: - gMain.state = 50; - StringExpandPlaceholders(gStringVar4, gText_SavingDontTurnOffThePower2); - DrawTextOnTradeWindow(0, gStringVar4, 0); - break; - case 50: - if (InUnionRoom()) - { - sub_8113550(18, sTradeData->monSpecies); - } - else - { - sub_8113550(12, sTradeData->monSpecies); - IncrementGameStat(GAME_STAT_POKEMON_TRADES); - } - if (gWirelessCommType) - { - sub_8144714(2, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId); - } - SetContinueGameWarpStatusToDynamicWarp(); - sub_80DA3AC(); - gMain.state++; - sTradeData->timer = 0; - break; - case 51: - if (++sTradeData->timer == 5) - { - gMain.state++; - } - break; - case 52: - if (sub_80DA3D8()) - { - ClearContinueGameWarpStatus2(); - gMain.state = 4; - } - else - { - sTradeData->timer = 0; - gMain.state = 51; - } - break; - case 4: - sub_80DA40C(); - gMain.state = 40; - sTradeData->timer = 0; - break; - case 40: - if (++sTradeData->timer > 50) - { - if (GetMultiplayerId() == 0) - { - sTradeData->timer = Random() % 30; - } - else - { - sTradeData->timer = 0; - } - gMain.state = 41; - } - break; - case 41: - if (sTradeData->timer == 0) - { - sub_800AB9C(); - gMain.state = 42; - } - else - { - sTradeData->timer--; - } - break; - case 42: - if (IsLinkTaskFinished()) - { - sub_80DA434(); - gMain.state = 5; - } - break; - case 5: - if (++sTradeData->timer > 60) - { - gMain.state++; - sub_800AB9C(); - } - break; - case 6: - if (IsLinkTaskFinished()) - { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); - gMain.state ++; - } - break; - case 7: - if (!gPaletteFade.active) - { - FadeOutBGM(3); - gMain.state++; - } - break; - case 8: - if (IsBGMStopped() == TRUE) - { - if (gWirelessCommType && gMain.savedCallback == sub_804C718) - { - sub_800AB9C(); - } - else - { - sub_800AAC0(); - } - gMain.state++; - } - break; - case 9: - if (gWirelessCommType && gMain.savedCallback == sub_804C718) - { - if (IsLinkRfuTaskFinished()) - { - gSoftResetDisabled = FALSE; - SetMainCallback2(sub_80543C4); - } - } - else if (!gReceivedRemoteLinkPlayers) - { - gSoftResetDisabled = FALSE; - SetMainCallback2(sub_80543C4); - } - break; - } - if (!HasLinkErrorOccurred()) - { - RunTasks(); - } - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -void sub_80543C4(void) -{ - if (!gPaletteFade.active) - { - FreeAllWindowBuffers(); - Free(GetBgTilemapBuffer(3)); - Free(GetBgTilemapBuffer(1)); - Free(GetBgTilemapBuffer(0)); - FreeMonSpritesGfx(); - FREE_AND_SET_NULL(sTradeData); - if (gWirelessCommType != 0) - DestroyWirelessStatusIndicatorSprite(); - SetMainCallback2(gMain.savedCallback); - } - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -void DoInGameTradeScene(void) -{ - ScriptContext2_Enable(); - CreateTask(sub_8054470, 10); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); - HelpSystem_Disable(); -} - -void sub_8054470(u8 taskId) -{ - if (!gPaletteFade.active) - { - SetMainCallback2(CB2_InitTradeAnim_InGameTrade); - gFieldCallback = FieldCallback_ReturnToEventScript2; - DestroyTask(taskId); - } -} - -void CheckPartnersMonForRibbons(void) -{ - u8 nRibbons = 0; - u8 i; - for (i = 0; i < 12; i++) - { - nRibbons += GetMonData(&gEnemyParty[gSelectedTradeMonPositions[1] % 6], MON_DATA_CHAMPION_RIBBON + i); - } - if (nRibbons != 0) - FlagSet(FLAG_SYS_RIBBON_GET); -} - -void sub_80544FC(void) -{ - TradeAnimInit_LoadGfx(); -} - -void DrawTextOnTradeWindow(u8 windowId, const u8 *str, s8 speed) -{ - FillWindowPixelBuffer(windowId, PIXEL_FILL(15)); - sTradeData->textColor[0] = 15; - sTradeData->textColor[1] = 1; - sTradeData->textColor[2] = 6; - AddTextPrinterParameterized4(windowId, 2, 0, 2, 0, 2, sTradeData->textColor, speed, str); - CopyWindowToVram(windowId, 3); -} - -void Task_AnimateWirelessSignal(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - u16 r2 = 16 * gUnknown_826D250[data[0]][0]; - if (data[2] == 0) - { - if (r2 == 0x100) - LoadPalette(gUnknown_826BF5C, 0x30, 0x20); - else - LoadPalette(&gUnknown_826BB5C[r2], 0x30, 0x20); - } - else - { - if (r2 == 0x100) - LoadPalette(gUnknown_826BF5C, 0x30, 0x20); - else - LoadPalette(&gUnknown_826BD5C[r2], 0x30, 0x20); - } - if (gUnknown_826D250[data[0]][0] == 0 && data[1] == 0) - PlaySE(SE_W215); - if (data[1] == gUnknown_826D250[data[0]][1]) - { - data[0]++; - data[1] = 0; - if (gUnknown_826D250[data[0]][1] == 0xFF) - DestroyTask(taskId); - } - else - data[1]++; -} - -void c3_0805465C(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - if (data[0] == 0) - { - sTradeData->win0left = sTradeData->win0right = 120; - sTradeData->win0top = 0; - sTradeData->win0bottom = 160; - SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_OBJ); - SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 | - WININ_WIN0_BG1 | - WININ_WIN0_OBJ); - } - - SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE2(sTradeData->win0left, sTradeData->win0right)); - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE2(sTradeData->win0top, sTradeData->win0bottom)); - - data[0]++; - sTradeData->win0left -= 5; - sTradeData->win0right += 5; - - if (sTradeData->win0left < 80) - { - DestroyTask(taskId); - } -} - -void sub_8054734(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - if (data[0] == 0) - { - sTradeData->win0left = 80; - sTradeData->win0right = 160; - SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_OBJ); - SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 | - WININ_WIN0_BG1 | - WININ_WIN0_OBJ); - } - - SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE2(sTradeData->win0left, sTradeData->win0right)); - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE2(sTradeData->win0top, sTradeData->win0bottom)); - - if (sTradeData->win0left != 120) - { - data[0]++; - sTradeData->win0left += 5; - sTradeData->win0right -= 5; - - if (sTradeData->win0left >= 116) - BlendPalettes(0x8, 0, RGB_WHITEALPHA); - } - else - { - ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - DestroyTask(taskId); - } -} diff --git a/src/trade_scene.c b/src/trade_scene.c new file mode 100644 index 000000000..ebb788e3d --- /dev/null +++ b/src/trade_scene.c @@ -0,0 +1,2444 @@ +#include "global.h" +#include "task.h" +#include "malloc.h" +#include "bg.h" +#include "gpu_regs.h" +#include "util.h" +#include "window.h" +#include "sound.h" +#include "decompress.h" +#include "palette.h" +#include "trade.h" +#include "link.h" +#include "librfu.h" +#include "link_rfu.h" +#include "text.h" +#include "mevent.h" +#include "graphics.h" +#include "strings.h" +#include "menu.h" +#include "data.h" +#include "battle.h" +#include "script.h" +#include "event_data.h" +#include "string_util.h" +#include "mail_data.h" +#include "pokeball.h" +#include "evolution_scene.h" +#include "overworld.h" +#include "field_fadetransition.h" +#include "quest_log.h" +#include "help_system.h" +#include "new_menu_helpers.h" +#include "battle_interface.h" +#include "pokedex.h" +#include "save.h" +#include "load_save.h" +#include "random.h" +#include "constants/species.h" +#include "constants/items.h" +#include "constants/easy_chat.h" +#include "constants/songs.h" +#include "constants/region_map.h" +#include "constants/moves.h" + +struct InGameTrade { + /*0x00*/ u8 nickname[POKEMON_NAME_LENGTH + 1]; + /*0x0C*/ u16 species; + /*0x0E*/ u8 ivs[NUM_STATS]; + /*0x14*/ u8 abilityNum; + /*0x18*/ u32 otId; + /*0x1C*/ u8 conditions[5]; + /*0x24*/ u32 personality; + /*0x28*/ u16 heldItem; + /*0x2A*/ u8 mailNum; + /*0x2B*/ u8 otName[11]; + /*0x36*/ u8 otGender; + /*0x37*/ u8 sheen; + /*0x38*/ u16 requestedSpecies; +}; + +struct TradeAnimationResources { + /*0x00*/ struct Pokemon mon; + /*0x64*/ u32 timer; + /*0x68*/ u32 monPersonalities[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 pokeballSpriteId; + /*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 sXY; + /*0xEA*/ u16 unk_EA; + /*0xEC*/ u16 unk_EC; + /*0xEE*/ bool8 isLinkTrade; + /*0xF0*/ u16 tradeSpecies[2]; + /*0xF4*/ u16 cachedMapMusic; + /*0xF6*/ u8 unk_F6; + /*0xF8*/ u16 monSpecies[2]; + /*0xFC*/ u8 unk_FC[7]; + /*0x103*/ u8 filler_103[1]; + /*0x104*/ u8 textColor[3]; + /*0x107*/ u8 filler_107[1]; + /*0x108*/ u8 isCableTrade; + /*0x109*/ u8 win0left; + /*0x10A*/ u8 win0top; + /*0x10B*/ u8 win0right; + /*0x10C*/ u8 win0bottom; +}; + +EWRAM_DATA struct TradeAnimationResources * sTradeData = NULL; + +void CB2_InitTradeAnim_LinkTrade(void); +void sub_805049C(void); +void sub_80504B0(void); +void TradeAnimInit_LoadGfx(void); +void CB2_RunTradeAnim_InGameTrade(void); +void SetTradeSequenceBgGpuRegs(u8 idx); +void sub_8050DE0(void); +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 sub_80543C4(void); +void sub_8054470(u8 taskId); +void CheckPartnersMonForRibbons(void); +void DrawTextOnTradeWindow(u8 windowId, const u8 *str, s8 speed); +void Task_AnimateWirelessSignal(u8 taskId); +void c3_0805465C(u8 taskId); +void sub_8054734(u8 taskId); + +extern const u8 gUnknown_8261EC7[]; +extern const u8 *const sTradeErrorOrStatusMessagePtrs[]; +extern const u16 gTradeGlow2PaletteAnimTable[]; +extern const struct SpriteSheet gUnknown_826CDD4; +extern const struct SpritePalette gUnknown_826CDDC; +extern const struct BgTemplate gUnknown_826D1D4[4]; +extern const struct WindowTemplate gUnknown_826D1BC[]; +extern const u16 gUnknown_826AA5C[]; +extern const u16 gUnknown_8269A5C[]; +extern const u32 gUnknown_3379A0Bin[]; +extern const u16 gUnknown_826407C[]; +extern const u16 gUnknown_826BB5C[]; +extern const u16 gUnknown_826BD5C[]; +extern const u16 gUnknown_826BF5C[]; +extern const u16 gUnknown_826701C[]; +extern const u16 gUnknown_826985C[]; +extern const u16 gUnknown_826995C[]; +extern const u32 gWirelessSignal4bpp[]; +extern const u32 gUnknown_826C60C[]; +extern const struct SpriteSheet gUnknown_826CE2C; +extern const struct SpriteSheet gUnknown_826CE7C; +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 SpriteTemplate sTradePokeballSpriteTemplate; +extern const struct SpriteTemplate gUnknown_826CF30; +extern const struct SpriteTemplate sGameLinkCableEndSpriteTemplate; +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]; +extern const u8 gUnknown_826D250[][2]; + +// Sprite callback for link cable trade glow +void SpriteCB_TradeGlowCable(struct Sprite * sprite) +{ + sprite->data[0]++; + if (sprite->data[0] == 10) + { + PlaySE(SE_BOWA); + sprite->data[0] = 0; + } +} + +// Sprite callback for wireless trade glow +void SpriteCB_TradeGlowWireless(struct Sprite * sprite) +{ + if (!sprite->invisible) + { + sprite->data[0]++; + if (sprite->data[0] == 10) + { + PlaySE(SE_W207B); + sprite->data[0] = 0; + } + } +} + +// Palette flash for trade glow core +void SpriteCB_TradeGlowCore(struct Sprite * sprite) +{ + if (sprite->data[1] == 0) + { + sprite->data[0]++; + if (sprite->data[0] == 12) + sprite->data[0] = 0; + LoadPalette(&gTradeGlow2PaletteAnimTable[sprite->data[0]], 16 * (sprite->oam.paletteNum + 16) + 4, 2); + } +} + +void SpriteCB_GameLinkCableEnd_Outbound(struct Sprite * sprite) +{ + sprite->data[0]++; + sprite->pos2.y++; + if (sprite->data[0] == 10) + DestroySprite(sprite); +} + +void SpriteCB_GameLinkCableEnd_Inbound(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; + } +} + +void SetTradeBGAffine(void) +{ + struct BgAffineDstData affine; + DoBgAffineSet(&affine, sTradeData->unk_D4 * 0x100, sTradeData->unk_D6 * 0x100, sTradeData->unk_DC, sTradeData->unk_DE, sTradeData->sXY, sTradeData->sXY, sTradeData->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); +} + +static void TradeAnim_UpdateBgRegs(void) +{ + u16 dispcnt; + + SetGpuReg(REG_OFFSET_BG1VOFS, sTradeData->bg1vofs); + SetGpuReg(REG_OFFSET_BG1HOFS, sTradeData->bg1hofs); + + dispcnt = GetGpuReg(REG_OFFSET_DISPCNT); + if ((dispcnt & 7) == DISPCNT_MODE_0) + { + SetGpuReg(REG_OFFSET_BG2VOFS, sTradeData->bg2vofs); + SetGpuReg(REG_OFFSET_BG2HOFS, sTradeData->bg2hofs); + } + else + { + SetTradeBGAffine(); + } +} + +static void VBlankCB_TradeAnim(void) +{ + TradeAnim_UpdateBgRegs(); + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void sub_804FF24(void) +{ + sTradeData->unk_8A = 0; + sTradeData->unk_88 = 0; + sTradeData->unk_89 = 0; +} + +void sub_804FF4C(void) +{ + if (sTradeData->unk_88 == sTradeData->unk_89) + sTradeData->unk_8A++; + else + sTradeData->unk_8A = 0; + + if (sTradeData->unk_8A > 300) + { + CloseLink(); + SetMainCallback2(CB2_LinkError); + sTradeData->unk_8A = 0; + sTradeData->unk_89 = 0; + sTradeData->unk_88 = 0; + } + + sTradeData->unk_89 = sTradeData->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[gSelectedTradeMonPositions[0]]; + pos = 1; + } + + if (whichParty == 1) + { + mon = &gEnemyParty[gSelectedTradeMonPositions[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)); + sTradeData->tradeSpecies[whichParty] = species; + sTradeData->monPersonalities[whichParty] = personality; + break; + case 1: + SetMultiuseSpriteTemplateToPokemon(GetMonSpritePalStruct(mon)->tag, pos); + sTradeData->pokePicSpriteIdxs[whichParty] = CreateSprite(&gMultiuseSpriteTemplate, 120, 60, 6); + gSprites[sTradeData->pokePicSpriteIdxs[whichParty]].invisible = TRUE; + gSprites[sTradeData->pokePicSpriteIdxs[whichParty]].callback = SpriteCallbackDummy; + break; + } +} + +void CB2_InitTradeAnim_LinkTrade(void) +{ + switch (gMain.state) + { + case 0: + if (!gReceivedRemoteLinkPlayers) + { + gLinkType = 0x1144; + CloseLink(); + } + sTradeData = AllocZeroed(sizeof(struct TradeAnimationResources)); + AllocateMonSpritesGfx(); + ResetTasks(); + ResetSpriteData(); + FreeAllSpritePalettes(); + SetVBlankCallback(VBlankCB_TradeAnim); + TradeAnimInit_LoadGfx(); + sub_804FF24(); + gMain.state++; + sTradeData->unk_8C = 0; + sTradeData->state = 0; + sTradeData->isLinkTrade = TRUE; + sTradeData->unk_D4 = 64; + sTradeData->unk_D6 = 64; + sTradeData->unk_D8 = 0; + sTradeData->unk_DA = 0; + sTradeData->unk_DC = 120; + sTradeData->unk_DE = 80; + sTradeData->sXY = 256; + sTradeData->unk_EC = 0; + break; + case 1: + if (!gReceivedRemoteLinkPlayers) + { + sTradeData->isCableTrade = TRUE; + OpenLink(); + gMain.state++; + sTradeData->timer = 0; + } + else + { + gMain.state = 4; + } + break; + case 2: + sTradeData->timer++; + if (sTradeData->timer > 60) + { + sTradeData->timer = 0; + gMain.state++; + } + break; + case 3: + if (IsLinkMaster()) + { + if (GetLinkPlayerCount_2() >= GetSavedPlayerCount()) + { + sTradeData->timer++; + if (sTradeData->timer > 30) + { + CheckShouldAdvanceLinkState(); + gMain.state++; + } + } + else + { + sub_804FF4C(); + } + } + else + { + gMain.state++; + } + break; + case 4: + sub_804FF4C(); + if (gReceivedRemoteLinkPlayers == 1 && IsLinkPlayerDataExchangeComplete() == 1) + { + gMain.state++; + } + break; + case 5: + sTradeData->unk_72 = 0; + sTradeData->unk_73 = 0; + sTradeData->unk_93 = 0; + sub_804FFE4(0, 0); + gMain.state++; + break; + case 6: + sub_804FFE4(0, 1); + gMain.state++; + break; + case 7: + sub_804FFE4(1, 0); + gMain.state++; + break; + case 8: + sub_804FFE4(1, 1); + sub_80504B0(); + gMain.state++; + break; + case 9: + sub_8050DE0(); + LoadSpriteSheet(&gUnknown_826CDD4); + LoadSpritePalette(&gUnknown_826CDDC); + gMain.state++; + break; + case 10: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + ShowBg(0); + sTradeData->monSpecies[0] = GetMonData(&gPlayerParty[gSelectedTradeMonPositions[0]], MON_DATA_SPECIES2); + sTradeData->monSpecies[1] = GetMonData(&gEnemyParty[gSelectedTradeMonPositions[1] % 6], MON_DATA_SPECIES2); + memcpy(sTradeData->unk_FC, gLinkPlayers[GetMultiplayerId() ^ 1].name, 7); + gMain.state++; + break; + case 11: + sub_805049C(); + sub_8050E24(); + gMain.state++; + break; + case 12: + if (!gPaletteFade.active) + { + if (gWirelessCommType != 0) + { + LoadWirelessStatusIndicatorSpriteGfx(); + CreateWirelessStatusIndicatorSprite(0, 0); + } + SetMainCallback2(CB2_RunTradeAnim_LinkTrade); + } + break; + } + RunTasks(); + RunTextPrinters(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void sub_805049C(void) +{ + SetTradeSequenceBgGpuRegs(5); + SetTradeSequenceBgGpuRegs(0); +} + +void sub_80504B0(void) +{ + FillWindowPixelBuffer(0, PIXEL_FILL(15)); + PutWindowTilemap(0); + CopyWindowToVram(0, 3); +} + +void TradeAnimInit_LoadGfx(void) +{ + SetGpuReg(REG_OFFSET_DISPCNT, 0); + ResetBgsAndClearDma3BusyFlags(FALSE); + InitBgsFromTemplates(0, gUnknown_826D1D4, NELEMS(gUnknown_826D1D4)); + ChangeBgX(0, 0, 0); + ChangeBgY(0, 0, 0); + SetBgTilemapBuffer(0, Alloc(BG_SCREEN_SIZE)); + SetBgTilemapBuffer(1, Alloc(BG_SCREEN_SIZE)); + SetBgTilemapBuffer(3, Alloc(BG_SCREEN_SIZE)); + DeactivateAllTextPrinters(); + // Doing the graphics load... + DecompressAndLoadBgGfxUsingHeap(0, gBattleTextboxTiles, 0, 0, 0); + LZDecompressWram(gFile_graphics_interface_menu_map_tilemap, gDecompressionBuffer); + CopyToBgTilemapBuffer(0, gDecompressionBuffer, BG_SCREEN_SIZE, 0); + LoadCompressedPalette(gBattleTextboxPalette, 0x000, 0x20); + InitWindows(gUnknown_826D1BC); + // ... and doing the same load again + DecompressAndLoadBgGfxUsingHeap(0, gBattleTextboxTiles, 0, 0, 0); + LZDecompressWram(gFile_graphics_interface_menu_map_tilemap, gDecompressionBuffer); + CopyToBgTilemapBuffer(0, gDecompressionBuffer, BG_SCREEN_SIZE, 0); + LoadCompressedPalette(gBattleTextboxPalette, 0x000, 0x20); +} + +void CB2_InitTradeAnim_InGameTrade(void) +{ + u8 otName[11]; + + switch (gMain.state) + { + case 0: + gSelectedTradeMonPositions[0] = gSpecialVar_0x8005; + gSelectedTradeMonPositions[1] = 6; + StringCopy(gLinkPlayers[0].name, gSaveBlock2Ptr->playerName); + GetMonData(&gEnemyParty[0], MON_DATA_OT_NAME, otName); + StringCopy(gLinkPlayers[1].name, otName); + sTradeData = AllocZeroed(sizeof(*sTradeData)); + AllocateMonSpritesGfx(); + ResetTasks(); + ResetSpriteData(); + FreeAllSpritePalettes(); + SetVBlankCallback(VBlankCB_TradeAnim); + TradeAnimInit_LoadGfx(); + sTradeData->isLinkTrade = FALSE; + sTradeData->unk_8C = 0; + sTradeData->state = 0; + sTradeData->unk_D4 = 64; + sTradeData->unk_D6 = 64; + sTradeData->unk_D8 = 0; + sTradeData->unk_DA = 0; + sTradeData->unk_DC = 120; + sTradeData->unk_DE = 80; + sTradeData->sXY = 256; + sTradeData->unk_EC = 0; + sTradeData->timer = 0; + gMain.state = 5; + break; + case 5: + sub_804FFE4(0, 0); + gMain.state++; + break; + case 6: + sub_804FFE4(0, 1); + gMain.state++; + break; + case 7: + sub_804FFE4(1, 0); + ShowBg(0); + gMain.state++; + break; + case 8: + sub_804FFE4(1, 1); + FillWindowPixelBuffer(0, PIXEL_FILL(15)); + PutWindowTilemap(0); + CopyWindowToVram(0, 3); + gMain.state++; + break; + case 9: + sub_8050DE0(); + LoadSpriteSheet(&gUnknown_826CDD4); + LoadSpritePalette(&gUnknown_826CDDC); + gMain.state++; + break; + case 10: + ShowBg(0); + gMain.state++; + break; + case 11: + SetTradeSequenceBgGpuRegs(5); + SetTradeSequenceBgGpuRegs(0); + sub_8050E24(); + gMain.state++; + break; + case 12: + SetMainCallback2(CB2_RunTradeAnim_InGameTrade); + break; + } + + RunTasks(); + RunTextPrinters(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void ReceivedMonSetPokedexFlags(u8 partyIdx) +{ + struct Pokemon *mon = &gPlayerParty[partyIdx]; + + if (!GetMonData(mon, MON_DATA_IS_EGG)) + { + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); + species = SpeciesToNationalPokedexNum(species); + GetSetPokedexFlag(species, FLAG_SET_SEEN); + HandleSetPokedexFlag(species, FLAG_SET_CAUGHT, personality); + } +} + +static void RS_TryEnableNationalPokedex(void) +{ + u8 mpId = GetMultiplayerId(); + // Originally in Ruby but commented out + /*if (gLinkPlayers[mpId ^ 1].lp_field_2 == 0x8000) + EnableNationalPokedex();*/ +} + +void TradeMons(u8 playerPartyIdx, u8 partnerPartyIdx) +{ + u8 friendship; + + // Get whether the offered Pokemon have mail + struct Pokemon *playerMon = &gPlayerParty[playerPartyIdx]; + u16 playerMail = GetMonData(playerMon, MON_DATA_MAIL); + + struct Pokemon *partnerMon = &gEnemyParty[partnerPartyIdx]; + u16 partnerMail = GetMonData(partnerMon, MON_DATA_MAIL); + + // The mail attached to the sent Pokemon no longer exists in your file. + if (playerMail != 0xFF) + ClearMailStruct(&gSaveBlock1Ptr->mail[playerMail]); + + // This is where the actual trade happens!! + sTradeData->mon = *playerMon; + *playerMon = *partnerMon; + *partnerMon = sTradeData->mon; + + // By default, a Pokemon received from a trade will have 70 Friendship. + friendship = 70; + if (!GetMonData(playerMon, MON_DATA_IS_EGG)) + SetMonData(playerMon, MON_DATA_FRIENDSHIP, &friendship); + + // Associate your partner's mail with the Pokemon they sent over. + if (partnerMail != 0xFF) + GiveMailToMon2(playerMon, &gLinkPartnerMail[partnerMail]); + + ReceivedMonSetPokedexFlags(playerPartyIdx); + if (gReceivedRemoteLinkPlayers) + RS_TryEnableNationalPokedex(); +} + +void sub_80508F4(void) +{ + switch (sTradeData->unk_93) + { + case 1: + if (IsLinkTaskFinished()) + { + SendBlock(bitmask_all_link_players_but_self(), sTradeData->linkData, 20); + sTradeData->unk_93++; + } + case 2: + sTradeData->unk_93 = 0; + break; + } +} + +void CB2_RunTradeAnim_InGameTrade(void) +{ + sub_8050F14(); + RunTasks(); + RunTextPrinters(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void SetTradeSequenceBgGpuRegs(u8 state) +{ + switch (state) + { + case 0: + sTradeData->bg2vofs = 0; + sTradeData->bg2hofs = 0xB4; + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); + SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT512x256); + LoadPalette(gTradeGba2_Pal, 0x10, 0x60); + DmaCopyLarge16(3, gTradeGba_Gfx, (void *)BG_CHAR_ADDR(1), 0x1420, 0x1000); + DmaCopy16Defvars(3, gUnknown_826601C, (void *)BG_SCREEN_ADDR(18), 0x1000); + break; + case 1: + sTradeData->bg1hofs = 0; + sTradeData->bg1vofs = 0x15C; + SetGpuReg(REG_OFFSET_BG1VOFS, 0x15C); + SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(5) | BGCNT_TXT256x512); + SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT256x512); + if (sTradeData->isCableTrade) + { + DmaCopy16Defvars(3, gUnknown_826AA5C, (void *)BG_SCREEN_ADDR(5), 0x1000); + } + else + { + DmaCopy16Defvars(3, gUnknown_8269A5C, (void *)BG_SCREEN_ADDR(5), 0x1000); + } + DmaCopyLarge16(3, gTradeGba_Gfx, (void *)BG_CHAR_ADDR(0), 0x1420, 0x1000); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); + break; + case 2: + sTradeData->bg1vofs = 0; + sTradeData->bg1hofs = 0; + if (sTradeData->isCableTrade == FALSE) + { + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); + LZ77UnCompVram(gUnknown_3379A0Bin, (void *)BG_SCREEN_ADDR(5)); + BlendPalettes(0x000000008, 0x10, RGB_BLACK); + } + else + { + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); + DmaCopy16Defvars(3, gUnknown_826407C, (void *)BG_SCREEN_ADDR(5), 0x800); + BlendPalettes(0x00000001, 0x10, RGB_BLACK); + } + break; + case 3: + LoadPalette(gUnknown_826BF5C, 0x30, 0x20); + LZ77UnCompVram(gWirelessSignal4bpp, BG_CHAR_ADDR(1)); + LZ77UnCompVram(gUnknown_826C60C, BG_SCREEN_ADDR(18)); + sTradeData->bg2vofs = 0x50; + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); + break; + case 4: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); + SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_256COLOR | BGCNT_SCREENBASE(18) | BGCNT_AFF128x128); + sTradeData->unk_D4 = 0x40; + sTradeData->unk_D6 = 0x5C; + sTradeData->sXY = 0x20; + sTradeData->unk_EA = 0x400; + sTradeData->unk_EC = 0; + DmaCopyLarge16(3, gUnknown_826701C, (void *)BG_CHAR_ADDR(1), 0x2840, 0x1000); + if (sTradeData->isCableTrade) + { + DmaCopy16Defvars(3, gUnknown_826985C, (void *)BG_SCREEN_ADDR(18), 0x100); + } + else + { + DmaCopy16Defvars(3, gUnknown_826995C, (void *)BG_SCREEN_ADDR(18), 0x100); + } + break; + case 5: + sTradeData->bg1vofs = 0; + sTradeData->bg1hofs = 0; + break; + case 6: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); + SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_256COLOR | BGCNT_SCREENBASE(18) | BGCNT_TXT256x256); + sTradeData->unk_D4 = 0x40; + sTradeData->unk_D6 = 0x5C; + sTradeData->sXY = 0x100; + sTradeData->unk_EA = 0x80; + sTradeData->unk_DC = 0x78; + sTradeData->unk_DE = 0x50; + sTradeData->unk_EC = 0; + DmaCopyLarge16(3, gUnknown_826701C, BG_CHAR_ADDR(1), 0x2840, 0x1000); + if (sTradeData->isCableTrade) + { + DmaCopy16Defvars(3, gUnknown_826985C, (void *)BG_SCREEN_ADDR(18), 0x100); + } + else + { + DmaCopy16Defvars(3, gUnknown_826995C, (void *)BG_SCREEN_ADDR(18), 0x100); + } + break; + case 7: + sTradeData->bg2vofs = 0; + sTradeData->bg2hofs = 0; + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT512x256); + LoadPalette(gTradeGba2_Pal, 0x10, 0x60); + DmaCopyLarge16(3, gTradeGba_Gfx, (void *)BG_CHAR_ADDR(1), 0x1420, 0x1000); + DmaCopy16Defvars(3, gUnknown_826601C, (void *)BG_SCREEN_ADDR(18), 0x1000); + break; + } +} + +void sub_8050DE0(void) +{ + LoadSpriteSheet(&gUnknown_826CE2C); + LoadSpriteSheet(&gUnknown_826CE7C); + LoadSpriteSheet(&gUnknown_826CEB0); + LoadSpriteSheet(&gUnknown_826CF28); + LoadSpritePalette(&gUnknown_826CE34); + LoadSpritePalette(&gUnknown_826CE3C); +} + +void sub_8050E24(void) +{ + u8 nickname[20]; + u8 mpId; + const struct InGameTrade * inGameTrade; + if (sTradeData->isLinkTrade) + { + mpId = GetMultiplayerId(); + StringCopy(gStringVar1, gLinkPlayers[mpId ^ 1].name); + GetMonData(&gEnemyParty[gSelectedTradeMonPositions[1] % 6], MON_DATA_NICKNAME, nickname); + StringCopy10(gStringVar3, nickname); + GetMonData(&gPlayerParty[gSelectedTradeMonPositions[0]], MON_DATA_NICKNAME, nickname); + StringCopy10(gStringVar2, nickname); + } + else + { + inGameTrade = &gInGameTrades[gSpecialVar_0x8004]; + StringCopy(gStringVar1, inGameTrade->otName); + StringCopy10(gStringVar3, inGameTrade->nickname); + GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_NICKNAME, nickname); + StringCopy10(gStringVar2, nickname); + } +} + +bool8 sub_8050F14(void) +{ + if (sTradeData->isCableTrade) + return sub_8050F3C(); + else + return sub_805232C(); +} + +bool8 sub_8050F3C(void) +{ + u16 evoTarget; + + switch (sTradeData->state) + { + case 0: + gSprites[sTradeData->pokePicSpriteIdxs[0]].invisible = FALSE; + gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.x = -180; + gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y = gMonFrontPicCoords[sTradeData->tradeSpecies[0]].y_offset; + sTradeData->state++; + sTradeData->cachedMapMusic = GetCurrentMapMusic(); + PlayNewMapMusic(MUS_SHINKA); + break; + case 1: + if (sTradeData->bg2hofs > 0) + { + gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.x += 3; + sTradeData->bg2hofs -= 3; + } + else + { + gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.x = 0; + sTradeData->bg2hofs = 0; + sTradeData->state = 10; + } + break; + case 10: + StringExpandPlaceholders(gStringVar4, gText_XWillBeSentToY); + DrawTextOnTradeWindow(0, gStringVar4, 0); + + if (sTradeData->tradeSpecies[0] != SPECIES_EGG) + { + PlayCry1(sTradeData->tradeSpecies[0], 0); + } + + sTradeData->state = 11; + sTradeData->timer = 0; + break; + case 11: + if (++sTradeData->timer == 80) + { + sTradeData->pokeballSpriteId = CreateTradePokeballSprite(sTradeData->pokePicSpriteIdxs[0], gSprites[sTradeData->pokePicSpriteIdxs[0]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff); + sTradeData->state++; + StringExpandPlaceholders(gStringVar4, gText_ByeByeVar1); + DrawTextOnTradeWindow(0, gStringVar4, 0); + } + break; + case 12: + if (gSprites[sTradeData->pokeballSpriteId].callback == SpriteCallbackDummy) + { + sTradeData->unk_D3 = CreateSprite(&sTradePokeballSpriteTemplate, 120, 32, 0); + gSprites[sTradeData->unk_D3].callback = SpriteCB_TradePokeball_Outbound; + DestroySprite(&gSprites[sTradeData->pokeballSpriteId]); + sTradeData->state++; + } + break; + case 13: + // The game waits here for the sprite to finish its animation sequence. + break; + case 14: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + sTradeData->state = 20; + break; + case 20: + if (!gPaletteFade.active) + { + SetTradeSequenceBgGpuRegs(4); + FillWindowPixelBuffer(0, PIXEL_FILL(15)); + CopyWindowToVram(0, 3); + sTradeData->state++; + } + break; + case 21: + BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); + sTradeData->state++; + break; + case 22: + if (!gPaletteFade.active) + { + sTradeData->state = 23; + } + break; + case 23: + if (sTradeData->unk_EA > 0x100) + { + sTradeData->unk_EA -= 0x34; + } + else + { + SetTradeSequenceBgGpuRegs(1); + sTradeData->unk_EA = 0x80; + sTradeData->state++; + sTradeData->timer = 0; + } + sTradeData->sXY = 0x8000 / sTradeData->unk_EA; + break; + case 24: + if (++sTradeData->timer > 20) + { + SetTradeBGAffine(); + sTradeData->unk_91 = CreateSprite(&gUnknown_826CF30, 120, 80, 0); + sTradeData->state++; + } + break; + case 25: + if (gSprites[sTradeData->unk_91].animEnded) + { + DestroySprite(&gSprites[sTradeData->unk_91]); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | + BLDCNT_TGT2_BG1 | + BLDCNT_TGT2_BG2); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 4)); + sTradeData->state++; + } + break; + case 26: + if (--sTradeData->bg1vofs == 316) + { + sTradeData->state++; + } + if (sTradeData->bg1vofs == 328) + { + sTradeData->unk_92 = CreateSprite(&sGameLinkCableEndSpriteTemplate, 128, 65, 0); + } + break; + case 27: + sTradeData->unk_90 = CreateSprite(&gUnknown_826CE44, 128, 80, 3); + sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 128, 80, 0); + StartSpriteAnim(&gSprites[sTradeData->unk_91], 1); + sTradeData->state++; + break; + case 28: + if ((sTradeData->bg1vofs -= 2) == 166) + { + sTradeData->state = 200; + } + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG1_ON | + DISPCNT_OBJ_ON); + break; + case 200: + gSprites[sTradeData->unk_90].pos1.y -= 2; + gSprites[sTradeData->unk_91].pos1.y -= 2; + if (gSprites[sTradeData->unk_90].pos1.y < -8) + { + sTradeData->state = 29; + } + break; + case 29: + BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); + sTradeData->state = 30; + break; + case 30: + if (!gPaletteFade.active) + { + DestroySprite(&gSprites[sTradeData->unk_90]); + DestroySprite(&gSprites[sTradeData->unk_91]); + SetTradeSequenceBgGpuRegs(2); + sTradeData->state++; + } + break; + case 31: + BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); + sTradeData->unk_90 = CreateSprite(&sGlowBallSpriteTemplate, 111, 170, 0); + sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 129, -10, 0); + sTradeData->state++; + break; + case 32: + if (!gPaletteFade.active) + { + PlaySE(SE_TK_WARPOUT); + sTradeData->state++; + } + gSprites[sTradeData->unk_90].pos2.y -= 3; + gSprites[sTradeData->unk_91].pos2.y += 3; + break; + case 33: + gSprites[sTradeData->unk_90].pos2.y -= 3; + gSprites[sTradeData->unk_91].pos2.y += 3; + if (gSprites[sTradeData->unk_90].pos2.y <= -90) + { + gSprites[sTradeData->unk_90].data[1] = 1; + gSprites[sTradeData->unk_91].data[1] = 1; + sTradeData->state++; + } + break; + case 34: + BlendPalettes(0x1, 16, RGB_WHITEALPHA); + sTradeData->state++; + break; + case 35: + BlendPalettes(0x1, 0, RGB_WHITEALPHA); + sTradeData->state++; + break; + case 36: + BlendPalettes(0x1, 16, RGB_WHITEALPHA); + sTradeData->state++; + break; + case 37: + if (!IsPokeSpriteNotFlipped(sTradeData->tradeSpecies[0])) + { + gSprites[sTradeData->pokePicSpriteIdxs[0]].affineAnims = gUnknown_826CF88; + gSprites[sTradeData->pokePicSpriteIdxs[0]].oam.affineMode = 3; + CalcCenterToCornerVec(&gSprites[sTradeData->pokePicSpriteIdxs[0]], 0, 3, 3); + StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[0]], 0); + } + else + { + StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[0]], 0); + } + StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[1]], 0); + gSprites[sTradeData->pokePicSpriteIdxs[0]].pos1.x = 60; + gSprites[sTradeData->pokePicSpriteIdxs[1]].pos1.x = 180; + gSprites[sTradeData->pokePicSpriteIdxs[0]].pos1.y = 192; + gSprites[sTradeData->pokePicSpriteIdxs[1]].pos1.y = -32; + gSprites[sTradeData->pokePicSpriteIdxs[0]].invisible = FALSE; + gSprites[sTradeData->pokePicSpriteIdxs[1]].invisible = FALSE; + sTradeData->state++; + break; + case 38: + gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y -= 3; + gSprites[sTradeData->pokePicSpriteIdxs[1]].pos2.y += 3; + if (gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y < -160 && gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y >= -163) + { + PlaySE(SE_TK_WARPIN); + } + if (gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y < -222) + { + gSprites[sTradeData->unk_90].data[1] = 0; + gSprites[sTradeData->unk_91].data[1] = 0; + sTradeData->state++; + gSprites[sTradeData->pokePicSpriteIdxs[0]].invisible = TRUE; + gSprites[sTradeData->pokePicSpriteIdxs[1]].invisible = TRUE; + BlendPalettes(0x1, 0, RGB_WHITEALPHA); + } + break; + case 39: + gSprites[sTradeData->unk_90].pos2.y -= 3; + gSprites[sTradeData->unk_91].pos2.y += 3; + if (gSprites[sTradeData->unk_90].pos2.y <= -222) + { + BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); + sTradeData->state++; + DestroySprite(&gSprites[sTradeData->unk_90]); + DestroySprite(&gSprites[sTradeData->unk_91]); + } + break; + case 40: + if (!gPaletteFade.active) + { + sTradeData->state++; + SetTradeSequenceBgGpuRegs(1); + sTradeData->bg1vofs = 166; + sTradeData->unk_90 = CreateSprite(&gUnknown_826CE44, 128, -20, 3); + sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 128, -20, 0); + StartSpriteAnim(&gSprites[sTradeData->unk_91], 1); + } + break; + case 41: + BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); + sTradeData->state++; + break; + case 42: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG1_ON | + DISPCNT_OBJ_ON); + if (!gPaletteFade.active) + { + sTradeData->state++; + } + break; + case 43: + gSprites[sTradeData->unk_90].pos2.y += 3; + gSprites[sTradeData->unk_91].pos2.y += 3; + if (gSprites[sTradeData->unk_90].pos2.y + gSprites[sTradeData->unk_90].pos1.y == 64) + { + sTradeData->state++; + } + break; + case 44: + if ((sTradeData->bg1vofs += 2) > 316) + { + sTradeData->bg1vofs = 316; + sTradeData->state++; + } + break; + case 45: + DestroySprite(&gSprites[sTradeData->unk_90]); + DestroySprite(&gSprites[sTradeData->unk_91]); + sTradeData->state++; + sTradeData->timer = 0; + break; + case 46: + if (++sTradeData->timer == 10) + { + sTradeData->state++; + } + break; + case 47: + if (++sTradeData->bg1vofs > 348) + { + sTradeData->bg1vofs = 348; + sTradeData->state++; + } + if (sTradeData->bg1vofs == 328 && sTradeData->isCableTrade) + { + sTradeData->unk_92 = CreateSprite(&sGameLinkCableEndSpriteTemplate, 128, 65, 0); + gSprites[sTradeData->unk_92].callback = SpriteCB_GameLinkCableEnd_Inbound; + } + break; + case 48: + sTradeData->unk_91 = CreateSprite(&gUnknown_826CF30, 120, 80, 0); + sTradeData->state = 50; + break; + case 50: + if (gSprites[sTradeData->unk_91].animEnded) + { + DestroySprite(&gSprites[sTradeData->unk_91]); + SetTradeSequenceBgGpuRegs(6); + sTradeData->state++; + PlaySE(SE_W028); + } + break; + case 51: + if (sTradeData->unk_EA < 0x400) + { + sTradeData->unk_EA += 0x34; + } + else + { + sTradeData->unk_EA = 0x400; + sTradeData->state++; + } + sTradeData->sXY = 0x8000 / sTradeData->unk_EA; + break; + case 52: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + sTradeData->state = 60; + break; + + case 60: + if (!gPaletteFade.active) + { + SetTradeSequenceBgGpuRegs(5); + SetTradeSequenceBgGpuRegs(7); + gPaletteFade.bufferTransferDisabled = TRUE; + sTradeData->state++; + } + break; + case 61: + gPaletteFade.bufferTransferDisabled = FALSE; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + sTradeData->state++; + break; + case 62: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG2_ON | + DISPCNT_OBJ_ON); + if (!gPaletteFade.active) + { + sTradeData->state++; + } + break; + case 63: + sTradeData->unk_D3 = CreateSprite(&sTradePokeballSpriteTemplate, 120, -8, 0); + gSprites[sTradeData->unk_D3].data[3] = 74; + gSprites[sTradeData->unk_D3].callback = SpriteCB_TradePokeball_Inbound; + StartSpriteAnim(&gSprites[sTradeData->unk_D3], 1); + StartSpriteAffineAnim(&gSprites[sTradeData->unk_D3], 2); + BlendPalettes(1 << (16 + gSprites[sTradeData->unk_D3].oam.paletteNum), 16, RGB_WHITEALPHA); + sTradeData->state++; + sTradeData->timer = 0; + break; + case 64: + BeginNormalPaletteFade(1 << (16 + gSprites[sTradeData->unk_D3].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA); + sTradeData->state++; + break; + case 65: + if (gSprites[sTradeData->unk_D3].callback == SpriteCallbackDummy) + { + HandleLoadSpecialPokePic(&gMonFrontPicTable[sTradeData->tradeSpecies[1]], gMonSpritesGfxPtr->sprites[3], sTradeData->tradeSpecies[1], sTradeData->monPersonalities[1]); + sTradeData->state++; + } + break; + case 66: + gSprites[sTradeData->pokePicSpriteIdxs[1]].pos1.x = 120; + gSprites[sTradeData->pokePicSpriteIdxs[1]].pos1.y = gMonFrontPicCoords[sTradeData->tradeSpecies[1]].y_offset + 60; + gSprites[sTradeData->pokePicSpriteIdxs[1]].pos2.x = 0; + gSprites[sTradeData->pokePicSpriteIdxs[1]].pos2.y = 0; + StartSpriteAnim(&gSprites[sTradeData->pokePicSpriteIdxs[1]], 0); + CreatePokeballSpriteToReleaseMon(sTradeData->pokePicSpriteIdxs[1], gSprites[sTradeData->pokePicSpriteIdxs[1]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF); + FreeSpriteOamMatrix(&gSprites[sTradeData->unk_D3]); + DestroySprite(&gSprites[sTradeData->unk_D3]); + sTradeData->state++; + break; + case 67: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG0_ON | + DISPCNT_BG2_ON | + DISPCNT_OBJ_ON); + StringExpandPlaceholders(gStringVar4, gText_XSentOverY); + DrawTextOnTradeWindow(0, gStringVar4, 0); + sTradeData->state = 167; + sTradeData->timer = 0; + break; + // 167 and 267 are extra cases added in for animations + case 167: + if (++sTradeData->timer > 60) + { + if (sTradeData->tradeSpecies[1] != SPECIES_EGG) + { + PlayCry1(sTradeData->tradeSpecies[1], 0); + } + sTradeData->state = 267; + sTradeData->timer = 0; + } + break; + case 267: + if (IsCryFinished()) + { + sTradeData->state = 68; + } + break; + case 68: + if (++sTradeData->timer == 10) + { + PlayFanfare(MUS_FANFA5); + } + if (sTradeData->timer == 250) + { + sTradeData->state++; + StringExpandPlaceholders(gStringVar4, gText_TakeGoodCareOfX); + DrawTextOnTradeWindow(0, gStringVar4, 0); + sTradeData->timer = 0; + } + break; + case 69: + if (++sTradeData->timer == 60) + { + sTradeData->state++; + } + break; + case 70: + CheckPartnersMonForRibbons(); + sTradeData->state++; + break; + case 71: + if (sTradeData->isLinkTrade) + { + return TRUE; + } + else if (JOY_NEW(A_BUTTON)) + { + sTradeData->state++; + } + break; + case 72: // Only if in-game trade + TradeMons(gSpecialVar_0x8005, 0); + gCB2_AfterEvolution = CB2_RunTradeAnim_InGameTrade; + evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[0]], TRUE, ITEM_NONE); + if (evoTarget != SPECIES_NONE) + { + TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[0]], evoTarget, sTradeData->pokePicSpriteIdxs[1], gSelectedTradeMonPositions[0]); + } + sTradeData->state++; + break; + case 73: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + sTradeData->state++; + break; + case 74: + if (!gPaletteFade.active) + { + PlayNewMapMusic(sTradeData->cachedMapMusic); + if (sTradeData) + { + FreeAllWindowBuffers(); + Free(GetBgTilemapBuffer(3)); + Free(GetBgTilemapBuffer(1)); + Free(GetBgTilemapBuffer(0)); + FreeMonSpritesGfx(); + FREE_AND_SET_NULL(sTradeData); + } + SetMainCallback2(CB2_ReturnToField); + BufferInGameTradeMonName(); + HelpSystem_Enable(); + } + break; + } + return FALSE; +} + +bool8 sub_805232C(void) +{ + u16 evoTarget; + + switch (sTradeData->state) + { + case 0: + gSprites[sTradeData->pokePicSpriteIdxs[0]].invisible = FALSE; + gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.x = -180; + gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y = gMonFrontPicCoords[sTradeData->tradeSpecies[0]].y_offset; + sTradeData->state++; + sTradeData->cachedMapMusic = GetCurrentMapMusic(); + PlayNewMapMusic(MUS_SHINKA); + break; + case 1: + if (sTradeData->bg2hofs > 0) + { + gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.x += 3; + sTradeData->bg2hofs -= 3; + } + else + { + gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.x = 0; + sTradeData->bg2hofs = 0; + sTradeData->state = 10; + } + break; + case 10: + StringExpandPlaceholders(gStringVar4, gText_XWillBeSentToY); + DrawTextOnTradeWindow(0, gStringVar4, 0); + + if (sTradeData->tradeSpecies[0] != SPECIES_EGG) + { + PlayCry1(sTradeData->tradeSpecies[0], 0); + } + + sTradeData->state = 11; + sTradeData->timer = 0; + break; + case 11: + if (++sTradeData->timer == 80) + { + sTradeData->pokeballSpriteId = CreateTradePokeballSprite(sTradeData->pokePicSpriteIdxs[0], gSprites[sTradeData->pokePicSpriteIdxs[0]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff); + sTradeData->state++; + StringExpandPlaceholders(gStringVar4, gText_ByeByeVar1); + DrawTextOnTradeWindow(0, gStringVar4, 0); + } + break; + case 12: + if (gSprites[sTradeData->pokeballSpriteId].callback == SpriteCallbackDummy) + { + sTradeData->unk_D3 = CreateSprite(&sTradePokeballSpriteTemplate, 120, 32, 0); + gSprites[sTradeData->unk_D3].callback = SpriteCB_TradePokeball_Outbound; + DestroySprite(&gSprites[sTradeData->pokeballSpriteId]); + sTradeData->state++; + } + break; + case 13: + // The game waits here for the sprite to finish its animation sequence. + break; + case 14: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + sTradeData->state = 20; + break; + case 20: + if (!gPaletteFade.active) + { + SetTradeSequenceBgGpuRegs(4); + FillWindowPixelBuffer(0, PIXEL_FILL(15)); + CopyWindowToVram(0, 3); + sTradeData->state++; + } + break; + case 21: + BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); + sTradeData->state++; + break; + case 22: + if (!gPaletteFade.active) + { + sTradeData->state = 23; + } + break; + case 23: + if (sTradeData->unk_EA > 0x100) + { + sTradeData->unk_EA -= 0x34; + } + else + { + SetTradeSequenceBgGpuRegs(1); + sTradeData->unk_EA = 0x80; + sTradeData->state = 124; + sTradeData->timer = 0; + } + sTradeData->sXY = 0x8000 / sTradeData->unk_EA; + break; + case 124: + if (++sTradeData->timer > 20) + { + SetTradeSequenceBgGpuRegs(3); + sTradeData->unk_91 = CreateSprite(&gUnknown_826CF48, 120, 80, 0); + sTradeData->state++; + } + break; + case 125: + if (gSprites[sTradeData->unk_91].animEnded) + { + DestroySprite(&gSprites[sTradeData->unk_91]); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | + BLDCNT_TGT1_OBJ | + BLDCNT_EFFECT_BLEND | + BLDCNT_TGT2_BG2); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 4)); + CreateTask(Task_AnimateWirelessSignal, 5); + sTradeData->state++; + } + break; + case 126: + if (!FuncIsActiveTask(Task_AnimateWirelessSignal)) + { + sTradeData->state = 26; + } + break; + case 26: + if (--sTradeData->bg1vofs == 316) + { + sTradeData->state++; + } + break; + case 27: + sTradeData->unk_90 = CreateSprite(&gUnknown_826CE44, 120, 80, 3); + gSprites[sTradeData->unk_90].callback = SpriteCB_TradeGlowWireless; + sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 120, 80, 0); + StartSpriteAnim(&gSprites[sTradeData->unk_91], 1); + sTradeData->state++; + break; + case 28: + if ((sTradeData->bg1vofs -= 3) == 166) + { + sTradeData->state = 200; + } + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG1_ON | + DISPCNT_OBJ_ON); + break; + case 200: + gSprites[sTradeData->unk_90].pos1.y -= 2; + gSprites[sTradeData->unk_91].pos1.y -= 2; + if (gSprites[sTradeData->unk_90].pos1.y < -8) + { + sTradeData->state = 29; + } + break; + case 29: + BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); + sTradeData->state = 30; + break; + case 30: + if (!gPaletteFade.active) + { + DestroySprite(&gSprites[sTradeData->unk_90]); + DestroySprite(&gSprites[sTradeData->unk_91]); + SetTradeSequenceBgGpuRegs(2); + sTradeData->state++; + } + break; + case 31: + BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); + sTradeData->unk_90 = CreateSprite(&sGlowBallSpriteTemplate, 111, 170, 0); + sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 129, -10, 0); + sTradeData->state++; + break; + case 32: + if (!gPaletteFade.active) + { + PlaySE(SE_TK_WARPOUT); + sTradeData->state++; + } + gSprites[sTradeData->unk_90].pos2.y -= 3; + gSprites[sTradeData->unk_91].pos2.y += 3; + break; + case 33: + gSprites[sTradeData->unk_90].pos2.y -= 3; + gSprites[sTradeData->unk_91].pos2.y += 3; + if (gSprites[sTradeData->unk_90].pos2.y <= -90) + { + gSprites[sTradeData->unk_90].data[1] = 1; + gSprites[sTradeData->unk_91].data[1] = 1; + sTradeData->state++; + CreateTask(c3_0805465C, 5); + } + break; + case 34: + BlendPalettes(0x8, 16, RGB_WHITEALPHA); + sTradeData->state++; + break; + case 35: + BlendPalettes(0x8, 16, RGB_WHITEALPHA); + sTradeData->state++; + break; + case 36: + BlendPalettes(0x8, 16, RGB_WHITEALPHA); + sTradeData->state++; + break; + case 37: + if (!IsPokeSpriteNotFlipped(sTradeData->tradeSpecies[0])) + { + gSprites[sTradeData->pokePicSpriteIdxs[0]].affineAnims = gUnknown_826CF88; + gSprites[sTradeData->pokePicSpriteIdxs[0]].oam.affineMode = 3; + CalcCenterToCornerVec(&gSprites[sTradeData->pokePicSpriteIdxs[0]], 0, 3, 3); + StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[0]], 0); + } + else + { + StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[0]], 0); + } + StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[1]], 0); + gSprites[sTradeData->pokePicSpriteIdxs[0]].pos1.x = 40; + gSprites[sTradeData->pokePicSpriteIdxs[1]].pos1.x = 200; + gSprites[sTradeData->pokePicSpriteIdxs[0]].pos1.y = 192; + gSprites[sTradeData->pokePicSpriteIdxs[1]].pos1.y = -32; + gSprites[sTradeData->pokePicSpriteIdxs[0]].invisible = FALSE; + gSprites[sTradeData->pokePicSpriteIdxs[1]].invisible = FALSE; + sTradeData->state++; + break; + case 38: + gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y -= 3; + gSprites[sTradeData->pokePicSpriteIdxs[1]].pos2.y += 3; + if (gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y < -160 && gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y >= -163) + { + PlaySE(SE_TK_WARPIN); + } + if (gSprites[sTradeData->pokePicSpriteIdxs[0]].pos2.y < -222) + { + gSprites[sTradeData->unk_90].data[1] = 0; + gSprites[sTradeData->unk_91].data[1] = 0; + sTradeData->state++; + gSprites[sTradeData->pokePicSpriteIdxs[0]].invisible = TRUE; + gSprites[sTradeData->pokePicSpriteIdxs[1]].invisible = TRUE; + CreateTask(sub_8054734, 5); + } + break; + case 39: + gSprites[sTradeData->unk_90].pos2.y -= 3; + gSprites[sTradeData->unk_91].pos2.y += 3; + if (gSprites[sTradeData->unk_90].pos2.y <= -222) + { + BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); + sTradeData->state++; + DestroySprite(&gSprites[sTradeData->unk_90]); + DestroySprite(&gSprites[sTradeData->unk_91]); + } + break; + case 40: + if (!gPaletteFade.active) + { + sTradeData->state++; + SetTradeSequenceBgGpuRegs(1); + sTradeData->bg1vofs = 166; + SetTradeSequenceBgGpuRegs(3); + sTradeData->bg2vofs = 412; + sTradeData->unk_90 = CreateSprite(&gUnknown_826CE44, 120, -20, 3); + gSprites[sTradeData->unk_90].callback = SpriteCB_TradeGlowWireless; + sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 120, -20, 0); + StartSpriteAnim(&gSprites[sTradeData->unk_91], 1); + } + break; + case 41: + BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); + sTradeData->state++; + break; + case 42: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG1_ON | + DISPCNT_OBJ_ON); + if (!gPaletteFade.active) + { + sTradeData->state++; + } + break; + case 43: + gSprites[sTradeData->unk_90].pos2.y += 4; + gSprites[sTradeData->unk_91].pos2.y += 4; + if (gSprites[sTradeData->unk_90].pos2.y + gSprites[sTradeData->unk_90].pos1.y == 64) + { + sTradeData->state = 144; + sTradeData->timer = 0; + } + break; + case 144: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG1_ON | + DISPCNT_BG2_ON | + DISPCNT_OBJ_ON); + sTradeData->bg1vofs += 3; + sTradeData->bg2vofs += 3; + if (++sTradeData->timer == 10) + { + u8 taskId = CreateTask(Task_AnimateWirelessSignal, 5); + gTasks[taskId].data[2] = TRUE; + } + if (sTradeData->bg1vofs > 316) + { + sTradeData->bg1vofs = 316; + sTradeData->state++; + } + break; + case 145: + DestroySprite(&gSprites[sTradeData->unk_90]); + DestroySprite(&gSprites[sTradeData->unk_91]); + sTradeData->state++; + sTradeData->timer = 0; + break; + case 146: + if (!FuncIsActiveTask(Task_AnimateWirelessSignal)) + { + sTradeData->state = 46; + sTradeData->timer = 0; + } + break; + case 46: + if (++sTradeData->timer == 10) + { + sTradeData->state++; + } + break; + case 47: + if (++sTradeData->bg1vofs > 348) + { + sTradeData->bg1vofs = 348; + sTradeData->state++; + } + break; + case 48: + sTradeData->unk_91 = CreateSprite(&gUnknown_826CF30, 120, 80, 0); + sTradeData->state = 50; + break; + case 50: + if (gSprites[sTradeData->unk_91].animEnded) + { + DestroySprite(&gSprites[sTradeData->unk_91]); + SetTradeSequenceBgGpuRegs(6); + sTradeData->state++; + PlaySE(SE_W028); + } + break; + case 51: + if (sTradeData->unk_EA < 0x400) + { + sTradeData->unk_EA += 0x34; + } + else + { + sTradeData->unk_EA = 0x400; + sTradeData->state++; + } + sTradeData->sXY = 0x8000 / sTradeData->unk_EA; + break; + case 52: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + sTradeData->state = 60; + break; + + case 60: + if (!gPaletteFade.active) + { + SetTradeSequenceBgGpuRegs(5); + SetTradeSequenceBgGpuRegs(7); + gPaletteFade.bufferTransferDisabled = TRUE; + sTradeData->state++; + } + break; + case 61: + gPaletteFade.bufferTransferDisabled = FALSE; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + sTradeData->state++; + break; + case 62: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG2_ON | + DISPCNT_OBJ_ON); + if (!gPaletteFade.active) + { + sTradeData->state++; + } + break; + case 63: + sTradeData->unk_D3 = CreateSprite(&sTradePokeballSpriteTemplate, 120, -8, 0); + gSprites[sTradeData->unk_D3].data[3] = 74; + gSprites[sTradeData->unk_D3].callback = SpriteCB_TradePokeball_Inbound; + StartSpriteAnim(&gSprites[sTradeData->unk_D3], 1); + StartSpriteAffineAnim(&gSprites[sTradeData->unk_D3], 2); + BlendPalettes(1 << (16 + gSprites[sTradeData->unk_D3].oam.paletteNum), 16, RGB_WHITEALPHA); + sTradeData->state++; + sTradeData->timer = 0; + break; + case 64: + BeginNormalPaletteFade(1 << (16 + gSprites[sTradeData->unk_D3].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA); + sTradeData->state++; + break; + case 65: + if (gSprites[sTradeData->unk_D3].callback == SpriteCallbackDummy) + { + HandleLoadSpecialPokePic(&gMonFrontPicTable[sTradeData->tradeSpecies[1]], gMonSpritesGfxPtr->sprites[3], sTradeData->tradeSpecies[1], sTradeData->monPersonalities[1]); + sTradeData->state++; + } + break; + case 66: + gSprites[sTradeData->pokePicSpriteIdxs[1]].pos1.x = 120; + gSprites[sTradeData->pokePicSpriteIdxs[1]].pos1.y = gMonFrontPicCoords[sTradeData->tradeSpecies[1]].y_offset + 60; + gSprites[sTradeData->pokePicSpriteIdxs[1]].pos2.x = 0; + gSprites[sTradeData->pokePicSpriteIdxs[1]].pos2.y = 0; + StartSpriteAnim(&gSprites[sTradeData->pokePicSpriteIdxs[1]], 0); + CreatePokeballSpriteToReleaseMon(sTradeData->pokePicSpriteIdxs[1], gSprites[sTradeData->pokePicSpriteIdxs[1]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF); + FreeSpriteOamMatrix(&gSprites[sTradeData->unk_D3]); + DestroySprite(&gSprites[sTradeData->unk_D3]); + sTradeData->state++; + break; + case 67: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG0_ON | + DISPCNT_BG2_ON | + DISPCNT_OBJ_ON); + StringExpandPlaceholders(gStringVar4, gText_XSentOverY); + DrawTextOnTradeWindow(0, gStringVar4, 0); + sTradeData->state = 167; + sTradeData->timer = 0; + break; + // 167 and 267 are extra cases added in for animations + case 167: + if (++sTradeData->timer > 60) + { + if (sTradeData->tradeSpecies[1] != SPECIES_EGG) + { + PlayCry1(sTradeData->tradeSpecies[1], 0); + } + sTradeData->state = 267; + sTradeData->timer = 0; + } + break; + case 267: + if (IsCryFinished()) + { + sTradeData->state = 68; + } + break; + case 68: + if (++sTradeData->timer == 10) + { + PlayFanfare(MUS_FANFA5); + } + if (sTradeData->timer == 250) + { + sTradeData->state++; + StringExpandPlaceholders(gStringVar4, gText_TakeGoodCareOfX); + DrawTextOnTradeWindow(0, gStringVar4, 0); + sTradeData->timer = 0; + } + break; + case 69: + if (++sTradeData->timer == 60) + { + sTradeData->state++; + } + break; + case 70: + CheckPartnersMonForRibbons(); + sTradeData->state++; + break; + case 71: + if (sTradeData->isLinkTrade) + { + return TRUE; + } + else if (JOY_NEW(A_BUTTON)) + { + sTradeData->state++; + } + break; + case 72: // Only if in-game trade + TradeMons(gSpecialVar_0x8005, 0); + gCB2_AfterEvolution = CB2_RunTradeAnim_InGameTrade; + evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[0]], TRUE, ITEM_NONE); + if (evoTarget != SPECIES_NONE) + { + TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[0]], evoTarget, sTradeData->pokePicSpriteIdxs[1], gSelectedTradeMonPositions[0]); + } + sTradeData->state++; + break; + case 73: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + sTradeData->state++; + break; + case 74: + if (!gPaletteFade.active) + { + PlayNewMapMusic(sTradeData->cachedMapMusic); + if (sTradeData) + { + FreeAllWindowBuffers(); + Free(GetBgTilemapBuffer(3)); + Free(GetBgTilemapBuffer(1)); + Free(GetBgTilemapBuffer(0)); + FreeMonSpritesGfx(); + FREE_AND_SET_NULL(sTradeData); + } + SetMainCallback2(CB2_ReturnToField); + BufferInGameTradeMonName(); + HelpSystem_Enable(); + } + break; + } + 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(); +} + +void sub_8053E8C(void) +{ + switch (gMain.state) + { + case 0: + gMain.state++; + StringExpandPlaceholders(gStringVar4, gUnknown_841E325); + DrawTextOnTradeWindow(0, gStringVar4, 0); + break; + case 1: + sub_800AB9C(); + gMain.state = 100; + sTradeData->timer = 0; + break; + case 100: + if (++sTradeData->timer > 180) + { + gMain.state = 101; + sTradeData->timer = 0; + } + if (IsLinkTaskFinished()) + { + gMain.state = 2; + } + break; + case 101: + if (IsLinkTaskFinished()) + { + gMain.state = 2; + } + break; + case 2: + gMain.state = 50; + StringExpandPlaceholders(gStringVar4, gText_SavingDontTurnOffThePower2); + DrawTextOnTradeWindow(0, gStringVar4, 0); + break; + case 50: + if (InUnionRoom()) + { + sub_8113550(18, sTradeData->monSpecies); + } + else + { + sub_8113550(12, sTradeData->monSpecies); + IncrementGameStat(GAME_STAT_POKEMON_TRADES); + } + if (gWirelessCommType) + { + sub_8144714(2, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId); + } + SetContinueGameWarpStatusToDynamicWarp(); + sub_80DA3AC(); + gMain.state++; + sTradeData->timer = 0; + break; + case 51: + if (++sTradeData->timer == 5) + { + gMain.state++; + } + break; + case 52: + if (sub_80DA3D8()) + { + ClearContinueGameWarpStatus2(); + gMain.state = 4; + } + else + { + sTradeData->timer = 0; + gMain.state = 51; + } + break; + case 4: + sub_80DA40C(); + gMain.state = 40; + sTradeData->timer = 0; + break; + case 40: + if (++sTradeData->timer > 50) + { + if (GetMultiplayerId() == 0) + { + sTradeData->timer = Random() % 30; + } + else + { + sTradeData->timer = 0; + } + gMain.state = 41; + } + break; + case 41: + if (sTradeData->timer == 0) + { + sub_800AB9C(); + gMain.state = 42; + } + else + { + sTradeData->timer--; + } + break; + case 42: + if (IsLinkTaskFinished()) + { + sub_80DA434(); + gMain.state = 5; + } + break; + case 5: + if (++sTradeData->timer > 60) + { + gMain.state++; + sub_800AB9C(); + } + break; + case 6: + if (IsLinkTaskFinished()) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gMain.state ++; + } + break; + case 7: + if (!gPaletteFade.active) + { + FadeOutBGM(3); + gMain.state++; + } + break; + case 8: + if (IsBGMStopped() == TRUE) + { + if (gWirelessCommType && gMain.savedCallback == sub_804C718) + { + sub_800AB9C(); + } + else + { + sub_800AAC0(); + } + gMain.state++; + } + break; + case 9: + if (gWirelessCommType && gMain.savedCallback == sub_804C718) + { + if (IsLinkRfuTaskFinished()) + { + gSoftResetDisabled = FALSE; + SetMainCallback2(sub_80543C4); + } + } + else if (!gReceivedRemoteLinkPlayers) + { + gSoftResetDisabled = FALSE; + SetMainCallback2(sub_80543C4); + } + break; + } + if (!HasLinkErrorOccurred()) + { + RunTasks(); + } + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void sub_80543C4(void) +{ + if (!gPaletteFade.active) + { + FreeAllWindowBuffers(); + Free(GetBgTilemapBuffer(3)); + Free(GetBgTilemapBuffer(1)); + Free(GetBgTilemapBuffer(0)); + FreeMonSpritesGfx(); + FREE_AND_SET_NULL(sTradeData); + if (gWirelessCommType != 0) + DestroyWirelessStatusIndicatorSprite(); + SetMainCallback2(gMain.savedCallback); + } + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void DoInGameTradeScene(void) +{ + ScriptContext2_Enable(); + CreateTask(sub_8054470, 10); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + HelpSystem_Disable(); +} + +void sub_8054470(u8 taskId) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(CB2_InitTradeAnim_InGameTrade); + gFieldCallback = FieldCallback_ReturnToEventScript2; + DestroyTask(taskId); + } +} + +void CheckPartnersMonForRibbons(void) +{ + u8 nRibbons = 0; + u8 i; + for (i = 0; i < 12; i++) + { + nRibbons += GetMonData(&gEnemyParty[gSelectedTradeMonPositions[1] % 6], MON_DATA_CHAMPION_RIBBON + i); + } + if (nRibbons != 0) + FlagSet(FLAG_SYS_RIBBON_GET); +} + +void sub_80544FC(void) +{ + TradeAnimInit_LoadGfx(); +} + +void DrawTextOnTradeWindow(u8 windowId, const u8 *str, s8 speed) +{ + FillWindowPixelBuffer(windowId, PIXEL_FILL(15)); + sTradeData->textColor[0] = 15; + sTradeData->textColor[1] = 1; + sTradeData->textColor[2] = 6; + AddTextPrinterParameterized4(windowId, 2, 0, 2, 0, 2, sTradeData->textColor, speed, str); + CopyWindowToVram(windowId, 3); +} + +void Task_AnimateWirelessSignal(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + u16 r2 = 16 * gUnknown_826D250[data[0]][0]; + if (data[2] == 0) + { + if (r2 == 0x100) + LoadPalette(gUnknown_826BF5C, 0x30, 0x20); + else + LoadPalette(&gUnknown_826BB5C[r2], 0x30, 0x20); + } + else + { + if (r2 == 0x100) + LoadPalette(gUnknown_826BF5C, 0x30, 0x20); + else + LoadPalette(&gUnknown_826BD5C[r2], 0x30, 0x20); + } + if (gUnknown_826D250[data[0]][0] == 0 && data[1] == 0) + PlaySE(SE_W215); + if (data[1] == gUnknown_826D250[data[0]][1]) + { + data[0]++; + data[1] = 0; + if (gUnknown_826D250[data[0]][1] == 0xFF) + DestroyTask(taskId); + } + else + data[1]++; +} + +void c3_0805465C(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + if (data[0] == 0) + { + sTradeData->win0left = sTradeData->win0right = 120; + sTradeData->win0top = 0; + sTradeData->win0bottom = 160; + SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_OBJ); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 | + WININ_WIN0_BG1 | + WININ_WIN0_OBJ); + } + + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE2(sTradeData->win0left, sTradeData->win0right)); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE2(sTradeData->win0top, sTradeData->win0bottom)); + + data[0]++; + sTradeData->win0left -= 5; + sTradeData->win0right += 5; + + if (sTradeData->win0left < 80) + { + DestroyTask(taskId); + } +} + +void sub_8054734(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + if (data[0] == 0) + { + sTradeData->win0left = 80; + sTradeData->win0right = 160; + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_OBJ); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 | + WININ_WIN0_BG1 | + WININ_WIN0_OBJ); + } + + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE2(sTradeData->win0left, sTradeData->win0right)); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE2(sTradeData->win0top, sTradeData->win0bottom)); + + if (sTradeData->win0left != 120) + { + data[0]++; + sTradeData->win0left += 5; + sTradeData->win0right -= 5; + + if (sTradeData->win0left >= 116) + BlendPalettes(0x8, 0, RGB_WHITEALPHA); + } + else + { + ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + DestroyTask(taskId); + } +} diff --git a/sym_ewram.txt b/sym_ewram.txt index 67c1e4de8..d4c25d15f 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -31,6 +31,8 @@ .align 2 .include "src/trade.o" .align 2 + .include "src/trade_scene.o" + .align 2 .include "src/new_game.o" .align 2 |