summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_anim_mons.c4
-rw-r--r--src/battle_anim_status_effects.c62
-rw-r--r--src/battle_pyramid_bag.c976
-rw-r--r--src/contest.c75
-rw-r--r--src/contest_painting.c255
-rw-r--r--src/contest_util.c299
-rw-r--r--src/data/contest_opponents.h16
-rw-r--r--src/data/trade.h502
-rw-r--r--src/egg_hatch.c4
-rwxr-xr-xsrc/ereader_helpers.c510
-rwxr-xr-xsrc/ereader_screen.c10
-rw-r--r--src/graphics.c36
-rw-r--r--src/international_string_util.c2
-rw-r--r--src/item.c2
-rwxr-xr-xsrc/item_menu.c15
-rwxr-xr-xsrc/item_use.c18
-rw-r--r--src/menu.c19
-rw-r--r--src/menu_helpers.c2
-rw-r--r--src/new_game.c8
-rwxr-xr-xsrc/party_menu.c4
-rw-r--r--src/scrcmd.c6
-rw-r--r--src/script_menu.c2
-rw-r--r--src/strings.c13
-rw-r--r--src/trade.c1244
-rwxr-xr-xsrc/trainer_card.c4
25 files changed, 2157 insertions, 1931 deletions
diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c
index 6dc0a0271..2082512ff 100644
--- a/src/battle_anim_mons.c
+++ b/src/battle_anim_mons.c
@@ -2273,7 +2273,7 @@ u8 CreateInvisibleSpriteCopy(int battlerId, u8 spriteId, int species)
return newSpriteId;
}
-void AnimUnused_80A8A6C(struct Sprite *sprite)
+void AnimTranslateLinearAndFlicker_Flipped(struct Sprite *sprite)
{
SetSpriteCoordsToAnimAttackerCoords(sprite);
if (GetBattlerSide(gBattleAnimAttacker))
@@ -2296,7 +2296,7 @@ void AnimUnused_80A8A6C(struct Sprite *sprite)
}
// Used by three different unused battle anim sprite templates.
-void AnimUnused_80A8AEC(struct Sprite *sprite)
+void AnimTranslateLinearAndFlicker(struct Sprite *sprite)
{
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
{
diff --git a/src/battle_anim_status_effects.c b/src/battle_anim_status_effects.c
index e7ef05673..e859bed62 100644
--- a/src/battle_anim_status_effects.c
+++ b/src/battle_anim_status_effects.c
@@ -26,7 +26,7 @@ static void Task_DoStatusAnimation(u8 taskId);
static void AnimFlashingCircleImpact(struct Sprite *sprite);
static void AnimFlashingCircleImpact_Step(struct Sprite *sprite);
-static const union AnimCmd sAnim_Unused_853EDE4[] =
+static const union AnimCmd sAnim_FlickeringOrb[] =
{
ANIMCMD_FRAME(0, 3),
ANIMCMD_FRAME(4, 3),
@@ -35,33 +35,33 @@ static const union AnimCmd sAnim_Unused_853EDE4[] =
ANIMCMD_JUMP(0)
};
-static const union AnimCmd *const sAnims_Unused_853EDF8[] =
+static const union AnimCmd *const sAnims_FlickeringOrb[] =
{
- sAnim_Unused_853EDE4
+ sAnim_FlickeringOrb
};
// Unused
-const struct SpriteTemplate gUnusedSpriteTemplate_0853EDFC =
+static const struct SpriteTemplate sFlickeringOrbSpriteTemplate =
{
.tileTag = ANIM_TAG_ORB,
.paletteTag = ANIM_TAG_ORB,
.oam = &gOamData_AffineOff_ObjNormal_16x16,
- .anims = sAnims_Unused_853EDF8,
+ .anims = sAnims_FlickeringOrb,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = AnimUnused_80A8AEC,
+ .callback = AnimTranslateLinearAndFlicker,
};
// Unused
-const struct SpriteTemplate gUnusedSpriteTemplate_0853EE14 =
+static const struct SpriteTemplate sFlickeringOrbFlippedSpriteTemplate =
{
.tileTag = ANIM_TAG_ORB,
.paletteTag = ANIM_TAG_ORB,
.oam = &gOamData_AffineOff_ObjNormal_16x16,
- .anims = sAnims_Unused_853EDF8,
+ .anims = sAnims_FlickeringOrb,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = AnimUnused_80A8A6C,
+ .callback = AnimTranslateLinearAndFlicker_Flipped,
};
static const union AnimCmd sAnim_WeatherBallNormal[] =
@@ -124,7 +124,7 @@ const struct SpriteTemplate gSpinningSparkleSpriteTemplate =
};
// Unused
-const struct SpriteTemplate gUnusedSpriteTemplate_0853EE9C =
+static const struct SpriteTemplate sFlickeringFootSpriteTemplate =
{
.tileTag = ANIM_TAG_MONSTER_FOOT,
.paletteTag = ANIM_TAG_MONSTER_FOOT,
@@ -132,79 +132,79 @@ const struct SpriteTemplate gUnusedSpriteTemplate_0853EE9C =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = AnimUnused_80A8AEC,
+ .callback = AnimTranslateLinearAndFlicker,
};
-static const union AnimCmd sAnim_Unused_853EEB4[] =
+static const union AnimCmd sAnim_FlickeringImpact_0[] =
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_JUMP(0)
};
-static const union AnimCmd sAnim_Unused_853EEBC[] =
+static const union AnimCmd sAnim_FlickeringImpact_1[] =
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_JUMP(0)
};
-static const union AnimCmd sAnim_Unused_853EEC4[] =
+static const union AnimCmd sAnim_FlickeringImpact_2[] =
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_JUMP(0)
};
-static const union AnimCmd *const sAnims_Unused_853EECC[] =
+static const union AnimCmd *const sAnims_FlickeringImpact[] =
{
- sAnim_Unused_853EEB4,
- sAnim_Unused_853EEBC,
- sAnim_Unused_853EEC4,
+ sAnim_FlickeringImpact_0,
+ sAnim_FlickeringImpact_1,
+ sAnim_FlickeringImpact_2,
};
// Unused
-const struct SpriteTemplate gUnusedSpriteTemplate_0853EED8 =
+static const struct SpriteTemplate sFlickeringImpactSpriteTemplate =
{
.tileTag = ANIM_TAG_IMPACT,
.paletteTag = ANIM_TAG_IMPACT,
.oam = &gOamData_AffineOff_ObjNormal_32x32,
- .anims = sAnims_Unused_853EECC,
+ .anims = sAnims_FlickeringImpact,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = AnimUnused_80A8AEC,
+ .callback = AnimTranslateLinearAndFlicker,
};
-static const union AnimCmd sAnim_Unused_853EEF0[] =
+static const union AnimCmd sAnim_FlickeringShrinkOrb[] =
{
ANIMCMD_FRAME(0, 15),
ANIMCMD_JUMP(0)
};
-static const union AnimCmd *const sAnims_Unused_853EEF8[] =
+static const union AnimCmd *const sAnims_FlickeringShrinkOrb[] =
{
- sAnim_Unused_853EEF0
+ sAnim_FlickeringShrinkOrb
};
-static const union AffineAnimCmd sAffineAnim_Unused_853EEFC[] =
+static const union AffineAnimCmd sAffineAnim_FlickeringShrinkOrb[] =
{
AFFINEANIMCMD_FRAME(96, 96, 0, 0),
AFFINEANIMCMD_FRAME(2, 2, 0, 1),
AFFINEANIMCMD_JUMP(1)
};
-static const union AffineAnimCmd *const sAffineAnims_Unused_853EEF8[] =
+static const union AffineAnimCmd *const sAffineAnims_FlickeringShrinkOrb[] =
{
- sAffineAnim_Unused_853EEFC
+ sAffineAnim_FlickeringShrinkOrb
};
// Unused
-const struct SpriteTemplate gUnusedSpriteTemplate_0853EF18 =
+static const struct SpriteTemplate sFlickeringShrinkOrbSpriteTemplate =
{
.tileTag = ANIM_TAG_ORB,
.paletteTag = ANIM_TAG_ORB,
.oam = &gOamData_AffineDouble_ObjNormal_16x16,
- .anims = sAnims_Unused_853EEF8,
+ .anims = sAnims_FlickeringShrinkOrb,
.images = NULL,
- .affineAnims = sAffineAnims_Unused_853EEF8,
- .callback = AnimUnused_80A8A6C,
+ .affineAnims = sAffineAnims_FlickeringShrinkOrb,
+ .callback = AnimTranslateLinearAndFlicker_Flipped,
};
static const struct Subsprite sFrozenIceCubeSubsprites[] =
diff --git a/src/battle_pyramid_bag.c b/src/battle_pyramid_bag.c
index 23f2f9653..0b13512ec 100644
--- a/src/battle_pyramid_bag.c
+++ b/src/battle_pyramid_bag.c
@@ -34,71 +34,83 @@
#include "constants/rgb.h"
#include "constants/songs.h"
-EWRAM_DATA struct PyramidBagResources *gPyramidBagResources = NULL;
-EWRAM_DATA struct PyramidBagCursorData gPyramidBagCursorData = {0};
-
-// This file's functions.
-static void Task_HandlePyramidBagInput(u8 taskId);
-static void Task_ChooseItemsToTossFromPyramidBag(u8 taskId);
-static void sub_81C5B4C(u8 taskId);
-static void Task_BeginItemSwap(u8 taskId);
-static void sub_81C5D20(u8 taskId);
-static void sub_81C674C(u8 taskId);
-static void HandleMenuActionInput(u8 taskId);
-static void HandleFewMenuActionsInput(u8 taskId);
-static void sub_81C66EC(u8 taskId);
-static void SetTaskToMainPyramidBagInputHandler(u8 taskId);
-static void sub_81C6350(u8 taskId);
-static void sub_81C64B4(u8 taskId);
-static void sub_81C65CC(u8 taskId);
-static void sub_81C66AC(u8 taskId);
-static void PerformItemSwap(u8 taskId);
-static void Task_ItemSwapHandleInput(u8 taskId);
-static void sub_81C6A14(u8 taskId);
+#define TAG_SCROLL_ARROW 2910
+#define TAG_PYRAMID_BAG 4132
+#define TAG_ITEM_ICON 4133
+#define TAG_ITEM_ICON_ALT 4134
+
+#define POS_NONE ((u8)-1)
+
+enum {
+ WIN_LIST,
+ WIN_INFO,
+ WIN_MSG,
+ WIN_TOSS_NUM,
+};
+
+EWRAM_DATA struct PyramidBagMenu *gPyramidBagMenu = NULL;
+EWRAM_DATA struct PyramidBagMenuState gPyramidBagMenuState = {0};
+
+static void Task_HandlePyramidBagInput(u8);
+static void Task_ChooseItemsToTossFromPyramidBag(u8);
+static void Task_ClosePyramidBag(u8);
+static void Task_BeginItemSwap(u8);
+static void OpenContextMenu(u8);
+static void TryCloseBagToGiveItem(u8);
+static void HandleMenuActionInput_2x2(u8);
+static void HandleMenuActionInput_SingleRow(u8);
+static void Task_WaitCloseErrorMessage(u8);
+static void SetTaskToMainPyramidBagInputHandler(u8);
+static void AskConfirmToss(u8);
+static void Task_ChooseHowManyToToss(u8);
+static void Task_TossItem(u8);
+static void ShowCantHoldMessage(u8);
+static void PerformItemSwap(u8);
+static void Task_ItemSwapHandleInput(u8);
+static void CancelItemSwap(u8);
static void SetBagItemsListTemplate(void);
-static void sub_81C504C(void);
-static void sub_81C51DC(void);
-static void AddScrollArrow(void);
-static void sub_81C56F8(void);
-static void sub_81C5A20(void);
-static void sub_81C6BD8(void);
-static void sub_81C6EF4(void);
+static void CB2_LoadPyramidBagMenu(void);
+static void InitPyramidBagBgs(void);
+static void AddScrollArrows(void);
+static void CreatePyramidBagInputTask(void);
+static void InitPyramidBagScroll(void);
+static void InitPyramidBagWindows(void);
+static void CreatePyramidBagSprite(void);
static void CreateSwapLine(void);
-static void sub_81C6E98(void);
-static void sub_81C6F20(void);
-static void sub_81C6404(void);
+static void LoadPyramidBagPalette(void);
+static void ShakePyramidBag(void);
+static void ShowNumToToss(void);
static void CloseBattlePyramidBagTextWindow(void);
-static bool8 sub_81C5238(void);
-static bool8 sub_81C5078(void);
-static void ShowItemImage(u16 itemId, u8 itemSpriteArrayId);
-static void PyramidBag_CopyItemName(u8 *dst, u16 itemId);
-static void sub_81C6FF8(u8 arg0);
-static void PrintItemDescription(s32 listMenuId);
-static void sub_81C5AB8(u8 y, u8 arg1);
-static void PrintOnWindow_Font1(u8 windowId, const u8 *src, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorTableId);
-static void PrintOnWindow_Font7(u8 windowId, const u8 *src, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorTableId);
-static u8 sub_81C6D24(u8 windowArrayId);
-static void sub_81C6D6C(u8 windowArrayId);
-static void sub_81C5EAC(u8 windowId);
-static void sub_81C5F08(u8 windowId, u8 horizontalCount, u8 verticalCount);
-static bool8 IsValidMenuAction(s8 arg0);
-static void sub_81C6DAC(u8 taskId, const struct YesNoFuncTable *yesNoTable);
-static void sub_81C6CEC(u8 windowId);
-static void UpdateSwapLinePos(u8 y);
-static void SetSwapLineInvisibility(bool8 invisible);
-static void sub_81C6F68(struct Sprite *sprite);
-static void BagAction_UseOnField(u8 taskId);
-static void BagAction_Toss(u8 taskId);
-static void BagAction_Give(u8 taskId);
-static void BagAction_Cancel(u8 taskId);
-static void BagAction_UseInBattle(u8 taskId);
-static void PyramidBagMoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list);
-static void PrintItemQuantity(u8 windowId, s32 itemIndex, u8 y);
-static void TossItem(u8 taskId);
-static void DontTossItem(u8 taskId);
-
-// Const rom data.
-static const struct BgTemplate gUnknown_0861F2B4[] =
+static bool8 LoadPyramidBagGfx(void);
+static bool8 LoadPyramidBagMenu(void);
+static void ShowItemIcon(u16, u8);
+static void CopyBagItemName(u8 *, u16);
+static void FreeItemIconSpriteByAltId(u8);
+static void PrintItemDescription(s32);
+static void PrintSelectorArrowAtPos(u8, u8);
+static void PrintOnWindow_Font1(u8, const u8 *, u8, u8, u8, u8, u8, u8);
+static void PrintOnWindow_Font7(u8, const u8 *, u8, u8, u8, u8, u8, u8);
+static u8 OpenMenuActionWindowById(u8);
+static void CloseMenuActionWindowById(u8);
+static void PrintMenuActionText_SingleRow(u8);
+static void PrintMenuActionText_MultiRow(u8, u8, u8);
+static bool8 IsValidMenuAction(s8);
+static void CreatePyramidBagYesNo(u8, const struct YesNoFuncTable *);
+static void DrawTossNumberWindow(u8);
+static void UpdateSwapLinePos(u8);
+static void SetSwapLineInvisibility(bool8);
+static void SpriteCB_BagWaitForShake(struct Sprite *);
+static void BagAction_UseOnField(u8);
+static void BagAction_Toss(u8);
+static void BagAction_Give(u8);
+static void BagAction_Cancel(u8);
+static void BagAction_UseInBattle(u8);
+static void BagCursorMoved(s32, bool8, struct ListMenu *);
+static void PrintItemQuantity(u8, s32, u8);
+static void TossItem(u8);
+static void DontTossItem(u8);
+
+static const struct BgTemplate sBgTemplates[] =
{
{
.bg = 0,
@@ -129,14 +141,14 @@ static const struct BgTemplate gUnknown_0861F2B4[] =
},
};
-static const struct ListMenuTemplate gUnknown_0861F2C0 =
+static const struct ListMenuTemplate sListMenuTemplate =
{
.items = NULL,
- .moveCursorFunc = PyramidBagMoveCursorFunc,
+ .moveCursorFunc = BagCursorMoved,
.itemPrintFunc = PrintItemQuantity,
.totalItems = 0,
.maxShowed = 0,
- .windowId = 0,
+ .windowId = WIN_LIST,
.header_X = 0,
.item_X = 8,
.cursor_X = 0,
@@ -151,12 +163,14 @@ static const struct ListMenuTemplate gUnknown_0861F2C0 =
.cursorKind = 0
};
-#define ACTION_USE_FIELD 0
-#define ACTION_TOSS 1
-#define ACTION_GIVE 2
-#define ACTION_CANCEL 3
-#define ACTION_USE_BATTLE 4
-#define ACTION_DUMMY 5
+enum {
+ ACTION_USE_FIELD,
+ ACTION_TOSS,
+ ACTION_GIVE,
+ ACTION_CANCEL,
+ ACTION_USE_BATTLE,
+ ACTION_DUMMY,
+};
static const struct MenuAction sMenuActions[] =
{
@@ -168,26 +182,33 @@ static const struct MenuAction sMenuActions[] =
[ACTION_DUMMY] = { gText_EmptyString2, NULL },
};
-static const u8 sFieldMenuActionIds[] = {ACTION_USE_FIELD, ACTION_GIVE, ACTION_TOSS, ACTION_CANCEL};
-static const u8 gUnknown_0861F30C[] = {ACTION_TOSS, ACTION_CANCEL};
-static const u8 sBattleMenuActionIds[] = {ACTION_USE_BATTLE, ACTION_CANCEL};
-static const u8 gUnknown_0861F310[] = {ACTION_CANCEL};
+static const u8 sMenuActionIds_Field[] = {ACTION_USE_FIELD, ACTION_GIVE, ACTION_TOSS, ACTION_CANCEL};
+static const u8 sMenuActionIds_ChooseToss[] = {ACTION_TOSS, ACTION_CANCEL};
+static const u8 sMenuActionIds_Battle[] = {ACTION_USE_BATTLE, ACTION_CANCEL};
+static const u8 sMenuActionIds_BattleCannotUse[] = {ACTION_CANCEL};
static const struct YesNoFuncTable sYesNoTossFuncions =
{
TossItem, DontTossItem
};
-static const u8 sColorTable[][3] =
+enum {
+ COLORID_DARK_GRAY,
+ COLORID_LIGHT_GRAY,
+ COLORID_WHITE_BG,
+ COLORID_NONE = 0xFF
+};
+
+static const u8 sTextColors[][3] =
{
- {0, 2, 3},
- {0, 3, 1},
- {1, 2, 3},
+ [COLORID_DARK_GRAY] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY},
+ [COLORID_LIGHT_GRAY] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_WHITE},
+ [COLORID_WHITE_BG] = {TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}, // Unused
};
-static const struct WindowTemplate gUnknown_0861F328[] =
+static const struct WindowTemplate sWindowTemplates[] =
{
- {
+ [WIN_LIST] = {
.bg = 0,
.tilemapLeft = 14,
.tilemapTop = 2,
@@ -196,7 +217,7 @@ static const struct WindowTemplate gUnknown_0861F328[] =
.paletteNum = 15,
.baseBlock = 30
},
- {
+ [WIN_INFO] = {
.bg = 0,
.tilemapLeft = 0,
.tilemapTop = 13,
@@ -205,7 +226,7 @@ static const struct WindowTemplate gUnknown_0861F328[] =
.paletteNum = 15,
.baseBlock = 270
},
- {
+ [WIN_MSG] = {
.bg = 1,
.tilemapLeft = 2,
.tilemapTop = 15,
@@ -214,7 +235,7 @@ static const struct WindowTemplate gUnknown_0861F328[] =
.paletteNum = 15,
.baseBlock = 354
},
- {
+ [WIN_TOSS_NUM] = {
.bg = 1,
.tilemapLeft = 24,
.tilemapTop = 17,
@@ -226,9 +247,17 @@ static const struct WindowTemplate gUnknown_0861F328[] =
DUMMY_WIN_TEMPLATE,
};
-static const struct WindowTemplate gUnknown_0861F350[] =
+enum {
+ MENU_WIN_1x1,
+ MENU_WIN_1x2,
+ MENU_WIN_2x2,
+ MENU_WIN_2x3,
+ MENU_WIN_YESNO,
+};
+
+static const struct WindowTemplate sWindowTemplates_MenuActions[] =
{
- {
+ [MENU_WIN_1x1] = {
.bg = 1,
.tilemapLeft = 22,
.tilemapTop = 17,
@@ -237,7 +266,7 @@ static const struct WindowTemplate gUnknown_0861F350[] =
.paletteNum = 15,
.baseBlock = 472
},
- {
+ [MENU_WIN_1x2] = {
.bg = 1,
.tilemapLeft = 22,
.tilemapTop = 15,
@@ -246,7 +275,7 @@ static const struct WindowTemplate gUnknown_0861F350[] =
.paletteNum = 15,
.baseBlock = 472
},
- {
+ [MENU_WIN_2x2] = {
.bg = 1,
.tilemapLeft = 15,
.tilemapTop = 15,
@@ -255,7 +284,7 @@ static const struct WindowTemplate gUnknown_0861F350[] =
.paletteNum = 15,
.baseBlock = 472
},
- {
+ [MENU_WIN_2x3] = { // Unused
.bg = 1,
.tilemapLeft = 15,
.tilemapTop = 13,
@@ -264,7 +293,7 @@ static const struct WindowTemplate gUnknown_0861F350[] =
.paletteNum = 15,
.baseBlock = 472
},
- {
+ [MENU_WIN_YESNO] = {
.bg = 1,
.tilemapLeft = 24,
.tilemapTop = 15,
@@ -275,7 +304,7 @@ static const struct WindowTemplate gUnknown_0861F350[] =
},
};
-static const struct OamData gOamData_861F378 =
+static const struct OamData sOamData_PyramidBag =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_NORMAL,
@@ -292,24 +321,24 @@ static const struct OamData gOamData_861F378 =
.affineParam = 0,
};
-static const union AnimCmd gSpriteAnim_861F380[] =
+static const union AnimCmd sAnim_PyramidBag[] =
{
ANIMCMD_FRAME(0, 4),
ANIMCMD_END,
};
-static const union AnimCmd * const gSpriteAnimTable_861F388[] =
+static const union AnimCmd * const sAnims_PyramidBag[] =
{
- gSpriteAnim_861F380,
+ sAnim_PyramidBag,
};
-static const union AffineAnimCmd gSpriteAffineAnim_861F38C[] =
+static const union AffineAnimCmd sAffineAnim_PyramidBag_Still[] =
{
AFFINEANIMCMD_FRAME(256, 256, 0, 0),
AFFINEANIMCMD_END,
};
-static const union AffineAnimCmd gSpriteAffineAnim_861F39C[] =
+static const union AffineAnimCmd sAffineAnim_PyramidBag_Shake[] =
{
AFFINEANIMCMD_FRAME(0, 0, 254, 2),
AFFINEANIMCMD_FRAME(0, 0, 2, 4),
@@ -318,42 +347,50 @@ static const union AffineAnimCmd gSpriteAffineAnim_861F39C[] =
AFFINEANIMCMD_END,
};
-static const union AffineAnimCmd * const gSpriteAffineAnimTable_861F3C4[] =
+enum {
+ ANIM_BAG_STILL,
+ ANIM_BAG_SHAKE,
+};
+
+static const union AffineAnimCmd * const sAffineAnims_PyramidBag[] =
{
- gSpriteAffineAnim_861F38C,
- gSpriteAffineAnim_861F39C,
+ [ANIM_BAG_STILL] = sAffineAnim_PyramidBag_Still,
+ [ANIM_BAG_SHAKE] = sAffineAnim_PyramidBag_Shake,
};
-static const struct CompressedSpriteSheet gPyramidBagSpriteSheet = {gBattleFrontierGfx_PyramidBag, 0x0800, 0x1024};
+static const struct CompressedSpriteSheet sSpriteSheet_PyramidBag = {gBattleFrontierGfx_PyramidBag, 0x0800, TAG_PYRAMID_BAG};
-static const struct SpriteTemplate gUnknown_0861F3D4 =
+static const struct SpriteTemplate sSpriteTemplate_PyramidBag =
{
- .tileTag = 0x1024,
- .paletteTag = 0x1024,
- .oam = &gOamData_861F378,
- .anims = gSpriteAnimTable_861F388,
+ .tileTag = TAG_PYRAMID_BAG,
+ .paletteTag = TAG_PYRAMID_BAG,
+ .oam = &sOamData_PyramidBag,
+ .anims = sAnims_PyramidBag,
.images = NULL,
- .affineAnims = gSpriteAffineAnimTable_861F3C4,
+ .affineAnims = sAffineAnims_PyramidBag,
.callback = SpriteCallbackDummy
};
-// code
void InitBattlePyramidBagCursorPosition(void)
{
- gPyramidBagCursorData.cursorPosition = 0;
- gPyramidBagCursorData.scrollPosition = 0;
+ gPyramidBagMenuState.cursorPosition = 0;
+ gPyramidBagMenuState.scrollPosition = 0;
}
void CB2_PyramidBagMenuFromStartMenu(void)
{
- GoToBattlePyramidBagMenu(0, CB2_ReturnToFieldWithOpenMenu);
+ GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_FIELD, CB2_ReturnToFieldWithOpenMenu);
}
-static void sub_81C4F10(void)
+// Unused, CB2_BagMenuFromBattle is used instead
+static void OpenBattlePyramidBagInBattle(void)
{
- GoToBattlePyramidBagMenu(1, CB2_SetUpReshowBattleScreenAfterMenu2);
+ GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_BATTLE, CB2_SetUpReshowBattleScreenAfterMenu2);
}
+// If the player finishes a round at the Battle Pyramid with insufficient space in their
+// Pyramid Bag to store the party's held items, they may choose items to toss in order to
+// make room.
void ChooseItemsToTossFromPyramidBag(void)
{
ScriptContext2_Enable();
@@ -367,37 +404,37 @@ static void Task_ChooseItemsToTossFromPyramidBag(u8 taskId)
{
CleanupOverworldWindowsAndTilemaps();
gFieldCallback2 = CB2_FadeFromPartyMenu;
- GoToBattlePyramidBagMenu(3, CB2_ReturnToField);
+ GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_CHOOSE_TOSS, CB2_ReturnToField);
DestroyTask(taskId);
}
}
void CB2_ReturnToPyramidBagMenu(void)
{
- GoToBattlePyramidBagMenu(4, gPyramidBagCursorData.callback);
+ GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_PREV, gPyramidBagMenuState.callback);
}
-void GoToBattlePyramidBagMenu(u8 a0, void (*callback)(void))
+void GoToBattlePyramidBagMenu(u8 location, void (*callback)(void))
{
- gPyramidBagResources = AllocZeroed(sizeof(*gPyramidBagResources));
+ gPyramidBagMenu = AllocZeroed(sizeof(*gPyramidBagMenu));
- if (a0 != 4)
- gPyramidBagCursorData.unk4 = a0;
+ if (location != PYRAMIDBAG_LOC_PREV)
+ gPyramidBagMenuState.location = location;
if (callback != NULL)
- gPyramidBagCursorData.callback = callback;
+ gPyramidBagMenuState.callback = callback;
- gPyramidBagResources->callback2 = NULL;
- gPyramidBagResources->unk814 = 0xFF;
- gPyramidBagResources->scrollIndicatorsTaskId = TASK_NONE;
+ gPyramidBagMenu->exitCallback = NULL;
+ gPyramidBagMenu->toSwapPos = POS_NONE;
+ gPyramidBagMenu->scrollIndicatorsTaskId = TASK_NONE;
- memset(gPyramidBagResources->itemsSpriteIds, 0xFF, sizeof(gPyramidBagResources->itemsSpriteIds));
- memset(gPyramidBagResources->windowIds, WINDOW_NONE, sizeof(gPyramidBagResources->windowIds));
+ memset(gPyramidBagMenu->spriteIds, SPRITE_NONE, sizeof(gPyramidBagMenu->spriteIds));
+ memset(gPyramidBagMenu->windowIds, WINDOW_NONE, sizeof(gPyramidBagMenu->windowIds));
- SetMainCallback2(sub_81C504C);
+ SetMainCallback2(CB2_LoadPyramidBagMenu);
}
-static void sub_81C501C(void)
+static void CB2_PyramidBag(void)
{
RunTasks();
AnimateSprites();
@@ -406,19 +443,21 @@ static void sub_81C501C(void)
UpdatePaletteFade();
}
-static void sub_81C5038(void)
+static void VBlankCB_PyramidBag(void)
{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
}
-static void sub_81C504C(void)
+static void CB2_LoadPyramidBagMenu(void)
{
- while (MenuHelpers_CallLinkSomething() != TRUE && sub_81C5078() != TRUE && MenuHelpers_LinkSomething() != TRUE);
+ while (MenuHelpers_CallLinkSomething() != TRUE
+ && LoadPyramidBagMenu() != TRUE
+ && MenuHelpers_LinkSomething() != TRUE);
}
-static bool8 sub_81C5078(void)
+static bool8 LoadPyramidBagMenu(void)
{
switch (gMain.state)
{
@@ -446,30 +485,26 @@ static bool8 sub_81C5078(void)
break;
case 5:
if (!MenuHelpers_LinkSomething())
- {
ResetTasks();
- }
gMain.state++;
break;
case 6:
- sub_81C51DC();
- gPyramidBagResources->state = 0;
+ InitPyramidBagBgs();
+ gPyramidBagMenu->state = 0;
gMain.state++;
break;
case 7:
- if (sub_81C5238())
- {
+ if (LoadPyramidBagGfx())
gMain.state++;
- }
break;
case 8:
- sub_81C6BD8();
+ InitPyramidBagWindows();
gMain.state++;
break;
case 9:
- sub_81C5924();
- sub_81C59BC();
- sub_81C5A20();
+ UpdatePyramidBagList();
+ UpdatePyramidBagCursorPos();
+ InitPyramidBagScroll();
gMain.state++;
break;
case 10:
@@ -477,15 +512,15 @@ static bool8 sub_81C5078(void)
gMain.state++;
break;
case 11:
- sub_81C56F8();
+ CreatePyramidBagInputTask();
gMain.state++;
break;
case 12:
- sub_81C6EF4();
+ CreatePyramidBagSprite();
gMain.state++;
break;
case 13:
- AddScrollArrow();
+ AddScrollArrows();
gMain.state++;
break;
case 14:
@@ -493,28 +528,28 @@ static bool8 sub_81C5078(void)
gMain.state++;
break;
case 15:
- BlendPalettes(PALETTES_ALL, 0x10, 0);
+ BlendPalettes(PALETTES_ALL, 16, 0);
gMain.state++;
break;
case 16:
- BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK);
+ BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);
gPaletteFade.bufferTransferDisabled = FALSE;
gMain.state++;
break;
default:
- SetVBlankCallback(sub_81C5038);
- SetMainCallback2(sub_81C501C);
+ SetVBlankCallback(VBlankCB_PyramidBag);
+ SetMainCallback2(CB2_PyramidBag);
return TRUE;
}
return FALSE;
}
-static void sub_81C51DC(void)
+static void InitPyramidBagBgs(void)
{
ResetVramOamAndBgCntRegs();
ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, gUnknown_0861F2B4, ARRAY_COUNT(gUnknown_0861F2B4));
- SetBgTilemapBuffer(2, gPyramidBagResources->tilemapBuffer);
+ InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));
+ SetBgTilemapBuffer(2, gPyramidBagMenu->tilemapBuffer);
ResetAllBgsCoordinates();
ScheduleBgCopyTilemapToVram(2);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
@@ -526,37 +561,37 @@ static void sub_81C51DC(void)
SetGpuReg(REG_OFFSET_BLDCNT, 0);
}
-static bool8 sub_81C5238(void)
+static bool8 LoadPyramidBagGfx(void)
{
- switch (gPyramidBagResources->state)
+ switch (gPyramidBagMenu->state)
{
case 0:
ResetTempTileDataBuffers();
DecompressAndCopyTileDataToVram(2, gBagScreen_Gfx, 0, 0, 0);
- gPyramidBagResources->state++;
+ gPyramidBagMenu->state++;
break;
case 1:
if (FreeTempTileDataBuffersIfPossible() != TRUE)
{
- LZDecompressWram(gBattleFrontierGfx_PyramidBagTileMap, gPyramidBagResources->tilemapBuffer);
- gPyramidBagResources->state++;
+ LZDecompressWram(gBattleFrontierGfx_PyramidBagTileMap, gPyramidBagMenu->tilemapBuffer);
+ gPyramidBagMenu->state++;
}
break;
case 2:
- LoadCompressedPalette(gUnknown_08D9AF44, 0, 0x20);
- gPyramidBagResources->state++;
+ LoadCompressedPalette(gUnknown_08D9AF44, 0, 32);
+ gPyramidBagMenu->state++;
break;
case 3:
- LoadCompressedSpriteSheet(&gPyramidBagSpriteSheet);
- gPyramidBagResources->state++;
+ LoadCompressedSpriteSheet(&sSpriteSheet_PyramidBag);
+ gPyramidBagMenu->state++;
break;
case 4:
- sub_81C6E98();
- gPyramidBagResources->state++;
+ LoadPyramidBagPalette();
+ gPyramidBagMenu->state++;
break;
default:
LoadListMenuSwapLineGfx();
- gPyramidBagResources->state = 0;
+ gPyramidBagMenu->state = 0;
return TRUE;
}
@@ -566,24 +601,24 @@ static bool8 sub_81C5238(void)
static void SetBagItemsListTemplate(void)
{
u16 i;
- u16 *pyramidItems = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode];
+ u16 *itemIds = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode];
- for (i = 0; i < gPyramidBagResources->listMenuCount - 1; i++)
+ for (i = 0; i < gPyramidBagMenu->listMenuCount - 1; i++)
{
- PyramidBag_CopyItemName(gPyramidBagResources->itemStrings[i], pyramidItems[i]);
- gPyramidBagResources->bagListItems[i].name = gPyramidBagResources->itemStrings[i];
- gPyramidBagResources->bagListItems[i].id = i;
+ CopyBagItemName(gPyramidBagMenu->itemStrings[i], itemIds[i]);
+ gPyramidBagMenu->bagListItems[i].name = gPyramidBagMenu->itemStrings[i];
+ gPyramidBagMenu->bagListItems[i].id = i;
}
- StringCopy(gPyramidBagResources->itemStrings[i], gText_CloseBag);
- gPyramidBagResources->bagListItems[i].name = gPyramidBagResources->itemStrings[i];
- gPyramidBagResources->bagListItems[i].id = LIST_CANCEL;
- gMultiuseListMenuTemplate = gUnknown_0861F2C0;
- gMultiuseListMenuTemplate.totalItems = gPyramidBagResources->listMenuCount;
- gMultiuseListMenuTemplate.items = gPyramidBagResources->bagListItems;
- gMultiuseListMenuTemplate.maxShowed = gPyramidBagResources->listMenuMaxShown;
+ StringCopy(gPyramidBagMenu->itemStrings[i], gText_CloseBag);
+ gPyramidBagMenu->bagListItems[i].name = gPyramidBagMenu->itemStrings[i];
+ gPyramidBagMenu->bagListItems[i].id = LIST_CANCEL;
+ gMultiuseListMenuTemplate = sListMenuTemplate;
+ gMultiuseListMenuTemplate.totalItems = gPyramidBagMenu->listMenuCount;
+ gMultiuseListMenuTemplate.items = gPyramidBagMenu->bagListItems;
+ gMultiuseListMenuTemplate.maxShowed = gPyramidBagMenu->listMenuMaxShown;
}
-static void PyramidBag_CopyItemName(u8 *dst, u16 itemId)
+static void CopyBagItemName(u8 *dst, u16 itemId)
{
if (ItemId_GetPocket(itemId) == POCKET_BERRIES)
{
@@ -597,21 +632,21 @@ static void PyramidBag_CopyItemName(u8 *dst, u16 itemId)
}
}
-static void PyramidBagMoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list)
+static void BagCursorMoved(s32 itemIndex, bool8 onInit, struct ListMenu *list)
{
if (onInit != TRUE)
{
PlaySE(SE_SELECT);
- sub_81C6F20();
+ ShakePyramidBag();
}
- if (gPyramidBagResources->unk814 == 0xFF)
+ if (gPyramidBagMenu->toSwapPos == POS_NONE)
{
- sub_81C6FF8(gPyramidBagResources->unk815 ^ 1);
+ FreeItemIconSpriteByAltId(gPyramidBagMenu->isAltIcon ^ 1);
if (itemIndex != LIST_CANCEL)
- ShowItemImage(gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode][itemIndex], gPyramidBagResources->unk815);
+ ShowItemIcon(gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode][itemIndex], gPyramidBagMenu->isAltIcon);
else
- ShowItemImage(0xFFFF, gPyramidBagResources->unk815);
- gPyramidBagResources->unk815 ^= 1;
+ ShowItemIcon(0xFFFF, gPyramidBagMenu->isAltIcon); // Show exit arrow if on Cancel
+ gPyramidBagMenu->isAltIcon ^= 1;
PrintItemDescription(itemIndex);
}
}
@@ -622,20 +657,23 @@ static void PrintItemQuantity(u8 windowId, s32 itemIndex, u8 y)
if (itemIndex == LIST_CANCEL)
return;
- if (gPyramidBagResources->unk814 != 0xFF)
+ if (gPyramidBagMenu->toSwapPos != POS_NONE)
{
- if (gPyramidBagResources->unk814 == (u8)(itemIndex))
- sub_81C5AB8(y, 1);
+ // Performing a swap. Keep a gray selector arrow on the position to swap to
+ // and erase the selector arrow anywhere else
+ if (gPyramidBagMenu->toSwapPos == (u8)(itemIndex))
+ PrintSelectorArrowAtPos(y, COLORID_LIGHT_GRAY);
else
- sub_81C5AB8(y, 0xFF);
+ PrintSelectorArrowAtPos(y, COLORID_NONE);
}
+
ConvertIntToDecimalStringN(gStringVar1,
gSaveBlock2Ptr->frontier.pyramidBag.quantity[gSaveBlock2Ptr->frontier.lvlMode][itemIndex],
STR_CONV_MODE_RIGHT_ALIGN,
2);
StringExpandPlaceholders(gStringVar4, gText_xVar1);
- xAlign = GetStringRightAlignXOffset(7, gStringVar4, 0x77);
- PrintOnWindow_Font7(windowId, gStringVar4, xAlign, y, 0, 0, TEXT_SPEED_FF, 0);
+ xAlign = GetStringRightAlignXOffset(7, gStringVar4, 119);
+ PrintOnWindow_Font7(windowId, gStringVar4, xAlign, y, 0, 0, TEXT_SPEED_FF, COLORID_DARK_GRAY);
}
static void PrintItemDescription(s32 listMenuId)
@@ -647,34 +685,42 @@ static void PrintItemDescription(s32 listMenuId)
}
else
{
- StringCopy(gStringVar1, gReturnToXStringsTable2[gPyramidBagCursorData.unk4]);
+ StringCopy(gStringVar1, gPyramidBagMenu_ReturnToStrings[gPyramidBagMenuState.location]);
StringExpandPlaceholders(gStringVar4, gText_ReturnToVar1);
desc = gStringVar4;
}
- FillWindowPixelBuffer(1, PIXEL_FILL(0));
- PrintOnWindow_Font1(1, desc, 3, 0, 0, 1, 0, 0);
+ FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0));
+ PrintOnWindow_Font1(WIN_INFO, desc, 3, 0, 0, 1, 0, COLORID_DARK_GRAY);
}
-static void AddScrollArrow(void)
+static void AddScrollArrows(void)
{
- if (gPyramidBagResources->scrollIndicatorsTaskId == TASK_NONE)
- gPyramidBagResources->scrollIndicatorsTaskId = AddScrollIndicatorArrowPairParameterized(2, 172, 12, 148, gPyramidBagResources->listMenuCount - gPyramidBagResources->listMenuMaxShown, 0xB5E, 0xB5E, &gPyramidBagCursorData.scrollPosition);
+ if (gPyramidBagMenu->scrollIndicatorsTaskId == TASK_NONE)
+ gPyramidBagMenu->scrollIndicatorsTaskId = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 172, 12, 148,
+ gPyramidBagMenu->listMenuCount - gPyramidBagMenu->listMenuMaxShown,
+ TAG_SCROLL_ARROW, TAG_SCROLL_ARROW,
+ &gPyramidBagMenuState.scrollPosition);
}
static void RemoveScrollArrow(void)
{
- if (gPyramidBagResources->scrollIndicatorsTaskId != TASK_NONE)
+ if (gPyramidBagMenu->scrollIndicatorsTaskId != TASK_NONE)
{
- RemoveScrollIndicatorArrowPair(gPyramidBagResources->scrollIndicatorsTaskId);
- gPyramidBagResources->scrollIndicatorsTaskId = TASK_NONE;
+ RemoveScrollIndicatorArrowPair(gPyramidBagMenu->scrollIndicatorsTaskId);
+ gPyramidBagMenu->scrollIndicatorsTaskId = TASK_NONE;
}
}
-static void sub_81C56F8(void)
+#define tListTaskId data[0]
+#define tListPos data[1]
+#define tQuantity data[2]
+#define tNumToToss data[8]
+
+static void CreatePyramidBagInputTask(void)
{
u8 taskId = CreateTask(Task_HandlePyramidBagInput, 0);
s16 *data = gTasks[taskId].data;
- data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gPyramidBagCursorData.scrollPosition, gPyramidBagCursorData.cursorPosition);
+ tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, gPyramidBagMenuState.scrollPosition, gPyramidBagMenuState.cursorPosition);
}
static void SwapItems(u8 id1, u8 id2)
@@ -728,9 +774,9 @@ static void CompactItems(void)
for (i = 0; i < PYRAMID_BAG_ITEMS_COUNT; i++)
{
- if (itemIds[i] == 0 || quantities[i] == 0)
+ if (itemIds[i] == ITEM_NONE || quantities[i] == 0)
{
- itemIds[i] = 0;
+ itemIds[i] = ITEM_NONE;
quantities[i] = 0;
}
}
@@ -738,98 +784,97 @@ static void CompactItems(void)
{
for (j = i + 1; j < PYRAMID_BAG_ITEMS_COUNT; j++)
{
- if (itemIds[i] == 0 || quantities[i] == 0)
+ if (itemIds[i] == ITEM_NONE || quantities[i] == 0)
SwapItems(i, j);
}
}
}
-void sub_81C5924(void)
+void UpdatePyramidBagList(void)
{
u16 i;
u16 *itemIds = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode];
CompactItems();
- gPyramidBagResources->listMenuCount = 0;
+ gPyramidBagMenu->listMenuCount = 0;
for (i = 0; i < PYRAMID_BAG_ITEMS_COUNT; i++)
{
- if (itemIds[i] != 0)
- gPyramidBagResources->listMenuCount++;
+ if (itemIds[i] != ITEM_NONE)
+ gPyramidBagMenu->listMenuCount++;
}
- gPyramidBagResources->listMenuCount++;
- if (gPyramidBagResources->listMenuCount > 8)
- gPyramidBagResources->listMenuMaxShown = 8;
+ gPyramidBagMenu->listMenuCount++;
+ if (gPyramidBagMenu->listMenuCount > 8)
+ gPyramidBagMenu->listMenuMaxShown = 8;
else
- gPyramidBagResources->listMenuMaxShown = gPyramidBagResources->listMenuCount;
+ gPyramidBagMenu->listMenuMaxShown = gPyramidBagMenu->listMenuCount;
}
-void sub_81C59BC(void)
+void UpdatePyramidBagCursorPos(void)
{
- if (gPyramidBagCursorData.scrollPosition != 0 && gPyramidBagCursorData.scrollPosition + gPyramidBagResources->listMenuMaxShown > gPyramidBagResources->listMenuCount)
- gPyramidBagCursorData.scrollPosition = gPyramidBagResources->listMenuCount - gPyramidBagResources->listMenuMaxShown;
- if (gPyramidBagCursorData.scrollPosition + gPyramidBagCursorData.cursorPosition >= gPyramidBagResources->listMenuCount)
+ if (gPyramidBagMenuState.scrollPosition != 0 && gPyramidBagMenuState.scrollPosition + gPyramidBagMenu->listMenuMaxShown > gPyramidBagMenu->listMenuCount)
+ gPyramidBagMenuState.scrollPosition = gPyramidBagMenu->listMenuCount - gPyramidBagMenu->listMenuMaxShown;
+
+ if (gPyramidBagMenuState.scrollPosition + gPyramidBagMenuState.cursorPosition >= gPyramidBagMenu->listMenuCount)
{
- if (gPyramidBagResources->listMenuCount == 0)
- gPyramidBagCursorData.cursorPosition = 0;
+ if (gPyramidBagMenu->listMenuCount == 0)
+ gPyramidBagMenuState.cursorPosition = 0;
else
- gPyramidBagCursorData.cursorPosition = gPyramidBagResources->listMenuCount - 1;
+ gPyramidBagMenuState.cursorPosition = gPyramidBagMenu->listMenuCount - 1;
}
}
-static void sub_81C5A20(void)
+static void InitPyramidBagScroll(void)
{
u8 i;
- if (gPyramidBagCursorData.cursorPosition > 4)
+ if (gPyramidBagMenuState.cursorPosition > 4)
{
- for (i = 0; i <= gPyramidBagCursorData.cursorPosition - 4; i++)
+ for (i = 0; i <= gPyramidBagMenuState.cursorPosition - 4; i++)
{
- if (gPyramidBagCursorData.scrollPosition + gPyramidBagResources->listMenuMaxShown == gPyramidBagResources->listMenuCount)
- {
- // daycare.c sends its regards.
+ if (gPyramidBagMenuState.scrollPosition + gPyramidBagMenu->listMenuMaxShown == gPyramidBagMenu->listMenuCount)
break;
- }
- gPyramidBagCursorData.cursorPosition--;
- gPyramidBagCursorData.scrollPosition++;
+
+ gPyramidBagMenuState.cursorPosition--;
+ gPyramidBagMenuState.scrollPosition++;
}
}
}
-static void sub_81C5A98(u8 listMenuTaskId, u8 arg1)
+static void PrintSelectorArrow(u8 listMenuTaskId, u8 colorId)
{
u8 y = ListMenuGetYCoordForPrintingArrowCursor(listMenuTaskId);
- sub_81C5AB8(y, arg1);
+ PrintSelectorArrowAtPos(y, colorId);
}
-static void sub_81C5AB8(u8 y, u8 arg1)
+static void PrintSelectorArrowAtPos(u8 y, u8 colorId)
{
- if (arg1 == 0xFF)
- FillWindowPixelRect(0, PIXEL_FILL(0), 0, y, GetMenuCursorDimensionByFont(1, 0), GetMenuCursorDimensionByFont(1, 1));
+ if (colorId == COLORID_NONE) // If 'no color', erase arrow
+ FillWindowPixelRect(WIN_LIST, PIXEL_FILL(0), 0, y, GetMenuCursorDimensionByFont(1, 0), GetMenuCursorDimensionByFont(1, 1));
else
- PrintOnWindow_Font1(0, gText_SelectorArrow2, 0, y, 0, 0, 0, arg1);
+ PrintOnWindow_Font1(WIN_LIST, gText_SelectorArrow2, 0, y, 0, 0, 0, colorId);
}
-void CloseBattlePyramidBagAndSetCallback(u8 taskId)
+void CloseBattlePyramidBag(u8 taskId)
{
- BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);
- gTasks[taskId].func = sub_81C5B4C;
+ BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
+ gTasks[taskId].func = Task_ClosePyramidBag;
}
-static void sub_81C5B4C(u8 taskId)
+static void Task_ClosePyramidBag(u8 taskId)
{
s16 *data = gTasks[taskId].data;
if (!gPaletteFade.active)
{
- DestroyListMenuTask(data[0], &gPyramidBagCursorData.scrollPosition, &gPyramidBagCursorData.cursorPosition);
- if (gPyramidBagResources->callback2 != NULL)
- SetMainCallback2(gPyramidBagResources->callback2);
+ DestroyListMenuTask(tListTaskId, &gPyramidBagMenuState.scrollPosition, &gPyramidBagMenuState.cursorPosition);
+ if (gPyramidBagMenu->exitCallback != NULL)
+ SetMainCallback2(gPyramidBagMenu->exitCallback);
else
- SetMainCallback2(gPyramidBagCursorData.callback);
+ SetMainCallback2(gPyramidBagMenuState.callback);
RemoveScrollArrow();
ResetSpriteData();
FreeAllSpritePalettes();
FreeAllWindowBuffers();
- Free(gPyramidBagResources);
+ Free(gPyramidBagMenu);
DestroyTask(taskId);
}
}
@@ -837,108 +882,110 @@ static void sub_81C5B4C(u8 taskId)
static void Task_HandlePyramidBagInput(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- if (MenuHelpers_CallLinkSomething() != TRUE && !gPaletteFade.active)
+ if (MenuHelpers_CallLinkSomething() == TRUE || gPaletteFade.active)
+ return;
+
+ if (JOY_NEW(SELECT_BUTTON))
{
- if (JOY_NEW(SELECT_BUTTON))
+ if (gPyramidBagMenuState.location != PYRAMIDBAG_LOC_PARTY)
{
- if (gPyramidBagCursorData.unk4 != 2)
+ ListMenuGetScrollAndRow(tListTaskId, &gPyramidBagMenuState.scrollPosition, &gPyramidBagMenuState.cursorPosition);
+ if (gPyramidBagMenuState.scrollPosition + gPyramidBagMenuState.cursorPosition != gPyramidBagMenu->listMenuCount - 1)
{
- ListMenuGetScrollAndRow(data[0], &gPyramidBagCursorData.scrollPosition, &gPyramidBagCursorData.cursorPosition);
- if (gPyramidBagCursorData.scrollPosition + gPyramidBagCursorData.cursorPosition != gPyramidBagResources->listMenuCount - 1)
- {
- PlaySE(SE_SELECT);
- Task_BeginItemSwap(taskId);
- }
+ PlaySE(SE_SELECT);
+ Task_BeginItemSwap(taskId);
}
}
- else
+ }
+ else
+ {
+ s32 listId = ListMenu_ProcessInput(tListTaskId);
+ ListMenuGetScrollAndRow(tListTaskId, &gPyramidBagMenuState.scrollPosition, &gPyramidBagMenuState.cursorPosition);
+ switch (listId)
{
- s32 listId = ListMenu_ProcessInput(data[0]);
- ListMenuGetScrollAndRow(data[0], &gPyramidBagCursorData.scrollPosition, &gPyramidBagCursorData.cursorPosition);
- switch (listId)
- {
- case LIST_NOTHING_CHOSEN:
- break;
- case LIST_CANCEL:
- PlaySE(SE_SELECT);
- gSpecialVar_ItemId = 0;
- CloseBattlePyramidBagAndSetCallback(taskId);
- break;
- default:
- PlaySE(SE_SELECT);
- gSpecialVar_ItemId = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode][listId];
- data[1] = listId;
- data[2] = gSaveBlock2Ptr->frontier.pyramidBag.quantity[gSaveBlock2Ptr->frontier.lvlMode][listId];
- if (gPyramidBagCursorData.unk4 == 2)
- sub_81C674C(taskId);
- else
- sub_81C5D20(taskId);
- break;
- }
+ case LIST_NOTHING_CHOSEN:
+ break;
+ case LIST_CANCEL:
+ PlaySE(SE_SELECT);
+ gSpecialVar_ItemId = ITEM_NONE;
+ CloseBattlePyramidBag(taskId);
+ break;
+ default:
+ PlaySE(SE_SELECT);
+ gSpecialVar_ItemId = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode][listId];
+ tListPos = listId;
+ tQuantity = gSaveBlock2Ptr->frontier.pyramidBag.quantity[gSaveBlock2Ptr->frontier.lvlMode][listId];
+ if (gPyramidBagMenuState.location == PYRAMIDBAG_LOC_PARTY)
+ TryCloseBagToGiveItem(taskId);
+ else
+ OpenContextMenu(taskId);
+ break;
}
}
}
-static void sub_81C5D20(u8 taskId)
+static void OpenContextMenu(u8 taskId)
{
s16 *data = gTasks[taskId].data;
RemoveScrollArrow();
- sub_81C5A98(data[0], 1);
- switch (gPyramidBagCursorData.unk4)
+ PrintSelectorArrow(tListTaskId, COLORID_LIGHT_GRAY);
+ switch (gPyramidBagMenuState.location)
{
default:
- gPyramidBagResources->menuActionIds = sFieldMenuActionIds;
- gPyramidBagResources->menuActionsCount = ARRAY_COUNT(sFieldMenuActionIds);
+// case PYRAMIDBAG_LOC_FIELD:
+// case PYRAMIDBAG_LOC_PARTY:
+ gPyramidBagMenu->menuActionIds = sMenuActionIds_Field;
+ gPyramidBagMenu->menuActionsCount = ARRAY_COUNT(sMenuActionIds_Field);
break;
- case 1:
+ case PYRAMIDBAG_LOC_BATTLE:
if (ItemId_GetBattleUsage(gSpecialVar_ItemId))
{
- gPyramidBagResources->menuActionIds = sBattleMenuActionIds;
- gPyramidBagResources->menuActionsCount = ARRAY_COUNT(sBattleMenuActionIds);
+ gPyramidBagMenu->menuActionIds = sMenuActionIds_Battle;
+ gPyramidBagMenu->menuActionsCount = ARRAY_COUNT(sMenuActionIds_Battle);
}
else
{
- gPyramidBagResources->menuActionIds = gUnknown_0861F310;
- gPyramidBagResources->menuActionsCount = ARRAY_COUNT(gUnknown_0861F310);
+ gPyramidBagMenu->menuActionIds = sMenuActionIds_BattleCannotUse;
+ gPyramidBagMenu->menuActionsCount = ARRAY_COUNT(sMenuActionIds_BattleCannotUse);
}
break;
- case 3:
- gPyramidBagResources->menuActionIds = gUnknown_0861F30C;
- gPyramidBagResources->menuActionsCount = ARRAY_COUNT(gUnknown_0861F30C);
+ case PYRAMIDBAG_LOC_CHOOSE_TOSS:
+ gPyramidBagMenu->menuActionIds = sMenuActionIds_ChooseToss;
+ gPyramidBagMenu->menuActionsCount = ARRAY_COUNT(sMenuActionIds_ChooseToss);
break;
}
CopyItemName(gSpecialVar_ItemId, gStringVar1);
StringExpandPlaceholders(gStringVar4, gText_Var1IsSelected);
- FillWindowPixelBuffer(1, PIXEL_FILL(0));
- PrintOnWindow_Font1(1, gStringVar4, 3, 0, 0, 1, 0, 0);
- if (gPyramidBagResources->menuActionsCount == 1)
- sub_81C5EAC(sub_81C6D24(0));
- else if (gPyramidBagResources->menuActionsCount == 2)
- sub_81C5EAC(sub_81C6D24(1));
+ FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0));
+ PrintOnWindow_Font1(WIN_INFO, gStringVar4, 3, 0, 0, 1, 0, COLORID_DARK_GRAY);
+ if (gPyramidBagMenu->menuActionsCount == 1)
+ PrintMenuActionText_SingleRow(OpenMenuActionWindowById(MENU_WIN_1x1));
+ else if (gPyramidBagMenu->menuActionsCount == 2)
+ PrintMenuActionText_SingleRow(OpenMenuActionWindowById(MENU_WIN_1x2));
else
- sub_81C5F08(sub_81C6D24(2), 2, 2);
+ PrintMenuActionText_MultiRow(OpenMenuActionWindowById(MENU_WIN_2x2), 2, 2);
- if (gPyramidBagResources->menuActionsCount == 4)
- gTasks[taskId].func = HandleMenuActionInput;
+ if (gPyramidBagMenu->menuActionsCount == 2 * 2) // Assumes any non 2x2 menu is single-row
+ gTasks[taskId].func = HandleMenuActionInput_2x2;
else
- gTasks[taskId].func = HandleFewMenuActionsInput;
+ gTasks[taskId].func = HandleMenuActionInput_SingleRow;
}
-static void sub_81C5EAC(u8 windowId)
+static void PrintMenuActionText_SingleRow(u8 windowId)
{
- AddItemMenuActionTextPrinters(windowId, 7, 8, 1, 0, 0x10, gPyramidBagResources->menuActionsCount, sMenuActions, gPyramidBagResources->menuActionIds);
- InitMenuInUpperLeftCornerPlaySoundWhenAPressed(windowId, gPyramidBagResources->menuActionsCount, 0);
+ AddItemMenuActionTextPrinters(windowId, 7, 8, 1, 0, 0x10, gPyramidBagMenu->menuActionsCount, sMenuActions, gPyramidBagMenu->menuActionIds);
+ InitMenuInUpperLeftCornerPlaySoundWhenAPressed(windowId, gPyramidBagMenu->menuActionsCount, 0);
}
-static void sub_81C5F08(u8 windowId, u8 horizontalCount, u8 verticalCount)
+static void PrintMenuActionText_MultiRow(u8 windowId, u8 horizontalCount, u8 verticalCount)
{
- sub_8198DBC(windowId, 7, 8, 1, 0x38, horizontalCount, verticalCount, sMenuActions, gPyramidBagResources->menuActionIds);
- sub_8199944(windowId, 0x38, horizontalCount, verticalCount, 0);
+ PrintMenuActionGrid(windowId, 7, 8, 1, 56, horizontalCount, verticalCount, sMenuActions, gPyramidBagMenu->menuActionIds);
+ InitMenuActionGrid(windowId, 56, horizontalCount, verticalCount, 0);
}
-static void HandleFewMenuActionsInput(u8 taskId)
+static void HandleMenuActionInput_SingleRow(u8 taskId)
{
if (MenuHelpers_CallLinkSomething() != TRUE)
{
@@ -953,14 +1000,14 @@ static void HandleFewMenuActionsInput(u8 taskId)
break;
default:
PlaySE(SE_SELECT);
- if (sMenuActions[gPyramidBagResources->menuActionIds[id]].func.void_u8 != NULL)
- sMenuActions[gPyramidBagResources->menuActionIds[id]].func.void_u8(taskId);
+ if (sMenuActions[gPyramidBagMenu->menuActionIds[id]].func.void_u8 != NULL)
+ sMenuActions[gPyramidBagMenu->menuActionIds[id]].func.void_u8(taskId);
break;
}
}
}
-static void HandleMenuActionInput(u8 taskId)
+static void HandleMenuActionInput_2x2(u8 taskId)
{
if (MenuHelpers_CallLinkSomething() != TRUE)
{
@@ -975,7 +1022,7 @@ static void HandleMenuActionInput(u8 taskId)
}
else if (JOY_NEW(DPAD_DOWN))
{
- if (id < gPyramidBagResources->menuActionsCount - 2 && IsValidMenuAction(id + 2))
+ if (id < gPyramidBagMenu->menuActionsCount - 2 && IsValidMenuAction(id + 2))
{
PlaySE(SE_SELECT);
ChangeListMenuCursorPosition(MENU_CURSOR_DELTA_NONE, MENU_CURSOR_DELTA_DOWN);
@@ -1000,8 +1047,8 @@ static void HandleMenuActionInput(u8 taskId)
else if (JOY_NEW(A_BUTTON))
{
PlaySE(SE_SELECT);
- if (sMenuActions[gPyramidBagResources->menuActionIds[id]].func.void_u8 != NULL)
- sMenuActions[gPyramidBagResources->menuActionIds[id]].func.void_u8(taskId);
+ if (sMenuActions[gPyramidBagMenu->menuActionIds[id]].func.void_u8 != NULL)
+ sMenuActions[gPyramidBagMenu->menuActionIds[id]].func.void_u8(taskId);
}
else if (JOY_NEW(B_BUTTON))
{
@@ -1015,22 +1062,22 @@ static bool8 IsValidMenuAction(s8 actionTableId)
{
if (actionTableId < 0)
return FALSE;
- else if (actionTableId > gPyramidBagResources->menuActionsCount)
+ else if (actionTableId > gPyramidBagMenu->menuActionsCount)
return FALSE;
- else if (gPyramidBagResources->menuActionIds[actionTableId] == ACTION_DUMMY)
+ else if (gPyramidBagMenu->menuActionIds[actionTableId] == ACTION_DUMMY)
return FALSE;
else
return TRUE;
}
-static void sub_81C61A8(void)
+static void CloseMenuActionWindow(void)
{
- if (gPyramidBagResources->menuActionsCount == 1)
- sub_81C6D6C(0);
- else if (gPyramidBagResources->menuActionsCount == 2)
- sub_81C6D6C(1);
+ if (gPyramidBagMenu->menuActionsCount == 1)
+ CloseMenuActionWindowById(MENU_WIN_1x1);
+ else if (gPyramidBagMenu->menuActionsCount == 2)
+ CloseMenuActionWindowById(MENU_WIN_1x2);
else
- sub_81C6D6C(2);
+ CloseMenuActionWindowById(MENU_WIN_2x2);
}
static void BagAction_UseOnField(u8 taskId)
@@ -1042,13 +1089,13 @@ static void BagAction_UseOnField(u8 taskId)
|| pocketId == POCKET_TM_HM
|| ItemIsMail(gSpecialVar_ItemId) == TRUE)
{
- sub_81C61A8();
+ CloseMenuActionWindow();
DisplayItemMessageInBattlePyramid(taskId, gText_DadsAdvice, Task_CloseBattlePyramidBagMessage);
}
else if (ItemId_GetFieldFunc(gSpecialVar_ItemId) != NULL)
{
- sub_81C61A8();
- FillWindowPixelBuffer(1, PIXEL_FILL(0));
+ CloseMenuActionWindow();
+ FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0));
ScheduleBgCopyTilemapToVram(0);
ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId);
}
@@ -1058,17 +1105,17 @@ static void BagAction_Cancel(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- sub_81C61A8();
- PrintItemDescription(data[1]);
+ CloseMenuActionWindow();
+ PrintItemDescription(tListPos);
ScheduleBgCopyTilemapToVram(0);
ScheduleBgCopyTilemapToVram(1);
- sub_81C5A98(data[0], 0);
+ PrintSelectorArrow(tListTaskId, COLORID_DARK_GRAY);
SetTaskToMainPyramidBagInputHandler(taskId);
}
static void SetTaskToMainPyramidBagInputHandler(u8 taskId)
{
- AddScrollArrow();
+ AddScrollArrows();
gTasks[taskId].func = Task_HandlePyramidBagInput;
}
@@ -1076,86 +1123,86 @@ static void BagAction_Toss(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- sub_81C61A8();
- data[8] = 1;
- if (data[2] == 1)
+ CloseMenuActionWindow();
+ tNumToToss = 1;
+ if (tQuantity == 1)
{
- sub_81C6350(taskId);
+ AskConfirmToss(taskId);
}
else
{
CopyItemName(gSpecialVar_ItemId, gStringVar1);
StringExpandPlaceholders(gStringVar4, gText_TossHowManyVar1s);
- FillWindowPixelBuffer(1, PIXEL_FILL(0));
- PrintOnWindow_Font1(1, gStringVar4, 3, 0, 0, 1, 0, 0);
- sub_81C6404();
- gTasks[taskId].func = sub_81C64B4;
+ FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0));
+ PrintOnWindow_Font1(WIN_INFO, gStringVar4, 3, 0, 0, 1, 0, COLORID_DARK_GRAY);
+ ShowNumToToss();
+ gTasks[taskId].func = Task_ChooseHowManyToToss;
}
}
-static void sub_81C6350(u8 taskId)
+static void AskConfirmToss(u8 taskId)
{
s16 *data = gTasks[taskId].data;
CopyItemName(gSpecialVar_ItemId, gStringVar1);
- ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 2);
+ ConvertIntToDecimalStringN(gStringVar2, tNumToToss, STR_CONV_MODE_LEFT_ALIGN, 2);
StringExpandPlaceholders(gStringVar4, gText_ConfirmTossItems);
- FillWindowPixelBuffer(1, PIXEL_FILL(0));
- PrintOnWindow_Font1(1, gStringVar4, 3, 0, 0, 1, 0, 0);
- sub_81C6DAC(taskId, &sYesNoTossFuncions);
+ FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0));
+ PrintOnWindow_Font1(WIN_INFO, gStringVar4, 3, 0, 0, 1, 0, COLORID_DARK_GRAY);
+ CreatePyramidBagYesNo(taskId, &sYesNoTossFuncions);
}
static void DontTossItem(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- PrintItemDescription(data[1]);
- sub_81C5A98(data[0], 0);
+ PrintItemDescription(tListPos);
+ PrintSelectorArrow(tListTaskId, COLORID_DARK_GRAY);
SetTaskToMainPyramidBagInputHandler(taskId);
}
-static void sub_81C6404(void)
+static void ShowNumToToss(void)
{
s32 x;
-
ConvertIntToDecimalStringN(gStringVar1, 1, STR_CONV_MODE_LEADING_ZEROS, 2);
StringExpandPlaceholders(gStringVar4, gText_xVar1);
- sub_81C6CEC(3);
+ DrawTossNumberWindow(WIN_TOSS_NUM);
x = GetStringCenterAlignXOffset(1, gStringVar4, 0x28);
- AddTextPrinterParameterized(3, 1, gStringVar4, x, 2, 0, NULL);
+ AddTextPrinterParameterized(WIN_TOSS_NUM, 1, gStringVar4, x, 2, 0, NULL);
}
-static void sub_81C645C(s16 value)
+static void UpdateNumToToss(s16 num)
{
s32 x;
-
- ConvertIntToDecimalStringN(gStringVar1, value, STR_CONV_MODE_LEADING_ZEROS, 2);
+ ConvertIntToDecimalStringN(gStringVar1, num, STR_CONV_MODE_LEADING_ZEROS, 2);
StringExpandPlaceholders(gStringVar4, gText_xVar1);
x = GetStringCenterAlignXOffset(1, gStringVar4, 0x28);
- AddTextPrinterParameterized(3, 1, gStringVar4, x, 2, 0, NULL);
+ AddTextPrinterParameterized(WIN_TOSS_NUM, 1, gStringVar4, x, 2, 0, NULL);
}
-static void sub_81C64B4(u8 taskId)
+static void Task_ChooseHowManyToToss(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE)
+ if (AdjustQuantityAccordingToDPadInput(&tNumToToss, tQuantity) == TRUE)
{
- sub_81C645C(data[8]);
+ UpdateNumToToss(tNumToToss);
}
else if (JOY_NEW(A_BUTTON))
{
+ // Toss
PlaySE(SE_SELECT);
- ClearStdWindowAndFrameToTransparent(3, 0);
- ClearWindowTilemap(3);
+ ClearStdWindowAndFrameToTransparent(WIN_TOSS_NUM, 0);
+ ClearWindowTilemap(WIN_TOSS_NUM);
ScheduleBgCopyTilemapToVram(1);
- sub_81C6350(taskId);
+ AskConfirmToss(taskId);
}
else if (JOY_NEW(B_BUTTON))
{
+ // Cancel tossing
PlaySE(SE_SELECT);
- ClearStdWindowAndFrameToTransparent(3, 0);
- ClearWindowTilemap(3);
+ ClearStdWindowAndFrameToTransparent(WIN_TOSS_NUM, 0);
+ ClearWindowTilemap(WIN_TOSS_NUM);
ScheduleBgCopyTilemapToVram(1);
DontTossItem(taskId);
}
@@ -1166,28 +1213,28 @@ static void TossItem(u8 taskId)
s16 *data = gTasks[taskId].data;
CopyItemName(gSpecialVar_ItemId, gStringVar1);
- ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 2);
+ ConvertIntToDecimalStringN(gStringVar2, tNumToToss, STR_CONV_MODE_LEFT_ALIGN, 2);
StringExpandPlaceholders(gStringVar4, gText_ThrewAwayVar2Var1s);
- FillWindowPixelBuffer(1, PIXEL_FILL(0));
- PrintOnWindow_Font1(1, gStringVar4, 3, 0, 0, 1, 0, 0);
- gTasks[taskId].func = sub_81C65CC;
+ FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0));
+ PrintOnWindow_Font1(WIN_INFO, gStringVar4, 3, 0, 0, 1, 0, COLORID_DARK_GRAY);
+ gTasks[taskId].func = Task_TossItem;
}
-static void sub_81C65CC(u8 taskId)
+static void Task_TossItem(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- u16 *scrollOffset = &gPyramidBagCursorData.scrollPosition;
- u16 *selectedRow = &gPyramidBagCursorData.cursorPosition;
+ u16 *scrollOffset = &gPyramidBagMenuState.scrollPosition;
+ u16 *selectedRow = &gPyramidBagMenuState.cursorPosition;
if (JOY_NEW(A_BUTTON | B_BUTTON))
{
PlaySE(SE_SELECT);
- RemovePyramidBagItem(gSpecialVar_ItemId, data[8]);
- DestroyListMenuTask(data[0], scrollOffset, selectedRow);
- sub_81C5924();
- sub_81C59BC();
+ RemovePyramidBagItem(gSpecialVar_ItemId, tNumToToss);
+ DestroyListMenuTask(tListTaskId, scrollOffset, selectedRow);
+ UpdatePyramidBagList();
+ UpdatePyramidBagCursorPos();
SetBagItemsListTemplate();
- data[0] = ListMenuInit(&gMultiuseListMenuTemplate, *scrollOffset, *selectedRow);
+ tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, *scrollOffset, *selectedRow);
ScheduleBgCopyTilemapToVram(0);
SetTaskToMainPyramidBagInputHandler(taskId);
}
@@ -1195,30 +1242,30 @@ static void sub_81C65CC(u8 taskId)
static void BagAction_Give(u8 taskId)
{
- sub_81C61A8();
+ CloseMenuActionWindow();
if (ItemIsMail(gSpecialVar_ItemId) == TRUE)
{
- DisplayItemMessageInBattlePyramid(taskId, gText_CantWriteMail, sub_81C66EC);
+ DisplayItemMessageInBattlePyramid(taskId, gText_CantWriteMail, Task_WaitCloseErrorMessage);
}
else if (!ItemId_GetImportance(gSpecialVar_ItemId))
{
- gPyramidBagResources->callback2 = CB2_ChooseMonToGiveItem;
- CloseBattlePyramidBagAndSetCallback(taskId);
+ gPyramidBagMenu->exitCallback = CB2_ChooseMonToGiveItem;
+ CloseBattlePyramidBag(taskId);
}
else
{
- sub_81C66AC(taskId);
+ ShowCantHoldMessage(taskId);
}
}
-static void sub_81C66AC(u8 taskId)
+static void ShowCantHoldMessage(u8 taskId)
{
CopyItemName(gSpecialVar_ItemId, gStringVar1);
StringExpandPlaceholders(gStringVar4, gText_Var1CantBeHeld);
- DisplayItemMessageInBattlePyramid(taskId, gStringVar4, sub_81C66EC);
+ DisplayItemMessageInBattlePyramid(taskId, gStringVar4, Task_WaitCloseErrorMessage);
}
-static void sub_81C66EC(u8 taskId)
+static void Task_WaitCloseErrorMessage(u8 taskId)
{
if (JOY_NEW(A_BUTTON))
{
@@ -1232,26 +1279,26 @@ void Task_CloseBattlePyramidBagMessage(u8 taskId)
s16 *data = gTasks[taskId].data;
CloseBattlePyramidBagTextWindow();
- PrintItemDescription(data[1]);
- sub_81C5A98(data[0], 0);
+ PrintItemDescription(tListPos);
+ PrintSelectorArrow(tListTaskId, COLORID_DARK_GRAY);
SetTaskToMainPyramidBagInputHandler(taskId);
}
-static void sub_81C674C(u8 taskId)
+static void TryCloseBagToGiveItem(u8 taskId)
{
- if (!itemid_80BF6D8_mail_related(gSpecialVar_ItemId))
- DisplayItemMessageInBattlePyramid(taskId, gText_CantWriteMail, sub_81C66EC);
+ if (!IsWritingMailAllowed(gSpecialVar_ItemId))
+ DisplayItemMessageInBattlePyramid(taskId, gText_CantWriteMail, Task_WaitCloseErrorMessage);
else if (!ItemId_GetImportance(gSpecialVar_ItemId))
- CloseBattlePyramidBagAndSetCallback(taskId);
+ CloseBattlePyramidBag(taskId);
else
- sub_81C66AC(taskId);
+ ShowCantHoldMessage(taskId);
}
static void BagAction_UseInBattle(u8 taskId)
{
if (ItemId_GetBattleFunc(gSpecialVar_ItemId) != NULL)
{
- sub_81C61A8();
+ CloseMenuActionWindow();
ItemId_GetBattleFunc(gSpecialVar_ItemId)(taskId);
}
}
@@ -1260,15 +1307,15 @@ static void Task_BeginItemSwap(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- data[1] = gPyramidBagCursorData.scrollPosition + gPyramidBagCursorData.cursorPosition;
- gPyramidBagResources->unk814 = data[1];
- ListMenuSetUnkIndicatorsStructField(data[0], 0x10, 1);
- CopyItemName(gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode][data[1]], gStringVar1);
+ tListPos = gPyramidBagMenuState.scrollPosition + gPyramidBagMenuState.cursorPosition;
+ gPyramidBagMenu->toSwapPos = tListPos;
+ ListMenuSetUnkIndicatorsStructField(tListTaskId, 0x10, 1);
+ CopyItemName(gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode][tListPos], gStringVar1);
StringExpandPlaceholders(gStringVar4, gText_MoveVar1Where);
- FillWindowPixelBuffer(1, PIXEL_FILL(0));
- PrintOnWindow_Font1(1, gStringVar4, 3, 0, 0, 1, 0, 0);
- sub_81C5A98(data[0], 1);
- UpdateSwapLinePos(data[1]);
+ FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0));
+ PrintOnWindow_Font1(WIN_INFO, gStringVar4, 3, 0, 0, 1, 0, COLORID_DARK_GRAY);
+ PrintSelectorArrow(tListTaskId, COLORID_LIGHT_GRAY);
+ UpdateSwapLinePos(tListPos);
gTasks[taskId].func = Task_ItemSwapHandleInput;
}
@@ -1280,15 +1327,15 @@ static void Task_ItemSwapHandleInput(u8 taskId)
if (JOY_NEW(SELECT_BUTTON))
{
PlaySE(SE_SELECT);
- ListMenuGetScrollAndRow(data[0], &gPyramidBagCursorData.scrollPosition, &gPyramidBagCursorData.cursorPosition);
+ ListMenuGetScrollAndRow(tListTaskId, &gPyramidBagMenuState.scrollPosition, &gPyramidBagMenuState.cursorPosition);
PerformItemSwap(taskId);
}
else
{
- s32 id = ListMenu_ProcessInput(data[0]);
- ListMenuGetScrollAndRow(data[0], &gPyramidBagCursorData.scrollPosition, &gPyramidBagCursorData.cursorPosition);
+ s32 id = ListMenu_ProcessInput(tListTaskId);
+ ListMenuGetScrollAndRow(tListTaskId, &gPyramidBagMenuState.scrollPosition, &gPyramidBagMenuState.cursorPosition);
SetSwapLineInvisibility(FALSE);
- UpdateSwapLinePos(gPyramidBagCursorData.cursorPosition);
+ UpdateSwapLinePos(gPyramidBagMenuState.cursorPosition);
switch (id)
{
case LIST_NOTHING_CHOSEN:
@@ -1298,7 +1345,7 @@ static void Task_ItemSwapHandleInput(u8 taskId)
if (JOY_NEW(A_BUTTON))
PerformItemSwap(taskId);
else
- sub_81C6A14(taskId);
+ CancelItemSwap(taskId);
break;
default:
PlaySE(SE_SELECT);
@@ -1312,41 +1359,41 @@ static void Task_ItemSwapHandleInput(u8 taskId)
static void PerformItemSwap(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- u16 *scrollOffset = &gPyramidBagCursorData.scrollPosition;
- u16 *selectedRow = &gPyramidBagCursorData.cursorPosition;
- u16 var = *scrollOffset + *selectedRow;
+ u16 *scrollOffset = &gPyramidBagMenuState.scrollPosition;
+ u16 *selectedRow = &gPyramidBagMenuState.cursorPosition;
+ u16 swapPos = *scrollOffset + *selectedRow;
- if (data[1] == var || data[1] == var - 1)
+ if (tListPos == swapPos || tListPos == swapPos - 1)
{
- sub_81C6A14(taskId);
+ CancelItemSwap(taskId);
}
else
{
- MovePyramidBagItemSlotInList(data[1], var);
- gPyramidBagResources->unk814 = 0xFF;
+ MovePyramidBagItemSlotInList(tListPos, swapPos);
+ gPyramidBagMenu->toSwapPos = POS_NONE;
SetSwapLineInvisibility(TRUE);
- DestroyListMenuTask(data[0], scrollOffset, selectedRow);
- if (data[1] < var)
- gPyramidBagCursorData.cursorPosition--;
+ DestroyListMenuTask(tListTaskId, scrollOffset, selectedRow);
+ if (tListPos < swapPos)
+ gPyramidBagMenuState.cursorPosition--;
SetBagItemsListTemplate();
- data[0] = ListMenuInit(&gMultiuseListMenuTemplate, *scrollOffset, *selectedRow);
+ tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, *scrollOffset, *selectedRow);
SetTaskToMainPyramidBagInputHandler(taskId);
}
}
-static void sub_81C6A14(u8 taskId)
+static void CancelItemSwap(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- u16 *scrollOffset = &gPyramidBagCursorData.scrollPosition;
- u16 *selectedRow = &gPyramidBagCursorData.cursorPosition;
+ u16 *scrollOffset = &gPyramidBagMenuState.scrollPosition;
+ u16 *selectedRow = &gPyramidBagMenuState.cursorPosition;
- gPyramidBagResources->unk814 = 0xFF;
+ gPyramidBagMenu->toSwapPos = POS_NONE;
SetSwapLineInvisibility(TRUE);
- DestroyListMenuTask(data[0], scrollOffset, selectedRow);
- if (data[1] < *scrollOffset + *selectedRow)
- gPyramidBagCursorData.cursorPosition--;
+ DestroyListMenuTask(tListTaskId, scrollOffset, selectedRow);
+ if (tListPos < *scrollOffset + *selectedRow)
+ gPyramidBagMenuState.cursorPosition--;
SetBagItemsListTemplate();
- data[0] = ListMenuInit(&gMultiuseListMenuTemplate, *scrollOffset, *selectedRow);
+ tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, *scrollOffset, *selectedRow);
SetTaskToMainPyramidBagInputHandler(taskId);
}
@@ -1385,61 +1432,62 @@ void TryStoreHeldItemsInPyramidBag(void)
Free(newQuantities);
}
-static void sub_81C6BD8(void)
+static void InitPyramidBagWindows(void)
{
u8 i;
- InitWindows(gUnknown_0861F328);
+ InitWindows(sWindowTemplates);
DeactivateAllTextPrinters();
LoadUserWindowBorderGfx(0, 0x1, 0xE0);
LoadMessageBoxGfx(0, 0xA, 0xD0);
LoadPalette(gUnknown_0860F074, 0xF0, 0x20);
- for (i = 0; i < 5; i++)
+ for (i = 0; i < ARRAY_COUNT(sWindowTemplates); i++)
FillWindowPixelBuffer(i, PIXEL_FILL(0));
- PutWindowTilemap(0);
- PutWindowTilemap(1);
+ PutWindowTilemap(WIN_LIST);
+ PutWindowTilemap(WIN_INFO);
ScheduleBgCopyTilemapToVram(0);
ScheduleBgCopyTilemapToVram(1);
}
static void PrintOnWindow_Font1(u8 windowId, const u8 *src, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorTableId)
{
- AddTextPrinterParameterized4(windowId, 1, x, y, letterSpacing, lineSpacing, sColorTable[colorTableId], speed, src);
+ AddTextPrinterParameterized4(windowId, 1, x, y, letterSpacing, lineSpacing, sTextColors[colorTableId], speed, src);
}
static void PrintOnWindow_Font7(u8 windowId, const u8 *src, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorTableId)
{
- AddTextPrinterParameterized4(windowId, 7, x, y, letterSpacing, lineSpacing, sColorTable[colorTableId], speed, src);
+ AddTextPrinterParameterized4(windowId, 7, x, y, letterSpacing, lineSpacing, sTextColors[colorTableId], speed, src);
}
-static void sub_81C6CEC(u8 windowId)
+static void DrawTossNumberWindow(u8 windowId)
{
DrawStdFrameWithCustomTileAndPalette(windowId, 0, 1, 0xE);
ScheduleBgCopyTilemapToVram(1);
}
-static u8 sub_81C6D08(u8 windowArrayId)
+// Unused
+static u8 GetMenuActionWindowId(u8 windowArrayId)
{
- return gPyramidBagResources->windowIds[windowArrayId];
+ return gPyramidBagMenu->windowIds[windowArrayId];
}
-static u8 sub_81C6D24(u8 windowArrayId)
+static u8 OpenMenuActionWindowById(u8 windowArrayId)
{
- u8 *windowId = &gPyramidBagResources->windowIds[windowArrayId];
+ u8 *windowId = &gPyramidBagMenu->windowIds[windowArrayId];
if (*windowId == WINDOW_NONE)
{
- *windowId = AddWindow(&gUnknown_0861F350[windowArrayId]);
+ *windowId = AddWindow(&sWindowTemplates_MenuActions[windowArrayId]);
DrawStdFrameWithCustomTileAndPalette(*windowId, FALSE, 1, 0xE);
ScheduleBgCopyTilemapToVram(1);
}
return *windowId;
}
-static void sub_81C6D6C(u8 windowArrayId)
+static void CloseMenuActionWindowById(u8 windowArrayId)
{
- u8 *windowId = &gPyramidBagResources->windowIds[windowArrayId];
+ u8 *windowId = &gPyramidBagMenu->windowIds[windowArrayId];
if (*windowId != WINDOW_NONE)
{
ClearStdWindowAndFrameToTransparent(*windowId, FALSE);
@@ -1450,87 +1498,87 @@ static void sub_81C6D6C(u8 windowArrayId)
}
}
-static void sub_81C6DAC(u8 taskId, const struct YesNoFuncTable *yesNoTable)
+static void CreatePyramidBagYesNo(u8 taskId, const struct YesNoFuncTable *yesNoTable)
{
- CreateYesNoMenuWithCallbacks(taskId, &gUnknown_0861F350[4], 1, 0, 2, 1, 0xE, yesNoTable);
+ CreateYesNoMenuWithCallbacks(taskId, &sWindowTemplates_MenuActions[MENU_WIN_YESNO], 1, 0, 2, 1, 0xE, yesNoTable);
}
void DisplayItemMessageInBattlePyramid(u8 taskId, const u8 *str, void (*callback)(u8 taskId))
{
- FillWindowPixelBuffer(2, PIXEL_FILL(1));
- DisplayMessageAndContinueTask(taskId, 2, 0xA, 0xD, 1, GetPlayerTextSpeedDelay(), str, callback);
+ FillWindowPixelBuffer(WIN_MSG, PIXEL_FILL(1));
+ DisplayMessageAndContinueTask(taskId, WIN_MSG, 0xA, 0xD, 1, GetPlayerTextSpeedDelay(), str, callback);
ScheduleBgCopyTilemapToVram(1);
}
static void CloseBattlePyramidBagTextWindow(void)
{
- ClearDialogWindowAndFrameToTransparent(2, FALSE);
+ ClearDialogWindowAndFrameToTransparent(WIN_MSG, FALSE);
// This ClearWindowTilemap call is redundant, since ClearDialogWindowAndFrameToTransparent already calls it.
- ClearWindowTilemap(2);
+ ClearWindowTilemap(WIN_MSG);
ScheduleBgCopyTilemapToVram(1);
}
-#define ITEM_IMAGE_TAG 0x1024
-
-static void sub_81C6E38(u8 itemSpriteArrayId)
+static void FreeItemIconSprite(u8 spriteArrId)
{
- u8 *spriteId = &gPyramidBagResources->itemsSpriteIds[itemSpriteArrayId];
+ u8 *spriteId = &gPyramidBagMenu->spriteIds[spriteArrId];
if (*spriteId != SPRITE_NONE)
{
- FreeSpriteTilesByTag(ITEM_IMAGE_TAG + itemSpriteArrayId);
- FreeSpritePaletteByTag(ITEM_IMAGE_TAG + itemSpriteArrayId);
+ // spriteArrId is PBAG_SPRITE_ITEM_ICON / PBAG_SPRITE_ITEM_ICON_ALT here (1-2)
+ // so tag will be TAG_ITEM_ICON / TAG_ITEM_ICON_ALT
+ FreeSpriteTilesByTag(TAG_ITEM_ICON - 1 + spriteArrId);
+ FreeSpritePaletteByTag(TAG_ITEM_ICON - 1 + spriteArrId);
FreeSpriteOamMatrix(&gSprites[*spriteId]);
DestroySprite(&gSprites[*spriteId]);
*spriteId = SPRITE_NONE;
}
}
-static void sub_81C6E98(void)
+static void LoadPyramidBagPalette(void)
{
struct SpritePalette spritePalette;
u16 *palPtr = Alloc(0x40);
LZDecompressWram(gBattleFrontierGfx_PyramidBag_Pal, palPtr);
spritePalette.data = palPtr + (gSaveBlock2Ptr->frontier.lvlMode * 16);
- spritePalette.tag = ITEM_IMAGE_TAG;
+ spritePalette.tag = TAG_PYRAMID_BAG;
LoadSpritePalette(&spritePalette);
Free(palPtr);
}
-static void sub_81C6EF4(void)
+static void CreatePyramidBagSprite(void)
{
- u8 *spriteId = &gPyramidBagResources->itemsSpriteIds[0];
- *spriteId = CreateSprite(&gUnknown_0861F3D4, 0x44, 0x38, 0);
+ u8 *spriteId = &gPyramidBagMenu->spriteIds[PBAG_SPRITE_BAG];
+ *spriteId = CreateSprite(&sSpriteTemplate_PyramidBag, 68, 56, 0);
}
-static void sub_81C6F20(void)
+static void ShakePyramidBag(void)
{
- struct Sprite *sprite = &gSprites[gPyramidBagResources->itemsSpriteIds[0]];
+ struct Sprite *sprite = &gSprites[gPyramidBagMenu->spriteIds[PBAG_SPRITE_BAG]];
if (sprite->affineAnimEnded)
{
- StartSpriteAffineAnim(sprite, 1);
- sprite->callback = sub_81C6F68;
+ StartSpriteAffineAnim(sprite, ANIM_BAG_SHAKE);
+ sprite->callback = SpriteCB_BagWaitForShake;
}
}
-static void sub_81C6F68(struct Sprite *sprite)
+static void SpriteCB_BagWaitForShake(struct Sprite *sprite)
{
if (sprite->affineAnimEnded)
{
- StartSpriteAffineAnim(sprite, 0);
+ StartSpriteAffineAnim(sprite, ANIM_BAG_STILL);
sprite->callback = SpriteCallbackDummy;
}
}
-static void ShowItemImage(u16 itemId, u8 itemSpriteArrayId)
+static void ShowItemIcon(u16 itemId, bool8 isAlt)
{
u8 itemSpriteId;
- u8 *spriteId = &gPyramidBagResources->itemsSpriteIds[itemSpriteArrayId + 1];
+ u8 *spriteId = &gPyramidBagMenu->spriteIds[isAlt + PBAG_SPRITE_ITEM_ICON];
if (*spriteId == SPRITE_NONE)
{
- FreeSpriteTilesByTag(ITEM_IMAGE_TAG + 1 + itemSpriteArrayId);
- FreeSpritePaletteByTag(ITEM_IMAGE_TAG + 1 + itemSpriteArrayId);
- itemSpriteId = AddItemIconSprite(ITEM_IMAGE_TAG + 1 + itemSpriteArrayId, ITEM_IMAGE_TAG + 1 + itemSpriteArrayId, itemId);
+ FreeSpriteTilesByTag(TAG_ITEM_ICON + isAlt);
+ FreeSpritePaletteByTag(TAG_ITEM_ICON + isAlt);
+ itemSpriteId = AddItemIconSprite(TAG_ITEM_ICON + isAlt, TAG_ITEM_ICON + isAlt, itemId);
if (itemSpriteId != MAX_SPRITES)
{
*spriteId = itemSpriteId;
@@ -1540,22 +1588,22 @@ static void ShowItemImage(u16 itemId, u8 itemSpriteArrayId)
}
}
-static void sub_81C6FF8(u8 itemSpriteArrayId)
+static void FreeItemIconSpriteByAltId(bool8 isAlt)
{
- sub_81C6E38(itemSpriteArrayId + 1);
+ FreeItemIconSprite(isAlt + PBAG_SPRITE_ITEM_ICON);
}
static void CreateSwapLine(void)
{
- CreateSwapLineSprites(&gPyramidBagResources->itemsSpriteIds[3], 8);
+ CreateSwapLineSprites(&gPyramidBagMenu->spriteIds[PBAG_SPRITE_SWAP_LINE_START], NUM_SWAP_LINE_SPRITES);
}
static void SetSwapLineInvisibility(bool8 invisible)
{
- SetSwapLineSpritesInvisibility(&gPyramidBagResources->itemsSpriteIds[3], 8, invisible);
+ SetSwapLineSpritesInvisibility(&gPyramidBagMenu->spriteIds[PBAG_SPRITE_SWAP_LINE_START], NUM_SWAP_LINE_SPRITES, invisible);
}
static void UpdateSwapLinePos(u8 y)
{
- UpdateSwapLineSpritesPos(&gPyramidBagResources->itemsSpriteIds[3], 8 | 0x80, 120, (y + 1) * 16);
+ UpdateSwapLineSpritesPos(&gPyramidBagMenu->spriteIds[PBAG_SPRITE_SWAP_LINE_START], NUM_SWAP_LINE_SPRITES | 0x80, 120, (y + 1) * 16);
}
diff --git a/src/contest.c b/src/contest.c
index 0d2d66a66..dd9c7fb18 100644
--- a/src/contest.c
+++ b/src/contest.c
@@ -350,8 +350,8 @@ EWRAM_DATA u8 gHighestRibbonRank = 0;
EWRAM_DATA struct ContestResources *gContestResources = NULL;
EWRAM_DATA u8 sContestBgCopyFlags = 0;
EWRAM_DATA struct ContestWinner gCurContestWinner = {0};
-EWRAM_DATA bool8 gUnknown_02039F5C = 0;
-EWRAM_DATA u8 gUnknown_02039F5D = 0;
+EWRAM_DATA bool8 gCurContestWinnerIsForArtist = 0;
+EWRAM_DATA u8 gCurContestWinnerSaveIdx = 0;
// IWRAM common vars.
u32 gContestRngValue;
@@ -1034,7 +1034,7 @@ void LoadContestBgAfterMoveAnim(void)
{
u32 contestantWindowId = 5 + i;
- LoadPalette(eUnknownHeap1A004.cachedWindowPalettes[contestantWindowId], 16 * (5 + gContestantTurnOrder[i]), sizeof((eUnknownHeap1A004.cachedWindowPalettes[contestantWindowId])));
+ LoadPalette(eContestTempSave.cachedWindowPalettes[contestantWindowId], 16 * (5 + gContestantTurnOrder[i]), sizeof((eContestTempSave.cachedWindowPalettes[contestantWindowId])));
}
}
@@ -1320,7 +1320,7 @@ static bool8 SetupContestGraphics(u8 *stateVar)
CopyToBgTilemapBuffer(2, gUnknown_08C17170, 0, 0);
CopyBgTilemapBufferToVram(2);
// This is a bug, and copies random junk. savedJunk is never read.
- DmaCopy32Defvars(3, gContestResources->contestBgTilemaps[2], eUnknownHeap1A004.savedJunk, sizeof(eUnknownHeap1A004.savedJunk));
+ DmaCopy32Defvars(3, gContestResources->contestBgTilemaps[2], eContestTempSave.savedJunk, sizeof(eContestTempSave.savedJunk));
break;
case 5:
LoadCompressedPalette(gOldContestPalette, 0, 0x200);
@@ -1328,7 +1328,7 @@ static bool8 SetupContestGraphics(u8 *stateVar)
CpuCopy32(gPlttBufferUnfaded + (5 + gContestPlayerMonIndex) * 16, tempPalette2, 16 * sizeof(u16));
CpuCopy32(tempPalette2, gPlttBufferUnfaded + 128, 16 * sizeof(u16));
CpuCopy32(tempPalette1, gPlttBufferUnfaded + (5 + gContestPlayerMonIndex) * 16, 16 * sizeof(u16));
- DmaCopy32Defvars(3, gPlttBufferUnfaded, eUnknownHeap1A004.cachedWindowPalettes, sizeof(eUnknownHeap1A004.cachedWindowPalettes));
+ DmaCopy32Defvars(3, gPlttBufferUnfaded, eContestTempSave.cachedWindowPalettes, sizeof(eContestTempSave.cachedWindowPalettes));
LoadContestPalettes();
break;
case 6:
@@ -1468,7 +1468,7 @@ static void Task_DisplayAppealNumberText(u8 taskId)
gBattle_BG0_Y = 0;
gBattle_BG2_Y = 0;
ContestDebugDoPrint();
- DmaCopy32Defvars(3, gPlttBufferUnfaded, eUnknownHeap1A004.unk18204, PLTT_BUFFER_SIZE * 2);
+ DmaCopy32Defvars(3, gPlttBufferUnfaded, eContestTempSave.cachedPlttBufferUnfaded, PLTT_BUFFER_SIZE * 2);
ConvertIntToDecimalStringN(gStringVar1, eContest.appealNumber + 1, STR_CONV_MODE_LEFT_ALIGN, 1);
if (!Contest_IsMonsTurnDisabled(gContestPlayerMonIndex))
StringCopy(gDisplayedStringBattle, gText_AppealNumWhichMoveWillBePlayed);
@@ -1667,8 +1667,8 @@ static void Task_HideMoveSelectScreen(u8 taskId)
}
Contest_SetBgCopyFlags(0);
// This seems to be a bug; it should have just copied PLTT_BUFFER_SIZE.
- DmaCopy32Defvars(3, gPlttBufferFaded, eUnknownHeap1A004.unk18604, PLTT_BUFFER_SIZE * 2);
- LoadPalette(eUnknownHeap1A004.unk18204, 0, PLTT_BUFFER_SIZE * 2);
+ DmaCopy32Defvars(3, gPlttBufferFaded, eContestTempSave.cachedPlttBufferFaded, PLTT_BUFFER_SIZE * 2);
+ LoadPalette(eContestTempSave.cachedPlttBufferUnfaded, 0, PLTT_BUFFER_SIZE * 2);
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1] = 0;
gTasks[taskId].func = Task_HideApplauseMeterForAppealStart;
@@ -2554,7 +2554,7 @@ static void Task_WaitForHeartSliders(u8 taskId)
static void sub_80DA348(u8 taskId)
{
- DmaCopy32Defvars(3, eUnknownHeap1A004.unk18204, gPlttBufferUnfaded, PLTT_BUFFER_SIZE * 2);
+ DmaCopy32Defvars(3, eContestTempSave.cachedPlttBufferUnfaded, gPlttBufferUnfaded, PLTT_BUFFER_SIZE * 2);
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1] = 2;
gTasks[taskId].func = Task_WaitPrintRoundResult;
@@ -4412,7 +4412,7 @@ static void DrawContestantWindows(void)
for (i = 0; i < CONTESTANT_COUNT; i++)
{
s32 windowId = i + 5;
- LoadPalette(eUnknownHeap1A004.cachedWindowPalettes[windowId], (gContestantTurnOrder[i] + 5) * 16, sizeof(eUnknownHeap1A004.cachedWindowPalettes[0]));
+ LoadPalette(eContestTempSave.cachedWindowPalettes[windowId], (gContestantTurnOrder[i] + 5) * 16, sizeof(eContestTempSave.cachedWindowPalettes[0]));
}
DrawContestantWindowText();
}
@@ -5516,40 +5516,46 @@ void ResetContestLinkResults(void)
gSaveBlock2Ptr->contestLinkResults[i][j] = 0;
}
-bool8 sub_80DEDA8(u8 rank)
+bool8 SaveContestWinner(u8 rank)
{
s32 i;
- u8 r7 = Random() % 3;
+ u8 captionId = Random() % NUM_PAINTING_CAPTIONS;
+ // Get the index of the winner among the contestants
for (i = 0; i < CONTESTANT_COUNT - 1; i++)
- {
if (gContestFinalStandings[i] == 0)
break;
- }
- if (rank == 0xFF && i != gContestPlayerMonIndex)
+
+ // Exit if attempting to save a Pokémon other than the player's to the museum
+ if (rank == CONTEST_SAVE_FOR_MUSEUM && i != gContestPlayerMonIndex)
return FALSE;
+
+ // Adjust the random painting caption depending on the category
switch (gSpecialVar_ContestCategory)
{
case CONTEST_CATEGORY_COOL:
- r7 += 0;
+ captionId += NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_COOL;
break;
case CONTEST_CATEGORY_BEAUTY:
- r7 += 3;
+ captionId += NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_BEAUTY;
break;
case CONTEST_CATEGORY_CUTE:
- r7 += 6;
+ captionId += NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_CUTE;
break;
case CONTEST_CATEGORY_SMART:
- r7 += 9;
+ captionId += NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_SMART;
break;
case CONTEST_CATEGORY_TOUGH:
- r7 += 12;
+ captionId += NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_TOUGH;
break;
}
- if (rank != 0xFE)
- {
- u8 id = sub_80DEFA8(rank, 1);
+ if (rank != CONTEST_SAVE_FOR_ARTIST)
+ {
+ // Save winner in the saveblock
+ // Used to save any winner for the Contest Hall or the Museum
+ // but excludes the temporary save used by the artist
+ u8 id = GetContestWinnerSaveIdx(rank, TRUE);
gSaveBlock1Ptr->contestWinners[id].personality = gContestMons[i].personality;
gSaveBlock1Ptr->contestWinners[id].species = gContestMons[i].species;
gSaveBlock1Ptr->contestWinners[id].trainerId = gContestMons[i].otId;
@@ -5560,24 +5566,29 @@ bool8 sub_80DEDA8(u8 rank)
else
gSaveBlock1Ptr->contestWinners[id].contestRank = gSpecialVar_ContestRank;
- if (rank != 0xFF)
+ if (rank != CONTEST_SAVE_FOR_MUSEUM)
gSaveBlock1Ptr->contestWinners[id].contestCategory = gSpecialVar_ContestCategory;
else
- gSaveBlock1Ptr->contestWinners[id].contestCategory = r7;
+ gSaveBlock1Ptr->contestWinners[id].contestCategory = captionId;
}
else
{
+ // Set the most recent winner so the artist can show the player their painting
gCurContestWinner.personality = gContestMons[i].personality;
gCurContestWinner.trainerId = gContestMons[i].otId;
gCurContestWinner.species = gContestMons[i].species;
StringCopy(gCurContestWinner.monName, gContestMons[i].nickname);
StringCopy(gCurContestWinner.trainerName, gContestMons[i].trainerName);
- gCurContestWinner.contestCategory = r7;
+ gCurContestWinner.contestCategory = captionId;
}
return TRUE;
}
-u8 sub_80DEFA8(u8 rank, u8 b)
+// Rank is either a regular contest rank (for saving winners to show in the Contest Hall)
+// Or one of two special IDs listed below (for saving winners to show in Museum, or from the artist)
+// If just retrieving the index where the winner *would* go, shift is FALSE
+// If actually preparing to insert the winner into the saveblock, shift is TRUE
+u8 GetContestWinnerSaveIdx(u8 rank, bool8 shift)
{
s32 i;
@@ -5587,13 +5598,15 @@ u8 sub_80DEFA8(u8 rank, u8 b)
case CONTEST_RANK_SUPER:
case CONTEST_RANK_HYPER:
case CONTEST_RANK_MASTER:
- if (b != 0)
+ if (shift)
{
- for (i = NUM_CONTEST_HALL_WINNERS - 1; i >= 1; i--)
+ for (i = NUM_CONTEST_HALL_WINNERS - 1; i > 0; i--)
memcpy(&gSaveBlock1Ptr->contestWinners[i], &gSaveBlock1Ptr->contestWinners[i - 1], sizeof(struct ContestWinner));
}
- return 0;
+ return CONTEST_WINNER_HALL_1 - 1;
default:
+// case CONTEST_SAVE_FOR_MUSEUM:
+// case CONTEST_SAVE_FOR_ARTIST:
switch (gSpecialVar_ContestCategory)
{
case CONTEST_CATEGORY_COOL:
@@ -5615,7 +5628,7 @@ void ClearContestWinnerPicsInContestHall(void)
{
s32 i;
- for (i = 0; i < 8; i++)
+ for (i = 0; i < MUSEUM_CONTEST_WINNERS_START; i++)
gSaveBlock1Ptr->contestWinners[i] = gDefaultContestWinners[i];
}
diff --git a/src/contest_painting.c b/src/contest_painting.c
index 4f0bf9245..d4bc8ca04 100644
--- a/src/contest_painting.c
+++ b/src/contest_painting.c
@@ -21,18 +21,16 @@
#include "window.h"
#include "constants/rgb.h"
-// IWRAM common
u16 (*gContestMonPixels)[][32];
struct ImageProcessingContext gImageProcessingContext;
struct ContestWinner *gContestPaintingWinner;
u16 *gContestPaintingMonPalette;
-// IWRAM bss
-static u8 gContestPaintingState;
-static u16 gContestPaintingMosaicVal;
-static u16 gContestPaintingFadeCounter;
-static bool8 gUnknown_030011F6;
-static u8 gContestPaintingWindowId;
+static u8 sHoldState;
+static u16 sMosaicVal;
+static u16 sFadeCounter;
+static bool8 sVarsInitialized;
+static u8 sWindowId;
static void ShowContestPainting(void);
static void HoldContestPainting(void);
@@ -44,7 +42,7 @@ static void PrintContestPaintingCaption(u8, u8);
static void VBlankCB_ContestPainting(void);
static void _InitContestMonPixels(u8 *spriteGfx, u16 *palette, u16 (*destPixels)[64][64]);
-extern const u8 gContestPaintingCaption[];
+extern const u8 gContestHallPaintingCaption[];
extern const u8 gContestCoolness[];
extern const u8 gContestBeauty[];
extern const u8 gContestCuteness[];
@@ -71,39 +69,39 @@ extern const u8 gContestPaintingTough1[];
extern const u8 gContestPaintingTough2[];
extern const u8 gContestPaintingTough3[];
-const u16 gPictureFramePalettes[] = INCBIN_U16("graphics/picture_frame/bg.gbapal");
-const u8 gPictureFrameTiles_0[] = INCBIN_U8("graphics/picture_frame/frame0.4bpp.rl");
-const u8 gPictureFrameTiles_1[] = INCBIN_U8("graphics/picture_frame/frame1.4bpp.rl");
-const u8 gPictureFrameTiles_2[] = INCBIN_U8("graphics/picture_frame/frame2.4bpp.rl");
-const u8 gPictureFrameTiles_3[] = INCBIN_U8("graphics/picture_frame/frame3.4bpp.rl");
-const u8 gPictureFrameTiles_4[] = INCBIN_U8("graphics/picture_frame/frame4.4bpp.rl");
-const u8 gPictureFrameTiles_5[] = INCBIN_U8("graphics/picture_frame/frame5.4bpp.rl");
-const u8 gPictureFrameTilemap_0[] = INCBIN_U8("graphics/picture_frame/frame0_map.bin.rl");
-const u8 gPictureFrameTilemap_1[] = INCBIN_U8("graphics/picture_frame/frame1_map.bin.rl");
-const u8 gPictureFrameTilemap_2[] = INCBIN_U8("graphics/picture_frame/frame2_map.bin.rl");
-const u8 gPictureFrameTilemap_3[] = INCBIN_U8("graphics/picture_frame/frame3_map.bin.rl");
-const u8 gPictureFrameTilemap_4[] = INCBIN_U8("graphics/picture_frame/frame4_map.bin.rl");
-const u8 gPictureFrameTilemap_5[] = INCBIN_U8("graphics/picture_frame/frame5_map.bin.rl");
+static const u16 sPictureFramePalettes[] = INCBIN_U16("graphics/picture_frame/bg.gbapal");
+static const u8 sPictureFrameTiles_Cool[] = INCBIN_U8("graphics/picture_frame/cool.4bpp.rl");
+static const u8 sPictureFrameTiles_Beauty[] = INCBIN_U8("graphics/picture_frame/beauty.4bpp.rl");
+static const u8 sPictureFrameTiles_Cute[] = INCBIN_U8("graphics/picture_frame/cute.4bpp.rl");
+static const u8 sPictureFrameTiles_Smart[] = INCBIN_U8("graphics/picture_frame/smart.4bpp.rl");
+static const u8 sPictureFrameTiles_Tough[] = INCBIN_U8("graphics/picture_frame/tough.4bpp.rl");
+static const u8 sPictureFrameTiles_HallLobby[] = INCBIN_U8("graphics/picture_frame/lobby.4bpp.rl");
+static const u8 sPictureFrameTilemap_Cool[] = INCBIN_U8("graphics/picture_frame/cool_map.bin.rl");
+static const u8 sPictureFrameTilemap_Beauty[] = INCBIN_U8("graphics/picture_frame/beauty_map.bin.rl");
+static const u8 sPictureFrameTilemap_Cute[] = INCBIN_U8("graphics/picture_frame/cute_map.bin.rl");
+static const u8 sPictureFrameTilemap_Smart[] = INCBIN_U8("graphics/picture_frame/smart_map.bin.rl");
+static const u8 sPictureFrameTilemap_Tough[] = INCBIN_U8("graphics/picture_frame/tough_map.bin.rl");
+static const u8 sPictureFrameTilemap_HallLobby[] = INCBIN_U8("graphics/picture_frame/lobby_map.bin.rl");
static const u8 *const sContestCategoryNames_Unused[] =
{
- gContestCoolness,
- gContestBeauty,
- gContestCuteness,
- gContestSmartness,
- gContestToughness,
+ [CONTEST_CATEGORY_COOL] = gContestCoolness,
+ [CONTEST_CATEGORY_BEAUTY] = gContestBeauty,
+ [CONTEST_CATEGORY_CUTE] = gContestCuteness,
+ [CONTEST_CATEGORY_SMART] = gContestSmartness,
+ [CONTEST_CATEGORY_TOUGH] = gContestToughness,
};
static const u8 *const sContestRankNames[] =
{
- gContestRankNormal,
- gContestRankSuper,
- gContestRankHyper,
- gContestRankMaster,
- gContestLink,
+ [CONTEST_RANK_NORMAL] = gContestRankNormal,
+ [CONTEST_RANK_SUPER] = gContestRankSuper,
+ [CONTEST_RANK_HYPER] = gContestRankHyper,
+ [CONTEST_RANK_MASTER] = gContestRankMaster,
+ [CONTEST_RANK_LINK] = gContestLink,
};
-static const struct BgTemplate sContestPaintingBgTemplates[] =
+static const struct BgTemplate sBgTemplates[] =
{
{
.bg = 1,
@@ -116,7 +114,7 @@ static const struct BgTemplate sContestPaintingBgTemplates[] =
},
};
-static const struct WindowTemplate sContestPaintingWindowTemplate =
+static const struct WindowTemplate sWindowTemplate =
{
.bg = 1,
.tilemapLeft = 2,
@@ -127,23 +125,23 @@ static const struct WindowTemplate sContestPaintingWindowTemplate =
.baseBlock = 1,
};
-static const u8 *const sContestPaintingDescriptionPointers[] =
+static const u8 *const sMuseumCaptions[NUM_PAINTING_CAPTIONS * CONTEST_CATEGORIES_COUNT] =
{
- gContestPaintingCool1,
- gContestPaintingCool2,
- gContestPaintingCool3,
- gContestPaintingBeauty1,
- gContestPaintingBeauty2,
- gContestPaintingBeauty3,
- gContestPaintingCute1,
- gContestPaintingCute2,
- gContestPaintingCute3,
- gContestPaintingSmart1,
- gContestPaintingSmart2,
- gContestPaintingSmart3,
- gContestPaintingTough1,
- gContestPaintingTough2,
- gContestPaintingTough3,
+ [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_COOL] = gContestPaintingCool1,
+ [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_COOL] = gContestPaintingCool2,
+ [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_COOL] = gContestPaintingCool3,
+ [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_BEAUTY] = gContestPaintingBeauty1,
+ [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_BEAUTY] = gContestPaintingBeauty2,
+ [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_BEAUTY] = gContestPaintingBeauty3,
+ [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_CUTE] = gContestPaintingCute1,
+ [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_CUTE] = gContestPaintingCute2,
+ [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_CUTE] = gContestPaintingCute3,
+ [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_SMART] = gContestPaintingSmart1,
+ [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_SMART] = gContestPaintingSmart2,
+ [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_SMART] = gContestPaintingSmart3,
+ [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_TOUGH] = gContestPaintingTough1,
+ [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_TOUGH] = gContestPaintingTough2,
+ [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_TOUGH] = gContestPaintingTough3,
};
static const struct OamData sContestPaintingMonOamData =
@@ -161,15 +159,15 @@ static const struct OamData sContestPaintingMonOamData =
.paletteNum = 0,
};
-const u16 gUnknown_085B0838[] = {RGB(0, 0, 0), RGB(0, 0, 0)};
+static const u16 sBgPalette[] = {RGB_BLACK, RGB_BLACK};
void SetContestWinnerForPainting(int contestWinnerId)
{
- u8 *ptr1 = &gUnknown_02039F5D;
- u8 *ptr2 = &gUnknown_02039F5C;
+ u8 *saveIdx = &gCurContestWinnerSaveIdx;
+ u8 *isForArtist = &gCurContestWinnerIsForArtist;
gCurContestWinner = gSaveBlock1Ptr->contestWinners[contestWinnerId - 1];
- *ptr1 = contestWinnerId - 1;
- *ptr2 = FALSE;
+ *saveIdx = contestWinnerId - 1;
+ *isForArtist = FALSE;
}
void CB2_ContestPainting(void)
@@ -189,7 +187,7 @@ static void CB2_QuitContestPainting(void)
SetMainCallback2(gMain.savedCallback);
FREE_AND_SET_NULL(gContestPaintingMonPalette);
FREE_AND_SET_NULL(gContestMonPixels);
- RemoveWindow(gContestPaintingWindowId);
+ RemoveWindow(sWindowId);
Free(GetBgTilemapBuffer(1));
FreeMonSpritesGfx();
}
@@ -203,13 +201,13 @@ static void ShowContestPainting(void)
SetVBlankCallback(NULL);
AllocateMonSpritesGfx();
gContestPaintingWinner = &gCurContestWinner;
- InitContestPaintingVars(1);
+ InitContestPaintingVars(TRUE);
InitContestPaintingBg();
gMain.state++;
break;
case 1:
ResetPaletteFade();
- DmaFillLarge32(3, 0, (void *)BG_VRAM, 0x18000, 0x1000);
+ DmaFillLarge32(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000);
ResetSpriteData();
gMain.state++;
break;
@@ -220,16 +218,16 @@ static void ShowContestPainting(void)
gMain.state++;
break;
case 3:
- CreateContestPaintingPicture(gUnknown_02039F5D, gUnknown_02039F5C);
+ CreateContestPaintingPicture(gCurContestWinnerSaveIdx, gCurContestWinnerIsForArtist);
gMain.state++;
break;
case 4:
- PrintContestPaintingCaption(gUnknown_02039F5D, gUnknown_02039F5C);
- LoadPalette(gUnknown_085B0838, 0, 1 * 2);
+ PrintContestPaintingCaption(gCurContestWinnerSaveIdx, gCurContestWinnerIsForArtist);
+ LoadPalette(sBgPalette, 0, 1 * 2);
DmaClear32(3, PLTT, PLTT_SIZE);
BeginFastPaletteFade(2);
SetVBlankCallback(VBlankCB_ContestPainting);
- gContestPaintingState = 0;
+ sHoldState = 0;
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_ON);
SetMainCallback2(CB2_HoldContestPainting);
break;
@@ -238,29 +236,29 @@ static void ShowContestPainting(void)
static void HoldContestPainting(void)
{
- switch (gContestPaintingState)
+ switch (sHoldState)
{
case 0:
if (!gPaletteFade.active)
- gContestPaintingState = 1;
- if (gUnknown_030011F6 && gContestPaintingFadeCounter)
- gContestPaintingFadeCounter--;
+ sHoldState = 1;
+ if (sVarsInitialized && sFadeCounter)
+ sFadeCounter--;
break;
case 1:
if ((JOY_NEW(A_BUTTON)) || (JOY_NEW(B_BUTTON)))
{
- gContestPaintingState++;
+ sHoldState++;
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB(0, 0, 0));
}
- if (gUnknown_030011F6)
- gContestPaintingFadeCounter = 0;
+ if (sVarsInitialized)
+ sFadeCounter = 0;
break;
case 2:
if (!gPaletteFade.active)
SetMainCallback2(CB2_QuitContestPainting);
- if (gUnknown_030011F6 && gContestPaintingFadeCounter < 30)
- gContestPaintingFadeCounter++;
+ if (sVarsInitialized && sFadeCounter < 30)
+ sFadeCounter++;
break;
}
}
@@ -268,45 +266,48 @@ static void HoldContestPainting(void)
static void InitContestPaintingWindow(void)
{
ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, sContestPaintingBgTemplates, ARRAY_COUNT(sContestPaintingBgTemplates));
+ InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));
ChangeBgX(1, 0, 0);
ChangeBgY(1, 0, 0);
SetBgTilemapBuffer(1, AllocZeroed(BG_SCREEN_SIZE));
- gContestPaintingWindowId = AddWindow(&sContestPaintingWindowTemplate);
+ sWindowId = AddWindow(&sWindowTemplate);
DeactivateAllTextPrinters();
- FillWindowPixelBuffer(gContestPaintingWindowId, PIXEL_FILL(0));
- PutWindowTilemap(gContestPaintingWindowId);
- CopyWindowToVram(gContestPaintingWindowId, 3);
+ FillWindowPixelBuffer(sWindowId, PIXEL_FILL(0));
+ PutWindowTilemap(sWindowId);
+ CopyWindowToVram(sWindowId, 3);
ShowBg(1);
}
-static void PrintContestPaintingCaption(u8 contestType, bool8 arg1)
+static void PrintContestPaintingCaption(u8 contestType, bool8 isForArtist)
{
int x;
u8 category;
- if (arg1 == TRUE)
+ // Artist's painting has no caption
+ if (isForArtist == TRUE)
return;
category = gContestPaintingWinner->contestCategory;
- if (contestType < 8)
+ if (contestType < MUSEUM_CONTEST_WINNERS_START)
{
+ // Contest Hall caption
BufferContestName(gStringVar1, category);
StringAppend(gStringVar1, gText_Space);
StringAppend(gStringVar1, sContestRankNames[gContestPaintingWinner->contestRank]);
StringCopy(gStringVar2, gContestPaintingWinner->trainerName);
- sub_81DB5AC(gStringVar2);
+ ConvertInternationalContestantName(gStringVar2);
StringCopy(gStringVar3, gContestPaintingWinner->monName);
- StringExpandPlaceholders(gStringVar4, gContestPaintingCaption);
+ StringExpandPlaceholders(gStringVar4, gContestHallPaintingCaption);
}
else
{
+ // Museum caption
StringCopy(gStringVar1, gContestPaintingWinner->monName);
- StringExpandPlaceholders(gStringVar4, sContestPaintingDescriptionPointers[category]);
+ StringExpandPlaceholders(gStringVar4, sMuseumCaptions[category]);
}
x = GetStringCenterAlignXOffset(1, gStringVar4, 208);
- AddTextPrinterParameterized(gContestPaintingWindowId, 1, gStringVar4, x, 1, 0, 0);
+ AddTextPrinterParameterized(sWindowId, 1, gStringVar4, x, 1, 0, 0);
CopyBgTilemapBufferToVram(1);
}
@@ -321,33 +322,34 @@ static void InitContestPaintingBg(void)
SetGpuReg(REG_OFFSET_BLDY, 0);
}
-static void InitContestPaintingVars(bool8 arg0)
+static void InitContestPaintingVars(bool8 reset)
{
- if (arg0 == FALSE)
+ if (reset == FALSE)
{
- gUnknown_030011F6 = FALSE;
- gContestPaintingMosaicVal = 0;
- gContestPaintingFadeCounter = 0;
+ // Never reached
+ sVarsInitialized = FALSE;
+ sMosaicVal = 0;
+ sFadeCounter = 0;
}
else
{
- gUnknown_030011F6 = TRUE;
- gContestPaintingMosaicVal = 15;
- gContestPaintingFadeCounter = 30;
+ sVarsInitialized = TRUE;
+ sMosaicVal = 15;
+ sFadeCounter = 30;
}
}
static void UpdateContestPaintingMosaicEffect(void)
{
- if (!gUnknown_030011F6)
+ if (!sVarsInitialized)
{
SetGpuReg(REG_OFFSET_MOSAIC, 0);
}
else
{
SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(10) | BGCNT_MOSAIC | BGCNT_16COLOR | BGCNT_TXT256x256);
- gContestPaintingMosaicVal = gContestPaintingFadeCounter / 2;
- SetGpuReg(REG_OFFSET_MOSAIC, (gContestPaintingMosaicVal << 12) | (gContestPaintingMosaicVal << 8) | (gContestPaintingMosaicVal << 4) | (gContestPaintingMosaicVal << 0));
+ sMosaicVal = sFadeCounter / 2;
+ SetGpuReg(REG_OFFSET_MOSAIC, (sMosaicVal << 12) | (sMosaicVal << 8) | (sMosaicVal << 4) | (sMosaicVal << 0));
}
}
@@ -414,34 +416,35 @@ static void _InitContestMonPixels(u8 *spriteGfx, u16 *palette, u16 (*destPixels)
#define VRAM_PICTURE_DATA(x, y) (((u16 *)(BG_SCREEN_ADDR(12)))[(y) * 32 + (x)])
-static void LoadContestPaintingFrame(u8 contestWinnerId, bool8 arg1)
+static void LoadContestPaintingFrame(u8 contestWinnerId, bool8 isForArtist)
{
u8 x, y;
- LoadPalette(gPictureFramePalettes, 0, 0x100);
- if (arg1 == TRUE)
+ LoadPalette(sPictureFramePalettes, 0, 0x100);
+ if (isForArtist == TRUE)
{
- switch (gContestPaintingWinner->contestCategory / 3)
+ // Load Artist's frame
+ switch (gContestPaintingWinner->contestCategory / NUM_PAINTING_CAPTIONS)
{
case CONTEST_CATEGORY_COOL:
- RLUnCompVram(gPictureFrameTiles_0, (void *)VRAM);
- RLUnCompWram(gPictureFrameTilemap_0, gContestMonPixels);
+ RLUnCompVram(sPictureFrameTiles_Cool, (void *)VRAM);
+ RLUnCompWram(sPictureFrameTilemap_Cool, gContestMonPixels);
break;
case CONTEST_CATEGORY_BEAUTY:
- RLUnCompVram(gPictureFrameTiles_1, (void *)VRAM);
- RLUnCompWram(gPictureFrameTilemap_1, gContestMonPixels);
+ RLUnCompVram(sPictureFrameTiles_Beauty, (void *)VRAM);
+ RLUnCompWram(sPictureFrameTilemap_Beauty, gContestMonPixels);
break;
case CONTEST_CATEGORY_CUTE:
- RLUnCompVram(gPictureFrameTiles_2, (void *)VRAM);
- RLUnCompWram(gPictureFrameTilemap_2, gContestMonPixels);
+ RLUnCompVram(sPictureFrameTiles_Cute, (void *)VRAM);
+ RLUnCompWram(sPictureFrameTilemap_Cute, gContestMonPixels);
break;
case CONTEST_CATEGORY_SMART:
- RLUnCompVram(gPictureFrameTiles_3, (void *)VRAM);
- RLUnCompWram(gPictureFrameTilemap_3, gContestMonPixels);
+ RLUnCompVram(sPictureFrameTiles_Smart, (void *)VRAM);
+ RLUnCompWram(sPictureFrameTilemap_Smart, gContestMonPixels);
break;
case CONTEST_CATEGORY_TOUGH:
- RLUnCompVram(gPictureFrameTiles_4, (void *)VRAM);
- RLUnCompWram(gPictureFrameTilemap_4, gContestMonPixels);
+ RLUnCompVram(sPictureFrameTiles_Tough, (void *)VRAM);
+ RLUnCompWram(sPictureFrameTilemap_Tough, gContestMonPixels);
break;
}
@@ -463,34 +466,36 @@ static void LoadContestPaintingFrame(u8 contestWinnerId, bool8 arg1)
for (x = 0; x < 16; x++)
VRAM_PICTURE_DATA(x + 7, 2) = (*gContestMonPixels)[2][7];
}
- else if (contestWinnerId < 8)
+ else if (contestWinnerId < MUSEUM_CONTEST_WINNERS_START)
{
- RLUnCompVram(gPictureFrameTiles_5, (void *)VRAM);
- RLUnCompVram(gPictureFrameTilemap_5, (void *)(BG_SCREEN_ADDR(12)));
+ // Load Contest Hall lobby frame
+ RLUnCompVram(sPictureFrameTiles_HallLobby, (void *)VRAM);
+ RLUnCompVram(sPictureFrameTilemap_HallLobby, (void *)(BG_SCREEN_ADDR(12)));
}
else
{
- switch (gContestPaintingWinner->contestCategory / 3)
+ // Load Museum frame
+ switch (gContestPaintingWinner->contestCategory / NUM_PAINTING_CAPTIONS)
{
case CONTEST_CATEGORY_COOL:
- RLUnCompVram(gPictureFrameTiles_0, (void *)VRAM);
- RLUnCompVram(gPictureFrameTilemap_0, (void *)(BG_SCREEN_ADDR(12)));
+ RLUnCompVram(sPictureFrameTiles_Cool, (void *)VRAM);
+ RLUnCompVram(sPictureFrameTilemap_Cool, (void *)(BG_SCREEN_ADDR(12)));
break;
case CONTEST_CATEGORY_BEAUTY:
- RLUnCompVram(gPictureFrameTiles_1, (void *)VRAM);
- RLUnCompVram(gPictureFrameTilemap_1, (void *)(BG_SCREEN_ADDR(12)));
+ RLUnCompVram(sPictureFrameTiles_Beauty, (void *)VRAM);
+ RLUnCompVram(sPictureFrameTilemap_Beauty, (void *)(BG_SCREEN_ADDR(12)));
break;
case CONTEST_CATEGORY_CUTE:
- RLUnCompVram(gPictureFrameTiles_2, (void *)VRAM);
- RLUnCompVram(gPictureFrameTilemap_2, (void *)(BG_SCREEN_ADDR(12)));
+ RLUnCompVram(sPictureFrameTiles_Cute, (void *)VRAM);
+ RLUnCompVram(sPictureFrameTilemap_Cute, (void *)(BG_SCREEN_ADDR(12)));
break;
case CONTEST_CATEGORY_SMART:
- RLUnCompVram(gPictureFrameTiles_3, (void *)VRAM);
- RLUnCompVram(gPictureFrameTilemap_3, (void *)(BG_SCREEN_ADDR(12)));
+ RLUnCompVram(sPictureFrameTiles_Smart, (void *)VRAM);
+ RLUnCompVram(sPictureFrameTilemap_Smart, (void *)(BG_SCREEN_ADDR(12)));
break;
case CONTEST_CATEGORY_TOUGH:
- RLUnCompVram(gPictureFrameTiles_4, (void *)VRAM);
- RLUnCompVram(gPictureFrameTilemap_4, (void *)(BG_SCREEN_ADDR(12)));
+ RLUnCompVram(sPictureFrameTiles_Tough, (void *)VRAM);
+ RLUnCompVram(sPictureFrameTilemap_Tough, (void *)(BG_SCREEN_ADDR(12)));
break;
}
}
@@ -519,10 +524,10 @@ static u8 GetImageEffectForContestWinner(u8 contestWinnerId)
{
u8 contestCategory;
- if (contestWinnerId < 8)
+ if (contestWinnerId < MUSEUM_CONTEST_WINNERS_START)
contestCategory = gContestPaintingWinner->contestCategory;
else
- contestCategory = gContestPaintingWinner->contestCategory / 3;
+ contestCategory = gContestPaintingWinner->contestCategory / NUM_PAINTING_CAPTIONS;
switch (contestCategory)
{
@@ -584,12 +589,12 @@ static void DoContestPaintingImageProcessing(u8 imageEffect)
LoadPalette(gContestPaintingMonPalette, 0x100, 0x200);
}
-static void CreateContestPaintingPicture(u8 contestWinnerId, bool8 arg1)
+static void CreateContestPaintingPicture(u8 contestWinnerId, bool8 isForArtist)
{
AllocPaintingResources();
InitContestMonPixels(gContestPaintingWinner->species, 0);
DoContestPaintingImageProcessing(GetImageEffectForContestWinner(contestWinnerId));
InitPaintingMonOamData(contestWinnerId);
- LoadContestPaintingFrame(contestWinnerId, arg1);
+ LoadContestPaintingFrame(contestWinnerId, isForArtist);
}
diff --git a/src/contest_util.c b/src/contest_util.c
index 98854c4c6..167f49876 100644
--- a/src/contest_util.c
+++ b/src/contest_util.c
@@ -61,10 +61,29 @@ enum {
#define GET_CONTEST_WINNER_ID(i) { for ((i) = 0; (i) < CONTESTANT_COUNT && gContestFinalStandings[(i)] != 0; (i)++); }
+// Gfx/pal tags for the text window sprites on the contest results screen.
+// Both types of text windows are made up of 4 individual sprites
+// These tags are used by the spritesheets, and implicitly in the loop in CreateResultsTextWindowSprites
+#define TAG_TEXT_WINDOW_BASE 3009
+enum {
+ TAG_RESULTS_TEXT_WINDOW_LEFT = TAG_TEXT_WINDOW_BASE,
+ TAG_RESULTS_TEXT_WINDOW_MIDLEFT,
+ TAG_RESULTS_TEXT_WINDOW_MIDRIGHT,
+ TAG_RESULTS_TEXT_WINDOW_RIGHT,
+ TAG_LINK_TEXT_WINDOW_LEFT,
+ TAG_LINK_TEXT_WINDOW_MIDLEFT,
+ TAG_LINK_TEXT_WINDOW_MIDRIGHT,
+ TAG_LINK_TEXT_WINDOW_RIGHT, // 3016
+};
#define TAG_CONFETTI 3017
+#define TAG_WIRELESS_INDICATOR_WINDOW 22222
#define MAX_BAR_LENGTH 87
+// Starting x/y for the sliding results screen text box
+#define TEXT_BOX_X (DISPLAY_WIDTH + 32)
+#define TEXT_BOX_Y (DISPLAY_HEIGHT - 16)
+
struct ContestResultsInternal
{
u8 slidingTextBoxSpriteId;
@@ -105,14 +124,14 @@ struct ContestResults
static EWRAM_DATA struct ContestResults *sContestResults = NULL;
static void LoadAllContestMonIconPalettes(void);
-static void LoadContestResultsTilemaps(void);
+static void LoadContestResultsTitleBarTilemaps(void);
static u8 GetNumPreliminaryPoints(u8, bool8);
static s8 GetNumRound2Points(u8, bool8);
static void AddContestTextPrinter(int, u8 *, int);
static void AllocContestResults(void);
static void FreeContestResults(void);
static void LoadAllContestMonIcons(u8, u8);
-static void LoadContestResultSprites(void);
+static void CreateResultsTextWindowSprites(void);
static void TryCreateWirelessSprites(void);
static void Task_StartShowContestResults(u8 taskId);
static void CB2_StartShowContestResults(void);
@@ -166,11 +185,11 @@ static void SpriteCB_Confetti(struct Sprite *sprite);
static void Task_ShowContestEntryMonPic(u8 taskId);
static void Task_LinkContestWaitForConnection(u8 taskId);
-static const u16 sUnknown_0858D6B0[] = INCBIN_U16("graphics/unknown/unknown_58D6B0.gbapal");
-static const u8 sUnknown_0858D6D0[] = INCBIN_U8("graphics/unknown/unknown_58D6D0.4bpp");
+static const u16 sResultsTextWindow_Pal[] = INCBIN_U16("graphics/contest/results_screen/text_window.gbapal");
+static const u8 sResultsTextWindow_Gfx[] = INCBIN_U8("graphics/contest/results_screen/text_window.4bpp");
static const u16 sMiscBlank_Pal[] = INCBIN_U16("graphics/interface/blank.gbapal");
-static const struct OamData sOamData_858D7F0 =
+static const struct OamData sOamData_ResultsTextWindow =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
@@ -187,33 +206,33 @@ static const struct OamData sOamData_858D7F0 =
.affineParam = 0,
};
-static const struct SpriteTemplate sSpriteTemplate_858D7F8 =
+static const struct SpriteTemplate sSpriteTemplate_ResultsTextWindow =
{
- .tileTag = 3009,
- .paletteTag = 3009,
- .oam = &sOamData_858D7F0,
+ .tileTag = TAG_TEXT_WINDOW_BASE,
+ .paletteTag = TAG_TEXT_WINDOW_BASE,
+ .oam = &sOamData_ResultsTextWindow,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
-static const struct SpriteSheet sUnknown_0858D810[] =
+static const struct SpriteSheet sSpriteSheets_ResultsTextWindow[] =
{
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3009 },
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3010 },
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3011 },
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3012 },
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3013 },
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3014 },
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3015 },
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3016 },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_RESULTS_TEXT_WINDOW_LEFT },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_RESULTS_TEXT_WINDOW_MIDLEFT },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_RESULTS_TEXT_WINDOW_MIDRIGHT },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_RESULTS_TEXT_WINDOW_RIGHT },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_LINK_TEXT_WINDOW_LEFT },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_LINK_TEXT_WINDOW_MIDLEFT },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_LINK_TEXT_WINDOW_MIDRIGHT },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_LINK_TEXT_WINDOW_RIGHT },
};
-static const struct SpritePalette sUnknown_0858D850 =
+static const struct SpritePalette sSpritePalette_ResultsTextWindow =
{
.data = sMiscBlank_Pal,
- .tag = 3009,
+ .tag = TAG_TEXT_WINDOW_BASE,
};
static const struct OamData sOamData_Confetti =
@@ -339,7 +358,7 @@ static const struct WindowTemplate sWindowTemplates[] =
DUMMY_WIN_TEMPLATE,
};
-static const struct OamData sUnknown_0858D8C0 =
+static const struct OamData sOamData_WirelessIndicatorWindow =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
@@ -357,22 +376,22 @@ static const struct OamData sUnknown_0858D8C0 =
};
-static const struct SpriteTemplate sSpriteTemplate_858D8C8 =
+static const struct SpriteTemplate sSpriteTemplate_WirelessIndicatorWindow =
{
- .tileTag = 22222,
+ .tileTag = TAG_WIRELESS_INDICATOR_WINDOW,
.paletteTag = 0,
- .oam = &sUnknown_0858D8C0,
+ .oam = &sOamData_WirelessIndicatorWindow,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
-static const struct SpriteSheet sUnknown_0858D8E0 =
+static const struct SpriteSheet sSpriteSheet_WirelessIndicatorWindow =
{
.data = gMiscBlank_Gfx,
.size = 0x200,
- .tag = 22222
+ .tag = TAG_WIRELESS_INDICATOR_WINDOW
};
static const u8 sContestLinkTextColors[4] = {TEXT_COLOR_WHITE, TEXT_DYNAMIC_COLOR_6, TEXT_DYNAMIC_COLOR_5};
@@ -430,12 +449,12 @@ static void LoadContestResultsBgGfx(void)
u16 tile1, tile2;
LZDecompressVram(gContestResults_Gfx, (void *)BG_CHAR_ADDR(0));
- CopyToBgTilemapBuffer(3, gUnknown_08C1A12C, 0, 0);
- CopyToBgTilemapBuffer(2, gUnknown_08C1A000, 0, 0);
- CopyToBgTilemapBuffer(0, gUnknown_08C19EEC, 0, 0);
- LoadContestResultsTilemaps();
+ CopyToBgTilemapBuffer(3, gContestResults_Bg_Tilemap, 0, 0);
+ CopyToBgTilemapBuffer(2, gContestResults_Interface_Tilemap, 0, 0);
+ CopyToBgTilemapBuffer(0, gContestResults_WinnerBanner_Tilemap, 0, 0);
+ LoadContestResultsTitleBarTilemaps();
LoadCompressedPalette(gContestResults_Pal, 0, 0x200);
- LoadPalette(sUnknown_0858D6B0, 0xF0, 0x20);
+ LoadPalette(sResultsTextWindow_Pal, 0xF0, sizeof(sResultsTextWindow_Pal));
for (i = 0; i < CONTESTANT_COUNT; i++)
{
@@ -515,14 +534,14 @@ static void CB2_StartShowContestResults(void)
LoadAllContestMonNames();
memset(sContestResults->data, 0, sizeof(*sContestResults->data));
memset(sContestResults->monResults, 0, sizeof(*sContestResults->monResults));
- LoadContestResultSprites();
+ CreateResultsTextWindowSprites();
TryCreateWirelessSprites();
BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);
gPaletteFade.bufferTransferDisabled = FALSE;
sContestResults->data->showResultsTaskId = CreateTask(Task_ShowContestResults, 5);
SetMainCallback2(CB2_ShowContestResults);
gBattle_WIN1H = WIN_RANGE(0, DISPLAY_WIDTH);
- gBattle_WIN1V = WIN_RANGE(128, DISPLAY_HEIGHT);
+ gBattle_WIN1V = WIN_RANGE(DISPLAY_HEIGHT - 32, DISPLAY_HEIGHT);
CreateTask(Task_SlideContestResultsBg, 20);
CalculateContestantsResultData();
if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS)
@@ -587,10 +606,10 @@ static void Task_ShowContestResults(u8 taskId)
}
TryGainNewFanFromCounter(FANCOUNTER_FINISHED_CONTEST);
- sub_80DEDA8(gSpecialVar_ContestRank);
- sub_80DEDA8(0xFE);
- gUnknown_02039F5C = TRUE;
- gUnknown_02039F5D = sub_80DEFA8(0xFE, 0);
+ SaveContestWinner(gSpecialVar_ContestRank); // Save for lobby painting
+ SaveContestWinner(CONTEST_SAVE_FOR_ARTIST);
+ gCurContestWinnerIsForArtist = TRUE;
+ gCurContestWinnerSaveIdx = GetContestWinnerSaveIdx(CONTEST_SAVE_FOR_ARTIST, FALSE);
var = VarGet(VAR_CONTEST_HALL_STATE);
VarSet(VAR_CONTEST_HALL_STATE, 0);
SetContinueGameWarpStatusToDynamicWarp();
@@ -637,10 +656,10 @@ static void Task_ShowContestResults(u8 taskId)
if (gContestFinalStandings[gContestPlayerMonIndex] == 0)
IncrementGameStat(GAME_STAT_WON_CONTEST);
- sub_80DEDA8(gSpecialVar_ContestRank);
- sub_80DEDA8(0xFE);
- gUnknown_02039F5C = TRUE;
- gUnknown_02039F5D = sub_80DEFA8(0xFE, 0);
+ SaveContestWinner(gSpecialVar_ContestRank); // Save for lobby painting
+ SaveContestWinner(CONTEST_SAVE_FOR_ARTIST);
+ gCurContestWinnerIsForArtist = TRUE;
+ gCurContestWinnerSaveIdx = GetContestWinnerSaveIdx(CONTEST_SAVE_FOR_ARTIST, FALSE);
TryGainNewFanFromCounter(FANCOUNTER_FINISHED_CONTEST);
gTasks[taskId].func = Task_AnnouncePreliminaryResults;
}
@@ -679,7 +698,7 @@ static void Task_AnnouncePreliminaryResults(u8 taskId)
{
CreateTask(Task_FlashStarsAndHearts, 20);
x = DrawResultsTextWindow(gText_AnnouncingResults, sContestResults->data->slidingTextBoxSpriteId);
- StartTextBoxSlideIn(x, DISPLAY_HEIGHT - 16, 120, 1088);
+ StartTextBoxSlideIn(x, TEXT_BOX_Y, 120, 1088);
gTasks[taskId].tState++;
}
else if (gTasks[taskId].tState == 1)
@@ -702,7 +721,7 @@ static void Task_AnnouncePreliminaryResults(u8 taskId)
else if (gTasks[taskId].tState == 3)
{
x = DrawResultsTextWindow(gText_PreliminaryResults, sContestResults->data->slidingTextBoxSpriteId);
- StartTextBoxSlideIn(x, DISPLAY_HEIGHT - 16, -1, 1088);
+ StartTextBoxSlideIn(x, TEXT_BOX_Y, -1, 1088);
gTasks[taskId].tState++;
}
else if (gTasks[taskId].tState == 4)
@@ -752,7 +771,7 @@ static void Task_AnnounceRound2Results(u8 taskId)
{
gTasks[taskId].tTimer = 0;
x = DrawResultsTextWindow(gText_Round2Results, sContestResults->data->slidingTextBoxSpriteId);
- StartTextBoxSlideIn(x, DISPLAY_HEIGHT - 16, -1, 1088);
+ StartTextBoxSlideIn(x, TEXT_BOX_Y, -1, 1088);
}
}
else if (sContestResults->data->slidingTextBoxState == SLIDING_TEXT_ARRIVED)
@@ -837,11 +856,11 @@ static void Task_AnnounceWinner(u8 taskId)
gTasks[taskId].tTimer = 0;
GET_CONTEST_WINNER_ID(i);
StringCopy(gStringVar1, gContestMons[i].trainerName);
- sub_81DB5AC(gStringVar1);
+ ConvertInternationalContestantName(gStringVar1);
StringCopy(gStringVar2, gContestMons[i].nickname);
StringExpandPlaceholders(winnerTextBuffer, gText_ContestantsMonWon);
x = DrawResultsTextWindow(winnerTextBuffer, sContestResults->data->slidingTextBoxSpriteId);
- StartTextBoxSlideIn(x, DISPLAY_HEIGHT - 16, -1, 1088);
+ StartTextBoxSlideIn(x, TEXT_BOX_Y, -1, 1088);
gTasks[taskId].tState++;
}
break;
@@ -892,7 +911,7 @@ static void Task_ShowWinnerMonBanner(u8 taskId)
LoadCompressedSpritePalette(pokePal);
SetMultiuseSpriteTemplateToPokemon(species, B_POSITION_OPPONENT_LEFT);
gMultiuseSpriteTemplate.paletteTag = pokePal->tag;
- spriteId = CreateSprite(&gMultiuseSpriteTemplate, DISPLAY_WIDTH + 32, 80, 10);
+ spriteId = CreateSprite(&gMultiuseSpriteTemplate, DISPLAY_WIDTH + 32, DISPLAY_HEIGHT / 2, 10);
gSprites[spriteId].data[1] = species;
gSprites[spriteId].oam.priority = 0;
gSprites[spriteId].callback = SpriteCB_WinnerMonSlideIn;
@@ -1136,9 +1155,9 @@ static void TryCreateWirelessSprites(void)
LoadWirelessStatusIndicatorSpriteGfx();
CreateWirelessStatusIndicatorSprite(8, 8);
gSprites[gWirelessStatusIndicatorSpriteId].subpriority = 1;
- sheet = LoadSpriteSheet(&sUnknown_0858D8E0);
+ sheet = LoadSpriteSheet(&sSpriteSheet_WirelessIndicatorWindow);
RequestDma3Fill(0xFFFFFFFF, (void *)BG_CHAR_ADDR(4) + sheet * 0x20, 0x80, 1);
- spriteId = CreateSprite(&sSpriteTemplate_858D8C8, 8, 8, 0);
+ spriteId = CreateSprite(&sSpriteTemplate_WirelessIndicatorWindow, 8, 8, 0);
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_WINDOW;
}
}
@@ -1150,14 +1169,13 @@ static s32 DrawResultsTextWindow(const u8 *text, u8 spriteId)
int strWidth;
u8 *spriteTilePtrs[4];
u8 *dst;
- {
- struct WindowTemplate windowTemplate;
- memset(&windowTemplate, 0, sizeof(windowTemplate));
- windowTemplate.width = 30;
- windowTemplate.height = 2;
- windowId = AddWindow(&windowTemplate);
- FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
- }
+
+ struct WindowTemplate windowTemplate;
+ memset(&windowTemplate, 0, sizeof(windowTemplate));
+ windowTemplate.width = 30;
+ windowTemplate.height = 2;
+ windowId = AddWindow(&windowTemplate);
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
origWidth = GetStringWidth(1, text, 0);
strWidth = (origWidth + 9) / 8;
@@ -1169,16 +1187,16 @@ static s32 DrawResultsTextWindow(const u8 *text, u8 spriteId)
s32 i;
struct Sprite *sprite;
const u8 *src, *windowTilesPtr;
- windowTilesPtr = (u8 *)(GetWindowAttribute(windowId, WINDOW_TILE_DATA));
- src = (u8 *)(sUnknown_0858D6D0);
+ windowTilesPtr = (u8 *)GetWindowAttribute(windowId, WINDOW_TILE_DATA);
+ src = (u8 *)sResultsTextWindow_Gfx;
sprite = &gSprites[spriteId];
spriteTilePtrs[0] = (u8 *)(sprite->oam.tileNum * 32 + OBJ_VRAM0);
- for (i = 1; i < 4; i++)
+ for (i = 1; i < (int)ARRAY_COUNT(spriteTilePtrs); i++)
spriteTilePtrs[i] = (void*)(gSprites[sprite->data[i - 1]].oam.tileNum * 32 + OBJ_VRAM0);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < (int)ARRAY_COUNT(spriteTilePtrs); i++)
CpuFill32(0, spriteTilePtrs[i], 0x400);
dst = spriteTilePtrs[0];
@@ -1208,27 +1226,31 @@ static s32 DrawResultsTextWindow(const u8 *text, u8 spriteId)
return (DISPLAY_WIDTH - (strWidth + 2) * 8) / 2;
}
-static void LoadContestResultSprites(void)
+static void CreateResultsTextWindowSprites(void)
{
int i;
struct SpriteTemplate template;
- u8 spriteIds[ARRAY_COUNT(sUnknown_0858D810)];
+ u8 spriteIds[ARRAY_COUNT(sSpriteSheets_ResultsTextWindow)];
- template = sSpriteTemplate_858D7F8;
- for (i = 0; i < (int)ARRAY_COUNT(sUnknown_0858D810); i++)
- LoadSpriteSheet(&sUnknown_0858D810[i]);
+ template = sSpriteTemplate_ResultsTextWindow;
+ for (i = 0; i < (int)ARRAY_COUNT(sSpriteSheets_ResultsTextWindow); i++)
+ LoadSpriteSheet(&sSpriteSheets_ResultsTextWindow[i]);
- LoadSpritePalette(&sUnknown_0858D850);
- for (i = 0; i < (int)ARRAY_COUNT(sUnknown_0858D810); i++)
+ LoadSpritePalette(&sSpritePalette_ResultsTextWindow);
+
+ // Create sprites for the two window types, each made up of 4 sprites
+ for (i = 0; i < (int)ARRAY_COUNT(sSpriteSheets_ResultsTextWindow); i++)
{
- spriteIds[i] = CreateSprite(&template, DISPLAY_WIDTH + 32, DISPLAY_HEIGHT - 16, 10);
+ spriteIds[i] = CreateSprite(&template, TEXT_BOX_X, TEXT_BOX_Y, 10);
template.tileTag++;
}
+ // Save sprite ids of the sliding text box onto its leftmost sprite
gSprites[spriteIds[0]].data[0] = spriteIds[1];
gSprites[spriteIds[0]].data[1] = spriteIds[2];
gSprites[spriteIds[0]].data[2] = spriteIds[3];
+ // Save sprite ids of the link text box onto its leftmost sprite
gSprites[spriteIds[4]].data[0] = spriteIds[5];
gSprites[spriteIds[4]].data[1] = spriteIds[6];
gSprites[spriteIds[4]].data[2] = spriteIds[7];
@@ -1248,7 +1270,7 @@ static void LoadContestResultSprites(void)
static void StartTextBoxSlideIn(s16 x, u16 y, u16 slideOutTimer, u16 slideIncrement)
{
struct Sprite *sprite = &gSprites[sContestResults->data->slidingTextBoxSpriteId];
- sprite->pos1.x = DISPLAY_WIDTH + 32;
+ sprite->pos1.x = TEXT_BOX_X;
sprite->pos1.y = y;
sprite->pos2.x = 0;
sprite->pos2.y = 0;
@@ -1275,8 +1297,8 @@ static void StartTextBoxSlideOut(u16 slideIncrement)
static void EndTextBoxSlideOut(struct Sprite *sprite)
{
- sprite->pos1.x = DISPLAY_WIDTH + 32;
- sprite->pos1.y = DISPLAY_HEIGHT - 16;
+ sprite->pos1.x = TEXT_BOX_X;
+ sprite->pos1.y = TEXT_BOX_Y;
sprite->pos2.y = 0;
sprite->pos2.x = 0;
sprite->callback = SpriteCallbackDummy;
@@ -1377,7 +1399,7 @@ static void HideLinkResultsTextBox(void)
| WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
}
-static void LoadContestResultsTilemaps(void)
+static void LoadContestResultsTitleBarTilemaps(void)
{
u8 palette;
int x, y;
@@ -1386,58 +1408,58 @@ static void LoadContestResultsTilemaps(void)
y = 1;
if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK)
{
- CopyToBgTilemapBufferRect(2, gLinkContestResults_Tilemap, 5, 1, 5, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Link_Tilemap, 5, 1, 5, 2);
x = 10;
}
else if (gSpecialVar_ContestRank == CONTEST_RANK_NORMAL)
{
- CopyToBgTilemapBufferRect(2, gNormalContestResults_Tilemap, 5, 1, 10, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Normal_Tilemap, 5, 1, 10, 2);
x = 15;
}
else if (gSpecialVar_ContestRank == CONTEST_RANK_SUPER)
{
- CopyToBgTilemapBufferRect(2, gSuperContestResults_Tilemap, 5, 1, 10, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Super_Tilemap, 5, 1, 10, 2);
x = 15;
}
else if (gSpecialVar_ContestRank == CONTEST_RANK_HYPER)
{
- CopyToBgTilemapBufferRect(2, gHyperContestResults_Tilemap, 5, 1, 10, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Hyper_Tilemap, 5, 1, 10, 2);
x = 15;
}
else // CONTEST_RANK_MASTER
{
- CopyToBgTilemapBufferRect(2, gMasterContestResults_Tilemap, 5, 1, 10, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Master_Tilemap, 5, 1, 10, 2);
x = 15;
}
if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_COOL)
{
palette = 0;
- CopyToBgTilemapBufferRect(2, gCoolContestResults_Tilemap, x, y, 5, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Cool_Tilemap, x, y, 5, 2);
}
else if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_BEAUTY)
{
palette = 1;
- CopyToBgTilemapBufferRect(2, gBeautyContestResults_Tilemap, x, y, 5, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Beauty_Tilemap, x, y, 5, 2);
}
else if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_CUTE)
{
palette = 2;
- CopyToBgTilemapBufferRect(2, gCuteContestResults_Tilemap, x, y, 5, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Cute_Tilemap, x, y, 5, 2);
}
else if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_SMART)
{
palette = 3;
- CopyToBgTilemapBufferRect(2, gSmartContestResults_Tilemap, x, y, 5, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Smart_Tilemap, x, y, 5, 2);
}
else // CONTEST_CATEGORY_TOUGH
{
palette = 4;
- CopyToBgTilemapBufferRect(2, gToughContestResults_Tilemap, x, y, 5, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Tough_Tilemap, x, y, 5, 2);
}
x += 5;
- CopyToBgTilemapBufferRect(2, gContestResults_Tilemap, x, y, 6, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Tilemap, x, y, 6, 2);
CopyToBgTilemapBufferRect_ChangePalette(2, sContestResults->tilemapBuffers[2], 0, 0, 32, 4, palette);
}
@@ -1567,10 +1589,10 @@ static void SpriteCB_WinnerMonSlideIn(struct Sprite *sprite)
sprite->pos1.x -= delta >> 8;
sprite->data[1] += 0x600;
sprite->data[1] &= 0xFF;
- if (sprite->pos1.x < 120)
- sprite->pos1.x = 120;
+ if (sprite->pos1.x < DISPLAY_WIDTH / 2)
+ sprite->pos1.x = DISPLAY_WIDTH / 2;
- if (sprite->pos1.x == 120)
+ if (sprite->pos1.x == DISPLAY_WIDTH / 2)
{
sprite->callback = SpriteCallbackDummy;
sprite->data[1] = 0;
@@ -1628,7 +1650,7 @@ static void SpriteCB_Confetti(struct Sprite *sprite)
if (sContestResults->data->destroyConfetti)
sprite->invisible = TRUE;
- if (sprite->pos1.x > 248 || sprite->pos1.y > 116)
+ if (sprite->pos1.x > DISPLAY_WIDTH + 8 || sprite->pos1.y > 116)
{
DestroySprite(sprite);
sContestResults->data->confettiCount--;
@@ -2035,7 +2057,7 @@ void GiveMonContestRibbon(void)
void BufferContestantTrainerName(void)
{
StringCopy(gStringVar1, gContestMons[gSpecialVar_0x8006].trainerName);
- sub_81DB5AC(gStringVar1);
+ ConvertInternationalContestantName(gStringVar1);
}
void BufferContestantMonNickname(void)
@@ -2074,7 +2096,7 @@ void BufferContestWinnerTrainerName(void)
u8 i;
GET_CONTEST_WINNER_ID(i);
StringCopy(gStringVar3, gContestMons[i].trainerName);
- sub_81DB5AC(gStringVar3);
+ ConvertInternationalContestantName(gStringVar3);
}
void BufferContestWinnerMonName(void)
@@ -2257,6 +2279,10 @@ static void Task_LinkContest_WaitDisconnect(u8 taskId)
}
}
+/*
+ A section of contest script functions starts here
+*/
+
void SetContestTrainerGfxIds(void)
{
gSaveBlock1Ptr->vars[VAR_OBJ_GFX_ID_0 - VARS_START] = gContestMons[0].trainerGfxId;
@@ -2265,27 +2291,27 @@ void SetContestTrainerGfxIds(void)
}
// Unused
-void sub_80F8814(void)
+void GetNpcContestantLocalId(void)
{
- u16 var1;
- u8 var0 = gSpecialVar_0x8005;
- switch (var0)
+ u16 localId;
+ u8 contestant = gSpecialVar_0x8005;
+ switch (contestant)
{
case 0:
- var1 = 3;
+ localId = 3;
break;
case 1:
- var1 = 4;
+ localId = 4;
break;
case 2:
- var1 = 5;
+ localId = 5;
break;
- default:
- var1 = 100;
+ default: // Invalid
+ localId = 100;
break;
}
- gSpecialVar_0x8004 = var1;
+ gSpecialVar_0x8004 = localId;
}
void BufferContestTrainerAndMonNames(void)
@@ -2296,26 +2322,26 @@ void BufferContestTrainerAndMonNames(void)
}
// Unused
-void DoesContestCategoryHaveWinner(void)
+void DoesContestCategoryHaveMuseumPainting(void)
{
int contestWinner;
switch (gSpecialVar_ContestCategory)
{
case CONTEST_CATEGORY_COOL:
- contestWinner = 8;
+ contestWinner = CONTEST_WINNER_MUSEUM_COOL - 1;
break;
case CONTEST_CATEGORY_BEAUTY:
- contestWinner = 9;
+ contestWinner = CONTEST_WINNER_MUSEUM_BEAUTY - 1;
break;
case CONTEST_CATEGORY_CUTE:
- contestWinner = 10;
+ contestWinner = CONTEST_WINNER_MUSEUM_CUTE - 1;
break;
case CONTEST_CATEGORY_SMART:
- contestWinner = 11;
+ contestWinner = CONTEST_WINNER_MUSEUM_SMART - 1;
break;
case CONTEST_CATEGORY_TOUGH:
default:
- contestWinner = 12;
+ contestWinner = CONTEST_WINNER_MUSEUM_TOUGH - 1;
break;
}
@@ -2327,7 +2353,7 @@ void DoesContestCategoryHaveWinner(void)
void SaveMuseumContestPainting(void)
{
- sub_80DEDA8(0xFF);
+ SaveContestWinner(CONTEST_SAVE_FOR_MUSEUM);
}
void ShouldReadyContestArtist(void)
@@ -2344,14 +2370,14 @@ void ShouldReadyContestArtist(void)
}
}
-u8 CountPlayerContestPaintings(void)
+u8 CountPlayerMuseumPaintings(void)
{
int i;
u8 count = 0;
- for (i = 0; i < 5; i++)
+ for (i = 0; i < NUM_CONTEST_WINNERS - MUSEUM_CONTEST_WINNERS_START; i++)
{
- if (gSaveBlock1Ptr->contestWinners[8 + i].species)
+ if (gSaveBlock1Ptr->contestWinners[MUSEUM_CONTEST_WINNERS_START + i].species)
count++;
}
@@ -2359,19 +2385,21 @@ u8 CountPlayerContestPaintings(void)
}
// Unused
-void sub_80F8970(void)
+void GetContestantNamesAtRank(void)
{
s16 conditions[CONTESTANT_COUNT];
int i, j;
s16 condition;
- s8 var0;
- u8 var2;
- u8 r8;
- u8 r7;
+ s8 numAtCondition;
+ u8 contestantOffset;
+ u8 tieRank;
+ u8 rank;
+ // Get round 1 points
for (i = 0; i < CONTESTANT_COUNT; i++)
conditions[i] = gContestMonRound1Points[i];
+ // Sort round 1 points
for (i = 0; i < CONTESTANT_COUNT - 1; i++)
{
for (j = CONTESTANT_COUNT - 1; j > i; j--)
@@ -2384,58 +2412,65 @@ void sub_80F8970(void)
}
}
+ // Get round 1 points at specified rank
condition = conditions[gSpecialVar_0x8006];
- var0 = 0;
- r8 = 0;
+
+ // Count number of contestants with the same number of points
+ numAtCondition = 0;
+ tieRank = 0;
for (i = 0; i < CONTESTANT_COUNT; i++)
{
if (conditions[i] == condition)
{
- var0++;
+ numAtCondition++;
if (i == gSpecialVar_0x8006)
- r8 = var0;
+ tieRank = numAtCondition;
}
}
+ // Get rank of first contestant with the same number of points
for (i = 0; i < CONTESTANT_COUNT; i++)
{
if (conditions[i] == condition)
break;
}
+ rank = i;
- r7 = i;
- var2 = r8;
+ // Get contestant id of player at rank (taking ties into account)
+ contestantOffset = tieRank;
for (i = 0; i < CONTESTANT_COUNT; i++)
{
if (condition == gContestMonRound1Points[i])
{
- if (var2 == 1)
+ if (contestantOffset == 1)
break;
- var2--;
+ contestantOffset--;
}
}
+ // Use contestant id to get names
StringCopy(gStringVar1, gContestMons[i].nickname);
StringCopy(gStringVar2, gContestMons[i].trainerName);
- sub_81DB5AC(gStringVar2);
+ ConvertInternationalContestantName(gStringVar2);
- if (var0 == 1)
- gSpecialVar_0x8006 = r7;
- else if (r8 == var0)
- gSpecialVar_0x8006 = r7;
+ // Return adjusted rank
+ if (numAtCondition == 1)
+ gSpecialVar_0x8006 = rank;
+ else if (tieRank == numAtCondition)
+ gSpecialVar_0x8006 = rank;
else
- gSpecialVar_0x8006 = r7 + 4;
+ gSpecialVar_0x8006 = rank + CONTESTANT_COUNT;
}
-static void ExitContestWinnerPainting(void)
+static void ExitContestPainting(void)
{
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
}
-void ShowContestWinnerPainting(void)
+void ShowContestPainting(void)
{
SetMainCallback2(CB2_ContestPainting);
- gMain.savedCallback = ExitContestWinnerPainting;
+ gMain.savedCallback = ExitContestPainting;
}
void SetLinkContestPlayerGfx(void)
diff --git a/src/data/contest_opponents.h b/src/data/contest_opponents.h
index 127457bbe..b5466904b 100644
--- a/src/data/contest_opponents.h
+++ b/src/data/contest_opponents.h
@@ -138,7 +138,7 @@
const struct ContestWinner gDefaultContestWinners[] =
{
- {
+ [CONTEST_WINNER_HALL_1 - 1] = {
.personality = 0,
.trainerId = 0xFFFF,
.species = SPECIES_ELECTRIKE,
@@ -147,7 +147,7 @@ const struct ContestWinner gDefaultContestWinners[] =
.trainerName = _("EZRA"),
.contestRank = CONTEST_RANK_NORMAL
},
- {
+ [CONTEST_WINNER_HALL_2 - 1] = {
.personality = 0,
.trainerId = 0xFFFF,
.species = SPECIES_TROPIUS,
@@ -156,7 +156,7 @@ const struct ContestWinner gDefaultContestWinners[] =
.trainerName = _("ALLAN"),
.contestRank = CONTEST_RANK_HYPER
},
- {
+ [CONTEST_WINNER_HALL_3 - 1] = {
.personality = 0,
.trainerId = 0xFFFF,
.species = SPECIES_XATU,
@@ -165,7 +165,7 @@ const struct ContestWinner gDefaultContestWinners[] =
.trainerName = _("JULIET"),
.contestRank = CONTEST_RANK_NORMAL
},
- {
+ [CONTEST_WINNER_HALL_4 - 1] = {
.personality = 0,
.trainerId = 0xFFFF,
.species = SPECIES_PLUSLE,
@@ -174,7 +174,7 @@ const struct ContestWinner gDefaultContestWinners[] =
.trainerName = _("BAILY"),
.contestRank = CONTEST_RANK_MASTER
},
- {
+ [CONTEST_WINNER_HALL_5 - 1] = {
.personality = 0,
.trainerId = 0xFFFF,
.species = SPECIES_SHUPPET,
@@ -183,7 +183,7 @@ const struct ContestWinner gDefaultContestWinners[] =
.trainerName = _("MELANY"),
.contestRank = CONTEST_RANK_SUPER
},
- {
+ [CONTEST_WINNER_HALL_6 - 1] = {
.personality = 0,
.trainerId = 0xFFFF,
.species = SPECIES_ZANGOOSE,
@@ -192,7 +192,7 @@ const struct ContestWinner gDefaultContestWinners[] =
.trainerName = _("HANA"),
.contestRank = CONTEST_RANK_HYPER
},
- {
+ [CONTEST_WINNER_HALL_UNUSED_1 - 1] = {
.personality = 0,
.trainerId = 0xFFFF,
.species = SPECIES_LOUDRED,
@@ -201,7 +201,7 @@ const struct ContestWinner gDefaultContestWinners[] =
.trainerName = _("BRYANT"),
.contestRank = CONTEST_RANK_HYPER
},
- {
+ [CONTEST_WINNER_HALL_UNUSED_2 - 1] = {
.personality = 0,
.trainerId = 0xFFFF,
.species = SPECIES_DELCATTY,
diff --git a/src/data/trade.h b/src/data/trade.h
index b29e7c3d1..752971c11 100644
--- a/src/data/trade.h
+++ b/src/data/trade.h
@@ -1,3 +1,17 @@
+#define GFXTAG_MENU_TEXT 200 // Used as a base tag in CB2_CreateTradeMenu and CB2_ReturnToTradeMenu
+#define GFXTAG_CURSOR 300
+#define GFXTAG_LINK_MON_GLOW 5550
+#define GFXTAG_LINK_MON_SHADOW 5552
+#define GFXTAG_CABLE_END 5554
+#define GFXTAG_GBA_SCREEN 5556
+#define GFXTAG_POKEBALL 5557
+
+#define PALTAG_CURSOR 2345
+#define PALTAG_MENU_TEXT 4925
+#define PALTAG_LINK_MON 5551
+#define PALTAG_GBA 5555
+#define PALTAG_POKEBALL 5558
+
// Exists unused in RS as well
static const u32 sUnusedStructSizes[] =
{
@@ -25,7 +39,7 @@ static const u8 sText_Slash[] = _("/");
static const u8 sText_Lv[] = _("Lv. ");
static const u8 sText_ThreeDashes[] = _("---");
static const u8 sText_FourQuestionMarks[] = _("????");
-static const u8 sText_832DAE4[] = _("");
+static const u8 sText_UnusedEmpty[] = _("");
static const u8 sText_IsThisTradeOkay[] = _("Is this trade okay?");
static const u8 sText_Cancel[] = _("CANCEL");
static const u8 sText_ChooseAPkmn[] = _("Choose a POKéMON.");
@@ -48,107 +62,113 @@ static const struct OamData sTradeOamData_32x16 =
.priority = 1
};
-static const struct OamData sTradeOamData_64x32 =
+static const struct OamData sOamData_Cursor =
{
.shape = SPRITE_SHAPE(64x32),
.size = SPRITE_SIZE(64x32),
.priority = 1
};
-static const union AnimCmd gSpriteAnim_832DC24[] =
+static const union AnimCmd sAnim_Cursor_Normal[] =
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_END
};
-static const union AnimCmd gSpriteAnim_832DC2C[] =
+static const union AnimCmd sAnim_Cursor_OnCancel[] =
{
ANIMCMD_FRAME(32, 5),
ANIMCMD_END
};
-static const union AnimCmd *const gSpriteAnimTable_832DC34[] =
+enum {
+ CURSOR_ANIM_NORMAL,
+ CURSOR_ANIM_ON_CANCEL,
+};
+
+static const union AnimCmd *const sAnims_Cursor[] =
{
- gSpriteAnim_832DC24,
- gSpriteAnim_832DC2C
+ [CURSOR_ANIM_NORMAL] = sAnim_Cursor_Normal,
+ [CURSOR_ANIM_ON_CANCEL] = sAnim_Cursor_OnCancel
};
-static const struct SpriteSheet sTradeButtonsSpriteSheet =
+static const struct SpriteSheet sCursor_SpriteSheet =
{
- .data = gTradeButtons_Gfx,
+ .data = gTradeCursor_Gfx,
.size = 0x800,
- .tag = 300
+ .tag = GFXTAG_CURSOR
};
-static const struct SpritePalette gUnknown_0832DC44 =
+static const struct SpritePalette sCursor_SpritePalette =
{
- .data = gUnknown_08DDB444,
- .tag = 2345
+ .data = gTradeCursor_Pal,
+ .tag = PALTAG_CURSOR
};
-static const union AnimCmd gSpriteAnim_832DC4C[] =
+static const union AnimCmd sAnim_MenuText_0[] =
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_END
};
-static const union AnimCmd gSpriteAnim_832DC54[] =
+static const union AnimCmd sAnim_MenuText_1[] =
{
ANIMCMD_FRAME(8, 5),
ANIMCMD_END
};
-static const union AnimCmd gSpriteAnim_832DC5C[] =
+static const union AnimCmd sAnim_MenuText_2[] =
{
ANIMCMD_FRAME(16, 5),
ANIMCMD_END
};
-static const union AnimCmd gSpriteAnim_832DC64[] =
+static const union AnimCmd sAnim_MenuText_3[] =
{
ANIMCMD_FRAME(24, 5),
ANIMCMD_END
};
-static const union AnimCmd gSpriteAnim_832DC6C[] =
+static const union AnimCmd sAnim_MenuText_4[] =
{
ANIMCMD_FRAME(32, 5),
ANIMCMD_END
};
-static const union AnimCmd gSpriteAnim_832DC74[] =
+static const union AnimCmd sAnim_MenuText_5[] =
{
ANIMCMD_FRAME(40, 5),
ANIMCMD_END
};
-static const union AnimCmd *const gSpriteAnimTable_832DC7C[] =
+// These anims are not used
+static const union AnimCmd *const sAnims_MenuText[] =
{
- gSpriteAnim_832DC4C,
- gSpriteAnim_832DC54,
- gSpriteAnim_832DC5C,
- gSpriteAnim_832DC64,
- gSpriteAnim_832DC6C,
- gSpriteAnim_832DC74
+ sAnim_MenuText_0,
+ sAnim_MenuText_1,
+ sAnim_MenuText_2,
+ sAnim_MenuText_3,
+ sAnim_MenuText_4,
+ sAnim_MenuText_5
};
-static const struct SpriteTemplate gSpriteTemplate_832DC94 =
+static const struct SpriteTemplate sSpriteTemplate_Cursor =
{
- .tileTag = 300,
- .paletteTag = 2345,
- .oam = &sTradeOamData_64x32,
- .anims = gSpriteAnimTable_832DC34,
+ .tileTag = GFXTAG_CURSOR,
+ .paletteTag = PALTAG_CURSOR,
+ .oam = &sOamData_Cursor,
+ .anims = sAnims_Cursor,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy,
};
-static const struct SpriteTemplate gSpriteTemplate_832DCAC =
+static const struct SpriteTemplate sSpriteTemplate_MenuText =
{
- .tileTag = 200,
- .paletteTag = 4925,
+ .tileTag = GFXTAG_MENU_TEXT,
+ .paletteTag = PALTAG_MENU_TEXT,
.oam = &sTradeOamData_32x16,
- .anims = gSpriteAnimTable_832DC7C,
+ .anims = sAnims_MenuText,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy,
@@ -158,7 +178,7 @@ static const u16 TradeScreenTextPalette[] = INCBIN_U16("graphics/trade/text.gbap
static const struct SpritePalette gSpritePalette_TradeScreenText =
{
.data = TradeScreenTextPalette,
- .tag = 4925
+ .tag = PALTAG_MENU_TEXT
};
// This is used to determine the next mon to select when the D-Pad is
@@ -337,26 +357,26 @@ static const u8 sTradeMonBoxCoords[][2][2] =
},
};
-static const u8 sUnref_0832DE6E[] =
-{
- 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
+static const u8 sUnusedCoords[][2] =
+{
+ { 0, 14},
+ {15, 29},
+ { 3, 5},
+ { 3, 7},
+ {18, 5},
+ {18, 7},
+ { 8, 7},
+ {22, 12},
+ { 8, 7},
+ {22, 12},
+ { 6, 7},
+ {24, 12},
+ { 6, 7},
+ {24, 12},
+ { 8, 7},
+ {22, 12},
+ { 7, 7},
+ {23, 12}
};
static const u8 *const sTradeActionTexts[] =
@@ -620,42 +640,42 @@ static const u8 sTradeMenuPartyMonBoxDimensions[3][2] =
[TRADE_PARTNER] = {19, 3}
};
-static const u16 sTradePal_PokeBall[] = INCBIN_U16("graphics/trade/pokeball.gbapal");
-static const u8 sTradeGfx_PokeBall[] = INCBIN_U8("graphics/trade/pokeball.4bpp");
-static const u8 sTradeGfx_PokeBallSymbol[] = INCBIN_U8("graphics/trade/pokeball_symbol.8bpp"); // unused?
-static const u16 sTradeTilemap_Cable[] = INCBIN_U16("graphics/trade/cable_closeup_map.bin");
+static const u16 sPokeball_Pal[] = INCBIN_U16("graphics/trade/pokeball.gbapal");
+static const u8 sPokeball_Gfx[] = INCBIN_U8("graphics/trade/pokeball.4bpp");
+static const u8 sPokeballSymbol_Gfx[] = INCBIN_U8("graphics/trade/pokeball_symbol.8bpp"); // unused
+static const u16 sCrossingHighlightCable_Tilemap[] = INCBIN_U16("graphics/trade/crossing_highlight_cable.bin");
static const u16 sTradeTilemap_PokeBallSymbol[] = INCBIN_U16("graphics/trade/pokeball_symbol_map.bin"); // unused?
-static const u16 sUnref_083308C0[] = INCBIN_U16("graphics/trade/unknown_3308C0.gbapal");
-static const u16 sTradePal_Gba[] = INCBIN_U16("graphics/trade/gba.gbapal");
-static const u16 sTradePal_ShadowUnused[] = INCBIN_U16("graphics/trade/shadow.gbapal");
-static const u16 sTradePal_BlackUnused[] = INCBIN_U16("graphics/trade/black.gbapal");
-static const u16 sTradePal_Misc[] = INCBIN_U16("graphics/trade/misc.gbapal");
-static const u8 sTradeGfx_Glow1[] = INCBIN_U8("graphics/trade/glow1.4bpp");
-static const u8 sTradeGfx_Glow2[] = INCBIN_U8("graphics/trade/glow2.4bpp");
-static const u8 sTradeGfx_CableEnd[] = INCBIN_U8("graphics/trade/cable_end.4bpp");
-static const u8 sTradeGfx_GbaScreen[] = INCBIN_U8("graphics/trade/gba_screen.4bpp");
-const u16 gUnknown_08331F60[] = INCBIN_U16("graphics/trade/shadow_map.bin");
-static const u8 sTradeAffine_Gba[] = INCBIN_U8("graphics/trade/gba_affine.8bpp");
-static const u8 sFiller_08335760[64] = {};
-static const u8 sTradeAffineMap_GbaCable[] = INCBIN_U8("graphics/trade/gba_affine_map_cable.bin");
-static const u8 sTradeAffineMap_GbaWireless[] = INCBIN_U8("graphics/trade/gba_affine_map_wireless.bin");
-static const u16 sTradeTilemap_GbaWireless[] = INCBIN_U16("graphics/trade/gba_map_wireless.bin");
-static const u16 sTradeTilemap_GbaCable[] = INCBIN_U16("graphics/trade/gba_map_cable.bin");
-static const u32 gUnknown_083379A0[] = INCBIN_U32("graphics/trade/unknown_3379A0.bin.lz"); //some wireless tilemap
-static const u16 sTradePal_WirelessSignalSend[] = INCBIN_U16("graphics/trade/wireless_signal_send.gbapal");
-static const u16 sTradePal_WirelessSignalReceive[] = INCBIN_U16("graphics/trade/wireless_signal_receive.gbapal");
-static const u16 sTradePal_Black[] = INCBIN_U16("graphics/trade/black.gbapal");
-static const u32 sTradeGfx_WirelessSignal[] = INCBIN_U32("graphics/trade/wireless_signal.4bpp.lz");
-static const u32 sTradeTilemap_WirelessSignal[] = INCBIN_U32("graphics/trade/wireless_signal.bin.lz");
-
-static const struct OamData sTradeOamData_16x16 =
+static const u16 sUnusedPal1[] = INCBIN_U16("graphics/trade/unused1.gbapal");
+static const u16 sGba_Pal[] = INCBIN_U16("graphics/trade/gba.gbapal");
+static const u16 sUnusedPal2[] = INCBIN_U16("graphics/trade/unused2.gbapal");
+static const u16 sWirelessSignalNone_Pal_Unused[] = INCBIN_U16("graphics/trade/wireless_signal_none.gbapal");
+static const u16 sLinkMon_Pal[] = INCBIN_U16("graphics/trade/link_mon.gbapal");
+static const u8 sLinkMonGlow_Gfx[] = INCBIN_U8("graphics/trade/link_mon_glow.4bpp");
+static const u8 sLinkMonShadow_Gfx[] = INCBIN_U8("graphics/trade/link_mon_shadow.4bpp");
+static const u8 sCableEnd_Gfx[] = INCBIN_U8("graphics/trade/cable_end.4bpp");
+static const u8 sGbaScreen_Gfx[] = INCBIN_U8("graphics/trade/gba_screen.4bpp");
+const u16 gTradePlatform_Tilemap[] = INCBIN_U16("graphics/trade/platform.bin");
+static const u8 sGbaAffine_Gfx[] = INCBIN_U8("graphics/trade/gba_affine.8bpp"); // Only the gfx for when the GBA is zooming in/out
+static const u8 sEmptyGfx[64] = {};
+static const u8 sGbaCable_AffineTilemap[] = INCBIN_U8("graphics/trade/gba_affine_map_cable.bin");
+static const u8 sGbaWireless_AffineTilemap[] = INCBIN_U8("graphics/trade/gba_affine_map_wireless.bin");
+static const u16 sGbaWireless_Tilemap[] = INCBIN_U16("graphics/trade/gba_map_wireless.bin");
+static const u16 sGbaCable_Tilemap[] = INCBIN_U16("graphics/trade/gba_map_cable.bin");
+static const u32 sCrossingHighlightWireless_Tilemap[] = INCBIN_U32("graphics/trade/crossing_highlight_wireless.bin.lz");
+static const u16 sWirelessSignalSend_Pal[] = INCBIN_U16("graphics/trade/wireless_signal_send.gbapal");
+static const u16 sWirelessSignalRecv_Pal[] = INCBIN_U16("graphics/trade/wireless_signal_receive.gbapal");
+static const u16 sWirelessSignalNone_Pal[] = INCBIN_U16("graphics/trade/wireless_signal_none.gbapal");
+static const u32 sWirelessSignal_Gfx[] = INCBIN_U32("graphics/trade/wireless_signal.4bpp.lz");
+static const u32 sWirelessSignal_Tilemap[] = INCBIN_U32("graphics/trade/wireless_signal.bin.lz");
+
+static const struct OamData sOamData_Pokeball =
{
.affineMode = ST_OAM_AFFINE_NORMAL,
.shape = SPRITE_SHAPE(16x16),
.size = SPRITE_SIZE(16x16)
};
-static const union AnimCmd gSpriteAnim_8338C4C[] =
+static const union AnimCmd sAnim_Pokeball_SpinOnce[] =
{
ANIMCMD_FRAME( 0, 3),
ANIMCMD_FRAME( 4, 3),
@@ -674,7 +694,7 @@ static const union AnimCmd gSpriteAnim_8338C4C[] =
ANIMCMD_END
};
-static const union AnimCmd gSpriteAnim_8338C88[] =
+static const union AnimCmd sAnim_Pokeball_SpinTwice[] =
{
ANIMCMD_FRAME( 0, 3),
ANIMCMD_FRAME( 4, 3),
@@ -693,25 +713,25 @@ static const union AnimCmd gSpriteAnim_8338C88[] =
ANIMCMD_END
};
-static const union AnimCmd *const gSpriteAnimTable_8338C88[] =
+static const union AnimCmd *const sAnims_Pokeball[] =
{
- gSpriteAnim_8338C4C,
- gSpriteAnim_8338C88
+ sAnim_Pokeball_SpinOnce,
+ sAnim_Pokeball_SpinTwice
};
-static const union AffineAnimCmd gSpriteAffineAnim_8338CCC[] =
+static const union AffineAnimCmd sAffineAnim_Pokeball_Normal[] =
{
AFFINEANIMCMD_FRAME(0, 0, 0, 1),
AFFINEANIMCMD_END
};
-static const union AffineAnimCmd gSpriteAffineAnim_8338CDC[] =
+static const union AffineAnimCmd sAffineAnim_Pokeball_Squish[] =
{
AFFINEANIMCMD_FRAME(-8, 0, 0, 20),
AFFINEANIMCMD_END
};
-static const union AffineAnimCmd gSpriteAffineAnim_8338CEC[] =
+static const union AffineAnimCmd sAffineAnim_Pokeball_Unsquish[] =
{
AFFINEANIMCMD_FRAME(0x60, 0x100, 0, 0),
AFFINEANIMCMD_FRAME( 0, 0, 0, 5),
@@ -719,38 +739,38 @@ static const union AffineAnimCmd gSpriteAffineAnim_8338CEC[] =
AFFINEANIMCMD_END
};
-static const union AffineAnimCmd *const gSpriteAffineAnimTable_8338D0C[] =
+static const union AffineAnimCmd *const sAffineAnims_Pokeball[] =
{
- gSpriteAffineAnim_8338CCC,
- gSpriteAffineAnim_8338CDC,
- gSpriteAffineAnim_8338CEC
+ sAffineAnim_Pokeball_Normal,
+ sAffineAnim_Pokeball_Squish,
+ sAffineAnim_Pokeball_Unsquish
};
static const struct SpriteSheet sPokeBallSpriteSheet =
{
- .data = sTradeGfx_PokeBall,
+ .data = sPokeball_Gfx,
.size = 0x600,
- .tag = 5557
+ .tag = GFXTAG_POKEBALL
};
static const struct SpritePalette sPokeBallSpritePalette =
{
- .data = sTradePal_PokeBall,
- .tag = 5558
+ .data = sPokeball_Pal,
+ .tag = PALTAG_POKEBALL
};
-static const struct SpriteTemplate gSpriteTemplate_8338D28 =
+static const struct SpriteTemplate sSpriteTemplate_Pokeball =
{
- .tileTag = 5557,
- .paletteTag = 5558,
- .oam = &sTradeOamData_16x16,
- .anims = gSpriteAnimTable_8338C88,
+ .tileTag = GFXTAG_POKEBALL,
+ .paletteTag = PALTAG_POKEBALL,
+ .oam = &sOamData_Pokeball,
+ .anims = sAnims_Pokeball,
.images = NULL,
- .affineAnims = gSpriteAffineAnimTable_8338D0C,
- .callback = sub_807E55C
+ .affineAnims = sAffineAnims_Pokeball,
+ .callback = SpriteCB_BouncingPokeball
};
-static const struct OamData sTradeOamData_32x32 =
+static const struct OamData sOamData_LinkMonGlow =
{
.affineMode = ST_OAM_AFFINE_NORMAL,
.objMode = ST_OAM_OBJ_BLEND,
@@ -759,146 +779,151 @@ static const struct OamData sTradeOamData_32x32 =
.priority = 1
};
-static const union AnimCmd gSpriteAnim_8338D48[] =
+static const union AnimCmd sAnim_LinkMonGlow[] =
{
- ANIMCMD_FRAME(0, 5, .hFlip = TRUE, .vFlip = TRUE),
+ ANIMCMD_FRAME(0, 5, .hFlip = TRUE, .vFlip = TRUE), // ? The graphic is a perfect circle, no need to flip
ANIMCMD_END
};
-static const union AnimCmd *const gSpriteAnimTable_8338D50[] =
+static const union AnimCmd *const sAnims_LinkMonGlow[] =
{
- gSpriteAnim_8338D48
+ sAnim_LinkMonGlow
};
-static const union AffineAnimCmd gSpriteAffineAnim_8338D54[] =
+static const union AffineAnimCmd sAffineAnim_LinkMonGlow[] =
{
AFFINEANIMCMD_FRAME(-10, -10, 0, 5),
AFFINEANIMCMD_FRAME(10, 10, 0, 5),
AFFINEANIMCMD_JUMP(0)
};
-static const union AffineAnimCmd *const gSpriteAffineAnimTable_8338D6C[] =
+static const union AffineAnimCmd *const sAffineAnims_LinkMonGlow[] =
{
- gSpriteAffineAnim_8338D54
+ sAffineAnim_LinkMonGlow
};
-static const struct SpriteSheet sGlow1SpriteSheet =
+static const struct SpriteSheet sSpriteSheet_LinkMonGlow =
{
- .data = sTradeGfx_Glow1,
+ .data = sLinkMonGlow_Gfx,
.size = 0x200,
- .tag = 5550
+ .tag = GFXTAG_LINK_MON_GLOW
};
-static const struct SpritePalette sMiscTradeSpritePalette =
+static const struct SpritePalette sSpritePalette_LinkMon =
{
- .data = sTradePal_Misc,
- .tag = 5551
+ .data = sLinkMon_Pal,
+ .tag = PALTAG_LINK_MON
};
-static const struct SpritePalette sGbaSpritePalette =
+static const struct SpritePalette sSpritePalette_Gba =
{
- .data = sTradePal_Gba,
- .tag = 5555
+ .data = sGba_Pal,
+ .tag = PALTAG_GBA
};
-static const struct SpriteTemplate gUnknown_08338D88 =
+static const struct SpriteTemplate sSpriteTemplate_LinkMonGlow =
{
- .tileTag = 5550,
- .paletteTag = 5551,
- .oam = &sTradeOamData_32x32,
- .anims = gSpriteAnimTable_8338D50,
+ .tileTag = GFXTAG_LINK_MON_GLOW,
+ .paletteTag = PALTAG_LINK_MON,
+ .oam = &sOamData_LinkMonGlow,
+ .anims = sAnims_LinkMonGlow,
.images = NULL,
- .affineAnims = gSpriteAffineAnimTable_8338D6C,
- .callback = sub_807AA28
+ .affineAnims = sAffineAnims_LinkMonGlow,
+ .callback = SpriteCB_LinkMonGlow
};
-static const struct OamData sTradeOamData_16x32 =
+static const struct OamData sOamData_LinkMonShadow =
{
.shape = SPRITE_SHAPE(16x32),
.size = SPRITE_SIZE(16x32),
.priority = 1
};
-static const union AnimCmd gSpriteAnim_8338DA8[] =
+static const union AnimCmd sAnim_LinkMonShadow_Big[] =
{
ANIMCMD_FRAME(0, 5, .vFlip = TRUE, .hFlip = TRUE),
ANIMCMD_END
};
-static const union AnimCmd gSpriteAnim_8338DB0[] =
+static const union AnimCmd sAnim_LinkMonShadow_Small[] =
{
ANIMCMD_FRAME(8, 5, .vFlip = TRUE, .hFlip = TRUE),
ANIMCMD_END
};
-static const union AnimCmd *const gSpriteAnimTable_8338DB8[] =
+enum {
+ ANIM_LINKMON_BIG,
+ ANIM_LINKMON_SMALL,
+};
+
+static const union AnimCmd *const sAnims_LinkMonShadow[] =
{
- gSpriteAnim_8338DA8,
- gSpriteAnim_8338DB0
+ [ANIM_LINKMON_BIG] = sAnim_LinkMonShadow_Big,
+ [ANIM_LINKMON_SMALL] = sAnim_LinkMonShadow_Small
};
-static const struct SpriteSheet sGlow2SpriteSheet =
+static const struct SpriteSheet sSpriteSheet_LinkMonShadow =
{
- .data = sTradeGfx_Glow2,
+ .data = sLinkMonShadow_Gfx,
.size = 0x300,
- .tag = 5552
+ .tag = GFXTAG_LINK_MON_SHADOW
};
-static const struct SpriteTemplate sGlowBallSpriteTemplate =
+static const struct SpriteTemplate sSpriteTemplate_LinkMonShadow =
{
- .tileTag = 5552,
- .paletteTag = 5551,
- .oam = &sTradeOamData_16x32,
- .anims = gSpriteAnimTable_8338DB8,
+ .tileTag = GFXTAG_LINK_MON_SHADOW,
+ .paletteTag = PALTAG_LINK_MON,
+ .oam = &sOamData_LinkMonShadow,
+ .anims = sAnims_LinkMonShadow,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_807AA7C
+ .callback = SpriteCB_LinkMonShadow
};
-static const struct OamData sTradeOamData_16x32_2 =
+static const struct OamData sOamData_CableEnd =
{
.shape = SPRITE_SHAPE(16x32),
.size = SPRITE_SIZE(16x32),
.priority = 1
};
-static const union AnimCmd gSpriteAnim_8338DE8[] =
+static const union AnimCmd sAnim_CableEnd[] =
{
ANIMCMD_FRAME(0, 10),
ANIMCMD_END
};
-static const union AnimCmd *const gSpriteAnimTable_8338DF0[] =
+static const union AnimCmd *const sAnims_CableEnd[] =
{
- gSpriteAnim_8338DE8
+ sAnim_CableEnd
};
-static const struct SpriteSheet sCableEndSpriteSheet =
+static const struct SpriteSheet sSpriteSheet_CableEnd =
{
- .data = sTradeGfx_CableEnd,
+ .data = sCableEnd_Gfx,
.size = 0x100,
- .tag = 5554
+ .tag = GFXTAG_CABLE_END
};
-static const struct SpriteTemplate gSpriteTemplate_8338DFC =
+static const struct SpriteTemplate sSpriteTemplate_CableEnd =
{
- .tileTag = 5554,
- .paletteTag = 5555,
- .oam = &sTradeOamData_16x32_2,
- .anims = gSpriteAnimTable_8338DF0,
+ .tileTag = GFXTAG_CABLE_END,
+ .paletteTag = PALTAG_GBA,
+ .oam = &sOamData_CableEnd,
+ .anims = sAnims_CableEnd,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_807AABC
+ .callback = SpriteCB_CableEndSending
};
-static const struct OamData sTradeOamData_64x32_2 =
+static const struct OamData sOamData_GbaScreen =
{
.shape = SPRITE_SHAPE(64x32),
.size = SPRITE_SIZE(64x32),
.priority = 1
};
-static const union AnimCmd gSpriteAnim_8338E1C[] =
+static const union AnimCmd sAnim_GbaScreen_Long[] =
{
ANIMCMD_FRAME( 0, 2, .vFlip = TRUE, .hFlip = TRUE),
ANIMCMD_FRAME(32, 2, .vFlip = TRUE, .hFlip = TRUE),
@@ -911,7 +936,7 @@ static const union AnimCmd gSpriteAnim_8338E1C[] =
ANIMCMD_END
};
-static const union AnimCmd gSpriteAnim_8338E40[] =
+static const union AnimCmd sAnim_GbaScreen_Short[] =
{
ANIMCMD_FRAME( 0, 2, .vFlip = TRUE, .hFlip = TRUE),
ANIMCMD_FRAME(32, 2, .vFlip = TRUE, .hFlip = TRUE),
@@ -924,56 +949,56 @@ static const union AnimCmd gSpriteAnim_8338E40[] =
ANIMCMD_END
};
-static const union AnimCmd *const gSpriteAnimTable_8338E64[] =
+static const union AnimCmd *const sAnims_GbaScreen_Long[] =
{
- gSpriteAnim_8338E1C
+ sAnim_GbaScreen_Long
};
-static const union AnimCmd *const gSpriteAnimTable_8338E68[] =
+static const union AnimCmd *const sAnims_GbaScreen_Short[] =
{
- gSpriteAnim_8338E40
+ sAnim_GbaScreen_Short
};
-static const struct SpriteSheet sGbaScreenSpriteSheet =
+static const struct SpriteSheet sSpriteSheet_GbaScreen =
{
- .data = sTradeGfx_GbaScreen,
+ .data = sGbaScreen_Gfx,
.size = 0x1000,
- .tag = 5556
+ .tag = GFXTAG_GBA_SCREEN
};
-static const struct SpriteTemplate gSpriteTemplate_8338E74 =
+static const struct SpriteTemplate sSpriteTemplate_GbaScreenFlash_Long =
{
- .tileTag = 5556,
- .paletteTag = 5555,
- .oam = &sTradeOamData_64x32_2,
- .anims = gSpriteAnimTable_8338E64,
+ .tileTag = GFXTAG_GBA_SCREEN,
+ .paletteTag = PALTAG_GBA,
+ .oam = &sOamData_GbaScreen,
+ .anims = sAnims_GbaScreen_Long,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_807AB04
+ .callback = SpriteCB_GbaScreen
};
-static const struct SpriteTemplate gSpriteTemplate_8338E8C =
+static const struct SpriteTemplate sSpriteTemplate_GbaScreenFlash_Short =
{
- .tileTag = 5556,
- .paletteTag = 5555,
- .oam = &sTradeOamData_64x32_2,
- .anims = gSpriteAnimTable_8338E68,
+ .tileTag = GFXTAG_GBA_SCREEN,
+ .paletteTag = PALTAG_GBA,
+ .oam = &sOamData_GbaScreen,
+ .anims = sAnims_GbaScreen_Short,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_807AB04
+ .callback = SpriteCB_GbaScreen
};
-static const u16 gUnknown_08338EA4[] = INCBIN_U16("graphics/trade/unknown_338EA4.gbapal");
+static const u16 sLinkMonShadow_Pal[] = INCBIN_U16("graphics/trade/link_mon_shadow.gbapal");
-static const union AffineAnimCmd gSpriteAffineAnim_8338EBC[] =
+static const union AffineAnimCmd sAffineAnim_CrossingMonPic[] =
{
AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0),
AFFINEANIMCMD_JUMP(0)
};
-static const union AffineAnimCmd *const gSpriteAffineAnimTable_8338ECC[] =
+static const union AffineAnimCmd *const sAffineAnims_CrossingMonPics[] =
{
- gSpriteAffineAnim_8338EBC
+ sAffineAnim_CrossingMonPic
};
static const struct InGameTrade sIngameTrades[] =
@@ -1146,69 +1171,54 @@ static const struct BgTemplate sTradeSequenceBgTemplates[] =
static const s8 sTradeBallVerticalVelocityTable[] =
{
- 0, 0, 1, 0,
- 1, 0, 1, 1,
- 1, 1, 2, 2,
- 2, 2, 3, 3,
- 3, 3, 4, 4,
- 4, 4, -4, -4,
- -4, -3, -3, -3,
- -3, -2, -2, -2,
- -2, -1, -1, -1,
- -1, 0, -1, 0,
- -1, 0, 0, 0,
- 0, 0, 1, 0,
- 1, 0, 1, 1,
- 1, 1, 2, 2,
- 2, 2, 3, 3,
- 3, 3, 4, 4,
- 4, 4, -4, -3,
- -3, -2, -2, -1,
- -1, -1, 0, -1,
- 0, 0, 0, 0,
- 0, 0, 1, 0,
- 1, 1, 1, 2,
- 2, 3, 3, 4,
- -4, -3, -2, -1,
- -1, -1, 0, 0,
- 0, 0, 1, 0,
- 1, 1, 2, 3
+ 0, 0, 1, 0, 1, 0, 1, 1, 1,
+ 1, 2, 2, 2, 2, 3, 3, 3, 3,
+ 4, 4, 4, 4, -4, -4, -4, -3, -3,
+ -3, -3, -2, -2, -2, -2, -1, -1, -1,
+ -1, 0, -1, 0, -1, 0, 0, 0, 0,
+ 0, 1, 0, 1, 0, 1, 1, 1, 1,
+ 2, 2, 2, 2, 3, 3, 3, 3, 4,
+ 4, 4, 4, -4, -3, -3, -2, -2, -1,
+ -1, -1, 0, -1, 0, 0, 0, 0, 0,
+ 0, 1, 0, 1, 1, 1, 2, 2, 3,
+ 3, 4, -4, -3, -2, -1, -1, -1, 0,
+ 0, 0, 0, 1, 0, 1, 1, 2, 3
};
static const u8 sWirelessSignalTiming[][2] =
{
- {0, 1},
- {1, 1},
- {2, 1},
- {3, 1},
- {4, 1},
- {5, 2},
- {6, 2},
- {7, 2},
- {8, 2},
- {9, 2},
- {10, 3},
- {11, 3},
- {12, 3},
- {13, 4},
- {14, 5},
- {15, 2},
- {0, 1},
- {1, 1},
- {2, 1},
- {3, 1},
- {4, 1},
- {5, 2},
- {6, 2},
- {7, 2},
- {8, 2},
- {9, 2},
- {10, 3},
- {11, 3},
- {12, 3},
- {13, 4},
- {14, 5},
- {16, 1},
- {16, 255},
- {0, 0}
+ { 0, 1},
+ { 1, 1},
+ { 2, 1},
+ { 3, 1},
+ { 4, 1},
+ { 5, 2},
+ { 6, 2},
+ { 7, 2},
+ { 8, 2},
+ { 9, 2},
+ {10, 3},
+ {11, 3},
+ {12, 3},
+ {13, 4},
+ {14, 5},
+ {15, 2},
+ { 0, 1},
+ { 1, 1},
+ { 2, 1},
+ { 3, 1},
+ { 4, 1},
+ { 5, 2},
+ { 6, 2},
+ { 7, 2},
+ { 8, 2},
+ { 9, 2},
+ {10, 3},
+ {11, 3},
+ {12, 3},
+ {13, 4},
+ {14, 5},
+ {16, 1},
+ {16, -1},
+ {}
};
diff --git a/src/egg_hatch.c b/src/egg_hatch.c
index f2d28e916..7a3019f56 100644
--- a/src/egg_hatch.c
+++ b/src/egg_hatch.c
@@ -54,7 +54,7 @@ struct EggHatchData
u8 textColor[3];
};
-extern const u32 gUnknown_08331F60[]; // tilemap gameboy circle
+extern const u32 gTradePlatform_Tilemap[];
extern const u8 gText_HatchedFromEgg[];
extern const u8 gText_NicknameHatchPrompt[];
@@ -546,7 +546,7 @@ static void CB2_EggHatch_0(void)
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
LoadPalette(gTradeGba2_Pal, 0x10, 0xA0);
LoadBgTiles(1, gTradeGba_Gfx, 0x1420, 0);
- CopyToBgTilemapBuffer(1, gUnknown_08331F60, 0x1000, 0);
+ CopyToBgTilemapBuffer(1, gTradePlatform_Tilemap, 0x1000, 0);
CopyBgTilemapBufferToVram(1);
gMain.state++;
break;
diff --git a/src/ereader_helpers.c b/src/ereader_helpers.c
index 5edfc120c..eef2a15d8 100755
--- a/src/ereader_helpers.c
+++ b/src/ereader_helpers.c
@@ -14,34 +14,64 @@
#include "constants/trainers.h"
#include "constants/moves.h"
#include "constants/items.h"
+#include "constants/trainer_hill.h"
+
+enum {
+ EREADER_XFR_STATE_INIT = 0,
+ EREADER_XFR_STATE_HANDSHAKE,
+ EREADER_XFR_STATE_START,
+ EREADER_XFR_STATE_TRANSFER,
+ EREADER_XFR_STATE_TRANSFER_DONE,
+ EREADER_XFR_STATE_CHECKSUM,
+ EREADER_XFR_STATE_DONE
+};
+
+#define EREADER_XFER_EXE 1
+#define EREADER_XFER_CHK 2
+#define EREADER_XFER_SHIFT 0
+#define EREADER_XFER_MASK 3
+
+#define EREADER_CANCEL_TIMEOUT 1
+#define EREADER_CANCEL_KEY 2
+#define EREADER_CANCEL_MASK 0xC
+#define EREADER_CANCEL_SHIFT 2
-struct Unknown030012C8
+#define EREADER_CHECKSUM_OK 1
+#define EREADER_CHECKSUM_ERR 2
+#define EREADER_CHECKSUM_MASK 0x30
+#define EREADER_CHECKSUM_SHIFT 4
+
+struct SendRecvMgr
{
- u8 unk0[8];
- u32 *unk8;
- int unkC;
- int unk10;
- int unk14;
+ bool8 isParent;
+ u8 state; // EREADER_XFR_STATE_*
+ u8 xferState; // EREADER_XFER_*
+ u8 checksumResult; // EREADER_CHECKSUM_*
+ u8 cancellationReason; // EREADER_CANCEL_*
+ u32 *data; // Payload source or destination
+ int cursor; // Index of the next word
+ int size; // Last word index
+ int checksum;
};
-static void sub_81D4170(void);
-static u16 sub_81D3EE8(u8);
-static void sub_81D413C(void);
-static void sub_81D414C(void);
-static void sub_81D3F1C(u32, u32*, u32*);
-static void sub_81D3F68(void);
-
-static struct Unknown030012C8 gUnknown_030012C8;
-static u16 gUnknown_030012E0;
-static u16 gUnknown_030012E2;
-static u16 gUnknown_030012E4;
-static u16 gUnknown_030012E6;
-static u32 gUnknown_030012E8;
-static u16 gUnknown_030012EC;
-static u16 gUnknown_030012EE;
-static u16 gUnknown_030012F0;
-static u16 gUnknown_030012F2;
-static u16 gUnknown_030012F4;
+static void GetKeyInput(void);
+static u16 DetermineSendRecvState(u8);
+static void EnableSio(void);
+static void DisableTm3(void);
+static void SetUpTransferManager(size_t, const void *, void *);
+static void StartTm3(void);
+
+static struct SendRecvMgr sSendRecvMgr;
+static u16 sJoyNewOrRepeated;
+static u16 sJoyNew;
+static u16 sSendRecvStatus;
+static u16 sCounter1;
+static u32 sCounter2;
+static u16 sSavedIme;
+static u16 sSavedIe;
+static u16 sSavedTm3Cnt;
+static u16 sSavedSioCnt;
+static u16 sSavedRCnt;
static const struct TrainerHillTrainer sTrainerHillTrainerTemplates_JP[] = {
[0] = {
@@ -390,217 +420,217 @@ static const struct TrainerHillTrainer sTrainerHillTrainerTemplates_JP[] = {
},
};
-static u8 sub_81D38D4(void)
+static u8 GetTrainerHillUnkVal(void)
{
return (gSaveBlock1Ptr->trainerHill.unused + 1) % 256;
}
-static bool32 Struct_EReaderTrainerHillTrainer_ValidateChecksum(struct EReaderTrainerHillTrainer *arg0)
+static bool32 ValidateTrainerChecksum(struct EReaderTrainerHillTrainer * hillTrainer)
{
- int checksum = CalcByteArraySum((u8 *)arg0, 0x270);
- if (checksum != arg0->checksum)
+ int checksum = CalcByteArraySum((u8 *)hillTrainer, offsetof(typeof(*hillTrainer), checksum));
+ if (checksum != hillTrainer->checksum)
return FALSE;
return TRUE;
}
-bool8 EReader_IsReceivedDataValid(struct EReaderTrainerHillSet *buffer)
+bool8 ValidateTrainerHillData(struct EReaderTrainerHillSet * hillSet)
{
u32 i;
u32 checksum;
- int var0 = buffer->count;
- if (var0 < 1 || var0 > 8)
+ int numTrainers = hillSet->numTrainers;
+
+ // Validate number of trainers
+ if (numTrainers < 1 || numTrainers > NUM_TRAINER_HILL_TRAINERS)
return FALSE;
- for (i = 0; i < var0; i++)
+ // Validate trainers
+ for (i = 0; i < numTrainers; i++)
{
- if (!Struct_EReaderTrainerHillTrainer_ValidateChecksum(&buffer->unk_8[i]))
+ if (!ValidateTrainerChecksum(&hillSet->trainers[i]))
return FALSE;
}
- checksum = CalcByteArraySum((u8 *)buffer->unk_8, var0 * sizeof(struct EReaderTrainerHillTrainer));
- if (checksum != buffer->checksum)
+ // Validate checksum
+ checksum = CalcByteArraySum((u8 *)hillSet->trainers, numTrainers * sizeof(struct EReaderTrainerHillTrainer));
+ if (checksum != hillSet->checksum)
return FALSE;
return TRUE;
}
-static bool32 TrainerHill_VerifyChecksum(struct EReaderTrainerHillSet *buffer)
+static bool32 ValidateTrainerHillChecksum(struct EReaderTrainerHillSet *hillSet)
{
u32 checksum;
- int var0 = buffer->count;
- if (var0 < 1 || var0 > 8)
+ int numTrainers = hillSet->numTrainers;
+ if (numTrainers < 1 || numTrainers > NUM_TRAINER_HILL_TRAINERS)
return FALSE;
- checksum = CalcByteArraySum((u8 *)buffer->unk_8, sizeof(struct EReaderTrainerHillSet) - offsetof(struct EReaderTrainerHillSet, unk_8));
- if (checksum != buffer->checksum)
+ checksum = CalcByteArraySum((u8 *)hillSet->trainers, sizeof(struct EReaderTrainerHillSet) - offsetof(struct EReaderTrainerHillSet, trainers));
+ if (checksum != hillSet->checksum)
return FALSE;
return TRUE;
}
-static bool32 TryWriteTrainerHill_r(struct EReaderTrainerHillSet *ttdata, struct TrHillTag *buffer2)
+static bool32 TryWriteTrainerHill_Internal(struct EReaderTrainerHillSet * hillSet, struct TrHillTag * hillTag)
{
int i;
- AGB_ASSERT_EX(ttdata->dummy == 0, "cereader_tool.c", 450);
- AGB_ASSERT_EX(ttdata->id == 0, "cereader_tool.c", 452);
+ AGB_ASSERT_EX(hillSet->dummy == 0, "cereader_tool.c", 450);
+ AGB_ASSERT_EX(hillSet->id == 0, "cereader_tool.c", 452);
- memset(buffer2, 0, 0x1000);
- buffer2->numTrainers = ttdata->count;
- buffer2->unused1 = sub_81D38D4();
- buffer2->numFloors = (ttdata->count + 1) / 2;
+ memset(hillTag, 0, SECTOR_SIZE);
+ hillTag->numTrainers = hillSet->numTrainers;
+ hillTag->unused1 = GetTrainerHillUnkVal();
+ hillTag->numFloors = (hillSet->numTrainers + 1) / TRAINER_HILL_TRAINERS_PER_FLOOR;
- for (i = 0; i < ttdata->count; i++)
+ for (i = 0; i < hillSet->numTrainers; i++)
{
if (!(i & 1))
{
- buffer2->floors[i / 2].trainerNum1 = ttdata->unk_8[i].unk0;
- buffer2->floors[i / 2].display = ttdata->unk_8[i].unk14C;
- buffer2->floors[i / 2].trainers[0] = ttdata->unk_8[i].unk4;
+ hillTag->floors[i / TRAINER_HILL_TRAINERS_PER_FLOOR].trainerNum1 = hillSet->trainers[i].trainerNum;
+ hillTag->floors[i / TRAINER_HILL_TRAINERS_PER_FLOOR].display = hillSet->trainers[i].display;
+ hillTag->floors[i / TRAINER_HILL_TRAINERS_PER_FLOOR].trainers[0] = hillSet->trainers[i].trainer;
}
else
{
- buffer2->floors[i / 2].trainerNum2 = ttdata->unk_8[i].unk0;
- buffer2->floors[i / 2].trainers[1] = ttdata->unk_8[i].unk4;
+ hillTag->floors[i / TRAINER_HILL_TRAINERS_PER_FLOOR].trainerNum2 = hillSet->trainers[i].trainerNum;
+ hillTag->floors[i / TRAINER_HILL_TRAINERS_PER_FLOOR].trainers[1] = hillSet->trainers[i].trainer;
}
}
if (i & 1)
{
- buffer2->floors[i / 2].trainers[1] = sTrainerHillTrainerTemplates_JP[i / 2];
+ hillTag->floors[i / TRAINER_HILL_TRAINERS_PER_FLOOR].trainers[1] = sTrainerHillTrainerTemplates_JP[i / TRAINER_HILL_TRAINERS_PER_FLOOR];
}
- buffer2->checksum = CalcByteArraySum((u8 *)buffer2->floors, 4 * sizeof(struct TrHillFloor));
- if (TryWriteSpecialSaveSection(SECTOR_ID_TRAINER_HILL, (u8 *)buffer2) != SAVE_STATUS_OK)
+ hillTag->checksum = CalcByteArraySum((u8 *)hillTag->floors, NUM_TRAINER_HILL_FLOORS * sizeof(struct TrHillFloor));
+ if (TryWriteSpecialSaveSection(SECTOR_ID_TRAINER_HILL, (u8 *)hillTag) != SAVE_STATUS_OK)
return FALSE;
return TRUE;
}
-bool32 TryWriteTrainerHill(struct EReaderTrainerHillSet *arg0)
+bool32 TryWriteTrainerHill(struct EReaderTrainerHillSet * hillSet)
{
- void *var0 = AllocZeroed(0x1000);
- bool32 result = TryWriteTrainerHill_r(arg0, var0);
- Free(var0);
+ void *buffer = AllocZeroed(SECTOR_SIZE);
+ bool32 result = TryWriteTrainerHill_Internal(hillSet, buffer);
+ Free(buffer);
return result;
}
-static bool32 TryReadTrainerHill_r(struct EReaderTrainerHillSet *dst, u8 *buffer)
+static bool32 TryReadTrainerHill_Internal(struct EReaderTrainerHillSet * dest, u8 * buffer)
{
if (TryReadSpecialSaveSection(SECTOR_ID_TRAINER_HILL, buffer) != SAVE_STATUS_OK)
return FALSE;
- memcpy(dst, buffer, sizeof(struct EReaderTrainerHillSet));
- if (!TrainerHill_VerifyChecksum(dst))
+ memcpy(dest, buffer, sizeof(struct EReaderTrainerHillSet));
+ if (!ValidateTrainerHillChecksum(dest))
return FALSE;
return TRUE;
}
-static bool32 TryReadTrainerHill(struct EReaderTrainerHillSet *arg0)
+static bool32 TryReadTrainerHill(struct EReaderTrainerHillSet * hillSet)
{
- u8 *var0 = AllocZeroed(0x1000);
- bool32 result = TryReadTrainerHill_r(arg0, var0);
- Free(var0);
+ u8 *buffer = AllocZeroed(SECTOR_SIZE);
+ bool32 result = TryReadTrainerHill_Internal(hillSet, buffer);
+ Free(buffer);
return result;
}
bool32 ReadTrainerHillAndValidate(void)
{
- struct EReaderTrainerHillSet *var0 = AllocZeroed(0x1000);
- bool32 result = TryReadTrainerHill(var0);
- Free(var0);
+ struct EReaderTrainerHillSet *hillSet = AllocZeroed(SECTOR_SIZE);
+ bool32 result = TryReadTrainerHill(hillSet);
+ Free(hillSet);
return result;
}
-int EReader_Send(int arg0, u32 *arg1)
+int EReader_Send(int size, const void * src)
{
int result;
- u16 var0;
- int var1;
+ int sendStatus;
EReaderHelper_SaveRegsState();
while (1)
{
- sub_81D4170();
- if (gUnknown_030012E2 & 2)
+ GetKeyInput();
+ if (sJoyNew & B_BUTTON)
gShouldAdvanceLinkState = 2;
- var1 = EReaderHandleTransfer(1, arg0, arg1, NULL);
- gUnknown_030012E4 = var1;
- if ((gUnknown_030012E4 & 0x13) == 0x10)
+ sendStatus = EReaderHandleTransfer(1, size, src, NULL);
+ sSendRecvStatus = sendStatus;
+ if ((sSendRecvStatus & 0x13) == 0x10)
{
result = 0;
break;
}
-
- if (gUnknown_030012E4 & 0x8)
+ else if (sSendRecvStatus & 0x8)
{
result = 1;
break;
}
-
- var0 = gUnknown_030012E4 & 0x4;
- if (var0)
+ else if (sSendRecvStatus & 0x4)
{
result = 2;
break;
}
-
- gShouldAdvanceLinkState = var0;
- VBlankIntrWait();
+ else
+ {
+ gShouldAdvanceLinkState = 0;
+ VBlankIntrWait();
+ }
}
- CpuFill32(0, &gUnknown_030012C8, sizeof(struct Unknown030012C8));
+ CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr));
EReaderHelper_RestoreRegsState();
return result;
}
-int EReader_Recv(u32 *arg0)
+int EReader_Recv(void * dest)
{
int result;
- u16 var0;
- int var1;
+ int recvStatus;
EReaderHelper_SaveRegsState();
while (1)
{
- sub_81D4170();
- if (gUnknown_030012E2 & 2)
+ GetKeyInput();
+ if (sJoyNew & B_BUTTON)
gShouldAdvanceLinkState = 2;
- var1 = EReaderHandleTransfer(0, 0, NULL, arg0);
- gUnknown_030012E4 = var1;
- if ((gUnknown_030012E4 & 0x13) == 0x10)
+ recvStatus = EReaderHandleTransfer(0, 0, NULL, dest);
+ sSendRecvStatus = recvStatus;
+ if ((sSendRecvStatus & 0x13) == 0x10)
{
result = 0;
break;
}
-
- if (gUnknown_030012E4 & 0x8)
+ else if (sSendRecvStatus & 0x8)
{
result = 1;
break;
}
-
- var0 = gUnknown_030012E4 & 0x4;
- if (var0)
+ else if (sSendRecvStatus & 0x4)
{
result = 2;
break;
}
-
- gShouldAdvanceLinkState = var0;
- VBlankIntrWait();
+ else
+ {
+ gShouldAdvanceLinkState = 0;
+ VBlankIntrWait();
+ }
}
- CpuFill32(0, &gUnknown_030012C8, sizeof(struct Unknown030012C8));
+ CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr));
EReaderHelper_RestoreRegsState();
return result;
}
-static void sub_81D3C7C(void)
+static void CloseSerial(void)
{
REG_IME = 0;
REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);
@@ -610,7 +640,7 @@ static void sub_81D3C7C(void)
REG_IF = INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL;
}
-static void sub_81D3CBC(void)
+static void OpenSerialMulti(void)
{
REG_IME = 0;
REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);
@@ -622,273 +652,271 @@ static void sub_81D3CBC(void)
REG_IE |= INTR_FLAG_SERIAL;
REG_IME = 1;
- if (!gUnknown_030012C8.unk0[1])
- CpuFill32(0, &gUnknown_030012C8, sizeof(struct Unknown030012C8));
+ if (sSendRecvMgr.state == 0)
+ CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr));
}
-static void sub_81D3D34(void)
+static void OpenSerial32(void)
{
REG_RCNT = 0;
REG_SIOCNT = SIO_32BIT_MODE | SIO_INTR_ENABLE;
REG_SIOCNT |= SIO_MULTI_SD;
gShouldAdvanceLinkState = 0;
- gUnknown_030012E6 = 0;
- gUnknown_030012E8 = 0;
+ sCounter1 = 0;
+ sCounter2 = 0;
}
-int EReaderHandleTransfer(u8 arg0, u32 arg1, u32 *arg2, u32 *arg3)
+int EReaderHandleTransfer(u8 mode, size_t size, const void * data, void * recvBuffer)
{
- switch (gUnknown_030012C8.unk0[1])
+ switch (sSendRecvMgr.state)
{
- case 0:
- sub_81D3CBC();
- gUnknown_030012C8.unk0[2] = 1;
- gUnknown_030012C8.unk0[1] = 1;
+ case EREADER_XFR_STATE_INIT:
+ OpenSerialMulti();
+ sSendRecvMgr.xferState = EREADER_XFER_EXE;
+ sSendRecvMgr.state = EREADER_XFR_STATE_HANDSHAKE;
break;
- case 1:
- if (sub_81D3EE8(arg0))
- sub_81D413C();
+ case EREADER_XFR_STATE_HANDSHAKE:
+ if (DetermineSendRecvState(mode))
+ EnableSio();
if (gShouldAdvanceLinkState == 2)
{
- gUnknown_030012C8.unk0[4] = 2;
- gUnknown_030012C8.unk0[1] = 6;
+ sSendRecvMgr.cancellationReason = EREADER_CANCEL_KEY;
+ sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
}
break;
- case 2:
- sub_81D3D34();
- sub_81D3F1C(arg1, arg2, arg3);
- gUnknown_030012C8.unk0[1] = 3;
+ case EREADER_XFR_STATE_START:
+ OpenSerial32();
+ SetUpTransferManager(size, data, recvBuffer);
+ sSendRecvMgr.state = EREADER_XFR_STATE_TRANSFER;
// fall through
- case 3:
+ case EREADER_XFR_STATE_TRANSFER:
if (gShouldAdvanceLinkState == 2)
{
- gUnknown_030012C8.unk0[4] = 2;
- gUnknown_030012C8.unk0[1] = 6;
+ sSendRecvMgr.cancellationReason = EREADER_CANCEL_KEY;
+ sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
}
else
{
- gUnknown_030012E6++;
- gUnknown_030012E8++;
- if (!gUnknown_030012C8.unk0[0] && gUnknown_030012E8 > 60)
+ sCounter1++;
+ sCounter2++;
+ if (!sSendRecvMgr.isParent && sCounter2 > 60)
{
- gUnknown_030012C8.unk0[4] = 1;
- gUnknown_030012C8.unk0[1] = 6;
+ sSendRecvMgr.cancellationReason = EREADER_CANCEL_TIMEOUT;
+ sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
}
- if (gUnknown_030012C8.unk0[2] != 2)
+ if (sSendRecvMgr.xferState != EREADER_XFER_CHK)
{
- if (gUnknown_030012C8.unk0[0] && gUnknown_030012E6 > 2)
+ if (sSendRecvMgr.isParent && sCounter1 > 2)
{
- sub_81D413C();
- gUnknown_030012C8.unk0[2] = 2;
+ EnableSio();
+ sSendRecvMgr.xferState = EREADER_XFER_CHK;
}
else
{
- sub_81D413C();
- gUnknown_030012C8.unk0[2] = 2;
+ EnableSio();
+ sSendRecvMgr.xferState = EREADER_XFER_CHK;
}
}
}
break;
- case 4:
- sub_81D3CBC();
- gUnknown_030012C8.unk0[1] = 5;
+ case EREADER_XFR_STATE_TRANSFER_DONE:
+ OpenSerialMulti();
+ sSendRecvMgr.state = EREADER_XFR_STATE_CHECKSUM;
break;
- case 5:
- if (gUnknown_030012C8.unk0[0] == 1 && gUnknown_030012E6 > 2)
- sub_81D413C();
+ case EREADER_XFR_STATE_CHECKSUM:
+ if (sSendRecvMgr.isParent == TRUE && sCounter1 > 2)
+ EnableSio();
- if (++gUnknown_030012E6 > 60)
+ if (++sCounter1 > 60)
{
- gUnknown_030012C8.unk0[4] = 1;
- gUnknown_030012C8.unk0[1] = 6;
+ sSendRecvMgr.cancellationReason = EREADER_CANCEL_TIMEOUT;
+ sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
}
break;
- case 6:
- if (gUnknown_030012C8.unk0[2])
+ case EREADER_XFR_STATE_DONE:
+ if (sSendRecvMgr.xferState)
{
- sub_81D3C7C();
- gUnknown_030012C8.unk0[2] = 0;
+ CloseSerial();
+ sSendRecvMgr.xferState = 0;
}
break;
}
- return gUnknown_030012C8.unk0[2] | (gUnknown_030012C8.unk0[4] << 2) | (gUnknown_030012C8.unk0[3] << 4);
+ return (sSendRecvMgr.xferState << EREADER_XFER_SHIFT)
+ | (sSendRecvMgr.cancellationReason << EREADER_CANCEL_SHIFT)
+ | (sSendRecvMgr.checksumResult << EREADER_CHECKSUM_SHIFT);
}
-static u16 sub_81D3EE8(u8 arg0)
+static u16 DetermineSendRecvState(u8 mode)
{
- u16 terminal = (*(vu32 *)REG_ADDR_SIOCNT) & (SIO_MULTI_SI | SIO_MULTI_SD);
- if (terminal == SIO_MULTI_SD && arg0)
- {
- gUnknown_030012C8.unk0[0] = 1;
- return 1;
- }
+ bool16 resp;
+ if ((*(vu32 *)REG_ADDR_SIOCNT & (SIO_MULTI_SI | SIO_MULTI_SD)) == SIO_MULTI_SD && mode)
+ resp = sSendRecvMgr.isParent = TRUE;
else
- {
- gUnknown_030012C8.unk0[0] = 0;
- return 0;
- }
+ resp = sSendRecvMgr.isParent = FALSE;
+ return resp;
}
-static void sub_81D3F1C(u32 arg0, u32 *arg1, u32 *arg2)
+static void SetUpTransferManager(size_t size, const void * data, void * recvBuffer)
{
- if (gUnknown_030012C8.unk0[0])
+ if (sSendRecvMgr.isParent)
{
REG_SIOCNT |= SIO_38400_BPS;
- gUnknown_030012C8.unk8 = arg1;
- REG_SIODATA32 = arg0;
- gUnknown_030012C8.unk10 = arg0 / 4 + 1;
- sub_81D3F68();
+ sSendRecvMgr.data = (void *)data;
+ REG_SIODATA32 = size;
+ sSendRecvMgr.size = size / 4 + 1;
+ StartTm3();
}
else
{
REG_SIOCNT = REG_SIOCNT;
- gUnknown_030012C8.unk8 = arg2;
+ sSendRecvMgr.data = recvBuffer;
}
}
-static void sub_81D3F68(void)
+static void StartTm3(void)
{
- REG_TM3CNT_L = 0xFDA7;
+ REG_TM3CNT_L = -601;
REG_TM3CNT_H = TIMER_INTR_ENABLE;
REG_IME = 0;
REG_IE |= INTR_FLAG_TIMER3;
REG_IME = 1;
}
-void sub_81D3F9C(void)
+void EReaderHelper_Timer3Callback(void)
{
- sub_81D414C();
- sub_81D413C();
+ DisableTm3();
+ EnableSio();
}
-void sub_81D3FAC(void)
+void EReaderHelper_SerialCallback(void)
{
- u16 i, playerCount, k;
- u32 value;
- u16 var0;
- u16 recvBuffer[4];
+ u16 i, cnt1, cnt2;
+ u32 recv32;
+ u16 recv[4];
- switch (gUnknown_030012C8.unk0[1])
+ switch (sSendRecvMgr.state)
{
- case 1:
+ case EREADER_XFR_STATE_HANDSHAKE:
REG_SIOMLT_SEND = 0xCCD0; // Handshake id
- *(u64 *)recvBuffer = REG_SIOMLT_RECV;
- for (i = 0, playerCount = 0, k = 0; i < 4; i++)
+ *(u64 *)recv = REG_SIOMLT_RECV;
+ for (i = 0, cnt1 = 0, cnt2 = 0; i < 4; i++)
{
- if (recvBuffer[i] == 0xCCD0)
- playerCount++;
- else if (recvBuffer[i] != 0xFFFF)
- k++;
+ if (recv[i] == 0xCCD0)
+ cnt1++;
+ else if (recv[i] != 0xFFFF)
+ cnt2++;
}
- if (playerCount == 2 && k == 0)
- gUnknown_030012C8.unk0[1] = 2;
+ if (cnt1 == 2 && cnt2 == 0)
+ sSendRecvMgr.state = 2;
break;
- case 3:
- value = REG_SIODATA32;
- if (!gUnknown_030012C8.unkC && !gUnknown_030012C8.unk0[0])
- gUnknown_030012C8.unk10 = value / 4 + 1;
+ case EREADER_XFR_STATE_TRANSFER:
+ recv32 = REG_SIODATA32;
+ // The first value sent by the EReader is the payload size
+ if (!sSendRecvMgr.cursor && !sSendRecvMgr.isParent)
+ sSendRecvMgr.size = recv32 / 4 + 1;
- if (gUnknown_030012C8.unk0[0] == 1)
+ if (sSendRecvMgr.isParent == TRUE)
{
- if (gUnknown_030012C8.unkC < gUnknown_030012C8.unk10)
+ // Send mode
+ if (sSendRecvMgr.cursor < sSendRecvMgr.size)
{
- REG_SIODATA32 = gUnknown_030012C8.unk8[gUnknown_030012C8.unkC];
- gUnknown_030012C8.unk14 += gUnknown_030012C8.unk8[gUnknown_030012C8.unkC];
+ REG_SIODATA32 = sSendRecvMgr.data[sSendRecvMgr.cursor];
+ sSendRecvMgr.checksum += sSendRecvMgr.data[sSendRecvMgr.cursor];
}
else
{
- REG_SIODATA32 = gUnknown_030012C8.unk14;
+ REG_SIODATA32 = sSendRecvMgr.checksum;
}
}
else
{
- if (gUnknown_030012C8.unkC > 0 && gUnknown_030012C8.unkC < gUnknown_030012C8.unk10 + 1)
+ // Receive mode
+ if (sSendRecvMgr.cursor > 0 && sSendRecvMgr.cursor < sSendRecvMgr.size + 1)
{
- gUnknown_030012C8.unk8[gUnknown_030012C8.unkC - 1] = value;
- gUnknown_030012C8.unk14 += value;
+ sSendRecvMgr.data[sSendRecvMgr.cursor - 1] = recv32;
+ sSendRecvMgr.checksum += recv32;
}
- else if (gUnknown_030012C8.unkC)
+ else if (sSendRecvMgr.cursor)
{
- if (gUnknown_030012C8.unk14 == value)
- gUnknown_030012C8.unk0[3] = 1;
+ if (sSendRecvMgr.checksum == recv32)
+ sSendRecvMgr.checksumResult = EREADER_CHECKSUM_OK;
else
- gUnknown_030012C8.unk0[3] = 2;
+ sSendRecvMgr.checksumResult = EREADER_CHECKSUM_ERR;
}
- gUnknown_030012E8 = 0;
+ sCounter2 = 0;
}
- if (++gUnknown_030012C8.unkC < gUnknown_030012C8.unk10 + 2)
+ if (++sSendRecvMgr.cursor < sSendRecvMgr.size + 2)
{
- if (gUnknown_030012C8.unk0[0])
+ if (sSendRecvMgr.isParent)
REG_TM3CNT_H |= TIMER_ENABLE;
else
- sub_81D413C();
+ EnableSio();
}
else
{
- gUnknown_030012C8.unk0[1] = 4;
- gUnknown_030012E6 = 0;
+ sSendRecvMgr.state = EREADER_XFR_STATE_TRANSFER_DONE;
+ sCounter1 = 0;
}
break;
- case 5:
- if (!gUnknown_030012C8.unk0[0])
- REG_SIOMLT_SEND = gUnknown_030012C8.unk0[3];
+ case EREADER_XFR_STATE_CHECKSUM:
+ if (!sSendRecvMgr.isParent)
+ REG_SIOMLT_SEND = sSendRecvMgr.checksumResult;
- *(u64 *)recvBuffer = REG_SIOMLT_RECV;
- var0 = recvBuffer[1] - 1;
- if (var0 < 2)
+ *(vu64 *)recv = REG_SIOMLT_RECV;
+ if (recv[1] == EREADER_CHECKSUM_OK || recv[1] == EREADER_CHECKSUM_ERR)
{
- if (gUnknown_030012C8.unk0[0] == 1)
- gUnknown_030012C8.unk0[3] = recvBuffer[1];
+ if (sSendRecvMgr.isParent == TRUE)
+ sSendRecvMgr.checksumResult = recv[1]; // EReader has (in)validated the payload
- gUnknown_030012C8.unk0[1] = 6;
+ sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
}
break;
}
}
-static void sub_81D413C(void)
+static void EnableSio(void)
{
REG_SIOCNT |= SIO_ENABLE;
}
-static void sub_81D414C(void)
+static void DisableTm3(void)
{
REG_TM3CNT_H &= ~TIMER_ENABLE;
REG_TM3CNT_L = 0xFDA7;
}
-static void sub_81D4170(void)
+static void GetKeyInput(void)
{
- int keysMask = REG_KEYINPUT ^ KEYS_MASK;
- gUnknown_030012E2 = keysMask & ~gUnknown_030012E0;
- gUnknown_030012E0 = keysMask;
+ int rawKeys = REG_KEYINPUT ^ KEYS_MASK;
+ sJoyNew = rawKeys & ~sJoyNewOrRepeated;
+ sJoyNewOrRepeated = rawKeys;
}
void EReaderHelper_SaveRegsState(void)
{
- gUnknown_030012EC = REG_IME;
- gUnknown_030012EE = REG_IE;
- gUnknown_030012F0 = REG_TM3CNT_H;
- gUnknown_030012F2 = REG_SIOCNT;
- gUnknown_030012F4 = REG_RCNT;
+ sSavedIme = REG_IME;
+ sSavedIe = REG_IE;
+ sSavedTm3Cnt = REG_TM3CNT_H;
+ sSavedSioCnt = REG_SIOCNT;
+ sSavedRCnt = REG_RCNT;
}
void EReaderHelper_RestoreRegsState(void)
{
- REG_IME = gUnknown_030012EC;
- REG_IE = gUnknown_030012EE;
- REG_TM3CNT_H = gUnknown_030012F0;
- REG_SIOCNT = gUnknown_030012F2;
- REG_RCNT = gUnknown_030012F4;
+ REG_IME = sSavedIme;
+ REG_IE = sSavedIe;
+ REG_TM3CNT_H = sSavedTm3Cnt;
+ REG_SIOCNT = sSavedSioCnt;
+ REG_RCNT = sSavedRCnt;
}
-void sub_81D4238(void)
+void EReaderHelper_ClearSendRecvMgr(void)
{
- CpuFill32(0, &gUnknown_030012C8, sizeof(struct Unknown030012C8));
+ CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr));
}
diff --git a/src/ereader_screen.c b/src/ereader_screen.c
index d27605c1d..438c4bec9 100755
--- a/src/ereader_screen.c
+++ b/src/ereader_screen.c
@@ -47,10 +47,10 @@ static void sub_81D4D50(struct Unk03006370 *arg0, int arg1, u32 *arg2)
{
volatile u16 backupIME = REG_IME;
REG_IME = 0;
- gIntrTable[1] = sub_81D3FAC;
- gIntrTable[2] = sub_81D3F9C;
+ gIntrTable[1] = EReaderHelper_SerialCallback;
+ gIntrTable[2] = EReaderHelper_Timer3Callback;
EReaderHelper_SaveRegsState();
- sub_81D4238();
+ EReaderHelper_ClearSendRecvMgr();
REG_IE |= INTR_FLAG_VCOUNT;
REG_IME = backupIME;
arg0->unk0 = 0;
@@ -62,7 +62,7 @@ static void sub_81D4DB8(struct Unk03006370 *arg0)
{
volatile u16 backupIME = REG_IME;
REG_IME = 0;
- sub_81D4238();
+ EReaderHelper_ClearSendRecvMgr();
EReaderHelper_RestoreRegsState();
RestoreSerialTimer3IntrHandlers();
REG_IME = backupIME;
@@ -401,7 +401,7 @@ static void sub_81D5084(u8 taskId)
}
break;
case 15:
- data->unkE = EReader_IsReceivedDataValid((struct EReaderTrainerHillSet *)gDecompressionBuffer);
+ data->unkE = ValidateTrainerHillData((struct EReaderTrainerHillSet *)gDecompressionBuffer);
SetCloseLinkCallbackAndType(data->unkE);
data->unk8 = 16;
break;
diff --git a/src/graphics.c b/src/graphics.c
index 4a96a0da1..c3ac6c2df 100644
--- a/src/graphics.c
+++ b/src/graphics.c
@@ -471,11 +471,11 @@ const u8 gContestSliderHeart_Gfx[] = INCBIN_U8("graphics/contest/slider_heart.4b
const u32 gUnknownGfx_C19470[] = INCBIN_U32("graphics/unknown/unknown_C19470.4bpp.lz");
const u32 gUnknownPal_C19470[] = INCBIN_U32("graphics/unknown/unknown_C19470.gbapal.lz");
-const u32 gContestResults_Gfx[] = INCBIN_U32("graphics/contest/results_screen.4bpp.lz");
-const u32 gUnknown_08C19EEC[] = INCBIN_U32("graphics/contest/misc_2_tilemap_1.bin.lz");
-const u32 gUnknown_08C1A000[] = INCBIN_U32("graphics/contest/misc_2_tilemap_2.bin.lz");
-const u32 gUnknown_08C1A12C[] = INCBIN_U32("graphics/contest/misc_2_tilemap_3.bin.lz");
-const u32 gContestResults_Pal[] = INCBIN_U32("graphics/contest/results_screen.gbapal.lz");
+const u32 gContestResults_Gfx[] = INCBIN_U32("graphics/contest/results_screen/tiles.4bpp.lz");
+const u32 gContestResults_WinnerBanner_Tilemap[] = INCBIN_U32("graphics/contest/results_screen/winner_banner.bin.lz");
+const u32 gContestResults_Interface_Tilemap[] = INCBIN_U32("graphics/contest/results_screen/interface.bin.lz");
+const u32 gContestResults_Bg_Tilemap[] = INCBIN_U32("graphics/contest/results_screen/bg.bin.lz");
+const u32 gContestResults_Pal[] = INCBIN_U32("graphics/contest/results_screen/tiles.gbapal.lz");
const u32 gBattleAnimSpriteGfx_Impact[] = INCBIN_U32("graphics/battle_anims/sprites/impact.4bpp.lz");
const u32 gBattleAnimSpritePal_Impact[] = INCBIN_U32("graphics/battle_anims/sprites/impact.gbapal.lz");
@@ -1296,17 +1296,17 @@ const u8 gBagMenuHMIcon_Gfx[] = INCBIN_U8("graphics/interface/hm.4bpp");
// contest results screen
-const u16 gNormalContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_normal.bin");
-const u16 gSuperContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_super.bin");
-const u16 gHyperContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_hyper.bin");
-const u16 gMasterContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_master.bin");
-const u16 gLinkContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_link.bin");
-const u16 gCoolContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_cool.bin");
-const u16 gBeautyContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_beauty.bin");
-const u16 gCuteContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_cute.bin");
-const u16 gSmartContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_smart.bin");
-const u16 gToughContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_tough.bin");
-const u16 gContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen.bin");
+const u16 gContestResultsTitle_Normal_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_normal.bin");
+const u16 gContestResultsTitle_Super_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_super.bin");
+const u16 gContestResultsTitle_Hyper_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_hyper.bin");
+const u16 gContestResultsTitle_Master_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_master.bin");
+const u16 gContestResultsTitle_Link_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_link.bin");
+const u16 gContestResultsTitle_Cool_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_cool.bin");
+const u16 gContestResultsTitle_Beauty_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_beauty.bin");
+const u16 gContestResultsTitle_Cute_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_cute.bin");
+const u16 gContestResultsTitle_Smart_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_smart.bin");
+const u16 gContestResultsTitle_Tough_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_tough.bin");
+const u16 gContestResultsTitle_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title.bin");
// pokenav
@@ -1474,9 +1474,9 @@ static const u16 sEmptyPal[16] = {0};
// Trade
const u16 gTradeMenu_Pal[] = INCBIN_U16("graphics/trade/menu.gbapal");
-const u16 gUnknown_08DDB444[] = INCBIN_U16("graphics/trade/unknown_DDB444.gbapal");
+const u16 gTradeCursor_Pal[] = INCBIN_U16("graphics/trade/cursor.gbapal");
const u8 gTradeMenu_Gfx[] = INCBIN_U8("graphics/trade/menu.4bpp");
-const u8 gTradeButtons_Gfx[] = INCBIN_U8("graphics/trade/buttons.4bpp");
+const u8 gTradeCursor_Gfx[] = INCBIN_U8("graphics/trade/cursor.4bpp");
const u16 gUnused_DDCEE4[] = INCBIN_U16("graphics/unused/unused_DDCEE4.bin");
const u16 gUnknown_08DDCF04[] = INCBIN_U16("graphics/trade/unknown_DDCF04.bin");
const u16 gTradeMenuMonBox_Tilemap[] = INCBIN_U16("graphics/trade/menu_mon_box.bin");
diff --git a/src/international_string_util.c b/src/international_string_util.c
index ed1e17816..ab812de89 100644
--- a/src/international_string_util.c
+++ b/src/international_string_util.c
@@ -185,7 +185,7 @@ void ConvertInternationalPlayerNameStripChar(u8 *str, u8 removeChar)
}
}
-void sub_81DB5AC(u8 *str)
+void ConvertInternationalContestantName(u8 *str)
{
if (*str++ == EXT_CTRL_CODE_BEGIN && *str++ == EXT_CTRL_CODE_JPN)
{
diff --git a/src/item.c b/src/item.c
index 892092184..b5f9e0dd6 100644
--- a/src/item.c
+++ b/src/item.c
@@ -820,7 +820,7 @@ bool8 RemovePyramidBagItem(u16 itemId, u16 count)
u16 *items = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode];
u8 *quantities = gSaveBlock2Ptr->frontier.pyramidBag.quantity[gSaveBlock2Ptr->frontier.lvlMode];
- i = gPyramidBagCursorData.cursorPosition + gPyramidBagCursorData.scrollPosition;
+ i = gPyramidBagMenuState.cursorPosition + gPyramidBagMenuState.scrollPosition;
if (items[i] == itemId && quantities[i] >= count)
{
quantities[i] -= count;
diff --git a/src/item_menu.c b/src/item_menu.c
index 865f8d8d1..de4d82e9b 100755
--- a/src/item_menu.c
+++ b/src/item_menu.c
@@ -509,7 +509,6 @@ EWRAM_DATA u16 gSpecialVar_ItemId = 0;
static EWRAM_DATA struct TempWallyStruct *sTempWallyBag = 0;
extern u8 *const gPocketNamesStringsTable[];
-extern u8* gReturnToXStringsTable[];
extern const u8 EventScript_SelectWithoutRegisteredItem[];
extern const u16 gUnknown_0860F074[];
@@ -530,7 +529,7 @@ void CB2_BagMenuFromBattle(void)
if (!InBattlePyramid())
GoToBagMenu(ITEMMENULOCATION_BATTLE, POCKETS_COUNT, CB2_SetUpReshowBattleScreenAfterMenu2);
else
- GoToBattlePyramidBagMenu(1, CB2_SetUpReshowBattleScreenAfterMenu2);
+ GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_BATTLE, CB2_SetUpReshowBattleScreenAfterMenu2);
}
// Choosing berry to plant
@@ -947,7 +946,7 @@ void BagMenu_PrintDescription(int itemIndex)
}
else
{
- StringCopy(gStringVar1, gReturnToXStringsTable[gBagPositionStruct.location]);
+ StringCopy(gStringVar1, gBagMenu_ReturnToStrings[gBagPositionStruct.location]);
StringExpandPlaceholders(gStringVar4, gText_ReturnToVar1);
str = gStringVar4;
}
@@ -1458,7 +1457,7 @@ void sub_81AC590(u8 taskId)
gTasks[taskId].func = Task_BagMenu_HandleInput;
}
-void OpenContextMenu(u8 unused)
+static void OpenContextMenu(u8 unused)
{
switch (gBagPositionStruct.location)
{
@@ -1604,8 +1603,8 @@ void sub_81ACAF8(u8 a)
void sub_81ACB54(u8 a, u8 b, u8 c)
{
- sub_8198DBC(a, 7, 8, 1, 0x38, b, c, sItemMenuActions, gBagMenu->contextMenuItemsPtr);
- sub_8199944(a, 0x38, b, c, 0);
+ PrintMenuActionGrid(a, 7, 8, 1, 0x38, b, c, sItemMenuActions, gBagMenu->contextMenuItemsPtr);
+ InitMenuActionGrid(a, 0x38, b, c, 0);
}
void Task_ItemContext_FieldOrBattle(u8 taskId)
@@ -1850,7 +1849,7 @@ void ItemMenu_Register(u8 taskId)
void ItemMenu_Give(u8 taskId)
{
BagMenu_RemoveSomeWindow();
- if (!itemid_80BF6D8_mail_related(gSpecialVar_ItemId))
+ if (!IsWritingMailAllowed(gSpecialVar_ItemId))
{
DisplayItemMessage(taskId, 1, gText_CantWriteMail, sub_81AD350);
}
@@ -1925,7 +1924,7 @@ void CB2_ReturnToBagMenuPocket(void)
void Task_ItemContext_FieldGive(u8 taskId)
{
- if (!itemid_80BF6D8_mail_related(gSpecialVar_ItemId))
+ if (!IsWritingMailAllowed(gSpecialVar_ItemId))
{
DisplayItemMessage(taskId, 1, gText_CantWriteMail, sub_81AD350);
}
diff --git a/src/item_use.c b/src/item_use.c
index af0ca9ee5..19f50549e 100755
--- a/src/item_use.c
+++ b/src/item_use.c
@@ -109,8 +109,8 @@ static void SetUpItemUseCallback(u8 taskId)
}
else
{
- gPyramidBagResources->callback2 = sItemUseCallbacks[type];
- CloseBattlePyramidBagAndSetCallback(taskId);
+ gPyramidBagMenu->exitCallback = sItemUseCallbacks[type];
+ CloseBattlePyramidBag(taskId);
}
}
@@ -822,8 +822,8 @@ static void RemoveUsedItem(void)
}
else
{
- sub_81C5924();
- sub_81C59BC();
+ UpdatePyramidBagList();
+ UpdatePyramidBagCursorPos();
}
}
@@ -943,7 +943,7 @@ void ItemUseInBattle_PokeBall(u8 taskId)
if (!InBattlePyramid())
Task_FadeAndCloseBagMenu(taskId);
else
- CloseBattlePyramidBagAndSetCallback(taskId);
+ CloseBattlePyramidBag(taskId);
}
else if (!InBattlePyramid())
{
@@ -960,7 +960,7 @@ static void Task_CloseStatIncreaseMessage(u8 taskId)
if (!InBattlePyramid())
Task_FadeAndCloseBagMenu(taskId);
else
- CloseBattlePyramidBagAndSetCallback(taskId);
+ CloseBattlePyramidBag(taskId);
}
}
@@ -1005,8 +1005,8 @@ static void ItemUseInBattle_ShowPartyMenu(u8 taskId)
}
else
{
- gPyramidBagResources->callback2 = ChooseMonForInBattleItem;
- CloseBattlePyramidBagAndSetCallback(taskId);
+ gPyramidBagMenu->exitCallback = ChooseMonForInBattleItem;
+ CloseBattlePyramidBag(taskId);
}
}
@@ -1039,7 +1039,7 @@ void ItemUseInBattle_Escape(u8 taskId)
if (!InBattlePyramid())
DisplayItemMessage(taskId, 1, gStringVar4, Task_FadeAndCloseBagMenu);
else
- DisplayItemMessageInBattlePyramid(taskId, gStringVar4, CloseBattlePyramidBagAndSetCallback);
+ DisplayItemMessageInBattlePyramid(taskId, gStringVar4, CloseBattlePyramidBag);
}
else
{
diff --git a/src/menu.c b/src/menu.c
index 44b39d762..154f88187 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -1241,7 +1241,7 @@ void sub_8198D54(u8 windowId, u8 fontId, u8 a2, u8 a3, u8 a4, u8 a5, const struc
sub_8198C94(windowId, fontId, GetFontAttribute(fontId, 0), 0, a2, a3, a4, a5, strs);
}
-void sub_8198DBC(u8 windowId, u8 fontId, u8 left, u8 top, u8 a4, u8 itemCount, u8 itemCount2, const struct MenuAction *strs, const u8 *a8)
+void PrintMenuActionGrid(u8 windowId, u8 fontId, u8 left, u8 top, u8 optionWidth, u8 horizontalCount, u8 verticalCount, const struct MenuAction *strs, const u8 *strIds)
{
u8 i;
u8 j;
@@ -1256,13 +1256,13 @@ void sub_8198DBC(u8 windowId, u8 fontId, u8 left, u8 top, u8 a4, u8 itemCount, u
printer.letterSpacing = GetFontAttribute(fontId, FONTATTR_LETTER_SPACING);
printer.lineSpacing = GetFontAttribute(fontId, FONTATTR_LINE_SPACING);
- for (i = 0; i < itemCount2; i++)
+ for (i = 0; i < verticalCount; i++)
{
- for (j = 0; j < itemCount; j++)
+ for (j = 0; j < horizontalCount; j++)
{
- printer.currentChar = strs[a8[(itemCount * i) + j]].text;
- printer.x = (a4 * j) + left;
- printer.y = (GetFontAttribute(fontId, 1) * i) + top;
+ printer.currentChar = strs[strIds[(horizontalCount * i) + j]].text;
+ printer.x = (optionWidth * j) + left;
+ printer.y = (GetFontAttribute(fontId, FONTATTR_MAX_LETTER_HEIGHT) * i) + top;
printer.currentX = printer.x;
printer.currentY = printer.y;
AddTextPrinter(&printer, 0xFF, NULL);
@@ -1272,9 +1272,10 @@ void sub_8198DBC(u8 windowId, u8 fontId, u8 left, u8 top, u8 a4, u8 itemCount, u
CopyWindowToVram(windowId, 2);
}
-void sub_8198EF8(u8 windowId, u8 fontId, u8 a2, u8 a3, u8 a4, u8 a5, const struct MenuAction *strs, const u8 *a8)
+// Unused
+static void PrintMenuActionGrid_TopLeft(u8 windowId, u8 fontId, u8 optionWidth, u8 unused, u8 horizontalCount, u8 verticalCount, const struct MenuAction *strs, const u8 *strIds)
{
- sub_8198DBC(windowId, fontId, GetFontAttribute(fontId, 0), 0, a2, a4, a5, strs, a8);
+ PrintMenuActionGrid(windowId, fontId, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH), 0, optionWidth, horizontalCount, verticalCount, strs, strIds);
}
u8 sub_8198F58(u8 windowId, u8 fontId, u8 left, u8 top, u8 a4, u8 cursorHeight, u8 a6, u8 a7, u8 numChoices, u8 a9)
@@ -1701,7 +1702,7 @@ void sub_819983C(u8 windowId, u8 a4, u8 itemCount, u8 itemCount2, const struct M
CopyWindowToVram(windowId, 2);
}
-u8 sub_8199944(u8 windowId, u8 optionWidth, u8 columns, u8 rows, u8 initialCursorPos)
+u8 InitMenuActionGrid(u8 windowId, u8 optionWidth, u8 columns, u8 rows, u8 initialCursorPos)
{
s32 pos;
diff --git a/src/menu_helpers.c b/src/menu_helpers.c
index 5a6ac8394..151de0bd4 100644
--- a/src/menu_helpers.c
+++ b/src/menu_helpers.c
@@ -287,7 +287,7 @@ bool8 sub_8122148(u16 itemId)
return FALSE;
}
-bool8 itemid_80BF6D8_mail_related(u16 itemId)
+bool8 IsWritingMailAllowed(u16 itemId)
{
if (IsUpdateLinkStateCBActive() != TRUE && InUnionRoom() != TRUE)
return TRUE;
diff --git a/src/new_game.c b/src/new_game.c
index 05d86aa8c..2a950efbc 100644
--- a/src/new_game.c
+++ b/src/new_game.c
@@ -48,23 +48,19 @@
extern const u8 EventScript_ResetAllMapFlags[];
-// this file's functions
static void ClearFrontierRecord(void);
static void WarpToTruck(void);
static void ResetMiniGamesRecords(void);
-// EWRAM vars
EWRAM_DATA bool8 gDifferentSaveFile = FALSE;
EWRAM_DATA bool8 gEnableContestDebugging = FALSE;
-// const rom data
static const struct ContestWinner sContestWinnerPicDummy =
{
.monName = _(""),
.trainerName = _("")
};
-// code
void SetTrainerId(u32 trainerId, u8 *dst)
{
dst[0] = trainerId;
@@ -114,7 +110,9 @@ void ClearAllContestWinnerPics(void)
s32 i;
ClearContestWinnerPicsInContestHall();
- for (i = 8; i < 13; i++)
+
+ // Clear Museum paintings
+ for (i = MUSEUM_CONTEST_WINNERS_START; i < NUM_CONTEST_WINNERS; i++)
gSaveBlock1Ptr->contestWinners[i] = sContestWinnerPicDummy;
}
diff --git a/src/party_menu.c b/src/party_menu.c
index 81c39949b..681dc5f93 100755
--- a/src/party_menu.c
+++ b/src/party_menu.c
@@ -3020,7 +3020,7 @@ static void CB2_SelectBagItemToGive(void)
if (InBattlePyramid() == FALSE)
GoToBagMenu(ITEMMENULOCATION_PARTY, POCKETS_COUNT, CB2_GiveHoldItem);
else
- GoToBattlePyramidBagMenu(2, CB2_GiveHoldItem);
+ GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_PARTY, CB2_GiveHoldItem);
}
static void CB2_GiveHoldItem(void)
@@ -4203,7 +4203,7 @@ static void CB2_ReturnToBagMenu(void)
if (InBattlePyramid() == FALSE)
GoToBagMenu(ITEMMENULOCATION_LAST, POCKETS_COUNT, NULL);
else
- GoToBattlePyramidBagMenu(4, gPyramidBagCursorData.callback);
+ GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_PREV, gPyramidBagMenuState.callback);
}
static void Task_SetSacredAshCB(u8 taskId)
diff --git a/src/scrcmd.c b/src/scrcmd.c
index 7dc02b6a8..0ee20d1c6 100644
--- a/src/scrcmd.c
+++ b/src/scrcmd.c
@@ -1466,15 +1466,15 @@ bool8 ScrCmd_hidemonpic(struct ScriptContext *ctx)
return TRUE;
}
-bool8 ScrCmd_showcontestwinner(struct ScriptContext *ctx)
+bool8 ScrCmd_showcontestpainting(struct ScriptContext *ctx)
{
u8 contestWinnerId = ScriptReadByte(ctx);
- // Don't save artist's painting yet
+ // Artist's painting is temporary and already has its data loaded
if (contestWinnerId != CONTEST_WINNER_ARTIST)
SetContestWinnerForPainting(contestWinnerId);
- ShowContestWinnerPainting();
+ ShowContestPainting();
ScriptContext1_Stop();
return TRUE;
}
diff --git a/src/script_menu.c b/src/script_menu.c
index 51c37b5b6..f3317773a 100644
--- a/src/script_menu.c
+++ b/src/script_menu.c
@@ -279,7 +279,7 @@ bool8 ScriptMenu_MultichoiceGrid(u8 left, u8 top, u8 multichoiceId, bool8 ignore
gTasks[taskId].tWindowId = CreateWindowFromRect(left, top, columnCount * newWidth, rowCount * 2);
SetStandardWindowBorderStyle(gTasks[taskId].tWindowId, 0);
PrintMenuGridTable(gTasks[taskId].tWindowId, newWidth * 8, columnCount, rowCount, sMultichoiceLists[multichoiceId].list);
- sub_8199944(gTasks[taskId].tWindowId, newWidth * 8, columnCount, rowCount, 0);
+ InitMenuActionGrid(gTasks[taskId].tWindowId, newWidth * 8, columnCount, rowCount, 0);
CopyWindowToVram(gTasks[taskId].tWindowId, 3);
return TRUE;
}
diff --git a/src/strings.c b/src/strings.c
index 5c9b09c83..18cf31fb7 100644
--- a/src/strings.c
+++ b/src/strings.c
@@ -1,5 +1,6 @@
#include "global.h"
#include "strings.h"
+#include "battle_pyramid_bag.h"
ALIGNED(4)
const u8 gText_ExpandedPlaceholder_Empty[] = _("");
@@ -252,7 +253,7 @@ const u8 gText_ThePokemonList[] = _("the POKéMON LIST");
const u8 gText_TheShop[] = _("the shop");
const u8 gText_ThePC[] = _("the PC");
-const u8 *const gReturnToXStringsTable[] =
+const u8 *const gBagMenu_ReturnToStrings[] =
{
gText_TheField,
gText_TheBattle,
@@ -268,12 +269,12 @@ const u8 *const gReturnToXStringsTable[] =
gText_ThePC
};
-const u8 *const gReturnToXStringsTable2[] =
+const u8 *const gPyramidBagMenu_ReturnToStrings[] =
{
- gText_TheField,
- gText_TheBattle,
- gText_ThePokemonList,
- gText_TheField
+ [PYRAMIDBAG_LOC_FIELD] = gText_TheField,
+ [PYRAMIDBAG_LOC_BATTLE] = gText_TheBattle,
+ [PYRAMIDBAG_LOC_PARTY] = gText_ThePokemonList,
+ [PYRAMIDBAG_LOC_CHOOSE_TOSS] = gText_TheField
};
const u8 gText_ReturnToVar1[] = _("Return to\n{STR_VAR_1}.");
diff --git a/src/trade.c b/src/trade.c
index 3869348cb..78d7399fa 100644
--- a/src/trade.c
+++ b/src/trade.c
@@ -52,7 +52,29 @@
#include "constants/songs.h"
#include "constants/union_room.h"
-#define Trade_SendData(ptr) (SendBlock(bitmask_all_link_players_but_self(), ptr->linkData, 20))
+// The following tags are offsets from GFXTAG_MENU_TEXT
+// They're looped over in CB2_CreateTradeMenu and CB2_ReturnToTradeMenu
+// and used as indexes into sMenuTextTileBuffers
+enum {
+ GFXTAG_PLAYER_NAME_L,
+ GFXTAG_PLAYER_NAME_M,
+ GFXTAG_PLAYER_NAME_R,
+ GFXTAG_PARTNER_NAME_L,
+ GFXTAG_PARTNER_NAME_M,
+ GFXTAG_PARTNER_NAME_R,
+ GFXTAG_CANCEL_L,
+ GFXTAG_CANCEL_R,
+ GFXTAG_CHOOSE_PKMN_L,
+ GFXTAG_CHOOSE_PKMN_M,
+ GFXTAG_CHOOSE_PKMN_R,
+ GFXTAG_CHOOSE_PKMN_EMPTY_1, // 6 sprites to cover the full bottom bar, but only first 3 are needed
+ GFXTAG_CHOOSE_PKMN_EMPTY_2,
+ GFXTAG_CHOOSE_PKMN_EMPTY_3,
+ GFXTAG_MENU_TEXT_COUNT
+};
+#define GFXTAG_PLAYER_NAME (1 + GFXTAG_PLAYER_NAME_R - GFXTAG_PLAYER_NAME_L)
+#define GFXTAG_PARTNER_NAME (1 + GFXTAG_PARTNER_NAME_R - GFXTAG_PARTNER_NAME_L)
+#define GFXTAG_CHOOSE_PKMN (1 + GFXTAG_CHOOSE_PKMN_EMPTY_3 - GFXTAG_CHOOSE_PKMN_L)
struct InGameTrade {
/*0x00*/ u8 nickname[POKEMON_NAME_LENGTH + 1];
@@ -70,22 +92,23 @@ struct InGameTrade {
/*0x38*/ u16 requestedSpecies;
};
-static EWRAM_DATA u8 *sMessageBoxAllocBuffer = NULL;
+static EWRAM_DATA u8 *sMenuTextAllocBuffer = NULL;
-// Bytes 0-2 are used for the player's name box
-// Bytes 3-5 are used for the partner's name box
-// Bytes 6-7 are used for the Cancel box
-// Bytes 8-13 are used for the Choose a Pokemon box
-static EWRAM_DATA u8 *sMessageBoxTileBuffers[14] = {NULL};
+// Bytes 0-2 are used for the player's name text
+// Bytes 3-5 are used for the partner's name text
+// Bytes 6-7 are used for the Cancel text
+// Bytes 8-13 are used for the Choose a Pokemon text
+// See the corresponding GFXTAGs in src/data/trade.h
+static EWRAM_DATA u8 *sMenuTextTileBuffers[GFXTAG_MENU_TEXT_COUNT] = {NULL};
EWRAM_DATA struct MailStruct gTradeMail[PARTY_SIZE] = {0};
EWRAM_DATA u8 gSelectedTradeMonPositions[2] = {0};
static EWRAM_DATA struct {
/*0x0000*/ u8 bg2hofs;
/*0x0001*/ u8 bg3hofs;
- /*0x0002*/ u8 filler_2[0x28 - 2];
+ /*0x0002*/ u8 filler_2[38];
/*0x0028*/ u8 partySpriteIds[2][PARTY_SIZE];
- /*0x0034*/ u8 cursorSpriteIdx;
+ /*0x0034*/ u8 cursorSpriteId;
/*0x0035*/ u8 cursorPosition;
/*0x0036*/ u8 partyCounts[2];
/*0x0038*/ bool8 monPresent[PARTY_SIZE * 2];
@@ -94,7 +117,7 @@ static EWRAM_DATA struct {
/*0x0051*/ bool8 isEgg[2][PARTY_SIZE];
/*0x005D*/ u8 hpBarLevels[2][PARTY_SIZE];
/*0x0069*/ u8 bufferPartyState;
- /*0x006A*/ u8 filler_6A[0x6F - 0x6A];
+ /*0x006A*/ u8 filler_6A[5];
/*0x006F*/ u8 tradeMenuFunc;
/*0x0070*/ u8 neverRead_70;
/*0x0071*/ u8 filler_71;
@@ -105,13 +128,13 @@ static EWRAM_DATA struct {
/*0x0079*/ u8 partnerLinkFlagChoseAction;
/*0x007A*/ u8 playerLinkFlagStatus;
/*0x007B*/ u8 partnerLinkFlagStatus;
- /*0x007C*/ u8 filler_7C[0x7E - 0x7C];
+ /*0x007C*/ u8 filler_7C[2];
/*0x007E*/ u8 partnerCursorPosition;
/*0x007F*/ u8 unused_7F;
/*0x0080*/ u16 linkData[20];
/*0x00A8*/ u8 timer;
/*0x00A9*/ u8 giftRibbons[GIFT_RIBBONS_COUNT];
- /*0x00B4*/ u8 filler_B4[0x8D0-0xB4];
+ /*0x00B4*/ u8 filler_B4[0x81C];
/*0x08D0*/ struct {
bool8 queued;
u16 queueDelay;
@@ -119,6 +142,7 @@ static EWRAM_DATA struct {
} queuedActions[4];
/*0x08F0*/ u16 tilemapBuffer[0x400];
} *sTradeMenuData = {NULL};
+
static EWRAM_DATA struct {
/*0x00*/ struct Pokemon mon;
/*0x64*/ u32 timer;
@@ -127,19 +151,19 @@ static EWRAM_DATA struct {
/*0x72*/ u8 playerLinkFlagFinishTrade;
/*0x73*/ u8 partnerLinkFlagFinishTrade;
/*0x74*/ u16 linkData[10];
- /*0x88*/ u8 alwaysZero_88;
- /*0x89*/ u8 alwaysZero_89;
+ /*0x88*/ u8 linkTimeoutZero1;
+ /*0x89*/ u8 linkTimeoutZero2;
/*0x8A*/ u16 linkTimeoutCounter;
/*0x8C*/ u16 neverRead_8C;
- /*0x8E*/ u8 pokePicSpriteIdxs[2];
- /*0x90*/ u8 unk_90; //sprite id
- /*0x91*/ u8 unk_91; //sprite id
- /*0x92*/ u8 unk_92; //sprite id
+ /*0x8E*/ u8 monSpriteIds[2];
+ /*0x90*/ u8 connectionSpriteId1; // Multi-purpose sprite ids used during the transfer sequence
+ /*0x91*/ u8 connectionSpriteId2;
+ /*0x92*/ u8 cableEndSpriteId;
/*0x93*/ u8 sendTradeFinishState;
/*0x94*/ u16 state;
/*0x96*/ u8 filler_96[0xD2 - 0x96];
- /*0xD2*/ u8 pokeballSpriteId;
- /*0xD3*/ u8 unk_D3; //sprite id
+ /*0xD2*/ u8 releasePokeballSpriteId;
+ /*0xD3*/ u8 bouncingPokeballSpriteId;
/*0xD4*/ u16 texX;
/*0xD6*/ u16 texY;
/*0xD8*/ u16 neverRead_D8;
@@ -151,7 +175,7 @@ static EWRAM_DATA struct {
/*0xE4*/ s16 bg2vofs;
/*0xE6*/ s16 bg2hofs;
/*0xE8*/ u16 sXY;
- /*0xEA*/ u16 unk_EA; //sXY divisor
+ /*0xEA*/ u16 gbaScale;
/*0xEC*/ u16 alpha;
/*0xEE*/ bool8 isLinkTrade;
/*0xF0*/ u16 monSpecies[2];
@@ -183,24 +207,24 @@ static void DrawTradeMenuPartyMonInfo(u8, u8, u8, u8, u8, u8);
static void DrawTradeMenuPartyInfo(u8);
static void PrintNicknamesForTradeMenu(void);
static void RedrawTradeMenuParty(u8);
-static void Task_DrawSelectionSummary(u8 taskId);
-static void Task_DrawSelectionTrade(u8 taskId);
+static void Task_DrawSelectionSummary(u8);
+static void Task_DrawSelectionTrade(u8);
static void QueueAction(u16, u8);
static u32 GetNumQueuedActions(void);
static void DoQueuedActions(void);
static void PrintTradeMessage(u8);
static bool8 LoadTradeMenuSpriteSheetsAndPalettes(void);
-static void DrawTextWindowAndBuffer6Bytes(const u8 *, u8 *, u8);
+static void DrawBottomRowText(const u8 *, u8 *, u8);
static void SetTradePartyLiveStatuses(u8);
static void GetTradePartyHPBarLevels(u8);
static void SetTradePartyHPBarSprites(void);
static void SaveTradeGiftRibbons(void);
static u32 CanTradeSelectedMon(struct Pokemon *, int, int);
-static void sub_807AA28(struct Sprite *sprite);
-static void sub_807AA7C(struct Sprite *sprite);
-static void sub_807AABC(struct Sprite *sprite);
-static void sub_807AAE0(struct Sprite *sprite);
-static void sub_807AB04(struct Sprite *sprite);
+static void SpriteCB_LinkMonGlow(struct Sprite *);
+static void SpriteCB_LinkMonShadow(struct Sprite *);
+static void SpriteCB_CableEndSending(struct Sprite *);
+static void SpriteCB_CableEndReceiving(struct Sprite *);
+static void SpriteCB_GbaScreen(struct Sprite *);
static void InitTradeBgInternal(void);
static void CB2_UpdateInGameTrade(void);
static void SetTradeSequenceBgGpuRegs(u8);
@@ -209,12 +233,12 @@ static void BufferTradeSceneStrings(void);
static bool8 AnimateTradeSequence(void);
static bool8 AnimateTradeSequenceCable(void);
static bool8 AnimateTradeSequenceWireless(void);
-static void sub_807E55C(struct Sprite *sprite);
-static void sub_807E5D8(struct Sprite *sprite);
-static void sub_807E64C(struct Sprite *sprite);
-static void sub_807E6AC(struct Sprite *sprite);
+static void SpriteCB_BouncingPokeball(struct Sprite *);
+static void SpriteCB_BouncingPokeballDepart(struct Sprite *);
+static void SpriteCB_BouncingPokeballDepartEnd(struct Sprite *);
+static void SpriteCB_BouncingPokeballArrive(struct Sprite *);
static void BufferInGameTradeMonName(void);
-static void SetInGameTradeMail(struct MailStruct *mail, const struct InGameTrade *trade);
+static void SetInGameTradeMail(struct MailStruct *, const struct InGameTrade *);
static void CB2_UpdateLinkTrade(void);
static void CB2_TryFinishTrade(void);
static void CB2_SaveAndEndTrade(void);
@@ -222,8 +246,8 @@ static void CB2_FreeTradeData(void);
static void Task_InGameTrade(u8);
static void CheckPartnersMonForRibbons(void);
static void Task_AnimateWirelessSignal(u8);
-static void c3_0805465C(u8);
-static void sub_807F39C(u8);
+static void Task_NarrowWindowForCrossing_Wireless(u8);
+static void Task_NarrowWindowForCrossing_Cable(u8);
static void CB2_SaveAndEndWirelessTrade(void);
#include "data/trade.h"
@@ -246,7 +270,7 @@ static void RequestLinkData(u8 type)
SendBlockRequest(type);
}
-static bool32 sub_80771BC(void)
+static bool32 IsLinkTradeTaskFinished(void)
{
if (gPlayerCurrActivity == ACTIVITY_29)
{
@@ -362,12 +386,10 @@ static void CB2_CreateTradeMenu(void)
case 0:
sTradeMenuData = AllocZeroed(sizeof(*sTradeMenuData));
InitTradeMenu();
- sMessageBoxAllocBuffer = AllocZeroed(ARRAY_COUNT(sMessageBoxTileBuffers) * 256);
+ sMenuTextAllocBuffer = AllocZeroed(GFXTAG_MENU_TEXT_COUNT * 256);
- for (i = 0; i < (int)ARRAY_COUNT(sMessageBoxTileBuffers); i++)
- {
- sMessageBoxTileBuffers[i] = &sMessageBoxAllocBuffer[i * 256];
- }
+ for (i = 0; i < GFXTAG_MENU_TEXT_COUNT; i++)
+ sMenuTextTileBuffers[i] = &sMenuTextAllocBuffer[i * 256];
gMain.state++;
break;
@@ -375,9 +397,7 @@ static void CB2_CreateTradeMenu(void)
gPaletteFade.bufferTransferDisabled = FALSE;
for (i = 0; i < PARTY_SIZE; i++)
- {
CreateMon(&gEnemyParty[i], SPECIES_NONE, 0, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0);
- }
PrintTradeMessage(TRADE_MSG_STANDBY);
ShowBg(0);
@@ -508,11 +528,11 @@ static void CB2_CreateTradeMenu(void)
gMain.state++;
break;
case 10:
- DrawTextWindowAndBufferTiles(gSaveBlock2Ptr->playerName, sMessageBoxTileBuffers[0], 0, 0, 3);
+ DrawTextWindowAndBufferTiles(gSaveBlock2Ptr->playerName, sMenuTextTileBuffers[GFXTAG_PLAYER_NAME_L], 0, 0, 3);
id = GetMultiplayerId();
- DrawTextWindowAndBufferTiles(gLinkPlayers[id ^ 1].name, sMessageBoxTileBuffers[3], 0, 0, 3);
- DrawTextWindowAndBufferTiles(sTradeActionTexts[TRADE_TEXT_CANCEL], sMessageBoxTileBuffers[6], 0, 0, 2);
- DrawTextWindowAndBuffer6Bytes(sTradeActionTexts[TRADE_TEXT_CHOOSE_MON], sMessageBoxTileBuffers[8], 24);
+ DrawTextWindowAndBufferTiles(gLinkPlayers[id ^ 1].name, sMenuTextTileBuffers[GFXTAG_PARTNER_NAME_L], 0, 0, 3);
+ DrawTextWindowAndBufferTiles(sTradeActionTexts[TRADE_TEXT_CANCEL], sMenuTextTileBuffers[GFXTAG_CANCEL_L], 0, 0, 2);
+ DrawBottomRowText(sTradeActionTexts[TRADE_TEXT_CHOOSE_MON], sMenuTextTileBuffers[GFXTAG_CHOOSE_PKMN_L], 24);
gMain.state++;
sTradeMenuData->timer = 0;
break;
@@ -521,39 +541,43 @@ static void CB2_CreateTradeMenu(void)
gMain.state++;
break;
case 12:
+ // Create player's name text sprites
xPos = GetStringCenterAlignXOffset(1, gSaveBlock2Ptr->playerName, 120);
- for (i = 0; i < 3; i++)
+ for (i = 0; i < GFXTAG_PLAYER_NAME; i++)
{
- temp = gSpriteTemplate_832DCAC;
- temp.tileTag += i;
+ temp = sSpriteTemplate_MenuText;
+ temp.tileTag += i + GFXTAG_PLAYER_NAME_L;
CreateSprite(&temp, xPos + (i * 32) + 16, 10, 1);
}
+ // Create partner's name text sprites
xPos = GetStringCenterAlignXOffset(1, gLinkPlayers[GetMultiplayerId() ^ 1].name, 120);
- for (i = 0; i < 3; i++)
+ for (i = 0; i < GFXTAG_PARTNER_NAME; i++)
{
- temp = gSpriteTemplate_832DCAC;
- temp.tileTag += i + 3;
+ temp = sSpriteTemplate_MenuText;
+ temp.tileTag += i + GFXTAG_PARTNER_NAME_L;
CreateSprite(&temp, xPos + (i * 32) + 136, 10, 1);
}
gMain.state++;
break;
case 13:
- temp = gSpriteTemplate_832DCAC;
- temp.tileTag += 6;
+ // Create Cancel text sprites
+ temp = sSpriteTemplate_MenuText;
+ temp.tileTag += GFXTAG_CANCEL_L;
CreateSprite(&temp, 215, 152, 1);
- temp = gSpriteTemplate_832DCAC;
- temp.tileTag += 7;
+ temp = sSpriteTemplate_MenuText;
+ temp.tileTag += GFXTAG_CANCEL_R;
CreateSprite(&temp, 247, 152, 1);
- for (i = 0; i < PARTY_SIZE; i++)
+ // Create Choose a Pokémon text sprites (only 3 are needed, other 3 are empty)
+ for (i = 0; i < GFXTAG_CHOOSE_PKMN; i++)
{
- temp = gSpriteTemplate_832DCAC;
- temp.tileTag += i + 8;
+ temp = sSpriteTemplate_MenuText;
+ temp.tileTag += i + GFXTAG_CHOOSE_PKMN_L;
CreateSprite(&temp, (i * 32) + 24, 150, 1);
}
- sTradeMenuData->cursorSpriteIdx = CreateSprite(&gSpriteTemplate_832DC94, sTradeMonSpriteCoords[0][0] * 8 + 32, sTradeMonSpriteCoords[0][1] * 8, 2);
+ sTradeMenuData->cursorSpriteId = CreateSprite(&sSpriteTemplate_Cursor, sTradeMonSpriteCoords[0][0] * 8 + 32, sTradeMonSpriteCoords[0][1] * 8, 2);
sTradeMenuData->cursorPosition = 0;
gMain.state++;
rbox_fill_rectangle(0);
@@ -695,11 +719,11 @@ static void CB2_ReturnToTradeMenu(void)
gMain.state++;
break;
case 10:
- DrawTextWindowAndBufferTiles(gSaveBlock2Ptr->playerName, sMessageBoxTileBuffers[0], 0, 0, 3);
+ DrawTextWindowAndBufferTiles(gSaveBlock2Ptr->playerName, sMenuTextTileBuffers[GFXTAG_PLAYER_NAME_L], 0, 0, 3);
id = GetMultiplayerId();
- DrawTextWindowAndBufferTiles(gLinkPlayers[id ^ 1].name, sMessageBoxTileBuffers[3], 0, 0, 3);
- DrawTextWindowAndBufferTiles(sTradeActionTexts[TRADE_TEXT_CANCEL], sMessageBoxTileBuffers[6], 0, 0, 2);
- DrawTextWindowAndBuffer6Bytes(sTradeActionTexts[TRADE_TEXT_CHOOSE_MON], sMessageBoxTileBuffers[8], 24);
+ DrawTextWindowAndBufferTiles(gLinkPlayers[id ^ 1].name, sMenuTextTileBuffers[GFXTAG_PARTNER_NAME_L], 0, 0, 3);
+ DrawTextWindowAndBufferTiles(sTradeActionTexts[TRADE_TEXT_CANCEL], sMenuTextTileBuffers[GFXTAG_CANCEL_L], 0, 0, 2);
+ DrawBottomRowText(sTradeActionTexts[TRADE_TEXT_CHOOSE_MON], sMenuTextTileBuffers[GFXTAG_CHOOSE_PKMN_L], 24);
gMain.state++;
sTradeMenuData->timer = 0;
break;
@@ -708,35 +732,39 @@ static void CB2_ReturnToTradeMenu(void)
gMain.state++;
break;
case 12:
+ // Create player's name text sprites
xPos = GetStringCenterAlignXOffset(1, gSaveBlock2Ptr->playerName, 120);
- for (i = 0; i < 3; i++)
+ for (i = 0; i < GFXTAG_PLAYER_NAME; i++)
{
- temp = gSpriteTemplate_832DCAC;
- temp.tileTag += i;
+ temp = sSpriteTemplate_MenuText;
+ temp.tileTag += i + GFXTAG_PLAYER_NAME_L;
CreateSprite(&temp, xPos + (i * 32) + 16, 10, 1);
}
+ // Create partner's name text sprites
xPos = GetStringCenterAlignXOffset(1, gLinkPlayers[GetMultiplayerId() ^ 1].name, 120);
- for (i = 0; i < 3; i++)
+ for (i = 0; i < GFXTAG_PARTNER_NAME; i++)
{
- temp = gSpriteTemplate_832DCAC;
- temp.tileTag += i + 3;
+ temp = sSpriteTemplate_MenuText;
+ temp.tileTag += i + GFXTAG_PARTNER_NAME_L;
CreateSprite(&temp, xPos + (i * 32) + 136, 10, 1);
}
gMain.state++;
break;
case 13:
- temp = gSpriteTemplate_832DCAC;
- temp.tileTag += 6;
+ // Create Cancel text sprites
+ temp = sSpriteTemplate_MenuText;
+ temp.tileTag += GFXTAG_CANCEL_L;
CreateSprite(&temp, 215, 152, 1);
- temp = gSpriteTemplate_832DCAC;
- temp.tileTag += 7;
+ temp = sSpriteTemplate_MenuText;
+ temp.tileTag += GFXTAG_CANCEL_R;
CreateSprite(&temp, 247, 152, 1);
- for (i = 0; i < PARTY_SIZE; i++)
+ // Create Choose a Pokémon text sprites
+ for (i = 0; i < GFXTAG_CHOOSE_PKMN; i++)
{
- temp = gSpriteTemplate_832DCAC;
- temp.tileTag += i + 8;
+ temp = sSpriteTemplate_MenuText;
+ temp.tileTag += i + GFXTAG_CHOOSE_PKMN_L;
CreateSprite(&temp, (i * 32) + 24, 150, 1);
}
@@ -745,7 +773,9 @@ static void CB2_ReturnToTradeMenu(void)
else
sTradeMenuData->cursorPosition = gLastViewedMonIndex + PARTY_SIZE;
- sTradeMenuData->cursorSpriteIdx = CreateSprite(&gSpriteTemplate_832DC94, sTradeMonSpriteCoords[sTradeMenuData->cursorPosition][0] * 8 + 32, sTradeMonSpriteCoords[sTradeMenuData->cursorPosition][1] * 8, 2);
+ sTradeMenuData->cursorSpriteId = CreateSprite(&sSpriteTemplate_Cursor,
+ sTradeMonSpriteCoords[sTradeMenuData->cursorPosition][0] * 8 + 32,
+ sTradeMonSpriteCoords[sTradeMenuData->cursorPosition][1] * 8, 2);
gMain.state = 16;
break;
case 16:
@@ -835,7 +865,7 @@ static void SetLinkTradeCallbacks(void)
{
if (IsLinkRfuTaskFinished())
{
- Free(sMessageBoxAllocBuffer);
+ Free(sMenuTextAllocBuffer);
FreeAllWindowBuffers();
Free(sTradeMenuData);
gMain.callback1 = NULL;
@@ -848,7 +878,7 @@ static void SetLinkTradeCallbacks(void)
{
if (!gReceivedRemoteLinkPlayers)
{
- Free(sMessageBoxAllocBuffer);
+ Free(sMenuTextAllocBuffer);
FreeAllWindowBuffers();
Free(sTradeMenuData);
gMain.callback1 = NULL;
@@ -957,12 +987,13 @@ static bool8 BufferTradeParties(void)
switch (sTradeMenuData->bufferPartyState)
{
case 0:
+ // The parties are sent in pairs rather than all at once
Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[0], 2 * sizeof(struct Pokemon));
sTradeMenuData->bufferPartyState++;
sTradeMenuData->timer = 0;
break;
case 1:
- if (sub_80771BC())
+ if (IsLinkTradeTaskFinished())
{
if (_GetBlockReceivedStatus() == 0)
{
@@ -1004,13 +1035,13 @@ static bool8 BufferTradeParties(void)
case 8:
if (_GetBlockReceivedStatus() == 3)
{
- Trade_Memcpy(&gEnemyParty[2], gBlockRecvBuffer[id ^ 1], 200);
+ Trade_Memcpy(&gEnemyParty[2], gBlockRecvBuffer[id ^ 1], 2 * sizeof(struct Pokemon));
TradeResetReceivedFlags();
sTradeMenuData->bufferPartyState++;
}
break;
case 9:
- Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[4], 200);
+ Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[4], 2 * sizeof(struct Pokemon));
sTradeMenuData->bufferPartyState++;
break;
case 11:
@@ -1023,13 +1054,13 @@ static bool8 BufferTradeParties(void)
case 12:
if (_GetBlockReceivedStatus() == 3)
{
- Trade_Memcpy(&gEnemyParty[4], gBlockRecvBuffer[id ^ 1], 200);
+ Trade_Memcpy(&gEnemyParty[4], gBlockRecvBuffer[id ^ 1], 2 * sizeof(struct Pokemon));
TradeResetReceivedFlags();
sTradeMenuData->bufferPartyState++;
}
break;
case 13:
- Trade_Memcpy(gBlockSendBuffer, gSaveBlock1Ptr->mail, 220);
+ Trade_Memcpy(gBlockSendBuffer, gSaveBlock1Ptr->mail, PARTY_SIZE * sizeof(struct MailStruct) + 4);
sTradeMenuData->bufferPartyState++;
break;
case 15:
@@ -1042,13 +1073,13 @@ static bool8 BufferTradeParties(void)
case 16:
if (_GetBlockReceivedStatus() == 3)
{
- Trade_Memcpy(gTradeMail, gBlockRecvBuffer[id ^ 1], 216);
+ Trade_Memcpy(gTradeMail, gBlockRecvBuffer[id ^ 1], PARTY_SIZE * sizeof(struct MailStruct));
TradeResetReceivedFlags();
sTradeMenuData->bufferPartyState++;
}
break;
case 17:
- Trade_Memcpy(gBlockSendBuffer, gSaveBlock1Ptr->giftRibbons, ARRAY_COUNT(sTradeMenuData->giftRibbons));
+ Trade_Memcpy(gBlockSendBuffer, gSaveBlock1Ptr->giftRibbons, sizeof(sTradeMenuData->giftRibbons));
sTradeMenuData->bufferPartyState++;
break;
case 19:
@@ -1061,7 +1092,7 @@ static bool8 BufferTradeParties(void)
case 20:
if (_GetBlockReceivedStatus() == 3)
{
- Trade_Memcpy(sTradeMenuData->giftRibbons, gBlockRecvBuffer[id ^ 1], ARRAY_COUNT(sTradeMenuData->giftRibbons));
+ Trade_Memcpy(sTradeMenuData->giftRibbons, gBlockRecvBuffer[id ^ 1], sizeof(sTradeMenuData->giftRibbons));
TradeResetReceivedFlags();
sTradeMenuData->bufferPartyState++;
}
@@ -1103,9 +1134,9 @@ static bool8 BufferTradeParties(void)
return FALSE;
}
-static void PrintAndBufferIsThisTradeOkay(void)
+static void DrawIsThisTradeOkay(void)
{
- DrawTextWindowAndBuffer6Bytes(sText_IsThisTradeOkay, (void *)(OBJ_VRAM0 + (sTradeMenuData->bottomTextTileStart * 32)), 24);
+ DrawBottomRowText(sText_IsThisTradeOkay, (void *)(OBJ_VRAM0 + (sTradeMenuData->bottomTextTileStart * 32)), 24);
}
// mpId is unused
@@ -1317,15 +1348,15 @@ static void TradeMenuMoveCursor(u8 *cursorPosition, u8 direction)
if (newPosition == (PARTY_SIZE * 2)) // CANCEL
{
- StartSpriteAnim(&gSprites[sTradeMenuData->cursorSpriteIdx], 1);
- gSprites[sTradeMenuData->cursorSpriteIdx].pos1.x = DISPLAY_WIDTH - 16;
- gSprites[sTradeMenuData->cursorSpriteIdx].pos1.y = DISPLAY_HEIGHT;
+ StartSpriteAnim(&gSprites[sTradeMenuData->cursorSpriteId], CURSOR_ANIM_ON_CANCEL);
+ gSprites[sTradeMenuData->cursorSpriteId].pos1.x = DISPLAY_WIDTH - 16;
+ gSprites[sTradeMenuData->cursorSpriteId].pos1.y = DISPLAY_HEIGHT;
}
else
{
- StartSpriteAnim(&gSprites[sTradeMenuData->cursorSpriteIdx], 0);
- gSprites[sTradeMenuData->cursorSpriteIdx].pos1.x = sTradeMonSpriteCoords[newPosition][0] * 8 + 32;
- gSprites[sTradeMenuData->cursorSpriteIdx].pos1.y = sTradeMonSpriteCoords[newPosition][1] * 8;
+ StartSpriteAnim(&gSprites[sTradeMenuData->cursorSpriteId], CURSOR_ANIM_NORMAL);
+ gSprites[sTradeMenuData->cursorSpriteId].pos1.x = sTradeMonSpriteCoords[newPosition][0] * 8 + 32;
+ gSprites[sTradeMenuData->cursorSpriteId].pos1.y = sTradeMonSpriteCoords[newPosition][1] * 8;
}
if (*cursorPosition != newPosition)
@@ -1392,7 +1423,7 @@ static void TradeMenuProcessInput(void)
{
CreateYesNoMenu(&sTradeYesNoWindowTemplate, 1, 14, 0);
sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_CANCEL_TRADE_PROMPT;
- DrawTextWindowAndBuffer6Bytes(sTradeActionTexts[TRADE_TEXT_CANCEL_TRADE], (void *)(OBJ_VRAM0 + sTradeMenuData->bottomTextTileStart * 32), 24);
+ DrawBottomRowText(sTradeActionTexts[TRADE_TEXT_CANCEL_TRADE], (void *)(OBJ_VRAM0 + sTradeMenuData->bottomTextTileStart * 32), 24);
}
}
}
@@ -1401,8 +1432,8 @@ static void TradeMenuChooseMon(void)
{
PrintNicknamesForTradeMenu();
sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_MAIN_MENU;
- gSprites[sTradeMenuData->cursorSpriteIdx].invisible = FALSE;
- DrawTextWindowAndBuffer6Bytes(sTradeActionTexts[TRADE_TEXT_CHOOSE_MON], (void *)(OBJ_VRAM0 + sTradeMenuData->bottomTextTileStart * 32), 24);
+ gSprites[sTradeMenuData->cursorSpriteId].invisible = FALSE;
+ DrawBottomRowText(sTradeActionTexts[TRADE_TEXT_CHOOSE_MON], (void *)(OBJ_VRAM0 + sTradeMenuData->bottomTextTileStart * 32), 24);
}
static void TradeMenuProcessInput_SelectedMon(void)
@@ -1424,7 +1455,7 @@ static void TradeMenuProcessInput_SelectedMon(void)
{
case CAN_TRADE_MON:
SetReadyToTrade();
- gSprites[sTradeMenuData->cursorSpriteIdx].invisible = TRUE;
+ gSprites[sTradeMenuData->cursorSpriteId].invisible = TRUE;
break;
case CANT_TRADE_LAST_MON:
QueueAction(QUEUE_DELAY_MSG, QUEUE_ONLY_MON2);
@@ -1514,7 +1545,9 @@ static bool32 CheckMonsBeforeTrade(void)
aliveMons[i] = sTradeMenuData->isLiveMon[TRADE_PLAYER][i];
}
- switch (CheckValidityOfTradeMons(aliveMons, sTradeMenuData->partyCounts[TRADE_PLAYER], sTradeMenuData->cursorPosition, sTradeMenuData->partnerCursorPosition))
+ switch (CheckValidityOfTradeMons(aliveMons, sTradeMenuData->partyCounts[TRADE_PLAYER],
+ sTradeMenuData->cursorPosition,
+ sTradeMenuData->partnerCursorPosition))
{
case PLAYER_MON_INVALID:
QueueAction(QUEUE_DELAY_MSG, QUEUE_ONLY_MON2);
@@ -1547,7 +1580,7 @@ static void ConfirmOrCancelTrade(void)
case 1: // Cancel Trade
case MENU_B_PRESSED:
QueueAction(QUEUE_DELAY_MSG, QUEUE_STANDBY);
- if (sub_80771BC())
+ if (IsLinkTradeTaskFinished())
SetLinkData(LINKCMD_READY_CANCEL_TRADE, 0);
sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_STANDBY;
PutWindowTilemap(17);
@@ -1555,7 +1588,8 @@ static void ConfirmOrCancelTrade(void)
}
}
-static void sub_807929C(void)
+// Only when choosing Yes to cancel, when No is chosen all are redrawn anyway
+static void RestoreNicknamesCoveredByYesNo(void)
{
int i;
@@ -1573,9 +1607,9 @@ static void CancelTradeYesNo(void)
case 0: // YES, Cancel
PrintTradeMessage(TRADE_MSG_WAITING_FOR_FRIEND);
SetLinkData(LINKCMD_REQUEST_CANCEL, 0);
- gSprites[sTradeMenuData->cursorSpriteIdx].invisible = TRUE;
+ gSprites[sTradeMenuData->cursorSpriteId].invisible = TRUE;
sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_STANDBY;
- sub_807929C();
+ RestoreNicknamesCoveredByYesNo();
break;
case 1: // NO, Continue
case MENU_B_PRESSED:
@@ -1601,7 +1635,7 @@ static void ConfirmTradePrompt(void)
if (sTradeMenuData->drawPartyState[TRADE_PLAYER] == DRAW_PARTY_FINISH
&& sTradeMenuData->drawPartyState[TRADE_PARTNER] == DRAW_PARTY_FINISH)
{
- PrintAndBufferIsThisTradeOkay();
+ DrawIsThisTradeOkay();
sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_DELAY_TRADE_CONFIRM;
}
}
@@ -1637,7 +1671,7 @@ static void RedrawTradeMenuAfterPressA(void)
RedrawTradeMenuParty(TRADE_PLAYER);
RedrawTradeMenuParty(TRADE_PARTNER);
sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_MAIN_MENU;
- gSprites[sTradeMenuData->cursorSpriteIdx].invisible = FALSE;
+ gSprites[sTradeMenuData->cursorSpriteId].invisible = FALSE;
}
}
@@ -1662,9 +1696,9 @@ static void CancelTrade_2(void)
{
if (gWirelessCommType)
{
- if (sub_80771BC() && GetNumQueuedActions() == 0)
+ if (IsLinkTradeTaskFinished() && GetNumQueuedActions() == 0)
{
- Free(sMessageBoxAllocBuffer);
+ Free(sMenuTextAllocBuffer);
Free(sTradeMenuData);
FreeAllWindowBuffers();
DestroyWirelessStatusIndicatorSprite();
@@ -1675,7 +1709,7 @@ static void CancelTrade_2(void)
{
if (!gReceivedRemoteLinkPlayers)
{
- Free(sMessageBoxAllocBuffer);
+ Free(sMenuTextAllocBuffer);
Free(sTradeMenuData);
FreeAllWindowBuffers();
SetMainCallback2(CB2_ReturnToFieldFromMultiplayer);
@@ -1803,7 +1837,8 @@ static void DrawTradeMenuParty(u8 whichParty)
gSprites[sTradeMenuData->partySpriteIds[0][partyIdx + (selectedMonParty * PARTY_SIZE)]].invisible = FALSE;
gSprites[sTradeMenuData->partySpriteIds[0][partyIdx + (selectedMonParty * PARTY_SIZE)]].data[0] = 20;
- gSprites[sTradeMenuData->partySpriteIds[0][partyIdx + (selectedMonParty * PARTY_SIZE)]].data[2] = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][0] + sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE + 1][0]) / 2 * 8 + 14;
+ gSprites[sTradeMenuData->partySpriteIds[0][partyIdx + (selectedMonParty * PARTY_SIZE)]].data[2] = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][0]
+ + sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE + 1][0]) / 2 * 8 + 14;
gSprites[sTradeMenuData->partySpriteIds[0][partyIdx + (selectedMonParty * PARTY_SIZE)]].data[4] = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][1] * 8) - 12;
StoreSpriteCallbackInData6(&gSprites[sTradeMenuData->partySpriteIds[0][partyIdx + (selectedMonParty * PARTY_SIZE)]], SpriteCB_MonIcon);
sTradeMenuData->drawPartyState[whichParty]++;
@@ -1822,7 +1857,8 @@ static void DrawTradeMenuParty(u8 whichParty)
case 3:
CopyToBgTilemapBufferRect_ChangePalette(1, sTradeMovesBoxTilemap, selectedMonParty * 15, 0, 15, 17, 0);
CopyBgTilemapBufferToVram(1);
- gSprites[sTradeMenuData->partySpriteIds[0][partyIdx + (selectedMonParty * PARTY_SIZE)]].pos1.x = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][0] + sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE + 1][0]) / 2 * 8 + 14;
+ gSprites[sTradeMenuData->partySpriteIds[0][partyIdx + (selectedMonParty * PARTY_SIZE)]].pos1.x = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][0]
+ + sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE + 1][0]) / 2 * 8 + 14;
gSprites[sTradeMenuData->partySpriteIds[0][partyIdx + (selectedMonParty * PARTY_SIZE)]].pos1.y = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][1] * 8) - 12;
gSprites[sTradeMenuData->partySpriteIds[0][partyIdx + (selectedMonParty * PARTY_SIZE)]].pos2.x = 0;
gSprites[sTradeMenuData->partySpriteIds[0][partyIdx + (selectedMonParty * PARTY_SIZE)]].pos2.y = 0;
@@ -2035,7 +2071,7 @@ static void RedrawTradeMenuParty(u8 whichParty)
DrawTradeMenuPartyInfo(whichParty);
PrintPartyNicknamesForTradeMenu(whichParty);
ResetTradeMenuPartyPositions(whichParty);
- DrawTextWindowAndBuffer6Bytes(sTradeActionTexts[TRADE_TEXT_CHOOSE_MON], (void *)(OBJ_VRAM0 + (sTradeMenuData->bottomTextTileStart * 32)), 24);
+ DrawBottomRowText(sTradeActionTexts[TRADE_TEXT_CHOOSE_MON], (void *)(OBJ_VRAM0 + (sTradeMenuData->bottomTextTileStart * 32)), 24);
sTradeMenuData->drawPartyState[whichParty] = 0;
}
@@ -2139,40 +2175,51 @@ static bool8 LoadTradeMenuSpriteSheetsAndPalettes(void)
{
struct SpriteSheet sheet;
- if (sTradeMenuData->timer < (int)ARRAY_COUNT(sMessageBoxTileBuffers))
+ if (sTradeMenuData->timer < GFXTAG_MENU_TEXT_COUNT)
{
- sheet.data = sMessageBoxTileBuffers[sTradeMenuData->timer];
+ sheet.data = sMenuTextTileBuffers[sTradeMenuData->timer];
sheet.size = 0x100;
- sheet.tag = 200 + sTradeMenuData->timer;
+ sheet.tag = GFXTAG_MENU_TEXT + sTradeMenuData->timer;
}
switch (sTradeMenuData->timer)
{
- case 0 ... 7:
+ case GFXTAG_PLAYER_NAME_L:
+ case GFXTAG_PLAYER_NAME_M:
+ case GFXTAG_PLAYER_NAME_R:
+ case GFXTAG_PARTNER_NAME_L:
+ case GFXTAG_PARTNER_NAME_M:
+ case GFXTAG_PARTNER_NAME_R:
+ case GFXTAG_CANCEL_L:
+ case GFXTAG_CANCEL_R:
LoadSpriteSheet(&sheet);
sTradeMenuData->timer++;
break;
- case 8:
+ case GFXTAG_CHOOSE_PKMN_L:
sTradeMenuData->bottomTextTileStart = LoadSpriteSheet(&sheet);
sTradeMenuData->timer++;
break;
- case 9 ... 13:
+ case GFXTAG_CHOOSE_PKMN_M:
+ case GFXTAG_CHOOSE_PKMN_R:
+ case GFXTAG_CHOOSE_PKMN_EMPTY_1:
+ case GFXTAG_CHOOSE_PKMN_EMPTY_2:
+ case GFXTAG_CHOOSE_PKMN_EMPTY_3:
LoadSpriteSheet(&sheet);
sTradeMenuData->timer++;
break;
- case 14:
+ case GFXTAG_MENU_TEXT_COUNT:
LoadSpritePalette(&gSpritePalette_TradeScreenText);
sTradeMenuData->timer++;
break;
- case 15:
- LoadSpritePalette(&gUnknown_0832DC44);
+ case GFXTAG_MENU_TEXT_COUNT + 1:
+ LoadSpritePalette(&sCursor_SpritePalette);
sTradeMenuData->timer++;
break;
- case 16:
- LoadSpriteSheet(&sTradeButtonsSpriteSheet);
+ case GFXTAG_MENU_TEXT_COUNT + 2:
+ LoadSpriteSheet(&sCursor_SpriteSheet);
sTradeMenuData->timer++;
break;
- case 17:
+ case GFXTAG_MENU_TEXT_COUNT + 3:
sTradeMenuData->timer = 0;
return TRUE;
}
@@ -2180,7 +2227,7 @@ static bool8 LoadTradeMenuSpriteSheetsAndPalettes(void)
return FALSE;
}
-static void DrawTextWindowAndBuffer6Bytes(const u8 *str, u8 *dest, u8 unused)
+static void DrawBottomRowText(const u8 *str, u8 *dest, u8 unused)
{
DrawTextWindowAndBufferTiles(str, dest, 0, 0, 6);
}
@@ -2564,7 +2611,7 @@ int CanSpinTradeMon(struct Pokemon *mon, u16 monIdx)
return CAN_TRADE_MON;
}
-static void sub_807AA28(struct Sprite *sprite)
+static void SpriteCB_LinkMonGlow(struct Sprite *sprite)
{
if (++sprite->data[0] == 10)
{
@@ -2573,7 +2620,7 @@ static void sub_807AA28(struct Sprite *sprite)
}
}
-static void sub_807AA4C(struct Sprite *sprite)
+static void SpriteCB_LinkMonGlowWireless(struct Sprite *sprite)
{
if (!sprite->invisible && ++sprite->data[0] == 10)
{
@@ -2582,18 +2629,19 @@ static void sub_807AA4C(struct Sprite *sprite)
}
}
-static void sub_807AA7C(struct Sprite *sprite)
+static void SpriteCB_LinkMonShadow(struct Sprite *sprite)
{
if (!sprite->data[1])
{
if (++sprite->data[0] == 12)
sprite->data[0] = 0;
- LoadPalette(&gUnknown_08338EA4[sprite->data[0]], (sprite->oam.paletteNum + 16) * 16 + 4, 2);
+ LoadPalette(&sLinkMonShadow_Pal[sprite->data[0]], (sprite->oam.paletteNum + 16) * 16 + 4, 2);
}
}
-static void sub_807AABC(struct Sprite *sprite)
+// Move cable down offscreen
+static void SpriteCB_CableEndSending(struct Sprite *sprite)
{
sprite->data[0]++;
sprite->pos2.y++;
@@ -2602,7 +2650,8 @@ static void sub_807AABC(struct Sprite *sprite)
DestroySprite(sprite);
}
-static void sub_807AAE0(struct Sprite *sprite)
+// Move cable up onscreen
+static void SpriteCB_CableEndReceiving(struct Sprite *sprite)
{
sprite->data[0]++;
sprite->pos2.y--;
@@ -2611,7 +2660,7 @@ static void sub_807AAE0(struct Sprite *sprite)
DestroySprite(sprite);
}
-static void sub_807AB04(struct Sprite *sprite)
+static void SpriteCB_GbaScreen(struct Sprite *sprite)
{
if (++sprite->data[0] == 15)
{
@@ -2665,13 +2714,13 @@ static void VBlankCB_Trade(void)
static void ClearLinkTimeoutCounter(void)
{
sTradeData->linkTimeoutCounter = 0;
- sTradeData->alwaysZero_88 = 0;
- sTradeData->alwaysZero_89 = 0;
+ sTradeData->linkTimeoutZero1 = 0;
+ sTradeData->linkTimeoutZero2 = 0;
}
static void CheckForLinkTimeout(void)
{
- if (sTradeData->alwaysZero_88 == sTradeData->alwaysZero_89)
+ if (sTradeData->linkTimeoutZero1 == sTradeData->linkTimeoutZero2)
sTradeData->linkTimeoutCounter++;
else
sTradeData->linkTimeoutCounter = 0;
@@ -2681,11 +2730,11 @@ static void CheckForLinkTimeout(void)
CloseLink();
SetMainCallback2(CB2_LinkError);
sTradeData->linkTimeoutCounter = 0;
- sTradeData->alwaysZero_89 = 0;
- sTradeData->alwaysZero_88 = 0;
+ sTradeData->linkTimeoutZero2 = 0;
+ sTradeData->linkTimeoutZero1 = 0;
}
- sTradeData->alwaysZero_89 = sTradeData->alwaysZero_88;
+ sTradeData->linkTimeoutZero2 = sTradeData->linkTimeoutZero1;
}
static u32 TradeGetMultiplayerId(void)
@@ -2731,9 +2780,9 @@ static void LoadTradeMonPic(u8 whichParty, u8 state)
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;
+ sTradeData->monSpriteIds[whichParty] = CreateSprite(&gMultiuseSpriteTemplate, 120, 60, 6);
+ gSprites[sTradeData->monSpriteIds[whichParty]].invisible = TRUE;
+ gSprites[sTradeData->monSpriteIds[whichParty]].callback = SpriteCallbackDummy;
break;
}
}
@@ -3047,7 +3096,7 @@ static void TrySendTradeFinishData(void)
case 1:
if (IsLinkTaskFinished())
{
- Trade_SendData(sTradeData);
+ SendBlock(bitmask_all_link_players_but_self(), sTradeData->linkData, sizeof(sTradeData->linkData));
sTradeData->sendTradeFinishState++;
}
// fallthrough
@@ -3086,7 +3135,7 @@ static void SetTradeSequenceBgGpuRegs(u8 state)
BGCNT_TXT512x256);
LoadPalette(gTradeGba2_Pal, 16, 0x60);
DmaCopyLarge16(3, gTradeGba_Gfx, (void *) BG_CHAR_ADDR(1), 0x1420, 0x1000);
- DmaCopy16Defvars(3, gUnknown_08331F60, (void *) BG_SCREEN_ADDR(18), 0x1000);
+ DmaCopy16Defvars(3, gTradePlatform_Tilemap, (void *) BG_SCREEN_ADDR(18), 0x1000);
break;
case 1:
sTradeData->bg1hofs = 0;
@@ -3105,11 +3154,11 @@ static void SetTradeSequenceBgGpuRegs(u8 state)
if (sTradeData->isCableTrade)
{
- DmaCopy16Defvars(3, sTradeTilemap_GbaCable, (void *) BG_SCREEN_ADDR(5), 0x1000);
+ DmaCopy16Defvars(3, sGbaCable_Tilemap, (void *) BG_SCREEN_ADDR(5), 0x1000);
}
else
{
- DmaCopy16Defvars(3, sTradeTilemap_GbaWireless, (void *) BG_SCREEN_ADDR(5), 0x1000);
+ DmaCopy16Defvars(3, sGbaWireless_Tilemap, (void *) BG_SCREEN_ADDR(5), 0x1000);
}
DmaCopyLarge16(3, gTradeGba_Gfx, (void *) BG_CHAR_ADDR(0), 0x1420, 0x1000);
@@ -3127,7 +3176,7 @@ static void SetTradeSequenceBgGpuRegs(u8 state)
DISPCNT_OBJ_1D_MAP |
DISPCNT_BG1_ON |
DISPCNT_OBJ_ON);
- LZ77UnCompVram(gUnknown_083379A0, (void *) BG_SCREEN_ADDR(5));
+ LZ77UnCompVram(sCrossingHighlightWireless_Tilemap, (void *) BG_SCREEN_ADDR(5));
BlendPalettes(0x8, 16, RGB_BLACK);
}
else
@@ -3136,14 +3185,14 @@ static void SetTradeSequenceBgGpuRegs(u8 state)
DISPCNT_OBJ_1D_MAP |
DISPCNT_BG1_ON |
DISPCNT_OBJ_ON);
- DmaCopy16Defvars(3, sTradeTilemap_Cable, (void *) BG_SCREEN_ADDR(5), 0x800);
+ DmaCopy16Defvars(3, sCrossingHighlightCable_Tilemap, (void *) BG_SCREEN_ADDR(5), 0x800);
BlendPalettes(0x1, 16, RGB_BLACK);
}
break;
case 3:
- LoadPalette(sTradePal_Black, 48, 0x20);
- LZ77UnCompVram(sTradeGfx_WirelessSignal, (void *) BG_CHAR_ADDR(1));
- LZ77UnCompVram(sTradeTilemap_WirelessSignal, (void *) BG_SCREEN_ADDR(18));
+ LoadPalette(sWirelessSignalNone_Pal, 48, 0x20);
+ LZ77UnCompVram(sWirelessSignal_Gfx, (void *) BG_CHAR_ADDR(1));
+ LZ77UnCompVram(sWirelessSignal_Tilemap, (void *) BG_SCREEN_ADDR(18));
sTradeData->bg2vofs = 80;
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
DISPCNT_OBJ_1D_MAP |
@@ -3164,18 +3213,18 @@ static void SetTradeSequenceBgGpuRegs(u8 state)
sTradeData->texX = 64;
sTradeData->texY = 92;
sTradeData->sXY = 32;
- sTradeData->unk_EA = 1024;
+ sTradeData->gbaScale = 1024;
sTradeData->alpha = 0;
- DmaCopyLarge16(3, sTradeAffine_Gba, (void *) BG_CHAR_ADDR(1), 0x2840, 0x1000);
+ DmaCopyLarge16(3, sGbaAffine_Gfx, (void *) BG_CHAR_ADDR(1), 0x2840, 0x1000);
if (sTradeData->isCableTrade)
{
- DmaCopy16Defvars(3, sTradeAffineMap_GbaCable, (void *) BG_SCREEN_ADDR(18), 0x100);
+ DmaCopy16Defvars(3, sGbaCable_AffineTilemap, (void *) BG_SCREEN_ADDR(18), 0x100);
}
else
{
- DmaCopy16Defvars(3, sTradeAffineMap_GbaWireless, (void *) BG_SCREEN_ADDR(18), 0x100);
+ DmaCopy16Defvars(3, sGbaWireless_AffineTilemap, (void *) BG_SCREEN_ADDR(18), 0x100);
}
break;
case 5:
@@ -3195,20 +3244,20 @@ static void SetTradeSequenceBgGpuRegs(u8 state)
sTradeData->texX = 64;
sTradeData->texY = 92;
sTradeData->sXY = 256;
- sTradeData->unk_EA = 128;
+ sTradeData->gbaScale = 128;
sTradeData->scrX = 120;
sTradeData->scrY = 80;
sTradeData->alpha = 0;
- DmaCopyLarge16(3, sTradeAffine_Gba, (void *) BG_CHAR_ADDR(1), 0x2840, 0x1000);
+ DmaCopyLarge16(3, sGbaAffine_Gfx, (void *) BG_CHAR_ADDR(1), 0x2840, 0x1000);
if (sTradeData->isCableTrade)
{
- DmaCopy16Defvars(3, sTradeAffineMap_GbaCable, (void *) BG_SCREEN_ADDR(18), 0x100);
+ DmaCopy16Defvars(3, sGbaCable_AffineTilemap, (void *) BG_SCREEN_ADDR(18), 0x100);
}
else
{
- DmaCopy16Defvars(3, sTradeAffineMap_GbaWireless, (void *) BG_SCREEN_ADDR(18), 0x100);
+ DmaCopy16Defvars(3, sGbaWireless_AffineTilemap, (void *) BG_SCREEN_ADDR(18), 0x100);
}
break;
case 7:
@@ -3222,19 +3271,19 @@ static void SetTradeSequenceBgGpuRegs(u8 state)
BGCNT_TXT512x256);
LoadPalette(gTradeGba2_Pal, 16, 0x60);
DmaCopyLarge16(3, gTradeGba_Gfx, (void *) BG_CHAR_ADDR(1), 0x1420, 0x1000);
- DmaCopy16Defvars(3, gUnknown_08331F60, (void *) BG_SCREEN_ADDR(18), 0x1000);
+ DmaCopy16Defvars(3, gTradePlatform_Tilemap, (void *) BG_SCREEN_ADDR(18), 0x1000);
break;
}
}
static void LoadTradeSequenceSpriteSheetsAndPalettes(void)
{
- LoadSpriteSheet(&sGlow1SpriteSheet);
- LoadSpriteSheet(&sGlow2SpriteSheet);
- LoadSpriteSheet(&sCableEndSpriteSheet);
- LoadSpriteSheet(&sGbaScreenSpriteSheet);
- LoadSpritePalette(&sMiscTradeSpritePalette);
- LoadSpritePalette(&sGbaSpritePalette);
+ LoadSpriteSheet(&sSpriteSheet_LinkMonGlow);
+ LoadSpriteSheet(&sSpriteSheet_LinkMonShadow);
+ LoadSpriteSheet(&sSpriteSheet_CableEnd);
+ LoadSpriteSheet(&sSpriteSheet_GbaScreen);
+ LoadSpritePalette(&sSpritePalette_LinkMon);
+ LoadSpritePalette(&sSpritePalette_Gba);
}
// Buffers "[Pokemon] will be sent to [Trainer]" strings
@@ -3263,7 +3312,7 @@ static void BufferTradeSceneStrings(void)
}
}
-// returns TRUE if it was a link trade, FALSE if it was an in-game trade
+// returns TRUE if it finished a link trade, FALSE if it finished an in-game trade or if sequence is still going
static bool8 AnimateTradeSequence(void)
{
if (sTradeData->isCableTrade)
@@ -3272,71 +3321,146 @@ static bool8 AnimateTradeSequence(void)
return AnimateTradeSequenceWireless();
}
+// Below are the states for the main switch in AnimateTradeSequenceCable and AnimateTradeSequenceWireless
+// When AnimateTradeSequenceWireless has a unique version of a
+// state used by AnimateTradeSequenceCable, it adds the below modifier
+#define TS_WIRELESS_STATE 100
+enum {
+ TS_STATE_START,
+ TS_STATE_MON_SLIDE_IN,
+ // 2-9 unused
+ TS_STATE_SEND_MSG = 10,
+ TS_STATE_BYE_BYE,
+ TS_STATE_POKEBALL_DEPART,
+ TS_STATE_POKEBALL_DEPART_WAIT,
+ TS_STATE_FADE_OUT_TO_GBA_SEND,
+ // 15-19 unused
+ TS_STATE_WAIT_FADE_OUT_TO_GBA_SEND = 20,
+ TS_STATE_FADE_IN_TO_GBA_SEND,
+ TS_STATE_WAIT_FADE_IN_TO_GBA_SEND,
+ TS_STATE_GBA_ZOOM_OUT,
+ TS_STATE_GBA_FLASH_SEND,
+ TS_STATE_GBA_STOP_FLASH_SEND,
+ TS_STATE_PAN_AWAY_GBA,
+ TS_STATE_CREATE_LINK_MON_LEAVING,
+ TS_STATE_LINK_MON_TRAVEL_OUT,
+ TS_STATE_FADE_OUT_TO_CROSSING,
+ TS_STATE_WAIT_FADE_OUT_TO_CROSSING,
+ TS_STATE_FADE_IN_TO_CROSSING,
+ TS_STATE_WAIT_FADE_IN_TO_CROSSING,
+ TS_STATE_CROSSING_LINK_MONS_ENTER,
+ TS_STATE_CROSSING_BLEND_WHITE_1,
+ TS_STATE_CROSSING_BLEND_WHITE_2,
+ TS_STATE_CROSSING_BLEND_WHITE_3,
+ TS_STATE_CROSSING_CREATE_MON_PICS,
+ TS_STATE_CROSSING_MON_PICS_MOVE,
+ TS_STATE_CROSSING_LINK_MONS_EXIT,
+ TS_STATE_CREATE_LINK_MON_ARRIVING,
+ TS_STATE_FADE_OUT_TO_GBA_RECV,
+ TS_STATE_WAIT_FADE_OUT_TO_GBA_RECV,
+ TS_STATE_LINK_MON_TRAVEL_IN,
+ TS_STATE_PAN_TO_GBA,
+ TS_STATE_DESTROY_LINK_MON,
+ TS_STATE_LINK_MON_ARRIVED_DELAY,
+ TS_STATE_MOVE_GBA_TO_CENTER,
+ TS_STATE_GBA_FLASH_RECV,
+ TS_STATE_UNUSED,
+ TS_STATE_GBA_STOP_FLASH_RECV,
+ TS_STATE_GBA_ZOOM_IN,
+ TS_STATE_FADE_OUT_TO_NEW_MON,
+ // 53-59 unused
+ TS_STATE_WAIT_FADE_OUT_TO_NEW_MON = 60,
+ TS_STATE_FADE_IN_TO_NEW_MON,
+ TS_STATE_WAIT_FADE_IN_TO_NEW_MON,
+ TS_STATE_POKEBALL_ARRIVE,
+ TS_STATE_FADE_POKEBALL_TO_NORMAL,
+ TS_STATE_POKEBALL_ARRIVE_WAIT,
+ TS_STATE_SHOW_NEW_MON,
+ TS_STATE_NEW_MON_MSG,
+ TS_STATE_TAKE_CARE_OF_MON,
+ TS_STATE_AFTER_NEW_MON_DELAY,
+ TS_STATE_CHECK_RIBBONS,
+ TS_STATE_END_LINK_TRADE,
+ TS_STATE_TRY_EVOLUTION,
+ TS_STATE_FADE_OUT_END,
+ TS_STATE_WAIT_FADE_OUT_END,
+ // Special states
+ TS_STATE_GBA_FLASH_SEND_WIRELESS = TS_STATE_GBA_FLASH_SEND + TS_WIRELESS_STATE,
+ TS_STATE_GBA_STOP_FLASH_SEND_WIRELESS,
+ TS_STATE_WAIT_WIRELESS_SIGNAL_SEND,
+ TS_STATE_PAN_TO_GBA_WIRELESS = TS_STATE_PAN_TO_GBA + TS_WIRELESS_STATE,
+ TS_STATE_DESTROY_LINK_MON_WIRELESS,
+ TS_STATE_WAIT_WIRELESS_SIGNAL_RECV,
+ TS_STATE_DELAY_FOR_MON_ANIM = 167,
+ TS_STATE_LINK_MON_TRAVEL_OFFSCREEN = 200,
+ TS_STATE_WAIT_FOR_MON_CRY = 267,
+};
+
static bool8 AnimateTradeSequenceCable(void)
{
u16 evoTarget;
switch (sTradeData->state)
{
- case 0:
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].invisible = FALSE;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.x = -180;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.y = gMonFrontPicCoords[sTradeData->monSpecies[TRADE_PLAYER]].y_offset;
+ case TS_STATE_START:
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].invisible = FALSE;
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.x = -180;
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.y = gMonFrontPicCoords[sTradeData->monSpecies[TRADE_PLAYER]].y_offset;
sTradeData->state++;
sTradeData->cachedMapMusic = GetCurrentMapMusic();
PlayNewMapMusic(MUS_EVOLUTION);
break;
- case 1:
+ case TS_STATE_MON_SLIDE_IN:
if (sTradeData->bg2hofs > 0)
{
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.x += 3;
+ // Sliding
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.x += 3;
sTradeData->bg2hofs -= 3;
}
else
{
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.x = 0;
+ // Pokémon has arrived onscreen
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.x = 0;
sTradeData->bg2hofs = 0;
- sTradeData->state = 10;
+ sTradeData->state = TS_STATE_SEND_MSG;
}
break;
- case 10:
+ case TS_STATE_SEND_MSG:
StringExpandPlaceholders(gStringVar4, gText_XWillBeSentToY);
DrawTextOnTradeWindow(0, gStringVar4, 0);
if (sTradeData->monSpecies[TRADE_PLAYER] != SPECIES_EGG)
- {
PlayCry1(sTradeData->monSpecies[TRADE_PLAYER], 0);
- }
- sTradeData->state = 11;
+ sTradeData->state = TS_STATE_BYE_BYE;
sTradeData->timer = 0;
break;
- case 11:
+ case TS_STATE_BYE_BYE:
if (++sTradeData->timer == 80)
{
- sTradeData->pokeballSpriteId = CreateTradePokeballSprite(sTradeData->pokePicSpriteIdxs[0], gSprites[sTradeData->pokePicSpriteIdxs[0]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff);
+ sTradeData->releasePokeballSpriteId = CreateTradePokeballSprite(sTradeData->monSpriteIds[0], gSprites[sTradeData->monSpriteIds[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)
+ case TS_STATE_POKEBALL_DEPART:
+ if (gSprites[sTradeData->releasePokeballSpriteId].callback == SpriteCallbackDummy)
{
- sTradeData->unk_D3 = CreateSprite(&gSpriteTemplate_8338D28, 120, 32, 0);
- gSprites[sTradeData->unk_D3].callback = sub_807E5D8;
- DestroySprite(&gSprites[sTradeData->pokeballSpriteId]);
+ sTradeData->bouncingPokeballSpriteId = CreateSprite(&sSpriteTemplate_Pokeball, 120, 32, 0);
+ gSprites[sTradeData->bouncingPokeballSpriteId].callback = SpriteCB_BouncingPokeballDepart;
+ DestroySprite(&gSprites[sTradeData->releasePokeballSpriteId]);
sTradeData->state++;
}
break;
- case 13:
+ case TS_STATE_POKEBALL_DEPART_WAIT:
// The game waits here for the sprite to finish its animation sequence.
break;
- case 14:
+ case TS_STATE_FADE_OUT_TO_GBA_SEND:
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
- sTradeData->state = 20;
+ sTradeData->state = TS_STATE_WAIT_FADE_OUT_TO_GBA_SEND;
break;
- case 20:
+ case TS_STATE_WAIT_FADE_OUT_TO_GBA_SEND:
if (!gPaletteFade.active)
{
SetTradeSequenceBgGpuRegs(4);
@@ -3345,42 +3469,40 @@ static bool8 AnimateTradeSequenceCable(void)
sTradeData->state++;
}
break;
- case 21:
+ case TS_STATE_FADE_IN_TO_GBA_SEND:
BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK);
sTradeData->state++;
break;
- case 22:
+ case TS_STATE_WAIT_FADE_IN_TO_GBA_SEND:
if (!gPaletteFade.active)
- {
- sTradeData->state = 23;
- }
+ sTradeData->state = TS_STATE_GBA_ZOOM_OUT;
break;
- case 23:
- if (sTradeData->unk_EA > 0x100)
+ case TS_STATE_GBA_ZOOM_OUT:
+ if (sTradeData->gbaScale > 0x100)
{
- sTradeData->unk_EA -= 0x34;
+ sTradeData->gbaScale -= 0x34;
}
else
{
SetTradeSequenceBgGpuRegs(1);
- sTradeData->unk_EA = 0x80;
+ sTradeData->gbaScale = 0x80;
sTradeData->state++;
sTradeData->timer = 0;
}
- sTradeData->sXY = 0x8000 / sTradeData->unk_EA;
+ sTradeData->sXY = 0x8000 / sTradeData->gbaScale;
break;
- case 24:
+ case TS_STATE_GBA_FLASH_SEND:
if (++sTradeData->timer > 20)
{
SetTradeBGAffine();
- sTradeData->unk_91 = CreateSprite(&gSpriteTemplate_8338E74, 120, 80, 0);
+ sTradeData->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_GbaScreenFlash_Long, 120, 80, 0);
sTradeData->state++;
}
break;
- case 25:
- if (gSprites[sTradeData->unk_91].animEnded)
+ case TS_STATE_GBA_STOP_FLASH_SEND:
+ if (gSprites[sTradeData->connectionSpriteId2].animEnded)
{
- DestroySprite(&gSprites[sTradeData->unk_91]);
+ DestroySprite(&gSprites[sTradeData->connectionSpriteId2]);
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND |
BLDCNT_TGT2_BG1 |
BLDCNT_TGT2_BG2);
@@ -3388,193 +3510,183 @@ static bool8 AnimateTradeSequenceCable(void)
sTradeData->state++;
}
break;
- case 26:
+ case TS_STATE_PAN_AWAY_GBA:
if (--sTradeData->bg1vofs == 316)
- {
sTradeData->state++;
- }
+
if (sTradeData->bg1vofs == 328)
- {
- sTradeData->unk_92 = CreateSprite(&gSpriteTemplate_8338DFC, 128, 65, 0);
- }
+ sTradeData->cableEndSpriteId = CreateSprite(&sSpriteTemplate_CableEnd, 128, 65, 0);
break;
- case 27:
- sTradeData->unk_90 = CreateSprite(&gUnknown_08338D88, 128, 80, 3);
- sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 128, 80, 0);
- StartSpriteAnim(&gSprites[sTradeData->unk_91], 1);
+ case TS_STATE_CREATE_LINK_MON_LEAVING:
+ sTradeData->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonGlow, 128, 80, 3);
+ sTradeData->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 128, 80, 0);
+ StartSpriteAnim(&gSprites[sTradeData->connectionSpriteId2], ANIM_LINKMON_SMALL);
sTradeData->state++;
break;
- case 28:
+ case TS_STATE_LINK_MON_TRAVEL_OUT:
if ((sTradeData->bg1vofs -= 2) == 166)
- {
- sTradeData->state = 200;
- }
+ sTradeData->state = TS_STATE_LINK_MON_TRAVEL_OFFSCREEN;
+
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;
- }
+ case TS_STATE_LINK_MON_TRAVEL_OFFSCREEN:
+ gSprites[sTradeData->connectionSpriteId1].pos1.y -= 2;
+ gSprites[sTradeData->connectionSpriteId2].pos1.y -= 2;
+ if (gSprites[sTradeData->connectionSpriteId1].pos1.y < -8)
+ sTradeData->state = TS_STATE_FADE_OUT_TO_CROSSING;
break;
- case 29:
+ case TS_STATE_FADE_OUT_TO_CROSSING:
BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK);
- sTradeData->state = 30;
+ sTradeData->state = TS_STATE_WAIT_FADE_OUT_TO_CROSSING;
break;
- case 30:
+ case TS_STATE_WAIT_FADE_OUT_TO_CROSSING:
if (!gPaletteFade.active)
{
- DestroySprite(&gSprites[sTradeData->unk_90]);
- DestroySprite(&gSprites[sTradeData->unk_91]);
+ DestroySprite(&gSprites[sTradeData->connectionSpriteId1]);
+ DestroySprite(&gSprites[sTradeData->connectionSpriteId2]);
SetTradeSequenceBgGpuRegs(2);
sTradeData->state++;
}
break;
- case 31:
+ case TS_STATE_FADE_IN_TO_CROSSING:
BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK);
- sTradeData->unk_90 = CreateSprite(&sGlowBallSpriteTemplate, 111, 170, 0);
- sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 129, -10, 0);
+ sTradeData->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 111, 170, 0);
+ sTradeData->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 129, -10, 0);
sTradeData->state++;
break;
- case 32:
+ case TS_STATE_WAIT_FADE_IN_TO_CROSSING:
if (!gPaletteFade.active)
{
PlaySE(SE_WARP_OUT);
sTradeData->state++;
}
- gSprites[sTradeData->unk_90].pos2.y -= 3;
- gSprites[sTradeData->unk_91].pos2.y += 3;
+ gSprites[sTradeData->connectionSpriteId1].pos2.y -= 3;
+ gSprites[sTradeData->connectionSpriteId2].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)
+ case TS_STATE_CROSSING_LINK_MONS_ENTER:
+ gSprites[sTradeData->connectionSpriteId1].pos2.y -= 3;
+ gSprites[sTradeData->connectionSpriteId2].pos2.y += 3;
+ if (gSprites[sTradeData->connectionSpriteId1].pos2.y <= -90)
{
- gSprites[sTradeData->unk_90].data[1] = 1;
- gSprites[sTradeData->unk_91].data[1] = 1;
+ gSprites[sTradeData->connectionSpriteId1].data[1] = 1;
+ gSprites[sTradeData->connectionSpriteId2].data[1] = 1;
sTradeData->state++;
}
break;
- case 34:
+ case TS_STATE_CROSSING_BLEND_WHITE_1:
BlendPalettes(0x1, 16, RGB_WHITEALPHA);
sTradeData->state++;
break;
- case 35:
+ case TS_STATE_CROSSING_BLEND_WHITE_2:
BlendPalettes(0x1, 0, RGB_WHITEALPHA);
sTradeData->state++;
break;
- case 36:
+ case TS_STATE_CROSSING_BLEND_WHITE_3:
BlendPalettes(0x1, 16, RGB_WHITEALPHA);
sTradeData->state++;
break;
- case 37:
+ case TS_STATE_CROSSING_CREATE_MON_PICS:
if (!IsMonSpriteNotFlipped(sTradeData->monSpecies[TRADE_PLAYER]))
{
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].affineAnims = gSpriteAffineAnimTable_8338ECC;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].oam.affineMode = ST_OAM_AFFINE_DOUBLE;
- CalcCenterToCornerVec(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]], SPRITE_SHAPE(64x64), SPRITE_SIZE(64x64), ST_OAM_AFFINE_DOUBLE);
- StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]], 0);
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].affineAnims = sAffineAnims_CrossingMonPics;
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].oam.affineMode = ST_OAM_AFFINE_DOUBLE;
+ CalcCenterToCornerVec(&gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]], SPRITE_SHAPE(64x64), SPRITE_SIZE(64x64), ST_OAM_AFFINE_DOUBLE);
+ StartSpriteAffineAnim(&gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]], 0);
}
else
{
- StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]], 0);
+ StartSpriteAffineAnim(&gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]], 0);
}
- StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]], 0);
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos1.x = 60;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos1.x = 180;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos1.y = 192;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos1.y = -32;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].invisible = FALSE;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].invisible = FALSE;
+ StartSpriteAffineAnim(&gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]], 0);
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos1.x = 60;
+ gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos1.x = 180;
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos1.y = 192;
+ gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos1.y = -32;
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].invisible = FALSE;
+ gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].invisible = FALSE;
sTradeData->state++;
break;
- case 38:
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.y -= 3;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos2.y += 3;
- if (gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.y < -DISPLAY_HEIGHT
- && gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.y >= -DISPLAY_HEIGHT - 3)
+ case TS_STATE_CROSSING_MON_PICS_MOVE:
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.y -= 3;
+ gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos2.y += 3;
+ if (gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.y < -DISPLAY_HEIGHT
+ && gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.y >= -DISPLAY_HEIGHT - 3)
{
PlaySE(SE_WARP_IN);
}
- if (gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.y < -222)
+ if (gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.y < -222)
{
- gSprites[sTradeData->unk_90].data[1] = 0;
- gSprites[sTradeData->unk_91].data[1] = 0;
+ gSprites[sTradeData->connectionSpriteId1].data[1] = 0;
+ gSprites[sTradeData->connectionSpriteId2].data[1] = 0;
sTradeData->state++;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].invisible = TRUE;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].invisible = TRUE;
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].invisible = TRUE;
+ gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].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)
+ case TS_STATE_CROSSING_LINK_MONS_EXIT:
+ gSprites[sTradeData->connectionSpriteId1].pos2.y -= 3;
+ gSprites[sTradeData->connectionSpriteId2].pos2.y += 3;
+ if (gSprites[sTradeData->connectionSpriteId1].pos2.y <= -222)
{
BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK);
sTradeData->state++;
- DestroySprite(&gSprites[sTradeData->unk_90]);
- DestroySprite(&gSprites[sTradeData->unk_91]);
+ DestroySprite(&gSprites[sTradeData->connectionSpriteId1]);
+ DestroySprite(&gSprites[sTradeData->connectionSpriteId2]);
}
break;
- case 40:
+ case TS_STATE_CREATE_LINK_MON_ARRIVING:
if (!gPaletteFade.active)
{
sTradeData->state++;
SetTradeSequenceBgGpuRegs(1);
sTradeData->bg1vofs = 166;
- sTradeData->unk_90 = CreateSprite(&gUnknown_08338D88, 128, -20, 3);
- sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 128, -20, 0);
- StartSpriteAnim(&gSprites[sTradeData->unk_91], 1);
+ sTradeData->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonGlow, 128, -20, 3);
+ sTradeData->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 128, -20, 0);
+ StartSpriteAnim(&gSprites[sTradeData->connectionSpriteId2], ANIM_LINKMON_SMALL);
}
break;
- case 41:
+ case TS_STATE_FADE_OUT_TO_GBA_RECV:
BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK);
sTradeData->state++;
break;
- case 42:
+ case TS_STATE_WAIT_FADE_OUT_TO_GBA_RECV:
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)
+ case TS_STATE_LINK_MON_TRAVEL_IN:
+ gSprites[sTradeData->connectionSpriteId1].pos2.y += 3;
+ gSprites[sTradeData->connectionSpriteId2].pos2.y += 3;
+ if (gSprites[sTradeData->connectionSpriteId1].pos2.y + gSprites[sTradeData->connectionSpriteId1].pos1.y == 64)
{
sTradeData->state++;
}
break;
- case 44:
+ case TS_STATE_PAN_TO_GBA:
if ((sTradeData->bg1vofs += 2) > 316)
{
sTradeData->bg1vofs = 316;
sTradeData->state++;
}
break;
- case 45:
- DestroySprite(&gSprites[sTradeData->unk_90]);
- DestroySprite(&gSprites[sTradeData->unk_91]);
+ case TS_STATE_DESTROY_LINK_MON:
+ DestroySprite(&gSprites[sTradeData->connectionSpriteId1]);
+ DestroySprite(&gSprites[sTradeData->connectionSpriteId2]);
sTradeData->state++;
sTradeData->timer = 0;
break;
- case 46:
+ case TS_STATE_LINK_MON_ARRIVED_DELAY:
if (++sTradeData->timer == 10)
- {
sTradeData->state++;
- }
break;
- case 47:
+ case TS_STATE_MOVE_GBA_TO_CENTER:
if (++sTradeData->bg1vofs > 348)
{
sTradeData->bg1vofs = 348;
@@ -3582,41 +3694,41 @@ static bool8 AnimateTradeSequenceCable(void)
}
if (sTradeData->bg1vofs == 328 && sTradeData->isCableTrade)
{
- sTradeData->unk_92 = CreateSprite(&gSpriteTemplate_8338DFC, 128, 65, 0);
- gSprites[sTradeData->unk_92].callback = sub_807AAE0;
+ sTradeData->cableEndSpriteId = CreateSprite(&sSpriteTemplate_CableEnd, 128, 65, 0);
+ gSprites[sTradeData->cableEndSpriteId].callback = SpriteCB_CableEndReceiving;
}
break;
- case 48:
- sTradeData->unk_91 = CreateSprite(&gSpriteTemplate_8338E74, 120, 80, 0);
- sTradeData->state = 50;
+ case TS_STATE_GBA_FLASH_RECV:
+ sTradeData->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_GbaScreenFlash_Long, 120, 80, 0);
+ sTradeData->state = TS_STATE_GBA_STOP_FLASH_RECV;
break;
- case 50:
- if (gSprites[sTradeData->unk_91].animEnded)
+ case TS_STATE_GBA_STOP_FLASH_RECV:
+ if (gSprites[sTradeData->connectionSpriteId2].animEnded)
{
- DestroySprite(&gSprites[sTradeData->unk_91]);
+ DestroySprite(&gSprites[sTradeData->connectionSpriteId2]);
SetTradeSequenceBgGpuRegs(6);
sTradeData->state++;
PlaySE(SE_M_SAND_ATTACK);
}
break;
- case 51:
- if (sTradeData->unk_EA < 0x400)
+ case TS_STATE_GBA_ZOOM_IN:
+ if (sTradeData->gbaScale < 0x400)
{
- sTradeData->unk_EA += 0x34;
+ sTradeData->gbaScale += 0x34;
}
else
{
- sTradeData->unk_EA = 0x400;
+ sTradeData->gbaScale = 0x400;
sTradeData->state++;
}
- sTradeData->sXY = 0x8000 / sTradeData->unk_EA;
+ sTradeData->sXY = 0x8000 / sTradeData->gbaScale;
break;
- case 52:
+ case TS_STATE_FADE_OUT_TO_NEW_MON:
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
- sTradeData->state = 60;
+ sTradeData->state = TS_STATE_WAIT_FADE_OUT_TO_NEW_MON;
break;
- case 60:
+ case TS_STATE_WAIT_FADE_OUT_TO_NEW_MON:
if (!gPaletteFade.active)
{
SetTradeSequenceBgGpuRegs(5);
@@ -3625,54 +3737,52 @@ static bool8 AnimateTradeSequenceCable(void)
sTradeData->state++;
}
break;
- case 61:
+ case TS_STATE_FADE_IN_TO_NEW_MON:
gPaletteFade.bufferTransferDisabled = FALSE;
BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);
sTradeData->state++;
break;
- case 62:
+ case TS_STATE_WAIT_FADE_IN_TO_NEW_MON:
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(&gSpriteTemplate_8338D28, 120, -8, 0);
- gSprites[sTradeData->unk_D3].data[3] = 74;
- gSprites[sTradeData->unk_D3].callback = sub_807E6AC;
- StartSpriteAnim(&gSprites[sTradeData->unk_D3], 1);
- StartSpriteAffineAnim(&gSprites[sTradeData->unk_D3], 2);
- BlendPalettes(1 << (16 + gSprites[sTradeData->unk_D3].oam.paletteNum), 16, RGB_WHITEALPHA);
+ case TS_STATE_POKEBALL_ARRIVE:
+ sTradeData->bouncingPokeballSpriteId = CreateSprite(&sSpriteTemplate_Pokeball, 120, -8, 0);
+ gSprites[sTradeData->bouncingPokeballSpriteId].data[3] = 74;
+ gSprites[sTradeData->bouncingPokeballSpriteId].callback = SpriteCB_BouncingPokeballArrive;
+ StartSpriteAnim(&gSprites[sTradeData->bouncingPokeballSpriteId], 1);
+ StartSpriteAffineAnim(&gSprites[sTradeData->bouncingPokeballSpriteId], 2);
+ BlendPalettes(1 << (16 + gSprites[sTradeData->bouncingPokeballSpriteId].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);
+ case TS_STATE_FADE_POKEBALL_TO_NORMAL:
+ BeginNormalPaletteFade(1 << (16 + gSprites[sTradeData->bouncingPokeballSpriteId].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA);
sTradeData->state++;
break;
- case 65:
- if (gSprites[sTradeData->unk_D3].callback == SpriteCallbackDummy)
+ case TS_STATE_POKEBALL_ARRIVE_WAIT:
+ if (gSprites[sTradeData->bouncingPokeballSpriteId].callback == SpriteCallbackDummy)
{
HandleLoadSpecialPokePic_2(&gMonFrontPicTable[sTradeData->monSpecies[TRADE_PARTNER]], gMonSpritesGfxPtr->sprites.ptr[3], sTradeData->monSpecies[TRADE_PARTNER], sTradeData->monPersonalities[TRADE_PARTNER]);
sTradeData->state++;
}
break;
- case 66:
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos1.x = 120;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos1.y = gMonFrontPicCoords[sTradeData->monSpecies[TRADE_PARTNER]].y_offset + 60;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos2.x = 0;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos2.y = 0;
- StartSpriteAnim(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]], 0);
- CreatePokeballSpriteToReleaseMon(sTradeData->pokePicSpriteIdxs[TRADE_PARTNER], gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF, sTradeData->monSpecies[TRADE_PARTNER]);
- FreeSpriteOamMatrix(&gSprites[sTradeData->unk_D3]);
- DestroySprite(&gSprites[sTradeData->unk_D3]);
+ case TS_STATE_SHOW_NEW_MON:
+ gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos1.x = 120;
+ gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos1.y = gMonFrontPicCoords[sTradeData->monSpecies[TRADE_PARTNER]].y_offset + 60;
+ gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos2.x = 0;
+ gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos2.y = 0;
+ StartSpriteAnim(&gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]], 0);
+ CreatePokeballSpriteToReleaseMon(sTradeData->monSpriteIds[TRADE_PARTNER], gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF, sTradeData->monSpecies[TRADE_PARTNER]);
+ FreeSpriteOamMatrix(&gSprites[sTradeData->bouncingPokeballSpriteId]);
+ DestroySprite(&gSprites[sTradeData->bouncingPokeballSpriteId]);
sTradeData->state++;
break;
- case 67:
+ case TS_STATE_NEW_MON_MSG:
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
DISPCNT_OBJ_1D_MAP |
DISPCNT_BG0_ON |
@@ -3680,28 +3790,24 @@ static bool8 AnimateTradeSequenceCable(void)
DISPCNT_OBJ_ON);
StringExpandPlaceholders(gStringVar4, gText_XSentOverY);
DrawTextOnTradeWindow(0, gStringVar4, 0);
- sTradeData->state = 167;
+ sTradeData->state = TS_STATE_DELAY_FOR_MON_ANIM;
sTradeData->timer = 0;
break;
- // 167 and 267 are extra cases added in for animations
- case 167:
+ case TS_STATE_DELAY_FOR_MON_ANIM:
if (++sTradeData->timer > 60)
{
- sTradeData->state = 267;
+ sTradeData->state = TS_STATE_WAIT_FOR_MON_CRY;
sTradeData->timer = 0;
}
break;
- case 267:
+ case TS_STATE_WAIT_FOR_MON_CRY:
if (IsCryFinished())
- {
- sTradeData->state = 68;
- }
+ sTradeData->state = TS_STATE_TAKE_CARE_OF_MON;
break;
- case 68:
+ case TS_STATE_TAKE_CARE_OF_MON:
if (++sTradeData->timer == 10)
- {
PlayFanfare(MUS_EVOLVED);
- }
+
if (sTradeData->timer == 250)
{
sTradeData->state++;
@@ -3710,17 +3816,15 @@ static bool8 AnimateTradeSequenceCable(void)
sTradeData->timer = 0;
}
break;
- case 69:
+ case TS_STATE_AFTER_NEW_MON_DELAY:
if (++sTradeData->timer == 60)
- {
sTradeData->state++;
- }
break;
- case 70:
+ case TS_STATE_CHECK_RIBBONS:
CheckPartnersMonForRibbons();
sTradeData->state++;
break;
- case 71:
+ case TS_STATE_END_LINK_TRADE:
if (sTradeData->isLinkTrade)
{
return TRUE;
@@ -3730,21 +3834,21 @@ static bool8 AnimateTradeSequenceCable(void)
sTradeData->state++;
}
break;
- case 72: // Only if in-game trade
+ case TS_STATE_TRY_EVOLUTION: // Only if in-game trade, link trades use CB2_TryLinkTradeEvolution
TradeMons(gSpecialVar_0x8005, 0);
gCB2_AfterEvolution = CB2_UpdateInGameTrade;
evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], EVO_MODE_TRADE, ITEM_NONE);
if (evoTarget != SPECIES_NONE)
{
- TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoTarget, sTradeData->pokePicSpriteIdxs[TRADE_PARTNER], gSelectedTradeMonPositions[TRADE_PLAYER]);
+ TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoTarget, sTradeData->monSpriteIds[TRADE_PARTNER], gSelectedTradeMonPositions[TRADE_PLAYER]);
}
sTradeData->state++;
break;
- case 73:
+ case TS_STATE_FADE_OUT_END:
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
sTradeData->state++;
break;
- case 74:
+ case TS_STATE_WAIT_FADE_OUT_END:
if (!gPaletteFade.active)
{
PlayNewMapMusic(sTradeData->cachedMapMusic);
@@ -3771,65 +3875,63 @@ static bool8 AnimateTradeSequenceWireless(void)
switch (sTradeData->state)
{
- case 0:
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].invisible = FALSE;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.x = -180;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.y = gMonFrontPicCoords[sTradeData->monSpecies[TRADE_PLAYER]].y_offset;
+ case TS_STATE_START:
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].invisible = FALSE;
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.x = -180;
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.y = gMonFrontPicCoords[sTradeData->monSpecies[TRADE_PLAYER]].y_offset;
sTradeData->state++;
sTradeData->cachedMapMusic = GetCurrentMapMusic();
PlayNewMapMusic(MUS_EVOLUTION);
break;
- case 1:
+ case TS_STATE_MON_SLIDE_IN:
if (sTradeData->bg2hofs > 0)
{
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.x += 3;
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.x += 3;
sTradeData->bg2hofs -= 3;
}
else
{
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.x = 0;
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.x = 0;
sTradeData->bg2hofs = 0;
- sTradeData->state = 10;
+ sTradeData->state = TS_STATE_SEND_MSG;
}
break;
- case 10:
+ case TS_STATE_SEND_MSG:
StringExpandPlaceholders(gStringVar4, gText_XWillBeSentToY);
DrawTextOnTradeWindow(0, gStringVar4, 0);
if (sTradeData->monSpecies[TRADE_PLAYER] != SPECIES_EGG)
- {
PlayCry1(sTradeData->monSpecies[TRADE_PLAYER], 0);
- }
- sTradeData->state = 11;
+ sTradeData->state = TS_STATE_BYE_BYE;
sTradeData->timer = 0;
break;
- case 11:
+ case TS_STATE_BYE_BYE:
if (++sTradeData->timer == 80)
{
- sTradeData->pokeballSpriteId = CreateTradePokeballSprite(sTradeData->pokePicSpriteIdxs[0], gSprites[sTradeData->pokePicSpriteIdxs[0]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff);
+ sTradeData->releasePokeballSpriteId = CreateTradePokeballSprite(sTradeData->monSpriteIds[0], gSprites[sTradeData->monSpriteIds[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)
+ case TS_STATE_POKEBALL_DEPART:
+ if (gSprites[sTradeData->releasePokeballSpriteId].callback == SpriteCallbackDummy)
{
- sTradeData->unk_D3 = CreateSprite(&gSpriteTemplate_8338D28, 120, 32, 0);
- gSprites[sTradeData->unk_D3].callback = sub_807E5D8;
- DestroySprite(&gSprites[sTradeData->pokeballSpriteId]);
+ sTradeData->bouncingPokeballSpriteId = CreateSprite(&sSpriteTemplate_Pokeball, 120, 32, 0);
+ gSprites[sTradeData->bouncingPokeballSpriteId].callback = SpriteCB_BouncingPokeballDepart;
+ DestroySprite(&gSprites[sTradeData->releasePokeballSpriteId]);
sTradeData->state++;
}
break;
- case 13:
+ case TS_STATE_POKEBALL_DEPART_WAIT:
// The game waits here for the sprite to finish its animation sequence.
break;
- case 14:
+ case TS_STATE_FADE_OUT_TO_GBA_SEND:
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
- sTradeData->state = 20;
+ sTradeData->state = TS_STATE_WAIT_FADE_OUT_TO_GBA_SEND;
break;
- case 20:
+ case TS_STATE_WAIT_FADE_OUT_TO_GBA_SEND:
if (!gPaletteFade.active)
{
SetTradeSequenceBgGpuRegs(4);
@@ -3838,190 +3940,185 @@ static bool8 AnimateTradeSequenceWireless(void)
sTradeData->state++;
}
break;
- case 21:
+ case TS_STATE_FADE_IN_TO_GBA_SEND:
BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK);
sTradeData->state++;
break;
- case 22:
+ case TS_STATE_WAIT_FADE_IN_TO_GBA_SEND:
if (!gPaletteFade.active)
- {
- sTradeData->state = 23;
- }
+ sTradeData->state = TS_STATE_GBA_ZOOM_OUT;
break;
- case 23:
- if (sTradeData->unk_EA > 0x100)
+ case TS_STATE_GBA_ZOOM_OUT:
+ if (sTradeData->gbaScale > 0x100)
{
- sTradeData->unk_EA -= 0x34;
+ sTradeData->gbaScale -= 0x34;
}
else
{
SetTradeSequenceBgGpuRegs(1);
- sTradeData->unk_EA = 0x80;
- sTradeData->state = 124;
+ sTradeData->gbaScale = 0x80;
+ sTradeData->state = TS_STATE_GBA_FLASH_SEND_WIRELESS;
sTradeData->timer = 0;
}
- sTradeData->sXY = 0x8000 / sTradeData->unk_EA;
+ sTradeData->sXY = 0x8000 / sTradeData->gbaScale;
break;
- case 124:
+ case TS_STATE_GBA_FLASH_SEND_WIRELESS:
if (++sTradeData->timer > 20)
{
SetTradeSequenceBgGpuRegs(3);
- sTradeData->unk_91 = CreateSprite(&gSpriteTemplate_8338E8C, 120, 80, 0);
+ sTradeData->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_GbaScreenFlash_Short, 120, 80, 0);
sTradeData->state++;
}
break;
- case 125:
- if (gSprites[sTradeData->unk_91].animEnded)
+ case TS_STATE_GBA_STOP_FLASH_SEND_WIRELESS:
+ if (gSprites[sTradeData->connectionSpriteId2].animEnded)
{
- DestroySprite(&gSprites[sTradeData->unk_91]);
+ DestroySprite(&gSprites[sTradeData->connectionSpriteId2]);
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 |
BLDCNT_TGT1_OBJ |
BLDCNT_EFFECT_BLEND |
BLDCNT_TGT2_BG2);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 4));
+
+ // Start wireless signal effect
CreateTask(Task_AnimateWirelessSignal, 5);
sTradeData->state++;
}
break;
- case 126:
+ case TS_STATE_WAIT_WIRELESS_SIGNAL_SEND:
if (!FuncIsActiveTask(Task_AnimateWirelessSignal))
- {
- sTradeData->state = 26;
- }
+ sTradeData->state = TS_STATE_PAN_AWAY_GBA;
break;
- case 26:
+ case TS_STATE_PAN_AWAY_GBA:
if (--sTradeData->bg1vofs == 316)
- {
sTradeData->state++;
- }
break;
- case 27:
- sTradeData->unk_90 = CreateSprite(&gUnknown_08338D88, 120, 80, 3);
- gSprites[sTradeData->unk_90].callback = sub_807AA4C;
- sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 120, 80, 0);
- StartSpriteAnim(&gSprites[sTradeData->unk_91], 1);
+ case TS_STATE_CREATE_LINK_MON_LEAVING:
+ sTradeData->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonGlow, 120, 80, 3);
+ gSprites[sTradeData->connectionSpriteId1].callback = SpriteCB_LinkMonGlowWireless;
+ sTradeData->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 120, 80, 0);
+ StartSpriteAnim(&gSprites[sTradeData->connectionSpriteId2], ANIM_LINKMON_SMALL);
sTradeData->state++;
break;
- case 28:
+ case TS_STATE_LINK_MON_TRAVEL_OUT:
if ((sTradeData->bg1vofs -= 3) == 166)
- {
- sTradeData->state = 200;
- }
+ sTradeData->state = TS_STATE_LINK_MON_TRAVEL_OFFSCREEN;
+
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)
+ case TS_STATE_LINK_MON_TRAVEL_OFFSCREEN:
+ gSprites[sTradeData->connectionSpriteId1].pos1.y -= 2;
+ gSprites[sTradeData->connectionSpriteId2].pos1.y -= 2;
+ if (gSprites[sTradeData->connectionSpriteId1].pos1.y < -8)
{
- sTradeData->state = 29;
+ sTradeData->state = TS_STATE_FADE_OUT_TO_CROSSING;
}
break;
- case 29:
+ case TS_STATE_FADE_OUT_TO_CROSSING:
BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK);
- sTradeData->state = 30;
+ sTradeData->state = TS_STATE_WAIT_FADE_OUT_TO_CROSSING;
break;
- case 30:
+ case TS_STATE_WAIT_FADE_OUT_TO_CROSSING:
if (!gPaletteFade.active)
{
- DestroySprite(&gSprites[sTradeData->unk_90]);
- DestroySprite(&gSprites[sTradeData->unk_91]);
+ DestroySprite(&gSprites[sTradeData->connectionSpriteId1]);
+ DestroySprite(&gSprites[sTradeData->connectionSpriteId2]);
SetTradeSequenceBgGpuRegs(2);
sTradeData->state++;
}
break;
- case 31:
+ case TS_STATE_FADE_IN_TO_CROSSING:
BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK);
- sTradeData->unk_90 = CreateSprite(&sGlowBallSpriteTemplate, 111, 170, 0);
- sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 129, -10, 0);
+ sTradeData->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 111, 170, 0);
+ sTradeData->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 129, -10, 0);
sTradeData->state++;
break;
- case 32:
+ case TS_STATE_WAIT_FADE_IN_TO_CROSSING:
if (!gPaletteFade.active)
{
PlaySE(SE_WARP_OUT);
sTradeData->state++;
}
- gSprites[sTradeData->unk_90].pos2.y -= 3;
- gSprites[sTradeData->unk_91].pos2.y += 3;
+ gSprites[sTradeData->connectionSpriteId1].pos2.y -= 3;
+ gSprites[sTradeData->connectionSpriteId2].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)
+ case TS_STATE_CROSSING_LINK_MONS_ENTER:
+ gSprites[sTradeData->connectionSpriteId1].pos2.y -= 3;
+ gSprites[sTradeData->connectionSpriteId2].pos2.y += 3;
+ if (gSprites[sTradeData->connectionSpriteId1].pos2.y <= -90)
{
- gSprites[sTradeData->unk_90].data[1] = 1;
- gSprites[sTradeData->unk_91].data[1] = 1;
+ gSprites[sTradeData->connectionSpriteId1].data[1] = 1;
+ gSprites[sTradeData->connectionSpriteId2].data[1] = 1;
sTradeData->state++;
- CreateTask(c3_0805465C, 5);
+ CreateTask(Task_NarrowWindowForCrossing_Wireless, 5);
}
break;
- case 34:
+ case TS_STATE_CROSSING_BLEND_WHITE_1:
BlendPalettes(0x8, 16, RGB_WHITEALPHA);
sTradeData->state++;
break;
- case 35:
+ case TS_STATE_CROSSING_BLEND_WHITE_2:
BlendPalettes(0x8, 16, RGB_WHITEALPHA);
sTradeData->state++;
break;
- case 36:
+ case TS_STATE_CROSSING_BLEND_WHITE_3:
BlendPalettes(0x8, 16, RGB_WHITEALPHA);
sTradeData->state++;
break;
- case 37:
+ case TS_STATE_CROSSING_CREATE_MON_PICS:
if (!IsMonSpriteNotFlipped(sTradeData->monSpecies[TRADE_PLAYER]))
{
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].affineAnims = gSpriteAffineAnimTable_8338ECC;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].oam.affineMode = ST_OAM_AFFINE_DOUBLE;
- CalcCenterToCornerVec(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]], SPRITE_SHAPE(64x64), SPRITE_SIZE(64x64), ST_OAM_AFFINE_DOUBLE);
- StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]], 0);
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].affineAnims = sAffineAnims_CrossingMonPics;
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].oam.affineMode = ST_OAM_AFFINE_DOUBLE;
+ CalcCenterToCornerVec(&gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]], SPRITE_SHAPE(64x64), SPRITE_SIZE(64x64), ST_OAM_AFFINE_DOUBLE);
+ StartSpriteAffineAnim(&gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]], 0);
}
else
{
- StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]], 0);
+ StartSpriteAffineAnim(&gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]], 0);
}
- StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]], 0);
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos1.x = 40;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos1.x = 200;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos1.y = 192;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos1.y = -32;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].invisible = FALSE;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].invisible = FALSE;
+ StartSpriteAffineAnim(&gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]], 0);
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos1.x = 40;
+ gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos1.x = 200;
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos1.y = 192;
+ gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos1.y = -32;
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].invisible = FALSE;
+ gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].invisible = FALSE;
sTradeData->state++;
break;
- case 38:
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.y -= 3;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos2.y += 3;
- if (gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.y < -DISPLAY_HEIGHT
- && gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.y >= -DISPLAY_HEIGHT - 3)
+ case TS_STATE_CROSSING_MON_PICS_MOVE:
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.y -= 3;
+ gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos2.y += 3;
+ if (gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.y < -DISPLAY_HEIGHT
+ && gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.y >= -DISPLAY_HEIGHT - 3)
{
PlaySE(SE_WARP_IN);
}
- if (gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.y < -222)
+ if (gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.y < -222)
{
- gSprites[sTradeData->unk_90].data[1] = 0;
- gSprites[sTradeData->unk_91].data[1] = 0;
+ gSprites[sTradeData->connectionSpriteId1].data[1] = 0;
+ gSprites[sTradeData->connectionSpriteId2].data[1] = 0;
sTradeData->state++;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].invisible = TRUE;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].invisible = TRUE;
- CreateTask(sub_807F39C, 5);
+ gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].invisible = TRUE;
+ gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].invisible = TRUE;
+ CreateTask(Task_NarrowWindowForCrossing_Cable, 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)
+ case TS_STATE_CROSSING_LINK_MONS_EXIT:
+ gSprites[sTradeData->connectionSpriteId1].pos2.y -= 3;
+ gSprites[sTradeData->connectionSpriteId2].pos2.y += 3;
+ if (gSprites[sTradeData->connectionSpriteId1].pos2.y <= -222)
{
BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK);
sTradeData->state++;
- DestroySprite(&gSprites[sTradeData->unk_90]);
- DestroySprite(&gSprites[sTradeData->unk_91]);
+ DestroySprite(&gSprites[sTradeData->connectionSpriteId1]);
+ DestroySprite(&gSprites[sTradeData->connectionSpriteId2]);
}
break;
- case 40:
+ case TS_STATE_CREATE_LINK_MON_ARRIVING:
if (!gPaletteFade.active)
{
sTradeData->state++;
@@ -4029,36 +4126,34 @@ static bool8 AnimateTradeSequenceWireless(void)
sTradeData->bg1vofs = 166;
SetTradeSequenceBgGpuRegs(3);
sTradeData->bg2vofs = 412;
- sTradeData->unk_90 = CreateSprite(&gUnknown_08338D88, 120, -20, 3);
- gSprites[sTradeData->unk_90].callback = sub_807AA4C;
- sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 120, -20, 0);
- StartSpriteAnim(&gSprites[sTradeData->unk_91], 1);
+ sTradeData->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonGlow, 120, -20, 3);
+ gSprites[sTradeData->connectionSpriteId1].callback = SpriteCB_LinkMonGlowWireless;
+ sTradeData->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 120, -20, 0);
+ StartSpriteAnim(&gSprites[sTradeData->connectionSpriteId2], ANIM_LINKMON_SMALL);
}
break;
- case 41:
+ case TS_STATE_FADE_OUT_TO_GBA_RECV:
BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK);
sTradeData->state++;
break;
- case 42:
+ case TS_STATE_WAIT_FADE_OUT_TO_GBA_RECV:
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)
+ case TS_STATE_LINK_MON_TRAVEL_IN:
+ gSprites[sTradeData->connectionSpriteId1].pos2.y += 4;
+ gSprites[sTradeData->connectionSpriteId2].pos2.y += 4;
+ if (gSprites[sTradeData->connectionSpriteId1].pos2.y + gSprites[sTradeData->connectionSpriteId1].pos1.y == 64)
{
- sTradeData->state = 144;
+ sTradeData->state = TS_STATE_PAN_TO_GBA_WIRELESS;
sTradeData->timer = 0;
}
break;
- case 144:
+ case TS_STATE_PAN_TO_GBA_WIRELESS:
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
DISPCNT_OBJ_1D_MAP |
DISPCNT_BG1_ON |
@@ -4077,62 +4172,60 @@ static bool8 AnimateTradeSequenceWireless(void)
sTradeData->state++;
}
break;
- case 145:
- DestroySprite(&gSprites[sTradeData->unk_90]);
- DestroySprite(&gSprites[sTradeData->unk_91]);
+ case TS_STATE_DESTROY_LINK_MON_WIRELESS:
+ DestroySprite(&gSprites[sTradeData->connectionSpriteId1]);
+ DestroySprite(&gSprites[sTradeData->connectionSpriteId2]);
sTradeData->state++;
sTradeData->timer = 0;
break;
- case 146:
+ case TS_STATE_WAIT_WIRELESS_SIGNAL_RECV:
if (!FuncIsActiveTask(Task_AnimateWirelessSignal))
{
- sTradeData->state = 46;
+ sTradeData->state = TS_STATE_LINK_MON_ARRIVED_DELAY;
sTradeData->timer = 0;
}
break;
- case 46:
+ case TS_STATE_LINK_MON_ARRIVED_DELAY:
if (++sTradeData->timer == 10)
- {
sTradeData->state++;
- }
break;
- case 47:
+ case TS_STATE_MOVE_GBA_TO_CENTER:
if (++sTradeData->bg1vofs > 348)
{
sTradeData->bg1vofs = 348;
sTradeData->state++;
}
break;
- case 48:
- sTradeData->unk_91 = CreateSprite(&gSpriteTemplate_8338E74, 120, 80, 0);
- sTradeData->state = 50;
+ case TS_STATE_GBA_FLASH_RECV:
+ sTradeData->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_GbaScreenFlash_Long, 120, 80, 0);
+ sTradeData->state = TS_STATE_GBA_STOP_FLASH_RECV;
break;
- case 50:
- if (gSprites[sTradeData->unk_91].animEnded)
+ case TS_STATE_GBA_STOP_FLASH_RECV:
+ if (gSprites[sTradeData->connectionSpriteId2].animEnded)
{
- DestroySprite(&gSprites[sTradeData->unk_91]);
+ DestroySprite(&gSprites[sTradeData->connectionSpriteId2]);
SetTradeSequenceBgGpuRegs(6);
sTradeData->state++;
PlaySE(SE_M_SAND_ATTACK);
}
break;
- case 51:
- if (sTradeData->unk_EA < 0x400)
+ case TS_STATE_GBA_ZOOM_IN:
+ if (sTradeData->gbaScale < 0x400)
{
- sTradeData->unk_EA += 0x34;
+ sTradeData->gbaScale += 0x34;
}
else
{
- sTradeData->unk_EA = 0x400;
+ sTradeData->gbaScale = 0x400;
sTradeData->state++;
}
- sTradeData->sXY = 0x8000 / sTradeData->unk_EA;
+ sTradeData->sXY = 0x8000 / sTradeData->gbaScale;
break;
- case 52:
+ case TS_STATE_FADE_OUT_TO_NEW_MON:
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
- sTradeData->state = 60;
+ sTradeData->state = TS_STATE_WAIT_FADE_OUT_TO_NEW_MON;
break;
- case 60:
+ case TS_STATE_WAIT_FADE_OUT_TO_NEW_MON:
if (!gPaletteFade.active)
{
SetTradeSequenceBgGpuRegs(5);
@@ -4141,54 +4234,55 @@ static bool8 AnimateTradeSequenceWireless(void)
sTradeData->state++;
}
break;
- case 61:
+ case TS_STATE_FADE_IN_TO_NEW_MON:
gPaletteFade.bufferTransferDisabled = FALSE;
BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);
sTradeData->state++;
break;
- case 62:
+ case TS_STATE_WAIT_FADE_IN_TO_NEW_MON:
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(&gSpriteTemplate_8338D28, 120, -8, 0);
- gSprites[sTradeData->unk_D3].data[3] = 74;
- gSprites[sTradeData->unk_D3].callback = sub_807E6AC;
- StartSpriteAnim(&gSprites[sTradeData->unk_D3], 1);
- StartSpriteAffineAnim(&gSprites[sTradeData->unk_D3], 2);
- BlendPalettes(1 << (16 + gSprites[sTradeData->unk_D3].oam.paletteNum), 16, RGB_WHITEALPHA);
+ case TS_STATE_POKEBALL_ARRIVE:
+ sTradeData->bouncingPokeballSpriteId = CreateSprite(&sSpriteTemplate_Pokeball, 120, -8, 0);
+ gSprites[sTradeData->bouncingPokeballSpriteId].data[3] = 74;
+ gSprites[sTradeData->bouncingPokeballSpriteId].callback = SpriteCB_BouncingPokeballArrive;
+ StartSpriteAnim(&gSprites[sTradeData->bouncingPokeballSpriteId], 1);
+ StartSpriteAffineAnim(&gSprites[sTradeData->bouncingPokeballSpriteId], 2);
+ BlendPalettes(1 << (16 + gSprites[sTradeData->bouncingPokeballSpriteId].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);
+ case TS_STATE_FADE_POKEBALL_TO_NORMAL:
+ BeginNormalPaletteFade(1 << (16 + gSprites[sTradeData->bouncingPokeballSpriteId].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA);
sTradeData->state++;
break;
- case 65:
- if (gSprites[sTradeData->unk_D3].callback == SpriteCallbackDummy)
+ case TS_STATE_POKEBALL_ARRIVE_WAIT:
+ if (gSprites[sTradeData->bouncingPokeballSpriteId].callback == SpriteCallbackDummy)
{
- HandleLoadSpecialPokePic_2(&gMonFrontPicTable[sTradeData->monSpecies[TRADE_PARTNER]], gMonSpritesGfxPtr->sprites.ptr[3], sTradeData->monSpecies[TRADE_PARTNER], sTradeData->monPersonalities[TRADE_PARTNER]);
+ HandleLoadSpecialPokePic_2(&gMonFrontPicTable[sTradeData->monSpecies[TRADE_PARTNER]],
+ gMonSpritesGfxPtr->sprites.ptr[3],
+ sTradeData->monSpecies[TRADE_PARTNER],
+ sTradeData->monPersonalities[TRADE_PARTNER]);
sTradeData->state++;
}
break;
- case 66:
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos1.x = 120;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos1.y = gMonFrontPicCoords[sTradeData->monSpecies[TRADE_PARTNER]].y_offset + 60;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos2.x = 0;
- gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos2.y = 0;
- StartSpriteAnim(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]], 0);
- CreatePokeballSpriteToReleaseMon(sTradeData->pokePicSpriteIdxs[TRADE_PARTNER], gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF, sTradeData->monSpecies[TRADE_PARTNER]);
- FreeSpriteOamMatrix(&gSprites[sTradeData->unk_D3]);
- DestroySprite(&gSprites[sTradeData->unk_D3]);
+ case TS_STATE_SHOW_NEW_MON:
+ gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos1.x = 120;
+ gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos1.y = gMonFrontPicCoords[sTradeData->monSpecies[TRADE_PARTNER]].y_offset + 60;
+ gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos2.x = 0;
+ gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos2.y = 0;
+ StartSpriteAnim(&gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]], 0);
+ CreatePokeballSpriteToReleaseMon(sTradeData->monSpriteIds[TRADE_PARTNER], gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF, sTradeData->monSpecies[TRADE_PARTNER]);
+ FreeSpriteOamMatrix(&gSprites[sTradeData->bouncingPokeballSpriteId]);
+ DestroySprite(&gSprites[sTradeData->bouncingPokeballSpriteId]);
sTradeData->state++;
break;
- case 67:
+ case TS_STATE_NEW_MON_MSG:
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
DISPCNT_OBJ_1D_MAP |
DISPCNT_BG0_ON |
@@ -4196,28 +4290,24 @@ static bool8 AnimateTradeSequenceWireless(void)
DISPCNT_OBJ_ON);
StringExpandPlaceholders(gStringVar4, gText_XSentOverY);
DrawTextOnTradeWindow(0, gStringVar4, 0);
- sTradeData->state = 167;
+ sTradeData->state = TS_STATE_DELAY_FOR_MON_ANIM;
sTradeData->timer = 0;
break;
- // 167 and 267 are extra cases added in for animations
- case 167:
+ case TS_STATE_DELAY_FOR_MON_ANIM:
if (++sTradeData->timer > 60)
{
- sTradeData->state = 267;
+ sTradeData->state = TS_STATE_WAIT_FOR_MON_CRY;
sTradeData->timer = 0;
}
break;
- case 267:
+ case TS_STATE_WAIT_FOR_MON_CRY:
if (IsCryFinished())
- {
- sTradeData->state = 68;
- }
+ sTradeData->state = TS_STATE_TAKE_CARE_OF_MON;
break;
- case 68:
+ case TS_STATE_TAKE_CARE_OF_MON:
if (++sTradeData->timer == 10)
- {
PlayFanfare(MUS_EVOLVED);
- }
+
if (sTradeData->timer == 250)
{
sTradeData->state++;
@@ -4226,17 +4316,15 @@ static bool8 AnimateTradeSequenceWireless(void)
sTradeData->timer = 0;
}
break;
- case 69:
+ case TS_STATE_AFTER_NEW_MON_DELAY:
if (++sTradeData->timer == 60)
- {
sTradeData->state++;
- }
break;
- case 70:
+ case TS_STATE_CHECK_RIBBONS:
CheckPartnersMonForRibbons();
sTradeData->state++;
break;
- case 71:
+ case TS_STATE_END_LINK_TRADE:
if (sTradeData->isLinkTrade)
{
return TRUE;
@@ -4246,21 +4334,21 @@ static bool8 AnimateTradeSequenceWireless(void)
sTradeData->state++;
}
break;
- case 72: // Only if in-game trade
+ case TS_STATE_TRY_EVOLUTION: // Only if in-game trade, link trades use CB2_TryLinkTradeEvolution
TradeMons(gSpecialVar_0x8005, 0);
gCB2_AfterEvolution = CB2_UpdateInGameTrade;
evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], EVO_MODE_TRADE, ITEM_NONE);
if (evoTarget != SPECIES_NONE)
{
- TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoTarget, sTradeData->pokePicSpriteIdxs[TRADE_PARTNER], gSelectedTradeMonPositions[TRADE_PLAYER]);
+ TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoTarget, sTradeData->monSpriteIds[TRADE_PARTNER], gSelectedTradeMonPositions[TRADE_PLAYER]);
}
sTradeData->state++;
break;
- case 73:
+ case TS_STATE_FADE_OUT_END:
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
sTradeData->state++;
break;
- case 74:
+ case TS_STATE_WAIT_FADE_OUT_END:
if (!gPaletteFade.active)
{
PlayNewMapMusic(sTradeData->cachedMapMusic);
@@ -4281,7 +4369,9 @@ static bool8 AnimateTradeSequenceWireless(void)
return FALSE;
}
-static void CB2_TryTradeEvolution(void)
+// Try to evolve a Pokémon received in a link trade
+// In-game trades resolve evolution during the trade sequence, in TS_STATE_TRY_EVOLUTION
+static void CB2_TryLinkTradeEvolution(void)
{
u16 evoTarget;
switch (gMain.state)
@@ -4294,7 +4384,7 @@ static void CB2_TryTradeEvolution(void)
gCB2_AfterEvolution = CB2_SaveAndEndTrade;
evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], EVO_MODE_TRADE, ITEM_NONE);
if (evoTarget != SPECIES_NONE)
- TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoTarget, sTradeData->pokePicSpriteIdxs[TRADE_PARTNER], gSelectedTradeMonPositions[TRADE_PLAYER]);
+ TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoTarget, sTradeData->monSpriteIds[TRADE_PARTNER], gSelectedTradeMonPositions[TRADE_PLAYER]);
else if (IsWirelessTrade())
SetMainCallback2(CB2_SaveAndEndWirelessTrade);
else
@@ -4317,7 +4407,7 @@ static void UpdateTradeFinishFlags(void)
if (blockReceivedStatus & 0x01)
{
if (gBlockRecvBuffer[0][0] == LINKCMD_CONFIRM_FINISH_TRADE)
- SetMainCallback2(CB2_TryTradeEvolution);
+ SetMainCallback2(CB2_TryLinkTradeEvolution);
if (gBlockRecvBuffer[0][0] == LINKCMD_READY_FINISH_TRADE)
sTradeData->playerLinkFlagFinishTrade = READY_FINISH_TRADE;
@@ -4333,7 +4423,7 @@ static void UpdateTradeFinishFlags(void)
}
}
-static void sub_807E55C(struct Sprite *sprite)
+static void SpriteCB_BouncingPokeball(struct Sprite *sprite)
{
sprite->pos1.y += sprite->data[0] / 10;
sprite->data[5] += sprite->data[1];
@@ -4354,7 +4444,7 @@ static void sub_807E55C(struct Sprite *sprite)
}
}
-static void sub_807E5D8(struct Sprite *sprite)
+static void SpriteCB_BouncingPokeballDepart(struct Sprite *sprite)
{
sprite->pos2.y += sTradeBallVerticalVelocityTable[sprite->data[0]];
if (sprite->data[0] == 22)
@@ -4362,13 +4452,13 @@ static void sub_807E5D8(struct Sprite *sprite)
if (++ sprite->data[0] == 44)
{
PlaySE(SE_M_MEGA_KICK);
- sprite->callback = sub_807E64C;
+ sprite->callback = SpriteCB_BouncingPokeballDepartEnd;
sprite->data[0] = 0;
BeginNormalPaletteFade(1 << (16 + sprite->oam.paletteNum), -1, 0, 16, RGB_WHITEALPHA);
}
}
-static void sub_807E64C(struct Sprite *sprite)
+static void SpriteCB_BouncingPokeballDepartEnd(struct Sprite *sprite)
{
if (sprite->data[1] == 20)
StartSpriteAffineAnim(sprite, 1);
@@ -4378,12 +4468,12 @@ static void sub_807E64C(struct Sprite *sprite)
if (++ sprite->data[0] == 23)
{
DestroySprite(sprite);
- sTradeData->state = 14; // Resume the master trade animation
+ sTradeData->state = TS_STATE_FADE_OUT_TO_GBA_SEND; // Resume the master trade animation
}
}
}
-static void sub_807E6AC(struct Sprite *sprite)
+static void SpriteCB_BouncingPokeballArrive(struct Sprite *sprite)
{
if (sprite->data[2] == 0)
{
@@ -4508,8 +4598,8 @@ static void CB2_UpdateLinkTrade(void)
{
if (AnimateTradeSequence() == TRUE)
{
- DestroySprite(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]]);
- FreeSpriteOamMatrix(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]]);
+ DestroySprite(&gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]]);
+ FreeSpriteOamMatrix(&gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]]);
TradeMons(gSelectedTradeMonPositions[TRADE_PLAYER], gSelectedTradeMonPositions[TRADE_PARTNER] % PARTY_SIZE);
if (!IsWirelessTrade())
{
@@ -4532,7 +4622,7 @@ static void CB2_TryFinishTrade(void)
u8 mpId = TradeGetMultiplayerId();
if (IsWirelessTrade())
{
- SetMainCallback2(CB2_TryTradeEvolution);
+ SetMainCallback2(CB2_TryLinkTradeEvolution);
}
else
{
@@ -4542,7 +4632,7 @@ static void CB2_TryFinishTrade(void)
&& sTradeData->partnerLinkFlagFinishTrade == READY_FINISH_TRADE)
{
sTradeData->linkData[0] = LINKCMD_CONFIRM_FINISH_TRADE;
- Trade_SendData(sTradeData);
+ SendBlock(bitmask_all_link_players_but_self(), sTradeData->linkData, sizeof(sTradeData->linkData));
sTradeData->playerLinkFlagFinishTrade = FINISH_TRADE;
sTradeData->partnerLinkFlagFinishTrade = FINISH_TRADE;
}
@@ -4793,16 +4883,16 @@ static void Task_AnimateWirelessSignal(u8 taskId)
if (!signalComingBack)
{
if (paletteIdx == 256)
- LoadPalette(sTradePal_Black, 0x30, 32);
+ LoadPalette(sWirelessSignalNone_Pal, 0x30, 32);
else
- LoadPalette(&sTradePal_WirelessSignalSend[paletteIdx], 0x30, 32);
+ LoadPalette(&sWirelessSignalSend_Pal[paletteIdx], 0x30, 32);
}
else
{
if (paletteIdx == 256)
- LoadPalette(sTradePal_Black, 0x30, 32);
+ LoadPalette(sWirelessSignalNone_Pal, 0x30, 32);
else
- LoadPalette(&sTradePal_WirelessSignalReceive[paletteIdx], 0x30, 32);
+ LoadPalette(&sWirelessSignalRecv_Pal[paletteIdx], 0x30, 32);
}
if (sWirelessSignalTiming[idx][0] == 0 && counter == 0)
@@ -4827,13 +4917,13 @@ static void Task_AnimateWirelessSignal(u8 taskId)
#undef counter
#undef signalComingBack
-static void c3_0805465C(u8 taskId)
+static void Task_NarrowWindowForCrossing_Wireless(u8 taskId)
{
s16 *data = gTasks[taskId].data;
if (data[0] == 0)
{
- sTradeData->wirelessWinLeft = sTradeData->wirelessWinRight = 120;
+ sTradeData->wirelessWinLeft = sTradeData->wirelessWinRight = DISPLAY_WIDTH / 2;
sTradeData->wirelessWinTop = 0;
sTradeData->wirelessWinBottom = DISPLAY_HEIGHT;
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
@@ -4851,19 +4941,17 @@ static void c3_0805465C(u8 taskId)
sTradeData->wirelessWinRight += 5;
if (sTradeData->wirelessWinLeft < 80)
- {
DestroyTask(taskId);
- }
}
-static void sub_807F39C(u8 taskId)
+static void Task_NarrowWindowForCrossing_Cable(u8 taskId)
{
s16 *data = gTasks[taskId].data;
if (data[0] == 0)
{
sTradeData->wirelessWinLeft = 80;
- sTradeData->wirelessWinRight = 160;
+ sTradeData->wirelessWinRight = DISPLAY_WIDTH - 80;
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_OBJ);
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 |
WININ_WIN0_BG1 |
@@ -4873,13 +4961,13 @@ static void sub_807F39C(u8 taskId)
SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE2(sTradeData->wirelessWinLeft, sTradeData->wirelessWinRight));
SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE2(sTradeData->wirelessWinTop, sTradeData->wirelessWinBottom));
- if (sTradeData->wirelessWinLeft != 120)
+ if (sTradeData->wirelessWinLeft != DISPLAY_WIDTH / 2)
{
data[0]++;
sTradeData->wirelessWinLeft += 5;
sTradeData->wirelessWinRight -= 5;
- if (sTradeData->wirelessWinLeft >= 116)
+ if (sTradeData->wirelessWinLeft > DISPLAY_WIDTH / 2 - 5)
BlendPalettes(0x8, 0, RGB_WHITEALPHA);
}
else
diff --git a/src/trainer_card.c b/src/trainer_card.c
index 03a7b9219..1ec519c90 100755
--- a/src/trainer_card.c
+++ b/src/trainer_card.c
@@ -661,7 +661,7 @@ u32 CountPlayerTrainerStars(void)
stars++;
if (HasAllHoennMons())
stars++;
- if (CountPlayerContestPaintings() > 4)
+ if (CountPlayerMuseumPaintings() >= CONTEST_CATEGORIES_COUNT)
stars++;
if (HasAllFrontierSymbols())
stars++;
@@ -735,7 +735,7 @@ static void SetPlayerCardData(struct TrainerCard *trainerCard, u8 cardType)
case CARD_TYPE_FRLG:
trainerCard->contestsWithFriends = GetCappedGameStat(GAME_STAT_WON_LINK_CONTEST, 999);
trainerCard->pokeblocksWithFriends = GetCappedGameStat(GAME_STAT_POKEBLOCKS_WITH_FRIENDS, 0xFFFF);
- if (CountPlayerContestPaintings() > 4)
+ if (CountPlayerMuseumPaintings() >= CONTEST_CATEGORIES_COUNT)
trainerCard->hasAllPaintings = TRUE;
trainerCard->stars = GetRubyTrainerStars(trainerCard);
break;