summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2019-10-30 14:20:32 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2019-10-30 14:20:32 -0400
commitf6d768d5ed9899f5814349cb232da861f85cbc60 (patch)
treee14411a8f5705d1e631ab50aa2dc8dca70587f69
parent2c2c179eb9b92d0998922cc96a115d3d1671a64b (diff)
Trade data; split off trade_scene
-rw-r--r--data/trade.s542
-rw-r--r--include/graphics.h2
-rw-r--r--include/strings.h18
-rw-r--r--include/trade.h5
-rw-r--r--include/trade_scene.h6
-rw-r--r--ld_script.txt2
-rw-r--r--src/trade.c2975
-rw-r--r--src/trade_scene.c2444
-rw-r--r--sym_ewram.txt2
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