From d080ebd0f06a67c61b1d1ad0fcb82848381c6f4a Mon Sep 17 00:00:00 2001 From: SphericalIce Date: Fri, 30 Dec 2022 23:59:45 +0000 Subject: [PATCH] Document oak_speech.c --- data/text/new_game_intro.inc | 44 +- ...{background_tilemap.bin => background.bin} | Bin .../{solid_colors.png => background.png} | Bin .../page_2.bin} | Bin .../page_3.bin} | Bin .../palette.pal} | 0 .../tiles.png} | Bin .../oak_speech/{leaf_pal.pal => leaf/pal.pal} | 0 .../oak_speech/{leaf_pic.png => leaf/pic.png} | Bin .../oak_speech/{oak_pal.pal => oak/pal.pal} | 0 .../oak_speech/{oak_pic.png => oak/pic.png} | Bin .../{pika1.png => pikachu_intro/body.png} | Bin .../{pika2.png => pikachu_intro/ears.png} | Bin .../{pika_eyes.png => pikachu_intro/eyes.png} | Bin .../pikachu.pal} | 0 .../tilemap.bin} | 0 ...rass_platform_palette.pal => platform.pal} | 0 .../{grass_platform.png => platform.png} | Bin .../oak_speech/{red_pal.pal => red/pal.pal} | 0 .../oak_speech/{red_pic.png => red/pic.png} | Bin .../{rival_pal.pal => rival/pal.pal} | 0 .../{rival_pic.png => rival/pic.png} | Bin include/event_scripts.h | 44 +- include/pokeball.h | 4 +- src/oak_speech.c | 1997 ++++++++++------- 25 files changed, 1178 insertions(+), 911 deletions(-) rename graphics/oak_speech/{background_tilemap.bin => background.bin} (100%) rename graphics/oak_speech/{solid_colors.png => background.png} (100%) rename graphics/oak_speech/{help_docs_page2_tilemap.bin => controls_guide/page_2.bin} (100%) rename graphics/oak_speech/{help_docs_page3_tilemap.bin => controls_guide/page_3.bin} (100%) rename graphics/oak_speech/{help_docs_palette.pal => controls_guide/palette.pal} (100%) rename graphics/oak_speech/{game_start_help_ui.png => controls_guide/tiles.png} (100%) rename graphics/oak_speech/{leaf_pal.pal => leaf/pal.pal} (100%) rename graphics/oak_speech/{leaf_pic.png => leaf/pic.png} (100%) rename graphics/oak_speech/{oak_pal.pal => oak/pal.pal} (100%) rename graphics/oak_speech/{oak_pic.png => oak/pic.png} (100%) rename graphics/oak_speech/{pika1.png => pikachu_intro/body.png} (100%) rename graphics/oak_speech/{pika2.png => pikachu_intro/ears.png} (100%) rename graphics/oak_speech/{pika_eyes.png => pikachu_intro/eyes.png} (100%) rename graphics/oak_speech/{pika_palette.pal => pikachu_intro/pikachu.pal} (100%) rename graphics/oak_speech/{new_game_adventure_intro_tilemap.bin => pikachu_intro/tilemap.bin} (100%) rename graphics/oak_speech/{grass_platform_palette.pal => platform.pal} (100%) rename graphics/oak_speech/{grass_platform.png => platform.png} (100%) rename graphics/oak_speech/{red_pal.pal => red/pal.pal} (100%) rename graphics/oak_speech/{red_pic.png => red/pic.png} (100%) rename graphics/oak_speech/{rival_pal.pal => rival/pal.pal} (100%) rename graphics/oak_speech/{rival_pic.png => rival/pic.png} (100%) diff --git a/data/text/new_game_intro.inc b/data/text/new_game_intro.inc index 504d0675f..da895d316 100644 --- a/data/text/new_game_intro.inc +++ b/data/text/new_game_intro.inc @@ -124,32 +124,32 @@ gNameChoice_Momo:: gNameChoice_Suzi:: .string "SUZI$" -gNewGame_HelpDocs1:: +gControlsGuide_Text_Intro:: .string "The various buttons will be explained in\n" .string "the order of their importance.$" -gNewGame_HelpDocs2:: +gControlsGuide_Text_DPad:: .string "Moves the main character.\n" .string "Also used to choose various data\n" .string "headings.$" -gNewGame_HelpDocs3:: +gControlsGuide_Text_AButton:: .string "Used to confirm a choice, check\n" .string "things, chat, and scroll text.$" -gNewGame_HelpDocs4:: +gControlsGuide_Text_BButton:: .string "Used to exit, cancel a choice,\n" .string "and cancel a mode.$" -gNewGame_HelpDocs5:: +gControlsGuide_Text_StartButton:: .string "Press this button to open the\n" .string "MENU.$" -gNewGame_HelpDocs6:: +gControlsGuide_Text_SelectButton:: .string "Used to shift items and to use\n" .string "a registered item.$" -gNewGame_HelpDocs7:: +gControlsGuide_Text_LRButtons:: .string "If you need help playing the\n" .string "game, or on how to do things,\n" .string "press the L or R Button.$" @@ -158,7 +158,7 @@ gOakText_AskPlayerGender:: .string "Now tell me. Are you a boy?\n" .string "Or are you a girl?$" -gNewGameAdventureIntro1:: +gPikachuIntro_Text_Page1:: .string "In the world which you are about to\n" .string "enter, you will embark on a grand\n" .string "adventure with you as the hero.\n" @@ -168,7 +168,7 @@ gNewGameAdventureIntro1:: .string "or caves. Gather information and\n" .string "hints from every source.$" -gNewGameAdventureIntro2:: +gPikachuIntro_Text_Page2:: .string "New paths will open to you by helping\n" .string "people in need, overcoming challenges,\n" .string "and solving mysteries.\n" @@ -177,7 +177,7 @@ gNewGameAdventureIntro2:: .string "others and attacked by wild creatures.\n" .string "Be brave and keep pushing on.$" -gNewGameAdventureIntro3:: +gPikachuIntro_Text_Page3:: .string "Through your adventure, we hope\n" .string "that you will interact with all sorts\n" .string "of people and achieve personal growth.\n" @@ -186,49 +186,49 @@ gNewGameAdventureIntro3:: .string "Press the A Button, and let your\n" .string "adventure begin!$" -gOakText_WelcomeToTheWorld:: +gOakSpeech_Text_WelcomeToTheWorld:: .string "Hello, there!\n" .string "Glad to meet you!\pWelcome to the world of POKéMON!\pMy name is OAK.\pPeople affectionately refer to me\n" .string "as the POKéMON PROFESSOR.\p$" -gOakText_WorldInhabited1:: +gOakSpeech_Text_ThisWorld:: .string "This world…$" -gOakText_WorldInhabited2:: +gOakSpeech_Text_IsInhabitedFarAndWide:: .string "…is inhabited far and wide by\n" .string "creatures called POKéMON.\p$" -gOakText_PetsBattlingStudy:: +gOakSpeech_Text_IStudyPokemon:: .string "For some people, POKéMON are pets.\n" .string "Others use them for battling.\pAs for myself…\pI study POKéMON as a profession.\p$" -gOakText_TellMeALittleAboutYourself:: +gOakSpeech_Text_TellMeALittleAboutYourself:: .string "But first, tell me a little about\n" .string "yourself.\p$" -gOakText_AskPlayerName:: +gOakSpeech_Text_YourNameWhatIsIt:: .string "Let's begin with your name.\n" .string "What is it?\p$" -gOakText_FinalizePlayerName:: +gOakSpeech_Text_SoYourNameIsPlayer:: .string "Right…\n" .string "So your name is {PLAYER}.$" -gOakText_IntroduceRival:: +gOakSpeech_Text_WhatWasHisName:: .string "This is my grandson.\pHe's been your rival since you both\n" .string "were babies.\p…Erm, what was his name now?$" -gOakText_AskRivalName:: +gOakSpeech_Text_YourRivalsNameWhatWasIt:: .string "Your rival's name, what was it now?$" -gOakText_ConfirmRivalName:: +gOakSpeech_Text_ConfirmRivalName:: .string "…Er, was it {RIVAL}?$" -gOakText_RememberRivalName:: +gOakSpeech_Text_RememberRivalsName:: .string "That's right! I remember now!\n" .string "His name is {RIVAL}!\p$" -gOakText_LegendAboutToUnfold:: +gOakSpeech_Text_LetsGo:: .string "{PLAYER}!\pYour very own POKéMON legend is\n" .string "about to unfold!\pA world of dreams and adventures\n" .string "with POKéMON awaits! Let's go!$" diff --git a/graphics/oak_speech/background_tilemap.bin b/graphics/oak_speech/background.bin similarity index 100% rename from graphics/oak_speech/background_tilemap.bin rename to graphics/oak_speech/background.bin diff --git a/graphics/oak_speech/solid_colors.png b/graphics/oak_speech/background.png similarity index 100% rename from graphics/oak_speech/solid_colors.png rename to graphics/oak_speech/background.png diff --git a/graphics/oak_speech/help_docs_page2_tilemap.bin b/graphics/oak_speech/controls_guide/page_2.bin similarity index 100% rename from graphics/oak_speech/help_docs_page2_tilemap.bin rename to graphics/oak_speech/controls_guide/page_2.bin diff --git a/graphics/oak_speech/help_docs_page3_tilemap.bin b/graphics/oak_speech/controls_guide/page_3.bin similarity index 100% rename from graphics/oak_speech/help_docs_page3_tilemap.bin rename to graphics/oak_speech/controls_guide/page_3.bin diff --git a/graphics/oak_speech/help_docs_palette.pal b/graphics/oak_speech/controls_guide/palette.pal similarity index 100% rename from graphics/oak_speech/help_docs_palette.pal rename to graphics/oak_speech/controls_guide/palette.pal diff --git a/graphics/oak_speech/game_start_help_ui.png b/graphics/oak_speech/controls_guide/tiles.png similarity index 100% rename from graphics/oak_speech/game_start_help_ui.png rename to graphics/oak_speech/controls_guide/tiles.png diff --git a/graphics/oak_speech/leaf_pal.pal b/graphics/oak_speech/leaf/pal.pal similarity index 100% rename from graphics/oak_speech/leaf_pal.pal rename to graphics/oak_speech/leaf/pal.pal diff --git a/graphics/oak_speech/leaf_pic.png b/graphics/oak_speech/leaf/pic.png similarity index 100% rename from graphics/oak_speech/leaf_pic.png rename to graphics/oak_speech/leaf/pic.png diff --git a/graphics/oak_speech/oak_pal.pal b/graphics/oak_speech/oak/pal.pal similarity index 100% rename from graphics/oak_speech/oak_pal.pal rename to graphics/oak_speech/oak/pal.pal diff --git a/graphics/oak_speech/oak_pic.png b/graphics/oak_speech/oak/pic.png similarity index 100% rename from graphics/oak_speech/oak_pic.png rename to graphics/oak_speech/oak/pic.png diff --git a/graphics/oak_speech/pika1.png b/graphics/oak_speech/pikachu_intro/body.png similarity index 100% rename from graphics/oak_speech/pika1.png rename to graphics/oak_speech/pikachu_intro/body.png diff --git a/graphics/oak_speech/pika2.png b/graphics/oak_speech/pikachu_intro/ears.png similarity index 100% rename from graphics/oak_speech/pika2.png rename to graphics/oak_speech/pikachu_intro/ears.png diff --git a/graphics/oak_speech/pika_eyes.png b/graphics/oak_speech/pikachu_intro/eyes.png similarity index 100% rename from graphics/oak_speech/pika_eyes.png rename to graphics/oak_speech/pikachu_intro/eyes.png diff --git a/graphics/oak_speech/pika_palette.pal b/graphics/oak_speech/pikachu_intro/pikachu.pal similarity index 100% rename from graphics/oak_speech/pika_palette.pal rename to graphics/oak_speech/pikachu_intro/pikachu.pal diff --git a/graphics/oak_speech/new_game_adventure_intro_tilemap.bin b/graphics/oak_speech/pikachu_intro/tilemap.bin similarity index 100% rename from graphics/oak_speech/new_game_adventure_intro_tilemap.bin rename to graphics/oak_speech/pikachu_intro/tilemap.bin diff --git a/graphics/oak_speech/grass_platform_palette.pal b/graphics/oak_speech/platform.pal similarity index 100% rename from graphics/oak_speech/grass_platform_palette.pal rename to graphics/oak_speech/platform.pal diff --git a/graphics/oak_speech/grass_platform.png b/graphics/oak_speech/platform.png similarity index 100% rename from graphics/oak_speech/grass_platform.png rename to graphics/oak_speech/platform.png diff --git a/graphics/oak_speech/red_pal.pal b/graphics/oak_speech/red/pal.pal similarity index 100% rename from graphics/oak_speech/red_pal.pal rename to graphics/oak_speech/red/pal.pal diff --git a/graphics/oak_speech/red_pic.png b/graphics/oak_speech/red/pic.png similarity index 100% rename from graphics/oak_speech/red_pic.png rename to graphics/oak_speech/red/pic.png diff --git a/graphics/oak_speech/rival_pal.pal b/graphics/oak_speech/rival/pal.pal similarity index 100% rename from graphics/oak_speech/rival_pal.pal rename to graphics/oak_speech/rival/pal.pal diff --git a/graphics/oak_speech/rival_pic.png b/graphics/oak_speech/rival/pic.png similarity index 100% rename from graphics/oak_speech/rival_pic.png rename to graphics/oak_speech/rival/pic.png diff --git a/include/event_scripts.h b/include/event_scripts.h index 49857a76b..388cc598a 100644 --- a/include/event_scripts.h +++ b/include/event_scripts.h @@ -748,29 +748,29 @@ extern const u8 gNameChoice_Norie[]; extern const u8 gNameChoice_Sai[]; extern const u8 gNameChoice_Momo[]; extern const u8 gNameChoice_Suzi[]; -extern const u8 gNewGame_HelpDocs1[]; -extern const u8 gNewGame_HelpDocs2[]; -extern const u8 gNewGame_HelpDocs3[]; -extern const u8 gNewGame_HelpDocs4[]; -extern const u8 gNewGame_HelpDocs5[]; -extern const u8 gNewGame_HelpDocs6[]; -extern const u8 gNewGame_HelpDocs7[]; +extern const u8 gControlsGuide_Text_Intro[]; +extern const u8 gControlsGuide_Text_DPad[]; +extern const u8 gControlsGuide_Text_AButton[]; +extern const u8 gControlsGuide_Text_BButton[]; +extern const u8 gControlsGuide_Text_StartButton[]; +extern const u8 gControlsGuide_Text_SelectButton[]; +extern const u8 gControlsGuide_Text_LRButtons[]; extern const u8 gOakText_AskPlayerGender[]; -extern const u8 gNewGameAdventureIntro1[]; -extern const u8 gNewGameAdventureIntro2[]; -extern const u8 gNewGameAdventureIntro3[]; -extern const u8 gOakText_WelcomeToTheWorld[]; -extern const u8 gOakText_WorldInhabited1[]; -extern const u8 gOakText_WorldInhabited2[]; -extern const u8 gOakText_PetsBattlingStudy[]; -extern const u8 gOakText_TellMeALittleAboutYourself[]; -extern const u8 gOakText_AskPlayerName[]; -extern const u8 gOakText_FinalizePlayerName[]; -extern const u8 gOakText_IntroduceRival[]; -extern const u8 gOakText_AskRivalName[]; -extern const u8 gOakText_ConfirmRivalName[]; -extern const u8 gOakText_RememberRivalName[]; -extern const u8 gOakText_LegendAboutToUnfold[]; +extern const u8 gPikachuIntro_Text_Page1[]; +extern const u8 gPikachuIntro_Text_Page2[]; +extern const u8 gPikachuIntro_Text_Page3[]; +extern const u8 gOakSpeech_Text_WelcomeToTheWorld[]; +extern const u8 gOakSpeech_Text_ThisWorld[]; +extern const u8 gOakSpeech_Text_IsInhabitedFarAndWide[]; +extern const u8 gOakSpeech_Text_IStudyPokemon[]; +extern const u8 gOakSpeech_Text_TellMeALittleAboutYourself[]; +extern const u8 gOakSpeech_Text_YourNameWhatIsIt[]; +extern const u8 gOakSpeech_Text_SoYourNameIsPlayer[]; +extern const u8 gOakSpeech_Text_WhatWasHisName[]; +extern const u8 gOakSpeech_Text_YourRivalsNameWhatWasIt[]; +extern const u8 gOakSpeech_Text_ConfirmRivalName[]; +extern const u8 gOakSpeech_Text_RememberRivalsName[]; +extern const u8 gOakSpeech_Text_LetsGo[]; // Help System extern const u8 Help_Text_WhatShouldIDo[]; diff --git a/include/pokeball.h b/include/pokeball.h index 0ef6d4357..5c4785f4c 100644 --- a/include/pokeball.h +++ b/include/pokeball.h @@ -36,8 +36,8 @@ extern const struct SpriteTemplate gBallSpriteTemplates[]; #define POKEBALL_OPPONENT_SENDOUT 0xFE u8 DoPokeballSendOutAnimation(s16 pan, u8 kindOfThrow); -void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 bank, u8 x, u8 y, u8 oamPriority, u8 subpriortiy, u8 g, u32 h); -u8 CreateTradePokeballSprite(u8 monSpriteId, u8 bank, u8 x, u8 y, u8 oamPriority, u8 subpriortiy, u8 g, u32 h); +void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subpriortiy, u8 delay, u32 fadePalettes); +u8 CreateTradePokeballSprite(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subPriority, u8 delay, u32 fadePalettes); void DoHitAnimHealthboxEffect(u8 bank); void LoadBallGfx(u8 ballId); void FreeBallGfx(u8 ballId); diff --git a/src/oak_speech.c b/src/oak_speech.c index 7f10528f6..32a9a6a37 100644 --- a/src/oak_speech.c +++ b/src/oak_speech.c @@ -17,111 +17,127 @@ #include "data.h" #include "constants/songs.h" +enum +{ + WIN_INTRO_TEXTBOX, + WIN_INTRO_BOYGIRL, + WIN_INTRO_YESNO, + WIN_INTRO_NAMES, + NUM_INTRO_WINDOWS, +}; + struct OakSpeechResources { - void *solidColorsGfx; - void *trainerPicTilemapBuffer; - void *unk_0008; - u8 filler_000C[4]; + void *oakSpeechBackgroundTiles; + void *trainerPicTilemap; + void *pikachuIntroTilemap; + void *unused1; u16 hasPlayerBeenNamed; - u16 unk_0012; - u16 unk_0014[4]; + u16 currentPage; + u16 windowIds[NUM_INTRO_WINDOWS]; u8 textColor[3]; u8 textSpeed; - u8 filler_0020[0x1800]; + u8 unused2[0x1800]; u8 bg2TilemapBuffer[0x400]; u8 bg1TilemapBuffer[0x800]; -}; //size=0x2420 +}; -EWRAM_DATA struct OakSpeechResources * sOakSpeechResources = NULL; +static EWRAM_DATA struct OakSpeechResources *sOakSpeechResources = NULL; -static void Task_OaksSpeech1(u8 taskId); -static void CreateHelpDocsPage1(void); -static void Task_OaksSpeech2(u8 taskId); -static void Task_OakSpeech3(u8 taskId); -static void Task_OakSpeech5(u8 taskId); -static void Task_OakSpeech6(u8 taskId); -static void Task_OakSpeech7(u8 taskId); -static void Task_OakSpeech8(u8 taskId); -static void Task_OakSpeech9(u8 taskId); -static void Task_OakSpeech10(u8 taskId); -static void Task_OakSpeech10(u8 taskId); -static void Task_OakSpeech11(u8 taskId); -static void Task_OakSpeech12(u8 taskId); -static void Task_OakSpeech13(u8 taskId); -static void Task_OakSpeech14(u8 taskId); -static void Task_OakSpeech15(u8 taskId); -static void Task_OakSpeech16(u8 taskId); -static void Task_OakSpeech17(u8 taskId); -static void Task_OakSpeech18(u8 taskId); -static void Task_OakSpeech19(u8 taskId); -static void Task_OakSpeech20(u8 taskId); -static void Task_OakSpeech21(u8 taskId); -static void Task_OakSpeech22(u8 taskId); -static void Task_OakSpeech23(u8 taskId); -static void Task_OakSpeech24(u8 taskId); -static void Task_OakSpeech29(u8 taskId); -static void Task_OakSpeech25(u8 taskId); -static void Task_OakSpeech26(u8 taskId); -static void Task_OakSpeech27(u8 taskId); -static void Task_OakSpeech30(u8 taskId); -static void Task_OakSpeech31(u8 taskId); -static void Task_OakSpeech32(u8 taskId); -static void Task_OakSpeech34(u8 taskId); -static void Task_OakSpeech33(u8 taskId); -static void Task_OakSpeech36(u8 taskId); -static void Task_OakSpeech37(u8 taskId); -static void Task_OakSpeech38(u8 taskId); -static void Task_OakSpeech38_3(u8 taskId); -static void Task_OakSpeech39(u8 taskId); -static void Task_OakSpeech38_1(u8 taskId); -static void Task_OakSpeech38_sub1(u8 taskId); -static void Task_OakSpeech38_2(u8 taskId); -static void Task_OakSpeech38_sub2(u8 taskId); -static void Task_OakSpeech40(u8 taskId); -static void Task_OakSpeech41(u8 taskId); -static void Task_OakSpeech42(u8 taskId); +static void Task_NewGameScene(u8); + +static void ControlsGuide_LoadPage1(void); +static void Task_ControlsGuide_HandleInput(u8); +static void Task_ControlsGuide_ChangePage(u8); +static void Task_ControlsGuide_Clear(u8); + +static void Task_PikachuIntro_LoadPage1(u8); +static void Task_PikachuIntro_HandleInput(u8); +static void Task_PikachuIntro_Clear(u8); + +static void Task_OakSpeech_Init(u8); +static void Task_OakSpeech_WelcomeToTheWorld(u8); +static void Task_OakSpeech_ThisWorld(u8); +static void Task_OakSpeech_ReleaseNidoranFFromPokeBall(u8); +static void Task_OakSpeech_IsInhabitedFarAndWide(u8); +static void Task_OakSpeech_IStudyPokemon(u8); +static void Task_OakSpeech_ReturnNidoranFToPokeBall(u8); +static void Task_OakSpeech_TellMeALittleAboutYourself(u8); +static void Task_OakSpeech_FadeOutOak(u8); +static void Task_OakSpeech_AskPlayerGender(u8); +static void Task_OakSpeech_ShowGenderOptions(u8); +static void Task_OakSpeech_HandleGenderInput(u8); +static void Task_OakSpeech_ClearGenderWindows(u8); +static void Task_OakSpeech_LoadPlayerPic(u8); +static void Task_OakSpeech_YourNameWhatIsIt(u8); +static void Task_OakSpeech_FadeOutForPlayerNamingScreen(u8); +static void Task_OakSpeech_HandleRivalNameInput(u8); +static void Task_OakSpeech_DoNamingScreen(u8); +static void Task_OakSpeech_ConfirmName(u8); +static void Task_OakSpeech_HandleConfirmNameInput(u8); +static void Task_OakSpeech_FadeOutPlayerPic(u8); +static void Task_OakSpeech_FadeOutRivalPic(u8); +static void Task_OakSpeech_FadeInRivalPic(u8); +static void Task_OakSpeech_AskRivalsName(u8); +static void Task_OakSpeech_ReshowPlayersPic(u8); +static void Task_OakSpeech_LetsGo(u8); +static void Task_OakSpeech_FadeOutBGM(u8); +static void Task_OakSpeech_SetUpExitAnimation(u8); +static void Task_OakSpeech_SetUpShrinkPlayerPic(u8); +static void Task_OakSpeech_ShrinkPlayerPic(u8); +static void Task_OakSpeech_SetUpDestroyPlatformSprites(u8); +static void Task_OakSpeech_DestroyPlatformSprites(u8); +static void Task_OakSpeech_SetUpFadePlayerPicWhite(u8); +static void Task_OakSpeech_FadePlayerPicWhite(u8); +static void Task_OakSpeech_FadePlayerPicToBlack(u8); +static void Task_OakSpeech_WaitForFade(u8); +static void Task_OakSpeech_FreeResources(u8); static void CB2_ReturnFromNamingScreen(void); -static void CreateNidoranFSprite(u8 taskId); -static void CreatePikaOrGrassPlatformSpriteAndLinkToCurrentTask(u8 taskId, u8 state); -static void DestroyLinkedPikaOrGrassPlatformSprites(u8 taskId, u8 state); -static void LoadOaksSpeechTrainerPic(u16 whichPic, u16 tileOffset); -static void DestroyOaksSpeechTrainerPic(void); -static void CreateFadeInTask(u8 taskId, u8 state); -static void CreateFadeOutTask(u8 taskId, u8 state); -static void PrintNameChoiceOptions(u8 taskId, u8 state); -static void GetDefaultName(u8 hasPlayerBeenNamed, u8 rivalNameChoice); +static void CreateNidoranFSprite(u8); +static void CreatePikachuOrPlatformSprites(u8, u8); +static void DestroyPikachuOrPlatformSprites(u8, u8); +static void LoadTrainerPic(u16, u16); +static void ClearTrainerPic(void); +static void CreateFadeInTask(u8, u8); +static void CreateFadeOutTask(u8, u8); +static void PrintNameChoiceOptions(u8, u8); +static void GetDefaultName(u8, u8); extern const u8 gText_Controls[]; extern const u8 gText_ABUTTONNext[]; extern const u8 gText_ABUTTONNext_BBUTTONBack[]; extern const u8 gText_Boy[]; extern const u8 gText_Girl[]; +extern const struct OamData gOamData_AffineOff_ObjBlend_32x32; +extern const struct OamData gOamData_AffineOff_ObjNormal_32x32; +extern const struct OamData gOamData_AffineOff_ObjNormal_32x16; +extern const struct OamData gOamData_AffineOff_ObjNormal_16x8; -ALIGNED(4) static const u16 sHelpDocsPalette[] = INCBIN_U16("graphics/oak_speech/help_docs_palette.gbapal"); -static const u32 sOakSpeechGfx_GameStartHelpUI[] = INCBIN_U32("graphics/oak_speech/game_start_help_ui.4bpp.lz"); -static const u32 sNewGameAdventureIntroTilemap[] = INCBIN_U32("graphics/oak_speech/new_game_adventure_intro_tilemap.bin.lz"); -static const u32 sOakSpeechGfx_SolidColors[] = INCBIN_U32("graphics/oak_speech/solid_colors.4bpp.lz"); -static const u32 sOakSpeech_BackgroundTilemap[] = INCBIN_U32("graphics/oak_speech/background_tilemap.bin.lz"); -static const u16 sHelpDocsPage2Tilemap[] = INCBIN_U16("graphics/oak_speech/help_docs_page2_tilemap.bin"); -static const u16 sHelpDocsPage3Tilemap[] = INCBIN_U16("graphics/oak_speech/help_docs_page3_tilemap.bin"); -static const u16 sOakSpeechGfx_LeafPal[] = INCBIN_U16("graphics/oak_speech/leaf_pal.gbapal"); -static const u32 sOakSpeechGfx_LeafPic[] = INCBIN_U32("graphics/oak_speech/leaf_pic.8bpp.lz"); -static const u16 sOakSpeechGfx_RedPal[] = INCBIN_U16("graphics/oak_speech/red_pal.gbapal"); -static const u32 sOakSpeechGfx_RedPic[] = INCBIN_U32("graphics/oak_speech/red_pic.8bpp.lz"); -static const u16 sOakSpeechGfx_OakPal[] = INCBIN_U16("graphics/oak_speech/oak_pal.gbapal"); -static const u32 sOakSpeechGfx_OakPic[] = INCBIN_U32("graphics/oak_speech/oak_pic.8bpp.lz"); -static const u16 sOakSpeechGfx_RivalPal[] = INCBIN_U16("graphics/oak_speech/rival_pal.gbapal"); -static const u32 sOakSpeechGfx_RivalPic[] = INCBIN_U32("graphics/oak_speech/rival_pic.8bpp.lz"); -static const u16 sOakSpeech_GrassPlatformPalette[] = INCBIN_U16("graphics/oak_speech/grass_platform_palette.gbapal"); -static const u16 sOakSpeech_PikaPalette[] = INCBIN_U16("graphics/oak_speech/pika_palette.gbapal"); -static const u32 sOakSpeechGfx_GrassPlatform[] = INCBIN_U32("graphics/oak_speech/grass_platform.4bpp.lz"); -static const u32 sOakSpeechGfx_Pika1[] = INCBIN_U32("graphics/oak_speech/pika1.4bpp.lz"); -static const u32 sOakSpeechGfx_Pika2[] = INCBIN_U32("graphics/oak_speech/pika2.4bpp.lz"); -static const u32 sOakSpeechGfx_PikaEyes[] = INCBIN_U32("graphics/oak_speech/pika_eyes.4bpp.lz"); +static const u16 sControlsGuide_Pal[] = INCBIN_U16("graphics/oak_speech/controls_guide/palette.gbapal"); +static const u32 sControlsGuide_Tiles[] = INCBIN_U32("graphics/oak_speech/controls_guide/tiles.4bpp.lz"); +static const u32 sPikachuIntro_Tilemap[] = INCBIN_U32("graphics/oak_speech/pikachu_intro/tilemap.bin.lz"); +static const u32 sOakSpeech_Background_Tiles[] = INCBIN_U32("graphics/oak_speech/background.4bpp.lz"); +static const u32 sOakSpeech_Background_Tilemap[] = INCBIN_U32("graphics/oak_speech/background.bin.lz"); +static const u16 sControlsGuide_Tilemap_Page2[] = INCBIN_U16("graphics/oak_speech/controls_guide/page_2.bin"); +static const u16 sControlsGuide_Tilemap_Page3[] = INCBIN_U16("graphics/oak_speech/controls_guide/page_3.bin"); +static const u16 sOakSpeech_Leaf_Pal[] = INCBIN_U16("graphics/oak_speech/leaf/pal.gbapal"); +static const u32 sOakSpeech_Leaf_Tiles[] = INCBIN_U32("graphics/oak_speech/leaf/pic.8bpp.lz"); +static const u16 sOakSpeech_Red_Pal[] = INCBIN_U16("graphics/oak_speech/red/pal.gbapal"); +static const u32 sOakSpeech_Red_Tiles[] = INCBIN_U32("graphics/oak_speech/red/pic.8bpp.lz"); +static const u16 sOakSpeech_Oak_Pal[] = INCBIN_U16("graphics/oak_speech/oak/pal.gbapal"); +static const u32 sOakSpeech_Oak_Tiles[] = INCBIN_U32("graphics/oak_speech/oak/pic.8bpp.lz"); +static const u16 sOakSpeech_Rival_Pal[] = INCBIN_U16("graphics/oak_speech/rival/pal.gbapal"); +static const u32 sOakSpeech_Rival_Tiles[] = INCBIN_U32("graphics/oak_speech/rival/pic.8bpp.lz"); +static const u16 sOakSpeech_Platform_Pal[] = INCBIN_U16("graphics/oak_speech/platform.gbapal"); +static const u16 sPikachuIntro_Pikachu_Pal[] = INCBIN_U16("graphics/oak_speech/pikachu_intro/pikachu.gbapal"); +static const u32 sOakSpeech_Platform_Gfx[] = INCBIN_U32("graphics/oak_speech/platform.4bpp.lz"); +static const u32 sPikachuIntro_PikachuBody_Gfx[] = INCBIN_U32("graphics/oak_speech/pikachu_intro/body.4bpp.lz"); +static const u32 sPikachuIntro_PikachuEars_Gfx[] = INCBIN_U32("graphics/oak_speech/pikachu_intro/ears.4bpp.lz"); +static const u32 sPikachuIntro_PikachuEyes_Gfx[] = INCBIN_U32("graphics/oak_speech/pikachu_intro/eyes.4bpp.lz"); -static const struct BgTemplate sBgTemplates[3] = { +static const struct BgTemplate sBgTemplates[] = +{ { .bg = 0, .charBaseIndex = 2, @@ -129,208 +145,344 @@ static const struct BgTemplate sBgTemplates[3] = { .screenSize = 0, .paletteMode = 0, .priority = 0, - .baseTile = 0x000 - }, { + .baseTile = 0 + }, + { .bg = 1, .charBaseIndex = 0, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 2, - .baseTile = 0x000 - }, { + .baseTile = 0 + }, + { .bg = 2, .charBaseIndex = 0, .mapBaseIndex = 28, .screenSize = 1, .paletteMode = 1, .priority = 1, - .baseTile = 0x000 + .baseTile = 0 } }; -static const struct WindowTemplate sHelpDocsWindowTemplates1[] = { +enum +{ + CONTROLS_GUIDE_PAGE_1_WINDOW, + NUM_CONTROLS_GUIDE_PAGE_1_WINDOWS, +}; + +static const struct WindowTemplate sControlsGuide_WindowTemplate_Page1[NUM_CONTROLS_GUIDE_PAGE_1_WINDOWS + 1] = +{ + [CONTROLS_GUIDE_PAGE_1_WINDOW] = { - .bg = 0x00, - .tilemapLeft = 0x00, - .tilemapTop = 0x07, - .width = 0x1e, - .height = 0x04, - .paletteNum = 0x0f, - .baseBlock = 0x0001 - }, DUMMY_WIN_TEMPLATE + .bg = 0, + .tilemapLeft = 0, + .tilemapTop = 7, + .width = 30, + .height = 4, + .paletteNum = 15, + .baseBlock = 1 + }, + DUMMY_WIN_TEMPLATE }; -static const struct WindowTemplate sHelpDocsWindowTemplates2[] = { +enum +{ + CONTROLS_GUIDE_PAGES_2_3_WINDOW_TOP, + CONTROLS_GUIDE_PAGES_2_3_WINDOW_MIDDLE, + CONTROLS_GUIDE_PAGES_2_3_WINDOW_BOTTOM, + NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS, +}; + +static const struct WindowTemplate sControlsGuide_WindowTemplate_Page2[NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS + 1] = +{ + [CONTROLS_GUIDE_PAGES_2_3_WINDOW_TOP] = { - .bg = 0x00, - .tilemapLeft = 0x06, - .tilemapTop = 0x03, - .width = 0x18, - .height = 0x06, - .paletteNum = 0x0f, - .baseBlock = 0x0001 - }, { - .bg = 0x00, - .tilemapLeft = 0x06, - .tilemapTop = 0x0a, - .width = 0x18, - .height = 0x04, - .paletteNum = 0x0f, - .baseBlock = 0x0092 - }, { - .bg = 0x00, - .tilemapLeft = 0x06, - .tilemapTop = 0x0f, - .width = 0x18, - .height = 0x04, - .paletteNum = 0x0f, - .baseBlock = 0x00f3 - }, DUMMY_WIN_TEMPLATE -}; - -static const struct WindowTemplate sHelpDocsWindowTemplates3[] = { + .bg = 0, + .tilemapLeft = 6, + .tilemapTop = 3, + .width = 24, + .height = 6, + .paletteNum = 15, + .baseBlock = 1 + }, + [CONTROLS_GUIDE_PAGES_2_3_WINDOW_MIDDLE] = { - .bg = 0x00, - .tilemapLeft = 0x06, - .tilemapTop = 0x03, - .width = 0x18, - .height = 0x04, - .paletteNum = 0x0f, - .baseBlock = 0x0001 - }, { - .bg = 0x00, - .tilemapLeft = 0x06, - .tilemapTop = 0x08, - .width = 0x18, - .height = 0x04, - .paletteNum = 0x0f, - .baseBlock = 0x0062 - }, { - .bg = 0x00, - .tilemapLeft = 0x06, - .tilemapTop = 0x0d, - .width = 0x18, - .height = 0x06, - .paletteNum = 0x0f, - .baseBlock = 0x00c3 - }, DUMMY_WIN_TEMPLATE -}; - -static const struct WindowTemplate *const sHelpDocsWindowTemplatePtrs[3] = { - sHelpDocsWindowTemplates1, - sHelpDocsWindowTemplates2, - sHelpDocsWindowTemplates3 -}; - -static const struct WindowTemplate sNewGameAdventureIntroWindowTemplates[] = { + .bg = 0, + .tilemapLeft = 6, + .tilemapTop = 10, + .width = 24, + .height = 4, + .paletteNum = 15, + .baseBlock = 146 + }, + [CONTROLS_GUIDE_PAGES_2_3_WINDOW_BOTTOM] = { - .bg = 0x00, - .tilemapLeft = 0x01, - .tilemapTop = 0x04, - .width = 0x1c, - .height = 0x0f, - .paletteNum = 0x0f, - .baseBlock = 0x0001 - }, { - .bg = 0x00, - .tilemapLeft = 0x12, - .tilemapTop = 0x09, - .width = 0x09, - .height = 0x04, - .paletteNum = 0x0f, - .baseBlock = 0x0174 - }, { - .bg = 0x00, - .tilemapLeft = 0x02, - .tilemapTop = 0x02, - .width = 0x06, - .height = 0x04, - .paletteNum = 0x0f, - .baseBlock = 0x0180 - }, { - .bg = 0x00, - .tilemapLeft = 0x02, - .tilemapTop = 0x02, - .width = 0x0c, - .height = 0x0a, - .paletteNum = 0x0f, - .baseBlock = 0x0001 - }, DUMMY_WIN_TEMPLATE + .bg = 0, + .tilemapLeft = 6, + .tilemapTop = 15, + .width = 24, + .height = 4, + .paletteNum = 15, + .baseBlock = 243 + }, + DUMMY_WIN_TEMPLATE }; -static const u8 sTextColor_HelpSystem[4] = { - 0x00, 0x01, 0x02 +static const struct WindowTemplate sControlsGuide_WindowTemplate_Page3[NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS + 1] = +{ + [CONTROLS_GUIDE_PAGES_2_3_WINDOW_TOP] = + { + .bg = 0, + .tilemapLeft = 6, + .tilemapTop = 3, + .width = 24, + .height = 4, + .paletteNum = 15, + .baseBlock = 1 + }, + [CONTROLS_GUIDE_PAGES_2_3_WINDOW_MIDDLE] = + { + .bg = 0, + .tilemapLeft = 6, + .tilemapTop = 8, + .width = 24, + .height = 4, + .paletteNum = 15, + .baseBlock = 98 + }, + [CONTROLS_GUIDE_PAGES_2_3_WINDOW_BOTTOM] = + { + .bg = 0, + .tilemapLeft = 6, + .tilemapTop = 13, + .width = 24, + .height = 6, + .paletteNum = 15, + .baseBlock = 195 + }, + DUMMY_WIN_TEMPLATE }; -static const u8 sTextColor_OakSpeech[4] = { - 0x00, 0x02, 0x03 +enum +{ + CONTROLS_GUIDE_PAGE_1, + CONTROLS_GUIDE_PAGE_2, + CONTROLS_GUIDE_PAGE_3, + NUM_CONTROLS_GUIDE_PAGES, }; -static const u8 *const sNewGameAdventureIntroTextPointers[] = { - gNewGameAdventureIntro1, - gNewGameAdventureIntro2, - gNewGameAdventureIntro3 +static const struct WindowTemplate *const sControlsGuide_WindowTemplates[NUM_CONTROLS_GUIDE_PAGES] = +{ + [CONTROLS_GUIDE_PAGE_1] = sControlsGuide_WindowTemplate_Page1, + [CONTROLS_GUIDE_PAGE_2] = sControlsGuide_WindowTemplate_Page2, + [CONTROLS_GUIDE_PAGE_3] = sControlsGuide_WindowTemplate_Page3 }; -static const struct CompressedSpriteSheet sOakSpeech_PikaSpriteSheets[3] = { - { (const void *)sOakSpeechGfx_Pika1, 0x0400, 0x1001 }, - { (const void *)sOakSpeechGfx_Pika2, 0x0200, 0x1002 }, - { (const void *)sOakSpeechGfx_PikaEyes, 0x0080, 0x1003 }, +static const struct WindowTemplate sIntro_WindowTemplates[NUM_INTRO_WINDOWS + 1] = +{ + [WIN_INTRO_TEXTBOX] = + { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 4, + .width = 28, + .height = 15, + .paletteNum = 15, + .baseBlock = 1 + }, + [WIN_INTRO_BOYGIRL] = + { + .bg = 0, + .tilemapLeft = 18, + .tilemapTop = 9, + .width = 9, + .height = 4, + .paletteNum = 15, + .baseBlock = 372 + }, + [WIN_INTRO_YESNO] = + { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 2, + .width = 6, + .height = 4, + .paletteNum = 15, + .baseBlock = 384 + }, + [WIN_INTRO_NAMES] = + { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 2, + .width = 12, + .height = 10, + .paletteNum = 15, + .baseBlock = 1 + }, + DUMMY_WIN_TEMPLATE }; -static const struct CompressedSpriteSheet sOakSpeech_GrassPlatformSpriteSheet = { - (const void *)sOakSpeechGfx_GrassPlatform, 0x0600, 0x1000 +static const u8 sTextColor_White[] = { 0, 1, 2, 0 }; +static const u8 sTextColor_DarkGray[] = { 0, 2, 3, 0 }; + +enum +{ + PIKACHU_INTRO_PAGE_1, + PIKACHU_INTRO_PAGE_2, + PIKACHU_INTRO_PAGE_3, + NUM_PIKACHU_INTRO_PAGES, }; -static const struct SpritePalette sOakSpeech_PikaSpritePal = { - (const void *)sOakSpeech_PikaPalette, 0x1001 +static const u8 *const sPikachuIntro_Strings[NUM_PIKACHU_INTRO_PAGES] = +{ + [PIKACHU_INTRO_PAGE_1] = gPikachuIntro_Text_Page1, + [PIKACHU_INTRO_PAGE_2] = gPikachuIntro_Text_Page2, + [PIKACHU_INTRO_PAGE_3] = gPikachuIntro_Text_Page3 }; -static const struct SpritePalette sOakSpeech_GrassPlatformSpritePal = { - (const void *)sOakSpeech_GrassPlatformPalette, 0x1000 +#define GFX_TAG_PLATFORM 0x1000 +#define GFX_TAG_PIKACHU 0x1001 +#define GFX_TAG_PIKACHU_EARS 0x1002 +#define GFX_TAG_PIKACHU_EYES 0x1003 + +#define PAL_TAG_PLATFORM 0x1000 +#define PAL_TAG_PIKACHU 0x1001 + +enum +{ + SPRITE_TYPE_PIKACHU, + SPRITE_TYPE_PLATFORM, }; -static const union AnimCmd sGrassPlatformAnim1[] = { +enum +{ + PIKACHU_BODY_PLATFORM_LEFT, + PIKACHU_EARS_PLATFORM_MIDDLE, + PIKACHU_EYES_PLATFORM_RIGHT, + NUM_PIKACHU_PLATFORM_SPRITES, +}; + +static const struct CompressedSpriteSheet sPikachuIntro_Pikachu_SpriteSheets[] = +{ + [PIKACHU_BODY_PLATFORM_LEFT] = + { + .data = sPikachuIntro_PikachuBody_Gfx, + .size = 0x400, + .tag = GFX_TAG_PIKACHU + }, + [PIKACHU_EARS_PLATFORM_MIDDLE] = + { + .data = sPikachuIntro_PikachuEars_Gfx, + .size = 0x200, + .tag = GFX_TAG_PIKACHU_EARS + }, + [PIKACHU_EYES_PLATFORM_RIGHT] = + { + .data = sPikachuIntro_PikachuEyes_Gfx, + .size = 0x80, + .tag = GFX_TAG_PIKACHU_EYES + }, +}; + +static const struct CompressedSpriteSheet sOakSpeech_Platform_SpriteSheet = +{ + .data = sOakSpeech_Platform_Gfx, + .size = 0x600, + .tag = GFX_TAG_PLATFORM +}; + +static const struct SpritePalette sPikachuIntro_Pikachu_SpritePalette = +{ + .data = sPikachuIntro_Pikachu_Pal, + .tag = PAL_TAG_PIKACHU +}; + +static const struct SpritePalette sOakSpeech_Platform_SpritePalette = +{ + .data = sOakSpeech_Platform_Pal, + .tag = PAL_TAG_PLATFORM +}; + +static const union AnimCmd sOakSpeech_PlatformLeft_Anim[] = +{ ANIMCMD_FRAME( 0, 0), ANIMCMD_END }; -static const union AnimCmd sGrassPlatformAnim2[] = { +static const union AnimCmd sOakSpeech_PlatformMiddle_Anim[] = +{ ANIMCMD_FRAME(16, 0), ANIMCMD_END }; -static const union AnimCmd sGrassPlatformAnim3[] = { +static const union AnimCmd sOakSpeech_PlatformRight_Anim[] = +{ ANIMCMD_FRAME(32, 0), ANIMCMD_END }; -static const union AnimCmd *const sGrassPlatformAnims1[] = { - sGrassPlatformAnim1 -}; -static const union AnimCmd *const sGrassPlatformAnims2[] = { - sGrassPlatformAnim2 -}; -static const union AnimCmd *const sGrassPlatformAnims3[] = { - sGrassPlatformAnim3 +static const union AnimCmd *const sOakSpeech_PlatformLeft_Anims[] = +{ + sOakSpeech_PlatformLeft_Anim }; -extern const struct OamData gOamData_AffineOff_ObjBlend_32x32; - -static const struct SpriteTemplate sOakSpeech_GrassPlatformSpriteTemplates[3] = { - { 0x1000, 0x1000, &gOamData_AffineOff_ObjBlend_32x32, sGrassPlatformAnims1, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy }, - { 0x1000, 0x1000, &gOamData_AffineOff_ObjBlend_32x32, sGrassPlatformAnims2, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy }, - { 0x1000, 0x1000, &gOamData_AffineOff_ObjBlend_32x32, sGrassPlatformAnims3, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy }, +static const union AnimCmd *const sOakSpeech_PlatformMiddle_Anims[] = +{ + sOakSpeech_PlatformMiddle_Anim }; -static const union AnimCmd sPikaAnim1[] = { +static const union AnimCmd *const sOakSpeech_PlatformRight_Anims[] = +{ + sOakSpeech_PlatformRight_Anim +}; + +static const struct SpriteTemplate sOakSpeech_Platform_SpriteTemplates[] = +{ + [PIKACHU_BODY_PLATFORM_LEFT] = + { + .tileTag = GFX_TAG_PLATFORM, + .paletteTag = PAL_TAG_PLATFORM, + .oam = &gOamData_AffineOff_ObjBlend_32x32, + .anims = sOakSpeech_PlatformLeft_Anims, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy + }, + [PIKACHU_EARS_PLATFORM_MIDDLE] = + { + .tileTag = GFX_TAG_PLATFORM, + .paletteTag = PAL_TAG_PLATFORM, + .oam = &gOamData_AffineOff_ObjBlend_32x32, + .anims = sOakSpeech_PlatformMiddle_Anims, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy + }, + [PIKACHU_EYES_PLATFORM_RIGHT] = + { + .tileTag = GFX_TAG_PLATFORM, + .paletteTag = PAL_TAG_PLATFORM, + .oam = &gOamData_AffineOff_ObjBlend_32x32, + .anims = sOakSpeech_PlatformRight_Anims, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy + }, +}; + +static const union AnimCmd sPikachuIntro_PikachuBody_Anim[] = +{ ANIMCMD_FRAME( 0, 30), ANIMCMD_FRAME(16, 30), ANIMCMD_JUMP(0) }; -static const union AnimCmd sPikaAnim2[] = { +static const union AnimCmd sPikachuIntro_PikachuEars_Anim[] = +{ ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(0, 60), @@ -349,7 +501,8 @@ static const union AnimCmd sPikaAnim2[] = { ANIMCMD_JUMP(0) }; -static const union AnimCmd sPikaAnim3[] = { +static const union AnimCmd sPikachuIntro_PikachuEyes_Anim[] = +{ ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(0, 60), @@ -367,32 +520,71 @@ static const union AnimCmd sPikaAnim3[] = { ANIMCMD_JUMP(0) }; -static const union AnimCmd *const sPikaAnims1[] = { - sPikaAnim1 -}; -static const union AnimCmd *const sPikaAnims2[] = { - sPikaAnim2 -}; -static const union AnimCmd *const sPikaAnims3[] = { - sPikaAnim3 +static const union AnimCmd *const sPikachuIntro_PikachuBody_Anims[] = +{ + sPikachuIntro_PikachuBody_Anim }; -extern const struct OamData gOamData_AffineOff_ObjNormal_32x32; -extern const struct OamData gOamData_AffineOff_ObjNormal_32x16; -extern const struct OamData gOamData_AffineOff_ObjNormal_16x8; - -static const struct SpriteTemplate sOakSpeech_PikaSpriteTemplates[3] = { - { 0x1001, 0x1001, &gOamData_AffineOff_ObjNormal_32x32, sPikaAnims1, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy }, - { 0x1002, 0x1001, &gOamData_AffineOff_ObjNormal_32x16, sPikaAnims2, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy }, - { 0x1003, 0x1001, &gOamData_AffineOff_ObjNormal_16x8, sPikaAnims3, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy } +static const union AnimCmd *const sPikachuIntro_PikachuEars_Anims[] = +{ + sPikachuIntro_PikachuEars_Anim }; -static const u8 *const sHelpDocsPtrs[] = { - gNewGame_HelpDocs2, gNewGame_HelpDocs3, gNewGame_HelpDocs4, - gNewGame_HelpDocs5, gNewGame_HelpDocs6, gNewGame_HelpDocs7 +static const union AnimCmd *const sPikachuIntro_PikachuEyes_Anims[] = +{ + sPikachuIntro_PikachuEyes_Anim }; -static const u8 *const sMaleNameChoices[] = { +static const struct SpriteTemplate sPikachuIntro_Pikachu_SpriteTemplates[NUM_PIKACHU_PLATFORM_SPRITES] = +{ + [PIKACHU_BODY_PLATFORM_LEFT] = + { + .tileTag = GFX_TAG_PIKACHU, + .paletteTag = PAL_TAG_PIKACHU, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = sPikachuIntro_PikachuBody_Anims, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy + }, + [PIKACHU_EARS_PLATFORM_MIDDLE] = + { + .tileTag = GFX_TAG_PIKACHU_EARS, + .paletteTag = PAL_TAG_PIKACHU, + .oam = &gOamData_AffineOff_ObjNormal_32x16, + .anims = sPikachuIntro_PikachuEars_Anims, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy + }, + [PIKACHU_EYES_PLATFORM_RIGHT] = + { + .tileTag = GFX_TAG_PIKACHU_EYES, + .paletteTag = PAL_TAG_PIKACHU, + .oam = &gOamData_AffineOff_ObjNormal_16x8, + .anims = sPikachuIntro_PikachuEyes_Anims, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy + } +}; + +#define CONTROLS_GUIDE_STRINGS_PER_PAGE 3 + +static const u8 *const sControlsGuide_Pages2And3_Strings[CONTROLS_GUIDE_STRINGS_PER_PAGE * 2] = +{ + // Page 2 + gControlsGuide_Text_DPad, + gControlsGuide_Text_AButton, + gControlsGuide_Text_BButton, + // Page 3 + gControlsGuide_Text_StartButton, + gControlsGuide_Text_SelectButton, + gControlsGuide_Text_LRButtons +}; + +static const u8 *const sMaleNameChoices[] = +{ #if defined(FIRERED) gNameChoice_Red, gNameChoice_Fire, @@ -422,7 +614,8 @@ static const u8 *const sMaleNameChoices[] = { gNameChoice_Roak }; -static const u8 *const sFemaleNameChoices[] = { +static const u8 *const sFemaleNameChoices[] = +{ #if defined(FIRERED) gNameChoice_Red, gNameChoice_Fire, @@ -449,7 +642,8 @@ static const u8 *const sFemaleNameChoices[] = { gNameChoice_Suzi }; -static const u8 *const sRivalNameChoices[] = { +static const u8 *const sRivalNameChoices[] = +{ #if defined(FIRERED) gNameChoice_Green, gNameChoice_Gary, @@ -471,14 +665,14 @@ enum OAK_PIC }; -static void VBlankCB_NewGameOaksSpeech(void) +static void VBlankCB_NewGameScene(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } -static void CB2_NewGameOaksSpeech(void) +static void CB2_NewGameScene(void) { RunTasks(); RunTextPrinters(); @@ -491,14 +685,25 @@ void StartNewGameScene(void) { gPlttBufferUnfaded[0] = RGB_BLACK; gPlttBufferFaded[0] = RGB_BLACK; - CreateTask(Task_OaksSpeech1, 0); - SetMainCallback2(CB2_NewGameOaksSpeech); + CreateTask(Task_NewGameScene, 0); + SetMainCallback2(CB2_NewGameScene); } -#define tTrainerPicPosX data[1] -#define tTrainerPicFadeState data[2] +#define tSpriteTimer data[0] +#define tTrainerPicPosX data[1] +#define tTrainerPicFadeState data[2] +#define tTimer data[3] +#define tNidoranFSpriteId data[4] +#define tTextCursorSpriteId data[5] +#define tPokeBallSpriteId data[6] +#define tPikachuPlatformSpriteId(i) data[7 + i] // Pikachu and the platform are built of three sprites, + // data[8] // so these are used to hold their sprite IDs + // data[9] // +#define tMenuWindowId data[13] +#define tTextboxWindowId data[14] +#define tDelta data[15] -static void Task_OaksSpeech1(u8 taskId) +static void Task_NewGameScene(u8 taskId) { switch (gMain.state) { @@ -517,7 +722,7 @@ static void Task_OaksSpeech1(u8 taskId) break; case 1: sOakSpeechResources = AllocZeroed(sizeof(*sOakSpeechResources)); - OakSpeechNidoranFSetup(1, 1); + OakSpeechNidoranFSetup(1, TRUE); break; case 2: SetGpuReg(REG_OFFSET_WIN0H, 0); @@ -532,13 +737,13 @@ static void Task_OaksSpeech1(u8 taskId) break; case 3: ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(1, sBgTemplates, NELEMS(sBgTemplates)); + InitBgsFromTemplates(1, sBgTemplates, ARRAY_COUNT(sBgTemplates)); SetBgTilemapBuffer(1, sOakSpeechResources->bg1TilemapBuffer); SetBgTilemapBuffer(2, sOakSpeechResources->bg2TilemapBuffer); - ChangeBgX(1, 0, 0); - ChangeBgY(1, 0, 0); - ChangeBgX(2, 0, 0); - ChangeBgY(2, 0, 0); + ChangeBgX(1, 0, BG_COORD_SET); + ChangeBgY(1, 0, BG_COORD_SET); + ChangeBgX(2, 0, BG_COORD_SET); + ChangeBgY(2, 0, BG_COORD_SET); gSpriteCoordOffsetX = 0; gSpriteCoordOffsetY = 0; break; @@ -547,39 +752,39 @@ static void Task_OaksSpeech1(u8 taskId) InitStandardTextBoxWindows(); InitTextBoxGfxAndPrinters(); Menu_LoadStdPalAt(0xD0); - LoadPalette(sHelpDocsPalette, 0x000, 0x080); - LoadPalette(GetTextWindowPalette(2) + 15, 0x000, 0x002); + LoadPalette(sControlsGuide_Pal, 0, 0x80); + LoadPalette(GetTextWindowPalette(2) + 15, 0, 2); break; case 5: sOakSpeechResources->textSpeed = GetTextSpeedSetting(); gTextFlags.canABSpeedUpPrint = TRUE; - DecompressAndCopyTileDataToVram(1, sOakSpeechGfx_GameStartHelpUI, 0, 0, 0); + DecompressAndCopyTileDataToVram(1, sControlsGuide_Tiles, 0, 0, 0); break; case 6: if (FreeTempTileDataBuffersIfPossible()) return; - ClearDialogWindowAndFrame(0, 1); - FillBgTilemapBufferRect_Palette0(1, 0x0000, 0, 0, 32, 32); + ClearDialogWindowAndFrame(0, TRUE); + FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 32); CopyBgTilemapBufferToVram(1); break; case 7: CreateTopBarWindowLoadPalette(0, 30, 0, 13, 0x1C4); - FillBgTilemapBufferRect_Palette0(1, 0xD00F, 0, 0, 30, 2); - FillBgTilemapBufferRect_Palette0(1, 0xD002, 0, 2, 30, 1); - FillBgTilemapBufferRect_Palette0(1, 0xD00E, 0, 19, 30, 1); - CreateHelpDocsPage1(); + FillBgTilemapBufferRect_Palette0(1, 0xD00F, 0, 0, 30, 2); + FillBgTilemapBufferRect_Palette0(1, 0xD002, 0, 2, 30, 1); + FillBgTilemapBufferRect_Palette0(1, 0xD00E, 0, 19, 30, 1); + ControlsGuide_LoadPage1(); gPaletteFade.bufferTransferDisabled = FALSE; - gTasks[taskId].data[5] = CreateTextCursorSprite(0, 0xE6, 0x95, 0, 0); - BlendPalettes(PALETTES_ALL, 0x10, 0x00); + gTasks[taskId].tTextCursorSpriteId = CreateTextCursorSprite(0, 230, 149, 0, 0); + BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); break; case 10: BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); ShowBg(0); ShowBg(1); - SetVBlankCallback(VBlankCB_NewGameOaksSpeech); + SetVBlankCallback(VBlankCB_NewGameScene); PlayBGM(MUS_NEW_GAME_INSTRUCT); - gTasks[taskId].func = Task_OaksSpeech2; + gTasks[taskId].func = Task_ControlsGuide_HandleInput; gMain.state = 0; return; } @@ -587,228 +792,237 @@ static void Task_OaksSpeech1(u8 taskId) gMain.state++; } -static void CreateHelpDocsPage1(void) +static void ControlsGuide_LoadPage1(void) { - TopBarWindowPrintTwoStrings(gText_Controls, gText_ABUTTONNext, 0, 0, 1); - sOakSpeechResources->unk_0014[0] = AddWindow(sHelpDocsWindowTemplatePtrs[sOakSpeechResources->unk_0012]); - PutWindowTilemap(sOakSpeechResources->unk_0014[0]); - FillWindowPixelBuffer(sOakSpeechResources->unk_0014[0], 0x00); - AddTextPrinterParameterized4(sOakSpeechResources->unk_0014[0], FONT_NORMAL, 2, 0, 1, 1, sTextColor_HelpSystem, 0, gNewGame_HelpDocs1); - CopyWindowToVram(sOakSpeechResources->unk_0014[0], COPYWIN_FULL); + TopBarWindowPrintTwoStrings(gText_Controls, gText_ABUTTONNext, FALSE, 0, TRUE); + sOakSpeechResources->windowIds[0] = AddWindow(sControlsGuide_WindowTemplates[sOakSpeechResources->currentPage]); + PutWindowTilemap(sOakSpeechResources->windowIds[0]); + FillWindowPixelBuffer(sOakSpeechResources->windowIds[0], PIXEL_FILL(0)); + AddTextPrinterParameterized4(sOakSpeechResources->windowIds[0], FONT_NORMAL, 2, 0, 1, 1, sTextColor_White, 0, gControlsGuide_Text_Intro); + CopyWindowToVram(sOakSpeechResources->windowIds[0], COPYWIN_FULL); FillBgTilemapBufferRect_Palette0(1, 0x3000, 1, 3, 5, 16); CopyBgTilemapBufferToVram(1); } -static void Task_OakSpeech4(u8 taskId) +static void Task_ControlsGuide_LoadPage(u8 taskId) { - u8 i = 0; - u8 r7 = sOakSpeechResources->unk_0012 - 1; - if (sOakSpeechResources->unk_0012 == 0) + u8 currWindow = 0; + u8 page2Or3 = sOakSpeechResources->currentPage - 1; // 0 if page 2, 1 if page 3 + if (sOakSpeechResources->currentPage == CONTROLS_GUIDE_PAGE_1) { - CreateHelpDocsPage1(); + ControlsGuide_LoadPage1(); } else { - TopBarWindowPrintString(gText_ABUTTONNext_BBUTTONBack, 0, 1); - for (i = 0; i < 3; i++) + TopBarWindowPrintString(gText_ABUTTONNext_BBUTTONBack, 0, TRUE); + for (currWindow = CONTROLS_GUIDE_PAGES_2_3_WINDOW_TOP; currWindow < NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS; currWindow++) { - sOakSpeechResources->unk_0014[i] = AddWindow(&sHelpDocsWindowTemplatePtrs[sOakSpeechResources->unk_0012][i]); - PutWindowTilemap(sOakSpeechResources->unk_0014[i]); - FillWindowPixelBuffer(sOakSpeechResources->unk_0014[i], 0x00); - AddTextPrinterParameterized4(sOakSpeechResources->unk_0014[i], FONT_NORMAL, 6, 0, 1, 1, sTextColor_HelpSystem, 0, sHelpDocsPtrs[i + r7 * 3]); - CopyWindowToVram(sOakSpeechResources->unk_0014[i], COPYWIN_FULL); + sOakSpeechResources->windowIds[currWindow] = AddWindow(&sControlsGuide_WindowTemplates[sOakSpeechResources->currentPage][currWindow]); + PutWindowTilemap(sOakSpeechResources->windowIds[currWindow]); + FillWindowPixelBuffer(sOakSpeechResources->windowIds[currWindow], PIXEL_FILL(0)); + AddTextPrinterParameterized4(sOakSpeechResources->windowIds[currWindow], FONT_NORMAL, 6, 0, 1, 1, sTextColor_White, 0, sControlsGuide_Pages2And3_Strings[currWindow + page2Or3 * CONTROLS_GUIDE_STRINGS_PER_PAGE]); + CopyWindowToVram(sOakSpeechResources->windowIds[currWindow], COPYWIN_FULL); } - if (sOakSpeechResources->unk_0012 == 1) - { - CopyToBgTilemapBufferRect(1, sHelpDocsPage2Tilemap, 1, 3, 5, 16); - } - else - { - CopyToBgTilemapBufferRect(1, sHelpDocsPage3Tilemap, 1, 3, 5, 16); - } + if (sOakSpeechResources->currentPage == CONTROLS_GUIDE_PAGE_2) + CopyToBgTilemapBufferRect(1, sControlsGuide_Tilemap_Page2, 1, 3, 5, 16); + else // CONTROLS_GUIDE_PAGE_3 + CopyToBgTilemapBufferRect(1, sControlsGuide_Tilemap_Page3, 1, 3, 5, 16); CopyBgTilemapBufferToVram(1); } - BeginNormalPaletteFade(0xFFFFDFFF, -1, 16, 0, GetTextWindowPalette(2)[15]); - gTasks[taskId].func = Task_OaksSpeech2; + BeginNormalPaletteFade(PALETTES_OBJECTS | 0xDFFF, -1, 16, 0, GetTextWindowPalette(2)[15]); + gTasks[taskId].func = Task_ControlsGuide_HandleInput; } -static void Task_OaksSpeech2(u8 taskId) +static void Task_ControlsGuide_HandleInput(u8 taskId) { - if (!gPaletteFade.active && JOY_NEW((A_BUTTON | B_BUTTON))) + if (!gPaletteFade.active) { - if (JOY_NEW(A_BUTTON)) + if(JOY_NEW((A_BUTTON | B_BUTTON))) { - gTasks[taskId].data[15] = 1; - if (sOakSpeechResources->unk_0012 < 2) + if (JOY_NEW(A_BUTTON)) { - BeginNormalPaletteFade(0xFFFFDFFF, -1, 0, 16, GetTextWindowPalette(2)[15]); + gTasks[taskId].tDelta = 1; + + if (sOakSpeechResources->currentPage < CONTROLS_GUIDE_PAGE_3) + BeginNormalPaletteFade(PALETTES_OBJECTS | 0xDFFF, -1, 0, 16, GetTextWindowPalette(2)[15]); } - } - else - { - if (sOakSpeechResources->unk_0012 != 0) + else // B_BUTTON { - gTasks[taskId].data[15] = -1; - BeginNormalPaletteFade(0xFFFFDFFF, -1, 0, 16, GetTextWindowPalette(2)[15]); + if (sOakSpeechResources->currentPage == CONTROLS_GUIDE_PAGE_1) + return; + + gTasks[taskId].tDelta = -1; + BeginNormalPaletteFade(PALETTES_OBJECTS | 0xDFFF, -1, 0, 16, GetTextWindowPalette(2)[15]); } - else - return; + + PlaySE(SE_SELECT); + gTasks[taskId].func = Task_ControlsGuide_ChangePage; } } - else - return; - PlaySE(SE_SELECT); - gTasks[taskId].func = Task_OakSpeech3; } -static void Task_OakSpeech3(u8 taskId) +static void Task_ControlsGuide_ChangePage(u8 taskId) { - u8 r8 = 0; + u8 numWindows = 0; u8 i; if (!gPaletteFade.active) { - switch (sOakSpeechResources->unk_0012) { - case 0: - r8 = 1; + switch (sOakSpeechResources->currentPage) + { + case CONTROLS_GUIDE_PAGE_1: + numWindows = NUM_CONTROLS_GUIDE_PAGE_1_WINDOWS; break; - case 1: - case 2: - r8 = 3; + case CONTROLS_GUIDE_PAGE_2: + case CONTROLS_GUIDE_PAGE_3: + numWindows = NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS; break; } - sOakSpeechResources->unk_0012 += gTasks[taskId].data[15]; - if (sOakSpeechResources->unk_0012 < 3) + sOakSpeechResources->currentPage += gTasks[taskId].tDelta; + if (sOakSpeechResources->currentPage < NUM_CONTROLS_GUIDE_PAGES) { - for (i = 0; i < r8; i++) + for (i = 0; i < numWindows; i++) { - FillWindowPixelBuffer(sOakSpeechResources->unk_0014[i], 0x00); - ClearWindowTilemap(sOakSpeechResources->unk_0014[i]); - CopyWindowToVram(sOakSpeechResources->unk_0014[i], COPYWIN_FULL); - RemoveWindow(sOakSpeechResources->unk_0014[i]); - sOakSpeechResources->unk_0014[i] = 0; + FillWindowPixelBuffer(sOakSpeechResources->windowIds[i], PIXEL_FILL(0)); + ClearWindowTilemap(sOakSpeechResources->windowIds[i]); + CopyWindowToVram(sOakSpeechResources->windowIds[i], COPYWIN_FULL); + RemoveWindow(sOakSpeechResources->windowIds[i]); + sOakSpeechResources->windowIds[i] = 0; } - gTasks[taskId].func = Task_OakSpeech4; + gTasks[taskId].func = Task_ControlsGuide_LoadPage; } else { BeginNormalPaletteFade(PALETTES_ALL, 2, 0, 16, 0); - gTasks[taskId].func = Task_OakSpeech5; + gTasks[taskId].func = Task_ControlsGuide_Clear; } } } -static void Task_OakSpeech5(u8 taskId) +#undef tDelta + +static void Task_ControlsGuide_Clear(u8 taskId) { u8 i = 0; - if (!gPaletteFade.active) { - for (i = 0; i < 3; i++) + for (i = 0; i < NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS; i++) { - FillWindowPixelBuffer(sOakSpeechResources->unk_0014[i], 0x00); - ClearWindowTilemap(sOakSpeechResources->unk_0014[i]); - CopyWindowToVram(sOakSpeechResources->unk_0014[i], COPYWIN_FULL); - RemoveWindow(sOakSpeechResources->unk_0014[i]); - sOakSpeechResources->unk_0014[i] = 0; + FillWindowPixelBuffer(sOakSpeechResources->windowIds[i], PIXEL_FILL(0)); + ClearWindowTilemap(sOakSpeechResources->windowIds[i]); + CopyWindowToVram(sOakSpeechResources->windowIds[i], COPYWIN_FULL); + RemoveWindow(sOakSpeechResources->windowIds[i]); + sOakSpeechResources->windowIds[i] = 0; } - FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 2, 30, 18); + FillBgTilemapBufferRect_Palette0(1, 0, 0, 2, 30, 18); CopyBgTilemapBufferToVram(1); - DestroyTextCursorSprite(gTasks[taskId].data[5]); - sOakSpeechResources->unk_0014[0] = RGB_BLACK; - LoadPalette(sOakSpeechResources->unk_0014, 0, 2); - gTasks[taskId].data[3] = 32; - gTasks[taskId].func = Task_OakSpeech6; + DestroyTextCursorSprite(gTasks[taskId].tTextCursorSpriteId); + sOakSpeechResources->windowIds[0] = RGB_BLACK; + LoadPalette(sOakSpeechResources->windowIds, 0, 2); + gTasks[taskId].tTimer = 32; + gTasks[taskId].func = Task_PikachuIntro_LoadPage1; } } -static void Task_OakSpeech6(u8 taskId) +enum { - s16 * data = gTasks[taskId].data; - u32 sp14 = 0; + PIKACHU_INTRO_SET_GPU_REGS, + PIKACHU_INTRO_HANDLE_INPUT, + PIKACHU_INTRO_PRINT_PAGE_TEXT, + PIKACHU_INTRO_FADE_IN_PAGE, + PIKACHU_INTRO_EXIT, +}; - if (data[3] != 0) - data[3]--; +#define tBlendTarget data[15] + +static void Task_PikachuIntro_LoadPage1(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + u32 size = 0; + + if (tTimer != 0) + { + tTimer--; + } else { PlayBGM(MUS_NEW_GAME_INTRO); ClearTopBarWindow(); TopBarWindowPrintString(gText_ABUTTONNext, 0, 1); - sOakSpeechResources->unk_0008 = MallocAndDecompress(sNewGameAdventureIntroTilemap, &sp14); - CopyToBgTilemapBufferRect(1, sOakSpeechResources->unk_0008, 0, 2, 30, 19); + sOakSpeechResources->pikachuIntroTilemap = MallocAndDecompress(sPikachuIntro_Tilemap, &size); + CopyToBgTilemapBufferRect(1, sOakSpeechResources->pikachuIntroTilemap, 0, 2, 30, 19); CopyBgTilemapBufferToVram(1); - Free(sOakSpeechResources->unk_0008); - sOakSpeechResources->unk_0008 = NULL; - data[14] = AddWindow(&sNewGameAdventureIntroWindowTemplates[0]); - PutWindowTilemap(data[14]); - FillWindowPixelBuffer(data[14], 0x00); - CopyWindowToVram(data[14], COPYWIN_FULL); - sOakSpeechResources->unk_0012 = 0; - gMain.state = 0; - data[15] = 16; - AddTextPrinterParameterized4(data[14], FONT_NORMAL, 3, 5, 1, 0, sTextColor_OakSpeech, 0, sNewGameAdventureIntroTextPointers[0]); - data[5] = CreateTextCursorSprite(0, 0xe2, 0x91, 0, 0); - gSprites[data[5]].oam.objMode = ST_OAM_OBJ_BLEND; - gSprites[data[5]].oam.priority = 0; - CreatePikaOrGrassPlatformSpriteAndLinkToCurrentTask(taskId, 0); + Free(sOakSpeechResources->pikachuIntroTilemap); + sOakSpeechResources->pikachuIntroTilemap = NULL; + tTextboxWindowId = AddWindow(&sIntro_WindowTemplates[WIN_INTRO_TEXTBOX]); + PutWindowTilemap(tTextboxWindowId); + FillWindowPixelBuffer(tTextboxWindowId, PIXEL_FILL(0)); + CopyWindowToVram(tTextboxWindowId, COPYWIN_FULL); + sOakSpeechResources->currentPage = PIKACHU_INTRO_PAGE_1; + gMain.state = PIKACHU_INTRO_SET_GPU_REGS; + tBlendTarget = 16; + AddTextPrinterParameterized4(tTextboxWindowId, FONT_NORMAL, 3, 5, 1, 0, sTextColor_DarkGray, 0, sPikachuIntro_Strings[PIKACHU_INTRO_PAGE_1]); + tTextCursorSpriteId = CreateTextCursorSprite(0, 226, 145, 0, 0); + gSprites[tTextCursorSpriteId].oam.objMode = ST_OAM_OBJ_BLEND; + gSprites[tTextCursorSpriteId].oam.priority = 0; + CreatePikachuOrPlatformSprites(taskId, SPRITE_TYPE_PIKACHU); BeginNormalPaletteFade(PALETTES_ALL, 2, 16, 0, 0); - gTasks[taskId].func = Task_OakSpeech7; + gTasks[taskId].func = Task_PikachuIntro_HandleInput; } } -static void Task_OakSpeech7(u8 taskId) +static void Task_PikachuIntro_HandleInput(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; switch (gMain.state) { - case 0: + case PIKACHU_INTRO_SET_GPU_REGS: if (!gPaletteFade.active) { - SetGpuReg(REG_OFFSET_WIN0H, 0x00F0); - SetGpuReg(REG_OFFSET_WIN0V, 0x10A0); - SetGpuReg(REG_OFFSET_WININ, 0x003F); - SetGpuReg(REG_OFFSET_WINOUT, 0x001F); + SetGpuReg(REG_OFFSET_WIN0H, DISPLAY_WIDTH); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(16, DISPLAY_HEIGHT)); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - gMain.state = 1; + gMain.state = PIKACHU_INTRO_HANDLE_INPUT; } break; - case 1: + case PIKACHU_INTRO_HANDLE_INPUT: if (JOY_NEW((A_BUTTON | B_BUTTON))) { if (JOY_NEW(A_BUTTON)) { - sOakSpeechResources->unk_0012++; + sOakSpeechResources->currentPage++; } - else if (sOakSpeechResources->unk_0012 != 0) + else // B_BUTTON { - sOakSpeechResources->unk_0012--; - } - else - { - break; + if (sOakSpeechResources->currentPage != PIKACHU_INTRO_PAGE_1) + sOakSpeechResources->currentPage--; + else + break; } PlaySE(SE_SELECT); - if (sOakSpeechResources->unk_0012 == 3) + if (sOakSpeechResources->currentPage == NUM_PIKACHU_INTRO_PAGES) { - gMain.state = 4; + gMain.state = PIKACHU_INTRO_EXIT; } else { SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1); - SetGpuReg(REG_OFFSET_BLDALPHA, (16 - data[15]) | data[15]); + SetGpuReg(REG_OFFSET_BLDALPHA, (16 - tBlendTarget) | tBlendTarget); gMain.state++; } } break; - case 2: - data[15] -= 2; - SetGpuReg(REG_OFFSET_BLDALPHA, ((16 - data[15]) << 8) | data[15]); - if (data[15] <= 0) + case PIKACHU_INTRO_PRINT_PAGE_TEXT: + tBlendTarget -= 2; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(tBlendTarget, 16 - tBlendTarget)); + if (tBlendTarget <= 0) { - FillWindowPixelBuffer(data[14], 0x00); - AddTextPrinterParameterized4(data[14], FONT_NORMAL, 3, 5, 1, 0, sTextColor_OakSpeech, 0, sNewGameAdventureIntroTextPointers[sOakSpeechResources->unk_0012]); - if (sOakSpeechResources->unk_0012 == 0) + FillWindowPixelBuffer(tTextboxWindowId, PIXEL_FILL(0)); + AddTextPrinterParameterized4(tTextboxWindowId, FONT_NORMAL, 3, 5, 1, 0, sTextColor_DarkGray, 0, sPikachuIntro_Strings[sOakSpeechResources->currentPage]); + if (sOakSpeechResources->currentPage == PIKACHU_INTRO_PAGE_1) { ClearTopBarWindow(); TopBarWindowPrintString(gText_ABUTTONNext, 0, 1); @@ -821,343 +1035,348 @@ static void Task_OakSpeech7(u8 taskId) gMain.state++; } break; - case 3: - data[15] += 2; - SetGpuReg(REG_OFFSET_BLDALPHA, ((16 - data[15]) << 8) | data[15]); - if (data[15] >= 16) + case PIKACHU_INTRO_FADE_IN_PAGE: + tBlendTarget += 2; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(tBlendTarget, 16 - tBlendTarget)); + if (tBlendTarget >= 16) { - data[15] = 16; + tBlendTarget = 16; SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); - gMain.state = 1; + gMain.state = PIKACHU_INTRO_HANDLE_INPUT; } break; - case 4: - DestroyTextCursorSprite(gTasks[taskId].data[5]); + case PIKACHU_INTRO_EXIT: + DestroyTextCursorSprite(gTasks[taskId].tTextCursorSpriteId); PlayBGM(MUS_NEW_GAME_EXIT); - data[15] = 24; + tBlendTarget = 24; gMain.state++; break; default: - if (data[15] != 0) - data[15]--; + if (tBlendTarget != 0) + { + tBlendTarget--; + } else { gMain.state = 0; - sOakSpeechResources->unk_0012 = 0; + sOakSpeechResources->currentPage = 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); BeginNormalPaletteFade(PALETTES_ALL, 2, 0, 16, RGB_BLACK); - gTasks[taskId].func = Task_OakSpeech8; + gTasks[taskId].func = Task_PikachuIntro_Clear; } break; } } -static void Task_OakSpeech8(u8 taskId) -{ - s16 * data = gTasks[taskId].data; +#undef tBlendTarget +static void Task_PikachuIntro_Clear(u8 taskId) +{ + s16 *data = gTasks[taskId].data; if (!gPaletteFade.active) { DestroyTopBarWindow(); - FillWindowPixelBuffer(data[14], 0x00); - ClearWindowTilemap(data[14]); - CopyWindowToVram(data[14], COPYWIN_FULL); - RemoveWindow(data[14]); - data[14] = 0; - FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20); + FillWindowPixelBuffer(tTextboxWindowId, PIXEL_FILL(0)); + ClearWindowTilemap(tTextboxWindowId); + CopyWindowToVram(tTextboxWindowId, COPYWIN_FULL); + RemoveWindow(tTextboxWindowId); + tTextboxWindowId = 0; + FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(1); - DestroyLinkedPikaOrGrassPlatformSprites(taskId, 0); - data[3] = 80; - gTasks[taskId].func = Task_OakSpeech9; + DestroyPikachuOrPlatformSprites(taskId, SPRITE_TYPE_PIKACHU); + tTimer = 80; + gTasks[taskId].func = Task_OakSpeech_Init; } } -static void Task_OakSpeech9(u8 taskId) +static void Task_OakSpeech_Init(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; u32 size = 0; - - if (data[3] != 0) - data[3]--; + if (tTimer != 0) + { + tTimer--; + } else { - sOakSpeechResources->solidColorsGfx = MallocAndDecompress(sOakSpeechGfx_SolidColors, &size); - LoadBgTiles(1, sOakSpeechResources->solidColorsGfx, size, 0); - CopyToBgTilemapBuffer(1, sOakSpeech_BackgroundTilemap, 0, 0); + sOakSpeechResources->oakSpeechBackgroundTiles = MallocAndDecompress(sOakSpeech_Background_Tiles, &size); + LoadBgTiles(1, sOakSpeechResources->oakSpeechBackgroundTiles, size, 0); + CopyToBgTilemapBuffer(1, sOakSpeech_Background_Tilemap, 0, 0); CopyBgTilemapBufferToVram(1); CreateNidoranFSprite(taskId); - LoadOaksSpeechTrainerPic(OAK_PIC, 0); - CreatePikaOrGrassPlatformSpriteAndLinkToCurrentTask(taskId, 1); + LoadTrainerPic(OAK_PIC, 0); + CreatePikachuOrPlatformSprites(taskId, SPRITE_TYPE_PLATFORM); PlayBGM(MUS_ROUTE24); BeginNormalPaletteFade(PALETTES_ALL, 5, 16, 0, RGB_BLACK); - data[3] = 80; + tTimer = 80; ShowBg(2); - gTasks[taskId].func = Task_OakSpeech10; + gTasks[taskId].func = Task_OakSpeech_WelcomeToTheWorld; } } -#define OaksSpeechPrintMessage(str, speed) ({ \ - DrawDialogueFrame(0, FALSE);\ - if (str != gStringVar4) \ - { \ - StringExpandPlaceholders(gStringVar4, str); \ +#define OakSpeechPrintMessage(str, speed) ({ \ + DrawDialogueFrame(0, FALSE); \ + if (str != gStringVar4) \ + { \ + StringExpandPlaceholders(gStringVar4, str); \ AddTextPrinterParameterized2(0, FONT_MALE, gStringVar4, speed, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); \ - } \ - else \ - { \ - AddTextPrinterParameterized2(0, FONT_MALE, str, speed, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); \ - } \ - CopyWindowToVram(0, COPYWIN_FULL); \ + } \ + else \ + { \ + AddTextPrinterParameterized2(0, FONT_MALE, str, speed, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); \ + } \ + CopyWindowToVram(0, COPYWIN_FULL); \ }) -static void Task_OakSpeech10(u8 taskId) +static void Task_OakSpeech_WelcomeToTheWorld(u8 taskId) { - s16 * data = gTasks[taskId].data; - + s16 *data = gTasks[taskId].data; if (!gPaletteFade.active) { - if (data[3] != 0) - data[3]--; + if (tTimer != 0) + { + tTimer--; + } else { - OaksSpeechPrintMessage(gOakText_WelcomeToTheWorld, sOakSpeechResources->textSpeed); - gTasks[taskId].func = Task_OakSpeech11; + OakSpeechPrintMessage(gOakSpeech_Text_WelcomeToTheWorld, sOakSpeechResources->textSpeed); + gTasks[taskId].func = Task_OakSpeech_ThisWorld; } } } -static void Task_OakSpeech11(u8 taskId) +static void Task_OakSpeech_ThisWorld(u8 taskId) { if (!IsTextPrinterActive(0)) { - OaksSpeechPrintMessage(gOakText_WorldInhabited1, sOakSpeechResources->textSpeed); - gTasks[taskId].data[3] = 30; - gTasks[taskId].func = Task_OakSpeech12; + OakSpeechPrintMessage(gOakSpeech_Text_ThisWorld, sOakSpeechResources->textSpeed); + gTasks[taskId].tTimer = 30; + gTasks[taskId].func = Task_OakSpeech_ReleaseNidoranFFromPokeBall; } } -static void Task_OakSpeech12(u8 taskId) +static void Task_OakSpeech_ReleaseNidoranFFromPokeBall(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; u8 spriteId; if (!IsTextPrinterActive(0)) { - if (data[3] != 0) - data[3]--; - // else { - spriteId = gTasks[taskId].data[4]; + if (tTimer != 0) + tTimer--; + spriteId = gTasks[taskId].tNidoranFSpriteId; gSprites[spriteId].invisible = FALSE; - gSprites[spriteId].data[0] = 0; - CreatePokeballSpriteToReleaseMon(spriteId, gSprites[spriteId].oam.paletteNum, 0x64, 0x42, 0, 0, 32, 0xFFFF1FFF); - gTasks[taskId].func = Task_OakSpeech13; - gTasks[taskId].data[3] = 0; - // } + gSprites[spriteId].tSpriteTimer = 0; + CreatePokeballSpriteToReleaseMon(spriteId, gSprites[spriteId].oam.paletteNum, 100, 66, 0, 0, 32, 0xFFFF1FFF); + gTasks[taskId].func = Task_OakSpeech_IsInhabitedFarAndWide; + gTasks[taskId].tTimer = 0; } } -static void Task_OakSpeech13(u8 taskId) +static void Task_OakSpeech_IsInhabitedFarAndWide(u8 taskId) { if (IsCryFinished()) { - if (gTasks[taskId].data[3] >= 96) - gTasks[taskId].func = Task_OakSpeech14; + if (gTasks[taskId].tTimer >= 96) + gTasks[taskId].func = Task_OakSpeech_IStudyPokemon; } - if (gTasks[taskId].data[3] < 0x4000) + if (gTasks[taskId].tTimer < 0x4000) { - gTasks[taskId].data[3]++; - if (gTasks[taskId].data[3] == 32) + gTasks[taskId].tTimer++; + if (gTasks[taskId].tTimer == 32) { - OaksSpeechPrintMessage(gOakText_WorldInhabited2, sOakSpeechResources->textSpeed); + OakSpeechPrintMessage(gOakSpeech_Text_IsInhabitedFarAndWide, sOakSpeechResources->textSpeed); PlayCry_Normal(SPECIES_NIDORAN_F, 0); } } } -static void Task_OakSpeech14(u8 taskId) +static void Task_OakSpeech_IStudyPokemon(u8 taskId) { if (!IsTextPrinterActive(0)) { - OaksSpeechPrintMessage(gOakText_PetsBattlingStudy, sOakSpeechResources->textSpeed); - gTasks[taskId].func = Task_OakSpeech15; + OakSpeechPrintMessage(gOakSpeech_Text_IStudyPokemon, sOakSpeechResources->textSpeed); + gTasks[taskId].func = Task_OakSpeech_ReturnNidoranFToPokeBall; } } -static void Task_OakSpeech15(u8 taskId) +static void Task_OakSpeech_ReturnNidoranFToPokeBall(u8 taskId) { u8 spriteId; if (!IsTextPrinterActive(0)) { - ClearDialogWindowAndFrame(0, 1); - spriteId = gTasks[taskId].data[4]; - gTasks[taskId].data[6] = CreateTradePokeballSprite(spriteId, gSprites[spriteId].oam.paletteNum, 0x64, 0x42, 0, 0, 32, 0xFFFF1F3F); - gTasks[taskId].data[3] = 48; - gTasks[taskId].data[0] = 64; - gTasks[taskId].func = Task_OakSpeech16; + ClearDialogWindowAndFrame(0, TRUE); + spriteId = gTasks[taskId].tNidoranFSpriteId; + gTasks[taskId].tPokeBallSpriteId = CreateTradePokeballSprite(spriteId, gSprites[spriteId].oam.paletteNum, 100, 66, 0, 0, 32, 0xFFFF1F3F); + gTasks[taskId].tTimer = 48; + gTasks[taskId].tSpriteTimer = 64; + gTasks[taskId].func = Task_OakSpeech_TellMeALittleAboutYourself; } } -static void Task_OakSpeech16(u8 taskId) +static void Task_OakSpeech_TellMeALittleAboutYourself(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; - if (data[0] != 0) + if (tSpriteTimer != 0) { - if (data[0] < 24) - { - gSprites[data[4]].y--; - } - data[0]--; + if (tSpriteTimer < 24) + gSprites[tNidoranFSpriteId].y--; + tSpriteTimer--; } else { - if (data[3] == 48) + if (tTimer == 48) { - DestroySprite(&gSprites[data[4]]); - DestroySprite(&gSprites[data[6]]); + DestroySprite(&gSprites[tNidoranFSpriteId]); + DestroySprite(&gSprites[tPokeBallSpriteId]); } - if (data[3] != 0) + if (tTimer != 0) { - data[3]--; + tTimer--; } else { - OaksSpeechPrintMessage(gOakText_TellMeALittleAboutYourself, sOakSpeechResources->textSpeed); - gTasks[taskId].func = Task_OakSpeech17; + OakSpeechPrintMessage(gOakSpeech_Text_TellMeALittleAboutYourself, sOakSpeechResources->textSpeed); + gTasks[taskId].func = Task_OakSpeech_FadeOutOak; } } } -static void Task_OakSpeech17(u8 taskId) +static void Task_OakSpeech_FadeOutOak(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (!IsTextPrinterActive(0)) { ClearDialogWindowAndFrame(0, 1); CreateFadeInTask(taskId, 2); - data[3] = 48; - gTasks[taskId].func = Task_OakSpeech18; + tTimer = 48; + gTasks[taskId].func = Task_OakSpeech_AskPlayerGender; } } -static void Task_OakSpeech18(u8 taskId) +static void Task_OakSpeech_AskPlayerGender(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (tTrainerPicFadeState != 0) { - if (data[3] != 0) - data[3]--; + if (tTimer != 0) + { + tTimer--; + } else { tTrainerPicPosX = -60; - DestroyOaksSpeechTrainerPic(); - OaksSpeechPrintMessage(gOakText_AskPlayerGender, sOakSpeechResources->textSpeed); - gTasks[taskId].func = Task_OakSpeech19; + ClearTrainerPic(); + OakSpeechPrintMessage(gOakText_AskPlayerGender, sOakSpeechResources->textSpeed); + gTasks[taskId].func = Task_OakSpeech_ShowGenderOptions; } } } -static void Task_OakSpeech19(u8 taskId) +static void Task_OakSpeech_ShowGenderOptions(u8 taskId) { if (!IsTextPrinterActive(0)) { - gTasks[taskId].data[13] = AddWindow(&sNewGameAdventureIntroWindowTemplates[1]); - PutWindowTilemap(gTasks[taskId].data[13]); - DrawStdFrameWithCustomTileAndPalette(gTasks[taskId].data[13], 1, GetStdWindowBaseTileNum(), 14); - FillWindowPixelBuffer(gTasks[taskId].data[13], 0x11); + gTasks[taskId].tMenuWindowId = AddWindow(&sIntro_WindowTemplates[WIN_INTRO_BOYGIRL]); + PutWindowTilemap(gTasks[taskId].tMenuWindowId); + DrawStdFrameWithCustomTileAndPalette(gTasks[taskId].tMenuWindowId, TRUE, GetStdWindowBaseTileNum(), 14); + FillWindowPixelBuffer(gTasks[taskId].tMenuWindowId, PIXEL_FILL(1)); sOakSpeechResources->textColor[0] = 1; sOakSpeechResources->textColor[1] = 2; sOakSpeechResources->textColor[2] = 3; - AddTextPrinterParameterized3(gTasks[taskId].data[13], FONT_NORMAL, 8, 1, sOakSpeechResources->textColor, 0, gText_Boy); + AddTextPrinterParameterized3(gTasks[taskId].tMenuWindowId, FONT_NORMAL, 8, 1, sOakSpeechResources->textColor, 0, gText_Boy); sOakSpeechResources->textColor[0] = 1; sOakSpeechResources->textColor[1] = 2; sOakSpeechResources->textColor[2] = 3; - AddTextPrinterParameterized3(gTasks[taskId].data[13], FONT_NORMAL, 8, 17, sOakSpeechResources->textColor, 0, gText_Girl); - Menu_InitCursor(gTasks[taskId].data[13], FONT_NORMAL, 0, 1, GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 2, 2, 0); - CopyWindowToVram(gTasks[taskId].data[13], COPYWIN_FULL); - gTasks[taskId].func = Task_OakSpeech20; + AddTextPrinterParameterized3(gTasks[taskId].tMenuWindowId, FONT_NORMAL, 8, 17, sOakSpeechResources->textColor, 0, gText_Girl); + Menu_InitCursor(gTasks[taskId].tMenuWindowId, FONT_NORMAL, 0, 1, GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 2, 2, 0); + CopyWindowToVram(gTasks[taskId].tMenuWindowId, COPYWIN_FULL); + gTasks[taskId].func = Task_OakSpeech_HandleGenderInput; } } -static void Task_OakSpeech20(u8 taskId) +static void Task_OakSpeech_HandleGenderInput(u8 taskId) { s8 input = Menu_ProcessInputNoWrapAround(); switch (input) { - case 0: + case 0: // BOY gSaveBlock2Ptr->playerGender = MALE; break; - case 1: + case 1: // GIRL gSaveBlock2Ptr->playerGender = FEMALE; break; - case -1: - case -2: + case MENU_B_PRESSED: + case MENU_NOTHING_CHOSEN: return; } - gTasks[taskId].func = Task_OakSpeech21; + gTasks[taskId].func = Task_OakSpeech_ClearGenderWindows; } -static void Task_OakSpeech21(u8 taskId) +static void Task_OakSpeech_ClearGenderWindows(u8 taskId) { - s16 * data = gTasks[taskId].data; - ClearStdWindowAndFrameToTransparent(data[13], TRUE); - RemoveWindow(data[13]); - data[13] = 0; - ClearDialogWindowAndFrame(0, 1); + s16 *data = gTasks[taskId].data; + ClearStdWindowAndFrameToTransparent(tMenuWindowId, TRUE); + RemoveWindow(tMenuWindowId); + tMenuWindowId = WIN_INTRO_TEXTBOX; + ClearDialogWindowAndFrame(tMenuWindowId, TRUE); FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(0); - gTasks[taskId].func = Task_OakSpeech22; + gTasks[taskId].func = Task_OakSpeech_LoadPlayerPic; } -static void Task_OakSpeech22(u8 taskId) +static void Task_OakSpeech_LoadPlayerPic(u8 taskId) { if (gSaveBlock2Ptr->playerGender == MALE) - LoadOaksSpeechTrainerPic(MALE_PLAYER_PIC, 0); + LoadTrainerPic(MALE_PLAYER_PIC, 0); else - LoadOaksSpeechTrainerPic(FEMALE_PLAYER_PIC, 0); + LoadTrainerPic(FEMALE_PLAYER_PIC, 0); CreateFadeOutTask(taskId, 2); - gTasks[taskId].data[3] = 32; - gTasks[taskId].func = Task_OakSpeech23; + gTasks[taskId].tTimer = 32; + gTasks[taskId].func = Task_OakSpeech_YourNameWhatIsIt; } -static void Task_OakSpeech23(u8 taskId) +static void Task_OakSpeech_YourNameWhatIsIt(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (tTrainerPicFadeState != 0) { - if (data[3] != 0) - data[3]--; + if (tTimer != 0) + { + tTimer--; + } else { tTrainerPicPosX = 0; - OaksSpeechPrintMessage(gOakText_AskPlayerName, sOakSpeechResources->textSpeed); - gTasks[taskId].func = Task_OakSpeech24; + OakSpeechPrintMessage(gOakSpeech_Text_YourNameWhatIsIt, sOakSpeechResources->textSpeed); + gTasks[taskId].func = Task_OakSpeech_FadeOutForPlayerNamingScreen; } } } -static void Task_OakSpeech24(u8 taskId) +static void Task_OakSpeech_FadeOutForPlayerNamingScreen(u8 taskId) { if (!IsTextPrinterActive(0)) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sOakSpeechResources->hasPlayerBeenNamed = FALSE; - gTasks[taskId].func = Task_OakSpeech25; + gTasks[taskId].func = Task_OakSpeech_DoNamingScreen; } } -static void Task_OakSpeech35(u8 taskId) +static void Task_OakSpeech_MoveRivalDisplayNameOptions(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (!IsTextPrinterActive(0)) { @@ -1165,59 +1384,57 @@ static void Task_OakSpeech35(u8 taskId) { tTrainerPicPosX -= 2; gSpriteCoordOffsetX += 2; - ChangeBgX(2, 0x200, 2); + ChangeBgX(2, 0x200, BG_COORD_SUB); } else { tTrainerPicPosX = -60; PrintNameChoiceOptions(taskId, sOakSpeechResources->hasPlayerBeenNamed); - gTasks[taskId].func = Task_OakSpeech29; + gTasks[taskId].func = Task_OakSpeech_HandleRivalNameInput; } } } -static void Task_OakSpeech28(u8 taskId) +static void Task_OakSpeech_RepeatNameQuestion(u8 taskId) { PrintNameChoiceOptions(taskId, sOakSpeechResources->hasPlayerBeenNamed); if (sOakSpeechResources->hasPlayerBeenNamed == FALSE) - { - OaksSpeechPrintMessage(gOakText_AskPlayerName, 0); - } + OakSpeechPrintMessage(gOakSpeech_Text_YourNameWhatIsIt, 0); else - { - OaksSpeechPrintMessage(gOakText_AskRivalName, 0); - } - gTasks[taskId].func = Task_OakSpeech29; + OakSpeechPrintMessage(gOakSpeech_Text_YourRivalsNameWhatWasIt, 0); + gTasks[taskId].func = Task_OakSpeech_HandleRivalNameInput; } -static void Task_OakSpeech29(u8 taskId) +#define tNameNotConfirmed data[15] + +static void Task_OakSpeech_HandleRivalNameInput(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; s8 input = Menu_ProcessInput(); switch (input) { - case 1: - case 2: - case 3: - case 4: + case 0: // NEW NAME PlaySE(SE_SELECT); - ClearStdWindowAndFrameToTransparent(data[13], TRUE); - RemoveWindow(data[13]); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + gTasks[taskId].func = Task_OakSpeech_DoNamingScreen; + break; + case 1: // Default name options + case 2: // + case 3: // + case 4: // + PlaySE(SE_SELECT); + ClearStdWindowAndFrameToTransparent(tMenuWindowId, TRUE); + RemoveWindow(tMenuWindowId); GetDefaultName(sOakSpeechResources->hasPlayerBeenNamed, input - 1); - data[15] = 1; - gTasks[taskId].func = Task_OakSpeech26; + tNameNotConfirmed = TRUE; + gTasks[taskId].func = Task_OakSpeech_ConfirmName; break; - case 0: - PlaySE(SE_SELECT); - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, 0); - gTasks[taskId].func = Task_OakSpeech25; - break; - case -1: + case MENU_B_PRESSED: break; } } -static void Task_OakSpeech25(u8 taskId) +static void Task_OakSpeech_DoNamingScreen(u8 taskId) { if (!gPaletteFade.active) { @@ -1228,275 +1445,302 @@ static void Task_OakSpeech25(u8 taskId) } else { - ClearStdWindowAndFrameToTransparent(gTasks[taskId].data[13], 1); - RemoveWindow(gTasks[taskId].data[13]); + ClearStdWindowAndFrameToTransparent(gTasks[taskId].tMenuWindowId, TRUE); + RemoveWindow(gTasks[taskId].tMenuWindowId); DoNamingScreen(NAMING_SCREEN_RIVAL, gSaveBlock1Ptr->rivalName, 0, 0, 0, CB2_ReturnFromNamingScreen); } - DestroyLinkedPikaOrGrassPlatformSprites(taskId, 1); + DestroyPikachuOrPlatformSprites(taskId, SPRITE_TYPE_PLATFORM); FreeAllWindowBuffers(); } } -static void Task_OakSpeech26(u8 taskId) +static void Task_OakSpeech_ConfirmName(u8 taskId) { - s16 * data = gTasks[taskId].data; - + s16 *data = gTasks[taskId].data; if (!gPaletteFade.active) { - if (data[15] == 1) + if (tNameNotConfirmed == TRUE) { if (sOakSpeechResources->hasPlayerBeenNamed == FALSE) - { - StringExpandPlaceholders(gStringVar4, gOakText_FinalizePlayerName); - } + StringExpandPlaceholders(gStringVar4, gOakSpeech_Text_SoYourNameIsPlayer); else - { - StringExpandPlaceholders(gStringVar4, gOakText_ConfirmRivalName); - } - OaksSpeechPrintMessage(gStringVar4, sOakSpeechResources->textSpeed); - data[15] = 0; - data[3] = 25; + StringExpandPlaceholders(gStringVar4, gOakSpeech_Text_ConfirmRivalName); + OakSpeechPrintMessage(gStringVar4, sOakSpeechResources->textSpeed); + tNameNotConfirmed = FALSE; + tTimer = 25; } else if (!IsTextPrinterActive(0)) { - if (data[3] != 0) - data[3]--; + if (tTimer != 0) + { + tTimer--; + } else { - CreateYesNoMenu(&sNewGameAdventureIntroWindowTemplates[2], FONT_NORMAL, 0, 2, GetStdWindowBaseTileNum(), 14, 0); - gTasks[taskId].func = Task_OakSpeech27; + CreateYesNoMenu(&sIntro_WindowTemplates[WIN_INTRO_YESNO], FONT_NORMAL, 0, 2, GetStdWindowBaseTileNum(), 14, 0); + gTasks[taskId].func = Task_OakSpeech_HandleConfirmNameInput; } } } } -static void Task_OakSpeech27(u8 taskId) +static void Task_OakSpeech_HandleConfirmNameInput(u8 taskId) { s8 input = Menu_ProcessInputNoWrapClearOnChoose(); switch (input) { - case 0: + case 0: // YES PlaySE(SE_SELECT); - gTasks[taskId].data[3] = 40; + gTasks[taskId].tTimer = 40; if (sOakSpeechResources->hasPlayerBeenNamed == FALSE) { - ClearDialogWindowAndFrame(0, 1); + ClearDialogWindowAndFrame(WIN_INTRO_TEXTBOX, TRUE); CreateFadeInTask(taskId, 2); - gTasks[taskId].func = Task_OakSpeech30; + gTasks[taskId].func = Task_OakSpeech_FadeOutPlayerPic; } else { - StringExpandPlaceholders(gStringVar4, gOakText_RememberRivalName); - OaksSpeechPrintMessage(gStringVar4, sOakSpeechResources->textSpeed); - gTasks[taskId].func = Task_OakSpeech31; + StringExpandPlaceholders(gStringVar4, gOakSpeech_Text_RememberRivalsName); + OakSpeechPrintMessage(gStringVar4, sOakSpeechResources->textSpeed); + gTasks[taskId].func = Task_OakSpeech_FadeOutRivalPic; } break; - case 1: - case -1: + case 1: // NO + case MENU_B_PRESSED: PlaySE(SE_SELECT); if (sOakSpeechResources->hasPlayerBeenNamed == FALSE) - gTasks[taskId].func = Task_OakSpeech24; + gTasks[taskId].func = Task_OakSpeech_FadeOutForPlayerNamingScreen; else - gTasks[taskId].func = Task_OakSpeech28; + gTasks[taskId].func = Task_OakSpeech_RepeatNameQuestion; break; } } -static void Task_OakSpeech30(u8 taskId) +static void Task_OakSpeech_FadeOutPlayerPic(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (tTrainerPicFadeState != 0) { - DestroyOaksSpeechTrainerPic(); - if (data[3] != 0) - data[3]--; + ClearTrainerPic(); + if (tTimer != 0) + tTimer--; else - gTasks[taskId].func = Task_OakSpeech32; + gTasks[taskId].func = Task_OakSpeech_FadeInRivalPic; } } -static void Task_OakSpeech31(u8 taskId) +static void Task_OakSpeech_FadeOutRivalPic(u8 taskId) { if (!IsTextPrinterActive(0)) { ClearDialogWindowAndFrame(0, 1); CreateFadeInTask(taskId, 2); - gTasks[taskId].func = Task_OakSpeech33; + gTasks[taskId].func = Task_OakSpeech_ReshowPlayersPic; } } -static void Task_OakSpeech32(u8 taskId) +static void Task_OakSpeech_FadeInRivalPic(u8 taskId) { - ChangeBgX(2, 0, 0); + ChangeBgX(2, 0, BG_COORD_SET); gTasks[taskId].tTrainerPicPosX = 0; gSpriteCoordOffsetX = 0; - LoadOaksSpeechTrainerPic(RIVAL_PIC, 0); + LoadTrainerPic(RIVAL_PIC, 0); CreateFadeOutTask(taskId, 2); - gTasks[taskId].func = Task_OakSpeech34; + gTasks[taskId].func = Task_OakSpeech_AskRivalsName; } -static void Task_OakSpeech34(u8 taskId) +static void Task_OakSpeech_AskRivalsName(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (tTrainerPicFadeState != 0) { - OaksSpeechPrintMessage(gOakText_IntroduceRival, sOakSpeechResources->textSpeed); + OakSpeechPrintMessage(gOakSpeech_Text_WhatWasHisName, sOakSpeechResources->textSpeed); sOakSpeechResources->hasPlayerBeenNamed = TRUE; - gTasks[taskId].func = Task_OakSpeech35; + gTasks[taskId].func = Task_OakSpeech_MoveRivalDisplayNameOptions; } } -static void Task_OakSpeech33(u8 taskId) +static void Task_OakSpeech_ReshowPlayersPic(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (tTrainerPicFadeState != 0) { - DestroyOaksSpeechTrainerPic(); - if (data[3] != 0) - data[3]--; + ClearTrainerPic(); + if (tTimer != 0) + { + tTimer--; + } else { if (gSaveBlock2Ptr->playerGender == MALE) - LoadOaksSpeechTrainerPic(MALE_PLAYER_PIC, 0); + LoadTrainerPic(MALE_PLAYER_PIC, 0); else - LoadOaksSpeechTrainerPic(FEMALE_PLAYER_PIC, 0); + LoadTrainerPic(FEMALE_PLAYER_PIC, 0); gTasks[taskId].tTrainerPicPosX = 0; gSpriteCoordOffsetX = 0; - ChangeBgX(2, 0, 0); + ChangeBgX(2, 0, BG_COORD_SET); CreateFadeOutTask(taskId, 2); - gTasks[taskId].func = Task_OakSpeech36; + gTasks[taskId].func = Task_OakSpeech_LetsGo; } } } -static void Task_OakSpeech36(u8 taskId) +static void Task_OakSpeech_LetsGo(u8 taskId) { if (gTasks[taskId].tTrainerPicFadeState != 0) { - StringExpandPlaceholders(gStringVar4, gOakText_LegendAboutToUnfold); - OaksSpeechPrintMessage(gStringVar4, sOakSpeechResources->textSpeed); - gTasks[taskId].data[3] = 30; - gTasks[taskId].func = Task_OakSpeech37; + StringExpandPlaceholders(gStringVar4, gOakSpeech_Text_LetsGo); + OakSpeechPrintMessage(gStringVar4, sOakSpeechResources->textSpeed); + gTasks[taskId].tTimer = 30; + gTasks[taskId].func = Task_OakSpeech_FadeOutBGM; } } -static void Task_OakSpeech37(u8 taskId) +static void Task_OakSpeech_FadeOutBGM(u8 taskId) { if (!IsTextPrinterActive(0)) { - if (gTasks[taskId].data[3] != 0) - gTasks[taskId].data[3]--; + if (gTasks[taskId].tTimer != 0) + { + gTasks[taskId].tTimer--; + } else { FadeOutBGM(4); - gTasks[taskId].func = Task_OakSpeech38; + gTasks[taskId].func = Task_OakSpeech_SetUpExitAnimation; } } } -static void Task_OakSpeech38(u8 taskId) +// The sOakSpeechResources struct's currentPage field is reused below as a timer for shrinking the player pic +#define shrinkTimer currentPage + +static void Task_OakSpeech_SetUpExitAnimation(u8 taskId) { - sOakSpeechResources->unk_0012 = 0; - Task_OakSpeech38_1(taskId); - Task_OakSpeech38_2(taskId); - Task_OakSpeech38_3(taskId); + sOakSpeechResources->shrinkTimer = 0; + Task_OakSpeech_SetUpDestroyPlatformSprites(taskId); + Task_OakSpeech_SetUpFadePlayerPicWhite(taskId); + Task_OakSpeech_SetUpShrinkPlayerPic(taskId); } -static void Task_OakSpeech38_3(u8 taskId) +#define tPlayerPicFadeOutTimer data[0] +#define tScaleDelta data[2] +#define tPlayerIsShrunk data[15] + +static void Task_OakSpeech_SetUpShrinkPlayerPic(u8 taskId) { - s16 * data = gTasks[taskId].data; - SetBgAttribute(2, 6, 1); - data[0] = 0; - tTrainerPicPosX = 0; - tTrainerPicFadeState = 256; - data[15] = 0; - gTasks[taskId].func = Task_OakSpeech39; + s16 *data = gTasks[taskId].data; + SetBgAttribute(2, BG_ATTR_WRAPAROUND, 1); + tPlayerPicFadeOutTimer = 0; + data[1] = 0; // assigned, but never read + tScaleDelta = 256; + tPlayerIsShrunk = FALSE; + gTasks[taskId].func = Task_OakSpeech_ShrinkPlayerPic; } -static void Task_OakSpeech39(u8 taskId) +static void Task_OakSpeech_ShrinkPlayerPic(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; s16 x, y; - u16 r0; + u16 oldScaleDelta; - sOakSpeechResources->unk_0012++; - if (sOakSpeechResources->unk_0012 % 20 == 0) + sOakSpeechResources->shrinkTimer++; + if (sOakSpeechResources->shrinkTimer % 20 == 0) { - if (sOakSpeechResources->unk_0012 == 40) + if (sOakSpeechResources->shrinkTimer == 40) PlaySE(SE_WARP_IN); - r0 = tTrainerPicFadeState; - tTrainerPicFadeState -= 32; - x = Q_8_8_inv(r0 - 8); - y = Q_8_8_inv(tTrainerPicFadeState - 16); - SetBgAffine(2, 0x7800, 0x5400, 0x78, 0x54, x, y, 0); - if (tTrainerPicFadeState <= 96) + oldScaleDelta = tScaleDelta; + tScaleDelta -= 32; + x = Q_8_8_inv(oldScaleDelta - 8); + y = Q_8_8_inv(tScaleDelta - 16); + SetBgAffine(2, 0x7800, 0x5400, 120, 84, x, y, 0); + if (tScaleDelta <= 96) { - data[15] = 1; - data[0] = 36; - gTasks[taskId].func = Task_OakSpeech40; + tPlayerIsShrunk = TRUE; + tPlayerPicFadeOutTimer = 36; + gTasks[taskId].func = Task_OakSpeech_FadePlayerPicToBlack; } } } -static void Task_OakSpeech38_1(u8 taskId) +#define tBGFadeStarted data[1] + +static void Task_OakSpeech_SetUpDestroyPlatformSprites(u8 taskId) { - u8 taskId2 = CreateTask(Task_OakSpeech38_sub1, 1); - s16 * data = gTasks[taskId2].data; - data[0] = 0; - data[1] = 0; - data[2] = 0; - data[15] = 0; - BeginNormalPaletteFade(0xFFFF0FCF, 4, 0, 16, RGB_BLACK); + u8 taskId2 = CreateTask(Task_OakSpeech_DestroyPlatformSprites, 1); + s16 *data = gTasks[taskId2].data; + data[0] = 0; // assigned, but never read + tBGFadeStarted = 0; + data[2] = 0; // assigned, but never read + data[15] = 0; // assigned, but never read + BeginNormalPaletteFade(PALETTES_OBJECTS | 0x0FCF, 4, 0, 16, RGB_BLACK); } -static void Task_OakSpeech38_sub1(u8 taskId) +static void Task_OakSpeech_DestroyPlatformSprites(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (!gPaletteFade.active) { - if (data[1] != 0) + if (tBGFadeStarted != 0) { DestroyTask(taskId); - DestroyLinkedPikaOrGrassPlatformSprites(taskId, 1); + // As this function's taskId is in fact taskId2 above, in + // Task_OakSpeech_SetUpDestroyPlatformSprites, the platform sprite + // IDs have not been assigned to this task's data[7], data[8] and + // data[9]. + // As a result, the function below will only delete the sprite with + // ID 0. + // This can be verified by looking at the sprite viewer in an + // emulator at the end of the Oak speech. + DestroyPikachuOrPlatformSprites(taskId, SPRITE_TYPE_PLATFORM); } else { - data[1]++; - BeginNormalPaletteFade(0x0000F000, 0, 0, 16, RGB_BLACK); + tBGFadeStarted++; + BeginNormalPaletteFade(0x0000 | 0xF000, 0, 0, 16, RGB_BLACK); } } } -static void Task_OakSpeech38_2(u8 taskId) +#undef tBGFadeStarted + +#define tPlayerPicFadeWhiteTimer data[0] +#define tUnderflowingTimer data[1] +#define tSecondaryTimer data[2] +#define tBlendCoefficient data[14] + +static void Task_OakSpeech_SetUpFadePlayerPicWhite(u8 taskId) { - u8 taskId2 = CreateTask(Task_OakSpeech38_sub2, 2); - s16 * data = gTasks[taskId2].data; - data[0] = 8; - data[1] = 0; - data[2] = 8; - data[14] = 0; - data[15] = 0; + u8 taskId2 = CreateTask(Task_OakSpeech_FadePlayerPicWhite, 2); + s16 *data = gTasks[taskId2].data; + tPlayerPicFadeWhiteTimer = 8; + tUnderflowingTimer = 0; + tSecondaryTimer = 8; + tBlendCoefficient = 0; + data[15] = 0; // assigned, but never read } -static void Task_OakSpeech38_sub2(u8 taskId) +static void Task_OakSpeech_FadePlayerPicWhite(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; u8 i; - if (data[0] != 0) - data[0]--; + if (tPlayerPicFadeWhiteTimer != 0) + { + tPlayerPicFadeWhiteTimer--; + } else { - if (data[1] <= 0 && data[2] != 0) - data[2]--; - BlendPalette(0x40, 0x20, data[14], RGB_WHITE); - data[14]++; - data[1]--; - data[0] = data[2]; - if (data[14] > 14) + if (tUnderflowingTimer <= 0 && tSecondaryTimer != 0) + tSecondaryTimer--; + BlendPalette(0x40, 0x20, tBlendCoefficient, RGB_WHITE); + tBlendCoefficient++; + tUnderflowingTimer--; + tPlayerPicFadeWhiteTimer = tSecondaryTimer; + if (tBlendCoefficient > 14) { for (i = 0; i < 32; i++) { @@ -1508,26 +1752,26 @@ static void Task_OakSpeech38_sub2(u8 taskId) } } -static void Task_OakSpeech40(u8 taskId) +static void Task_OakSpeech_FadePlayerPicToBlack(u8 taskId) { - if (gTasks[taskId].data[0] != 0) - gTasks[taskId].data[0]--; + if (gTasks[taskId].tPlayerPicFadeOutTimer != 0) + { + gTasks[taskId].tPlayerPicFadeOutTimer--; + } else { - BeginNormalPaletteFade(0x00000030, 2, 0, 16, RGB_BLACK); - gTasks[taskId].func = Task_OakSpeech41; + BeginNormalPaletteFade(0x0000 | 0x0030, 2, 0, 16, RGB_BLACK); + gTasks[taskId].func = Task_OakSpeech_WaitForFade; } } -static void Task_OakSpeech41(u8 taskId) +static void Task_OakSpeech_WaitForFade(u8 taskId) { if (!gPaletteFade.active) - { - gTasks[taskId].func = Task_OakSpeech42; - } + gTasks[taskId].func = Task_OakSpeech_FreeResources; } -static void Task_OakSpeech42(u8 taskId) +static void Task_OakSpeech_FreeResources(u8 taskId) { FreeAllWindowBuffers(); OakSpeechNidoranFFreeResources(); @@ -1557,13 +1801,13 @@ static void CB2_ReturnFromNamingScreen(void) break; case 1: ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(1, sBgTemplates, NELEMS(sBgTemplates)); + InitBgsFromTemplates(1, sBgTemplates, ARRAY_COUNT(sBgTemplates)); SetBgTilemapBuffer(1, sOakSpeechResources->bg1TilemapBuffer); SetBgTilemapBuffer(2, sOakSpeechResources->bg2TilemapBuffer); - ChangeBgX(1, 0, 0); - ChangeBgY(1, 0, 0); - ChangeBgX(2, 0, 0); - ChangeBgY(2, 0, 0); + ChangeBgX(1, 0, BG_COORD_SET); + ChangeBgY(1, 0, BG_COORD_SET); + ChangeBgX(2, 0, BG_COORD_SET); + ChangeBgY(2, 0, BG_COORD_SET); break; case 2: SetGpuReg(REG_OFFSET_WIN0H, 0); @@ -1578,36 +1822,38 @@ static void CB2_ReturnFromNamingScreen(void) FreeAllWindowBuffers(); InitStandardTextBoxWindows(); InitTextBoxGfxAndPrinters(); - LoadPalette(sHelpDocsPalette, 0, 0xe0); + LoadPalette(sControlsGuide_Pal, 0, 0xE0); break; case 4: - DecompressAndCopyTileDataToVram(1, sOakSpeechGfx_SolidColors, 0, 0, 0); + DecompressAndCopyTileDataToVram(1, sOakSpeech_Background_Tiles, 0, 0, 0); break; case 5: if (FreeTempTileDataBuffersIfPossible()) return; - FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20); - CopyToBgTilemapBuffer(1, sOakSpeech_BackgroundTilemap, 0, 0); - FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20); + FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 20); + CopyToBgTilemapBuffer(1, sOakSpeech_Background_Tilemap, 0, 0); + FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); break; case 6: - taskId = CreateTask(Task_OakSpeech26, 0); + taskId = CreateTask(Task_OakSpeech_ConfirmName, 0); if (sOakSpeechResources->hasPlayerBeenNamed == FALSE) { if (gSaveBlock2Ptr->playerGender == MALE) - LoadOaksSpeechTrainerPic(MALE_PLAYER_PIC, 0); + LoadTrainerPic(MALE_PLAYER_PIC, 0); else - LoadOaksSpeechTrainerPic(FEMALE_PLAYER_PIC, 0); + LoadTrainerPic(FEMALE_PLAYER_PIC, 0); } else - LoadOaksSpeechTrainerPic(RIVAL_PIC, 0); + { + LoadTrainerPic(RIVAL_PIC, 0); + } gTasks[taskId].tTrainerPicPosX = -60; gSpriteCoordOffsetX += 60; - ChangeBgX(2, -0x3C00, 0); - CreatePikaOrGrassPlatformSpriteAndLinkToCurrentTask(taskId, 1); - gTasks[taskId].data[15] = 1; + ChangeBgX(2, 0xFFFFC400, BG_COORD_SET); + CreatePikachuOrPlatformSprites(taskId, SPRITE_TYPE_PLATFORM); + gTasks[taskId].tNameNotConfirmed = TRUE; break; case 7: BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); @@ -1616,9 +1862,9 @@ static void CB2_ReturnFromNamingScreen(void) ShowBg(1); ShowBg(2); EnableInterrupts(INTR_FLAG_VBLANK); - SetVBlankCallback(VBlankCB_NewGameOaksSpeech); + SetVBlankCallback(VBlankCB_NewGameScene); gTextFlags.canABSpeedUpPrint = TRUE; - SetMainCallback2(CB2_NewGameOaksSpeech); + SetMainCallback2(CB2_NewGameScene); return; } @@ -1632,186 +1878,185 @@ static void CreateNidoranFSprite(u8 taskId) DecompressPicFromTable(&gMonFrontPicTable[SPECIES_NIDORAN_F], OakSpeechNidoranFGetBuffer(0), SPECIES_NIDORAN_F); LoadCompressedSpritePaletteUsingHeap(&gMonPaletteTable[SPECIES_NIDORAN_F]); SetMultiuseSpriteTemplateToPokemon(SPECIES_NIDORAN_F, 0); - spriteId = CreateSprite(&gMultiuseSpriteTemplate, 0x60, 0x60, 1); + spriteId = CreateSprite(&gMultiuseSpriteTemplate, 96, 96, 1); gSprites[spriteId].callback = SpriteCallbackDummy; gSprites[spriteId].oam.priority = 1; gSprites[spriteId].invisible = TRUE; - gTasks[taskId].data[4] = spriteId; + gTasks[taskId].tNidoranFSpriteId = spriteId; } -static void SpriteCB_PikaSync(struct Sprite *sprite) +#define sBodySpriteId data[0] + +static void SpriteCB_Pikachu(struct Sprite *sprite) { - sprite->y2 = gSprites[sprite->data[0]].animCmdIndex; + sprite->y2 = gSprites[sprite->sBodySpriteId].animCmdIndex; } -static void CreatePikaOrGrassPlatformSpriteAndLinkToCurrentTask(u8 taskId, u8 state) +static void CreatePikachuOrPlatformSprites(u8 taskId, u8 spriteType) { u8 spriteId; u8 i = 0; - switch (state) + switch (spriteType) { - case 0: - LoadCompressedSpriteSheet(&sOakSpeech_PikaSpriteSheets[0]); - LoadCompressedSpriteSheet(&sOakSpeech_PikaSpriteSheets[1]); - LoadCompressedSpriteSheet(&sOakSpeech_PikaSpriteSheets[2]); - LoadSpritePalette(&sOakSpeech_PikaSpritePal); - spriteId = CreateSprite(&sOakSpeech_PikaSpriteTemplates[0], 0x10, 0x11, 2); + case SPRITE_TYPE_PIKACHU: + LoadCompressedSpriteSheet(&sPikachuIntro_Pikachu_SpriteSheets[PIKACHU_BODY_PLATFORM_LEFT]); + LoadCompressedSpriteSheet(&sPikachuIntro_Pikachu_SpriteSheets[PIKACHU_EARS_PLATFORM_MIDDLE]); + LoadCompressedSpriteSheet(&sPikachuIntro_Pikachu_SpriteSheets[PIKACHU_EYES_PLATFORM_RIGHT]); + LoadSpritePalette(&sPikachuIntro_Pikachu_SpritePalette); + spriteId = CreateSprite(&sPikachuIntro_Pikachu_SpriteTemplates[PIKACHU_BODY_PLATFORM_LEFT], 16, 17, 2); gSprites[spriteId].oam.priority = 0; - gTasks[taskId].data[7] = spriteId; - spriteId = CreateSprite(&sOakSpeech_PikaSpriteTemplates[1], 0x10, 0x09, 3); + gTasks[taskId].tPikachuPlatformSpriteId(PIKACHU_BODY_PLATFORM_LEFT) = spriteId; + spriteId = CreateSprite(&sPikachuIntro_Pikachu_SpriteTemplates[PIKACHU_EARS_PLATFORM_MIDDLE], 16, 9, 3); gSprites[spriteId].oam.priority = 0; - gSprites[spriteId].data[0] = gTasks[taskId].data[7]; - gSprites[spriteId].callback = SpriteCB_PikaSync; - gTasks[taskId].data[8] = spriteId; - spriteId = CreateSprite(&sOakSpeech_PikaSpriteTemplates[2], 0x18, 0x0D, 1); + gSprites[spriteId].sBodySpriteId = gTasks[taskId].tPikachuPlatformSpriteId(PIKACHU_BODY_PLATFORM_LEFT); + gSprites[spriteId].callback = SpriteCB_Pikachu; + gTasks[taskId].tPikachuPlatformSpriteId(PIKACHU_EARS_PLATFORM_MIDDLE) = spriteId; + spriteId = CreateSprite(&sPikachuIntro_Pikachu_SpriteTemplates[PIKACHU_EYES_PLATFORM_RIGHT], 24, 13, 1); gSprites[spriteId].oam.priority = 0; - gSprites[spriteId].data[0] = gTasks[taskId].data[7]; - gSprites[spriteId].callback = SpriteCB_PikaSync; - gTasks[taskId].data[9] = spriteId; + gSprites[spriteId].sBodySpriteId = gTasks[taskId].tPikachuPlatformSpriteId(PIKACHU_BODY_PLATFORM_LEFT); + gSprites[spriteId].callback = SpriteCB_Pikachu; + gTasks[taskId].tPikachuPlatformSpriteId(PIKACHU_EYES_PLATFORM_RIGHT) = spriteId; break; - case 1: - LoadCompressedSpriteSheet(&sOakSpeech_GrassPlatformSpriteSheet); - LoadSpritePalette(&sOakSpeech_GrassPlatformSpritePal); - for (i = 0; i < 3; i++) + case SPRITE_TYPE_PLATFORM: + LoadCompressedSpriteSheet(&sOakSpeech_Platform_SpriteSheet); + LoadSpritePalette(&sOakSpeech_Platform_SpritePalette); + for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++) { - spriteId = CreateSprite(&sOakSpeech_GrassPlatformSpriteTemplates[i], i * 32 + 88, 0x70, 1); + spriteId = CreateSprite(&sOakSpeech_Platform_SpriteTemplates[i], i * 32 + 88, 112, 1); gSprites[spriteId].oam.priority = 2; gSprites[spriteId].animPaused = TRUE; gSprites[spriteId].coordOffsetEnabled = TRUE; - gTasks[taskId].data[7 + i] = spriteId; + gTasks[taskId].tPikachuPlatformSpriteId(i) = spriteId; } break; } } -static void DestroyLinkedPikaOrGrassPlatformSprites(u8 taskId, u8 state) +static void DestroyPikachuOrPlatformSprites(u8 taskId, u8 spriteType) { u8 i; + for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++) + DestroySprite(&gSprites[gTasks[taskId].tPikachuPlatformSpriteId(i)]); - for (i = 0; i < 3; i++) + switch (spriteType) { - DestroySprite(&gSprites[gTasks[taskId].data[7 + i]]); - } - - switch (state) - { - case 0: - FreeSpriteTilesByTag(0x1003); - FreeSpriteTilesByTag(0x1002); - FreeSpriteTilesByTag(0x1001); - FreeSpritePaletteByTag(0x1001); + case SPRITE_TYPE_PIKACHU: + FreeSpriteTilesByTag(GFX_TAG_PIKACHU_EYES); + FreeSpriteTilesByTag(GFX_TAG_PIKACHU_EARS); + FreeSpriteTilesByTag(GFX_TAG_PIKACHU); + FreeSpritePaletteByTag(PAL_TAG_PIKACHU); break; - case 1: - FreeSpriteTilesByTag(0x1000); - FreeSpritePaletteByTag(0x1000); + case SPRITE_TYPE_PLATFORM: + FreeSpriteTilesByTag(GFX_TAG_PLATFORM); + FreeSpritePaletteByTag(PAL_TAG_PLATFORM); break; } } -static void LoadOaksSpeechTrainerPic(u16 whichPic, u16 tileOffset) +static void LoadTrainerPic(u16 whichPic, u16 tileOffset) { u32 i; switch (whichPic) { case MALE_PLAYER_PIC: - LoadPalette(sOakSpeechGfx_RedPal, 0x40, 0x40); - LZ77UnCompVram(sOakSpeechGfx_RedPic, (void *)0x06000600 + tileOffset); + LoadPalette(sOakSpeech_Red_Pal, 0x40, 0x40); + LZ77UnCompVram(sOakSpeech_Red_Tiles, (void *)VRAM + 0x600 + tileOffset); break; case FEMALE_PLAYER_PIC: - LoadPalette(sOakSpeechGfx_LeafPal, 0x40, 0x40); - LZ77UnCompVram(sOakSpeechGfx_LeafPic, (void *)0x06000600 + tileOffset); + LoadPalette(sOakSpeech_Leaf_Pal, 0x40, 0x40); + LZ77UnCompVram(sOakSpeech_Leaf_Tiles, (void *)VRAM + 0x600 + tileOffset); break; case RIVAL_PIC: - LoadPalette(sOakSpeechGfx_RivalPal, 0x60, 0x40); - LZ77UnCompVram(sOakSpeechGfx_RivalPic, (void *)0x06000600 + tileOffset); + LoadPalette(sOakSpeech_Rival_Pal, 0x60, 0x40); + LZ77UnCompVram(sOakSpeech_Rival_Tiles, (void *)VRAM + 0x600 + tileOffset); break; case OAK_PIC: - LoadPalette(sOakSpeechGfx_OakPal, 0x60, 0x40); - LZ77UnCompVram(sOakSpeechGfx_OakPic, (void *)0x06000600 + tileOffset); + LoadPalette(sOakSpeech_Oak_Pal, 0x60, 0x40); + LZ77UnCompVram(sOakSpeech_Oak_Tiles, (void *)VRAM + 0x600 + tileOffset); break; default: return; } - sOakSpeechResources->trainerPicTilemapBuffer = AllocZeroed(0x60); + sOakSpeechResources->trainerPicTilemap = AllocZeroed(0x60); for (i = 0; i < 0x60; i++) - ((u8 *)sOakSpeechResources->trainerPicTilemapBuffer)[i] = i; - FillBgTilemapBufferRect(2, 0x000, 0, 0, 32, 32, 0x10); - CopyRectToBgTilemapBufferRect(2, sOakSpeechResources->trainerPicTilemapBuffer, 0, 0, 8, 12, 11, 2, 8, 12, 0x10, (tileOffset / 64) + 0x18, 0x00); + ((u8 *)sOakSpeechResources->trainerPicTilemap)[i] = i; + FillBgTilemapBufferRect(2, 0, 0, 0, 32, 32, 16); + CopyRectToBgTilemapBufferRect(2, sOakSpeechResources->trainerPicTilemap, 0, 0, 8, 12, 11, 2, 8, 12, 16, (tileOffset / 64) + 24, 0); CopyBgTilemapBufferToVram(2); - Free(sOakSpeechResources->trainerPicTilemapBuffer); - sOakSpeechResources->trainerPicTilemapBuffer = 0; + Free(sOakSpeechResources->trainerPicTilemap); + sOakSpeechResources->trainerPicTilemap = 0; } -static void DestroyOaksSpeechTrainerPic(void) +static void ClearTrainerPic(void) { - FillBgTilemapBufferRect(2, 0x000, 11, 1, 8, 12, 0x10); + FillBgTilemapBufferRect(2, 0, 11, 1, 8, 12, 16); CopyBgTilemapBufferToVram(2); } #define tParentTaskId data[0] +#define tBlendTarget1 data[1] +#define tBlendTarget2 data[2] +#define tUnusedState data[3] +#define tFadeTimer data[4] static void Task_SlowFadeIn(u8 taskId) { u8 i = 0; - if (gTasks[taskId].data[1] == 0) + if (gTasks[taskId].tBlendTarget1 == 0) { gTasks[gTasks[taskId].tParentTaskId].tTrainerPicFadeState = 1; DestroyTask(taskId); - for (i = 0; i < 3; i++) - { - gSprites[gTasks[taskId].data[7 + i]].invisible = TRUE; - } + for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++) + gSprites[gTasks[taskId].tPikachuPlatformSpriteId(i)].invisible = TRUE; } else { - if (gTasks[taskId].data[4] != 0) - gTasks[taskId].data[4]--; + if (gTasks[taskId].tFadeTimer != 0) + { + gTasks[taskId].tFadeTimer--; + } else { - gTasks[taskId].data[4] = gTasks[taskId].data[3]; - gTasks[taskId].data[1]--; - gTasks[taskId].data[2]++; - if (gTasks[taskId].data[1] == 8) + gTasks[taskId].tFadeTimer = gTasks[taskId].tTimer; + gTasks[taskId].tBlendTarget1--; + gTasks[taskId].tBlendTarget2++; + if (gTasks[taskId].tBlendTarget1 == 8) { - for (i = 0; i < 3; i++) - { - gSprites[gTasks[taskId].data[7 + i]].invisible ^= TRUE; - } + for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++) + gSprites[gTasks[taskId].tPikachuPlatformSpriteId(i)].invisible ^= TRUE; } - SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].data[2] * 256) + gTasks[taskId].data[1]); + SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].tBlendTarget2 * 256) + gTasks[taskId].tBlendTarget1); } } } -static void CreateFadeInTask(u8 taskId, u8 state) +static void CreateFadeInTask(u8 taskId, u8 delay) { u8 taskId2; u8 i = 0; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ); - SetGpuReg(REG_OFFSET_BLDALPHA, 0x10); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); SetGpuReg(REG_OFFSET_BLDY, 0); gTasks[taskId].tTrainerPicFadeState = 0; taskId2 = CreateTask(Task_SlowFadeIn, 0); gTasks[taskId2].tParentTaskId = taskId; - gTasks[taskId2].data[1] = 16; - gTasks[taskId2].data[2] = 0; - gTasks[taskId2].data[3] = state; - gTasks[taskId2].data[4] = state; - for (i = 0; i < 3; i++) - { - gTasks[taskId2].data[7 + i] = gTasks[taskId].data[7 + i]; - } + gTasks[taskId2].tBlendTarget1 = 16; + gTasks[taskId2].tBlendTarget2 = 0; + gTasks[taskId2].tUnusedState = delay; // assigned, but never read + gTasks[taskId2].tFadeTimer = delay; + for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++) + gTasks[taskId2].tPikachuPlatformSpriteId(i) = gTasks[taskId].tPikachuPlatformSpriteId(i); } static void Task_SlowFadeOut(u8 taskId) { u8 i = 0; - if (gTasks[taskId].data[1] == 16) + if (gTasks[taskId].tBlendTarget1 == 16) { if (!gPaletteFade.active) { @@ -1821,81 +2066,77 @@ static void Task_SlowFadeOut(u8 taskId) } else { - if (gTasks[taskId].data[4] != 0) - gTasks[taskId].data[4]--; + if (gTasks[taskId].tFadeTimer != 0) + { + gTasks[taskId].tFadeTimer--; + } else { - gTasks[taskId].data[4] = gTasks[taskId].data[3]; - gTasks[taskId].data[1] += 2; - gTasks[taskId].data[2] -= 2; - if (gTasks[taskId].data[1] == 8) + gTasks[taskId].tFadeTimer = gTasks[taskId].tTimer; + gTasks[taskId].tBlendTarget1 += 2; + gTasks[taskId].tBlendTarget2 -= 2; + if (gTasks[taskId].tBlendTarget1 == 8) { - for (i = 0; i < 3; i++) - { - gSprites[gTasks[taskId].data[7 + i]].invisible ^= TRUE; - } + for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++) + gSprites[gTasks[taskId].tPikachuPlatformSpriteId(i)].invisible ^= TRUE; } - SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].data[2] * 256) + gTasks[taskId].data[1]); + SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].tBlendTarget2 * 256) + gTasks[taskId].tBlendTarget1); } } } -static void CreateFadeOutTask(u8 taskId, u8 state) +static void CreateFadeOutTask(u8 taskId, u8 delay) { u8 taskId2; u8 i = 0; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ); - SetGpuReg(REG_OFFSET_BLDALPHA, 0x1000); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); SetGpuReg(REG_OFFSET_BLDY, 0); gTasks[taskId].tTrainerPicFadeState = 0; + taskId2 = CreateTask(Task_SlowFadeOut, 0); gTasks[taskId2].tParentTaskId = taskId; - gTasks[taskId2].data[1] = 0; - gTasks[taskId2].data[2] = 16; - gTasks[taskId2].data[3] = state; - gTasks[taskId2].data[4] = state; - for (i = 0; i < 3; i++) - { - gTasks[taskId2].data[7 + i] = gTasks[taskId].data[7 + i]; - } + gTasks[taskId2].tBlendTarget1 = 0; + gTasks[taskId2].tBlendTarget2 = 16; + gTasks[taskId2].tUnusedState = delay; // assigned, but never read + gTasks[taskId2].tFadeTimer = delay; + for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++) + gTasks[taskId2].tPikachuPlatformSpriteId(i) = gTasks[taskId].tPikachuPlatformSpriteId(i); } static void PrintNameChoiceOptions(u8 taskId, u8 hasPlayerBeenNamed) { - s16 * data = gTasks[taskId].data; - const u8 *const * textPtrs; + s16 *data = gTasks[taskId].data; + const u8 *const *textPtrs; u8 i; - data[13] = AddWindow(&sNewGameAdventureIntroWindowTemplates[3]); - PutWindowTilemap(data[13]); - DrawStdFrameWithCustomTileAndPalette(data[13], 1, GetStdWindowBaseTileNum(), 14); - FillWindowPixelBuffer(gTasks[taskId].data[13], 0x11); - AddTextPrinterParameterized(data[13], FONT_NORMAL, gOtherText_NewName, 8, 1, 0, NULL); + tMenuWindowId = AddWindow(&sIntro_WindowTemplates[WIN_INTRO_NAMES]); + PutWindowTilemap(tMenuWindowId); + DrawStdFrameWithCustomTileAndPalette(tMenuWindowId, 1, GetStdWindowBaseTileNum(), 14); + FillWindowPixelBuffer(gTasks[taskId].tMenuWindowId, PIXEL_FILL(1)); + AddTextPrinterParameterized(tMenuWindowId, FONT_NORMAL, gOtherText_NewName, 8, 1, 0, NULL); if (hasPlayerBeenNamed == FALSE) textPtrs = gSaveBlock2Ptr->playerGender == MALE ? sMaleNameChoices : sFemaleNameChoices; else textPtrs = sRivalNameChoices; - for (i = 0; i < 4; i++) - { - AddTextPrinterParameterized(data[13], FONT_NORMAL, textPtrs[i], 8, 16 * (i + 1) + 1, 0, NULL); - } - Menu_InitCursor(data[13], FONT_NORMAL, 0, 1, 16, 5, 0); - CopyWindowToVram(data[13], COPYWIN_FULL); + for (i = 0; i < ARRAY_COUNT(sRivalNameChoices); i++) + AddTextPrinterParameterized(tMenuWindowId, FONT_NORMAL, textPtrs[i], 8, 16 * (i + 1) + 1, 0, NULL); + Menu_InitCursor(tMenuWindowId, FONT_NORMAL, 0, 1, 16, 5, 0); + CopyWindowToVram(tMenuWindowId, COPYWIN_FULL); } static void GetDefaultName(u8 hasPlayerBeenNamed, u8 rivalNameChoice) { - const u8 * src; - u8 * dest; + const u8 *src; + u8 *dest; u8 i; - if (hasPlayerBeenNamed == FALSE) { if (gSaveBlock2Ptr->playerGender == MALE) - src = sMaleNameChoices[Random() % 19]; + src = sMaleNameChoices[Random() % ARRAY_COUNT(sMaleNameChoices)]; else - src = sFemaleNameChoices[Random() % 19]; + src = sFemaleNameChoices[Random() % ARRAY_COUNT(sFemaleNameChoices)]; dest = gSaveBlock2Ptr->playerName; } else @@ -1908,3 +2149,29 @@ static void GetDefaultName(u8 hasPlayerBeenNamed, u8 rivalNameChoice) for (; i < PLAYER_NAME_LENGTH + 1; i++) dest[i] = EOS; } + +#undef tSpriteTimer +#undef tTrainerPicPosX +#undef tTrainerPicFadeState +#undef tTimer +#undef tNidoranFSpriteId +#undef tTextCursorSpriteId +#undef tPokeBallSpriteId +#undef tMenuWindowId +#undef tTextboxWindowId +#undef tDelta +#undef tPlayerPicFadeOutTimer +#undef tScaleDelta +#undef tPlayerIsShrunk +#undef shrinkTimer +#undef tPlayerPicFadeWhiteTimer +#undef tUnderflowingTimer +#undef tSecondaryTimer +#undef tBlendCoefficient +#undef tNameNotConfirmed +#undef sBodySpriteId +#undef tParentTaskId +#undef tBlendTarget1 +#undef tBlendTarget2 +#undef tUnusedState +#undef tFadeTimer