summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bag.c272
-rw-r--r--src/battle_controller_oak_old_man.c4
-rw-r--r--src/battle_controller_player.c2
-rw-r--r--src/battle_controller_pokedude.c11
-rw-r--r--src/battle_main.c6
-rw-r--r--src/battle_message.c4
-rw-r--r--src/battle_setup.c4
-rw-r--r--src/berry_pouch.c6
-rw-r--r--src/credits.c4
-rw-r--r--src/data.c10
-rw-r--r--src/data/trainer_graphics/back_pic_anims.h8
-rw-r--r--src/data/trainer_graphics/back_pic_tables.h4
-rw-r--r--src/daycare.c235
-rw-r--r--src/event_object_lock.c2
-rw-r--r--src/field_fadetransition.c22
-rw-r--r--src/field_specials.c2
-rw-r--r--src/item_menu.c2400
-rw-r--r--src/item_menu_icons.c148
-rw-r--r--src/item_pc.c14
-rw-r--r--src/item_use.c44
-rw-r--r--src/link_rfu_2.c4
-rw-r--r--src/link_rfu_3.c8
-rw-r--r--src/menu_helpers.c4
-rw-r--r--src/mevent.c4
-rw-r--r--src/new_game.c2
-rw-r--r--src/party_menu.c14
-rw-r--r--src/player_pc.c10
-rw-r--r--src/pokemon.c52
-rw-r--r--src/quest_log.c4
-rw-r--r--src/rfu_union_tool.c663
-rw-r--r--src/safari_zone.c8
-rw-r--r--src/scrcmd.c8
-rw-r--r--src/script_menu.c59
-rw-r--r--src/shop.c6
-rw-r--r--src/start_menu.c4
-rw-r--r--src/teachy_tv.c16
-rw-r--r--src/tm_case.c34
-rw-r--r--src/trade_scene.c2
-rw-r--r--src/union_room.c4607
-rw-r--r--src/union_room_battle.c225
-rw-r--r--src/union_room_message.c543
-rw-r--r--src/vs_seeker.c2
-rw-r--r--src/wireless_communication_status_screen.c4
43 files changed, 8952 insertions, 533 deletions
diff --git a/src/bag.c b/src/bag.c
index c30bc626d..049aa9f8f 100644
--- a/src/bag.c
+++ b/src/bag.c
@@ -10,17 +10,18 @@
#include "menu.h"
#include "money.h"
#include "bag.h"
+#include "strings.h"
-extern const u8 gText_DepositItem[];
+static const u16 sBagWindowPalF[] = INCBIN_U16("data/bag/bag_window_pal.gbapal");
-const u16 gUnknown_8453098[] = INCBIN_U16("data/bag/bag_window_pal.gbapal");
-const u8 gUnknown_84530B8[][3] = {
+static const u8 sTextColors[][3] = {
{0, 1, 2},
{0, 2, 3},
{0, 3, 2},
{0, 8, 9}
};
-const struct WindowTemplate gUnknown_84530C4[] = {
+
+static const struct WindowTemplate sDefaultBagWindowsStd[] = {
{
.bg = 0,
.tilemapLeft = 0x0b,
@@ -47,7 +48,8 @@ const struct WindowTemplate gUnknown_84530C4[] = {
.baseBlock = 0x01f8
}, DUMMY_WIN_TEMPLATE
};
-const struct WindowTemplate gUnknown_84530E4[] = {
+
+static const struct WindowTemplate sDefaultBagWindowsDeposit[] = {
{
.bg = 0,
.tilemapLeft = 0x0b,
@@ -74,7 +76,8 @@ const struct WindowTemplate gUnknown_84530E4[] = {
.baseBlock = 0x01f8
}, DUMMY_WIN_TEMPLATE
};
-const struct WindowTemplate gUnknown_8453104[] = {
+
+static const struct WindowTemplate sWindowTemplates[] = {
{
.bg = 0,
.tilemapLeft = 24,
@@ -99,122 +102,114 @@ const struct WindowTemplate gUnknown_8453104[] = {
.height = 3,
.paletteNum = 0xC,
.baseBlock = 0x272
- }
-};
-
-const struct WindowTemplate gUnknown_845311C = {
- .bg = 0,
- .tilemapLeft = 23,
- .tilemapTop = 15,
- .width = 6,
- .height = 4,
- .paletteNum = 0xF,
- .baseBlock = 0x28a
-};
-
-const struct WindowTemplate gUnknown_8453124 = {
- .bg = 0,
- .tilemapLeft = 21,
- .tilemapTop = 9,
- .width = 6,
- .height = 4,
- .paletteNum = 0xF,
- .baseBlock = 0x28a
-};
-
-const struct WindowTemplate gUnknown_845312C[] = {
- {
- .bg = 0x00,
- .tilemapLeft = 0x02,
- .tilemapTop = 0x0f,
- .width = 0x1a,
- .height = 0x04,
- .paletteNum = 0x0f,
- .baseBlock = 0x02a2
}, {
- .bg = 0x00,
- .tilemapLeft = 0x06,
- .tilemapTop = 0x0f,
- .width = 0x0e,
- .height = 0x04,
- .paletteNum = 0x0c,
- .baseBlock = 0x02a2
+ .bg = 0,
+ .tilemapLeft = 23,
+ .tilemapTop = 15,
+ .width = 6,
+ .height = 4,
+ .paletteNum = 0xF,
+ .baseBlock = 0x28a
}, {
- .bg = 0x00,
- .tilemapLeft = 0x06,
- .tilemapTop = 0x0f,
- .width = 0x0f,
- .height = 0x04,
- .paletteNum = 0x0c,
- .baseBlock = 0x02da
+ .bg = 0,
+ .tilemapLeft = 21,
+ .tilemapTop = 9,
+ .width = 6,
+ .height = 4,
+ .paletteNum = 0xF,
+ .baseBlock = 0x28a
}, {
- .bg = 0x00,
- .tilemapLeft = 0x06,
- .tilemapTop = 0x0f,
- .width = 0x10,
- .height = 0x04,
- .paletteNum = 0x0c,
- .baseBlock = 0x0316
+ .bg = 0,
+ .tilemapLeft = 2,
+ .tilemapTop = 15,
+ .width = 26,
+ .height = 4,
+ .paletteNum = 0xF,
+ .baseBlock = 0x2a2
}, {
- .bg = 0x00,
- .tilemapLeft = 0x06,
- .tilemapTop = 0x0f,
- .width = 0x17,
- .height = 0x04,
- .paletteNum = 0x0c,
- .baseBlock = 0x0356
+ .bg = 0,
+ .tilemapLeft = 6,
+ .tilemapTop = 15,
+ .width = 14,
+ .height = 4,
+ .paletteNum = 0xC,
+ .baseBlock = 0x2a2
}, {
- .bg = 0x00,
- .tilemapLeft = 0x16,
- .tilemapTop = 0x11,
- .width = 0x07,
- .height = 0x02,
- .paletteNum = 0x0f,
- .baseBlock = 0x020a
+ .bg = 0,
+ .tilemapLeft = 6,
+ .tilemapTop = 15,
+ .width = 15,
+ .height = 4,
+ .paletteNum = 0xC,
+ .baseBlock = 0x2da
}, {
- .bg = 0x00,
- .tilemapLeft = 0x16,
- .tilemapTop = 0x0f,
- .width = 0x07,
- .height = 0x04,
- .paletteNum = 0x0f,
- .baseBlock = 0x020a
+ .bg = 0,
+ .tilemapLeft = 6,
+ .tilemapTop = 15,
+ .width = 16,
+ .height = 4,
+ .paletteNum = 0xC,
+ .baseBlock = 0x316
}, {
- .bg = 0x00,
- .tilemapLeft = 0x16,
- .tilemapTop = 0x0d,
- .width = 0x07,
- .height = 0x06,
- .paletteNum = 0x0f,
- .baseBlock = 0x020a
+ .bg = 0,
+ .tilemapLeft = 6,
+ .tilemapTop = 15,
+ .width = 23,
+ .height = 4,
+ .paletteNum = 0xC,
+ .baseBlock = 0x356
}, {
- .bg = 0x00,
- .tilemapLeft = 0x16,
- .tilemapTop = 0x0b,
- .width = 0x07,
- .height = 0x08,
- .paletteNum = 0x0f,
- .baseBlock = 0x020a
+ .bg = 0,
+ .tilemapLeft = 22,
+ .tilemapTop = 17,
+ .width = 7,
+ .height = 2,
+ .paletteNum = 0xF,
+ .baseBlock = 0x20a
+ }, {
+ .bg = 0,
+ .tilemapLeft = 22,
+ .tilemapTop = 15,
+ .width = 7,
+ .height = 4,
+ .paletteNum = 0xF,
+ .baseBlock = 0x20a
+ }, {
+ .bg = 0,
+ .tilemapLeft = 22,
+ .tilemapTop = 13,
+ .width = 7,
+ .height = 6,
+ .paletteNum = 0xF,
+ .baseBlock = 0x20a
+ }, {
+ .bg = 0,
+ .tilemapLeft = 22,
+ .tilemapTop = 11,
+ .width = 7,
+ .height = 8,
+ .paletteNum = 0xF,
+ .baseBlock = 0x20a
}
};
-const u8 gUnknown_8453174[] = {16, 8, 4};
+static const u8 sUnused_8453174[] = {16, 8, 4};
-EWRAM_DATA u8 gUnknown_203AD34[11] = {};
+static EWRAM_DATA u8 sOpenWindows[11] = {};
-void sub_810B858(void)
+void InitBagWindows(void)
{
u8 i;
- if (gUnknown_203ACFC.location != 3)
- InitWindows(gUnknown_84530C4);
+ if (gBagMenuState.location != 3)
+ InitWindows(sDefaultBagWindowsStd);
else
- InitWindows(gUnknown_84530E4);
+ InitWindows(sDefaultBagWindowsDeposit);
DeactivateAllTextPrinters();
TextWindow_SetUserSelectedFrame(0, 0x64, 0xE0);
TextWindow_LoadResourcesStdFrame0(0, 0x6D, 0xD0);
TextWindow_SetStdFrame0_WithPal(0, 0x81, 0xC0);
- LoadPalette(gUnknown_8453098, 0xF0, 0x20);
+ LoadPalette(sBagWindowPalF, 0xF0, 0x20);
for (i = 0; i < 3; i++)
{
FillWindowPixelBuffer(i, 0x00);
@@ -223,22 +218,22 @@ void sub_810B858(void)
ScheduleBgCopyTilemapToVram(0);
for (i = 0; i < 11; i++)
{
- gUnknown_203AD34[i] = 0xFF;
+ sOpenWindows[i] = 0xFF;
}
}
-void sub_810B8F0(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, s8 speed, u8 colorIdx)
+void BagPrintTextOnWindow(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx)
{
- AddTextPrinterParameterized4(windowId, fontId, x, y, letterSpacing, lineSpacing, gUnknown_84530B8[colorIdx], speed, str);
+ AddTextPrinterParameterized4(windowId, fontId, x, y, letterSpacing, lineSpacing, sTextColors[colorIdx], speed, str);
}
-void sub_810B958(const u8 * str)
+void BagPrintTextOnWin1CenteredColor0(const u8 * str, u8 unused)
{
u32 x = 0x48 - GetStringWidth(1, str, 0);
- AddTextPrinterParameterized3(2, 1, x / 2, 1, gUnknown_84530B8[0], 0, str);
+ AddTextPrinterParameterized3(2, 1, x / 2, 1, sTextColors[0], 0, str);
}
-void sub_810B994(void)
+void BagDrawDepositItemTextBox(void)
{
u32 x;
DrawStdFrameWithCustomTileAndPalette(2, FALSE, 0x081, 0x0C);
@@ -246,77 +241,76 @@ void sub_810B994(void)
AddTextPrinterParameterized(2, 0, gText_DepositItem, x / 2, 1, 0, NULL);
}
-u8 sub_810B9DC(u8 a0, u8 a1)
+u8 ShowBagWindow(u8 whichWindow, u8 nItems)
{
- if (gUnknown_203AD34[a0] == 0xFF)
+ if (sOpenWindows[whichWindow] == 0xFF)
{
- gUnknown_203AD34[a0] = AddWindow(&gUnknown_8453104[a0 + a1]);
- if (a0 != 6)
+ sOpenWindows[whichWindow] = AddWindow(&sWindowTemplates[whichWindow + nItems]);
+ if (whichWindow != 6)
{
- DrawStdFrameWithCustomTileAndPalette(gUnknown_203AD34[a0], FALSE, 0x064, 0x0E);
+ DrawStdFrameWithCustomTileAndPalette(sOpenWindows[whichWindow], FALSE, 0x064, 0xE);
}
else
{
- DrawStdFrameWithCustomTileAndPalette(gUnknown_203AD34[a0], FALSE, 0x081, 0x0C);
+ DrawStdFrameWithCustomTileAndPalette(sOpenWindows[whichWindow], FALSE, 0x081, 0xC);
}
ScheduleBgCopyTilemapToVram(0);
}
- return gUnknown_203AD34[a0];
+ return sOpenWindows[whichWindow];
}
-void sub_810BA3C(u8 a0)
+void HideBagWindow(u8 whichWindow)
{
- ClearStdWindowAndFrameToTransparent(gUnknown_203AD34[a0], FALSE);
- ClearWindowTilemap(gUnknown_203AD34[a0]);
- RemoveWindow(gUnknown_203AD34[a0]);
+ ClearStdWindowAndFrameToTransparent(sOpenWindows[whichWindow], FALSE);
+ ClearWindowTilemap(sOpenWindows[whichWindow]);
+ RemoveWindow(sOpenWindows[whichWindow]);
ScheduleBgCopyTilemapToVram(0);
- gUnknown_203AD34[a0] = 0xFF;
+ sOpenWindows[whichWindow] = 0xFF;
}
-u8 sub_810BA70(u8 a0)
+u8 OpenBagWindow(u8 whichWindow)
{
- if (gUnknown_203AD34[a0] == 0xFF)
+ if (sOpenWindows[whichWindow] == 0xFF)
{
- gUnknown_203AD34[a0] = AddWindow(&gUnknown_8453104[a0]);
+ sOpenWindows[whichWindow] = AddWindow(&sWindowTemplates[whichWindow]);
}
- return gUnknown_203AD34[a0];
+ return sOpenWindows[whichWindow];
}
-void sub_810BA9C(u8 a0)
+void CloseBagWindow(u8 whichWindow)
{
- if (gUnknown_203AD34[a0] != 0xFF)
+ if (sOpenWindows[whichWindow] != 0xFF)
{
- ClearDialogWindowAndFrameToTransparent(gUnknown_203AD34[a0], FALSE);
- ClearWindowTilemap(gUnknown_203AD34[a0]);
- RemoveWindow(gUnknown_203AD34[a0]);
+ ClearDialogWindowAndFrameToTransparent(sOpenWindows[whichWindow], FALSE);
+ ClearWindowTilemap(sOpenWindows[whichWindow]);
+ RemoveWindow(sOpenWindows[whichWindow]);
PutWindowTilemap(1);
ScheduleBgCopyTilemapToVram(0);
- gUnknown_203AD34[a0] = 0xFF;
-
+ sOpenWindows[whichWindow] = 0xFF;
}
}
-u8 sub_810BAD8(u8 a0)
+u8 GetBagWindow(u8 whichWindow)
{
- return gUnknown_203AD34[a0];
+ return sOpenWindows[whichWindow];
}
-void sub_810BAE8(u8 taskId, const struct YesNoFuncTable * ptrs)
+void BagCreateYesNoMenuBottomRight(u8 taskId, const struct YesNoFuncTable * ptrs)
{
- CreateYesNoMenuWithCallbacks(taskId, &gUnknown_845311C, 2, 0, 2, 0x64, 0x0E, ptrs);
+ CreateYesNoMenuWithCallbacks(taskId, &sWindowTemplates[3], 2, 0, 2, 0x064, 0x0E, ptrs);
}
-void sub_810BB14(u8 taskId, const struct YesNoFuncTable * ptrs)
+void BagCreateYesNoMenuTopRight(u8 taskId, const struct YesNoFuncTable * ptrs)
{
- CreateYesNoMenuWithCallbacks(taskId, &gUnknown_8453124, 2, 0, 2, 0x064, 0x0E, ptrs);
+ CreateYesNoMenuWithCallbacks(taskId, &sWindowTemplates[4], 2, 0, 2, 0x064, 0x0E, ptrs);
}
-void sub_810BB40(void)
+void BagPrintMoneyAmount(void)
{
- PrintMoneyAmountInMoneyBoxWithBorder(sub_810B9DC(2, 0), 0x081, 0x0C, GetMoney(&gSaveBlock1Ptr->money));
+ PrintMoneyAmountInMoneyBoxWithBorder(ShowBagWindow(2, 0), 0x081, 0x0C, GetMoney(&gSaveBlock1Ptr->money));
}
-void sub_810BB74(u8 windowId)
+void BagDrawTextBoxOnWindow(u8 windowId)
{
DrawTextBorderOuter(windowId, 0x064, 0x0E);
}
diff --git a/src/battle_controller_oak_old_man.c b/src/battle_controller_oak_old_man.c
index 6ae50d058..0807018a2 100644
--- a/src/battle_controller_oak_old_man.c
+++ b/src/battle_controller_oak_old_man.c
@@ -379,9 +379,9 @@ static void OpenBagAndChooseItem(void)
nullsub_44();
FreeAllWindowBuffers();
if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)
- sub_8107ECC();
+ CB2_BagMenuFromBattle();
else
- sub_810AF74();
+ InitOldManBag();
}
}
diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c
index 7f1f738a3..cb9e04a50 100644
--- a/src/battle_controller_player.c
+++ b/src/battle_controller_player.c
@@ -1330,7 +1330,7 @@ static void OpenBagAndChooseItem(void)
gBattlerControllerFuncs[gActiveBattler] = CompleteWhenChoseItem;
nullsub_44();
FreeAllWindowBuffers();
- sub_8107ECC();
+ CB2_BagMenuFromBattle();
}
}
diff --git a/src/battle_controller_pokedude.c b/src/battle_controller_pokedude.c
index 86da27ee3..d8ebe5ba4 100644
--- a/src/battle_controller_pokedude.c
+++ b/src/battle_controller_pokedude.c
@@ -23,6 +23,7 @@
#include "battle_interface.h"
#include "battle_message.h"
#include "reshow_battle_screen.h"
+#include "teachy_tv.h"
#include "constants/songs.h"
#include "constants/items.h"
#include "constants/moves.h"
@@ -733,15 +734,15 @@ static void OpenBagAndChooseItem(void)
FreeAllWindowBuffers();
switch (gSpecialVar_0x8004)
{
- case 1:
+ case TTVSCR_STATUS:
default:
- callbackId = 7;
+ callbackId = ITEMMENULOCATION_TTVSCR_STATUS;
break;
- case 3:
- callbackId = 8;
+ case TTVSCR_CATCHING:
+ callbackId = ITEMMENULOCATION_TTVSCR_CATCHING;
break;
}
- sub_810B108(callbackId);
+ InitPokedudeBag(callbackId);
}
}
diff --git a/src/battle_main.c b/src/battle_main.c
index 51509513f..fd8aeffbc 100644
--- a/src/battle_main.c
+++ b/src/battle_main.c
@@ -86,7 +86,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum);
static void CB2_HandleStartBattle(void);
static void TryCorrectShedinjaLanguage(struct Pokemon *mon);
static void BattleMainCB1(void);
-static void CB2_QuitPokeDudeBattle(void);
+static void CB2_QuitPokedudeBattle(void);
static void sub_80111FC(struct Sprite *sprite);
static void sub_8011B94(void);
static void sub_8011BB0(void);
@@ -1438,7 +1438,7 @@ void BattleMainCB2(void)
gSpecialVar_Result = gBattleOutcome = B_OUTCOME_DREW;
ResetPaletteFadeControl();
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
- SetMainCallback2(CB2_QuitPokeDudeBattle);
+ SetMainCallback2(CB2_QuitPokedudeBattle);
}
}
@@ -1454,7 +1454,7 @@ void FreeRestoreBattleData(void)
FreeBattleResources();
}
-static void CB2_QuitPokeDudeBattle(void)
+static void CB2_QuitPokedudeBattle(void)
{
UpdatePaletteFade();
if (!gPaletteFade.active)
diff --git a/src/battle_message.c b/src/battle_message.c
index c4faf73f9..c30150799 100644
--- a/src/battle_message.c
+++ b/src/battle_message.c
@@ -463,7 +463,7 @@ const u8 *const gPokeblockWasTooXStringTable[] = {
static const u8 sText_PlayerUsedItem[] = _("{B_PLAYER_NAME} used\n{B_LAST_ITEM}!");
static const u8 sText_OldManUsedItem[] = _("The old man used\n{B_LAST_ITEM}!");
-static const u8 sText_PokeDudeUsedItem[] = _("The POKé DUDE used\n{B_LAST_ITEM}!");
+static const u8 sText_PokedudeUsedItem[] = _("The POKé DUDE used\n{B_LAST_ITEM}!");
static const u8 sText_Trainer1UsedItem[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME}\nused {B_LAST_ITEM}!");
static const u8 sText_TrainerBlockedBall[] = _("The TRAINER blocked the BALL!");
static const u8 sText_DontBeAThief[] = _("Don't be a thief!");
@@ -876,7 +876,7 @@ const u8 *const gBattleStringsTable[] = {
Text_1A5D31,
Text_1A5D6E,
Text_1A5DB1,
- sText_PokeDudeUsedItem,
+ sText_PokedudeUsedItem,
gUnknown_83FDA4D,
gUnknown_83FDA7A,
gUnknown_83FDA8C,
diff --git a/src/battle_setup.c b/src/battle_setup.c
index 4859b9234..102a1b969 100644
--- a/src/battle_setup.c
+++ b/src/battle_setup.c
@@ -978,7 +978,7 @@ const u8 *BattleSetup_GetScriptAddrAfterBattle(void)
if (sTrainerBattleEndScript != NULL)
return sTrainerBattleEndScript;
else
- return EventScript_1C555B;
+ return Test_EventScript_Sign;
}
const u8 *BattleSetup_GetTrainerPostBattleScript(void)
@@ -986,7 +986,7 @@ const u8 *BattleSetup_GetTrainerPostBattleScript(void)
if (sTrainerABattleScriptRetAddr != NULL)
return sTrainerABattleScriptRetAddr;
else
- return EventScript_1C555B;
+ return Test_EventScript_Sign;
}
void ScrSpecial_ShowTrainerNonBattlingSpeech(void)
diff --git a/src/berry_pouch.c b/src/berry_pouch.c
index 711a17768..63677574b 100644
--- a/src/berry_pouch.c
+++ b/src/berry_pouch.c
@@ -1269,7 +1269,7 @@ static void Task_ContextMenu_Sell(u8 taskId)
{
CopyItemName(gSpecialVar_ItemId, gStringVar1);
StringExpandPlaceholders(gStringVar4, gText_OhNoICantBuyThat);
- DisplayItemMessageInBerryPouch(taskId, sub_80BF8E4(), gStringVar4, Task_BerryPouch_DestroyDialogueWindowAndRefreshListMenu);
+ DisplayItemMessageInBerryPouch(taskId, GetDialogBoxFontId(), gStringVar4, Task_BerryPouch_DestroyDialogueWindowAndRefreshListMenu);
}
else
{
@@ -1285,7 +1285,7 @@ static void Task_ContextMenu_Sell(u8 taskId)
data[2] = 99;
CopyItemName(gSpecialVar_ItemId, gStringVar1);
StringExpandPlaceholders(gStringVar4, gText_HowManyWouldYouLikeToSell);
- DisplayItemMessageInBerryPouch(taskId, sub_80BF8E4(), gStringVar4, Task_Sell_PrintSelectMultipleUI);
+ DisplayItemMessageInBerryPouch(taskId, GetDialogBoxFontId(), gStringVar4, Task_Sell_PrintSelectMultipleUI);
}
}
}
@@ -1295,7 +1295,7 @@ static void Task_AskSellMultiple(u8 taskId)
s16 * data = gTasks[taskId].data;
ConvertIntToDecimalStringN(gStringVar3, itemid_get_market_price(BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, data[1])) / 2 * data[8], STR_CONV_MODE_LEFT_ALIGN, 6);
StringExpandPlaceholders(gStringVar4, gText_ICanPayThisMuch_WouldThatBeOkay);
- DisplayItemMessageInBerryPouch(taskId, sub_80BF8E4(), gStringVar4, Task_SellMultiple_CreateYesNoMenu);
+ DisplayItemMessageInBerryPouch(taskId, GetDialogBoxFontId(), gStringVar4, Task_SellMultiple_CreateYesNoMenu);
}
static void Task_SellMultiple_CreateYesNoMenu(u8 taskId)
diff --git a/src/credits.c b/src/credits.c
index a0138e57a..ceb2028f9 100644
--- a/src/credits.c
+++ b/src/credits.c
@@ -920,7 +920,7 @@ static s32 RollCredits(void)
case CREDITSSCRCMD_MON:
sCreditsMgr->mainseqno = CREDITSSCENE_MON_DESTROY_ASSETS;
sCreditsMgr->whichMon = sCreditsScript[sCreditsMgr->scrcmdidx].param;
- fade_screen(1, 0);
+ FadeScreen(1, 0);
break;
case CREDITSSCRCMD_THEENDGFX:
sCreditsMgr->mainseqno = CREDITSSCENE_THEEND_DESTROY_ASSETS;
@@ -1342,7 +1342,7 @@ static s32 RollCredits(void)
"\tstrb r0, [r2, 0x9]\n"
"\tmovs r0, 0x1\n"
"\tmovs r1, 0\n"
- "\tbl fade_screen\n"
+ "\tbl FadeScreen\n"
"\tb _080F3E94\n"
"\t.align 2, 0\n"
"_080F3E50: .4byte sCreditsMgr\n"
diff --git a/src/data.c b/src/data.c
index dddeeac51..891c9f94f 100644
--- a/src/data.c
+++ b/src/data.c
@@ -60,12 +60,12 @@ const struct SpriteFrameImage gTrainerBackPicTable_Leaf[] =
gTrainerBackPic_Leaf + 0x2000, 0x0800,
};
-const struct SpriteFrameImage gTrainerBackPicTable_PokeDude[] =
+const struct SpriteFrameImage gTrainerBackPicTable_Pokedude[] =
{
- gTrainerBackPic_PokeDude, 0x0800,
- gTrainerBackPic_PokeDude + 0x0800, 0x0800,
- gTrainerBackPic_PokeDude + 0x1000, 0x0800,
- gTrainerBackPic_PokeDude + 0x1800, 0x0800,
+ gTrainerBackPic_Pokedude, 0x0800,
+ gTrainerBackPic_Pokedude + 0x0800, 0x0800,
+ gTrainerBackPic_Pokedude + 0x1000, 0x0800,
+ gTrainerBackPic_Pokedude + 0x1800, 0x0800,
};
const struct SpriteFrameImage gTrainerBackPicTable_OldMan[] =
diff --git a/src/data/trainer_graphics/back_pic_anims.h b/src/data/trainer_graphics/back_pic_anims.h
index 2e107c21e..833a0cb28 100644
--- a/src/data/trainer_graphics/back_pic_anims.h
+++ b/src/data/trainer_graphics/back_pic_anims.h
@@ -16,7 +16,7 @@ static const union AnimCmd sAnimCmd_Leaf_1[] = {
ANIMCMD_END
};
-static const union AnimCmd sAnimCmd_PokeDude_1[] = {
+static const union AnimCmd sAnimCmd_Pokedude_1[] = {
ANIMCMD_FRAME(1, 24),
ANIMCMD_FRAME(2, 9),
ANIMCMD_FRAME(3, 24),
@@ -60,9 +60,9 @@ const union AnimCmd *const sBackAnims_Leaf[] = {
sAnimCmd_Leaf_1
};
-const union AnimCmd *const sBackAnims_PokeDude[] = {
+const union AnimCmd *const sBackAnims_Pokedude[] = {
sAnim_GeneralFrame0,
- sAnimCmd_PokeDude_1
+ sAnimCmd_Pokedude_1
};
const union AnimCmd *const sBackAnims_OldMan[] = {
@@ -85,6 +85,6 @@ const union AnimCmd *const *const gTrainerBackAnimsPtrTable[] = {
sBackAnims_Leaf,
sBackAnims_RSBrendan,
sBackAnims_RSMay,
- sBackAnims_PokeDude,
+ sBackAnims_Pokedude,
sBackAnims_OldMan
};
diff --git a/src/data/trainer_graphics/back_pic_tables.h b/src/data/trainer_graphics/back_pic_tables.h
index 86e7824c1..4d0c129a8 100644
--- a/src/data/trainer_graphics/back_pic_tables.h
+++ b/src/data/trainer_graphics/back_pic_tables.h
@@ -12,7 +12,7 @@ const struct CompressedSpriteSheet gTrainerBackPicTable[] = {
{ (const u32 *)gTrainerBackPic_Leaf, 0x2800, 1 },
{ (const u32 *)gTrainerBackPic_RSBrendan, 0x2000, 2 },
{ (const u32 *)gTrainerBackPic_RSMay, 0x2000, 3 },
- { (const u32 *)gTrainerBackPic_PokeDude, 0x2000, 4 },
+ { (const u32 *)gTrainerBackPic_Pokedude, 0x2000, 4 },
{ (const u32 *)gTrainerBackPic_OldMan, 0x2000, 5 }
};
@@ -21,6 +21,6 @@ const struct CompressedSpritePalette gTrainerBackPicPaletteTable[] = {
{ gTrainerPalette_LeafBackPic, 1 },
{ gTrainerPalette_RSBrendan1, 2 },
{ gTrainerPalette_RSMay1, 3 },
- { gTrainerPalette_PokeDudeBackPic, 4 },
+ { gTrainerPalette_PokedudeBackPic, 4 },
{ gTrainerPalette_OldManBackPic, 5 }
};
diff --git a/src/daycare.c b/src/daycare.c
index b3e76faba..a377e97f5 100644
--- a/src/daycare.c
+++ b/src/daycare.c
@@ -37,9 +37,11 @@
#include "naming_screen.h"
#include "help_system.h"
#include "field_fadetransition.h"
+#include "constants/daycare.h"
+#include "constants/pokemon.h"
+#include "constants/region_map.h"
-#define EGG_MOVES_ARRAY_COUNT 10
-#define EGG_LVL_UP_MOVES_ARRAY_COUNT 50
+// Combination of RSE's Day-Care (re-used on Four Island), FRLG's Day-Care, and egg_hatch.c
struct EggHatchData
{
@@ -119,7 +121,7 @@ static const struct ListMenuItem sLevelMenuItems[] =
{
{gExpandedPlaceholder_Empty, 0},
{gExpandedPlaceholder_Empty, 1},
- {gOtherText_Exit, 5}
+ {gOtherText_Exit, DAYCARE_LEVEL_MENU_EXIT}
};
static const struct ListMenuTemplate sDaycareListMenuLevelTemplate =
@@ -372,7 +374,7 @@ static const s16 sEggShardVelocities[][2] =
// code
-u8 *GetMonNick(struct Pokemon *mon, u8 *dest)
+static u8 *DayCare_GetMonNickname(struct Pokemon *mon, u8 *dest)
{
u8 nickname[POKEMON_NAME_LENGTH * 2];
@@ -380,7 +382,7 @@ u8 *GetMonNick(struct Pokemon *mon, u8 *dest)
return StringCopy10(dest, nickname);
}
-u8 *GetBoxMonNick(struct BoxPokemon *mon, u8 *dest)
+static u8 *DayCare_GetBoxMonNickname(struct BoxPokemon *mon, u8 *dest)
{
u8 nickname[POKEMON_NAME_LENGTH * 2];
@@ -450,7 +452,7 @@ static void StorePokemonInDaycare(struct Pokemon *mon, struct DaycareMon *daycar
u8 mailId;
StringCopy(daycareMon->mail.OT_name, gSaveBlock2Ptr->playerName);
- GetMonNick(mon, daycareMon->mail.monName);
+ DayCare_GetMonNickname(mon, daycareMon->mail.monName);
// StripExtCtrlCodes(daycareMon->mail.monName);
// daycareMon->mail.gameLanguage = LANGUAGE_ENGLISH;
// daycareMon->mail.monLanguage = GetMonData(mon, MON_DATA_LANGUAGE);
@@ -483,8 +485,8 @@ void StoreSelectedPokemonInDaycare(void)
static void ShiftDaycareSlots(struct DayCare *daycare)
{
// This condition is only satisfied when the player takes out the first pokemon from the daycare.
- if (GetBoxMonData(&daycare->mons[1].mon, MON_DATA_SPECIES) != 0
- && GetBoxMonData(&daycare->mons[0].mon, MON_DATA_SPECIES) == 0)
+ if (GetBoxMonData(&daycare->mons[1].mon, MON_DATA_SPECIES) != SPECIES_NONE
+ && GetBoxMonData(&daycare->mons[0].mon, MON_DATA_SPECIES) == SPECIES_NONE)
{
daycare->mons[0].mon = daycare->mons[1].mon;
ZeroBoxMonData(&daycare->mons[1].mon);
@@ -512,11 +514,8 @@ static void ApplyDaycareExperience(struct Pokemon *mon)
while ((learnedMove = MonTryLearningNewMove(mon, firstMove)) != 0)
{
firstMove = FALSE;
- if (learnedMove == 0xFFFF)
- {
- // Mon already knows 4 moves.
+ if (learnedMove == MON_HAS_MAX_MOVES)
DeleteFirstMoveAndGiveMoveToMon(mon, gMoveToLearn);
- }
}
}
else
@@ -535,7 +534,7 @@ static u16 TakeSelectedPokemonFromDaycare(struct DaycareMon *daycareMon)
u32 experience;
struct Pokemon pokemon;
- GetBoxMonNick(&daycareMon->mon, gStringVar1);
+ DayCare_GetBoxMonNickname(&daycareMon->mon, gStringVar1);
species = GetBoxMonData(&daycareMon->mon, MON_DATA_SPECIES);
BoxMonToMon(&daycareMon->mon, &pokemon);
@@ -595,7 +594,7 @@ static u8 GetNumLevelsGainedForDaycareMon(struct DaycareMon *daycareMon)
{
u8 numLevelsGained = GetNumLevelsGainedFromSteps(daycareMon);
ConvertIntToDecimalStringN(gStringVar2, numLevelsGained, STR_CONV_MODE_LEFT_ALIGN, 2);
- GetBoxMonNick(&daycareMon->mon, gStringVar1);
+ DayCare_GetBoxMonNickname(&daycareMon->mon, gStringVar1);
return numLevelsGained;
}
@@ -604,7 +603,7 @@ static u32 GetDaycareCostForSelectedMon(struct DaycareMon *daycareMon)
u32 cost;
u8 numLevelsGained = GetNumLevelsGainedFromSteps(daycareMon);
- GetBoxMonNick(&daycareMon->mon, gStringVar1);
+ DayCare_GetBoxMonNickname(&daycareMon->mon, gStringVar1);
cost = 100 + 100 * numLevelsGained;
ConvertIntToDecimalStringN(gStringVar2, cost, STR_CONV_MODE_LEFT_ALIGN, 5);
return cost;
@@ -639,7 +638,7 @@ static void ClearDaycareMonMail(struct DayCareMail *mail)
{
s32 i;
- for (i = 0; i < PLAYER_NAME_LENGTH; i++)
+ for (i = 0; i < PLAYER_NAME_LENGTH/* + 1*/; i++)
mail->OT_name[i] = 0;
for (i = 0; i < POKEMON_NAME_LENGTH + 1; i++)
mail->monName[i] = 0;
@@ -777,7 +776,7 @@ static void _TriggerPendingDaycareEgg(struct DayCare *daycare)
static void _TriggerPendingDaycareMaleEgg(struct DayCare *daycare)
{
- daycare->offspringPersonality = (Random()) | (0x8000);
+ daycare->offspringPersonality = (Random()) | (EGG_GENDER_MALE);
FlagSet(FLAG_PENDING_DAYCARE_EGG);
}
@@ -815,7 +814,7 @@ static void RemoveIVIndexFromList(u8 *ivs, u8 selectedIv)
static void InheritIVs(struct Pokemon *egg, struct DayCare *daycare)
{
u8 i;
- u8 selectedIvs[3];
+ u8 selectedIvs[INHERITED_IV_COUNT];
u8 availableIVs[NUM_STATS];
u8 whichParent[ARRAY_COUNT(selectedIvs)];
u8 iv;
@@ -829,17 +828,15 @@ static void InheritIVs(struct Pokemon *egg, struct DayCare *daycare)
// Select the 3 IVs that will be inherited.
for (i = 0; i < ARRAY_COUNT(selectedIvs); i++)
{
- // Randomly pick an IV from the available list.
+ // Randomly pick an IV from the available list and stop from being chosen again.
selectedIvs[i] = availableIVs[Random() % (NUM_STATS - i)];
-
- // Remove the selected IV index from the available IV indices.
RemoveIVIndexFromList(availableIVs, selectedIvs[i]);
}
// Determine which parent each of the selected IVs should inherit from.
for (i = 0; i < ARRAY_COUNT(selectedIvs); i++)
{
- whichParent[i] = Random() % 2;
+ whichParent[i] = Random() % DAYCARE_MON_COUNT;
}
// Set each of inherited IVs on the egg mon.
@@ -921,14 +918,14 @@ static void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, stru
numSharedParentMoves = 0;
for (i = 0; i < MAX_MON_MOVES; i++)
{
- sHatchedEggMotherMoves[i] = 0;
- sHatchedEggFatherMoves[i] = 0;
- sHatchedEggFinalMoves[i] = 0;
+ sHatchedEggMotherMoves[i] = MOVE_NONE;
+ sHatchedEggFatherMoves[i] = MOVE_NONE;
+ sHatchedEggFinalMoves[i] = MOVE_NONE;
}
for (i = 0; i < EGG_MOVES_ARRAY_COUNT; i++)
- sHatchedEggEggMoves[i] = 0;
+ sHatchedEggEggMoves[i] = MOVE_NONE;
for (i = 0; i < EGG_LVL_UP_MOVES_ARRAY_COUNT; i++)
- sHatchedEggLevelUpMoves[i] = 0;
+ sHatchedEggLevelUpMoves[i] = MOVE_NONE;
numLevelUpMoves = GetLevelUpMovesBySpecies(GetMonData(egg, MON_DATA_SPECIES), sHatchedEggLevelUpMoves);
for (i = 0; i < MAX_MON_MOVES; i++)
@@ -947,7 +944,7 @@ static void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, stru
{
if (sHatchedEggFatherMoves[i] == sHatchedEggEggMoves[j])
{
- if (GiveMoveToMon(egg, sHatchedEggFatherMoves[i]) == 0xFFFF)
+ if (GiveMoveToMon(egg, sHatchedEggFatherMoves[i]) == MON_HAS_MAX_MOVES)
DeleteFirstMoveAndGiveMoveToMon(egg, sHatchedEggFatherMoves[i]);
break;
}
@@ -966,7 +963,7 @@ static void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, stru
{
if (sHatchedEggFatherMoves[i] == ItemIdToBattleMoveId(ITEM_TM01/*_FOCUS_PUNCH*/ + j) && CanMonLearnTMHM(egg, j))
{
- if (GiveMoveToMon(egg, sHatchedEggFatherMoves[i]) == 0xFFFF)
+ if (GiveMoveToMon(egg, sHatchedEggFatherMoves[i]) == MON_HAS_MAX_MOVES)
DeleteFirstMoveAndGiveMoveToMon(egg, sHatchedEggFatherMoves[i]);
}
}
@@ -991,7 +988,7 @@ static void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, stru
{
if (sHatchedEggLevelUpMoves[j] != MOVE_NONE && sHatchedEggFinalMoves[i] == sHatchedEggLevelUpMoves[j])
{
- if (GiveMoveToMon(egg, sHatchedEggFinalMoves[i]) == 0xFFFF)
+ if (GiveMoveToMon(egg, sHatchedEggFinalMoves[i]) == MON_HAS_MAX_MOVES)
DeleteFirstMoveAndGiveMoveToMon(egg, sHatchedEggFinalMoves[i]);
break;
}
@@ -1036,7 +1033,7 @@ static void AlterEggSpeciesWithIncenseItem(u16 *species, struct DayCare *daycare
if (motherItem == ITEM_LIGHT_BALL || fatherItem == ITEM_LIGHT_BALL)
{
- if (GiveMoveToMon(mon, MOVE_VOLT_TACKLE) == 0xFFFF)
+ if (GiveMoveToMon(mon, MOVE_VOLT_TACKLE) == MON_HAS_MAX_MOVES)
DeleteFirstMoveAndGiveMoveToMon(mon, MOVE_VOLT_TACKLE);
}
}*/
@@ -1044,13 +1041,13 @@ static void AlterEggSpeciesWithIncenseItem(u16 *species, struct DayCare *daycare
static u16 DetermineEggSpeciesAndParentSlots(struct DayCare *daycare, u8 *parentSlots)
{
u16 i;
- u16 species[2];
+ u16 species[DAYCARE_MON_COUNT];
u16 eggSpecies;
// Determine which of the daycare mons is the mother and father of the egg.
// The 0th index of the parentSlots array is considered the mother slot, and the
// 1st index is the father slot.
- for (i = 0; i < 2; i++)
+ for (i = 0; i < DAYCARE_MON_COUNT; i++)
{
species[i] = GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SPECIES);
if (species[i] == SPECIES_DITTO)
@@ -1066,11 +1063,11 @@ static u16 DetermineEggSpeciesAndParentSlots(struct DayCare *daycare, u8 *parent
}
eggSpecies = GetEggSpecies(species[parentSlots[0]]);
- if (eggSpecies == SPECIES_NIDORAN_F && daycare->offspringPersonality & 0x8000)
+ if (eggSpecies == SPECIES_NIDORAN_F && daycare->offspringPersonality & EGG_GENDER_MALE)
{
eggSpecies = SPECIES_NIDORAN_M;
}
- if (eggSpecies == SPECIES_ILLUMISE && daycare->offspringPersonality & 0x8000)
+ if (eggSpecies == SPECIES_ILLUMISE && daycare->offspringPersonality & EGG_GENDER_MALE)
{
eggSpecies = SPECIES_VOLBEAT;
}
@@ -1078,19 +1075,19 @@ static u16 DetermineEggSpeciesAndParentSlots(struct DayCare *daycare, u8 *parent
// Make Ditto the "mother" slot if the other daycare mon is male.
if (species[parentSlots[1]] == SPECIES_DITTO && GetBoxMonGender(&daycare->mons[parentSlots[0]].mon) != MON_FEMALE)
{
- u8 temp = parentSlots[1];
+ u8 ditto = parentSlots[1];
parentSlots[1] = parentSlots[0];
- parentSlots[0] = temp;
+ parentSlots[0] = ditto;
}
return eggSpecies;
}
-static void _GiveEggFromDaycare(struct DayCare *daycare) // give_egg
+static void _GiveEggFromDaycare(struct DayCare *daycare)
{
struct Pokemon egg;
u16 species;
- u8 parentSlots[2]; // 0th index is "mother" daycare slot, 1st is "father"
+ u8 parentSlots[DAYCARE_MON_COUNT];
bool8 isEgg;
species = DetermineEggSpeciesAndParentSlots(daycare, parentSlots);
@@ -1118,7 +1115,7 @@ void CreateEgg(struct Pokemon *mon, u16 species, bool8 setHotSpringsLocation)
u8 metLocation;
u8 isEgg;
- CreateMon(mon, species, EGG_HATCH_LEVEL, 0x20, FALSE, 0, FALSE, 0);
+ CreateMon(mon, species, EGG_HATCH_LEVEL, 32, FALSE, 0, OT_ID_PLAYER_ID, 0);
metLevel = 0;
ball = ITEM_POKE_BALL;
language = LANGUAGE_JAPANESE;
@@ -1129,7 +1126,7 @@ void CreateEgg(struct Pokemon *mon, u16 species, bool8 setHotSpringsLocation)
SetMonData(mon, MON_DATA_LANGUAGE, &language);
if (setHotSpringsLocation)
{
- metLocation = 253; // hot springs; see PokemonSummaryScreen_PrintEggTrainerMemo
+ metLocation = METLOC_SPECIAL_EGG;
SetMonData(mon, MON_DATA_MET_LOCATION, &metLocation);
}
@@ -1145,7 +1142,7 @@ static void SetInitialEggData(struct Pokemon *mon, u16 species, struct DayCare *
u8 language;
personality = daycare->offspringPersonality | (Random() << 16);
- CreateMon(mon, species, EGG_HATCH_LEVEL, 0x20, TRUE, personality, FALSE, 0);
+ CreateMon(mon, species, EGG_HATCH_LEVEL, 32, TRUE, personality, OT_ID_PLAYER_ID, 0);
metLevel = 0;
ball = ITEM_POKE_BALL;
language = LANGUAGE_JAPANESE;
@@ -1161,7 +1158,7 @@ void GiveEggFromDaycare(void)
_GiveEggFromDaycare(&gSaveBlock1Ptr->daycare);
}
-static bool8 _DoEggActions_CheckHatch(struct DayCare *daycare)
+static bool8 TryProduceOrHatchEgg(struct DayCare *daycare)
{
u32 i, validEggs = 0;
@@ -1171,15 +1168,16 @@ static bool8 _DoEggActions_CheckHatch(struct DayCare *daycare)
daycare->mons[i].steps++, validEggs++;
}
- // try to trigger poke sex
- if (daycare->offspringPersonality == 0 && validEggs == 2 && (daycare->mons[1].steps & 0xFF) == 0xFF)
+ // Check if an egg should be produced
+ if (daycare->offspringPersonality == 0 && validEggs == DAYCARE_MON_COUNT && (daycare->mons[1].steps & 0xFF) == 0xFF)
{
- u8 loveScore = GetDaycareCompatibilityScore(daycare);
- if (loveScore > (Random() * 100u) / USHRT_MAX)
+ u8 compatability = GetDaycareCompatibilityScore(daycare);
+ if (compatability > (Random() * 100u) / USHRT_MAX)
TriggerPendingDaycareEgg();
}
- if (++daycare->stepCounter == 255) // hatch an egg
+ // Hatch Egg
+ if (++daycare->stepCounter == 255)
{
u32 steps;
@@ -1191,10 +1189,9 @@ static bool8 _DoEggActions_CheckHatch(struct DayCare *daycare)
continue;
steps = GetMonData(&gPlayerParty[i], MON_DATA_FRIENDSHIP);
- if (steps != 0) // subtract needed steps
+ if (steps != 0)
{
steps -= 1;
-
SetMonData(&gPlayerParty[i], MON_DATA_FRIENDSHIP, &steps);
}
else // hatch the egg
@@ -1212,7 +1209,7 @@ bool8 ShouldEggHatch(void)
{
if (GetBoxMonData(&gSaveBlock1Ptr->route5DayCareMon.mon, MON_DATA_SANITY_HAS_SPECIES))
gSaveBlock1Ptr->route5DayCareMon.steps++;
- return _DoEggActions_CheckHatch(&gSaveBlock1Ptr->daycare);
+ return TryProduceOrHatchEgg(&gSaveBlock1Ptr->daycare);
}
static bool8 IsEggPending(struct DayCare *daycare)
@@ -1226,22 +1223,22 @@ static bool8 IsEggPending(struct DayCare *daycare)
static void _GetDaycareMonNicknames(struct DayCare *daycare)
{
u8 text[12];
- if (GetBoxMonData(&daycare->mons[0].mon, MON_DATA_SPECIES) != 0)
+ if (GetBoxMonData(&daycare->mons[0].mon, MON_DATA_SPECIES) != SPECIES_NONE)
{
- GetBoxMonNick(&daycare->mons[0].mon, gStringVar1);
+ DayCare_GetBoxMonNickname(&daycare->mons[0].mon, gStringVar1);
GetBoxMonData(&daycare->mons[0].mon, MON_DATA_OT_NAME, text);
StringCopy(gStringVar3, text);
}
- if (GetBoxMonData(&daycare->mons[1].mon, MON_DATA_SPECIES) != 0)
+ if (GetBoxMonData(&daycare->mons[1].mon, MON_DATA_SPECIES) != SPECIES_NONE)
{
- GetBoxMonNick(&daycare->mons[1].mon, gStringVar2);
+ DayCare_GetBoxMonNickname(&daycare->mons[1].mon, gStringVar2);
}
}
-u16 GetSelectedMonNickAndSpecies(void)
+u16 GetSelectedMonNicknameAndSpecies(void)
{
- GetBoxMonNick(&gPlayerParty[GetCursorSelectionMonId()].box, gStringVar1);
+ DayCare_GetBoxMonNickname(&gPlayerParty[GetCursorSelectionMonId()].box, gStringVar1);
return GetBoxMonData(&gPlayerParty[GetCursorSelectionMonId()].box, MON_DATA_SPECIES);
}
@@ -1252,26 +1249,19 @@ void GetDaycareMonNicknames(void)
u8 GetDaycareState(void)
{
- // The daycare can be in 4 possible states:
- // 0: default state--no deposited mons, no egg
- // 1: there is an egg waiting for the player to pick it up
- // 2: there is a single pokemon in the daycare
- // 3: there are two pokemon in the daycare, no egg
-
u8 numMons;
if (IsEggPending(&gSaveBlock1Ptr->daycare))
{
- // There is an Egg waiting for the player.
- return 1;
+ return DAYCARE_EGG_WAITING;
}
numMons = CountPokemonInDaycare(&gSaveBlock1Ptr->daycare);
if (numMons != 0)
{
- return numMons + 1;
+ return numMons + 1; // DAYCARE_ONE_MON or DAYCARE_TWO_MONS
}
- return 0;
+ return DAYCARE_NO_MONS;
}
u8 GetDaycarePokemonCount(void)
@@ -1283,15 +1273,15 @@ u8 GetDaycarePokemonCount(void)
return 0;
}
+// Determine if the two given egg group lists contain any of the
+// same egg groups.
static bool8 EggGroupsOverlap(u16 *eggGroups1, u16 *eggGroups2)
{
- // Determine if the two given egg group lists contain any of the
- // same egg groups.
s32 i, j;
- for (i = 0; i < 2; i++)
+ for (i = 0; i < EGG_GROUPS_PER_MON; i++)
{
- for (j = 0; j < 2; j++)
+ for (j = 0; j < EGG_GROUPS_PER_MON; j++)
{
if (eggGroups1[i] == eggGroups2[j])
return TRUE;
@@ -1304,12 +1294,12 @@ static bool8 EggGroupsOverlap(u16 *eggGroups1, u16 *eggGroups2)
static u8 GetDaycareCompatibilityScore(struct DayCare *daycare)
{
u32 i;
- u16 eggGroups[2][2];
- u16 species[2];
- u32 trainerIds[2];
- u32 genders[2];
+ u16 eggGroups[DAYCARE_MON_COUNT][EGG_GROUPS_PER_MON];
+ u16 species[DAYCARE_MON_COUNT];
+ u32 trainerIds[DAYCARE_MON_COUNT];
+ u32 genders[DAYCARE_MON_COUNT];
- for (i = 0; i < 2; i++)
+ for (i = 0; i < DAYCARE_MON_COUNT; i++)
{
u32 personality;
@@ -1323,41 +1313,42 @@ static u8 GetDaycareCompatibilityScore(struct DayCare *daycare)
// check unbreedable egg group
if (eggGroups[0][0] == EGG_GROUP_UNDISCOVERED || eggGroups[1][0] == EGG_GROUP_UNDISCOVERED)
- return 0;
+ return PARENTS_INCOMPATIBLE;
// two Ditto can't breed
if (eggGroups[0][0] == EGG_GROUP_DITTO && eggGroups[1][0] == EGG_GROUP_DITTO)
- return 0;
+ return PARENTS_INCOMPATIBLE;
- // now that we checked, one ditto can breed with any other mon
+ // one parent is Ditto
if (eggGroups[0][0] == EGG_GROUP_DITTO || eggGroups[1][0] == EGG_GROUP_DITTO)
{
- if (trainerIds[0] == trainerIds[1]) // same trainer
- return 20;
+ if (trainerIds[0] == trainerIds[1])
+ return PARENTS_LOW_COMPATIBILITY;
- return 50; // different trainers, more chance of poke sex
+ return PARENTS_MED_COMPATABILITY;
}
+ // neither parent is Ditto
else
{
- if (genders[0] == genders[1]) // no homo
- return 0;
+ if (genders[0] == genders[1])
+ return PARENTS_INCOMPATIBLE;
if (genders[0] == MON_GENDERLESS || genders[1] == MON_GENDERLESS)
- return 0;
- if (!EggGroupsOverlap(eggGroups[0], eggGroups[1])) // not compatible with each other
- return 0;
+ return PARENTS_INCOMPATIBLE;
+ if (!EggGroupsOverlap(eggGroups[0], eggGroups[1]))
+ return PARENTS_INCOMPATIBLE;
- if (species[0] == species[1]) // same species
+ if (species[0] == species[1])
{
- if (trainerIds[0] == trainerIds[1]) // same species and trainer
- return 50;
+ if (trainerIds[0] == trainerIds[1])
+ return PARENTS_MED_COMPATABILITY; // same species, same trainer
- return 70; // different trainers, same species
+ return PARENTS_MAX_COMPATABILITY; // same species, different trainers
}
else
{
- if (trainerIds[0] != trainerIds[1]) // different trainers, different species
- return 50;
+ if (trainerIds[0] != trainerIds[1])
+ return PARENTS_MED_COMPATABILITY; // different species, different trainers
- return 20; // different species, same trainer
+ return PARENTS_LOW_COMPATIBILITY; // different species, same trainer
}
}
}
@@ -1374,13 +1365,13 @@ void SetDaycareCompatibilityString(void)
relationshipScore = GetDaycareCompatibilityScoreFromSave();
whichString = 0;
- if (relationshipScore == 0)
+ if (relationshipScore == PARENTS_INCOMPATIBLE)
whichString = 3;
- if (relationshipScore == 20)
+ if (relationshipScore == PARENTS_LOW_COMPATIBILITY)
whichString = 2;
- if (relationshipScore == 50)
+ if (relationshipScore == PARENTS_MED_COMPATABILITY)
whichString = 1;
- if (relationshipScore == 70)
+ if (relationshipScore == PARENTS_MAX_COMPATABILITY)
whichString = 0;
StringCopy(gStringVar4, sCompatibilityMessages[whichString]);
@@ -1389,20 +1380,20 @@ void SetDaycareCompatibilityString(void)
bool8 NameHasGenderSymbol(const u8 *name, u8 genderRatio)
{
u8 i;
- u8 symbolsCount[2]; // male, female
- symbolsCount[0] = symbolsCount[1] = 0;
+ u8 symbolsCount[GENDER_COUNT];
+ symbolsCount[MALE] = symbolsCount[FEMALE] = 0;
for (i = 0; name[i] != EOS; i++)
{
if (name[i] == CHAR_MALE)
- symbolsCount[0]++;
+ symbolsCount[MALE]++;
if (name[i] == CHAR_FEMALE)
- symbolsCount[1]++;
+ symbolsCount[FEMALE]++;
}
- if (genderRatio == MON_MALE && symbolsCount[0] != 0 && symbolsCount[1] == 0)
+ if (genderRatio == MON_MALE && symbolsCount[MALE] != 0 && symbolsCount[FEMALE] == 0)
return TRUE;
- if (genderRatio == MON_FEMALE && symbolsCount[1] != 0 && symbolsCount[0] == 0)
+ if (genderRatio == MON_FEMALE && symbolsCount[FEMALE] != 0 && symbolsCount[MALE] == 0)
return TRUE;
return FALSE;
@@ -1431,13 +1422,13 @@ static u8 *AppendMonGenderSymbol(u8 *name, struct BoxPokemon *boxMon)
static void GetDaycareLevelMenuText(struct DayCare *daycare, u8 *dest)
{
- u8 monNames[2][20];
+ u8 monNames[DAYCARE_MON_COUNT][20];
u8 i;
*dest = EOS;
- for (i = 0; i < 2; i++)
+ for (i = 0; i < DAYCARE_MON_COUNT; i++)
{
- GetBoxMonNick(&daycare->mons[i].mon, monNames[i]);
+ DayCare_GetBoxMonNickname(&daycare->mons[i].mon, monNames[i]);
AppendMonGenderSymbol(monNames[i], &daycare->mons[i].mon);
}
@@ -1455,7 +1446,7 @@ static void GetDaycareLevelMenuLevelText(struct DayCare *daycare, u8 *dest)
u8 text[20];
*dest = EOS;
- for (i = 0; i < 2; i++)
+ for (i = 0; i < DAYCARE_MON_COUNT; i++)
{
StringAppend(dest, gText_Lv);
level = GetLevelAfterDaycareSteps(&daycare->mons[i].mon, daycare->mons[i].steps);
@@ -1487,13 +1478,13 @@ static void DaycareAddTextPrinter(u8 windowId, const u8 *text, u32 x, u32 y)
AddTextPrinter(&printer, 0xFF, NULL);
}
-static void DaycarePrintMonNick(struct DayCare *daycare, u8 windowId, u32 daycareSlotId, u32 y)
+static void DaycarePrintMonNickname(struct DayCare *daycare, u8 windowId, u32 daycareSlotId, u32 y)
{
- u8 nick[POKEMON_NAME_LENGTH * 2];
+ u8 nickname[POKEMON_NAME_LENGTH * 2];
- GetBoxMonNick(&daycare->mons[daycareSlotId].mon, nick);
- AppendMonGenderSymbol(nick, &daycare->mons[daycareSlotId].mon);
- DaycareAddTextPrinter(windowId, nick, 8, y);
+ DayCare_GetBoxMonNickname(&daycare->mons[daycareSlotId].mon, nickname);
+ AppendMonGenderSymbol(nickname, &daycare->mons[daycareSlotId].mon);
+ DaycareAddTextPrinter(windowId, nickname, 8, y);
}
static void DaycarePrintMonLvl(struct DayCare *daycare, u8 windowId, u32 daycareSlotId, u32 y)
@@ -1519,7 +1510,7 @@ static void DaycarePrintMonInfo(u8 windowId, s32 daycareSlotId, u8 y)
{
if (daycareSlotId < (unsigned) DAYCARE_MON_COUNT)
{
- DaycarePrintMonNick(&gSaveBlock1Ptr->daycare, windowId, daycareSlotId, y);
+ DaycarePrintMonNickname(&gSaveBlock1Ptr->daycare, windowId, daycareSlotId, y);
DaycarePrintMonLvl(&gSaveBlock1Ptr->daycare, windowId, daycareSlotId, y);
}
}
@@ -1539,8 +1530,8 @@ static void Task_HandleDaycareLevelMenuInput(u8 taskId)
case 1:
gSpecialVar_Result = input;
break;
- case 5:
- gSpecialVar_Result = 2;
+ case DAYCARE_LEVEL_MENU_EXIT:
+ gSpecialVar_Result = DAYCARE_EXITED_LEVEL_MENU;
break;
}
DestroyListMenuTask(gTasks[taskId].tMenuListTaskId, NULL, NULL);
@@ -1551,7 +1542,7 @@ static void Task_HandleDaycareLevelMenuInput(u8 taskId)
}
else if (gMain.newKeys & B_BUTTON)
{
- gSpecialVar_Result = 2;
+ gSpecialVar_Result = DAYCARE_EXITED_LEVEL_MENU;
DestroyListMenuTask(gTasks[taskId].tMenuListTaskId, NULL, NULL);
ClearStdWindowAndFrame(gTasks[taskId].tWindowId, TRUE);
RemoveWindow(gTasks[taskId].tWindowId);
@@ -1697,7 +1688,7 @@ static void AddHatchedMonToParty(u8 id)
GetSetPokedexFlag(pokeNum, FLAG_SET_SEEN);
GetSetPokedexFlag(pokeNum, FLAG_SET_CAUGHT);
- GetMonNick(mon, gStringVar1);
+ DayCare_GetMonNickname(mon, gStringVar1);
ball = ITEM_POKE_BALL;
SetMonData(mon, MON_DATA_POKEBALL, &ball);
@@ -1722,7 +1713,7 @@ static bool8 sub_8046E34(struct DayCare *daycare, u8 daycareId)
u8 nick[0x20];
struct DaycareMon *daycareMon = &daycare->mons[daycareId];
- GetBoxMonNick(&daycareMon->mon, nick);
+ DayCare_GetBoxMonNickname(&daycareMon->mon, nick);
if (daycareMon->mail.message.itemId != 0
&& (StringCompare(nick, daycareMon->mail.monName) != 0
|| StringCompare(gSaveBlock2Ptr->playerName, daycareMon->mail.OT_name) != 0))
@@ -1963,7 +1954,7 @@ static void CB2_EggHatch_1(void)
}
break;
case 5:
- GetMonNick(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar1);
+ DayCare_GetMonNickname(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar1);
StringExpandPlaceholders(gStringVar4, gText_HatchedFromEgg);
EggHatchPrintMessage(sEggHatchData->windowId, gStringVar4, 0, 3, 0xFF);
PlayFanfare(MUS_FANFA5);
@@ -1980,7 +1971,7 @@ static void CB2_EggHatch_1(void)
sEggHatchData->CB2_state++;
break;
case 8:
- GetMonNick(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar1);
+ DayCare_GetMonNickname(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar1);
StringExpandPlaceholders(gStringVar4, gText_NickHatchPrompt);
EggHatchPrintMessage(sEggHatchData->windowId, gStringVar4, 0, 2, 1);
sEggHatchData->CB2_state++;
@@ -1997,7 +1988,7 @@ static void CB2_EggHatch_1(void)
switch (Menu_ProcessInputNoWrapClearOnChoose())
{
case 0:
- GetMonNick(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar3);
+ DayCare_GetMonNickname(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar3);
species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_SPECIES);
gender = GetMonGender(&gPlayerParty[sEggHatchData->eggPartyID]);
personality = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_PERSONALITY, 0);
diff --git a/src/event_object_lock.c b/src/event_object_lock.c
index ea4fa00b9..e91642aa2 100644
--- a/src/event_object_lock.c
+++ b/src/event_object_lock.c
@@ -9,7 +9,7 @@
bool8 walkrun_is_standing_still(void)
{
- if (gPlayerAvatar.running1 == 1)
+ if (gPlayerAvatar.tileTransitionState == 1)
return FALSE;
else
return TRUE;
diff --git a/src/field_fadetransition.c b/src/field_fadetransition.c
index dbc5f23b5..0af5f462c 100644
--- a/src/field_fadetransition.c
+++ b/src/field_fadetransition.c
@@ -56,12 +56,12 @@ void pal_fill_for_maplights(void)
{
case 0:
palette_bg_faded_fill_black();
- fade_screen(0, 0);
+ FadeScreen(0, 0);
palette_bg_faded_fill_black();
break;
case 1:
palette_bg_faded_fill_white();
- fade_screen(2, 0);
+ FadeScreen(2, 0);
palette_bg_faded_fill_white();
break;
}
@@ -73,12 +73,12 @@ static void sub_807DBAC(void)
{
case 0:
palette_bg_faded_fill_black();
- fade_screen(0, 3);
+ FadeScreen(0, 3);
palette_bg_faded_fill_black();
break;
case 1:
palette_bg_faded_fill_white();
- fade_screen(2, 3);
+ FadeScreen(2, 3);
palette_bg_faded_fill_white();
break;
}
@@ -87,7 +87,7 @@ static void sub_807DBAC(void)
void sub_807DC00(void)
{
palette_bg_faded_fill_black();
- fade_screen(0, 0);
+ FadeScreen(0, 0);
palette_bg_faded_fill_black();
}
@@ -95,16 +95,16 @@ void sub_807DC18(void)
{
const struct MapHeader *header = warp1_get_mapheader();
if (header->regionMapSectionId != gMapHeader.regionMapSectionId && sub_80F8110(header->regionMapSectionId, FALSE))
- fade_screen(1, 0);
+ FadeScreen(1, 0);
else
{
switch (sub_80C9D7C(GetCurrentMapType(), header->mapType))
{
case 0:
- fade_screen(1, 0);
+ FadeScreen(1, 0);
break;
case 1:
- fade_screen(3, 0);
+ FadeScreen(3, 0);
break;
}
}
@@ -115,10 +115,10 @@ static void sub_807DC70(void)
switch (sub_80C9D7C(GetCurrentMapType(), warp1_get_mapheader()->mapType))
{
case 0:
- fade_screen(1, 3);
+ FadeScreen(1, 3);
break;
case 1:
- fade_screen(3, 3);
+ FadeScreen(3, 3);
break;
}
}
@@ -654,7 +654,7 @@ static void sub_807E678(u8 taskId)
{
case 0:
ClearLinkCallback_2();
- fade_screen(1, 0);
+ FadeScreen(1, 0);
sub_8055F88();
PlaySE(SE_KAIDAN);
data[0]++;
diff --git a/src/field_specials.c b/src/field_specials.c
index 8d6014fba..57bf53830 100644
--- a/src/field_specials.c
+++ b/src/field_specials.c
@@ -1816,7 +1816,7 @@ static const struct {
{MAP_GROUP(ROCKET_HIDEOUT_B1F), MAP_NUM(ROCKET_HIDEOUT_B1F), MAP_GROUP(CELADON_CITY_GAME_CORNER), MAP_NUM(CELADON_CITY_GAME_CORNER)},
{MAP_GROUP(SAFARI_ZONE_CENTER), MAP_NUM(SAFARI_ZONE_CENTER), MAP_GROUP(FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE), MAP_NUM(FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE)},
{MAP_GROUP(FUCHSIA_CITY_GYM), MAP_NUM(FUCHSIA_CITY_GYM), MAP_GROUP(FUCHSIA_CITY), MAP_NUM(FUCHSIA_CITY)},
- {MAP_GROUP(FUCHSIA_CITY_BUILDING1), MAP_NUM(FUCHSIA_CITY_BUILDING1), MAP_GROUP(FUCHSIA_CITY), MAP_NUM(FUCHSIA_CITY)},
+ {MAP_GROUP(FUCHSIA_CITY_WARDENS_HOUSE), MAP_NUM(FUCHSIA_CITY_WARDENS_HOUSE), MAP_GROUP(FUCHSIA_CITY), MAP_NUM(FUCHSIA_CITY)},
{MAP_GROUP(SAFFRON_CITY_DOJO), MAP_NUM(SAFFRON_CITY_DOJO), MAP_GROUP(SAFFRON_CITY), MAP_NUM(SAFFRON_CITY)},
{MAP_GROUP(SAFFRON_CITY_GYM), MAP_NUM(SAFFRON_CITY_GYM), MAP_GROUP(SAFFRON_CITY), MAP_NUM(SAFFRON_CITY)},
{MAP_GROUP(SILPH_CO_1F), MAP_NUM(SILPH_CO_1F), MAP_GROUP(SAFFRON_CITY), MAP_NUM(SAFFRON_CITY)},
diff --git a/src/item_menu.c b/src/item_menu.c
new file mode 100644
index 000000000..ffba2eae9
--- /dev/null
+++ b/src/item_menu.c
@@ -0,0 +1,2400 @@
+#include "global.h"
+#include "gflib.h"
+#include "bag.h"
+#include "battle_controllers.h"
+#include "berry_pouch.h"
+#include "decompress.h"
+#include "event_scripts.h"
+#include "event_object_80688E4.h"
+#include "field_player_avatar.h"
+#include "graphics.h"
+#include "help_system.h"
+#include "item.h"
+#include "item_menu.h"
+#include "item_menu_icons.h"
+#include "item_use.h"
+#include "link.h"
+#include "list_menu.h"
+#include "load_save.h"
+#include "mail_data.h"
+#include "map_name_popup.h"
+#include "menu.h"
+#include "menu_indicators.h"
+#include "money.h"
+#include "new_menu_helpers.h"
+#include "overworld.h"
+#include "party_menu.h"
+#include "pokemon_storage_system.h"
+#include "scanline_effect.h"
+#include "script.h"
+#include "shop.h"
+#include "strings.h"
+#include "teachy_tv.h"
+#include "tm_case.h"
+#include "constants/items.h"
+#include "constants/songs.h"
+
+#define FREE_IF_SET(ptr) ({ if (ptr) Free(ptr); })
+
+struct BagMenuAlloc
+{
+ MainCallback exitCB;
+ u8 itemOriginalLocation;
+ u8 pocketSwitchMode:4;
+ u8 itemMenuIcon:2;
+ u8 inhibitItemDescriptionPrint:2;
+ u16 contextMenuSelectedItem;
+ u8 pocketScrollArrowsTask;
+ u8 pocketSwitchArrowsTask;
+ u8 nItems[3];
+ u8 maxShowed[3];
+ u8 data[4];
+};
+
+struct BagSlots
+{
+ struct ItemSlot bagPocket_Items[BAG_ITEMS_COUNT];
+ struct ItemSlot bagPocket_KeyItems[BAG_KEYITEMS_COUNT];
+ struct ItemSlot bagPocket_PokeBalls[BAG_POKEBALLS_COUNT];
+ u16 itemsAbove[3];
+ u16 cursorPos[3];
+ u16 registeredItem;
+ u16 pocket;
+};
+
+EWRAM_DATA struct BagStruct gBagMenuState = {};
+static EWRAM_DATA struct BagMenuAlloc * sBagMenuDisplay = NULL;
+static EWRAM_DATA void * sBagBgTilemapBuffer = NULL;
+static EWRAM_DATA struct ListMenuItem * sListMenuItems = NULL;
+static EWRAM_DATA u8 (*sListMenuItemStrings)[19] = NULL;
+static EWRAM_DATA u8 sContextMenuItemsBuffer[4] = {};
+static EWRAM_DATA const u8 *sContextMenuItemsPtr = NULL;
+static EWRAM_DATA u8 sContextMenuNumItems = 0;
+static EWRAM_DATA struct BagSlots * sBackupPlayerBag = NULL;
+EWRAM_DATA u16 gSpecialVar_ItemId = ITEM_NONE;
+
+static void CB2_OpenBagMenu(void);
+static bool8 LoadBagMenuGraphics(void);
+static void FadeOutOfBagMenu(void);
+static void Task_WaitFadeOutOfBagMenu(u8 taskId);
+static void NullBagMenuBufferPtrs(void);
+static bool8 BagMenuInitBgsAndAllocTilemapBuffer(void);
+static bool8 DoLoadBagGraphics(void);
+static u8 CreateBagInputHandlerTask(u8 location);
+static bool8 TryAllocListMenuBuffers(void);
+static void Bag_BuildListMenuTemplate(u8 pocket);
+static void BagListMenuGetItemNameColored(u8 *dest, u16 itemId);
+static void BagListMenuMoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list);
+static void BagListMenuItemPrintFunc(u8 windowId, s32 itemId, u8 y);
+static void bag_menu_print_cursor(u8 y, u8 colorIdx);
+static void PrintBagPocketName(void);
+static void PrintItemDescriptionOnMessageWindow(s32 itemIndex);
+static void CreatePocketScrollArrowPair(void);
+static void CreatePocketSwitchArrowPair(void);
+static void BagDestroyPocketSwitchArrowPair(void);
+static void CalculateInitialCursorPosAndItemsAbove(void);
+static void UpdatePocketScrollPositions(void);
+static void DestroyBagMenuResources(void);
+static void Task_ItemMenu_WaitFadeAndSwitchToExitCallback(u8 taskId);
+static void Task_AnimateWin0v(u8 taskId);
+static void ShowBagOrBeginWin0OpenTask(void);
+static void All_CalculateNItemsAndMaxShowed(void);
+static void Task_BagMenu_HandleInput(u8 taskId);
+static void Task_ItemContextMenuByLocation(u8 taskId);
+static void Bag_FillMessageBoxWithPalette(u32 a0);
+static u8 ProcessPocketSwitchInput(u8 taskId, u8 pocketId);
+static void SwitchPockets(u8 taskId, s16 direction, bool16 a2);
+static void Task_AnimateSwitchPockets(u8 taskId);
+static void BeginMovingItemInPocket(u8 taskId, s16 itemIndex);
+static void Task_MoveItemInPocket_HandleInput(u8 taskId);
+static void ExecuteMoveItemInPocket(u8 taskId, u32 itemIndex);
+static void AbortMovingItemInPocket(u8 taskId, u32 itemIndex);
+static void CopyBagListBgTileRowToTilemapBuffer(u8 a0);
+static void Task_ItemContext_FieldOrBattle(u8 taskId);
+static void Task_FieldItemContextMenuHandleInput(u8 taskId);
+static void Task_ItemMenuAction_Use(u8 taskId);
+static void Task_ItemMenuAction_Toss(u8 taskId);
+static void Task_ConfirmTossItems(u8 taskId);
+static void Task_TossItem_No(u8 taskId);
+static void Task_SelectQuantityToToss(u8 taskId);
+static void Task_TossItem_Yes(u8 taskId);
+static void Task_WaitAB_RedrawAndReturnToBag(u8 taskId);
+static void Task_ItemMenuAction_ToggleSelect(u8 taskId);
+static void Task_ItemMenuAction_Give(u8 taskId);
+static void Task_PrintThereIsNoPokemon(u8 taskId);
+static void Task_ItemMenuAction_Cancel(u8 taskId);
+static void Task_PrintItemCantBeHeld(u8 taskId);
+static void Task_WaitAButtonAndCloseContextMenu(u8 taskId);
+static void Task_ItemMenuAction_BattleUse(u8 taskId);
+static void Task_ItemContext_FieldGive(u8 taskId);
+static void GoToTMCase_Give(void);
+static void GoToBerryPouch_Give(void);
+static void ReturnToBagMenuFromSubmenu_Give(void);
+static void Task_ItemContext_PcBoxGive(u8 taskId);
+static void GoToTMCase_PCBox(void);
+static void GoToBerryPouch_PCBox(void);
+static void ReturnToBagMenuFromSubmenu_PCBox(void);
+static void Task_ItemContext_Sell(u8 taskId);
+static void GoToTMCase_Sell(void);
+static void GoToBerryPouch_Sell(void);
+static void ReturnToBagMenuFromSubmenu_Sell(void);
+static void Task_PrintSaleConfirmationText(u8 taskId);
+static void Task_ShowSellYesNoMenu(u8 taskId);
+static void Task_SellItem_No(u8 taskId);
+static void Task_InitSaleQuantitySelectInterface(u8 taskId);
+static void UpdateSalePriceDisplay(s32 price);
+static void Task_SelectQuantityToSell(u8 taskId);
+static void Task_SellItem_Yes(u8 taskId);
+static void Task_FinalizeSaleToShop(u8 taskId);
+static void Task_WaitPressAB_AfterSell(u8 taskId);
+static void Task_ItemContext_Deposit(u8 taskId);
+static void Task_SelectQuantityToDeposit(u8 taskId);
+static void Task_TryDoItemDeposit(u8 taskId);
+static bool8 BagIsTutorial(void);
+static void Task_Bag_OldManTutorial(u8 taskId);
+static void Task_Pokedude_FadeFromBag(u8 taskId);
+static void Task_Pokedude_WaitFadeAndExitBag(u8 taskId);
+static void Task_Bag_TeachyTvRegister(u8 taskId);
+static void Task_Bag_TeachyTvCatching(u8 taskId);
+static void Task_Bag_TeachyTvStatus(u8 taskId);
+static void Task_Bag_TeachyTvTMs(u8 taskId);
+
+static const struct BgTemplate sBgTemplates[2] = {
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0x000
+ }, {
+ .bg = 1,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0x000
+ }
+};
+
+static const u8 *const sPocketNames[] = {
+ gText_Items2,
+ gText_KeyItems2,
+ gText_PokeBalls2
+};
+
+static const u16 sBagListBgTiles[][18] = {
+ INCBIN_U16("graphics/item_menu/bagmap_0.bin"),
+ INCBIN_U16("graphics/item_menu/bagmap_1.bin"),
+ INCBIN_U16("graphics/item_menu/bagmap_2.bin"),
+ INCBIN_U16("graphics/item_menu/bagmap_3.bin"),
+ INCBIN_U16("graphics/item_menu/bagmap_4.bin"),
+ INCBIN_U16("graphics/item_menu/bagmap_5.bin"),
+ INCBIN_U16("graphics/item_menu/bagmap_6.bin"),
+ INCBIN_U16("graphics/item_menu/bagmap_7.bin"),
+ INCBIN_U16("graphics/item_menu/bagmap_8.bin"),
+ INCBIN_U16("graphics/item_menu/bagmap_9.bin"),
+ INCBIN_U16("graphics/item_menu/bagmap_A.bin"),
+ INCBIN_U16("graphics/item_menu/bagmap_B.bin")
+};
+
+static const struct MenuAction sItemMenuContextActions[] = {
+ [ITEMMENUACTION_USE] = {gOtherText_Use, {.void_u8 = Task_ItemMenuAction_Use}},
+ [ITEMMENUACTION_TOSS] = {gOtherText_Toss, {.void_u8 = Task_ItemMenuAction_Toss}},
+ [ITEMMENUACTION_REGISTER] = {gOtherText_Register, {.void_u8 = Task_ItemMenuAction_ToggleSelect}},
+ [ITEMMENUACTION_GIVE] = {gOtherText_Give, {.void_u8 = Task_ItemMenuAction_Give}},
+ [ITEMMENUACTION_CANCEL] = {gFameCheckerText_Cancel, {.void_u8 = Task_ItemMenuAction_Cancel}},
+ [ITEMMENUACTION_BATTLE_USE] = {gOtherText_Use, {.void_u8 = Task_ItemMenuAction_BattleUse}},
+ [ITEMMENUACTION_CHECK] = {gOtherText_Check, {.void_u8 = Task_ItemMenuAction_Use}},
+ [ITEMMENUACTION_OPEN] = {gOtherText_Open, {.void_u8 = Task_ItemMenuAction_Use}},
+ [ITEMMENUACTION_OPEN_BERRIES] = {gOtherText_Open, {.void_u8 = Task_ItemMenuAction_BattleUse}},
+ [ITEMMENUACTION_WALK] = {gOtherText_Walk, {.void_u8 = Task_ItemMenuAction_Use}},
+ [ITEMMENUACTION_DESELECT] = {gOtherText_Deselect, {.void_u8 = Task_ItemMenuAction_ToggleSelect}},
+ [ITEMMENUACTION_DUMMY] = {gString_Dummy, {.void_u8 = NULL}}
+};
+
+static const u8 sContextMenuItems_Field[][4] = {
+ {
+ ITEMMENUACTION_USE,
+ ITEMMENUACTION_GIVE,
+ ITEMMENUACTION_TOSS,
+ ITEMMENUACTION_CANCEL
+ }, {
+ ITEMMENUACTION_USE,
+ ITEMMENUACTION_REGISTER,
+ ITEMMENUACTION_CANCEL,
+ ITEMMENUACTION_DUMMY
+ }, {
+ ITEMMENUACTION_GIVE,
+ ITEMMENUACTION_TOSS,
+ ITEMMENUACTION_CANCEL,
+ ITEMMENUACTION_DUMMY
+ }
+};
+
+static const u8 sContextMenuItems_CheckGiveTossCancel[] = {
+ ITEMMENUACTION_CHECK,
+ ITEMMENUACTION_GIVE,
+ ITEMMENUACTION_TOSS,
+ ITEMMENUACTION_CANCEL
+};
+
+static const u8 sContextMenuItems_GiveIfNotKeyItemPocket[][2] = {
+ {
+ ITEMMENUACTION_GIVE,
+ ITEMMENUACTION_CANCEL
+ }, {
+ ITEMMENUACTION_CANCEL,
+ ITEMMENUACTION_DUMMY
+ }, {
+ ITEMMENUACTION_GIVE,
+ ITEMMENUACTION_CANCEL
+ }
+};
+
+static const u8 sContextMenuItems_Open[] = {
+ ITEMMENUACTION_OPEN,
+ ITEMMENUACTION_CANCEL
+};
+
+static const u8 sContextMenuItems_BattleUse[] = {
+ ITEMMENUACTION_BATTLE_USE,
+ ITEMMENUACTION_CANCEL
+};
+
+static const u8 sContextMenuItems_Cancel[] = {
+ ITEMMENUACTION_CANCEL,
+ ITEMMENUACTION_DUMMY
+};
+
+static const TaskFunc sItemContextTaskFuncs[] = {
+ [ITEMMENULOCATION_FIELD] = Task_ItemContext_FieldOrBattle,
+ [ITEMMENULOCATION_PARTY] = Task_ItemContext_FieldGive,
+ [ITEMMENULOCATION_SHOP] = Task_ItemContext_Sell,
+ [ITEMMENULOCATION_ITEMPC] = Task_ItemContext_Deposit,
+ [ITEMMENULOCATION_PCBOX] = Task_ItemContext_PcBoxGive,
+ [ITEMMENULOCATION_BATTLE] = Task_ItemContext_FieldOrBattle,
+ [ITEMMENULOCATION_OLD_MAN] = NULL
+};
+
+static const struct YesNoFuncTable sYesNoMenu_Toss = {
+ Task_TossItem_Yes,
+ Task_TossItem_No
+};
+
+static const struct YesNoFuncTable sYesNoMenu_Sell = {
+ Task_SellItem_Yes,
+ Task_SellItem_No
+};
+
+static const u8 sListItemTextColor_RegularItem[] = _("{COLOR_HIGHLIGHT_SHADOW RED TRANSPARENT GREEN}");
+
+static const u8 sListItemTextColor_TmCase_BerryPouch[] = _("{COLOR_HIGHLIGHT_SHADOW LIGHT_GRAY TRANSPARENT BLACK}");
+
+static const struct ScrollArrowsTemplate sPocketSwitchArrowPairTemplate = {
+ .firstArrowType = SCROLL_ARROW_LEFT,
+ .firstX = 8,
+ .firstY = 72,
+ .secondArrowType = SCROLL_ARROW_RIGHT,
+ .secondX = 72,
+ .secondY = 72,
+ .fullyUpThreshold = 0,
+ .fullyDownThreshold = 2,
+ .tileTag = 111,
+ .palTag = 111,
+ .palNum = 0,
+};
+
+static const u8 sBlit_SelectButton[] = INCBIN_U8("graphics/interface/select_button.4bpp");
+
+void GoToBagMenu(u8 location, u8 pocket, MainCallback bagCallback)
+{
+ u8 i;
+
+ NullBagMenuBufferPtrs();
+ sBagMenuDisplay = Alloc(sizeof(struct BagMenuAlloc));
+ if (sBagMenuDisplay == NULL)
+ SetMainCallback2(bagCallback);
+ else
+ {
+ if (location != ITEMMENULOCATION_LAST)
+ gBagMenuState.location = location;
+ if (bagCallback != NULL)
+ gBagMenuState.bagCallback = bagCallback;
+ sBagMenuDisplay->exitCB = NULL;
+ sBagMenuDisplay->itemOriginalLocation = 0xFF;
+ sBagMenuDisplay->itemMenuIcon = 0;
+ sBagMenuDisplay->inhibitItemDescriptionPrint = FALSE;
+ sBagMenuDisplay->pocketScrollArrowsTask = 0xFF;
+ sBagMenuDisplay->pocketSwitchArrowsTask = 0xFF;
+ if (location == ITEMMENULOCATION_ITEMPC)
+ sBagMenuDisplay->pocketSwitchMode = 1;
+ else if (location == ITEMMENULOCATION_OLD_MAN)
+ sBagMenuDisplay->pocketSwitchMode = 2;
+ else
+ sBagMenuDisplay->pocketSwitchMode = 0;
+ for (i = 0; i < 4; i++)
+ {
+ sBagMenuDisplay->data[i] = 0;
+ }
+ if (pocket == OPEN_BAG_ITEMS || pocket == OPEN_BAG_KEYITEMS || pocket == OPEN_BAG_POKEBALLS)
+ gBagMenuState.pocket = pocket;
+ gTextFlags.autoScroll = FALSE;
+ gSpecialVar_ItemId = ITEM_NONE;
+ SetMainCallback2(CB2_OpenBagMenu);
+ }
+}
+
+void CB2_BagMenuFromStartMenu(void)
+{
+ GoToBagMenu(ITEMMENULOCATION_FIELD, OPEN_BAG_LAST, CB2_ReturnToFieldWithOpenMenu);
+}
+
+void CB2_BagMenuFromBattle(void)
+{
+ GoToBagMenu(ITEMMENULOCATION_BATTLE, OPEN_BAG_LAST, SetCB2ToReshowScreenAfterMenu2);
+}
+
+static void CB2_BagMenuRun(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ DoScheduledBgTilemapCopiesToVram();
+ UpdatePaletteFade();
+}
+
+static void VBlankCB_BagMenuRun(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static void CB2_OpenBagMenu(void)
+{
+ while (1)
+ {
+ if ((u8)sub_80BF72C() == TRUE)
+ break;
+ if (LoadBagMenuGraphics() == TRUE)
+ break;
+ if (MenuHelpers_LinkSomething() == TRUE)
+ break;
+ }
+}
+
+static bool8 LoadBagMenuGraphics(void)
+{
+ u8 taskId;
+
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankHBlankCallbacksToNull();
+ ClearScheduledBgCopiesToVram();
+ gMain.state++;
+ break;
+ case 1:
+ ScanlineEffect_Stop();
+ gMain.state++;
+ break;
+ case 2:
+ FreeAllSpritePalettes();
+ gMain.state++;
+ break;
+ case 3:
+ ResetPaletteFade();
+ gPaletteFade.bufferTransferDisabled = TRUE;
+ gMain.state++;
+ break;
+ case 4:
+ ResetSpriteData();
+ gMain.state++;
+ break;
+ case 5:
+ ResetItemMenuIconState();
+ gMain.state++;
+ break;
+ case 6:
+ if (!MenuHelpers_LinkSomething())
+ {
+ ResetTasks();
+ }
+ gMain.state++;
+ break;
+ case 7:
+ if (BagMenuInitBgsAndAllocTilemapBuffer())
+ {
+ sBagMenuDisplay->data[0] = 0;
+ gMain.state++;
+ }
+ else
+ {
+ FadeOutOfBagMenu();
+ return TRUE;
+ }
+ break;
+ case 8:
+ if (DoLoadBagGraphics() == TRUE)
+ gMain.state++;
+ break;
+ case 9:
+ InitBagWindows();
+ gMain.state++;
+ break;
+ case 10:
+ All_CalculateNItemsAndMaxShowed();
+ CalculateInitialCursorPosAndItemsAbove();
+ UpdatePocketScrollPositions();
+ gMain.state++;
+ break;
+ case 11:
+ if (!TryAllocListMenuBuffers())
+ {
+ FadeOutOfBagMenu();
+ return TRUE;
+ }
+ gMain.state++;
+ break;
+ case 12:
+ Bag_BuildListMenuTemplate(gBagMenuState.pocket);
+ gMain.state++;
+ break;
+ case 13:
+ if (gBagMenuState.location != ITEMMENULOCATION_ITEMPC)
+ PrintBagPocketName();
+ else
+ BagDrawDepositItemTextBox();
+ gMain.state++;
+ break;
+ case 14:
+ taskId = CreateBagInputHandlerTask(gBagMenuState.location);
+ gTasks[taskId].data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]);
+ gTasks[taskId].data[3] = 0;
+ gTasks[taskId].data[8] = 0;
+ gMain.state++;
+ break;
+ case 15:
+ CreateBagOrSatchelSprite(gBagMenuState.pocket);
+ gMain.state++;
+ break;
+ case 16:
+ CreatePocketScrollArrowPair();
+ CreatePocketSwitchArrowPair();
+ gMain.state++;
+ break;
+ case 17:
+ ItemMenuIcons_CreateInsertIndicatorBarHidden();
+ gMain.state++;
+ break;
+ case 18:
+ ShowBagOrBeginWin0OpenTask();
+ gMain.state++;
+ break;
+ case 19:
+ if (gBagMenuState.location == ITEMMENULOCATION_ITEMPC)
+ HelpSystem_SetSomeVariable2(29);
+ else
+ HelpSystem_SetSomeVariable2(9);
+ gPaletteFade.bufferTransferDisabled = FALSE;
+ gMain.state++;
+ break;
+ default:
+ SetVBlankCallback(VBlankCB_BagMenuRun);
+ SetMainCallback2(CB2_BagMenuRun);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void FadeOutOfBagMenu(void)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, -2, 0, 16, RGB_BLACK);
+ CreateTask(Task_WaitFadeOutOfBagMenu, 0);
+ SetVBlankCallback(VBlankCB_BagMenuRun);
+ SetMainCallback2(CB2_BagMenuRun);
+}
+
+static void Task_WaitFadeOutOfBagMenu(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(gBagMenuState.bagCallback);
+ DestroyBagMenuResources();
+ DestroyTask(taskId);
+ }
+}
+
+static void NullBagMenuBufferPtrs(void)
+{
+ sBagMenuDisplay = NULL;
+ sBagBgTilemapBuffer = NULL;
+ sListMenuItems = NULL;
+ sListMenuItemStrings = NULL;
+}
+
+static bool8 BagMenuInitBgsAndAllocTilemapBuffer(void)
+{
+ void **buff;
+ ResetAllBgsCoordinatesAndBgCntRegs();
+ buff = &sBagBgTilemapBuffer;
+ *buff = Alloc(0x800);
+ if (*buff == NULL)
+ return FALSE;
+ memset(*buff, 0, 0x800);
+ ResetBgsAndClearDma3BusyFlags(FALSE);
+ InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates));
+ SetBgTilemapBuffer(1, *buff);
+ ScheduleBgCopyTilemapToVram(1);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON);
+ ShowBg(0);
+ ShowBg(1);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ return TRUE;
+}
+
+static bool8 DoLoadBagGraphics(void)
+{
+ switch (sBagMenuDisplay->data[0])
+ {
+ case 0:
+ ResetTempTileDataBuffers();
+ DecompressAndCopyTileDataToVram(1, gUnknown_8E830CC, 0, 0, 0);
+ sBagMenuDisplay->data[0]++;
+ break;
+ case 1:
+ if (FreeTempTileDataBuffersIfPossible() != TRUE)
+ {
+ if (gBagMenuState.location != ITEMMENULOCATION_ITEMPC)
+ LZDecompressWram(gUnknown_8E832C0, sBagBgTilemapBuffer);
+ else
+ LZDecompressWram(gUnknown_8E83444, sBagBgTilemapBuffer);
+ sBagMenuDisplay->data[0]++;
+ }
+ break;
+ case 2:
+ LoadCompressedPalette(gBagBgPalette, 0x00, 0x60);
+ if (!BagIsTutorial() && gSaveBlock2Ptr->playerGender != MALE)
+ LoadCompressedPalette(gBagBgPalette_FemaleOverride, 0x00, 0x20);
+ sBagMenuDisplay->data[0]++;
+ break;
+ case 3:
+ if (BagIsTutorial() == TRUE || gSaveBlock2Ptr->playerGender == MALE)
+ LoadCompressedSpriteSheet(&gSpriteSheet_Backpack);
+ else
+ LoadCompressedSpriteSheet(&gSpriteSheet_Satchel);
+ sBagMenuDisplay->data[0]++;
+ break;
+ case 4:
+ LoadCompressedSpritePalette(&gSpritePalette_BagOrSatchel);
+ sBagMenuDisplay->data[0]++;
+ break;
+ case 5:
+ LoadCompressedSpriteSheet(&gBagSwapSpriteSheet);
+ sBagMenuDisplay->data[0]++;
+ break;
+ default:
+ LoadCompressedSpritePalette(&gBagSwapSpritePalette);
+ sBagMenuDisplay->data[0] = 0;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static u8 CreateBagInputHandlerTask(u8 location)
+{
+ switch (location)
+ {
+ case ITEMMENULOCATION_OLD_MAN:
+ return CreateTask(Task_Bag_OldManTutorial, 0);
+ case ITEMMENULOCATION_TTVSCR_REGISTER:
+ return CreateTask(Task_Bag_TeachyTvRegister, 0);
+ case ITEMMENULOCATION_TTVSCR_TMS:
+ return CreateTask(Task_Bag_TeachyTvTMs, 0);
+ case ITEMMENULOCATION_TTVSCR_STATUS:
+ return CreateTask(Task_Bag_TeachyTvStatus, 0);
+ case ITEMMENULOCATION_TTVSCR_CATCHING:
+ return CreateTask(Task_Bag_TeachyTvCatching, 0);
+ default:
+ return CreateTask(Task_BagMenu_HandleInput, 0);
+ }
+}
+
+static bool8 TryAllocListMenuBuffers(void)
+{
+ // The items pocket has the highest capacity, + 1 for CANCEL
+ sListMenuItems = Alloc((BAG_ITEMS_COUNT + 1) * sizeof(struct ListMenuItem));
+ if (sListMenuItems == NULL)
+ return FALSE;
+ sListMenuItemStrings = Alloc((BAG_ITEMS_COUNT + 1) * sizeof(*sListMenuItemStrings));
+ if (sListMenuItemStrings == NULL)
+ return FALSE;
+ return TRUE;
+}
+
+static void Bag_BuildListMenuTemplate(u8 pocket)
+{
+ u16 i;
+ struct BagPocket * bagPocket = &gBagPockets[pocket];
+ for (i = 0; i < sBagMenuDisplay->nItems[pocket]; i++)
+ {
+ BagListMenuGetItemNameColored(sListMenuItemStrings[i], bagPocket->itemSlots[i].itemId);
+ sListMenuItems[i].label = sListMenuItemStrings[i];
+ sListMenuItems[i].index = i;
+ }
+ StringCopy(sListMenuItemStrings[i], sListItemTextColor_RegularItem);
+ StringAppend(sListMenuItemStrings[i], gFameCheckerText_Cancel);
+ sListMenuItems[i].label = sListMenuItemStrings[i];
+ sListMenuItems[i].index = i;
+ gMultiuseListMenuTemplate.items = sListMenuItems;
+ gMultiuseListMenuTemplate.totalItems = sBagMenuDisplay->nItems[pocket] + 1;
+ gMultiuseListMenuTemplate.windowId = 0;
+ gMultiuseListMenuTemplate.header_X = 0;
+ gMultiuseListMenuTemplate.item_X = 9;
+ gMultiuseListMenuTemplate.cursor_X = 1;
+ gMultiuseListMenuTemplate.lettersSpacing = 0;
+ gMultiuseListMenuTemplate.itemVerticalPadding = 2;
+ gMultiuseListMenuTemplate.upText_Y = 2;
+ gMultiuseListMenuTemplate.maxShowed = sBagMenuDisplay->maxShowed[pocket];
+ gMultiuseListMenuTemplate.fontId = 2;
+ gMultiuseListMenuTemplate.cursorPal = 2;
+ gMultiuseListMenuTemplate.fillValue = 0;
+ gMultiuseListMenuTemplate.cursorShadowPal = 3;
+ gMultiuseListMenuTemplate.moveCursorFunc = BagListMenuMoveCursorFunc;
+ gMultiuseListMenuTemplate.itemPrintFunc = BagListMenuItemPrintFunc;
+ gMultiuseListMenuTemplate.cursorKind = 0;
+ gMultiuseListMenuTemplate.scrollMultiple = 0;
+}
+
+static void BagListMenuGetItemNameColored(u8 *dest, u16 itemId)
+{
+ if (itemId == ITEM_TM_CASE || itemId == ITEM_BERRY_POUCH)
+ StringCopy(dest, sListItemTextColor_TmCase_BerryPouch);
+ else
+ StringCopy(dest, sListItemTextColor_RegularItem);
+ StringAppend(dest, ItemId_GetName(itemId));
+}
+
+static void BagListMenuMoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list)
+{
+ if (onInit != TRUE)
+ {
+ PlaySE(SE_BAG1);
+ sub_8098580();
+ }
+ if (sBagMenuDisplay->itemOriginalLocation == 0xFF)
+ {
+ DestroyItemMenuIcon(sBagMenuDisplay->itemMenuIcon ^ 1);
+ if (sBagMenuDisplay->nItems[gBagMenuState.pocket] != itemIndex)
+ CreateItemMenuIcon(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, itemIndex), sBagMenuDisplay->itemMenuIcon);
+ else
+ CreateItemMenuIcon(ITEM_N_A, sBagMenuDisplay->itemMenuIcon);
+ sBagMenuDisplay->itemMenuIcon ^= 1;
+ if (!sBagMenuDisplay->inhibitItemDescriptionPrint)
+ PrintItemDescriptionOnMessageWindow(itemIndex);
+ }
+}
+
+static void BagListMenuItemPrintFunc(u8 windowId, s32 itemId, u8 y)
+{
+ u16 bagItemId;
+ u16 bagItemQuantity;
+ if (sBagMenuDisplay->itemOriginalLocation != 0xFF)
+ {
+ if (sBagMenuDisplay->itemOriginalLocation == (u8)itemId)
+ bag_menu_print_cursor(y, 2);
+ else
+ bag_menu_print_cursor(y, 0xFF);
+ }
+ if (itemId != -2 && sBagMenuDisplay->nItems[gBagMenuState.pocket] != itemId)
+ {
+ bagItemId = BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, itemId);
+ bagItemQuantity = BagGetQuantityByPocketPosition(gBagMenuState.pocket + 1, itemId);
+ if (gBagMenuState.pocket != POCKET_KEY_ITEMS - 1 && !itemid_is_unique(bagItemId))
+ {
+ ConvertIntToDecimalStringN(gStringVar1, bagItemQuantity, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1);
+ BagPrintTextOnWindow(windowId, 0, gStringVar4, 0x6e, y, 0, 0, 0xFF, 1);
+ }
+ else if (gSaveBlock1Ptr->registeredItem != ITEM_NONE && gSaveBlock1Ptr->registeredItem == bagItemId)
+ {
+ BlitBitmapToWindow(windowId, sBlit_SelectButton, 0x70, y, 0x18, 0x10);
+ }
+ }
+}
+
+static void bag_menu_print_cursor_(u8 taskId, u8 colorIdx)
+{
+ bag_menu_print_cursor(ListMenuGetYCoordForPrintingArrowCursor(taskId), colorIdx);
+}
+
+static void bag_menu_print_cursor(u8 y, u8 colorIdx)
+{
+ if (colorIdx == 0xFF)
+ {
+ FillWindowPixelRect(0, PIXEL_FILL(0), 1, y, GetMenuCursorDimensionByFont(2, 0), GetMenuCursorDimensionByFont(2, 1));
+ }
+ else
+ {
+ BagPrintTextOnWindow(0, 2, gFameCheckerText_ListMenuCursor, 1, y, 0, 0, 0, colorIdx);
+ }
+}
+
+static void PrintBagPocketName(void)
+{
+ FillWindowPixelBuffer(2, PIXEL_FILL(0));
+ BagPrintTextOnWin1CenteredColor0(sPocketNames[gBagMenuState.pocket], gBagMenuState.pocket);
+}
+
+static void PrintItemDescriptionOnMessageWindow(s32 itemIndex)
+{
+ const u8 *description;
+ if (itemIndex != sBagMenuDisplay->nItems[gBagMenuState.pocket])
+ description = ItemId_GetDescription(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, itemIndex));
+ else
+ description = gText_CloseBag;
+ FillWindowPixelBuffer(1, PIXEL_FILL(0));
+ BagPrintTextOnWindow(1, 2, description, 0, 3, 2, 0, 0, 0);
+}
+
+static void CreatePocketScrollArrowPair(void)
+{
+ sBagMenuDisplay->pocketScrollArrowsTask = AddScrollIndicatorArrowPairParameterized(
+ SCROLL_ARROW_UP,
+ 160,
+ 8,
+ 104,
+ sBagMenuDisplay->nItems[gBagMenuState.pocket] - sBagMenuDisplay->maxShowed[gBagMenuState.pocket] + 1,
+ 110,
+ 110,
+ &gBagMenuState.cursorPos[gBagMenuState.pocket]
+ );
+}
+
+static void CreatePocketSwitchArrowPair(void)
+{
+ if (sBagMenuDisplay->pocketSwitchMode != 1)
+ {
+ sBagMenuDisplay->pocketSwitchArrowsTask = AddScrollIndicatorArrowPair(&sPocketSwitchArrowPairTemplate, &gBagMenuState.pocket);
+ }
+}
+
+static void CreatePocketScrollArrowPair_SellQuantity(void)
+{
+ sBagMenuDisplay->contextMenuSelectedItem = 1;
+ sBagMenuDisplay->pocketScrollArrowsTask = AddScrollIndicatorArrowPairParameterized(
+ SCROLL_ARROW_UP,
+ 152,
+ 72,
+ 104,
+ 2,
+ 110,
+ 110,
+ &sBagMenuDisplay->contextMenuSelectedItem
+ );
+}
+
+static void CreateArrowPair_QuantitySelect(void)
+{
+ sBagMenuDisplay->contextMenuSelectedItem = 1;
+ sBagMenuDisplay->pocketScrollArrowsTask = AddScrollIndicatorArrowPairParameterized(
+ SCROLL_ARROW_UP,
+ 212,
+ 120,
+ 152,
+ 2,
+ 110,
+ 110,
+ &sBagMenuDisplay->contextMenuSelectedItem
+ );
+}
+
+static void BagDestroyPocketScrollArrowPair(void)
+{
+ if (sBagMenuDisplay->pocketScrollArrowsTask != 0xFF)
+ {
+ RemoveScrollIndicatorArrowPair(sBagMenuDisplay->pocketScrollArrowsTask);
+ sBagMenuDisplay->pocketScrollArrowsTask = 0xFF;
+ }
+ BagDestroyPocketSwitchArrowPair();
+}
+
+static void BagDestroyPocketSwitchArrowPair(void)
+{
+ if (sBagMenuDisplay->pocketSwitchArrowsTask != 0xFF)
+ {
+ RemoveScrollIndicatorArrowPair(sBagMenuDisplay->pocketSwitchArrowsTask);
+ sBagMenuDisplay->pocketSwitchArrowsTask = 0xFF;
+ }
+}
+
+void ResetBagCursorPositions(void)
+{
+ u8 i;
+ gBagMenuState.pocket = POCKET_ITEMS - 1;
+ gBagMenuState.bagOpen = FALSE;
+ for (i = 0; i < 3; i++)
+ {
+ gBagMenuState.itemsAbove[i] = 0;
+ gBagMenuState.cursorPos[i] = 0;
+ }
+}
+
+void PocketCalculateInitialCursorPosAndItemsAbove(u8 pocketId)
+{
+ if (gBagMenuState.cursorPos[pocketId] != 0 && gBagMenuState.cursorPos[pocketId] + sBagMenuDisplay->maxShowed[pocketId] > sBagMenuDisplay->nItems[pocketId] + 1)
+ {
+ gBagMenuState.cursorPos[pocketId] = (sBagMenuDisplay->nItems[pocketId] + 1) - sBagMenuDisplay->maxShowed[pocketId];
+ }
+ if (gBagMenuState.cursorPos[pocketId] + gBagMenuState.itemsAbove[pocketId] >= sBagMenuDisplay->nItems[pocketId] + 1)
+ {
+ if (sBagMenuDisplay->nItems[pocketId] + 1 < 2)
+ gBagMenuState.itemsAbove[pocketId] = 0;
+ else
+ gBagMenuState.itemsAbove[pocketId] = sBagMenuDisplay->nItems[pocketId];
+ }
+}
+
+static void CalculateInitialCursorPosAndItemsAbove(void)
+{
+ u8 i;
+ for (i = 0; i < 3; i++)
+ {
+ PocketCalculateInitialCursorPosAndItemsAbove(i);
+ }
+}
+
+static void UpdatePocketScrollPositions(void)
+{
+ u8 i;
+ u8 j;
+
+ for (i = 0; i < 3; i++)
+ {
+ if (gBagMenuState.itemsAbove[i] > 3)
+ {
+ for (j = 0; j <= gBagMenuState.itemsAbove[i] - 3; gBagMenuState.itemsAbove[i]--, gBagMenuState.cursorPos[i]++, j++)
+ {
+ if (gBagMenuState.cursorPos[i] + sBagMenuDisplay->maxShowed[i] == sBagMenuDisplay->nItems[i] + 1)
+ break;
+ }
+ }
+ }
+}
+
+static void DestroyBagMenuResources(void)
+{
+ FREE_IF_SET(sBagMenuDisplay);
+ FREE_IF_SET(sBagBgTilemapBuffer);
+ FREE_IF_SET(sListMenuItems);
+ FREE_IF_SET(sListMenuItemStrings);
+ FreeAllWindowBuffers();
+}
+
+void ItemMenu_StartFadeToExitCallback(u8 taskId)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, -2, 0, 16, RGB_BLACK);
+ gTasks[taskId].func = Task_ItemMenu_WaitFadeAndSwitchToExitCallback;
+}
+
+static void Task_ItemMenu_WaitFadeAndSwitchToExitCallback(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (!gPaletteFade.active && FuncIsActiveTask(Task_AnimateWin0v) != TRUE)
+ {
+ DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);
+ if (sBagMenuDisplay->exitCB != NULL)
+ SetMainCallback2(sBagMenuDisplay->exitCB);
+ else
+ SetMainCallback2(gBagMenuState.bagCallback);
+ BagDestroyPocketScrollArrowPair();
+ DestroyBagMenuResources();
+ DestroyTask(taskId);
+ }
+}
+
+static void ShowBagOrBeginWin0OpenTask(void)
+{
+ u16 paldata = RGB_BLACK;
+ u8 taskId;
+
+ LoadPalette(&paldata, 0x00, 0x02);
+ SetGpuReg(REG_OFFSET_WININ, 0);
+ SetGpuReg(REG_OFFSET_WINOUT, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR);
+ BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ if (gBagMenuState.bagOpen == TRUE)
+ {
+ SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 240));
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 0));
+ }
+ else
+ {
+ SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 240));
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 160));
+ taskId = CreateTask(Task_AnimateWin0v, 0);
+ gTasks[taskId].data[0] = 192;
+ gTasks[taskId].data[1] = -16;
+ gBagMenuState.bagOpen = TRUE;
+ }
+}
+
+void Bag_BeginCloseWin0Animation(void)
+{
+
+ u8 taskId = CreateTask(Task_AnimateWin0v, 0);
+ gTasks[taskId].data[0] = -16;
+ gTasks[taskId].data[1] = 16;
+ gBagMenuState.bagOpen = FALSE;
+}
+
+void CB2_SetUpReshowBattleScreenAfterMenu(void)
+{
+ gBagMenuState.bagOpen = FALSE;
+}
+
+static void Task_AnimateWin0v(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ data[0] += data[1];
+ if (data[0] > 160)
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 160));
+ else
+ SetGpuReg(REG_OFFSET_WIN0V, data[0]);
+ if ((data[1] == 16 && data[0] == 160) || (data[1] == -16 && data[0] == 0))
+ DestroyTask(taskId);
+}
+
+void MoveItemSlotInList(struct ItemSlot * itemSlots_, u32 from, u32 to_)
+{
+ // dumb assignments needed to match
+ struct ItemSlot *itemSlots = itemSlots_;
+ u32 to = to_;
+
+ if (from != to)
+ {
+ s16 i, count;
+ struct ItemSlot firstSlot = itemSlots[from];
+
+ if (to > from)
+ {
+ to--;
+ for (i = from, count = to; i < count; i++)
+ itemSlots[i] = itemSlots[i + 1];
+ }
+ else
+ {
+ for (i = from, count = to; i > count; i--)
+ itemSlots[i] = itemSlots[i - 1];
+ }
+ itemSlots[to] = firstSlot;
+ }
+}
+
+void Pocket_CalculateNItemsAndMaxShowed(u8 pocketId)
+{
+ u16 i;
+ struct BagPocket * pocket = &gBagPockets[pocketId];
+ BagPocketCompaction(pocket->itemSlots, pocket->capacity);
+ sBagMenuDisplay->nItems[pocketId] = 0;
+ for (i = 0; i < pocket->capacity; i++)
+ {
+ if (pocket->itemSlots[i].itemId == ITEM_NONE)
+ break;
+ sBagMenuDisplay->nItems[pocketId]++;
+ }
+ if (sBagMenuDisplay->nItems[pocketId] + 1 > 6)
+ sBagMenuDisplay->maxShowed[pocketId] = 6;
+ else
+ sBagMenuDisplay->maxShowed[pocketId] = sBagMenuDisplay->nItems[pocketId] + 1;
+}
+
+static void All_CalculateNItemsAndMaxShowed(void)
+{
+ u8 i;
+ for (i = 0; i < 3; i++)
+ Pocket_CalculateNItemsAndMaxShowed(i);
+}
+
+void DisplayItemMessageInBag(u8 taskId, u8 fontId, const u8 * string, TaskFunc followUpFunc)
+{
+ s16 *data = gTasks[taskId].data;
+ data[10] = OpenBagWindow(5);
+ FillWindowPixelBuffer(data[10], PIXEL_FILL(1));
+ DisplayMessageAndContinueTask(taskId, data[10], 0x06D, 0x0D, fontId, GetTextSpeedSetting(), string, followUpFunc);
+ ScheduleBgCopyTilemapToVram(0);
+}
+
+void ItemMenu_SetExitCallback(MainCallback cb)
+{
+ sBagMenuDisplay->exitCB = cb;
+}
+
+static u8 GetSelectedItemIndex(u8 pocket)
+{
+ return gBagMenuState.cursorPos[pocket] + gBagMenuState.itemsAbove[pocket];
+}
+
+static void Task_BagMenu_HandleInput(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ u16 cursorPos;
+ u16 itemsAbove;
+ s32 input;
+
+ if (gPaletteFade.active)
+ return;
+ if (FuncIsActiveTask(Task_AnimateWin0v) == TRUE)
+ return;
+ if ((u8)sub_80BF72C() == TRUE)
+ return;
+ switch (ProcessPocketSwitchInput(taskId, gBagMenuState.pocket))
+ {
+ case 1:
+ SwitchPockets(taskId, -1, FALSE);
+ return;
+ case 2:
+ SwitchPockets(taskId, 1, FALSE);
+ return;
+ default:
+ if (JOY_NEW(SELECT_BUTTON) && gBagMenuState.location == ITEMMENULOCATION_FIELD)
+ {
+ ListMenuGetScrollAndRow(data[0], &cursorPos, &itemsAbove);
+ if (cursorPos + itemsAbove != sBagMenuDisplay->nItems[gBagMenuState.pocket])
+ {
+ PlaySE(SE_SELECT);
+ BeginMovingItemInPocket(taskId, cursorPos + itemsAbove);
+ return;
+ }
+ }
+ break;
+ }
+ input = ListMenu_ProcessInput(data[0]);
+ ListMenuGetScrollAndRow(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);
+ switch (input)
+ {
+ case LIST_NOTHING_CHOSEN:
+ return;
+ case LIST_CANCEL:
+ PlaySE(SE_SELECT);
+ gSpecialVar_ItemId = ITEM_NONE;
+ Bag_BeginCloseWin0Animation();
+ gTasks[taskId].func = ItemMenu_StartFadeToExitCallback;
+ break;
+ default:
+ PlaySE(SE_SELECT);
+ if (input == sBagMenuDisplay->nItems[gBagMenuState.pocket])
+ {
+ gSpecialVar_ItemId = ITEM_NONE;
+ Bag_BeginCloseWin0Animation();
+ gTasks[taskId].func = ItemMenu_StartFadeToExitCallback;
+ }
+ else
+ {
+ BagDestroyPocketScrollArrowPair();
+ bag_menu_print_cursor_(data[0], 2);
+ data[1] = input;
+ data[2] = BagGetQuantityByPocketPosition(gBagMenuState.pocket + 1, input);
+ gSpecialVar_ItemId = BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, input);
+ gTasks[taskId].func = Task_ItemContextMenuByLocation;
+ }
+ break;
+ }
+}
+
+static void Task_ItemContextMenuByLocation(u8 taskId)
+{
+ Bag_FillMessageBoxWithPalette(1);
+ sItemContextTaskFuncs[gBagMenuState.location](taskId);
+}
+
+static void Task_RedrawArrowsAndReturnToBagMenuSelect(u8 taskId)
+{
+ Bag_FillMessageBoxWithPalette(0);
+ CreatePocketScrollArrowPair();
+ CreatePocketSwitchArrowPair();
+ gTasks[taskId].func = Task_BagMenu_HandleInput;
+}
+
+static void Bag_FillMessageBoxWithPalette(u32 a0)
+{
+ SetBgTilemapPalette(1, 0, 14, 30, 6, a0 + 1);
+ ScheduleBgCopyTilemapToVram(1);
+}
+
+static u8 ProcessPocketSwitchInput(u8 taskId, u8 pocketId)
+{
+ u8 lrState;
+ if (sBagMenuDisplay->pocketSwitchMode != 0)
+ return 0;
+ lrState = GetLRKeysState();
+ if (JOY_NEW(DPAD_LEFT) || lrState == 1)
+ {
+ if (pocketId == POCKET_ITEMS - 1)
+ return 0;
+ PlaySE(SE_BAG2);
+ return 1;
+ }
+ if (JOY_NEW(DPAD_RIGHT) || lrState == 2)
+ {
+ if (pocketId >= POCKET_POKE_BALLS - 1)
+ return 0;
+ PlaySE(SE_BAG2);
+ return 2;
+ }
+ return 0;
+}
+
+static void SwitchPockets(u8 taskId, s16 direction, bool16 a2)
+{
+ s16 *data = gTasks[taskId].data;
+ data[13] = 0;
+ data[12] = 0;
+ data[11] = direction;
+ if (!a2)
+ {
+ ClearWindowTilemap(0);
+ ClearWindowTilemap(1);
+ ClearWindowTilemap(2);
+ DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);
+ ScheduleBgCopyTilemapToVram(0);
+ DestroyItemMenuIcon(sBagMenuDisplay->itemMenuIcon ^ 1);
+ BagDestroyPocketScrollArrowPair();
+ }
+ FillBgTilemapBufferRect_Palette0(1, 0x02D, 11, 1, 18, 12);
+ ScheduleBgCopyTilemapToVram(1);
+ sub_8098528(gBagMenuState.pocket + direction);
+ SetTaskFuncWithFollowupFunc(taskId, Task_AnimateSwitchPockets, gTasks[taskId].func);
+}
+
+static void Task_AnimateSwitchPockets(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (!MenuHelpers_LinkSomething() && !BagIsTutorial())
+ {
+ switch (ProcessPocketSwitchInput(taskId, gBagMenuState.pocket + data[11]))
+ {
+ case 1:
+ gBagMenuState.pocket += data[11];
+ SwitchTaskToFollowupFunc(taskId);
+ SwitchPockets(taskId, -1, TRUE);
+ return;
+ case 2:
+ gBagMenuState.pocket += data[11];
+ SwitchTaskToFollowupFunc(taskId);
+ SwitchPockets(taskId, 1, TRUE);
+ return;
+ }
+ }
+ switch (data[13])
+ {
+ case 0:
+ if (data[12] != 0x7FFF)
+ {
+ data[12]++;
+ CopyBagListBgTileRowToTilemapBuffer(data[12]);
+ if (data[12] == 12)
+ data[12] = 0x7FFF;
+ }
+ if (data[12] == 0x7FFF)
+ data[13]++;
+ break;
+ case 1:
+ gBagMenuState.pocket += data[11];
+ PrintBagPocketName();
+ Bag_BuildListMenuTemplate(gBagMenuState.pocket);
+ data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]);
+ PutWindowTilemap(1);
+ PutWindowTilemap(2);
+ ScheduleBgCopyTilemapToVram(0);
+ CreatePocketScrollArrowPair();
+ CreatePocketSwitchArrowPair();
+ SwitchTaskToFollowupFunc(taskId);
+ break;
+ }
+}
+
+static void BeginMovingItemInPocket(u8 taskId, s16 itemIndex)
+{
+ u16 itemsAbove;
+ u16 cursorPos;
+ s16 *data = gTasks[taskId].data;
+ ListMenuGetScrollAndRow(data[0], &cursorPos, &itemsAbove);
+ ListMenuSetUnkIndicatorsStructField(data[0], 0x10, 1);
+ data[1] = itemIndex;
+ sBagMenuDisplay->itemOriginalLocation = itemIndex;
+ StringCopy(gStringVar1, ItemId_GetName(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1])));
+ StringExpandPlaceholders(gStringVar4, gOtherText_WhereShouldTheStrVar1BePlaced);
+ FillWindowPixelBuffer(1, PIXEL_FILL(0));
+ BagPrintTextOnWindow(1, 2, gStringVar4, 0, 3, 2, 0, 0, 0);
+ ItemMenuIcons_MoveInsertIndicatorBar(0, ListMenuGetYCoordForPrintingArrowCursor(data[0]));
+ ItemMenuIcons_ToggleInsertIndicatorBarVisibility(FALSE);
+ BagDestroyPocketSwitchArrowPair();
+ bag_menu_print_cursor_(data[0], 2);
+ gTasks[taskId].func = Task_MoveItemInPocket_HandleInput;
+}
+
+static void Task_MoveItemInPocket_HandleInput(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ s32 input;
+ u16 itemsAbove;
+ u16 cursorPos;
+ if ((u8)sub_80BF72C() == TRUE)
+ return;
+ input = ListMenu_ProcessInput(data[0]);
+ ListMenuGetScrollAndRow(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);
+ ItemMenuIcons_MoveInsertIndicatorBar(0, ListMenuGetYCoordForPrintingArrowCursor(data[0]));
+ if (JOY_NEW(SELECT_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ sBagMenuDisplay->itemOriginalLocation = 0xFF;
+ ListMenuGetScrollAndRow(data[0], &cursorPos, &itemsAbove);
+ ExecuteMoveItemInPocket(taskId, cursorPos + itemsAbove);
+ return;
+ }
+ switch (input)
+ {
+ case LIST_NOTHING_CHOSEN:
+ return;
+ case LIST_CANCEL:
+ PlaySE(SE_SELECT);
+ sBagMenuDisplay->itemOriginalLocation = 0xFF;
+ ListMenuGetScrollAndRow(data[0], &cursorPos, &itemsAbove);
+ AbortMovingItemInPocket(taskId, cursorPos + itemsAbove);
+ break;
+ default:
+ PlaySE(SE_SELECT);
+ sBagMenuDisplay->itemOriginalLocation = 0xFF;
+ ExecuteMoveItemInPocket(taskId, input);
+ break;
+ }
+}
+
+static void ExecuteMoveItemInPocket(u8 taskId, u32 itemIndex)
+{
+ s16 *data = gTasks[taskId].data;
+ if (data[1] == itemIndex || data[1] == itemIndex - 1)
+ {
+ AbortMovingItemInPocket(taskId, itemIndex);
+ }
+ else
+ {
+ MoveItemSlotInList(gBagPockets[gBagMenuState.pocket].itemSlots, data[1], itemIndex);
+ DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);
+ if (data[1] < itemIndex)
+ gBagMenuState.itemsAbove[gBagMenuState.pocket]--;
+ Bag_BuildListMenuTemplate(gBagMenuState.pocket);
+ data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]);
+ ItemMenuIcons_ToggleInsertIndicatorBarVisibility(TRUE);
+ CreatePocketSwitchArrowPair();
+ gTasks[taskId].func = Task_BagMenu_HandleInput;
+ }
+}
+
+static void AbortMovingItemInPocket(u8 taskId, u32 itemIndex)
+{
+ s16 *data = gTasks[taskId].data;
+ DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);
+ if (data[1] < itemIndex)
+ gBagMenuState.itemsAbove[gBagMenuState.pocket]--;
+ Bag_BuildListMenuTemplate(gBagMenuState.pocket);
+ data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]);
+ ItemMenuIcons_ToggleInsertIndicatorBarVisibility(TRUE);
+ CreatePocketSwitchArrowPair();
+ gTasks[taskId].func = Task_BagMenu_HandleInput;
+}
+
+static void InitQuantityToTossOrDeposit(u16 cursorPos, const u8 *str)
+{
+ u8 r4;
+ u8 r5 = ShowBagWindow(6, 2);
+ CopyItemName(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, cursorPos), gStringVar1);
+ StringExpandPlaceholders(gStringVar4, str);
+ BagPrintTextOnWindow(r5, 2, gStringVar4, 0, 2, 1, 0, 0, 1);
+ r4 = ShowBagWindow(0, 0);
+ ConvertIntToDecimalStringN(gStringVar1, 1, STR_CONV_MODE_LEADING_ZEROS, 3);
+ StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1);
+ BagPrintTextOnWindow(r4, 0, gStringVar4, 4, 10, 1, 0, 0, 1);
+ CreateArrowPair_QuantitySelect();
+}
+
+static void UpdateQuantityToTossOrDeposit(s16 value, u8 ndigits)
+{
+ u8 r6 = GetBagWindow(0);
+ FillWindowPixelBuffer(r6, PIXEL_FILL(1));
+ ConvertIntToDecimalStringN(gStringVar1, value, STR_CONV_MODE_LEADING_ZEROS, ndigits);
+ StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1);
+ BagPrintTextOnWindow(r6, 0, gStringVar4, 4, 10, 1, 0, 0, 1);
+}
+
+static void CopyBagListBgTileRowToTilemapBuffer(u8 frame)
+{
+ CopyToBgTilemapBufferRect(1, sBagListBgTiles[12 - frame], 11, 13 - frame, 18, 1);
+ ScheduleBgCopyTilemapToVram(1);
+}
+
+static void OpenContextMenu(u8 taskId)
+{
+ u8 r6;
+ u8 r4;
+ switch (gBagMenuState.location)
+ {
+ case ITEMMENULOCATION_BATTLE:
+ case ITEMMENULOCATION_TTVSCR_STATUS:
+ if (gSpecialVar_ItemId == ITEM_BERRY_POUCH)
+ {
+ sContextMenuItemsBuffer[0] = ITEMMENUACTION_OPEN_BERRIES;
+ sContextMenuItemsBuffer[1] = ITEMMENUACTION_CANCEL;
+ sContextMenuItemsPtr = sContextMenuItemsBuffer;
+ sContextMenuNumItems = 2;
+ }
+ else if (ItemId_GetBattleUsage(gSpecialVar_ItemId))
+ {
+ sContextMenuItemsPtr = sContextMenuItems_BattleUse;
+ sContextMenuNumItems = 2;
+ }
+ else
+ {
+ sContextMenuItemsPtr = sContextMenuItems_Cancel;
+ sContextMenuNumItems = 1;
+ }
+ break;
+ case ITEMMENULOCATION_OLD_MAN:
+ case ITEMMENULOCATION_TTVSCR_CATCHING:
+ sContextMenuItemsPtr = sContextMenuItems_BattleUse;
+ sContextMenuNumItems = 2;
+ break;
+ default:
+ if (MenuHelpers_LinkSomething() == TRUE || InUnionRoom() == TRUE)
+ {
+ if (gSpecialVar_ItemId == ITEM_TM_CASE || gSpecialVar_ItemId == ITEM_BERRY_POUCH)
+ {
+ sContextMenuItemsPtr = sContextMenuItems_Open;
+ sContextMenuNumItems = 2;
+ }
+ else
+ {
+ if (gBagMenuState.pocket == POCKET_KEY_ITEMS - 1)
+ sContextMenuNumItems = 1;
+ else
+ sContextMenuNumItems = 2;
+ sContextMenuItemsPtr = sContextMenuItems_GiveIfNotKeyItemPocket[gBagMenuState.pocket];
+ }
+ }
+ else
+ {
+ switch (gBagMenuState.pocket)
+ {
+ case OPEN_BAG_ITEMS:
+ sContextMenuNumItems = 4;
+ if (ItemIsMail(gSpecialVar_ItemId) == TRUE)
+ sContextMenuItemsPtr = sContextMenuItems_CheckGiveTossCancel;
+ else
+ sContextMenuItemsPtr = sContextMenuItems_Field[gBagMenuState.pocket];
+ break;
+ case OPEN_BAG_KEYITEMS:
+ sContextMenuItemsPtr = sContextMenuItemsBuffer;
+ sContextMenuNumItems = 3;
+ sContextMenuItemsBuffer[2] = ITEMMENUACTION_CANCEL;
+ if (gSaveBlock1Ptr->registeredItem == gSpecialVar_ItemId)
+ sContextMenuItemsBuffer[1] = ITEMMENUACTION_DESELECT;
+ else
+ sContextMenuItemsBuffer[1] = ITEMMENUACTION_REGISTER;
+ if (gSpecialVar_ItemId == ITEM_TM_CASE || gSpecialVar_ItemId == ITEM_BERRY_POUCH)
+ sContextMenuItemsBuffer[0] = ITEMMENUACTION_OPEN;
+ else if (gSpecialVar_ItemId == ITEM_BICYCLE && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE | PLAYER_AVATAR_FLAG_MACH_BIKE))
+ sContextMenuItemsBuffer[0] = ITEMMENUACTION_WALK;
+ else
+ sContextMenuItemsBuffer[0] = ITEMMENUACTION_USE;
+ break;
+ case OPEN_BAG_POKEBALLS:
+ sContextMenuItemsPtr = sContextMenuItems_Field[gBagMenuState.pocket];
+ sContextMenuNumItems = 3;
+ break;
+ }
+ }
+ }
+ r6 = ShowBagWindow(10, sContextMenuNumItems - 1);
+ AddItemMenuActionTextPrinters(
+ r6,
+ 2,
+ GetMenuCursorDimensionByFont(2, 0),
+ 2,
+ GetFontAttribute(2, FONTATTR_LETTER_SPACING),
+ GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT) + 2,
+ sContextMenuNumItems,
+ sItemMenuContextActions,
+ sContextMenuItemsPtr
+ );
+ Menu_InitCursor(r6, 2, 0, 2, GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT) + 2, sContextMenuNumItems, 0);
+ r4 = ShowBagWindow(6, 0);
+ CopyItemName(gSpecialVar_ItemId, gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gOtherText_StrVar1);
+ BagPrintTextOnWindow(r4, 2, gStringVar4, 0, 2, 1, 0, 0, 1);
+}
+
+static void Task_ItemContext_FieldOrBattle(u8 taskId)
+{
+ OpenContextMenu(taskId);
+ gTasks[taskId].func = Task_FieldItemContextMenuHandleInput;
+}
+
+static void Task_FieldItemContextMenuHandleInput(u8 taskId)
+{
+ s8 input;
+ if ((u8)sub_80BF72C() != TRUE)
+ {
+ input = Menu_ProcessInputNoWrapAround();
+ switch (input)
+ {
+ case -1:
+ PlaySE(SE_SELECT);
+ sItemMenuContextActions[ITEMMENUACTION_CANCEL].func.void_u8(taskId);
+ break;
+ case -2:
+ break;
+ default:
+ PlaySE(SE_SELECT);
+ sItemMenuContextActions[sContextMenuItemsPtr[input]].func.void_u8(taskId);
+ break;
+ }
+ }
+}
+
+static void Task_ItemMenuAction_Use(u8 taskId)
+{
+ if (ItemId_GetFieldFunc(gSpecialVar_ItemId) != NULL)
+ {
+ HideBagWindow(10);
+ HideBagWindow(6);
+ PutWindowTilemap(0);
+ PutWindowTilemap(1);
+ ScheduleBgCopyTilemapToVram(0);
+ if (CalculatePlayerPartyCount() == 0 && ItemId_GetType(gSpecialVar_ItemId) == 1)
+ Task_PrintThereIsNoPokemon(taskId);
+ else
+ ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId);
+ }
+}
+
+static void Task_ItemMenuAction_Toss(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ ClearWindowTilemap(GetBagWindow(10));
+ ClearWindowTilemap(GetBagWindow(6));
+ HideBagWindow(10);
+ HideBagWindow(6);
+ PutWindowTilemap(0);
+ data[8] = 1;
+ if (data[2] == 1)
+ {
+ Task_ConfirmTossItems(taskId);
+ }
+ else
+ {
+ InitQuantityToTossOrDeposit(data[1], gText_TossOutHowManyStrVar1s);
+ gTasks[taskId].func = Task_SelectQuantityToToss;
+ }
+}
+
+static void Task_ConfirmTossItems(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 3);
+ StringExpandPlaceholders(gStringVar4, gText_ThrowAwayStrVar2OfThisItemQM);
+ BagPrintTextOnWindow(ShowBagWindow(6, 1), 2, gStringVar4, 0, 2, 1, 0, 0, 1);
+ BagCreateYesNoMenuBottomRight(taskId, &sYesNoMenu_Toss);
+}
+
+static void Task_TossItem_No(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ HideBagWindow(6);
+ PutWindowTilemap(1);
+ ScheduleBgCopyTilemapToVram(0);
+ bag_menu_print_cursor_(data[0], 1);
+ Task_RedrawArrowsAndReturnToBagMenuSelect(taskId);
+}
+
+static void Task_SelectQuantityToToss(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE)
+ {
+ UpdateQuantityToTossOrDeposit(data[8], 3);
+ }
+ else if (JOY_NEW(A_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ ClearWindowTilemap(GetBagWindow(6));
+ HideBagWindow(6);
+ HideBagWindow(0);
+ ScheduleBgCopyTilemapToVram(0);
+ BagDestroyPocketScrollArrowPair();
+ Task_ConfirmTossItems(taskId);
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ HideBagWindow(6);
+ HideBagWindow(0);
+ PutWindowTilemap(0);
+ PutWindowTilemap(1);
+ ScheduleBgCopyTilemapToVram(0);
+ bag_menu_print_cursor_(data[0], 1);
+ BagDestroyPocketScrollArrowPair();
+ Task_RedrawArrowsAndReturnToBagMenuSelect(taskId);
+ }
+}
+
+static void Task_TossItem_Yes(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ HideBagWindow(6);
+ CopyItemName(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1]), gStringVar1);
+ ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 3);
+ StringExpandPlaceholders(gStringVar4, gText_ThrewAwayStrVar2StrVar1s);
+ BagPrintTextOnWindow(ShowBagWindow(6, 3), 2, gStringVar4, 0, 2, 1, 0, 0, 1);
+ gTasks[taskId].func = Task_WaitAB_RedrawAndReturnToBag;
+}
+
+static void Task_WaitAB_RedrawAndReturnToBag(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ RemoveBagItem(gSpecialVar_ItemId, data[8]);
+ HideBagWindow(6);
+ DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);
+ Pocket_CalculateNItemsAndMaxShowed(gBagMenuState.pocket);
+ PocketCalculateInitialCursorPosAndItemsAbove(gBagMenuState.pocket);
+ Bag_BuildListMenuTemplate(gBagMenuState.pocket);
+ data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]);
+ PutWindowTilemap(1);
+ ScheduleBgCopyTilemapToVram(0);
+ bag_menu_print_cursor_(data[0], 1);
+ Task_RedrawArrowsAndReturnToBagMenuSelect(taskId);
+ }
+}
+
+static void Task_ItemMenuAction_ToggleSelect(u8 taskId)
+{
+ u16 itemId;
+ s16 *data = gTasks[taskId].data;
+ itemId = BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1]);
+ if (gSaveBlock1Ptr->registeredItem == itemId)
+ gSaveBlock1Ptr->registeredItem = ITEM_NONE;
+ else
+ gSaveBlock1Ptr->registeredItem = itemId;
+
+ DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);
+ Bag_BuildListMenuTemplate(gBagMenuState.pocket);
+ data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]);
+ CopyWindowToVram(0, 1);
+ Task_ItemMenuAction_Cancel(taskId);
+}
+
+static void Task_ItemMenuAction_Give(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ u16 itemId = BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1]);
+ HideBagWindow(10);
+ HideBagWindow(6);
+ PutWindowTilemap(0);
+ PutWindowTilemap(1);
+ CopyWindowToVram(0, 1);
+ if (!CanWriteMailHere(itemId))
+ DisplayItemMessageInBag(taskId, 2, gText_CantWriteMailHere, Task_WaitAButtonAndCloseContextMenu);
+ else if (!itemid_is_unique(itemId))
+ {
+ if (CalculatePlayerPartyCount() == 0)
+ {
+ Task_PrintThereIsNoPokemon(taskId);
+ }
+ else
+ {
+ sBagMenuDisplay->exitCB = CB2_ChooseMonToGiveItem;
+ gTasks[taskId].func = ItemMenu_StartFadeToExitCallback;
+ }
+ }
+ else
+ Task_PrintItemCantBeHeld(taskId);
+}
+
+static void Task_PrintThereIsNoPokemon(u8 taskId)
+{
+ DisplayItemMessageInBag(taskId, 2, gText_ThereIsNoPokemon, Task_WaitAButtonAndCloseContextMenu);
+}
+
+static void Task_PrintItemCantBeHeld(u8 taskId)
+{
+ CopyItemName(gSpecialVar_ItemId, gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gText_ItemCantBeHeld);
+ DisplayItemMessageInBag(taskId, 2, gStringVar4, Task_WaitAButtonAndCloseContextMenu);
+}
+
+static void Task_WaitAButtonAndCloseContextMenu(u8 taskId)
+{
+ if (JOY_NEW(A_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ Task_ReturnToBagFromContextMenu(taskId);
+ }
+}
+
+void Task_ReturnToBagFromContextMenu(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ CloseBagWindow(5);
+ DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);
+ Pocket_CalculateNItemsAndMaxShowed(gBagMenuState.pocket);
+ PocketCalculateInitialCursorPosAndItemsAbove(gBagMenuState.pocket);
+ Bag_BuildListMenuTemplate(gBagMenuState.pocket);
+ data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]);
+ ScheduleBgCopyTilemapToVram(0);
+ bag_menu_print_cursor_(data[0], 1);
+ Task_RedrawArrowsAndReturnToBagMenuSelect(taskId);
+}
+
+static void unref_sub_810A288(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ u16 itemsAbove;
+ u16 cursorPos;
+ ListMenuGetScrollAndRow(data[0], &cursorPos, &itemsAbove);
+ PrintItemDescriptionOnMessageWindow(cursorPos + itemsAbove);
+ PutWindowTilemap(0);
+ ScheduleBgCopyTilemapToVram(0);
+ bag_menu_print_cursor_(data[0], 1);
+ Task_RedrawArrowsAndReturnToBagMenuSelect(taskId);
+}
+
+static void Task_ItemMenuAction_Cancel(u8 taskId)
+{
+ HideBagWindow(10);
+ HideBagWindow(6);
+ PutWindowTilemap(0);
+ PutWindowTilemap(1);
+ ScheduleBgCopyTilemapToVram(0);
+ bag_menu_print_cursor_(gTasks[taskId].data[0], 1);
+ Task_RedrawArrowsAndReturnToBagMenuSelect(taskId);
+}
+
+static void Task_ItemMenuAction_BattleUse(u8 taskId)
+{
+ if (ItemId_GetBattleFunc(gSpecialVar_ItemId) != NULL)
+ {
+ HideBagWindow(10);
+ HideBagWindow(6);
+ PutWindowTilemap(0);
+ PutWindowTilemap(1);
+ CopyWindowToVram(0, 1);
+ ItemId_GetBattleFunc(gSpecialVar_ItemId)(taskId);
+ }
+}
+
+static void Task_ItemContext_FieldGive(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ u16 itemId = BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1]);
+ if (!CanWriteMailHere(itemId))
+ {
+ DisplayItemMessageInBag(taskId, 2, gText_CantWriteMailHere, Task_WaitAButtonAndCloseContextMenu);
+ }
+ else if (itemId == ITEM_TM_CASE)
+ {
+ ItemMenu_SetExitCallback(GoToTMCase_Give);
+ ItemMenu_StartFadeToExitCallback(taskId);
+ }
+ else if (itemId == ITEM_BERRY_POUCH)
+ {
+ ItemMenu_SetExitCallback(GoToBerryPouch_Give);
+ ItemMenu_StartFadeToExitCallback(taskId);
+ }
+ else if (gBagMenuState.pocket != POCKET_KEY_ITEMS - 1 && !itemid_is_unique(itemId))
+ {
+ Bag_BeginCloseWin0Animation();
+ gTasks[taskId].func = ItemMenu_StartFadeToExitCallback;
+ }
+ else
+ {
+ Task_PrintItemCantBeHeld(taskId);
+ }
+}
+
+static void GoToTMCase_Give(void)
+{
+ InitTMCase(TMCASE_FROMPARTYGIVE, ReturnToBagMenuFromSubmenu_Give, FALSE);
+}
+
+static void GoToBerryPouch_Give(void)
+{
+ InitBerryPouch(BERRYPOUCH_FROMPARTYGIVE, ReturnToBagMenuFromSubmenu_Give, FALSE);
+}
+
+static void ReturnToBagMenuFromSubmenu_Give(void)
+{
+ CB2_SelectBagItemToGive();
+}
+
+static void Task_ItemContext_PcBoxGive(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ u16 itemId = BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1]);
+ if (ItemIsMail(itemId) == TRUE)
+ {
+ DisplayItemMessageInBag(taskId, 2, gText_CantWriteMailHere, Task_WaitAButtonAndCloseContextMenu);
+ }
+ else if (itemId == ITEM_TM_CASE)
+ {
+ ItemMenu_SetExitCallback(GoToTMCase_PCBox);
+ ItemMenu_StartFadeToExitCallback(taskId);
+ }
+ else if (itemId == ITEM_BERRY_POUCH)
+ {
+ ItemMenu_SetExitCallback(GoToBerryPouch_PCBox);
+ ItemMenu_StartFadeToExitCallback(taskId);
+ }
+ else if (gBagMenuState.pocket != POCKET_KEY_ITEMS - 1 && !itemid_is_unique(itemId))
+ {
+ Bag_BeginCloseWin0Animation();
+ gTasks[taskId].func = ItemMenu_StartFadeToExitCallback;
+ }
+ else
+ {
+ Task_PrintItemCantBeHeld(taskId);
+ }
+}
+
+static void GoToTMCase_PCBox(void)
+{
+ InitTMCase(TMCASE_FROMPOKEMONSTORAGEPC, ReturnToBagMenuFromSubmenu_PCBox, FALSE);
+}
+
+static void GoToBerryPouch_PCBox(void)
+{
+ InitBerryPouch(BERRYPOUCH_FROMPOKEMONSTORAGEPC, ReturnToBagMenuFromSubmenu_PCBox, FALSE);
+}
+
+static void ReturnToBagMenuFromSubmenu_PCBox(void)
+{
+ GoToBagMenu(ITEMMENULOCATION_PCBOX, OPEN_BAG_LAST, sub_808CE60);
+}
+
+static void Task_ItemContext_Sell(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (gSpecialVar_ItemId == ITEM_TM_CASE)
+ {
+ ItemMenu_SetExitCallback(GoToTMCase_Sell);
+ ItemMenu_StartFadeToExitCallback(taskId);
+ }
+ else if (gSpecialVar_ItemId == ITEM_BERRY_POUCH)
+ {
+ ItemMenu_SetExitCallback(GoToBerryPouch_Sell);
+ ItemMenu_StartFadeToExitCallback(taskId);
+ }
+ else if (itemid_get_market_price(gSpecialVar_ItemId) == 0)
+ {
+ CopyItemName(gSpecialVar_ItemId, gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gText_OhNoICantBuyThat);
+ DisplayItemMessageInBag(taskId, GetDialogBoxFontId(), gStringVar4, Task_ReturnToBagFromContextMenu);
+ }
+ else
+ {
+ data[8] = 1;
+ if (data[2] == 1)
+ {
+ BagPrintMoneyAmount();
+ Task_PrintSaleConfirmationText(taskId);
+ }
+ else
+ {
+ if (data[2] > 99)
+ data[2] = 99;
+ CopyItemName(gSpecialVar_ItemId, gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gText_HowManyWouldYouLikeToSell);
+ DisplayItemMessageInBag(taskId, GetDialogBoxFontId(), gStringVar4, Task_InitSaleQuantitySelectInterface);
+ }
+ }
+}
+
+static void GoToTMCase_Sell(void)
+{
+ InitTMCase(TMCASE_FROMMARTSELL, ReturnToBagMenuFromSubmenu_Sell, FALSE);
+}
+
+static void GoToBerryPouch_Sell(void)
+{
+ InitBerryPouch(BERRYPOUCH_FROMMARTSELL, ReturnToBagMenuFromSubmenu_Sell, FALSE);
+}
+
+static void ReturnToBagMenuFromSubmenu_Sell(void)
+{
+ GoToBagMenu(ITEMMENULOCATION_SHOP, OPEN_BAG_LAST, CB2_ReturnToField);
+}
+
+static void Task_PrintSaleConfirmationText(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ ConvertIntToDecimalStringN(gStringVar3, itemid_get_market_price(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1])) / 2 * data[8], STR_CONV_MODE_LEFT_ALIGN, 6);
+ StringExpandPlaceholders(gStringVar4, gText_ICanPayThisMuch_WouldThatBeOkay);
+ DisplayItemMessageInBag(taskId, GetDialogBoxFontId(), gStringVar4, Task_ShowSellYesNoMenu);
+}
+
+static void Task_ShowSellYesNoMenu(u8 taskId)
+{
+ BagCreateYesNoMenuTopRight(taskId, &sYesNoMenu_Sell);
+}
+
+static void Task_SellItem_No(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ HideBagWindow(2);
+ CloseBagWindow(5);
+ PutWindowTilemap(2);
+ PutWindowTilemap(0);
+ PutWindowTilemap(1);
+ ScheduleBgCopyTilemapToVram(0);
+ bag_menu_print_cursor_(data[0], 1);
+ Task_RedrawArrowsAndReturnToBagMenuSelect(taskId);
+}
+
+static void Task_InitSaleQuantitySelectInterface(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ u8 r4 = ShowBagWindow(0, 1);
+ ConvertIntToDecimalStringN(gStringVar1, 1, STR_CONV_MODE_LEADING_ZEROS, 2);
+ StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1);
+ BagPrintTextOnWindow(r4, 0, gStringVar4, 4, 10, 1, 0, 0xFF, 1);
+ UpdateSalePriceDisplay(itemid_get_market_price(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1])) / 2 * data[8]);
+ BagPrintMoneyAmount();
+ CreatePocketScrollArrowPair_SellQuantity();
+ gTasks[taskId].func = Task_SelectQuantityToSell;
+}
+
+static void UpdateSalePriceDisplay(s32 amount)
+{
+ PrintMoneyAmount(GetBagWindow(0), 56, 10, amount, 0);
+}
+
+static void Task_SelectQuantityToSell(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE)
+ {
+ UpdateQuantityToTossOrDeposit(data[8], 2);
+ UpdateSalePriceDisplay(itemid_get_market_price(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1])) / 2 * data[8]);
+ }
+ else if (JOY_NEW(A_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ HideBagWindow(0);
+ PutWindowTilemap(0);
+ ScheduleBgCopyTilemapToVram(0);
+ BagDestroyPocketScrollArrowPair();
+ Task_PrintSaleConfirmationText(taskId);
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ HideBagWindow(0);
+ HideBagWindow(2);
+ CloseBagWindow(5);
+ PutWindowTilemap(2);
+ PutWindowTilemap(0);
+ PutWindowTilemap(1);
+ ScheduleBgCopyTilemapToVram(0);
+ BagDestroyPocketScrollArrowPair();
+ bag_menu_print_cursor_(data[0], 1);
+ Task_RedrawArrowsAndReturnToBagMenuSelect(taskId);
+ }
+}
+
+static void Task_SellItem_Yes(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ PutWindowTilemap(0);
+ ScheduleBgCopyTilemapToVram(0);
+ CopyItemName(gSpecialVar_ItemId, gStringVar1);
+ ConvertIntToDecimalStringN(gStringVar3, itemid_get_market_price(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1])) / 2 * data[8], STR_CONV_MODE_LEFT_ALIGN, 6);
+ StringExpandPlaceholders(gStringVar4, gText_TurnedOverItemsWorthYen);
+ DisplayItemMessageInBag(taskId, 2, gStringVar4, Task_FinalizeSaleToShop);
+}
+
+static void Task_FinalizeSaleToShop(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ PlaySE(SE_SHOP);
+ RemoveBagItem(gSpecialVar_ItemId, data[8]);
+ AddMoney(&gSaveBlock1Ptr->money, itemid_get_market_price(gSpecialVar_ItemId) / 2 * data[8]);
+ RecordItemPurchase(gSpecialVar_ItemId, data[8], 2);
+ DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);
+ Pocket_CalculateNItemsAndMaxShowed(gBagMenuState.pocket);
+ PocketCalculateInitialCursorPosAndItemsAbove(gBagMenuState.pocket);
+ sBagMenuDisplay->inhibitItemDescriptionPrint = TRUE;
+ Bag_BuildListMenuTemplate(gBagMenuState.pocket);
+ data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]);
+ bag_menu_print_cursor_(data[0], 2);
+ BagDrawTextBoxOnWindow(GetBagWindow(2));
+ PrintMoneyAmountInMoneyBox(GetBagWindow(2), GetMoney(&gSaveBlock1Ptr->money), 0);
+ gTasks[taskId].func = Task_WaitPressAB_AfterSell;
+}
+
+static void Task_WaitPressAB_AfterSell(u8 taskId)
+{
+ if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ HideBagWindow(2);
+ PutWindowTilemap(2);
+ sBagMenuDisplay->inhibitItemDescriptionPrint = FALSE;
+ Task_ReturnToBagFromContextMenu(taskId);
+ }
+}
+
+static void Task_ItemContext_Deposit(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ data[8] = 1;
+ if (data[2] == 1)
+ {
+ Task_TryDoItemDeposit(taskId);
+ }
+ else
+ {
+ InitQuantityToTossOrDeposit(data[1], gText_DepositHowManyStrVars1);
+ gTasks[taskId].func = Task_SelectQuantityToDeposit;
+ }
+}
+
+static void Task_SelectQuantityToDeposit(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE)
+ {
+ UpdateQuantityToTossOrDeposit(data[8], 3);
+ }
+ else if (JOY_NEW(A_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ ClearWindowTilemap(GetBagWindow(6));
+ HideBagWindow(6);
+ HideBagWindow(0);
+ ScheduleBgCopyTilemapToVram(0);
+ BagDestroyPocketScrollArrowPair();
+ Task_TryDoItemDeposit(taskId);
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ HideBagWindow(6);
+ HideBagWindow(0);
+ PutWindowTilemap(1);
+ ScheduleBgCopyTilemapToVram(0);
+ bag_menu_print_cursor_(data[0], 1);
+ BagDestroyPocketScrollArrowPair();
+ Task_RedrawArrowsAndReturnToBagMenuSelect(taskId);
+ }
+}
+
+static void Task_TryDoItemDeposit(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (AddPCItem(gSpecialVar_ItemId, data[8]) == TRUE)
+ {
+ ItemUse_SetQuestLogEvent(28, 0, gSpecialVar_ItemId, 0xFFFF);
+ CopyItemName(gSpecialVar_ItemId, gStringVar1);
+ ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 3);
+ StringExpandPlaceholders(gStringVar4, gText_DepositedStrVar2StrVar1s);
+ BagPrintTextOnWindow(ShowBagWindow(6, 3), 2, gStringVar4, 0, 2, 1, 0, 0, 1);
+ gTasks[taskId].func = Task_WaitAB_RedrawAndReturnToBag;
+ }
+ else
+ {
+ DisplayItemMessageInBag(taskId, 2, gText_NoRoomToStoreItems, Task_WaitAButtonAndCloseContextMenu);
+ }
+}
+
+bool8 UseRegisteredKeyItemOnField(void)
+{
+ u8 taskId;
+ if (InUnionRoom() == TRUE)
+ return FALSE;
+ DismissMapNamePopup();
+ ChangeBgY(0, 0, 0);
+ if (gSaveBlock1Ptr->registeredItem != ITEM_NONE)
+ {
+ if (CheckBagHasItem(gSaveBlock1Ptr->registeredItem, 1) == TRUE)
+ {
+ ScriptContext2_Enable();
+ FreezeObjectEvents();
+ sub_805C270();
+ sub_805C780();
+ gSpecialVar_ItemId = gSaveBlock1Ptr->registeredItem;
+ taskId = CreateTask(ItemId_GetFieldFunc(gSaveBlock1Ptr->registeredItem), 8);
+ gTasks[taskId].data[3] = 1;
+ return TRUE;
+ }
+ gSaveBlock1Ptr->registeredItem = ITEM_NONE;
+ }
+ ScriptContext1_SetupScript(EventScript_BagItemCanBeRegistered);
+ return TRUE;
+}
+
+static bool8 BagIsTutorial(void)
+{
+ if (
+ gBagMenuState.location == ITEMMENULOCATION_OLD_MAN
+ || gBagMenuState.location == ITEMMENULOCATION_TTVSCR_CATCHING
+ || gBagMenuState.location == ITEMMENULOCATION_TTVSCR_STATUS
+ || gBagMenuState.location == ITEMMENULOCATION_TTVSCR_REGISTER
+ || gBagMenuState.location == ITEMMENULOCATION_TTVSCR_TMS
+ )
+ return TRUE;
+ return FALSE;
+}
+
+static void BackUpPlayerBag(void)
+{
+ u32 i;
+ sBackupPlayerBag = AllocZeroed(sizeof(struct BagSlots));
+ memcpy(sBackupPlayerBag->bagPocket_Items, gSaveBlock1Ptr->bagPocket_Items, BAG_ITEMS_COUNT * sizeof(struct ItemSlot));
+ memcpy(sBackupPlayerBag->bagPocket_KeyItems, gSaveBlock1Ptr->bagPocket_KeyItems, BAG_KEYITEMS_COUNT * sizeof(struct ItemSlot));
+ memcpy(sBackupPlayerBag->bagPocket_PokeBalls, gSaveBlock1Ptr->bagPocket_PokeBalls, BAG_POKEBALLS_COUNT * sizeof(struct ItemSlot));
+ sBackupPlayerBag->registeredItem = gSaveBlock1Ptr->registeredItem;
+ sBackupPlayerBag->pocket = gBagMenuState.pocket;
+ for (i = 0; i < 3; i++)
+ {
+ sBackupPlayerBag->itemsAbove[i] = gBagMenuState.itemsAbove[i];
+ sBackupPlayerBag->cursorPos[i] = gBagMenuState.cursorPos[i];
+ }
+ ClearItemSlots(gSaveBlock1Ptr->bagPocket_Items, BAG_ITEMS_COUNT);
+ ClearItemSlots(gSaveBlock1Ptr->bagPocket_KeyItems, BAG_KEYITEMS_COUNT);
+ ClearItemSlots(gSaveBlock1Ptr->bagPocket_PokeBalls, BAG_POKEBALLS_COUNT);
+ gSaveBlock1Ptr->registeredItem = ITEM_NONE;
+ ResetBagCursorPositions();
+}
+
+static void RestorePlayerBag(void)
+{
+ u32 i;
+ memcpy(gSaveBlock1Ptr->bagPocket_Items, sBackupPlayerBag->bagPocket_Items, BAG_ITEMS_COUNT * sizeof(struct ItemSlot));
+ memcpy(gSaveBlock1Ptr->bagPocket_KeyItems, sBackupPlayerBag->bagPocket_KeyItems, BAG_KEYITEMS_COUNT * sizeof(struct ItemSlot));
+ memcpy(gSaveBlock1Ptr->bagPocket_PokeBalls, sBackupPlayerBag->bagPocket_PokeBalls, BAG_POKEBALLS_COUNT * sizeof(struct ItemSlot));
+ gSaveBlock1Ptr->registeredItem = sBackupPlayerBag->registeredItem;
+ gBagMenuState.pocket = sBackupPlayerBag->pocket;
+ for (i = 0; i < 3; i++)
+ {
+ gBagMenuState.itemsAbove[i] = sBackupPlayerBag->itemsAbove[i];
+ gBagMenuState.cursorPos[i] = sBackupPlayerBag->cursorPos[i];
+ }
+ Free(sBackupPlayerBag);
+}
+
+void InitOldManBag(void)
+{
+ BackUpPlayerBag();
+ AddBagItem(ITEM_POTION, 1);
+ AddBagItem(ITEM_POKE_BALL, 1);
+ GoToBagMenu(ITEMMENULOCATION_OLD_MAN, OPEN_BAG_ITEMS, SetCB2ToReshowScreenAfterMenu2);
+}
+
+static void Task_Bag_OldManTutorial(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (!gPaletteFade.active)
+ {
+ switch (data[8])
+ {
+ case 102:
+ case 204:
+ PlaySE(SE_BAG2);
+ SwitchPockets(taskId, 1, FALSE);
+ break;
+ case 306:
+ PlaySE(SE_SELECT);
+ bag_menu_print_cursor_(data[0], 2);
+ Bag_FillMessageBoxWithPalette(1);
+ gSpecialVar_ItemId = ITEM_POKE_BALL;
+ OpenContextMenu(taskId);
+ break;
+ case 408:
+ PlaySE(SE_SELECT);
+ HideBagWindow(10);
+ HideBagWindow(6);
+ PutWindowTilemap(0);
+ PutWindowTilemap(1);
+ CopyWindowToVram(0, 1);
+ DestroyListMenuTask(data[0], NULL, NULL);
+ RestorePlayerBag();
+ Bag_BeginCloseWin0Animation();
+ gTasks[taskId].func = Task_Pokedude_FadeFromBag;
+ return;
+ }
+ data[8]++;
+ }
+}
+
+static void Task_Pokedude_FadeFromBag(u8 taskId)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, -2, 0, 16, RGB_BLACK);
+ gTasks[taskId].func = Task_Pokedude_WaitFadeAndExitBag;
+}
+
+static void Task_Pokedude_WaitFadeAndExitBag(u8 taskId)
+{
+ if (!gPaletteFade.active && FuncIsActiveTask(Task_AnimateWin0v) != TRUE)
+ {
+ if (sBagMenuDisplay->exitCB != NULL)
+ SetMainCallback2(sBagMenuDisplay->exitCB);
+ else
+ SetMainCallback2(gBagMenuState.bagCallback);
+ BagDestroyPocketScrollArrowPair();
+ DestroyBagMenuResources();
+ DestroyTask(taskId);
+ }
+}
+
+void InitPokedudeBag(u8 a0)
+{
+ MainCallback cb2;
+ u8 location;
+ BackUpPlayerBag();
+ AddBagItem(ITEM_POTION, 1);
+ AddBagItem(ITEM_ANTIDOTE, 1);
+ AddBagItem(ITEM_TEACHY_TV, 1);
+ AddBagItem(ITEM_TM_CASE, 1);
+ AddBagItem(ITEM_POKE_BALL, 5);
+ AddBagItem(ITEM_GREAT_BALL, 1);
+ AddBagItem(ITEM_NEST_BALL, 1);
+ switch (a0)
+ {
+ default:
+ cb2 = CB2_ReturnToTeachyTV;
+ location = a0;
+ break;
+ case 7:
+ cb2 = SetCB2ToReshowScreenAfterMenu2;
+ location = ITEMMENULOCATION_TTVSCR_STATUS;
+ break;
+ case 8:
+ cb2 = SetCB2ToReshowScreenAfterMenu2;
+ location = ITEMMENULOCATION_TTVSCR_CATCHING;
+ break;
+ }
+ GoToBagMenu(location, OPEN_BAG_ITEMS, cb2);
+}
+
+static bool8 Task_BButtonInterruptTeachyTv(u8 taskId)
+{
+ if (JOY_NEW(B_BUTTON))
+ {
+ RestorePlayerBag();
+ SetTeachyTvControllerModeToResume();
+ sBagMenuDisplay->exitCB = CB2_ReturnToTeachyTV;
+ gTasks[taskId].func = Task_Pokedude_FadeFromBag;
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+static void Task_Bag_TeachyTvRegister(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (!gPaletteFade.active && Task_BButtonInterruptTeachyTv(taskId) != TRUE)
+ {
+ switch (data[8])
+ {
+ case 102:
+ PlaySE(SE_BAG2);
+ SwitchPockets(taskId, 1, FALSE);
+ break;
+ case 204:
+ PlaySE(SE_SELECT);
+ bag_menu_print_cursor_(data[0], 2);
+ Bag_FillMessageBoxWithPalette(1);
+ gSpecialVar_ItemId = ITEM_TEACHY_TV;
+ OpenContextMenu(taskId);
+ break;
+ case 306:
+ PlaySE(SE_SELECT);
+ Menu_MoveCursorNoWrapAround(1);
+ break;
+ case 408:
+ PlaySE(SE_SELECT);
+ gSaveBlock1Ptr->registeredItem = gSpecialVar_ItemId;
+ HideBagWindow(10);
+ HideBagWindow(6);
+ PutWindowTilemap(0);
+ PutWindowTilemap(1);
+ DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);
+ Bag_BuildListMenuTemplate(gBagMenuState.pocket);
+ data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]);
+ Bag_FillMessageBoxWithPalette(0);
+ bag_menu_print_cursor_(data[0], 1);
+ CopyWindowToVram(0, 1);
+ break;
+ case 510:
+ case 612:
+ gMain.newKeys = 0;
+ gMain.newAndRepeatedKeys = DPAD_DOWN;
+ ListMenu_ProcessInput(data[0]);
+ break;
+ case 714:
+ PlaySE(SE_SELECT);
+ DestroyListMenuTask(data[0], NULL, NULL);
+ RestorePlayerBag();
+ Bag_BeginCloseWin0Animation();
+ gTasks[taskId].func = Task_Pokedude_FadeFromBag;
+ return;
+ }
+ data[8]++;
+ }
+}
+
+static void Task_Bag_TeachyTvCatching(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (!gPaletteFade.active)
+ {
+ if (Task_BButtonInterruptTeachyTv(taskId) == TRUE)
+ {
+ FreeRestoreBattleData();
+ LoadPlayerParty();
+ return;
+ }
+ switch (data[8])
+ {
+ case 102:
+ case 204:
+ PlaySE(SE_BAG2);
+ SwitchPockets(taskId, 1, FALSE);
+ break;
+ case 306:
+ case 408:
+ gMain.newKeys = 0;
+ gMain.newAndRepeatedKeys = DPAD_DOWN;
+ ListMenu_ProcessInput(data[0]);
+ break;
+ case 510:
+ case 612:
+ gMain.newKeys = 0;
+ gMain.newAndRepeatedKeys = DPAD_UP;
+ ListMenu_ProcessInput(data[0]);
+ break;
+ case 714:
+ PlaySE(SE_SELECT);
+ bag_menu_print_cursor_(data[0], 2);
+ Bag_FillMessageBoxWithPalette(1);
+ gSpecialVar_ItemId = ITEM_POKE_BALL;
+ OpenContextMenu(taskId);
+ break;
+ case 816:
+ PlaySE(SE_SELECT);
+ HideBagWindow(10);
+ HideBagWindow(6);
+ PutWindowTilemap(0);
+ PutWindowTilemap(1);
+ CopyWindowToVram(0, 1);
+ DestroyListMenuTask(data[0], NULL, NULL);
+ RestorePlayerBag();
+ Bag_BeginCloseWin0Animation();
+ gTasks[taskId].func = Task_Pokedude_FadeFromBag;
+ return;
+ }
+ data[8]++;
+ }
+}
+
+static void Task_Bag_TeachyTvStatus(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (!gPaletteFade.active)
+ {
+ if (Task_BButtonInterruptTeachyTv(taskId) == TRUE)
+ {
+ FreeRestoreBattleData();
+ LoadPlayerParty();
+ return;
+ }
+ switch (data[8])
+ {
+ case 102:
+ gMain.newKeys = 0;
+ gMain.newAndRepeatedKeys = DPAD_DOWN;
+ ListMenu_ProcessInput(data[0]);
+ break;
+ case 204:
+ PlaySE(SE_SELECT);
+ bag_menu_print_cursor_(data[0], 2);
+ Bag_FillMessageBoxWithPalette(1);
+ gSpecialVar_ItemId = ITEM_ANTIDOTE;
+ OpenContextMenu(taskId);
+ break;
+ case 306:
+ PlaySE(SE_SELECT);
+ HideBagWindow(10);
+ HideBagWindow(6);
+ PutWindowTilemap(0);
+ PutWindowTilemap(1);
+ CopyWindowToVram(0, 1);
+ DestroyListMenuTask(data[0], NULL, NULL);
+ RestorePlayerBag();
+ gItemUseCB = ItemUseCB_MedicineStep;
+ ItemMenu_SetExitCallback(ChooseMonForInBattleItem);
+ gTasks[taskId].func = Task_Pokedude_FadeFromBag;
+ return;
+ }
+ data[8]++;
+ }
+}
+
+static void Task_Bag_TeachyTvTMs(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (!gPaletteFade.active && Task_BButtonInterruptTeachyTv(taskId) != TRUE)
+ {
+ switch (data[8])
+ {
+ case 102:
+ PlaySE(SE_BAG2);
+ SwitchPockets(taskId, 1, 0);
+ break;
+ case 204:
+ gMain.newKeys = 0;
+ gMain.newAndRepeatedKeys = DPAD_DOWN;
+ ListMenu_ProcessInput(data[0]);
+ break;
+ case 306:
+ PlaySE(SE_SELECT);
+ bag_menu_print_cursor_(data[0], 2);
+ Bag_FillMessageBoxWithPalette(1);
+ gSpecialVar_ItemId = ITEM_TM_CASE;
+ OpenContextMenu(taskId);
+ break;
+ case 408:
+ PlaySE(SE_SELECT);
+ HideBagWindow(10);
+ HideBagWindow(6);
+ PutWindowTilemap(0);
+ PutWindowTilemap(1);
+ CopyWindowToVram(0, 1);
+ DestroyListMenuTask(data[0], NULL, NULL);
+ RestorePlayerBag();
+ sBagMenuDisplay->exitCB = Pokedude_InitTMCase;
+ gTasks[taskId].func = Task_Pokedude_FadeFromBag;
+ return;
+ }
+ data[8]++;
+ }
+}
diff --git a/src/item_menu_icons.c b/src/item_menu_icons.c
index 0c2c60437..d389c7781 100644
--- a/src/item_menu_icons.c
+++ b/src/item_menu_icons.c
@@ -5,14 +5,14 @@
#include "malloc.h"
#include "constants/items.h"
-static EWRAM_DATA u8 gUnknown_2039878[12] = {0};
-EWRAM_DATA void * gUnknown_2039884 = NULL;
-static EWRAM_DATA void * gUnknown_2039888 = NULL;
+static EWRAM_DATA u8 sItemMenuIconSpriteIds[12] = {0};
+static EWRAM_DATA void * sItemIconTilesBuffer = NULL;
+static EWRAM_DATA void * sItemIconTilesBufferPadded = NULL;
static void sub_8098560(struct Sprite * sprite);
static void sub_80985BC(struct Sprite * sprite);
-static const struct OamData gUnknown_83D416C = {
+static const struct OamData sOamData_BagOrSatchel = {
.affineMode = ST_OAM_AFFINE_NORMAL,
.shape = ST_OAM_SQUARE,
.size = 3,
@@ -20,36 +20,36 @@ static const struct OamData gUnknown_83D416C = {
.paletteNum = 0
};
-static const union AnimCmd gUnknown_83D4174[] = {
+static const union AnimCmd sAnim_BagOrSatchel_OpenItemPocket[] = {
ANIMCMD_FRAME( 0, 5),
ANIMCMD_FRAME(0x40, 0),
ANIMCMD_END
};
-static const union AnimCmd gUnknown_83D4180[] = {
+static const union AnimCmd sAnim_BagOrSatchel_OpenKeyItemPocket[] = {
ANIMCMD_FRAME( 0, 5),
ANIMCMD_FRAME(0x80, 0),
ANIMCMD_END
};
-static const union AnimCmd gUnknown_83D418C[] = {
+static const union AnimCmd sAnim_BagOrSatchel_OpenPokeBallsPocket[] = {
ANIMCMD_FRAME( 0, 5),
ANIMCMD_FRAME(0xc0, 0),
ANIMCMD_END
};
-static const union AnimCmd *const gUnknown_83D4198[] = {
- gUnknown_83D4180,
- gUnknown_83D418C,
- gUnknown_83D4174
+static const union AnimCmd *const sAnimTable_BagOrSatchel[] = {
+ sAnim_BagOrSatchel_OpenKeyItemPocket,
+ sAnim_BagOrSatchel_OpenPokeBallsPocket,
+ sAnim_BagOrSatchel_OpenItemPocket
};
-static const union AffineAnimCmd gUnknown_83D41A4[] = {
+static const union AffineAnimCmd sAffineAnim_Idle[] = {
AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
AFFINEANIMCMD_END
};
-static const union AffineAnimCmd gUnknown_83D41B4[] = {
+static const union AffineAnimCmd sAffineAnim_Wobble[] = {
AFFINEANIMCMD_FRAME(0, 0, -2, 2),
AFFINEANIMCMD_FRAME(0, 0, 2, 4),
AFFINEANIMCMD_FRAME(0, 0, -2, 4),
@@ -57,35 +57,35 @@ static const union AffineAnimCmd gUnknown_83D41B4[] = {
AFFINEANIMCMD_END
};
-static const union AffineAnimCmd *const gUnknown_83D41DC[] = {
- gUnknown_83D41A4,
- gUnknown_83D41B4
+static const union AffineAnimCmd *const sAffineAnimTable_BagOrSatchel[] = {
+ sAffineAnim_Idle,
+ sAffineAnim_Wobble
};
-const struct CompressedSpriteSheet gUnknown_83D41E4 = {
+const struct CompressedSpriteSheet gSpriteSheet_Backpack = {
gUnknown_8E8362C,
0x2000,
100
};
-const struct CompressedSpriteSheet gUnknown_83D41EC = {
+const struct CompressedSpriteSheet gSpriteSheet_Satchel = {
gUnknown_8E83DBC,
0x2000,
100
};
-const struct CompressedSpritePalette gUnknown_83D41F4 = {
+const struct CompressedSpritePalette gSpritePalette_BagOrSatchel = {
gUnknown_8E84560,
100
};
-static const struct SpriteTemplate gUnknown_83D41FC = {
+static const struct SpriteTemplate sSpriteTemplate_BagOrSatchel = {
100,
100,
- &gUnknown_83D416C,
- gUnknown_83D4198,
+ &sOamData_BagOrSatchel,
+ sAnimTable_BagOrSatchel,
NULL,
- gUnknown_83D41DC,
+ sAffineAnimTable_BagOrSatchel,
SpriteCallbackDummy
};
@@ -139,7 +139,7 @@ static const struct SpriteTemplate gUnknown_83D4250 = {
SpriteCallbackDummy
};
-static const struct OamData gUnknown_83D4268 = {
+static const struct OamData sOamData_ItemIcon = {
.affineMode = ST_OAM_AFFINE_OFF,
.shape = ST_OAM_SQUARE,
.size = 2,
@@ -147,26 +147,26 @@ static const struct OamData gUnknown_83D4268 = {
.paletteNum = 2
};
-static const union AnimCmd gUnknown_83D4270[] = {
+static const union AnimCmd sAnim_ItemIcon_0[] = {
ANIMCMD_FRAME(0, 0),
ANIMCMD_END
};
-static const union AnimCmd *const gUnknown_83D4278[] = {
- gUnknown_83D4270
+static const union AnimCmd *const sAnimTable_ItemIcon[] = {
+ sAnim_ItemIcon_0
};
-static const struct SpriteTemplate gUnknown_83D427C = {
+static const struct SpriteTemplate sSpriteTemplate_ItemIcon = {
102,
102,
- &gUnknown_83D4268,
- gUnknown_83D4278,
+ &sOamData_ItemIcon,
+ sAnimTable_ItemIcon,
NULL,
gDummySpriteAffineAnimTable,
SpriteCallbackDummy
};
-static const void *const gUnknown_83D4294[][2] = {
+static const void *const sItemIconGfxPtrs[][2] = {
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
{gFile_graphics_items_icons_master_ball_sheet, gFile_graphics_items_icon_palettes_master_ball_palette},
{gFile_graphics_items_icons_ultra_ball_sheet, gFile_graphics_items_icon_palettes_ultra_ball_palette},
@@ -549,19 +549,19 @@ void ResetItemMenuIconState(void)
{
u16 i;
- for (i = 0; i < NELEMS(gUnknown_2039878); i++)
- gUnknown_2039878[i] = 0xFF;
+ for (i = 0; i < NELEMS(sItemMenuIconSpriteIds); i++)
+ sItemMenuIconSpriteIds[i] = 0xFF;
}
-void sub_80984FC(u8 animNum)
+void CreateBagOrSatchelSprite(u8 animNum)
{
- gUnknown_2039878[0] = CreateSprite(&gUnknown_83D41FC, 40, 68, 0);
+ sItemMenuIconSpriteIds[0] = CreateSprite(&sSpriteTemplate_BagOrSatchel, 40, 68, 0);
sub_8098528(animNum);
}
void sub_8098528(u8 animNum)
{
- struct Sprite * sprite = &gSprites[gUnknown_2039878[0]];
+ struct Sprite * sprite = &gSprites[sItemMenuIconSpriteIds[0]];
sprite->pos2.y = -5;
sprite->callback = sub_8098560;
StartSpriteAnim(sprite, animNum);
@@ -577,7 +577,7 @@ static void sub_8098560(struct Sprite * sprite)
void sub_8098580(void)
{
- struct Sprite * sprite = &gSprites[gUnknown_2039878[0]];
+ struct Sprite * sprite = &gSprites[sItemMenuIconSpriteIds[0]];
if (sprite->affineAnimEnded)
{
StartSpriteAffineAnim(sprite, 1);
@@ -594,40 +594,44 @@ static void sub_80985BC(struct Sprite * sprite)
}
}
-void sub_80985E4(void)
+void ItemMenuIcons_CreateInsertIndicatorBarHidden(void)
{
u8 i;
- u8 * ptr = &gUnknown_2039878[1];
+ u8 * ptr = &sItemMenuIconSpriteIds[1];
for (i = 0; i < 9; i++)
{
ptr[i] = CreateSprite(&gUnknown_83D4250, i * 16 + 0x60, 7, 0);
- if (i != 0)
+ switch (i)
{
- if (i == 8)
- StartSpriteAnim(&gSprites[ptr[i]], 2);
- else
- StartSpriteAnim(&gSprites[ptr[i]], 1);
+ case 0:
+ break;
+ case 8:
+ StartSpriteAnim(&gSprites[ptr[i]], 2);
+ break;
+ default:
+ StartSpriteAnim(&gSprites[ptr[i]], 1);
+ break;
}
gSprites[ptr[i]].invisible = TRUE;
}
}
-void sub_8098660(u8 flag)
+void ItemMenuIcons_ToggleInsertIndicatorBarVisibility(bool8 invisible)
{
u8 i;
- u8 * ptr = &gUnknown_2039878[1];
+ u8 * ptr = &sItemMenuIconSpriteIds[1];
for (i = 0; i < 9; i++)
{
- gSprites[ptr[i]].invisible = flag;
+ gSprites[ptr[i]].invisible = invisible;
}
}
-void sub_80986A8(s16 x, u16 y)
+void ItemMenuIcons_MoveInsertIndicatorBar(s16 x, u16 y)
{
u8 i;
- u8 * ptr = &gUnknown_2039878[1];
+ u8 * ptr = &sItemMenuIconSpriteIds[1];
for (i = 0; i < 9; i++)
{
@@ -636,15 +640,15 @@ void sub_80986A8(s16 x, u16 y)
}
}
-static bool8 sub_80986EC(void)
+static bool8 TryAllocItemIconTilesBuffers(void)
{
void ** ptr1, ** ptr2;
- ptr1 = &gUnknown_2039884;
+ ptr1 = &sItemIconTilesBuffer;
*ptr1 = Alloc(0x120);
if (*ptr1 == NULL)
return FALSE;
- ptr2 = &gUnknown_2039888;
+ ptr2 = &sItemIconTilesBufferPadded;
*ptr2 = AllocZeroed(0x200);
if (*ptr2 == NULL)
{
@@ -671,27 +675,27 @@ u8 AddItemIconObject(u16 tilesTag, u16 paletteTag, u16 itemId)
struct CompressedSpritePalette spritePalette;
u8 spriteId;
- if (!sub_80986EC())
+ if (!TryAllocItemIconTilesBuffers())
return MAX_SPRITES;
- LZDecompressWram(sub_8098974(itemId, 0), gUnknown_2039884);
- CopyItemIconPicTo4x4Buffer(gUnknown_2039884, gUnknown_2039888);
- spriteSheet.data = gUnknown_2039888;
+ LZDecompressWram(GetItemIconGfxPtr(itemId, 0), sItemIconTilesBuffer);
+ CopyItemIconPicTo4x4Buffer(sItemIconTilesBuffer, sItemIconTilesBufferPadded);
+ spriteSheet.data = sItemIconTilesBufferPadded;
spriteSheet.size = 0x200;
spriteSheet.tag = tilesTag;
LoadSpriteSheet(&spriteSheet);
- spritePalette.data = sub_8098974(itemId, 1);
+ spritePalette.data = GetItemIconGfxPtr(itemId, 1);
spritePalette.tag = paletteTag;
LoadCompressedSpritePalette(&spritePalette);
- CpuCopy16(&gUnknown_83D427C, &template, sizeof(struct SpriteTemplate));
+ CpuCopy16(&sSpriteTemplate_ItemIcon, &template, sizeof(struct SpriteTemplate));
template.tileTag = tilesTag;
template.paletteTag = paletteTag;
spriteId = CreateSprite(&template, 0, 0, 0);
- Free(gUnknown_2039884);
- Free(gUnknown_2039888);
+ Free(sItemIconTilesBuffer);
+ Free(sItemIconTilesBufferPadded);
return spriteId;
}
@@ -702,17 +706,17 @@ u8 AddItemIconObjectWithCustomObjectTemplate(const struct SpriteTemplate * origT
struct CompressedSpritePalette spritePalette;
u8 spriteId;
- if (!sub_80986EC())
+ if (!TryAllocItemIconTilesBuffers())
return MAX_SPRITES;
- LZDecompressWram(sub_8098974(itemId, 0), gUnknown_2039884);
- CopyItemIconPicTo4x4Buffer(gUnknown_2039884, gUnknown_2039888);
- spriteSheet.data = gUnknown_2039888;
+ LZDecompressWram(GetItemIconGfxPtr(itemId, 0), sItemIconTilesBuffer);
+ CopyItemIconPicTo4x4Buffer(sItemIconTilesBuffer, sItemIconTilesBufferPadded);
+ spriteSheet.data = sItemIconTilesBufferPadded;
spriteSheet.size = 0x200;
spriteSheet.tag = tilesTag;
LoadSpriteSheet(&spriteSheet);
- spritePalette.data = sub_8098974(itemId, 1);
+ spritePalette.data = GetItemIconGfxPtr(itemId, 1);
spritePalette.tag = paletteTag;
LoadCompressedSpritePalette(&spritePalette);
@@ -721,14 +725,14 @@ u8 AddItemIconObjectWithCustomObjectTemplate(const struct SpriteTemplate * origT
template.paletteTag = paletteTag;
spriteId = CreateSprite(&template, 0, 0, 0);
- Free(gUnknown_2039884);
- Free(gUnknown_2039888);
+ Free(sItemIconTilesBuffer);
+ Free(sItemIconTilesBufferPadded);
return spriteId;
}
void CreateItemMenuIcon(u16 itemId, u8 idx)
{
- u8 * ptr = &gUnknown_2039878[10];
+ u8 * ptr = &sItemMenuIconSpriteIds[10];
u8 spriteId;
if (ptr[idx] == 0xFF)
@@ -747,7 +751,7 @@ void CreateItemMenuIcon(u16 itemId, u8 idx)
void DestroyItemMenuIcon(u8 idx)
{
- u8 * ptr = &gUnknown_2039878[10];
+ u8 * ptr = &sItemMenuIconSpriteIds[10];
if (ptr[idx] != 0xFF)
{
@@ -756,16 +760,16 @@ void DestroyItemMenuIcon(u8 idx)
}
}
-const void * sub_8098974(u16 itemId, u8 attrId)
+const void * GetItemIconGfxPtr(u16 itemId, u8 attrId)
{
if (itemId > ITEM_N_A)
itemId = ITEM_NONE;
- return gUnknown_83D4294[itemId][attrId];
+ return sItemIconGfxPtrs[itemId][attrId];
}
void sub_80989A0(u16 itemId, u8 idx)
{
- u8 * ptr = &gUnknown_2039878[10];
+ u8 * ptr = &sItemMenuIconSpriteIds[10];
u8 spriteId;
if (ptr[idx] == 0xFF)
diff --git a/src/item_pc.c b/src/item_pc.c
index 217acc829..7c7abdce3 100644
--- a/src/item_pc.c
+++ b/src/item_pc.c
@@ -348,7 +348,7 @@ static bool8 ItemPc_DoGfxSetup(void)
gMain.state++;
break;
case 14:
- sub_80985E4();
+ ItemMenuIcons_CreateInsertIndicatorBarHidden();
gMain.state++;
break;
case 15:
@@ -780,8 +780,8 @@ static void ItemPc_MoveItemModeInit(u8 taskId, s16 pos)
StringExpandPlaceholders(gStringVar4, gOtherText_WhereShouldTheStrVar1BePlaced);
FillWindowPixelBuffer(1, 0x00);
ItemPc_AddTextPrinterParameterized(1, 2, gStringVar4, 0, 3, 2, 3, 0, 0);
- sub_80986A8(-32, ListMenuGetYCoordForPrintingArrowCursor(data[0]));
- sub_8098660(0);
+ ItemMenuIcons_MoveInsertIndicatorBar(-32, ListMenuGetYCoordForPrintingArrowCursor(data[0]));
+ ItemMenuIcons_ToggleInsertIndicatorBarVisibility(FALSE);
ItemPc_PrintOrRemoveCursor(data[0], 2);
gTasks[taskId].func = Task_ItemPcMoveItemModeRun;
}
@@ -792,7 +792,7 @@ static void Task_ItemPcMoveItemModeRun(u8 taskId)
ListMenu_ProcessInput(data[0]);
ListMenuGetScrollAndRow(data[0], &sListMenuState.scroll, &sListMenuState.row);
- sub_80986A8(-32, ListMenuGetYCoordForPrintingArrowCursor(data[0]));
+ ItemMenuIcons_MoveInsertIndicatorBar(-32, ListMenuGetYCoordForPrintingArrowCursor(data[0]));
if (JOY_NEW(A_BUTTON | SELECT_BUTTON))
{
PlaySE(SE_SELECT);
@@ -814,13 +814,13 @@ static void ItemPc_InsertItemIntoNewSlot(u8 taskId, u32 pos)
ItemPc_MoveItemModeCancel(taskId, pos);
else
{
- ItemMenu_MoveItemSlotToNewPositionInArray(gSaveBlock1Ptr->pcItems, data[1], pos);
+ MoveItemSlotInList(gSaveBlock1Ptr->pcItems, data[1], pos);
DestroyListMenuTask(data[0], &sListMenuState.scroll, &sListMenuState.row);
if (data[1] < pos)
sListMenuState.row--;
ItemPc_BuildListMenuTemplate();
data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sListMenuState.scroll, sListMenuState.row);
- sub_8098660(1);
+ ItemMenuIcons_ToggleInsertIndicatorBarVisibility(TRUE);
gTasks[taskId].func = Task_ItemPcMain;
}
}
@@ -834,7 +834,7 @@ static void ItemPc_MoveItemModeCancel(u8 taskId, u32 pos)
sListMenuState.row--;
ItemPc_BuildListMenuTemplate();
data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sListMenuState.scroll, sListMenuState.row);
- sub_8098660(1);
+ ItemMenuIcons_ToggleInsertIndicatorBarVisibility(TRUE);
gTasks[taskId].func = Task_ItemPcMain;
}
diff --git a/src/item_use.c b/src/item_use.c
index d5db22ca1..57771754a 100644
--- a/src/item_use.c
+++ b/src/item_use.c
@@ -154,7 +154,7 @@ static void sub_80A0FBC(u8 taskId)
{
ItemMenu_SetExitCallback(gUnknown_83E2954[itemType]);
if (itemType == 1)
- sub_8108CB4();
+ Bag_BeginCloseWin0Animation();
ItemMenu_StartFadeToExitCallback(taskId);
}
}
@@ -188,7 +188,7 @@ static void sub_80A10C4(u8 taskId, bool8 a1, u8 a2, const u8 * str)
{
StringExpandPlaceholders(gStringVar4, str);
if (a1 == FALSE)
- DisplayItemMessageInBag(taskId, a2, gStringVar4, sub_810A1F8);
+ DisplayItemMessageInBag(taskId, a2, gStringVar4, Task_ReturnToBagFromContextMenu);
else
DisplayItemMessageOnField(taskId, a2, gStringVar4, sub_80A112C);
}
@@ -345,7 +345,7 @@ void FieldUseFunc_CoinCase(u8 taskId)
StringExpandPlaceholders(gStringVar4, gUnknown_8416537);
ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF);
if (gTasks[taskId].data[3] == 0)
- DisplayItemMessageInBag(taskId, 2, gStringVar4, sub_810A1F8);
+ DisplayItemMessageInBag(taskId, 2, gStringVar4, Task_ReturnToBagFromContextMenu);
else
DisplayItemMessageOnField(taskId, 2, gStringVar4, sub_80A112C);
}
@@ -356,7 +356,7 @@ void FieldUseFunc_PowderJar(u8 taskId)
StringExpandPlaceholders(gStringVar4, gUnknown_8416644);
ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF);
if (gTasks[taskId].data[3] == 0)
- DisplayItemMessageInBag(taskId, 2, gStringVar4, sub_810A1F8);
+ DisplayItemMessageInBag(taskId, 2, gStringVar4, Task_ReturnToBagFromContextMenu);
else
DisplayItemMessageOnField(taskId, 2, gStringVar4, sub_80A112C);
}
@@ -384,7 +384,7 @@ void FieldUseFunc_PokeFlute(u8 taskId)
{
// Now that's a catchy tune!
if (gTasks[taskId].data[3] == 0)
- DisplayItemMessageInBag(taskId, 2, gUnknown_841665C, sub_810A1F8);
+ DisplayItemMessageInBag(taskId, 2, gUnknown_841665C, Task_ReturnToBagFromContextMenu);
else
DisplayItemMessageOnField(taskId, 2, gUnknown_841665C, sub_80A112C);
}
@@ -401,7 +401,7 @@ static void sub_80A1674(u8 taskId)
if (WaitFanfare(FALSE))
{
if (gTasks[taskId].data[3] == 0)
- DisplayItemMessageInBag(taskId, 2, gUnknown_84166A7, sub_810A1F8);
+ DisplayItemMessageInBag(taskId, 2, gUnknown_84166A7, Task_ReturnToBagFromContextMenu);
else
DisplayItemMessageOnField(taskId, 2, gUnknown_84166A7, sub_80A112C);
}
@@ -458,7 +458,7 @@ void FieldUseFunc_TmCase(u8 taskId)
else
{
StopPokemonLeagueLightingEffectTask();
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].func = Task_InitTMCaseFromField;
}
}
@@ -489,7 +489,7 @@ void FieldUseFunc_BerryPouch(u8 taskId)
else
{
StopPokemonLeagueLightingEffectTask();
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].func = Task_InitBerryPouchFromField;
}
}
@@ -518,7 +518,7 @@ void BattleUseFunc_BerryPouch(u8 taskId)
static void InitBerryPouchFromBattle(void)
{
- InitBerryPouch(BERRYPOUCH_FROMBATTLE, sub_8107ECC, 0);
+ InitBerryPouch(BERRYPOUCH_FROMBATTLE, CB2_BagMenuFromBattle, 0);
}
void FieldUseFunc_TeachyTv(u8 taskId)
@@ -532,7 +532,7 @@ void FieldUseFunc_TeachyTv(u8 taskId)
else
{
StopPokemonLeagueLightingEffectTask();
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].func = Task_InitTeachyTvFromField;
}
}
@@ -562,7 +562,7 @@ void FieldUseFunc_SuperRepel(u8 taskId)
}
else
// An earlier repel is still in effect
- DisplayItemMessageInBag(taskId, 2, gUnknown_841659E, sub_810A1F8);
+ DisplayItemMessageInBag(taskId, 2, gUnknown_841659E, Task_ReturnToBagFromContextMenu);
}
static void sub_80A19E8(u8 taskId)
@@ -572,15 +572,15 @@ static void sub_80A19E8(u8 taskId)
ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF);
VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gSpecialVar_ItemId));
sub_80A1A44();
- DisplayItemMessageInBag(taskId, 2, gStringVar4, sub_810A1F8);
+ DisplayItemMessageInBag(taskId, 2, gStringVar4, Task_ReturnToBagFromContextMenu);
}
}
static void sub_80A1A44(void)
{
RemoveBagItem(gSpecialVar_ItemId, 1);
- sub_8108DC8(ItemId_GetPocket(gSpecialVar_ItemId));
- sub_81089F4(ItemId_GetPocket(gSpecialVar_ItemId));
+ Pocket_CalculateNItemsAndMaxShowed(ItemId_GetPocket(gSpecialVar_ItemId));
+ PocketCalculateInitialCursorPosAndItemsAbove(ItemId_GetPocket(gSpecialVar_ItemId));
CopyItemName(gSpecialVar_ItemId, gStringVar2);
StringExpandPlaceholders(gStringVar4, gUnknown_841658C);
}
@@ -613,7 +613,7 @@ static void sub_80A1B48(u8 taskId)
if (++gTasks[taskId].data[8] > 7)
{
PlaySE(SE_BIDORO);
- DisplayItemMessageInBag(taskId, 2, gStringVar4, sub_810A1F8);
+ DisplayItemMessageInBag(taskId, 2, gStringVar4, Task_ReturnToBagFromContextMenu);
}
}
@@ -662,7 +662,7 @@ void FieldUseFunc_TownMap(u8 taskId)
else
{
StopPokemonLeagueLightingEffectTask();
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].func = sub_80A1CC0;
}
}
@@ -694,7 +694,7 @@ void FieldUseFunc_FameChecker(u8 taskId)
else
{
StopPokemonLeagueLightingEffectTask();
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].func = sub_80A1D68;
}
}
@@ -745,18 +745,18 @@ void BattleUseFunc_PokeBallEtc(u8 taskId)
if (!IsPlayerPartyAndPokemonStorageFull())
{
RemoveBagItem(gSpecialVar_ItemId, 1);
- sub_8108CB4();
+ Bag_BeginCloseWin0Animation();
ItemMenu_StartFadeToExitCallback(taskId);
}
else
{
- DisplayItemMessageInBag(taskId, 2, gUnknown_8416631, sub_810A1F8);
+ DisplayItemMessageInBag(taskId, 2, gUnknown_8416631, Task_ReturnToBagFromContextMenu);
}
}
void BattleUseFunc_PokeFlute(u8 taskId)
{
- sub_8108CB4();
+ Bag_BeginCloseWin0Animation();
ItemMenu_StartFadeToExitCallback(taskId);
}
@@ -764,7 +764,7 @@ void BattleUseFunc_GuardSpec(u8 taskId)
{
if (ExecuteTableBasedItemEffect(&gPlayerParty[gBattlerPartyIndexes[gBattlerInMenuId]], gSpecialVar_ItemId, gBattlerPartyIndexes[gBattlerInMenuId], 0))
{
- DisplayItemMessageInBag(taskId, 2, gText_WontHaveEffect, sub_810A1F8);
+ DisplayItemMessageInBag(taskId, 2, gText_WontHaveEffect, Task_ReturnToBagFromContextMenu);
}
else
{
@@ -790,7 +790,7 @@ static void Task_BattleUse_StatBooster_WaitButton_ReturnToBattle(u8 taskId)
{
if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))
{
- sub_8108CB4();
+ Bag_BeginCloseWin0Animation();
ItemMenu_StartFadeToExitCallback(taskId);
}
}
diff --git a/src/link_rfu_2.c b/src/link_rfu_2.c
index 41fe72e20..17f604ee8 100644
--- a/src/link_rfu_2.c
+++ b/src/link_rfu_2.c
@@ -1917,7 +1917,7 @@ void ClearAndInitHostRFUtgtGname(void)
InitHostRFUtgtGname(&gHostRFUtgtGnameBuffer, 0, 0, 0);
}
-void sub_80FAF58(u8 a0, u32 a1, u32 a2)
+void SetHostRFUtgtGname(u8 a0, u32 a1, u32 a2)
{
InitHostRFUtgtGname(&gHostRFUtgtGnameBuffer, a0, a2, a1);
}
@@ -1944,7 +1944,7 @@ void sub_80FAFE0(u8 a0)
void sub_80FB008(u8 a0, u32 a1, u32 a2)
{
if (a0)
- sub_80FAF58(a0, a1, a2);
+ SetHostRFUtgtGname(a0, a1, a2);
rfu_REQ_configGameData(0, 2, (void *)&gHostRFUtgtGnameBuffer, gHostRFUtgtUnameBuffer);
}
diff --git a/src/link_rfu_3.c b/src/link_rfu_3.c
index 87197f57f..31ea0830b 100644
--- a/src/link_rfu_3.c
+++ b/src/link_rfu_3.c
@@ -603,7 +603,7 @@ static u8 GetConnectedChildStrength(u8 maxFlags)
}
#endif
-void InitHostRFUtgtGname(struct GFtgtGname *data, u8 r9, bool32 r2, s32 r3)
+void InitHostRFUtgtGname(struct GFtgtGname *data, u8 activity, bool32 r2, s32 r3)
{
s32 i;
@@ -617,7 +617,7 @@ void InitHostRFUtgtGname(struct GFtgtGname *data, u8 r9, bool32 r2, s32 r3)
r3 >>= 8;
}
data->playerGender = gSaveBlock2Ptr->playerGender;
- data->unk_0a_0 = r9;
+ data->unk_0a_0 = activity;
data->unk_0a_7 = r2;
data->unk_00.unk_00_0 = GAME_LANGUAGE;
data->unk_00.unk_01_2 = GAME_VERSION;
@@ -681,7 +681,7 @@ bool8 sub_80FCCF4(struct GFtgtGname *gname, u8 *uname, u8 idx)
return retVal;
}
-void sub_80FCD50(struct GFtgtGname *gname, u8 *uname)
+void LinkRfu3_SetGnameUnameFromStaticBuffers(struct GFtgtGname *gname, u8 *uname)
{
memcpy(gname, &gHostRFUtgtGnameBuffer, RFU_GAME_NAME_LENGTH);
memcpy(uname, gHostRFUtgtUnameBuffer, RFU_USER_NAME_LENGTH);
@@ -929,7 +929,7 @@ void RecordMixTrainerNames(void)
}
}
-bool32 sub_80FD338(u16 id, u8 *name)
+bool32 PlayerHasMetTrainerBefore(u16 id, u8 *name)
{
s32 i;
diff --git a/src/menu_helpers.c b/src/menu_helpers.c
index 905e3c1ea..dedd7aa9e 100644
--- a/src/menu_helpers.c
+++ b/src/menu_helpers.c
@@ -107,7 +107,7 @@ bool8 itemid_link_can_give_berry(u16 itemId)
return FALSE;
}
-bool8 itemid_80BF6D8_mail_related(u16 itemId)
+bool8 CanWriteMailHere(u16 itemId)
{
if (IsUpdateLinkStateCBActive() != TRUE && InUnionRoom() != TRUE)
return TRUE;
@@ -242,7 +242,7 @@ bool8 AdjustQuantityAccordingToDPadInput(s16 *arg0, u16 arg1)
return FALSE;
}
-u8 sub_80BF8E4(void)
+u8 GetDialogBoxFontId(void)
{
if (!ContextNpcGetTextColor())
return 4;
diff --git a/src/mevent.c b/src/mevent.c
index b22d02cbc..afad326b5 100644
--- a/src/mevent.c
+++ b/src/mevent.c
@@ -652,7 +652,7 @@ void BlankMEventBuffer2(void)
gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.crc = 0;
}
-u16 sub_81440E8(void)
+u16 GetWonderCardFlagId(void)
{
if (ValidateReceivedWonderCard())
return gSaveBlock1Ptr->mysteryEventBuffers.mecard.data.unk_00;
@@ -674,7 +674,7 @@ bool32 sub_8144124(u16 a0)
bool32 CheckReceivedGiftFromWonderCard(void)
{
- u16 value = sub_81440E8();
+ u16 value = GetWonderCardFlagId();
if (!sub_8144124(value))
return FALSE;
if (FlagGet(gUnknown_8466F00[value - 1000]) == TRUE)
diff --git a/src/new_game.c b/src/new_game.c
index 471c49e67..381ba28c8 100644
--- a/src/new_game.c
+++ b/src/new_game.c
@@ -98,7 +98,7 @@ void ResetMenuAndMonGlobals(void)
gDifferentSaveFile = FALSE;
ZeroPlayerPartyMons();
ZeroEnemyPartyMons();
- sub_81089BC();
+ ResetBagCursorPositions();
ResetTMCaseCursorPos();
BerryPouch_CursorResetToTop();
ResetQuestLog();
diff --git a/src/party_menu.c b/src/party_menu.c
index d12a17e6c..df0e70b37 100644
--- a/src/party_menu.c
+++ b/src/party_menu.c
@@ -3451,7 +3451,7 @@ static void CursorCB_Give(u8 taskId)
void CB2_SelectBagItemToGive(void)
{
- GoToBagMenu(1, 3, CB2_GiveHoldItem);
+ GoToBagMenu(ITEMMENULOCATION_PARTY, OPEN_BAG_LAST, CB2_GiveHoldItem);
}
void CB2_GiveHoldItem(void)
@@ -4283,12 +4283,12 @@ void CB2_ShowPartyMenuForItemUse(void)
static void CB2_ReturnToBagMenu(void)
{
- GoToBagMenu(11, 3, NULL);
+ GoToBagMenu(ITEMMENULOCATION_LAST, OPEN_BAG_LAST, NULL);
}
static void CB2_ReturnToTMCaseMenu(void)
{
- InitTMCase(5, NULL, 0xFF);
+ InitTMCase(TMCASE_NA, NULL, 0xFF);
}
static void CB2_ReturnToBerryPouchMenu(void)
@@ -5818,7 +5818,7 @@ static void Task_ContinueChoosingHalfParty(u8 taskId)
}
}
-void sub_81277F4(u8 menuType, MainCallback callback)
+void ChooseMonForTradingBoard(u8 menuType, MainCallback callback)
{
InitPartyMenu(menuType,
PARTY_LAYOUT_SINGLE,
@@ -5904,7 +5904,7 @@ void OpenPartyMenuInBattle(void)
void ChooseMonForInBattleItem(void)
{
- InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE, GetPartyLayoutFromBattleType(), PARTY_ACTION_REUSABLE_ITEM, FALSE, PARTY_MSG_USE_ON_WHICH_MON, sub_8120FCC, sub_8107ECC);
+ InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE, GetPartyLayoutFromBattleType(), PARTY_ACTION_REUSABLE_ITEM, FALSE, PARTY_MSG_USE_ON_WHICH_MON, sub_8120FCC, CB2_BagMenuFromBattle);
nullsub_44();
UpdatePartyToBattleOrder();
}
@@ -5919,7 +5919,7 @@ void sub_81279E0(void)
FALSE,
PARTY_MSG_NONE,
sub_8120C3C,
- sub_8107ECC);
+ CB2_BagMenuFromBattle);
sub_80EB2F4(8);
}
else
@@ -5929,7 +5929,7 @@ void sub_81279E0(void)
if (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_BERRY_POUCH)
callback = CB2_ReturnToBerryPouchMenu;
else
- callback = sub_8107ECC;
+ callback = CB2_BagMenuFromBattle;
InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE,
GetPartyLayoutFromBattleType(),
PARTY_ACTION_USE_ITEM,
diff --git a/src/player_pc.c b/src/player_pc.c
index 00d41abe6..928676844 100644
--- a/src/player_pc.c
+++ b/src/player_pc.c
@@ -322,7 +322,7 @@ static void Task_DepositItem_WaitFadeAndGoToBag(u8 taskId)
if (!gPaletteFade.active)
{
CleanupOverworldWindowsAndTilemaps();
- GoToBagMenu(3, POCKET_ITEMS - 1, CB2_ReturnToField);
+ GoToBagMenu(ITEMMENULOCATION_ITEMPC, OPEN_BAG_ITEMS, CB2_ReturnToField);
gFieldCallback = CB2_ReturnFromDepositMenu;
DestroyTask(taskId);
}
@@ -331,7 +331,7 @@ static void Task_DepositItem_WaitFadeAndGoToBag(u8 taskId)
static void Task_PlayerPcDepositItem(u8 taskId)
{
gTasks[taskId].func = Task_DepositItem_WaitFadeAndGoToBag;
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
static void Task_ReturnToItemStorageSubmenu(u8 taskId)
@@ -394,7 +394,7 @@ static void Task_WithdrawItemBeginFade(u8 taskId)
{
gTasks[taskId].func = Task_WithdrawItem_WaitFadeAndGoToItemStorage;
ItemPc_SetInitializedFlag(0);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
static void Task_PlayerPcCancel(u8 taskId)
@@ -556,7 +556,7 @@ static void Task_MailSubmenuHandleInput(u8 taskId)
static void Task_PlayerPcReadMail(u8 taskId)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].func = Task_WaitFadeAndReadSelectedMail;
}
@@ -663,7 +663,7 @@ static void Task_PlayerPcGiveMailToMon(u8 taskId)
}
else
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].func = Task_WaitFadeAndGoToPartyMenu;
}
}
diff --git a/src/pokemon.c b/src/pokemon.c
index 1270a25ed..d1305861a 100644
--- a/src/pokemon.c
+++ b/src/pokemon.c
@@ -1547,7 +1547,7 @@ const struct SpriteTemplate gUnknown_825DF50[] =
.paletteTag = 0,
.oam = &gOamData_824F018,
.anims = NULL,
- .images = gTrainerBackPicTable_PokeDude,
+ .images = gTrainerBackPicTable_Pokedude,
.affineAnims = gSpriteAffineAnimTable_82348C8,
.callback = sub_80120C4,
},
@@ -3982,49 +3982,49 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
retVal = FALSE;
}
if ((itemEffect[cmdIndex] & 0xF)
- && gBattleMons[gActiveBattler].statStages[STAT_STAGE_ATK] < 12)
+ && gBattleMons[gActiveBattler].statStages[STAT_ATK] < 12)
{
- gBattleMons[gActiveBattler].statStages[STAT_STAGE_ATK] += itemEffect[cmdIndex] & 0xF;
- if (gBattleMons[gActiveBattler].statStages[STAT_STAGE_ATK] > 12)
- gBattleMons[gActiveBattler].statStages[STAT_STAGE_ATK] = 12;
+ gBattleMons[gActiveBattler].statStages[STAT_ATK] += itemEffect[cmdIndex] & 0xF;
+ if (gBattleMons[gActiveBattler].statStages[STAT_ATK] > 12)
+ gBattleMons[gActiveBattler].statStages[STAT_ATK] = 12;
retVal = FALSE;
}
break;
// in-battle stat boosting effects?
case 1:
if ((itemEffect[cmdIndex] & 0xF0)
- && gBattleMons[gActiveBattler].statStages[STAT_STAGE_DEF] < 12)
+ && gBattleMons[gActiveBattler].statStages[STAT_DEF] < 12)
{
- gBattleMons[gActiveBattler].statStages[STAT_STAGE_DEF] += (itemEffect[cmdIndex] & 0xF0) >> 4;
- if (gBattleMons[gActiveBattler].statStages[STAT_STAGE_DEF] > 12)
- gBattleMons[gActiveBattler].statStages[STAT_STAGE_DEF] = 12;
+ gBattleMons[gActiveBattler].statStages[STAT_DEF] += (itemEffect[cmdIndex] & 0xF0) >> 4;
+ if (gBattleMons[gActiveBattler].statStages[STAT_DEF] > 12)
+ gBattleMons[gActiveBattler].statStages[STAT_DEF] = 12;
retVal = FALSE;
}
if ((itemEffect[cmdIndex] & 0xF)
- && gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPEED] < 12)
+ && gBattleMons[gActiveBattler].statStages[STAT_SPEED] < 12)
{
- gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPEED] += itemEffect[cmdIndex] & 0xF;
- if (gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPEED] > 12)
- gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPEED] = 12;
+ gBattleMons[gActiveBattler].statStages[STAT_SPEED] += itemEffect[cmdIndex] & 0xF;
+ if (gBattleMons[gActiveBattler].statStages[STAT_SPEED] > 12)
+ gBattleMons[gActiveBattler].statStages[STAT_SPEED] = 12;
retVal = FALSE;
}
break;
// more stat boosting effects?
case 2:
if ((itemEffect[cmdIndex] & 0xF0)
- && gBattleMons[gActiveBattler].statStages[STAT_STAGE_ACC] < 12)
+ && gBattleMons[gActiveBattler].statStages[STAT_ACC] < 12)
{
- gBattleMons[gActiveBattler].statStages[STAT_STAGE_ACC] += (itemEffect[cmdIndex] & 0xF0) >> 4;
- if (gBattleMons[gActiveBattler].statStages[STAT_STAGE_ACC] > 12)
- gBattleMons[gActiveBattler].statStages[STAT_STAGE_ACC] = 12;
+ gBattleMons[gActiveBattler].statStages[STAT_ACC] += (itemEffect[cmdIndex] & 0xF0) >> 4;
+ if (gBattleMons[gActiveBattler].statStages[STAT_ACC] > 12)
+ gBattleMons[gActiveBattler].statStages[STAT_ACC] = 12;
retVal = FALSE;
}
if ((itemEffect[cmdIndex] & 0xF)
- && gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPATK] < 12)
+ && gBattleMons[gActiveBattler].statStages[STAT_SPATK] < 12)
{
- gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPATK] += itemEffect[cmdIndex] & 0xF;
- if (gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPATK] > 12)
- gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPATK] = 12;
+ gBattleMons[gActiveBattler].statStages[STAT_SPATK] += itemEffect[cmdIndex] & 0xF;
+ if (gBattleMons[gActiveBattler].statStages[STAT_SPATK] > 12)
+ gBattleMons[gActiveBattler].statStages[STAT_SPATK] = 12;
retVal = FALSE;
}
break;
@@ -4496,25 +4496,25 @@ bool8 PokemonItemUseNoEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mo
&& !(gBattleMons[gActiveBattler].status2 & STATUS2_FOCUS_ENERGY))
retVal = FALSE;
if ((itemEffect[cmdIndex] & 0xF)
- && gBattleMons[gActiveBattler].statStages[STAT_STAGE_ATK] < 12)
+ && gBattleMons[gActiveBattler].statStages[STAT_ATK] < 12)
retVal = FALSE;
break;
// in-battle stat boosting effects?
case 1:
if ((itemEffect[cmdIndex] & 0xF0)
- && gBattleMons[gActiveBattler].statStages[STAT_STAGE_DEF] < 12)
+ && gBattleMons[gActiveBattler].statStages[STAT_DEF] < 12)
retVal = FALSE;
if ((itemEffect[cmdIndex] & 0xF)
- && gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPEED] < 12)
+ && gBattleMons[gActiveBattler].statStages[STAT_SPEED] < 12)
retVal = FALSE;
break;
// more stat boosting effects?
case 2:
if ((itemEffect[cmdIndex] & 0xF0)
- && gBattleMons[gActiveBattler].statStages[STAT_STAGE_ACC] < 12)
+ && gBattleMons[gActiveBattler].statStages[STAT_ACC] < 12)
retVal = FALSE;
if ((itemEffect[cmdIndex] & 0xF)
- && gBattleMons[gActiveBattler].statStages[STAT_STAGE_SPATK] < 12)
+ && gBattleMons[gActiveBattler].statStages[STAT_SPATK] < 12)
retVal = FALSE;
break;
case 3:
diff --git a/src/quest_log.c b/src/quest_log.c
index 38b3733ea..0cda4eb77 100644
--- a/src/quest_log.c
+++ b/src/quest_log.c
@@ -1049,7 +1049,7 @@ static void sub_811175C(u8 sceneNum, struct UnkStruct_203AE98 * a1)
static void sub_81118F4(s8 a0)
{
- fade_screen(1, a0);
+ FadeScreen(1, a0);
sQuestLogCB = QuestLog_AdvancePlayhead;
}
@@ -1309,7 +1309,7 @@ static void QuestLog_CloseTextWindow(void)
static void QuestLog_SkipToEndOfPlayback(s8 a0)
{
- fade_screen(1, a0);
+ FadeScreen(1, a0);
sQuestLogCB = QuestLog_WaitFadeAndCancelPlayback;
}
diff --git a/src/rfu_union_tool.c b/src/rfu_union_tool.c
new file mode 100644
index 000000000..20b29de9b
--- /dev/null
+++ b/src/rfu_union_tool.c
@@ -0,0 +1,663 @@
+#include "global.h"
+#include "event_data.h"
+#include "event_object_movement.h"
+#include "event_object_80688E4.h"
+#include "event_object_8097404.h"
+#include "field_player_avatar.h"
+#include "fieldmap.h"
+#include "rfu_union_tool.h"
+#include "script.h"
+#include "task.h"
+#include "constants/flags.h"
+#include "constants/event_object_movement.h"
+#include "constants/object_events.h"
+
+static EWRAM_DATA struct UnionObj * UnionObjWork = NULL;
+static EWRAM_DATA u32 sUnionObjRefreshTimer = 0;
+
+static u8 StartUnionObjAnimTask(void);
+static u32 sub_811BBC8(u32 playerIdx, u32 arg1);
+static void sub_811C008(s32 arg0, s32 arg1, u8 arg2);
+
+static const u8 sUnionObjectEventGfxIds[][10] = {
+ [MALE] = {
+ OBJECT_EVENT_GFX_COOLTRAINER_M,
+ OBJECT_EVENT_GFX_BLACKBELT,
+ OBJECT_EVENT_GFX_CAMPER,
+ OBJECT_EVENT_GFX_YOUNGSTER,
+ OBJECT_EVENT_GFX_BOY,
+ OBJECT_EVENT_GFX_BUG_CATCHER,
+ OBJECT_EVENT_GFX_MAN,
+ OBJECT_EVENT_GFX_ROCKER
+ },
+ [FEMALE] = {
+ OBJECT_EVENT_GFX_COOLTRAINER_F,
+ OBJECT_EVENT_GFX_CHANNELER,
+ OBJECT_EVENT_GFX_PICNICKER,
+ OBJECT_EVENT_GFX_LASS,
+ OBJECT_EVENT_GFX_WOMAN_1,
+ OBJECT_EVENT_GFX_BATTLE_GIRL,
+ OBJECT_EVENT_GFX_WOMAN_2,
+ OBJECT_EVENT_GFX_BEAUTY
+ }
+};
+
+static const s16 sUnionPartnerCoords[][2] = {
+ { 4, 6},
+ {13, 8},
+ {10, 6},
+ { 1, 8},
+ {13, 4},
+ { 7, 4},
+ { 1, 4},
+ { 7, 8}
+};
+
+static const s8 sFacingDirectionOffsets[][2] = {
+ [DIR_NONE] = { 0, 0},
+ [DIR_SOUTH] = { 1, 0},
+ [DIR_NORTH] = { 0, -1},
+ [DIR_WEST] = {-1, 0},
+ [DIR_EAST] = { 0, 1}
+};
+
+static const u8 sOppositeFacingDirection[] = {
+ [DIR_NONE] = DIR_NONE,
+ [DIR_SOUTH] = DIR_NORTH,
+ [DIR_NORTH] = DIR_SOUTH,
+ [DIR_WEST] = DIR_EAST,
+ [DIR_EAST] = DIR_WEST
+};
+
+static const u8 gUnknown_845711B[] = {
+ 1,
+ 3,
+ 1,
+ 4,
+ 2
+};
+
+static const u8 sUnionRoomLocalIds[] = {
+ 9,
+ 8,
+ 7,
+ 2,
+ 6,
+ 5,
+ 4,
+ 3
+};
+
+static const u16 sUnref_8457128[] = {
+ 0x63,
+ 0x64,
+ 0x65,
+ 0x66,
+ 0x67,
+ 0x68,
+ 0x69,
+ 0x6A
+};
+
+static bool32 is_walking_or_running(void)
+{
+ if (gPlayerAvatar.tileTransitionState == 2 || gPlayerAvatar.tileTransitionState == 0)
+ {
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+static u8 GetUnionRoomPlayerGraphicsId(u32 gender, u32 id)
+{
+ return sUnionObjectEventGfxIds[gender][id % 8];
+}
+
+static void GetUnionRoomPlayerFacingCoords(u32 id, u32 dirn, s32 * xp, s32 * yp)
+{
+ *xp = sUnionPartnerCoords[id][0] + sFacingDirectionOffsets[dirn][0] + 7;
+ *yp = sUnionPartnerCoords[id][1] + sFacingDirectionOffsets[dirn][1] + 7;
+}
+
+static bool32 sub_811B58C(u32 id, u32 dirn, s32 x, s32 y)
+{
+ if (sUnionPartnerCoords[id][0] + sFacingDirectionOffsets[dirn][0] + 7 != x)
+ {
+ return FALSE;
+ }
+ else if (sUnionPartnerCoords[id][1] + sFacingDirectionOffsets[dirn][1] + 7 != y)
+ {
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+}
+
+static bool32 IsUnionRoomPlayerHidden(u32 player_idx)
+{
+ return FlagGet(FLAG_HIDE_UNION_ROOM_PLAYER_1 + player_idx);
+}
+
+static void HideUnionRoomPlayer(u32 player_idx)
+{
+ FlagSet(FLAG_HIDE_UNION_ROOM_PLAYER_1 + player_idx);
+}
+
+static void ShowUnionRoomPlayer(u32 player_idx)
+{
+ FlagClear(FLAG_HIDE_UNION_ROOM_PLAYER_1 + player_idx);
+}
+
+static void SetUnionRoomPlayerGfx(u32 playerIdx, u32 gfxId)
+{
+ VarSet(VAR_OBJ_GFX_ID_0 + playerIdx, gfxId);
+}
+
+static void CreateUnionRoomPlayerObjectEvent(u32 playerIdx)
+{
+ TrySpawnObjectEvent(sUnionRoomLocalIds[playerIdx], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
+}
+
+static void RemoveUnionRoomPlayerObjectEvent(u32 playerIdx)
+{
+ RemoveObjectEventByLocalIdAndMap(sUnionRoomLocalIds[playerIdx], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
+}
+
+static bool32 SetUnionRoomPlayerEnterExitMovement(u32 playerIdx, const u8 * movement)
+{
+ u8 objectId;
+ struct ObjectEvent * object;
+ if (TryGetObjectEventIdByLocalIdAndMap(sUnionRoomLocalIds[playerIdx], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectId))
+ {
+ return FALSE;
+ }
+ object = &gObjectEvents[objectId];
+ if (ObjectEventIsMovementOverridden(object))
+ {
+ return FALSE;
+ }
+ if (ObjectEventSetHeldMovement(object, *movement))
+ {
+ AGB_ASSERT_EX(0, ABSPATH("rfu_union_tool.c"), 387);
+ return FALSE;
+ }
+ return TRUE;
+}
+static bool32 TryReleaseUnionRoomPlayerObjectEvent(u32 playerIdx)
+{
+ u8 objectId;
+ struct ObjectEvent * object;
+ if (TryGetObjectEventIdByLocalIdAndMap(sUnionRoomLocalIds[playerIdx], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectId))
+ {
+ return TRUE;
+ }
+ object = &gObjectEvents[objectId];
+ if (!ObjectEventClearHeldMovementIfFinished(object))
+ {
+ return FALSE;
+ }
+ if (!ScriptContext2_IsEnabled())
+ {
+ UnfreezeObjectEvent(object);
+ }
+ else
+ {
+ FreezeObjectEvent(object);
+ }
+ return TRUE;
+}
+
+u8 ZeroUnionObjWork(struct UnionObj * ptr)
+{
+ s32 i;
+
+ sUnionObjRefreshTimer = 0;
+ UnionObjWork = ptr;
+ AGB_ASSERT_EX(UnionObjWork != NULL, ABSPATH("rfu_union_tool.c"), 442)
+ for (i = 0; i < 8; i++)
+ {
+ ptr[i].state = 0;
+ ptr[i].gfxId = 0;
+ ptr[i].animState = 0;
+ ptr[i].schedAnim = 0;
+ }
+ return StartUnionObjAnimTask();
+}
+
+static const u8 sMovement_UnionPlayerExit[2] = {
+ MOVEMENT_ACTION_FLY_UP,
+ MOVEMENT_ACTION_STEP_END
+};
+
+static bool32 AnimateUnionRoomPlayerDespawn(s8 * a0, u32 playerIdx, struct UnionObj * ptr)
+{
+ switch (*a0)
+ {
+ case 0:
+ if (SetUnionRoomPlayerEnterExitMovement(playerIdx, sMovement_UnionPlayerExit) == TRUE)
+ {
+ HideUnionRoomPlayer(playerIdx);
+ (*a0)++;
+ }
+ break;
+ case 1:
+ if (TryReleaseUnionRoomPlayerObjectEvent(playerIdx))
+ {
+ RemoveUnionRoomPlayerObjectEvent(playerIdx);
+ HideUnionRoomPlayer(playerIdx);
+ *a0 = 0;
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+static const u8 sMovement_UnionPlayerEnter[2] = {
+ MOVEMENT_ACTION_FLY_DOWN,
+ MOVEMENT_ACTION_STEP_END
+};
+
+static bool32 AnimateUnionRoomPlayerSpawn(s8 * a0, u32 playerIdx, struct UnionObj * ptr)
+{
+ s16 x, y;
+
+ switch (*a0)
+ {
+ case 0:
+ if (!is_walking_or_running())
+ {
+ break;
+ }
+ PlayerGetDestCoords(&x, &y);
+ if (sub_811B58C(playerIdx, 0, x, y) == TRUE)
+ {
+ break;
+ }
+ player_get_pos_including_state_based_drift(&x, &y);
+ if (sub_811B58C(playerIdx, 0, x, y) == TRUE)
+ {
+ break;
+ }
+ SetUnionRoomPlayerGfx(playerIdx, ptr->gfxId);
+ CreateUnionRoomPlayerObjectEvent(playerIdx);
+ ShowUnionRoomPlayer(playerIdx);
+ (*a0)++;
+ // fallthrough
+ case 3: // incorrect?
+ if (SetUnionRoomPlayerEnterExitMovement(playerIdx, sMovement_UnionPlayerEnter) == 1)
+ {
+ (*a0)++;
+ }
+ break;
+ case 2:
+ if (TryReleaseUnionRoomPlayerObjectEvent(playerIdx))
+ {
+ *a0 = 0;
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+static bool32 sub_811B8BC(u32 playerIdx, u32 a1, u32 a2)
+{
+ struct UnionObj * ptr = &UnionObjWork[playerIdx];
+ AGB_ASSERT_EX(UnionObjWork != NULL, ABSPATH("rfu_union_tool.c"), 561)
+ ptr->schedAnim = 1;
+ ptr->gfxId = GetUnionRoomPlayerGraphicsId(a1, a2);
+ if (ptr->state == 0)
+ {
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+static bool32 sub_811B90C(u32 playerIdx)
+{
+ struct UnionObj * ptr = &UnionObjWork[playerIdx];
+ AGB_ASSERT_EX(UnionObjWork != NULL, ABSPATH("rfu_union_tool.c"), 577)
+ ptr->schedAnim = 2;
+ if (ptr->state == 1)
+ {
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+static void AnimateUnionObj(u32 playerIdx, struct UnionObj * ptr)
+{
+ switch (ptr->state)
+ {
+ case 0:
+ if (ptr->schedAnim == 1)
+ {
+ ptr->state = 2;
+ ptr->animState = 0;
+ }
+ else
+ {
+ break;
+ }
+ // fallthrough
+ case 2:
+ if (!sub_811BBC8(playerIdx, 0) && ptr->schedAnim == 2)
+ {
+ ptr->state = 0;
+ ptr->animState = 0;
+ RemoveUnionRoomPlayerObjectEvent(playerIdx);
+ HideUnionRoomPlayer(playerIdx);
+ }
+ else if (AnimateUnionRoomPlayerSpawn(&ptr->animState, playerIdx, ptr) == TRUE)
+ {
+ ptr->state = 1;
+ }
+ break;
+ case 1:
+ if (ptr->schedAnim == 2)
+ {
+ ptr->state = 3;
+ ptr->animState = 0;
+ }
+ else
+ {
+ break;
+ }
+ // fallthrough
+ case 3:
+ if (AnimateUnionRoomPlayerDespawn(&ptr->animState, playerIdx, ptr) == TRUE)
+ {
+ ptr->state = 0;
+ }
+ break;
+ }
+ ptr->schedAnim = 0;
+}
+
+static void Task_AnimateUnionObjs(u8 taskId)
+{
+ s32 i;
+ AGB_ASSERT_EX(UnionObjWork != NULL, ABSPATH("rfu_union_tool.c"), 643)
+ for (i = 0; i < 8; i++)
+ {
+ AnimateUnionObj(i, &UnionObjWork[i]);
+ }
+}
+
+static u8 StartUnionObjAnimTask(void)
+{
+ if (FuncIsActiveTask(Task_AnimateUnionObjs) == TRUE)
+ {
+ AGB_ASSERT_EX(0, ABSPATH("rfu_union_tool.c"), 655)
+ return NUM_TASKS;
+ }
+ else
+ {
+ return CreateTask(Task_AnimateUnionObjs, 5);
+ }
+}
+
+static void sub_811BA5C(void)
+{
+ u8 taskId = FindTaskIdByFunc(Task_AnimateUnionObjs);
+ if (taskId < NUM_TASKS)
+ {
+ DestroyTask(taskId);
+ }
+}
+
+void sub_811BA78(void)
+{
+ s32 i;
+ for (i = 0; i < 8; i++)
+ {
+ if (!IsUnionRoomPlayerHidden(i))
+ {
+ RemoveUnionRoomPlayerObjectEvent(i);
+ HideUnionRoomPlayer(i);
+ }
+ }
+ UnionObjWork = NULL;
+ sub_811BA5C();
+}
+
+void sub_811BAAC(u8 * sp8, s32 r9)
+{
+ s32 r7;
+
+ for (r7 = 0; r7 < 5; r7++)
+ {
+ s32 r5 = 5 * r9 + r7;
+ sp8[r5] = sprite_new(OBJECT_EVENT_GFX_MAN, r5 - 0x38, sUnionPartnerCoords[r9][0] + sFacingDirectionOffsets[r7][0], sUnionPartnerCoords[r9][1] + sFacingDirectionOffsets[r7][1], 3, 1);
+ sub_8069124(r5 - 0x38, TRUE);
+ }
+}
+
+void sub_811BB40(u8 * r5)
+{
+ s32 i;
+ for (i = 0; i < 40; i++)
+ {
+ DestroySprite(&gSprites[r5[i]]);
+ }
+}
+
+void sub_811BB68(void)
+{
+ s32 i, j, x, y;
+ for (i = 0; i < 8; i++)
+ {
+ for (j = 0; j < 5; j++)
+ {
+ GetUnionRoomPlayerFacingCoords(i, j, &x, &y);
+ sub_8059024(x, y, 0);
+ }
+ }
+}
+
+static u8 sub_811BBA0(u32 r1, u32 unused, struct GFtgtGname * r2)
+{
+ if (r1 != 0)
+ {
+ return gUnknown_845711B[r1];
+ }
+ else if (r2->unk_0a_0 == 0x45)
+ {
+ return 1;
+ }
+ else
+ {
+ return 4;
+ }
+}
+
+static u32 sub_811BBC8(u32 a0, u32 a1)
+{
+ return sub_806916C(5 * a0 + a1 - 0x38);
+}
+
+static void sub_811BBE0(u32 r5, u32 r6, u8 r8, struct GFtgtGname * r9)
+{
+ s32 x, y;
+ s32 r7 = 5 * r5 + r6;
+ if (sub_811BBC8(r5, r6) == 1)
+ {
+ sub_8069124(r7 - 0x38, FALSE);
+ sub_80691A4(r7 - 0x38, 1);
+ }
+ sub_8069094(r7 - 0x38, r8);
+ sub_811C008(r6, r5, sub_811BBA0(r6, r5, r9));
+ GetUnionRoomPlayerFacingCoords(r5, r6, &x, &y);
+ sub_8059024(x, y, 1);
+}
+
+static void sub_811BC68(u32 a0, u32 a1)
+{
+ s32 x, y;
+ sub_80691A4(5 * a0 + a1 - 0x38, 2);
+ GetUnionRoomPlayerFacingCoords(a0, a1, &x, &y);
+ sub_8059024(x, y, 0);
+}
+
+static void sub_811BCA0(u32 r7, struct GFtgtGname * r8)
+{
+ s16 x, y, x2, y2;
+ s32 i;
+
+ PlayerGetDestCoords(&x, &y);
+ player_get_pos_including_state_based_drift(&x2, &y2);
+ if (sub_806916C(5 * r7 - 0x38) == 1)
+ {
+ if (sub_811B58C(r7, 0, x, y) == TRUE || sub_811B58C(r7, 0, x2, y2) == TRUE)
+ {
+ return;
+ }
+ sub_811BBE0(r7, 0, GetUnionRoomPlayerGraphicsId(r8->playerGender, r8->unk_00.playerTrainerId[0]), r8);
+ }
+ for (i = 1; i < 5; i++)
+ {
+ if (r8->unk_04[i - 1] == 0)
+ {
+ sub_811BC68(r7, i);
+ }
+ else if (sub_811B58C(r7, i, x, y) == FALSE && sub_811B58C(r7, i, x2, y2) == FALSE)
+ {
+ sub_811BBE0(r7, i, GetUnionRoomPlayerGraphicsId((r8->unk_04[i - 1] >> 3) & 1, r8->unk_04[i - 1] & 7), r8);
+ }
+ }
+}
+
+static void sub_811BDA8(u32 r5, struct GFtgtGname * r4)
+{
+ u32 i;
+ switch (r4->unk_0a_0)
+ {
+ case 0x40:
+ case 0x54:
+ sub_811B8BC(r5, r4->playerGender, r4->unk_00.playerTrainerId[0]);
+ for (i = 0; i < 5; i++)
+ {
+ sub_811BC68(r5, i);
+ }
+ break;
+ case 0x41:
+ case 0x44:
+ case 0x45:
+ case 0x48:
+ case 0x51:
+ case 0x52:
+ case 0x53:
+ sub_811B90C(r5);
+ sub_811BCA0(r5, r4);
+ break;
+ default:
+ AGB_ASSERT_EX(0, ABSPATH("rfu_union_tool.c"), 979)
+ }
+}
+
+static void sub_811BE6C(u32 r5, struct GFtgtGname * unused)
+{
+ s32 i;
+ sub_811B90C(r5);
+ for (i = 0; i < 5; i++)
+ {
+ sub_811BC68(r5, i);
+ }
+}
+
+static void UpdateUnionRoomPlayerSprites(struct UnkStruct_URoom *r0)
+{
+ s32 i;
+ struct UnkStruct_x20 * r4;
+ sUnionObjRefreshTimer = 0;
+ for (i = 0, r4 = r0->field_0->arr; i < 8; i++)
+ {
+ if (r4[i].field_1A_0 == 1)
+ {
+ sub_811BDA8(i, &r4[i].unk.gname);
+ }
+ else if (r4[i].field_1A_0 == 2)
+ {
+ sub_811BE6C(i, &r4[i].unk.gname);
+ }
+ }
+}
+
+void sub_811BECC(struct UnkStruct_URoom *unused)
+{
+ sUnionObjRefreshTimer = 300;
+}
+
+void sub_811BEDC(struct UnkStruct_URoom *r2)
+{
+ if (++sUnionObjRefreshTimer > 300)
+ {
+ UpdateUnionRoomPlayerSprites(r2);
+ }
+}
+
+bool32 sub_811BF00(struct UnkStruct_Main0 *arg0, s16 *arg1, s16 *arg2, u8 *arg3)
+{
+ s16 x, y;
+ s32 i, j;
+ struct UnkStruct_x20 * r4;
+ if (!is_walking_or_running())
+ {
+ return FALSE;
+ }
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+ for (i = 0, r4 = arg0->arr; i < 8; i++)
+ {
+ for (j = 0; j < 5; j++)
+ {
+ s32 r3 = 5 * i + j;
+ if (x != sUnionPartnerCoords[i][0] + sFacingDirectionOffsets[j][0] + 7)
+ {
+ continue;
+ }
+ if (y != sUnionPartnerCoords[i][1] + sFacingDirectionOffsets[j][1] + 7)
+ {
+ continue;
+ }
+ if (sub_806916C(r3 - 0x38) != 0)
+ {
+ continue;
+ }
+ if (sub_8069294(r3 - 0x38) != 0)
+ {
+ continue;
+ }
+ if (r4[i].field_1A_0 != 1)
+ {
+ continue;
+ }
+ sub_811C008(j, i, sOppositeFacingDirection[GetPlayerFacingDirection()]);
+ *arg1 = j;
+ *arg2 = i;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static void sub_811C008(s32 arg0, s32 arg1, u8 arg2)
+{
+ sub_8069058(5 * arg1 - 0x38 + arg0, arg2);
+}
+
+void sub_811C028(u32 arg0, u32 arg1, struct UnkStruct_Main0 *arg2)
+{
+ return sub_811C008(arg0, arg1, sub_811BBA0(arg0, arg1, &arg2->arr[arg1].unk.gname));
+}
diff --git a/src/safari_zone.c b/src/safari_zone.c
index cb0a58586..65fb89bca 100644
--- a/src/safari_zone.c
+++ b/src/safari_zone.c
@@ -47,7 +47,7 @@ bool8 SafariZoneTakeStep(void)
gSafariZoneStepCounter--;
if (gSafariZoneStepCounter == 0)
{
- ScriptContext1_SetupScript(EventScript_SafariTimesUp);
+ ScriptContext1_SetupScript(SafariZone_EventScript_TimesUp);
return TRUE;
}
return FALSE;
@@ -55,7 +55,7 @@ bool8 SafariZoneTakeStep(void)
void SafariZoneRetirePrompt(void)
{
- ScriptContext1_SetupScript(EventScript_SafariRetire);
+ ScriptContext1_SetupScript(SafariZone_EventScript_RetirePrompt);
}
void CB2_EndSafariBattle(void)
@@ -66,14 +66,14 @@ void CB2_EndSafariBattle(void)
}
else if (gBattleOutcome == B_OUTCOME_NO_SAFARI_BALLS)
{
- ScriptContext2_RunNewScript(EventScript_SafariWarpOut);
+ ScriptContext2_RunNewScript(SafariZone_EventScript_OutOfBallsMidBattle);
WarpIntoMap();
gFieldCallback = sub_807E3EC;
SetMainCallback2(CB2_LoadMap);
}
else if (gBattleOutcome == B_OUTCOME_CAUGHT)
{
- ScriptContext1_SetupScript(EventScript_SafariOutOfBalls);
+ ScriptContext1_SetupScript(SafariZone_EventScript_OutOfBalls);
ScriptContext1_Stop();
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
}
diff --git a/src/scrcmd.c b/src/scrcmd.c
index 51e7d2c35..c2c422a0a 100644
--- a/src/scrcmd.c
+++ b/src/scrcmd.c
@@ -630,7 +630,7 @@ static bool8 IsPaletteNotActive(void)
bool8 ScrCmd_fadescreen(struct ScriptContext *ctx)
{
- fade_screen(ScriptReadByte(ctx), 0);
+ FadeScreen(ScriptReadByte(ctx), 0);
SetupNativeScript(ctx, IsPaletteNotActive);
return TRUE;
}
@@ -640,7 +640,7 @@ bool8 ScrCmd_fadescreenspeed(struct ScriptContext *ctx)
u8 mode = ScriptReadByte(ctx);
u8 speed = ScriptReadByte(ctx);
- fade_screen(mode, speed);
+ FadeScreen(mode, speed);
SetupNativeScript(ctx, IsPaletteNotActive);
return TRUE;
}
@@ -1064,7 +1064,7 @@ bool8 ScrCmd_addobject(struct ScriptContext *ctx)
{
u16 objectId = VarGet(ScriptReadHalfword(ctx));
- show_sprite(objectId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
+ TrySpawnObjectEvent(objectId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
return FALSE;
}
@@ -1074,7 +1074,7 @@ bool8 ScrCmd_addobject_at(struct ScriptContext *ctx)
u8 mapGroup = ScriptReadByte(ctx);
u8 mapNum = ScriptReadByte(ctx);
- show_sprite(objectId, mapNum, mapGroup);
+ TrySpawnObjectEvent(objectId, mapNum, mapGroup);
return FALSE;
}
diff --git a/src/script_menu.c b/src/script_menu.c
index 42be3b539..72ff1dc9e 100644
--- a/src/script_menu.c
+++ b/src/script_menu.c
@@ -565,36 +565,37 @@ const struct MultichoiceListStruct gScriptMultiChoiceMenus[] = {
{ sScriptMultiChoiceMenu_TrainerTowerMode, NELEMS(sScriptMultiChoiceMenu_TrainerTowerMode) }
};
+// From Cool to Berries goes unused
const u8 *const gStdStringPtrs[] = {
- gText_Cool,
- gText_Beauty,
- gText_Cute,
- gText_Smart,
- gText_Tough,
- gText_Cool_2,
- gText_Beauty_2,
- gText_Cute_2,
- gText_Smart_2,
- gText_Tough_2,
- gText_Items,
- gText_KeyItems,
- gText_PokeBalls,
- gText_TMsAndHMs,
- gText_Berries,
- gText_Boulderbadge,
- gText_Cascadebadge,
- gText_Thunderbadge,
- gText_Rainbowbadge,
- gText_Soulbadge,
- gText_Marshbadge,
- gText_Volcanobadge,
- gText_Earthbadge,
- gText_Coins_2,
- gText_ItemsPocket,
- gText_KeyItemsPocket,
- gText_PokeBallsPocket,
- gText_TmCase,
- gText_BerryPouch_2
+ [STDSTRING_COOL] = gText_Cool,
+ [STDSTRING_BEAUTY] = gText_Beauty,
+ [STDSTRING_CUTE] = gText_Cute,
+ [STDSTRING_SMART] = gText_Smart,
+ [STDSTRING_TOUGH] = gText_Tough,
+ [STDSTRING_COOL2] = gText_Cool_2,
+ [STDSTRING_BEAUTY2] = gText_Beauty_2,
+ [STDSTRING_CUTE2] = gText_Cute_2,
+ [STDSTRING_SMART2] = gText_Smart_2,
+ [STDSTRING_TOUGH2] = gText_Tough_2,
+ [STDSTRING_ITEMS] = gText_Items,
+ [STDSTRING_KEY_ITEMS] = gText_KeyItems,
+ [STDSTRING_POKEBALLS] = gText_PokeBalls,
+ [STDSTRING_TMHMS] = gText_TMsAndHMs,
+ [STDSTRING_BERRIES] = gText_Berries,
+ [STDSTRING_BOULDER_BADGE] = gText_Boulderbadge,
+ [STDSTRING_CASCADE_BADGE] = gText_Cascadebadge,
+ [STDSTRING_THUNDER_BADGE] = gText_Thunderbadge,
+ [STDSTRING_RAINBOW_BADGE] = gText_Rainbowbadge,
+ [STDSTRING_SOUL_BADGE] = gText_Soulbadge,
+ [STDSTRING_MARSH_BADGE] = gText_Marshbadge,
+ [STDSTRING_VOLCANO_BADGE] = gText_Volcanobadge,
+ [STDSTRING_EARTH_BADGE] = gText_Earthbadge,
+ [STDSTRING_COINS] = gText_Coins_2,
+ [STDSTRING_ITEMS_POCKET] = gText_ItemsPocket,
+ [STDSTRING_KEY_ITEMS_POCKET] = gText_KeyItemsPocket,
+ [STDSTRING_POKEBALLS_POCKET] = gText_PokeBallsPocket,
+ [STDSTRING_TM_CASE] = gText_TmCase,
+ [STDSTRING_BERRY_POUCH] = gText_BerryPouch_2
};
static const u8 *const sDescriptionPtrs_CableClub_TradeBattleCancel[] = {
diff --git a/src/shop.c b/src/shop.c
index b410b32b9..97061f8c0 100644
--- a/src/shop.c
+++ b/src/shop.c
@@ -294,20 +294,20 @@ static void Task_ShopMenu(u8 taskId)
static void Task_HandleShopMenuBuy(u8 taskId)
{
SetWordTaskArg(taskId, 0xE, (u32)CB2_InitBuyMenu);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].func = Task_GoToBuyOrSellMenu;
}
static void Task_HandleShopMenuSell(u8 taskId)
{
SetWordTaskArg(taskId, 0xE, (u32)CB2_GoToSellMenu);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].func = Task_GoToBuyOrSellMenu;
}
static void CB2_GoToSellMenu(void)
{
- GoToBagMenu(2, POCKET_POKE_BALLS, CB2_ReturnToField);
+ GoToBagMenu(ITEMMENULOCATION_SHOP, OPEN_BAG_LAST, CB2_ReturnToField);
gFieldCallback = MapPostLoadHook_ReturnToShopMenu;
}
diff --git a/src/start_menu.c b/src/start_menu.c
index 59bfb8643..b159f0375 100644
--- a/src/start_menu.c
+++ b/src/start_menu.c
@@ -446,7 +446,7 @@ static void StartMenu_FadeScreenIfLeavingOverworld(void)
&& sStartMenuCallback != StartMenuSafariZoneRetireCallback)
{
StopPokemonLeagueLightingEffectTask();
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
}
@@ -554,7 +554,7 @@ static bool8 StartMenuLinkPlayerCallback(void)
{
PlayRainStoppingSoundEffect();
CleanupOverworldWindowsAndTilemaps();
- ShowTrainerCardInLink(gUnknown_300502C, CB2_ReturnToFieldWithOpenMenu);
+ ShowTrainerCardInLink(gLocalLinkPlayerId, CB2_ReturnToFieldWithOpenMenu);
return TRUE;
}
return FALSE;
diff --git a/src/teachy_tv.c b/src/teachy_tv.c
index 11d4a80b1..1467131b0 100644
--- a/src/teachy_tv.c
+++ b/src/teachy_tv.c
@@ -34,16 +34,6 @@
#include "fieldmap.h"
#include "strings.h"
-enum TeachyTvScript
-{
- TTVSCR_BATTLE,
- TTVSCR_STATUS,
- TTVSCR_MATCHUPS,
- TTVSCR_CATCHING,
- TTVSCR_TMS,
- TTVSCR_REGISTER
-};
-
struct TeachyTvCtrlBlk
{
MainCallback callback;
@@ -805,7 +795,7 @@ static void TTVcmd_NpcMoveAndSetupTextPrinter(u8 taskId)
if (spriteAddr->pos2.x == 0x78)
{
StartSpriteAnim(&gSprites[data[1]], 0);
- TeachyTvInitTextPrinter(gTeachyTvText_PokeDudeSaysHello);
+ TeachyTvInitTextPrinter(gTeachyTvText_PokedudeSaysHello);
data[2] = 0;
++data[3];
}
@@ -1103,9 +1093,9 @@ static void TTVcmd_TaskBattleOrFadeByOptionChosen(u8 taskId)
static void TeachyTvSetupBagItemsByOptionChosen(void)
{
if (sStaticResources.whichScript == TTVSCR_TMS)
- sub_810B108(10);
+ InitPokedudeBag(ITEMMENULOCATION_TTVSCR_TMS);
else
- sub_810B108(9);
+ InitPokedudeBag(ITEMMENULOCATION_TTVSCR_REGISTER);
}
static void TeachyTvPostBattleFadeControl(u8 taskId)
diff --git a/src/tm_case.c b/src/tm_case.c
index 40509ed1b..d45061bde 100644
--- a/src/tm_case.c
+++ b/src/tm_case.c
@@ -67,7 +67,7 @@ struct UnkStruct_203B11C
static EWRAM_DATA struct UnkStruct_203B10C sTMCaseStaticResources = {};
static EWRAM_DATA struct UnkStruct_203B118 * sTMCaseDynamicResources = NULL;
-static EWRAM_DATA struct UnkStruct_203B11C * sPokeDudePackBackup = NULL;
+static EWRAM_DATA struct UnkStruct_203B11C * sPokedudePackBackup = NULL;
static EWRAM_DATA void * sTilemapBuffer = NULL; // tilemap buffer
static EWRAM_DATA struct ListMenuItem * sListMenuItemsBuffer = NULL;
static EWRAM_DATA u8 (* sListMenuStringsBuffer)[29] = NULL;
@@ -977,7 +977,7 @@ static void Task_SelectTMAction_FromSellMenu(u8 taskId)
{
CopyItemName(gSpecialVar_ItemId, gStringVar1);
StringExpandPlaceholders(gStringVar4, gText_OhNoICantBuyThat);
- TMCase_PrintMessageWithFollowupTask(taskId, sub_80BF8E4(), gStringVar4, Subtask_CloseContextMenuAndReturnToMain);
+ TMCase_PrintMessageWithFollowupTask(taskId, GetDialogBoxFontId(), gStringVar4, Subtask_CloseContextMenuAndReturnToMain);
}
else
{
@@ -993,7 +993,7 @@ static void Task_SelectTMAction_FromSellMenu(u8 taskId)
data[2] = 99;
CopyItemName(gSpecialVar_ItemId, gStringVar1);
StringExpandPlaceholders(gStringVar4, gText_HowManyWouldYouLikeToSell);
- TMCase_PrintMessageWithFollowupTask(taskId, sub_80BF8E4(), gStringVar4, Task_InitQuantitySelectUI);
+ TMCase_PrintMessageWithFollowupTask(taskId, GetDialogBoxFontId(), gStringVar4, Task_InitQuantitySelectUI);
}
}
}
@@ -1004,7 +1004,7 @@ static void Task_AskConfirmSaleWithAmount(u8 taskId)
ConvertIntToDecimalStringN(gStringVar3, itemid_get_market_price(BagGetItemIdByPocketPosition(POCKET_TM_CASE, data[1])) / 2 * data[8], STR_CONV_MODE_LEFT_ALIGN, 6);
StringExpandPlaceholders(gStringVar4, gText_ICanPayThisMuch_WouldThatBeOkay);
- TMCase_PrintMessageWithFollowupTask(taskId, sub_80BF8E4(), gStringVar4, Task_PlaceYesNoBox);
+ TMCase_PrintMessageWithFollowupTask(taskId, GetDialogBoxFontId(), gStringVar4, Task_PlaceYesNoBox);
}
static void Task_PlaceYesNoBox(u8 taskId)
@@ -1133,13 +1133,13 @@ static void Task_AfterSale_ReturnToList(u8 taskId)
}
}
-void PokeDude_InitTMCase(void)
+void Pokedude_InitTMCase(void)
{
- sPokeDudePackBackup = AllocZeroed(sizeof(*sPokeDudePackBackup));
- memcpy(sPokeDudePackBackup->bagPocket_TMHM, gSaveBlock1Ptr->bagPocket_TMHM, sizeof(gSaveBlock1Ptr->bagPocket_TMHM));
- memcpy(sPokeDudePackBackup->bagPocket_KeyItems, gSaveBlock1Ptr->bagPocket_KeyItems, sizeof(gSaveBlock1Ptr->bagPocket_KeyItems));
- sPokeDudePackBackup->unk_160 = sTMCaseStaticResources.selectedRow;
- sPokeDudePackBackup->unk_162 = sTMCaseStaticResources.scrollOffset;
+ sPokedudePackBackup = AllocZeroed(sizeof(*sPokedudePackBackup));
+ memcpy(sPokedudePackBackup->bagPocket_TMHM, gSaveBlock1Ptr->bagPocket_TMHM, sizeof(gSaveBlock1Ptr->bagPocket_TMHM));
+ memcpy(sPokedudePackBackup->bagPocket_KeyItems, gSaveBlock1Ptr->bagPocket_KeyItems, sizeof(gSaveBlock1Ptr->bagPocket_KeyItems));
+ sPokedudePackBackup->unk_160 = sTMCaseStaticResources.selectedRow;
+ sPokedudePackBackup->unk_162 = sTMCaseStaticResources.scrollOffset;
ClearItemSlots(gSaveBlock1Ptr->bagPocket_TMHM, NELEMS(gSaveBlock1Ptr->bagPocket_TMHM));
ClearItemSlots(gSaveBlock1Ptr->bagPocket_KeyItems, NELEMS(gSaveBlock1Ptr->bagPocket_KeyItems));
ResetTMCaseCursorPos();
@@ -1234,7 +1234,7 @@ static void Task_TMCaseDude_Playback(u8 taskId)
break;
case 8:
FillBG2RowWithPalette_2timesNplus1(1);
- TMCase_PrintMessageWithFollowupTask(taskId, 4, gPokeDudeText_TMTypes, 0);
+ TMCase_PrintMessageWithFollowupTask(taskId, 4, gPokedudeText_TMTypes, 0);
gTasks[taskId].func = Task_TMCaseDude_Playback;
data[8]++;
break;
@@ -1256,7 +1256,7 @@ static void Task_TMCaseDude_Playback(u8 taskId)
break;
case 18:
FillBG2RowWithPalette_2timesNplus1(1);
- TMCase_PrintMessageWithFollowupTask(taskId, 4, gPokeDudeText_ReadTMDescription, NULL);
+ TMCase_PrintMessageWithFollowupTask(taskId, 4, gPokedudeText_ReadTMDescription, NULL);
gTasks[taskId].func = Task_TMCaseDude_Playback; // this function
data[8]++;
break;
@@ -1267,12 +1267,12 @@ static void Task_TMCaseDude_Playback(u8 taskId)
case 21:
if (!gPaletteFade.active)
{
- memcpy(gSaveBlock1Ptr->bagPocket_TMHM, sPokeDudePackBackup->bagPocket_TMHM, sizeof(gSaveBlock1Ptr->bagPocket_TMHM));
- memcpy(gSaveBlock1Ptr->bagPocket_KeyItems, sPokeDudePackBackup->bagPocket_KeyItems, sizeof(gSaveBlock1Ptr->bagPocket_KeyItems));
+ memcpy(gSaveBlock1Ptr->bagPocket_TMHM, sPokedudePackBackup->bagPocket_TMHM, sizeof(gSaveBlock1Ptr->bagPocket_TMHM));
+ memcpy(gSaveBlock1Ptr->bagPocket_KeyItems, sPokedudePackBackup->bagPocket_KeyItems, sizeof(gSaveBlock1Ptr->bagPocket_KeyItems));
DestroyListMenuTask(data[0], NULL, NULL);
- sTMCaseStaticResources.selectedRow = sPokeDudePackBackup->unk_160;
- sTMCaseStaticResources.scrollOffset = sPokeDudePackBackup->unk_162;
- Free(sPokeDudePackBackup);
+ sTMCaseStaticResources.selectedRow = sPokedudePackBackup->unk_160;
+ sTMCaseStaticResources.scrollOffset = sPokedudePackBackup->unk_162;
+ Free(sPokedudePackBackup);
CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, 0x400);
CB2_SetUpReshowBattleScreenAfterMenu();
BeginNormalPaletteFade(0xFFFFFFFF, -2, 0, 16, 0);
diff --git a/src/trade_scene.c b/src/trade_scene.c
index 9e3c1d0ce..b420cb196 100644
--- a/src/trade_scene.c
+++ b/src/trade_scene.c
@@ -2443,7 +2443,7 @@ static void CreateInGameTradePokemonInternal(u8 playerSlot, u8 inGameTradeIdx)
const struct InGameTrade * inGameTrade = &sInGameTrades[inGameTradeIdx];
u8 level = GetMonData(&gPlayerParty[playerSlot], MON_DATA_LEVEL);
struct MailStruct mail;
- u8 metLocation = MAPSEC_IN_GAME_TRADE;
+ u8 metLocation = METLOC_IN_GAME_TRADE;
struct Pokemon * tradeMon = &gEnemyParty[0];
u8 mailNum;
CreateMon(tradeMon, inGameTrade->species, level, 32, TRUE, inGameTrade->personality, TRUE, inGameTrade->otId);
diff --git a/src/union_room.c b/src/union_room.c
new file mode 100644
index 000000000..4e3428cc6
--- /dev/null
+++ b/src/union_room.c
@@ -0,0 +1,4607 @@
+#include "global.h"
+#include "gflib.h"
+#include "battle.h"
+#include "berry_crush.h"
+#include "cable_club.h"
+#include "data.h"
+#include "decompress.h"
+#include "dodrio_berry_picking.h"
+#include "dynamic_placeholder_text_util.h"
+#include "easy_chat.h"
+#include "event_data.h"
+#include "event_object_lock.h"
+#include "field_control_avatar.h"
+#include "field_fadetransition.h"
+#include "field_player_avatar.h"
+#include "field_weather.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "list_menu.h"
+#include "load_save.h"
+#include "menu.h"
+#include "mevent.h"
+#include "mystery_gift_menu.h"
+#include "new_menu_helpers.h"
+#include "overworld.h"
+#include "party_menu.h"
+#include "pokemon_jump.h"
+#include "quest_log.h"
+#include "random.h"
+#include "save_location.h"
+#include "script.h"
+#include "script_pokemon_util.h"
+#include "start_menu.h"
+#include "strings.h"
+#include "task.h"
+#include "trade.h"
+#include "trade_scene.h"
+#include "trainer_card.h"
+#include "union_room.h"
+#include "union_room_chat.h"
+#include "rfu_union_tool.h"
+#include "union_room_message.h"
+#include "constants/songs.h"
+#include "constants/maps.h"
+#include "constants/cable_club.h"
+#include "constants/field_weather.h"
+#include "constants/species.h"
+
+static EWRAM_DATA u8 sUnionRoomPlayerName[12] = {};
+static EWRAM_DATA u8 gUnknown_203B058 = 0;
+static EWRAM_DATA u8 gUnknown_203B059 = 0;
+static EWRAM_DATA union UnkUnion_Main sUnionRoomMain = {};
+static EWRAM_DATA u32 sUnref_203B060 = 0;
+EWRAM_DATA struct GFtgtGnameSub gUnknown_203B064 = {};
+EWRAM_DATA u16 gUnionRoomOfferedSpecies = SPECIES_NONE;
+EWRAM_DATA u8 gUnionRoomRequestedMonType = TYPE_NORMAL;
+static EWRAM_DATA struct UnionRoomTrade sUnionRoomTrade = {};
+
+static struct UnkStruct_Leader * sLeader;
+static struct UnkStruct_Group * sGroup;
+static struct UnkStruct_URoom * sURoom;
+
+static void sub_8115A68(u8 taskId);
+static void sub_81161E4(struct UnkStruct_Leader * leader);
+static bool8 sub_8116444(struct UnkStruct_Leader * leader, u32 a1, u32 a2);
+static void sub_81164C8(u8 windowId, s32 itemId, u8 y);
+static u8 sub_8116524(struct UnkStruct_Main0 * a0);
+static u8 sub_81165E8(struct UnkStruct_Main0 * a0);
+static void sub_8116738(u8 taskId);
+static u32 sub_8116D10(struct UnkStruct_Group * group, s32 id);
+static void sub_8116D60(struct UnkStruct_Group * group, s32 id);
+static void sub_8116E1C(u8 taskId);
+static void sub_8116F94(u8 windowId, s32 itemId, u8 y);
+static u8 sub_8116FE4(void);
+static void sub_8117990(void);
+static void sub_81179A4(void);
+static void sub_8117A0C(u8 taskId);
+static void sub_8117F20(u8 taskId);
+static void sub_81182DC(u8 taskId);
+static void sub_81186E0(u8 taskId);
+static u16 ReadAsU16(const u8 *data);
+static void sub_8119904(struct UnkStruct_URoom * uRoom);
+static bool32 sub_8119944(struct UnkStruct_URoom * uRoom);
+static void sub_81199FC(u8 taskId);
+static u8 sub_8119B94(void);
+static u8 sub_8119E84(struct UnkStruct_Main4 * arg0, struct UnkStruct_Main4 * arg1, u32 arg2);
+static bool32 sub_8119FB0(struct GFtgtGname * arg0, s16 arg1);
+static u8 sub_811A054(struct UnkStruct_Main4 * arg0, u32 arg1);
+static u8 sub_811A084(struct UnkStruct_Main4 * arg0, u32 arg1);
+static bool32 sub_811A0B4(const u8 * str);
+static bool32 sub_811A0E0(void);
+static bool8 PrintOnTextbox(u8 *textState, const u8 *str);
+static s8 sub_811A14C(u8 *dest, bool32 arg1);
+static s32 sub_811A218(u8 *arg0, u8 *arg1, u8 *arg2, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate);
+static s32 sub_811A2EC(u8 *arg0, u8 *arg1, u8 *arg2, u8 *arg3, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate, struct UnkStruct_Main0 * arg6);
+static void sub_811A3F8(void);
+static void sub_811A41C(void);
+static void sub_811A444(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx);
+static void sub_811A5E4(struct UnkStruct_x20 * arg0, u8 count);
+static void sub_811A650(struct UnkStruct_x1C * arg0, u8 count);
+static bool8 sub_811A694(struct UnkStruct_Shared * arg0, const struct UnkStruct_Shared * arg1);
+static bool32 sub_811A6DC(struct UnkStruct_Shared * arg0, struct UnkStruct_Shared * arg1);
+static u32 sub_811A748(struct UnkStruct_x20 * arg0, struct UnkStruct_x1C * arg1);
+static u8 sub_811A798(struct UnkStruct_x20 * arg0, struct UnkStruct_x1C * arg1, u8 arg2);
+static void sub_811A81C(u8 windowId, u8 x, u8 y, struct UnkStruct_x20 * arg3, u8 arg4, u8 id);
+static void sub_811A910(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 * arg3, u8 arg4, u8 id);
+static bool32 sub_811A9B8(void);
+static u32 sub_811A9FC(s32 a0);
+static u32 sub_811AA24(struct UnkStruct_x20 * unkX20);
+static s32 sub_811AA5C(struct UnkStruct_Main0 * arg0, u8 arg1, u8 arg2, u32 playerGender);
+static void nullsub_92(u8 windowId, s32 itemId, u8 y);
+static void sub_811ACA4(u8 windowId, s32 itemId, u8 y);
+static s32 sub_811AD7C(struct UnkStruct_x20 * arg, s32 arg1);
+static s32 GetUnionRoomPlayerGender(s32 a0, struct UnkStruct_Main0 * a1);
+static s32 sub_811ADD0(u32 type, u32 species);
+static void sub_811AE68(u8 *dst, s32 arg1, u32 playerGender);
+static void sub_811AECC(u8 *dst, u8 arg1);
+static s32 sub_811AF6C(u8 *dst, u32 gender, u16 *arg2, struct UnkStruct_URoom * arg3);
+static bool32 sub_811B0A4(struct UnkStruct_URoom * arg0);
+static bool32 HasAtLeastTwoMonsOfLevel30OrLower(void);
+static void ResetUnionRoomTrade(struct UnionRoomTrade * trade);
+static bool32 RegisterTradeMonAndGetIsEgg(u32 monId, struct UnionRoomTrade * trade);
+static void RegisterTradeMon(u32 monId, struct UnionRoomTrade * trade);
+static u32 GetPartyPositionOfRegisteredMon(struct UnionRoomTrade * trade, u8 mpId);
+static void sub_811B258(bool32 a0);
+static void sub_811B298(void);
+static u8 sub_811B2A8(s32 a0);
+static u8 sub_811B2D8(struct UnkStruct_URoom * arg0);
+static void sub_811B31C(u8 *dest, struct UnkStruct_URoom * uRoom, bool8 gender);
+
+#define _8456CD8(a, b) ((a) | ((b) << 8))
+
+static const u8 *const gUnknown_8456C74[] = {
+ gUnknown_84571AC,
+ gUnknown_8459394,
+ gUnknown_84593A4,
+ gUnknown_84593B4,
+ gUnknown_84593C4,
+ gUnknown_84593D4,
+ gUnknown_84593E4,
+ gUnknown_84593F4,
+ gUnknown_84593DC,
+ gUnknown_8459400,
+ gUnknown_8459410,
+ gUnknown_845941C,
+ gUnknown_845942C,
+ gUnknown_8459434,
+ gUnknown_8459440,
+ gUnknown_84571AC,
+ gUnknown_84571AC,
+ gUnknown_84571AC,
+ gUnknown_84571AC,
+ gUnknown_84571AC,
+ gUnknown_84571AC,
+ gUnknown_84593E4,
+ gUnknown_84593F4
+};
+
+static const struct WindowTemplate gUnknown_8456CD0 = {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 0,
+ .width = 30,
+ .height = 2,
+ .paletteNum = 0xF,
+ .baseBlock = 0x008
+};
+
+static const u32 gUnknown_8456CD8[] = {
+ _8456CD8( 1, 2),
+ _8456CD8( 2, 2),
+ _8456CD8( 3, 4),
+ _8456CD8( 4, 2),
+ _8456CD8( 9, 37),
+ _8456CD8(10, 37),
+ _8456CD8(11, 53),
+ _8456CD8(13, 53),
+ _8456CD8(14, 53)
+};
+
+static const struct WindowTemplate gUnknown_8456CFC = {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 3,
+ .width = 13,
+ .height = 10,
+ .paletteNum = 15,
+ .baseBlock = 0x044
+};
+
+static const struct WindowTemplate gUnknown_8456D04 = {
+ .bg = 0,
+ .tilemapLeft = 16,
+ .tilemapTop = 3,
+ .width = 7,
+ .height = 4,
+ .paletteNum = 15,
+ .baseBlock = 0x0C6
+};
+
+const struct ListMenuItem gUnknown_8456D0C[] = {
+ {gUnknown_84571AC, 0},
+ {gUnknown_84571AC, 1},
+ {gUnknown_84571AC, 2},
+ {gUnknown_84571AC, 3},
+ {gUnknown_84571AC, 4}
+};
+
+static const struct ListMenuTemplate gUnknown_8456D34 = {
+ .items = gUnknown_8456D0C,
+ .moveCursorFunc = NULL,
+ .itemPrintFunc = sub_81164C8,
+ .totalItems = 5,
+ .maxShowed = 5,
+ .windowId = 0,
+ .header_X = 0,
+ .item_X = 1,
+ .cursor_X = 0,
+ .upText_Y = 0,
+ .cursorPal = 2,
+ .fillValue = 1,
+ .cursorShadowPal = 3,
+ .lettersSpacing = 0,
+ .itemVerticalPadding = 2,
+ .scrollMultiple = LIST_NO_MULTIPLE_SCROLL,
+ .fontId = 2,
+ .cursorKind = 1
+};
+
+static const struct WindowTemplate gUnknown_8456D4C = {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 3,
+ .width = 17,
+ .height = 10,
+ .paletteNum = 15,
+ .baseBlock = 0x044
+};
+
+static const struct WindowTemplate gUnknown_8456D54 = {
+ .bg = 0,
+ .tilemapLeft = 20,
+ .tilemapTop = 3,
+ .width = 7,
+ .height = 4,
+ .paletteNum = 15,
+ .baseBlock = 0x0EE
+};
+
+static const struct ListMenuItem gUnknown_8456D5C[] = {
+ {gUnknown_84571AC, 0},
+ {gUnknown_84571AC, 1},
+ {gUnknown_84571AC, 2},
+ {gUnknown_84571AC, 3},
+ {gUnknown_84571AC, 4},
+ {gUnknown_84571AC, 5},
+ {gUnknown_84571AC, 6},
+ {gUnknown_84571AC, 7},
+ {gUnknown_84571AC, 8},
+ {gUnknown_84571AC, 9},
+ {gUnknown_84571AC, 10},
+ {gUnknown_84571AC, 11},
+ {gUnknown_84571AC, 12},
+ {gUnknown_84571AC, 13},
+ {gUnknown_84571AC, 14},
+ {gUnknown_84571AC, 15}
+};
+
+static const struct ListMenuTemplate gUnknown_8456DDC = {
+ .items = gUnknown_8456D5C,
+ .moveCursorFunc = ListMenuDefaultCursorMoveFunc,
+ .itemPrintFunc = sub_8116F94,
+ .totalItems = 16,
+ .maxShowed = 5,
+ .windowId = 0,
+ .header_X = 0,
+ .item_X = 8,
+ .cursor_X = 0,
+ .upText_Y = 0,
+ .cursorPal = 2,
+ .fillValue = 1,
+ .cursorShadowPal = 3,
+ .lettersSpacing = 0,
+ .itemVerticalPadding = 2,
+ .scrollMultiple = LIST_MULTIPLE_SCROLL_DPAD,
+ .fontId = 2,
+ .cursorKind = 0
+};
+
+static const struct WindowTemplate gUnknown_8456DF4 = {
+ .bg = 0,
+ .tilemapLeft = 20,
+ .tilemapTop = 6,
+ .width = 8,
+ .height = 7,
+ .paletteNum = 15,
+ .baseBlock = 0x001
+};
+
+static const struct ListMenuItem gUnknown_8456DFC[] = {
+ {gUnknown_8459354, _8456CD8( 8, 2)},
+ {gUnknown_8459344, _8456CD8(65, 2)},
+ {gUnknown_845934C, _8456CD8(69, 2)},
+ {gUnknown_8459360, _8456CD8(64, 0)}
+};
+
+static const struct ListMenuTemplate gUnknown_8456E1C = {
+ .items = gUnknown_8456DFC,
+ .moveCursorFunc = ListMenuDefaultCursorMoveFunc,
+ .itemPrintFunc = NULL,
+ .totalItems = 4,
+ .maxShowed = 4,
+ .windowId = 0,
+ .header_X = 0,
+ .item_X = 8,
+ .cursor_X = 0,
+ .upText_Y = 0,
+ .cursorPal = 2,
+ .fillValue = 1,
+ .cursorShadowPal = 3,
+ .lettersSpacing = 1,
+ .itemVerticalPadding = 0,
+ .scrollMultiple = LIST_NO_MULTIPLE_SCROLL,
+ .fontId = 2,
+ .cursorKind = 0
+};
+
+static const struct WindowTemplate gUnknown_8456E34 = {
+ .bg = 0,
+ .tilemapLeft = 18,
+ .tilemapTop = 8,
+ .width = 11,
+ .height = 5,
+ .paletteNum = 15,
+ .baseBlock = 0x001
+};
+
+static const struct ListMenuItem gUnknown_8456E3C[] = {
+ {gText_Register, 1},
+ {gUnknown_8459370, 2},
+ {gUnknown_8459360, 3}
+};
+
+static const struct ListMenuTemplate gUnknown_8456E54 = {
+ .items = gUnknown_8456E3C,
+ .moveCursorFunc = ListMenuDefaultCursorMoveFunc,
+ .itemPrintFunc = NULL,
+ .totalItems = 3,
+ .maxShowed = 3,
+ .windowId = 0,
+ .header_X = 0,
+ .item_X = 8,
+ .cursor_X = 0,
+ .upText_Y = 0,
+ .cursorPal = 2,
+ .fillValue = 1,
+ .cursorShadowPal = 3,
+ .lettersSpacing = 1,
+ .itemVerticalPadding = 0,
+ .scrollMultiple = LIST_NO_MULTIPLE_SCROLL,
+ .fontId = 2,
+ .cursorKind = 0
+};
+
+static const struct WindowTemplate gUnknown_8456E6C = {
+ .bg = 0,
+ .tilemapLeft = 20,
+ .tilemapTop = 2,
+ .width = 9,
+ .height = 11,
+ .paletteNum = 15,
+ .baseBlock = 0x001
+};
+
+static const struct ListMenuItem gUnknown_8456E74[] = {
+ {gTypeNames[TYPE_NORMAL], TYPE_NORMAL},
+ {gTypeNames[TYPE_FIRE], TYPE_FIRE},
+ {gTypeNames[TYPE_WATER], TYPE_WATER},
+ {gTypeNames[TYPE_ELECTRIC], TYPE_ELECTRIC},
+ {gTypeNames[TYPE_GRASS], TYPE_GRASS},
+ {gTypeNames[TYPE_ICE], TYPE_ICE},
+ {gTypeNames[TYPE_GROUND], TYPE_GROUND},
+ {gTypeNames[TYPE_ROCK], TYPE_ROCK},
+ {gTypeNames[TYPE_FLYING], TYPE_FLYING},
+ {gTypeNames[TYPE_PSYCHIC], TYPE_PSYCHIC},
+ {gTypeNames[TYPE_FIGHTING], TYPE_FIGHTING},
+ {gTypeNames[TYPE_POISON], TYPE_POISON},
+ {gTypeNames[TYPE_BUG], TYPE_BUG},
+ {gTypeNames[TYPE_GHOST], TYPE_GHOST},
+ {gTypeNames[TYPE_DRAGON], TYPE_DRAGON},
+ {gTypeNames[TYPE_STEEL], TYPE_STEEL},
+ {gTypeNames[TYPE_DARK], TYPE_DARK},
+ {gUnknown_8459360, NUMBER_OF_MON_TYPES}
+};
+
+static const struct ListMenuTemplate gUnknown_8456F04 = {
+ .items = gUnknown_8456E74,
+ .moveCursorFunc = ListMenuDefaultCursorMoveFunc,
+ .itemPrintFunc = NULL,
+ .totalItems = NUMBER_OF_MON_TYPES,
+ .maxShowed = 6,
+ .windowId = 0,
+ .header_X = 0,
+ .item_X = 8,
+ .cursor_X = 0,
+ .upText_Y = 2,
+ .cursorPal = 2,
+ .fillValue = 1,
+ .cursorShadowPal = 3,
+ .lettersSpacing = 1,
+ .itemVerticalPadding = 0,
+ .scrollMultiple = LIST_NO_MULTIPLE_SCROLL,
+ .fontId = 2,
+ .cursorKind = 0
+};
+
+static const struct WindowTemplate gUnknown_8456F1C = {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 1,
+ .width = 28,
+ .height = 2,
+ .paletteNum = 13,
+ .baseBlock = 0x001
+};
+
+static const struct WindowTemplate gUnknown_8456F24 = {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 5,
+ .width = 28,
+ .height = 10,
+ .paletteNum = 13,
+ .baseBlock = 0x039
+};
+
+static const struct ListMenuItem gUnknown_8456F2C[] = {
+ {gUnknown_84571AC, -3},
+ {gUnknown_84571AC, 0},
+ {gUnknown_84571AC, 1},
+ {gUnknown_84571AC, 2},
+ {gUnknown_84571AC, 3},
+ {gUnknown_84571AC, 4},
+ {gUnknown_84571AC, 5},
+ {gUnknown_84571AC, 6},
+ {gUnknown_84571AC, 7},
+ {gUnknown_8459368, 8}
+};
+
+static const struct ListMenuTemplate gUnknown_8456F7C = {
+ .items = gUnknown_8456F2C,
+ .moveCursorFunc = ListMenuDefaultCursorMoveFunc,
+ .itemPrintFunc = sub_811ACA4,
+ .totalItems = 10,
+ .maxShowed = 5,
+ .windowId = 0,
+ .header_X = 0,
+ .item_X = 12,
+ .cursor_X = 0,
+ .upText_Y = 2,
+ .cursorPal = 14,
+ .fillValue = 15,
+ .cursorShadowPal = 13,
+ .lettersSpacing = 1,
+ .itemVerticalPadding = 1,
+ .scrollMultiple = LIST_NO_MULTIPLE_SCROLL,
+ .fontId = 2,
+ .cursorKind = 0
+};
+
+static const struct WindowTemplate gUnknown_8456F94 = {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 5,
+ .width = 28,
+ .height = 10,
+ .paletteNum = 13,
+ .baseBlock = 0x039
+};
+
+static const struct ListMenuItem gUnknown_8456F9C[] = {
+ {gUnknown_84571AC, 0},
+ {gUnknown_84571AC, 1},
+ {gUnknown_84571AC, 2},
+ {gUnknown_84571AC, 3},
+ {gUnknown_84571AC, 4},
+ {gUnknown_84571AC, 5},
+ {gUnknown_84571AC, 6},
+ {gUnknown_84571AC, 7},
+ {gUnknown_84571AC, 8},
+ {gUnknown_84571AC, 9},
+ {gUnknown_84571AC, 10},
+ {gUnknown_84571AC, 11},
+ {gUnknown_84571AC, 12},
+ {gUnknown_84571AC, 13},
+ {gUnknown_84571AC, 14},
+ {gUnknown_84571AC, 15}
+};
+
+static const struct ListMenuTemplate gUnknown_845701C = {
+ .items = gUnknown_8456F9C,
+ .moveCursorFunc = ListMenuDefaultCursorMoveFunc,
+ .itemPrintFunc = nullsub_92,
+ .totalItems = 16,
+ .maxShowed = 4,
+ .windowId = 0,
+ .header_X = 0,
+ .item_X = 8,
+ .cursor_X = 1,
+ .upText_Y = 0,
+ .cursorPal = 2,
+ .fillValue = 1,
+ .cursorShadowPal = 3,
+ .lettersSpacing = 1,
+ .itemVerticalPadding = 0,
+ .scrollMultiple = LIST_MULTIPLE_SCROLL_DPAD,
+ .fontId = 2,
+ .cursorKind = 0
+};
+
+static const struct UnkStruct_Shared gUnknown_8457034 = {};
+
+// starts at gUnknown_082F0474 in pokeemerald, union link groups
+
+ALIGNED(4) static const u8 gUnknown_845704C[] = {0x01, 0xFF};
+ALIGNED(4) static const u8 gUnknown_8457050[] = {0x02, 0xFF};
+ALIGNED(4) static const u8 gUnknown_8457054[] = {0x03, 0xFF};
+ALIGNED(4) static const u8 gUnknown_8457058[] = {0x04, 0xFF};
+ALIGNED(4) static const u8 gUnknown_845705C[] = {0x09, 0xFF};
+ALIGNED(4) static const u8 gUnknown_8457060[] = {0x0A, 0xFF};
+ALIGNED(4) static const u8 gUnknown_8457064[] = {0x0B, 0xFF};
+ALIGNED(4) static const u8 gUnknown_8457068[] = {0x15, 0xFF};
+ALIGNED(4) static const u8 gUnknown_845706C[] = {0x16, 0xFF};
+ALIGNED(4) static const u8 gUnknown_8457070[] = {0x40, 0x41, 0x44, 0x45, 0x48, 0x51, 0x52, 0x53, 0x54, 0xFF};
+ALIGNED(4) static const u8 gUnknown_845707C[] = {0x0C, 0xFF};
+ALIGNED(4) static const u8 gUnknown_8457080[] = {0x01, 0x02, 0x03, 0x04, 0x09, 0x0A, 0x0B, 0x15, 0x16, 0x0D, 0xFF};
+ALIGNED(4) static const u8 gUnknown_845708C[] = {0x01, 0x02, 0x03, 0x04, 0x0A, 0xFF};
+
+static const u8 *const gUnknown_8457094[] = {
+ gUnknown_845704C,
+ gUnknown_8457050,
+ gUnknown_8457054,
+ gUnknown_8457058,
+ gUnknown_845705C,
+ gUnknown_8457060,
+ gUnknown_8457064,
+ gUnknown_8457068,
+ gUnknown_845706C,
+ gUnknown_8457070,
+ gUnknown_845707C,
+ gUnknown_8457080,
+ gUnknown_845708C
+};
+
+static const u8 gUnknown_84570C8[] = {0x01, 0x02, 0x03, 0x04, 0x09, 0x0A, 0x0B, 0x15, 0x16, 0xF7, 0x00, 0xAF, 0xF7, 0x01, 0xFF, 0x00};
+
+#undef _8456CD8
+
+// These are functions in Emerald but inlined in FireRed
+
+#define IntlConvPartnerUname7(dest, arg1) ({ \
+ StringCopy7(dest, (arg1).unk.playerName); \
+ ConvertInternationalString(dest, (arg1).unk.gname.unk_00.unk_00_0); \
+})
+
+#define IntlConvPartnerUname(dest, arg1) ({ \
+ StringCopy(dest, (arg1).unk.playerName); \
+ ConvertInternationalString(dest, (arg1).unk.gname.unk_00.unk_00_0); \
+})
+
+#define CopyTrainerCardData(dest, src, _version) ({ \
+ (dest) = *((struct TrainerCard * )(src)); \
+ (dest).version = _version; \
+})
+
+#define GetStringRightAlignXOffset(_fontId, _string, _maxWidth) ({ \
+ u16 strWidth = GetStringWidth(_fontId, _string, 0); \
+ _maxWidth - strWidth; \
+})
+
+static void sub_811586C(u8 windowId, u8 arg1, u8 stringId)
+{
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
+ switch (arg1 << 8)
+ {
+ case 0x200:
+ sub_811A444(windowId, 2, gUnknown_845742C[0][stringId - 1], 0, 2, 0);
+ break;
+ case 0x400:
+ sub_811A444(windowId, 2, gUnknown_845742C[1][stringId - 1], 0, 2, 0);
+ break;
+ case 0x2500:
+ sub_811A444(windowId, 2, gUnknown_845742C[2][stringId - 1], 0, 2, 0);
+ break;
+ case 0x3500:
+ sub_811A444(windowId, 2, gUnknown_845742C[3][stringId - 1], 0, 2, 0);
+ break;
+ }
+
+ CopyWindowToVram(windowId, 2);
+}
+
+static void sub_8115924(u8 windowId)
+{
+ u8 text[12];
+ u8 text2[12];
+
+ sub_811A444(windowId, 2, gSaveBlock2Ptr->playerName, 0, 2, 0);
+ StringCopy(text2, gUnknown_84571B4);
+ ConvertIntToDecimalStringN(text, ReadAsU16(gSaveBlock2Ptr->playerTrainerId), STR_CONV_MODE_LEADING_ZEROS, 5);
+ StringAppend(text2, text);
+ sub_811A444(windowId, 0, text2, 0, 0x10, 0);
+}
+
+static void sub_811599C(u8 *dst, u8 caseId)
+{
+ switch (caseId)
+ {
+ case 1 ... 4:
+ case 9 ... 11:
+ case 21 ... 22:
+ // UB: argument *dst isn't used, instead it always prints to gStringVar4
+ StringExpandPlaceholders(gStringVar4, gUnknown_8457234);
+ break;
+ }
+}
+
+void TryBecomeLinkLeader(void)
+{
+ u8 taskId;
+ struct UnkStruct_Leader * dataPtr;
+
+ taskId = CreateTask(sub_8115A68, 0);
+ sUnionRoomMain.leader = dataPtr = (void*)(gTasks[taskId].data);
+ sLeader = dataPtr;
+
+ dataPtr->state = 0;
+ dataPtr->textState = 0;
+ gSpecialVar_Result = 0;
+}
+
+static void sub_8115A68(u8 taskId)
+{
+ u32 id, val;
+ struct UnkStruct_Leader * data = sUnionRoomMain.leader;
+
+ switch (data->state)
+ {
+ case 0:
+ gUnknown_203B058 = gUnknown_8456CD8[gSpecialVar_0x8004];
+ gUnknown_203B059 = gUnknown_8456CD8[gSpecialVar_0x8004] >> 8;
+ SetHostRFUtgtGname(gUnknown_203B058, 0, 0);
+ sub_800B1F4();
+ OpenLink();
+ sub_80FBB8C(gUnknown_203B059 & 0xF);
+ data->state = 3;
+ break;
+ case 3:
+ data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
+ data->field_0 = AllocZeroed(5 * sizeof(struct UnkStruct_x20));
+ data->field_8 = AllocZeroed(5 * sizeof(struct UnkStruct_x20));
+ sub_811A650(data->field_4->arr, 4);
+ sub_811A5E4(data->field_0->arr, 5);
+ LinkRfu3_SetGnameUnameFromStaticBuffers(&data->field_0->arr[0].unk.gname, data->field_0->arr[0].unk.playerName);
+ data->field_0->arr[0].field_18 = 0;
+ data->field_0->arr[0].field_1A_0 = 1;
+ data->field_0->arr[0].field_1A_1 = 0;
+ data->field_0->arr[0].field_1B = 0;
+ data->field_17 = sub_811A054(data->field_4, 0xFF);
+ data->field_10 = AddWindow(&gUnknown_8456CD0);
+ data->listWindowId = AddWindow(&gUnknown_8456CFC);
+ data->field_11 = AddWindow(&gUnknown_8456D04);
+
+ FillWindowPixelBuffer(data->field_10, PIXEL_FILL(2));
+ sub_811A444(data->field_10, 0, gUnknown_845747C, 8, 2, 4);
+ PutWindowTilemap(data->field_10);
+ CopyWindowToVram(data->field_10, 2);
+
+ DrawStdWindowFrame(data->listWindowId, FALSE);
+ gMultiuseListMenuTemplate = gUnknown_8456D34;
+ gMultiuseListMenuTemplate.windowId = data->listWindowId;
+ data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
+
+ DrawStdWindowFrame(data->field_11, FALSE);
+ PutWindowTilemap(data->field_11);
+ CopyWindowToVram(data->field_11, 2);
+
+ CopyBgTilemapBufferToVram(0);
+ data->field_13 = 1;
+ data->state = 4;
+ break;
+ case 4:
+ StringCopy(gStringVar1, gUnknown_8456C74[gUnknown_203B058]);
+ if ((gUnknown_203B059 >> 4) != 0)
+ {
+ if (data->field_13 > (gUnknown_203B059 >> 4) - 1 && (gUnknown_203B059 & 0xF) != 0)
+ StringExpandPlaceholders(gStringVar4, gUnknown_8457264);
+ else
+ StringExpandPlaceholders(gStringVar4, gUnknown_8457234);
+ }
+ else
+ {
+ sub_811599C(gStringVar4, gUnknown_203B058);
+ }
+
+ sub_811586C(data->field_11, gUnknown_203B059, data->field_13);
+ data->state = 5;
+ break;
+ case 5:
+ if (PrintOnTextbox(&data->textState, gStringVar4))
+ data->state = 6;
+ break;
+ case 6:
+ sub_8116444(data, 7, 10);
+ if (JOY_NEW(B_BUTTON))
+ {
+ if (data->field_13 == 1)
+ data->state = 23;
+ else if ((gUnknown_203B059 & 0xF0) != 0)
+ data->state = 30;
+ else
+ data->state = 19;
+ }
+ if ((gUnknown_203B059 >> 4) != 0
+ && data->field_13 > (gUnknown_203B059 >> 4) - 1
+ && (gUnknown_203B059 & 0xF) != 0
+ && sub_80FC1CC()
+ && JOY_NEW(START_BUTTON))
+ {
+ data->state = 15;
+ sub_80F8F5C();
+ }
+ if (data->state == 6 && sub_80FA5D4())
+ {
+ data->state = 9;
+ }
+ break;
+ case 9:
+ if (!sub_80FA5D4())
+ {
+ data->state = 6;
+ data->field_13 = sub_81165E8(data->field_0);
+ }
+ break;
+ case 10:
+ id = ((gUnknown_203B058 & 0xF) == 2) ? 1 : 0;
+ if (PrintOnTextbox(&data->textState, gUnknown_845767C[id]))
+ {
+ data->field_13 = sub_81165E8(data->field_0);
+ RedrawListMenu(data->listTaskId);
+ data->state = 4;
+ }
+ break;
+ case 29:
+ id = ((gUnknown_203B059 & 0xF) == 2) ? 0 : 1;
+ if (PrintOnTextbox(&data->textState, gUnknown_845767C[id]))
+ {
+ data->state = 21;
+ }
+ break;
+ case 7:
+ if (PrintOnTextbox(&data->textState, gStringVar4))
+ {
+ data->state = 11;
+ }
+ break;
+ case 11:
+ switch (sub_811A14C(&data->textState, sub_80FA634(ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName)))
+ {
+ case 0:
+ LoadWirelessStatusIndicatorSpriteGfx();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ data->field_19 = 5;
+ sub_80FA670(5, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
+ data->state = 12;
+ break;
+ case 1:
+ case -1:
+ data->field_19 = 6;
+ sub_80FA670(6, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
+ data->state = 12;
+ break;
+ case -3:
+ data->state = 9;
+ break;
+ }
+ break;
+ case 12:
+ val = sub_80FA6FC(ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
+ if (val == 1)
+ {
+ if (data->field_19 == 5)
+ {
+ data->field_0->arr[data->field_13].field_1B = 0;
+ RedrawListMenu(data->listTaskId);
+ data->field_13++;
+ if (data->field_13 == (gUnknown_203B059 & 0xF))
+ {
+ if ((gUnknown_203B059 & 0xF0) != 0 || data->field_13 == 4)
+ {
+ data->state = 15;
+ }
+ else
+ {
+ IntlConvPartnerUname7(gStringVar1, data->field_0->arr[data->field_13 - 1]);
+ StringExpandPlaceholders(gStringVar4, gUnknown_8457554);
+ data->state = 13;
+ }
+
+ sub_80F8F5C();
+ sub_811586C(data->field_11, gUnknown_203B059, data->field_13);
+ }
+ else
+ {
+ data->state = 4;
+ }
+ }
+ else
+ {
+ sub_80FBD4C(data->field_0->arr[data->field_13].unk.playerName, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId));
+ data->field_0->arr[data->field_13].field_1A_0 = 0;
+ sub_81165E8(data->field_0);
+ RedrawListMenu(data->listTaskId);
+ data->state = 4;
+ }
+
+ data->field_19 = 0;
+ }
+ else if (val == 2)
+ {
+ sub_80FB9E4(0, 0);
+ data->state = 4;
+ }
+ break;
+ case 13:
+ if (PrintOnTextbox(&data->textState, gStringVar4))
+ data->state = 14;
+ break;
+ case 14:
+ if (++data->field_E > 120)
+ data->state = 17;
+ break;
+ case 15:
+ if (PrintOnTextbox(&data->textState, gUnknown_8457514))
+ data->state = 16;
+ break;
+ case 16:
+ switch (sub_811A14C(&data->textState, FALSE))
+ {
+ case 0:
+ data->state = 17;
+ break;
+ case 1:
+ case -1:
+ if ((gUnknown_203B059 & 0xF0) != 0)
+ data->state = 30;
+ else
+ data->state = 19;
+ break;
+ }
+ break;
+ case 19:
+ if (PrintOnTextbox(&data->textState, gUnknown_8457530))
+ data->state = 20;
+ break;
+ case 20:
+ switch (sub_811A14C(&data->textState, FALSE))
+ {
+ case 0:
+ data->state = 23;
+ break;
+ case 1:
+ case -1:
+ if ((gUnknown_203B059 & 0xF0) != 0)
+ data->state = 15;
+ else if (data->field_13 == (gUnknown_203B059 & 0xF))
+ data->state = 15;
+ else
+ data->state = 4;
+ break;
+ }
+ break;
+ case 17:
+ if (!sub_8116444(data, 7, 23))
+ data->state = 18;
+ break;
+ case 18:
+ if (sub_80F8F40())
+ {
+ if (sub_80F8F7C(FALSE))
+ {
+ data->state = 26;
+ }
+ }
+ else
+ {
+ data->state = 29;
+ data->textState = 0;
+ }
+ break;
+ case 30:
+ if (PrintOnTextbox(&data->textState, gUnknown_8457610))
+ data->state = 23;
+ break;
+ case 21:
+ case 23:
+ DestroyWirelessStatusIndicatorSprite();
+ sub_80F8DC0();
+ sub_81161E4(data);
+ data->state++;
+ break;
+ case 24:
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ gSpecialVar_Result = 5;
+ break;
+ case 22:
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ gSpecialVar_Result = 8;
+ break;
+ case 26:
+ if (sub_80FBA00())
+ {
+ data->state = 29;
+ }
+ else
+ {
+ if (gReceivedRemoteLinkPlayers != 0)
+ {
+ sub_80FAFE0(1);
+ sub_8117990();
+ sub_81161E4(data);
+ DestroyTask(taskId);
+ }
+ }
+ break;
+ }
+}
+
+static void sub_81161E4(struct UnkStruct_Leader * data)
+{
+ ClearWindowTilemap(data->field_11);
+ ClearStdWindowAndFrame(data->field_11, FALSE);
+ DestroyListMenuTask(data->listTaskId, 0, 0);
+ ClearWindowTilemap(data->field_10);
+ ClearStdWindowAndFrame(data->listWindowId, FALSE);
+ CopyBgTilemapBufferToVram(0);
+ RemoveWindow(data->field_11);
+ RemoveWindow(data->listWindowId);
+ RemoveWindow(data->field_10);
+ DestroyTask(data->field_17);
+
+ Free(data->field_8);
+ Free(data->field_0);
+ Free(data->field_4);
+}
+
+static void sub_8116244(u8 *dst, u8 caseId)
+{
+ switch (caseId)
+ {
+ case 1:
+ case 2:
+ case 4:
+ StringExpandPlaceholders(dst, gUnknown_84574A0);
+ break;
+ case 21:
+ case 22:
+ StringExpandPlaceholders(dst, gUnknown_84574C4);
+ break;
+ case 3:
+ case 9:
+ case 10:
+ case 11:
+ StringExpandPlaceholders(dst, gUnknown_84574EC);
+ break;
+ }
+}
+
+static void sub_81162E0(u8 *dst, u8 caseId)
+{
+ switch (caseId)
+ {
+ case 65:
+ case 68:
+ StringExpandPlaceholders(dst, gUnknown_8457E28);
+ break;
+ case 69:
+ case 72:
+ StringExpandPlaceholders(dst, gUnknown_8457E44);
+ break;
+ }
+}
+
+static void sub_811631C(u8 *dst, u8 caseId)
+{
+ switch (caseId)
+ {
+ case 1:
+ case 2:
+ case 4:
+ case 21:
+ case 22:
+ StringExpandPlaceholders(dst, gUnknown_8459238);
+ break;
+ case 3:
+ case 9:
+ case 10:
+ case 11:
+ StringExpandPlaceholders(dst, gUnknown_8459250);
+ break;
+ }
+}
+
+static void sub_81163B0(u8 *dst, u8 caseId)
+{
+ switch (caseId)
+ {
+ case 1:
+ case 2:
+ case 4:
+ case 21:
+ case 22:
+ StringExpandPlaceholders(dst, gUnknown_84576AC);
+ break;
+ case 3:
+ case 9:
+ case 10:
+ case 11:
+ StringExpandPlaceholders(dst, gUnknown_84576C4);
+ break;
+ }
+}
+
+static bool8 sub_8116444(struct UnkStruct_Leader * data, u32 arg1, u32 arg2)
+{
+ switch (sub_8116524(data->field_0))
+ {
+ case 1:
+ PlaySE(SE_PC_LOGIN);
+ RedrawListMenu(data->listTaskId);
+ IntlConvPartnerUname7(gStringVar2, data->field_0->arr[data->field_13]);
+ sub_8116244(gStringVar4, gUnknown_203B058);
+ data->state = arg1;
+ break;
+ case 2:
+ sub_80FB9E4(0, 0);
+ RedrawListMenu(data->listTaskId);
+ data->state = arg2;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void sub_81164C8(u8 windowId, s32 itemId, u8 y)
+{
+ struct UnkStruct_Leader * data = sUnionRoomMain.leader;
+ u8 var = 0;
+
+ switch (data->field_0->arr[itemId].field_1A_0)
+ {
+ case 1:
+ if (data->field_0->arr[itemId].field_1B != 0)
+ var = 2;
+ break;
+ case 2:
+ var = 1;
+ break;
+ }
+
+ sub_811A910(windowId, 0, y, &data->field_0->arr[itemId], var, itemId);
+}
+
+static u8 sub_8116524(struct UnkStruct_Main0 * arg0)
+{
+ struct UnkStruct_Leader * data = sUnionRoomMain.leader;
+ u8 ret = 0;
+ u8 i;
+ s32 id;
+
+ for (i = 1; i < 5; i++)
+ {
+ u16 var = data->field_0->arr[i].field_1A_0;
+ if (var == 1)
+ {
+ id = sub_811A748(&data->field_0->arr[i], data->field_4->arr);
+ if (id != 0xFF)
+ {
+ data->field_0->arr[i].unk = data->field_4->arr[id].unk0;
+ data->field_0->arr[i].field_18 = var;
+ }
+ else
+ {
+ data->field_0->arr[i].field_1A_0 = 2;
+ ret = 2;
+ }
+ }
+ }
+
+ for (id = 0; id < 4; id++)
+ sub_811A798(data->field_0->arr, &data->field_4->arr[id], 5);
+
+ if (ret != 2)
+ {
+ for (id = 0; id < 5; id++)
+ {
+ if (data->field_0->arr[id].field_1B != 0)
+ ret = 1;
+ }
+ }
+
+ return ret;
+}
+
+static u8 sub_81165E8(struct UnkStruct_Main0 * arg0)
+{
+ struct UnkStruct_Leader * data = sUnionRoomMain.leader;
+ u8 copiedCount;
+ s32 i;
+ u8 ret;
+
+ for (i = 0; i < 5; i++)
+ data->field_8->arr[i] = data->field_0->arr[i];
+
+ copiedCount = 0;
+ for (i = 0; i < 5; i++)
+ {
+ if (data->field_8->arr[i].field_1A_0 == 1)
+ {
+ data->field_0->arr[copiedCount] = data->field_8->arr[i];
+ copiedCount++;
+ }
+ }
+
+ ret = copiedCount;
+ for (; copiedCount < 5; copiedCount++)
+ {
+ data->field_0->arr[copiedCount].unk = gUnknown_8457034;
+ data->field_0->arr[copiedCount].field_18 = 0;
+ data->field_0->arr[copiedCount].field_1A_0 = 0;
+ data->field_0->arr[copiedCount].field_1A_1 = 0;
+ data->field_0->arr[copiedCount].field_1B = 0;
+ }
+
+ for (i = 0; i < 5; i++)
+ {
+ if (data->field_0->arr[i].field_1A_0 != 1)
+ continue;
+ if (data->field_0->arr[i].field_1B != 0x40)
+ continue;
+
+ ret = i;
+ break;
+ }
+
+ return ret;
+}
+
+void TryJoinLinkGroup(void)
+{
+ u8 taskId;
+ struct UnkStruct_Group * dataPtr;
+
+ taskId = CreateTask(sub_8116738, 0);
+ sUnionRoomMain.group = dataPtr = (void*)(gTasks[taskId].data);
+ sGroup = dataPtr;
+
+ dataPtr->state = 0;
+ dataPtr->textState = 0;
+ gSpecialVar_Result = 0;
+}
+
+static void sub_8116738(u8 taskId)
+{
+ s32 id;
+ struct UnkStruct_Group * data = sUnionRoomMain.group;
+
+ switch (data->state)
+ {
+ case 0:
+ SetHostRFUtgtGname(gUnknown_84570C8[gSpecialVar_0x8004], 0, 0);
+ gUnknown_203B058 = gUnknown_84570C8[gSpecialVar_0x8004];
+ sub_800B1F4();
+ OpenLink();
+ sub_80FBBD8();
+ data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
+ data->field_0 = AllocZeroed(16 * sizeof(struct UnkStruct_x20));
+ data->state = 1;
+ break;
+ case 1:
+ if (PrintOnTextbox(&data->textState, gUnknown_84591B8[gSpecialVar_0x8004]))
+ data->state = 2;
+ break;
+ case 2:
+ sub_811A650(data->field_4->arr, 4);
+ sub_811A5E4(data->field_0->arr, 16);
+ data->field_11 = sub_811A054(data->field_4, gSpecialVar_0x8004);
+ data->field_C = AddWindow(&gUnknown_8456CD0);
+ data->listWindowId = AddWindow(&gUnknown_8456D4C);
+ data->field_D = AddWindow(&gUnknown_8456D54);
+
+ FillWindowPixelBuffer(data->field_C, PIXEL_FILL(2));
+ sub_811A444(data->field_C, 0, gUnknown_8458FC8, 8, 2, 4);
+ PutWindowTilemap(data->field_C);
+ CopyWindowToVram(data->field_C, 2);
+
+ DrawStdWindowFrame(data->listWindowId, FALSE);
+ gMultiuseListMenuTemplate = gUnknown_8456DDC;
+ gMultiuseListMenuTemplate.windowId = data->listWindowId;
+ data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
+
+ DrawStdWindowFrame(data->field_D, FALSE);
+ PutWindowTilemap(data->field_D);
+ sub_8115924(data->field_D);
+ CopyWindowToVram(data->field_D, 2);
+
+ CopyBgTilemapBufferToVram(0);
+ data->field_F = 0;
+ data->state = 3;
+ break;
+ case 3:
+ id = sub_8116FE4();
+ switch (id)
+ {
+ case 1:
+ PlaySE(SE_PC_LOGIN);
+ RedrawListMenu(data->listTaskId);
+ break;
+ case 0:
+ id = ListMenu_ProcessInput(data->listTaskId);
+ if (JOY_NEW(A_BUTTON) && id != -1)
+ {
+ // this unused variable along with the assignment is needed to match
+ u32 unusedVar;
+ unusedVar = data->field_0->arr[id].unk.gname.unk_0a_0;
+
+ if (data->field_0->arr[id].field_1A_0 == 1 && !data->field_0->arr[id].unk.gname.unk_0a_7)
+ {
+ u32 var = sub_8116D10(data, id);
+ if (var == 0)
+ {
+ sub_8116D60(data, id);
+ data->state = 5;
+ PlaySE(SE_PN_ON);
+ }
+ else
+ {
+ StringCopy(gStringVar4, gUnknown_8457608[var - 1]);
+ data->state = 18;
+ PlaySE(SE_PN_ON);
+ }
+ }
+ else
+ {
+ PlaySE(SE_WALL_HIT);
+ }
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ data->state = 10;
+ }
+ break;
+ default:
+ RedrawListMenu(data->listTaskId);
+ break;
+ }
+ break;
+ case 5:
+ sub_811631C(gStringVar4, gUnknown_203B058);
+ if (PrintOnTextbox(&data->textState, gStringVar4))
+ {
+ IntlConvPartnerUname7(gStringVar1, data->field_0->arr[data->field_F]);
+ data->state = 6;
+ }
+ break;
+ case 6:
+ if (gReceivedRemoteLinkPlayers != 0)
+ {
+ gUnknown_203B058 = data->field_0->arr[data->field_F].unk.gname.unk_0a_0;
+ sub_80FB9E4(0, 0);
+ switch (gUnknown_203B058)
+ {
+ case 1 ... 5:
+ case 9 ... 11:
+ case 13 ... 14:
+ case 21 ... 22:
+ data->state = 20;
+ break;
+ }
+ }
+
+ switch (sub_80FB9F4())
+ {
+ case 1:
+ data->state = 12;
+ break;
+ case 2:
+ case 6:
+ case 9:
+ data->state = 14;
+ break;
+ case 5:
+ sub_81163B0(gStringVar4, gUnknown_203B058);
+ if (PrintOnTextbox(&data->textState, gStringVar4))
+ {
+ sub_80FB9E4(7, 0);
+ StringCopy(gStringVar1, gUnknown_8456C74[gUnknown_203B058]);
+ StringExpandPlaceholders(gStringVar4, gUnknown_8457700);
+ }
+ break;
+ case 7:
+ if (data->field_15 > 0xF0)
+ {
+ if (PrintOnTextbox(&data->textState, gStringVar4))
+ {
+ sub_80FB9E4(12, 0);
+ data->field_15 = 0;
+ }
+ }
+ else
+ {
+ data->field_15++;
+ }
+ break;
+ }
+
+ if (!sub_80FB9F4() && JOY_NEW(B_BUTTON))
+ data->state = 7;
+ break;
+ case 7:
+ if (PrintOnTextbox(&data->textState, gUnknown_845771C))
+ data->state = 8;
+ break;
+ case 8:
+ switch (sub_811A14C(&data->textState, sub_80FB9F4()))
+ {
+ case 0:
+ sub_80FA6BC();
+ data->state = 9;
+ RedrawListMenu(data->listTaskId);
+ break;
+ case 1:
+ case -1:
+ data->state = 5;
+ RedrawListMenu(data->listTaskId);
+ break;
+ case -3:
+ data->state = 6;
+ RedrawListMenu(data->listTaskId);
+ break;
+ }
+ break;
+ case 9:
+ if (sub_80FB9F4())
+ data->state = 6;
+ break;
+ case 10:
+ case 12:
+ case 14:
+ case 18:
+ case 20:
+ ClearWindowTilemap(data->field_D);
+ ClearStdWindowAndFrame(data->field_D, FALSE);
+ DestroyListMenuTask(data->listTaskId, 0, 0);
+ ClearWindowTilemap(data->field_C);
+ ClearStdWindowAndFrame(data->listWindowId, FALSE);
+ CopyBgTilemapBufferToVram(0);
+ RemoveWindow(data->field_D);
+ RemoveWindow(data->listWindowId);
+ RemoveWindow(data->field_C);
+ DestroyTask(data->field_11);
+ Free(data->field_0);
+ Free(data->field_4);
+ data->state++;
+ break;
+ case 13:
+ DestroyWirelessStatusIndicatorSprite();
+ if (PrintOnTextbox(&data->textState, gUnknown_8457754[sub_80FB9F4()]))
+ {
+ gSpecialVar_Result = 6;
+ data->state = 23;
+ }
+ break;
+ case 11:
+ DestroyWirelessStatusIndicatorSprite();
+ gSpecialVar_Result = 5;
+ data->state = 23;
+ break;
+ case 15:
+ DestroyWirelessStatusIndicatorSprite();
+ if (PrintOnTextbox(&data->textState, gUnknown_8457754[sub_80FB9F4()]))
+ {
+ gSpecialVar_Result = 8;
+ data->state = 23;
+ }
+ break;
+ case 19:
+ if (PrintOnTextbox(&data->textState, gStringVar4))
+ {
+ gSpecialVar_Result = 8;
+ data->state = 23;
+ }
+ break;
+ case 23:
+ DestroyTask(taskId);
+ sub_811A41C();
+ sub_80F8DC0();
+ break;
+ case 21:
+ sub_8117990();
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+static u32 sub_8116D10(struct UnkStruct_Group * arg0, s32 id)
+{
+ struct UnkStruct_x20 * structPtr = &arg0->field_0->arr[id];
+
+ if (gUnknown_203B058 == 4 && structPtr->unk.gname.unk_00.unk_01_2 != VERSION_FIRE_RED && structPtr->unk.gname.unk_00.unk_01_2 != VERSION_LEAF_GREEN)
+ {
+ if (!(gSaveBlock2Ptr->specialSaveWarpFlags & CHAMPION_SAVEWARP))
+ return 1;
+ else if (structPtr->unk.gname.unk_00.isChampion)
+ return 0;
+ }
+ else
+ {
+ return 0;
+ }
+
+ return 2;
+}
+
+static void sub_8116D60(struct UnkStruct_Group * data, s32 id)
+{
+ data->field_F = id;
+ LoadWirelessStatusIndicatorSpriteGfx();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ RedrawListMenu(data->listTaskId);
+ IntlConvPartnerUname7(gStringVar1, data->field_0->arr[data->field_F]);
+ sub_80FB008(gUnknown_84570C8[gSpecialVar_0x8004], 0, 1);
+ sub_80FBF54(data->field_0->arr[data->field_F].unk.playerName, ReadAsU16(data->field_0->arr[data->field_F].unk.gname.unk_00.playerTrainerId));
+}
+
+u8 sub_8116DE0(void)
+{
+ u8 taskId;
+ struct UnkStruct_Group * dataPtr;
+
+ taskId = CreateTask(sub_8116E1C, 0);
+ sUnionRoomMain.group = dataPtr = (void*)(gTasks[taskId].data);
+
+ dataPtr->state = 0;
+ dataPtr->textState = 0;
+
+ sGroup = dataPtr;
+
+ return taskId;
+}
+
+static void sub_8116E1C(u8 taskId)
+{
+ struct UnkStruct_Group * data = sUnionRoomMain.group;
+
+ switch (data->state)
+ {
+ case 0:
+ SetHostRFUtgtGname(0, 0, 0);
+ sub_800B1F4();
+ OpenLink();
+ sub_80FBBD8();
+ sub_80FB128(TRUE);
+ data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
+ data->field_0 = AllocZeroed(16 * sizeof(struct UnkStruct_x20));
+ data->state = 2;
+ break;
+ case 2:
+ sub_811A650(data->field_4->arr, 4);
+ sub_811A5E4(data->field_0->arr, 16);
+ data->field_11 = sub_811A054(data->field_4, 0xFF);
+ data->field_F = 0;
+ data->state = 3;
+ break;
+ case 3:
+ if (sub_8116FE4() == 1)
+ PlaySE(SE_PC_LOGIN);
+ if (gTasks[taskId].data[15] == 0xFF)
+ data->state = 10;
+ break;
+ case 10:
+ DestroyTask(data->field_11);
+ Free(data->field_0);
+ Free(data->field_4);
+ sub_80F8DC0();
+ data->state++;
+ break;
+ case 11:
+ sub_80F8DC0();
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+static bool32 sub_8116F28(u32 arg0, u32 id)
+{
+ if (id == 0xFF)
+ return TRUE;
+
+ if (id <= NELEMS(gUnknown_8457094)) // UB: <= may access data outside the array
+ {
+ const u8 *bytes = gUnknown_8457094[id];
+
+ while ((*(bytes) != 0xFF))
+ {
+ if ((*bytes) == arg0)
+ return TRUE;
+ bytes++;
+ }
+ }
+
+ return FALSE;
+}
+
+static u8 sub_8116F5C(struct UnkStruct_Group * data, u32 id)
+{
+ if (data->field_0->arr[id].field_1A_0 == 1)
+ {
+ if (data->field_0->arr[id].unk.gname.unk_0a_7)
+ return 3;
+ else if (data->field_0->arr[id].field_1A_1 != 0)
+ return 1;
+ else if (data->field_0->arr[id].field_1B != 0)
+ return 2;
+ }
+
+ return 0;
+}
+
+static void sub_8116F94(u8 windowId, s32 itemId, u8 y)
+{
+ struct UnkStruct_Group * data = sUnionRoomMain.group;
+ u8 var = sub_8116F5C(data, itemId);
+
+ sub_811A81C(windowId, 8, y, &data->field_0->arr[itemId], var, itemId);
+}
+
+static u8 sub_8116FE4(void)
+{
+ struct UnkStruct_Group * data = sUnionRoomMain.group;
+ u8 ret = 0;
+ u8 i;
+ s32 id;
+
+ for (i = 0; i < 16; i++)
+ {
+ if (data->field_0->arr[i].field_1A_0 != 0)
+ {
+ id = sub_811A748(&data->field_0->arr[i], data->field_4->arr);
+ if (id != 0xFF)
+ {
+ if (data->field_0->arr[i].field_1A_0 == 1)
+ {
+ if (sub_811A6DC(&data->field_0->arr[i].unk, &data->field_4->arr[id].unk0))
+ {
+ data->field_0->arr[i].unk = data->field_4->arr[id].unk0;
+ data->field_0->arr[i].field_1B = 0x40;
+ ret = 1;
+ }
+ else
+ {
+ if (data->field_0->arr[i].field_1B != 0)
+ {
+ data->field_0->arr[i].field_1B--;
+ if (data->field_0->arr[i].field_1B == 0)
+ ret = 2;
+ }
+ }
+ }
+ else
+ {
+ data->field_0->arr[i].field_1A_0 = 1;
+ data->field_0->arr[i].field_1B = 0x40;
+ ret = 1;
+ }
+
+ data->field_0->arr[i].field_18 = 0;
+ }
+ else
+ {
+ if (data->field_0->arr[i].field_1A_0 != 2)
+ {
+ data->field_0->arr[i].field_18++;
+ if (data->field_0->arr[i].field_18 >= 300)
+ {
+ data->field_0->arr[i].field_1A_0 = 2;
+ ret = 2;
+ }
+ }
+ }
+ }
+ }
+
+ for (id = 0; id < 4; id++)
+ {
+ if (sub_811A798(data->field_0->arr, &data->field_4->arr[id], 16) != 0xFF)
+ ret = 1;
+ }
+
+ return ret;
+}
+
+static void sub_8117100(u8 taskId)
+{
+ CB2_ReturnFromLinkTrade();
+ DestroyTask(taskId);
+}
+
+u8 sub_8117118(void)
+{
+ u8 taskId = CreateTask(sub_8117100, 0);
+
+ return taskId;
+}
+
+static void sub_8117130(u8 taskId)
+{
+ u32 monId = GetPartyPositionOfRegisteredMon(&sUnionRoomTrade, GetMultiplayerId());
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ gTasks[taskId].data[0]++;
+ SendBlock(0, &gPlayerParty[monId], sizeof(struct Pokemon));
+ break;
+ case 1:
+ if (GetBlockReceivedStatus() == 3)
+ {
+ gEnemyParty[0] = *(struct Pokemon*)(gBlockRecvBuffer[GetMultiplayerId() ^ 1]);
+ IncrementGameStat(GAME_STAT_NUM_UNION_ROOM_BATTLES);
+ ResetBlockReceivedFlags();
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 2:
+ memcpy(gBlockSendBuffer, gSaveBlock1Ptr->mail, sizeof(struct MailStruct) * PARTY_SIZE + 4);
+ if (SendBlock(0, gBlockSendBuffer, sizeof(struct MailStruct) * PARTY_SIZE + 4))
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ if (GetBlockReceivedStatus() == 3)
+ {
+ memcpy(gLinkPartnerMail, gBlockRecvBuffer[GetMultiplayerId() ^ 1], sizeof(struct MailStruct) * PARTY_SIZE);
+ ResetBlockReceivedFlags();
+ gSelectedTradeMonPositions[TRADE_PLAYER] = monId;
+ gSelectedTradeMonPositions[TRADE_PARTNER] = PARTY_SIZE;
+ gMain.savedCallback = CB2_ReturnToField;
+ SetMainCallback2(CB2_InitTradeAnim_LinkTrade);
+ ResetUnionRoomTrade(&sUnionRoomTrade);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+static void sub_8117280(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (GetMultiplayerId() == 0)
+ sub_800A474(2);
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ if (GetBlockReceivedStatus() == sub_800A8D4())
+ {
+ s32 i;
+ u16 *recvBuff;
+
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ recvBuff = gBlockRecvBuffer[i];
+ CopyTrainerCardData(gTrainerCards[i], recvBuff, gLinkPlayers[i].version);
+ }
+
+ if (GetLinkPlayerCount() == 2)
+ {
+ recvBuff = gBlockRecvBuffer[GetMultiplayerId() ^ 1];
+ sub_81446D0(recvBuff[48]);
+ }
+ else
+ {
+ sub_81446C4();
+ }
+
+ ResetBlockReceivedFlags();
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+static void sub_8117354(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ CreateTask(sub_8117280, 5);
+ gMain.state++;
+ break;
+ case 1:
+ if (!FuncIsActiveTask(sub_8117280))
+ ShowTrainerCardInLink(GetMultiplayerId() ^ 1, CB2_ReturnToField);
+ break;
+ }
+
+ RunTasks();
+ RunTextPrinters();
+ AnimateSprites();
+ BuildOamBuffer();
+}
+
+void sub_81173C0(u16 battleFlags)
+{
+ HealPlayerParty();
+ SavePlayerParty();
+ LoadPlayerBag();
+ gLinkPlayers[0].linkType = LINKTYPE_BATTLE;
+ gLinkPlayers[GetMultiplayerId()].id = GetMultiplayerId();
+ gLinkPlayers[GetMultiplayerId() ^ 1].id = GetMultiplayerId() ^ 1;
+ gMain.savedCallback = sub_8081668;
+ gBattleTypeFlags = battleFlags;
+ PlayBattleBGM();
+}
+
+static void sub_8117440(u16 linkService, u16 x, u16 y)
+{
+ VarSet(VAR_CABLE_CLUB_STATE, linkService);
+ SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x, y);
+ SetDynamicWarpWithCoords(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x, y);
+ WarpIntoMap();
+}
+
+static void sub_81174B4(s8 mapGroup, s8 mapNum, s32 x, s32 y, u16 linkService)
+{
+ gSpecialVar_0x8004 = linkService;
+ VarSet(VAR_CABLE_CLUB_STATE, linkService);
+ gFieldLinkPlayerCount = GetLinkPlayerCount();
+ gLocalLinkPlayerId = GetMultiplayerId();
+ SetCableClubWarp();
+ SetWarpDestination(mapGroup, mapNum, -1, x, y);
+ WarpIntoMap();
+}
+
+static void sub_8117534(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ CreateTask(sub_8117280, 5);
+ gMain.state++;
+ break;
+ case 1:
+ if (!FuncIsActiveTask(sub_8117280))
+ SetMainCallback2(sub_8056788);
+ break;
+ }
+
+ RunTasks();
+ RunTextPrinters();
+ AnimateSprites();
+ BuildOamBuffer();
+}
+
+static void sub_8117594(void *arg0, bool32 arg1)
+{
+ TrainerCard_GenerateCardForLinkPlayer((struct TrainerCard * )arg0);
+ if (arg1)
+ *((u16 *)(arg0 + sizeof(struct TrainerCard))) = GetWonderCardFlagId();
+ else
+ *((u16 *)(arg0 + sizeof(struct TrainerCard))) = 0;
+}
+
+static void sub_81175BC(u8 taskId)
+{
+ sub_81446C4();
+ switch (gUnknown_203B058)
+ {
+ case 1 ... 4:
+ case 9 ... 11:
+ case 13:
+ case 14:
+ RecordMixTrainerNames();
+ break;
+ }
+
+ switch (gUnknown_203B058)
+ {
+ case 65:
+ case 81:
+ CleanupOverworldWindowsAndTilemaps();
+ gMain.savedCallback = sub_811C1C8;
+ InitChooseHalfPartyForBattle(2);
+ break;
+ case 1:
+ CleanupOverworldWindowsAndTilemaps();
+ sub_8117594(gBlockSendBuffer, TRUE);
+ HealPlayerParty();
+ SavePlayerParty();
+ LoadPlayerBag();
+ sub_81174B4(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_SINGLE_BATTLE);
+ SetMainCallback2(sub_8117534);
+ break;
+ case 2:
+ CleanupOverworldWindowsAndTilemaps();
+ HealPlayerParty();
+ SavePlayerParty();
+ LoadPlayerBag();
+ sub_8117594(gBlockSendBuffer, TRUE);
+ sub_81174B4(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_DOUBLE_BATTLE);
+ SetMainCallback2(sub_8117534);
+ break;
+ case 3:
+ CleanupOverworldWindowsAndTilemaps();
+ HealPlayerParty();
+ SavePlayerParty();
+ LoadPlayerBag();
+ sub_8117594(gBlockSendBuffer, TRUE);
+ sub_81174B4(MAP_GROUP(BATTLE_COLOSSEUM_4P), MAP_NUM(BATTLE_COLOSSEUM_4P), 5, 8, USING_MULTI_BATTLE);
+ SetMainCallback2(sub_8117534);
+ break;
+ case 4:
+ sub_8117594(gBlockSendBuffer, TRUE);
+ CleanupOverworldWindowsAndTilemaps();
+ sub_81174B4(MAP_GROUP(TRADE_CENTER), MAP_NUM(TRADE_CENTER), 5, 8, USING_TRADE_CENTER);
+ SetMainCallback2(sub_8117534);
+ break;
+ case 68:
+ CreateTask(sub_8117130, 0);
+ break;
+ case 5:
+ case 69:
+ if (GetMultiplayerId() == 0)
+ {
+ sub_80F8CFC();
+ }
+ else
+ {
+ sub_80F8D14();
+ SetHostRFUtgtGname(69, 0, 1);
+ }
+ sub_8128420();
+ break;
+ case 8:
+ case 72:
+ sub_8117594(gBlockSendBuffer, FALSE);
+ SetMainCallback2(sub_8117354);
+ break;
+ case 9:
+ sub_8117440(USING_MINIGAME, 5, 1);
+ sub_8147AA8(GetCursorSelectionMonId(), CB2_LoadMap);
+ break;
+ case 10:
+ sub_8117440(USING_BERRY_CRUSH, 9, 1);
+ sub_814B754(CB2_LoadMap);
+ break;
+ case 11:
+ sub_8117440(USING_MINIGAME, 5, 1);
+ sub_81507FC(GetCursorSelectionMonId(), CB2_LoadMap);
+ break;
+ }
+
+ DestroyTask(taskId);
+ gSpecialVar_Result = 1;
+ ScriptContext2_Disable();
+}
+
+static void sub_8117900(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ u16 *sendBuff = (u16*)(gBlockSendBuffer);
+
+ switch (data[0])
+ {
+ case 0:
+ gSpecialVar_Result = 1;
+ EnableBothScriptContexts();
+ data[0]++;
+ break;
+ case 1:
+ if (!ScriptContext1_IsScriptSetUp())
+ {
+ FadeScreen(FADE_TO_BLACK, 0);
+ data[0]++;
+ }
+ break;
+ case 2:
+ if (!gPaletteFade.active)
+ {
+ sub_800AB9C();
+ data[0]++;
+ }
+ break;
+ case 3:
+ if (IsLinkTaskFinished())
+ {
+ DestroyTask(taskId);
+ sub_81179A4();
+ }
+ break;
+ }
+}
+
+static void sub_8117990(void)
+{
+ CreateTask(sub_8117900, 0);
+}
+
+static void sub_81179A4(void)
+{
+ u8 taskId = CreateTask(sub_81175BC, 0);
+ gTasks[taskId].data[0] = 0;
+}
+
+void MEvent_CreateTask_Leader(u32 arg0)
+{
+ u8 taskId;
+ struct UnkStruct_Leader * dataPtr;
+
+ taskId = CreateTask(sub_8117A0C, 0);
+ sUnionRoomMain.leader = dataPtr = (void*)(gTasks[taskId].data);
+
+ dataPtr->state = 0;
+ dataPtr->textState = 0;
+ dataPtr->field_18 = arg0;
+ gSpecialVar_Result = 0;
+}
+
+static void sub_8117A0C(u8 taskId)
+{
+ struct UnkStruct_Leader * data = sUnionRoomMain.leader;
+ struct WindowTemplate winTemplate;
+ s32 val;
+
+ switch (data->state)
+ {
+ case 0:
+ gUnknown_203B058 = data->field_18;
+ gUnknown_203B059 = 2;
+ SetHostRFUtgtGname(data->field_18, 0, 0);
+ sub_80FAF74(FALSE, FALSE);
+ sub_800B1F4();
+ OpenLink();
+ sub_80FBB8C(2);
+ data->state = 1;
+ break;
+ case 1:
+ data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
+ data->field_0 = AllocZeroed(5 * sizeof(struct UnkStruct_x20));
+ data->field_8 = AllocZeroed(5 * sizeof(struct UnkStruct_x20));
+ sub_811A650(data->field_4->arr, 4);
+ sub_811A5E4(data->field_0->arr, 5);
+ LinkRfu3_SetGnameUnameFromStaticBuffers(&data->field_0->arr[0].unk.gname, data->field_0->arr[0].unk.playerName);
+ data->field_0->arr[0].field_18 = 0;
+ data->field_0->arr[0].field_1A_0 = 1;
+ data->field_0->arr[0].field_1A_1 = 0;
+ data->field_0->arr[0].field_1B = 0;
+ data->field_17 = sub_811A054(data->field_4, 0xFF);
+
+ winTemplate = gUnknown_8456CFC;
+ winTemplate.baseBlock = GetMysteryGiftBaseBlock();
+ data->listWindowId = AddWindow(&winTemplate);
+ MG_DrawTextBorder(data->listWindowId);
+ gMultiuseListMenuTemplate = gUnknown_8456D34;
+ gMultiuseListMenuTemplate.windowId = data->listWindowId;
+ data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
+
+ CopyBgTilemapBufferToVram(0);
+ data->field_13 = 1;
+ data->state = 2;
+ break;
+ case 2:
+ StringCopy(gStringVar1, gUnknown_8456C74[gUnknown_203B058]);
+ sub_811599C(gStringVar4, gUnknown_203B058);
+ data->state = 3;
+ break;
+ case 3:
+ AddTextPrinterToWindow1(gStringVar4);
+ data->state = 4;
+ break;
+ case 4:
+ sub_8116444(data, 5, 6);
+ if (JOY_NEW(B_BUTTON))
+ {
+ data->state = 13;
+ DestroyWirelessStatusIndicatorSprite();
+ }
+ break;
+ case 6:
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gUnknown_84577F8))
+ {
+ data->field_13 = sub_81165E8(data->field_0);
+ RedrawListMenu(data->listTaskId);
+ data->state = 2;
+ }
+ break;
+ case 5:
+ data->state = 7;
+ break;
+ case 7:
+ switch (mevent_message_print_and_prompt_yes_no(&data->textState, (u16 *)&data->field_14, FALSE, gStringVar4))
+ {
+ case 0:
+ LoadWirelessStatusIndicatorSpriteGfx();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ data->field_0->arr[data->field_13].field_1B = 0;
+ RedrawListMenu(data->listTaskId);
+ data->field_19 = 5;
+ sub_80FA670(5, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
+ data->state = 8;
+ break;
+ case 1:
+ case -1:
+ data->field_19 = 6;
+ sub_80FA670(6, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
+ data->state = 8;
+ break;
+ }
+ break;
+ case 8:
+ val = sub_80FA6FC(ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
+ if (val == 1)
+ {
+ if (data->field_19 == 5)
+ {
+ data->field_0->arr[data->field_13].field_1B = 0;
+ RedrawListMenu(data->listTaskId);
+ data->field_13++;
+ IntlConvPartnerUname7(gStringVar1, data->field_0->arr[data->field_13 - 1]);
+ StringExpandPlaceholders(gStringVar4, gUnknown_8457554);
+ data->state = 9;
+ sub_80F8F5C();
+ }
+ else
+ {
+ sub_80FBD4C(data->field_0->arr[data->field_13].unk.playerName, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId));
+ data->field_0->arr[data->field_13].field_1A_0 = 0;
+ sub_81165E8(data->field_0);
+ RedrawListMenu(data->listTaskId);
+ data->state = 2;
+ }
+
+ data->field_19 = 0;
+ }
+ else if (val == 2)
+ {
+ sub_80FB9E4(0, 0);
+ data->state = 2;
+ }
+ break;
+ case 9:
+ AddTextPrinterToWindow1(gStringVar4);
+ data->state = 10;
+ break;
+ case 10:
+ if (++data->field_E > 120)
+ data->state = 11;
+ break;
+ case 11:
+ if (!sub_8116444(data, 5, 6))
+ data->state = 12;
+ break;
+ case 12:
+ if (sub_80F8F40())
+ {
+ sub_80F8F7C(FALSE);
+ data->state = 15;
+ }
+ else
+ {
+ data->state = 6;
+ }
+ break;
+ case 13:
+ DestroyWirelessStatusIndicatorSprite();
+ sub_80F8DC0();
+ DestroyListMenuTask(data->listTaskId, 0, 0);
+ CopyBgTilemapBufferToVram(0);
+ RemoveWindow(data->listWindowId);
+ DestroyTask(data->field_17);
+ Free(data->field_8);
+ Free(data->field_0);
+ Free(data->field_4);
+ data->state++;
+ break;
+ case 14:
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gUnknown_84571B8))
+ {
+ DestroyTask(taskId);
+ gSpecialVar_Result = 5;
+ }
+ break;
+ case 15:
+ if (sub_80FB9F4() == 1 || sub_80FB9F4() == 2)
+ {
+ data->state = 13;
+ }
+ else if (gReceivedRemoteLinkPlayers != 0)
+ {
+ sub_80FAFE0(1);
+ data->state++;
+ }
+ break;
+ case 16:
+ DestroyListMenuTask(data->listTaskId, 0, 0);
+ CopyBgTilemapBufferToVram(0);
+ RemoveWindow(data->listWindowId);
+ DestroyTask(data->field_17);
+ Free(data->field_8);
+ Free(data->field_0);
+ Free(data->field_4);
+ sub_800AB9C();
+ data->state++;
+ break;
+ case 17:
+ if (IsLinkTaskFinished())
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+void MEvent_CreateTask_CardOrNewsWithFriend(u32 arg0)
+{
+ u8 taskId;
+ struct UnkStruct_Group * dataPtr;
+
+ taskId = CreateTask(sub_8117F20, 0);
+ sUnionRoomMain.group = dataPtr = (void*)(gTasks[taskId].data);
+ sGroup = dataPtr;
+
+ dataPtr->state = 0;
+ dataPtr->textState = 0;
+ dataPtr->field_12 = arg0 - 21;
+ gSpecialVar_Result = 0;
+}
+
+static void sub_8117F20(u8 taskId)
+{
+ s32 id;
+ struct WindowTemplate winTemplate1, winTemplate2;
+ struct UnkStruct_Group * data = sUnionRoomMain.group;
+
+ switch (data->state)
+ {
+ case 0:
+ SetHostRFUtgtGname(data->field_12 + 21, 0, 0);
+ sub_800B1F4();
+ OpenLink();
+ sub_80FBBD8();
+ data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
+ data->field_0 = AllocZeroed(16 * sizeof(struct UnkStruct_x20));
+ data->state = 1;
+ break;
+ case 1:
+ AddTextPrinterToWindow1(gUnknown_8458FE4);
+ data->state = 2;
+ break;
+ case 2:
+ sub_811A650(data->field_4->arr, 4);
+ sub_811A5E4(data->field_0->arr, 16);
+ data->field_11 = sub_811A054(data->field_4, data->field_12 + 7);
+
+ winTemplate1 = gUnknown_8456D4C;
+ winTemplate1.baseBlock = GetMysteryGiftBaseBlock();
+ data->listWindowId = AddWindow(&winTemplate1);
+
+ data->field_D = AddWindow(&gUnknown_8456D54);
+
+ MG_DrawTextBorder(data->listWindowId);
+ gMultiuseListMenuTemplate = gUnknown_8456DDC;
+ gMultiuseListMenuTemplate.windowId = data->listWindowId;
+ data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
+
+ MG_DrawTextBorder(data->field_D);
+ FillWindowPixelBuffer(data->field_D, PIXEL_FILL(1));
+ PutWindowTilemap(data->field_D);
+ sub_8115924(data->field_D);
+ CopyWindowToVram(data->field_D, 2);
+
+ CopyBgTilemapBufferToVram(0);
+ data->field_F = 0;
+ data->state = 3;
+ break;
+ case 3:
+ id = sub_8116FE4();
+ switch (id)
+ {
+ case 1:
+ PlaySE(SE_PC_LOGIN);
+ default:
+ RedrawListMenu(data->listTaskId);
+ break;
+ case 0:
+ id = ListMenu_ProcessInput(data->listTaskId);
+ if (JOY_NEW(A_BUTTON) && id != -1)
+ {
+ // this unused variable along with the assignment is needed to match
+ u32 unusedVar;
+ unusedVar = data->field_0->arr[id].unk.gname.unk_0a_0;
+
+ if (data->field_0->arr[id].field_1A_0 == 1 && !data->field_0->arr[id].unk.gname.unk_0a_7)
+ {
+ data->field_F = id;
+ LoadWirelessStatusIndicatorSpriteGfx();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ RedrawListMenu(data->listTaskId);
+ IntlConvPartnerUname(gStringVar1, data->field_0->arr[data->field_F]);
+ sub_80FBF54(data->field_0->arr[data->field_F].unk.playerName, ReadAsU16(data->field_0->arr[data->field_F].unk.gname.unk_00.playerTrainerId));
+ PlaySE(SE_PN_ON);
+ data->state = 4;
+ }
+ else
+ {
+ PlaySE(SE_WALL_HIT);
+ }
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ data->state = 6;
+ }
+ break;
+ }
+ break;
+ case 4:
+ AddTextPrinterToWindow1(gUnknown_8459238);
+ IntlConvPartnerUname(gStringVar1, data->field_0->arr[data->field_F]);
+ data->state = 5;
+ break;
+ case 5:
+ if (gReceivedRemoteLinkPlayers != 0)
+ {
+ gUnknown_203B058 = data->field_0->arr[data->field_F].unk.gname.unk_0a_0;
+ data->state = 10;
+ }
+
+ switch (sub_80FB9F4())
+ {
+ case 1:
+ case 2:
+ case 6:
+ data->state = 8;
+ break;
+ case 5:
+ AddTextPrinterToWindow1(gUnknown_84576AC);
+ sub_80FB9E4(0, 0);
+ break;
+ }
+ break;
+ case 6:
+ case 8:
+ case 10:
+ DestroyListMenuTask(data->listTaskId, 0, 0);
+ CopyBgTilemapBufferToVram(0);
+ RemoveWindow(data->field_D);
+ RemoveWindow(data->listWindowId);
+ DestroyTask(data->field_11);
+ Free(data->field_0);
+ Free(data->field_4);
+ data->state++;
+ break;
+ case 9:
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gUnknown_8457838[sub_80FB9F4()]))
+ {
+ DestroyWirelessStatusIndicatorSprite();
+ DestroyTask(taskId);
+ sub_80F8DC0();
+ gSpecialVar_Result = 5;
+ }
+ break;
+ case 7:
+ DestroyWirelessStatusIndicatorSprite();
+ AddTextPrinterToWindow1(gUnknown_84571B8);
+ DestroyTask(taskId);
+ sub_80F8DC0();
+ gSpecialVar_Result = 5;
+ break;
+ case 11:
+ data->state++;
+ sub_800AB9C();
+ break;
+ case 12:
+ if (IsLinkTaskFinished())
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+void MEvent_CreateTask_CardOrNewsOverWireless(u32 arg0)
+{
+ u8 taskId;
+ struct UnkStruct_Group * dataPtr;
+
+ taskId = CreateTask(sub_81182DC, 0);
+ sUnionRoomMain.group = dataPtr = (void*)(gTasks[taskId].data);
+ sGroup = dataPtr;
+
+ dataPtr->state = 0;
+ dataPtr->textState = 0;
+ dataPtr->field_12 = arg0 - 21;
+ gSpecialVar_Result = 0;
+}
+
+static void sub_81182DC(u8 taskId)
+{
+ s32 id;
+ struct WindowTemplate winTemplate;
+ struct UnkStruct_Group * data = sUnionRoomMain.group;
+
+ switch (data->state)
+ {
+ case 0:
+ SetHostRFUtgtGname(0, 0, 0);
+ sub_800B1F4();
+ OpenLink();
+ sub_80FBBD8();
+ data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
+ data->field_0 = AllocZeroed(16 * sizeof(struct UnkStruct_x20));
+ data->state = 1;
+ break;
+ case 1:
+ AddTextPrinterToWindow1(gUnknown_84591DC);
+ data->state = 2;
+ break;
+ case 2:
+ sub_811A650(data->field_4->arr, 4);
+ sub_811A5E4(data->field_0->arr, 16);
+ data->field_11 = sub_811A084(data->field_4, data->field_12 + 7);
+
+ if (data->field_13 != 0)
+ {
+ winTemplate = gUnknown_8456D4C;
+ winTemplate.baseBlock = GetMysteryGiftBaseBlock();
+ data->listWindowId = AddWindow(&winTemplate);
+
+ MG_DrawTextBorder(data->listWindowId);
+ gMultiuseListMenuTemplate = gUnknown_8456DDC;
+ gMultiuseListMenuTemplate.windowId = data->listWindowId;
+ data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
+
+ CopyBgTilemapBufferToVram(0);
+ }
+
+ data->field_F = 0;
+ data->state = 3;
+ break;
+ case 3:
+ id = sub_8116FE4();
+ switch (id)
+ {
+ case 1:
+ PlaySE(SE_PC_LOGIN);
+ default:
+ if (data->field_13 != 0)
+ RedrawListMenu(data->listTaskId);
+ break;
+ case 0:
+ if (data->field_13 != 0)
+ id = ListMenu_ProcessInput(data->listTaskId);
+ if (data->field_14 > 120)
+ {
+ if (data->field_0->arr[0].field_1A_0 == 1 && !data->field_0->arr[0].unk.gname.unk_0a_7)
+ {
+ if (sub_8119FB0(&data->field_0->arr[0].unk.gname, data->field_12 + 7))
+ {
+ data->field_F = 0;
+ data->field_14 = 0;
+ LoadWirelessStatusIndicatorSpriteGfx();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ sub_80FBF54(data->field_0->arr[0].unk.playerName, ReadAsU16(data->field_0->arr[0].unk.gname.unk_00.playerTrainerId));
+ PlaySE(SE_PN_ON);
+ data->state = 4;
+ }
+ else
+ {
+ PlaySE(SE_BOO);
+ data->state = 10;
+ }
+ }
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ data->state = 6;
+ data->field_14 = 0;
+ }
+ data->field_14++;
+ break;
+ }
+ break;
+ case 4:
+ AddTextPrinterToWindow1(gUnknown_845928C);
+ IntlConvPartnerUname(gStringVar1, data->field_0->arr[data->field_F]);
+ data->state = 5;
+ break;
+ case 5:
+ if (gReceivedRemoteLinkPlayers != 0)
+ {
+ gUnknown_203B058 = data->field_0->arr[data->field_F].unk.gname.unk_0a_0;
+ data->state = 12;
+ }
+
+ switch (sub_80FB9F4())
+ {
+ case 1:
+ case 2:
+ case 6:
+ data->state = 8;
+ break;
+ case 5:
+ AddTextPrinterToWindow1(gUnknown_845777C);
+ sub_80FB9E4(0, 0);
+ break;
+ }
+ break;
+ case 6:
+ case 8:
+ case 10:
+ case 12:
+ if (data->field_13 != 0)
+ {
+ DestroyListMenuTask(data->listTaskId, 0, 0);
+ CopyBgTilemapBufferToVram(0);
+ RemoveWindow(data->listWindowId);
+ }
+ DestroyTask(data->field_11);
+ Free(data->field_0);
+ Free(data->field_4);
+ data->state++;
+ break;
+ case 9:
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gUnknown_84577BC))
+ {
+ DestroyWirelessStatusIndicatorSprite();
+ DestroyTask(taskId);
+ sub_80F8DC0();
+ gSpecialVar_Result = 5;
+ }
+ break;
+ case 7:
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gUnknown_84571E0))
+ {
+ DestroyWirelessStatusIndicatorSprite();
+ DestroyTask(taskId);
+ sub_80F8DC0();
+ gSpecialVar_Result = 5;
+ }
+ break;
+ case 11:
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gUnknown_845933C[data->field_12]))
+ {
+ DestroyWirelessStatusIndicatorSprite();
+ DestroyTask(taskId);
+ sub_80F8DC0();
+ gSpecialVar_Result = 5;
+ }
+ break;
+ case 13:
+ data->state++;
+ sub_800AB9C();
+ break;
+ case 14:
+ if (IsLinkTaskFinished())
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+void UnionRoomSpecial(void)
+{
+ struct UnkStruct_URoom * dataPtr;
+
+ ClearAndInitHostRFUtgtGname();
+ CreateTask(sub_81186E0, 10);
+
+ // dumb line needed to match
+ sUnionRoomMain.uRoom = sUnionRoomMain.uRoom;
+
+ dataPtr = AllocZeroed(sizeof(*sUnionRoomMain.uRoom));
+ sUnionRoomMain.uRoom = dataPtr;
+ sURoom = dataPtr;
+
+ dataPtr->state = 0;
+ dataPtr->textState = 0;
+ dataPtr->field_10 = 0;
+ dataPtr->field_12 = 0;
+
+ gSpecialVar_Result = 0;
+ sub_8107D38(0xD0, 1);
+}
+
+static u16 ReadAsU16(const u8 *ptr)
+{
+ return (ptr[1] << 8) | (ptr[0]);
+}
+
+static void sub_8118664(u32 nextState, const u8 *src)
+{
+ struct UnkStruct_URoom * data = sUnionRoomMain.uRoom;
+
+ data->state = 8;
+ data->stateAfterPrint = nextState;
+ if (src != gStringVar4)
+ StringExpandPlaceholders(gStringVar4, src);
+}
+
+static void sub_811868C(const u8 *src)
+{
+ struct UnkStruct_URoom * data = sUnionRoomMain.uRoom;
+
+ data->state = 26;
+ if (src != gStringVar4)
+ StringExpandPlaceholders(gStringVar4, src);
+}
+
+static void sub_81186B0(struct UnkStruct_URoom * data)
+{
+ memcpy(&gDecompressionBuffer[0x3F00], data->field_0, 8 * sizeof(struct UnkStruct_x20));
+}
+
+static void sub_81186C8(struct UnkStruct_URoom * data)
+{
+ memcpy(data->field_0, &gDecompressionBuffer[0x3F00], 8 * sizeof(struct UnkStruct_x20));
+}
+
+static void sub_81186E0(u8 taskId)
+{
+ u32 id = 0;
+ s32 var5 = 0;
+ s32 playerGender = MALE;
+ struct UnkStruct_URoom * data = sUnionRoomMain.uRoom;
+ s16 *taskData = gTasks[taskId].data;
+
+ switch (data->state)
+ {
+ case 0:
+ data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
+ data->field_C = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
+ data->field_0 = AllocZeroed(8 * sizeof(struct UnkStruct_x20));
+ data->field_8 = AllocZeroed(sizeof(struct UnkStruct_x20));
+ sub_811A5E4(data->field_0->arr, 8);
+ gUnknown_203B058 = 0x40;
+ data->field_20 = sub_8119E84(data->field_C, data->field_4, 9);
+ ZeroUnionObjWork(data->unionObjs);
+ sub_811BB68();
+ data->state = 1;
+ break;
+ case 1:
+ sub_811BAAC(data->spriteIds, taskData[0]);
+ if (++taskData[0] == 8)
+ data->state = 2;
+ break;
+ case 2:
+ SetHostRFUtgtGname(0x40, 0, 0);
+ sub_80FAFA0(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel);
+ sub_800B1F4();
+ OpenLink();
+ sub_80FBC00();
+ sub_811A5E4(&data->field_8->arr[0], 1);
+ sub_811A650(data->field_4->arr, 4);
+ sub_811A650(data->field_C->arr, 4);
+ gSpecialVar_Result = 0;
+ data->state = 3;
+ break;
+ case 3:
+ if ((GetPartyMenuType() == PARTY_MENU_TYPE_UNION_ROOM_REGISTER
+ || GetPartyMenuType() == PARTY_MENU_TYPE_UNION_ROOM_TRADE)
+ && sUnionRoomTrade.field_0 != 0)
+ {
+ id = GetCursorSelectionMonId();
+ switch (sUnionRoomTrade.field_0)
+ {
+ case 1:
+ sub_80FB008(0x54, 0, 1);
+ if (id >= PARTY_SIZE)
+ {
+ ResetUnionRoomTrade(&sUnionRoomTrade);
+ sub_80FAFA0(0, 0, 0);
+ sub_811868C(gUnknown_8458D54);
+ }
+ else if (!RegisterTradeMonAndGetIsEgg(GetCursorSelectionMonId(), &sUnionRoomTrade))
+ {
+ sub_8118664(0x34, gUnknown_8458CD4);
+ }
+ else
+ {
+ data->state = 55;
+ }
+ break;
+ case 2:
+ sub_81186C8(data);
+ taskData[1] = sUnionRoomTrade.field_8;
+ if (id >= PARTY_SIZE)
+ {
+ sub_811868C(gUnknown_8458D9C);
+ }
+ else
+ {
+ sub_80FB008(0x54, 0, 1);
+ gUnknown_203B058 = 0x44;
+ RegisterTradeMon(GetCursorSelectionMonId(), &sUnionRoomTrade);
+ data->state = 51;
+ }
+ break;
+ }
+ sUnionRoomTrade.field_0 = 0;
+ }
+ else
+ {
+ data->state = 4;
+ }
+ break;
+ case 4:
+ if (gSpecialVar_Result != 0)
+ {
+ if (gSpecialVar_Result == 9)
+ {
+ sub_80FB008(0x54, 0, 1);
+ PlaySE(SE_PC_LOGIN);
+ StringCopy(gStringVar1, gSaveBlock2Ptr->playerName);
+ data->state = 42;
+ gSpecialVar_Result = 0;
+ }
+ else if (gSpecialVar_Result == 11)
+ {
+ sub_80FB008(0x54, 0, 1);
+ data->state = 23;
+ gSpecialVar_Result = 0;
+ }
+ else
+ {
+ taskData[0] = 0;
+ taskData[1] = gSpecialVar_Result - 1;
+ data->state = 24;
+ gSpecialVar_Result = 0;
+ }
+ }
+ else if (ScriptContext2_IsEnabled() != TRUE)
+ {
+ if (JOY_NEW(A_BUTTON))
+ {
+ if (sub_811BF00(data->field_0, &taskData[0], &taskData[1], data->spriteIds))
+ {
+ PlaySE(SE_SELECT);
+ sub_811B298();
+ data->state = 24;
+ break;
+ }
+ else if (sub_811A9B8())
+ {
+ sub_80FB008(0x54, 0, 1);
+ PlaySE(SE_PC_LOGIN);
+ sub_811B298();
+ StringCopy(gStringVar1, gSaveBlock2Ptr->playerName);
+ data->state = 45;
+ break;
+ }
+ }
+
+ switch (sub_8119B94())
+ {
+ case 1:
+ PlaySE(SE_TOY_C);
+ case 2:
+ sub_811BECC(data);
+ break;
+ case 4:
+ data->state = 11;
+ sub_811B298();
+ sub_80FAFA0(0, 0, 0);
+ sub_80FB008(0x53, sub_811B2D8(data), 0);
+ break;
+ }
+ sub_811BEDC(data);
+ }
+ break;
+ case 23:
+ if (!FuncIsActiveTask(Task_StartMenuHandleInput))
+ {
+ sub_80FB008(0x40, 0, 0);
+ data->state = 4;
+ }
+ break;
+ case 24:
+ sub_811A0E0();
+ playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0);
+ sub_80FB008(0x54, 0, 1);
+ switch (sub_811AA5C(data->field_0, taskData[0], taskData[1], playerGender))
+ {
+ case 0:
+ data->state = 26;
+ break;
+ case 1:
+ sub_80FC114(data->field_0->arr[taskData[1]].unk.playerName, &data->field_0->arr[taskData[1]].unk.gname, gUnknown_203B058);
+ data->field_12 = id; // Should be just 0, but won't match any other way.
+ data->state = 25;
+ break;
+ case 2:
+ sub_8118664(0x13, gStringVar4);
+ break;
+ }
+ break;
+ case 25:
+ sub_811A0E0();
+ switch (sub_80FB9F4())
+ {
+ case 4:
+ sub_811B258(TRUE);
+ data->state = 4;
+ break;
+ case 1:
+ case 2:
+ if (sub_80FBB0C() == TRUE)
+ sub_811868C(gUnknown_8457F90);
+ else
+ sub_8118664(30, gUnknown_8457F90);
+
+ gUnknown_203B058 = 0x40;
+ break;
+ }
+
+ if (gReceivedRemoteLinkPlayers != 0)
+ {
+ sub_8117594(gBlockSendBuffer, TRUE);
+ CreateTask(sub_8117280, 5);
+ data->state = 38;
+ }
+ break;
+ case 38:
+ if (!FuncIsActiveTask(sub_8117280))
+ {
+ if (gUnknown_203B058 == 0x44)
+ sub_8118664(31, gUnknown_84578BC);
+ else
+ data->state = 5;
+ }
+ break;
+ case 30:
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ sub_811B258(FALSE);
+ sub_811C028(taskData[0], taskData[1], data->field_0);
+ data->state = 2;
+ }
+ break;
+ case 5:
+ id = sub_811AA24(&data->field_0->arr[taskData[1]]);
+ playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0);
+ sub_8118664(6, gUnknown_8457B04[id][playerGender]);
+ break;
+ case 6:
+ var5 = sub_811A218(&data->textState, &data->field_1B, &data->field_1C, &gUnknown_8456DF4, &gUnknown_8456E1C);
+ if (var5 != -1)
+ {
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ data->state = 28;
+ }
+ else
+ {
+ data->field_98 = 0;
+ playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0);
+ if (var5 == -2 || var5 == 0x40)
+ {
+ data->field_4C[0] = 0x40;
+ sub_80F9E2C(data->field_4C);
+ StringCopy(gStringVar4, gUnknown_845842C[gLinkPlayers[0].gender]);
+ data->state = 32;
+ }
+ else
+ {
+ gUnknown_203B058 = var5;
+ gUnknown_203B059 = (u32)(var5) >> 8;
+ if (gUnknown_203B058 == 0x41 && !HasAtLeastTwoMonsOfLevel30OrLower())
+ {
+ sub_8118664(5, gUnknown_845847C);
+ }
+ else
+ {
+ data->field_4C[0] = gUnknown_203B058 | 0x40;
+ sub_80F9E2C(data->field_4C);
+ data->state = 27;
+ }
+ }
+ }
+ }
+ break;
+ case 28:
+ StringCopy(gStringVar4, gUnknown_8458434);
+ data->state = 36;
+ break;
+ case 27:
+ sub_811B0A4(data);
+ playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0);
+ id = sub_811A9FC(data->field_4C[0] & 0x3F);
+ if (PrintOnTextbox(&data->textState, gUnknown_84580F4[playerGender][id]))
+ {
+ taskData[3] = 0;
+ data->state = 29;
+ }
+ break;
+ case 32:
+ sub_800AAC0();
+ data->state = 36;
+ break;
+ case 31:
+ data->field_4C[0] = 0x44;
+ data->field_4C[1] = sUnionRoomTrade.species;
+ data->field_4C[2] = sUnionRoomTrade.level;
+ sub_80F9E2C(data->field_4C);
+ data->state = 29;
+ break;
+ case 29:
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ StringCopy(gStringVar4, gUnknown_8458434);
+ data->state = 28;
+ }
+ else
+ {
+ sub_811B0A4(data);
+ if (data->field_98 == 0x51)
+ {
+ if (gUnknown_203B058 == 8)
+ {
+ sub_811B31C(gStringVar4, data, FALSE);
+ data->state = 40;
+ }
+ else
+ {
+ data->state = 13;
+ }
+ }
+ else if (data->field_98 == 0x52)
+ {
+ data->state = 32;
+ sub_811AE68(gStringVar4, gUnknown_203B058 | 0x40, gLinkPlayers[0].gender);
+ gUnknown_203B058 = 0;
+ }
+ }
+ break;
+
+ case 7:
+ id = sub_811AA24(&data->field_0->arr[taskData[1]]);
+ playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0);
+ sub_8118664(6, gUnknown_8457B04[id][playerGender]);
+ break;
+ case 40:
+ if (PrintOnTextbox(&data->textState, gStringVar4))
+ {
+ data->state = 41;
+ sub_800AB9C();
+ data->field_98 = 0;
+ data->field_9A[0] = 0;
+ }
+ break;
+ case 41:
+ if (IsLinkTaskFinished())
+ {
+ if (GetMultiplayerId() == 0)
+ {
+ StringCopy(gStringVar1, gLinkPlayers[GetMultiplayerId() ^ 1].name);
+ id = PlayerHasMetTrainerBefore(gLinkPlayers[1].trainerId, gLinkPlayers[1].name);
+ StringExpandPlaceholders(gStringVar4, gUnknown_8457C20[id]);
+ data->state = 33;
+ }
+ else
+ {
+ data->state = 7;
+ }
+ }
+ break;
+ case 19:
+ switch (sub_811A14C(&data->textState, FALSE))
+ {
+ case 0:
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_203B058 = 0x45;
+ sub_80FB008(0x45, 0, 1);
+ sub_80FC114(data->field_0->arr[taskData[1]].unk.playerName, &data->field_0->arr[taskData[1]].unk.gname, gUnknown_203B058);
+ data->field_12 = taskData[1];
+ data->state = 20;
+ taskData[3] = 0;
+ break;
+ case 1:
+ case -1:
+ playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0);
+ sub_811868C(gUnknown_8458548[playerGender]);
+ break;
+ }
+ break;
+ case 20:
+ if (++taskData[2] > 60)
+ {
+ data->state = 21;
+ taskData[2] = 0;
+ }
+ break;
+ case 21:
+ switch (sub_80FB9F4())
+ {
+ case 4:
+ sub_811B258(TRUE);
+ data->state = 4;
+ break;
+ case 1:
+ case 2:
+ playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0);
+ sub_80FB008(0x54, 0, 1);
+ if (sub_80FBB0C() == TRUE)
+ sub_811868C(gUnknown_84585E8[playerGender]);
+ else
+ sub_8118664(30, gUnknown_84585E8[playerGender]);
+ break;
+ case 3:
+ data->state = 22;
+ break;
+ }
+ taskData[3]++;
+ break;
+ case 22:
+ if (sub_80FBA00())
+ {
+ playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0);
+ sub_80FB008(0x54, 0, 1);
+ if (sub_80FBB0C() == TRUE)
+ sub_811868C(gUnknown_84585E8[playerGender]);
+ else
+ sub_8118664(30, gUnknown_84585E8[playerGender]);
+ }
+ if (gReceivedRemoteLinkPlayers != 0)
+ data->state = 16;
+ break;
+ case 11:
+ PlaySE(SE_PINPON);
+ sub_80F8FA0();
+ data->state = 12;
+ data->field_9A[0] = 0;
+ break;
+ case 12:
+ if (sub_80FBA00())
+ {
+ sub_811B258(FALSE);
+ data->state = 2;
+ }
+ else if (gReceivedRemoteLinkPlayers != 0)
+ {
+ sub_8117594(gBlockSendBuffer, TRUE);
+ CreateTask(sub_8117280, 5);
+ data->state = 39;
+ }
+ break;
+ case 39:
+ sub_8119904(data);
+ if (!FuncIsActiveTask(sub_8117280))
+ {
+ data->state = 33;
+ StringCopy(gStringVar1, gLinkPlayers[1].name);
+ id = PlayerHasMetTrainerBefore(gLinkPlayers[1].trainerId, gLinkPlayers[1].name);
+ StringExpandPlaceholders(gStringVar4, gUnknown_8457BCC[id]);
+ }
+ break;
+ case 33:
+ sub_8119904(data);
+ if (PrintOnTextbox(&data->textState, gStringVar4))
+ data->state = 34;
+ break;
+ case 34:
+ sub_8119904(data);
+ if (sub_8119944(data) && JOY_NEW(B_BUTTON))
+ {
+ sub_80FBD6C(1);
+ StringCopy(gStringVar4, gUnknown_8457E60);
+ data->state = 36;
+ }
+ break;
+ case 35:
+ sub_8118664(9, gStringVar4);
+ break;
+ case 9:
+ switch (sub_811A14C(&data->textState, FALSE))
+ {
+ case 0:
+ data->field_4C[0] = 0x51;
+ if (gUnknown_203B058 == 0x45)
+ sub_80FB008(gUnknown_203B058 | 0x40, sub_811B2A8(1), 0);
+ else
+ sub_80FB008(gUnknown_203B058 | 0x40, sub_811B2A8(1), 1);
+
+ data->field_8->arr[0].field_1B = 0;
+ taskData[3] = 0;
+ if (gUnknown_203B058 == 0x41)
+ {
+ if (!HasAtLeastTwoMonsOfLevel30OrLower())
+ {
+ data->field_4C[0] = 0x52;
+ sub_80F9E2C(data->field_4C);
+ data->state = 10;
+ StringCopy(gStringVar4, gUnknown_84584C0);
+ }
+ else
+ {
+ sub_80F9E2C(data->field_4C);
+ data->state = 13;
+ }
+ }
+ else if (gUnknown_203B058 == 0x48)
+ {
+ sub_80F9E2C(data->field_4C);
+ sub_811B31C(gStringVar4, data, 1);
+ data->state = 40;
+ }
+ else
+ {
+ sub_80F9E2C(data->field_4C);
+ data->state = 13;
+ }
+ break;
+ case 1:
+ case -1:
+ data->field_4C[0] = 0x52;
+ sub_80F9E2C(data->field_4C);
+ data->state = 10;
+ sub_81162E0(gStringVar4, gUnknown_203B058);
+ break;
+ }
+ break;
+ case 10:
+ sub_800AAC0();
+ data->state = 36;
+ break;
+ case 36:
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ gUnknown_203B058 = 0x40;
+ sub_8118664(0x25, gStringVar4);
+ memset(data->field_4C, 0, sizeof(data->field_4C));
+ data->field_9A[0] = 0;
+ data->field_98 = 0;
+ }
+ break;
+ case 37:
+ data->state = 2;
+ sub_811B258(FALSE);
+ break;
+ case 13:
+ sub_811AECC(gStringVar4, gUnknown_203B058 | 0x40);
+ sub_8118664(14, gStringVar4);
+ break;
+ case 14:
+ sub_800AB9C();
+ data->state = 15;
+ break;
+ case 15:
+ if (IsLinkTaskFinished())
+ data->state = 16;
+ break;
+ case 16:
+ Free(data->field_8);
+ Free(data->field_0);
+ Free(data->field_C);
+ Free(data->field_4);
+ DestroyTask(data->field_20);
+ sub_811BB40(data->spriteIds);
+ data->state = 17;
+ break;
+ case 17:
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, RGB_BLACK);
+ data->state = 18;
+ break;
+ case 18:
+ if (!UpdatePaletteFade())
+ {
+ sub_811BA78();
+ DestroyTask(taskId);
+ Free(sUnionRoomMain.uRoom);
+ sub_81179A4();
+ }
+ break;
+ case 42:
+ if (sub_80F9800()->species == SPECIES_NONE)
+ {
+ data->state = 43;
+ }
+ else
+ {
+ if (sub_80F9800()->species == SPECIES_EGG)
+ {
+ StringCopy(gStringVar4, gUnknown_8458DE8);
+ }
+ else
+ {
+ StringCopy(gStringVar1, gSpeciesNames[sub_80F9800()->species]);
+ ConvertIntToDecimalStringN(gStringVar2, sub_80F9800()->level, STR_CONV_MODE_LEFT_ALIGN, 3);
+ StringExpandPlaceholders(gStringVar4, gUnknown_8458DBC);
+ }
+ sub_8118664(44, gStringVar4);
+ }
+ break;
+ case 43:
+ if (PrintOnTextbox(&data->textState, gUnknown_8458AB8))
+ data->state = 47;
+ break;
+ case 47:
+ var5 = sub_811A218(&data->textState, &data->field_1D, &data->field_1E, &gUnknown_8456E34, &gUnknown_8456E54);
+ if (var5 != -1)
+ {
+ if (var5 == -2 || var5 == 3)
+ {
+ data->state = 4;
+ sub_811B258(TRUE);
+ }
+ else
+ {
+ switch (var5)
+ {
+ case 1: // REGISTER
+ sub_8118664(53, gUnknown_8458D1C);
+ break;
+ case 2: // INFO
+ sub_8118664(47, gUnknown_8458B44);
+ break;
+ }
+ }
+ DestroyHelpMessageWindow_();
+ }
+ break;
+ case 53:
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, RGB_BLACK);
+ data->state = 54;
+ break;
+ case 54:
+ if (!gPaletteFade.active)
+ {
+ sUnionRoomTrade.field_0 = 1;
+ gFieldCallback = sub_807DCE4;
+ ChooseMonForTradingBoard(PARTY_MENU_TYPE_UNION_ROOM_REGISTER, CB2_ReturnToField);
+ }
+ break;
+ case 52:
+ var5 = sub_811A218(&data->textState, &data->field_1D, &data->field_1E, &gUnknown_8456E6C, &gUnknown_8456F04);
+ if (var5 != -1)
+ {
+ switch (var5)
+ {
+ case -2:
+ case 18:
+ ResetUnionRoomTrade(&sUnionRoomTrade);
+ sub_80FAFA0(0, 0, 0);
+ sub_811868C(gUnknown_8458D54);
+ break;
+ default:
+ sUnionRoomTrade.type = var5;
+ data->state = 55;
+ break;
+ }
+ }
+ break;
+ case 55:
+ sub_80FAFA0(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel);
+ sub_811868C(gUnknown_8458D78);
+ break;
+ case 44:
+ switch (sub_811A14C(&data->textState, FALSE))
+ {
+ case 0:
+ data->state = 56;
+ break;
+ case 1:
+ case -1:
+ sub_811B258(TRUE);
+ data->state = 4;
+ break;
+ }
+ break;
+ case 56:
+ if (PrintOnTextbox(&data->textState, gUnknown_8458E10))
+ {
+ sub_80FAFA0(0, 0, 0);
+ ResetUnionRoomTrade(&sUnionRoomTrade);
+ sub_811B258(TRUE);
+ data->state = 4;
+ }
+ break;
+ case 45:
+ if (PrintOnTextbox(&data->textState, gUnknown_8458A98))
+ data->state = 46;
+ break;
+ case 46:
+ sub_811A3F8();
+ data->state = 48;
+ break;
+ case 48:
+ var5 = sub_811A2EC(&data->textState, &data->field_1D, &data->field_4A, &data->field_1E, &gUnknown_8456F24, &gUnknown_8456F7C, data->field_0);
+ if (var5 != -1)
+ {
+ switch (var5)
+ {
+ case -2:
+ case 8:
+ sub_811B258(TRUE);
+ DestroyHelpMessageWindow_();
+ data->state = 4;
+ break;
+ default:
+ switch (sub_811ADD0(data->field_0->arr[var5].unk.gname.type, data->field_0->arr[var5].unk.gname.species))
+ {
+ case 0:
+ IntlConvPartnerUname(gStringVar1, data->field_0->arr[var5]);
+ sub_8118664(49, gUnknown_8458E70);
+ taskData[1] = var5;
+ break;
+ case 1:
+ IntlConvPartnerUname(gStringVar1, data->field_0->arr[var5]);
+ StringCopy(gStringVar2, gTypeNames[data->field_0->arr[var5].unk.gname.type]);
+ sub_8118664(46, gUnknown_8458ED0);
+ break;
+ case 2:
+ IntlConvPartnerUname(gStringVar1, data->field_0->arr[var5]);
+ StringCopy(gStringVar2, gTypeNames[data->field_0->arr[var5].unk.gname.type]);
+ sub_8118664(46, gUnknown_8458F04);
+ break;
+ }
+ break;
+ }
+ }
+ break;
+ case 49:
+ switch (sub_811A14C(&data->textState, FALSE))
+ {
+ case 0:
+ data->state = 50;
+ break;
+ case -1:
+ case 1:
+ sub_811B258(TRUE);
+ data->state = 4;
+ break;
+ }
+ break;
+ case 50:
+ if (PrintOnTextbox(&data->textState, gUnknown_8458D1C))
+ {
+ sUnionRoomTrade.field_0 = 2;
+ memcpy(&gUnknown_203B064, &data->field_0->arr[taskData[1]].unk.gname.unk_00, sizeof(gUnknown_203B064));
+ gUnionRoomRequestedMonType = data->field_0->arr[taskData[1]].unk.gname.type;
+ gUnionRoomOfferedSpecies = data->field_0->arr[taskData[1]].unk.gname.species;
+ gFieldCallback = sub_807DCE4;
+ ChooseMonForTradingBoard(PARTY_MENU_TYPE_UNION_ROOM_TRADE, CB2_ReturnToField);
+ sub_81186B0(data);
+ sUnionRoomTrade.field_8 = taskData[1];
+ }
+ break;
+ case 51:
+ gUnknown_203B058 = 0x44;
+ sub_80FC114(data->field_0->arr[taskData[1]].unk.playerName, &data->field_0->arr[taskData[1]].unk.gname, 0x44);
+ IntlConvPartnerUname(gStringVar1, data->field_0->arr[taskData[1]]);
+ sub_811A0B4(gUnknown_8457A34[2]);
+ data->state = 25;
+ break;
+ case 26:
+ if (PrintOnTextbox(&data->textState, gStringVar4))
+ {
+ sub_811B258(TRUE);
+ sub_811C028(taskData[0], taskData[1], data->field_0);
+ data->state = 4;
+ }
+ break;
+ case 8:
+ if (PrintOnTextbox(&data->textState, gStringVar4))
+ data->state = data->stateAfterPrint;
+ break;
+ }
+}
+
+void var_800D_set_xB(void)
+{
+ if (InUnionRoom() == TRUE)
+ gSpecialVar_Result = 11;
+}
+
+static void sub_8119904(struct UnkStruct_URoom * arg0)
+{
+ if (gRecvCmds[1][1] != 0 && (gRecvCmds[1][0] & 0xFF00) == 0x2F00)
+ {
+ arg0->field_9A[0] = gRecvCmds[1][1];
+ if (gRecvCmds[1][1] == 0x44)
+ {
+ arg0->field_9A[1] = gRecvCmds[1][2];
+ arg0->field_9A[2] = gRecvCmds[1][3];
+ }
+ }
+}
+
+static bool32 sub_8119944(struct UnkStruct_URoom * arg0)
+{
+ if (arg0->field_9A[0] != 0)
+ {
+ s32 var = sub_811AF6C(gStringVar4, gLinkPlayers[1].gender, &arg0->field_9A[0], arg0);
+ if (var == 0)
+ {
+ return TRUE;
+ }
+ else if (var == 1)
+ {
+ arg0->state = 35;
+ gUnknown_203B058 = arg0->field_9A[0];
+ return FALSE;
+ }
+ else if (var == 2)
+ {
+ arg0->state = 36;
+ sub_800AAC0();
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+void InitUnionRoom(void)
+{
+ struct UnkStruct_URoom * ptr;
+
+ sUnionRoomPlayerName[0] = EOS;
+ if (gQuestLogState == 2 || gQuestLogState == 3)
+ return;
+ CreateTask(sub_81199FC, 0);
+ sUnionRoomMain.uRoom = sUnionRoomMain.uRoom; // Needed to match.
+ sUnionRoomMain.uRoom = ptr = AllocZeroed(sizeof(struct UnkStruct_URoom));
+ sURoom = sUnionRoomMain.uRoom;
+ ptr->state = 0;
+ ptr->textState = 0;
+ ptr->field_10 = 0;
+ ptr->field_12 = 0;
+ sUnionRoomPlayerName[0] = EOS;
+}
+
+static void sub_81199FC(u8 taskId)
+{
+ s32 i;
+ u8 text[32];
+ struct UnkStruct_URoom * structPtr = sUnionRoomMain.uRoom;
+
+ switch (structPtr->state)
+ {
+ case 0:
+ structPtr->state = 1;
+ break;
+ case 1:
+ SetHostRFUtgtGname(0xC, 0, 0);
+ sub_800B1F4();
+ OpenLink();
+ sub_80FBC00();
+ sub_80FB128(1);
+ structPtr->state = 2;
+ break;
+ case 2:
+ structPtr->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
+ sub_811A650(structPtr->field_4->arr, 4);
+ structPtr->field_C = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
+ sub_811A650(structPtr->field_C->arr, 4);
+ structPtr->field_0 = AllocZeroed(8 * sizeof(struct UnkStruct_x20));
+ sub_811A5E4(structPtr->field_0->arr, 8);
+ structPtr->field_8 = AllocZeroed(sizeof(struct UnkStruct_x20));
+ sub_811A5E4(&structPtr->field_8->arr[0], 1);
+ structPtr->field_20 = sub_8119E84(structPtr->field_C, structPtr->field_4, 10);
+ structPtr->state = 3;
+ break;
+ case 3:
+ switch (sub_8119B94())
+ {
+ case 1:
+ case 2:
+ if (sUnionRoomPlayerName[0] == EOS)
+ {
+ for (i = 0; i < PLAYER_NAME_LENGTH; i++)
+ {
+ if (structPtr->field_0->arr[i].field_1A_0 == 1)
+ {
+ IntlConvPartnerUname(text, structPtr->field_0->arr[i]);
+ if (PlayerHasMetTrainerBefore(ReadAsU16(structPtr->field_0->arr[i].unk.gname.unk_00.playerTrainerId), text))
+ {
+ StringCopy(sUnionRoomPlayerName, text);
+ break;
+ }
+ }
+ }
+ }
+ break;
+ case 3:
+ break;
+ }
+ break;
+ case 4:
+ Free(structPtr->field_8);
+ Free(structPtr->field_0);
+ Free(structPtr->field_C);
+ Free(structPtr->field_4);
+ DestroyTask(structPtr->field_20);
+ Free(sUnionRoomMain.uRoom);
+ sub_80F8DC0();
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+bool16 BufferUnionRoomPlayerName(void)
+{
+ if (sUnionRoomPlayerName[0] != EOS)
+ {
+ StringCopy(gStringVar1, sUnionRoomPlayerName);
+ sUnionRoomPlayerName[0] = EOS;
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+static u8 sub_8119B94(void)
+{
+ s32 i;
+ u8 j;
+ struct UnkStruct_URoom * structPtr = sUnionRoomMain.uRoom;
+ s32 r7 = 0;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (sub_811A694(&structPtr->field_C->arr[i].unk0, &gUnknown_8457034) == TRUE)
+ {
+ structPtr->field_8->arr[0].unk = structPtr->field_C->arr[i].unk0;
+ structPtr->field_8->arr[0].field_18 = 0;
+ structPtr->field_8->arr[0].field_1A_0 = 1;
+ structPtr->field_8->arr[0].field_1B = 1;
+ return 4;
+ }
+ }
+ for (j = 0; j < 8; j++)
+ {
+ if (structPtr->field_0->arr[j].field_1A_0 != 0)
+ {
+ i = sub_811A748(&structPtr->field_0->arr[j], &structPtr->field_4->arr[0]);
+ if (i != 0xFF)
+ {
+ if (structPtr->field_0->arr[j].field_1A_0 == 1)
+ {
+ if (sub_811A6DC(&structPtr->field_0->arr[j].unk, &structPtr->field_4->arr[i].unk0))
+ {
+ structPtr->field_0->arr[j].unk = structPtr->field_4->arr[i].unk0;
+ structPtr->field_0->arr[j].field_1B = 0x40;
+ r7 = 1;
+ }
+ else if (structPtr->field_0->arr[j].field_1B != 0)
+ {
+ structPtr->field_0->arr[j].field_1B--;
+ if (structPtr->field_0->arr[j].field_1B == 0)
+ r7 = 2;
+ }
+ }
+ else
+ {
+ structPtr->field_0->arr[j].field_1A_0 = 1;
+ structPtr->field_0->arr[j].field_1B = 0;
+ r7 = 2;
+ }
+ structPtr->field_0->arr[j].field_18 = 0;
+ }
+ else if (structPtr->field_0->arr[j].field_1A_0 != 2)
+ {
+ structPtr->field_0->arr[j].field_18++;
+ if (structPtr->field_0->arr[j].field_18 >= 600)
+ {
+ structPtr->field_0->arr[j].field_1A_0 = 2;
+ r7 = 2;
+ }
+ }
+ else if (structPtr->field_0->arr[j].field_1A_0 == 2)
+ {
+ structPtr->field_0->arr[j].field_18++;
+ if (structPtr->field_0->arr[j].field_18 >= 900)
+ {
+ sub_811A5E4(&structPtr->field_0->arr[j], 1);
+ }
+ }
+ }
+ }
+ for (i = 0; i < 4; i++)
+ {
+ if (sub_811A798(&structPtr->field_0->arr[0], &structPtr->field_4->arr[i], 8) != 0xFF)
+ r7 = 1;
+ }
+
+ return r7;
+}
+
+static void sub_8119D34(u8 taskId)
+{
+ s32 i, j;
+ struct UnkStruct_Shared sp0;
+ struct UnkStruct_Main4 ** ptr = (void*) gTasks[taskId].data;
+ bool8 r4;
+
+ for (i = 0; i < 4; i++)
+ {
+ r4 = sub_80FCC3C(&sp0.gname, sp0.playerName, i);
+ if (!sub_8116F28(sp0.gname.unk_0a_0, gTasks[taskId].data[4]))
+ {
+ sp0 = gUnknown_8457034;
+ }
+ if (sp0.gname.unk_00.unk_00_0 == 1)
+ {
+ sp0 = gUnknown_8457034;
+ }
+ if (!r4)
+ {
+ for (j = 0; j < i; j++)
+ {
+ if (!sub_811A694(&ptr[1]->arr[j].unk0, &sp0))
+ {
+ sp0 = gUnknown_8457034;
+ }
+ }
+ ptr[1]->arr[i].unk0 = sp0;
+ ptr[1]->arr[i].unk18 = sub_811A694(&ptr[1]->arr[i].unk0, &gUnknown_8457034);
+ }
+ else
+ {
+ ptr[0]->arr[i].unk0 = sp0;
+ ptr[0]->arr[i].unk18 = sub_811A694(&ptr[0]->arr[i].unk0, &gUnknown_8457034);
+ }
+ }
+}
+
+static u8 sub_8119E84(struct UnkStruct_Main4 * a0, struct UnkStruct_Main4 * a1, u32 a2)
+{
+ u8 taskId = CreateTask(sub_8119D34, 0);
+ struct UnkStruct_Main4 ** data = (void *)gTasks[taskId].data;
+ data[0] = a0;
+ data[1] = a1;
+ gTasks[taskId].data[4] = a2;
+ return taskId;
+}
+
+static void sub_8119EB8(u8 taskId)
+{
+ s32 i, j;
+ struct UnkStruct_Main4 ** ptr = (void*) gTasks[taskId].data;
+
+ for (i = 0; i < 4; i++)
+ {
+ sub_80FCC3C(&ptr[0]->arr[i].unk0.gname, ptr[0]->arr[i].unk0.playerName, i);
+ if (!sub_8116F28(ptr[0]->arr[i].unk0.gname.unk_0a_0, gTasks[taskId].data[2]))
+ {
+ ptr[0]->arr[i].unk0 = gUnknown_8457034;
+ }
+ for (j = 0; j < i; j++)
+ {
+ if (!sub_811A694(&ptr[0]->arr[j].unk0, &ptr[0]->arr[i].unk0))
+ {
+ ptr[0]->arr[i].unk0 = gUnknown_8457034;
+ }
+ }
+ ptr[0]->arr[i].unk18 = sub_811A694(&ptr[0]->arr[i].unk0, &gUnknown_8457034);
+ }
+}
+
+static bool32 sub_8119FB0(struct GFtgtGname * arg0, s16 arg1)
+{
+ if (arg1 == 7)
+ {
+ if (!arg0->unk_00.unk_00_5)
+ {
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+ }
+ else if (arg1 == 8)
+ {
+ if (!arg0->unk_00.unk_00_4)
+ {
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+static void sub_8119FD8(u8 taskId)
+{
+ s32 i;
+ struct UnkStruct_Main4 ** ptr = (void*) gTasks[taskId].data;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (sub_80FCCF4(&ptr[0]->arr[i].unk0.gname, ptr[0]->arr[i].unk0.playerName, i))
+ {
+ sub_8119FB0(&ptr[0]->arr[i].unk0.gname, gTasks[taskId].data[2]);
+ }
+ ptr[0]->arr[i].unk18 = sub_811A694(&ptr[0]->arr[i].unk0, &gUnknown_8457034);
+ }
+}
+
+static u8 sub_811A054(struct UnkStruct_Main4 * a0, u32 a1)
+{
+ u8 taskId = CreateTask(sub_8119EB8, 0);
+ struct UnkStruct_Main4 ** ptr = (void*) gTasks[taskId].data;
+ ptr[0] = a0;
+ gTasks[taskId].data[2] = a1;
+ return taskId;
+}
+
+static u8 sub_811A084(struct UnkStruct_Main4 * a0, u32 a1)
+{
+ u8 taskId = CreateTask(sub_8119FD8, 0);
+ struct UnkStruct_Main4 ** ptr = (void*) gTasks[taskId].data;
+ ptr[0] = a0;
+ gTasks[taskId].data[2] = a1;
+ return taskId;
+}
+
+static bool32 sub_811A0B4(const u8 *src)
+{
+ LoadStdWindowFrameGfx();
+ DrawDialogueFrame(0, 1);
+ StringExpandPlaceholders(gStringVar4, src);
+ AddTextPrinterWithCustomSpeedForMessage(FALSE, 1);
+ return FALSE;
+}
+
+static bool32 sub_811A0E0(void)
+{
+ if (!RunTextPrinters_CheckPrinter0Active())
+ {
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+static bool8 PrintOnTextbox(u8 *textState, const u8 *str)
+{
+ switch (*textState)
+ {
+ case 0:
+ LoadStdWindowFrameGfx();
+ DrawDialogueFrame(0, 1);
+ StringExpandPlaceholders(gStringVar4, str);
+ AddTextPrinterForMessage(TRUE);
+ (*textState)++;
+ break;
+ case 1:
+ if (!RunTextPrinters_CheckPrinter0Active())
+ {
+ *textState = 0;
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+static s8 sub_811A14C(u8 *arg0, bool32 arg1)
+{
+ s8 r1;
+
+ switch (*arg0)
+ {
+ case 0:
+ if (arg1)
+ {
+ return -3;
+ }
+ DisplayYesNoMenuDefaultYes();
+ (*arg0)++;
+ break;
+ case 1:
+ if (arg1)
+ {
+ DestroyYesNoMenu();
+ *arg0 = 0;
+ return -3;
+ }
+ r1 = Menu_ProcessInputNoWrapClearOnChoose();
+ if (r1 == -1 || r1 == 0 || r1 == 1)
+ {
+ *arg0 = 0;
+ return r1;
+ }
+ break;
+ }
+ return -2;
+}
+
+static u8 sub_811A1AC(const struct WindowTemplate * template)
+{
+ u8 windowId = AddWindow(template);
+ DrawStdWindowFrame(windowId, FALSE);
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(15));
+ sub_811A444(windowId, 0, gUnknown_8459378, 8, 1, 6);
+ PutWindowTilemap(windowId);
+ CopyWindowToVram(windowId, 2);
+ return windowId;
+}
+
+static void sub_811A1FC(u8 windowId)
+{
+ ClearStdWindowAndFrame(windowId, TRUE);
+ RemoveWindow(windowId);
+}
+
+static s32 sub_811A218(u8 *arg0, u8 *arg1, u8 *arg2, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate)
+{
+ s32 r1, r8;
+
+ switch (*arg0)
+ {
+ case 0:
+ *arg1 = AddWindow(winTemplate);
+ DrawStdWindowFrame(*arg1, FALSE);
+ gMultiuseListMenuTemplate = *menuTemplate;
+ gMultiuseListMenuTemplate.windowId = *arg1;
+ *arg2 = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
+ CopyWindowToVram(*arg1, TRUE);
+ (*arg0)++;
+ break;
+ case 1:
+ r8 = ListMenu_ProcessInput(*arg2);
+ if (JOY_NEW(A_BUTTON))
+ {
+ DestroyListMenuTask(*arg2, NULL, NULL);
+ ClearStdWindowAndFrame(*arg1, TRUE);
+ RemoveWindow(*arg1);
+ *arg0 = 0;
+ return r8;
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ DestroyListMenuTask(*arg2, NULL, NULL);
+ ClearStdWindowAndFrame(*arg1, TRUE);
+ RemoveWindow(*arg1);
+ *arg0 = 0;
+ return -2;
+ }
+ break;
+ }
+
+ return -1;
+}
+
+static s32 sub_811A2EC(u8 *arg0, u8 *arg1, u8 *arg2, u8 *arg3, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate, struct UnkStruct_Main0 * arg6)
+{
+ s32 input;
+ s32 r4;
+
+ switch (*arg0)
+ {
+ case 0:
+ *arg3 = sub_811A1AC(&gUnknown_8456F1C);
+ *arg1 = AddWindow(winTemplate);
+ DrawStdWindowFrame(*arg1, FALSE);
+ gMultiuseListMenuTemplate = *menuTemplate;
+ gMultiuseListMenuTemplate.windowId = *arg1;
+ *arg2 = ListMenuInit(&gMultiuseListMenuTemplate, 0, 1);
+ CopyWindowToVram(*arg1, TRUE);
+ (*arg0)++;
+ break;
+ case 1:
+ input = ListMenu_ProcessInput(*arg2);
+ if (JOY_NEW(A_BUTTON | B_BUTTON))
+ {
+ if (input == 8 || JOY_NEW(B_BUTTON))
+ {
+ DestroyListMenuTask(*arg2, NULL, NULL);
+ ClearStdWindowAndFrame(*arg1, TRUE);
+ RemoveWindow(*arg1);
+ sub_811A1FC(*arg3);
+ *arg0 = 0;
+ return -2;
+ }
+ else
+ {
+ r4 = sub_811AD7C(arg6->arr, input);
+ if (r4 >= 0)
+ {
+ DestroyListMenuTask(*arg2, NULL, NULL);
+ ClearStdWindowAndFrame(*arg1, TRUE);
+ RemoveWindow(*arg1);
+ sub_811A1FC(*arg3);
+ *arg0 = 0;
+ return r4;
+ }
+ else
+ {
+ PlaySE(SE_WALL_HIT);
+ }
+ }
+ }
+ break;
+ }
+
+ return -1;
+}
+
+static void sub_811A3F8(void)
+{
+ FillBgTilemapBufferRect(0, 0, 0, 0, 32, 32, 0);
+ CopyBgTilemapBufferToVram(0);
+}
+
+static void sub_811A41C(void)
+{
+ FillBgTilemapBufferRect(0, 0, 0, 0, 32, 32, 0);
+ CopyBgTilemapBufferToVram(0);
+ EnableBothScriptContexts();
+}
+
+static void sub_811A444(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx)
+{
+ struct TextPrinterTemplate printerTemplate;
+
+ printerTemplate.currentChar = str;
+ printerTemplate.windowId = windowId;
+ printerTemplate.fontId = fontId;
+ printerTemplate.x = x;
+ printerTemplate.y = y;
+ printerTemplate.currentX = x;
+ printerTemplate.currentY = y;
+ printerTemplate.unk = 0;
+
+ gTextFlags.useAlternateDownArrow = FALSE;
+ switch (colorIdx)
+ {
+ case 0:
+ printerTemplate.letterSpacing = 0;
+ printerTemplate.lineSpacing = 0;
+ printerTemplate.fgColor = 2;
+ printerTemplate.bgColor = 1;
+ printerTemplate.shadowColor = 3;
+ break;
+ case 1:
+ printerTemplate.letterSpacing = 0;
+ printerTemplate.lineSpacing = 0;
+ printerTemplate.fgColor = 4;
+ printerTemplate.bgColor = 1;
+ printerTemplate.shadowColor = 5;
+ break;
+ case 2:
+ printerTemplate.letterSpacing = 0;
+ printerTemplate.lineSpacing = 0;
+ printerTemplate.fgColor = 6;
+ printerTemplate.bgColor = 1;
+ printerTemplate.shadowColor = 7;
+ break;
+ case 3:
+ printerTemplate.letterSpacing = 0;
+ printerTemplate.lineSpacing = 0;
+ printerTemplate.fgColor = 1;
+ printerTemplate.bgColor = 1;
+ printerTemplate.shadowColor = 3;
+ break;
+ case 4:
+ printerTemplate.letterSpacing = 0;
+ printerTemplate.lineSpacing = 0;
+ printerTemplate.fgColor = 1;
+ printerTemplate.bgColor = 2;
+ printerTemplate.shadowColor = 3;
+ break;
+ case 5:
+ printerTemplate.letterSpacing = 0;
+ printerTemplate.lineSpacing = 0;
+ printerTemplate.fgColor = 7;
+ printerTemplate.bgColor = 15;
+ printerTemplate.shadowColor = 9;
+ break;
+ case 6:
+ printerTemplate.letterSpacing = 0;
+ printerTemplate.lineSpacing = 0;
+ printerTemplate.fgColor = 14;
+ printerTemplate.bgColor = 15;
+ printerTemplate.shadowColor = 9;
+ break;
+ }
+
+ AddTextPrinter(&printerTemplate, 0xFF, NULL);
+}
+
+static void sub_811A5E4(struct UnkStruct_x20 * arg0, u8 count)
+{
+ s32 i;
+
+ for (i = 0; i < count; i++)
+ {
+ arg0[i].unk = gUnknown_8457034;
+ arg0[i].field_18 = 0xFF;
+ arg0[i].field_1A_0 = 0;
+ arg0[i].field_1A_1 = 0;
+ arg0[i].field_1B = 0;
+ }
+}
+
+static void sub_811A650(struct UnkStruct_x1C * arg0, u8 count)
+{
+ s32 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ arg0[i].unk0 = gUnknown_8457034;
+ arg0[i].unk18 = 0;
+ }
+}
+
+static bool8 sub_811A694(struct UnkStruct_Shared * arg0, const struct UnkStruct_Shared * arg1)
+{
+ s32 i;
+
+ for (i = 0; i < 2; i++)
+ {
+ if (arg0->gname.unk_00.playerTrainerId[i] != arg1->gname.unk_00.playerTrainerId[i])
+ {
+ return TRUE;
+ }
+ }
+
+ for (i = 0; i < 8; i++)
+ {
+ if (arg0->playerName[i] != arg1->playerName[i])
+ {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static bool32 sub_811A6DC(struct UnkStruct_Shared * arg0, struct UnkStruct_Shared * arg1)
+{
+ s32 i;
+
+ if (arg0->gname.unk_0a_0 != arg1->gname.unk_0a_0)
+ {
+ return TRUE;
+ }
+
+ if (arg0->gname.unk_0a_7 != arg1->gname.unk_0a_7)
+ {
+ return TRUE;
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ if (arg0->gname.unk_04[i] != arg1->gname.unk_04[i])
+ {
+ return TRUE;
+ }
+ }
+
+ if (arg0->gname.species != arg1->gname.species)
+ {
+ return TRUE;
+ }
+
+ if (arg0->gname.type != arg1->gname.type)
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static u32 sub_811A748(struct UnkStruct_x20 * arg0, struct UnkStruct_x1C * arg1)
+{
+ u8 result = 0xFF;
+ s32 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (arg1[i].unk18 && !sub_811A694(&arg0->unk, &arg1[i].unk0))
+ {
+ result = i;
+ arg1[i].unk18 = FALSE;
+ }
+ }
+
+ return result;
+}
+
+static u8 sub_811A798(struct UnkStruct_x20 * arg0, struct UnkStruct_x1C * arg1, u8 arg2)
+{
+ s32 i;
+
+ if (arg1->unk18)
+ {
+ for (i = 0; i < arg2; i++)
+ {
+ if (arg0[i].field_1A_0 == 0)
+ {
+ arg0[i].unk = arg1->unk0;
+ arg0[i].field_18 = 0;
+ arg0[i].field_1A_0 = 1;
+ arg0[i].field_1B = 64;
+ arg1->unk18 = FALSE;
+ return i;
+ }
+ }
+ }
+
+ return 0xFF;
+}
+
+static void sub_811A81C(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 * arg3, u8 arg4, u8 id)
+{
+ u8 r2;
+ u8 sp0[6];
+ u8 sp10[30];
+
+ ConvertIntToDecimalStringN(gStringVar4, id + 1, STR_CONV_MODE_LEADING_ZEROS, 2);
+ StringAppend(gStringVar4, gUnknown_84571B0);
+ sub_811A444(arg0, 0, gStringVar4, arg1, arg2, 0);
+ arg1 += 18;
+ r2 = arg3->unk.gname.unk_0a_0;
+ if (arg3->field_1A_0 == 1 && !(r2 & 0x40))
+ {
+ IntlConvPartnerUname(sp10, *arg3);
+ sub_811A444(arg0, 2, sp10, arg1, arg2, arg4);
+ ConvertIntToDecimalStringN(sp0, arg3->unk.gname.unk_00.playerTrainerId[0] | (arg3->unk.gname.unk_00.playerTrainerId[1] << 8), STR_CONV_MODE_LEADING_ZEROS, 5);
+ StringCopy(gStringVar4, gUnknown_84571B4);
+ StringAppend(gStringVar4, sp0);
+ arg1 += 77;
+ sub_811A444(arg0, 0, gStringVar4, arg1, arg2, arg4);
+ }
+}
+
+static void sub_811A910(u8 windowId, u8 x, u8 y, struct UnkStruct_x20 * arg3, u8 arg4, u8 id)
+{
+ u8 sp0[6];
+ u8 sp10[30];
+
+ if (arg3->field_1A_0 == 1)
+ {
+ IntlConvPartnerUname(sp10, *arg3);
+ sub_811A444(windowId, 2, sp10, x, y, arg4);
+ ConvertIntToDecimalStringN(sp0, arg3->unk.gname.unk_00.playerTrainerId[0] | (arg3->unk.gname.unk_00.playerTrainerId[1] << 8), STR_CONV_MODE_LEADING_ZEROS, 5);
+ StringCopy(gStringVar4, gUnknown_84571B4);
+ StringAppend(gStringVar4, sp0);
+ x += 71;
+ sub_811A444(windowId, 0, gStringVar4, x, y, arg4);
+ }
+}
+
+static bool32 sub_811A9B8(void)
+{
+ s16 x, y;
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+ if (x != 9)
+ {
+ return FALSE;
+ }
+ if (y != 8)
+ {
+ return FALSE;
+ }
+ if (gPlayerAvatar.tileTransitionState == 2 || gPlayerAvatar.tileTransitionState == 0)
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static u32 sub_811A9FC(s32 arg0)
+{
+ switch (arg0)
+ {
+ case 5:
+ return 1;
+ case 4:
+ return 2;
+ case 8:
+ return 3;
+ case 3:
+ default:
+ return 0;
+ }
+}
+
+static u32 sub_811AA24(struct UnkStruct_x20 * arg0)
+{
+ u8 sp0[30];
+ IntlConvPartnerUname(sp0, *arg0);
+ return PlayerHasMetTrainerBefore(ReadAsU16(arg0->unk.gname.unk_00.playerTrainerId), sp0);
+}
+
+static s32 sub_811AA5C(struct UnkStruct_Main0 * arg0, u8 arg1, u8 arg2, u32 playerGender)
+{
+ bool32 r2;
+
+ struct UnkStruct_x20 * r5 = &arg0->arr[arg2];
+
+ if (!r5->unk.gname.unk_0a_7 && arg1 == 0)
+ {
+ IntlConvPartnerUname(gStringVar1, *r5);
+ r2 = PlayerHasMetTrainerBefore(ReadAsU16(r5->unk.gname.unk_00.playerTrainerId), gStringVar1);
+ if (r5->unk.gname.unk_0a_0 == 0x45)
+ {
+ StringExpandPlaceholders(gStringVar4, gUnknown_8457F80[r2][playerGender]);
+ return 2;
+ }
+ else
+ {
+ sub_811A0B4(gUnknown_8457A34[r2]);
+ return 1;
+ }
+ }
+ else
+ {
+ IntlConvPartnerUname(gStringVar1, *r5);
+ if (arg1 != 0)
+ {
+ playerGender = (r5->unk.gname.unk_00.playerTrainerId[arg1 + 1] >> 3) & 1;
+ }
+ switch (r5->unk.gname.unk_0a_0 & 0x3F)
+ {
+ case 1:
+ StringExpandPlaceholders(gStringVar4, gUnknown_8458758[playerGender][Random() % 4]);
+ break;
+ case 4:
+ StringExpandPlaceholders(gStringVar4, gUnknown_8458A78[playerGender][Random() % 2]);
+ break;
+ case 5:
+ StringExpandPlaceholders(gStringVar4, gUnknown_84588BC[playerGender][Random() % 4]);
+ break;
+ case 8:
+ StringExpandPlaceholders(gStringVar4, gUnknown_84589AC[playerGender][Random() % 2]);
+ break;
+ default:
+ StringExpandPlaceholders(gStringVar4, gUnknown_8457F90);
+ break;
+ }
+ return 0;
+ }
+}
+
+static void nullsub_92(u8 windowId, s32 itemId, u8 y)
+{
+
+}
+
+static void sub_811ABE4(u8 windowId, u8 y, struct GFtgtGname * gname, const u8 * uname, u8 colorIdx)
+{
+ u8 level_t[4];
+ u16 species = gname->species;
+ u8 type = gname->type;
+ u8 level = gname->level;
+
+ sub_811A444(windowId, 2, uname, 8, y, colorIdx);
+ if (species == SPECIES_EGG)
+ {
+ sub_811A444(windowId, 2, gUnknown_8458FBC, 0x44, y, colorIdx);
+ }
+ else
+ {
+ BlitMoveInfoIcon(windowId, type + 1, 0x44, y);
+ sub_811A444(windowId, 2, gSpeciesNames[species], 0x76, y, colorIdx);
+ ConvertIntToDecimalStringN(level_t, level, STR_CONV_MODE_LEFT_ALIGN, 3);
+ sub_811A444(windowId, 2, level_t, GetStringRightAlignXOffset(2, level_t, 218), y, colorIdx);
+ }
+}
+
+static void sub_811ACA4(u8 windowId, s32 itemId, u8 y)
+{
+ struct UnkStruct_Leader * leader = sUnionRoomMain.leader;
+ struct GFtgtGname * rfu;
+ s32 i, j;
+ u8 uname[8];
+
+ if (itemId == -3 && y == gUnknown_8456F7C.upText_Y)
+ {
+ rfu = sub_80F9800();
+ if (rfu->species != SPECIES_NONE)
+ {
+ sub_811ABE4(windowId, y, rfu, gSaveBlock2Ptr->playerName, 5);
+ }
+ }
+ else
+ {
+ j = 0;
+ for (i = 0; i < 8; i++)
+ {
+ if (leader->field_0->arr[i].field_1A_0 == 1 && leader->field_0->arr[i].unk.gname.species != SPECIES_NONE)
+ {
+ j++;
+ }
+ if (j == itemId + 1)
+ {
+ IntlConvPartnerUname(uname, leader->field_0->arr[i]);
+ sub_811ABE4(windowId, y, &leader->field_0->arr[i].unk.gname, uname, 6);
+ break;
+ }
+ }
+ }
+}
+
+static s32 sub_811AD7C(struct UnkStruct_x20 * arg, s32 arg1)
+{
+ s32 i;
+ s32 j = 0;
+
+ for (i = 0; i < 8; i++)
+ {
+ if (arg[i].field_1A_0 == 1 && arg[i].unk.gname.species != SPECIES_NONE)
+ {
+ j++;
+ }
+ if (j == arg1 + 1)
+ {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+static s32 GetUnionRoomPlayerGender(s32 arg1, struct UnkStruct_Main0 * arg0)
+{
+ return arg0->arr[arg1].unk.gname.playerGender;
+}
+
+static s32 sub_811ADD0(u32 type, u32 species)
+{
+ s32 i;
+
+ if (species == SPECIES_EGG)
+ {
+ for (i = 0; i < gPlayerPartyCount; i++)
+ {
+ species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
+ if (species == SPECIES_EGG)
+ {
+ return 0;
+ }
+ }
+ return 2;
+ }
+ else
+ {
+ for (i = 0; i < gPlayerPartyCount; i++)
+ {
+ species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
+ if (gBaseStats[species].type1 == type || gBaseStats[species].type2 == type)
+ {
+ return 0;
+ }
+ }
+ return 1;
+ }
+}
+
+static void sub_811AE68(u8 *dst, s32 arg1, u32 playerGender)
+{
+ switch (arg1)
+ {
+ case 0x41:
+ StringExpandPlaceholders(dst, gUnknown_8458314[playerGender]);
+ break;
+ case 0x45:
+ StringExpandPlaceholders(dst, gUnknown_84585E8[playerGender]);
+ break;
+ case 0x44:
+ StringExpandPlaceholders(dst, gUnknown_8458F9C);
+ break;
+ case 0x48:
+ StringExpandPlaceholders(dst, gUnknown_84583B4[playerGender]);
+ break;
+ }
+}
+
+static void sub_811AECC(u8 *dst, u8 arg1)
+{
+ u8 mpId = GetMultiplayerId();
+ u8 gender = gLinkPlayers[mpId ^ 1].gender;
+
+ switch (arg1)
+ {
+ case 0x41:
+ StringCopy(dst, gUnknown_8458230[mpId][gender][0]);
+ break;
+ case 0x44:
+ StringCopy(dst, gUnknown_8458230[mpId][gender][2]);
+ break;
+ case 0x45:
+ StringCopy(dst, gUnknown_8458230[mpId][gender][1]);
+ break;
+ }
+}
+
+static s32 sub_811AF6C(u8 *dst, u32 gender, u16 *arg2, struct UnkStruct_URoom * arg3)
+{
+ s32 result = 0;
+ u16 species = SPECIES_NONE;
+ s32 i;
+
+ switch (arg2[0])
+ {
+ case 0x41:
+ StringExpandPlaceholders(dst, gUnknown_8457CA4);
+ result = 1;
+ break;
+ case 0x45:
+ StringExpandPlaceholders(dst, gUnknown_8457CF8);
+ result = 1;
+ break;
+ case 0x44:
+ ConvertIntToDecimalStringN(arg3->field_58[0], sUnionRoomTrade.playerLevel, STR_CONV_MODE_LEFT_ALIGN, 3);
+ StringCopy(arg3->field_58[1], gSpeciesNames[sUnionRoomTrade.playerSpecies]);
+ for (i = 0; i < 4; i++)
+ {
+ if (gRfuLinkStatus->partner[i].serialNo == 2)
+ {
+ ConvertIntToDecimalStringN(arg3->field_58[2], arg2[2], STR_CONV_MODE_LEFT_ALIGN, 3);
+ StringCopy(arg3->field_58[3], gSpeciesNames[arg2[1]]);
+ species = arg2[1];
+ break;
+ }
+ }
+ if (species == SPECIES_EGG)
+ {
+ StringCopy(dst, gUnknown_8457DB8);
+ }
+ else
+ {
+ for (i = 0; i < 4; i++)
+ {
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(i, arg3->field_58[i]);
+ }
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(dst, gUnknown_8457D44);
+ }
+ result = 1;
+ break;
+ case 0x48:
+ StringExpandPlaceholders(dst, gUnknown_8457C48);
+ result = 1;
+ break;
+ case 0x40:
+ StringExpandPlaceholders(dst, gUnknown_8457E0C);
+ result = 2;
+ break;
+ }
+
+ return result;
+}
+
+static bool32 sub_811B0A4(struct UnkStruct_URoom * arg0)
+{
+ if (gRecvCmds[0][1] != 0)
+ {
+ if (gRecvCmds[0][1] == 0x51)
+ {
+ arg0->field_98 = 0x51;
+ return TRUE;
+ }
+ else if (gRecvCmds[0][1] == 0x52)
+ {
+ arg0->field_98 = 0x52;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+bool32 InUnionRoom(void)
+{
+ return gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(UNION_ROOM)
+ && gSaveBlock1Ptr->location.mapNum == MAP_NUM(UNION_ROOM)
+ ? TRUE : FALSE;
+}
+
+static bool32 HasAtLeastTwoMonsOfLevel30OrLower(void)
+{
+ s32 i;
+ s32 count = 0;
+
+ for (i = 0; i < gPlayerPartyCount; i++)
+ {
+ if (GetMonData(&gPlayerParty[i], MON_DATA_LEVEL) <= 30
+ && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) != SPECIES_EGG)
+ {
+ count++;
+ }
+ }
+
+ if (count > 1)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static void ResetUnionRoomTrade(struct UnionRoomTrade * arg0)
+{
+ arg0->field_0 = 0;
+ arg0->type = 0;
+ arg0->playerPersonality = 0;
+ arg0->playerSpecies = 0;
+ arg0->playerLevel = 0;
+ arg0->species = 0;
+ arg0->level = 0;
+ arg0->personality = 0;
+}
+
+void Script_ResetUnionRoomTrade(void)
+{
+ ResetUnionRoomTrade(&sUnionRoomTrade);
+}
+
+static bool32 RegisterTradeMonAndGetIsEgg(u32 monId, struct UnionRoomTrade * trade)
+{
+ trade->playerSpecies = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES2);
+ trade->playerLevel = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL);
+ trade->playerPersonality = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY);
+ if (trade->playerSpecies == SPECIES_EGG)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static void RegisterTradeMon(u32 monId, struct UnionRoomTrade * trade)
+{
+ trade->species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES2);
+ trade->level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL);
+ trade->personality = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY);
+}
+
+static u32 GetPartyPositionOfRegisteredMon(struct UnionRoomTrade * trade, u8 multiplayerId)
+{
+ u16 response = 0;
+ u16 species;
+ u32 personality;
+ u32 cur_personality;
+ u16 cur_species;
+ s32 i;
+
+ // player
+ if (multiplayerId == 0)
+ {
+ species = trade->playerSpecies;
+ personality = trade->playerPersonality;
+ }
+ // partner
+ else
+ {
+ species = trade->species;
+ personality = trade->personality;
+ }
+
+ for (i = 0; i < gPlayerPartyCount; i++)
+ {
+ cur_personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY);
+ if (cur_personality != personality)
+ {
+ continue;
+ }
+ cur_species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
+ if (cur_species != species)
+ {
+ continue;
+ }
+ response = i;
+ break;
+ }
+
+ return response;
+}
+
+static void sub_811B258(bool32 arg0)
+{
+ sub_811A3F8();
+ ScriptContext2_Disable();
+ sub_80696F0();
+ gUnknown_203B058 = 0;
+ if (arg0)
+ {
+ sub_80FAFA0(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel);
+ sub_80FB008(0x40, 0, 0);
+ }
+}
+
+static void sub_811B298(void)
+{
+ ScriptContext2_Enable();
+ ScriptFreezeObjectEvents();
+}
+
+static u8 sub_811B2A8(s32 linkPlayer)
+{
+ u8 retval = 0x80;
+ retval |= gLinkPlayers[linkPlayer].gender << 3;
+ retval |= gLinkPlayers[linkPlayer].trainerId & 7;
+ return retval;
+}
+
+static u8 sub_811B2D8(struct UnkStruct_URoom * arg0)
+{
+ u8 retVal = 0x80;
+ u8 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (arg0->field_C->arr[i].unk18)
+ {
+ retVal |= arg0->field_C->arr[i].unk0.gname.playerGender << 3;
+ retVal |= arg0->field_C->arr[i].unk0.gname.unk_00.playerTrainerId[0] & 7;
+ break;
+ }
+ }
+
+ return retVal;
+}
+
+static void sub_811B31C(u8 *unused, struct UnkStruct_URoom * arg1, bool8 arg2)
+{
+ struct TrainerCard * trainerCard = &gTrainerCards[GetMultiplayerId() ^ 1];
+ s32 i;
+ s32 n;
+
+ DynamicPlaceholderTextUtil_Reset();
+
+ StringCopy(arg1->trainerCardStrbufs[0], gTrainerClassNames[sub_80447F0()]);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, arg1->trainerCardStrbufs[0]);
+
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, trainerCard->playerName);
+
+ StringCopy(arg1->field_174, gUnknown_84594B0[trainerCard->stars]);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, arg1->field_174);
+
+ ConvertIntToDecimalStringN(arg1->trainerCardStrbufs[2], trainerCard->caughtMonsCount, STR_CONV_MODE_LEFT_ALIGN, 3);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, arg1->trainerCardStrbufs[2]);
+
+ ConvertIntToDecimalStringN(arg1->trainerCardStrbufs[3], trainerCard->playTimeHours, STR_CONV_MODE_LEFT_ALIGN, 3);
+ ConvertIntToDecimalStringN(arg1->trainerCardStrbufs[4], trainerCard->playTimeMinutes, STR_CONV_MODE_LEADING_ZEROS, 2);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, arg1->trainerCardStrbufs[3]);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(5, arg1->trainerCardStrbufs[4]);
+
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(arg1->field_1A4, gUnknown_84594C4);
+ StringCopy(gStringVar4, arg1->field_1A4);
+
+ n = trainerCard->linkBattleWins;
+ if (n > 9999)
+ {
+ n = 9999;
+ }
+ ConvertIntToDecimalStringN(arg1->trainerCardStrbufs[0], n, STR_CONV_MODE_LEFT_ALIGN, 4);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, arg1->trainerCardStrbufs[0]);
+
+ n = trainerCard->linkBattleLosses;
+ if (n > 9999)
+ {
+ n = 9999;
+ }
+ ConvertIntToDecimalStringN(arg1->trainerCardStrbufs[1], n, STR_CONV_MODE_LEFT_ALIGN, 4);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, arg1->trainerCardStrbufs[1]);
+
+ ConvertIntToDecimalStringN(arg1->trainerCardStrbufs[2], trainerCard->pokemonTrades, STR_CONV_MODE_LEFT_ALIGN, 5);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, arg1->trainerCardStrbufs[2]);
+
+ for (i = 0; i < 4; i++)
+ {
+ CopyEasyChatWord(arg1->trainerCardStrbufs[i + 3], trainerCard->var_28[i]);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(i + 4, arg1->trainerCardStrbufs[i + 3]);
+ }
+
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(arg1->field_1A4, gUnknown_8459504);
+ StringAppend(gStringVar4, arg1->field_1A4);
+
+ if (arg2 == TRUE)
+ {
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(arg1->field_1A4, gUnknown_8459588);
+ StringAppend(gStringVar4, arg1->field_1A4);
+ }
+ else if (arg2 == FALSE)
+ {
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(arg1->field_1A4, gUnknown_8459580[trainerCard->gender]);
+ StringAppend(gStringVar4, arg1->field_1A4);
+ }
+}
diff --git a/src/union_room_battle.c b/src/union_room_battle.c
new file mode 100644
index 000000000..b75cc086d
--- /dev/null
+++ b/src/union_room_battle.c
@@ -0,0 +1,225 @@
+#include "global.h"
+#include "bg.h"
+#include "battle.h"
+#include "gpu_regs.h"
+#include "link.h"
+#include "malloc.h"
+#include "menu.h"
+#include "new_menu_helpers.h"
+#include "overworld.h"
+#include "palette.h"
+#include "party_menu.h"
+#include "strings.h"
+#include "text_window.h"
+#include "union_room.h"
+#include "window.h"
+
+struct UnkStruct_203B08C
+{
+ s16 a0;
+};
+
+static EWRAM_DATA struct UnkStruct_203B08C * gUnknown_203B08C = NULL;
+
+static const struct BgTemplate gUnknown_8457194[] = {
+ {
+ .bg = 0,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 31
+ }
+};
+
+static const struct WindowTemplate gUnknown_8457198[] = {
+ {
+ .bg = 0,
+ .tilemapLeft = 2,
+ .tilemapTop = 15,
+ .width = 26,
+ .height = 4,
+ .paletteNum = 14,
+ .baseBlock = 0x014
+ }, DUMMY_WIN_TEMPLATE
+};
+
+static const u8 gUnknown_84571A8[] = {1, 2, 3};
+
+static void sub_811C04C(void)
+{
+ s32 i;
+ sub_81173C0(BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER);
+ for (i = 0; i < 2; i++)
+ {
+ gEnemyParty[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1];
+ }
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ ZeroMonData(&gPlayerParty[i]);
+ }
+ for (i = 0; i < 2; i++)
+ {
+ gPlayerParty[i] = gEnemyParty[i];
+ }
+ IncrementGameStat(GAME_STAT_NUM_UNION_ROOM_BATTLES);
+ CalculatePlayerPartyCount();
+ gTrainerBattleOpponent_A = TRAINER_OPPONENT_C00;
+ SetMainCallback2(CB2_InitBattle);
+}
+
+static void sub_811C0E0(u8 windowId, const u8 * str, u8 x, u8 y, s32 speed)
+{
+ s32 letterSpacing = 1;
+ s32 lineSpacing = 1;
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(gUnknown_84571A8[0]));
+ AddTextPrinterParameterized4(windowId, 3, x, y, letterSpacing, lineSpacing, gUnknown_84571A8, speed, str);
+}
+
+static bool32 sub_811C150(s16 * state, const u8 * str, s32 speed)
+{
+ switch (*state)
+ {
+ case 0:
+ DrawTextBorderOuter(0, 0x001, 0xD);
+ sub_811C0E0(0, str, 0, 2, speed);
+ PutWindowTilemap(0);
+ CopyWindowToVram(0, 3);
+ (*state)++;
+ break;
+ case 1:
+ if (!IsTextPrinterActive(0))
+ {
+ *state = 0;
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+static void sub_811C1B4(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void sub_811C1C8(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ SetGpuReg(REG_OFFSET_DISPCNT, 0x0000);
+ gUnknown_203B08C = AllocZeroed(sizeof(struct UnkStruct_203B08C));
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetTasks();
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_8457194, 1);
+ ResetTempTileDataBuffers();
+ if (!InitWindows(gUnknown_8457198))
+ {
+ return;
+ }
+ DeactivateAllTextPrinters();
+ ClearWindowTilemap(0);
+ FillWindowPixelBuffer(0, PIXEL_FILL(0));
+ FillWindowPixelBuffer(0, PIXEL_FILL(1));
+ FillBgTilemapBufferRect(0, 0, 0, 0, 30, 20, 0xF);
+ TextWindow_SetStdFrame0_WithPal(0, 1, 0xD0);
+ Menu_LoadStdPal();
+ SetVBlankCallback(sub_811C1B4);
+ gMain.state++;
+ break;
+ case 1:
+ if (sub_811C150(&gUnknown_203B08C->a0, gText_CommStandbyAwaitingOtherPlayer, 0))
+ {
+ gMain.state++;
+ }
+ break;
+ case 2:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ ShowBg(0);
+ gMain.state++;
+ break;
+ case 3:
+ if (!UpdatePaletteFade())
+ {
+ memset(gBlockSendBuffer, 0, 0x20);
+ if (gSelectedOrderFromParty[0] == -gSelectedOrderFromParty[1])
+ {
+ gBlockSendBuffer[0] = 0x52;
+ }
+ else
+ {
+ gBlockSendBuffer[0] = 0x51;
+ }
+ SendBlock(0, gBlockSendBuffer, 0x20);
+ gMain.state++;
+ }
+ break;
+ case 4:
+ if (GetBlockReceivedStatus() == 3)
+ {
+ if (gBlockRecvBuffer[0][0] == 0x51 && gBlockRecvBuffer[1][0] == 0x51)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gMain.state = 50;
+ }
+ else
+ {
+ sub_800AAC0();
+ if (gBlockRecvBuffer[GetMultiplayerId()][0] == 0x52)
+ {
+ gMain.state = 6;
+ }
+ else
+ {
+ gMain.state = 8;
+ }
+ }
+ ResetBlockReceivedFlags();
+ }
+ break;
+ case 50:
+ if (!UpdatePaletteFade())
+ {
+ sub_800AB9C();
+ gMain.state++;
+ }
+ break;
+ case 51:
+ if (IsLinkTaskFinished())
+ {
+ SetMainCallback2(sub_811C04C);
+ }
+ break;
+ case 6:
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ gMain.state++;
+ }
+ break;
+ case 7:
+ if (sub_811C150(&gUnknown_203B08C->a0, gText_RefusedBattle, 1))
+ {
+ SetMainCallback2(CB2_ReturnToField);
+ }
+ break;
+ case 8:
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ gMain.state++;
+ }
+ break;
+ case 9:
+ if (sub_811C150(&gUnknown_203B08C->a0, gText_BattleWasRefused, 1))
+ {
+ SetMainCallback2(CB2_ReturnToField);
+ }
+ break;
+ }
+ RunTasks();
+ RunTextPrinters();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
diff --git a/src/union_room_message.c b/src/union_room_message.c
new file mode 100644
index 000000000..9ca5aa15b
--- /dev/null
+++ b/src/union_room_message.c
@@ -0,0 +1,543 @@
+#include "global.h"
+#include "union_room_message.h"
+#include "mevent_server.h"
+
+ALIGNED(4) const u8 gUnknown_84571AC[] = _("");
+ALIGNED(4) const u8 gUnknown_84571B0[] = _(":");
+ALIGNED(4) const u8 gUnknown_84571B4[] = _("{EXTRA 7}");
+ALIGNED(4) const u8 gUnknown_84571B8[] = _("Please start over from the beginning.");
+ALIGNED(4) const u8 gUnknown_84571E0[] = _("The WIRELESS COMMUNICATION\nSYSTEM search has been canceled.");
+ALIGNED(4) const u8 gUnref_845721C[] = _("ともだちからの れんらくを\nまっています");
+ALIGNED(4) const u8 gUnknown_8457234[] = _("{STR_VAR_1}! Awaiting\ncommunication from another player.");
+ALIGNED(4) const u8 gUnknown_8457264[] = _("{STR_VAR_1}! Awaiting link!\nPress START when everyone's ready.");
+
+ALIGNED(4) const u8 gJPText_SingleBattle[] = _("シングルバトルを かいさいする");
+ALIGNED(4) const u8 gJPText_DoubleBattle[] = _("ダブルバトルを かいさいする");
+ALIGNED(4) const u8 gJPText_MultiBattle[] = _("マルチバトルを かいさいする");
+ALIGNED(4) const u8 gJPText_TradePokemon[] = _("ポケモンこうかんを かいさいする");
+ALIGNED(4) const u8 gJPText_Chat[] = _("チャットを かいさいする");
+ALIGNED(4) const u8 gJPText_DistWonderCard[] = _("ふしぎなカードをくばる");
+ALIGNED(4) const u8 gJPText_DistWonderNews[] = _("ふしぎなニュースをくばる");
+ALIGNED(4) const u8 unref_text_union_room_1[] = _("ふしぎなできごとを かいさいする");
+ALIGNED(4) const u8 gJPText_HoldPokemonJump[] = _("なわとびを かいさいする");
+ALIGNED(4) const u8 gJPText_HoldBerryCrush[] = _("きのみマッシャーを かいさいする");
+ALIGNED(4) const u8 gJPText_HoldBerryPicking[] = _("きのみどりを かいさいする");
+ALIGNED(4) const u8 gJPText_HoldSpinTrade[] = _("ぐるぐるこうかんを かいさいする");
+ALIGNED(4) const u8 gJPText_HoldSpinShop[] = _("ぐるぐるショップを かいさいする");
+
+const u8 *const unref_text_ptrs_union_room_0[] = {
+ gJPText_SingleBattle,
+ gJPText_DoubleBattle,
+ gJPText_MultiBattle,
+ gJPText_TradePokemon,
+ gJPText_Chat,
+ gJPText_DistWonderCard,
+ gJPText_DistWonderNews,
+ gJPText_DistWonderCard,
+ gJPText_HoldPokemonJump,
+ gJPText_HoldBerryCrush,
+ gJPText_HoldBerryPicking,
+ gJPText_HoldBerryPicking,
+ gJPText_HoldSpinTrade,
+ gJPText_HoldSpinShop
+};
+
+const u8 gText_1PlayerNeeded[] = _("1 player\nneeded.");
+const u8 gText_2PlayersNeeded[] = _("2 players\nneeded.");
+const u8 gText_3PlayersNeeded[] = _("3 players\nneeded.");
+const u8 gText_4PlayersNeeded[] = _("あと4にん\nひつよう");
+const u8 gText_2PlayerMode[] = _("2-PLAYER\nMODE");
+const u8 gText_3PlayerMode[] = _("3-PLAYER\nMODE");
+const u8 gText_4PlayerMode[] = _("4-PLAYER\nMODE");
+const u8 gText_5PlayerMode[] = _("5-PLAYER\nMODE");
+
+const u8 *const gUnknown_845742C[][5] = {
+ {
+ gText_1PlayerNeeded,
+ gText_2PlayerMode
+ }, {
+ gText_3PlayersNeeded,
+ gText_2PlayersNeeded,
+ gText_1PlayerNeeded,
+ gText_4PlayerMode
+ }, {
+ gText_1PlayerNeeded,
+ gText_2PlayerMode,
+ gText_3PlayerMode,
+ gText_4PlayerMode,
+ gText_5PlayerMode
+ }, {
+ gText_2PlayersNeeded,
+ gText_1PlayerNeeded,
+ gText_3PlayerMode,
+ gText_4PlayerMode,
+ gText_5PlayerMode
+ }
+};
+
+ALIGNED(4) const u8 gUnknown_845747C[] = _("{B_BUTTON}CANCEL");
+ALIGNED(4) const u8 unref_text_union_room_2[] = _("ため\nさんかしゃ ぼしゅうちゅう です!");
+ALIGNED(4) const u8 gUnknown_84574A0[] = _("{STR_VAR_2} contacted you for\n{STR_VAR_1}. Accept?");
+ALIGNED(4) const u8 gUnknown_84574C4[] = _("{STR_VAR_2} contacted you.\nWill you share {STR_VAR_1}?");
+ALIGNED(4) const u8 gUnknown_84574EC[] = _("{STR_VAR_2} contacted you.\nAdd to the members?");
+ALIGNED(4) const u8 gUnknown_8457514[] = _("{STR_VAR_1}!\nAre these members OK?");
+ALIGNED(4) const u8 gUnknown_8457530[] = _("Cancel {STR_VAR_1} MODE\nwith these members?");
+ALIGNED(4) const u8 gUnknown_8457554[] = _("An “OK” was sent\nto {STR_VAR_1}.");
+
+ALIGNED(4) const u8 gUnknown_845756C[] = _("The other TRAINER doesn't appear\nto be available now…\p");
+ALIGNED(4) const u8 gUnknown_84575A4[] = _("You can't transmit with a TRAINER\nwho is too far away.\p");
+ALIGNED(4) const u8 gUnknown_84575DC[] = _("The other TRAINER(S) is/are not\nready yet.\p");
+
+const u8 *const gUnknown_8457608[] = {
+ gUnknown_84575A4,
+ gUnknown_84575DC
+};
+
+ALIGNED(4) const u8 gUnknown_8457610[] = _("The {STR_VAR_1} MODE with\nthese members will be canceled.{PAUSE 90}");
+ALIGNED(4) const u8 gUnknown_8457644[] = _("There is a member who can no\nlonger remain available.\p");
+
+const u8 *const gUnknown_845767C[] = {
+ gUnknown_845756C,
+ gUnknown_8457644
+};
+
+ALIGNED(4) const u8 gUnknown_8457684[] = _("The other TRAINER appears\nunavailable…\p");
+ALIGNED(4) const u8 gUnknown_84576AC[] = _("{STR_VAR_1} sent back an “OK”!");
+ALIGNED(4) const u8 gUnknown_84576C4[] = _("{STR_VAR_1} OK'd your registration as\na member.");
+ALIGNED(4) const u8 gUnknown_84576EC[] = _("{STR_VAR_1} replied, “No…”\p");
+ALIGNED(4) const u8 gUnknown_8457700[] = _("{STR_VAR_1}!\nAwaiting other members!");
+ALIGNED(4) const u8 gUnknown_845771C[] = _("Quit being a member?");
+ALIGNED(4) const u8 gUnknown_8457734[] = _("You stopped being a member.\p");
+
+const u8 *const gUnknown_8457754[] = {
+ NULL,
+ gUnknown_8457644,
+ gUnknown_8457684,
+ NULL,
+ NULL,
+ NULL,
+ gUnknown_84576EC,
+ NULL,
+ NULL,
+ gUnknown_8457734
+};
+
+ALIGNED(4) const u8 gUnknown_845777C[] = _("The WIRELESS COMMUNICATION\nSYSTEM link has been established.");
+ALIGNED(4) const u8 gUnknown_84577BC[] = _("The WIRELESS COMMUNICATION\nSYSTEM link has been dropped…");
+ALIGNED(4) const u8 gUnknown_84577F8[] = _("The link with your friend has been\ndropped…");
+ALIGNED(4) const u8 gUnknown_8457824[] = _("{STR_VAR_1} replied, “No…”");
+
+const u8 *const gUnknown_8457838[] = {
+ NULL,
+ gUnknown_84577F8,
+ gUnknown_84577F8,
+ NULL,
+ NULL,
+ NULL,
+ gUnknown_8457824,
+ NULL,
+ NULL,
+ NULL
+};
+
+ALIGNED(4) const u8 gUnknown_8457860[] = _("Do you want the {STR_VAR_2}\nMODE?");
+ALIGNED(4) const u8 gUnknown_845787C[] = _("Do you want the {STR_VAR_2}\nMODE?");
+
+const u8 *const gUnknown_8457898[] = {
+ gUnknown_8457860,
+ gUnknown_845787C
+};
+
+ALIGNED(4) const u8 gUnknown_84578A0[] = _("はなしかけています…\nしょうしょう おまちください");
+ALIGNED(4) const u8 gUnknown_84578BC[] = _("Awaiting {STR_VAR_1}'s response about\nthe trade…");
+ALIGNED(4) const u8 gUnknown_84578E4[] = _("Communicating{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.\n{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.");
+ALIGNED(4) const u8 gUnknown_8457950[] = _("Communicating with {STR_VAR_1}{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.\n{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.");
+ALIGNED(4) const u8 gUnknown_84579BC[] = _("Please wait a while{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.\n{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.");
+
+const u8 *const gUnknown_8457A34[] = {
+ gUnknown_84578E4,
+ gUnknown_8457950,
+ gUnknown_84579BC
+};
+
+ALIGNED(4) const u8 gUnknown_8457A40[] = _("Hiya! Is there something that you\nwanted to do?");
+ALIGNED(4) const u8 gUnknown_8457A70[] = _("Hello!\nWould you like to do something?");
+ALIGNED(4) const u8 gUnknown_8457A98[] = _("{STR_VAR_1}: Hiya, we meet again!\nWhat are you up for this time?");
+ALIGNED(4) const u8 gUnknown_8457AD0[] = _("{STR_VAR_1}: Oh! {PLAYER}, hello!\nWould you like to do something?");
+
+const u8 *const gUnknown_8457B04[][2] = {
+ {
+ gUnknown_8457A40,
+ gUnknown_8457A70
+ }, {
+ gUnknown_8457A98,
+ gUnknown_8457AD0
+ }
+};
+
+ALIGNED(4) const u8 gUnknown_8457B14[] = _("Want to do something?");
+ALIGNED(4) const u8 gUnknown_8457B2C[] = _("Would you like to do something?");
+ALIGNED(4) const u8 gUnknown_8457B4C[] = _("{STR_VAR_1}: What would you like to\ndo now?");
+ALIGNED(4) const u8 gUnknown_8457B70[] = _("{STR_VAR_1}‘また なにかする?");
+
+const u8 *const gUnknown_8457B80[] = {
+ gUnknown_8457B14,
+ gUnknown_8457B2C,
+ gUnknown_8457B4C,
+ gUnknown_8457B4C
+};
+
+ALIGNED(4) const u8 gUnknown_8457B90[] = _("Somebody has contacted you.{PAUSE 60}");
+ALIGNED(4) const u8 gUnknown_8457BA0[] = _("{STR_VAR_1} has contacted you.{PAUSE 60}");
+
+const u8 *const gUnknown_8457BCC[] = {
+ gUnknown_8457B90,
+ gUnknown_8457BA0
+};
+
+ALIGNED(4) const u8 gUnknown_8457BD4[] = _("Awaiting a response from\nthe other TRAINER…");
+ALIGNED(4) const u8 gUnknown_8457C00[] = _("Awaiting a response from\n{STR_VAR_1}…");
+
+const u8 *const gUnknown_8457C20[] = {
+ gUnknown_8457BD4,
+ gUnknown_8457C00
+};
+
+ALIGNED(4) const u8 gUnknown_8457C28[] = _("あいての ていあんを まっています\nビーボタンで キャンセル");
+ALIGNED(4) const u8 gUnknown_8457C48[] = _("The other TRAINER showed\nyou their TRAINER CARD.\pWould you like to show your\nTRAINER CARD?");
+ALIGNED(4) const u8 gUnknown_8457CA4[] = _("The other TRAINER challenges you\nto battle.\pWill you accept the battle\nchallenge?");
+ALIGNED(4) const u8 gUnknown_8457CF8[] = _("The other TRAINER invites you\nto chat.\pWill you accept the chat\ninvitation?");
+ALIGNED(4) const u8 gUnknown_8457D44[] = _("There is an offer to trade your\nregistered Lv. {DYNAMIC 0} {DYNAMIC 1}\pin exchange for a\nLv. {DYNAMIC 2} {DYNAMIC 3}.\pWill you accept this trade\noffer?");
+ALIGNED(4) const u8 gUnknown_8457DB8[] = _("There is an offer to trade your\nregistered EGG.\lWill you accept this trade offer?");
+ALIGNED(4) const u8 gUnknown_8457E0C[] = _("The chat has been dropped.\p");
+ALIGNED(4) const u8 gUnknown_8457E28[] = _("You declined the offer.\p");
+ALIGNED(4) const u8 gUnknown_8457E44[] = _("You declined the offer.\p");
+ALIGNED(4) const u8 gUnknown_8457E60[] = _("The chat was ended.\p");
+
+const u8 *const gUnknown_8457E78[] = {
+ gUnknown_8457C48,
+ gUnknown_8457CA4,
+ gUnknown_8457CF8,
+ gUnknown_8457D44
+};
+
+ALIGNED(4) const u8 gUnknown_8457E88[] = _("Oh, hey! We're in a chat right now.\nWant to join us?");
+ALIGNED(4) const u8 gUnknown_8457EC0[] = _("{STR_VAR_1}: Hey, {PLAYER}!\nWe're having a chat right now.\lWant to join us?");
+ALIGNED(4) const u8 gUnknown_8457F00[] = _("Oh, hi! We're having a chat now.\nWould you like to join us?");
+ALIGNED(4) const u8 gUnknown_8457F3C[] = _("{STR_VAR_1}: Oh, hi, {PLAYER}!\nWe're having a chat now.\lWould you like to join us?");
+
+const u8 *const gUnknown_8457F80[][2] = {
+ {
+ gUnknown_8457E88,
+ gUnknown_8457F00
+ }, {
+ gUnknown_8457EC0,
+ gUnknown_8457F3C
+ }
+};
+
+ALIGNED(4) const u8 gUnknown_8457F90[] = _("……\nThe TRAINER appears to be busy…\p");
+ALIGNED(4) const u8 gUnknown_8457FB4[] = _("A battle, huh?\nAll right, just give me some time.");
+ALIGNED(4) const u8 gUnknown_8457FE8[] = _("You want to chat, huh?\nSure, just wait a little.");
+ALIGNED(4) const u8 gUnknown_845801C[] = _("Sure thing! As my “Greetings,”\nhere's my TRAINER CARD.");
+ALIGNED(4) const u8 gUnknown_8458054[] = _("A battle? Of course, but I need\ntime to get ready.");
+ALIGNED(4) const u8 gUnknown_8458088[] = _("Did you want to chat?\nOkay, but please wait a moment.");
+ALIGNED(4) const u8 gUnknown_84580C0[] = _("As my introduction, I'll show you\nmy TRAINER CARD.");
+
+const u8 *const gUnknown_84580F4[][4] = {
+ {
+ gUnknown_8457FB4,
+ gUnknown_8457FE8,
+ NULL,
+ gUnknown_845801C
+ }, {
+ gUnknown_8458054,
+ gUnknown_8458088,
+ NULL,
+ gUnknown_84580C0
+ }
+};
+
+ALIGNED(4) const u8 gUnref_8458104[] = _("チャットだね!\nわかった ちょっと まってて!");
+ALIGNED(4) const u8 gUnknown_845812C[] = _("Thanks for waiting!\nLet's get our battle started!{PAUSE 60}");
+ALIGNED(4) const u8 gUnknown_8458164[] = _("All right!\nLet's chat!{PAUSE 60}");
+ALIGNED(4) const u8 gUnknown_8458180[] = _("Sorry I made you wait!\nLet's get started!{PAUSE 60}");
+ALIGNED(4) const u8 gUnknown_84581B0[] = _("Sorry I made you wait!\nLet's chat.{PAUSE 60}");
+ALIGNED(4) const u8 gUnknown_84581D8[] = _("The trade will be started.{PAUSE 60}");
+ALIGNED(4) const u8 gUnknown_84581F8[] = _("The battle will be started.{PAUSE 60}");
+ALIGNED(4) const u8 gUnknown_8458218[] = _("Entering the chat…{PAUSE 60}");
+
+const u8 *const gUnknown_8458230[][2][3] = {
+ {
+ {
+ gUnknown_84581F8,
+ gUnknown_8458218,
+ gUnknown_84581D8
+ }, {
+ gUnknown_84581F8,
+ gUnknown_8458218,
+ gUnknown_84581D8
+ }
+ }, {
+ {
+ gUnknown_845812C,
+ gUnknown_8458164,
+ gUnknown_84581D8
+ }, {
+ gUnknown_8458180,
+ gUnknown_84581B0,
+ gUnknown_84581D8
+ }
+ }
+};
+
+ALIGNED(4) const u8 gUnknown_8458260[] = _("Sorry! My POKéMON don't seem to\nbe feeling too well right now.\lLet me battle you another time.\p");
+ALIGNED(4) const u8 gUnknown_84582C0[] = _("I'm terribly sorry, but my POKéMON\naren't feeling well…\pLet's battle another time.\p");
+
+const u8 *const gUnknown_8458314[] = {
+ gUnknown_8458260,
+ gUnknown_84582C0
+};
+
+ALIGNED(4) const u8 gUnknown_845831C[] = _("Huh? My TRAINER CARD…\nWhere'd it go now?\lSorry! I'll show you another time!\p");
+ALIGNED(4) const u8 gUnknown_845836C[] = _("Oh? Now where did I put my\nTRAINER CARD?…\lSorry! I'll show you later!\p");
+
+const u8 *const gUnknown_84583B4[] = {
+ gUnknown_845831C,
+ gUnknown_845836C
+};
+
+ALIGNED(4) const u8 gUnknown_84583BC[] = _("If you want to do something with\nme, just give me a shout!\p");
+ALIGNED(4) const u8 gUnknown_84583F8[] = _("If you want to do something with\nme, don't be shy.\p");
+
+const u8 *const gUnknown_845842C[] = {
+ gUnknown_84583BC,
+ gUnknown_84583F8
+};
+
+ALIGNED(4) const u8 gUnknown_8458434[] = _("Whoops! Sorry, but I have to do\nsomething else.\lAnother time, okay?\p");
+ALIGNED(4) const u8 gUnknown_845847C[] = _("If you want to battle, you need\ntwo POKéMON that are below\lLv. 30.\p");
+ALIGNED(4) const u8 gUnknown_84584C0[] = _("For a battle, you need two\nPOKéMON that are below Lv. 30.\p");
+ALIGNED(4) const u8 gUnknown_84584FC[] = _("Oh, all right.\nCome see me anytime, okay?\p");
+ALIGNED(4) const u8 gUnknown_8458528[] = _("Oh…\nPlease come by anytime.\p");
+
+const u8 *const gUnknown_8458548[] = {
+ gUnknown_84584FC,
+ gUnknown_8458528
+};
+
+ALIGNED(4) const u8 gUnknown_8458550[] = _("Oh, sorry!\nI just can't right this instant.\lLet's chat another time.\p");
+ALIGNED(4) const u8 gUnknown_8458598[] = _("Oh, I'm sorry.\nI have too much to do right now.\lLet's chat some other time.\p");
+
+const u8 *const gUnknown_84585E8[] = {
+ gUnknown_8458550,
+ gUnknown_8458598
+};
+
+ALIGNED(4) const u8 gUnknown_84585F0[] = _("Whoa!\nI can tell you're pretty tough!\p");
+ALIGNED(4) const u8 gUnknown_8458618[] = _("You used that move?\nThat's good strategy!\p");
+ALIGNED(4) const u8 gUnknown_8458644[] = _("Way to go!\nThat was an eye-opener!\p");
+ALIGNED(4) const u8 gUnknown_8458668[] = _("Oh! How could you use that\nPOKéMON in that situation?\p");
+ALIGNED(4) const u8 gUnknown_84586A0[] = _("That POKéMON…\nIt's been raised really well!\p");
+ALIGNED(4) const u8 gUnknown_84586D0[] = _("That's it!\nThis is the right move now!\p");
+ALIGNED(4) const u8 gUnknown_84586F8[] = _("That's awesome!\nYou can battle that way?\p");
+ALIGNED(4) const u8 gUnknown_8458724[] = _("You have exquisite timing for\nswitching POKéMON!\p");
+
+const u8 *const gUnknown_8458758[][4] = {
+ {
+ gUnknown_84585F0,
+ gUnknown_8458618,
+ gUnknown_8458644,
+ gUnknown_8458668
+ }, {
+ gUnknown_84586A0,
+ gUnknown_84586D0,
+ gUnknown_84586F8,
+ gUnknown_8458724
+ }
+};
+
+ALIGNED(4) const u8 gUnknown_8458778[] = _("Oh, I see!\nThis is educational!\p");
+ALIGNED(4) const u8 gUnknown_845879C[] = _("Don't say anything funny anymore!\nI'm sore from laughing!\p");
+ALIGNED(4) const u8 gUnknown_84587D8[] = _("Oh?\nSomething like that happened.\p");
+ALIGNED(4) const u8 gUnknown_84587FC[] = _("Hmhm… What?\nSo is this what you're saying?\p");
+ALIGNED(4) const u8 gUnknown_8458828[] = _("Is that right?\nI didn't know that.\p");
+ALIGNED(4) const u8 gUnknown_845884C[] = _("Ahaha!\nWhat is that about?\p");
+ALIGNED(4) const u8 gUnknown_8458868[] = _("Yes, that's exactly it!\nThat's what I meant.\p");
+ALIGNED(4) const u8 gUnknown_8458898[] = _("In other words…\nYes! That's right!\p");
+
+const u8 *const gUnknown_84588BC[][4] = {
+ {
+ gUnknown_8458778,
+ gUnknown_845879C,
+ gUnknown_84587D8,
+ gUnknown_84587FC
+ }, {
+ gUnknown_8458828,
+ gUnknown_845884C,
+ gUnknown_8458868,
+ gUnknown_8458898
+ }
+};
+
+ALIGNED(4) const u8 gUnknown_84588DC[] = _("I'm just showing my TRAINER CARD\nas my way of greeting.\p");
+ALIGNED(4) const u8 gUnknown_8458918[] = _("I hope I get to know you better!\p");
+ALIGNED(4) const u8 gUnknown_845893C[] = _("We're showing each other our\nTRAINER CARDS to get acquainted.\p");
+ALIGNED(4) const u8 gUnknown_845897C[] = _("Glad to meet you.\nPlease don't be a stranger!\p");
+
+const u8 *const gUnknown_84589AC[][2] = {
+ {
+ gUnknown_84588DC,
+ gUnknown_8458918
+ }, {
+ gUnknown_845893C,
+ gUnknown_845897C
+ }
+};
+
+ALIGNED(4) const u8 gUnknown_84589BC[] = _("Yeahah!\nI really wanted this POKéMON!\p");
+ALIGNED(4) const u8 gUnknown_84589E4[] = _("Finally, a trade got me that\nPOKéMON I'd wanted a long time.\p");
+ALIGNED(4) const u8 gUnknown_8458A24[] = _("I'm trading POKéMON right now.\p");
+ALIGNED(4) const u8 gUnknown_8458A44[] = _("I finally got that POKéMON I\nwanted in a trade!\p");
+
+const u8 *const gUnknown_8458A78[][4] = {
+ {
+ gUnknown_84589BC,
+ gUnknown_84589E4
+ }, {
+ gUnknown_8458A24,
+ gUnknown_8458A44
+ }
+};
+
+const u8 gUnknown_8458A98[] = _("{STR_VAR_1} checked the\nTRADING BOARD.\p");
+ALIGNED(4) const u8 gUnknown_8458AB8[] = _("Welcome to the TRADING BOARD.\pYou may register your POKéMON\nand offer it up for a trade.\pWould you like to register one of\nyour POKéMON?");
+ALIGNED(4) const u8 gUnknown_8458B44[] = _("This TRADING BOARD is used for\noffering a POKéMON for a trade.\pAll you need to do is register a\nPOKéMON for a trade.\pAnother TRAINER may offer a party\nPOKéMON in return for the trade.\pWe hope you will register POKéMON\nand trade them with many, many\lother TRAINERS.\pWould you like to register one of\nyour POKéMON?");
+ALIGNED(4) const u8 gUnref_ThankYouForComing_JP[] = _("こうかんけいじばん の とうろくが\nかんりょう しました\pごりよう ありがとう\nございました!\p");
+ALIGNED(4) const u8 gUnref_NoOneRegisteredMon[] = _("けいじばんに だれも ポケモンを\nとうろく していません\p\n");
+ALIGNED(4) const u8 gUnknown_8458CD4[] = _("Please choose the type of POKéMON\nthat you would like in the trade.\n");
+ALIGNED(4) const u8 gUnknown_8458D1C[] = _("Which of your party POKéMON will\nyou offer in trade?\p");
+ALIGNED(4) const u8 gUnknown_8458D54[] = _("Registration has been canceled.\p");
+ALIGNED(4) const u8 gUnknown_8458D78[] = _("Registration has been completed.\p");
+ALIGNED(4) const u8 gUnknown_8458D9C[] = _("The trade has been canceled.\p");
+ALIGNED(4) const u8 gUnknown_8458DBC[] = _("Cancel the registration of your\nLv. {STR_VAR_2} {STR_VAR_1}?");
+ALIGNED(4) const u8 gUnknown_8458DE8[] = _("Cancel the registration of your\nEGG?");
+ALIGNED(4) const u8 gUnknown_8458E10[] = _("The registration has been canceled.\p");
+ALIGNED(4) const u8 gUnref_ShowPeopleWhoLikeYou_JP[] = _("こうかんを きぼうしているひとを\nひょうじします");
+ALIGNED(4) const u8 gUnref_PleaseChooseTrainerYouWant[] = _("こうかん したい トレーナーを\nえらんで ください");
+ALIGNED(4) const u8 gUnknown_8458E70[] = _("Would you like to ask {STR_VAR_1} to\nmake a trade?");
+ALIGNED(4) const u8 gUnref_ImWaitingForAnswer[] = _("……\nあいての へんじを まっています");
+ALIGNED(4) const u8 gUnref_MonSentOutIsNotRegistered[] = _("あなたが こうかんにだす\nポケモンが とうろくされていません\p");
+ALIGNED(4) const u8 gUnknown_8458ED0[] = _("You don't have a {STR_VAR_2}-type\nPOKéMON that {STR_VAR_1} wants.\p");
+ALIGNED(4) const u8 gUnknown_8458F04[] = _("You don't have an EGG that\n{STR_VAR_1} wants.\p");
+ALIGNED(4) const u8 gUnknown_8458F2C[] = _("{STR_VAR_1} can't make a trade for\nyour POKéMON right now.\p");
+ALIGNED(4) const u8 gUnknown_8458F60[] = _("You can't make a trade for\n{STR_VAR_1}'s POKéMON right now.\p");
+
+const u8 *const gUnknown_8458F94[] = {
+ gUnknown_8458F2C,
+ gUnknown_8458F60
+};
+
+ALIGNED(4) const u8 gUnknown_8458F9C[] = _("Your trade offer was rejected.\p");
+ALIGNED(4) const u8 gUnknown_8458FBC[] = _("EGG TRADE");
+ALIGNED(4) const u8 gUnknown_8458FC8[] = _("{DPAD_UPDOWN}CHOOSE {A_BUTTON}JOIN {B_BUTTON}CANCEL");
+ALIGNED(4) const u8 gUnknown_8458FE4[] = _("Please choose a TRAINER.");
+ALIGNED(4) const u8 gUnknown_8459000[] = _("Please choose a TRAINER for\na SINGLE BATTLE.");
+ALIGNED(4) const u8 gUnknown_8459030[] = _("Please choose a TRAINER for\na DOUBLE BATTLE.");
+ALIGNED(4) const u8 gUnknown_8459060[] = _("Please choose the LEADER\nfor a MULTI BATTLE.");
+ALIGNED(4) const u8 gUnknown_8459090[] = _("Please choose the TRAINER to\ntrade with.");
+ALIGNED(4) const u8 gUnknown_84590BC[] = _("Please choose the TRAINER who is\nsharing WONDER CARDS.");
+ALIGNED(4) const u8 gUnknown_84590F4[] = _("Please choose the TRAINER who is\nsharing WONDER NEWS.");
+ALIGNED(4) const u8 gUnknown_845912C[] = _("Jump with mini POKéMON!\nPlease choose the LEADER.");
+ALIGNED(4) const u8 gUnknown_8459160[] = _("BERRY CRUSH!\nPlease choose the LEADER.");
+ALIGNED(4) const u8 gUnknown_8459188[] = _("DODRIO BERRY-PICKING!\nPlease choose the LEADER.");
+
+const u8 *const gUnknown_84591B8[] = {
+ gUnknown_8459000,
+ gUnknown_8459030,
+ gUnknown_8459060,
+ gUnknown_8459090,
+ gUnknown_845912C,
+ gUnknown_8459160,
+ gUnknown_8459188,
+ gUnknown_84590BC,
+ gUnknown_84590F4
+};
+
+ALIGNED(4) const u8 gUnknown_84591DC[] = _("Searching for a WIRELESS\nCOMMUNICATION SYSTEM. Wait...");
+ALIGNED(4) const u8 gUnref_NeedAtLeast2InDblBtl[] = _("ダブルバトルでは 2ひき いじょうの\nポケモンが ひつようです\p");
+ALIGNED(4) const u8 gUnknown_8459238[] = _("Awaiting {STR_VAR_1}'s response…");
+ALIGNED(4) const u8 gUnknown_8459250[] = _("{STR_VAR_1} has been asked to register\nyou as a member. Please wait.");
+ALIGNED(4) const u8 gUnknown_845928C[] = _("Awaiting a response from the\nWIRELESS COMMUNICATION SYSTEM.");
+ALIGNED(4) const u8 gUnref_PlsWaitLittleWHile[] = _("ほかの さんかしゃが そろうまで\nしょうしょう おまちください");
+ALIGNED(4) const u8 gUnknown_84592E8[] = _("No CARDS appear to be shared \nright now.");
+ALIGNED(4) const u8 gUnknown_8459314[] = _("No NEWS appears to be shared\nright now.");
+
+const u8 *const gUnknown_845933C[] = {
+ gUnknown_84592E8,
+ gUnknown_8459314
+};
+
+ALIGNED(4) const u8 gUnknown_8459344[] = _("BATTLE");
+ALIGNED(4) const u8 gUnknown_845934C[] = _("CHAT");
+ALIGNED(4) const u8 gUnknown_8459354[] = _("GREETINGS");
+ALIGNED(4) const u8 gUnknown_8459360[] = _("EXIT");
+ALIGNED(4) const u8 gUnknown_8459368[] = _("EXIT");
+ALIGNED(4) const u8 gUnknown_8459370[] = _("INFO");
+ALIGNED(4) const u8 gUnknown_8459378[] = _("NAME{CLEAR_TO 0x3C}WANTED{CLEAR_TO 0x6E}OFFER{CLEAR_TO 0xC6}LV.");
+ALIGNED(4) const u8 gUnknown_8459394[] = _("SINGLE BATTLE");
+ALIGNED(4) const u8 gUnknown_84593A4[] = _("DOUBLE BATTLE");
+ALIGNED(4) const u8 gUnknown_84593B4[] = _("MULTI BATTLE");
+ALIGNED(4) const u8 gUnknown_84593C4[] = _("POKéMON TRADES");
+ALIGNED(4) const u8 gUnknown_84593D4[] = _("CHAT");
+ALIGNED(4) const u8 gUnknown_84593DC[] = _("CARDS");
+ALIGNED(4) const u8 gUnknown_84593E4[] = _("WONDER CARDS");
+ALIGNED(4) const u8 gUnknown_84593F4[] = _("WONDER NEWS");
+ALIGNED(4) const u8 gUnknown_8459400[] = _("POKéMON JUMP");
+ALIGNED(4) const u8 gUnknown_8459410[] = _("BERRY CRUSH");
+ALIGNED(4) const u8 gUnknown_845941C[] = _("BERRY-PICKING");
+ALIGNED(4) const u8 gUnknown_845942C[] = _("SEARCH");
+ALIGNED(4) const u8 gUnknown_8459434[] = _("ぐるぐるこうかん");
+ALIGNED(4) const u8 gUnknown_8459440[] = _("アイテムトレード");
+ALIGNED(4) const u8 gUnknown_845944C[] = _("It's a NORMAL CARD.");
+ALIGNED(4) const u8 gUnknown_8459460[] = _("It's a BRONZE CARD!");
+ALIGNED(4) const u8 gUnknown_8459474[] = _("It's a COPPER CARD!");
+ALIGNED(4) const u8 gUnknown_8459488[] = _("It's a SILVER CARD!");
+ALIGNED(4) const u8 gUnknown_845949C[] = _("It's a GOLD CARD!");
+
+const u8 *const gUnknown_84594B0[] = {
+ gUnknown_845944C,
+ gUnknown_8459460,
+ gUnknown_8459474,
+ gUnknown_8459488,
+ gUnknown_845949C
+};
+
+ALIGNED(4) const u8 gUnknown_84594C4[] = _("This is {SPECIAL_F7 0x00} {SPECIAL_F7 0x01}'s\nTRAINER CARD…\l{SPECIAL_F7 0x02}\pPOKéDEX: {SPECIAL_F7 0x03}\nTIME: {SPECIAL_F7 0x04}:{SPECIAL_F7 0x05}\p");
+ALIGNED(4) const u8 gUnknown_8459504[] = _("BATTLES: {SPECIAL_F7 0x00} WINS {SPECIAL_F7 0x02} LOSSES\nTRADES: {SPECIAL_F7 0x03} TIMES\p“{SPECIAL_F7 0x04} {SPECIAL_F7 0x05}\n{SPECIAL_F7 0x06} {SPECIAL_F7 0x07}”\p");
+ALIGNED(4) const u8 gUnknown_8459544[] = _("{SPECIAL_F7 0x01}: Glad to have met you!{PAUSE 60}");
+ALIGNED(4) const u8 gUnknown_8459564[] = _("{SPECIAL_F7 0x01}: Glad to meet you!{PAUSE 60}");
+
+const u8 *const gUnknown_8459580[] = {
+ gUnknown_8459544,
+ gUnknown_8459564
+};
+
+ALIGNED(4) const u8 gUnknown_8459588[] = _("Finished checking {SPECIAL_F7 0x01}'s\nTRAINER CARD.{PAUSE 60}");
+ALIGNED(4) const u8 gUnknown_84595B0[] = _("Canceled reading the Card.");
+
+const struct mevent_client_cmd gUnknown_84595CC[] = {
+ CLI_RECEIVE(0x15),
+ CLI_RECVBUF,
+ CLI_SENDALL,
+ CLI_RETURN(0x0e)
+};
+
+const struct mevent_server_cmd gMEventSrvScript_OtherTrainerCanceled[] = {
+ SRV_SEND(0x20, gUnknown_84595CC),
+ SRV_WAITSND,
+ SRV_SENDSTR(0x1b, gUnknown_84595B0),
+ SRV_WAITSND,
+ SRV_RECV(0x14),
+ SRV_RETURN(0x09)
+};
diff --git a/src/vs_seeker.c b/src/vs_seeker.c
index b88a7f15c..b35b6143e 100644
--- a/src/vs_seeker.c
+++ b/src/vs_seeker.c
@@ -1273,7 +1273,7 @@ static u8 GetRematchableTrainerLocalId(void)
static void StartTrainerObjectMovementScript(struct VsSeekerTrainerInfo * trainerInfo, const u8 * script)
{
- npc_sync_anim_pause_bits(&gObjectEvents[trainerInfo->objectEventId]);
+ UnfreezeObjectEvent(&gObjectEvents[trainerInfo->objectEventId]);
ScriptMovement_StartObjectMovementScript(trainerInfo->localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, script);
}
diff --git a/src/wireless_communication_status_screen.c b/src/wireless_communication_status_screen.c
index 1c355c3ba..9be2823aa 100644
--- a/src/wireless_communication_status_screen.c
+++ b/src/wireless_communication_status_screen.c
@@ -364,7 +364,7 @@ void sub_814F65C(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 palIdx)
u32 sub_814F714(struct UnkStruct_x20 * unk20, u32 * arg1)
{
- u32 r8 = unk20->unk.field_0.unk_0a_0;
+ u32 r8 = unk20->unk.gname.unk_0a_0;
s32 i, j, k;
for (i = 0; i < NELEMS(gUnknown_846FAC0); i++)
@@ -376,7 +376,7 @@ u32 sub_814F714(struct UnkStruct_x20 * unk20, u32 * arg1)
k = 0;
for (j = 0; j < 4; j++)
{
- if (unk20->unk.field_0.unk_04[j] != 0) k++;
+ if (unk20->unk.gname.unk_04[j] != 0) k++;
}
k++;
arg1[gUnknown_846FAC0[i][1]] += k;