diff options
author | Swastik Baranwal <swstkbaranwal@gmail.com> | 2018-12-27 16:00:22 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-27 16:00:22 +0530 |
commit | 95c3652551aacf612a19336e17ce00a2ec1046d2 (patch) | |
tree | 882caaf9875700cccb73e391a7a014a782e579fa /src | |
parent | 2ed26ab8fcd4e302ab4aac6bb01dba7b5c985914 (diff) | |
parent | d5de7960a330953b3a7d7684122997c0d8aedcf1 (diff) |
Merge pull request #2 from pret/master
Taking files
Diffstat (limited to 'src')
-rw-r--r-- | src/bg.c | 27 | ||||
-rw-r--r-- | src/dma3_manager.c | 2 | ||||
-rw-r--r-- | src/fame_checker.c | 1553 | ||||
-rw-r--r-- | src/load_save.c | 8 | ||||
-rw-r--r-- | src/main.c | 4 | ||||
-rw-r--r-- | src/menews_jisan.c | 4 | ||||
-rw-r--r-- | src/mevent.c | 1016 | ||||
-rw-r--r-- | src/mevent_8145654.c | 793 | ||||
-rw-r--r-- | src/mevent_server.c | 563 | ||||
-rw-r--r-- | src/mevent_server_helpers.c | 211 | ||||
-rw-r--r-- | src/mystery_event_msg.c | 13 | ||||
-rw-r--r-- | src/mystery_event_script.c | 322 | ||||
-rw-r--r-- | src/pokemon.c | 2 | ||||
-rw-r--r-- | src/quest_log.c | 5027 | ||||
-rw-r--r-- | src/quest_log_8150454.c | 197 | ||||
-rw-r--r-- | src/quest_log_battle.c | 164 | ||||
-rw-r--r-- | src/save.c | 7 | ||||
-rw-r--r-- | src/script.c | 22 | ||||
-rw-r--r-- | src/sound.c | 10 | ||||
-rw-r--r-- | src/text.c | 26 | ||||
-rw-r--r-- | src/vs_seeker.c | 10 |
21 files changed, 9925 insertions, 56 deletions
@@ -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; } |