summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSwastik Baranwal <swstkbaranwal@gmail.com>2018-12-27 16:00:22 +0530
committerGitHub <noreply@github.com>2018-12-27 16:00:22 +0530
commit95c3652551aacf612a19336e17ce00a2ec1046d2 (patch)
tree882caaf9875700cccb73e391a7a014a782e579fa /src
parent2ed26ab8fcd4e302ab4aac6bb01dba7b5c985914 (diff)
parentd5de7960a330953b3a7d7684122997c0d8aedcf1 (diff)
Merge pull request #2 from pret/master
Taking files
Diffstat (limited to 'src')
-rw-r--r--src/bg.c27
-rw-r--r--src/dma3_manager.c2
-rw-r--r--src/fame_checker.c1553
-rw-r--r--src/load_save.c8
-rw-r--r--src/main.c4
-rw-r--r--src/menews_jisan.c4
-rw-r--r--src/mevent.c1016
-rw-r--r--src/mevent_8145654.c793
-rw-r--r--src/mevent_server.c563
-rw-r--r--src/mevent_server_helpers.c211
-rw-r--r--src/mystery_event_msg.c13
-rw-r--r--src/mystery_event_script.c322
-rw-r--r--src/pokemon.c2
-rw-r--r--src/quest_log.c5027
-rw-r--r--src/quest_log_8150454.c197
-rw-r--r--src/quest_log_battle.c164
-rw-r--r--src/save.c7
-rw-r--r--src/script.c22
-rw-r--r--src/sound.c10
-rw-r--r--src/text.c26
-rw-r--r--src/vs_seeker.c10
21 files changed, 9925 insertions, 56 deletions
diff --git a/src/bg.c b/src/bg.c
index d7f84bf4e..5cbd7658e 100644
--- a/src/bg.c
+++ b/src/bg.c
@@ -391,7 +391,7 @@ void InitBgsFromTemplates(u8 bgMode, const struct BgTemplate *templates, u8 numT
}
}
#else
-__attribute__((naked))
+NAKED
void InitBgsFromTemplates(u8 bgMode, const struct BgTemplate *templates, u8 numTemplates)
{
asm(".syntax unified\n\
@@ -634,7 +634,7 @@ bool8 IsDma3ManagerBusyWithBgCopy(void)
return FALSE;
}
#else
-__attribute__((naked))
+NAKED
bool8 IsDma3ManagerBusyWithBgCopy(void)
{
asm("push {r4-r7,lr}\n\
@@ -1065,9 +1065,8 @@ void CopyBgTilemapBufferToVram(u8 bg)
}
}
-void CopyToBgTilemapBufferRect(u8 bg, void* src, u8 destX, u8 destY, u8 width, u8 height)
+void CopyToBgTilemapBufferRect(u8 bg, const void* src, u8 destX, u8 destY, u8 width, u8 height)
{
- void* srcCopy;
u16 destX16;
u16 destY16;
u16 mode;
@@ -1077,31 +1076,35 @@ void CopyToBgTilemapBufferRect(u8 bg, void* src, u8 destX, u8 destY, u8 width, u
switch (GetBgType(bg))
{
case 0:
- srcCopy = src;
+ {
+ const u16 * srcCopy = src;
for (destY16 = destY; destY16 < (destY + height); destY16++)
{
for (destX16 = destX; destX16 < (destX + width); destX16++)
{
- ((u16*)sGpuBgConfigs2[bg].tilemap)[((destY16 * 0x20) + destX16)] = *((u16*)srcCopy)++;
+ ((u16*)sGpuBgConfigs2[bg].tilemap)[((destY16 * 0x20) + destX16)] = *(srcCopy)++;
}
}
break;
+ }
case 1:
- srcCopy = src;
+ {
+ const u8 * srcCopy = src;
mode = GetBgMetricAffineMode(bg, 0x1);
for (destY16 = destY; destY16 < (destY + height); destY16++)
{
for (destX16 = destX; destX16 < (destX + width); destX16++)
{
- ((u8*)sGpuBgConfigs2[bg].tilemap)[((destY16 * mode) + destX16)] = *((u8*)srcCopy)++;
+ ((u8*)sGpuBgConfigs2[bg].tilemap)[((destY16 * mode) + destX16)] = *(srcCopy)++;
}
}
break;
+ }
}
}
}
-void CopyToBgTilemapBufferRect_ChangePalette(u8 bg, void *src, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette)
+void CopyToBgTilemapBufferRect_ChangePalette(u8 bg, const void *src, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette)
{
CopyRectToBgTilemapBufferRect(bg, src, 0, 0, rectWidth, rectHeight, destX, destY, rectWidth, rectHeight, palette, 0, 0);
}
@@ -1148,8 +1151,8 @@ void CopyRectToBgTilemapBufferRect(u8 bg, void* src, u8 srcX, u8 srcY, u8 srcWid
}
}
}*/
-__attribute__((naked))
-void CopyRectToBgTilemapBufferRect(u8 bg, void* src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, u16 tileOffset, u16 palette2)
+NAKED
+void CopyRectToBgTilemapBufferRect(u8 bg, const void* src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, u16 tileOffset, u16 palette2)
{
asm("push {r4-r7,lr}\n\
mov r7, r10\n\
@@ -1595,7 +1598,7 @@ void CopyTileMapEntry(u16 *src, u16 *dest, s32 palette1, u32 tileOffset, u32 pal
*dest = test;
}
#else
-__attribute__((naked))
+NAKED
void CopyTileMapEntry(u16 *src, u16 *dest, s32 palette1, u32 tileOffset, u32 palette2)
{
asm("push {r4-r6,lr}\n\
diff --git a/src/dma3_manager.c b/src/dma3_manager.c
index bb015c5cf..10049a566 100644
--- a/src/dma3_manager.c
+++ b/src/dma3_manager.c
@@ -1,7 +1,7 @@
#include "global.h"
#include "dma3.h"
-IWRAM_DATA struct {
+static /*IWRAM_DATA*/ struct {
/* 0x00 */ const u8 *src;
/* 0x04 */ u8 *dest;
/* 0x08 */ u16 size;
diff --git a/src/fame_checker.c b/src/fame_checker.c
new file mode 100644
index 000000000..bbbe02c58
--- /dev/null
+++ b/src/fame_checker.c
@@ -0,0 +1,1553 @@
+#include "global.h"
+#include "constants/songs.h"
+#include "sprite.h"
+#include "bg.h"
+#include "event_data.h"
+#include "event_scripts.h"
+#include "graphics.h"
+#include "battle.h"
+#include "battle_setup.h"
+#include "menu.h"
+#include "battle_dome_cards.h"
+#include "scanline_effect.h"
+#include "new_menu_helpers.h"
+#include "item_menu.h"
+#include "list_menu.h"
+#include "gpu_regs.h"
+#include "palette.h"
+#include "task.h"
+#include "malloc.h"
+#include "main.h"
+#include "sound.h"
+#include "text.h"
+#include "window.h"
+#include "string_util.h"
+#include "field_map_obj.h"
+#include "menu_indicators.h"
+#include "text_window.h"
+#include "fame_checker.h"
+
+#define SPRITETAG_SELECTOR_CURSOR 1000
+#define SPRITETAG_QUESTION_MARK 1001
+#define SPRITETAG_SPINNING_POKEBALL 1002
+#define SPRITETAG_SCROLL_INDICATORS 1004
+#define SPRITETAG_DAISY 1006
+#define SPRITETAG_FUJI 1007
+#define SPRITETAG_OAK 1008
+#define SPRITETAG_BILL 1009
+
+#define FC_NONTRAINER_START 0xFE00
+
+struct FameCheckerData
+{
+ MainCallback savedCallback;
+ u16 listMenuTopIdx;
+ u8 scrollIndicatorPairTaskId;
+ u8 personHasUnlockedPanels:1;
+ u8 inPickMode:1;
+ u8 numUnlockedPersons:6;
+ u8 listMenuTaskId;
+ u8 listMenuCurIdx;
+ u8 listMenuTopIdx2;
+ u8 listMenuDrawnSelIdx;
+ u8 unlockedPersons[NUM_FAMECHECKER_PERSONS + 1];
+ u8 spriteIds[6];
+ u8 viewingFlavorText:1;
+ u8 unk_23_1:1; // unused
+ u8 pickModeOverCancel:1;
+};
+
+static EWRAM_DATA u16 * sBg3TilemapBuffer = NULL;
+static EWRAM_DATA u16 * sBg1TilemapBuffer = NULL;
+static EWRAM_DATA u16 * sBg2TilemapBuffer = NULL;
+static EWRAM_DATA struct FameCheckerData * sFameCheckerData = NULL;
+static EWRAM_DATA struct ListMenuItem * sListMenuItems = NULL;
+static EWRAM_DATA s32 sLastMenuIdx = 0;
+
+struct ListMenuTemplate gFameChecker_ListMenuTemplate;
+u8 gIconDescriptionBoxIsOpen;
+
+static void MainCB2_LoadFameChecker(void);
+static void LoadUISpriteSheetsAndPalettes(void);
+static void Task_WaitFadeOnInit(u8 taskId);
+static void Task_TopMenuHandleInput(u8 taskId);
+static bool8 TryExitPickMode(u8 taskId);
+static void MessageBoxPrintEmptyText(void);
+static void Task_EnterPickMode(u8 taskId);
+static void Task_ExitPickMode(u8 taskId);
+static void Task_FlavorTextDisplayHandleInput(u8 taskId);
+static void FC_MoveSelectorCursor(u8 taskId, s8 dx, s8 dy);
+static void GetPickModeText(void);
+static void PrintSelectedNameInBrightGreen(u8 taskId);
+static void WipeMsgBoxAndTransfer(void);
+static void Setup_DrawMsgAndListBoxes(void);
+static void FC_PutWindowTilemapAndCopyWindowToVramMode3(u8 windowId);
+static bool8 SetMessageSelectorIconObjMode(u8 taskId, u8 objMode);
+static void Task_StartToCloseFameChecker(u8 taskId);
+static void Task_DestroyAssetsAndCloseFameChecker(u8 taskId);
+static void FC_DestroyWindow(u8 windowId);
+static void PrintUIHelp(u8 state);
+static bool8 CreateAllFlavorTextIcons(u8 who);
+static void FCSetup_ClearVideoRegisters(void);
+static void FCSetup_ResetTasksAndSpriteResources(void);
+static void FCSetup_TurnOnDisplay(void);
+static void FCSetup_ResetBGCoords(void);
+static bool8 HasUnlockedAllFlavorTextsForCurrentPerson(void);
+static void FreeSelectionCursorSpriteResources(void);
+static u8 CreateFlavorTextIconSelectorCursorSprite(s16 where);
+static void SpriteCB_DestroyFlavorTextIconSelectorCursor(struct Sprite *sprite);
+static void FreeQuestionMarkSpriteResources(void);
+static u8 PlaceQuestionMarkTile(u8 x, u8 y);
+static void FreeSpinningPokeballSpriteResources(void);
+static u8 CreateSpinningPokeballSprite(void);
+static void SpriteCB_DestroySpinningPokeball(struct Sprite *sprite);
+static void FreeNonTrainerPicTiles(void);
+static u8 CreatePersonPicSprite(u8 fcPersonIdx);
+static void DestroyPersonPicSprite(u8 taskId, u16 who);
+static void UpdateIconDescriptionBox(u8 whichText);
+static void UpdateIconDescriptionBoxOff(void);
+static void FC_CreateListMenu(void);
+static void SpriteCB_FCSpinningPokeball(struct Sprite * sprite);
+static void InitListMenuTemplate(void);
+static void FC_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu * list);
+static void Task_SwitchToPickMode(u8 taskId);
+static void PrintCancelDescription(void);
+static void FC_DoMoveCursor(s32 itemIndex, bool8 onInit);
+static u8 FC_PopulateListMenu(void);
+static void FC_PutWindowTilemapAndCopyWindowToVramMode3_2(u8 windowId);
+static void FC_CreateScrollIndicatorArrowPair(void);
+static void FreeListMenuSelectorArrowPairResources(void);
+static u16 FameCheckerGetCursorY(void);
+static void HandleFlavorTextModeSwitch(bool8 state);
+static void Task_FCOpenOrCloseInfoBox(u8 taskId);
+static void UpdateInfoBoxTilemap(u8 bg, s16 state);
+static void PlaceListMenuCursor(bool8 isActive);
+
+extern const u8 gFameCheckerText_Cancel[];
+extern const u8 gFameCheckerText_ListMenuCursor[];
+extern const u8 gFameCheckerText_FameCheckerWillBeClosed[];
+extern const u8 gFameCheckerText_ClearTextbox[];
+extern const u8 gFameCheckerText_MainScreenUI[]; // "{KEYGFX_START_BUTTON}PICK {KEYGFX_DPAD_UP_DOWN}SELECT {KEYGFX_A_BUTTON}OK$"
+extern const u8 gFameCheckerText_PickScreenUI[]; // "{KEYGFX_START_BUTTON}PICK {KEYGFX_DPAD_UP_DOWN}SELECT {KEYGFX_B_BUTTON}CANCEL$"
+extern const u8 gFameCheckerText_FlavorTextUI[]; // "{KEYGFX_DPAD_ANY}PICK {KEYGFX_A_BUTTON}READ {KEYGFX_B_BUTTON}CANCEL$"
+extern const u8 gFameCheckerOakName[]; // "OAK$"
+extern const u8 gFameCheckerDaisyName[]; // "DAISY$"
+extern const u8 gFameCheckerBillName[]; // "BILL$"
+extern const u8 gFameCheckerMrFujiName[]; // "FUJI$"
+
+static const u16 sFameCheckerTilemap[] = INCBIN_U16("data/fame_checker/tilemap_845c600.bin");
+static const u8 sQuestionMarkSpriteGfx[] = INCBIN_U8("data/fame_checker/img_845ce00.4bpp");
+static const u8 sSpinningPokeballSpriteGfx[] = INCBIN_U8("data/fame_checker/img_845cf00.4bpp");
+static const u16 sSpinningPokeballSpritePalette[] = INCBIN_U16("data/fame_checker/pal_845d0e0.gbapal");
+static const u8 sSelectorCursorSpriteGfx[] = INCBIN_U8("data/fame_checker/img_845d100.4bpp");
+static const u16 sSelectorCursorSpritePalette[] = INCBIN_U16("data/fame_checker/pal_845d500.gbapal");
+static const u8 sFujiSpriteGfx[] = INCBIN_U8("data/fame_checker/img_845d520.4bpp");
+static const u16 sFujiSpritePalette[] = INCBIN_U16("data/fame_checker/pal_845dd20.gbapal");
+static const u8 sBillSpriteGfx[] = INCBIN_U8("data/fame_checker/img_845dd40.4bpp");
+static const u16 sBillSpritePalette[] = INCBIN_U16("data/fame_checker/pal_845e540.gbapal");
+static const u8 sDaisySpriteGfx[] = INCBIN_U8("data/fame_checker/img_845e560.4bpp");
+static const u16 sDaisySpritePalette[] = INCBIN_U16("data/fame_checker/pal_845ed60.gbapal");
+static const u8 sOakSpriteGfx[] = INCBIN_U8("data/fame_checker/img_845ed80.4bpp");
+static const u16 sOakSpritePalette[] = INCBIN_U16("data/fame_checker/pal_845f580.gbapal");
+static const u16 gUnknown_845F5A0[] = INCBIN_U16("data/fame_checker/pal_845f5a0.gbapal"); // unused?
+static const u16 sSilhouettePalette[] = INCBIN_U16("data/fame_checker/pal_845f5c0.gbapal");
+
+static const struct TextColor sTextColor_White = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY};
+static const struct TextColor sTextColor_DkGrey = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, 0x03};
+static const struct TextColor sTextColor_Green = {TEXT_COLOR_TRANSPARENT, 0x06, 0x07};
+
+static const u16 sTrainerIdxs[] = {
+ FC_NONTRAINER_START + 0, // OAK
+ FC_NONTRAINER_START + 1, // DAISY
+ 0x019e, // BROCK
+ 0x019f, // MISTY
+ 0x01a0, // LTSURGE
+ 0x01a1, // ERIKA
+ 0x01a2, // KOGA
+ 0x01a4, // SABRINA
+ 0x01a3, // BLAINE
+ 0x019a, // LORELEI
+ 0x019b, // BRUNO
+ 0x019c, // AGATHA
+ 0x019d, // LANCE
+ FC_NONTRAINER_START + 2, // BILL
+ FC_NONTRAINER_START + 3, // MRFUJI
+ 0x015c // GIOVANNI
+};
+
+static const u8 *const sNonTrainerNamePointers[] = {
+ gFameCheckerOakName,
+ gFameCheckerDaisyName,
+ gFameCheckerBillName,
+ gFameCheckerMrFujiName
+};
+
+static const u8 sFameCheckerTrainerPicIdxs[] = {
+ 0x56, 0x54, 0x74, 0x75, 0x76, 0x77, 0x78, 0x7a, 0x79, 0x70, 0x71, 0x72, 0x73, 0x64, 0x7b, 0x6c,
+ 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 // these values are unused
+};
+
+static const u8 *const sFameCheckerNameAndQuotesPointers[] = {
+ gFameCheckerPersonName_ProfOak, gFameCheckerPersonName_Daisy, gFameCheckerPersonName_Brock, gFameCheckerPersonName_Misty, gFameCheckerPersonName_LtSurge, gFameCheckerPersonName_Erika, gFameCheckerPersonName_Koga, gFameCheckerPersonName_Sabrina, gFameCheckerPersonName_Blaine, gFameCheckerPersonName_Lorelei, gFameCheckerPersonName_Bruno, gFameCheckerPersonName_Agatha, gFameCheckerPersonName_Lance, gFameCheckerPersonName_Bill, gFameCheckerPersonName_MrFuji, gFameCheckerPersonName_Giovanni,
+ gFameCheckerPersonQuote_ProfOak, gFameCheckerPersonQuote_Daisy, gFameCheckerPersonQuote_Brock, gFameCheckerPersonQuote_Misty, gFameCheckerPersonQuote_LtSurge, gFameCheckerPersonQuote_Erika, gFameCheckerPersonQuote_Koga, gFameCheckerPersonQuote_Sabrina, gFameCheckerPersonQuote_Blaine, gFameCheckerPersonQuote_Lorelei, gFameCheckerPersonQuote_Bruno, gFameCheckerPersonQuote_Agatha, gFameCheckerPersonQuote_Lance, gFameCheckerPersonQuote_Bill, gFameCheckerPersonQuote_MrFuji, gFameCheckerPersonQuote_Giovanni
+};
+
+static const u8 *const sFameCheckerFlavorTextPointers[] = {
+ gFameCheckerFlavorText_ProfOak0, gFameCheckerFlavorText_ProfOak1, gFameCheckerFlavorText_ProfOak2, gFameCheckerFlavorText_ProfOak3, gFameCheckerFlavorText_ProfOak4, gFameCheckerFlavorText_ProfOak5,
+ gFameCheckerFlavorText_Daisy0, gFameCheckerFlavorText_Daisy1, gFameCheckerFlavorText_Daisy2, gFameCheckerFlavorText_Daisy3, gFameCheckerFlavorText_Daisy4, gFameCheckerFlavorText_Daisy5,
+ gFameCheckerFlavorText_Brock0, gFameCheckerFlavorText_Brock1, gFameCheckerFlavorText_Brock2, gFameCheckerFlavorText_Brock3, gFameCheckerFlavorText_Brock4, gFameCheckerFlavorText_Brock5,
+ gFameCheckerFlavorText_Misty0, gFameCheckerFlavorText_Misty1, gFameCheckerFlavorText_Misty2, gFameCheckerFlavorText_Misty3, gFameCheckerFlavorText_Misty4, gFameCheckerFlavorText_Misty5,
+ gFameCheckerFlavorText_LtSurge0, gFameCheckerFlavorText_LtSurge1, gFameCheckerFlavorText_LtSurge2, gFameCheckerFlavorText_LtSurge3, gFameCheckerFlavorText_LtSurge4, gFameCheckerFlavorText_LtSurge5,
+ gFameCheckerFlavorText_Erika0, gFameCheckerFlavorText_Erika1, gFameCheckerFlavorText_Erika2, gFameCheckerFlavorText_Erika3, gFameCheckerFlavorText_Erika4, gFameCheckerFlavorText_Erika5,
+ gFameCheckerFlavorText_Koga0, gFameCheckerFlavorText_Koga1, gFameCheckerFlavorText_Koga2, gFameCheckerFlavorText_Koga3, gFameCheckerFlavorText_Koga4, gFameCheckerFlavorText_Koga5,
+ gFameCheckerFlavorText_Sabrina0, gFameCheckerFlavorText_Sabrina1, gFameCheckerFlavorText_Sabrina2, gFameCheckerFlavorText_Sabrina3, gFameCheckerFlavorText_Sabrina4, gFameCheckerFlavorText_Sabrina5,
+ gFameCheckerFlavorText_Blaine0, gFameCheckerFlavorText_Blaine1, gFameCheckerFlavorText_Blaine2, gFameCheckerFlavorText_Blaine3, gFameCheckerFlavorText_Blaine4, gFameCheckerFlavorText_Blaine5,
+ gFameCheckerFlavorText_Lorelei0, gFameCheckerFlavorText_Lorelei1, gFameCheckerFlavorText_Lorelei2, gFameCheckerFlavorText_Lorelei3, gFameCheckerFlavorText_Lorelei4, gFameCheckerFlavorText_Lorelei5,
+ gFameCheckerFlavorText_Bruno0, gFameCheckerFlavorText_Bruno1, gFameCheckerFlavorText_Bruno2, gFameCheckerFlavorText_Bruno3, gFameCheckerFlavorText_Bruno4, gFameCheckerFlavorText_Bruno5,
+ gFameCheckerFlavorText_Agatha0, gFameCheckerFlavorText_Agatha1, gFameCheckerFlavorText_Agatha2, gFameCheckerFlavorText_Agatha3, gFameCheckerFlavorText_Agatha4, gFameCheckerFlavorText_Agatha5,
+ gFameCheckerFlavorText_Lance0, gFameCheckerFlavorText_Lance1, gFameCheckerFlavorText_Lance2, gFameCheckerFlavorText_Lance3, gFameCheckerFlavorText_Lance4, gFameCheckerFlavorText_Lance5,
+ gFameCheckerFlavorText_Bill0, gFameCheckerFlavorText_Bill1, gFameCheckerFlavorText_Bill2, gFameCheckerFlavorText_Bill3, gFameCheckerFlavorText_Bill4, gFameCheckerFlavorText_Bill5,
+ gFameCheckerFlavorText_MrFuji0, gFameCheckerFlavorText_MrFuji1, gFameCheckerFlavorText_MrFuji2, gFameCheckerFlavorText_MrFuji3, gFameCheckerFlavorText_MrFuji4, gFameCheckerFlavorText_MrFuji5,
+ gFameCheckerFlavorText_Giovanni0, gFameCheckerFlavorText_Giovanni1, gFameCheckerFlavorText_Giovanni2, gFameCheckerFlavorText_Giovanni3, gFameCheckerFlavorText_Giovanni4, gFameCheckerFlavorText_Giovanni5
+};
+
+static const u8 sFameCheckerArrayNpcGraphicsIds[] = {
+ 0x67, 0x47, 0x30, 0x69, 0x4b, 0x37,
+ 0x37, 0x30, 0x3d, 0x69, 0x23, 0x69,
+ 0x66, 0x50, 0x1b, 0x13, 0x1e, 0x69,
+ 0x66, 0x51, 0x2b, 0x27, 0x1d, 0x69,
+ 0x66, 0x52, 0x3d, 0x3d, 0x3e, 0x69,
+ 0x66, 0x53, 0x16, 0x1d, 0x53, 0x69,
+ 0x66, 0x54, 0x1a, 0x16, 0x69, 0x1e,
+ 0x66, 0x19, 0x55, 0x55, 0x69, 0x29,
+ 0x66, 0x56, 0x37, 0x1c, 0x69, 0x69,
+ 0x4d, 0x4d, 0x20, 0x69, 0x11, 0x23,
+ 0x4f, 0x4f, 0x69, 0x36, 0x1d, 0x36,
+ 0x4b, 0x36, 0x36, 0x69, 0x4b, 0x23,
+ 0x4a, 0x4a, 0x18, 0x17, 0x69, 0x29,
+ 0x48, 0x12, 0x20, 0x59, 0x59, 0x59,
+ 0x11, 0x31, 0x69, 0x1e, 0x69, 0x69,
+ 0x57, 0x37, 0x37, 0x57, 0x5b, 0x37
+};
+
+static const u8 *const sFlavorTextOriginLocationTexts[] = {
+ gFameCheckerFlavorTextOriginLocation_ProfOak0, gFameCheckerFlavorTextOriginLocation_ProfOak1, gFameCheckerFlavorTextOriginLocation_ProfOak2, gFameCheckerFlavorTextOriginLocation_ProfOak3, gFameCheckerFlavorTextOriginLocation_ProfOak4, gFameCheckerFlavorTextOriginLocation_ProfOak5,
+ gFameCheckerFlavorTextOriginLocation_Daisy0, gFameCheckerFlavorTextOriginLocation_Daisy1, gFameCheckerFlavorTextOriginLocation_Daisy2, gFameCheckerFlavorTextOriginLocation_Daisy3, gFameCheckerFlavorTextOriginLocation_Daisy4, gFameCheckerFlavorTextOriginLocation_Daisy5,
+ gFameCheckerFlavorTextOriginLocation_Brock0, gFameCheckerFlavorTextOriginLocation_Brock1, gFameCheckerFlavorTextOriginLocation_Brock2, gFameCheckerFlavorTextOriginLocation_Brock3, gFameCheckerFlavorTextOriginLocation_Brock4, gFameCheckerFlavorTextOriginLocation_Brock5,
+ gFameCheckerFlavorTextOriginLocation_Misty0, gFameCheckerFlavorTextOriginLocation_Misty1, gFameCheckerFlavorTextOriginLocation_Misty2, gFameCheckerFlavorTextOriginLocation_Misty3, gFameCheckerFlavorTextOriginLocation_Misty4, gFameCheckerFlavorTextOriginLocation_Misty5,
+ gFameCheckerFlavorTextOriginLocation_LtSurge0, gFameCheckerFlavorTextOriginLocation_LtSurge1, gFameCheckerFlavorTextOriginLocation_LtSurge2, gFameCheckerFlavorTextOriginLocation_LtSurge3, gFameCheckerFlavorTextOriginLocation_LtSurge4, gFameCheckerFlavorTextOriginLocation_LtSurge5,
+ gFameCheckerFlavorTextOriginLocation_Erika0, gFameCheckerFlavorTextOriginLocation_Erika1, gFameCheckerFlavorTextOriginLocation_Erika2, gFameCheckerFlavorTextOriginLocation_Erika3, gFameCheckerFlavorTextOriginLocation_Erika4, gFameCheckerFlavorTextOriginLocation_Erika5,
+ gFameCheckerFlavorTextOriginLocation_Koga0, gFameCheckerFlavorTextOriginLocation_Koga1, gFameCheckerFlavorTextOriginLocation_Koga2, gFameCheckerFlavorTextOriginLocation_Koga3, gFameCheckerFlavorTextOriginLocation_Koga4, gFameCheckerFlavorTextOriginLocation_Koga5,
+ gFameCheckerFlavorTextOriginLocation_Sabrina0, gFameCheckerFlavorTextOriginLocation_Sabrina1, gFameCheckerFlavorTextOriginLocation_Sabrina2, gFameCheckerFlavorTextOriginLocation_Sabrina3, gFameCheckerFlavorTextOriginLocation_Sabrina4, gFameCheckerFlavorTextOriginLocation_Sabrina5,
+ gFameCheckerFlavorTextOriginLocation_Blaine0, gFameCheckerFlavorTextOriginLocation_Blaine1, gFameCheckerFlavorTextOriginLocation_Blaine2, gFameCheckerFlavorTextOriginLocation_Blaine3, gFameCheckerFlavorTextOriginLocation_Blaine4, gFameCheckerFlavorTextOriginLocation_Blaine5,
+ gFameCheckerFlavorTextOriginLocation_Lorelei0, gFameCheckerFlavorTextOriginLocation_Lorelei1, gFameCheckerFlavorTextOriginLocation_Lorelei2, gFameCheckerFlavorTextOriginLocation_Lorelei3, gFameCheckerFlavorTextOriginLocation_Lorelei4, gFameCheckerFlavorTextOriginLocation_Lorelei5,
+ gFameCheckerFlavorTextOriginLocation_Bruno0, gFameCheckerFlavorTextOriginLocation_Bruno1, gFameCheckerFlavorTextOriginLocation_Bruno2, gFameCheckerFlavorTextOriginLocation_Bruno3, gFameCheckerFlavorTextOriginLocation_Bruno4, gFameCheckerFlavorTextOriginLocation_Bruno5,
+ gFameCheckerFlavorTextOriginLocation_Agatha0, gFameCheckerFlavorTextOriginLocation_Agatha1, gFameCheckerFlavorTextOriginLocation_Agatha2, gFameCheckerFlavorTextOriginLocation_Agatha3, gFameCheckerFlavorTextOriginLocation_Agatha4, gFameCheckerFlavorTextOriginLocation_Agatha5,
+ gFameCheckerFlavorTextOriginLocation_Lance0, gFameCheckerFlavorTextOriginLocation_Lance1, gFameCheckerFlavorTextOriginLocation_Lance2, gFameCheckerFlavorTextOriginLocation_Lance3, gFameCheckerFlavorTextOriginLocation_Lance4, gFameCheckerFlavorTextOriginLocation_Lance5,
+ gFameCheckerFlavorTextOriginLocation_Bill0, gFameCheckerFlavorTextOriginLocation_Bill1, gFameCheckerFlavorTextOriginLocation_Bill2, gFameCheckerFlavorTextOriginLocation_Bill3, gFameCheckerFlavorTextOriginLocation_Bill4, gFameCheckerFlavorTextOriginLocation_Bill5,
+ gFameCheckerFlavorTextOriginLocation_MrFuji0, gFameCheckerFlavorTextOriginLocation_MrFuji1, gFameCheckerFlavorTextOriginLocation_MrFuji2, gFameCheckerFlavorTextOriginLocation_MrFuji3, gFameCheckerFlavorTextOriginLocation_MrFuji4, gFameCheckerFlavorTextOriginLocation_MrFuji5,
+ gFameCheckerFlavorTextOriginLocation_Giovanni0, gFameCheckerFlavorTextOriginLocation_Giovanni1, gFameCheckerFlavorTextOriginLocation_Giovanni2, gFameCheckerFlavorTextOriginLocation_Giovanni3, gFameCheckerFlavorTextOriginLocation_Giovanni4, gFameCheckerFlavorTextOriginLocation_Giovanni5
+};
+
+static const u8 *const sFlavorTextOriginObjectNameTexts[] = {
+ gFameCheckerFlavorTextOriginObjectName_ProfOak0, gFameCheckerFlavorTextOriginObjectName_ProfOak1, gFameCheckerFlavorTextOriginObjectName_ProfOak2, gFameCheckerFlavorTextOriginObjectName_ProfOak3, gFameCheckerFlavorTextOriginObjectName_ProfOak4, gFameCheckerFlavorTextOriginObjectName_ProfOak5,
+ gFameCheckerFlavorTextOriginObjectName_Daisy0, gFameCheckerFlavorTextOriginObjectName_Daisy1, gFameCheckerFlavorTextOriginObjectName_Daisy2, gFameCheckerFlavorTextOriginObjectName_Daisy3, gFameCheckerFlavorTextOriginObjectName_Daisy4, gFameCheckerFlavorTextOriginObjectName_Daisy5,
+ gFameCheckerFlavorTextOriginObjectName_Brock0, gFameCheckerFlavorTextOriginObjectName_Brock1, gFameCheckerFlavorTextOriginObjectName_Brock2, gFameCheckerFlavorTextOriginObjectName_Brock3, gFameCheckerFlavorTextOriginObjectName_Brock4, gFameCheckerFlavorTextOriginObjectName_Brock5,
+ gFameCheckerFlavorTextOriginObjectName_Misty0, gFameCheckerFlavorTextOriginObjectName_Misty1, gFameCheckerFlavorTextOriginObjectName_Misty2, gFameCheckerFlavorTextOriginObjectName_Misty3, gFameCheckerFlavorTextOriginObjectName_Misty4, gFameCheckerFlavorTextOriginObjectName_Misty5,
+ gFameCheckerFlavorTextOriginObjectName_LtSurge0, gFameCheckerFlavorTextOriginObjectName_LtSurge1, gFameCheckerFlavorTextOriginObjectName_LtSurge2, gFameCheckerFlavorTextOriginObjectName_LtSurge3, gFameCheckerFlavorTextOriginObjectName_LtSurge4, gFameCheckerFlavorTextOriginObjectName_LtSurge5,
+ gFameCheckerFlavorTextOriginObjectName_Erika0, gFameCheckerFlavorTextOriginObjectName_Erika1, gFameCheckerFlavorTextOriginObjectName_Erika2, gFameCheckerFlavorTextOriginObjectName_Erika3, gFameCheckerFlavorTextOriginObjectName_Erika4, gFameCheckerFlavorTextOriginObjectName_Erika5,
+ gFameCheckerFlavorTextOriginObjectName_Koga0, gFameCheckerFlavorTextOriginObjectName_Koga1, gFameCheckerFlavorTextOriginObjectName_Koga2, gFameCheckerFlavorTextOriginObjectName_Koga3, gFameCheckerFlavorTextOriginObjectName_Koga4, gFameCheckerFlavorTextOriginObjectName_Koga5,
+ gFameCheckerFlavorTextOriginObjectName_Sabrina0, gFameCheckerFlavorTextOriginObjectName_Sabrina1, gFameCheckerFlavorTextOriginObjectName_Sabrina2, gFameCheckerFlavorTextOriginObjectName_Sabrina3, gFameCheckerFlavorTextOriginObjectName_Sabrina4, gFameCheckerFlavorTextOriginObjectName_Sabrina5,
+ gFameCheckerFlavorTextOriginObjectName_Blaine0, gFameCheckerFlavorTextOriginObjectName_Blaine1, gFameCheckerFlavorTextOriginObjectName_Blaine2, gFameCheckerFlavorTextOriginObjectName_Blaine3, gFameCheckerFlavorTextOriginObjectName_Blaine4, gFameCheckerFlavorTextOriginObjectName_Blaine5,
+ gFameCheckerFlavorTextOriginObjectName_Lorelei0, gFameCheckerFlavorTextOriginObjectName_Lorelei1, gFameCheckerFlavorTextOriginObjectName_Lorelei2, gFameCheckerFlavorTextOriginObjectName_Lorelei3, gFameCheckerFlavorTextOriginObjectName_Lorelei4, gFameCheckerFlavorTextOriginObjectName_Lorelei5,
+ gFameCheckerFlavorTextOriginObjectName_Bruno0, gFameCheckerFlavorTextOriginObjectName_Bruno1, gFameCheckerFlavorTextOriginObjectName_Bruno2, gFameCheckerFlavorTextOriginObjectName_Bruno3, gFameCheckerFlavorTextOriginObjectName_Bruno4, gFameCheckerFlavorTextOriginObjectName_Bruno5,
+ gFameCheckerFlavorTextOriginObjectName_Agatha0, gFameCheckerFlavorTextOriginObjectName_Agatha1, gFameCheckerFlavorTextOriginObjectName_Agatha2, gFameCheckerFlavorTextOriginObjectName_Agatha3, gFameCheckerFlavorTextOriginObjectName_Agatha4, gFameCheckerFlavorTextOriginObjectName_Agatha5,
+ gFameCheckerFlavorTextOriginObjectName_Lance0, gFameCheckerFlavorTextOriginObjectName_Lance1, gFameCheckerFlavorTextOriginObjectName_Lance2, gFameCheckerFlavorTextOriginObjectName_Lance3, gFameCheckerFlavorTextOriginObjectName_Lance4, gFameCheckerFlavorTextOriginObjectName_Lance5,
+ gFameCheckerFlavorTextOriginObjectName_Bill0, gFameCheckerFlavorTextOriginObjectName_Bill1, gFameCheckerFlavorTextOriginObjectName_Bill2, gFameCheckerFlavorTextOriginObjectName_Bill3, gFameCheckerFlavorTextOriginObjectName_Bill4, gFameCheckerFlavorTextOriginObjectName_Bill5,
+ gFameCheckerFlavorTextOriginObjectName_MrFuji0, gFameCheckerFlavorTextOriginObjectName_MrFuji1, gFameCheckerFlavorTextOriginObjectName_MrFuji2, gFameCheckerFlavorTextOriginObjectName_MrFuji3, gFameCheckerFlavorTextOriginObjectName_MrFuji4, gFameCheckerFlavorTextOriginObjectName_MrFuji5,
+ gFameCheckerFlavorTextOriginObjectName_Giovanni0, gFameCheckerFlavorTextOriginObjectName_Giovanni1, gFameCheckerFlavorTextOriginObjectName_Giovanni2, gFameCheckerFlavorTextOriginObjectName_Giovanni3, gFameCheckerFlavorTextOriginObjectName_Giovanni4, gFameCheckerFlavorTextOriginObjectName_Giovanni5
+};
+
+static const struct SpriteSheet sUISpriteSheets[] = {
+ {sSelectorCursorSpriteGfx, 0x400, SPRITETAG_SELECTOR_CURSOR},
+ {sQuestionMarkSpriteGfx, 0x100, SPRITETAG_QUESTION_MARK},
+ {sSpinningPokeballSpriteGfx, 0x1e0, SPRITETAG_SPINNING_POKEBALL},
+ {sDaisySpriteGfx, 0x800, SPRITETAG_DAISY},
+ {sFujiSpriteGfx, 0x800, SPRITETAG_FUJI},
+ {sOakSpriteGfx, 0x800, SPRITETAG_OAK},
+ {sBillSpriteGfx, 0x800, SPRITETAG_BILL},
+ {}
+};
+
+static const struct SpritePalette sUISpritePalettes[] = {
+ {sSelectorCursorSpritePalette, SPRITETAG_SELECTOR_CURSOR},
+ {sSpinningPokeballSpritePalette, SPRITETAG_SPINNING_POKEBALL},
+ {}
+};
+
+static const struct BgTemplate sUIBgTemplates[4] = {
+ {
+ .bg = 3,
+ .charBaseIndex = 0x03,
+ .mapBaseIndex = 0x1e,
+ .screenSize = 0,
+ .paletteMode = FALSE,
+ .priority = 3,
+ .baseTile = 0x000},
+ {
+ .bg = 2,
+ .charBaseIndex = 0x03,
+ .mapBaseIndex = 0x1b,
+ .screenSize = 0,
+ .paletteMode = FALSE,
+ .priority = 2,
+ .baseTile = 0x000},
+ {
+ .bg = 1,
+ .charBaseIndex = 0x03,
+ .mapBaseIndex = 0x1c,
+ .screenSize = 1,
+ .paletteMode = FALSE,
+ .priority = 0,
+ .baseTile = 0x000},
+ {
+ .bg = 0,
+ .charBaseIndex = 0x00,
+ .mapBaseIndex = 0x1f,
+ .screenSize = 0,
+ .paletteMode = FALSE,
+ .priority = 2,
+ .baseTile = 0x000},
+};
+
+static const struct WindowTemplate sUIWindowTemplates[] = {
+ {0, 1, 3, 8, 10, 15, 0x014}, // List Menu
+ {0, 6, 0, 24, 2, 15, 0x064}, // UI across the top
+ {0, 2, 15, 26, 4, 15, 0x094}, // Textbox on the bottom
+ {0, 15, 10, 11, 4, 15, 0x0FC}, // Icon description
+ DUMMY_WIN_TEMPLATE
+};
+
+static const union AnimCmd sSelectorCursorAnim0[] = {
+ ANIMCMD_FRAME( 0, 15),
+ ANIMCMD_FRAME(16, 15),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const sSelectorCursorAnims[] = {
+ sSelectorCursorAnim0
+};
+
+static const struct OamData sSelectorCursorOamData = {
+ .size = 2,
+ .priority = 2
+};
+
+static const struct SpriteTemplate sSpriteTemplate_SelectorCursor = {
+ SPRITETAG_SELECTOR_CURSOR, SPRITETAG_SELECTOR_CURSOR, &sSelectorCursorOamData, sSelectorCursorAnims, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const u8 filler_845FC5C[8] = {}; // ???
+
+static const struct OamData sQuestionMarkTileOamData = {
+ .shape = ST_OAM_V_RECTANGLE,
+ .size = 2,
+ .priority = 2
+};
+
+static const union AnimCmd sQuestionMarkTileAnim0[] = {
+ ANIMCMD_FRAME( 0, 10),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sQuestionMarkTileAnims[] = {
+ sQuestionMarkTileAnim0
+};
+
+static const struct SpriteTemplate sQuestionMarkTileSpriteTemplate = {
+ SPRITETAG_QUESTION_MARK, 0xffff, &sQuestionMarkTileOamData, sQuestionMarkTileAnims, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const union AnimCmd sSpinningPokeballAnim0[] = {
+ ANIMCMD_FRAME( 0, 10),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpinningPokeballAnims[] = {
+ sSpinningPokeballAnim0
+};
+
+static const struct OamData sSpinningPokeballOamData = {
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .size = 2
+};
+
+static const union AffineAnimCmd sSpinningPokeballAffineAnim0[] = {
+ AFFINEANIMCMD_FRAME(0, 0, 4, 20),
+ AFFINEANIMCMD_JUMP(0)
+};
+
+static const union AffineAnimCmd *const sSpinningPokeballAffineAnims[] = {
+ sSpinningPokeballAffineAnim0
+};
+
+static const struct SpriteTemplate sSpinningPokeballSpriteTemplate = {
+ SPRITETAG_SPINNING_POKEBALL, SPRITETAG_SPINNING_POKEBALL, &sSpinningPokeballOamData, sSpinningPokeballAnims, NULL, sSpinningPokeballAffineAnims, SpriteCB_FCSpinningPokeball
+};
+
+static const union AnimCmd sDaisyFujiOakBillAnim0[] = {
+ ANIMCMD_FRAME( 0, 15),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sDaisyFujiOakBillAnims[] = {
+ sDaisyFujiOakBillAnim0
+};
+
+static const struct OamData sDaisyFujiOakBillOamData = {
+ .size = 3
+};
+
+static const struct SpriteTemplate sDaisySpriteTemplate = {
+ SPRITETAG_DAISY, 0xffff, &sDaisyFujiOakBillOamData, sDaisyFujiOakBillAnims, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate sFujiSpriteTemplate = {
+ SPRITETAG_FUJI, 0xffff, &sDaisyFujiOakBillOamData, sDaisyFujiOakBillAnims, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate sOakSpriteTemplate = {
+ SPRITETAG_OAK, 0xffff, &sDaisyFujiOakBillOamData, sDaisyFujiOakBillAnims, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate sBillSpriteTemplate = {
+ SPRITETAG_BILL, 0xffff, &sDaisyFujiOakBillOamData, sDaisyFujiOakBillAnims, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static void FC_VBlankCallback(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static void MainCB2_FameCheckerMain(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void UseFameChecker(MainCallback savedCallback)
+{
+ SetVBlankCallback(NULL);
+ sFameCheckerData = AllocZeroed(sizeof(struct FameCheckerData));
+ sFameCheckerData->savedCallback = savedCallback;
+ sFameCheckerData->listMenuCurIdx = 0;
+ sFameCheckerData->listMenuTopIdx2 = 0;
+ sFameCheckerData->listMenuDrawnSelIdx = 0;
+ sFameCheckerData->viewingFlavorText = FALSE;
+ PlaySE(SE_W202);
+ SetMainCallback2(MainCB2_LoadFameChecker);
+}
+
+static void MainCB2_LoadFameChecker(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ FCSetup_ClearVideoRegisters();
+ gMain.state++;
+ break;
+ case 1:
+ FCSetup_ResetTasksAndSpriteResources();
+ gMain.state++;
+ break;
+ case 2:
+ sBg3TilemapBuffer = AllocZeroed(0x800);
+ sBg1TilemapBuffer = AllocZeroed(0x1000);
+ sBg2TilemapBuffer = AllocZeroed(0x800);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, sUIBgTemplates, ARRAY_COUNT(sUIBgTemplates));
+ SetBgTilemapBuffer(3, sBg3TilemapBuffer);
+ SetBgTilemapBuffer(2, sBg2TilemapBuffer);
+ SetBgTilemapBuffer(1, sBg1TilemapBuffer);
+ FCSetup_ResetBGCoords();
+ gMain.state++;
+ break;
+ case 3:
+ LoadBgTiles(3, gFameCheckerBgTiles, sizeof(gFameCheckerBgTiles), 0);
+ CopyToBgTilemapBufferRect(3, gFameCheckerBg3Tilemap, 0, 0, 32, 32);
+ LoadPalette(gFameCheckerBgPals + 0x00, 0x00, 0x40);
+ LoadPalette(gFameCheckerBgPals + 0x10, 0x10, 0x20);
+ CopyToBgTilemapBufferRect(2, gFameCheckerBg2Tilemap, 0, 0, 32, 32);
+ CopyToBgTilemapBufferRect_ChangePalette(1, sFameCheckerTilemap, 30, 0, 32, 32, 0x11);
+ LoadPalette(stdpal_get(2), 0xF0, 0x20);
+ gMain.state++;
+ break;
+ case 4:
+ if (IsDma3ManagerBusyWithBgCopy() != TRUE)
+ {
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+ CopyBgTilemapBufferToVram(3);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(1);
+ gMain.state++;
+ }
+ break;
+ case 5:
+ InitWindows(sUIWindowTemplates);
+ DeactivateAllTextPrinters();
+ Setup_DrawMsgAndListBoxes();
+ sListMenuItems = AllocZeroed(17 * sizeof(struct ListMenuItem));
+ FC_CreateListMenu();
+ gMain.state++;
+ break;
+ case 6:
+ LoadUISpriteSheetsAndPalettes();
+ CreateAllFlavorTextIcons(FAMECHECKER_OAK);
+ WipeMsgBoxAndTransfer();
+ BeginNormalPaletteFade(0xFFFFFFFF,0, 16, 0, 0);
+ gMain.state++;
+ break;
+ case 7:
+ FCSetup_TurnOnDisplay();
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0x07);
+ SetGpuReg(REG_OFFSET_BLDY, 0x08);
+ SetVBlankCallback(FC_VBlankCallback);
+ sFameCheckerData->listMenuTopIdx = 0;
+ FC_CreateScrollIndicatorArrowPair();
+ UpdateInfoBoxTilemap(1, 4);
+ CreateTask(Task_WaitFadeOnInit, 0x08);
+ SetMainCallback2(MainCB2_FameCheckerMain);
+ gMain.state = 0;
+ break;
+ }
+}
+
+static void LoadUISpriteSheetsAndPalettes(void)
+{
+ LoadSpriteSheets(sUISpriteSheets);
+ LoadSpritePalettes(sUISpritePalettes);
+}
+
+static void Task_WaitFadeOnInit(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ gTasks[taskId].func = Task_TopMenuHandleInput;
+}
+
+static void Task_TopMenuHandleInput(u8 taskId)
+{
+ u16 cursorPos;
+ u8 i;
+ struct Task *task = &gTasks[taskId];
+ s16 * data = gTasks[taskId].data;
+ if (FindTaskIdByFunc(Task_FCOpenOrCloseInfoBox) == 0xFF)
+ {
+ RunTextPrinters();
+ if ((JOY_NEW(SELECT_BUTTON)) && !sFameCheckerData->inPickMode && sFameCheckerData->savedCallback != UseFameCheckerFromMenu)
+ task->func = Task_StartToCloseFameChecker;
+ else if (JOY_NEW(START_BUTTON))
+ {
+ cursorPos = FameCheckerGetCursorY();
+ if (TryExitPickMode(taskId) == TRUE)
+ {
+ PlaySE(SE_W100);
+ }
+ else if (cursorPos != sFameCheckerData->numUnlockedPersons - 1) // anything but CANCEL
+ {
+ PlaySE(SE_W100);
+ FillWindowPixelRect(FCWINDOWID_ICONDESC, 0x00, 0, 0, 88, 32);
+ FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_ICONDESC);
+ UpdateInfoBoxTilemap(2, 4);
+ UpdateInfoBoxTilemap(1, 5);
+ PrintUIHelp(1);
+ task->data[2] = CreatePersonPicSprite(sFameCheckerData->unlockedPersons[cursorPos]);
+ gSprites[task->data[2]].pos2.x = 0xF0;
+ gSprites[task->data[2]].data[0] = 1;
+ task->data[3] = CreateSpinningPokeballSprite();
+ gSprites[task->data[3]].pos2.x = 0xF0;
+ gSprites[task->data[3]].data[0] = 1;
+ task->func = Task_EnterPickMode;
+ }
+ }
+ else if (JOY_NEW(A_BUTTON))
+ {
+ cursorPos = ListMenuHandleInput(0);
+ if (cursorPos == sFameCheckerData->numUnlockedPersons - 1) // CANCEL
+ task->func = Task_StartToCloseFameChecker;
+ else if (sFameCheckerData->inPickMode)
+ {
+ if (!IsTextPrinterActive(2) && HasUnlockedAllFlavorTextsForCurrentPerson() == TRUE)
+ GetPickModeText();
+ }
+ else if (sFameCheckerData->personHasUnlockedPanels)
+ {
+ PlaySE(SE_SELECT);
+ task->data[0] = CreateFlavorTextIconSelectorCursorSprite(task->data[1]);
+ for (i = 0; i < 6; i++)
+ {
+ if (i != task->data[1])
+ SetMessageSelectorIconObjMode(sFameCheckerData->spriteIds[i], ST_OAM_OBJ_BLEND);
+ }
+ gIconDescriptionBoxIsOpen = 0xFF;
+ PlaceListMenuCursor(FALSE);
+ PrintUIHelp(2);
+ if (gSprites[sFameCheckerData->spriteIds[task->data[1]]].data[1] != 0xFF) // not a ? tile
+ {
+ PrintSelectedNameInBrightGreen(taskId);
+ UpdateIconDescriptionBox(data[1]);
+ }
+ FreeListMenuSelectorArrowPairResources();
+ task->func = Task_FlavorTextDisplayHandleInput;
+ }
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ if (TryExitPickMode(taskId) != TRUE)
+ task->func = Task_StartToCloseFameChecker;
+ }
+ else
+ ListMenuHandleInput(0);
+ }
+}
+
+static bool8 TryExitPickMode(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ if (sFameCheckerData->inPickMode)
+ {
+ gSprites[task->data[2]].data[0] = 2;
+ gSprites[task->data[2]].pos2.x += 10;
+ gSprites[task->data[3]].data[0] = 2;
+ gSprites[task->data[3]].pos2.x += 10;
+ WipeMsgBoxAndTransfer();
+ task->func = Task_ExitPickMode;
+ MessageBoxPrintEmptyText();
+ sFameCheckerData->pickModeOverCancel = FALSE;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void MessageBoxPrintEmptyText(void)
+{
+ AddTextPrinterParametrized(2, 2, gFameCheckerText_ClearTextbox, 0, NULL, 2, 1, 3);
+}
+
+static void Task_EnterPickMode(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ if (gSprites[task->data[2]].data[0] == 0)
+ {
+ GetPickModeText();
+ sFameCheckerData->inPickMode = TRUE;
+ task->func = Task_TopMenuHandleInput;
+ }
+ else
+ ChangeBgX(1, 0xA00, 1);
+}
+
+static void Task_ExitPickMode(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ if (GetBgX(1) != 0)
+ ChangeBgX(1, 0xA00, 2);
+ else
+ ChangeBgX(1, 0x000, 0);
+ if (gSprites[task->data[2]].data[0] == 0)
+ {
+ if (sFameCheckerData->personHasUnlockedPanels)
+ PrintUIHelp(0);
+ UpdateInfoBoxTilemap(1, 4);
+ UpdateInfoBoxTilemap(2, 2);
+ sFameCheckerData->inPickMode = FALSE;
+ DestroyPersonPicSprite(taskId, FameCheckerGetCursorY());
+ task->func = Task_TopMenuHandleInput;
+ gSprites[task->data[3]].callback = SpriteCB_DestroySpinningPokeball;
+ }
+}
+
+static void Task_FlavorTextDisplayHandleInput(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ s16 *data = gTasks[taskId].data;
+
+ RunTextPrinters();
+ if (JOY_NEW(A_BUTTON) && !IsTextPrinterActive(2))
+ {
+ u8 spriteId = sFameCheckerData->spriteIds[data[1]];
+ if (gSprites[spriteId].data[1] != 0xFF)
+ PrintSelectedNameInBrightGreen(taskId);
+ }
+ if (JOY_NEW(B_BUTTON))
+ {
+ u8 i;
+ PlaySE(SE_SELECT);
+ for (i = 0; i < 6; i++)
+ SetMessageSelectorIconObjMode(sFameCheckerData->spriteIds[i], ST_OAM_OBJ_NORMAL);
+ WipeMsgBoxAndTransfer();
+ gSprites[task->data[0]].callback = SpriteCB_DestroyFlavorTextIconSelectorCursor;
+ if (gIconDescriptionBoxIsOpen != 0xFF)
+ UpdateIconDescriptionBoxOff();
+ PlaceListMenuCursor(TRUE);
+ PrintUIHelp(0);
+ FC_CreateScrollIndicatorArrowPair();
+ MessageBoxPrintEmptyText();
+ task->func = Task_TopMenuHandleInput;
+ }
+ else if (JOY_NEW(DPAD_UP) || JOY_NEW(DPAD_DOWN))
+ {
+ if (task->data[1] >= 3)
+ {
+ task->data[1] -= 3;
+ FC_MoveSelectorCursor(taskId, 0, -0x1b);
+ }
+ else
+ {
+ task->data[1] += 3;
+ FC_MoveSelectorCursor(taskId, 0, +0x1b);
+ }
+ }
+ else if (JOY_NEW(DPAD_LEFT))
+ {
+ if (task->data[1] == 0 || task->data[1] % 3 == 0)
+ {
+ task->data[1] += 2;
+ FC_MoveSelectorCursor(taskId, +0x5e, 0);
+ }
+ else
+ {
+ task->data[1]--;
+ FC_MoveSelectorCursor(taskId, -0x2f, 0);
+ }
+ }
+ else if (JOY_NEW(DPAD_RIGHT))
+ {
+ if ((task->data[1] + 1) % 3 == 0)
+ {
+ task->data[1] -= 2;
+ FC_MoveSelectorCursor(taskId, -0x5e, 0);
+ }
+ else
+ {
+ task->data[1]++;
+ FC_MoveSelectorCursor(taskId, +0x2f, 0);
+ }
+ }
+}
+
+static void FC_MoveSelectorCursor(u8 taskId, s8 dx, s8 dy)
+{
+ u8 i;
+ s16 *data = gTasks[taskId].data;
+ PlaySE(SE_W155);
+ gSprites[data[0]].pos1.x += dx;
+ gSprites[data[0]].pos1.y += dy;
+ for (i = 0; i < 6; i++)
+ SetMessageSelectorIconObjMode(sFameCheckerData->spriteIds[i], ST_OAM_OBJ_BLEND);
+ FillWindowPixelRect(FCWINDOWID_MSGBOX, 0x11, 0, 0, 0xd0, 0x20);
+ MessageBoxPrintEmptyText();
+ if (SetMessageSelectorIconObjMode(sFameCheckerData->spriteIds[data[1]], ST_OAM_OBJ_NORMAL) == TRUE)
+ {
+ PrintSelectedNameInBrightGreen(taskId);
+ UpdateIconDescriptionBox(data[1]);
+ }
+ else if (gIconDescriptionBoxIsOpen != 0xFF)
+ UpdateIconDescriptionBoxOff();
+}
+
+static void GetPickModeText(void)
+{
+ u8 offset = 0;
+ u16 who = FameCheckerGetCursorY();
+ if (gSaveBlock1Ptr->fameChecker[sFameCheckerData->unlockedPersons[who]].pickState != FCPICKSTATE_COLORED)
+ {
+ WipeMsgBoxAndTransfer();
+ MessageBoxPrintEmptyText();
+ }
+ else
+ {
+ FillWindowPixelRect(FCWINDOWID_MSGBOX, 0x11, 0, 0, 0xd0, 0x20);
+ if (HasUnlockedAllFlavorTextsForCurrentPerson() == TRUE)
+ offset = NUM_FAMECHECKER_PERSONS;
+ StringExpandPlaceholders(gStringVar4, sFameCheckerNameAndQuotesPointers[sFameCheckerData->unlockedPersons[who] + offset]);
+ AddTextPrinterParametrized(FCWINDOWID_MSGBOX, 2, gStringVar4, sub_80F78A8(), NULL, 2, 1, 3);
+ FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX);
+ }
+}
+
+static void PrintSelectedNameInBrightGreen(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ u16 cursorPos = FameCheckerGetCursorY();
+ FillWindowPixelRect(FCWINDOWID_MSGBOX, 0x11, 0, 0, 0xd0, 0x20);
+ StringExpandPlaceholders(gStringVar4, sFameCheckerFlavorTextPointers[sFameCheckerData->unlockedPersons[cursorPos] * 6 + data[1]]);
+ AddTextPrinterParametrized(FCWINDOWID_MSGBOX, 2, gStringVar4, sub_80F78A8(), NULL, 2, 1, 3);
+ FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX);
+}
+
+static void WipeMsgBoxAndTransfer(void)
+{
+ FillWindowPixelRect(FCWINDOWID_MSGBOX, 0x11, 0, 0, 0xd0, 0x20);
+ FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX);
+}
+
+static void Setup_DrawMsgAndListBoxes(void)
+{
+ sub_80F6E9C();
+ sub_80F6EE4(FCWINDOWID_MSGBOX, TRUE);
+ FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX);
+ FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_LIST);
+}
+
+static void FC_PutWindowTilemapAndCopyWindowToVramMode3(u8 windowId)
+{
+ PutWindowTilemap(windowId);
+ CopyWindowToVram(windowId, 3);
+}
+
+static bool8 SetMessageSelectorIconObjMode(u8 spriteId, u8 objMode)
+{
+ if (gSprites[spriteId].data[1] != 0xFF)
+ {
+ gSprites[spriteId].oam.objMode = objMode;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void Task_StartToCloseFameChecker(u8 taskId)
+{
+ PlaySE(SE_W202);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gTasks[taskId].func = Task_DestroyAssetsAndCloseFameChecker;
+}
+
+static void Task_DestroyAssetsAndCloseFameChecker(u8 taskId)
+{
+ u8 i;
+
+ if (!gPaletteFade.active)
+ {
+ if (sFameCheckerData->inPickMode)
+ {
+ DestroyPersonPicSprite(taskId, FameCheckerGetCursorY());
+ FreeSpriteOamMatrix(&gSprites[gTasks[taskId].data[3]]);
+ DestroySprite(&gSprites[gTasks[taskId].data[3]]);
+ }
+ for (i = 0; i < 6; i++)
+ {
+ DestroySprite(&gSprites[sFameCheckerData->spriteIds[i]]);
+ }
+ FreeNonTrainerPicTiles();
+ FreeSpinningPokeballSpriteResources();
+ FreeSelectionCursorSpriteResources();
+ FreeQuestionMarkSpriteResources();
+ FreeListMenuSelectorArrowPairResources();
+ SetMainCallback2(sFameCheckerData->savedCallback);
+ sub_810713C(sFameCheckerData->listMenuTaskId, 0, 0);
+ Free(sBg3TilemapBuffer);
+ Free(sBg1TilemapBuffer);
+ Free(sBg2TilemapBuffer);
+ Free(sFameCheckerData);
+ Free(sListMenuItems);
+ FC_DestroyWindow(0);
+ FC_DestroyWindow(1);
+ FC_DestroyWindow(2);
+ FC_DestroyWindow(3);
+ FreeAllWindowBuffers();
+ DestroyTask(taskId);
+ }
+}
+
+static void FC_DestroyWindow(u8 windowId)
+{
+ FillWindowPixelBuffer(windowId, 0);
+ ClearWindowTilemap(windowId);
+ CopyWindowToVram(windowId, 2);
+ RemoveWindow(windowId);
+}
+
+static u8 AdjustGiovanniIndexIfBeatenInGym(u8 a0)
+{
+ if (HasTrainerAlreadyBeenFought(0x15e) == TRUE)
+ {
+ if (a0 == 9)
+ return FAMECHECKER_GIOVANNI;
+ if (a0 > 9)
+ return a0 - 1;
+ }
+ return a0;
+}
+
+static void PrintUIHelp(u8 state)
+{
+ s32 width;
+ const u8 * src = gFameCheckerText_MainScreenUI;
+ if (state != 0)
+ {
+ src = gFameCheckerText_FlavorTextUI;
+ if (state == 1)
+ src = gFameCheckerText_PickScreenUI;
+ }
+ width = GetStringWidth(0, src, 0);
+ FillWindowPixelRect(FCWINDOWID_UIHELP, 0x00, 0, 0, 0xc0, 0x10);
+ AddTextPrinterParametrized2(FCWINDOWID_UIHELP, 0, 188 - width, 0, 0, 2, &sTextColor_White, -1, src);
+ FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_UIHELP);
+}
+
+static void DestroyAllFlavorTextIcons(void)
+{
+ u8 i;
+ for (i = 0; i < 6; i++)
+ {
+ DestroySprite(&gSprites[sFameCheckerData->spriteIds[i]]);
+ }
+}
+
+static bool8 CreateAllFlavorTextIcons(u8 who)
+{
+ bool8 result = FALSE;
+ u8 i;
+ for (i = 0; i < 6; i++)
+ {
+ if ((gSaveBlock1Ptr->fameChecker[sFameCheckerData->unlockedPersons[who]].flavorTextFlags >> i) & 1)
+ {
+ sFameCheckerData->spriteIds[i] = sub_805EB44(
+ sFameCheckerArrayNpcGraphicsIds[sFameCheckerData->unlockedPersons[who] * 6 + i],
+ i,
+ 47 * (i % 3) + 0x72,
+ 27 * (i / 3) + 0x2F
+ );
+ result = TRUE;
+ }
+ else
+ {
+ sFameCheckerData->spriteIds[i] = PlaceQuestionMarkTile(
+ 47 * (i % 3) + 0x72,
+ 27 * (i / 3) + 0x1F
+ );
+ gSprites[sFameCheckerData->spriteIds[i]].data[1] = 0xFF;
+ }
+ }
+ if (result == TRUE)
+ {
+ sFameCheckerData->personHasUnlockedPanels = TRUE;
+ if (sFameCheckerData->inPickMode)
+ PrintUIHelp(1);
+ else
+ PrintUIHelp(0);
+ }
+ else
+ {
+ sFameCheckerData->personHasUnlockedPanels = FALSE;
+ PrintUIHelp(1);
+ }
+ return result;
+}
+
+void ResetFameChecker(void)
+{
+ u8 i;
+ for (i = 0; i < NUM_FAMECHECKER_PERSONS; i++)
+ {
+ gSaveBlock1Ptr->fameChecker[i].pickState = FCPICKSTATE_NO_DRAW;
+ gSaveBlock1Ptr->fameChecker[i].flavorTextFlags = 0;
+ gSaveBlock1Ptr->fameChecker[i].unk_0_E = 0;
+ }
+ gSaveBlock1Ptr->fameChecker[FAMECHECKER_OAK].pickState = FCPICKSTATE_COLORED;
+}
+
+void FullyUnlockFameChecker(void)
+{
+ u8 i, j;
+ for (i = 0; i < NUM_FAMECHECKER_PERSONS; i++)
+ {
+ gSaveBlock1Ptr->fameChecker[i].pickState = FCPICKSTATE_COLORED;
+ for (j = 0; j < 6; j++)
+ {
+ gSaveBlock1Ptr->fameChecker[i].flavorTextFlags |= (1 << j);
+ }
+ }
+}
+
+static void FCSetup_ClearVideoRegisters(void)
+{
+ void * vram = (void *)VRAM;
+ DmaClearLarge16(3, vram, VRAM_SIZE, 0x1000);
+ DmaClear32(3, OAM, OAM_SIZE);
+ DmaClear16(3, PLTT, PLTT_SIZE);
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_BG0CNT, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1CNT, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2CNT, 0);
+ SetGpuReg(REG_OFFSET_BG2HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3CNT, 0);
+ SetGpuReg(REG_OFFSET_BG3HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3VOFS, 0);
+ SetGpuReg(REG_OFFSET_WIN0H, 0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0);
+ SetGpuReg(REG_OFFSET_WININ, 0);
+ SetGpuReg(REG_OFFSET_WINOUT, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+}
+
+static void FCSetup_ResetTasksAndSpriteResources(void)
+{
+ remove_some_task();
+ ResetTasks();
+ ResetSpriteData();
+ dp13_810BB8C();
+ ResetPaletteFade();
+ npc_paltag_set_load(0);
+ gReservedSpritePaletteCount = 7;
+
+}
+
+static void FCSetup_TurnOnDisplay(void)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON);
+}
+
+static void FCSetup_ResetBGCoords(void)
+{
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+}
+
+void SetFlavorTextFlagFromSpecialVars(void)
+{
+ if (gSpecialVar_0x8004 < NUM_FAMECHECKER_PERSONS && gSpecialVar_0x8005 < 6)
+ {
+ gSaveBlock1Ptr->fameChecker[gSpecialVar_0x8004].flavorTextFlags |= (1 << gSpecialVar_0x8005);
+ gSpecialVar_0x8005 = FCPICKSTATE_SILHOUETTE;
+ UpdatePickStateFromSpecialVar8005();
+ }
+}
+
+void UpdatePickStateFromSpecialVar8005(void)
+{
+ if (gSpecialVar_0x8004 < NUM_FAMECHECKER_PERSONS && gSpecialVar_0x8005 < 3)
+ {
+ if (gSpecialVar_0x8005 == FCPICKSTATE_NO_DRAW)
+ return;
+ if ( gSpecialVar_0x8005 == FCPICKSTATE_SILHOUETTE
+ && gSaveBlock1Ptr->fameChecker[gSpecialVar_0x8004].pickState == FCPICKSTATE_COLORED
+ )
+ return;
+ gSaveBlock1Ptr->fameChecker[gSpecialVar_0x8004].pickState = gSpecialVar_0x8005;
+ }
+}
+
+static bool8 HasUnlockedAllFlavorTextsForCurrentPerson(void)
+{
+ u8 i;
+ u8 who = sFameCheckerData->unlockedPersons[FameCheckerGetCursorY()];
+ for (i = 0; i < 6; i++)
+ {
+ if (!((gSaveBlock1Ptr->fameChecker[who].flavorTextFlags >> i) & 1))
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static void FreeSelectionCursorSpriteResources(void)
+{
+ FreeSpriteTilesByTag(SPRITETAG_SELECTOR_CURSOR);
+ FreeSpritePaletteByTag(SPRITETAG_SELECTOR_CURSOR);
+}
+
+static u8 CreateFlavorTextIconSelectorCursorSprite(s16 where)
+{
+ s16 y = 34 + 27 * (where >= 3);
+ s16 x = 114 + 47 * (where % 3);
+ return CreateSprite(&sSpriteTemplate_SelectorCursor, x, y, 0);
+}
+
+static void SpriteCB_DestroyFlavorTextIconSelectorCursor(struct Sprite * sprite)
+{
+ DestroySprite(sprite);
+}
+
+static void FreeQuestionMarkSpriteResources(void)
+{
+ FreeSpriteTilesByTag(SPRITETAG_QUESTION_MARK);
+}
+
+static u8 PlaceQuestionMarkTile(u8 x, u8 y)
+{
+ u8 spriteId = CreateSprite(&sQuestionMarkTileSpriteTemplate, x, y, 8);
+ gSprites[spriteId].oam.priority = 2;
+ gSprites[spriteId].oam.paletteNum = 2;
+ return spriteId;
+}
+
+static void FreeSpinningPokeballSpriteResources(void)
+{
+ FreeSpriteTilesByTag(SPRITETAG_SPINNING_POKEBALL);
+ FreeSpritePaletteByTag(SPRITETAG_SPINNING_POKEBALL);
+}
+
+static u8 CreateSpinningPokeballSprite(void)
+{
+ return CreateSprite(&sSpinningPokeballSpriteTemplate, 0xe2, 0x42, 0);
+}
+
+static void SpriteCB_DestroySpinningPokeball(struct Sprite * sprite)
+{
+ FreeSpriteOamMatrix(sprite);
+ DestroySprite(sprite);
+}
+
+static void FreeNonTrainerPicTiles(void)
+{
+ FreeSpriteTilesByTag(SPRITETAG_DAISY);
+ FreeSpriteTilesByTag(SPRITETAG_FUJI);
+ FreeSpriteTilesByTag(SPRITETAG_OAK);
+ FreeSpriteTilesByTag(SPRITETAG_BILL);
+}
+
+static void SpriteCB_FCSpinningPokeball(struct Sprite * sprite)
+{
+ if (sprite->data[0] == 1)
+ {
+ if (sprite->pos2.x - 10 < 0)
+ {
+ sprite->pos2.x = 0;
+ sprite->data[0] = 0;
+ }
+ else
+ sprite->pos2.x -= 10;
+ }
+ else if (sprite->data[0] == 2)
+ {
+ if (sprite->pos2.x > 240)
+ {
+ sprite->pos2.x = 240;
+ sprite->data[0] = 0;
+ }
+ else
+ sprite->pos2.x += 10;
+ }
+}
+
+static u8 CreatePersonPicSprite(u8 fcPersonIdx)
+{
+ u8 spriteId;
+ if (fcPersonIdx == FAMECHECKER_DAISY)
+ {
+ spriteId = CreateSprite(&sDaisySpriteTemplate, 0x94, 0x42, 0);
+ LoadPalette(sDaisySpritePalette, 0x160, 0x20);
+ gSprites[spriteId].oam.paletteNum = 6;
+ }
+ else if (fcPersonIdx == FAMECHECKER_MRFUJI)
+ {
+ spriteId = CreateSprite(&sFujiSpriteTemplate, 0x94, 0x42, 0);
+ LoadPalette(sFujiSpritePalette, 0x160, 0x20);
+ gSprites[spriteId].oam.paletteNum = 6;
+ }
+ else if (fcPersonIdx == FAMECHECKER_OAK)
+ {
+ spriteId = CreateSprite(&sOakSpriteTemplate, 0x94, 0x42, 0);
+ LoadPalette(sOakSpritePalette, 0x160, 0x20);
+ gSprites[spriteId].oam.paletteNum = 6;
+ }
+ else if (fcPersonIdx == FAMECHECKER_BILL)
+ {
+ spriteId = CreateSprite(&sBillSpriteTemplate, 0x94, 0x42, 0);
+ LoadPalette(sBillSpritePalette, 0x160, 0x20);
+ gSprites[spriteId].oam.paletteNum = 6;
+ }
+ else
+ {
+ spriteId = sub_810C2A4(sFameCheckerTrainerPicIdxs[fcPersonIdx], 1, 0x94, 0x42, 6, 0xFFFF);
+ }
+ gSprites[spriteId].callback = SpriteCB_FCSpinningPokeball;
+ if (gSaveBlock1Ptr->fameChecker[fcPersonIdx].pickState == FCPICKSTATE_SILHOUETTE)
+ LoadPalette(sSilhouettePalette, 0x160, 0x20);
+ return spriteId;
+}
+
+static void DestroyPersonPicSprite(u8 taskId, u16 who)
+{
+ s16 * data = gTasks[taskId].data;
+ u16 who_copy = who;
+ if (who == sFameCheckerData->numUnlockedPersons - 1)
+ who_copy = who - 1;
+ if ( sFameCheckerData->unlockedPersons[who_copy] == FAMECHECKER_DAISY
+ || sFameCheckerData->unlockedPersons[who_copy] == FAMECHECKER_MRFUJI
+ || sFameCheckerData->unlockedPersons[who_copy] == FAMECHECKER_OAK
+ || sFameCheckerData->unlockedPersons[who_copy] == FAMECHECKER_BILL
+ )
+ DestroySprite(&gSprites[data[2]]);
+ else
+ sub_810C2E8(data[2]);
+}
+
+static void UpdateIconDescriptionBox(u8 whichText)
+{
+ s32 width;
+ u32 idx = 6 * sFameCheckerData->unlockedPersons[FameCheckerGetCursorY()] + whichText;
+ HandleFlavorTextModeSwitch(TRUE);
+ gIconDescriptionBoxIsOpen = 1;
+ FillWindowPixelRect(FCWINDOWID_ICONDESC, 0x00, 0, 0, 0x58, 0x20);
+ width = (0x54 - GetStringWidth(0, sFlavorTextOriginLocationTexts[idx], 0)) / 2;
+ AddTextPrinterParametrized2(FCWINDOWID_ICONDESC, 0, width, 0, 0, 2, &sTextColor_DkGrey, -1, sFlavorTextOriginLocationTexts[idx]);
+ StringExpandPlaceholders(gStringVar1, sFlavorTextOriginObjectNameTexts[idx]);
+ width = (0x54 - GetStringWidth(0, gStringVar1, 0)) / 2;
+ AddTextPrinterParametrized2(FCWINDOWID_ICONDESC, 0, width, 10, 0, 2, &sTextColor_DkGrey, -1, gStringVar1);
+ FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_ICONDESC);
+}
+
+static void UpdateIconDescriptionBoxOff(void)
+{
+ HandleFlavorTextModeSwitch(FALSE);
+ gIconDescriptionBoxIsOpen = 0xFF;
+}
+
+static void FC_CreateListMenu(void)
+{
+ InitListMenuTemplate();
+ sFameCheckerData->numUnlockedPersons = FC_PopulateListMenu();
+ sFameCheckerData->listMenuTaskId = ListMenuInit(&gFameChecker_ListMenuTemplate, 0, 0);
+ FC_PutWindowTilemapAndCopyWindowToVramMode3_2(FCWINDOWID_LIST);
+}
+
+static void InitListMenuTemplate(void)
+{
+ gFameChecker_ListMenuTemplate.items = sListMenuItems;
+ gFameChecker_ListMenuTemplate.moveCursorFunc = FC_MoveCursorFunc;
+ gFameChecker_ListMenuTemplate.itemPrintFunc = NULL;
+ gFameChecker_ListMenuTemplate.totalItems = 1;
+ gFameChecker_ListMenuTemplate.maxShowed = 1;
+ gFameChecker_ListMenuTemplate.windowId = 0;
+ gFameChecker_ListMenuTemplate.header_X = 0;
+ gFameChecker_ListMenuTemplate.item_X = 8;
+ gFameChecker_ListMenuTemplate.cursor_X = 0;
+ gFameChecker_ListMenuTemplate.upText_Y = 4;
+ gFameChecker_ListMenuTemplate.cursorPal = 2;
+ gFameChecker_ListMenuTemplate.fillValue = 0;
+ gFameChecker_ListMenuTemplate.cursorShadowPal = 3;
+ gFameChecker_ListMenuTemplate.lettersSpacing = 0;
+ gFameChecker_ListMenuTemplate.itemVerticalPadding = 0;
+ gFameChecker_ListMenuTemplate.scrollMultiple = 0;
+ gFameChecker_ListMenuTemplate.fontId = 2;
+ gFameChecker_ListMenuTemplate.cursorKind = 0;
+}
+
+static void FC_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list)
+{
+ u16 listMenuTopIdx;
+ u8 taskId;
+ u16 personIdx;
+ sLastMenuIdx = 0;
+ personIdx = sFameCheckerData->listMenuTopIdx2 + sFameCheckerData->listMenuDrawnSelIdx;
+ FC_DoMoveCursor(itemIndex, onInit);
+ taskId = FindTaskIdByFunc(Task_TopMenuHandleInput);
+ if (taskId != 0xFF)
+ {
+ struct Task *task = &gTasks[taskId];
+ PlaySE(SE_SELECT);
+ task->data[1] = 0;
+ get_coro_args_x18_x1A(sFameCheckerData->listMenuTaskId, &listMenuTopIdx, NULL);
+ sFameCheckerData->listMenuTopIdx = listMenuTopIdx;
+ if (itemIndex != sFameCheckerData->numUnlockedPersons - 1)
+ {
+ DestroyAllFlavorTextIcons();
+ CreateAllFlavorTextIcons(itemIndex);
+ if (sFameCheckerData->inPickMode)
+ {
+ if (!sFameCheckerData->pickModeOverCancel)
+ {
+ DestroyPersonPicSprite(taskId, personIdx);
+ sLastMenuIdx = itemIndex;
+ task->func = Task_SwitchToPickMode;
+ }
+ else
+ {
+ gSprites[task->data[2]].invisible = FALSE;
+ sFameCheckerData->pickModeOverCancel = FALSE;
+ gSprites[task->data[2]].data[0] = 0;
+ GetPickModeText();
+ }
+ }
+ else
+ {
+ FillWindowPixelRect(FCWINDOWID_MSGBOX, 0x11, 0, 0, 0xd0, 0x20);
+ FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX);
+ }
+ }
+ else
+ {
+ PrintCancelDescription();
+ if (sFameCheckerData->inPickMode)
+ {
+ gSprites[task->data[2]].invisible = TRUE;
+ sFameCheckerData->pickModeOverCancel = TRUE;
+ }
+ else
+ {
+ u8 i;
+ for (i = 0; i < 6; i++)
+ {
+ gSprites[sFameCheckerData->spriteIds[i]].invisible = TRUE;
+ }
+ }
+ }
+ }
+}
+
+static void Task_SwitchToPickMode(u8 taskId)
+{
+ struct Task * task = &gTasks[taskId];
+ task->data[2] = CreatePersonPicSprite(sFameCheckerData->unlockedPersons[sLastMenuIdx]);
+ gSprites[task->data[2]].data[0] = 0;
+ GetPickModeText();
+ task->func = Task_TopMenuHandleInput;
+}
+
+static void PrintCancelDescription(void)
+{
+ FillWindowPixelRect(FCWINDOWID_MSGBOX, 0x11, 0, 0, 0xd0, 0x20);
+ AddTextPrinterParametrized(FCWINDOWID_MSGBOX, 2, gFameCheckerText_FameCheckerWillBeClosed, 0, NULL, 2, 1, 3);
+ FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX);
+}
+
+static void FC_DoMoveCursor(s32 itemIndex, bool8 onInit)
+{
+ u16 listY;
+ u16 cursorY;
+ u16 who;
+ get_coro_args_x18_x1A(sFameCheckerData->listMenuTaskId, &listY, &cursorY);
+ who = listY + cursorY;
+ AddTextPrinterParametrized2(FCWINDOWID_LIST, 2, 8, 14 * cursorY + 4, 0, 0, &sTextColor_Green, 0, sListMenuItems[itemIndex].unk_00);
+ if (!onInit)
+ {
+ if (listY < sFameCheckerData->listMenuTopIdx2)
+ sFameCheckerData->listMenuDrawnSelIdx++;
+ else if (listY > sFameCheckerData->listMenuTopIdx2 && who != sFameCheckerData->numUnlockedPersons - 1)
+ sFameCheckerData->listMenuDrawnSelIdx--;
+ AddTextPrinterParametrized2(FCWINDOWID_LIST, 2, 8, 14 * sFameCheckerData->listMenuDrawnSelIdx + 4, 0, 0, &sTextColor_DkGrey, 0, sListMenuItems[sFameCheckerData->listMenuCurIdx].unk_00);
+
+ }
+ sFameCheckerData->listMenuCurIdx = itemIndex;
+ sFameCheckerData->listMenuDrawnSelIdx = cursorY;
+ sFameCheckerData->listMenuTopIdx2 = listY;
+}
+
+static u8 FC_PopulateListMenu(void)
+{
+ u8 nitems = 0;
+ u8 i;
+
+ for (i = 0; i < NUM_FAMECHECKER_PERSONS; i++)
+ {
+ u8 fameCheckerIdx = AdjustGiovanniIndexIfBeatenInGym(i);
+ if (gSaveBlock1Ptr->fameChecker[fameCheckerIdx].pickState != FCPICKSTATE_NO_DRAW)
+ {
+ if (sTrainerIdxs[fameCheckerIdx] < FC_NONTRAINER_START)
+ {
+ sListMenuItems[nitems].unk_00 = gTrainers[sTrainerIdxs[fameCheckerIdx]].trainerName;
+ sListMenuItems[nitems].unk_04 = nitems;
+ }
+ else
+ {
+ sListMenuItems[nitems].unk_00 = sNonTrainerNamePointers[sTrainerIdxs[fameCheckerIdx] - FC_NONTRAINER_START];
+ sListMenuItems[nitems].unk_04 = nitems;
+ }
+ sFameCheckerData->unlockedPersons[nitems] = fameCheckerIdx;
+ nitems++;
+ }
+ }
+ sListMenuItems[nitems].unk_00 = gFameCheckerText_Cancel;
+ sListMenuItems[nitems].unk_04 = nitems;
+ sFameCheckerData->unlockedPersons[nitems] = 0xFF;
+ nitems++;
+ gFameChecker_ListMenuTemplate.totalItems = nitems;
+ if (nitems < 5)
+ gFameChecker_ListMenuTemplate.maxShowed = nitems;
+ else
+ gFameChecker_ListMenuTemplate.maxShowed = 5;
+ return nitems;
+}
+
+static void FC_PutWindowTilemapAndCopyWindowToVramMode3_2(u8 windowId)
+{
+ PutWindowTilemap(windowId);
+ CopyWindowToVram(windowId, 3);
+}
+
+static void FC_CreateScrollIndicatorArrowPair(void)
+{
+ struct ScrollIndicatorArrowPairTemplate template = {
+ 2,
+ 40,
+ 26,
+ 3,
+ 40,
+ 100,
+ 0,
+ 0,
+ SPRITETAG_SCROLL_INDICATORS,
+ 0xFFFF,
+ 1,
+ 0
+ };
+
+ if (sFameCheckerData->numUnlockedPersons > 5)
+ {
+ template.unk_06 = 0;
+ template.unk_08 = sFameCheckerData->numUnlockedPersons - 5;
+ sFameCheckerData->scrollIndicatorPairTaskId = AddScrollIndicatorArrowPair(&template, &sFameCheckerData->listMenuTopIdx);
+ }
+}
+
+static void FreeListMenuSelectorArrowPairResources(void)
+{
+ if (sFameCheckerData->numUnlockedPersons > 5)
+ RemoveScrollIndicatorArrowPair(sFameCheckerData->scrollIndicatorPairTaskId);
+}
+
+static u16 FameCheckerGetCursorY(void)
+{
+ u16 listY, cursorY;
+ get_coro_args_x18_x1A(sFameCheckerData->listMenuTaskId, &listY, &cursorY);
+ return listY + cursorY;
+}
+
+static void HandleFlavorTextModeSwitch(bool8 state)
+{
+ if (sFameCheckerData->viewingFlavorText != state)
+ {
+ u8 taskId = FindTaskIdByFunc(Task_FCOpenOrCloseInfoBox);
+ if (taskId == 0xFF)
+ taskId = CreateTask(Task_FCOpenOrCloseInfoBox, 8);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = 4;
+ if (state == TRUE)
+ {
+ gTasks[taskId].data[2] = 1;
+ sFameCheckerData->viewingFlavorText = TRUE;
+ }
+ else
+ {
+ gTasks[taskId].data[2] = 4;
+ sFameCheckerData->viewingFlavorText = FALSE;
+ }
+ }
+}
+
+static void Task_FCOpenOrCloseInfoBox(u8 taskId)
+{
+ struct Task * task = &gTasks[taskId];
+ switch (task->data[0])
+ {
+ case 0:
+ if (--task->data[1] == 0)
+ {
+ UpdateInfoBoxTilemap(1, 0);
+ task->data[1] = 4;
+ task->data[0]++;
+ }
+ break;
+ case 1:
+ if (--task->data[1] == 0)
+ {
+ UpdateInfoBoxTilemap(1, task->data[2]);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+static void UpdateInfoBoxTilemap(u8 bg, s16 state)
+{
+ if (state == 0 || state == 3)
+ {
+ FillBgTilemapBufferRect(bg, 0x8C, 14, 10, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0xA1, 15, 10, 10, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x8D, 25, 10, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x8E, 26, 10, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x8F, 14, 11, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x00, 15, 11, 11, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x90, 26, 11, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x91, 14, 12, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0xA3, 15, 12, 10, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x92, 25, 12, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x93, 26, 12, 1, 1, 1);
+ }
+ else if (state == 1)
+ {
+ FillBgTilemapBufferRect(bg, 0x9B, 14, 10, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x9C, 15, 10, 11, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x96, 26, 10, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x9D, 14, 11, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x00, 15, 11, 11, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x90, 26, 11, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x9E, 14, 12, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x9F, 15, 12, 11, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x99, 26, 12, 1, 1, 1);
+ }
+ else if (state == 2)
+ {
+ FillBgTilemapBufferRect(bg, 0x94, 14, 10, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x95, 15, 10, 11, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x96, 26, 10, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x8F, 14, 11, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x9A, 15, 11, 11, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x90, 26, 11, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x97, 14, 12, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x98, 15, 12, 11, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x99, 26, 12, 1, 1, 1);
+ }
+ else if (state == 4)
+ {
+ FillBgTilemapBufferRect(bg, 0x83, 14, 10, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0xA0, 15, 10, 10, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x84, 25, 10, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x85, 26, 10, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x86, 14, 11, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0xA2, 15, 11, 10, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x87, 25, 11, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x88, 26, 11, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x83, 14, 12, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0xA0, 15, 12, 10, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x84, 25, 12, 1, 1, 1);
+ FillBgTilemapBufferRect(bg, 0x85, 26, 12, 1, 1, 1);
+ }
+ else if (state == 5)
+ {
+ FillBgTilemapBufferRect(bg, 0x00, 14, 10, 13, 3, 1);
+ }
+ CopyBgTilemapBufferToVram(bg);
+}
+
+static void PlaceListMenuCursor(bool8 isActive)
+{
+ u16 cursorY = ListMenuGetYCoordForPrintingArrowCursor(sFameCheckerData->listMenuTaskId);
+ if (isActive == TRUE)
+ AddTextPrinterParametrized2(FCWINDOWID_LIST, 2, 0, cursorY, 0, 0, &sTextColor_DkGrey, 0, gFameCheckerText_ListMenuCursor);
+ else
+ AddTextPrinterParametrized2(FCWINDOWID_LIST, 2, 0, cursorY, 0, 0, &sTextColor_White, 0, gFameCheckerText_ListMenuCursor);
+}
diff --git a/src/load_save.c b/src/load_save.c
index eba01642c..da55869aa 100644
--- a/src/load_save.c
+++ b/src/load_save.c
@@ -40,10 +40,10 @@ EWRAM_DATA struct LoadedSaveData gLoadedSaveData = {0};
EWRAM_DATA u32 gLastEncryptionKey = 0;
// IWRAM common
-IWRAM_DATA bool32 gFlashMemoryPresent;
-IWRAM_DATA struct SaveBlock1 *gSaveBlock1Ptr;
-IWRAM_DATA struct SaveBlock2 *gSaveBlock2Ptr;
-IWRAM_DATA struct PokemonStorage *gPokemonStoragePtr;
+bool32 gFlashMemoryPresent;
+struct SaveBlock1 *gSaveBlock1Ptr;
+struct SaveBlock2 *gSaveBlock2Ptr;
+struct PokemonStorage *gPokemonStoragePtr;
void CheckForFlashMemory(void)
{
diff --git a/src/main.c b/src/main.c
index a625386b2..068cc8578 100644
--- a/src/main.c
+++ b/src/main.c
@@ -98,7 +98,7 @@ static IntrFunc * const sTimerIntrFunc = gIntrTable + 0x7;
extern u16 gTrainerId;
extern bool8 gUnknown_3005ECC;
-extern bool8 gUnknown_3003F3C;
+extern bool8 gWirelessCommType;
extern bool8 gUnknown_3005E88;
EWRAM_DATA void (**gFlashTimerIntrFunc)(void) = NULL;
@@ -348,7 +348,7 @@ extern void ProcessDma3Requests(void);
static void VBlankIntr(void)
{
- if (gUnknown_3003F3C)
+ if (gWirelessCommType)
RFUVSync();
else if (!gLinkVSyncDisabled)
LinkVSync();
diff --git a/src/menews_jisan.c b/src/menews_jisan.c
index 450009318..b4fe080bf 100644
--- a/src/menews_jisan.c
+++ b/src/menews_jisan.c
@@ -94,7 +94,7 @@ void sub_8146C88(void)
void sub_8146CA4(void)
{
- u16 *r4 = sub_806E454(VAR_0x4028);
+ u16 *r4 = GetVarPointer(VAR_0x4028);
struct MysteryEventStruct *r2 = sub_8143D94();
struct MysteryEventStruct r0 = *r2;
@@ -107,7 +107,7 @@ void sub_8146CA4(void)
u16 sub_8146CE8(void)
{
- u16 *r6 = &gUnknown_20370D0;
+ u16 *r6 = &gSpecialVar_Result;
struct MysteryEventStruct *r4 = sub_8143D94();
u16 r5;
diff --git a/src/mevent.c b/src/mevent.c
new file mode 100644
index 000000000..a62286f21
--- /dev/null
+++ b/src/mevent.c
@@ -0,0 +1,1016 @@
+#include "global.h"
+#include "constants/songs.h"
+#include "constants/species.h"
+#include "malloc.h"
+#include "sound.h"
+#include "easy_chat.h"
+#include "main.h"
+#include "task.h"
+#include "decompress.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "unk_815c27c.h"
+#include "util.h"
+#include "script.h"
+#include "event_data.h"
+#include "battle_tower.h"
+#include "new_game.h"
+#include "string_util.h"
+#include "menews_jisan.h"
+#include "cereader_tool.h"
+#include "mystery_gift_menu.h"
+#include "help_system.h"
+#include "mevent.h"
+
+struct MEventTaskData1
+{
+ u16 t00;
+ u16 t02;
+ u16 t04;
+ u16 t06;
+ u8 t08;
+ u8 t09;
+ u8 t0A;
+ u8 t0B;
+ u8 t0C;
+ u8 t0D;
+ u8 t0E;
+ struct MEvent_Str_2 *t10;
+};
+
+void sub_8143910(u8 taskId);
+bool32 sub_8143E64(const struct MEventBuffer_3120_Sub * src);
+void sub_8143E9C(void);
+void sub_8143ED0(void);
+bool32 sub_8144018(const struct MEventBuffer_32E0_Sub * src);
+void sub_814407C(void);
+void sub_81440B4(void);
+void sub_8144824(u32, u32, u32 *, s32);
+void sub_8144790(void);
+
+extern const u8 gUnknown_841DE52[];
+extern const u8 gUnknown_841DE53[];
+extern const u8 gUnknown_841DE54[];
+extern const u8 gUnknown_841DE7C[];
+extern const u8 gUnknown_841DE7D[];
+extern const u8 gUnknown_841DE95[];
+extern const u8 gUnknown_841DE96[];
+extern const u8 gUnknown_841DE97[];
+extern const u8 gUnknown_841DE98[];
+extern const u8 gUnknown_841DE99[];
+extern const u8 gUnknown_841DE9A[];
+extern const u8 gUnknown_841DE9B[];
+extern const u8 gUnknown_841DE9C[];
+extern const u8 gUnknownSerialData_Start[];
+extern const u8 gUnknownSerialData_End[];
+
+const u16 gUnknown_8466F00[] = {
+ 0x02a7,
+ 0x02a8,
+ 0x02a9,
+ 0x02aa,
+ 0x02ab,
+ 0x02ac,
+ 0x02ad,
+ 0x02ae,
+ 0x02af,
+ 0x02b0,
+ 0x02b1,
+ 0x02b2,
+ 0x02b3,
+ 0x02b4,
+ 0x02b5,
+ 0x02b6,
+ 0x02b7,
+ 0x02b8,
+ 0x02b9,
+ 0x02ba
+};
+
+struct MEvent_Str_1 gUnknown_3005ED0;
+
+static EWRAM_DATA bool32 gUnknown_203F3BC = FALSE;
+
+void sub_81435DC(struct MEvent_Str_1 *a0, size_t a1, const void * a2)
+{
+ vu16 imeBak = REG_IME;
+ REG_IME = 0;
+ gIntrTable[1] = sub_815C6D4;
+ gIntrTable[2] = sub_815C6C4;
+ sub_815C8C8();
+ sub_815C960();
+ REG_IE |= INTR_FLAG_VCOUNT;
+ REG_IME = imeBak;
+ a0->unk_000 = 0;
+ a0->unk_004 = a1;
+ a0->unk_008 = a2;
+}
+
+void sub_8143644(struct MEvent_Str_1 *unused)
+{
+ vu16 imeBak = REG_IME;
+ REG_IME = 0;
+ sub_815C960();
+ sub_815C91C();
+ RestoreSerialTimer3IntrHandlers();
+ REG_IME = imeBak;
+}
+
+u8 sub_8143674(struct MEvent_Str_1 *a0)
+{
+ u8 resp = 0;
+ a0->unk_000 = sub_815C498(1, a0->unk_004, a0->unk_008, 0);
+ if ((a0->unk_000 & 0x13) == 0x10)
+ resp = 1;
+ if (a0->unk_000 & 8)
+ resp = 2;
+ if (a0->unk_000 & 4)
+ resp = 3;
+ gUnknown_3003F84 = 0;
+ return resp;
+}
+
+void sub_81436BC(void)
+{
+ memset(gDecompressionBuffer, 0, 0x2000);
+ gLinkType = 0x5502;
+ sub_8009804();
+ SetSuppressLinkErrorMessage(TRUE);
+}
+
+bool32 sub_81436EC(void)
+{
+ vu16 imeBak = REG_IME;
+ u16 data[4];
+ REG_IME = 0;
+ *(u64 *)data = gUnknown_3003FB4;
+ REG_IME = imeBak;
+ if ( data[0] == 0xB9A0
+ && data[1] == 0xCCD0
+ && data[2] == 0xFFFF
+ && data[3] == 0xFFFF
+ )
+ return TRUE;
+ return FALSE;
+}
+
+bool32 sub_814374C(void)
+{
+ if (sub_800AA48() && GetLinkPlayerCount_2() == 2)
+ return TRUE;
+ return FALSE;
+}
+
+u32 sub_8143770(u8 * r4, u16 * r5)
+{
+ if ((*r4 == 3 || *r4 == 4 || *r4 == 5) && HasLinkErrorOccurred())
+ {
+ *r4 = 0;
+ return 3;
+ }
+ switch (*r4)
+ {
+ case 0:
+ if (sub_800AA48() && GetLinkPlayerCount_2() > 1)
+ {
+ *r4 = 1;
+ ;
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ *r4 = 0;
+ return 1;
+ }
+ break;
+ case 1:
+ if (++(*r5) > 5)
+ {
+ *r5 = 0;
+ *r4 = 2;
+ }
+ break;
+ case 2:
+ if (GetLinkPlayerCount_2() == 2)
+ {
+ PlaySE(SE_TOY_G);
+ sub_800A5BC();
+ *r5 = 0;
+ *r4 = 3;
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ *r4 = 0;
+ return 1;
+ }
+ break;
+ case 3:
+ if (++(*r5) > 30)
+ {
+ *r4 = 0;
+ return 5;
+ }
+ else if (IsLinkConnectionEstablished())
+ {
+ if (gReceivedRemoteLinkPlayers)
+ {
+ if (IsLinkPlayerDataExchangeComplete())
+ {
+ *r4 = 0;
+ return 2;
+ }
+ else
+ *r4 = 4;
+ }
+ else
+ *r4 = 3;
+ }
+ break;
+ case 4:
+ sub_800AA80(0);
+ *r4 = 5;
+ break;
+ case 5:
+ if (!gReceivedRemoteLinkPlayers)
+ {
+ *r4 = 0;
+ return 4;
+ }
+ break;
+ }
+ return 0;
+}
+
+void sub_81438A0(void)
+{
+ u8 taskId = CreateTask(sub_8143910, 0);
+ struct MEventTaskData1 *data = (struct MEventTaskData1 *)gTasks[taskId].data;
+ data->t08 = 0;
+ data->t09 = 0;
+ data->t0A = 0;
+ data->t0B = 0;
+ data->t0C = 0;
+ data->t0D = 0;
+ data->t00 = 0;
+ data->t02 = 0;
+ data->t04 = 0;
+ data->t06 = 0;
+ data->t0E = 0;
+ data->t10 = AllocZeroed(sizeof(struct MEvent_Str_2));
+}
+
+void sub_81438E8(u16 *a0)
+{
+ *a0 = 0;
+}
+
+bool32 sub_81438F0(u16 * a0, u16 a1)
+{
+ if (++(*a0) > a1)
+ {
+ *a0 = 0;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_8143910(u8 taskId)
+{
+ struct MEventTaskData1 *data = (struct MEventTaskData1 *)gTasks[taskId].data;
+ switch (data->t08)
+ {
+ case 0:
+ if (mevent_0814257C(&data->t09, gUnknown_841DE52))
+ data->t08 = 1;
+ break;
+ case 1:
+ sub_81436BC();
+ sub_81438E8(&data->t00);
+ data->t08 = 2;
+ break;
+ case 2:
+ if (sub_81438F0(&data->t00, 10))
+ data->t08 = 3;
+ break;
+ case 3:
+ if (!sub_814374C())
+ {
+ sub_80098B8();
+ data->t08 = 4;
+ }
+ else
+ data->t08 = 13;
+ break;
+ case 4:
+ if (mevent_0814257C(&data->t09, gUnknown_841DE53))
+ {
+ sub_8142504(gUnknown_841DE54);
+ sub_81438E8(&data->t00);
+ data->t08 = 5;
+ }
+ break;
+ case 5:
+ if (sub_81438F0(&data->t00, 90))
+ {
+ sub_81436BC();
+ data->t08 = 6;
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ sub_81438E8(&data->t00);
+ PlaySE(SE_SELECT);
+ data->t08 = 23;
+ }
+ break;
+ case 6:
+ if (JOY_NEW(B_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ sub_80098B8();
+ sub_81438E8(&data->t00);
+ data->t08 = 23;
+ }
+ else if (GetLinkPlayerCount_2() > 1)
+ {
+ sub_81438E8(&data->t00);
+ sub_80098B8();
+ data->t08 = 7;
+ }
+ else if (sub_81436EC())
+ {
+ PlaySE(SE_SELECT);
+ sub_80098B8();
+ sub_81438E8(&data->t00);
+ data->t08 = 8;
+ }
+ else if (sub_81438F0(&data->t00, 10))
+ {
+ sub_80098B8();
+ sub_81436BC();
+ sub_81438E8(&data->t00);
+ }
+ break;
+ case 7:
+ if (mevent_0814257C(&data->t09, gUnknown_841DE7C))
+ data->t08 = 4;
+ break;
+ case 8:
+ sub_8142504(gUnknown_841DE95);
+ sub_81435DC(&gUnknown_3005ED0, gUnknownSerialData_End - gUnknownSerialData_Start, gUnknownSerialData_Start);
+ data->t08 = 9;
+ break;
+ case 9:
+ data->t0E = sub_8143674(&gUnknown_3005ED0);
+ if (data->t0E != 0)
+ data->t08 = 10;
+ break;
+ case 10:
+ sub_8143644(&gUnknown_3005ED0);
+ if (data->t0E == 3)
+ data->t08 = 20;
+ else if (data->t0E == 1)
+ {
+ sub_81438E8(&data->t00);
+ sub_8142504(gUnknown_841DE9B);
+ data->t08 = 11;
+ }
+ else
+ data->t08 = 0;
+ break;
+ case 11:
+ if (sub_81438F0(&data->t00, 840))
+ data->t08 = 12;
+ break;
+ case 12:
+ sub_81436BC();
+ sub_8142504(gUnknown_841DE98);
+ data->t08 = 13;
+ break;
+ case 13:
+ switch (sub_8143770(&data->t09, &data->t00))
+ {
+ case 0:
+ break;
+ case 2:
+ sub_8142504(gUnknown_841DE95);
+ data->t08 = 14;
+ break;
+ case 1:
+ PlaySE(SE_SELECT);
+ sub_80098B8();
+ data->t08 = 23;
+ break;
+ case 5:
+ sub_80098B8();
+ data->t08 = 21;
+ break;
+ case 3:
+ case 4:
+ sub_80098B8();
+ data->t08 = 20;
+ break;
+ }
+ break;
+ case 14:
+ if (HasLinkErrorOccurred())
+ {
+ sub_80098B8();
+ data->t08 = 20;
+ }
+ else if (GetBlockReceivedStatus())
+ {
+ ResetBlockReceivedFlags();
+ data->t08 = 15;
+ }
+ break;
+ case 15:
+ data->t0E = sub_815D6B4(gDecompressionBuffer);
+ sub_800AA80(data->t0E);
+ data->t08 = 16;
+ break;
+ case 16:
+ if (!gReceivedRemoteLinkPlayers)
+ {
+ if (data->t0E == 1)
+ data->t08 = 17;
+ else
+ data->t08 = 20;
+ }
+ break;
+ case 17:
+ if (sub_815D794(gDecompressionBuffer))
+ {
+ sub_8142504(gUnknown_841DE99);
+ sub_81438E8(&data->t00);
+ data->t08 = 18;
+ }
+ else
+ data->t08 = 22;
+ break;
+ case 18:
+ if (sub_81438F0(&data->t00, 120))
+ {
+ sub_8142504(gUnknown_841DE9A);
+ PlayFanfare(258);
+ data->t08 = 19;
+ }
+ break;
+ case 19:
+ if (IsFanfareTaskInactive() &&JOY_NEW(A_BUTTON | B_BUTTON))
+ data->t08 = 26;
+ break;
+ case 23:
+ if (mevent_0814257C(&data->t09, gUnknown_841DE7D))
+ data->t08 = 26;
+ break;
+ case 20:
+ if (mevent_0814257C(&data->t09, gUnknown_841DE96))
+ data->t08 = 0;
+ break;
+ case 21:
+ if (mevent_0814257C(&data->t09, gUnknown_841DE97))
+ data->t08 = 0;
+ break;
+ case 22:
+ if (mevent_0814257C(&data->t09, gUnknown_841DE9C))
+ data->t08 = 0;
+ break;
+ case 26:
+ sub_812B484();
+ Free(data->t10);
+ DestroyTask(taskId);
+ SetMainCallback2(sub_81422FC);
+ break;
+ }
+}
+
+void sub_8143D24(void)
+{
+ CpuFill32(0, &gSaveBlock1Ptr->unk_3120, sizeof(gSaveBlock1Ptr->unk_3120));
+ sub_8143ED0();
+ sub_80BDE28();
+}
+
+struct MEventBuffer_3120_Sub * sub_8143D58(void)
+{
+ return &gSaveBlock1Ptr->unk_3120.buffer_000.data;
+}
+
+struct MEventBuffer_32E0_Sub * sav1_get_mevent_buffer_1(void)
+{
+ return &gSaveBlock1Ptr->unk_3120.buffer_1c0.data;
+}
+
+struct MEventBuffer_3430_Sub * sav1_get_mevent_buffer_2(void)
+{
+ return &gSaveBlock1Ptr->unk_3120.buffer_310.data;
+}
+
+struct MysteryEventStruct * sub_8143D94(void)
+{
+ return &gSaveBlock1Ptr->unk_3120.unk_340;
+}
+
+u16 * sub_8143DA8(void)
+{
+ return gSaveBlock1Ptr->unk_3120.unk_338;
+}
+
+void sub_8143DBC(void)
+{
+ sub_8143E9C();
+}
+
+bool32 sub_8143DC8(const struct MEventBuffer_3120_Sub * src)
+{
+ if (!sub_8143E64(src))
+ return FALSE;
+ sub_8143E9C();
+ gSaveBlock1Ptr->unk_3120.buffer_000.data = *src;
+ gSaveBlock1Ptr->unk_3120.buffer_000.crc = CalcCRC16WithTable((void *)&gSaveBlock1Ptr->unk_3120.buffer_000.data, sizeof(struct MEventBuffer_3120_Sub));
+ return TRUE;
+}
+
+bool32 sub_8143E1C(void)
+{
+ if (CalcCRC16WithTable((void *)&gSaveBlock1Ptr->unk_3120.buffer_000.data, sizeof(struct MEventBuffer_3120_Sub)) != gSaveBlock1Ptr->unk_3120.buffer_000.crc)
+ return FALSE;
+ if (!sub_8143E64(&gSaveBlock1Ptr->unk_3120.buffer_000.data))
+ return FALSE;
+ return TRUE;
+}
+
+bool32 sub_8143E64(const struct MEventBuffer_3120_Sub * data)
+{
+ if (data->unk_00 == 0)
+ return FALSE;
+ return TRUE;
+}
+
+bool32 sub_8143E78(void)
+{
+ const struct MEventBuffer_3120_Sub * data = &gSaveBlock1Ptr->unk_3120.buffer_000.data;
+ if (data->unk_02 == 0)
+ return FALSE;
+ return TRUE;
+}
+
+void sub_8143E9C(void)
+{
+ CpuFill32(0, sub_8143D58(), sizeof(gSaveBlock1Ptr->unk_3120.buffer_000.data));
+ gSaveBlock1Ptr->unk_3120.buffer_000.crc = 0;
+}
+
+void sub_8143ED0(void)
+{
+ CpuFill32(0, sub_8143D94(), sizeof(struct MysteryEventStruct));
+ sub_8146C88();
+}
+
+bool32 sub_8143EF4(const u8 * src)
+{
+ const u8 * r5 = (const u8 *)&gSaveBlock1Ptr->unk_3120.buffer_000.data;
+ u32 i;
+ if (!sub_8143E1C())
+ return FALSE;
+ for (i = 0; i < sizeof(struct MEventBuffer_3120_Sub); i++)
+ {
+ if (r5[i] != src[i])
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void sub_8143F38(void)
+{
+ sub_814407C();
+ sub_81440B4();
+ sub_8144790();
+ ClearRamScript();
+ sub_806E2D0();
+ sub_806E370();
+ sub_80E7524(gSaveBlock2Ptr->unk_4A0);
+}
+
+bool32 sub_8143F68(const struct MEventBuffer_32E0_Sub * data)
+{
+ struct MEventBuffer_3430_Sub * r2;
+ struct MEventBuffer_32E0_Sub * r1;
+ if (!sub_8144018(data))
+ return FALSE;
+ sub_8143F38();
+ memcpy(&gSaveBlock1Ptr->unk_3120.buffer_1c0.data, data, sizeof(struct MEventBuffer_32E0_Sub));
+ gSaveBlock1Ptr->unk_3120.buffer_1c0.crc = CalcCRC16WithTable((void *)&gSaveBlock1Ptr->unk_3120.buffer_1c0.data, sizeof(struct MEventBuffer_32E0_Sub));
+ r2 = &gSaveBlock1Ptr->unk_3120.buffer_310.data;
+ r1 = &gSaveBlock1Ptr->unk_3120.buffer_1c0.data;
+ r2->unk_06 = r1->unk_02;
+ return TRUE;
+}
+
+bool32 sub_8143FC8(void)
+{
+ if (gSaveBlock1Ptr->unk_3120.buffer_1c0.crc != CalcCRC16WithTable((void *)&gSaveBlock1Ptr->unk_3120.buffer_1c0.data, sizeof(struct MEventBuffer_32E0_Sub)))
+ return FALSE;
+ if (!sub_8144018(&gSaveBlock1Ptr->unk_3120.buffer_1c0.data))
+ return FALSE;
+ if (!sub_8069DFC())
+ return FALSE;
+ return TRUE;
+}
+
+bool32 sub_8144018(const struct MEventBuffer_32E0_Sub * data)
+{
+ if (data->unk_00 == 0)
+ return FALSE;
+ if (data->unk_08_0 > 2)
+ return FALSE;
+ if (!(data->unk_08_6 == 0 || data->unk_08_6 == 1 || data->unk_08_6 == 2))
+ return FALSE;
+ if (data->unk_08_2 > 7)
+ return FALSE;
+ if (data->unk_09 > 7)
+ return FALSE;
+ return TRUE;
+}
+
+bool32 sub_8144054(void)
+{
+ const struct MEventBuffer_32E0_Sub * data = &gSaveBlock1Ptr->unk_3120.buffer_1c0.data;
+ if (data->unk_08_6 == 0)
+ return FALSE;
+ return TRUE;
+}
+
+void sub_814407C(void)
+{
+ CpuFill32(0, &gSaveBlock1Ptr->unk_3120.buffer_1c0.data, sizeof(struct MEventBuffer_32E0_Sub));
+ gSaveBlock1Ptr->unk_3120.buffer_1c0.crc = 0;
+}
+
+void sub_81440B4(void)
+{
+ CpuFill32(0, sav1_get_mevent_buffer_2(), 18 * sizeof(u16));
+ gSaveBlock1Ptr->unk_3120.buffer_310.crc = 0;
+}
+
+u16 sub_81440E8(void)
+{
+ if (sub_8143FC8())
+ return gSaveBlock1Ptr->unk_3120.buffer_1c0.data.unk_00;
+ return 0;
+}
+
+void sub_814410C(struct MEventBuffer_32E0_Sub * buffer)
+{
+ if (buffer->unk_08_6 == 1)
+ buffer->unk_08_6 = 0;
+}
+
+bool32 sub_8144124(u16 a0)
+{
+ if (a0 >= 1000 && a0 < 1020)
+ return TRUE;
+ return FALSE;
+}
+
+bool32 sub_8144144(void)
+{
+ u16 value = sub_81440E8();
+ if (!sub_8144124(value))
+ return FALSE;
+ if (FlagGet(gUnknown_8466F00[value - 1000]) == TRUE)
+ return FALSE;
+ return TRUE;
+}
+
+s32 sub_8144184(const struct MEventBuffer_3430_Sub * data, s32 size)
+{
+ s32 r3 = 0;
+ s32 i;
+ for (i = 0; i < size; i++)
+ {
+ if (data->unk_08[1][i] && data->unk_08[0][i])
+ r3++;
+ }
+ return r3;
+}
+
+bool32 sub_81441AC(const struct MEventBuffer_3430_Sub * data1, const u16 * data2, s32 size)
+{
+ s32 i;
+ for (i = 0; i < size; i++)
+ {
+ if (data1->unk_08[1][i] == data2[1])
+ return TRUE;
+ if (data1->unk_08[0][i] == data2[0])
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool32 sub_81441F0(const u16 * data)
+{
+ if (data[1] == 0)
+ return FALSE;
+ if (data[0] == 0)
+ return FALSE;
+ if (data[0] >= NUM_SPECIES)
+ return FALSE;
+ return TRUE;
+}
+
+s32 sub_8144218(void)
+{
+ struct MEventBuffer_32E0_Sub * data;
+ if (!sub_8143FC8())
+ return 0;
+ data = &gSaveBlock1Ptr->unk_3120.buffer_1c0.data;
+ if (data->unk_08_0 != 1)
+ return 0;
+ return sub_8144184(&gSaveBlock1Ptr->unk_3120.buffer_310.data, data->unk_09);
+}
+
+bool32 sub_8144254(const u16 * data)
+{
+ struct MEventBuffer_32E0_Sub * buffer = &gSaveBlock1Ptr->unk_3120.buffer_1c0.data;
+ s32 size = buffer->unk_09;
+ s32 i;
+ if (!sub_81441F0(data))
+ return FALSE;
+ if (sub_81441AC(&gSaveBlock1Ptr->unk_3120.buffer_310.data, data, size))
+ return FALSE;
+ for (i = 0; i < size; i++)
+ {
+ if (gSaveBlock1Ptr->unk_3120.buffer_310.data.unk_08[1][i] == 0 && gSaveBlock1Ptr->unk_3120.buffer_310.data.unk_08[0][i] == 0)
+ {
+ gSaveBlock1Ptr->unk_3120.buffer_310.data.unk_08[1][i] = data[1];
+ gSaveBlock1Ptr->unk_3120.buffer_310.data.unk_08[0][i] = data[0];
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+void sub_81442CC(struct MEventStruct_Unk1442CC * data)
+{
+ s32 i;
+ CpuFill32(0, data, sizeof(struct MEventStruct_Unk1442CC));
+ data->unk_00 = 0x101;
+ data->unk_04 = 1;
+ data->unk_08 = 1;
+ data->unk_0C = 1;
+ data->unk_10 = 1;
+ if (sub_8143FC8())
+ {
+ data->unk_14 = sav1_get_mevent_buffer_1()->unk_00;
+ data->unk_20 = *sav1_get_mevent_buffer_2();
+ data->unk_44 = sav1_get_mevent_buffer_1()->unk_09;
+ }
+ else
+ data->unk_14 = 0;
+ for (i = 0; i < 4; i++)
+ data->unk_16[i] = gSaveBlock1Ptr->unk_3120.unk_338[i];
+ CopyUnalignedWord(data->unk_4C, gSaveBlock2Ptr->playerTrainerId);
+ StringCopy(data->unk_45, gSaveBlock2Ptr->playerName);
+ for (i = 0; i < 6; i++)
+ data->unk_50[i] = gSaveBlock1Ptr->unk2CA0[i];
+ memcpy(data->unk_5C, RomHeaderGameCode, 4);
+ data->unk_60 = RomHeaderSoftwareVersion;
+}
+
+bool32 sub_81443D4(const struct MEventStruct_Unk1442CC * data)
+{
+ if (data->unk_00 != 0x101)
+ return FALSE;
+ if (!(data->unk_04 & 1))
+ return FALSE;
+ if (!(data->unk_08 & 1))
+ return FALSE;
+ if (!(data->unk_0C & 1))
+ return FALSE;
+ if (!(data->unk_10 & 0x0F))
+ return FALSE;
+ return TRUE;
+}
+
+u32 sub_8144418(const u16 * a0, const struct MEventStruct_Unk1442CC * a1, void * unused)
+{
+ if (a1->unk_14 == 0)
+ return 0;
+ if (*a0 == a1->unk_14)
+ return 1;
+ return 2;
+}
+
+u32 sub_8144434(const u16 * a0, const struct MEventStruct_Unk1442CC * a1, void * unused)
+{
+ s32 r4 = a1->unk_44 - sub_8144184(&a1->unk_20, a1->unk_44);
+ if (r4 == 0)
+ return 1;
+ if (sub_81441AC(&a1->unk_20, a0, a1->unk_44))
+ return 3;
+ if (r4 == 1)
+ return 4;
+ return 2;
+}
+
+bool32 sub_8144474(const struct MEventStruct_Unk1442CC * a0, const u16 * a1)
+{
+ s32 i;
+ for (i = 0; i < 4; i++)
+ {
+ if (a0->unk_16[i] != a1[i])
+ return FALSE;
+ }
+ return TRUE;
+}
+
+s32 sub_814449C(const struct MEventStruct_Unk1442CC * a0)
+{
+ return sub_8144184(&a0->unk_20, a0->unk_44);
+}
+
+u16 sub_81444B0(const struct MEventStruct_Unk1442CC * a0, u32 command)
+{
+ switch (command)
+ {
+ case 0:
+ return a0->unk_20.unk_00;
+ case 1:
+ return a0->unk_20.unk_02;
+ case 2:
+ return a0->unk_20.unk_04;
+ case 3:
+ return sub_814449C(a0);
+ case 4:
+ return a0->unk_44;
+ default:
+ AGB_ASSERT_EX(0, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent.c", 825);
+ return 0;
+ }
+}
+
+void sub_814451C(u32 command)
+{
+ struct MEventBuffer_32E0_Sub * data = &gSaveBlock1Ptr->unk_3120.buffer_1c0.data;
+ if (data->unk_08_0 == 2)
+ {
+ u16 * dest = NULL;
+ switch (command)
+ {
+ case 0:
+ dest = &gSaveBlock1Ptr->unk_3120.buffer_310.data.unk_00;
+ break;
+ case 1:
+ dest = &gSaveBlock1Ptr->unk_3120.buffer_310.data.unk_02;
+ break;
+ case 2:
+ dest = &gSaveBlock1Ptr->unk_3120.buffer_310.data.unk_04;
+ break;
+ case 3:
+ break;
+ case 4:
+ break;
+ }
+ if (dest == NULL)
+ {
+ AGB_ASSERT_EX(0, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent.c", 868);
+ }
+ else if (++(*dest) > 999)
+ {
+ *dest = 999;
+ }
+ }
+}
+
+u16 sub_81445C0(u32 command)
+{
+ switch (command)
+ {
+ case 0:
+ {
+ struct MEventBuffer_32E0_Sub * data = &gSaveBlock1Ptr->unk_3120.buffer_1c0.data;
+ if (data->unk_08_0 == 2)
+ {
+ struct MEventBuffer_3430_Sub * buffer = &gSaveBlock1Ptr->unk_3120.buffer_310.data;
+ return buffer->unk_00;
+ }
+ break;
+ }
+ case 1:
+ {
+ struct MEventBuffer_32E0_Sub * data = &gSaveBlock1Ptr->unk_3120.buffer_1c0.data;
+ if (data->unk_08_0 == 2)
+ {
+ struct MEventBuffer_3430_Sub * buffer = &gSaveBlock1Ptr->unk_3120.buffer_310.data;
+ return buffer->unk_02;
+ }
+ break;
+ }
+ case 2:
+ {
+ struct MEventBuffer_32E0_Sub * data = &gSaveBlock1Ptr->unk_3120.buffer_1c0.data;
+ if (data->unk_08_0 == 2)
+ {
+ struct MEventBuffer_3430_Sub * buffer = &gSaveBlock1Ptr->unk_3120.buffer_310.data;
+ return buffer->unk_04;
+ }
+ break;
+ }
+ case 3:
+ {
+ struct MEventBuffer_32E0_Sub * data = &gSaveBlock1Ptr->unk_3120.buffer_1c0.data;
+ if (data->unk_08_0 == 1)
+ return sub_8144218();
+ break;
+ }
+ case 4:
+ {
+ struct MEventBuffer_32E0_Sub * data = &gSaveBlock1Ptr->unk_3120.buffer_1c0.data;
+ if (data->unk_08_0 == 1)
+ return data->unk_09;
+ break;
+ }
+ }
+ AGB_ASSERT_EX(0, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent.c", 913);
+ return 0;
+}
+
+void sub_81446C4(void)
+{
+ gUnknown_203F3BC = FALSE;
+}
+
+bool32 sub_81446D0(u16 a0)
+{
+ gUnknown_203F3BC = FALSE;
+ if (a0 == 0)
+ return FALSE;
+ if (!sub_8143FC8())
+ return FALSE;
+ if (gSaveBlock1Ptr->unk_3120.buffer_1c0.data.unk_00 != a0)
+ return FALSE;
+ gUnknown_203F3BC = TRUE;
+ return TRUE;
+}
+
+void sub_8144714(u32 a0, u32 a1)
+{
+ if (gUnknown_203F3BC)
+ {
+ switch (a0)
+ {
+ case 2:
+ sub_8144824(2, a1, gSaveBlock1Ptr->unk_3120.unk_344[1], 5);
+ break;
+ case 0:
+ sub_8144824(0, a1, gSaveBlock1Ptr->unk_3120.unk_344[0], 5);
+ break;
+ case 1:
+ sub_8144824(1, a1, gSaveBlock1Ptr->unk_3120.unk_344[0], 5);
+ break;
+ default:
+ AGB_ASSERT_EX(0, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent.c", 988);
+ }
+ }
+}
+
+void sub_8144790(void)
+{
+ CpuFill32(0, gSaveBlock1Ptr->unk_3120.unk_344, sizeof(gSaveBlock1Ptr->unk_3120.unk_344));
+}
+
+bool32 sub_81447BC(u32 a0, u32 * a1, s32 size)
+{
+ s32 i;
+ s32 j;
+
+ for (i = 0; i < size; i++)
+ {
+ if (a1[i] == a0)
+ break;
+ }
+ if (i == size)
+ {
+ for (j = size - 1; j > 0; j--)
+ {
+ a1[j] = a1[j - 1];
+ }
+ a1[0] = a0;
+ return TRUE;
+ }
+ else
+ {
+ for (j = i; j > 0; j--)
+ {
+ a1[j] = a1[j - 1];
+ }
+ a1[0] = a0;
+ return FALSE;
+ }
+}
+
+void sub_8144824(u32 a0, u32 a1, u32 * a2, s32 a3)
+{
+ if (sub_81447BC(a1, a2, a3))
+ sub_814451C(a0);
+}
diff --git a/src/mevent_8145654.c b/src/mevent_8145654.c
new file mode 100644
index 000000000..c39d76f25
--- /dev/null
+++ b/src/mevent_8145654.c
@@ -0,0 +1,793 @@
+#include "global.h"
+#include "constants/species.h"
+#include "bg.h"
+#include "gpu_regs.h"
+#include "palette.h"
+#include "decompress.h"
+#include "malloc.h"
+#include "menu.h"
+#include "pokemon_icon.h"
+#include "mystery_gift_menu.h"
+#include "menu_indicators.h"
+#include "string_util.h"
+#include "link_rfu.h"
+#include "mevent.h"
+
+struct UnkStruct_8467FB8
+{
+ u8 textPal1:4;
+ u8 textPal2:4;
+ u8 textPal3:4;
+ u8 textPal4:4;
+ const u8 * tiles;
+ const u8 * map;
+ const u16 * pal;
+};
+
+struct UnkStruct_203F3C8_02DC
+{
+ u8 unk_00;
+ u8 unk_01[41];
+ u8 unk_42[4];
+};
+
+struct UnkStruct_203F3C8
+{
+ /*0000*/ struct MEventBuffer_32E0_Sub unk_0000;
+ /*014c*/ struct MEventBuffer_3430_Sub unk_014C;
+ /*0170*/ const struct UnkStruct_8467FB8 * unk_0170;
+ /*0174*/ u8 unk_0174;
+ /*0175*/ u8 unk_0175;
+ /*0176*/ u16 unk_0176[3];
+ /*017C*/ u8 unk_017C;
+ /*017D*/ u8 unk_017D[7][2];
+ /*018B*/ u8 unk_018B[41];
+ /*01B4*/ u8 unk_01B4[41];
+ /*01DD*/ u8 unk_01DD[7];
+ /*01E4*/ u8 unk_01E4[4][41];
+ /*0288*/ u8 unk_0288[41];
+ /*02B1*/ u8 unk_02B1[41];
+ /*02DC*/ struct UnkStruct_203F3C8_02DC unk_02DC[8];
+ /*045C*/ u8 buffer_045C[0x1000];
+};
+
+EWRAM_DATA struct UnkStruct_203F3C8 * gUnknown_203F3C8 = NULL;
+
+void sub_8145A98(void);
+void sub_8145D18(u8 whichWindow);
+void sub_8146060(void);
+void sub_81461D8(void);
+
+extern const struct OamData gUnknown_83AC9F8;
+
+const struct TextColor gUnknown_8467068[] = {
+ {0, 2, 3},
+ {0, 1, 2}
+};
+const u8 ALIGNED(4) gUnknown_8467070[3] = {7, 4, 7};
+const struct WindowTemplate gUnknown_8467074[] = {
+ {0x01, 0x01, 0x01, 0x19, 0x04, 0x0f, 0x029c},
+ {0x01, 0x01, 0x06, 0x1c, 0x08, 0x0f, 0x01bc},
+ {0x01, 0x01, 0x0e, 0x1c, 0x05, 0x0f, 0x0130}
+};
+
+const u16 gUnknown_846708C[] = INCBIN_U16("data/graphics/mevent/pal_46708C.gbapal");
+const u16 gUnknown_84670AC[] = INCBIN_U16("data/graphics/mevent/pal_4670AC.gbapal");
+const u16 gUnknown_84670CC[] = INCBIN_U16("data/graphics/mevent/pal_4670CC.gbapal");
+const u16 gUnknown_84670EC[] = INCBIN_U16("data/graphics/mevent/pal_4670EC.gbapal");
+const u16 gUnknown_846710C[] = INCBIN_U16("data/graphics/mevent/pal_46710C.gbapal");
+const u16 gUnknown_846712C[] = INCBIN_U16("data/graphics/mevent/pal_46712C.gbapal");
+const u16 gUnknown_846714C[] = INCBIN_U16("data/graphics/mevent/pal_46714C.gbapal");
+const u16 gUnknown_846716C[] = INCBIN_U16("data/graphics/mevent/pal_46716C.gbapal");
+const u8 gUnknown_846718C[] = INCBIN_U8("data/graphics/mevent/gfx_46718C.4bpp.lz");
+const u8 gUnknown_8467288[] = INCBIN_U8("data/graphics/mevent/tilemap_467288.bin.lz");
+const u8 gUnknown_846737C[] = INCBIN_U8("data/graphics/mevent/gfx_46737C.4bpp.lz");
+const u8 gUnknown_8467470[] = INCBIN_U8("data/graphics/mevent/tilemap_467470.bin.lz");
+const u8 gUnknown_8467558[] = INCBIN_U8("data/graphics/mevent/gfx_467558.4bpp.lz");
+const u8 gUnknown_846762C[] = INCBIN_U8("data/graphics/mevent/tilemap_46762C.bin.lz");
+const u8 gUnknown_8467700[] = INCBIN_U8("data/graphics/mevent/gfx_467700.4bpp.lz");
+const u8 gUnknown_8467934[] = INCBIN_U8("data/graphics/mevent/tilemap_467934.bin.lz");
+const u8 gUnknown_8467A7C[] = INCBIN_U8("data/graphics/mevent/gfx_467A7C.4bpp.lz");
+const u8 gUnknown_8467CAC[] = INCBIN_U8("data/graphics/mevent/tilemap_467CAC.bin.lz");
+const u16 gUnknown_8467DF4[] = INCBIN_U16("data/graphics/mevent/pal_467DF4.gbapal");
+const u16 gUnknown_8467E14[] = INCBIN_U16("data/graphics/mevent/pal_467E14.gbapal");
+const u16 gUnknown_8467E34[] = INCBIN_U16("data/graphics/mevent/pal_467E34.gbapal");
+const u16 gUnknown_8467E54[] = INCBIN_U16("data/graphics/mevent/pal_467E54.gbapal");
+const u16 gUnknown_8467E74[] = INCBIN_U16("data/graphics/mevent/pal_467E74.gbapal");
+const u16 gUnknown_8467E94[] = INCBIN_U16("data/graphics/mevent/pal_467E94.gbapal");
+const u16 gUnknown_8467EB4[] = INCBIN_U16("data/graphics/mevent/pal_467EB4.gbapal");
+const u16 gUnknown_8467ED4[] = INCBIN_U16("data/graphics/mevent/pal_467ED4.gbapal");
+const u8 gUnknown_8467EF4[] = INCBIN_U8("data/graphics/mevent/gfx_467EF4.4bpp.lz");
+
+const struct CompressedSpriteSheet gUnknown_8467F58 = {
+ gUnknown_8467EF4, 0x100, 0x8000
+};
+const struct SpritePalette gUnknown_8467F60[] = {
+ {gUnknown_8467DF4, 0x8000},
+ {gUnknown_8467E14, 0x8000},
+ {gUnknown_8467E34, 0x8000},
+ {gUnknown_8467E54, 0x8000},
+ {gUnknown_8467E74, 0x8000},
+ {gUnknown_8467E94, 0x8000},
+ {gUnknown_8467EB4, 0x8000},
+ {gUnknown_8467ED4, 0x8000}
+};
+const struct SpriteTemplate gUnknown_8467FA0 = {
+ 0x8000, 0x8000, &gUnknown_83AC9F8, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+const struct UnkStruct_8467FB8 gUnknown_8467FB8[8] = {
+ {1, 0, 0, 0, gUnknown_846718C, gUnknown_8467288, gUnknown_846708C},
+ {1, 0, 0, 1, gUnknown_846737C, gUnknown_8467470, gUnknown_84670AC},
+ {1, 0, 0, 2, gUnknown_8467558, gUnknown_846762C, gUnknown_84670CC},
+ {1, 0, 0, 3, gUnknown_8467558, gUnknown_846762C, gUnknown_84670EC},
+ {1, 0, 0, 4, gUnknown_8467558, gUnknown_846762C, gUnknown_846710C},
+ {1, 0, 0, 5, gUnknown_8467558, gUnknown_846762C, gUnknown_846712C},
+ {1, 0, 0, 6, gUnknown_8467700, gUnknown_8467934, gUnknown_846714C},
+ {1, 0, 0, 7, gUnknown_8467A7C, gUnknown_8467CAC, gUnknown_846716C}
+};
+
+bool32 sub_8145654(struct MEventBuffer_32E0_Sub * r5, struct MEventBuffer_3430_Sub * r6)
+{
+ if (r5 == NULL || r6 == NULL)
+ return FALSE;
+ gUnknown_203F3C8 = AllocZeroed(sizeof(struct UnkStruct_203F3C8));
+ if (gUnknown_203F3C8 == NULL)
+ return FALSE;
+ gUnknown_203F3C8->unk_0000 = *r5;
+ gUnknown_203F3C8->unk_014C = *r6;
+ if (gUnknown_203F3C8->unk_0000.unk_08_2 >= NELEMS(gUnknown_8467FB8))
+ gUnknown_203F3C8->unk_0000.unk_08_2 = 0;
+ if (gUnknown_203F3C8->unk_0000.unk_08_0 >= NELEMS(gUnknown_8467070))
+ gUnknown_203F3C8->unk_0000.unk_08_0 = 0;
+ if (gUnknown_203F3C8->unk_0000.unk_09 > NELEMS(gUnknown_203F3C8->unk_017D))
+ gUnknown_203F3C8->unk_0000.unk_09 = 0;
+ gUnknown_203F3C8->unk_0170 = &gUnknown_8467FB8[gUnknown_203F3C8->unk_0000.unk_08_2];
+ return TRUE;
+}
+
+void sub_81456F0(void)
+{
+ if (gUnknown_203F3C8 != NULL)
+ {
+ *gUnknown_203F3C8 = (struct UnkStruct_203F3C8){};
+ Free(gUnknown_203F3C8);
+ gUnknown_203F3C8 = NULL;
+ }
+}
+
+s32 sub_814571C(void)
+{
+ if (gUnknown_203F3C8 == NULL)
+ return -1;
+ switch(gUnknown_203F3C8->unk_0174)
+ {
+ case 0:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ break;
+ case 1:
+ if (UpdatePaletteFade())
+ return 0;
+ break;
+ case 2:
+ FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
+ FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
+ FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);
+ CopyBgTilemapBufferToVram(0);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ decompress_and_copy_tile_data_to_vram(2, gUnknown_203F3C8->unk_0170->tiles, 0, 0x008, 0);
+ gUnknown_203F3C8->unk_0176[0] = AddWindow(&gUnknown_8467074[0]);
+ gUnknown_203F3C8->unk_0176[1] = AddWindow(&gUnknown_8467074[1]);
+ gUnknown_203F3C8->unk_0176[2] = AddWindow(&gUnknown_8467074[2]);
+ break;
+ case 3:
+ if (free_temp_tile_data_buffers_if_possible())
+ return 0;
+ gPaletteFade.bufferTransferDisabled = TRUE;
+ LoadPalette(gUnknown_203F3C8->unk_0170->pal, 0x10, 0x20);
+ LZ77UnCompWram(gUnknown_203F3C8->unk_0170->map, gUnknown_203F3C8->buffer_045C);
+ CopyRectToBgTilemapBufferRect(2, gUnknown_203F3C8->buffer_045C, 0, 0, 30, 20, 0, 0, 30, 20, 1, 0x008, 0);
+ CopyBgTilemapBufferToVram(2);
+ break;
+ case 4:
+ sub_8145A98();
+ break;
+ case 5:
+ sub_8145D18(0);
+ sub_8145D18(1);
+ sub_8145D18(2);
+ CopyBgTilemapBufferToVram(1);
+ break;
+ case 6:
+ sub_809707C();
+ break;
+ case 7:
+ ShowBg(1);
+ ShowBg(2);
+ gPaletteFade.bufferTransferDisabled = FALSE;
+ sub_8146060();
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ UpdatePaletteFade();
+ break;
+ default:
+ if (UpdatePaletteFade())
+ return 0;
+ gUnknown_203F3C8->unk_0174 = 0;
+ return 1;
+ }
+ ++gUnknown_203F3C8->unk_0174;
+ return 0;
+}
+
+s32 sub_814593C(bool32 flag)
+{
+ if (gUnknown_203F3C8 == NULL)
+ return -1;
+ switch (gUnknown_203F3C8->unk_0174)
+ {
+ case 0:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ break;
+ case 1:
+ if (UpdatePaletteFade())
+ return 0;
+ break;
+ case 2:
+ FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
+ FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
+ FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);
+ CopyBgTilemapBufferToVram(0);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ break;
+ case 3:
+ HideBg(1);
+ HideBg(2);
+ RemoveWindow(gUnknown_203F3C8->unk_0176[2]);
+ RemoveWindow(gUnknown_203F3C8->unk_0176[1]);
+ RemoveWindow(gUnknown_203F3C8->unk_0176[0]);
+ break;
+ case 4:
+ sub_81461D8();
+ FreeMonIconPalettes();
+ break;
+ case 5:
+ sub_8142344(gUnknown_203F3B8, flag);
+ break;
+ case 6:
+ CopyBgTilemapBufferToVram(0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ break;
+ default:
+ if (UpdatePaletteFade())
+ return 0;
+ gUnknown_203F3C8->unk_0174 = 0;
+ return 1;
+ }
+ ++gUnknown_203F3C8->unk_0174;
+ return 0;
+}
+
+void sub_8145A98(void)
+{
+ u16 i = 0;
+ u16 r6;
+ u16 sp0[3] = {0, 0, 0};
+
+ memcpy(gUnknown_203F3C8->unk_018B, gUnknown_203F3C8->unk_0000.unk_0A, 40);
+ gUnknown_203F3C8->unk_018B[40] = EOS;
+ memcpy(gUnknown_203F3C8->unk_01B4, gUnknown_203F3C8->unk_0000.unk_32, 40);
+ gUnknown_203F3C8->unk_01B4[40] = EOS;
+ if (gUnknown_203F3C8->unk_0000.unk_04 > 999999)
+ gUnknown_203F3C8->unk_0000.unk_04 = 999999;
+ ConvertIntToDecimalStringN(gUnknown_203F3C8->unk_01DD, gUnknown_203F3C8->unk_0000.unk_04, STR_CONV_MODE_LEFT_ALIGN, 6);
+ for (i = 0; i < 4; i++)
+ {
+ memcpy(gUnknown_203F3C8->unk_01E4[i], gUnknown_203F3C8->unk_0000.unk_5A[i], 40);
+ gUnknown_203F3C8->unk_01E4[i][40] = EOS;
+ }
+ memcpy(gUnknown_203F3C8->unk_0288, gUnknown_203F3C8->unk_0000.unk_FA, 40);
+ gUnknown_203F3C8->unk_0288[40] = EOS;
+ switch (gUnknown_203F3C8->unk_0000.unk_08_0)
+ {
+ case 0:
+ memcpy(gUnknown_203F3C8->unk_02B1, gUnknown_203F3C8->unk_0000.unk_122, 40);
+ gUnknown_203F3C8->unk_02B1[40] = EOS;
+ break;
+ case 1:
+ gUnknown_203F3C8->unk_02B1[00] = EOS;
+ break;
+ case 2:
+ gUnknown_203F3C8->unk_02B1[00] = EOS;
+ sp0[0] = gUnknown_203F3C8->unk_014C.unk_00 < 999 ? gUnknown_203F3C8->unk_014C.unk_00 : 999;
+ sp0[1] = gUnknown_203F3C8->unk_014C.unk_02 < 999 ? gUnknown_203F3C8->unk_014C.unk_02 : 999;
+ sp0[2] = gUnknown_203F3C8->unk_014C.unk_04 < 999 ? gUnknown_203F3C8->unk_014C.unk_04 : 999;
+ for (i = 0; i < 8; i++)
+ {
+ memset(gUnknown_203F3C8->unk_02DC[i].unk_42, EOS, 4);
+ memset(gUnknown_203F3C8->unk_02DC[i].unk_01, EOS, 41);
+ }
+ for (i = 0, r6 = 0; i < 40; i++)
+ {
+ if (gUnknown_203F3C8->unk_0000.unk_122[i] != 0xF7)
+ {
+ gUnknown_203F3C8->unk_02DC[gUnknown_203F3C8->unk_0175].unk_01[r6] = gUnknown_203F3C8->unk_0000.unk_122[i];
+ r6++;
+ }
+ else
+ {
+ u8 r3 = gUnknown_203F3C8->unk_0000.unk_122[i + 1];
+ if (r3 > 2)
+ {
+ i += 2;
+ }
+ else
+ {
+ ConvertIntToDecimalStringN(gUnknown_203F3C8->unk_02DC[gUnknown_203F3C8->unk_0175].unk_42, sp0[r3], STR_CONV_MODE_LEADING_ZEROS, 3);
+ gUnknown_203F3C8->unk_02DC[gUnknown_203F3C8->unk_0175].unk_00 = gUnknown_203F3C8->unk_0000.unk_122[i + 2];
+ gUnknown_203F3C8->unk_0175++;
+ if (gUnknown_203F3C8->unk_0175 > 7)
+ break;
+ r6 = 0;
+ i += 2;
+ }
+ }
+ }
+ }
+}
+
+void sub_8145D18(u8 whichWindow)
+{
+ s8 sp0C = 0;
+ s32 windowId = gUnknown_203F3C8->unk_0176[whichWindow];
+ PutWindowTilemap(windowId);
+ FillWindowPixelBuffer(windowId, 0);
+ switch (whichWindow)
+ {
+ case 0:
+ {
+ s32 x;
+ box_print(windowId, 3, 0, 1, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal1], 0, gUnknown_203F3C8->unk_018B);
+ x = 160 - GetStringWidth(3, gUnknown_203F3C8->unk_01B4, GetFontAttribute(3, 2));
+ if (x < 0)
+ x = 0;
+ box_print(windowId, 3, x, 17, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal1], 0, gUnknown_203F3C8->unk_01B4);
+ if (gUnknown_203F3C8->unk_0000.unk_04 != 0)
+ {
+ box_print(windowId, 2, 166, 17, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal1], 0, gUnknown_203F3C8->unk_01DD);
+ }
+ break;
+ }
+ case 1:
+ for (; sp0C < 4; sp0C++)
+ {
+ box_print(windowId, 3, 0, 16 * sp0C + 2, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal2], 0, gUnknown_203F3C8->unk_01E4[sp0C]);
+ }
+ break;
+ case 2:
+ box_print(windowId, 3, 0, gUnknown_8467070[gUnknown_203F3C8->unk_0000.unk_08_0], &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_0288);
+ if (gUnknown_203F3C8->unk_0000.unk_08_0 != 2)
+ {
+ box_print(windowId, 3, 0, 16 + gUnknown_8467070[gUnknown_203F3C8->unk_0000.unk_08_0], &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_02B1);
+ }
+ else
+ {
+ s32 x = 0;
+ s32 y = gUnknown_8467070[gUnknown_203F3C8->unk_0000.unk_08_0] + 16;
+ s32 spacing = GetFontAttribute(3, 2);
+ for (; sp0C < gUnknown_203F3C8->unk_0175; sp0C++)
+ {
+ box_print(windowId, 3, x, y, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_02DC[sp0C].unk_01);
+ if (gUnknown_203F3C8->unk_02DC[sp0C].unk_42[0] != EOS)
+ {
+ x += GetStringWidth(3, gUnknown_203F3C8->unk_02DC[sp0C].unk_01, spacing);
+ box_print(windowId, 2, x, y, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_02DC[sp0C].unk_42);
+ x += GetStringWidth(3, gUnknown_203F3C8->unk_02DC[sp0C].unk_42, spacing) + gUnknown_203F3C8->unk_02DC[sp0C].unk_00;
+ }
+ }
+ }
+ break;
+ }
+ CopyWindowToVram(windowId, 3);
+}
+
+void sub_8146060(void)
+{
+ u8 r7 = 0;
+ gUnknown_203F3C8->unk_017C = 0xFF;
+ if (gUnknown_203F3C8->unk_014C.unk_06 != SPECIES_NONE)
+ {
+ gUnknown_203F3C8->unk_017C = sub_8096ECC(sub_8096FD4(gUnknown_203F3C8->unk_014C.unk_06), SpriteCallbackDummy, 0xDC, 0x14, 0, FALSE);
+ gSprites[gUnknown_203F3C8->unk_017C].oam.priority = 2;
+ }
+ if (gUnknown_203F3C8->unk_0000.unk_09 != 0 && gUnknown_203F3C8->unk_0000.unk_08_0 == 1)
+ {
+ sub_800F034(&gUnknown_8467F58);
+ LoadSpritePalette(&gUnknown_8467F60[gUnknown_203F3C8->unk_0170->textPal4]);
+ for (; r7 < gUnknown_203F3C8->unk_0000.unk_09; r7++)
+ {
+ gUnknown_203F3C8->unk_017D[r7][0] = 0xFF;
+ gUnknown_203F3C8->unk_017D[r7][1] = 0xFF;
+ gUnknown_203F3C8->unk_017D[r7][0] = CreateSprite(&gUnknown_8467FA0, 0xd8 - 32 * r7, 0x90, 8);
+ if (gUnknown_203F3C8->unk_014C.unk_08[0][r7] != 0)
+ {
+ gUnknown_203F3C8->unk_017D[r7][1] = sub_8096ECC(sub_8096FD4(gUnknown_203F3C8->unk_014C.unk_08[0][r7]), SpriteCallbackDummy, 0xd8 - 32 * r7, 0x88, 0, 0);
+ gSprites[gUnknown_203F3C8->unk_017D[r7][1]].oam.priority = 2;
+ }
+ }
+ }
+}
+
+void sub_81461D8(void)
+{
+ u8 r6 = 0;
+ if (gUnknown_203F3C8->unk_017C != 0xFF)
+ sub_8097070(&gSprites[gUnknown_203F3C8->unk_017C]);
+ if (gUnknown_203F3C8->unk_0000.unk_09 != 0 && gUnknown_203F3C8->unk_0000.unk_08_0 == 1)
+ {
+ for (; r6 < gUnknown_203F3C8->unk_0000.unk_09; r6++)
+ {
+ if (gUnknown_203F3C8->unk_017D[r6][0] != 0xFF)
+ {
+ DestroySprite(&gSprites[gUnknown_203F3C8->unk_017D[r6][0]]);
+ // This might be a typo. Uncomment the next line, and comment the one that follows, to get the presumed intended behavior.
+ // if (gUnknown_203F3C8->unk_017D[r6][1] != 0xFF)
+ if (gUnknown_203F3C8->unk_017D[r6][0] != 0xFF)
+ {
+ sub_8097070(&gSprites[gUnknown_203F3C8->unk_017D[r6][1]]);
+ }
+ }
+ }
+ FreeSpriteTilesByTag(0x8000);
+ FreeSpritePaletteByTag(0x8000);
+ }
+}
+
+struct UnkStruct_203F3CC
+{
+ /*0000*/ struct MEventBuffer_3120_Sub unk_0000;
+ /*01bc*/ const struct UnkStruct_8467FB8 * unk_01BC;
+ /*01c0*/ u8 unk_01C0_0:1;
+ u8 unk_01C0_1:7;
+ /*01c1*/ u8 unk_01C1;
+ /*01c2*/ u8 unk_01C2_0:1;
+ u8 unk_01C2_1:7;
+ /*01c3*/ u8 unk_01C3_0:1;
+ u8 unk_01C3_1:7;
+ /*01c4*/ u16 unk_01C4;
+ /*01c6*/ u16 unk_01C6;
+ /*01c8*/ u16 unk_01C8[2];
+ /*01cc*/ u8 filler_01CC[2];
+ /*01ce*/ u8 unk_01CE[41];
+ /*01f7*/ u8 unk_01F7[10][41];
+ /*0394*/ struct ScrollIndicatorArrowPairTemplate unk_0394;
+ /*03a4*/ u8 buffer_03A4[0x1000];
+};
+
+EWRAM_DATA struct UnkStruct_203F3CC * gUnknown_203F3CC = NULL;
+
+void sub_8146980(void);
+void sub_8146A30(void);
+void sub_8146B58(void);
+
+const struct TextColor gUnknown_8468038[] = {
+ {0, 2, 3},
+ {0, 1, 2}
+};
+const struct WindowTemplate gUnknown_8468040[] = {
+ {0, 1, 0, 28, 3, 15, 0x000},
+ {2, 1, 3, 28, 20, 15, 0x000}
+};
+const struct ScrollIndicatorArrowPairTemplate gUnknown_8468050 = {
+ 0x02, 0xe8, 0x18, 0x03, 0xe8, 0x98,
+ 0x0000, 0x0002, 0x1000, 0x1000, 0x0, 0x000
+};
+
+const u16 gUnknown_8468060[] = INCBIN_U16("data/graphics/mevent/pal_468060.gbapal");
+const u16 gUnknown_8468080[] = INCBIN_U16("data/graphics/mevent/pal_468080.gbapal");
+const u16 gUnknown_84680A0[] = INCBIN_U16("data/graphics/mevent/pal_4680A0.gbapal");
+const u8 gUnknown_84680C0[] = INCBIN_U8("data/graphics/mevent/gfx_4680C0.4bpp.lz");
+const u8 gUnknown_8468140[] = INCBIN_U8("data/graphics/mevent/tilemap_468140.bin.lz");
+const u8 gUnknown_846821C[] = INCBIN_U8("data/graphics/mevent/gfx_46821C.4bpp.lz");
+const u8 gUnknown_846824C[] = INCBIN_U8("data/graphics/mevent/tilemap_46824C.bin.lz");
+const u8 gUnknown_846830C[] = INCBIN_U8("data/graphics/mevent/gfx_46830C.4bpp.lz");
+const u8 gUnknown_846837C[] = INCBIN_U8("data/graphics/mevent/tilemap_46837C.bin.lz");
+const u8 gUnknown_8468448[] = INCBIN_U8("data/graphics/mevent/gfx_468448.4bpp.lz");
+const u8 gUnknown_84684D8[] = INCBIN_U8("data/graphics/mevent/tilemap_4684D8.bin.lz");
+const u8 gUnknown_84685B4[] = INCBIN_U8("data/graphics/mevent/gfx_4685B4.4bpp.lz");
+const u8 gUnknown_8468644[] = INCBIN_U8("data/graphics/mevent/tilemap_468644.bin.lz");
+
+const struct UnkStruct_8467FB8 gUnknown_8468720[] = {
+ {1, 0, 0, 0, gUnknown_84680C0, gUnknown_8468140, gUnknown_8468060},
+ {1, 0, 0, 0, gUnknown_846821C, gUnknown_846824C, gUnknown_84670AC},
+ {1, 0, 0, 0, gUnknown_846830C, gUnknown_846837C, gUnknown_84670CC},
+ {1, 0, 0, 0, gUnknown_846830C, gUnknown_846837C, gUnknown_84670EC},
+ {1, 0, 0, 0, gUnknown_846830C, gUnknown_846837C, gUnknown_846710C},
+ {1, 0, 0, 0, gUnknown_846830C, gUnknown_846837C, gUnknown_846712C},
+ {1, 0, 0, 0, gUnknown_8468448, gUnknown_84684D8, gUnknown_8468080},
+ {1, 0, 0, 0, gUnknown_84685B4, gUnknown_8468644, gUnknown_84680A0}
+};
+
+bool32 sub_8146288(const struct MEventBuffer_3120_Sub * a0)
+{
+ if (a0 == NULL)
+ return FALSE;
+ gUnknown_203F3CC = AllocZeroed(sizeof(struct UnkStruct_203F3CC));
+ if (gUnknown_203F3CC == NULL)
+ return FALSE;
+ gUnknown_203F3CC->unk_0000 = *a0;
+ if (gUnknown_203F3CC->unk_0000.unk_03 >= NELEMS(gUnknown_8468720))
+ gUnknown_203F3CC->unk_0000.unk_03 = 0;
+ gUnknown_203F3CC->unk_01BC = &gUnknown_8468720[gUnknown_203F3CC->unk_0000.unk_03];
+ gUnknown_203F3CC->unk_01C1 = 0xFF;
+ return TRUE;
+}
+
+void sub_81462EC(void)
+{
+ if (gUnknown_203F3CC != NULL)
+ {
+ *gUnknown_203F3CC = (struct UnkStruct_203F3CC){};
+ Free(gUnknown_203F3CC);
+ gUnknown_203F3CC = NULL;
+ }
+}
+
+s32 sub_8146318(void)
+{
+ if (gUnknown_203F3CC == NULL)
+ return -1;
+
+ switch (gUnknown_203F3CC->unk_01C0_1)
+ {
+ case 0:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ break;
+ case 1:
+ if (UpdatePaletteFade())
+ return 0;
+ ChangeBgY(0, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgY(3, 0, 0);
+ SetGpuReg(REG_OFFSET_WIN0H, 0xF0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0x1A98);
+ SetGpuReg(REG_OFFSET_WININ, 0x1F);
+ SetGpuReg(REG_OFFSET_WINOUT, 0x1B);
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ break;
+ case 2:
+ FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
+ FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
+ FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);
+ FillBgTilemapBufferRect_Palette0(3, 0x000, 0, 0, 30, 20);
+ CopyBgTilemapBufferToVram(0);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(3);
+ decompress_and_copy_tile_data_to_vram(3, gUnknown_203F3CC->unk_01BC->tiles, 0, 8, 0);
+ gUnknown_203F3CC->unk_01C8[0] = AddWindow(&gUnknown_8468040[0]);
+ gUnknown_203F3CC->unk_01C8[1] = AddWindow(&gUnknown_8468040[1]);
+ break;
+ case 3:
+ if (free_temp_tile_data_buffers_if_possible())
+ return 0;
+ gPaletteFade.bufferTransferDisabled = TRUE;
+ LoadPalette(gUnknown_203F3CC->unk_01BC->pal, 0x10, 0x20);
+ LZ77UnCompWram(gUnknown_203F3CC->unk_01BC->map, gUnknown_203F3CC->buffer_03A4);
+ CopyRectToBgTilemapBufferRect(1, gUnknown_203F3CC->buffer_03A4, 0, 0, 30, 3, 0, 0, 30, 3, 1, 8, 0);
+ CopyRectToBgTilemapBufferRect(3, gUnknown_203F3CC->buffer_03A4, 0, 3, 30, 23, 0, 3, 30, 23, 1, 8, 0);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(3);
+ break;
+ case 4:
+ sub_8146980();
+ break;
+ case 5:
+ sub_8146A30();
+ CopyBgTilemapBufferToVram(0);
+ CopyBgTilemapBufferToVram(2);
+ break;
+ case 6:
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+ gPaletteFade.bufferTransferDisabled = FALSE;
+ gUnknown_203F3CC->unk_01C1 = AddScrollIndicatorArrowPair(&gUnknown_203F3CC->unk_0394, &gUnknown_203F3CC->unk_01C6);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ UpdatePaletteFade();
+ break;
+ default:
+ if (UpdatePaletteFade())
+ return 0;
+ gUnknown_203F3CC->unk_01C0_1 = 0;
+ return 1;
+ }
+
+ ++gUnknown_203F3CC->unk_01C0_1;
+ return 0;
+}
+
+s32 sub_8146604(bool32 flag)
+{
+ if (gUnknown_203F3CC == NULL)
+ return -1;
+ switch (gUnknown_203F3CC->unk_01C0_1)
+ {
+ case 0:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ break;
+ case 1:
+ if (UpdatePaletteFade())
+ return 0;
+ ChangeBgY(2, 0, 0);
+ SetGpuReg(REG_OFFSET_WIN0H, 0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0);
+ SetGpuReg(REG_OFFSET_WININ, 0);
+ SetGpuReg(REG_OFFSET_WINOUT, 0);
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ break;
+ case 2:
+ FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
+ FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
+ FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 24);
+ FillBgTilemapBufferRect_Palette0(3, 0x000, 0, 0, 30, 24);
+ CopyBgTilemapBufferToVram(0);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(3);
+ break;
+ case 3:
+ HideBg(1);
+ HideBg(2);
+ RemoveWindow(gUnknown_203F3CC->unk_01C8[1]);
+ RemoveWindow(gUnknown_203F3CC->unk_01C8[0]);
+ break;
+ case 4:
+ ChangeBgY(2, 0, 0);
+ ChangeBgY(3, 0, 0);
+ if (gUnknown_203F3CC->unk_01C1 != 0xFF)
+ {
+ RemoveScrollIndicatorArrowPair(gUnknown_203F3CC->unk_01C1);
+ gUnknown_203F3CC->unk_01C1 = 0xFF;
+ }
+ break;
+ case 5:
+ sub_8142344(gUnknown_203F3B8, flag);
+ break;
+ case 6:
+ sub_8142420();
+ CopyBgTilemapBufferToVram(0);
+ CopyBgTilemapBufferToVram(3);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ break;
+ default:
+ if (UpdatePaletteFade())
+ return 0;
+ gUnknown_203F3CC->unk_01C0_1 = 0;
+ return 1;
+ }
+ ++gUnknown_203F3CC->unk_01C0_1;
+ return 0;
+}
+
+void sub_81467EC(void)
+{
+ if (!gUnknown_203F3CC->unk_01C0_0 && gUnknown_203F3CC->unk_01C1 != 0xFF)
+ {
+ RemoveScrollIndicatorArrowPair(gUnknown_203F3CC->unk_01C1);
+ gUnknown_203F3CC->unk_01C1 = 0xFF;
+ gUnknown_203F3CC->unk_01C0_0 = TRUE;
+ }
+}
+
+
+void sub_8146834(void)
+{
+ if (gUnknown_203F3CC->unk_01C0_0)
+ {
+ gUnknown_203F3CC->unk_01C1 = AddScrollIndicatorArrowPair(&gUnknown_203F3CC->unk_0394, &gUnknown_203F3CC->unk_01C6);
+ gUnknown_203F3CC->unk_01C0_0 = FALSE;
+ }
+}
+
+u8 sub_8146884(u16 input)
+{
+ if (gUnknown_203F3CC->unk_01C2_0)
+ {
+ sub_8146B58();
+ return 0xFF;
+ }
+ switch (input)
+ {
+ case A_BUTTON:
+ return 0;
+ case B_BUTTON:
+ return 1;
+ case DPAD_UP:
+ if (gUnknown_203F3CC->unk_01C6 == 0)
+ return 0xFF;
+ if (gUnknown_203F3CC->unk_01C0_0)
+ return 0xFF;
+ gUnknown_203F3CC->unk_01C3_0 = FALSE;
+ break;
+ case DPAD_DOWN:
+ if (gUnknown_203F3CC->unk_01C6 == gUnknown_203F3CC->unk_01C4)
+ return 0xFF;
+ if (gUnknown_203F3CC->unk_01C0_0)
+ return 0xFF;
+ gUnknown_203F3CC->unk_01C3_0 = TRUE;
+ break;
+ default:
+ return 0xFF;
+ }
+ gUnknown_203F3CC->unk_01C2_0 = TRUE;
+ gUnknown_203F3CC->unk_01C2_1 = 2;
+ gUnknown_203F3CC->unk_01C3_1 = 0;
+ if (gUnknown_203F3CC->unk_01C3_0 == FALSE)
+ return 2;
+ else
+ return 3;
+}
+
+void sub_8146980(void)
+{
+ u8 i = 0;
+ memcpy(gUnknown_203F3CC->unk_01CE, gUnknown_203F3CC->unk_0000.unk_04, 40);
+ gUnknown_203F3CC->unk_01CE[40] = EOS;
+ for (; i < 10; ++i)
+ {
+ memcpy(gUnknown_203F3CC->unk_01F7[i], gUnknown_203F3CC->unk_0000.unk_2C[i], 40);
+ gUnknown_203F3CC->unk_01F7[i][40] = EOS;
+ if (i > 7 && gUnknown_203F3CC->unk_01F7[i][0] != EOS)
+ ++gUnknown_203F3CC->unk_01C4;
+ }
+ gUnknown_203F3CC->unk_0394 = gUnknown_8468050;
+ gUnknown_203F3CC->unk_0394.unk_08 = gUnknown_203F3CC->unk_01C4;
+}
+
+void sub_8146A30(void)
+{
+ u8 i = 0;
+ s32 x;
+ PutWindowTilemap(gUnknown_203F3CC->unk_01C8[0]);
+ PutWindowTilemap(gUnknown_203F3CC->unk_01C8[1]);
+ FillWindowPixelBuffer(gUnknown_203F3CC->unk_01C8[0], 0);
+ FillWindowPixelBuffer(gUnknown_203F3CC->unk_01C8[1], 0);
+ x = (0xe0 - GetStringWidth(3, gUnknown_203F3CC->unk_01CE, GetFontAttribute(3, 2))) / 2;
+ if (x < 0)
+ x = 0;
+ box_print(gUnknown_203F3CC->unk_01C8[0], 3, x, 6, &gUnknown_8468038[gUnknown_203F3CC->unk_01BC->textPal1], 0, gUnknown_203F3CC->unk_01CE);
+ for (; i < 10; ++i)
+ {
+ box_print(gUnknown_203F3CC->unk_01C8[1], 3, 0, 16 * i + 2, &gUnknown_8468038[gUnknown_203F3CC->unk_01BC->textPal2], 0, gUnknown_203F3CC->unk_01F7[i]);
+ }
+ CopyWindowToVram(gUnknown_203F3CC->unk_01C8[0], 3);
+ CopyWindowToVram(gUnknown_203F3CC->unk_01C8[1], 3);
+}
+
+void sub_8146B58(void)
+{
+ u16 r4 = gUnknown_203F3CC->unk_01C2_1;
+ r4 <<= 8;
+ if (gUnknown_203F3CC->unk_01C3_0)
+ {
+ ChangeBgY(2, r4, 1);
+ ChangeBgY(3, r4, 1);
+ }
+ else
+ {
+ ChangeBgY(2, r4, 2);
+ ChangeBgY(3, r4, 2);
+ }
+ gUnknown_203F3CC->unk_01C3_1 += gUnknown_203F3CC->unk_01C2_1;
+ if (gUnknown_203F3CC->unk_01C3_1 > 15)
+ {
+ if (gUnknown_203F3CC->unk_01C3_0)
+ ++gUnknown_203F3CC->unk_01C6;
+ else
+ --gUnknown_203F3CC->unk_01C6;
+ gUnknown_203F3CC->unk_01C2_0 = FALSE;
+ gUnknown_203F3CC->unk_01C3_1 = 0;
+ }
+}
diff --git a/src/mevent_server.c b/src/mevent_server.c
new file mode 100644
index 000000000..5e384ae0b
--- /dev/null
+++ b/src/mevent_server.c
@@ -0,0 +1,563 @@
+#include "global.h"
+#include "malloc.h"
+#include "decompress.h"
+#include "util.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "overworld.h"
+#include "script.h"
+#include "battle_tower.h"
+#include "mystery_event_script.h"
+#include "mevent.h"
+#include "mevent_server.h"
+
+EWRAM_DATA struct mevent_srv_ish * s_mevent_srv_ish_ptr = NULL;
+EWRAM_DATA struct mevent_srv_common * s_mevent_srv_common_ptr = NULL;
+
+static void mevent_srv_ish_init(struct mevent_srv_ish *, u32, u32);
+static u32 mevent_srv_ish_exec(struct mevent_srv_ish *);
+static void mevent_srv_ish_free_resources(struct mevent_srv_ish *);
+static void mevent_srv_init_common(struct mevent_srv_common *, const void *, u32, u32);
+static void mevent_srv_free_resources(struct mevent_srv_common *);
+static u32 mevent_srv_exec_common(struct mevent_srv_common *);
+
+extern const u8 gUnknown_84687E0[];
+extern const struct mevent_cmd gUnknown_8468B6C[];
+extern const struct mevent_cmd gUnknown_8468BCC[];
+
+void mevent_srv_ish_do_init(void)
+{
+ s_mevent_srv_ish_ptr = AllocZeroed(sizeof(struct mevent_srv_ish));
+ mevent_srv_ish_init(s_mevent_srv_ish_ptr, 1, 0);
+}
+
+u32 mevent_srv_ish_do_exec(u16 * a0)
+{
+ u32 result;
+ if (s_mevent_srv_ish_ptr == NULL)
+ return 6;
+ result = mevent_srv_ish_exec(s_mevent_srv_ish_ptr);
+ if (result == 6)
+ {
+ *a0 = s_mevent_srv_ish_ptr->param;
+ mevent_srv_ish_free_resources(s_mevent_srv_ish_ptr);
+ Free(s_mevent_srv_ish_ptr);
+ s_mevent_srv_ish_ptr = NULL;
+ }
+ return result;
+}
+
+void mevent_srv_ish_inc_flag(void)
+{
+ s_mevent_srv_ish_ptr->flag++;
+}
+
+void * mevent_srv_ish_get_buffer(void)
+{
+ return s_mevent_srv_ish_ptr->buffer;
+}
+
+void mevent_srv_ish_set_param(u32 a0)
+{
+ s_mevent_srv_ish_ptr->param = a0;
+}
+
+static void mevent_srv_ish_init(struct mevent_srv_ish * svr, u32 sendPlayerNo, u32 recvPlayerNo)
+{
+ svr->unk_00 = 0;
+ svr->mainseqno = 0;
+ svr->flag = 0;
+ svr->sendBuffer = AllocZeroed(ME_SEND_BUF_SIZE);
+ svr->recvBuffer = AllocZeroed(ME_SEND_BUF_SIZE);
+ svr->cmdBuffer = AllocZeroed(ME_SEND_BUF_SIZE);
+ svr->buffer = AllocZeroed(0x40);
+ mevent_srv_sub_init(&svr->manager, sendPlayerNo, recvPlayerNo);
+}
+
+static void mevent_srv_ish_free_resources(struct mevent_srv_ish * svr)
+{
+ Free(svr->sendBuffer);
+ Free(svr->recvBuffer);
+ Free(svr->cmdBuffer);
+ Free(svr->buffer);
+}
+
+static void mevent_srv_ish_jmp_buffer(struct mevent_srv_ish * svr)
+{
+ memcpy(svr->cmdBuffer, svr->recvBuffer, ME_SEND_BUF_SIZE);
+ svr->cmdidx = 0;
+}
+
+static void mevent_srv_ish_send_word(struct mevent_srv_ish * svr, u32 ident, u32 word)
+{
+ CpuFill32(0, svr->sendBuffer, ME_SEND_BUF_SIZE);
+ *(u32 *)svr->sendBuffer = word;
+ mevent_srv_sub_init_send(&svr->manager, ident, svr->sendBuffer, sizeof(u32));
+}
+
+static u32 ish_mainseq_0(struct mevent_srv_ish * svr)
+{
+ // init
+ memcpy(svr->cmdBuffer, gUnknown_84687E0, ME_SEND_BUF_SIZE);
+ svr->cmdidx = 0;
+ svr->mainseqno = 4;
+ svr->flag = 0;
+ return 0;
+}
+
+static u32 ish_mainseq_1(struct mevent_srv_ish * svr)
+{
+ // done
+ return 6;
+}
+
+static u32 ish_mainseq_2(struct mevent_srv_ish * svr)
+{
+ // do recv
+ if (mevent_srv_sub_recv(&svr->manager))
+ {
+ svr->mainseqno = 4;
+ svr->flag = 0;
+ }
+ return 1;
+}
+
+static u32 ish_mainseq_3(struct mevent_srv_ish * svr)
+{
+ // do send
+ if (mevent_srv_sub_send(&svr->manager))
+ {
+ svr->mainseqno = 4;
+ svr->flag = 0;
+ }
+ return 1;
+}
+
+static u32 ish_mainseq_4(struct mevent_srv_ish * svr)
+{
+ // process command
+ struct mevent_cmd_ish * cmd = &svr->cmdBuffer[svr->cmdidx];
+ ++svr->cmdidx;
+ switch (cmd->instr)
+ {
+ case 0:
+ break;
+ case 1:
+ svr->param = cmd->parameter;
+ svr->mainseqno = 1;
+ svr->flag = 0;
+ break;
+ case 2:
+ mevent_srv_sub_init_recv(&svr->manager, cmd->parameter, svr->recvBuffer);
+ svr->mainseqno = 2;
+ svr->flag = 0;
+ break;
+ case 3:
+ svr->mainseqno = 3;
+ svr->flag = 0;
+ break;
+ case 20:
+ mevent_srv_sub_init_send(&svr->manager, 0x14, svr->sendBuffer, 0);
+ svr->mainseqno = 3;
+ svr->flag = 0;
+ break;
+ case 19:
+ mevent_srv_ish_send_word(svr, 0x12, GetGameStat(cmd->parameter));
+ svr->mainseqno = 3;
+ svr->flag = 0;
+ break;
+ case 6:
+ if (svr->param == 0)
+ mevent_srv_ish_jmp_buffer(svr);
+ break;
+ case 7:
+ if (svr->param == 1)
+ mevent_srv_ish_jmp_buffer(svr);
+ break;
+ case 4:
+ mevent_srv_ish_jmp_buffer(svr);
+ break;
+ case 5:
+ memcpy(svr->buffer, svr->recvBuffer, 0x40);
+ svr->mainseqno = 5;
+ svr->flag = 0;
+ return 2;
+ case 11:
+ memcpy(svr->buffer, svr->recvBuffer, 0x40);
+ svr->mainseqno = 5;
+ svr->flag = 0;
+ return 3;
+ case 12:
+ memcpy(svr->buffer, svr->recvBuffer, 0x40);
+ svr->mainseqno = 5;
+ svr->flag = 0;
+ return 5;
+ case 13:
+ svr->mainseqno = 5;
+ svr->flag = 0;
+ return 4;
+ case 8:
+ sub_81442CC(svr->sendBuffer);
+ mevent_srv_sub_init_send(&svr->manager, 0x11, svr->sendBuffer, sizeof(struct MEventStruct_Unk1442CC));
+ break;
+ case 14:
+ mevent_srv_ish_send_word(svr, 0x13, svr->param);
+ break;
+ case 10:
+ sub_8143F68(svr->recvBuffer);
+ break;
+ case 9:
+ if (!sub_8143EF4(svr->recvBuffer))
+ {
+ sub_8143DC8(svr->recvBuffer);
+ mevent_srv_ish_send_word(svr, 0x13, 0);
+ }
+ else
+ mevent_srv_ish_send_word(svr, 0x13, 1);
+ break;
+ case 15:
+ svr->mainseqno = 6;
+ svr->flag = 0;
+ break;
+ case 16:
+ sub_8144254(svr->recvBuffer);
+ break;
+ case 17:
+ sub_8069EA4(svr->recvBuffer, 1000);
+ break;
+ case 18:
+ memcpy(gSaveBlock2Ptr->unk_4A0, svr->recvBuffer, 0xbc);
+ ValidateEReaderTrainer();
+ break;
+ case 21:
+ memcpy(gDecompressionBuffer, svr->recvBuffer, ME_SEND_BUF_SIZE);
+ svr->mainseqno = 7;
+ svr->flag = 0;
+ break;
+ }
+
+ return 1;
+}
+
+static u32 ish_mainseq_5(struct mevent_srv_ish * svr)
+{
+ // wait flag
+ if (svr->flag)
+ {
+ svr->mainseqno = 4;
+ svr->flag = 0;
+ }
+ return 1;
+}
+
+static u32 ish_mainseq_6(struct mevent_srv_ish * svr)
+{
+ // ???
+ switch (svr->flag)
+ {
+ case 0:
+ sub_80DA89C(svr->recvBuffer);
+ ++svr->flag;
+ break;
+ case 1:
+ if (!sub_80DA8B0(&svr->param))
+ {
+ svr->mainseqno = 4;
+ svr->flag = 0;
+ }
+ break;
+ }
+ return 1;
+}
+
+static u32 ish_mainseq_7(struct mevent_srv_ish * svr)
+{
+ // exec arbitrary code
+ u32 (*func)(u32 *, struct SaveBlock2 *, struct SaveBlock1 *) = (void *)gDecompressionBuffer;
+ if (func(&svr->param, gSaveBlock2Ptr, gSaveBlock1Ptr) == 1)
+ {
+ svr->mainseqno = 4;
+ svr->flag = 0;
+ }
+ return 1;
+}
+
+static u32 mevent_srv_ish_exec(struct mevent_srv_ish * svr)
+{
+ u32 (*funcs[])(struct mevent_srv_ish *) = {
+ ish_mainseq_0,
+ ish_mainseq_1,
+ ish_mainseq_2,
+ ish_mainseq_3,
+ ish_mainseq_4,
+ ish_mainseq_5,
+ ish_mainseq_6,
+ ish_mainseq_7
+ };
+ return funcs[svr->mainseqno](svr);
+}
+
+void mevent_srv_common_do_init_1(void)
+{
+ s_mevent_srv_common_ptr = AllocZeroed(sizeof(struct mevent_srv_common));
+ mevent_srv_init_common(s_mevent_srv_common_ptr, gUnknown_8468B6C, 0, 1);
+}
+
+void mevent_srv_common_do_init_2(void)
+{
+ s_mevent_srv_common_ptr = AllocZeroed(sizeof(struct mevent_srv_common));
+ mevent_srv_init_common(s_mevent_srv_common_ptr, gUnknown_8468BCC, 0, 1);
+}
+
+u32 mevent_srv_init_do_exec(u16 * a0)
+{
+ u32 result;
+ if (s_mevent_srv_common_ptr == NULL)
+ return 3;
+ result = mevent_srv_exec_common(s_mevent_srv_common_ptr);
+ if (result == 3)
+ {
+ *a0 = s_mevent_srv_common_ptr->param;
+ mevent_srv_free_resources(s_mevent_srv_common_ptr);
+ Free(s_mevent_srv_common_ptr);
+ s_mevent_srv_common_ptr = NULL;
+ }
+ return result;
+}
+
+static void mevent_srv_init_common(struct mevent_srv_common * svr, const void * cmdBuffer, u32 sendPlayerNo, u32 recvPlayerNo)
+{
+ svr->unk_00 = 0;
+ svr->mainseqno = 0;
+ svr->mevent_32e0 = AllocZeroed(sizeof(struct MEventBuffer_32E0_Sub));
+ svr->mevent_3120 = AllocZeroed(sizeof(struct MEventBuffer_3120_Sub));
+ svr->recvBuffer = AllocZeroed(ME_SEND_BUF_SIZE);
+ svr->mevent_unk1442cc = AllocZeroed(sizeof(struct MEventStruct_Unk1442CC));
+ svr->cmdBuffer = cmdBuffer;
+ svr->cmdidx = 0;
+ mevent_srv_sub_init(&svr->manager, sendPlayerNo, recvPlayerNo);
+}
+
+static void mevent_srv_free_resources(struct mevent_srv_common * svr)
+{
+ Free(svr->mevent_32e0);
+ Free(svr->mevent_3120);
+ Free(svr->recvBuffer);
+ Free(svr->mevent_unk1442cc);
+}
+
+static void mevent_srv_common_init_send(struct mevent_srv_common * svr, u32 ident, const void * src, u32 size)
+{
+ AGB_ASSERT_EX(size <= ME_SEND_BUF_SIZE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 257);
+ mevent_srv_sub_init_send(&svr->manager, ident, src, size);
+}
+
+static void * mevent_first_if_not_null_else_second(void * a0, void * a1)
+{
+ if (a0 != NULL)
+ return a0;
+ else
+ return a1;
+}
+
+static u32 mevent_compare_pointers(void * a0, void * a1)
+{
+ if (a1 < a0)
+ return 0;
+ else if (a1 == a0)
+ return 1;
+ else
+ return 2;
+}
+
+static u32 common_mainseq_0(struct mevent_srv_common * svr)
+{
+ // start
+ svr->mainseqno = 4;
+ return 0;
+}
+
+static u32 common_mainseq_1(struct mevent_srv_common * svr)
+{
+ // done
+ return 3;
+}
+
+static u32 common_mainseq_2(struct mevent_srv_common * svr)
+{
+ // do recv
+ if (mevent_srv_sub_recv(&svr->manager))
+ svr->mainseqno = 4;
+ return 1;
+}
+
+static u32 common_mainseq_3(struct mevent_srv_common * svr)
+{
+ // do send
+ if (mevent_srv_sub_send(&svr->manager))
+ svr->mainseqno = 4;
+ return 1;
+}
+
+static u32 common_mainseq_4(struct mevent_srv_common * svr)
+{
+ // process command
+ const struct mevent_cmd * cmd = &svr->cmdBuffer[svr->cmdidx];
+ void * ptr;
+ svr->cmdidx++;
+
+ switch (cmd->instr)
+ {
+ case 0:
+ AGB_ASSERT_EX(cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 354);
+ svr->mainseqno = 1;
+ svr->param = cmd->flag;
+ break;
+ case 1:
+ svr->mainseqno = 3;
+ break;
+ case 2:
+ AGB_ASSERT_EX(cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 364);
+ mevent_srv_sub_init_recv(&svr->manager, cmd->flag, svr->recvBuffer);
+ svr->mainseqno = 2;
+ break;
+ case 3:
+ AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 370);
+ svr->cmdidx = 0;
+ svr->cmdBuffer = cmd->parameter;
+ break;
+ case 5:
+ AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 376);
+ AGB_ASSERT_EX(cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 377);
+ memcpy(svr->mevent_unk1442cc, svr->recvBuffer, sizeof(struct MEventStruct_Unk1442CC));
+ break;
+ case 6:
+ AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 382);
+ AGB_ASSERT_EX(cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 383);
+ svr->param = sub_81443D4(svr->mevent_unk1442cc);
+ break;
+ case 4:
+ if (svr->param == cmd->flag)
+ {
+ svr->cmdidx = 0;
+ svr->cmdBuffer = cmd->parameter;
+ }
+ break;
+ case 7:
+ AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 396);
+ ptr = mevent_first_if_not_null_else_second(cmd->parameter, svr->mevent_32e0);
+ svr->param = sub_8144418(ptr, svr->mevent_unk1442cc, ptr);
+ break;
+ case 8:
+ AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 402);
+ AGB_ASSERT_EX(cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 403);
+ svr->param = *(u32 *)svr->recvBuffer;
+ break;
+ case 9:
+ AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 408);
+ ptr = mevent_first_if_not_null_else_second(cmd->parameter, &svr->sendWord);
+ svr->param = sub_8144434(ptr, svr->mevent_unk1442cc, ptr);
+ break;
+ case 10:
+ AGB_ASSERT_EX(cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 415);
+ svr->param = sub_81444B0(svr->mevent_unk1442cc, cmd->flag);
+ break;
+ case 11:
+ AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 420);
+ svr->param = sub_8144474(svr->mevent_unk1442cc, cmd->parameter);
+ break;
+ case 12:
+ AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 426);
+ svr->param = mevent_compare_pointers(cmd->parameter, *(void **)svr->recvBuffer);
+ break;
+ case 14:
+ AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 432);
+ mevent_srv_common_init_send(svr, 0x17, mevent_first_if_not_null_else_second(cmd->parameter, svr->mevent_3120), sizeof(struct MEventBuffer_3120_Sub));
+ break;
+ case 13:
+ AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 438);
+ mevent_srv_common_init_send(svr, 0x16, mevent_first_if_not_null_else_second(cmd->parameter, svr->mevent_32e0), sizeof(struct MEventBuffer_32E0_Sub));
+ break;
+ case 16:
+ AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 444);
+ mevent_srv_common_init_send(svr, 0x18, mevent_first_if_not_null_else_second(cmd->parameter, &svr->sendWord), 4);
+ break;
+ case 15:
+ if (cmd->parameter == NULL)
+ mevent_srv_common_init_send(svr, 0x19, svr->sendBuffer1, svr->sendBuffer1Size);
+ else
+ mevent_srv_common_init_send(svr, 0x19, cmd->parameter, cmd->flag);
+ break;
+ case 18:
+ if (cmd->parameter == NULL)
+ mevent_srv_common_init_send(svr, 0x10, svr->sendBuffer2, svr->sendBuffer2Size);
+ else
+ mevent_srv_common_init_send(svr, 0x10, cmd->parameter, cmd->flag);
+ break;
+ case 19:
+ AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 466);
+ mevent_srv_common_init_send(svr, 0x1a, cmd->parameter, 188);
+ break;
+ case 20:
+ mevent_srv_common_init_send(svr, 0x15, cmd->parameter, cmd->flag);
+ break;
+ case 17:
+ mevent_srv_common_init_send(svr, 0x1c, cmd->parameter, cmd->flag);
+ break;
+ case 22:
+ AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 481);
+ memcpy(svr->mevent_32e0, cmd->parameter, 332);
+ break;
+ case 23:
+ AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 486);
+ memcpy(svr->mevent_3120, cmd->parameter, 444);
+ break;
+ case 21:
+ AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 491);
+ svr->sendWord = *(u32 *)cmd->parameter;
+ break;
+ case 24:
+ svr->sendBuffer1 = cmd->parameter;
+ svr->sendBuffer1Size = cmd->flag;
+ break;
+ case 25:
+ svr->sendBuffer2 = cmd->parameter;
+ svr->sendBuffer2Size = cmd->flag;
+ break;
+ case 26:
+ AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 506);
+ memcpy(svr->mevent_32e0, sav1_get_mevent_buffer_1(), 332);
+ sub_814410C(svr->mevent_32e0);
+ break;
+ case 27:
+ AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 512);
+ memcpy(svr->mevent_3120, sub_8143D58(), 444);
+ break;
+ case 28:
+ AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 517);
+ svr->sendBuffer1 = sub_8069E48();
+ break;
+ case 29:
+ mevent_srv_common_init_send(svr, 0x1b, cmd->parameter, cmd->flag);
+ break;
+ }
+
+ return 1;
+}
+
+static u32 (*const func_tbl[])(struct mevent_srv_common *) = {
+ common_mainseq_0,
+ common_mainseq_1,
+ common_mainseq_2,
+ common_mainseq_3,
+ common_mainseq_4
+};
+
+static u32 mevent_srv_exec_common(struct mevent_srv_common * svr)
+{
+ u32 response;
+ AGB_ASSERT_EX(svr->mainseqno < NELEMS(func_tbl), "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 546);
+ response = func_tbl[svr->mainseqno](svr);
+ AGB_ASSERT_EX(svr->mainseqno < NELEMS(func_tbl), "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 548);
+ return response;
+}
diff --git a/src/mevent_server_helpers.c b/src/mevent_server_helpers.c
new file mode 100644
index 000000000..35efa68c8
--- /dev/null
+++ b/src/mevent_server_helpers.c
@@ -0,0 +1,211 @@
+#include "global.h"
+#include "malloc.h"
+#include "decompress.h"
+#include "util.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "overworld.h"
+#include "script.h"
+#include "battle_tower.h"
+#include "mystery_event_script.h"
+#include "mevent.h"
+#include "mevent_server.h"
+
+static u32 mevent_receive_func(struct mevent_srv_sub *);
+static u32 mevent_send_func(struct mevent_srv_sub *);
+
+u32 mevent_srv_sub_recv(struct mevent_srv_sub * svr)
+{
+ return svr->recvFunc(svr);
+}
+
+u32 mevent_srv_sub_send(struct mevent_srv_sub * svr)
+{
+ return svr->sendFunc(svr);
+}
+
+void mevent_srv_sub_init(struct mevent_srv_sub * svr, u32 sendPlayerNo, u32 recvPlayerNo)
+{
+ svr->sendPlayerNo = sendPlayerNo;
+ svr->recvPlayerNo = recvPlayerNo;
+ svr->seqno = 0;
+ svr->sendCRC = 0;
+ svr->sendSize = 0;
+ svr->sendCounter = 0;
+ svr->recvCRC = 0;
+ svr->recvSize = 0;
+ svr->recvCounter = 0;
+ svr->sendBfr = NULL;
+ svr->recvBfr = NULL;
+ svr->sendFunc = mevent_send_func;
+ svr->recvFunc = mevent_receive_func;
+}
+
+void mevent_srv_sub_init_send(struct mevent_srv_sub * svr, u32 ident, const void * src, u32 size)
+{
+ svr->seqno = 0;
+ svr->sendIdent = ident;
+ svr->sendCounter = 0;
+ svr->sendCRC = 0;
+ if (size != 0)
+ svr->sendSize = size;
+ else
+ svr->sendSize = ME_SEND_BUF_SIZE;
+ svr->sendBfr = src;
+}
+
+void mevent_srv_sub_init_recv(struct mevent_srv_sub * svr, u32 ident, void * dest)
+{
+ svr->seqno = 0;
+ svr->recvIdent = ident;
+ svr->recvCounter = 0;
+ svr->recvCRC = 0;
+ svr->recvSize = 0;
+ svr->recvBfr = dest;
+}
+
+static void mevent_recv_block(u32 recv_idx, void * dest, size_t size)
+{
+ memcpy(dest, gBlockRecvBuffer[recv_idx], size);
+}
+
+static bool32 mevent_has_received(u32 recv_idx)
+{
+ if ((GetBlockReceivedStatus() >> recv_idx) & 1)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static void mevent_reset_recv(u32 recv_idx)
+{
+ ResetBlockReceivedFlag(recv_idx);
+}
+
+static bool32 mevent_receive_func(struct mevent_srv_sub * svr)
+{
+ struct send_recv_header header;
+
+ switch (svr->seqno)
+ {
+ case 0:
+ if (mevent_has_received(svr->recvPlayerNo))
+ {
+ mevent_recv_block(svr->recvPlayerNo, &header, sizeof(header));
+ svr->recvSize = header.size;
+ svr->recvCRC = header.crc;
+ if (svr->recvSize > ME_SEND_BUF_SIZE)
+ {
+ sub_80FA190();
+ return FALSE;
+ }
+ else if (svr->recvIdent != header.ident)
+ {
+ sub_80FA190();
+ return FALSE;
+ }
+ else
+ {
+ svr->recvCounter = 0;
+ mevent_reset_recv(svr->recvPlayerNo);
+ ++svr->seqno;
+ }
+ }
+ break;
+ case 1:
+ if (mevent_has_received(svr->recvPlayerNo))
+ {
+ size_t blocksiz = svr->recvCounter * 252;
+ if (svr->recvSize - blocksiz <= 252)
+ {
+ mevent_recv_block(svr->recvPlayerNo, svr->recvBfr + blocksiz, svr->recvSize - blocksiz);
+ ++svr->recvCounter;
+ ++svr->seqno;
+ }
+ else
+ {
+ mevent_recv_block(svr->recvPlayerNo, svr->recvBfr + blocksiz, 252);
+ ++svr->recvCounter;
+ }
+ mevent_reset_recv(svr->recvPlayerNo);
+ }
+ break;
+ case 2:
+ if (CalcCRC16WithTable(svr->recvBfr, svr->recvSize) != svr->recvCRC)
+ {
+ sub_80FA190();
+ return FALSE;
+ }
+ else
+ {
+ svr->seqno = 0;
+ return TRUE;
+ }
+ break;
+
+ }
+
+ return FALSE;
+}
+
+static bool32 mevent_send_func(struct mevent_srv_sub * svr)
+{
+ struct send_recv_header header;
+
+ switch (svr->seqno)
+ {
+ case 0:
+ if (sub_800A4BC())
+ {
+ header.ident = svr->sendIdent;
+ header.size = svr->sendSize;
+ header.crc = CalcCRC16WithTable(svr->sendBfr, svr->sendSize);
+ svr->sendCRC = header.crc;
+ svr->sendCounter = 0;
+ SendBlock(0, &header, sizeof(header));
+ ++svr->seqno;
+ }
+ break;
+ case 1:
+ if (sub_800A4BC())
+ {
+ if (mevent_has_received(svr->sendPlayerNo))
+ {
+ size_t blocksiz;
+ mevent_reset_recv(svr->sendPlayerNo);
+ blocksiz = 252 * svr->sendCounter;
+ if (svr->sendSize - blocksiz <= 252)
+ {
+ SendBlock(0, svr->sendBfr + blocksiz, svr->sendSize - blocksiz);
+ ++svr->sendCounter;
+ ++svr->seqno;
+ }
+ else
+ {
+ SendBlock(0, svr->sendBfr + blocksiz, 252);
+ ++svr->sendCounter;
+ }
+ }
+ }
+ break;
+ case 2:
+ if (sub_800A4BC())
+ {
+ if (CalcCRC16WithTable(svr->sendBfr, svr->sendSize) != svr->sendCRC)
+ sub_80FA190();
+ else
+ ++svr->seqno;
+ }
+ break;
+ case 3:
+ if (mevent_has_received(svr->sendPlayerNo))
+ {
+ mevent_reset_recv(svr->sendPlayerNo);
+ svr->seqno = 0;
+ return TRUE;
+ }
+ break;
+ }
+
+ return FALSE;
+}
diff --git a/src/mystery_event_msg.c b/src/mystery_event_msg.c
new file mode 100644
index 000000000..a21750b7a
--- /dev/null
+++ b/src/mystery_event_msg.c
@@ -0,0 +1,13 @@
+#include "global.h"
+
+const u8 gText_MysteryGiftBerry[] = _("Obtained a {STR_VAR_2} BERRY!\nDad has it at PETALBURG GYM.");
+const u8 gText_MysteryGiftBerryTransform[] = _("The {STR_VAR_1} BERRY transformed into\none {STR_VAR_2} BERRY.");
+const u8 gText_MysteryGiftBerryObtained[] = _("The {STR_VAR_1} BERRY has already been\nobtained.");
+const u8 gText_MysteryGiftSpecialRibbon[] = _("A special RIBBON was awarded to\nyour party POKéMON.");
+const u8 gText_MysteryGiftNationalDex[] = _("The POKéDEX has been upgraded\nwith the NATIONAL MODE.");
+const u8 gText_MysteryGiftRareWord[] = _("A rare word has been added.");
+const u8 gText_MysteryGiftSentOver[] = _("{STR_VAR_1} was sent over!");
+const u8 gText_MysteryGiftFullParty[] = _("Your party is full.\n{STR_VAR_1} could not be sent over.");
+const u8 gText_MysteryGiftNewTrainer[] = _("A new TRAINER has arrived in\nHOENN.");
+const u8 gText_MysteryGiftNewAdversaryInBattleTower[] = _("バトルタワーに あらたな\nたいせんしゃが あらわれた!");
+const u8 gText_MysteryGiftCantBeUsed[] = _("This data can’t be used in\nthis version.");
diff --git a/src/mystery_event_script.c b/src/mystery_event_script.c
new file mode 100644
index 000000000..c9dc6ae81
--- /dev/null
+++ b/src/mystery_event_script.c
@@ -0,0 +1,322 @@
+#include "global.h"
+#include "berry.h"
+#include "battle_tower.h"
+#include "easy_chat.h"
+#include "event_data.h"
+#include "mail.h"
+#include "mail_data.h"
+#include "mystery_event_script.h"
+#include "pokedex.h"
+#include "pokemon.h"
+#include "pokemon_size_record.h"
+#include "script.h"
+#include "constants/species.h"
+#include "strings.h"
+#include "string_util.h"
+#include "text.h"
+#include "util.h"
+#include "mystery_event_msg.h"
+#include "pokemon_storage_system.h"
+
+extern ScrCmdFunc gMysteryEventScriptCmdTable[];
+extern ScrCmdFunc gMysteryEventScriptCmdTableEnd[];
+
+#define LANGUAGE_MASK 0x1
+#define VERSION_MASK 0x1
+
+EWRAM_DATA static struct ScriptContext sMysteryEventScriptContext = {0};
+
+static bool32 CheckCompatibility(u16 a1, u32 a2, u16 a3, u32 a4)
+{
+ if (!(a1 & LANGUAGE_MASK))
+ return FALSE;
+
+ if (!(a2 & LANGUAGE_MASK))
+ return FALSE;
+
+ if (!(a3 & 0x1))
+ return FALSE;
+
+ if (!(a4 & VERSION_MASK))
+ return FALSE;
+
+ return TRUE;
+}
+
+static void SetIncompatible(void)
+{
+ StringExpandPlaceholders(gStringVar4, gText_MysteryGiftCantBeUsed);
+ SetMysteryEventScriptStatus(3);
+}
+
+static void InitMysteryEventScript(struct ScriptContext *ctx, u8 *script)
+{
+ InitScriptContext(ctx, gMysteryEventScriptCmdTable, gMysteryEventScriptCmdTableEnd);
+ SetupBytecodeScript(ctx, script);
+ ctx->data[0] = (u32)script;
+ ctx->data[1] = 0;
+ ctx->data[2] = 0;
+ ctx->data[3] = 0;
+}
+
+static bool32 RunMysteryEventScriptCommand(struct ScriptContext *ctx)
+{
+ if (RunScriptCommand(ctx) && ctx->data[3])
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void sub_80DA89C(u8 *script)
+{
+ InitMysteryEventScript(&sMysteryEventScriptContext, script);
+}
+
+bool32 sub_80DA8B0(u32 *a0)
+{
+ bool32 ret = RunMysteryEventScriptCommand(&sMysteryEventScriptContext);
+ *a0 = sMysteryEventScriptContext.data[2];
+
+ return ret;
+}
+
+u32 RunMysteryEventScript(u8 *script)
+{
+ u32 ret;
+ sub_80DA89C(script);
+ while (sub_80DA8B0(&ret));
+
+ return ret;
+}
+
+void SetMysteryEventScriptStatus(u32 val)
+{
+ sMysteryEventScriptContext.data[2] = val;
+}
+
+bool8 MEScrCmd_end(struct ScriptContext *ctx)
+{
+ StopScript(ctx);
+ return TRUE;
+}
+
+bool8 MEScrCmd_checkcompat(struct ScriptContext *ctx)
+{
+ u16 v1;
+ u32 v2;
+ u16 v3;
+ u32 v4;
+
+ ctx->data[1] = ScriptReadWord(ctx);
+ v1 = ScriptReadHalfword(ctx);
+ v2 = ScriptReadWord(ctx);
+ v3 = ScriptReadHalfword(ctx);
+ v4 = ScriptReadWord(ctx);
+
+ if (CheckCompatibility(v1, v2, v3, v4) == TRUE)
+ ctx->data[3] = 1;
+ else
+ SetIncompatible();
+
+ return TRUE;
+}
+
+bool8 MEScrCmd_nop(struct ScriptContext *ctx)
+{
+ return FALSE;
+}
+
+bool8 MEScrCmd_setstatus(struct ScriptContext *ctx)
+{
+ u8 value = ScriptReadByte(ctx);
+ ctx->data[2] = value;
+ return FALSE;
+}
+
+bool8 MEScrCmd_setmsg(struct ScriptContext *ctx)
+{
+ u8 value = ScriptReadByte(ctx);
+ u8 *str = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
+ if (value == 0xFF || value == ctx->data[2])
+ StringExpandPlaceholders(gStringVar4, str);
+ return FALSE;
+}
+
+bool8 MEScrCmd_runscript(struct ScriptContext *ctx)
+{
+ u8 *script = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
+ ScriptContext2_RunNewScript(script);
+ return FALSE;
+}
+
+bool8 MEScrCmd_setenigmaberry(struct ScriptContext *ctx)
+{
+ u8 *str;
+ const u8 *message;
+ bool32 haveBerry = IsEnigmaBerryValid();
+ u8 *berry = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
+ StringCopyN(gStringVar1, gSaveBlock1Ptr->enigmaBerry.berry.name, BERRY_NAME_LENGTH + 1);
+ SetEnigmaBerry(berry);
+ StringCopyN(gStringVar2, gSaveBlock1Ptr->enigmaBerry.berry.name, BERRY_NAME_LENGTH + 1);
+
+ if (!haveBerry)
+ {
+ str = gStringVar4;
+ message = gText_MysteryGiftBerry;
+ }
+ else if (StringCompare(gStringVar1, gStringVar2))
+ {
+ str = gStringVar4;
+ message = gText_MysteryGiftBerryTransform;
+ }
+ else
+ {
+ str = gStringVar4;
+ message = gText_MysteryGiftBerryObtained;
+ }
+
+ StringExpandPlaceholders(str, message);
+
+ ctx->data[2] = 2;
+
+ if (IsEnigmaBerryValid() == TRUE)
+ VarSet(VAR_ENIGMA_BERRY_AVAILABLE, 1);
+ else
+ ctx->data[2] = 1;
+
+ return FALSE;
+}
+
+bool8 MEScrCmd_giveribbon(struct ScriptContext *ctx)
+{
+ u8 index = ScriptReadByte(ctx);
+ u8 ribbonId = ScriptReadByte(ctx);
+ GiveGiftRibbonToParty(index, ribbonId);
+ StringExpandPlaceholders(gStringVar4, gText_MysteryGiftSpecialRibbon);
+ ctx->data[2] = 2;
+ return FALSE;
+}
+
+bool8 MEScrCmd_initramscript(struct ScriptContext *ctx)
+{
+ u8 mapGroup = ScriptReadByte(ctx);
+ u8 mapNum = ScriptReadByte(ctx);
+ u8 objectId = ScriptReadByte(ctx);
+ u8 *script = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
+ u8 *scriptEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
+ InitRamScript(script, scriptEnd - script, mapGroup, mapNum, objectId);
+ return FALSE;
+}
+
+bool8 MEScrCmd_givenationaldex(struct ScriptContext *ctx)
+{
+ EnableNationalPokedex();
+ StringExpandPlaceholders(gStringVar4, gText_MysteryGiftNationalDex);
+ ctx->data[2] = 2;
+ return FALSE;
+}
+
+bool8 MEScrCmd_addrareword(struct ScriptContext *ctx)
+{
+ EnableRareWord(ScriptReadByte(ctx));
+ StringExpandPlaceholders(gStringVar4, gText_MysteryGiftRareWord);
+ ctx->data[2] = 2;
+ return FALSE;
+}
+
+bool8 MEScrCmd_setrecordmixinggift(struct ScriptContext *ctx)
+{
+ SetIncompatible();
+ ctx->data[3] = 0;
+ return TRUE;
+}
+
+bool8 MEScrCmd_givepokemon(struct ScriptContext *ctx)
+{
+ struct MailStruct mail;
+ struct Pokemon pokemon;
+ u16 species;
+ u16 heldItem;
+ u32 data = ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0];
+ void *pokemonPtr = (void *)data;
+ void *mailPtr = (void *)(data + sizeof(struct Pokemon));
+
+ pokemon = *(struct Pokemon *)pokemonPtr;
+ species = GetMonData(&pokemon, MON_DATA_SPECIES2);
+
+ if (species == SPECIES_EGG)
+ StringCopyN(gStringVar1, gText_EggNickname, POKEMON_NAME_LENGTH + 1);
+ else
+ StringCopyN(gStringVar1, gText_Pokemon, POKEMON_NAME_LENGTH + 1);
+
+ if (gPlayerPartyCount == PARTY_SIZE)
+ {
+ StringExpandPlaceholders(gStringVar4, gText_MysteryGiftFullParty);
+ ctx->data[2] = 3;
+ }
+ else
+ {
+ memcpy(&gPlayerParty[5], pokemonPtr, sizeof(struct Pokemon));
+ memcpy(&mail, mailPtr, sizeof(struct MailStruct));
+
+ if (species != SPECIES_EGG)
+ {
+ u16 pokedexNum = SpeciesToNationalPokedexNum(species);
+ GetSetPokedexFlag(pokedexNum, FLAG_SET_SEEN);
+ GetSetPokedexFlag(pokedexNum, FLAG_SET_CAUGHT);
+ }
+
+ heldItem = GetMonData(&gPlayerParty[5], MON_DATA_HELD_ITEM);
+ if (itemid_is_mail(heldItem))
+ GiveMailToMon2(&gPlayerParty[5], &mail);
+ CompactPartySlots();
+ CalculatePlayerPartyCount();
+ StringExpandPlaceholders(gStringVar4, gText_MysteryGiftSentOver);
+ ctx->data[2] = 2;
+ }
+
+ return FALSE;
+}
+
+bool8 MEScrCmd_addtrainer(struct ScriptContext *ctx)
+{
+ u32 data = ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0];
+ memcpy(gSaveBlock2Ptr->unk_4A0, (void *)data, 0xBC);
+ ValidateEReaderTrainer();
+ StringExpandPlaceholders(gStringVar4, gText_MysteryGiftNewTrainer);
+ ctx->data[2] = 2;
+ return FALSE;
+}
+
+bool8 MEScrCmd_enableresetrtc(struct ScriptContext *ctx)
+{
+ SetIncompatible();
+ ctx->data[3] = 0;
+ return TRUE;
+}
+
+bool8 MEScrCmd_checksum(struct ScriptContext *ctx)
+{
+ int checksum = ScriptReadWord(ctx);
+ u8 *data = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
+ u8 *dataEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
+ if (checksum != CalcByteArraySum(data, dataEnd - data))
+ {
+ ctx->data[3] = 0;
+ ctx->data[2] = 1;
+ }
+ return TRUE;
+}
+
+bool8 MEScrCmd_crc(struct ScriptContext *ctx)
+{
+ int crc = ScriptReadWord(ctx);
+ u8 *data = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
+ u8 *dataEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
+ if (crc != CalcCRC16(data, dataEnd - data))
+ {
+ ctx->data[3] = 0;
+ ctx->data[2] = 1;
+ }
+ return TRUE;
+}
diff --git a/src/pokemon.c b/src/pokemon.c
index ff7c907ca..5cd2cd2d7 100644
--- a/src/pokemon.c
+++ b/src/pokemon.c
@@ -1,3 +1,5 @@
+#define IS_POKEMON_C
+
#include "global.h"
#include "pokemon.h"
#include "random.h"
diff --git a/src/quest_log.c b/src/quest_log.c
new file mode 100644
index 000000000..4f462505a
--- /dev/null
+++ b/src/quest_log.c
@@ -0,0 +1,5027 @@
+#include "global.h"
+#include "constants/species.h"
+#include "constants/items.h"
+#include "data2.h"
+#include "malloc.h"
+#include "main.h"
+#include "task.h"
+#include "palette.h"
+#include "menu.h"
+#include "random.h"
+#include "menu_helpers.h"
+#include "window.h"
+#include "text_window.h"
+#include "unk_text_util.h"
+#include "event_data.h"
+#include "event_scripts.h"
+#include "string_util.h"
+#include "script.h"
+#include "overworld.h"
+#include "field_fadetransition.h"
+#include "field_weather.h"
+#include "field_map_obj.h"
+#include "map_obj_80688E4.h"
+#include "map_obj_lock.h"
+#include "field_player_avatar.h"
+#include "field_control_avatar.h"
+#include "battle.h"
+#include "item.h"
+#include "region_map.h"
+#include "map_name_popup.h"
+#include "wild_encounter.h"
+#include "help_system.h"
+#include "party_menu.h"
+#include "unk_8159F40.h"
+#include "pokemon_storage_system.h"
+#include "save.h"
+#include "link.h"
+#include "quest_log_8150454.h"
+#include "quest_log.h"
+
+u8 gUnknown_3005E88;
+
+struct Var4038Struct
+{
+ u8 unk_0_0:7;
+ u8 unk_0_7:1;
+ u8 unk_1;
+};
+
+#define VAR_0x4038_STRUCT ((struct Var4038Struct *)GetVarPointer(VAR_0x4038))
+
+struct UnkStruct_203AE94
+{
+ u8 unk_0_0:4;
+ u8 unk_0_4:2;
+ u8 unk_0_6:2;
+ u8 unk_1;
+ u8 unk_2;
+ u8 unk_3;
+};
+
+struct UnkStruct_203AE98
+{
+ u8 unk_0;
+ u8 unk_1;
+ u8 unk_2;
+ u8 unk_3;
+ u16 unk_4;
+ u8 unk_6;
+};
+
+struct UnkStruct_300201C
+{
+ u16 unk_0_0:15;
+ u16 unk_0_f:1;
+ u16 unk_2;
+};
+
+struct UnkStruct_203B044
+{
+ u8 unk_0;
+ u8 unk_1;
+ u16 unk_2;
+};
+
+u8 gUnknown_3005E88;
+u16 gUnknown_3005E8C;
+struct UnkStruct_3005E90 gUnknown_3005E90;
+struct UnkStruct_203AE98 * gUnknown_3005E94;
+
+static struct UnkStruct_300201C * gUnknown_300201C;
+static u16 gUnknown_3002020;
+
+EWRAM_DATA u8 gUnknown_203ADF8 = 0;
+EWRAM_DATA u8 gUnknown_203ADF9 = 0;
+EWRAM_DATA u8 gUnknown_203ADFA = 0;
+EWRAM_DATA u16 gUnknown_203ADFC = 0;
+EWRAM_DATA u8 gUnknown_203ADFE[3] = {0};
+EWRAM_DATA u16 * gUnknown_203AE04 = NULL;
+EWRAM_DATA u16 * gUnknown_203AE08 = NULL;
+EWRAM_DATA u16 * gUnknown_203AE0C[32] = {NULL};
+EWRAM_DATA void (* gUnknown_203AE8C)(void) = NULL;
+EWRAM_DATA u16 *gUnknown_203AE90 = NULL;
+EWRAM_DATA struct UnkStruct_203AE94 gUnknown_203AE94 = {0};
+EWRAM_DATA struct UnkStruct_203AE98 gUnknown_203AE98[32] = {0};
+EWRAM_DATA u16 gUnknown_203AF98 = 0;
+EWRAM_DATA u8 gUnknown_203AF9A[64][2] = {{0}};
+EWRAM_DATA u16 gUnknown_203B01A = 0;
+EWRAM_DATA u16 gUnknown_203B01C = 0;
+EWRAM_DATA u16 gUnknown_203B01E = 0;
+EWRAM_DATA u8 gUnknown_203B020 = 0;
+EWRAM_DATA struct UnkStruct_203B024 gUnknown_203B024 = {0};
+EWRAM_DATA struct UnkStruct_203B044 gUnknown_203B044 = {0};
+EWRAM_DATA u8 gUnknown_203B048 = 0;
+EWRAM_DATA u8 gUnknown_203B049 = 0;
+EWRAM_DATA u8 gUnknown_203B04A = 0;
+EWRAM_DATA u8 gUnknown_203B04B = 0;
+
+void sub_8110A00(void);
+void sub_8110A3C(void);
+void sub_8110BB0(u8);
+void sub_8110BE8(u8);
+void sub_8110E3C(void);
+void sub_8110D94(void);
+void sub_8110E20(void);
+void sub_8110D48(u8);
+u8 sub_8110E68(struct UnkStruct_203AE98 *);
+void sub_8110F90(u8);
+void sub_8111150(u8);
+void sub_8111368(void);
+void sub_81115E8(void);
+u16 sub_8111618(void);
+u16 sub_811164C(void);
+void sub_8111688(void);
+void sub_811175C(u8, struct UnkStruct_203AE98 *);
+void sub_81118F4(s8);
+void sub_8111914(void);
+void sub_8111984(void);
+void sub_8111A34(u8);
+void sub_8111AD8(void);
+void sub_8111B80(void);
+u8 sub_8111BD4(void);
+void sub_8111D10(void);
+void sub_8111D90(u8);
+void sub_8111E20(void);
+void sub_8111E64(s8);
+void sub_8111E84(void);
+bool8 sub_8111F60(void);
+void sub_8111F8C(u8);
+void sub_8111FCC(u8);
+void sub_8112044(u8);
+void sub_81120AC(u8);
+bool8 sub_81121D8(u8);
+void sub_811229C(void);
+void sub_8112364(void);
+void sub_8112888(u8);
+void sub_8112940(u8, struct UnkStruct_203AE98 *, u16);
+u8 sub_8112CAC(void);
+bool8 sub_8112CEC(void);
+bool8 sub_8112D1C(void);
+void sub_8113078(struct Var4038Struct *);
+void sub_81130BC(struct Var4038Struct *);
+u8 sub_8113194(struct Var4038Struct *);
+u16 sub_81132A0(struct Var4038Struct *);
+void sub_81132E0(struct Var4038Struct *);
+bool16 sub_811337C(struct Var4038Struct *);
+void sub_8113390(struct Var4038Struct *);
+void sub_8113414(struct LinkBattleRecords *, u8, u8);
+void sub_81134CC(struct Var4038Struct *);
+bool8 sub_8113508(struct Var4038Struct * );
+void sub_8113524(struct Var4038Struct *);
+bool8 sub_81136D4(void);
+bool8 sub_8113778(u16, u16 *);
+bool8 sub_81137E4(u16, u16 *);
+u16 * sub_8113828(u16, u16 *);
+bool8 sub_81138A0(u16, u16 *);
+bool8 sub_8113954(u16, u16 *);
+void sub_8113A1C(u16);
+void sub_811381C(void);
+void sub_81138F8(void);
+bool8 sub_8113A44(u16, u16 *);
+u16 * sub_8113A78(u16 *, u16 **);
+void sub_8113ABC(u16 *);
+bool8 sub_8113AE8(u16 *);
+bool8 sub_8113B44(u16 *);
+void sub_8113B88(void);
+void sub_8113B94(u16);
+void sub_8113BD8(void);
+u16 * sub_8113BF4(u16 *);
+u16 * sub_8113C20(u16 *, struct UnkStruct_203AE98 *);
+u16 * sub_8113C5C(u16 *, u16);
+u16 * sub_8113C8C(u16 *, struct UnkStruct_203AE98 *);
+u16 * sub_8113CC8(u16 *, struct UnkStruct_203AE98 *);
+u16 * sub_8113D08(u16 *, struct UnkStruct_203AE98 *);
+u16 * sub_8113D48(u16 *, struct UnkStruct_203AE98 *);
+u16 * sub_8113D94(u16 *, struct UnkStruct_203AE98 *);
+u16 * sub_8113F14(u16 *, const u16 *);
+const u16 * sub_8113F3C(const u16 *);
+u16 * sub_8113F80(u16 *, const u16 *);
+const u16 * sub_8113FBC(const u16 *);
+u16 * sub_8114174(u16 *, const u16 *);
+const u16 * sub_8114188(const u16 *);
+u16 * sub_81141D0(u16 *, const u16 *);
+const u16 * sub_81141E4(const u16 *);
+u16 * sub_811422C(u16 *, const u16 *);
+const u16 * sub_8114240(const u16 *);
+u16 * sub_8114288(u16 *, const u16 *);
+const u16 * sub_811429C(const u16 *);
+u16 * sub_8114310(u16 *, const u16 *);
+const u16 * sub_8114324(const u16 *);
+u16 * sub_8114380(u16 *, const u16 *);
+const u16 * sub_8114394(const u16 *);
+u16 * sub_81143F0(u16 *, const u16 *);
+const u16 * sub_811443C(const u16 *);
+u16 * sub_811445C(u16 *, const u16 *);
+const u16 * sub_811448C(const u16 *);
+u16 * sub_81144EC(u16 *, const u16 *);
+const u16 * sub_8114518(const u16 *);
+u16 * sub_8114578(u16 *, const u16 *);
+const u16 * sub_81145A4(const u16 *);
+u16 * sub_8114604(u16 *, const u16 *);
+const u16 * sub_811464C(const u16 *);
+u16 * sub_8114710(u16 *, const u16 *);
+const u16 * sub_8114724(const u16 *);
+u16 * sub_8114744(u16 *, const u16 *);
+const u16 * sub_8114758(const u16 *);
+u16 * sub_8114778(u16 *, const u16 *);
+const u16 * sub_81147A8(const u16 *);
+u16 * sub_8114808(u16 *, const u16 *);
+const u16 * sub_8114834(const u16 *);
+u16 * sub_811488C(u16 *, const u16 *);
+const u16 * sub_81148BC(const u16 *);
+u16 * sub_8114918(u16 *, const u16 *);
+const u16 * sub_8114944(const u16 *);
+u16 * sub_8114990(u16 *, const u16 *);
+const u16 * sub_81149D0(const u16 *);
+u16 * sub_8114A1C(u16 *, const u16 *);
+const u16 * sub_8114A4C(const u16 *);
+u16 * sub_8114AA0(u16 *, const u16 *);
+const u16 * sub_8114AC8(const u16 *);
+u16 * sub_8114B0C(u16 *, const u16 *);
+const u16 * sub_8114B34(const u16 *);
+u16 * sub_8114B78(u16 *, const u16 *);
+const u16 * sub_8114BA0(const u16 *);
+u16 * sub_8114BE4(u16 *, const u16 *);
+const u16 * sub_8114C0C(const u16 *);
+u16 * sub_8114C68(u16 *, const u16 *);
+const u16 * sub_8114C8C(const u16 *);
+u16 * sub_8114CC0(u16 *, const u16 *);
+const u16 * sub_8114CE4(const u16 *);
+u16 * sub_8114D4C(u16 *, const u16 *);
+const u16 * sub_8114D68(const u16 *);
+u16 * sub_8114DE8(u16 *, const u16 *);
+const u16 * sub_8114E68(const u16 *);
+bool8 sub_8114FBC(u16);
+u16 * sub_8114FF0(u16 *, const u16 *);
+const u16 * sub_811500C(const u16 *);
+u16 * sub_8115078(u16 *, const u16 *);
+const u16 * sub_81150CC(const u16 *);
+u16 * sub_81151C0(u16 *, const u16 *);
+const u16 * sub_81151DC(const u16 *);
+u16 * sub_8115280(u16 *, const u16 *);
+const u16 * sub_81152BC(const u16 *);
+bool8 sub_81153A8(u16, u16 *);
+bool8 sub_81153E4(u16, u16 *);
+u16 * sub_8115410(u16 *, const u16 *);
+const u16 * sub_8115460(const u16 *);
+u16 * sub_81154DC(u16 *, const u16 *);
+const u16 * sub_8115518(const u16 *);
+u16 * sub_81155A4(u16 *, const u16 *);
+const u16 * sub_81155E0(const u16 *);
+u16 * sub_81156D8(u16 *, const u16 *);
+const u16 * sub_8115700(const u16 *);
+u16 * sub_81157DC(u16 *, const u16 *);
+const u16 * sub_8115800(const u16 *);
+void sub_8115834(u8 *);
+
+extern const u8 gUnknown_841A155[];
+extern const u8 gUnknown_841A16F[];
+extern const u8 gUnknown_841A193[];
+extern const u8 gUnknown_841A1CD[];
+extern const u8 gUnknown_841A1E7[];
+extern const u8 gUnknown_841A210[];
+extern const u8 gUnknown_841A220[];
+extern const u8 gUnknown_841A255[];
+extern const u8 gUnknown_841A277[];
+extern const u8 gUnknown_841A2B0[];
+extern const u8 gUnknown_841A2E1[];
+extern const u8 gUnknown_841A312[];
+extern const u8 gUnknown_841A349[];
+extern const u8 gUnknown_841A391[];
+extern const u8 gUnknown_841A3DA[];
+extern const u8 gUnknown_841A3FF[];
+extern const u8 gUnknown_841A422[];
+extern const u8 gUnknown_841A477[];
+extern const u8 gUnknown_841A4C6[];
+extern const u8 gUnknown_841A502[];
+extern const u8 gUnknown_841A506[];
+extern const u8 gUnknown_841A50B[];
+extern const u8 gUnknown_841A53A[];
+extern const u8 gUnknown_841A566[];
+extern const u8 gUnknown_841A59C[];
+extern const u8 gUnknown_841A5D9[];
+extern const u8 gUnknown_841A5FA[];
+extern const u8 gUnknown_841A60A[];
+extern const u8 gUnknown_841A632[];
+extern const u8 gUnknown_841A64F[];
+extern const u8 gUnknown_841A66E[];
+extern const u8 gUnknown_841A694[];
+extern const u8 gUnknown_841A6A5[];
+extern const u8 gUnknown_841A6E1[];
+extern const u8 gUnknown_841A732[];
+extern const u8 gUnknown_841A74E[];
+extern const u8 gUnknown_841A756[];
+extern const u8 gUnknown_841A762[];
+extern const u8 gUnknown_841A76A[];
+extern const u8 gUnknown_841A7B0[];
+extern const u8 gUnknown_841A7DD[];
+extern const u8 gUnknown_841A810[];
+extern const u8 gUnknown_841A858[];
+extern const u8 gUnknown_841A896[];
+extern const u8 gUnknown_841A8D4[];
+extern const u8 gUnknown_841A8DD[];
+extern const u8 gUnknown_841A8E0[];
+extern const u8 gUnknown_841A90C[];
+extern const u8 gUnknown_841A938[];
+extern const u8 gUnknown_841A965[];
+extern const u8 gUnknown_841A9A9[];
+extern const u8 gUnknown_841A9D4[];
+extern const u8 gUnknown_841AA01[];
+extern const u8 gUnknown_841AA2B[];
+extern const u8 gUnknown_841AA76[];
+extern const u8 gUnknown_841AAAA[];
+extern const u8 gUnknown_841AAEC[];
+extern const u8 gUnknown_841AB29[];
+extern const u8 gUnknown_841AB74[];
+extern const u8 gUnknown_841AB8E[];
+extern const u8 gUnknown_841ABAB[];
+extern const u8 gUnknown_841ABCD[];
+extern const u8 gUnknown_841ABF9[];
+extern const u8 gUnknown_841AC2A[];
+extern const u8 gUnknown_841AC51[];
+extern const u8 gUnknown_841AC93[];
+extern const u8 gUnknown_841ACBC[];
+extern const u8 gUnknown_841ACF9[];
+extern const u8 gUnknown_841AD1D[];
+extern const u8 gUnknown_841AD3C[];
+extern const u8 gUnknown_841AD69[];
+extern const u8 gUnknown_841AD9E[];
+extern const u8 gUnknown_841ADC8[];
+extern const u8 gUnknown_841ADFF[];
+extern const u8 gUnknown_841AE1E[];
+extern const u8 gUnknown_841AE48[];
+extern const u8 gUnknown_841AE8F[];
+extern const u8 gUnknown_841AEA7[];
+extern const u8 gUnknown_841AEDC[];
+extern const u8 gUnknown_841AF0C[];
+extern const u8 gUnknown_841AF3E[];
+extern const u8 gUnknown_841AF6D[];
+extern const u8 gUnknown_841AF98[];
+extern const u8 gUnknown_841AF9F[];
+extern const u8 gUnknown_841AFA6[];
+extern const u8 gUnknown_841AFD1[];
+extern const u8 gUnknown_841AFD6[];
+extern const u8 gUnknown_841B005[];
+extern const u8 gUnknown_841B03F[];
+extern const u8 gUnknown_841B064[];
+extern const u8 gUnknown_841B073[];
+extern const u8 gUnknown_841B09F[];
+extern const u8 gUnknown_841B0A4[];
+extern const u8 gUnknown_841B0B5[];
+extern const u8 gUnknown_841B0B9[];
+extern const u8 gUnknown_841B0CD[];
+extern const u8 gUnknown_841B0DD[];
+extern const u8 gUnknown_841B0F6[];
+extern const u8 gUnknown_841B0FF[];
+extern const u8 gUnknown_841B109[];
+extern const u8 gUnknown_841B116[];
+extern const u8 gUnknown_841B11F[];
+extern const u8 gUnknown_841B130[];
+extern const u8 gUnknown_841B141[];
+extern const u8 gUnknown_841B14B[];
+extern const u8 gUnknown_841B15A[];
+extern const u8 gUnknown_841B166[];
+extern const u8 gUnknown_841B172[];
+extern const u8 gUnknown_841B180[];
+extern const u8 gUnknown_841B190[];
+extern const u8 gUnknown_841B1A3[];
+extern const u8 gUnknown_841B1B7[];
+extern const u8 gUnknown_841B1C7[];
+extern const u8 gUnknown_841B1DA[];
+extern const u8 gUnknown_841B1E5[];
+extern const u8 gUnknown_841B1F4[];
+extern const u8 gUnknown_841B200[];
+extern const u8 gUnknown_841B20E[];
+extern const u8 gUnknown_841B21C[];
+extern const u8 gUnknown_841B226[];
+extern const u8 gUnknown_841B236[];
+extern const u8 gUnknown_841B246[];
+extern const u8 gUnknown_841B25B[];
+extern const u8 gUnknown_841B268[];
+extern const u8 gUnknown_841B277[];
+extern const u8 gUnknown_8418C1B[];
+
+
+const struct WindowTemplate gUnknown_845661C[3] = {
+ { 0, 0, 0, 30, 2, 15, 0x0e9 },
+ { 0, 0, 18, 30, 2, 15, 0x0ad },
+ { 0, 0, 14, 30, 6, 15, 0x14c }
+};
+
+const struct TextColor gUnknown_8456634 = {15, 1, 12};
+
+const u16 gUnknown_8456638[] = INCBIN_U16("data/graphics/unknown_8456638.bin");
+
+const u8 gUnknown_8456698[] = {17, 10, 3};
+
+void sub_8110840(void * oldPointer)
+{
+ ptrdiff_t offset = (void *)gSaveBlock1Ptr - oldPointer;
+ if (gUnknown_203AE04)
+ gUnknown_203AE04 = (void *)gUnknown_203AE04 + offset;
+ if (gUnknown_203ADFA != 0)
+ {
+ if (gUnknown_203AE08)
+ gUnknown_203AE08 = (void *)gUnknown_203AE08 + offset;
+ if (gUnknown_203ADFA == 2)
+ {
+ int r3;
+ for (r3 = 0; r3 < 0x20; r3++)
+ if (gUnknown_203AE0C[r3])
+ gUnknown_203AE0C[r3] = (void *)gUnknown_203AE0C[r3] + offset;
+ }
+ }
+}
+
+void sub_811089C(void)
+{
+ memset(gSaveBlock1Ptr->questLog, 0, sizeof(gSaveBlock1Ptr->questLog));
+ gUnknown_203ADF8 = 0;
+ gUnknown_203ADFA = 0;
+ gUnknown_203AE8C = 0;
+ gUnknown_203AE08 = NULL;
+ gUnknown_203AE04 = 0;
+ sub_8113BD8();
+ sub_81138F8();
+}
+
+void sub_81108F0(u8 a0)
+{
+ memset(gSaveBlock1Ptr->questLog + a0, 0, sizeof(struct QuestLog));
+ gUnknown_203AE04 = NULL;
+}
+
+void sub_8110920(void)
+{
+ gUnknown_203AE04 = NULL;
+}
+
+void sub_811092C(void)
+{
+ if (gUnknown_203AE8C)
+ gUnknown_203AE8C();
+}
+
+bool8 sub_8110944(const void * a0, size_t a1)
+{
+ void * r2 = gSaveBlock1Ptr->questLog[gUnknown_203ADF8].unk_568;
+ void * r0 = gSaveBlock1Ptr->questLog[gUnknown_203ADF8].end;
+ r0 -= a1;
+ if ((const void *)a0 < r2 || (const void *)a0 > r0)
+ return FALSE;
+ return TRUE;
+}
+
+bool8 sub_8110988(u16 * a0, size_t a1)
+{
+ void * r2 = gSaveBlock1Ptr->questLog[gUnknown_203ADF8].unk_568;
+ void * r0 = gSaveBlock1Ptr->questLog[gUnknown_203ADF8].end;
+ r0 -= a1;
+ if ((void *)a0 < r2 || (void *)a0 > r0)
+ return FALSE;
+ return TRUE;
+}
+
+void sub_81109CC(u8 a0)
+{
+ gUnknown_203ADFA = a0;
+ if (a0 == 1)
+ gUnknown_203AE8C = sub_8110A00;
+ else
+ gUnknown_203AE8C = sub_8110A3C;
+}
+
+void sub_8110A00(void)
+{
+ if (sub_8110E68(gUnknown_203AE98) != 1)
+ {
+ gUnknown_3005E88 = 0;
+ sub_8110E3C();
+ gUnknown_203ADFA = 0;
+ gUnknown_203AE8C = NULL;
+ }
+}
+
+void sub_8110A3C(void)
+{
+ if (gUnknown_203AE94.unk_0_0 == 2)
+ gUnknown_203AE94.unk_0_0 = 0;
+
+ if (gUnknown_203AE94.unk_0_6 == 0)
+ {
+ if (gUnknown_3005E88 || gUnknown_203AE94.unk_0_0 == 1 || (gUnknown_203AE94.unk_1 < 32 && gUnknown_203AE0C[gUnknown_203AE94.unk_1]))
+ sub_8111AD8();
+ else
+ {
+ gUnknown_203AE94.unk_0_6 = 2;
+ ScriptContext2_Enable();
+ sub_81118F4(0);
+ }
+ }
+}
+
+void sub_8110AB4(void)
+{
+ gSpecialVar_Result = gUnknown_203ADFA;
+}
+
+u8 sub_8110AC8(void)
+{
+ return gSaveBlock1Ptr->questLog[gUnknown_203ADF8].unk_000;
+}
+
+void sub_8110AEC(u16 a0)
+{
+ if (gUnknown_203ADF8 > 3)
+ gUnknown_203ADF8 = 0;
+
+ sub_81108F0(gUnknown_203ADF8);
+ sub_8113B88();
+ gUnknown_203AE08 = gSaveBlock1Ptr->questLog[gUnknown_203ADF8].unk_568;
+ if ((a0 >= 12 && a0 < 20) || a0 == 35)
+ gSaveBlock1Ptr->questLog[gUnknown_203ADF8].unk_000 = 2;
+ else
+ gSaveBlock1Ptr->questLog[gUnknown_203ADF8].unk_000 = 1;
+ sub_81115E8();
+ sub_8110BB0(gUnknown_203ADF8);
+ sub_8110BE8(gUnknown_203ADF8);
+ sub_8110D94();
+ sub_8110E20();
+ sub_8110D48(gUnknown_203ADF8);
+ gUnknown_203ADFC = 0;
+ sub_8112940(2, gUnknown_203AE98, 0x100);
+ sub_8110E68(gUnknown_203AE98);
+ sub_81109CC(1);
+}
+
+void sub_8110BB0(u8 a0)
+{
+ struct QuestLog * questLog = &gSaveBlock1Ptr->questLog[a0];
+ questLog->unk_001 = gSaveBlock1Ptr->location.mapGroup;
+ questLog->unk_002 = gSaveBlock1Ptr->location.mapNum;
+ questLog->unk_003 = gSaveBlock1Ptr->location.warpId;
+ questLog->unk_004 = gSaveBlock1Ptr->pos.x;
+ questLog->unk_006 = gSaveBlock1Ptr->pos.y;
+}
+
+#ifdef NONMATCHING
+void sub_8110BE8(u8 a0)
+{
+ struct QuestLog * questLog = &gSaveBlock1Ptr->questLog[a0];
+ u16 i; // r6
+
+ sub_815A008(questLog);
+
+ for (i = 0; i < ARRAY_COUNT(gSaveBlock1Ptr->mapObjectTemplates); i++)
+ {
+ if (gSaveBlock1Ptr->mapObjectTemplates[i].x < 0)
+ {
+ questLog->npcData[i].x = (u8)-gSaveBlock1Ptr->mapObjectTemplates[i].x;
+ questLog->npcData[i].negx = TRUE;
+ }
+ else
+ {
+ questLog->npcData[i].x = (u8)gSaveBlock1Ptr->mapObjectTemplates[i].x;
+ questLog->npcData[i].negx = FALSE;
+ }
+ if (gSaveBlock1Ptr->mapObjectTemplates[i].y < 0)
+ {
+ questLog->npcData[i].y = (u8)-gSaveBlock1Ptr->mapObjectTemplates[i].y;
+ questLog->npcData[i].negy = TRUE;
+ }
+ else
+ {
+ questLog->npcData[i].y = (u8)gSaveBlock1Ptr->mapObjectTemplates[i].y;
+ questLog->npcData[i].negy = FALSE;
+ }
+ questLog->npcData[i].elevation = gSaveBlock1Ptr->mapObjectTemplates[i].elevation;
+ questLog->npcData[i].movementType = gSaveBlock1Ptr->mapObjectTemplates[i].movementType;
+ }
+}
+#else
+NAKED
+void sub_8110BE8(u8 a0)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tmov r7, r10\n"
+ "\tmov r6, r9\n"
+ "\tmov r5, r8\n"
+ "\tpush {r5-r7}\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tldr r4, =gSaveBlock1Ptr\n"
+ "\tmovs r1, 0xCD\n"
+ "\tlsls r1, 3\n"
+ "\tmuls r0, r1\n"
+ "\tmovs r1, 0x98\n"
+ "\tlsls r1, 5\n"
+ "\tadds r0, r1\n"
+ "\tldr r1, [r4]\n"
+ "\tadds r7, r1, r0\n"
+ "\tadds r0, r7, 0\n"
+ "\tbl sub_815A008\n"
+ "\tmovs r6, 0\n"
+ "\tmov r9, r4\n"
+ "\tmovs r2, 0x8D\n"
+ "\tlsls r2, 3\n"
+ "\tmov r8, r2\n"
+ "\tldr r3, =0x0000046a\n"
+ "\tmov r10, r3\n"
+ "_08110C1C:\n"
+ "\tmov r4, r9\n"
+ "\tldr r1, [r4]\n"
+ "\tlsls r2, r6, 1\n"
+ "\tadds r0, r2, r6\n"
+ "\tlsls r0, 3\n"
+ "\tadds r1, r0\n"
+ "\tldr r0, =0x000008e4\n"
+ "\tadds r1, r0\n"
+ "\tldrh r4, [r1]\n"
+ "\tmovs r3, 0\n"
+ "\tldrsh r0, [r1, r3]\n"
+ "\tmov r12, r2\n"
+ "\tcmp r0, 0\n"
+ "\tbge _08110C64\n"
+ "\tlsls r3, r6, 2\n"
+ "\tadds r2, r7, r3\n"
+ "\tnegs r0, r0\n"
+ "\tmov r4, r8\n"
+ "\tadds r1, r2, r4\n"
+ "\tstrb r0, [r1]\n"
+ "\tldr r0, =0x00000469\n"
+ "\tadds r2, r0\n"
+ "\tldrb r0, [r2]\n"
+ "\tmovs r1, 0x1\n"
+ "\torrs r0, r1\n"
+ "\tstrb r0, [r2]\n"
+ "\tb _08110C7C\n"
+ "\t.pool\n"
+ "_08110C64:\n"
+ "\tlsls r3, r6, 2\n"
+ "\tadds r1, r7, r3\n"
+ "\tmov r2, r8\n"
+ "\tadds r0, r1, r2\n"
+ "\tstrb r4, [r0]\n"
+ "\tldr r4, =0x00000469\n"
+ "\tadds r1, r4\n"
+ "\tldrb r2, [r1]\n"
+ "\tmovs r0, 0x2\n"
+ "\tnegs r0, r0\n"
+ "\tands r0, r2\n"
+ "\tstrb r0, [r1]\n"
+ "_08110C7C:\n"
+ "\tadds r5, r3, 0\n"
+ "\tmov r1, r9\n"
+ "\tldr r0, [r1]\n"
+ "\tmov r2, r12\n"
+ "\tadds r1, r2, r6\n"
+ "\tlsls r1, 3\n"
+ "\tadds r0, r1\n"
+ "\tldr r3, =0x000008e6\n"
+ "\tadds r1, r0, r3\n"
+ "\tldrh r2, [r1]\n"
+ "\tmovs r4, 0\n"
+ "\tldrsh r0, [r1, r4]\n"
+ "\tcmp r0, 0\n"
+ "\tbge _08110CC8\n"
+ "\tadds r3, r7, r5\n"
+ "\tadds r1, r0, 0\n"
+ "\tnegs r1, r1\n"
+ "\tlsls r1, 24\n"
+ "\tmov r2, r8\n"
+ "\tadds r4, r3, r2\n"
+ "\tlsrs r1, 15\n"
+ "\tldr r0, [r4]\n"
+ "\tldr r2, =0xfffe01ff\n"
+ "\tands r0, r2\n"
+ "\torrs r0, r1\n"
+ "\tstr r0, [r4]\n"
+ "\tadd r3, r10\n"
+ "\tldrb r0, [r3]\n"
+ "\tmovs r1, 0x2\n"
+ "\torrs r0, r1\n"
+ "\tb _08110CE6\n"
+ "\t.pool\n"
+ "_08110CC8:\n"
+ "\tadds r3, r7, r5\n"
+ "\tlsls r2, 24\n"
+ "\tmov r0, r8\n"
+ "\tadds r4, r3, r0\n"
+ "\tlsrs r2, 15\n"
+ "\tldr r0, [r4]\n"
+ "\tldr r1, =0xfffe01ff\n"
+ "\tands r0, r1\n"
+ "\torrs r0, r2\n"
+ "\tstr r0, [r4]\n"
+ "\tadd r3, r10\n"
+ "\tldrb r1, [r3]\n"
+ "\tmovs r0, 0x3\n"
+ "\tnegs r0, r0\n"
+ "\tands r0, r1\n"
+ "_08110CE6:\n"
+ "\tstrb r0, [r3]\n"
+ "\tadds r5, r7, r5\n"
+ "\tmov r1, r9\n"
+ "\tldr r0, [r1]\n"
+ "\tmov r2, r12\n"
+ "\tadds r3, r2, r6\n"
+ "\tlsls r3, 3\n"
+ "\tadds r0, r3\n"
+ "\tldr r4, =0x000008e8\n"
+ "\tadds r0, r4\n"
+ "\tldrb r1, [r0]\n"
+ "\tmov r0, r10\n"
+ "\tadds r4, r5, r0\n"
+ "\tlsls r1, 2\n"
+ "\tldrb r2, [r4]\n"
+ "\tmovs r0, 0x3\n"
+ "\tands r0, r2\n"
+ "\torrs r0, r1\n"
+ "\tstrb r0, [r4]\n"
+ "\tmov r1, r9\n"
+ "\tldr r0, [r1]\n"
+ "\tadds r0, r3\n"
+ "\tldr r2, =0x000008e9\n"
+ "\tadds r0, r2\n"
+ "\tldrb r0, [r0]\n"
+ "\tldr r3, =0x0000046b\n"
+ "\tadds r5, r3\n"
+ "\tstrb r0, [r5]\n"
+ "\tadds r0, r6, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r6, r0, 16\n"
+ "\tcmp r6, 0x3F\n"
+ "\tbhi _08110D2A\n"
+ "\tb _08110C1C\n"
+ "_08110D2A:\n"
+ "\tpop {r3-r5}\n"
+ "\tmov r8, r3\n"
+ "\tmov r9, r4\n"
+ "\tmov r10, r5\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.pool");
+}
+#endif // NONMATCHING
+
+void sub_8110D48(u8 a0)
+{
+ struct QuestLog * questLog = &gSaveBlock1Ptr->questLog[a0];
+
+ CpuCopy16(gSaveBlock1Ptr->flags, questLog->flags, FLAGS_COUNT * sizeof(u8));
+ CpuCopy16(gSaveBlock1Ptr->vars, questLog->vars, VARS_COUNT * sizeof(u16));
+}
+
+void sub_8110D94(void)
+{
+ u16 i, j;
+ u16 sp0[4];
+
+ for (i = 0; i < 4; i++)
+ {
+ sp0[i] = 0;
+ for (j = 0; j < 16; j++)
+ {
+ if (gSaveBlock1Ptr->trainerRematches[16 * i + j])
+ {
+ sp0[i] += (1 << j);
+ }
+ }
+ VarSet(VAR_0x40AA + i, sp0[i]);
+ }
+}
+
+void sub_8110E20(void)
+{
+ VarSet(VAR_0x40AE, gSaveBlock1Ptr->mapDataId);
+}
+
+void sub_8110E3C(void)
+{
+ sub_8113BF4(gUnknown_203AE08);
+ if (++gUnknown_203ADF8 > 3)
+ gUnknown_203ADF8 = 0;
+}
+
+bool8 sub_8110E68(struct UnkStruct_203AE98 * a0)
+{
+ u16 i;
+
+ for (i = gUnknown_203ADFC; i < gUnknown_203AF98; i++)
+ {
+ if (gUnknown_203AE08 == NULL)
+ return FALSE;
+ switch (a0[i].unk_6)
+ {
+ case 0:
+ case 1:
+ gUnknown_203AE08 = sub_8113D48(gUnknown_203AE08, &a0[i]);
+ break;
+ default:
+ gUnknown_203AE08 = sub_8113CC8(gUnknown_203AE08, &a0[i]);
+ break;
+ }
+ if (gUnknown_203AE08 == NULL)
+ {
+ gUnknown_3005E88 = 0;
+ return FALSE;
+ }
+ }
+
+ if (gUnknown_3005E88 == 0)
+ {
+ gUnknown_203AE08 = sub_8113BF4(gUnknown_203AE08);
+ return FALSE;
+ }
+ gUnknown_203ADFC = gUnknown_203AF98;
+ return TRUE;
+}
+
+void sub_8110F14(u8 taskId)
+{
+ u8 i;
+
+ sub_811381C();
+ gUnknown_203ADF9 = 0;
+ for (i = 0; i < 4; i++)
+ {
+ if (gSaveBlock1Ptr->questLog[i].unk_000)
+ gUnknown_203ADF9++;
+ }
+
+ if (gUnknown_203ADF9 != 0)
+ {
+ gUnknown_3005ECC = FALSE;
+ sub_8110F90(taskId);
+ DestroyTask(taskId);
+ }
+ else
+ {
+ SetMainCallback2(sub_8056938);
+ DestroyTask(taskId);
+ }
+}
+
+void sub_8110F90(u8 unused)
+{
+ gSaveBlock1Ptr->location.mapGroup = 3;
+ gSaveBlock1Ptr->location.mapNum = 19;
+ gSaveBlock1Ptr->location.warpId = -1;
+ gUnknown_203ADF8 = 0;
+ gUnknown_2031DD8 = 1;
+ sub_8082740(1);
+ sub_8111368();
+}
+
+void sub_8110FCC(void)
+{
+ sub_811175C(gUnknown_203ADF8, gUnknown_203AE98);
+ sub_8113B88();
+ sub_8112940(1, gUnknown_203AE98, 0x100);
+ sub_8111150(gUnknown_203ADF8);
+}
+
+bool8 sub_8111000(void)
+{
+ LoadPalette(stdpal_get(4), 0xF0, 0x20);
+ sub_81109CC(2);
+ sub_807DF64();
+ gUnknown_203AE94 = (struct UnkStruct_203AE94){};
+ gUnknown_203AE94.unk_0_0 = 2;
+ return 1;
+}
+
+bool8 sub_8111038(void)
+{
+ LoadPalette(stdpal_get(4), 0xF0, 0x20);
+ sub_81109CC(2);
+ sub_807DF7C();
+ gUnknown_203AE94 = (struct UnkStruct_203AE94){};
+ gUnknown_203AE94.unk_0_0 = 2;
+ return 1;
+}
+
+void sub_8111070(u8 a0)
+{
+ u8 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ gUnknown_203ADFE[i] = AddWindow(&gUnknown_845661C[i]);
+ FillWindowPixelRect(gUnknown_203ADFE[i], 15, 0, 0, gUnknown_845661C[i].width * 8, gUnknown_845661C[i].height * 8);
+ }
+
+ // _("Previously on your quest…$")
+ StringExpandPlaceholders(gStringVar4, gUnknown_841A155);
+
+ if (a0)
+ {
+ ConvertIntToDecimalStringN(gStringVar1, a0, STR_CONV_MODE_LEFT_ALIGN, 1);
+ StringAppend(gStringVar4, gStringVar1);
+ }
+
+ AddTextPrinterParametrized2(gUnknown_203ADFE[0], 2, 2, 2, 1, 2, &gUnknown_8456634, 0, gStringVar4);
+ PutWindowTilemap(gUnknown_203ADFE[0]);
+ PutWindowTilemap(gUnknown_203ADFE[1]);
+ CopyWindowToVram(gUnknown_203ADFE[0], 2);
+ CopyWindowToVram(gUnknown_203ADFE[2], 2);
+ CopyWindowToVram(gUnknown_203ADFE[1], 3);
+}
+
+void sub_8111134(void)
+{
+ PutWindowTilemap(gUnknown_203ADFE[1]);
+ CopyWindowToVram(gUnknown_203ADFE[1], 1);
+}
+
+void sub_8111150(u8 a0)
+{
+ struct QuestLog *questLog = &gSaveBlock1Ptr->questLog[a0];
+ u16 i;
+
+ for (i = 0; i < 64; i++)
+ {
+ if (questLog->npcData[i].negx)
+ gSaveBlock1Ptr->mapObjectTemplates[i].x = -questLog->npcData[i].x;
+ else
+ gSaveBlock1Ptr->mapObjectTemplates[i].x = questLog->npcData[i].x;
+ if (questLog->npcData[i].negy)
+ gSaveBlock1Ptr->mapObjectTemplates[i].y = -(u8)questLog->npcData[i].y;
+ else
+ gSaveBlock1Ptr->mapObjectTemplates[i].y = questLog->npcData[i].y;
+ gSaveBlock1Ptr->mapObjectTemplates[i].elevation = questLog->npcData[i].elevation;
+ gSaveBlock1Ptr->mapObjectTemplates[i].movementType = questLog->npcData[i].movementType;
+ }
+
+ sub_815A1F8(questLog, gSaveBlock1Ptr->mapObjectTemplates);
+}
+
+void sub_8111274(u8 a0, u8 a1)
+{
+ struct WarpData sp0;
+
+ if (!a1)
+ {
+ gSaveBlock1Ptr->location.mapGroup = gSaveBlock1Ptr->questLog[a0].unk_001;
+ gSaveBlock1Ptr->location.mapNum = gSaveBlock1Ptr->questLog[a0].unk_002;
+ gSaveBlock1Ptr->location.warpId = gSaveBlock1Ptr->questLog[a0].unk_003;
+ gSaveBlock1Ptr->pos.x = gSaveBlock1Ptr->questLog[a0].unk_004;
+ gSaveBlock1Ptr->pos.y = gSaveBlock1Ptr->questLog[a0].unk_006;
+ }
+ else
+ {
+ sp0.mapGroup = gSaveBlock1Ptr->questLog[a0].unk_001;
+ sp0.mapNum = gSaveBlock1Ptr->questLog[a0].unk_002;
+ sp0.warpId = gSaveBlock1Ptr->questLog[a0].unk_003;
+ sp0.x = gSaveBlock1Ptr->questLog[a0].unk_004;
+ sp0.y = gSaveBlock1Ptr->questLog[a0].unk_006;
+ sub_8055D5C(&sp0);
+ }
+}
+
+void sub_8111368(void)
+{
+ gUnknown_203ADFA = 2;
+ sub_806E6FC();
+ sub_809A2DC();
+ sub_809A2A4();
+ if (sub_8110AC8() == 1)
+ {
+ sub_8111274(gUnknown_203ADF8, 0);
+ gUnknown_3005024 = sub_8111038;
+ SetMainCallback2(sub_80572A8);
+ }
+ else
+ {
+ sub_8111274(gUnknown_203ADF8, 1);
+ warp_in();
+ gUnknown_3005024 = sub_8111000;
+ SetMainCallback2(sub_805726C);
+ }
+}
+
+void sub_81113E4(void)
+{
+ struct QuestLog * questLog = &gSaveBlock1Ptr->questLog[gUnknown_203ADF8];
+
+ CpuCopy16(questLog->flags, gSaveBlock1Ptr->flags, FLAGS_COUNT * sizeof(u8));
+ CpuCopy16(questLog->vars, gSaveBlock1Ptr->vars, VARS_COUNT * sizeof(u16));
+ sub_8111688();
+}
+
+struct PokemonAndSomethingElse
+{
+ struct Pokemon mon;
+ u16 unk_64;
+ u16 unk_66;
+};
+
+void sub_8111438(void)
+{
+ struct PokemonAndSomethingElse *r9 = AllocZeroed(sizeof(struct PokemonAndSomethingElse));
+ u16 r0, r3, r5, r6;
+
+ CreateMon(&r9->mon, SPECIES_RATTATA, 1, 0x20, FALSE, 0, 0, 0);
+ r0 = VarGet(VAR_0x4027);
+ r9->unk_64 = r0 >> 12;
+ r9->unk_66 = r0 % 0x1000;
+
+ r5 = sub_8111618();
+ if (r5 > r9->unk_64)
+ {
+ for (r3 = 0; r3 < r5 - r9->unk_64; r3++)
+ {
+ ZeroMonData(&gPlayerParty[5 - r3]);
+ }
+ }
+ else if (r5 < r9->unk_64)
+ {
+ for (r3 = 0; r3 < 5; r3++)
+ {
+ sub_808BCB4(0, r3);
+ }
+ for (r3 = r5; r3 < r9->unk_64; r3++)
+ {
+ CopyMon(&gPlayerParty[r3], &r9->mon, sizeof(struct Pokemon));
+ }
+ }
+
+ r5 = sub_811164C();
+ if (r5 > r9->unk_66)
+ {
+ for (r3 = 0; r3 < 14; r3++)
+ {
+ for (r6 = 0; r6 < 30; r6++)
+ {
+ if (GetBoxMonDataFromAnyBox(r3, r6, MON_DATA_SANITY_BIT2))
+ {
+ sub_808BCB4(r3, r6);
+ r5--;
+ if (r5 == r9->unk_66)
+ break;
+ }
+ }
+ if (r5 == r9->unk_66)
+ break;
+ }
+ }
+ else if (r5 < r9->unk_66)
+ {
+ for (r3 = 0; r3 < TOTAL_BOXES_COUNT; r3++)
+ {
+ for (r6 = 0; r6 < IN_BOX_COUNT; r6++)
+ {
+ struct BoxPokemon * boxMon = GetBoxedMonPtr(r3, r6);
+ if (!GetBoxMonData(boxMon, MON_DATA_SANITY_BIT2))
+ {
+ CopyMon(boxMon, &r9->mon.box, sizeof(struct BoxPokemon));
+ r5++;
+ if (r5 == r9->unk_66)
+ break;
+ }
+ }
+ if (r5 == r9->unk_66)
+ break;
+ }
+ }
+
+ Free(r9);
+}
+
+void sub_81115E8(void)
+{
+ u16 r4 = sub_8111618();
+ u16 r1 = sub_811164C();
+ VarSet(VAR_0x4027, (r4 << 12) + r1);
+}
+
+u16 sub_8111618(void)
+{
+ u16 count = 0;
+ u16 i;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_BIT2))
+ count++;
+ }
+
+ return count;
+}
+
+u16 sub_811164C(void)
+{
+ u16 count = 0;
+ u16 i, j;
+
+ for (i = 0; i < TOTAL_BOXES_COUNT; i++)
+ {
+ for (j = 0; j < IN_BOX_COUNT; j++)
+ {
+ if (GetBoxMonDataFromAnyBox(i, j, MON_DATA_SANITY_BIT2))
+ count++;
+ }
+ }
+
+ return count;
+}
+
+void sub_8111688(void)
+{
+ u16 i, j;
+ u16 sp0[4];
+
+ for (i = 0; i < 4; i++)
+ {
+ sp0[i] = VarGet(VAR_0x40AA + i);
+
+ for (j = 0; j < 16; j++)
+ {
+ if (sp0[i] & 1)
+ gSaveBlock1Ptr->trainerRematches[16 * i + j] = 30;
+ else
+ gSaveBlock1Ptr->trainerRematches[16 * i + j] = 0;
+ sp0[i] >>= 1;
+ }
+ }
+}
+
+void sub_8111708(void)
+{
+ struct MapHeader sp0;
+
+ gSaveBlock1Ptr->mapDataId = VarGet(VAR_0x40AE);
+ if (gSaveBlock1Ptr->mapDataId == 0)
+ {
+ sp0 = *get_mapheader_by_bank_and_number(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum);
+ gSaveBlock1Ptr->mapDataId = sp0.mapDataId;
+ }
+}
+
+void sub_811175C(u8 a0, struct UnkStruct_203AE98 * a1)
+{
+ u16 i;
+ u16 *r4;
+ u16 r6 = 0;
+ u16 r9 = 0;
+
+ memset(a1, 0, 32 * sizeof(struct UnkStruct_203AE98));
+ for (i = 0; i < 32; i++)
+ {
+ gUnknown_203AE0C[i] = NULL;
+ }
+
+ r4 = gSaveBlock1Ptr->questLog[a0].unk_568;
+ for (i = 0; i < 32; i++)
+ {
+ switch (r4[0] & 0xFFF)
+ {
+ case 0:
+ r4 = sub_8113D08(r4, &a1[r6]);
+ r6++;
+ break;
+ case 1:
+ case 2:
+ r4 = sub_8113D94(r4, &a1[r6]);
+ r6++;
+ break;
+ case 39:
+ r4 = sub_8113C20(r4, &a1[r6]);
+ r6++;
+ break;
+ case 41:
+ r4 = sub_8113C8C(r4, &a1[r6]);
+ r6++;
+ break;
+ default:
+ r4 = sub_8113A78(r4, &gUnknown_203AE0C[r9]);
+ if (r9 == 0)
+ sub_8113ABC(gUnknown_203AE0C[0]);
+ r9++;
+ break;
+ }
+ if (r4 == NULL)
+ break;
+ }
+}
+
+void sub_81118F4(s8 a0)
+{
+ fade_screen(1, a0);
+ gUnknown_203AE8C = sub_8111914;
+}
+
+void sub_8111914(void)
+{
+ if (!gPaletteFade.active)
+ {
+ ScriptContext2_Enable();
+ if (++gUnknown_203ADF8 < 4 && gSaveBlock1Ptr->questLog[gUnknown_203ADF8].unk_000)
+ {
+ gUnknown_203ADF9--;
+ sub_8111368();
+ }
+ else
+ {
+ gUnknown_3005E88 = 0;
+ sub_8111984();
+ }
+ }
+}
+
+void sub_8111984(void)
+{
+ sub_806E6FC();
+ Save_ResetSaveCounters();
+ Save_LoadGameData(0);
+ SetMainCallback2(sub_8057430);
+ gUnknown_3005024 = sub_8111F60;
+ FreeAllWindowBuffers();
+ gUnknown_203ADFA = 3;
+ gUnknown_203AE8C = NULL;
+}
+
+void sub_81119C8(void)
+{
+ sub_8111914();
+}
+
+bool8 sub_81119D4(void (*a0)(void))
+{
+ u8 taskId;
+
+ switch (gUnknown_203ADFA)
+ {
+ case 1:
+ sub_8112364();
+ break;
+ case 2:
+ gUnknown_3005E88 = 3;
+ taskId = CreateTask(sub_8111A34, 80);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = 0;
+ SetWordTaskArg(taskId, 14, (u32)a0);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_8111A34(u8 taskId)
+{
+ void (*routine)(void);
+ s16 * data = gTasks[taskId].data;
+
+ switch (data[1])
+ {
+ case 0:
+ if (++data[0] == 0x7F)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gUnknown_203AE94.unk_0_6 = 2;
+ data[1]++;
+ }
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ {
+ gUnknown_3005E88 = 0;
+ routine = (void (*)(void)) GetWordTaskArg(taskId, 14);
+ if (routine != NULL)
+ routine();
+ DestroyTask(taskId);
+ gUnknown_203AE8C = sub_8111914;
+ }
+ break;
+ }
+}
+
+void sub_8111AD8(void)
+{
+ if (gUnknown_203AE94.unk_0_0 == 1)
+ {
+ if (--gUnknown_203AE94.unk_2 != 0)
+ return;
+ gUnknown_203AE94.unk_0_0 = 0;
+ gUnknown_203AE94.unk_0_4 = 1;
+ sub_8112888(2);
+ }
+
+ if (gUnknown_203AE94.unk_0_4 == 1)
+ {
+ if (++gUnknown_203AE94.unk_3 > 15)
+ {
+ sub_8111E20();
+ gUnknown_203AE94.unk_0_4 = 0;
+ gUnknown_203AE94.unk_3 = 0;
+ }
+ }
+ if (gUnknown_203AE94.unk_1 < 32)
+ {
+ if (sub_8113B44(gUnknown_203AE0C[gUnknown_203AE94.unk_1]) == 1)
+ sub_8111B80();
+ else if (sub_8113AE8(gUnknown_203AE0C[gUnknown_203AE94.unk_1]) == 1)
+ sub_8111B80();
+ }
+}
+
+void sub_8111B80(void)
+{
+ if (gUnknown_203AE94.unk_0_0 == 0)
+ {
+ gUnknown_203AE94.unk_0_0 = 1;
+ gUnknown_203AE94.unk_0_4 = 0;
+ gUnknown_203AE94.unk_3 = 0;
+ gUnknown_203AE94.unk_2 = sub_8111BD4();
+ if (gUnknown_203B044.unk_2 == 0)
+ gUnknown_203AE94.unk_1++;
+ if (gUnknown_203AE94.unk_1 > 32)
+ return;
+ sub_8111D10();
+ }
+ sub_8112888(1);
+}
+
+u8 sub_8111BD4(void)
+{
+ u16 i;
+ u16 count = 0;
+
+ for (i = 0; i < 0x400 && gStringVar4[i] != EOS; i++)
+ {
+ if (gStringVar4[i] != CHAR_NEWLINE)
+ count++;
+ }
+
+ if (count < 20)
+ return 0x5F;
+ if (count < 36)
+ return 0x7F;
+ if (count < 46)
+ return 0xBF;
+ return 0xFF;
+}
+
+bool8 sub_8111C2C(void)
+{
+ if (gUnknown_203ADFA != 2)
+ return FALSE;
+ if (gUnknown_3005E88 == 0 || gUnknown_203AE94.unk_0_0 == 1 || gUnknown_203AE94.unk_0_0 == 2)
+ return TRUE;
+ return FALSE;
+}
+
+void sub_8111C68(void)
+{
+ if (gUnknown_203AE94.unk_0_6 == 0)
+ {
+ if (gMain.newKeys & A_BUTTON)
+ {
+ gUnknown_203AE94.unk_0_6 = 2;
+ gUnknown_3005E88 = 0;
+ sub_81118F4(-3);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ gUnknown_203AE94.unk_0_6 = 1;
+ gUnknown_3005E88 = 0;
+ sub_8111E64(-3);
+ }
+ }
+}
+
+bool8 sub_8111CD0(void)
+{
+ if (gUnknown_203AE94.unk_0_6 != 0)
+ return TRUE;
+ return FALSE;
+}
+
+void sub_8111CF0(void)
+{
+ if (gUnknown_203ADFA == 2)
+ sub_8111070(gUnknown_203ADF9);
+}
+
+void sub_8111D10(void)
+{
+ u16 i;
+ u8 count = 0;
+
+ for (i = 0; i < 0x100 && gStringVar4[i] != EOS; i++)
+ {
+ if (gStringVar4[i] == CHAR_NEWLINE)
+ count++;
+ }
+
+ PutWindowTilemap(gUnknown_203ADFE[2]);
+ sub_8111D90(gUnknown_203ADFE[2]);
+ AddTextPrinterParametrized2(gUnknown_203ADFE[2], 2, 2, gUnknown_8456698[count], 1, 0, &gUnknown_8456634, 0, gStringVar4);
+ schedule_bg_copy_tilemap_to_vram(0);
+}
+
+void sub_8111D90(u8 a0)
+{
+ const u16 * src = gUnknown_8456638;
+ u16 * buffer = Alloc(0x1680);
+ u8 i, j, y;
+
+ if (buffer)
+ {
+ for (i = 0; i < 6; i++)
+ {
+ switch (i)
+ {
+ default:
+ y = 1;
+ break;
+ case 0:
+ y = 0;
+ break;
+ case 5:
+ y = 2;
+ break;
+ }
+
+ // r6 = y * 32
+ // r5 = 2 * (i % 16)
+ // r4 = j
+ for (j = 0; j < 30; j++)
+ {
+ CpuCopy32(src + 16 * y, buffer + 16 * (2 * (15 * i) + j), 32);
+ }
+ }
+
+ CopyToWindowPixelBuffer(a0, (const u8 *)buffer, 0x1680, 0);
+ Free(buffer);
+ }
+}
+
+void sub_8111E20(void)
+{
+ ClearWindowTilemap(gUnknown_203ADFE[2]);
+ FillWindowPixelRect(gUnknown_203ADFE[2], 15, 0, 0, 0xf0, 0x30);
+ CopyWindowToVram(gUnknown_203ADFE[2], 2);
+ PutWindowTilemap(gUnknown_203ADFE[1]);
+ CopyWindowToVram(gUnknown_203ADFE[1], 1);
+}
+
+void sub_8111E64(s8 a0)
+{
+ fade_screen(1, a0);
+ gUnknown_203AE8C = sub_8111E84;
+}
+
+void sub_8111E84(void)
+{
+ if (!gPaletteFade.active)
+ {
+ ScriptContext2_Enable();
+ for (gUnknown_203ADF8 = gUnknown_203ADF8; gUnknown_203ADF8 < 4; gUnknown_203ADF8++)
+ {
+ if (gSaveBlock1Ptr->questLog[gUnknown_203ADF8].unk_000 == 0)
+ break;
+ sub_811175C(gUnknown_203ADF8, gUnknown_203AE98);
+ }
+ gUnknown_3005E88 = 0;
+ sub_8111984();
+ }
+}
+
+void sub_8111F14(void)
+{
+ if (gUnknown_203ADFA == 3)
+ gUnknown_203AE90 = AllocZeroed(0x200 * sizeof(u16));
+}
+
+void sub_8111F38(u16 a0, u16 a1)
+{
+ CpuSet(gPlttBufferUnfaded + a0, gUnknown_203AE90 + a0, a1);
+}
+
+bool8 sub_8111F60(void)
+{
+ LoadPalette(stdpal_get(4), 0xF0, 0x20);
+ sub_8111070(0);
+ sub_807DF7C();
+ CreateTask(sub_8111F8C, 0xFF);
+ return TRUE;
+}
+
+void sub_8111F8C(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ if (ScriptContext2_IsEnabled() != TRUE)
+ {
+ player_bitmagic();
+ sub_805C270();
+ sub_805C780();
+ ScriptContext2_Enable();
+ task->func = sub_8111FCC;
+ }
+}
+
+void sub_8111FCC(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ if (!gPaletteFade.active)
+ {
+ if (gUnknown_203AE94.unk_0_6 != 1)
+ {
+ sub_80C4DF8(gStringVar1, gMapHeader.regionMapSectionId);
+ StringExpandPlaceholders(gStringVar4, gUnknown_841B073);
+ sub_8111D10();
+ }
+ task->data[0] = 0;
+ task->data[1] = 0;
+ task->func = sub_8112044;
+ player_bitmagic();
+ ScriptContext2_Enable();
+ }
+}
+
+void sub_8112044(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON) || task->data[0] >= 0x7f || gUnknown_203AE94.unk_0_6 == 1)
+ {
+ sub_8111E20();
+ task->data[0] = 0;
+ task->func = sub_81120AC;
+ gUnknown_203ADFA = 0;
+ }
+ else
+ task->data[0]++;
+}
+
+void sub_81120AC(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+ u8 i;
+
+ switch (data[0])
+ {
+ case 0:
+ gUnknown_2031DD8 = 0;
+ sub_8055DC4();
+ sub_811229C();
+ FillWindowPixelRect(gUnknown_203ADFE[0], 0xF, 0, 0, gUnknown_845661C[0].width * 8, gUnknown_845661C[0].height * 8);
+ data[0]++;
+ break;
+ case 1:
+ if (sub_81121D8(taskId))
+ {
+ for (i = 0; i < 3; i++)
+ {
+ ClearWindowTilemap(gUnknown_203ADFE[i]);
+ CopyWindowToVram(gUnknown_203ADFE[i], 1);
+ RemoveWindow(gUnknown_203ADFE[i]);
+ }
+ data[1] = 0;
+ data[0]++;
+ }
+ break;
+ case 2:
+ if (data[1] < 32)
+ data[1]++;
+ else
+ data[0]++;
+ break;
+ default:
+ if (gUnknown_203AE94.unk_0_6 == 1)
+ sub_8098110(1);
+ CpuCopy16(gUnknown_203AE90, gPlttBufferUnfaded, 0x400);
+ Free(gUnknown_203AE90);
+ gUnknown_203AE94 = (struct UnkStruct_203AE94){};
+ sub_80696C0();
+ ScriptContext2_Disable();
+ gTextFlags.flag_2 = FALSE;
+ gUnknown_2036E28 = 0;
+ sub_8082740(0);
+ gUnknown_3005ECC = 1;
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+bool8 sub_81121D8(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+
+ if (data[1] > 15)
+ return TRUE;
+
+ sub_80716F8(gPlttBufferUnfaded + 0x01, gPlttBufferFaded + 0x01, 0xDF, 0x0F - data[1]);
+ sub_80716F8(gPlttBufferUnfaded + 0x100, gPlttBufferFaded + 0x100, 0x100, 0x0F - data[1]);
+ FillWindowPixelRect(gUnknown_203ADFE[0], 0x00, 0, gUnknown_845661C[0].height * 8 - 1 - data[1], gUnknown_845661C[0].width * 8, 1);
+ FillWindowPixelRect(gUnknown_203ADFE[1], 0x00, 0, data[1], gUnknown_845661C[1].width * 8, 1);
+ CopyWindowToVram(gUnknown_203ADFE[0], 2);
+ CopyWindowToVram(gUnknown_203ADFE[1], 2);
+ data[1]++;
+ return FALSE;
+}
+
+void sub_811229C(void)
+{
+ u16 * buffer = Alloc(0x400);
+ CpuCopy16(gUnknown_203AE90, buffer, 0x400);
+ sub_807B0C4(gUnknown_203AE90, gUnknown_203AE90, 0xd0);
+ sub_807B0C4(gUnknown_203AE90 + 0x110, gUnknown_203AE90 + 0x110, 0x10);
+ sub_807B0C4(gUnknown_203AE90 + 0x160, gUnknown_203AE90 + 0x160, 0x40);
+ sub_807B0C4(gUnknown_203AE90 + 0x1b0, gUnknown_203AE90 + 0x1b0, 0x50);
+ CpuCopy16(gUnknown_203AE90, gPlttBufferUnfaded, 0x400);
+ CpuCopy16(buffer, gUnknown_203AE90, 0x400);
+ Free(buffer);
+}
+
+void sub_811231C(void)
+{
+ if (gUnknown_203ADFA == 1)
+ {
+ sub_8110E68(gUnknown_203AE98);
+ sub_8110E3C();
+ gUnknown_203ADFA = 0;
+ gUnknown_203AE8C = NULL;
+ gUnknown_203AE04 = NULL;
+ gUnknown_203AE08 = NULL;
+ gUnknown_3005E88 = 0;
+ }
+}
+
+void sub_8112364(void)
+{
+ if (gUnknown_3005E88 && gUnknown_203ADFA == 1)
+ {
+ sub_8110E68(gUnknown_203AE98);
+ sub_8113A1C(1);
+ sub_8110E3C();
+ gUnknown_3005E88 = 0;
+ gUnknown_203ADFA = 0;
+ gUnknown_203AE8C = NULL;
+ }
+ gUnknown_203AE04 = NULL;
+ gUnknown_203AE08 = NULL;
+}
+
+void sub_81123BC(void)
+{
+ struct QuestLog * buffer = AllocZeroed(4 * sizeof(struct QuestLog));
+ u8 i;
+ u8 r4 = gUnknown_203ADF8;
+ u8 count = 0;
+ for (i = 0; i < 4; i++)
+ {
+ if (r4 > 3)
+ r4 = 0;
+ if (gSaveBlock1Ptr->questLog[r4].unk_000)
+ {
+ buffer[count] = gSaveBlock1Ptr->questLog[r4];
+ count++;
+ }
+ r4++;
+ }
+ gUnknown_203ADF8 = count % 4;
+ CpuCopy16(buffer, gSaveBlock1Ptr->questLog, 4 * sizeof(struct QuestLog));
+ Free(buffer);
+}
+
+void sub_8112450(void)
+{
+ if (sub_80BF708() != 1)
+ {
+ sub_8112364();
+ sub_81123BC();
+ }
+}
+
+void sub_811246C(struct Sprite *sprite)
+{
+ struct MapObject *mapObject = &gMapObjects[sprite->data[0]];
+ if (mapObject->localId == 0xFF)
+ {
+ if (gUnknown_203AF9A[0][0] != 0xFF)
+ {
+ sub_8063CA4(mapObject, gUnknown_203AF9A[0][0]);
+ gUnknown_203AF9A[0][0] = 0xFF;
+ }
+ if (gUnknown_203AF9A[0][1] != 0xFF)
+ {
+ sub_8150454();
+ gUnknown_203AF9A[0][1] = 0xFF;
+ }
+ sub_8063E28(mapObject, sprite);
+ }
+ else
+ {
+ if (gUnknown_203AF9A[mapObject->localId][0] != 0xFF)
+ {
+ sub_8063CA4(mapObject, gUnknown_203AF9A[mapObject->localId][0]);
+ gUnknown_203AF9A[mapObject->localId][0] = 0xFF;
+ }
+ sub_8063E28(mapObject, sprite);
+ }
+}
+
+void sub_81124EC(u8 a0, u8 a1, u8 a2, u8 a3)
+{
+ if (!sub_8112CEC())
+ {
+ gUnknown_3005E94[gUnknown_203AF98].unk_4 = gUnknown_203B01A;
+ gUnknown_3005E94[gUnknown_203AF98].unk_6 = 0;
+ gUnknown_3005E94[gUnknown_203AF98].unk_0 = a0;
+ gUnknown_3005E94[gUnknown_203AF98].unk_1 = a1;
+ gUnknown_3005E94[gUnknown_203AF98].unk_2 = a2;
+ gUnknown_3005E94[gUnknown_203AF98].unk_3 = a3;
+ gUnknown_203AF98++;
+ gUnknown_203B01A = 0;
+ }
+}
+
+void sub_8112588(u8 a0, u8 a1, u8 a2, u8 a3, u8 a4)
+{
+ if (!sub_8112D1C())
+ {
+ gUnknown_3005E94[gUnknown_203AF98].unk_4 = gUnknown_203B01A;
+ gUnknown_3005E94[gUnknown_203AF98].unk_6 = 0;
+ gUnknown_3005E94[gUnknown_203AF98].unk_0 = a0;
+ gUnknown_3005E94[gUnknown_203AF98].unk_1 = a1;
+ gUnknown_3005E94[gUnknown_203AF98].unk_2 = a2;
+ gUnknown_3005E94[gUnknown_203AF98].unk_3 = a3;
+ gUnknown_203AF98++;
+ gUnknown_203B01A = a4;
+ }
+}
+
+void sub_8112628(u8 a0)
+{
+ if (!sub_8112CEC())
+ {
+ if (a0 != gUnknown_3005E94[gUnknown_203B01C].unk_3 || a0 > 3)
+ {
+ gUnknown_3005E94[gUnknown_203AF98].unk_4 = gUnknown_203B01A;
+ gUnknown_3005E94[gUnknown_203AF98].unk_6 = 0;
+ gUnknown_3005E94[gUnknown_203AF98].unk_0 = 0;
+ gUnknown_3005E94[gUnknown_203AF98].unk_3 = a0;
+ gUnknown_203B01C = gUnknown_203AF98;
+ gUnknown_203AF98++;
+ gUnknown_203B01A = 0;
+ }
+ }
+}
+
+void sub_81126AC(u8 a0, u8 a1)
+{
+ if (!sub_8112D1C())
+ {
+ gUnknown_3005E94[gUnknown_203AF98].unk_4 = gUnknown_203B01A;
+ gUnknown_3005E94[gUnknown_203AF98].unk_6 = 0;
+ gUnknown_3005E94[gUnknown_203AF98].unk_0 = 0;
+ gUnknown_3005E94[gUnknown_203AF98].unk_3 = a0;
+ gUnknown_203B01C = gUnknown_203AF98;
+ gUnknown_203AF98++;
+ gUnknown_203B01A = a1;
+ }
+}
+
+void sub_8112720(u8 a0)
+{
+ if (!sub_8112D1C())
+ {
+ gUnknown_3005E94[gUnknown_203AF98].unk_4 = gUnknown_203B01A;
+ gUnknown_3005E94[gUnknown_203AF98].unk_6 = 1;
+ gUnknown_3005E94[gUnknown_203AF98].unk_0 = 0;
+ gUnknown_3005E94[gUnknown_203AF98].unk_3 = a0;
+ gUnknown_203AF98++;
+ gUnknown_203B01A = 0;
+ }
+}
+
+void sub_811278C(u8 a0, u8 a1)
+{
+ if (!sub_8112D1C())
+ {
+ gUnknown_3005E94[gUnknown_203AF98].unk_4 = gUnknown_203B01A;
+ gUnknown_3005E94[gUnknown_203AF98].unk_6 = 1;
+ gUnknown_3005E94[gUnknown_203AF98].unk_0 = 0;
+ gUnknown_3005E94[gUnknown_203AF98].unk_3 = a0;
+ gUnknown_203AF98++;
+ gUnknown_203B01A = a1;
+ }
+}
+
+void sub_81127F8(struct UnkStruct_3005E90 * a0)
+{
+ if (gUnknown_203AF98 < gUnknown_3005E8C)
+ {
+ u32 r2 = *(u32 *)a0 & 0x00FF00F3;
+ gUnknown_3005E94[gUnknown_203AF98].unk_4 = gUnknown_203B01A;
+ gUnknown_3005E94[gUnknown_203AF98].unk_6 = 2;
+ gUnknown_3005E94[gUnknown_203AF98].unk_0 = r2;
+ gUnknown_3005E94[gUnknown_203AF98].unk_1 = r2 >> 8;
+ gUnknown_3005E94[gUnknown_203AF98].unk_2 = r2 >> 16;
+ gUnknown_3005E94[gUnknown_203AF98].unk_3 = r2 >> 24;
+ gUnknown_203AF98++;
+ if (ScriptContext2_IsEnabled())
+ gUnknown_203B01A = TRUE;
+ else
+ gUnknown_203B01A = FALSE;
+ }
+}
+
+void sub_8112888(u8 a0)
+{
+ switch (a0)
+ {
+ case 1:
+ if (gUnknown_3005E88 == 1)
+ gUnknown_3005E88 = 3;
+ break;
+ case 2:
+ if (gUnknown_3005E88 == 3)
+ gUnknown_3005E88 = 1;
+ break;
+ }
+}
+
+void sub_81128BC(u8 a0)
+{
+ u8 r1 = sub_8112CAC();
+
+ switch (a0)
+ {
+ case 1:
+ if (r1 == 1)
+ gUnknown_3005E88 = 3;
+ else if (r1 == 2)
+ {
+ gUnknown_3005E94[gUnknown_203AF98].unk_4 = gUnknown_203B01A;
+ gUnknown_3005E94[gUnknown_203AF98].unk_6 = 3;
+ gUnknown_203AF98++;
+ gUnknown_203B01A = 0;
+ gUnknown_3005E88 = 4;
+ }
+ break;
+ case 2:
+ if (r1 == 1)
+ gUnknown_3005E88 = 1;
+ else if (r1 == 2)
+ gUnknown_3005E88 = 2;
+ break;
+ }
+}
+
+void sub_8112940(u8 a0, struct UnkStruct_203AE98 *a1, u16 a2)
+{
+ s32 i;
+
+ switch (a0)
+ {
+ default:
+ gUnknown_3005E88 = 0;
+ break;
+ case 1:
+ gUnknown_3005E94 = a1;
+ gUnknown_3005E8C = a2 / 8;
+ for (i = 0; i < 0x40; i++)
+ {
+ gUnknown_203AF9A[i][0] |= 0xFF;
+ gUnknown_203AF9A[i][1] |= 0xFF;
+ }
+ gUnknown_203AF98 = 0;
+ gUnknown_203B01C = 0;
+ gUnknown_3005E90 = (struct UnkStruct_3005E90){};
+ gUnknown_203B01A = gUnknown_3005E94[gUnknown_203AF98].unk_4;
+ gUnknown_203AF9A[0][0] = gUnknown_3005E94[gUnknown_203AF98].unk_3;
+ gUnknown_203AF9A[0][1] = 0xFF;
+ gUnknown_3005E88 = 1;
+ break;
+ case 2:
+ gUnknown_3005E94 = a1;
+ gUnknown_3005E8C = a2 / 8;
+ for (i = 0; i < gUnknown_3005E8C; i++)
+ {
+ gUnknown_3005E94[i] = (struct UnkStruct_203AE98){ 0, 0, 0, 0, 0xFFFF, 0xFF };
+ }
+ gUnknown_203AF98 = 0;
+ gUnknown_203B01A = 0;
+ gUnknown_3005E94[gUnknown_203AF98].unk_4 = 0;
+ gUnknown_3005E94[gUnknown_203AF98].unk_6 = 0;
+ gUnknown_3005E94[gUnknown_203AF98].unk_0 = 0;
+ switch (player_get_direction_lower_nybble())
+ {
+ case 0:
+ case 1:
+ gUnknown_3005E94[gUnknown_203AF98].unk_3 = 0;
+ break;
+ case 4:
+ gUnknown_3005E94[gUnknown_203AF98].unk_3 = 3;
+ break;
+ case 2:
+ gUnknown_3005E94[gUnknown_203AF98].unk_3 = 1;
+ break;
+ case 3:
+ gUnknown_3005E94[gUnknown_203AF98].unk_3 = 2;
+ break;
+ }
+ gUnknown_203B01C = 0;
+ gUnknown_203AF98++;
+ gUnknown_3005E94[gUnknown_203AF98].unk_4 = 0;
+ gUnknown_3005E94[gUnknown_203AF98].unk_6 = 2;
+ gUnknown_3005E94[gUnknown_203AF98].unk_0 = 0;
+ gUnknown_3005E94[gUnknown_203AF98].unk_1 = 0;
+ gUnknown_3005E94[gUnknown_203AF98].unk_2 = 0;
+ gUnknown_3005E94[gUnknown_203AF98].unk_3 = 0;
+ gUnknown_203AF98++;
+ gUnknown_3005E88 = 2;
+ break;
+ }
+}
+
+#ifdef NONMATCHING
+void sub_8112B3C(void)
+{
+ switch (gUnknown_3005E88)
+ {
+ case 0:
+ break;
+ case 1:
+ if (sub_8112CEC())
+ {
+ if (gUnknown_203B01A != 0)
+ gUnknown_203B01A--;
+ else
+ {
+ while (1)
+ {
+ switch (gUnknown_3005E94[gUnknown_203AF98].unk_6)
+ {
+ case 0:
+ gUnknown_203AF9A[gUnknown_3005E94[gUnknown_203AF98].unk_0][0] = gUnknown_3005E94[gUnknown_203AF98].unk_3;
+ break;
+ case 1:
+ gUnknown_203AF9A[gUnknown_3005E94[gUnknown_203AF98].unk_0][1] = gUnknown_3005E94[gUnknown_203AF98].unk_3;
+ break;
+ case 2:
+ *(u32 *)&gUnknown_3005E90 = ((gUnknown_3005E94[gUnknown_203AF98].unk_3 << 24) | (gUnknown_3005E94[gUnknown_203AF98].unk_2 << 16) | (gUnknown_3005E94[gUnknown_203AF98].unk_1 << 8) | (gUnknown_3005E94[gUnknown_203AF98].unk_0 << 0));
+ break;
+ case 3:
+ gUnknown_3005E88 = 3;
+ break;
+ case 0xFE:
+ break;
+ case 0xFF:
+ gUnknown_3005E88 = 0;
+ break;
+ }
+ if (gUnknown_3005E88 == 0)
+ break;
+ if (++gUnknown_203AF98 >= gUnknown_3005E8C)
+ {
+ gUnknown_3005E88 = 0;
+ break;
+ }
+ gUnknown_203B01A = gUnknown_3005E94[gUnknown_203AF98].unk_4;
+ if (gUnknown_3005E88 == 3)
+ break;
+ if (gUnknown_203B01A == 0)
+ continue;
+ if (gUnknown_203B01A == 0xFFFF)
+ break;
+ }
+ }
+ }
+ else if (gUnknown_203AF98 >= gUnknown_3005E8C)
+ gUnknown_3005E88 = 0;
+ break;
+ case 2:
+ if (ScriptContext2_IsEnabled() != 1)
+ gUnknown_203B01A++;
+ if (gUnknown_203AF98 >= gUnknown_3005E8C)
+ gUnknown_3005E88 = 0;
+ break;
+ case 3:
+ break;
+ case 4:
+ break;
+ }
+}
+#else
+NAKED
+void sub_8112B3C(void)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tldr r0, _08112B54 @ =gUnknown_3005E88\n"
+ "\tldrb r0, [r0]\n"
+ "\tcmp r0, 0x4\n"
+ "\tbls _08112B48\n"
+ "\tb _08112C84\n"
+ "_08112B48:\n"
+ "\tlsls r0, 2\n"
+ "\tldr r1, _08112B58 @ =_08112B5C\n"
+ "\tadds r0, r1\n"
+ "\tldr r0, [r0]\n"
+ "\tmov pc, r0\n"
+ "\t.align 2, 0\n"
+ "_08112B54: .4byte gUnknown_3005E88\n"
+ "_08112B58: .4byte _08112B5C\n"
+ "\t.align 2, 0\n"
+ "_08112B5C:\n"
+ "\t.4byte _08112C84\n"
+ "\t.4byte _08112B70\n"
+ "\t.4byte _08112C5E\n"
+ "\t.4byte _08112C84\n"
+ "\t.4byte _08112C84\n"
+ "_08112B70:\n"
+ "\tbl sub_8112CEC\n"
+ "\tlsls r0, 24\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _08112B7C\n"
+ "\tb _08112C72\n"
+ "_08112B7C:\n"
+ "\tldr r0, _08112B8C @ =gUnknown_203B01A\n"
+ "\tldrh r1, [r0]\n"
+ "\tadds r7, r0, 0\n"
+ "\tcmp r1, 0\n"
+ "\tbeq _08112B90\n"
+ "\tsubs r0, r1, 0x1\n"
+ "\tstrh r0, [r7]\n"
+ "\tb _08112C84\n"
+ "\t.align 2, 0\n"
+ "_08112B8C: .4byte gUnknown_203B01A\n"
+ "_08112B90:\n"
+ "\tldr r5, _08112B98 @ =gUnknown_3005E88\n"
+ "\tldr r4, _08112B9C @ =gUnknown_203AF98\n"
+ "\tldr r6, _08112BA0 @ =gUnknown_3005E94\n"
+ "\tb _08112BD4\n"
+ "\t.align 2, 0\n"
+ "_08112B98: .4byte gUnknown_3005E88\n"
+ "_08112B9C: .4byte gUnknown_203AF98\n"
+ "_08112BA0: .4byte gUnknown_3005E94\n"
+ "_08112BA4:\n"
+ "\tldrh r0, [r4]\n"
+ "\tadds r0, 0x1\n"
+ "\tstrh r0, [r4]\n"
+ "\tldr r1, _08112BF0 @ =gUnknown_3005E8C\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tldrh r1, [r1]\n"
+ "\tcmp r0, r1\n"
+ "\tbcs _08112C58\n"
+ "\tldrh r0, [r4]\n"
+ "\tldr r1, [r6]\n"
+ "\tlsls r0, 3\n"
+ "\tadds r0, r1\n"
+ "\tldrh r0, [r0, 0x4]\n"
+ "\tstrh r0, [r7]\n"
+ "\tcmp r2, 0x3\n"
+ "\tbeq _08112C84\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r1, r0, 16\n"
+ "\tcmp r1, 0\n"
+ "\tbeq _08112BD4\n"
+ "\tldr r0, _08112BF4 @ =0x0000ffff\n"
+ "\tcmp r1, r0\n"
+ "\tbne _08112C84\n"
+ "_08112BD4:\n"
+ "\tldrh r0, [r4]\n"
+ "\tldr r1, [r6]\n"
+ "\tlsls r0, 3\n"
+ "\tadds r3, r0, r1\n"
+ "\tldrb r0, [r3, 0x6]\n"
+ "\tcmp r0, 0x2\n"
+ "\tbeq _08112C2C\n"
+ "\tcmp r0, 0x2\n"
+ "\tbgt _08112BF8\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _08112C0C\n"
+ "\tcmp r0, 0x1\n"
+ "\tbeq _08112C18\n"
+ "\tb _08112C50\n"
+ "\t.align 2, 0\n"
+ "_08112BF0: .4byte gUnknown_3005E8C\n"
+ "_08112BF4: .4byte 0x0000ffff\n"
+ "_08112BF8:\n"
+ "\tcmp r0, 0xFE\n"
+ "\tbeq _08112C50\n"
+ "\tcmp r0, 0xFE\n"
+ "\tbgt _08112C06\n"
+ "\tcmp r0, 0x3\n"
+ "\tbeq _08112C4E\n"
+ "\tb _08112C50\n"
+ "_08112C06:\n"
+ "\tcmp r0, 0xFF\n"
+ "\tbeq _08112C4C\n"
+ "\tb _08112C50\n"
+ "_08112C0C:\n"
+ "\tldr r0, _08112C14 @ =gUnknown_203AF9A\n"
+ "\tldrb r1, [r3]\n"
+ "\tlsls r1, 1\n"
+ "\tb _08112C20\n"
+ "\t.align 2, 0\n"
+ "_08112C14: .4byte gUnknown_203AF9A\n"
+ "_08112C18:\n"
+ "\tldr r0, _08112C28 @ =gUnknown_203AF9A\n"
+ "\tldrb r1, [r3]\n"
+ "\tlsls r1, 1\n"
+ "\tadds r0, 0x1\n"
+ "_08112C20:\n"
+ "\tadds r1, r0\n"
+ "\tldrb r0, [r3, 0x3]\n"
+ "\tstrb r0, [r1]\n"
+ "\tb _08112C50\n"
+ "\t.align 2, 0\n"
+ "_08112C28: .4byte gUnknown_203AF9A\n"
+ "_08112C2C:\n"
+ "\tldr r2, _08112C48 @ =gUnknown_3005E90\n"
+ "\tldrb r1, [r3, 0x3]\n"
+ "\tlsls r1, 24\n"
+ "\tldrb r0, [r3, 0x2]\n"
+ "\tlsls r0, 16\n"
+ "\torrs r1, r0\n"
+ "\tldrb r0, [r3, 0x1]\n"
+ "\tlsls r0, 8\n"
+ "\torrs r1, r0\n"
+ "\tldrb r0, [r3]\n"
+ "\torrs r1, r0\n"
+ "\tstr r1, [r2]\n"
+ "\tb _08112C50\n"
+ "\t.align 2, 0\n"
+ "_08112C48: .4byte gUnknown_3005E90\n"
+ "_08112C4C:\n"
+ "\tmovs r0, 0\n"
+ "_08112C4E:\n"
+ "\tstrb r0, [r5]\n"
+ "_08112C50:\n"
+ "\tldrb r2, [r5]\n"
+ "\tcmp r2, 0\n"
+ "\tbne _08112BA4\n"
+ "\tb _08112C84\n"
+ "_08112C58:\n"
+ "\tmovs r0, 0\n"
+ "\tstrb r0, [r5]\n"
+ "\tb _08112C84\n"
+ "_08112C5E:\n"
+ "\tbl ScriptContext2_IsEnabled\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tcmp r0, 0x1\n"
+ "\tbeq _08112C84\n"
+ "\tldr r1, _08112C8C @ =gUnknown_203B01A\n"
+ "\tldrh r0, [r1]\n"
+ "\tadds r0, 0x1\n"
+ "\tstrh r0, [r1]\n"
+ "_08112C72:\n"
+ "\tldr r0, _08112C90 @ =gUnknown_203AF98\n"
+ "\tldr r1, _08112C94 @ =gUnknown_3005E8C\n"
+ "\tldrh r0, [r0]\n"
+ "\tldrh r1, [r1]\n"
+ "\tcmp r0, r1\n"
+ "\tbcc _08112C84\n"
+ "\tldr r1, _08112C98 @ =gUnknown_3005E88\n"
+ "\tmovs r0, 0\n"
+ "\tstrb r0, [r1]\n"
+ "_08112C84:\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+ "_08112C8C: .4byte gUnknown_203B01A\n"
+ "_08112C90: .4byte gUnknown_203AF98\n"
+ "_08112C94: .4byte gUnknown_3005E8C\n"
+ "_08112C98: .4byte gUnknown_3005E88");
+}
+#endif
+
+void sub_8112C9C(void)
+{
+ gUnknown_203B01A++;
+}
+
+u8 sub_8112CAC(void)
+{
+ switch (gUnknown_3005E88)
+ {
+ case 0:
+ default:
+ return 0;
+ case 1:
+ case 3:
+ return 1;
+ case 2:
+ case 4:
+ return 2;
+ }
+}
+
+bool8 sub_8112CEC(void)
+{
+ if (gUnknown_203AF98 >= gUnknown_3005E8C || ScriptContext2_IsEnabled() == TRUE)
+ return TRUE;
+ return FALSE;
+}
+
+bool8 sub_8112D1C(void)
+{
+ if (gUnknown_203AF98 >= gUnknown_3005E8C)
+ return TRUE;
+ return FALSE;
+}
+
+const struct UnkStruct_300201C gUnknown_84566A4 = {
+ 0,
+ FALSE,
+ 0x7FFF
+};
+
+u16 * sub_8112D40(u8 a0, u16 a1)
+{
+ u16 * response;
+ if (gUnknown_203AF98 == 0)
+ return NULL;
+ if (gUnknown_203AF98 >= gUnknown_3005E8C)
+ return NULL;
+ if (gUnknown_203B01E >= gUnknown_3002020)
+ return NULL;
+ if (gUnknown_300201C[gUnknown_203B01E].unk_0_0 == a1 && gUnknown_300201C[gUnknown_203B01E].unk_0_f == a0)
+ {
+ response = &gUnknown_300201C[gUnknown_203B01E].unk_2;
+ gUnknown_203B01E++;
+ }
+ else
+ response = NULL;
+ return response;
+}
+
+void sub_8112DB0(u8 a0, u16 a1, u16 a2)
+{
+ if (gUnknown_203AF98 == 0)
+ return;
+ if (gUnknown_203AF98 >= gUnknown_3005E8C)
+ return;
+ if (gUnknown_203B01E >= gUnknown_3002020)
+ return;
+ gUnknown_300201C[gUnknown_203B01E].unk_0_0 = a1;
+ gUnknown_300201C[gUnknown_203B01E].unk_0_f = a0;
+ gUnknown_300201C[gUnknown_203B01E].unk_2 = a2;
+ gUnknown_203B01E++;
+}
+
+void sub_8112E3C(u8 a0, struct UnkStruct_300201C * a1, u16 a2)
+{
+ s32 i;
+
+ if (a0 == 0 || a0 > 2)
+ gUnknown_3005E88 = 0;
+ else
+ {
+ gUnknown_300201C = a1;
+ gUnknown_3002020 = a2 >> 2;
+ gUnknown_203B01E = 0;
+ if (a0 == 2)
+ {
+ for (i = 0; i < gUnknown_3005E8C; i++)
+ {
+ gUnknown_300201C[i] = gUnknown_84566A4;
+ }
+ }
+ }
+}
+
+const u16 gUnknown_84566A8[][16] = INCBIN_U16("data/graphics/unknown_84566a8.bin");
+
+const struct WindowTemplate gUnknown_8456928 = {
+ 0x00, 0, 15, 30, 5, 15, 0x008F
+};
+
+void sub_8112EA8(void)
+{
+ gUnknown_203B020 = 0xFF;
+}
+
+u8 sub_8112EB4(void)
+{
+ if (gUnknown_203B020 == 0xFF)
+ {
+ gUnknown_203B020 = AddWindow(&gUnknown_8456928);
+ PutWindowTilemap(gUnknown_203B020);
+ }
+ return gUnknown_203B020;
+}
+
+void sub_8112EDC(u8 a0)
+{
+ if (gUnknown_203B020 != 0xFF)
+ {
+ FillWindowPixelBuffer(gUnknown_203B020, 0x00);
+ ClearWindowTilemap(gUnknown_203B020);
+
+ if (a0)
+ CopyWindowToVram(gUnknown_203B020, a0);
+
+ RemoveWindow(gUnknown_203B020);
+ gUnknown_203B020 = 0xFF;
+ }
+}
+
+#ifdef NONMATCHING
+void sub_8112F18(u8 a0)
+{
+ u8 width = GetWindowAttribute(a0, WINDOW_WIDTH);
+ u8 height = GetWindowAttribute(a0, WINDOW_HEIGHT);
+ u8 * buffer = Alloc(32 * width * height);
+ u8 i, j;
+ u8 k;
+
+ if (buffer)
+ {
+ for (i = 0; i < height; i++)
+ {
+ for (j = 0; j < width; j++)
+ {
+ if (i == 0)
+ k = 0;
+ else if (i == height - 1)
+ k = 14;
+ else
+ k = 5;
+ CpuCopy32(
+ gUnknown_84566A8[k], // operand swap on "add" instruction
+ buffer + 32 * (i * width + j),
+ 32
+ );
+ }
+ }
+ CopyToWindowPixelBuffer(a0, buffer, width * height * 32, 0);
+ Free(buffer);
+ }
+}
+#else
+NAKED
+void sub_8112F18(u8 a0)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tmov r7, r10\n"
+ "\tmov r6, r9\n"
+ "\tmov r5, r8\n"
+ "\tpush {r5-r7}\n"
+ "\tsub sp, 0x8\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tmov r10, r0\n"
+ "\tmovs r1, 0x3\n"
+ "\tbl GetWindowAttribute\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r6, r0, 24\n"
+ "\tmov r0, r10\n"
+ "\tmovs r1, 0x4\n"
+ "\tbl GetWindowAttribute\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r7, r0, 24\n"
+ "\tlsls r0, r7, 5\n"
+ "\tmuls r0, r6\n"
+ "\tbl Alloc\n"
+ "\tmov r8, r0\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _08112FB8\n"
+ "\tmovs r5, 0\n"
+ "\tadds r0, r6, 0\n"
+ "\tmuls r0, r7\n"
+ "\tstr r0, [sp]\n"
+ "\tcmp r5, r7\n"
+ "\tbcs _08112FA2\n"
+ "_08112F5A:\n"
+ "\tmovs r4, 0\n"
+ "\tadds r1, r5, 0x1\n"
+ "\tmov r9, r1\n"
+ "\tcmp r4, r6\n"
+ "\tbcs _08112F98\n"
+ "\tsubs r3, r7, 0x1\n"
+ "_08112F66:\n"
+ "\tmovs r0, 0\n"
+ "\tcmp r5, 0\n"
+ "\tbeq _08112F74\n"
+ "\tmovs r0, 0x5\n"
+ "\tcmp r5, r3\n"
+ "\tbne _08112F74\n"
+ "\tmovs r0, 0xE\n"
+ "_08112F74:\n"
+ "\tlsls r0, 5\n"
+ "\tldr r1, _08112FC8 @ =gUnknown_84566A8\n"
+ "\tadds r0, r1, r0\n"
+ "\tadds r1, r5, 0\n"
+ "\tmuls r1, r6\n"
+ "\tadds r1, r4\n"
+ "\tlsls r1, 5\n"
+ "\tadd r1, r8\n"
+ "\tldr r2, _08112FCC @ =0x04000008\n"
+ "\tstr r3, [sp, 0x4]\n"
+ "\tbl CpuSet\n"
+ "\tadds r0, r4, 0x1\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r4, r0, 24\n"
+ "\tldr r3, [sp, 0x4]\n"
+ "\tcmp r4, r6\n"
+ "\tbcc _08112F66\n"
+ "_08112F98:\n"
+ "\tmov r1, r9\n"
+ "\tlsls r0, r1, 24\n"
+ "\tlsrs r5, r0, 24\n"
+ "\tcmp r5, r7\n"
+ "\tbcc _08112F5A\n"
+ "_08112FA2:\n"
+ "\tldr r0, [sp]\n"
+ "\tlsls r2, r0, 21\n"
+ "\tlsrs r2, 16\n"
+ "\tmov r0, r10\n"
+ "\tmov r1, r8\n"
+ "\tmovs r3, 0\n"
+ "\tbl CopyToWindowPixelBuffer\n"
+ "\tmov r0, r8\n"
+ "\tbl Free\n"
+ "_08112FB8:\n"
+ "\tadd sp, 0x8\n"
+ "\tpop {r3-r5}\n"
+ "\tmov r8, r3\n"
+ "\tmov r9, r4\n"
+ "\tmov r10, r5\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+ "_08112FC8: .4byte gUnknown_84566A8\n"
+ "_08112FCC: .4byte 0x04000008");
+}
+#endif
+
+void sub_8112FD0(void)
+{
+ sub_8112F18(gUnknown_203B020);
+}
+
+const struct TextColor gUnknown_8456930 = {
+ 0, 10, 2
+};
+
+void sub_8112FE4(const u8 * a0)
+{
+ AddTextPrinterParametrized2(gUnknown_203B020, 0x02, 2, 5, 1, 1, &gUnknown_8456930, -1, a0);
+}
+
+void sub_8113018(const u8 * a0, u8 a1)
+{
+ sub_8112FD0();
+ sub_8112FE4(a0);
+ if (a1)
+ CopyWindowToVram(gUnknown_203B020, a1);
+}
+
+void sub_8113044(void)
+{
+ VarSet(VAR_0x4038, 0);
+ VarSet(VAR_0x4039, 0);
+}
+
+void sub_8113064(void)
+{
+ sub_8113078(VAR_0x4038_STRUCT);
+}
+
+void sub_8113078(struct Var4038Struct * varPtr)
+{
+ if (sub_8113508(varPtr))
+ {
+ sub_81132E0(varPtr);
+ VarSet(VAR_0x4039, gSaveBlock2Ptr->playTimeHours);
+ }
+}
+
+void sub_81130A8(void)
+{
+ sub_81130BC(VAR_0x4038_STRUCT);
+}
+
+void sub_81130BC(struct Var4038Struct * varPtr)
+{
+ if (!varPtr->unk_0_7)
+ {
+ sub_8113524(varPtr);
+ sub_8113390(varPtr);
+ VarSet(VAR_0x4039, gSaveBlock2Ptr->playTimeHours);
+ FlagClear(FLAG_0x06C);
+ FlagClear(FLAG_0x06D);
+ FlagClear(FLAG_0x06E);
+ FlagClear(FLAG_0x06F);
+ VarSet(VAR_0x4073, 1);
+ }
+}
+
+ALIGNED(4) const u8 gUnknown_8456934[] = {2, 1, 2, 1};
+
+u8 sub_8113114(struct Var4038Struct * a0, u8 a1)
+{
+ if (VarGet(VAR_0x4073) == 2)
+ {
+ if (a0->unk_0_0 + gUnknown_8456934[a1] >= 20)
+ {
+ if (sub_81132A0(a0) < 3)
+ {
+ sub_8113194(a0);
+ a0->unk_0_0 = 0;
+ }
+ else
+ a0->unk_0_0 = 20;
+ }
+ else
+ a0->unk_0_0 += gUnknown_8456934[a1];
+ }
+
+ return a0->unk_0_0;
+}
+
+const u8 gUnknown_8456938[] = {
+ 1, 3, 5, 0, 7, 6, 4, 2
+};
+
+u8 sub_8113194(struct Var4038Struct * a0)
+{
+ u8 i;
+ u8 retval = 0;
+
+ for (i = 0; i < 8; i++)
+ {
+ if (!((a0->unk_1 >> gUnknown_8456938[i]) & 1))
+ {
+ retval = i;
+ if (Random() % 2)
+ {
+ a0->unk_1 |= 1 << gUnknown_8456938[i];
+ return gUnknown_8456938[i];
+ }
+ }
+ }
+ a0->unk_1 |= 1 << gUnknown_8456938[retval];
+ return gUnknown_8456938[retval];
+}
+
+const u8 gUnknown_8456940[] = {
+ 5, 6, 3, 7, 4, 1, 0, 2
+};
+
+u8 sub_81131FC(struct Var4038Struct * a0)
+{
+ u8 i;
+ u8 retval = 0;
+
+ if (sub_81132A0(a0) == 1)
+ return 0;
+
+ for (i = 0; i < 8; i++)
+ {
+ if ((a0->unk_1 >> gUnknown_8456940[i]) & 1)
+ {
+ retval = i;
+ if (Random() % 2)
+ {
+ a0->unk_1 ^= 1 << gUnknown_8456940[i];
+ return gUnknown_8456940[i];
+ }
+ }
+ }
+ if ((a0->unk_1 >> gUnknown_8456940[retval]) & 1)
+ a0->unk_1 ^= 1 << gUnknown_8456940[retval];
+ return gUnknown_8456940[retval];
+}
+
+u16 sub_8113288(void)
+{
+ return sub_81132A0(VAR_0x4038_STRUCT);
+}
+
+u16 sub_81132A0(struct Var4038Struct * a0)
+{
+ u8 count = 0;
+ u8 i;
+
+ for (i = 0; i < 8; i++)
+ {
+ if ((a0->unk_1 >> i) & 1)
+ count++;
+ }
+
+ return count;
+}
+
+void sub_81132CC(void)
+{
+ sub_81132E0(VAR_0x4038_STRUCT);
+}
+
+void sub_81132E0(struct Var4038Struct * a0)
+{
+ u8 i = 0;
+ u16 var_4039;
+
+ if (gSaveBlock2Ptr->playTimeHours < 999)
+ {
+ while (1)
+ {
+ if (sub_81132A0(a0) < 5)
+ {
+ VarSet(VAR_0x4039, gSaveBlock2Ptr->playTimeHours);
+ break;
+ }
+ if (i == 8)
+ break;
+ var_4039 = VarGet(VAR_0x4039);
+ if (gSaveBlock2Ptr->playTimeHours - var_4039 < 12)
+ break;
+ sub_81131FC(a0);
+ var_4039 = VarGet(VAR_0x4039);
+ VarSet(VAR_0x4039, var_4039 + 12);
+ i++;
+ }
+ }
+}
+
+bool16 sub_8113364(void)
+{
+ return sub_811337C(VAR_0x4038_STRUCT);
+}
+
+bool16 sub_811337C(struct Var4038Struct * a0)
+{
+ return (a0->unk_1 >> gSpecialVar_0x8004) & 1;
+}
+
+void sub_8113390(struct Var4038Struct * a0)
+{
+ a0->unk_1 |= 1;
+ a0->unk_1 |= 2;
+ a0->unk_1 |= 4;
+}
+
+void sub_81133A4(void)
+{
+ u8 r3 = 0;
+ u8 r2 = 0;
+
+ switch (gSpecialVar_0x8004)
+ {
+ case 0:
+ r2 = 0;
+ r3 = 0;
+ break;
+ case 1:
+ case 2:
+ case 3:
+ case 7:
+ break;
+ case 4:
+ r2 = 1;
+ r3 = 0;
+ break;
+ case 5:
+ r2 = 0;
+ r3 = 1;
+ break;
+ case 6:
+ r2 = 2;
+ r3 = 1;
+ break;
+ }
+ sub_8113414(&gSaveBlock2Ptr->linkBattleRecords, r3, r2);
+}
+
+void sub_8113414(struct LinkBattleRecords * a0, u8 a1, u8 a2)
+{
+ u8 * str;
+ const u8 * src = a0->entries[a1].name;
+ if (src[0] == EOS)
+ {
+ switch (a2)
+ {
+ case 0:
+ StringCopy(gStringVar1, gSaveBlock1Ptr->rivalName);
+ break;
+ case 1:
+ StringCopy(gStringVar1, gUnknown_84178D0);
+ break;
+ case 2:
+ StringCopy(gStringVar1, gUnknown_84178DA);
+ break;
+ default:
+ StringCopy(gStringVar1, gSaveBlock1Ptr->rivalName);
+ break;
+ }
+ }
+ else
+ {
+ str = gStringVar1;
+ StringCopyN(str, src, 7);
+ str[7] = EOS;
+ if ( str[0] == EXT_CTRL_CODE_BEGIN
+ && str[1] == EXT_CTRL_CODE_JPN)
+ {
+ str += 2;
+ while (*str != EOS)
+ str++;
+ *str++ = EXT_CTRL_CODE_BEGIN;
+ *str++ = EXT_CTRL_CODE_ENG;
+ *str++ = EOS;
+ }
+ }
+}
+
+void sub_81134B8(void)
+{
+ sub_81134CC(VAR_0x4038_STRUCT);
+}
+
+void sub_81134CC(struct Var4038Struct * a0)
+{
+ if (VarGet(VAR_0x4073) == 2)
+ {
+ sub_8113078(a0);
+ if (gUnknown_2023E8A == 1)
+ sub_8113194(a0);
+ else
+ sub_81131FC(a0);
+ }
+}
+
+bool8 sub_8113508(struct Var4038Struct * a0)
+{
+ return a0->unk_0_7;
+}
+
+void sub_8113510(void)
+{
+ sub_8113524(VAR_0x4038_STRUCT);
+}
+
+void sub_8113524(struct Var4038Struct * a0)
+{
+ a0->unk_0_7 = TRUE;
+}
+
+u8 sub_8113530(void)
+{
+ return sub_8113114(VAR_0x4038_STRUCT, gSpecialVar_0x8004);
+}
+
+static u16 * (*const sQuestLogStorageCBs[])(u16 *, const u16 *) = {
+ NULL,
+ NULL,
+ NULL,
+ sub_8113F14,
+ sub_8113F80,
+ sub_8114174,
+ sub_81141D0,
+ sub_811422C,
+ sub_8114288,
+ sub_8114310,
+ sub_8114380,
+ sub_81143F0,
+ sub_811445C,
+ sub_81144EC,
+ sub_8114578,
+ sub_8114604,
+ sub_8114710,
+ sub_8114744,
+ sub_8114778,
+ sub_8114808,
+ sub_811488C,
+ sub_8114918,
+ sub_8114990,
+ sub_8114A1C,
+ sub_8114AA0,
+ sub_8114B0C,
+ sub_8114B78,
+ sub_8114BE4,
+ sub_8114C68,
+ sub_8114CC0,
+ sub_8114D4C,
+ sub_8114DE8,
+ sub_8114FF0,
+ sub_8115078,
+ sub_81151C0,
+ sub_8115280,
+ sub_8115410,
+ sub_81154DC,
+ sub_81155A4,
+ NULL,
+ sub_81156D8,
+ NULL,
+ sub_81157DC
+};
+
+#ifdef NONMATCHING
+void sub_8113550(u16 a0, const u16 * a1)
+{
+ u16 * r1;
+
+ if (a0 == 35 && gUnknown_203B048 == 2)
+ {
+ sub_811381C();
+ return;
+ }
+ sub_811381C();
+ if (gUnknown_203ADFA == 2)
+ return;
+
+ if (a0 < 3 || a0 > 26)
+ return;
+
+ if (sub_81136D4() == TRUE)
+ return;
+
+ if (sub_81138A0(a0, a1) == TRUE)
+ return;
+
+ if (sub_80BF708() == TRUE)
+ return;
+
+ // NONMATCHING: branch logic here
+ if (InUnionRoom() == TRUE)
+ return;
+
+ if (sub_8113954(a0, a1) == TRUE)
+ return;
+
+ if (sub_8113A44(a0, a1) == TRUE)
+ return;
+
+ if (sub_81153E4(a0, a1) == FALSE)
+ return;
+
+ if (gUnknown_3005E88 == 0)
+ {
+ if (sub_8113778(a0, a1) == TRUE)
+ return;
+
+ if (a0 != 31 || gUnknown_203AE04 == NULL)
+ {
+ if (sub_81153A8(a0, a1) == FALSE)
+ return;
+ sub_8110AEC(a0);
+ }
+ }
+ else if (a0 == 40)
+ return;
+
+ sub_8113B94(a0);
+ if (a0 == 31)
+ {
+ if (gUnknown_203AE04 == NULL)
+ {
+ gUnknown_203AE04 = gUnknown_203AE08;
+ r1 = sQuestLogStorageCBs[a0](gUnknown_203AE04, a1);
+ }
+ else
+ {
+ sQuestLogStorageCBs[a0](gUnknown_203AE04, a1);
+ return;
+ }
+ }
+ else
+ {
+ gUnknown_203AE04 = NULL;
+ r1 = sQuestLogStorageCBs[a0](gUnknown_203AE08, a1);
+ }
+
+ if (r1 == NULL)
+ {
+ r1 = sub_8113828(a0, a1);
+ if (r1 == NULL)
+ return;
+ }
+
+ gUnknown_203AE08 = r1;
+ if (gUnknown_203B048 == 0)
+ return;
+ sub_811231C();
+}
+#else
+NAKED
+void sub_8113550(u16 a0, const u16 * a1)
+{
+ asm_unified("\tpush {r4,r5,lr}\n"
+ "\tadds r5, r1, 0\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r4, r0, 16\n"
+ "\tcmp r4, 0x23\n"
+ "\tbne _08113570\n"
+ "\tldr r0, _0811356C @ =gUnknown_203B048\n"
+ "\tldrb r0, [r0]\n"
+ "\tcmp r0, 0x2\n"
+ "\tbne _08113570\n"
+ "\tbl sub_811381C\n"
+ "\tb ._return\n"
+ "\t.align 2, 0\n"
+ "_0811356C: .4byte gUnknown_203B048\n"
+ "_08113570:\n"
+ "\tbl sub_811381C\n"
+ "\tldr r0, _0811362C @ =gUnknown_203ADFA\n"
+ "\tldrb r0, [r0]\n"
+ "\tcmp r0, 0x2\n"
+ "\tbne _0811357E\n"
+ "\tb ._return\n"
+ "_0811357E:\n"
+ "\tsubs r0, r4, 0x3\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tcmp r0, 0x27\n"
+ "\tbls _0811358A\n"
+ "\tb ._return\n"
+ "_0811358A:\n"
+ "\tbl sub_81136D4\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tcmp r0, 0x1\n"
+ "\tbne _08113598\n"
+ "\tb ._return\n"
+ "_08113598:\n"
+ "\tadds r0, r4, 0\n"
+ "\tadds r1, r5, 0\n"
+ "\tbl sub_81138A0\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tcmp r0, 0x1\n"
+ "\tbne _081135AA\n"
+ "\tb ._return\n"
+ "_081135AA:\n"
+ "\tbl sub_80BF708\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tcmp r0, 0x1\n"
+ "\tbne _081135B8\n"
+ "\tb ._return\n"
+ "_081135B8:\n"
+ "\tbl InUnionRoom\n"
+ "\tcmp r0, 0x1\n"
+ "\tbne _081135C2\n"
+ "\tb ._return\n"
+ "_081135C2:\n"
+ "\tadds r0, r4, 0\n"
+ "\tadds r1, r5, 0\n"
+ "\tbl sub_8113954\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tcmp r0, 0x1\n"
+ "\tbeq ._return\n"
+ "\tadds r0, r4, 0\n"
+ "\tadds r1, r5, 0\n"
+ "\tbl sub_8113A44\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tcmp r0, 0x1\n"
+ "\tbeq ._return\n"
+ "\tadds r0, r4, 0\n"
+ "\tadds r1, r5, 0\n"
+ "\tbl sub_81153E4\n"
+ "\tlsls r0, 24\n"
+ "\tcmp r0, 0\n"
+ "\tbeq ._return\n"
+ "\tldr r0, _08113630 @ =gUnknown_3005E88\n"
+ "\tldrb r0, [r0]\n"
+ "\tcmp r0, 0\n"
+ "\tbne _08113638\n"
+ "\tadds r0, r4, 0\n"
+ "\tadds r1, r5, 0\n"
+ "\tbl sub_8113778\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tcmp r0, 0x1\n"
+ "\tbeq ._return\n"
+ "\tcmp r4, 0x1F\n"
+ "\tbne _08113614\n"
+ "\tldr r0, _08113634 @ =gUnknown_203AE04\n"
+ "\tldr r0, [r0]\n"
+ "\tcmp r0, 0\n"
+ "\tbne _0811363C\n"
+ "_08113614:\n"
+ "\tadds r0, r4, 0\n"
+ "\tadds r1, r5, 0\n"
+ "\tbl sub_81153A8\n"
+ "\tlsls r0, 24\n"
+ "\tcmp r0, 0\n"
+ "\tbeq ._return\n"
+ "\tadds r0, r4, 0\n"
+ "\tbl sub_8110AEC\n"
+ "\tb _0811363C\n"
+ "\t.align 2, 0\n"
+ "_0811362C: .4byte gUnknown_203ADFA\n"
+ "_08113630: .4byte gUnknown_3005E88\n"
+ "_08113634: .4byte gUnknown_203AE04\n"
+ "_08113638:\n"
+ "\tcmp r4, 0x28\n"
+ "\tbeq ._return\n"
+ "_0811363C:\n"
+ "\tadds r0, r4, 0\n"
+ "\tbl sub_8113B94\n"
+ "\tcmp r4, 0x1F\n"
+ "\tbne _0811367C\n"
+ "\tldr r2, _0811365C @ =gUnknown_203AE04\n"
+ "\tldr r1, [r2]\n"
+ "\tcmp r1, 0\n"
+ "\tbne _08113668\n"
+ "\tldr r0, _08113660 @ =gUnknown_203AE08\n"
+ "\tldr r0, [r0]\n"
+ "\tstr r0, [r2]\n"
+ "\tldr r1, _08113664 @ =sQuestLogStorageCBs\n"
+ "\tldr r2, [r1, 0x7C]\n"
+ "\tb _0811368E\n"
+ "\t.align 2, 0\n"
+ "_0811365C: .4byte gUnknown_203AE04\n"
+ "_08113660: .4byte gUnknown_203AE08\n"
+ "_08113664: .4byte sQuestLogStorageCBs\n"
+ "_08113668:\n"
+ "\tldr r0, _08113678 @ =sQuestLogStorageCBs\n"
+ "\tldr r2, [r0, 0x7C]\n"
+ "\tadds r0, r1, 0\n"
+ "\tadds r1, r5, 0\n"
+ "\tbl _call_via_r2\n"
+ "\tb ._return\n"
+ "\t.align 2, 0\n"
+ "_08113678: .4byte sQuestLogStorageCBs\n"
+ "_0811367C:\n"
+ "\tldr r1, _081136C4 @ =gUnknown_203AE04\n"
+ "\tmovs r0, 0\n"
+ "\tstr r0, [r1]\n"
+ "\tldr r0, _081136C8 @ =sQuestLogStorageCBs\n"
+ "\tlsls r1, r4, 2\n"
+ "\tadds r1, r0\n"
+ "\tldr r0, _081136CC @ =gUnknown_203AE08\n"
+ "\tldr r0, [r0]\n"
+ "\tldr r2, [r1]\n"
+ "_0811368E:\n"
+ "\tadds r1, r5, 0\n"
+ "\tbl _call_via_r2\n"
+ "\tadds r1, r0, 0\n"
+ "\tcmp r1, 0\n"
+ "\tbne _081136AC\n"
+ "\tbl sub_811231C\n"
+ "\tadds r0, r4, 0\n"
+ "\tadds r1, r5, 0\n"
+ "\tbl sub_8113828\n"
+ "\tadds r1, r0, 0\n"
+ "\tcmp r1, 0\n"
+ "\tbeq ._return\n"
+ "_081136AC:\n"
+ "\tldr r0, _081136CC @ =gUnknown_203AE08\n"
+ "\tstr r1, [r0]\n"
+ "\tldr r0, _081136D0 @ =gUnknown_203B048\n"
+ "\tldrb r0, [r0]\n"
+ "\tcmp r0, 0\n"
+ "\tbeq ._return\n"
+ "\tbl sub_811231C\n"
+ "._return:\n"
+ "\tpop {r4,r5}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+ "_081136C4: .4byte gUnknown_203AE04\n"
+ "_081136C8: .4byte sQuestLogStorageCBs\n"
+ "_081136CC: .4byte gUnknown_203AE08\n"
+ "_081136D0: .4byte gUnknown_203B048");
+}
+#endif // NONMATCHING
+
+bool8 sub_81136D4(void)
+{
+ if (gSaveBlock1Ptr->location.mapGroup == 2 && (gSaveBlock1Ptr->location.mapNum == 1 || gSaveBlock1Ptr->location.mapNum == 2 || gSaveBlock1Ptr->location.mapNum == 3 || gSaveBlock1Ptr->location.mapNum == 4 || gSaveBlock1Ptr->location.mapNum == 5 || gSaveBlock1Ptr->location.mapNum == 6 || gSaveBlock1Ptr->location.mapNum == 7 || gSaveBlock1Ptr->location.mapNum == 8 || gSaveBlock1Ptr->location.mapNum == 9 || gSaveBlock1Ptr->location.mapNum == 10 || gSaveBlock1Ptr->location.mapNum == 11))
+ return TRUE;
+
+ if (gSaveBlock1Ptr->location.mapGroup == 14 && gSaveBlock1Ptr->location.mapNum == 9)
+ return TRUE;
+
+ if (gSaveBlock1Ptr->location.mapGroup == 31 && (gSaveBlock1Ptr->location.mapNum == 0 || gSaveBlock1Ptr->location.mapNum == 1))
+ return TRUE;
+
+ if ((gSaveBlock1Ptr->location.mapGroup == 1 && gSaveBlock1Ptr->location.mapNum == 46) || (gSaveBlock1Ptr->location.mapGroup == 1 && gSaveBlock1Ptr->location.mapNum == 58) || (gSaveBlock1Ptr->location.mapGroup == 2 && gSaveBlock1Ptr->location.mapNum == 11) || (gSaveBlock1Ptr->location.mapGroup == 10 && gSaveBlock1Ptr->location.mapNum == 6))
+ return TRUE;
+
+ return FALSE;
+}
+
+bool8 sub_8113748(void)
+{
+ if (sub_81136D4() != TRUE)
+ return FALSE;
+
+ if (gUnknown_203ADFA == 2)
+ return TRUE;
+
+ if (gUnknown_203ADFA == 1)
+ sub_8112364();
+
+ return FALSE;
+}
+
+bool8 sub_8113778(u16 a0, u16 * a1)
+{
+ if (a0 == 36 || a0 == 11)
+ return TRUE;
+
+ if (!FlagGet(0x82C))
+ {
+ if (a0 == 3 || a0 == 31 || sub_81137E4(a0, a1) == TRUE)
+ return TRUE;
+ }
+
+ if (!FlagGet(0x844))
+ {
+ if (a0 == 4 || a0 == 5 || a0 == 6 || a0 == 7 || a0 == 8 || a0 == 9 || a0 == 10 || a0 == 22 || a0 == 25 || a0 == 26)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+bool8 sub_81137E4(u16 a0, u16 * a1)
+{
+ if (a0 == 34)
+ {
+ u8 trainerClass = gTrainers[*a1].trainerClass;
+ if ( trainerClass == 0x51
+ || trainerClass == 0x59
+ || trainerClass == 0x5A
+ || trainerClass == 0x53)
+ return FALSE;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_811381C(void)
+{
+ gUnknown_203B048 = 0;
+}
+
+u16 * sub_8113828(u16 a0, u16 * a1)
+{
+ if (sub_8113778(a0, a1) == TRUE)
+ return NULL;
+
+ if (sub_81153A8(a0, a1) == FALSE)
+ return NULL;
+
+ sub_8110AEC(a0);
+ sub_8113B94(a0);
+
+ if (a0 == 31)
+ gUnknown_203AE04 = gUnknown_203AE08;
+ else
+ gUnknown_203AE04 = NULL;
+
+ return sQuestLogStorageCBs[a0](gUnknown_203AE08, a1);
+}
+
+bool8 sub_81138A0(u16 a0, u16 * a1)
+{
+ if (a0 < 12 || a0 > 19)
+ return FALSE;
+
+ sub_81138F8();
+ gUnknown_203B024.unk_00 = a0;
+
+ if (a0 < 16 || a0 > 17)
+ {
+ if (a0 == 12 || a0 == 18)
+ memcpy(gUnknown_203B024.unk_04, a1, 12);
+ else
+ memcpy(gUnknown_203B024.unk_04, a1, 24);
+ }
+ return TRUE;
+}
+
+void sub_81138F8(void)
+{
+ gUnknown_203B024 = (struct UnkStruct_203B024){};
+}
+
+void sub_811390C(void)
+{
+ if (gUnknown_203B024.unk_00 != 0)
+ {
+ u16 * resp;
+ gUnknown_203B04A = 0;
+ sub_8110AEC(gUnknown_203B024.unk_00);
+ resp = sQuestLogStorageCBs[gUnknown_203B024.unk_00](gUnknown_203AE08, gUnknown_203B024.unk_04);
+ gUnknown_203AE08 = resp;
+ sub_81138F8();
+ }
+}
+
+bool8 sub_8113954(u16 a0, u16 * a1)
+{
+ if (a0 != 34 && a0 != 30 && a0 != 32 && a0 != 33)
+ return FALSE;
+ sub_81138F8();
+ if (gUnknown_3005E88 || FlagGet(0x82C) || sub_81137E4(a0, a1) != TRUE)
+ {
+ gUnknown_203B024.unk_00 = a0;
+ memcpy(gUnknown_203B024.unk_04, a1, 8);
+ }
+ return TRUE;
+}
+
+void sub_81139BC(void)
+{
+ if (gUnknown_203B024.unk_00 != 0)
+ {
+ u16 * resp;
+ if (gUnknown_3005E88 == 0)
+ {
+ gUnknown_203B04A = 0;
+ sub_8110AEC(gUnknown_203B024.unk_00);
+ }
+ sub_8113B94(gUnknown_203B024.unk_00);
+ resp = sQuestLogStorageCBs[gUnknown_203B024.unk_00](gUnknown_203AE08, gUnknown_203B024.unk_04);
+ gUnknown_203AE08 = resp;
+ sub_8113A1C(1);
+ sub_81138F8();
+ sub_811231C();
+ }
+}
+
+void sub_8113A1C(u16 a0)
+{
+ gUnknown_203AE08 = sub_8113C5C(gUnknown_203AE08, a0);
+ gUnknown_203AF98++;
+}
+
+bool8 sub_8113A44(u16 a0, u16 *a1)
+{
+ if (a0 != 31)
+ return FALSE;
+
+ if (sub_8114FBC(a1[0]) == TRUE)
+ return TRUE;
+
+ if (sub_8114FBC(a1[1]) == TRUE)
+ return TRUE;
+
+ return FALSE;
+}
+
+static const u16 * (*const sQuestLogScriptParsingCBs[])(const u16 *) = {
+ NULL,
+ NULL,
+ NULL,
+ sub_8113F3C,
+ sub_8113FBC,
+ sub_8114188,
+ sub_81141E4,
+ sub_8114240,
+ sub_811429C,
+ sub_8114324,
+ sub_8114394,
+ sub_811443C,
+ sub_811448C,
+ sub_8114518,
+ sub_81145A4,
+ sub_811464C,
+ sub_8114724,
+ sub_8114758,
+ sub_81147A8,
+ sub_8114834,
+ sub_81148BC,
+ sub_8114944,
+ sub_81149D0,
+ sub_8114A4C,
+ sub_8114AC8,
+ sub_8114B34,
+ sub_8114BA0,
+ sub_8114C0C,
+ sub_8114C8C,
+ sub_8114CE4,
+ sub_8114D68,
+ sub_8114E68,
+ sub_811500C,
+ sub_81150CC,
+ sub_81151DC,
+ sub_81152BC,
+ sub_8115460,
+ sub_8115518,
+ sub_81155E0,
+ NULL,
+ sub_8115700,
+ NULL,
+ sub_8115800
+};
+
+const u8 gUnknown_8456AA0[] = {
+ 0x08,
+ 0x08,
+ 0x08,
+ 0x08,
+ 0x0a,
+ 0x08,
+ 0x08,
+ 0x08,
+ 0x08,
+ 0x0a,
+ 0x0a,
+ 0x04,
+ 0x10,
+ 0x0c,
+ 0x0c,
+ 0x1a,
+ 0x04,
+ 0x04,
+ 0x10,
+ 0x0c,
+ 0x0a,
+ 0x0a,
+ 0x0a,
+ 0x08,
+ 0x08,
+ 0x08,
+ 0x08,
+ 0x06,
+ 0x06,
+ 0x06,
+ 0x0c,
+ 0x0c,
+ 0x0c,
+ 0x0a,
+ 0x0c,
+ 0x06,
+ 0x08,
+ 0x0e,
+ 0x0e,
+ 0x02,
+ 0x08,
+ 0x04,
+ 0x06
+};
+
+u16 * sub_8113A78(u16 * a0, u16 **a1)
+{
+ u16 r2 = a0[0] & 0xfff;
+ u16 r4 = a0[0] >> 12;
+ if (r2 == 33)
+ r4 = 0;
+ if (r2 < 3 || r2 > 42)
+ return NULL;
+ *a1 = a0;
+ return gUnknown_8456AA0[r2] + (gUnknown_8456AA0[r2] - 4) * r4 + (void *)a0;
+}
+
+void sub_8113ABC(u16 * a0)
+{
+ u8 * r2 = (u8 *)(a0 + 2);
+ if ((a0[0] & 0xFFF) != 35)
+ gUnknown_203B04A = 0;
+ else
+ gUnknown_203B04A = r2[1] + 1;
+}
+
+#ifdef NONMATCHING
+bool8 sub_8113AE8(u16 * a0)
+{
+ if (a0 == NULL || a0[1] > gUnknown_203AF98)
+ return FALSE;
+
+ sQuestLogScriptParsingCBs[a0[0] & 0xFFF](a0);
+ gUnknown_203B044.unk_0 = a0[0];
+ gUnknown_203B044.unk_1 = (a0[0] & 0xF000) >> 12;
+ if (gUnknown_203B044.unk_1 != 0)
+ gUnknown_203B044.unk_2 = 1;
+ return TRUE;
+}
+#else
+NAKED
+bool8 sub_8113AE8(u16 * a0)
+{
+ asm_unified("\tpush {r4,lr}\n"
+ "\tadds r4, r0, 0\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _08113AFA\n"
+ "\tldr r1, _08113B00 @ =gUnknown_203AF98\n"
+ "\tldrh r0, [r0, 0x2]\n"
+ "\tldrh r1, [r1]\n"
+ "\tcmp r0, r1\n"
+ "\tbls _08113B04\n"
+ "_08113AFA:\n"
+ "\tmovs r0, 0\n"
+ "\tb _08113B32\n"
+ "\t.align 2, 0\n"
+ "_08113B00: .4byte gUnknown_203AF98\n"
+ "_08113B04:\n"
+ "\tldr r2, _08113B38 @ =sQuestLogScriptParsingCBs\n"
+ "\tldrh r1, [r4]\n"
+ "\tldr r0, _08113B3C @ =0x00000fff\n"
+ "\tands r0, r1\n"
+ "\tlsls r0, 2\n"
+ "\tadds r0, r2\n"
+ "\tldr r1, [r0]\n"
+ "\tadds r0, r4, 0\n"
+ "\tbl _call_via_r1\n"
+ "\tldr r2, _08113B40 @ =gUnknown_203B044\n"
+ "\tldrh r1, [r4]\n"
+ "\tstrb r1, [r2]\n"
+ "\tmovs r0, 0xF0\n"
+ "\tlsls r0, 8\n"
+ "\tands r0, r1\n"
+ "\tlsrs r0, 12\n"
+ "\tstrb r0, [r2, 0x1]\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _08113B30\n"
+ "\tmovs r0, 0x1\n"
+ "\tstrh r0, [r2, 0x2]\n"
+ "_08113B30:\n"
+ "\tmovs r0, 0x1\n"
+ "_08113B32:\n"
+ "\tpop {r4}\n"
+ "\tpop {r1}\n"
+ "\tbx r1\n"
+ "\t.align 2, 0\n"
+ "_08113B38: .4byte sQuestLogScriptParsingCBs\n"
+ "_08113B3C: .4byte 0x00000fff\n"
+ "_08113B40: .4byte gUnknown_203B044");
+}
+#endif
+
+bool8 sub_8113B44(u16 * a0)
+{
+ if (gUnknown_203B044.unk_2 == 0)
+ return FALSE;
+
+ sQuestLogScriptParsingCBs[gUnknown_203B044.unk_0](a0);
+ gUnknown_203B044.unk_2++;
+ if (gUnknown_203B044.unk_2 > gUnknown_203B044.unk_1)
+ sub_8113B88();
+ return TRUE;
+}
+
+void sub_8113B88(void)
+{
+ gUnknown_203B044 = (struct UnkStruct_203B044){};
+}
+
+void sub_8113B94(u16 a0)
+{
+ if (gUnknown_203B044.unk_0 != (u8)a0 || gUnknown_203B044.unk_2 != gUnknown_203AF98)
+ {
+ gUnknown_203B044.unk_0 = a0;
+ gUnknown_203B044.unk_1 = 0;
+ gUnknown_203B044.unk_2 = gUnknown_203AF98;
+ }
+ else if (gUnknown_203B044.unk_1 < 5)
+ gUnknown_203B044.unk_1++;
+}
+
+void sub_8113BD8(void)
+{
+ gUnknown_203B049 = 0;
+ gUnknown_203B04A = 0;
+ gUnknown_203B04B = 0;
+}
+
+u16 * sub_8113BF4(u16 * a0)
+{
+ if (!sub_8110988(a0, gUnknown_8456AA0[39]))
+ return NULL;
+ a0[0] = 39;
+ return a0 + 1;
+}
+
+u16 * sub_8113C20(u16 * a0, struct UnkStruct_203AE98 * a1)
+{
+ if (!sub_8110988(a0, gUnknown_8456AA0[39]))
+ return NULL;
+ a1->unk_6 = 0xFF;
+ a1->unk_4 = 0;
+ a1->unk_0 = 0;
+ a1->unk_1 = 0;
+ a1->unk_2 = 0;
+ a1->unk_3 = 0;
+ return a0 + 1;
+}
+
+u16 * sub_8113C5C(u16 * a0, u16 a1)
+{
+ if (!sub_8110988(a0, gUnknown_8456AA0[41]))
+ return NULL;
+ a0[0] = 41;
+ a0[1] = a1;
+ return a0 + 2;
+}
+
+u16 * sub_8113C8C(u16 * a0, struct UnkStruct_203AE98 * a1)
+{
+ if (!sub_8110988(a0, gUnknown_8456AA0[41]))
+ return NULL;
+ a1->unk_6 = 0xFE;
+ a1->unk_4 = a0[1];
+ a1->unk_0 = 0;
+ a1->unk_1 = 0;
+ a1->unk_2 = 0;
+ a1->unk_3 = 0;
+ return a0 + 2;
+}
+
+u16 * sub_8113CC8(u16 * a0, struct UnkStruct_203AE98 * a1)
+{
+ u8 * r6 = (u8 *)a0 + 4;
+
+ if (!sub_8110988(a0, gUnknown_8456AA0[0]))
+ return NULL;
+ a0[0] = 0;
+ a0[1] = a1->unk_4;
+ r6[0] = a1->unk_0;
+ r6[1] = a1->unk_1;
+ r6[2] = a1->unk_2;
+ r6[3] = a1->unk_3;
+ return (u16 *)(r6 + 4);
+}
+
+u16 * sub_8113D08(u16 * a0, struct UnkStruct_203AE98 * a1)
+{
+ u8 * r6 = (u8 *)a0 + 4;
+
+ if (!sub_8110988(a0, gUnknown_8456AA0[0]))
+ return NULL;
+ a1->unk_6 = 2;
+ a1->unk_4 = a0[1];
+ a1->unk_0 = r6[0];
+ a1->unk_1 = r6[1];
+ a1->unk_2 = r6[2];
+ a1->unk_3 = r6[3];
+ return (u16 *)(r6 + 4);
+}
+
+u16 * sub_8113D48(u16 * a0, struct UnkStruct_203AE98 * a1)
+{
+ u16 * r4 = a0;
+ u8 * r6 = (u8 *)a0 + 4;
+
+ if (!sub_8110988(r4, gUnknown_8456AA0[2]))
+ return NULL;
+ if (a1->unk_6 == 0)
+ r4[0] = 2;
+ else
+ r4[0] = 1;
+ r4[1] = a1->unk_4;
+ r6[0] = a1->unk_0;
+ r6[1] = a1->unk_1;
+ r6[2] = a1->unk_2;
+ r6[3] = a1->unk_3;
+ return (u16 *)(r6 + 4);
+}
+
+u16 * sub_8113D94(u16 * a0, struct UnkStruct_203AE98 * a1)
+{
+ u16 * r5 = a0;
+ u8 * r6 = (u8 *)a0 + 4;
+
+ if (!sub_8110988(r5, gUnknown_8456AA0[2]))
+ return NULL;
+ if (r5[0] == 2)
+ a1->unk_6 = 0;
+ else
+ a1->unk_6 = 1;
+ a1->unk_4 = r5[1];
+ a1->unk_0 = r6[0];
+ a1->unk_1 = r6[1];
+ a1->unk_2 = r6[2];
+ a1->unk_3 = r6[3];
+ return (u16 *)(r6 + 4);
+}
+
+u16 * sub_8113DE0(u16 a0, u16 * a1)
+{
+ u8 r6;
+ u16 * r5;
+ u8 r4;
+ u8 r1;
+
+ if (gUnknown_203B044.unk_1 == 0)
+ r6 = gUnknown_8456AA0[a0];
+ else
+ r6 = gUnknown_8456AA0[a0] - 4;
+ if (!sub_8110944(a1, r6))
+ return NULL;
+
+ r5 = (void *)a1;
+
+ if (gUnknown_203B044.unk_1 != 0)
+ r5 = (void *)r5 - (gUnknown_203B044.unk_1 * r6 + 4);
+
+ if (gUnknown_203B044.unk_1 == 5)
+ {
+ for (r4 = 0; r4 < 4; r4++)
+ {
+ memcpy(
+ (void *)r5 + (r4 * r6 + 4),
+ (void *)r5 + ((r4 + 1) * r6 + 4),
+ r6
+ );
+ }
+ r1 = 4;
+ }
+ else
+ r1 = gUnknown_203B044.unk_1;
+
+ r5[0] = a0 + (r1 << 12);
+ r5[1] = gUnknown_203AF98;
+ r5 = (void *)r5 + (r1 * r6 + 4);
+ return r5;
+}
+
+const u16 * sub_8113E88(u16 a0, const u16 * a1)
+{
+ a1 = (const void *)a1 + (gUnknown_203B044.unk_2 * (gUnknown_8456AA0[a0] - 4) + 4);
+ return a1;
+}
+
+// TODO: delete this declaration once data_83FECCC.s is decompiled
+extern const u8 gText_EggNickname[];
+
+void QuestLog_AutoGetSpeciesName(u16 a0, u8 * a1, u8 a2)
+{
+ if (a1 != NULL)
+ {
+ if (a0 != SPECIES_EGG)
+ GetSpeciesName(a1, a0);
+ else
+ StringCopy(a1, gText_EggNickname);
+ }
+ else
+ {
+ if (a0 != SPECIES_EGG)
+ UnkTextUtil_SetPtrI(a2, gSpeciesNames[a0]);
+ else
+ UnkTextUtil_SetPtrI(a2, gText_EggNickname);
+ }
+}
+
+u16 * sub_8113F14(u16 * a0, const u16 * a1)
+{
+ u16 * r2 = sub_8113DE0(3, a0);
+ if (r2 == NULL)
+ return NULL;
+
+ r2[0] = a1[0];
+ r2[1] = a1[1];
+ return r2 + 2;
+}
+
+const u16 * sub_8113F3C(const u16 * a0)
+{
+ const u16 * r4 = sub_8113E88(3, a0);
+ QuestLog_AutoGetSpeciesName(r4[0], gStringVar1, 0);
+ QuestLog_AutoGetSpeciesName(r4[1], gStringVar2, 0);
+ StringExpandPlaceholders(gStringVar4, gUnknown_841A16F);
+ r4 += 2;
+ return r4;
+}
+
+u16 * sub_8113F80(u16 * a0, const u16 * a1)
+{
+ u16 * r2 = sub_8113DE0(4, a0);
+ if (r2 == NULL)
+ return NULL;
+
+ r2[0] = a1[0];
+ r2[1] = a1[2];
+ r2[2] = a1[3];
+
+ if (a1[0] == ITEM_ESCAPE_ROPE)
+ gUnknown_203B048 = 2;
+
+ return r2 + 3;
+}
+
+const u16 * sub_8113FBC(const u16 * a0)
+{
+ const u16 * r5 = sub_8113E88(4, a0);
+
+ switch (ItemId_GetPocket(r5[0]))
+ {
+ case POCKET_ITEMS:
+ case POCKET_POKE_BALLS:
+ case POCKET_BERRY_POUCH:
+ StringCopy(gStringVar1, ItemId_GetItem(r5[0])->name);
+ if (r5[0] == ITEM_ESCAPE_ROPE)
+ {
+ sub_80C4DF8(gStringVar2, r5[2]);
+ StringExpandPlaceholders(gStringVar4, gUnknown_841AFA6);
+ }
+ else if (r5[1] != 0xFFFF)
+ {
+ QuestLog_AutoGetSpeciesName(r5[1], gStringVar2, 0);
+ StringExpandPlaceholders(gStringVar4, gUnknown_841A1E7);
+ }
+ else
+ {
+ StringExpandPlaceholders(gStringVar4, gUnknown_841A210);
+ }
+ break;
+ case POCKET_KEY_ITEMS:
+ StringCopy(gStringVar1, ItemId_GetItem(r5[0])->name);
+ StringExpandPlaceholders(gStringVar4, gUnknown_841A220);
+ break;
+ case POCKET_TM_CASE:
+ QuestLog_AutoGetSpeciesName(r5[1], gStringVar1, 0);
+ StringCopy(gStringVar2, gMoveNames[ItemIdToBattleMoveId(r5[0])]);
+ if (r5[2] != 0xFFFF)
+ {
+ StringCopy(gStringVar3, gMoveNames[r5[2]]);
+ if (r5[0] > ITEM_TM50)
+ StringExpandPlaceholders(gStringVar4, gUnknown_841A965);
+ else
+ StringExpandPlaceholders(gStringVar4, gUnknown_841A277);
+ }
+ else
+ {
+ if (r5[0] > ITEM_TM50)
+ StringExpandPlaceholders(gStringVar4, gUnknown_841A938);
+ else
+ StringExpandPlaceholders(gStringVar4, gUnknown_841A255);
+ }
+ break;
+ }
+ return r5 + 3;
+}
+
+u16 * sub_811414C(u16 a0, u16 * a1, const u16 * a2)
+{
+ u16 * r1 = sub_8113DE0(a0, a1);
+ if (r1 == NULL)
+ return NULL;
+
+ r1[0] = a2[0];
+ r1[1] = a2[2];
+ return r1 + 2;
+}
+
+u16 * sub_8114174(u16 * a0, const u16 * a1)
+{
+ return sub_811414C(5, a0, a1);
+}
+
+const u16 * sub_8114188(const u16 * a0)
+{
+ const u16 * r4 = sub_8113E88(5, a0);
+ QuestLog_AutoGetSpeciesName(r4[1], gStringVar1, 0);
+ StringCopy(gStringVar2, ItemId_GetItem(r4[0])->name);
+ StringExpandPlaceholders(gStringVar4, gUnknown_841AB74);
+ r4 += 2;
+ return r4;
+}
+
+u16 * sub_81141D0(u16 * a0, const u16 * a1)
+{
+ return sub_811414C(6, a0, a1);
+}
+
+const u16 * sub_81141E4(const u16 * a0)
+{
+ const u16 * r4 = sub_8113E88(6, a0);
+
+ QuestLog_AutoGetSpeciesName(r4[1], gStringVar1, 0);
+ StringCopy(gStringVar2, ItemId_GetItem(r4[0])->name);
+ StringExpandPlaceholders(gStringVar4, gUnknown_841AB8E);
+ r4 += 2;
+ return r4;
+}
+
+u16 * sub_811422C(u16 * a0, const u16 * a1)
+{
+ return sub_811414C(7, a0, a1);
+}
+
+const u16 * sub_8114240(const u16 * a0)
+{
+ const u16 * r4 = sub_8113E88(7, a0);
+
+ QuestLog_AutoGetSpeciesName(r4[1], gStringVar2, 0);
+ StringCopy(gStringVar1, ItemId_GetItem(r4[0])->name);
+ StringExpandPlaceholders(gStringVar4, gUnknown_841A6A5);
+ r4 += 2;
+ return r4;
+}
+
+u16 * sub_8114288(u16 * a0, const u16 * a1)
+{
+ return sub_811414C(8, a0, a1);
+}
+
+const u16 * sub_811429C(const u16 * a0)
+{
+ const u16 * r4 = sub_8113E88(8, a0);
+
+ QuestLog_AutoGetSpeciesName(r4[1], gStringVar1, 0);
+ StringCopy(gStringVar2, ItemId_GetItem(r4[0])->name);
+ StringExpandPlaceholders(gStringVar4, gUnknown_841A1CD);
+ r4 += 2;
+ return r4;
+}
+
+u16 * sub_81142E4(u16 a0, u16 * a1, const u16 * a2)
+{
+ u16 * r1 = sub_8113DE0(a0, a1);
+ if (r1 == NULL)
+ return NULL;
+
+ r1[0] = a2[0];
+ r1[1] = a2[1];
+ r1[2] = a2[2];
+ return r1 + 3;
+}
+
+u16 * sub_8114310(u16 * a0, const u16 * a1)
+{
+ return sub_81142E4(9, a0, a1);
+}
+
+const u16 * sub_8114324(const u16 * a0)
+{
+ const u16 * r4 = sub_8113E88(9, a0);
+ QuestLog_AutoGetSpeciesName(r4[2], gStringVar1, 0);
+ StringCopy(gStringVar2, ItemId_GetItem(r4[0])->name);
+ StringCopy(gStringVar3, ItemId_GetItem(r4[1])->name);
+ StringExpandPlaceholders(gStringVar4, gUnknown_841A193);
+ r4 += 3;
+ return r4;
+}
+
+u16 * sub_8114380(u16 * a0, const u16 * a1)
+{
+ return sub_81142E4(10, a0, a1);
+}
+
+const u16 * sub_8114394(const u16 * a0)
+{
+ const u16 * r4 = sub_8113E88(10, a0);
+ QuestLog_AutoGetSpeciesName(r4[2], gStringVar2, 0);
+ StringCopy(gStringVar3, ItemId_GetItem(r4[0])->name);
+ StringCopy(gStringVar1, ItemId_GetItem(r4[1])->name);
+ StringExpandPlaceholders(gStringVar4, gUnknown_841A6E1);
+ r4 += 3;
+ return r4;
+}
+
+u16 * sub_81143F0(u16 * a0, const u16 * a1)
+{
+ u16 * r4 = a0;
+ if (gUnknown_203B044.unk_0 == 11 && gUnknown_203B044.unk_1 != 0)
+ return r4;
+
+ if (!sub_8110944(a0, gUnknown_8456AA0[11]))
+ return NULL;
+
+ r4[0] = 11;
+ r4[1] = gUnknown_203AF98;
+ return r4 + 2;
+}
+
+const u16 * sub_811443C(const u16 * a0)
+{
+ StringExpandPlaceholders(gStringVar4, gUnknown_841A2B0);
+ a0 += 2;
+ return a0;
+}
+
+u16 * sub_811445C(u16 * a0, const u16 * a1)
+{
+ u16 * r4 = a0 + 4;
+
+ a0[0] = 12;
+ a0[1] = gUnknown_203AF98;
+ a0[2] = a1[0];
+ a0[3] = a1[1];
+ a1 += 2;
+ memcpy(r4, a1, 7);
+ r4 += 4;
+ return r4;
+}
+
+const u16 * sub_811448C(const u16 * a0)
+{
+ const u16 * r6 = a0 + 4;
+
+ memset(gStringVar1, EOS, 8);
+ memcpy(gStringVar1, r6, 7);
+
+ sub_8115834(gStringVar1);
+ QuestLog_AutoGetSpeciesName(a0[3], gStringVar2, 0);
+ QuestLog_AutoGetSpeciesName(a0[2], gStringVar3, 0);
+ StringExpandPlaceholders(gStringVar4, gUnknown_841A3FF);
+ r6 += 4;
+ return r6;
+}
+
+const u8 *const gUnknown_8456ACC[] = {
+ gUnknown_841A74E,
+ gUnknown_841A756,
+ gUnknown_841A762
+};
+
+const u8 *const gUnknown_8456AD8[] = {
+ gUnknown_841AF98,
+ gUnknown_841A762,
+ gUnknown_841AF9F
+};
+
+const u8 *const gUnknown_8456AE4[] = {
+ gUnknown_841A502,
+ gUnknown_841A506,
+ gUnknown_841AFD1
+};
+
+u16 * sub_81144EC(u16 * a0, const u16 * a1)
+{
+ a0[0] = 13;
+ a0[1] = gUnknown_203AF98;
+ *((u8 *)a0 + 4) = *((const u8 *)a1 + 0);
+ memcpy((u8 *)a0 + 5, (const u8 *)a1 + 1, 7);
+ a0 += 6;
+ return a0;
+}
+
+const u16 * sub_8114518(const u16 * a0)
+{
+ UnkTextUtil_Reset();
+
+ memset(gStringVar1, EOS, 8);
+ memcpy(gStringVar1, (const u8 *)a0 + 5, 7);
+ sub_8115834(gStringVar1);
+ UnkTextUtil_SetPtrI(0, gStringVar1);
+ UnkTextUtil_SetPtrI(1, gUnknown_8456AE4[((const u8 *)a0)[4]]);
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A422);
+ a0 += 6;
+ return a0;
+}
+
+u16 * sub_8114578(u16 * a0, const u16 * a1)
+{
+ a0[0] = 14;
+ a0[1] = gUnknown_203AF98;
+ *((u8 *)a0 + 4) = *((const u8 *)a1 + 0);
+ memcpy((u8 *)a0 + 5, (const u8 *)a1 + 1, 7);
+ a0 += 6;
+ return a0;
+}
+
+const u16 * sub_81145A4(const u16 * a0)
+{
+ UnkTextUtil_Reset();
+
+ memset(gStringVar1, EOS, 8);
+ memcpy(gStringVar1, (const u8 *)a0 + 5, 7);
+ sub_8115834(gStringVar1);
+ UnkTextUtil_SetPtrI(0, gStringVar1);
+ UnkTextUtil_SetPtrI(1, gUnknown_8456AE4[((const u8 *)a0)[4]]);
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A477);
+ a0 += 6;
+ return a0;
+}
+
+u16 * sub_8114604(u16 * a0, const u16 * a1)
+{
+ a0[0] = 15;
+ a0[1] = gUnknown_203AF98;
+ *((u8 *)a0 + 4) = *((const u8 *)a1 + 0);
+ memcpy((u8 *)a0 + 5, (const u8 *)a1 + 1, 7);
+ memcpy((u8 *)a0 + 12, (const u8 *)a1 + 8, 7);
+ memcpy((u8 *)a0 + 19, (const u8 *)a1 + 15, 7);
+ a0 += 13;
+ return a0;
+}
+
+const u16 * sub_811464C(const u16 * a0)
+{
+ UnkTextUtil_Reset();
+
+ memset(gStringVar1, EOS, 8);
+ memset(gStringVar2, EOS, 8);
+ memset(gStringVar3, EOS, 8);
+ StringCopy7(gStringVar1, (const u8 *)a0 + 5);
+ StringCopy7(gStringVar2, (const u8 *)a0 + 12);
+ StringCopy7(gStringVar3, (const u8 *)a0 + 19);
+ sub_8115834(gStringVar1);
+ sub_8115834(gStringVar2);
+ sub_8115834(gStringVar3);
+ UnkTextUtil_SetPtrI(0, gSaveBlock2Ptr->playerName);
+ UnkTextUtil_SetPtrI(1, gStringVar1);
+ UnkTextUtil_SetPtrI(2, gStringVar2);
+ UnkTextUtil_SetPtrI(3, gStringVar3);
+ UnkTextUtil_SetPtrI(4, gUnknown_8456AE4[((const u8 *)a0)[4]]);
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A4C6);
+ a0 += 13;
+ return a0;
+}
+
+u16 * sub_8114710(u16 * a0, const u16 * a1)
+{
+ a0[0] = 16;
+ a0[1] = gUnknown_203AF98;
+ return a0 + 2;
+}
+
+const u16 * sub_8114724(const u16 * a0)
+{
+ StringExpandPlaceholders(gStringVar4, gUnknown_841A50B);
+ a0 += 2;
+ return a0;
+}
+
+u16 * sub_8114744(u16 * a0, const u16 * a1)
+{
+ a0[0] = 17;
+ a0[1] = gUnknown_203AF98;
+ return a0 + 2;
+}
+
+const u16 * sub_8114758(const u16 * a0)
+{
+ StringExpandPlaceholders(gStringVar4, gUnknown_841A732);
+ a0 += 2;
+ return a0;
+}
+
+u16 * sub_8114778(u16 * a0, const u16 * a1)
+{
+ u8 * r4 = (u8 *)(a0 + 4);
+ a0[0] = 18;
+ a0[1] = gUnknown_203AF98;
+ a0[2] = a1[0];
+ a0[3] = a1[1];
+ memcpy(r4, a1 + 2, 7);
+ r4 += 8;
+ return (u16 *)r4;
+}
+
+const u16 * sub_81147A8(const u16 * a0)
+{
+ const u8 * r6 = (const u8 *)(a0 + 4);
+ memset(gStringVar1, EOS, 8);
+ memcpy(gStringVar1, r6, 7);
+ sub_8115834(gStringVar1);
+ QuestLog_AutoGetSpeciesName(a0[3], gStringVar2, 0);
+ QuestLog_AutoGetSpeciesName(a0[2], gStringVar3, 0);
+ StringExpandPlaceholders(gStringVar4, gUnknown_841A76A);
+ r6 += 8;
+ return (const u16 *)r6;
+}
+
+u16 * sub_8114808(u16 * a0, const u16 * a1)
+{
+ a0[0] = 19;
+ a0[1] = gUnknown_203AF98;
+ *(u8 *)&a0[2] = *(const u8 *)&a1[0];
+ memcpy((u8 *)a0 + 5, (const u8 *)a1 + 1, 7);
+ a0 += 6;
+ return a0;
+}
+
+const u16 * sub_8114834(const u16 * a0)
+{
+ memset(gStringVar1, EOS, 8);
+ memcpy(gStringVar1, (const u8 *)a0 + 5, 7);
+ sub_8115834(gStringVar1);
+ StringCopy(gStringVar2, gUnknown_8456AE4[*(const u8 *)&a0[2]]);
+ StringExpandPlaceholders(gStringVar4, gUnknown_841A7B0);
+ a0 += 6;
+ return a0;
+}
+
+u16 * sub_811488C(u16 * a0, const u16 * a1)
+{
+ a0 = sub_8113DE0(20, a0);
+ if (a0 == NULL)
+ return NULL;
+ a0[0] = a1[0];
+ a0[1] = a1[1];
+ *((u8 *)a0 + 4) = *((const u8 *)a1 + 4);
+ *((u8 *)a0 + 5) = *((const u8 *)a1 + 5);
+ return a0 + 3;
+}
+
+const u16 * sub_81148BC(const u16 * a0)
+{
+ const u8 * boxIdxs;
+ a0 = sub_8113E88(20, a0);
+ boxIdxs = (const u8 *)a0 + 4;
+ UnkTextUtil_Reset();
+ UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0]));
+ QuestLog_AutoGetSpeciesName(a0[0], NULL, 1);
+ UnkTextUtil_SetPtrI(2, GetBoxNamePtr(boxIdxs[1]));
+ QuestLog_AutoGetSpeciesName(a0[1], NULL, 3);
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A566);
+ return a0 + 3;
+}
+
+u16 * sub_8114918(u16 * a0, const u16 * a1)
+{
+ a0 = sub_8113DE0(21, a0);
+ if (a0 == NULL)
+ return NULL;
+ a0[0] = a1[0];
+ a0[1] = a1[1];
+ *((u8 *)a0 + 4) = *((const u8 *)a1 + 4);
+ return a0 + 3;
+}
+
+const u16 * sub_8114944(const u16 * a0)
+{
+ const u8 * boxIdxs;
+ a0 = sub_8113E88(21, a0);
+ boxIdxs = (const u8 *)a0 + 4;
+ UnkTextUtil_Reset();
+ UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0]));
+ QuestLog_AutoGetSpeciesName(a0[0], NULL, 1);
+ QuestLog_AutoGetSpeciesName(a0[1], NULL, 2);
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A5D9);
+ return a0 + 3;
+}
+
+u16 * sub_8114990(u16 * a0, const u16 * a1)
+{
+ u16 * r2;
+ u16 * ret;
+ r2 = sub_8113DE0(22, a0);
+ if (r2 == NULL)
+ return NULL;
+ ret = r2 + 2;
+ if (*((const u8 *)a1 + 4) == TOTAL_BOXES_COUNT)
+ {
+ r2[0] = a1[1];
+ r2[1] = a1[0];
+ *((u8 *)r2 + 4) = *((const u8 *)a1 + 5);
+ }
+ else
+ {
+ r2[0] = a1[0];
+ r2[1] = a1[1];
+ *((u8 *)r2 + 4) = *((const u8 *)a1 + 4);
+ }
+ return ret + 1;
+}
+
+const u16 * sub_81149D0(const u16 * a0)
+{
+ const u8 * boxIdxs;
+ a0 = sub_8113E88(22, a0);
+ boxIdxs = (const u8 *)a0 + 4;
+ UnkTextUtil_Reset();
+ UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0]));
+ QuestLog_AutoGetSpeciesName(a0[0], NULL, 1);
+ QuestLog_AutoGetSpeciesName(a0[1], NULL, 2);
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A60A);
+ return a0 + 3;
+}
+
+u16 * sub_8114A1C(u16 * a0, const u16 * a1)
+{
+ u16 * r2;
+ u16 * ret;
+ r2 = sub_8113DE0(23, a0);
+ if (r2 == NULL)
+ return NULL;
+ r2[0] = a1[0];
+ ret = r2 + 1;
+ *((u8 *)ret + 0) = *((const u8 *)a1 + 4);
+ *((u8 *)ret + 1) = *((const u8 *)a1 + 5);
+ return ret + 1;
+}
+
+const u16 * sub_8114A4C(const u16 * a0)
+{
+ const u8 * boxIdxs;
+ a0 = sub_8113E88(23, a0);
+ boxIdxs = (const u8 *)a0 + 2;
+ UnkTextUtil_Reset();
+ UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0]));
+ QuestLog_AutoGetSpeciesName(a0[0], NULL, 1);
+ UnkTextUtil_SetPtrI(2, GetBoxNamePtr(boxIdxs[1]));
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A59C);
+ return (const u16 *)boxIdxs + 1;
+}
+
+u16 * sub_8114AA0(u16 * a0, const u16 * a1)
+{
+ u16 * r2;
+ r2 = sub_8113DE0(24, a0);
+ if (r2 == NULL)
+ return NULL;
+ r2[0] = a1[0];
+ *((u8 *)r2 + 2) = *((const u8 *)a1 + 4);
+ return r2 + 2;
+}
+
+const u16 * sub_8114AC8(const u16 * a0)
+{
+ const u8 * boxIdxs;
+ a0 = sub_8113E88(24, a0);
+ boxIdxs = (const u8 *)a0 + 2;
+ UnkTextUtil_Reset();
+ UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0]));
+ QuestLog_AutoGetSpeciesName(a0[0], NULL, 1);
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A5FA);
+ return (const u16 *)boxIdxs + 1;
+}
+
+u16 * sub_8114B0C(u16 * a0, const u16 * a1)
+{
+ u16 * r2;
+ r2 = sub_8113DE0(25, a0);
+ if (r2 == NULL)
+ return NULL;
+ r2[0] = a1[0];
+ *((u8 *)r2 + 2) = *((const u8 *)a1 + 4);
+ return r2 + 2;
+}
+
+const u16 * sub_8114B34(const u16 * a0)
+{
+ const u8 * boxIdxs;
+ a0 = sub_8113E88(25, a0);
+ boxIdxs = (const u8 *)a0 + 2;
+ UnkTextUtil_Reset();
+ UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0]));
+ QuestLog_AutoGetSpeciesName(a0[0], NULL, 1);
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A632);
+ return (const u16 *)boxIdxs + 1;
+}
+
+u16 * sub_8114B78(u16 * a0, const u16 * a1)
+{
+ u16 * r2;
+ r2 = sub_8113DE0(26, a0);
+ if (r2 == NULL)
+ return NULL;
+ r2[0] = a1[0];
+ *((u8 *)r2 + 2) = *((const u8 *)a1 + 4);
+ return r2 + 2;
+}
+
+const u16 * sub_8114BA0(const u16 * a0)
+{
+ const u8 * boxIdxs;
+ a0 = sub_8113E88(26, a0);
+ boxIdxs = (const u8 *)a0 + 2;
+ UnkTextUtil_Reset();
+ QuestLog_AutoGetSpeciesName(a0[0], NULL, 0);
+ UnkTextUtil_SetPtrI(1, GetBoxNamePtr(boxIdxs[0]));
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A64F);
+ return (const u16 *)boxIdxs + 1;
+}
+
+u16 * sub_8114BE4(u16 * a0, const u16 * a1)
+{
+ u16 * r2;
+ r2 = sub_8113DE0(27, a0);
+ if (r2 == NULL)
+ return NULL;
+ *((u8 *)r2 + 0) = *((const u8 *)a1 + 4);
+ *((u8 *)r2 + 1) = *((const u8 *)a1 + 5);
+ return r2 + 1;
+}
+
+const u16 * sub_8114C0C(const u16 * a0)
+{
+ const u16 *r4 = sub_8113E88(27, a0);
+ UnkTextUtil_Reset();
+ UnkTextUtil_SetPtrI(0, GetBoxNamePtr(*((const u8 *)r4 + 0)));
+ if (*((const u8 *)r4 + 0) == *((const u8 *)r4 + 1))
+ UnkTextUtil_SetPtrI(1, gUnknown_841A694);
+ else
+ UnkTextUtil_SetPtrI(1, GetBoxNamePtr(*((const u8 *)r4 + 1)));
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A66E);
+ return r4 + 1;
+}
+
+u16 * sub_8114C68(u16 * a0, const u16 * a1)
+{
+ a0 = sub_8113DE0(28, a0);
+ if (a0 == NULL)
+ return NULL;
+ a0[0] = a1[0];
+ return a0 + 1;
+}
+
+const u16 * sub_8114C8C(const u16 * a0)
+{
+ const u16 *r4 = sub_8113E88(28, a0);
+ sub_8099E90(r4[0], gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gUnknown_841A391);
+ return r4 + 1;
+}
+
+u16 * sub_8114CC0(u16 * a0, const u16 * a1)
+{
+ a0 = sub_8113DE0(29, a0);
+ if (a0 == NULL)
+ return NULL;
+ a0[0] = a1[0];
+ return a0 + 1;
+}
+
+const u16 * sub_8114CE4(const u16 * a0)
+{
+ const u16 *r4 = sub_8113E88(29, a0);
+ sub_8099E90(r4[0], gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gUnknown_841A3DA);
+ return r4 + 1;
+}
+
+u16 * sub_8114D18(u16 a0, u16 * a1, const u16 * a2)
+{
+ a1 = sub_8113DE0(a0, a1);
+ if (a1 == NULL)
+ return NULL;
+ a1[0] = a2[1];
+ a1[1] = a2[2];
+ a1[2] = a2[0];
+ *((u8 *)a1 + 6) = *((const u8 *)a2 + 7);
+ *((u8 *)a1 + 7) = *((const u8 *)a2 + 6);
+ return a1 + 4;
+}
+
+u16 * sub_8114D4C(u16 * a0, const u16 * a1)
+{
+ gUnknown_203B048 = TRUE;
+ return sub_8114D18(30, a0, a1);
+}
+
+const u16 * sub_8114D68(const u16 * a0)
+{
+ const u8 * r6;
+ a0 = sub_8113E88(30, a0);
+ r6 = (const u8 *)a0 + 6;
+ UnkTextUtil_Reset();
+ sub_80C4DF8(gStringVar1, r6[0]);
+ UnkTextUtil_SetPtrI(0, gStringVar1);
+ UnkTextUtil_SetPtrI(1, gTrainers[a0[2]].trainerName);
+ QuestLog_AutoGetSpeciesName(a0[0], 0, 2);
+ QuestLog_AutoGetSpeciesName(a0[1], 0, 3);
+ UnkTextUtil_SetPtrI(4, gUnknown_8456ACC[r6[1]]);
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AF0C);
+ return a0 + 4;
+}
+
+u16 * sub_8114DE8(u16 * a0, const u16 * a1)
+{
+ u16 * r4 = a0;
+ u8 * r5 = (u8 *)a0 + 8;
+ if (!sub_8110944(r4, gUnknown_8456AA0[31]))
+ return NULL;
+ if (r5[0] == 0 && r5[1] == 0)
+ {
+ r4[0] = 31;
+ r4[1] = gUnknown_203AF98;
+ }
+ if (a1[0])
+ r4[2] = a1[0];
+ if (a1[1])
+ r4[3] = a1[1];
+ if (a1[0] && r5[0] != 0xFF)
+ r5[0]++;
+ if (a1[1] && r5[1] != 0xFF)
+ r5[1]++;
+ r5[2] = *((const u8 *)a1 + 4);
+ return (u16 *)(r5 + 4);
+}
+
+const u16 * sub_8114E68(const u16 * a0)
+{
+ const u8 * r6;
+ if (!sub_8110944(a0, gUnknown_8456AA0[31]))
+ return NULL;
+
+ r6 = (const u8 *)a0 + 8;
+ UnkTextUtil_Reset();
+ sub_80C4DF8(gStringVar1, r6[2]);
+ UnkTextUtil_SetPtrI(0, gStringVar1);
+ QuestLog_AutoGetSpeciesName(a0[2], NULL, 1);
+ ConvertIntToDecimalStringN(gStringVar2, r6[0], STR_CONV_MODE_LEFT_ALIGN, 3);
+ UnkTextUtil_SetPtrI(2, gStringVar2);
+ QuestLog_AutoGetSpeciesName(a0[3], NULL, 3);
+ ConvertIntToDecimalStringN(gStringVar3, r6[1], STR_CONV_MODE_LEFT_ALIGN, 3);
+ UnkTextUtil_SetPtrI(4, gStringVar3);
+ UnkTextUtil_SetPtrI(5, gSaveBlock2Ptr->playerName);
+ if (r6[0] == 0)
+ {
+ if (r6[1] == 1)
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AA01);
+ else
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AA2B);
+ }
+ else if (r6[1] == 0)
+ {
+ if (r6[0] == 1)
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A9A9);
+ else
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A9D4);
+ }
+ else if (r6[0] == 1)
+ {
+ if (r6[1] == 1)
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AA76);
+ else
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AAAA);
+ }
+ else
+ {
+ if (r6[1] == 1)
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AAEC);
+ else
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AB29);
+ }
+ return (const u16 *)(r6 + 4);
+}
+
+bool8 sub_8114FBC(u16 a0)
+{
+ switch (a0)
+ {
+ case 0x96:
+ case 0x8F ... 0x92:
+ case 0xF9 ... 0xFA:
+ case 0x19A:
+ return TRUE;
+ }
+ return FALSE;
+}
+
+u16 * sub_8114FF0(u16 * a0, const u16 * a1)
+{
+ gUnknown_203B048 = TRUE;
+ return sub_8114D18(32, a0, a1);
+}
+
+const u16 * sub_811500C(const u16 * a0)
+{
+ const u8 * r5;
+ a0 = sub_8113E88(32, a0);
+ r5 = (const u8 *)a0 + 6;
+ UnkTextUtil_Reset();
+ UnkTextUtil_SetPtrI(0, gTrainers[a0[2]].trainerName);
+ QuestLog_AutoGetSpeciesName(a0[0], NULL, 1);
+ QuestLog_AutoGetSpeciesName(a0[1], NULL, 2);
+ UnkTextUtil_SetPtrI(3, gUnknown_8456ACC[r5[1]]);
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AF3E);
+ return a0 + 4;
+}
+
+u16 * sub_8115078(u16 * a0, const u16 * a1)
+{
+ if (!sub_8110944(a0, gUnknown_8456AA0[33]))
+ return NULL;
+ a0[0] = 0x2021;
+ a0[1] = gUnknown_203AF98;
+ a0[2] = a1[1];
+ a0[3] = a1[2];
+ *((u8 *)a0 + 8) = *((const u8 *)a1 + 6);
+ gUnknown_203B048 = TRUE;
+ return a0 + 5;
+}
+
+const u16 * sub_81150CC(const u16 * a0)
+{
+ const u8 * r5;
+ if (!sub_8110944(a0, gUnknown_8456AA0[33]))
+ return NULL;
+
+ r5 = (const u8 *)a0 + 8;
+ UnkTextUtil_Reset();
+
+ switch (gUnknown_203B044.unk_2)
+ {
+ case 0:
+ UnkTextUtil_SetPtrI(0, gSaveBlock2Ptr->playerName);
+ UnkTextUtil_SetPtrI(1, gSaveBlock1Ptr->rivalName);
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A2E1);
+ break;
+ case 1:
+ UnkTextUtil_SetPtrI(0, gSaveBlock1Ptr->rivalName);
+ QuestLog_AutoGetSpeciesName(a0[2], NULL, 1);
+ UnkTextUtil_SetPtrI(2, gSaveBlock2Ptr->playerName);
+ QuestLog_AutoGetSpeciesName(a0[3], NULL, 3);
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A312);
+ break;
+ case 2:
+ UnkTextUtil_SetPtrI(0, gUnknown_8456AD8[r5[0]]);
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A349);
+ break;
+ }
+ return (const u16 *)(r5 + 2);
+}
+
+u16 * sub_81151C0(u16 * a0, const u16 * a1)
+{
+ gUnknown_203B048 = TRUE;
+ return sub_8114D18(34, a0, a1);
+}
+
+const u16 * sub_81151DC(const u16 * a0)
+{
+ const u16 * r5 = sub_8113E88(34, a0);
+ const u8 * r6 = (const u8 *)r5 + 6;
+ UnkTextUtil_Reset();
+ sub_80C4DF8(gStringVar1, r6[0]);
+ UnkTextUtil_SetPtrI(0, gStringVar1);
+ if (
+ gTrainers[r5[2]].trainerClass == 0x51
+ || gTrainers[r5[2]].trainerClass == 0x59
+ || gTrainers[r5[2]].trainerClass == 0x5A
+ )
+ UnkTextUtil_SetPtrI(1, GetExpandedPlaceholder(6));
+ else
+ UnkTextUtil_SetPtrI(1, gTrainers[r5[2]].trainerName);
+ QuestLog_AutoGetSpeciesName(r5[0], NULL, 2);
+ QuestLog_AutoGetSpeciesName(r5[1], NULL, 3);
+ UnkTextUtil_SetPtrI(4, gUnknown_8456ACC[r6[1]]);
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AF6D);
+ return (const u16 *)(r6 + 2);
+}
+
+const u8 *const gUnknown_8456AF0[] = {
+ gUnknown_841B09F,
+ gUnknown_841B0A4,
+ gUnknown_841B0B5,
+ gUnknown_841B0B9,
+ gUnknown_841B0B9,
+ gUnknown_841B0CD,
+ gUnknown_841B0CD,
+ gUnknown_841B0DD,
+ gUnknown_841B0B5,
+ gUnknown_841B0F6,
+ gUnknown_841B0F6,
+ gUnknown_841B0B5,
+ gUnknown_841B0FF,
+ gUnknown_841B109,
+ gUnknown_841B116,
+ gUnknown_841B11F,
+ gUnknown_841B11F,
+ gUnknown_841B130,
+ gUnknown_841B0B5,
+ gUnknown_841B141,
+ gUnknown_841B14B,
+ gUnknown_841B14B,
+ gUnknown_841B15A,
+ gUnknown_841B15A,
+ gUnknown_841B166,
+ gUnknown_841B172,
+ gUnknown_841B180,
+ gUnknown_841B190,
+ gUnknown_841B11F,
+ gUnknown_841B11F,
+ gUnknown_841B1A3,
+ gUnknown_841B1B7,
+ gUnknown_841B1C7,
+ gUnknown_841B0B5,
+ gUnknown_841B1DA,
+ gUnknown_841B1E5,
+ gUnknown_841B1F4,
+ gUnknown_841B0B5,
+ gUnknown_841B200,
+ gUnknown_841B20E,
+ gUnknown_841B0B5,
+ gUnknown_841B21C,
+ gUnknown_841B226,
+ gUnknown_841B226,
+ gUnknown_841B236,
+ gUnknown_841B0B5,
+ gUnknown_841B246,
+ gUnknown_841B25B,
+ gUnknown_841B25B,
+ gUnknown_841B268,
+ gUnknown_841B277
+};
+
+const u8 *const gUnknown_8456BBC[] = {
+ gUnknown_841A53A,
+ gUnknown_841AD9E,
+ gUnknown_841ADC8,
+ gUnknown_841ADFF,
+ gUnknown_841AE1E,
+ gUnknown_841AE48,
+ gUnknown_841AEA7,
+ gUnknown_841AEDC,
+ gUnknown_841AFD6,
+ gUnknown_841B005
+};
+
+const u8 gUnknown_8456BE4[] = {
+ 0x03,
+ 0x04,
+ 0x05,
+ 0x08,
+ 0x08,
+ 0x07,
+ 0x07,
+ 0x01,
+ 0x05,
+ 0x07,
+ 0x07,
+ 0x05,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x08,
+ 0x08,
+ 0x00,
+ 0x05,
+ 0x08,
+ 0x07,
+ 0x07,
+ 0x07,
+ 0x07,
+ 0x08,
+ 0x08,
+ 0x00,
+ 0x00,
+ 0x08,
+ 0x08,
+ 0x00,
+ 0x00,
+ 0x02,
+ 0x05,
+ 0x00,
+ 0x08,
+ 0x06,
+ 0x05,
+ 0x00,
+ 0x00,
+ 0x05,
+ 0x09,
+ 0x07,
+ 0x07,
+ 0x09,
+ 0x05,
+ 0x00,
+ 0x07,
+ 0x07,
+ 0x08,
+ 0x07
+};
+
+const u8 gUnknown_8456C17[] = {
+ 0x5a,
+ 0x5b,
+ 0x5d,
+ 0x5e,
+ 0x5f,
+ 0x62,
+ 0x60,
+ 0x59
+};
+
+const u8 *const gUnknown_8456C20[] = {
+ gUnknown_841AC51,
+ gUnknown_841ABAB,
+ gUnknown_841ABCD,
+ gUnknown_841AC2A,
+ gUnknown_841ABF9,
+ gUnknown_841AC93,
+ gUnknown_841ACBC,
+ gUnknown_841AD69,
+ gUnknown_841AD1D,
+ gUnknown_841A90C,
+ gUnknown_841A8E0,
+ gUnknown_841AD3C
+};
+
+u16 * sub_8115280(u16 * a0, const u16 * a1)
+{
+ u16 * r2 = sub_8113DE0(35, a0);
+ if (r2 == NULL)
+ return NULL;
+ *((u8 *)r2 + 0) = *((const u8 *)a1 + 0);
+ if ((*((u8 *)r2 + 1) = *((const u8 *)a1 + 1)) == 0x24)
+ gUnknown_203B048 = TRUE;
+ return r2 + 1;
+}
+
+const u16 * sub_81152BC(const u16 * a0)
+{
+ u8 r4, r6;
+ const u16 * r5 = sub_8113E88(35, a0);
+ const u8 * r5_2 = (const u8 *)r5 + 0;
+ r6 = r5_2[1];
+ sub_80C4DF8(gStringVar1, r5_2[0]);
+ StringCopy(gStringVar2, gUnknown_8456AF0[r6]);
+ if (gUnknown_8456BE4[r6] == 5)
+ {
+ for (r4 = 0; r4 < ARRAY_COUNT(gUnknown_8456C17); r4++)
+ {
+ if (r5_2[0] != gUnknown_8456C17[r4])
+ continue;
+ if (FlagGet(0x820 + r4) == TRUE)
+ StringExpandPlaceholders(gStringVar4, gUnknown_841AE8F);
+ else
+ StringExpandPlaceholders(gStringVar4, gUnknown_841AE48);
+ break;
+ }
+ if (r4 == 8)
+ StringExpandPlaceholders(gStringVar4, gUnknown_8456BBC[gUnknown_8456BE4[r6]]);
+ }
+ else
+ StringExpandPlaceholders(gStringVar4, gUnknown_8456BBC[gUnknown_8456BE4[r6]]);
+
+ return (const u16 *)(r5_2 + 2);
+}
+
+void sub_811539C(void)
+{
+ gUnknown_203B04B = TRUE;
+}
+
+bool8 sub_81153A8(u16 a0, u16 * a1)
+{
+ if (a0 != 35)
+ {
+ gUnknown_203B04A = 0;
+ return TRUE;
+ }
+ if (gUnknown_203B04A == *((u8 *)a1 + 1) + 1)
+ return FALSE;
+ gUnknown_203B04A = *((u8 *)a1 + 1) + 1;
+ return TRUE;
+}
+
+bool8 sub_81153E4(u16 a0, u16 * a1)
+{
+ if (a0 != 35)
+ return TRUE;
+ if (*((u8 *)a1 + 1) == 32 && gUnknown_203B04B == 0)
+ return FALSE;
+ gUnknown_203B04B = 0;
+ return TRUE;
+}
+
+u16 * sub_8115410(u16 * a0, const u16 * a1)
+{
+ u8 * r3;
+ a0 = sub_8113DE0(36, a0);
+ if (a0 == NULL)
+ return NULL;
+ a0[0] = a1[0];
+ r3 = (u8 *)a0 + 2;
+ r3[0] = *((const u8 *)a1 + 2);
+ r3[1] = *((const u8 *)a1 + 3);
+ if (r3[0] == 7 || r3[0] == 8)
+ gUnknown_203B048 = 2;
+ else
+ gUnknown_203B048 = 1;
+ return (u16 *)(r3 + 2);
+}
+
+const u16 * sub_8115460(const u16 * a0)
+{
+ const u16 * r4 = sub_8113E88(36, a0);
+ const u8 * r5 = (const u8 *)r4 + 2;
+ QuestLog_AutoGetSpeciesName(r4[0], gStringVar1, 0);
+ if (r5[1] != 0xFF)
+ sub_80C4DF8(gStringVar2, r5[1]);
+ if (r5[0] == 7)
+ {
+ if (r5[1] == 0x58)
+ StringCopy(gStringVar3, gUnknown_841B09F);
+ else
+ StringCopy(gStringVar3, gUnknown_8418C1B);
+ }
+ StringExpandPlaceholders(gStringVar4, gUnknown_8456C20[r5[0]]);
+ return (const u16 *)(r5 + 2);
+}
+
+u16 * sub_81154DC(u16 * a0, const u16 * a1)
+{
+ a0 = sub_8113DE0(37, a0);
+ if (a0 == NULL)
+ return NULL;
+ a0[0] = a1[2];
+ a0[1] = a1[3];
+ a0[2] = *((const u32 *)a1) >> 16;
+ a0[3] = *((const u32 *)a1);
+ *((u8 *)a0 + 8) = *((const u8 *)a1 + 8);
+ *((u8 *)a0 + 9) = 1;
+ return a0 + 5;
+}
+
+const u16 * sub_8115518(const u16 * a0)
+{
+ const u16 * r4 = sub_8113E88(37, a0);
+ const u8 * r7 = (const u8 *)r4 + 8;
+ u32 r6 = (r4[2] << 16) + r4[3];
+ UnkTextUtil_Reset();
+ sub_80C4DF8(gStringVar1, r7[0]);
+ UnkTextUtil_SetPtrI(0, gStringVar1);
+ UnkTextUtil_SetPtrI(1, ItemId_GetItem(r4[0])->name);
+ if (r4[1] < 2)
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A7DD);
+ else
+ {
+ ConvertIntToDecimalStringN(gStringVar2, r6, STR_CONV_MODE_LEFT_ALIGN, 6);
+ UnkTextUtil_SetPtrI(2, gStringVar2);
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A810);
+ }
+ return (const u16 *)(r7 + 2);
+}
+
+u16 * sub_81155A4(u16 * a0, const u16 * a1)
+{
+ a0 = sub_8113DE0(38, a0);
+ if (a0 == NULL)
+ return NULL;
+ a0[0] = a1[2];
+ a0[1] = a1[3];
+ a0[2] = *((const u32 *)a1) >> 16;
+ a0[3] = *((const u32 *)a1);
+ *((u8 *)a0 + 8) = *((const u8 *)a1 + 8);
+ *((u8 *)a0 + 9) = *((const u8 *)a1 + 9);
+ return a0 + 5;
+}
+
+const u16 * sub_81155E0(const u16 * a0) {
+ const u16 *r5 = sub_8113E88(38, a0);
+ const u8 *r7 = (const u8 *) r5 + 8;
+ u32 r6 = (r5[2] << 16) + r5[3];
+ UnkTextUtil_Reset();
+ sub_80C4DF8(gStringVar1, r7[0]);
+ if (r7[1] == 0) {
+ UnkTextUtil_SetPtrI(0, gSaveBlock2Ptr->playerName);
+ UnkTextUtil_SetPtrI(1, gStringVar1);
+ UnkTextUtil_SetPtrI(2, ItemId_GetItem(r5[0])->name);
+ if (r5[1] == 1)
+ UnkTextUtil_SetPtrI(3, gUnknown_841A8D4);
+ else
+ {
+ ConvertIntToDecimalStringN(gStringVar2, r5[1], STR_CONV_MODE_LEFT_ALIGN, 3);
+ UnkTextUtil_SetPtrI(4, gStringVar2);
+ UnkTextUtil_StringExpandPlaceholders(gStringVar3, gUnknown_841A8DD);
+ UnkTextUtil_SetPtrI(3, gStringVar3);
+ }
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A858);
+ }
+ else
+ {
+ UnkTextUtil_SetPtrI(0, gStringVar1);
+ UnkTextUtil_SetPtrI(1, ItemId_GetItem(r5[0])->name);
+ ConvertIntToDecimalStringN(gStringVar2, r6, STR_CONV_MODE_LEFT_ALIGN, 6);
+ UnkTextUtil_SetPtrI(2, gStringVar2);
+ UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A896);
+ }
+ return (const u16 *)(r7 + 2);
+}
+
+u16 * sub_81156D8(u16 * a0, const u16 * a1)
+{
+ a0 = sub_8113DE0(40, a0);
+ if (a0 == NULL)
+ return NULL;
+ a0[0] = a1[0];
+ *((u8 *)a0 + 2) = *((const u8 *)a1 + 2);
+ return a0 + 2;
+}
+
+const u16 * sub_8115700(const u16 * a0)
+{
+ const u16 * r4 = sub_8113E88(40, a0);
+ const u8 * r5 = (const u8 *)r4 + 2;
+ sub_80C4DF8(gStringVar1, r5[0]);
+ StringCopy(gStringVar2, ItemId_GetItem(r4[0])->name);
+ StringExpandPlaceholders(gStringVar4, gUnknown_841B03F);
+ return (const u16 *)(r5 + 2);
+}
+
+const u16 gUnknown_8456C50[] = {
+ 0x0891,
+ 0x0892,
+ 0x0893,
+ 0x0894,
+ 0x0895,
+ 0x0896,
+ 0x0897,
+ 0x0898,
+ 0x0899,
+ 0x089a,
+ 0x089b,
+ 0x089c,
+ 0x089d,
+ 0x089e,
+ 0x089f,
+ 0x08a0,
+ 0x08a1
+};
+
+#ifdef NONMATCHING
+void sub_8115748(u16 a0)
+{
+ s32 i;
+ if (gUnknown_203ADFA == 2 || gUnknown_203ADFA == 3)
+ return;
+ for (i = 0; i < 17; i++)
+ {
+ if (a0 != gUnknown_8456C50[i])
+ continue;
+ if (!FlagGet(a0))
+ gUnknown_203B049 = TRUE;
+ else
+ gUnknown_203B049 = FALSE;
+ break;
+ }
+}
+#else
+NAKED
+void sub_8115748(u16 a0)
+{
+ asm_unified("\tpush {r4,lr}\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r2, r0, 16\n"
+ "\tldr r0, =gUnknown_203ADFA\n"
+ "\tldrb r0, [r0]\n"
+ "\tsubs r0, 0x2\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tcmp r0, 0x1\n"
+ "\tbls _08115792\n"
+ "\tmovs r1, 0\n"
+ "\tldr r4, =gUnknown_203B049\n"
+ "\tldr r0, =gUnknown_8456C50\n"
+ "\tb _08115778\n"
+ "\t.pool\n"
+ "_08115770:\n"
+ "\tmovs r0, 0\n"
+ "\tb _08115790\n"
+ "_08115774:\n"
+ "\tadds r0, 0x2\n"
+ "\tadds r1, 0x1\n"
+ "_08115778:\n"
+ "\tcmp r1, 0x10\n"
+ "\tbgt _08115792\n"
+ "\tldrh r3, [r0]\n"
+ "\tcmp r2, r3\n"
+ "\tbne _08115774\n"
+ "\tadds r0, r2, 0\n"
+ "\tbl FlagGet\n"
+ "\tlsls r0, 24\n"
+ "\tcmp r0, 0\n"
+ "\tbne _08115770\n"
+ "\tmovs r0, 0x1\n"
+ "_08115790:\n"
+ "\tstrb r0, [r4]\n"
+ "_08115792:\n"
+ "\tpop {r4}\n"
+ "\tpop {r0}\n"
+ "\tbx r0");
+}
+#endif // NONMATCHING
+
+void sub_8115798(void)
+{
+ u16 sp0;
+ if (gUnknown_203ADFA != 2 && gUnknown_203ADFA != 3)
+ {
+ if (gUnknown_203B049)
+ {
+ sp0 = gMapHeader.regionMapSectionId;
+ sub_8113550(42, &sp0);
+ gUnknown_203B049 = FALSE;
+ }
+ }
+}
+
+u16 * sub_81157DC(u16 * a0, const u16 * a1)
+{
+ a0 = sub_8113DE0(42, a0);
+ if (a0 == NULL)
+ return NULL;
+ a0[0] = a1[0];
+ return a0 + 1;
+}
+
+const u16 * sub_8115800(const u16 * a0)
+{
+ const u16 * r4 = sub_8113E88(42, a0);
+ sub_80C4DF8(gStringVar1, r4[0]);
+ StringExpandPlaceholders(gStringVar4, gUnknown_841B064);
+ return r4 + 1;
+}
+
+void sub_8115834(u8 * a0)
+{
+ s32 i;
+ if (*a0++ == EXT_CTRL_CODE_BEGIN && *a0++ == EXT_CTRL_CODE_JPN)
+ {
+ for (i = 0; i < 5; i++)
+ {
+ if (*a0 == EXT_CTRL_CODE_BEGIN)
+ break;
+ a0++;
+ }
+ *a0++ = EXT_CTRL_CODE_BEGIN;
+ *a0++ = EXT_CTRL_CODE_ENG;
+ *a0++ = EOS;
+ }
+}
diff --git a/src/quest_log_8150454.c b/src/quest_log_8150454.c
new file mode 100644
index 000000000..8af516e3a
--- /dev/null
+++ b/src/quest_log_8150454.c
@@ -0,0 +1,197 @@
+#include "global.h"
+#include "bike.h"
+#include "script.h"
+#include "task.h"
+#include "field_player_avatar.h"
+#include "field_map_obj.h"
+#include "field_map_obj_helpers.h"
+#include "field_effect.h"
+#include "field_effect_helpers.h"
+#include "quest_log.h"
+
+void sub_81504A8(void);
+void sub_81504E8(void);
+void sub_8150530(void);
+void sub_81505C4(u8 taskId);
+void sub_8150708(void);
+void sub_815077C(void);
+void sub_8150794(u8 taskId);
+void sub_81507CC(void);
+void sub_81507D8(void);
+void sub_81507E4(void);
+void sub_81507F0(void);
+void sub_81507BC(struct MapObject *a0, u8 a1);
+
+void (*const gUnknown_8471EDC[])(void) = {
+ sub_81504A8,
+ sub_81504E8,
+ sub_8150530,
+ sub_8150708,
+ sub_81507CC,
+ sub_81507D8,
+ sub_81507E4,
+ sub_81507F0,
+ sub_815077C
+};
+
+void sub_8150454(u8 a0)
+{
+ if (a0 < ARRAY_COUNT(gUnknown_8471EDC))
+ gUnknown_8471EDC[a0]();
+}
+
+bool8 sub_8150474(u8 a0)
+{
+ if (gUnknown_3005E88 == 2)
+ {
+ sub_8112720(a0);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_8150498(u8 a0)
+{
+ return sub_8150454(a0);
+}
+
+void sub_81504A8(void)
+{
+ struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId];
+ sub_81507BC(mapObject, sub_805C808(0));
+ FieldObjectTurn(mapObject, mapObject->placeholder18);
+ SetPlayerAvatarStateMask(0x01);
+}
+
+void sub_81504E8(void)
+{
+ struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId];
+ sub_81507BC(mapObject, sub_805C808(1));
+ FieldObjectTurn(mapObject, mapObject->placeholder18);
+ SetPlayerAvatarStateMask(0x02);
+ sub_80BD620(0, 0);
+}
+
+void sub_8150530(void)
+{
+ struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId];
+ struct Sprite *sprite = &gSprites[mapObject->spriteId];
+
+ if (gUnknown_3005E88 == 1 || gUnknown_3005E88 == 3)
+ {
+ u8 taskId;
+ ScriptContext2_Enable();
+ gPlayerAvatar.unk6 = 1;
+ taskId = CreateTask(sub_81505C4, 0xFF);
+ gTasks[taskId].data[0] = 0;
+ }
+ else
+ {
+ sub_81507BC(mapObject, sub_805C808(4));
+ StartSpriteAnim(sprite, sub_80634F0(mapObject->mapobj_unk_18));
+ }
+}
+
+void sub_81505C4(u8 taskId)
+{
+ struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId];
+ struct Sprite *sprite = &gSprites[mapObject->spriteId];
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ FieldObjectClearAnimIfSpecialAnimActive(mapObject);
+ mapObject->mapobj_bit_11 = TRUE;
+ sub_81507BC(mapObject, sub_805C808(4));
+ StartSpriteAnim(sprite, sub_80634F0(mapObject->mapobj_unk_18));
+ gTasks[taskId].data[0]++;
+ gTasks[taskId].data[1] = 0;
+ break;
+ case 1:
+ sub_805D9C4(sprite);
+ if (gTasks[taskId].data[1] < 60)
+ gTasks[taskId].data[1]++;
+ else
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ StartSpriteAnim(sprite, sub_8063500(player_get_direction_lower_nybble()));
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ sub_805D9C4(sprite);
+ if (sprite->animEnded)
+ {
+ if (!(gPlayerAvatar.flags & 8))
+ sub_81507BC(mapObject, sub_805C808(0));
+ else
+ sub_81507BC(mapObject, sub_805C808(2));
+ FieldObjectTurn(mapObject, mapObject->placeholder18);
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_8150708(void)
+{
+ struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId];
+ u8 fieldEffectId;
+
+ if (!(gPlayerAvatar.flags & 0x08))
+ {
+ sub_81507BC(mapObject, sub_805C808(2));
+ FieldObjectTurn(mapObject, mapObject->placeholder18);
+ SetPlayerAvatarStateMask(0x08);
+ gFieldEffectArguments[0] = mapObject->coords2.x;
+ gFieldEffectArguments[1] = mapObject->coords2.y;
+ gFieldEffectArguments[2] = gPlayerAvatar.mapObjectId;
+ fieldEffectId = FieldEffectStart(0x08);
+ mapObject->mapobj_unk_1A = fieldEffectId;
+ sub_80DC44C(fieldEffectId, 1);
+ }
+}
+
+void sub_815077C(void)
+{
+ FieldEffectStart(0x41);
+ CreateTask(sub_8150794, 0x00);
+}
+
+void sub_8150794(u8 taskId)
+{
+ if (!FieldEffectActiveListContains(0x41))
+ {
+ UnfreezeMapObjects();
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+ }
+}
+
+void sub_81507BC(struct MapObject * a0, u8 a1)
+{
+ sub_805F060(a0, a1);
+}
+
+void sub_81507CC(void)
+{
+ sub_805D154(1);
+}
+
+void sub_81507D8(void)
+{
+ sub_805D154(2);
+}
+
+void sub_81507E4(void)
+{
+ sub_805D154(3);
+}
+
+void sub_81507F0(void)
+{
+ sub_805D154(4);
+}
diff --git a/src/quest_log_battle.c b/src/quest_log_battle.c
new file mode 100644
index 000000000..c702b6a5c
--- /dev/null
+++ b/src/quest_log_battle.c
@@ -0,0 +1,164 @@
+#include "global.h"
+#include "constants/species.h"
+#include "malloc.h"
+#include "battle.h"
+#include "link.h"
+#include "overworld.h"
+#include "quest_log.h"
+
+struct QuestLogStruct_TrainerBattleRecord
+{
+ u16 v0;
+ u16 v2;
+ u16 v4;
+ u8 v6;
+ u8 v7;
+};
+
+struct QuestLogStruct_WildBattleRecord
+{
+ u16 v0;
+ u16 v2;
+ u8 v4;
+};
+
+void sub_812C334(s32 *, s32 *);
+
+void sub_812BFDC(void)
+{
+ if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_DOME)) && (gUnknown_2023E8A == 1 || gUnknown_2023E8A == 7))
+ {
+ struct QuestLogStruct_TrainerBattleRecord * questLogTrainerBattleRecord = Alloc(sizeof(struct QuestLogStruct_TrainerBattleRecord));
+ struct QuestLogStruct_WildBattleRecord * questLogWildBattleRecord = Alloc(sizeof(struct QuestLogStruct_WildBattleRecord));
+ u16 questLogMessageType;
+ u16 playerEndingHP;
+ u16 playerMaxHP;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
+ {
+ switch (gTrainers[gTrainerBattleOpponent_A].trainerClass)
+ {
+ case 0x54:
+ questLogMessageType = 30;
+ break;
+ case 0x5a:
+ questLogMessageType = 33;
+ break;
+ case 0x57:
+ questLogMessageType = 32;
+ break;
+ default:
+ questLogMessageType = 34;
+ break;
+ }
+ questLogTrainerBattleRecord->v0 = gTrainerBattleOpponent_A;
+ if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
+ {
+ questLogTrainerBattleRecord->v2 = gBattleResults.lastOpponentSpecies;
+ if (GetBattlerSide(gBattleStruct->field_182) == B_SIDE_PLAYER)
+ questLogTrainerBattleRecord->v4 = gBattleMons[gBattleStruct->field_182].species;
+ else if (gBattleMons[GetBattlerAtPosition(0)].hp != 0)
+ questLogTrainerBattleRecord->v4 = gBattleMons[GetBattlerAtPosition(0)].species;
+ else
+ questLogTrainerBattleRecord->v4 = gBattleMons[GetBattlerAtPosition(2)].species;
+ playerEndingHP = gBattleMons[GetBattlerAtPosition(0)].hp + gBattleMons[GetBattlerAtPosition(2)].hp;
+ playerMaxHP = gBattleMons[GetBattlerAtPosition(0)].maxHP + gBattleMons[GetBattlerAtPosition(2)].maxHP;
+ }
+ else
+ {
+ questLogTrainerBattleRecord->v2 = gBattleResults.lastOpponentSpecies;
+ questLogTrainerBattleRecord->v4 = gBattleMons[GetBattlerAtPosition(0)].species;
+ playerEndingHP = gBattleMons[GetBattlerAtPosition(0)].hp;
+ playerMaxHP = gBattleMons[GetBattlerAtPosition(0)].maxHP;
+ }
+ questLogTrainerBattleRecord->v7 = sav1_map_get_name();
+ questLogTrainerBattleRecord->v6 = 0;
+ if (playerEndingHP < playerMaxHP / 3 * 2)
+ questLogTrainerBattleRecord->v6 = 1;
+ if (playerEndingHP < playerMaxHP / 3)
+ questLogTrainerBattleRecord->v6++;
+ sub_8113550(questLogMessageType, (const u16 *)questLogTrainerBattleRecord);
+ }
+ else
+ {
+ if (gUnknown_2023E8A == 1)
+ {
+ questLogWildBattleRecord->v0 = GetMonData(gEnemyParty + 0, MON_DATA_SPECIES);
+ questLogWildBattleRecord->v2 = SPECIES_NONE;
+ }
+ else
+ {
+ questLogWildBattleRecord->v0 = SPECIES_NONE;
+ questLogWildBattleRecord->v2 = GetMonData(gEnemyParty + 0, MON_DATA_SPECIES);
+ }
+ questLogWildBattleRecord->v4 = sav1_map_get_name();
+ sub_8113550(31, (const u16 *)questLogWildBattleRecord);
+ }
+ Free(questLogTrainerBattleRecord);
+ Free(questLogWildBattleRecord);
+ }
+}
+
+struct QuestLogStruct_LinkBattleRecord
+{
+ u8 v0;
+ u8 v1[3][7];
+};
+
+void sub_812C224(void)
+{
+ s32 sp0;
+ s32 sp4[2];
+ u16 r8;
+ s32 r3;
+ u32 r0;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ struct QuestLogStruct_LinkBattleRecord * r5 = Alloc(sizeof(struct QuestLogStruct_LinkBattleRecord));
+ r5->v0 = gUnknown_2023E8A - 1;
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ r8 = 15;
+ sub_812C334(&sp0, sp4);
+ for (r3 = 0; r3 < 7; r3++)
+ {
+ r5->v1[0][r3] = gLinkPlayers[sp0].name[r3];
+ r5->v1[1][r3] = gLinkPlayers[sp4[0]].name[r3];
+ r5->v1[2][r3] = gLinkPlayers[sp4[1]].name[r3];
+ }
+ }
+ else
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
+ r8 = 14;
+ else
+ {
+ r0 = InUnionRoom();
+ r8 = 13;
+ if (r0 == TRUE)
+ r8 = 19;
+ }
+ for (r3 = 0; r3 < 7; r3++)
+ {
+ r5->v1[0][r3] = gLinkPlayers[gBattleStruct->field_B5 ^ 1].name[r3];
+ }
+ }
+ sub_8113550(r8, (const u16 *)r5);
+ Free(r5);
+ }
+}
+
+void sub_812C334(s32 * a0, s32 * a1)
+{
+ s32 r5;
+ s32 _optimized_out = 0;
+ u8 r2 = gLinkPlayers[gBattleStruct->field_B5].id ^ 2;
+ for (r5 = 0; r5 < 4; r5++)
+ {
+ if (r2 == gLinkPlayers[r5].id)
+ a0[0] = r5;
+ else if (r5 != gBattleStruct->field_B5)
+ a1[_optimized_out++] = r5;
+ }
+}
diff --git a/src/save.c b/src/save.c
index 28f6a2896..ef38d8b17 100644
--- a/src/save.c
+++ b/src/save.c
@@ -614,7 +614,12 @@ u16 CalculateChecksum(void *data, u16 size)
u32 checksum = 0;
for (i = 0; i < (size / 4); i++)
- checksum += *((u32 *)data)++;
+ {
+ // checksum += *(u32 *)data++;
+ // For compatibility with modern gcc, these statements were separated.
+ checksum += *(u32 *)data;
+ data += 4;
+ }
return ((checksum >> 16) + checksum);
}
diff --git a/src/script.c b/src/script.c
index 0c74debb2..59ef4e579 100644
--- a/src/script.c
+++ b/src/script.c
@@ -22,17 +22,17 @@ EWRAM_DATA u8 gUnknown_20370A0 = 0;
EWRAM_DATA u8 *gUnknown_20370A4 = NULL;
// ewram bss
-IWRAM_DATA static u8 sScriptContext1Status;
-IWRAM_DATA static u32 sUnusedVariable1;
-IWRAM_DATA static struct ScriptContext sScriptContext1;
-IWRAM_DATA static u32 sUnusedVariable2;
-IWRAM_DATA static struct ScriptContext sScriptContext2;
-IWRAM_DATA static bool8 sScriptContext2Enabled;
-IWRAM_DATA static u8 gUnknown_3000F9D;
-IWRAM_DATA static u8 gUnknown_3000F9E;
-IWRAM_DATA static u8 gUnknown_3000F9F;
-IWRAM_DATA static u8 gUnknown_3000FA0;
-IWRAM_DATA static u8 gUnknown_3000FA1;
+/*IWRAM_DATA*/ static u8 sScriptContext1Status;
+/*IWRAM_DATA*/ static u32 sUnusedVariable1;
+/*IWRAM_DATA*/ static struct ScriptContext sScriptContext1;
+/*IWRAM_DATA*/ static u32 sUnusedVariable2;
+/*IWRAM_DATA*/ static struct ScriptContext sScriptContext2;
+/*IWRAM_DATA*/ static bool8 sScriptContext2Enabled;
+/*IWRAM_DATA*/ static u8 gUnknown_3000F9D;
+/*IWRAM_DATA*/ static u8 gUnknown_3000F9E;
+/*IWRAM_DATA*/ static u8 gUnknown_3000F9F;
+/*IWRAM_DATA*/ static u8 gUnknown_3000FA0;
+/*IWRAM_DATA*/ static u8 gUnknown_3000FA1;
extern ScrCmdFunc gScriptCmdTable[];
extern ScrCmdFunc gScriptCmdTableEnd[];
diff --git a/src/sound.c b/src/sound.c
index b8814de81..f94e44506 100644
--- a/src/sound.c
+++ b/src/sound.c
@@ -24,11 +24,11 @@ EWRAM_DATA struct MusicPlayerInfo* gMPlay_PokemonCry = NULL;
EWRAM_DATA u8 gPokemonCryBGMDuckingCounter = 0;
// iwram bss
-IWRAM_DATA static u16 sCurrentMapMusic;
-IWRAM_DATA static u16 sNextMapMusic;
-IWRAM_DATA static u8 sMapMusicState;
-IWRAM_DATA static u8 sMapMusicFadeInSpeed;
-IWRAM_DATA static u16 sFanfareCounter;
+/*IWRAM_DATA*/ static u16 sCurrentMapMusic;
+/*IWRAM_DATA*/ static u16 sNextMapMusic;
+/*IWRAM_DATA*/ static u8 sMapMusicState;
+/*IWRAM_DATA*/ static u8 sMapMusicFadeInSpeed;
+/*IWRAM_DATA*/ static u16 sFanfareCounter;
// iwram common
bool8 gDisableMusic;
diff --git a/src/text.c b/src/text.c
index 7fb0ab034..874e12fd5 100644
--- a/src/text.c
+++ b/src/text.c
@@ -17,7 +17,7 @@ extern void BlitBitmapRectToWindow(u8 windowId, const u8 *pixels, u16 srcX, u16
extern u8 GetKeypadIconWidth(u8 keypadIconId);
extern void CopyWindowToVram(u8 windowId, u8 mode);
extern u16 Font6Func(struct TextPrinter *textPrinter);
-extern u32 GetGlyphWidthFont6(u16 glyphId, bool32 isJapanese);
+extern s32 GetGlyphWidthFont6(u16 glyphId, bool32 isJapanese);
extern void PlaySE(u16 songNum);
extern u8* UnkTextUtil_GetPtrI(u8 a1);
@@ -1388,7 +1388,7 @@ _08005D6A:\n\
.syntax divided");
}
-u32 GetStringWidthFixedWidthFont(const u8 *str, u8 fontId, u8 letterSpacing)
+s32 GetStringWidthFixedWidthFont(const u8 *str, u8 fontId, u8 letterSpacing)
{
int i;
u8 width;
@@ -1479,24 +1479,24 @@ u32 GetStringWidthFixedWidthFont(const u8 *str, u8 fontId, u8 letterSpacing)
return (u8)(GetFontAttribute(fontId, 0) + letterSpacing) * width;
}
-u32 (*GetFontWidthFunc(u8 glyphId))(u16, bool32)
+s32 (*GetFontWidthFunc(u8 glyphId))(u16 _glyphId, bool32 _isJapanese)
{
u32 i;
for (i = 0; i < 7; ++i)
{
if (glyphId == gGlyphWidthFuncs[i].font_id)
- return gGlyphWidthFuncs[i].func;
+ return *gGlyphWidthFuncs[i].func;
}
- return 0;
+ return NULL;
}
-u32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing)
+s32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing)
{
bool8 isJapanese;
int minGlyphWidth;
- u32 (*func)(u16 glyphId, bool32 isJapanese);
+ s32 (*func)(u16 glyphId, bool32 isJapanese);
int localLetterSpacing;
register u32 lineWidth asm("r5");
u8 *bufferPointer;
@@ -1863,7 +1863,7 @@ void DecompressGlyphFont0(u16 glyphId, bool32 isJapanese)
}
}
-u32 GetGlyphWidthFont0(u16 glyphId, bool32 isJapanese)
+s32 GetGlyphWidthFont0(u16 glyphId, bool32 isJapanese)
{
if (isJapanese == TRUE)
return 8;
@@ -1896,7 +1896,7 @@ void DecompressGlyphFont1(u16 glyphId, bool32 isJapanese)
}
}
-u32 GetGlyphWidthFont1(u16 glyphId, bool32 isJapanese)
+s32 GetGlyphWidthFont1(u16 glyphId, bool32 isJapanese)
{
if (isJapanese == TRUE)
return 8;
@@ -1962,7 +1962,7 @@ void DecompressGlyphFont2(u16 glyphId, bool32 isJapanese)
}
}
-u32 GetGlyphWidthFont2(u16 glyphId, bool32 isJapanese)
+s32 GetGlyphWidthFont2(u16 glyphId, bool32 isJapanese)
{
if (isJapanese == TRUE)
{
@@ -2012,7 +2012,7 @@ void DecompressGlyphFont3(u16 glyphId, bool32 isJapanese)
DecompressGlyphFont2(glyphId, isJapanese);
}
-u32 GetGlyphWidthFont3(u16 glyphId, bool32 isJapanese)
+s32 GetGlyphWidthFont3(u16 glyphId, bool32 isJapanese)
{
if(isJapanese == TRUE)
return 10;
@@ -2078,7 +2078,7 @@ void DecompressGlyphFont4(u16 glyphId, bool32 isJapanese)
}
}
-u32 GetGlyphWidthFont4(u16 glyphId, bool32 isJapanese)
+s32 GetGlyphWidthFont4(u16 glyphId, bool32 isJapanese)
{
if(isJapanese == TRUE)
{
@@ -2149,7 +2149,7 @@ void DecompressGlyphFont5(u16 glyphId, bool32 isJapanese)
}
}
-u32 GetGlyphWidthFont5(u16 glyphId, bool32 isJapanese)
+s32 GetGlyphWidthFont5(u16 glyphId, bool32 isJapanese)
{
if(isJapanese == TRUE)
{
diff --git a/src/vs_seeker.c b/src/vs_seeker.c
index 17a13ab01..4d42f270d 100644
--- a/src/vs_seeker.c
+++ b/src/vs_seeker.c
@@ -63,7 +63,7 @@ struct VsSeekerStruct
u8 responseCode:5;
};
-extern u16 gUnknown_20370D2;
+extern u16 gSpecialVar_LastTalked;
extern struct MapObject gMapObjects[MAP_OBJECTS_COUNT];
extern u8 gUnknown_3005074;
@@ -588,7 +588,7 @@ void Task_VsSeeker_0(u8 taskId)
}
else if (respval == 2)
{
- sub_80A2294(4, 0, gUnknown_203AD30, 0xffff);
+ sub_80A2294(4, 0, gSpecialVar_ItemId, 0xffff);
FieldEffectStart(FLDEFF_UNK_41); // TODO: name this enum
gTasks[taskId].func = Task_VsSeeker_1;
gTasks[taskId].data[0] = 15;
@@ -1078,7 +1078,7 @@ static bool8 sub_810CD80(const VsSeekerData *vsSeekerData, u16 trainerBattleOppo
return FALSE;
if (rematchIdx >= 0 && rematchIdx < ARRAY_COUNT(sVsSeekerData))
{
- if (IsThisTrainerRematchable(gUnknown_20370D2))
+ if (IsThisTrainerRematchable(gSpecialVar_LastTalked))
return TRUE;
}
return FALSE;
@@ -1097,7 +1097,7 @@ static bool8 HasRematchTrainerAlreadyBeenFought(const VsSeekerData *vsSeekerData
void sub_810CDE8(void)
{
- gSaveBlock1Ptr->trainerRematches[gUnknown_20370D2] = 0;
+ gSaveBlock1Ptr->trainerRematches[gSpecialVar_LastTalked] = 0;
sub_80803FC();
}
@@ -1148,7 +1148,7 @@ static bool8 sub_810CED0(const VsSeekerData * a0, u16 a1)
return FALSE;
if ((u32)r1 >= ARRAY_COUNT(sVsSeekerData))
return FALSE;
- if (!IsThisTrainerRematchable(gUnknown_20370D2))
+ if (!IsThisTrainerRematchable(gSpecialVar_LastTalked))
return FALSE;
return TRUE;
}