diff options
author | Diegoisawesome <Diegoisawesome@users.noreply.github.com> | 2018-02-17 04:14:13 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-02-17 04:14:13 -0600 |
commit | bc90a4fc1d5b63ad26d5c43722ccfe9df7ed1e07 (patch) | |
tree | 101cf777ea827ff7e68069c5ad45822a629ea75c /src | |
parent | e2932a38ded59a6b794d10024498db718c0b0bb9 (diff) | |
parent | ebd88b36060e8958fbf5f3b2028629575c79a243 (diff) |
Merge pull request #215 from Diegoisawesome/intro
Decompile intro and credits
Diffstat (limited to 'src')
-rw-r--r-- | src/credits.c | 2355 | ||||
-rw-r--r-- | src/hall_of_fame.c | 6 | ||||
-rw-r--r-- | src/intro.c | 3020 | ||||
-rw-r--r-- | src/intro_credits_graphics.c | 849 | ||||
-rw-r--r-- | src/main.c | 2 | ||||
-rw-r--r-- | src/mystery_event_menu.c | 2 | ||||
-rw-r--r-- | src/reset_save_heap.c | 4 | ||||
-rw-r--r-- | src/save.c | 19 | ||||
-rw-r--r-- | src/starter_choose.c | 6 |
9 files changed, 6241 insertions, 22 deletions
diff --git a/src/credits.c b/src/credits.c new file mode 100644 index 000000000..168f3e8a3 --- /dev/null +++ b/src/credits.c @@ -0,0 +1,2355 @@ +#include "global.h" +#include "palette.h" +#include "main.h" +#include "task.h" +#include "bg.h" +#include "malloc.h" +#include "window.h" +#include "text.h" +#include "menu.h" +#include "international_string_util.h" +#include "constants/songs.h" +#include "gpu_regs.h" +#include "m4a.h" +#include "constants/rgb.h" +#include "battle_dome_cards.h" +#include "starter_choose.h" +#include "decompress.h" +#include "intro_credits_graphics.h" +#include "sound.h" +#include "trig.h" +#include "graphics.h" +#include "pokedex.h" +#include "constants/vars.h" +#include "event_data.h" +#include "random.h" + +enum +{ + PAGE_TITLE, + PAGE_DIRECTOR, + PAGE_ART_DIRECTOR, + PAGE_WORLD_DIRECTOR, + PAGE_LEAD_PROGRAMMER, + PAGE_PROGRAMMERS_1, + PAGE_PROGRAMMERS_2, + PAGE_PROGRAMMERS_3, + PAGE_PROGRAMMERS_4, + PAGE_GRAPHIC_DESIGNERS_1, + PAGE_GRAPHIC_DESIGNERS_2, + PAGE_GRAPHIC_DESIGNERS_3, + PAGE_MUSIC_COMPOSITION, + PAGE_SOUND_EFFECTS, + PAGE_GAME_DESIGNERS_1, + PAGE_GAME_DESIGNERS_2, + PAGE_GAME_DESIGNERS_3, + PAGE_SCENARIO_PLOT, + PAGE_SCENARIO, + PAGE_SCRIPT_DESIGNERS, + PAGE_MAP_DESIGNERS, + PAGE_BATTLE_FRONTIER_DATA, + PAGE_PARAMETRIC_DESIGNERS, + PAGE_POKEDEX_TEXT, + PAGE_ENVIRONMENT_AND_TOOL_PROGRAMS_1, + PAGE_PKMN_DESIGNERS_1, + PAGE_PKMN_DESIGNERS_2, + PAGE_PKMN_DESIGNERS_3, + PAGE_PKMN_DESIGNERS_4, + PAGE_SUPPORT_PROGRAMMERS, + PAGE_NCL_PRODUCT_TESTING, + PAGE_PACKAGE_AND_MANUAL, + PAGE_SPECIAL_THANKS_1, + PAGE_SPECIAL_THANKS_2, + PAGE_SPECIAL_THANKS_3, + PAGE_SPECIAL_THANKS_4, + PAGE_INFORMATION_SUPERVISORS, + PAGE_ARTWORK_1, + PAGE_ARTWORK_2, + PAGE_ARTWORK_3, + PAGE_COORDINATORS, + PAGE_ENGLISH_VERSION, + PAGE_TRANSLATOR, + PAGE_TEXT_EDITOR, + PAGE_NCL_COORDINATOR, + PAGE_PROGRAMMERS_5, + PAGE_GRAPHIC_DESIGNER, + PAGE_ENVIRONMENT_AND_TOOL_PROGRAMS_2, + PAGE_NOA_TESTING, + PAGE_BRAILLE_CODE_CHECK_1, + PAGE_BRAILLE_CODE_CHECK_2, + PAGE_SPECIAL_THANKS_5, + PAGE_TASK_MANAGERS, + PAGE_PRODUCERS, + PAGE_EXECUTIVE_DIRECTOR, + PAGE_EXECUTIVE_PRODUCERS_1, + PAGE_EXECUTIVE_PRODUCERS_2, + PAGE_COUNT +}; + +#define COLOR_DARK_GREEN RGB(7, 11, 6) +#define COLOR_LIGHT_GREEN RGB(13, 20, 12) + +enum +{ + TDA_0 = 0, + TDA_TASK_C_ID = 1, + TDA_TASK_E_ID = 2, + TDA_TASK_D_ID = 3, + TDA_4 = 4, + TDA_PLAYER_CYCLIST = 5, + TDA_RIVAL_CYCLIST = 6, + TDA_7 = 7, // Has something to do with the bike scene + TDA_11 = 11, // Gets set depending on whether the bike or the grass scene should be shown + TDA_12 = 12, + TDA_13 = 13, + TDA_14 = 14, + TDA_TASK_B_ID = 15, + + // Appears to be responsible for text + TDB_0 = 0, + TDB_TASK_A_ID = 1, + TDB_CURRENT_PAGE = 2, + TDB_3 = 3, + + TDC_0 = 0, + TDC_1 = 1, + TDC_2 = 2, + TDC_3 = 3, + TDC_4 = 4, + TDC_5 = 5, + + TDD_STATE = 0, + TDD_TASK_A_ID = 1, + TDD_2 = 2, + TDD_3 = 3, + + TDE_0 = 0, + TDE_1 = 1, + TDE_TASK_A_ID = 2, +}; + +struct Unk201C000 +{ + u16 unk0[71]; + u16 unk8E; + u16 unk90; + u16 unk92; + u16 unk94; + u16 unk96[386]; + u16 unk39A; + u16 unk39C[7]; +}; + +struct CreditsEntry +{ + u8 var_0; + u8 var_1; + const u8 *text; +}; + +static EWRAM_DATA s16 gUnknown_0203BCE0 = 0; +static EWRAM_DATA u16 gUnknown_0203BCE2 = 0; // TASK A +EWRAM_DATA bool8 gHasHallOfFameRecords = 0; +static EWRAM_DATA u8 gUnknown_0203BCE5 = 0; +static EWRAM_DATA struct Unk201C000 *gUnknown_0203BCE8 = {0}; + +static const u16 gUnknown_085E56F0[][16] = +{ + INCBIN_U16("graphics/credits/credits_1.gbapal"), + INCBIN_U16("graphics/credits/credits_2.gbapal"), + INCBIN_U16("graphics/credits/credits_3.gbapal"), + INCBIN_U16("graphics/credits/credits_4.gbapal"), +}; + +static const u8 gCreditsCopyrightEnd_Gfx[] = INCBIN_U8("graphics/credits/the_end_copyright.4bpp.lz"); + +static void sub_81772B8(struct Sprite *sprite); + +static const u8 gUnknown_085E5BAC[] = +{ + 0, 1, 0, + 0xFF, 1, 0xFF, + 0xFF, 1, 0xFF, + 0xFF, 1, 0xFF, + 0xFF, 1, 0xFF, +}; + +static const u8 gUnknown_085E5BBB[] = +{ + 1, 0xFF, 1, + 1, 0xFF, 1, + 1, 2, 1, + 1, 0xFF, 1, + 1, 0xFF, 1, +}; + +static const u8 gUnknown_085E5BCA[] = +{ + 1, 0, 0, + 1, 0xFF, 0xFF, + 1, 2, 2, + 1, 0xFF, 0xFF, + 1, 0x80, 0x80, +}; + +static const u8 gUnknown_085E5BD9[] = +{ + 1, 3, 1, + 1, 4, 1, + 1, 5, 1, + 1, 0xC4, 1, + 1, 0xC3, 1, +}; + +static const u8 gUnknown_085E5BE8[] = +{ + 1, 6, 7, + 1, 8, 9, + 1, 0xFF, 1, + 1, 0x88, 0x89, + 1, 0x86, 0x87, +}; + +static const u8 gCreditsText_EmptyString[] = _(""); +static const u8 gCreditsText_PkmnEmeraldVersion[] = _("POKéMON EMERALD VERSION"); +static const u8 gCreditsText_Credits[] = _("Credits"); +static const u8 gCreditsText_ExecutiveDirector[] = _("Executive Director"); +static const u8 gCreditsText_Director[] = _("Director"); +static const u8 gCreditsText_ArtDirector[] = _("Art Director"); +static const u8 gCreditsText_BattleDirector[] = _("Battle Director"); +static const u8 gCreditsText_MainProgrammer[] = _("Main Programmer"); +static const u8 gCreditsText_BattleSystemPgrms[] = _("Battle System Programmers"); +static const u8 gCreditsText_FieldSystemPgrms[] = _("Field System Programmer"); +static const u8 gCreditsText_Programmers[] = _("Programmers"); +static const u8 gCreditsText_MainGraphicDesigner[] = _("Main Graphic Designer"); +static const u8 gCreditsText_GraphicDesigners[] = _("Graphic Designers"); +static const u8 gCreditsText_PkmnDesigners[] = _("POKéMON Designers"); +static const u8 gCreditsText_MusicComposition[] = _("Music Composition"); +static const u8 gCreditsText_SoundEffectsAndPkmnVoices[] = _("Sound Effects & POKéMON Voices"); +static const u8 gCreditsText_GameDesigners[] = _("Game Designers"); +static const u8 gCreditsText_ScenarioPlot[] = _("Scenario Plot"); +static const u8 gCreditsText_Scenario[] = _("Scenario"); +static const u8 gCreditsText_ScriptDesigners[] = _("Script Designers"); +static const u8 gCreditsText_MapDesigners[] = _("Map Designers"); +static const u8 gCreditsText_MapDataDesigners[] = _("Map Data Designers"); +static const u8 gCreditsText_ParametricDesigners[] = _("Parametric Designers"); +static const u8 gCreditsText_PokedexText[] = _("POKéDEX Text"); +static const u8 gCreditsText_EnvAndToolPgrms[] = _("Environment & Tool Programmers"); +static const u8 gCreditsText_NCLProductTesting[] = _("NCL Product Testing"); +static const u8 gCreditsText_SpecialThanks[] = _("Special Thanks"); +static const u8 gCreditsText_Coordinators[] = _("Coordinators"); +static const u8 gCreditsText_Producers[] = _("Producers"); +static const u8 gCreditsText_ExecProducers[] = _("Executive Producers"); +static const u8 gCreditsText_InfoSupervisors[] = _("Information Supervisors"); +static const u8 gCreditsText_TaskManagers[] = _("Task Managers"); +static const u8 gCreditsText_BrailleCodeCheck[] = _("Braille Code Check"); +static const u8 gCreditsText_WorldDirector[] = _("World Director"); +static const u8 gCreditsText_BattleFrontierData[] = _("Battle Frontier Data"); +static const u8 gCreditsText_SupportProgrammers[] = _("Support Programmers"); +static const u8 gCreditsText_Artwork[] = _("Artwork"); +static const u8 gCreditsText_LeadProgrammer[] = _("Lead Programmer"); +static const u8 gCreditsText_LeadGraphicArtist[] = _("Lead Graphic Artist"); +static const u8 gCreditsText_SatoshiTajiri[] = _("Satoshi Tajiri"); +static const u8 gCreditsText_JunichiMasuda[] = _("Junichi Masuda"); +static const u8 gCreditsText_KenSugimori[] = _("Ken Sugimori"); +static const u8 gCreditsText_ShigekiMorimoto[] = _("Shigeki Morimoto"); +static const u8 gCreditsText_TetsuyaWatanabe[] = _("Tetsuya Watanabe"); +static const u8 gCreditsText_HisashiSogabe[] = _("Hisashi Sogabe"); +static const u8 gCreditsText_SosukeTamada[] = _("Sosuke Tamada"); +static const u8 gCreditsText_AkitoMori[] = _("Akito Mori"); +static const u8 gCreditsText_KeitaKagaya[] = _("Keita Kagaya"); +static const u8 gCreditsText_YoshinoriMatsuda[] = _("Yoshinori Matsuda"); +static const u8 gCreditsText_HiroyukiNakamura[] = _("Hiroyuki Nakamura"); +static const u8 gCreditsText_MasaoTaya[] = _("Masao Taya"); +static const u8 gCreditsText_SatoshiNohara[] = _("Satoshi Nohara"); +static const u8 gCreditsText_TomomichiOhta[] = _("Tomomichi Ohta"); +static const u8 gCreditsText_MiyukiIwasawa[] = _("Miyuki Iwasawa"); +static const u8 gCreditsText_TakenoriOhta[] = _("Takenori Ohta"); +static const u8 gCreditsText_HironobuYoshida[] = _("Hironobu Yoshida"); +static const u8 gCreditsText_MotofumiFujiwara[] = _("Motofumi Fujiwara"); +static const u8 gCreditsText_SatoshiOhta[] = _("Satoshi Ohta"); +static const u8 gCreditsText_AsukaIwashita[] = _("Asuka Iwashita"); +static const u8 gCreditsText_AimiTomita[] = _("Aimi Tomita"); +static const u8 gCreditsText_TakaoUnno[] = _("Takao Unno"); +static const u8 gCreditsText_KanakoEo[] = _("Kanako Eo"); +static const u8 gCreditsText_JunOkutani[] = _("Jun Okutani"); +static const u8 gCreditsText_AtsukoNishida[] = _("Atsuko Nishida"); +static const u8 gCreditsText_MuneoSaito[] = _("Muneo Saito"); +static const u8 gCreditsText_RenaYoshikawa[] = _("Rena Yoshikawa"); +static const u8 gCreditsText_GoIchinose[] = _("Go Ichinose"); +static const u8 gCreditsText_MorikazuAoki[] = _("Morikazu Aoki"); +static const u8 gCreditsText_KojiNishino[] = _("Koji Nishino"); +static const u8 gCreditsText_KenjiMatsushima[] = _("Kenji Matsushima"); +static const u8 gCreditsText_TetsujiOhta[] = _("Tetsuji Ohta"); +static const u8 gCreditsText_HitomiSato[] = _("Hitomi Sato"); +static const u8 gCreditsText_TakeshiKawachimaru[] = _("Takeshi Kawachimaru"); +static const u8 gCreditsText_TeruyukiShimoyamada[] = _("Teruyuki Shimoyamada"); +static const u8 gCreditsText_ShigeruOhmori[] = _("Shigeru Ohmori"); +static const u8 gCreditsText_TadashiTakahashi[] = _("Tadashi Takahashi"); +static const u8 gCreditsText_ToshinobuMatsumiya[] = _("Toshinobu Matsumiya"); +static const u8 gCreditsText_AkihitoTomisawa[] = _("Akihito Tomisawa"); +static const u8 gCreditsText_HirokiEnomoto[] = _("Hiroki Enomoto"); +static const u8 gCreditsText_KazuyukiTerada[] = _("Kazuyuki Terada"); +static const u8 gCreditsText_YuriSakurai[] = _("Yuri Sakurai"); +static const u8 gCreditsText_HiromiSagawa[] = _("Hiromi Sagawa"); +static const u8 gCreditsText_KenjiTominaga[] = _("Kenji Tominaga"); +static const u8 gCreditsText_YoshioTajiri[] = _("Yoshio Tajiri"); +static const u8 gCreditsText_TeikoSasaki[] = _("Teiko Sasaki"); +static const u8 gCreditsText_SachikoHamano[] = _("Sachiko Hamano"); +static const u8 gCreditsText_ChieMatsumiya[] = _("Chie Matsumiya"); +static const u8 gCreditsText_AkikoShinozaki[] = _("Akiko Shinozaki"); +static const u8 gCreditsText_AstukoFujii[] = _("Astuko Fujii"); +static const u8 gCreditsText_NozomuSaito[] = _("Nozomu Saito"); +static const u8 gCreditsText_KenkichiToyama[] = _("Kenkichi Toyama"); +static const u8 gCreditsText_SuguruNakatsui[] = _("Suguru Nakatsui"); +static const u8 gCreditsText_YumiFunasaka[] = _("Yumi Funasaka"); +static const u8 gCreditsText_NaokoYanase[] = _("Naoko Yanase"); +static const u8 gCreditsText_NCLSuperMarioClub[] = _("NCL Super Mario Club"); +static const u8 gCreditsText_AtsushiTada[] = _("Atsushi Tada"); +static const u8 gCreditsText_TakahiroOhnishi[] = _("Takahiro Ohnishi"); +static const u8 gCreditsText_NorihideOkamura[] = _("Norihide Okamura"); +static const u8 gCreditsText_HiroNakamura[] = _("Hiro Nakamura"); +static const u8 gCreditsText_HiroyukiUesugi[] = _("Hiroyuki Uesugi"); +static const u8 gCreditsText_TerukiMurakawa[] = _("Teruki Murakawa"); +static const u8 gCreditsText_AkiraKinashi[] = _("Akira Kinashi"); +static const u8 gCreditsText_MichikoTakizawa[] = _("Michiko Takizawa"); +static const u8 gCreditsText_MakikoTakada[] = _("Makiko Takada"); +static const u8 gCreditsText_TakanaoKondo[] = _("Takanao Kondo"); +static const u8 gCreditsText_AiMashima[] = _("Ai Mashima"); +static const u8 gCreditsText_GakujiNomoto[] = _("Gakuji Nomoto"); +static const u8 gCreditsText_TakehiroIzushi[] = _("Takehiro Izushi"); +static const u8 gCreditsText_HitoshiYamagami[] = _("Hitoshi Yamagami"); +static const u8 gCreditsText_KyokoWatanabe[] = _("Kyoko Watanabe"); +static const u8 gCreditsText_TakaoNakano[] = _("Takao Nakano"); +static const u8 gCreditsText_HiroyukiJinnai[] = _("Hiroyuki Jinnai"); +static const u8 gCreditsText_HiroakiTsuru[] = _("Hiroaki Tsuru"); +static const u8 gCreditsText_TsunekazIshihara[] = _("Tsunekaz Ishihara"); +static const u8 gCreditsText_SatoruIwata[] = _("Satoru Iwata"); +static const u8 gCreditsText_KazuyaSuyama[] = _("Kazuya Suyama"); +static const u8 gCreditsText_SatoshiMitsuhara[] = _("Satoshi Mitsuhara"); +static const u8 gCreditsText_JapanBrailleLibrary[] = _("Japan Braille Library"); +static const u8 gCreditsText_TomotakaKomura[] = _("Tomotaka Komura"); +static const u8 gCreditsText_MikikoOhhashi[] = _("Mikiko Ohhashi"); +static const u8 gCreditsText_DaisukeHoshino[] = _("Daisuke Hoshino"); +static const u8 gCreditsText_KenjiroIto[] = _("Kenjiro Ito"); +static const u8 gCreditsText_RuiKawaguchi[] = _("Rui Kawaguchi"); +static const u8 gCreditsText_ShunsukeKohori[] = _("Shunsuke Kohori"); +static const u8 gCreditsText_SachikoNakamichi[] = _("Sachiko Nakamichi"); +static const u8 gCreditsText_FujikoNomura[] = _("Fujiko Nomura"); +static const u8 gCreditsText_KazukiYoshihara[] = _("Kazuki Yoshihara"); +static const u8 gCreditsText_RetsujiNomoto[] = _("Retsuji Nomoto"); +static const u8 gCreditsText_AzusaTajima[] = _("Azusa Tajima"); +static const u8 gCreditsText_ShusakuEgami[] = _("Shusaku Egami"); +static const u8 gCreditsText_PackageAndManual[] = _("Package & Manual Illustration"); +static const u8 gCreditsText_EnglishVersion[] = _("English Version Coordinators"); +static const u8 gCreditsText_Translator[] = _("Translator"); +static const u8 gCreditsText_TextEditor[] = _("Text Editor"); +static const u8 gCreditsText_NCLCoordinator[] = _("NCL Coordinator"); +static const u8 gCreditsText_GraphicDesigner[] = _("Graphic Designer"); +static const u8 gCreditsText_NOAProductTesting[] = _("NOA Product Testing"); +static const u8 gCreditsText_HideyukiNakajima[] = _("Hideyuki Nakajima"); +static const u8 gCreditsText_HidenoriSaeki[] = _("Hidenori Saeki"); +static const u8 gCreditsText_YokoWatanabe[] = _("Yoko Watanabe"); +static const u8 gCreditsText_SakaeKimura[] = _("Sakae Kimura"); +static const u8 gCreditsText_ChiakiShinkai[] = _("Chiaki Shinkai"); +static const u8 gCreditsText_SethMcMahill[] = _("Seth McMahill"); +static const u8 gCreditsText_NobOgasawara[] = _("Nob Ogasawara"); +static const u8 gCreditsText_TeresaLillygren[] = _("Teresa Lillygren"); +static const u8 gCreditsText_KimikoNakamichi[] = _("Kimiko Nakamichi"); +static const u8 gCreditsText_SouichiYamamoto[] = _("Souichi Yamamoto"); +static const u8 gCreditsText_YuichiroIto[] = _("Yuichiro Ito"); +static const u8 gCreditsText_ThomasHertzog[] = _("Thomas Hertzog"); +static const u8 gCreditsText_MikaKurosawa[] = _("Mika Kurosawa"); +static const u8 gCreditsText_NationalFederationBlind[] = _("National Federation of the Blind"); +static const u8 gCreditsText_PatriciaAMaurer[] = _("Patricia A. Maurer"); +static const u8 gCreditsText_EuropeanBlindUnion[] = _("European Blind Union"); +static const u8 gCreditsText_AustralianBrailleAuthority[] = _("Australian Braille Authority"); +static const u8 gCreditsText_RoyalNewZealandFederationBlind[] = _("Royal New Zealand Federation for the Blind"); +static const u8 gCreditsText_MotoyasuTojima[] = _("Motoyasu Tojima"); +static const u8 gCreditsText_NicolaPrattBarlow[] = _("Nicola Pratt-Barlow"); +static const u8 gCreditsText_ShellieDow[] = _("Shellie Dow"); +static const u8 gCreditsText_ErikJohnson[] = _("Erik Johnson"); +static const struct CreditsEntry gCreditsEntry_EmptyString[] = {0, 0, gCreditsText_EmptyString}; +static const struct CreditsEntry gCreditsEntry_PkmnEmeraldVersion[] = {7, 1, gCreditsText_PkmnEmeraldVersion}; +static const struct CreditsEntry gCreditsEntry_Credits[] = {11, 1, gCreditsText_Credits}; +static const struct CreditsEntry gCreditsEntry_ExecutiveDirector[] = {8, 1, gCreditsText_ExecutiveDirector}; +static const struct CreditsEntry gCreditsEntry_Director[] = {12, 1, gCreditsText_Director}; +static const struct CreditsEntry gCreditsEntry_ArtDirector[] = {10, 1, gCreditsText_ArtDirector}; +static const struct CreditsEntry gCreditsEntry_BattleDirector[] = {10, 1, gCreditsText_BattleDirector}; +static const struct CreditsEntry gCreditsEntry_MainProgrammer[] = {10, 1, gCreditsText_MainProgrammer}; +static const struct CreditsEntry gCreditsEntry_BattleSystemPgrms[] = {8, 1, gCreditsText_BattleSystemPgrms}; +static const struct CreditsEntry gCreditsEntry_FieldSystemPgrms[] = {7, 1, gCreditsText_FieldSystemPgrms}; +static const struct CreditsEntry gCreditsEntry_Programmers[] = {12, 1, gCreditsText_Programmers}; +static const struct CreditsEntry gCreditsEntry_MainGraphicDesigner[] = {7, 1, gCreditsText_MainGraphicDesigner}; +static const struct CreditsEntry gCreditsEntry_GraphicDesigners[] = {9, 1, gCreditsText_GraphicDesigners}; +static const struct CreditsEntry gCreditsEntry_PkmnDesigners[] = {10, 1, gCreditsText_PkmnDesigners}; +static const struct CreditsEntry gCreditsEntry_MusicComposition[] = {13, 1, gCreditsText_MusicComposition}; +static const struct CreditsEntry gCreditsEntry_SoundEffectsAndPkmnVoices[] = {4, 1, gCreditsText_SoundEffectsAndPkmnVoices}; +static const struct CreditsEntry gCreditsEntry_GameDesigners[] = {11, 1, gCreditsText_GameDesigners}; +static const struct CreditsEntry gCreditsEntry_ScenarioPlot[] = {11, 1, gCreditsText_ScenarioPlot}; +static const struct CreditsEntry gCreditsEntry_Scenario[] = {13, 1, gCreditsText_Scenario}; +static const struct CreditsEntry gCreditsEntry_ScriptDesigners[] = {10, 1, gCreditsText_ScriptDesigners}; +static const struct CreditsEntry gCreditsEntry_MapDesigners[] = {11, 1, gCreditsText_MapDesigners}; +static const struct CreditsEntry gCreditsEntry_MapDataDesigners[] = {9, 1, gCreditsText_MapDataDesigners}; +static const struct CreditsEntry gCreditsEntry_ParametricDesigners[] = {9, 1, gCreditsText_ParametricDesigners}; +static const struct CreditsEntry gCreditsEntry_PokedexText[] = {11, 1, gCreditsText_PokedexText}; +static const struct CreditsEntry gCreditsEntry_EnvAndToolPgrms[] = {6, 1, gCreditsText_EnvAndToolPgrms}; +static const struct CreditsEntry gCreditsEntry_NCLProductTesting[] = {11, 1, gCreditsText_NCLProductTesting}; +static const struct CreditsEntry gCreditsEntry_SpecialThanks[] = {10, 1, gCreditsText_SpecialThanks}; +static const struct CreditsEntry gCreditsEntry_Coordinators[] = {11, 1, gCreditsText_Coordinators}; +static const struct CreditsEntry gCreditsEntry_Producers[] = {11, 1, gCreditsText_Producers}; +static const struct CreditsEntry gCreditsEntry_ExecProducers[] = {7, 1, gCreditsText_ExecProducers}; +static const struct CreditsEntry gCreditsEntry_InfoSupervisors[] = {10, 1, gCreditsText_InfoSupervisors}; +static const struct CreditsEntry gCreditsEntry_TaskManagers[] = {8, 1, gCreditsText_TaskManagers}; +static const struct CreditsEntry gCreditsEntry_BrailleCodeCheck[] = {10, 1, gCreditsText_BrailleCodeCheck}; +static const struct CreditsEntry gCreditsEntry_WorldDirector[] = {10, 1, gCreditsText_WorldDirector}; +static const struct CreditsEntry gCreditsEntry_BattleFrontierData[] = {8, 1, gCreditsText_BattleFrontierData}; +static const struct CreditsEntry gCreditsEntry_SupportProgrammers[] = {10, 1, gCreditsText_SupportProgrammers}; +static const struct CreditsEntry gCreditsEntry_Artwork[] = {12, 1, gCreditsText_Artwork}; +static const struct CreditsEntry gCreditsEntry_LeadProgrammer[] = {10, 1, gCreditsText_LeadProgrammer}; +static const struct CreditsEntry gCreditsEntry_LeadGraphicArtist[] = {9, 1, gCreditsText_LeadGraphicArtist}; +static const struct CreditsEntry gCreditsEntry_SatoshiTajiri[] = {11, 0, gCreditsText_SatoshiTajiri}; +static const struct CreditsEntry gCreditsEntry_JunichiMasuda[] = {11, 0, gCreditsText_JunichiMasuda}; +static const struct CreditsEntry gCreditsEntry_KenSugimori[] = {11, 0, gCreditsText_KenSugimori}; +static const struct CreditsEntry gCreditsEntry_ShigekiMorimoto[] = {11, 0, gCreditsText_ShigekiMorimoto}; +static const struct CreditsEntry gCreditsEntry_TetsuyaWatanabe[] = {11, 0, gCreditsText_TetsuyaWatanabe}; +static const struct CreditsEntry gCreditsEntry_HisashiSogabe[] = {11, 0, gCreditsText_HisashiSogabe}; +static const struct CreditsEntry gCreditsEntry_SosukeTamada[] = {11, 0, gCreditsText_SosukeTamada}; +static const struct CreditsEntry gCreditsEntry_AkitoMori[] = {11, 0, gCreditsText_AkitoMori}; +static const struct CreditsEntry gCreditsEntry_KeitaKagaya[] = {11, 0, gCreditsText_KeitaKagaya}; +static const struct CreditsEntry gCreditsEntry_YoshinoriMatsuda[] = {11, 0, gCreditsText_YoshinoriMatsuda}; +static const struct CreditsEntry gCreditsEntry_HiroyukiNakamura[] = {11, 0, gCreditsText_HiroyukiNakamura}; +static const struct CreditsEntry gCreditsEntry_MasaoTaya[] = {11, 0, gCreditsText_MasaoTaya}; +static const struct CreditsEntry gCreditsEntry_SatoshiNohara[] = {11, 0, gCreditsText_SatoshiNohara}; +static const struct CreditsEntry gCreditsEntry_TomomichiOhta[] = {11, 0, gCreditsText_TomomichiOhta}; +static const struct CreditsEntry gCreditsEntry_MiyukiIwasawa[] = {11, 0, gCreditsText_MiyukiIwasawa}; +static const struct CreditsEntry gCreditsEntry_TakenoriOhta[] = {11, 0, gCreditsText_TakenoriOhta}; +static const struct CreditsEntry gCreditsEntry_HironobuYoshida[] = {11, 0, gCreditsText_HironobuYoshida}; +static const struct CreditsEntry gCreditsEntry_MotofumiFujiwara[] = {11, 0, gCreditsText_MotofumiFujiwara}; +static const struct CreditsEntry gCreditsEntry_SatoshiOhta[] = {11, 0, gCreditsText_SatoshiOhta}; +static const struct CreditsEntry gCreditsEntry_AsukaIwashita[] = {11, 0, gCreditsText_AsukaIwashita}; +static const struct CreditsEntry gCreditsEntry_AimiTomita[] = {11, 0, gCreditsText_AimiTomita}; +static const struct CreditsEntry gCreditsEntry_TakaoUnno[] = {11, 0, gCreditsText_TakaoUnno}; +static const struct CreditsEntry gCreditsEntry_KanakoEo[] = {11, 0, gCreditsText_KanakoEo}; +static const struct CreditsEntry gCreditsEntry_JunOkutani[] = {11, 0, gCreditsText_JunOkutani}; +static const struct CreditsEntry gCreditsEntry_AtsukoNishida[] = {11, 0, gCreditsText_AtsukoNishida}; +static const struct CreditsEntry gCreditsEntry_MuneoSaito[] = {11, 0, gCreditsText_MuneoSaito}; +static const struct CreditsEntry gCreditsEntry_RenaYoshikawa[] = {11, 0, gCreditsText_RenaYoshikawa}; +static const struct CreditsEntry gCreditsEntry_GoIchinose[] = {11, 0, gCreditsText_GoIchinose}; +static const struct CreditsEntry gCreditsEntry_MorikazuAoki[] = {11, 0, gCreditsText_MorikazuAoki}; +static const struct CreditsEntry gCreditsEntry_KojiNishino[] = {11, 0, gCreditsText_KojiNishino}; +static const struct CreditsEntry gCreditsEntry_KenjiMatsushima[] = {11, 0, gCreditsText_KenjiMatsushima}; +static const struct CreditsEntry gCreditsEntry_TetsujiOhta[] = {11, 0, gCreditsText_TetsujiOhta}; +static const struct CreditsEntry gCreditsEntry_HitomiSato[] = {11, 0, gCreditsText_HitomiSato}; +static const struct CreditsEntry gCreditsEntry_TakeshiKawachimaru[] = {11, 0, gCreditsText_TakeshiKawachimaru}; +static const struct CreditsEntry gCreditsEntry_TeruyukiShimoyamada[] = {11, 0, gCreditsText_TeruyukiShimoyamada}; +static const struct CreditsEntry gCreditsEntry_ShigeruOhmori[] = {11, 0, gCreditsText_ShigeruOhmori}; +static const struct CreditsEntry gCreditsEntry_TadashiTakahashi[] = {11, 0, gCreditsText_TadashiTakahashi}; +static const struct CreditsEntry gCreditsEntry_ToshinobuMatsumiya[] = {11, 0, gCreditsText_ToshinobuMatsumiya}; +static const struct CreditsEntry gCreditsEntry_AkihitoTomisawa[] = {11, 0, gCreditsText_AkihitoTomisawa}; +static const struct CreditsEntry gCreditsEntry_HirokiEnomoto[] = {11, 0, gCreditsText_HirokiEnomoto}; +static const struct CreditsEntry gCreditsEntry_KazuyukiTerada[] = {11, 0, gCreditsText_KazuyukiTerada}; +static const struct CreditsEntry gCreditsEntry_YuriSakurai[] = {11, 0, gCreditsText_YuriSakurai}; +static const struct CreditsEntry gCreditsEntry_HiromiSagawa[] = {11, 0, gCreditsText_HiromiSagawa}; +static const struct CreditsEntry gCreditsEntry_KenjiTominaga[] = {11, 0, gCreditsText_KenjiTominaga}; +static const struct CreditsEntry gCreditsEntry_YoshioTajiri[] = {11, 0, gCreditsText_YoshioTajiri}; +static const struct CreditsEntry gCreditsEntry_TeikoSasaki[] = {11, 0, gCreditsText_TeikoSasaki}; +static const struct CreditsEntry gCreditsEntry_SachikoHamano[] = {11, 0, gCreditsText_SachikoHamano}; +static const struct CreditsEntry gCreditsEntry_ChieMatsumiya[] = {11, 0, gCreditsText_ChieMatsumiya}; +static const struct CreditsEntry gCreditsEntry_AkikoShinozaki[] = {11, 0, gCreditsText_AkikoShinozaki}; +static const struct CreditsEntry gCreditsEntry_AstukoFujii[] = {11, 0, gCreditsText_AstukoFujii}; +static const struct CreditsEntry gCreditsEntry_NozomuSaito[] = {11, 0, gCreditsText_NozomuSaito}; +static const struct CreditsEntry gCreditsEntry_KenkichiToyama[] = {11, 0, gCreditsText_KenkichiToyama}; +static const struct CreditsEntry gCreditsEntry_SuguruNakatsui[] = {11, 0, gCreditsText_SuguruNakatsui}; +static const struct CreditsEntry gCreditsEntry_YumiFunasaka[] = {11, 0, gCreditsText_YumiFunasaka}; +static const struct CreditsEntry gCreditsEntry_NaokoYanase[] = {11, 0, gCreditsText_NaokoYanase}; +static const struct CreditsEntry gCreditsEntry_NCLSuperMarioClub[] = {11, 0, gCreditsText_NCLSuperMarioClub}; +static const struct CreditsEntry gCreditsEntry_AtsushiTada[] = {11, 0, gCreditsText_AtsushiTada}; +static const struct CreditsEntry gCreditsEntry_TakahiroOhnishi[] = {11, 0, gCreditsText_TakahiroOhnishi}; +static const struct CreditsEntry gCreditsEntry_NorihideOkamura[] = {11, 0, gCreditsText_NorihideOkamura}; +static const struct CreditsEntry gCreditsEntry_HiroNakamura[] = {11, 0, gCreditsText_HiroNakamura}; +static const struct CreditsEntry gCreditsEntry_HiroyukiUesugi[] = {11, 0, gCreditsText_HiroyukiUesugi}; +static const struct CreditsEntry gCreditsEntry_TerukiMurakawa[] = {11, 0, gCreditsText_TerukiMurakawa}; +static const struct CreditsEntry gCreditsEntry_AkiraKinashi[] = {11, 0, gCreditsText_AkiraKinashi}; +static const struct CreditsEntry gCreditsEntry_MichikoTakizawa[] = {11, 0, gCreditsText_MichikoTakizawa}; +static const struct CreditsEntry gCreditsEntry_MakikoTakada[] = {11, 0, gCreditsText_MakikoTakada}; +static const struct CreditsEntry gCreditsEntry_TakanaoKondo[] = {11, 0, gCreditsText_TakanaoKondo}; +static const struct CreditsEntry gCreditsEntry_AiMashima[] = {11, 0, gCreditsText_AiMashima}; +static const struct CreditsEntry gCreditsEntry_GakujiNomoto[] = {11, 0, gCreditsText_GakujiNomoto}; +static const struct CreditsEntry gCreditsEntry_TakehiroIzushi[] = {11, 0, gCreditsText_TakehiroIzushi}; +static const struct CreditsEntry gCreditsEntry_HitoshiYamagami[] = {11, 0, gCreditsText_HitoshiYamagami}; +static const struct CreditsEntry gCreditsEntry_KyokoWatanabe[] = {11, 0, gCreditsText_KyokoWatanabe}; +static const struct CreditsEntry gCreditsEntry_TakaoNakano[] = {11, 0, gCreditsText_TakaoNakano}; +static const struct CreditsEntry gCreditsEntry_HiroyukiJinnai[] = {11, 0, gCreditsText_HiroyukiJinnai}; +static const struct CreditsEntry gCreditsEntry_HiroakiTsuru[] = {11, 0, gCreditsText_HiroakiTsuru}; +static const struct CreditsEntry gCreditsEntry_TsunekazIshihara[] = {11, 0, gCreditsText_TsunekazIshihara}; +static const struct CreditsEntry gCreditsEntry_SatoruIwata[] = {11, 0, gCreditsText_SatoruIwata}; +static const struct CreditsEntry gCreditsEntry_KazuyaSuyama[] = {11, 0, gCreditsText_KazuyaSuyama}; +static const struct CreditsEntry gCreditsEntry_SatoshiMitsuhara[] = {11, 0, gCreditsText_SatoshiMitsuhara}; +static const struct CreditsEntry gCreditsEntry_JapanBrailleLibrary[] = {9, 0, gCreditsText_JapanBrailleLibrary}; +static const struct CreditsEntry gCreditsEntry_TomotakaKomura[] = {11, 0, gCreditsText_TomotakaKomura}; +static const struct CreditsEntry gCreditsEntry_MikikoOhhashi[] = {11, 0, gCreditsText_MikikoOhhashi}; +static const struct CreditsEntry gCreditsEntry_DaisukeHoshino[] = {11, 0, gCreditsText_DaisukeHoshino}; +static const struct CreditsEntry gCreditsEntry_KenjiroIto[] = {11, 0, gCreditsText_KenjiroIto}; +static const struct CreditsEntry gCreditsEntry_RuiKawaguchi[] = {11, 0, gCreditsText_RuiKawaguchi}; +static const struct CreditsEntry gCreditsEntry_ShunsukeKohori[] = {11, 0, gCreditsText_ShunsukeKohori}; +static const struct CreditsEntry gCreditsEntry_SachikoNakamichi[] = {11, 0, gCreditsText_SachikoNakamichi}; +static const struct CreditsEntry gCreditsEntry_FujikoNomura[] = {11, 0, gCreditsText_FujikoNomura}; +static const struct CreditsEntry gCreditsEntry_KazukiYoshihara[] = {11, 0, gCreditsText_KazukiYoshihara}; +static const struct CreditsEntry gCreditsEntry_RetsujiNomoto[] = {11, 0, gCreditsText_RetsujiNomoto}; +static const struct CreditsEntry gCreditsEntry_AzusaTajima[] = {11, 0, gCreditsText_AzusaTajima}; +static const struct CreditsEntry gCreditsEntry_ShusakuEgami[] = {11, 0, gCreditsText_ShusakuEgami}; +static const struct CreditsEntry gCreditsEntry_PackageAndManual[] = {0, 1, gCreditsText_PackageAndManual}; +static const struct CreditsEntry gCreditsEntry_EnglishVersion[] = {0, 1, gCreditsText_EnglishVersion}; +static const struct CreditsEntry gCreditsEntry_Translator[] = {0, 1, gCreditsText_Translator}; +static const struct CreditsEntry gCreditsEntry_TextEditor[] = {0, 1, gCreditsText_TextEditor}; +static const struct CreditsEntry gCreditsEntry_NCLCoordinator[] = {0, 1, gCreditsText_NCLCoordinator}; +static const struct CreditsEntry gCreditsEntry_GraphicDesigner[] = {0, 1, gCreditsText_GraphicDesigner}; +static const struct CreditsEntry gCreditsEntry_NOAProductTesting[] = {0, 1, gCreditsText_NOAProductTesting}; +static const struct CreditsEntry gCreditsEntry_HideyukiNakajima[] = {0, 0, gCreditsText_HideyukiNakajima}; +static const struct CreditsEntry gCreditsEntry_HidenoriSaeki[] = {0, 0, gCreditsText_HidenoriSaeki}; +static const struct CreditsEntry gCreditsEntry_YokoWatanabe[] = {0, 0, gCreditsText_YokoWatanabe}; +static const struct CreditsEntry gCreditsEntry_SakaeKimura[] = {0, 0, gCreditsText_SakaeKimura}; +static const struct CreditsEntry gCreditsEntry_ChiakiShinkai[] = {0, 0, gCreditsText_ChiakiShinkai}; +static const struct CreditsEntry gCreditsEntry_SethMcMahill[] = {0, 0, gCreditsText_SethMcMahill}; +static const struct CreditsEntry gCreditsEntry_NobOgasawara[] = {0, 0, gCreditsText_NobOgasawara}; +static const struct CreditsEntry gCreditsEntry_TeresaLillygren[] = {0, 0, gCreditsText_TeresaLillygren}; +static const struct CreditsEntry gCreditsEntry_KimikoNakamichi[] = {0, 0, gCreditsText_KimikoNakamichi}; +static const struct CreditsEntry gCreditsEntry_SouichiYamamoto[] = {0, 0, gCreditsText_SouichiYamamoto}; +static const struct CreditsEntry gCreditsEntry_YuichiroIto[] = {0, 0, gCreditsText_YuichiroIto}; +static const struct CreditsEntry gCreditsEntry_ThomasHertzog[] = {0, 0, gCreditsText_ThomasHertzog}; +static const struct CreditsEntry gCreditsEntry_MikaKurosawa[] = {0, 0, gCreditsText_MikaKurosawa}; +static const struct CreditsEntry gCreditsEntry_NationalFederationBlind[] = {0, 0, gCreditsText_NationalFederationBlind}; +static const struct CreditsEntry gCreditsEntry_PatriciaAMaurer[] = {0, 0, gCreditsText_PatriciaAMaurer}; +static const struct CreditsEntry gCreditsEntry_EuropeanBlindUnion[] = {0, 0, gCreditsText_EuropeanBlindUnion}; +static const struct CreditsEntry gCreditsEntry_AustralianBrailleAuthority[] = {0, 0, gCreditsText_AustralianBrailleAuthority}; +static const struct CreditsEntry gCreditsEntry_RoyalNewZealandFederationBlind[] = {0, 0, gCreditsText_RoyalNewZealandFederationBlind}; +static const struct CreditsEntry gCreditsEntry_MotoyasuTojima[] = {0, 0, gCreditsText_MotoyasuTojima}; +static const struct CreditsEntry gCreditsEntry_NicolaPrattBarlow[] = {0, 0, gCreditsText_NicolaPrattBarlow}; +static const struct CreditsEntry gCreditsEntry_ShellieDow[] = {0, 0, gCreditsText_ShellieDow}; +static const struct CreditsEntry gCreditsEntry_ErikJohnson[] = {0, 0, gCreditsText_ErikJohnson}; + +#define _ gCreditsEntry_EmptyString +static const struct CreditsEntry *const gCreditsEntryPointerTable[][5] = +{ + { + _, + gCreditsEntry_PkmnEmeraldVersion, + gCreditsEntry_Credits, + _, + _ + }, + { + _, + gCreditsEntry_Director, + gCreditsEntry_ShigekiMorimoto, + _, + _, + }, + { + _, + gCreditsEntry_ArtDirector, + gCreditsEntry_KenSugimori, + _, + _, + }, + { + _, + gCreditsEntry_WorldDirector, + gCreditsEntry_JunichiMasuda, + _, + _, + }, + { + gCreditsEntry_LeadProgrammer, + gCreditsEntry_HisashiSogabe, + gCreditsEntry_LeadGraphicArtist, + gCreditsEntry_MotofumiFujiwara, + _, + }, + { + gCreditsEntry_Programmers, + gCreditsEntry_HisashiSogabe, + gCreditsEntry_TomomichiOhta, + gCreditsEntry_NozomuSaito, + gCreditsEntry_EmptyString, + }, + { + gCreditsEntry_Programmers, + gCreditsEntry_AkitoMori, + gCreditsEntry_HiroyukiNakamura, + gCreditsEntry_MasaoTaya, + _, + }, + { + gCreditsEntry_Programmers, + gCreditsEntry_SatoshiNohara, + gCreditsEntry_MiyukiIwasawa, + gCreditsEntry_YoshinoriMatsuda, + gCreditsEntry_KeitaKagaya, + }, + { + gCreditsEntry_Programmers, + gCreditsEntry_TetsuyaWatanabe, + gCreditsEntry_SosukeTamada, + gCreditsEntry_TakenoriOhta, + _, + }, + { + _, + gCreditsEntry_GraphicDesigners, + gCreditsEntry_MotofumiFujiwara, + gCreditsEntry_SatoshiOhta, + _, + }, + { + gCreditsEntry_GraphicDesigners, + gCreditsEntry_KenkichiToyama, + gCreditsEntry_AsukaIwashita, + gCreditsEntry_TakaoUnno, + _, + }, + { + gCreditsEntry_GraphicDesigners, + gCreditsEntry_KenSugimori, + gCreditsEntry_HironobuYoshida, + gCreditsEntry_AimiTomita, + gCreditsEntry_KanakoEo, + }, + { + gCreditsEntry_MusicComposition, + gCreditsEntry_GoIchinose, + gCreditsEntry_JunichiMasuda, + gCreditsEntry_MorikazuAoki, + gCreditsEntry_HitomiSato, + }, + { + _, + gCreditsEntry_SoundEffectsAndPkmnVoices, + gCreditsEntry_GoIchinose, + gCreditsEntry_MorikazuAoki, + _, + }, + { + gCreditsEntry_GameDesigners, + gCreditsEntry_ShigekiMorimoto, + gCreditsEntry_TeruyukiShimoyamada, + gCreditsEntry_TakeshiKawachimaru, + gCreditsEntry_AkihitoTomisawa, + }, + { + gCreditsEntry_GameDesigners, + gCreditsEntry_SuguruNakatsui, + gCreditsEntry_TetsujiOhta, + gCreditsEntry_HitomiSato, + gCreditsEntry_KenjiMatsushima, + }, + { + gCreditsEntry_GameDesigners, + gCreditsEntry_JunichiMasuda, + gCreditsEntry_KojiNishino, + gCreditsEntry_ShigeruOhmori, + gCreditsEntry_TadashiTakahashi, + }, + { + gCreditsEntry_ScenarioPlot, + gCreditsEntry_AkihitoTomisawa, + gCreditsEntry_JunichiMasuda, + gCreditsEntry_KojiNishino, + _, + }, + { + gCreditsEntry_Scenario, + gCreditsEntry_AkihitoTomisawa, + gCreditsEntry_HitomiSato, + gCreditsEntry_ToshinobuMatsumiya, + _, + }, + { + gCreditsEntry_ScriptDesigners, + gCreditsEntry_TomomichiOhta, + gCreditsEntry_SatoshiNohara, + _, + _, + }, + { + gCreditsEntry_MapDesigners, + gCreditsEntry_SuguruNakatsui, + gCreditsEntry_TeruyukiShimoyamada, + gCreditsEntry_ShigeruOhmori, + gCreditsEntry_TetsujiOhta, + }, + { + _, + gCreditsEntry_BattleFrontierData, + gCreditsEntry_TetsujiOhta, + _, + _, + }, + { + gCreditsEntry_ParametricDesigners, + gCreditsEntry_TeruyukiShimoyamada, + gCreditsEntry_ShigekiMorimoto, + gCreditsEntry_TetsujiOhta, + gCreditsEntry_KojiNishino, + }, + { + _, + gCreditsEntry_PokedexText, + gCreditsEntry_KenjiMatsushima, + _, + _, + }, + { + gCreditsEntry_EnvAndToolPgrms, + gCreditsEntry_HisashiSogabe, + gCreditsEntry_SosukeTamada, + gCreditsEntry_HiroyukiNakamura, + gCreditsEntry_AkitoMori, + }, + { + gCreditsEntry_PkmnDesigners, + gCreditsEntry_KenSugimori, + gCreditsEntry_MotofumiFujiwara, + gCreditsEntry_ShigekiMorimoto, + _, + }, + { + gCreditsEntry_PkmnDesigners, + gCreditsEntry_HironobuYoshida, + gCreditsEntry_SatoshiOhta, + gCreditsEntry_AsukaIwashita, + _, + }, + { + gCreditsEntry_PkmnDesigners, + gCreditsEntry_TakaoUnno, + gCreditsEntry_KanakoEo, + gCreditsEntry_AimiTomita, + _, + }, + { + gCreditsEntry_PkmnDesigners, + gCreditsEntry_AtsukoNishida, + gCreditsEntry_MuneoSaito, + gCreditsEntry_RenaYoshikawa, + gCreditsEntry_JunOkutani, + }, + { + _, + gCreditsEntry_SupportProgrammers, + gCreditsEntry_SatoshiMitsuhara, + gCreditsEntry_DaisukeHoshino, + _, + }, + { + _, + gCreditsEntry_NCLProductTesting, + gCreditsEntry_NCLSuperMarioClub, + _, + _, + }, + { + _, + gCreditsEntry_PackageAndManual, + gCreditsEntry_KenSugimori, + _, + _, + }, + { + _, + gCreditsEntry_SpecialThanks, + gCreditsEntry_KenjiTominaga, + gCreditsEntry_HirokiEnomoto, + _, + }, + { + gCreditsEntry_SpecialThanks, + gCreditsEntry_KazuyaSuyama, + gCreditsEntry_KenjiroIto, + gCreditsEntry_MichikoTakizawa, + gCreditsEntry_MakikoTakada, + }, + { + gCreditsEntry_SpecialThanks, + gCreditsEntry_MikikoOhhashi, + gCreditsEntry_TakanaoKondo, + gCreditsEntry_RuiKawaguchi, + _, + }, + { + gCreditsEntry_SpecialThanks, + gCreditsEntry_TakahiroOhnishi, + gCreditsEntry_NorihideOkamura, + gCreditsEntry_ShunsukeKohori, + _, + }, + { + gCreditsEntry_InfoSupervisors, + gCreditsEntry_KazuyukiTerada, + gCreditsEntry_YuriSakurai, + gCreditsEntry_YumiFunasaka, + gCreditsEntry_NaokoYanase, + }, + { + _, + gCreditsEntry_Artwork, + gCreditsEntry_SachikoNakamichi, + gCreditsEntry_FujikoNomura, + _, + }, + { + _, + gCreditsEntry_Artwork, + gCreditsEntry_HideyukiNakajima, + gCreditsEntry_HidenoriSaeki, + _, + }, + { + gCreditsEntry_Artwork, + gCreditsEntry_YokoWatanabe, + gCreditsEntry_SakaeKimura, + gCreditsEntry_ChiakiShinkai, + _, + }, + { + gCreditsEntry_Coordinators, + gCreditsEntry_KazukiYoshihara, + gCreditsEntry_AkiraKinashi, + gCreditsEntry_RetsujiNomoto, + _, + }, + { + _, + gCreditsEntry_EnglishVersion, + gCreditsEntry_HiroNakamura, + gCreditsEntry_SethMcMahill, + _, + }, + { + _, + gCreditsEntry_Translator, + gCreditsEntry_NobOgasawara, + _, + _, + }, + { + _, + gCreditsEntry_TextEditor, + gCreditsEntry_TeresaLillygren, + _, + _, + }, + { + _, + gCreditsEntry_NCLCoordinator, + gCreditsEntry_KimikoNakamichi, + _, + _, + }, + { + gCreditsEntry_Programmers, + gCreditsEntry_TerukiMurakawa, + gCreditsEntry_SouichiYamamoto, + gCreditsEntry_YuichiroIto, + gCreditsEntry_AkiraKinashi, + }, + { + _, + gCreditsEntry_GraphicDesigner, + gCreditsEntry_AkiraKinashi, + _, + _, + }, + { + gCreditsEntry_EnvAndToolPgrms, + gCreditsEntry_TerukiMurakawa, + gCreditsEntry_SouichiYamamoto, + gCreditsEntry_KimikoNakamichi, + _, + }, + { + gCreditsEntry_NOAProductTesting, + gCreditsEntry_ThomasHertzog, + gCreditsEntry_ErikJohnson, + gCreditsEntry_MikaKurosawa, + _, + }, + { + gCreditsEntry_BrailleCodeCheck, + gCreditsEntry_NationalFederationBlind, + gCreditsEntry_PatriciaAMaurer, + gCreditsEntry_JapanBrailleLibrary, + gCreditsEntry_EuropeanBlindUnion, + }, + { + _, + gCreditsEntry_BrailleCodeCheck, + gCreditsEntry_AustralianBrailleAuthority, + gCreditsEntry_RoyalNewZealandFederationBlind, + _, + }, + { + gCreditsEntry_SpecialThanks, + gCreditsEntry_HiroyukiUesugi, + gCreditsEntry_MotoyasuTojima, + gCreditsEntry_NicolaPrattBarlow, + gCreditsEntry_ShellieDow, + }, + { + _, + gCreditsEntry_TaskManagers, + gCreditsEntry_AzusaTajima, + gCreditsEntry_ShusakuEgami, + _, + }, + { + gCreditsEntry_Producers, + gCreditsEntry_HiroyukiJinnai, + gCreditsEntry_HitoshiYamagami, + gCreditsEntry_GakujiNomoto, + gCreditsEntry_HiroakiTsuru, + }, + { + _, + gCreditsEntry_ExecutiveDirector, + gCreditsEntry_SatoshiTajiri, + _, + _, + }, + { + _, + gCreditsEntry_ExecProducers, + gCreditsEntry_SatoruIwata, + _, + _, + }, + { + _, + gCreditsEntry_ExecProducers, + gCreditsEntry_TsunekazIshihara, + _, + _, + }, +}; +#undef _ + +static const struct BgTemplate gUnknown_085E6F68[] = +{ + { + .bg = 0, + .charBaseIndex = 2, + .mapBaseIndex = 28, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0 + }, +}; +static const struct WindowTemplate gUnknown_085E6F6C[] = +{ + { 0x00, 0x00, 0x09, 0x1E, 0x0C, 0x08, 0x0001 }, + DUMMY_WIN_TEMPLATE, +}; +static const u8 gUnknown_085E6F7C[][2] = +{ + {104, 36}, + {120, 36}, + {136, 36}, +}; + +static const union AnimCmd gUnknown_085E6F84[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(64, 8), + ANIMCMD_FRAME(128, 8), + ANIMCMD_FRAME(192, 8), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd gUnknown_085E6F98[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(64, 4), + ANIMCMD_FRAME(128, 4), + ANIMCMD_FRAME(192, 4), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd gUnknown_085E6FAC[] = +{ + ANIMCMD_FRAME(256, 4), + ANIMCMD_FRAME(320, 4), + ANIMCMD_FRAME(384, 4), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_085E6FBC[] = +{ + ANIMCMD_FRAME(384, 30), + ANIMCMD_FRAME(320, 30), + ANIMCMD_FRAME(256, 30), + ANIMCMD_FRAME(256, 30), + ANIMCMD_END, +}; + +static const union AnimCmd *const gUnknown_085E6FD0[] = +{ + gUnknown_085E6F84, + gUnknown_085E6F98, + gUnknown_085E6FAC, + gUnknown_085E6FBC, +}; + +static const union AnimCmd gUnknown_085E6FE0[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(64, 8), + ANIMCMD_FRAME(128, 8), + ANIMCMD_FRAME(192, 8), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd gUnknown_085E6FF4[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(64, 4), + ANIMCMD_FRAME(128, 4), + ANIMCMD_FRAME(192, 4), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd gUnknown_085E7008[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_END, +}; + +static const union AnimCmd *const gUnknown_085E7010[] = +{ + gUnknown_085E6FE0, + gUnknown_085E6FF4, + gUnknown_085E7008, +}; + +static const struct SpriteSheet gUnknown_085E701C[] = { + { gDecompressionBuffer, 6144, 1001 }, + { NULL }, +}; +static const struct SpritePalette gUnknown_085E702C[] = { + { (const u16 *)(gDecompressionBuffer + 0x1800), 1001 }, + { NULL }, +}; + +static const struct OamData gUnknown_085E703C = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd gUnknown_085E7044[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_085E704C[] = +{ + ANIMCMD_FRAME(64, 8), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_085E7054[] = +{ + ANIMCMD_FRAME(128, 8), + ANIMCMD_END, +}; + +static const union AnimCmd *const gUnknown_085E705C[] = +{ + gUnknown_085E7044, + gUnknown_085E704C, + gUnknown_085E7054, +}; + +static const struct SpriteTemplate gUnknown_085E7068 = +{ + .tileTag = 1001, + .paletteTag = 1001, + .oam = &gUnknown_085E703C, + .anims = gUnknown_085E705C, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_81772B8, +}; + +void sub_8175620(void); +static void sub_8175744(u8 taskIdA); +static void sub_8175774(u8 taskIdA); +static void sub_8175808(u8 taskIdA); +static void c2_080C9BFC(u8 taskIdA); +static void sub_81758E4(u8 taskIdA); +static void sub_81758A4(u8 taskIdA); +static void sub_8175A9C(u8 taskIdA); +static void sub_8175AE4(u8 taskIdA); +static void sub_8175B1C(u8 taskIdA); +static void sub_8175B90(u8 taskIdA); +static void sub_8175BD8(u8 taskIdA); +static void sub_8175C34(u8 taskIdA); +static void sub_8175CC8(u8 taskIdA); +static void sub_8175CE4(void); +static void sub_8175DA0(u8 taskIdB); +static u8 sub_817603C(u8 page, u8 taskIdA); +static void sub_81760FC(u8 taskIdA); +static void sub_817651C(u8 taskIdA); +static void sub_817624C(u8 taskIdA); +static bool8 sub_8176AB0(u8 data, u8 taskIdA); +static void sub_8176CA0(u8 taskIdA); +static void sub_8176D1C(u16, u16, u16); +static void sub_8176E40(u16 arg0, u16 palette); +static void sub_8176EE8(struct Sprite *sprite); +static void sub_8176F90(struct Sprite *sprite); +static u8 sub_8177224(u16 species, s16 x, s16 y, u16 position); +static void sub_8177388(void); + +static void sub_81754C8(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void sub_81754DC(void) +{ + RunTasks(); + AnimateSprites(); + + if ((gMain.heldKeys & B_BUTTON) + && gHasHallOfFameRecords != 0 + && gTasks[gUnknown_0203BCE2].func == sub_8175774) + { + sub_81754C8(); + RunTasks(); + AnimateSprites(); + gUnknown_0203BCE5 = 1; + } + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_8175548(void) +{ + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, gUnknown_085E6F68, 1); + SetBgTilemapBuffer(0, AllocZeroed(0x800)); + LoadPalette(gUnknown_085E56F0, 0x80, 0x40); + InitWindows(gUnknown_085E6F6C); + DeactivateAllTextPrinters(); + PutWindowTilemap(0); + CopyWindowToVram(0, 3); + ShowBg(0); +} + +static void sub_81755A4(void) +{ + void *ptr; + FreeAllWindowBuffers(); + ptr = GetBgTilemapBuffer(0); + if (ptr) + Free(ptr); +} + +static void sub_81755BC(const u8 *string, u8 y, u8 a2) +{ + u8 x; + u8 color[3]; + + color[0] = 0; + + if (a2 == 1) + { + color[1] = 3; + color[2] = 4; + } + else + { + color[1] = 1; + color[2] = 2; + } + + x = GetStringCenterAlignXOffsetWithLetterSpacing(1, string, 0xF0, 1); + AddTextPrinterParameterized2(0, 1, x, y, 1, 0, color, -1, string); +} + +void sub_8175620(void) +{ + u8 taskIdA; + s16 taskIdC; + u8 taskIdB; + u16 savedIme; + + sub_8175CE4(); + SetVBlankCallback(NULL); + InitHeap(gHeap, HEAP_SIZE); + ResetPaletteFade(); + ResetTasks(); + sub_8175548(); + + taskIdA = CreateTask(sub_8175744, 0); + + gTasks[taskIdA].data[TDA_4] = 0; + gTasks[taskIdA].data[TDA_7] = 0; + gTasks[taskIdA].data[TDA_11] = 0; + gTasks[taskIdA].data[TDA_13] = 1; + + while (TRUE) + { + if (sub_8176AB0(0, taskIdA)) + break; + } + + taskIdC = gTasks[taskIdA].data[TDA_TASK_C_ID]; + gTasks[taskIdC].data[TDC_0] = 40; + + SetGpuReg(REG_OFFSET_BG0VOFS, 0xFFFC); + + taskIdB = CreateTask(sub_8175DA0, 0); + + gTasks[taskIdB].data[TDB_TASK_A_ID] = taskIdA; + gTasks[taskIdA].data[TDA_TASK_B_ID] = taskIdB; + + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + EnableInterrupts(INTR_FLAG_VBLANK); + SetVBlankCallback(sub_81754C8); + m4aSongNumStart(MUS_THANKFOR); + SetMainCallback2(sub_81754DC); + gUnknown_0203BCE5 = 0; + gUnknown_0203BCE8 = AllocZeroed(sizeof(struct Unk201C000)); + + sub_8177388(); + + gUnknown_0203BCE8->unk8E = 0; + gUnknown_0203BCE8->unk90 = 0; + gUnknown_0203BCE8->unk92 = 0; + + gUnknown_0203BCE2 = taskIdA; +} + +static void sub_8175744(u8 taskIdA) +{ + if (!gPaletteFade.active) + gTasks[taskIdA].func = sub_8175774; +} + +static void sub_8175774(u8 taskIdA) +{ + u16 data1; + + if (gTasks[taskIdA].data[TDA_4]) + { + s16 taskIdC; + + taskIdC = gTasks[taskIdA].data[TDA_TASK_C_ID]; + gTasks[taskIdC].data[TDC_0] = 30; + + gTasks[taskIdA].data[TDA_12] = 0x100; + gTasks[taskIdA].func = sub_8175A9C; + return; + } + + gUnknown_0203BCE0 = 0; + data1 = gTasks[taskIdA].data[TDA_11]; + + if (gTasks[taskIdA].data[TDA_11] == 1) + { + gTasks[taskIdA].data[TDA_13] = data1; + gTasks[taskIdA].data[TDA_11] = 0; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gTasks[taskIdA].func = sub_8175808; + } + else if (gTasks[taskIdA].data[TDA_11] == 2) + { + gTasks[taskIdA].data[TDA_13] = data1; + gTasks[taskIdA].data[TDA_11] = 0; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gTasks[taskIdA].func = sub_81758A4; + } +} + +static void sub_8175808(u8 taskIdA) +{ + if (!gPaletteFade.active) + { + SetGpuReg(REG_OFFSET_DISPCNT, 0); + sub_8176CA0(taskIdA); + gTasks[taskIdA].func = c2_080C9BFC; + } +} + +static void c2_080C9BFC(u8 taskIdA) +{ + u16 backup; + + SetVBlankCallback(NULL); + + if (sub_8176AB0(gTasks[taskIdA].data[TDA_7], taskIdA)) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + EnableInterrupts(INTR_FLAG_VBLANK); + SetVBlankCallback(sub_81754C8); + gTasks[taskIdA].func = sub_8175744; + } +} + +static void sub_81758A4(u8 taskIdA) +{ + if (!gPaletteFade.active) + { + SetGpuReg(REG_OFFSET_DISPCNT, 0); + sub_8176CA0(taskIdA); + gTasks[taskIdA].func = sub_81758E4; + } +} + +static void sub_81758E4(u8 taskIdA) +{ + switch (gMain.state) + { + default: + case 0: + { + u16 i; + u16 *temp; + + ResetSpriteData(); + dp13_810BB8C(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 8; + LZ77UnCompVram(&gBirchHelpGfx, (void *)VRAM); + LZ77UnCompVram(&gBirchGrassTilemap, (void *)(VRAM + 0x3800)); + LoadPalette(gBirchBagGrassPal[0] + 1, 1, 31 * 2); + + for (i = 0; i < 0x800; i++) + gDecompressionBuffer[i] = 0x11; + for (i = 0; i < 0x800; i++) + (gDecompressionBuffer + 0x800)[i] = 0x22; + for (i = 0; i < 0x800; i++) + (gDecompressionBuffer + 0x1000)[i] = 0x33; + + temp = (u16 *)(&gDecompressionBuffer[0x1800]); + temp[0] = RGB_BLACK; + temp[1] = RGB(31, 31, 20); // light yellow + temp[2] = RGB(31, 20, 20); // light red + temp[3] = RGB(20, 20, 31); // light blue + + LoadSpriteSheet(gUnknown_085E701C); + LoadSpritePalette(gUnknown_085E702C); + + gMain.state += 1; + break; + } + case 1: + gTasks[taskIdA].data[TDA_TASK_D_ID] = CreateTask(sub_81760FC, 0); + gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_STATE] = 1; + gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_TASK_A_ID] = taskIdA; + gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_2] = gTasks[taskIdA].data[TDA_7]; + + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + SetGpuReg(REG_OFFSET_BG3HOFS, 0); + SetGpuReg(REG_OFFSET_BG3VOFS, 32); + SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) + | BGCNT_CHARBASE(0) + | BGCNT_SCREENBASE(7) + | BGCNT_16COLOR + | BGCNT_TXT256x256); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 + | DISPCNT_OBJ_1D_MAP + | DISPCNT_BG0_ON + | DISPCNT_BG3_ON + | DISPCNT_OBJ_ON); + + gMain.state = 0; + gUnknown_0203BD28 = 0; + gTasks[taskIdA].func = sub_8175744; + break; + } +} + +static void sub_8175A9C(u8 taskIdA) +{ + if (gTasks[taskIdA].data[TDA_12]) + { + gTasks[taskIdA].data[TDA_12] -= 1; + return; + } + + BeginNormalPaletteFade(0xFFFFFFFF, 12, 0, 16, RGB_BLACK); + gTasks[taskIdA].func = sub_8175AE4; +} + +static void sub_8175AE4(u8 taskIdA) +{ + if (!gPaletteFade.active) + { + sub_8176CA0(taskIdA); + gTasks[taskIdA].func = sub_8175B1C; + } +} + +static void sub_8175B1C(u8 taskIdA) +{ + sub_8175CE4(); + ResetPaletteFade(); + sub_8176D1C(0, 0x3800, 0); + ResetSpriteData(); + FreeAllSpritePalettes(); + BeginNormalPaletteFade(0xFFFFFFFF, 8, 16, 0, RGB_BLACK); + + SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) + | BGCNT_CHARBASE(0) + | BGCNT_SCREENBASE(7) + | BGCNT_16COLOR + | BGCNT_TXT256x256); + EnableInterrupts(INTR_FLAG_VBLANK); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 + | DISPCNT_OBJ_1D_MAP + | DISPCNT_BG0_ON); + + gTasks[taskIdA].data[TDA_0] = 0xEB; + gTasks[taskIdA].func = sub_8175B90; +} + +static void sub_8175B90(u8 taskIdA) +{ + if (gTasks[taskIdA].data[TDA_0]) + { + gTasks[taskIdA].data[TDA_0] -= 1; + return; + } + + BeginNormalPaletteFade(0xFFFFFFFF, 6, 0, 16, RGB_BLACK); + gTasks[taskIdA].func = sub_8175BD8; +} + +static void sub_8175BD8(u8 taskIdA) +{ + if (!gPaletteFade.active) + { + sub_8176E40(0x3800, 0); + + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0, RGB_BLACK); + gTasks[taskIdA].data[TDA_0] = 7200; + gTasks[taskIdA].func = sub_8175C34; + } +} + +static void sub_8175C34(u8 taskIdA) +{ + if (!gPaletteFade.active) + { + if (gTasks[taskIdA].data[TDA_0] == 0 || gMain.newKeys) + { + FadeOutBGM(4); + BeginNormalPaletteFade(0xFFFFFFFF, 8, 0, 16, RGB_WHITEALPHA); + gTasks[taskIdA].func = sub_8175CC8; + return; + } + + if (gTasks[taskIdA].data[TDA_0] == 7144) + FadeOutBGM(8); + + if (gTasks[taskIdA].data[TDA_0] == 6840) + m4aSongNumStart(MUS_END); + + gTasks[taskIdA].data[TDA_0] -= 1; + } +} + +static void sub_8175CC8(u8 taskIdA) +{ + if (!gPaletteFade.active) + SoftReset(0xFF); +} + +static void sub_8175CE4(void) +{ + SetGpuReg(REG_OFFSET_DISPCNT, 0); + + SetGpuReg(REG_OFFSET_BG3HOFS, 0); + SetGpuReg(REG_OFFSET_BG3VOFS, 0); + SetGpuReg(REG_OFFSET_BG2HOFS, 0); + SetGpuReg(REG_OFFSET_BG2VOFS, 0); + SetGpuReg(REG_OFFSET_BG1HOFS, 0); + SetGpuReg(REG_OFFSET_BG1VOFS, 0); + SetGpuReg(REG_OFFSET_BG0HOFS, 0); + SetGpuReg(REG_OFFSET_BG0VOFS, 0); + + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + + DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *)OAM, OAM_SIZE); + DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); +} + +static void sub_8175DA0(u8 taskIdB) +{ + int i; + + switch (gTasks[taskIdB].data[TDB_0]) + { + case 0: + case 6: + case 7: + case 8: + case 9: + default: + if (!gPaletteFade.active) + { + gTasks[taskIdB].data[TDB_0] = 1; + gTasks[taskIdB].data[TDB_3] = 0x48; + gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 0; + gUnknown_0203BCE0 = 0; + } + return; + case 1: + if (gTasks[taskIdB].data[TDB_3] != 0) + { + gTasks[taskIdB].data[TDB_3] -= 1; + return; + } + gTasks[taskIdB].data[TDB_0] += 1; + return; + case 2: + if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].func == sub_8175774) + { + if (gTasks[taskIdB].data[TDB_CURRENT_PAGE] < PAGE_COUNT) + { + for (i = 0; i < 5; i++) + sub_81755BC(gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->text, 5 + i * 16, gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->var_1); + + CopyWindowToVram(0, 2); + + gTasks[taskIdB].data[TDB_CURRENT_PAGE] += 1; + gTasks[taskIdB].data[TDB_0] += 1; + + gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 1; + + if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_13] == 1) + BeginNormalPaletteFade(0x00000300, 0, 16, 0, COLOR_LIGHT_GREEN); + else + BeginNormalPaletteFade(0x00000300, 0, 16, 0, COLOR_DARK_GREEN); + return; + } + gTasks[taskIdB].data[TDB_0] = 10; + return; + } + gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 0; + return; + case 3: + if (!gPaletteFade.active) + { + gTasks[taskIdB].data[TDB_3] = 0x73; + gTasks[taskIdB].data[TDB_0] += 1; + } + return; + case 4: + if (gTasks[taskIdB].data[TDB_3] != 0) + { + gTasks[taskIdB].data[TDB_3] -= 1; + return; + } + + if (sub_817603C((u8)gTasks[taskIdB].data[TDB_CURRENT_PAGE], (u8)gTasks[taskIdB].data[TDB_TASK_A_ID])) + { + gTasks[taskIdB].data[TDB_0] += 1; + return; + } + gTasks[taskIdB].data[TDB_0] += 1; + if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_13] == 1) + BeginNormalPaletteFade(0x00000300, 0, 0, 16, COLOR_LIGHT_GREEN); + else + BeginNormalPaletteFade(0x00000300, 0, 0, 16, COLOR_DARK_GREEN); + return; + case 5: + if (!gPaletteFade.active) + { + FillWindowPixelBuffer(0, 0); + CopyWindowToVram(0, 2); + gTasks[taskIdB].data[TDB_0] = 2; + } + return; + case 10: + gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_4] = 1; + DestroyTask(taskIdB); + sub_81755A4(); + FREE_AND_SET_NULL(gUnknown_0203BCE8); + return; + } +} + +static u8 sub_817603C(u8 page, u8 taskIdA) +{ + // Starts with bike + ocean + morning + + if (page == 6) + { + // Grass patch + gTasks[taskIdA].data[TDA_11] = 2; + } + + if (page == 12) + { + // Bike + ocean + sunset + gTasks[taskIdA].data[TDA_7] = 1; + gTasks[taskIdA].data[TDA_11] = 1; + } + + if (page == 18) + { + // Grass patch + gTasks[taskIdA].data[TDA_11] = 2; + } + + if (page == 24) + { + // Bike + forest + sunset + gTasks[taskIdA].data[TDA_7] = 2; + gTasks[taskIdA].data[TDA_11] = 1; + } + + if (page == 30) + { + // Grass patch + gTasks[taskIdA].data[TDA_11] = 2; + } + + if (page == 36) + { + // Bike + forest + sunset + gTasks[taskIdA].data[TDA_7] = 3; + gTasks[taskIdA].data[TDA_11] = 1; + } + + if (page == 42) + { + // Grass patch + gTasks[taskIdA].data[TDA_11] = 2; + } + + if (page == 48) + { + // Bike + town + night + gTasks[taskIdA].data[TDA_7] = 4; + gTasks[taskIdA].data[TDA_11] = 1; + } + + if (gTasks[taskIdA].data[TDA_11] != 0) + { + // Returns true if changed? + return TRUE; + } + + return FALSE; +} + +static void sub_81760FC(u8 taskIdD) +{ + u8 r2; + + switch (gTasks[taskIdD].data[TDD_STATE]) + { + case 0: + break; + case 1: + if (gUnknown_0203BCE8->unk90 == 0 && gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].data[TDA_14] == 0) + break; + gTasks[taskIdD].data[TDD_STATE]++; + break; + case 2: + if (gUnknown_0203BCE8->unk8E == 71 || gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].func != sub_8175774) + break; + r2 = sub_8177224(gUnknown_0203BCE8->unk0[gUnknown_0203BCE8->unk92], gUnknown_085E6F7C[gUnknown_0203BCE8->unk90][0], gUnknown_085E6F7C[gUnknown_0203BCE8->unk90][1], gUnknown_0203BCE8->unk90); + if (gUnknown_0203BCE8->unk92 < gUnknown_0203BCE8->unk94 - 1) + { + gUnknown_0203BCE8->unk92++; + gSprites[r2].data[3] = 50; + } + else + { + gUnknown_0203BCE8->unk92 = 0; + gSprites[r2].data[3] = 512; + } + gUnknown_0203BCE8->unk8E++; + if (gUnknown_0203BCE8->unk90 == 2) + gUnknown_0203BCE8->unk90 = 0; + else + gUnknown_0203BCE8->unk90++; + gTasks[taskIdD].data[TDD_3] = 50; + gTasks[taskIdD].data[TDD_STATE]++; + break; + case 3: + if (gTasks[taskIdD].data[TDD_3] != 0) + gTasks[taskIdD].data[TDD_3]--; + else + gTasks[taskIdD].data[TDD_STATE] = 1; + break; + } +} + +static void sub_817624C(u8 taskIdC) +{ + switch (gTasks[taskIdC].data[TDC_0]) + { + case 0: + gUnknown_0203BD26 = Sin((gTasks[taskIdC].data[TDC_5] >> 1) & 0x7F, 12); + gTasks[taskIdC].data[TDC_5]++; + break; + case 1: + if (gUnknown_0203BD26 != 0) + { + gUnknown_0203BD26 = Sin((gTasks[taskIdC].data[TDC_5] >> 1) & 0x7F, 12); + gTasks[taskIdC].data[TDC_5]++; + } + else + { + gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 2; + gTasks[taskIdC].data[TDC_5] = 0; + gTasks[taskIdC].data[TDC_0]++; + } + break; + case 2: + if (gTasks[taskIdC].data[TDC_5] < 64) + { + gTasks[taskIdC].data[TDC_5]++; + gUnknown_0203BD26 = Sin(gTasks[taskIdC].data[TDC_5] & 0x7F, 20); + } + else + { + gTasks[taskIdC].data[TDC_0]++; + } + break; + case 3: + gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 3; + gSprites[gTasks[taskIdC].data[TDC_3]].data[0] = 1; + gTasks[taskIdC].data[TDC_4] = 120; + gTasks[taskIdC].data[TDC_0]++; + break; + case 4: + if (gTasks[taskIdC].data[TDC_4] != 0) + { + gTasks[taskIdC].data[TDC_4]--; + } + else + { + gTasks[taskIdC].data[TDC_5] = 64; + gTasks[taskIdC].data[TDC_0]++; + } + break; + case 5: + if (gTasks[taskIdC].data[TDC_5] > 0) + { + gTasks[taskIdC].data[TDC_5]--; + gUnknown_0203BD26 = Sin(gTasks[taskIdC].data[TDC_5] & 0x7F, 20); + } + else + { + gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 1; + gTasks[taskIdC].data[TDC_0]++; + } + break; + case 6: + gTasks[taskIdC].data[TDC_0] = 50; + break; + case 10: + gSprites[gTasks[taskIdC].data[TDC_3]].data[0] = 2; + gTasks[taskIdC].data[TDC_0] = 50; + break; + case 20: + gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 4; + gTasks[taskIdC].data[TDC_0] = 50; + break; + case 30: + gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 5; + gSprites[gTasks[taskIdC].data[TDC_3]].data[0] = 3; + gTasks[taskIdC].data[TDC_0] = 50; + break; + case 50: + gTasks[taskIdC].data[TDC_0] = 0; + break; + } +} + +static void sub_817651C(u8 taskIdE) +{ + s16 taskIdC; + + switch (gTasks[taskIdE].data[TDE_0]) + { + default: + case 0: + if (gTasks[taskIdE].data[TDE_1] != 0x7FFF) + { + + if (gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_B_ID]].data[TDB_CURRENT_PAGE] == 2) + { + gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID]].data[TDC_0] = 20; + gTasks[taskIdE].data[TDE_1] = 0x7FFF; + } + } + sub_817B540(0); + break; + case 1: + sub_817B540(0); + break; + case 2: + if (gTasks[taskIdE].data[TDE_1] != 0x7FFF) + { + taskIdC = gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID]; + + // Floor to multiple of 128 + if ((gTasks[taskIdC].data[TDC_5] & -128) == 640) + { + gTasks[taskIdC].data[TDC_0] = 1; + gTasks[taskIdE].data[TDE_1] = 0x7FFF; + } + } + sub_817B540(1); + break; + case 3: + if (gTasks[taskIdE].data[TDE_1] != 0x7FFF) + { + + if (gTasks[taskIdE].data[TDE_1] == 0x248) + { + gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID]].data[TDC_0] = 10; + gTasks[taskIdE].data[TDE_1] = 0x7FFF; + } + else + { + gTasks[taskIdE].data[TDE_1] += 1; + } + } + sub_817B540(1); + break; + case 4: + sub_817B540(2); + break; + } +} + +static void sub_817664C(u8 data, u8 taskIdA) +{ + switch (data) + { + case 0: + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 272; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0; + gTasks[taskIdA].data[TDA_0] = sub_817B3DC(0, 0x2000, 0x20, 8); + break; + case 1: + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0; + gTasks[taskIdA].data[TDA_0] = sub_817B3DC(0, 0x2000, 0x20, 8); + break; + case 2: + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0; + gTasks[taskIdA].data[TDA_0] = sub_817B3DC(1, 0x2000, 0x200, 8); + break; + case 3: + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = -32; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0; + gTasks[taskIdA].data[TDA_0] = sub_817B3DC(1, 0x2000, 0x200, 8); + break; + case 4: + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 88; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 152; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0; + gTasks[taskIdA].data[TDA_0] = sub_817B3DC(2, 0x2000, 0x200, 8); + break; + } + + gTasks[taskIdA].data[TDA_TASK_E_ID] = CreateTask(sub_817651C, 0); + gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_0] = data; + gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_1] = 0; + gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_TASK_A_ID] = taskIdA; + + gTasks[taskIdA].data[TDA_TASK_C_ID] = CreateTask(sub_817624C, 0); + gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_0] = 0; + gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_1] = taskIdA; + gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_2] = gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]; + gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_3] = gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]; + gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_4] = 0; + + if (data == 2) + gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_5] = 0x45; +} + +static bool8 sub_8176AB0(u8 data, u8 taskIdA) +{ + u8 spriteId; + + switch (gMain.state) + { + default: + case 0: + SetGpuReg(REG_OFFSET_DISPCNT, 0); + SetGpuReg(REG_OFFSET_BG3HOFS, 8); + SetGpuReg(REG_OFFSET_BG3VOFS, 0); + SetGpuReg(REG_OFFSET_BG2HOFS, 0); + SetGpuReg(REG_OFFSET_BG2VOFS, 0); + SetGpuReg(REG_OFFSET_BG1HOFS, 0); + SetGpuReg(REG_OFFSET_BG1VOFS, 0); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + ResetSpriteData(); + FreeAllSpritePalettes(); + gMain.state = 1; + break; + case 1: + gUnknown_0203BD24 = 34; + gUnknown_0203BD26 = 0; + sub_817B1C8(data); + gMain.state += 1; + break; + case 2: + if (gSaveBlock2Ptr->playerGender == MALE) + { + LoadCompressedObjectPic(gUnknown_085F5334); + LoadCompressedObjectPic(gUnknown_085F53BC); + LoadCompressedObjectPic(gUnknown_085F5354); + LoadSpritePalettes(gUnknown_085F5384); + + spriteId = intro_create_brendan_sprite(120, 46); + gTasks[taskIdA].data[TDA_PLAYER_CYCLIST] = spriteId; + gSprites[spriteId].callback = sub_8176EE8; + gSprites[spriteId].anims = gUnknown_085E6FD0; + + spriteId = intro_create_may_sprite(272, 46); + gTasks[taskIdA].data[TDA_RIVAL_CYCLIST] = spriteId; + gSprites[spriteId].callback = sub_8176F90; + gSprites[spriteId].anims = gUnknown_085E7010; + } + else + { + LoadCompressedObjectPic(gUnknown_085F5344); + LoadCompressedObjectPic(gUnknown_085F53AC); + LoadCompressedObjectPic(gUnknown_085F5354); + LoadSpritePalettes(gUnknown_085F5384); + + spriteId = intro_create_may_sprite(120, 46); + gTasks[taskIdA].data[TDA_PLAYER_CYCLIST] = spriteId; + gSprites[spriteId].callback = sub_8176EE8; + gSprites[spriteId].anims = gUnknown_085E6FD0; + + spriteId = intro_create_brendan_sprite(272, 46); + gTasks[taskIdA].data[TDA_RIVAL_CYCLIST] = spriteId; + gSprites[spriteId].callback = sub_8176F90; + gSprites[spriteId].anims = gUnknown_085E7010; + }; + gMain.state += 1; + break; + case 3: + sub_817664C(data, taskIdA); + sub_817B3A8(data); + gMain.state = 0; + return TRUE; + } + return FALSE; +} + +static void sub_8176CA0(u8 taskIdA) +{ + if (gTasks[taskIdA].data[TDA_0] != 0) + { + DestroyTask(gTasks[taskIdA].data[TDA_0]); + gTasks[taskIdA].data[TDA_0] = 0; + } + + if (gTasks[taskIdA].data[TDA_TASK_C_ID] != 0) + { + DestroyTask(gTasks[taskIdA].data[TDA_TASK_C_ID]); + gTasks[taskIdA].data[TDA_TASK_C_ID] = 0; + } + + if (gTasks[taskIdA].data[TDA_TASK_E_ID] != 0) + { + DestroyTask(gTasks[taskIdA].data[TDA_TASK_E_ID]); + gTasks[taskIdA].data[TDA_TASK_E_ID] = 0; + } + + if (gTasks[taskIdA].data[TDA_TASK_D_ID] != 0) + { + DestroyTask(gTasks[taskIdA].data[TDA_TASK_D_ID]); + gTasks[taskIdA].data[TDA_TASK_D_ID] = 0; + } + + gUnknown_0203BD28 = 1; +} + +static void sub_8176D1C(u16 arg0, u16 arg1, u16 arg2) +{ + u16 baseTile; + u16 i; + + LZ77UnCompVram(gCreditsCopyrightEnd_Gfx, (void *)(VRAM + arg0)); + LoadPalette(gIntroCopyright_Pal, arg2, sizeof(gIntroCopyright_Pal)); + + baseTile = (arg2 / 16) << 12; + + for (i = 0; i < 32 * 32; i++) + ((u16 *) (VRAM + arg1))[i] = baseTile + 1; +} + +static u16 sub_8176D78(u8 arg0) +{ + u16 out = (arg0 & 0x3F) + 80; + + if (arg0 == 0xFF) + return 1; + + if (arg0 & (1 << 7)) + out |= 1 << 11; + if (arg0 & (1 << 6)) + out |= 1 << 10; + + return out; +} + +static void sub_8176DBC(const u8 arg0[], u8 baseX, u8 baseY, u16 arg3, u16 palette) +{ + u8 y, x; + const u16 tileOffset = (palette / 16) << 12; + + for (y = 0; y < 5; y++) + { + for (x = 0; x < 3; x++) + ((u16 *) (VRAM + arg3 + (baseY + y) * 64))[baseX + x] = tileOffset + sub_8176D78(arg0[y * 3 + x]); + } +} + +static void sub_8176E40(u16 arg0, u16 palette) +{ + u16 pos; + u16 baseTile = (palette / 16) << 12; + + for (pos = 0; pos < 32 * 32; pos++) + ((u16 *) (VRAM + arg0))[pos] = baseTile + 1; + + sub_8176DBC(gUnknown_085E5BAC, 3, 7, arg0, palette); + sub_8176DBC(gUnknown_085E5BBB, 7, 7, arg0, palette); + sub_8176DBC(gUnknown_085E5BCA, 11, 7, arg0, palette); + sub_8176DBC(gUnknown_085E5BCA, 16, 7, arg0, palette); + sub_8176DBC(gUnknown_085E5BD9, 20, 7, arg0, palette); + sub_8176DBC(gUnknown_085E5BE8, 24, 7, arg0, palette); +} + +static void sub_8176EE8(struct Sprite *sprite) +{ + if (gUnknown_0203BD28 != 0) + { + DestroySprite(sprite); + return; + } + + switch (sprite->data[0]) + { + case 0: + StartSpriteAnimIfDifferent(sprite, 0); + break; + case 1: + StartSpriteAnimIfDifferent(sprite, 1); + if (sprite->pos1.x > -32) + sprite->pos1.x -= 1; + break; + case 2: + StartSpriteAnimIfDifferent(sprite, 2); + break; + case 3: + StartSpriteAnimIfDifferent(sprite, 3); + break; + case 4: + StartSpriteAnimIfDifferent(sprite, 0); + if (sprite->pos1.x > 120) + sprite->pos1.x -= 1; + break; + case 5: + StartSpriteAnimIfDifferent(sprite, 0); + if (sprite->pos1.x > -32) + sprite->pos1.x -= 1; + break; + } +} + +static void sub_8176F90(struct Sprite *sprite) +{ + if (gUnknown_0203BD28 != 0) + { + DestroySprite(sprite); + return; + } + + switch (sprite->data[0]) + { + case 0: + sprite->pos2.y = 0; + StartSpriteAnimIfDifferent(sprite, 0); + break; + case 1: + if (sprite->pos1.x > 200) + StartSpriteAnimIfDifferent(sprite, 1); + else + StartSpriteAnimIfDifferent(sprite, 2); + if (sprite->pos1.x > -32) + sprite->pos1.x -= 2; + sprite->pos2.y = -gUnknown_0203BD26; + break; + case 2: + sprite->data[7] += 1; + StartSpriteAnimIfDifferent(sprite, 0); + if ((sprite->data[7] & 3) == 0) + sprite->pos1.x += 1; + break; + case 3: + StartSpriteAnimIfDifferent(sprite, 0); + if (sprite->pos1.x > -32) + sprite->pos1.x -= 1; + break; + } +} + +static void sub_8177050(struct Sprite *sprite) +{ + if (gUnknown_0203BD28) + { + sub_818D820(sprite->data[6]); + return; + } + + sprite->data[7] += 1; + switch (sprite->data[0]) + { + case 0: + default: + sprite->oam.affineMode = 1; + sprite->oam.matrixNum = sprite->data[1]; + sprite->data[2] = 16; + SetOamMatrix(sprite->data[1], 0x10000 / sprite->data[2], 0, 0, 0x10000 / sprite->data[2]); + sprite->invisible = FALSE; + sprite->data[0] = 1; + break; + case 1: + if (sprite->data[2] < 256) + { + sprite->data[2] += 8; + SetOamMatrix(sprite->data[1], 0x10000 / sprite->data[2], 0, 0, 0x10000 / sprite->data[2]); + } + else + { + sprite->data[0] += 1; + } + switch (sprite->data[1]) + { + case 1: + if ((sprite->data[7] & 3) == 0) + sprite->pos1.y += 1; + sprite->pos1.x -= 2; + break; + case 2: + break; + case 3: + if ((sprite->data[7] & 3) == 0) + sprite->pos1.y += 1; + sprite->pos1.x += 2; + break; + } + break; + case 2: + if (sprite->data[3] != 0) + { + sprite->data[3] -= 1; + } + else + { + SetGpuReg(REG_OFFSET_BLDCNT, 0xF40); + SetGpuReg(REG_OFFSET_BLDALPHA, 0x10); + sprite->oam.objMode = 1; + sprite->data[3] = 16; + sprite->data[0] += 1; + } + break; + case 3: + if (sprite->data[3] != 0) + { + int data3; + + sprite->data[3] -= 1; + + data3 = 16 - sprite->data[3]; + SetGpuReg(REG_OFFSET_BLDALPHA, (data3 << 8) + sprite->data[3]); + } + else + { + sprite->invisible = TRUE; + sprite->data[0] = 9; + } + break; + case 9: + sprite->data[0] += 1; + break; + case 10: + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + sub_818D820(sprite->data[6]); + break; + } +} + +static u8 sub_8177224(u16 species, s16 x, s16 y, u16 position) +{ + u8 spriteId; + u8 spriteId2; + + spriteId = sub_80C0E9C(species, x, y, position); + gSprites[spriteId].oam.priority = 1; + gSprites[spriteId].data[1] = position + 1; + gSprites[spriteId].invisible = TRUE; + gSprites[spriteId].callback = sub_8177050; + gSprites[spriteId].data[6] = spriteId; + + spriteId2 = CreateSprite(&gUnknown_085E7068, gSprites[spriteId].pos1.x, gSprites[spriteId].pos1.y, 1); + gSprites[spriteId2].data[0] = spriteId; + + StartSpriteAnimIfDifferent(&gSprites[spriteId2], position); + + return spriteId; +} + +static void sub_81772B8(struct Sprite *sprite) +{ + if (gSprites[sprite->data[0]].data[0] == 10 || gUnknown_0203BD28) + { + DestroySprite(sprite); + return; + } + + sprite->invisible = gSprites[sprite->data[0]].invisible; + sprite->oam.objMode = gSprites[sprite->data[0]].oam.objMode; + sprite->oam.affineMode = gSprites[sprite->data[0]].oam.affineMode; + sprite->oam.matrixNum = gSprites[sprite->data[0]].oam.matrixNum; + sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; + sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; +} + +static void sub_8177388(void) +{ + u16 starter = SpeciesToNationalPokedexNum(GetStarterPokemon(VarGet(VAR_FIRST_POKE))); + u16 page; + u16 dexNum; + u16 j; + + for (dexNum = 1, j = 0; dexNum < 386; dexNum++) + { + if (GetSetPokedexFlag(dexNum, 1)) + { + gUnknown_0203BCE8->unk96[j] = dexNum; + j++; + } + } + + for (dexNum = j; dexNum < 386; dexNum++) + gUnknown_0203BCE8->unk96[dexNum] = 0; + + gUnknown_0203BCE8->unk39A = j; + if (gUnknown_0203BCE8->unk39A < 71) + gUnknown_0203BCE8->unk94 = j; + else + gUnknown_0203BCE8->unk94 = 71; + + j = 0; + do + { + page = Random() % gUnknown_0203BCE8->unk39A; + gUnknown_0203BCE8->unk0[j] = gUnknown_0203BCE8->unk96[page]; + + j++; + gUnknown_0203BCE8->unk96[page] = 0; + gUnknown_0203BCE8->unk39A--; + if (page != gUnknown_0203BCE8->unk39A) + { + gUnknown_0203BCE8->unk96[page] = gUnknown_0203BCE8->unk96[gUnknown_0203BCE8->unk39A]; + gUnknown_0203BCE8->unk96[gUnknown_0203BCE8->unk39A] = 0; + } + } + while (gUnknown_0203BCE8->unk39A != 0 && j < 71); + + if (gUnknown_0203BCE8->unk94 < 71) + { + for (j = gUnknown_0203BCE8->unk94, page = 0; j < 71; j++) + { + gUnknown_0203BCE8->unk0[j] = gUnknown_0203BCE8->unk0[page]; + + page++; + if (page == gUnknown_0203BCE8->unk94) + page = 0; + } + gUnknown_0203BCE8->unk0[70] = starter; + } + else + { + for (dexNum = 0; gUnknown_0203BCE8->unk0[dexNum] != starter && dexNum < 71; dexNum++); + + if (dexNum < gUnknown_0203BCE8->unk94 - 1) + { + gUnknown_0203BCE8->unk0[dexNum] = gUnknown_0203BCE8->unk0[70]; + gUnknown_0203BCE8->unk0[70] = starter; + } + else + { + gUnknown_0203BCE8->unk0[70] = starter; + } + } + gUnknown_0203BCE8->unk94 = 71; +} diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c index 6dda6ad9c..83df30d05 100644 --- a/src/hall_of_fame.c +++ b/src/hall_of_fame.c @@ -369,7 +369,7 @@ static const struct HallofFameMon sDummyFameMon = 0x3EA03EA, 0, 0, 0, {0} }; -static const u8 sUnused2[6] = {2, 1, 3, 6, 4, 5}; +static const u8 sUnused2[] = {2, 1, 3, 6, 4, 5, 0, 0}; // code static void VBlankCB_HallOfFame(void) @@ -516,7 +516,7 @@ static void Task_Hof_InitTeamSaveData(u8 taskId) } else { - if (sub_81534D0(3) != TRUE) + if (Save_LoadGameData(3) != TRUE) memset(gDecompressionBuffer, 0, 0x2000); } @@ -885,7 +885,7 @@ void CB2_DoHallOfFamePC(void) static void Task_HofPC_CopySaveData(u8 taskId) { sub_81980F0(0, 0x1E, 0, 0xC, 0x226); - if (sub_81534D0(3) != 1) + if (Save_LoadGameData(3) != 1) { gTasks[taskId].func = Task_HofPC_PrintDataIsCorrupted; } diff --git a/src/intro.c b/src/intro.c new file mode 100644 index 000000000..f21ad348d --- /dev/null +++ b/src/intro.c @@ -0,0 +1,3020 @@ +#include "global.h" +#include "main.h" +#include "palette.h" +#include "scanline_effect.h" +#include "task.h" +#include "title_screen.h" +#include "libgcnmultiboot.h" +#include "malloc.h" +#include "gpu_regs.h" +#include "link.h" +#include "multiboot_pokemon_colosseum.h" +#include "load_save.h" +#include "save.h" +#include "new_game.h" +#include "m4a.h" +#include "random.h" +#include "decompress.h" +#include "constants/songs.h" +#include "intro_credits_graphics.h" +#include "trig.h" +#include "intro.h" +#include "graphics.h" +#include "sound.h" +#include "constants/species.h" +#include "blend_palette.h" +#include "title_screen.h" +#include "constants/rgb.h" + +extern const struct CompressedSpriteSheet gBattleAnimPicTable[]; +extern const struct CompressedSpritePalette gBattleAnimPaletteTable[]; +extern const struct SpriteTemplate gUnknown_08596C10[]; + +//ewram +EWRAM_DATA u16 gUnknown_0203BCC8 = 0; +EWRAM_DATA u16 gUnknown_0203BCCA = 0; +EWRAM_DATA u16 gUnknown_0203BCCC = 0; + +//iwram +u32 gIntroFrameCounter; +struct GcmbStruct gMultibootProgramStruct; + +//.rodata +static const u16 gIntro1DropsPal[] = INCBIN_U16("graphics/intro/intro1_drops.gbapal"); +static const u16 gIntro1GFLogoPal[] = INCBIN_U16("graphics/intro/intro1_gflogo.gbapal"); +static const u8 gIntroTiles[] = INCBIN_U8("graphics/intro/intro.4bpp.lz"); +static const u16 gIntro1BGPals[16][16] = INCBIN_U16("graphics/intro/intro1_bgpal.gbapal"); +static const u8 gIntro1BG0_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg0_map.bin.lz"); +static const u8 gIntro1BG1_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg1_map.bin.lz"); +static const u8 gIntro1BG2_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg2_map.bin.lz"); +static const u8 gIntro1BG3_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg3_map.bin.lz"); +static const u8 gIntro1BGLeavesGfx[] = INCBIN_U8("graphics/intro/introgfx.4bpp.lz"); +static const u16 gIntro3PokeballPal[] = INCBIN_U16("graphics/intro/intro3_pokeball.gbapal"); +static const u8 gIntro3Pokeball_Tilemap[] = INCBIN_U8("graphics/intro/intro3_pokeball_map.bin.lz"); +static const u8 gIntro3Pokeball_Gfx[] = INCBIN_U8("graphics/intro/intro3_pokeball.8bpp.lz"); +static const u16 gIntro3Streaks_Pal_Unused[] = INCBIN_U16("graphics/intro/intro3_streaks.gbapal"); +static const u8 gIntro3Streaks_Gfx_Unused[] = INCBIN_U8("graphics/intro/intro3_streaks.4bpp.lz"); +static const u8 gIntro3Streaks_Tilemap_Unused[] = INCBIN_U8("graphics/intro/intro3_streaks_map.bin.lz"); +static const u16 gIntro3Misc1Palette[] = INCBIN_U16("graphics/intro/intro3_misc1.gbapal"); +static const u16 gIntro3Misc2Palette_Unused[] = INCBIN_U16("graphics/intro/intro3_misc2.gbapal"); +static const u8 gIntro3MiscTiles[] = INCBIN_U8("graphics/intro/intro3_misc.4bpp.lz"); +static const u16 gIntro1FlygonPalette[] = INCBIN_U16("graphics/intro/intro1_flygon.gbapal"); +static const u8 gIntro1EonTiles_Unused[] = INCBIN_U8("graphics/intro/intro1_eon.4bpp.lz"); +static const u8 sUnknownBytes[] = { + 0x02, 0x03, 0x04, 0x05, 0x01, 0x01, 0x01, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x02, 0x0D, + 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x02, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x02, 0x0D, 0x0E, 0x0F, 0x10, + 0x11, 0x12, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x00 +}; +static const struct CompressedSpriteSheet gUnknown_085E4A74[] = +{ + {gIntro1SparkleGfx, 0x400, 1505}, + {NULL}, +}; +static const struct SpritePalette gUnknown_085E4A84[] = +{ + {gIntro3LightningPal, 1505}, + {NULL}, +}; +static const struct OamData gUnknown_085E4A94 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gUnknown_085E4A9C[] = +{ + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(4, 2), + ANIMCMD_FRAME(8, 2), + ANIMCMD_FRAME(12, 2), + ANIMCMD_FRAME(16, 2), + ANIMCMD_JUMP(0), +}; +static const union AnimCmd *const gUnknown_085E4AB4[] = +{ + gUnknown_085E4A9C, +}; +static void sub_816D338(struct Sprite *sprite); +static const struct SpriteTemplate gUnknown_085E4AB8 = +{ + .tileTag = 1505, + .paletteTag = 1505, + .oam = &gUnknown_085E4A94, + .anims = gUnknown_085E4AB4, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_816D338, +}; +static const u8 gUnknown_085E4AD0[][2] = +{ + {0x7C, 0x28}, + {0x66, 0x1E}, + {0x4D, 0x1E}, + {0x36, 0x0F}, + {0x94, 0x09}, + {0x3F, 0x1C}, + {0x5D, 0x28}, + {0x94, 0x20}, + {0xAD, 0x29}, + {0x5E, 0x14}, + {0xD0, 0x26}, + {0x00, 0x00}, +}; +static const struct CompressedSpriteSheet gUnknown_085E4AE8[] = +{ + {gIntro2VolbeatGfx, 0x400, 1500}, + {gIntro2TorchicGfx, 0xC00, 1501}, + {gIntro2ManectricGfx, 0x2000, 1502}, + {NULL}, +}; +static const struct SpritePalette gUnknown_085E4B08[] = +{ + {gIntro2VolbeatPal, 1500}, + {gIntro2TorchicPal, 1501}, + {gIntro2ManectricPal, 1502}, + {NULL}, +}; +static const struct OamData gUnknown_085E4B28 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gUnknown_085E4B30[] = +{ + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(16, 2), + ANIMCMD_JUMP(0), +}; +static const union AnimCmd *const gUnknown_085E4B3C[] = +{ + gUnknown_085E4B30, +}; +static void sub_816D81C(struct Sprite *sprite); +static const struct SpriteTemplate gUnknown_085E4B40 = +{ + .tileTag = 1500, + .paletteTag = 1500, + .oam = &gUnknown_085E4B28, + .anims = gUnknown_085E4B3C, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_816D81C, +}; +static const struct OamData gUnknown_085E4B58 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gUnknown_085E4B60[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(16, 5), + ANIMCMD_FRAME(32, 5), + ANIMCMD_FRAME(16, 5), + ANIMCMD_JUMP(0), +}; +static const union AnimCmd gUnknown_085E4B74[] = +{ + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(16, 3), + ANIMCMD_FRAME(32, 3), + ANIMCMD_FRAME(16, 3), + ANIMCMD_JUMP(0), +}; +static const union AnimCmd gUnknown_085E4B88[] = +{ + ANIMCMD_FRAME(48, 4), + ANIMCMD_FRAME(64, 6), + ANIMCMD_FRAME(80, 0), + ANIMCMD_END, +}; +static const union AnimCmd *const gUnknown_085E4B98[] = +{ + gUnknown_085E4B60, + gUnknown_085E4B74, + gUnknown_085E4B88, +}; +static void sub_816D9C0(struct Sprite *sprite); +static const struct SpriteTemplate gUnknown_085E4BA4 = +{ + .tileTag = 1501, + .paletteTag = 1501, + .oam = &gUnknown_085E4B58, + .anims = gUnknown_085E4B98, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_816D9C0, +}; +static const struct OamData gUnknown_085E4BBC = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gUnknown_085E4BC4[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(64, 4), + ANIMCMD_FRAME(128, 4), + ANIMCMD_FRAME(192, 4), + ANIMCMD_JUMP(0), +}; +static const union AnimCmd *const gUnknown_085E4BD8[] = +{ + gUnknown_085E4BC4, +}; +static void sub_816DAE8(struct Sprite *sprite); +static const struct SpriteTemplate gUnknown_085E4BDC = +{ + .tileTag = 1502, + .paletteTag = 1502, + .oam = &gUnknown_085E4BBC, + .anims = gUnknown_085E4BD8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_816DAE8, +}; +static const struct CompressedSpriteSheet gUnknown_085E4BF4[] = +{ + {gIntro3LightningGfx, 0xC00, 1503}, + {NULL}, +}; +static const struct SpritePalette gUnknown_085E4C04[] = +{ + {gIntro3LightningPal, 1503}, + {NULL}, +}; +static const struct OamData gUnknown_085E4C14 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gUnknown_085E4C1C[] = +{ + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(48, 2), + ANIMCMD_END, +}; +static const union AnimCmd gUnknown_085E4C28[] = +{ + ANIMCMD_FRAME(16, 2), + ANIMCMD_FRAME(64, 2), + ANIMCMD_END, +}; +static const union AnimCmd gUnknown_085E4C34[] = +{ + ANIMCMD_FRAME(32, 2), + ANIMCMD_FRAME(80, 2), + ANIMCMD_END, +}; +static const union AnimCmd *const gUnknown_085E4C40[] = +{ + gUnknown_085E4C1C, + gUnknown_085E4C28, + gUnknown_085E4C34, +}; +static void sub_816EC6C(struct Sprite *sprite); +static const struct SpriteTemplate gUnknown_085E4C4C = +{ + .tileTag = 1503, + .paletteTag = 1503, + .oam = &gUnknown_085E4C14, + .anims = gUnknown_085E4C40, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_816EC6C, +}; +static const s16 gUnknown_085E4C64[][3] = +{ + {0x68, 0x00, 0x0C0}, + {0x8E, 0x03, 0x280}, + {0x53, 0x01, 0x180}, + {0x9B, 0x00, 0x080}, + {0x38, 0x02, 0x200}, + {0xAE, 0x01, 0x100}, +}; +static const struct CompressedSpriteSheet gUnknown_085E4C88[] = +{ + {gIntro2BubblesGfx, 0x600, 1504}, + {NULL}, +}; +static const struct SpritePalette gUnknown_085E4C98[] = +{ + {gIntro2BubblesPal, 1504}, + {NULL}, +}; +static const s16 gUnknown_085E4CA8[][3] = +{ + {0x42, 0x40, 0x1}, + {0x60, 0x60, 0x8}, + {0x80, 0x40, 0x1}, + {0x90, 0x30, 0x8}, + {0xA0, 0x48, 0x1}, + {0xB0, 0x60, 0x8}, + {0x60, 0x60, 0x4}, + {0x70, 0x68, 0x8}, + {0x80, 0x60, 0x4}, + {0x58, 0x20, 0x4}, + {0x68, 0x18, 0x8}, + {0x78, 0x20, 0x4}, +}; +static const struct OamData gUnknown_085E4CF0 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 2, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gUnknown_085E4CF8[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(8, 4), + ANIMCMD_FRAME(16, 4), + ANIMCMD_FRAME(24, 4), + ANIMCMD_FRAME(32, 4), + ANIMCMD_END, +}; +static const union AnimCmd *const gUnknown_085E4D10[] = +{ + gUnknown_085E4CF8, +}; +static void sub_816E7B4(struct Sprite *sprite); +static const struct SpriteTemplate gUnknown_085E4D14 = +{ + .tileTag = 1504, + .paletteTag = 1504, + .oam = &gUnknown_085E4CF0, + .anims = gUnknown_085E4D10, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_816E7B4, +}; +static const struct OamData gUnknown_085E4D2C = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gUnknown_085E4D34[] = +{ + ANIMCMD_FRAME(16, 8), + ANIMCMD_END, +}; +static const union AnimCmd gUnknown_085E4D3C[] = +{ + ANIMCMD_FRAME(24, 8), + ANIMCMD_END, +}; +static const union AnimCmd gUnknown_085E4D44[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_END, +}; +static const union AnimCmd gUnknown_085E4D4C[] = +{ + ANIMCMD_FRAME(48, 8), + ANIMCMD_END, +}; +static const union AnimCmd *const gUnknown_085E4D54[] = +{ + gUnknown_085E4D34, + gUnknown_085E4D3C, + gUnknown_085E4D44, + gUnknown_085E4D4C, +}; +static void sub_816F454(struct Sprite *sprite); +static const struct SpriteTemplate gUnknown_085E4D64 = +{ + .tileTag = 2000, + .paletteTag = 2000, + .oam = &gUnknown_085E4D2C, + .anims = gUnknown_085E4D54, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_816F454, +}; +static const union AnimCmd gUnknown_085E4D7C[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(64, 4), + ANIMCMD_FRAME(128, 4), + ANIMCMD_FRAME(192, 4), + ANIMCMD_JUMP(0), +}; +static const union AnimCmd gUnknown_085E4D90[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(64, 8), + ANIMCMD_FRAME(128, 8), + ANIMCMD_FRAME(192, 8), + ANIMCMD_JUMP(0), +}; +static const union AnimCmd gUnknown_085E4DA4[] = +{ + ANIMCMD_FRAME(256, 4), + ANIMCMD_FRAME(0x140, 4), + ANIMCMD_FRAME(0x180, 4), + ANIMCMD_END, +}; +static const union AnimCmd gUnknown_085E4DB4[] = +{ + ANIMCMD_FRAME(0x180, 16), + ANIMCMD_FRAME(0x140, 16), + ANIMCMD_FRAME(256, 16), + ANIMCMD_END, +}; +static const union AnimCmd *const gUnknown_085E4DC4[] = +{ + gUnknown_085E4D7C, + gUnknown_085E4D90, + gUnknown_085E4DA4, + gUnknown_085E4DB4, +}; +static const struct OamData gUnknown_085E4DD4 = +{ + .y = 160, + .affineMode = 3, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const struct OamData gUnknown_085E4DDC = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const struct OamData gUnknown_085E4DE4 = +{ + .y = 160, + .affineMode = 3, + .objMode = 1, + .mosaic = 0, + .bpp = 0, + .shape = 2, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gUnknown_085E4DEC[] = +{ + ANIMCMD_FRAME(80, 8), + ANIMCMD_END, +}; +static const union AnimCmd gUnknown_085E4DF4[] = +{ + ANIMCMD_FRAME(84, 8), + ANIMCMD_END, +}; +static const union AnimCmd gUnknown_085E4DFC[] = +{ + ANIMCMD_FRAME(88, 8), + ANIMCMD_END, +}; +static const union AnimCmd gUnknown_085E4E04[] = +{ + ANIMCMD_FRAME(92, 8), + ANIMCMD_END, +}; +static const union AnimCmd gUnknown_085E4E0C[] = +{ + ANIMCMD_FRAME(96, 8), + ANIMCMD_END, +}; +static const union AnimCmd gUnknown_085E4E14[] = +{ + ANIMCMD_FRAME(100, 8), + ANIMCMD_END, +}; +static const union AnimCmd gUnknown_085E4E1C[] = +{ + ANIMCMD_FRAME(104, 8), + ANIMCMD_END, +}; +static const union AnimCmd gUnknown_085E4E24[] = +{ + ANIMCMD_FRAME(112, 8), + ANIMCMD_END, +}; +static const union AnimCmd gUnknown_085E4E2C[] = +{ + ANIMCMD_FRAME(113, 8), + ANIMCMD_END, +}; +static const union AnimCmd gUnknown_085E4E34[] = +{ + ANIMCMD_FRAME(114, 8), + ANIMCMD_END, +}; +static const union AnimCmd gUnknown_085E4E3C[] = +{ + ANIMCMD_FRAME(115, 8), + ANIMCMD_END, +}; +static const union AnimCmd gUnknown_085E4E44[] = +{ + ANIMCMD_FRAME(116, 8), + ANIMCMD_END, +}; +static const union AnimCmd gUnknown_085E4E4C[] = +{ + ANIMCMD_FRAME(117, 8), + ANIMCMD_END, +}; +static const union AnimCmd gUnknown_085E4E54[] = +{ + ANIMCMD_FRAME(128, 8), + ANIMCMD_END, +}; +static const union AnimCmd *const gUnknown_085E4E5C[] = +{ + gUnknown_085E4DEC, + gUnknown_085E4DF4, + gUnknown_085E4DFC, + gUnknown_085E4E04, + gUnknown_085E4E0C, + gUnknown_085E4E14, + gUnknown_085E4E1C, +}; +static const union AnimCmd *const gUnknown_085E4E78[] = +{ + gUnknown_085E4E24, + gUnknown_085E4E2C, + gUnknown_085E4E34, + gUnknown_085E4E3C, + gUnknown_085E4E44, + gUnknown_085E4E4C, +}; +static const union AnimCmd *const gUnknown_085E4E90[] = +{ + gUnknown_085E4E54, +}; +static const s16 gUnknown_085E4E94[][2] = +{ + {0, -72}, + {1, -56}, + {2, -40}, + {3, -24}, + {4, 8}, + {5, 24}, + {3, 40}, + {1, 56}, + {6, 72}, + {0, -28}, + {1, -20}, + {2, -12}, + {3, -4}, + {2, 4}, + {4, 12}, + {5, 20}, + {3, 28}, +}; +static const union AffineAnimCmd gUnknown_085E4ED8[] = +{ + AFFINEANIMCMD_FRAME(128, 128, 0, 0), + AFFINEANIMCMD_END, +}; +static const union AffineAnimCmd gUnknown_085E4EE8[] = +{ + AFFINEANIMCMD_FRAME(128, 128, 0, 0), + AFFINEANIMCMD_FRAME(16, 16, 0, 16), + AFFINEANIMCMD_FRAME(-16, -16, 0, 8), + AFFINEANIMCMD_END, +}; +static const union AffineAnimCmd gUnknown_085E4F08[] = +{ + AFFINEANIMCMD_FRAME(256, 256, 0, 0), + AFFINEANIMCMD_FRAME(8, 8, 0, 48), + AFFINEANIMCMD_END, +}; +static const union AffineAnimCmd gUnknown_085E4F20[] = +{ + AFFINEANIMCMD_FRAME(256, 256, 0, 0), + AFFINEANIMCMD_FRAME(2, 2, 0, 48), + AFFINEANIMCMD_END, +}; +static const union AffineAnimCmd *const gUnknown_085E4F38[] = +{ + gUnknown_085E4ED8, + gUnknown_085E4EE8, + gUnknown_085E4F08, + gUnknown_085E4F20, +}; +static const u16 gUnknown_085E4F48[] = +{ + 0x100, 0xC0, 0x80, 0x40, 0x00, 0x40, 0x80, 0xC0, 0x100 +}; +static void sub_816FB38(struct Sprite *sprite); +static const struct SpriteTemplate gUnknown_085E4F5C = +{ + .tileTag = 2000, + .paletteTag = 2001, + .oam = &gUnknown_085E4DD4, + .anims = gUnknown_085E4E5C, + .images = NULL, + .affineAnims = gUnknown_085E4F38, + .callback = sub_816FB38, +}; +static const struct SpriteTemplate gUnknown_085E4F74 = +{ + .tileTag = 2000, + .paletteTag = 2001, + .oam = &gUnknown_085E4DDC, + .anims = gUnknown_085E4E78, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_816FB38, +}; +static void sub_816FD44(struct Sprite *sprite); +static const struct SpriteTemplate gUnknown_085E4F8C = +{ + .tileTag = 2000, + .paletteTag = 2001, + .oam = &gUnknown_085E4DE4, + .anims = gUnknown_085E4E90, + .images = NULL, + .affineAnims = gUnknown_085E4F38, + .callback = sub_816FD44, +}; +static const u8 gUnknown_085E4FA4[] = +{ + 0x00, 0x17, 0x17, 0x31, 0x3E, 0x24, 0x24, 0x0A, 0x0A +}; +static const struct OamData gUnknown_085E4FB0 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gUnknown_085E4FB8[] = +{ + ANIMCMD_FRAME(0, 10), + ANIMCMD_JUMP(0), +}; +static const union AnimCmd *const gUnknown_085E4FC0[] = +{ + gUnknown_085E4FB8, +}; +static void sub_816FEDC(struct Sprite *sprite); +static const struct SpriteTemplate gUnknown_085E4FC4 = +{ + .tileTag = 2002, + .paletteTag = 2002, + .oam = &gUnknown_085E4FB0, + .anims = gUnknown_085E4FC0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_816FEDC, +}; +static const struct CompressedSpriteSheet gUnknown_085E4FDC[] = +{ + {gIntroTiles, 0x1400, 2000}, + {NULL}, +}; +static const struct CompressedSpriteSheet gUnknown_085E4FEC[] = +{ + {gIntro1FlygonGfx, 0x400, 2002}, + {NULL}, +}; +static const struct SpritePalette gUnknown_085E4FFC[] = +{ + {gIntro1DropsPal, 2000}, + {gIntro1GFLogoPal, 2001}, + {gIntro1FlygonPalette, 2002}, + {NULL}, +}; +static const struct OamData gUnknown_085E501C = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gUnknown_085E5024[] = +{ + ANIMCMD_FRAME(16, 8), + ANIMCMD_END, +}; +static const union AnimCmd *const gUnknown_085E502C[] = +{ + gUnknown_085E5024, +}; +static void sub_8170040(struct Sprite *sprite); +static const struct SpriteTemplate gUnknown_085E5030 = +{ + .tileTag = 2003, + .paletteTag = 2003, + .oam = &gUnknown_085E501C, + .anims = gUnknown_085E502C, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_8170040, +}; +static const struct CompressedSpriteSheet gUnknown_085E5048[] = +{ + {gIntro3MiscTiles, 0xA00, 2003}, + {NULL}, +}; +static const struct SpritePalette gUnknown_085E5058[] = +{ + {gIntro3Misc1Palette, 2003}, + {NULL}, +}; + +// this file's functions +static void MainCB2_EndIntro(void); +static void Task_IntroLoadPart1Graphics(u8); +static u8 CreateWaterDrop(s16, s16, u16, u16, u16, u8); +static void Task_IntroFadeIn(u8); +static void intro_reset_and_hide_bgs(void); +static void Task_IntroWaterDrops(u8); +static void Task_IntroWaterDrops_1(u8); +static void Task_IntroWaterDrops_2(u8); +static void Task_IntroWaterDrops_3(u8); +static void Task_IntroScrollDownAndShowFlygon(u8); +static void Task_IntroWaitToSetupPart2(u8); +static void Task_IntroLoadPart2Graphics(u8); +static void Task_IntroStartBikeRide(u8); +static void Task_IntroHandleBikeAndFlygonMovement(u8); +static void Task_IntroWaitToSetupPart3(u8); +static void Task_IntroLoadPart3Graphics(u8); +static void Task_IntroSpinAndZoomPokeball(u8); +static void Task_IntroWaitToSetupPart3LegendsFight(u8); +static void Task_IntroLoadPart1Graphics3(u8); +static void Task_IntroLoadPart1Graphics4(u8); +static void Task_IntroLoadPart1Graphics5(u8); +static void Task_IntroLoadPart1Graphics6(u8); +static void Task_IntroLoadPart1Graphics7(u8); +static void Task_IntroLoadPart1Graphics8(u8); +static void Task_IntroLoadPart1Graphics9(u8); +static void Task_IntroFadeIn0(u8); +static void Task_IntroFadeIn1(u8); +static void Task_IntroFadeIn2(u8); +static void Task_IntroFadeIn3(u8); +static void Task_IntroFadeIn4(u8); +static void Task_IntroFadeIn5(u8); +static void Task_IntroFadeIn6(u8); +static void Task_IntroFadeIn7(u8); +static void Task_IntroFadeIn8(u8); +static void Task_IntroFadeIn9(u8); +static void sub_816E190(u8); +static void sub_816E1F8(struct Sprite *); +static void sub_816E6D4(u8); +static void sub_816E74C(void); +static void sub_816EEA8(u8); +static void sub_816F46C(struct Sprite *); +static void sub_816F5B4(struct Sprite *); +static void sub_816F660(struct Sprite *); +static void SpriteCB_WaterDropFall(struct Sprite *); +static void sub_816F318(struct Sprite *); +static void sub_816F9D4(struct Sprite *); +static void sub_816FAB0(struct Sprite *); +static u8 sub_816FDB8(s16, s16, s16); + +static void VBlankCB_Intro(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + ScanlineEffect_InitHBlankDmaTransfer(); +} + +static void MainCB2_Intro(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + if (gMain.newKeys && !gPaletteFade.active) + SetMainCallback2(MainCB2_EndIntro); + else if (gIntroFrameCounter != -1) + gIntroFrameCounter++; +} + +static void MainCB2_EndIntro(void) +{ + if (!UpdatePaletteFade()) + SetMainCallback2(CB2_InitTitleScreen); +} + +static void LoadCopyrightGraphics(u16 tilesetAddress, u16 tilemapAddress, u16 paletteAddress) +{ + LZ77UnCompVram(gIntroCopyright_Gfx, (void *)(VRAM + tilesetAddress)); + LZ77UnCompVram(gIntroCopyright_Tilemap, (void *)(VRAM + tilemapAddress)); + LoadPalette(gIntroCopyright_Pal, paletteAddress, 0x20); +} + +static void SerialCB_CopyrightScreen(void) +{ + GameCubeMultiBoot_HandleSerialInterrupt(&gMultibootProgramStruct); +} + +static u8 SetUpCopyrightScreen(void) +{ + u16 ime; + + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + *(u16 *)PLTT = 0x7FFF; + SetGpuReg(REG_OFFSET_DISPCNT, 0); + SetGpuReg(REG_OFFSET_BG0HOFS, 0); + SetGpuReg(REG_OFFSET_BG0VOFS, 0); + CpuFill32(0, (void *)VRAM, VRAM_SIZE); + CpuFill32(0, (void *)OAM, OAM_SIZE); + CpuFill16(0, (void *)(PLTT + 2), PLTT_SIZE - 2); + ResetPaletteFade(); + LoadCopyrightGraphics(0, 0x3800, 0); + ScanlineEffect_Stop(); + ResetTasks(); + ResetSpriteData(); + FreeAllSpritePalettes(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_WHITEALPHA); + SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) + | BGCNT_CHARBASE(0) + | BGCNT_SCREENBASE(7) + | BGCNT_16COLOR + | BGCNT_TXT256x256); + EnableInterrupts(INTR_FLAG_VBLANK); + SetVBlankCallback(VBlankCB_Intro); + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON; + SetSerialCallback(SerialCB_CopyrightScreen); + GameCubeMultiBoot_Init(&gMultibootProgramStruct); + default: + UpdatePaletteFade(); + gMain.state++; + GameCubeMultiBoot_Main(&gMultibootProgramStruct); + break; + case 140: + GameCubeMultiBoot_Main(&gMultibootProgramStruct); + if (gMultibootProgramStruct.gcmb_field_2 != 1) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + gMain.state++; + } + break; + case 141: + if (UpdatePaletteFade()) + break; + CreateTask(Task_IntroLoadPart1Graphics, 0); + SetMainCallback2(MainCB2_Intro); + if (gMultibootProgramStruct.gcmb_field_2 != 0) + { + if (gMultibootProgramStruct.gcmb_field_2 == 2) + { + // check the multiboot ROM header game code to see if we already did this + if (*(u32 *)(EWRAM_START + 0xAC) == 0x65366347) // "Gc6e" in ASCII + { + CpuCopy16(&gMultiBootProgram_PokemonColosseum_Start, (void *)EWRAM_START, sizeof(gMultiBootProgram_PokemonColosseum_Start)); + *(u32 *)(EWRAM_START + 0xAC) = 0x65366347; + } + GameCubeMultiBoot_ExecuteProgram(&gMultibootProgramStruct); + } + } + else + { + GameCubeMultiBoot_Quit(); + SetSerialCallback(SerialCB); + } + return 0; + } + + return 1; +} + +void CB2_InitCopyrightScreenAfterBootup(void) +{ + if (!SetUpCopyrightScreen()) + { + SetSaveBlocksPointers(sub_815355C()); + sub_808447C(); + Save_ResetSaveCounters(); + Save_LoadGameData(SAVE_NORMAL); + if (gSaveFileStatus == 0 || gSaveFileStatus == 2) + Sav2_ClearSetDefault(); + SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound); + InitHeap(gHeap, HEAP_SIZE); + } +} + +void CB2_InitCopyrightScreenAfterTitleScreen(void) +{ + SetUpCopyrightScreen(); +} + +static void Task_IntroLoadPart1Graphics(u8 taskId) +{ + SetVBlankCallback(NULL); + gUnknown_0203BCC8 = Random() & 1; + intro_reset_and_hide_bgs(); + SetGpuReg(REG_OFFSET_BG3VOFS, 0); + SetGpuReg(REG_OFFSET_BG2VOFS, 0x50); + SetGpuReg(REG_OFFSET_BG1VOFS, 0x18); + SetGpuReg(REG_OFFSET_BG0VOFS, 0x28); + LZ77UnCompVram(gIntro1BGLeavesGfx, (void *)VRAM); + LZ77UnCompVram(gIntro1BG0_Tilemap, (void *)(VRAM + 0x8000)); + DmaClear16(3, VRAM + 0x8800, 0x800); + LZ77UnCompVram(gIntro1BG1_Tilemap, (void *)(VRAM + 0x9000)); + DmaClear16(3, VRAM + 0x9800, 0x800); + LZ77UnCompVram(gIntro1BG2_Tilemap, (void *)(VRAM + 0xA000)); + DmaClear16(3, VRAM + 0xA800, 0x800); + LZ77UnCompVram(gIntro1BG3_Tilemap, (void *)(VRAM + 0xB000)); + DmaClear16(3, VRAM + 0xB800, 0x800); + LoadPalette(gIntro1BGPals, 0, sizeof(gIntro1BGPals)); + SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(22) | BGCNT_16COLOR | BGCNT_TXT256x512); + SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(20) | BGCNT_16COLOR | BGCNT_TXT256x512); + SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(18) | BGCNT_16COLOR | BGCNT_TXT256x512); + SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(16) | BGCNT_16COLOR | BGCNT_TXT256x512); + LoadCompressedObjectPic(gUnknown_085E4FDC); + LoadCompressedObjectPic(gUnknown_085E4FEC); + LoadSpritePalettes(gUnknown_085E4FFC); + LoadCompressedObjectPic(gUnknown_085E4A74); + LoadSpritePalettes(gUnknown_085E4A84); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1F0, 0x20); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1E1, 0x1E); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1D2, 0x1C); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1C3, 0x1A); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1B4, 0x18); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1A5, 0x16); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x196, 0x14); + sub_816FDB8(0x78, 0x50, 0); + gTasks[taskId].data[0] = CreateWaterDrop(236, -14, 0x200, 1, 0x78, FALSE); + gTasks[taskId].func = Task_IntroFadeIn; +} + +static void Task_IntroFadeIn(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + SetVBlankCallback(VBlankCB_Intro); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON); + gTasks[taskId].func = Task_IntroWaterDrops; + gIntroFrameCounter = 0; + m4aSongNumStart(MUS_DEMO1); + ResetSerial(); +} + +static void Task_IntroWaterDrops(u8 taskId) +{ + //start moving rock + if (gIntroFrameCounter == 76) + gSprites[gTasks[taskId].data[0]].data[0] = 1; + + if (gIntroFrameCounter == 128) + CreateTask(Task_IntroWaterDrops_1, 0); + + //drop rock + if (gIntroFrameCounter == 251) + gSprites[gTasks[taskId].data[0]].data[0] = 2; + + if (gIntroFrameCounter == 256) + CreateTask(Task_IntroWaterDrops_2, 0); + + if (gIntroFrameCounter == 368) + CreateWaterDrop(48, 0, 0x400, 5, 0x70, TRUE); + + if (gIntroFrameCounter == 384) + CreateWaterDrop(200, 60, 0x400, 9, 0x80, TRUE); + + if (gIntroFrameCounter == 560) + CreateTask(Task_IntroWaterDrops_3, 0); + + if (gIntroFrameCounter > 560) + { + gTasks[taskId].data[1] = 0x50; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0x18; + gTasks[taskId].data[4] = 0; + gTasks[taskId].data[5] = 0x28; + gTasks[taskId].data[6] = 0; + gTasks[taskId].func = Task_IntroScrollDownAndShowFlygon; + } +} + +static void Task_IntroWaterDrops_3(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + if (++data[2] & 1) + data[3]++; + + switch (data[0]) + { + case 0: + CreateSprite(&gUnknown_085E4AB8, gUnknown_085E4AD0[data[4]][0], gUnknown_085E4AD0[data[4]][1] + data[3], 0); + data[0]++; + data[1] = 0xC; + data[4]++; + break; + case 1: + if (!--data[1]) + data[0] = 0; + break; + } + + if (data[3] > 0x3C) + DestroyTask(taskId); +} + +static void sub_816D338(struct Sprite *sprite) +{ + if (++sprite->data[0] == 0xC) + DestroySprite(sprite); +} + +static void Task_IntroScrollDownAndShowFlygon(u8 taskId) +{ + if (gIntroFrameCounter < 904) + { + s32 r2; + + //slide backgrounds downward + r2 = (gTasks[taskId].data[1] << 16) + (u16)gTasks[taskId].data[2]; + r2 -= 0x6000; + gTasks[taskId].data[1] = r2 >> 16; + gTasks[taskId].data[2] = r2; + SetGpuReg(REG_OFFSET_BG2VOFS, gTasks[taskId].data[1]); + r2 = (gTasks[taskId].data[3] << 16) + (u16)gTasks[taskId].data[4]; + r2 -= 0x8000; + gTasks[taskId].data[3] = r2 >> 16; + gTasks[taskId].data[4] = r2; + SetGpuReg(REG_OFFSET_BG1VOFS, gTasks[taskId].data[3]); + r2 = (gTasks[taskId].data[5] << 16) + (u16)gTasks[taskId].data[6]; + r2 -= 0xC000; + gTasks[taskId].data[5] = r2 >> 16; + gTasks[taskId].data[6] = r2; + SetGpuReg(REG_OFFSET_BG0VOFS, gTasks[taskId].data[5]); + + //show Flygon sprite + if (gIntroFrameCounter == 832) + { + u8 spriteId = CreateSprite(&gUnknown_085E4FC4, 120, 160, 10); + gSprites[spriteId].invisible = TRUE; + } + } + else + { + //fade to white + if (gIntroFrameCounter > 1007) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_WHITEALPHA); + gTasks[taskId].func = Task_IntroWaitToSetupPart2; + } + } +} + +static void Task_IntroWaitToSetupPart2(u8 taskId) +{ + if (gIntroFrameCounter > 1026) + gTasks[taskId].func = Task_IntroLoadPart2Graphics; +} + +static void Task_IntroLoadPart2Graphics(u8 taskId) +{ + intro_reset_and_hide_bgs(); + SetVBlankCallback(NULL); + ResetSpriteData(); + FreeAllSpritePalettes(); + gUnknown_0203BD24 = 0; + gUnknown_0203BD26 = 0; + gUnknown_0203BCCC = 0; + load_intro_part2_graphics(1); + gTasks[taskId].func = Task_IntroStartBikeRide; +} + +static void Task_IntroStartBikeRide(u8 taskId) +{ + u8 spriteId; + + if (gUnknown_0203BCC8 == 0) + LoadCompressedObjectPic(gIntro2BrendanSpriteSheet); + else + LoadCompressedObjectPic(gIntro2MaySpriteSheet); + + LoadCompressedObjectPic(gIntro2BicycleSpriteSheet); + LoadCompressedObjectPic(gIntro2FlygonSpriteSheet); + + for (spriteId = 0; spriteId < 3; spriteId++) + { + LoadCompressedObjectPic(&gUnknown_085E4AE8[spriteId]); + } + + LoadSpritePalettes(gUnknown_085F530C); + LoadSpritePalettes(gUnknown_085E4B08); + CreateSprite(&gUnknown_085E4BDC, 0x110, 0x80, 0); + CreateSprite(&gUnknown_085E4BA4, 0x120, 0x6E, 1); + + if (gUnknown_0203BCC8 == 0) + spriteId = intro_create_brendan_sprite(0x110, 100); + else + spriteId = intro_create_may_sprite(0x110, 100); + + gSprites[spriteId].callback = sub_816F9D4; + gSprites[spriteId].anims = gUnknown_085E4DC4; + gTasks[taskId].data[1] = spriteId; + CreateSprite(&gUnknown_085E4B40, 0x110, 0x50, 0x4); + spriteId = intro_create_flygon_sprite(-0x40, 0x3C); + gSprites[spriteId].callback = sub_816FAB0; + gTasks[taskId].data[2] = spriteId; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_WHITEALPHA); + SetVBlankCallback(VBlankCB_Intro); + gTasks[taskId].data[0] = sub_817B3DC(1, 0x4000, 0x400, 0x10); + sub_817B150(1); + gTasks[taskId].func = Task_IntroHandleBikeAndFlygonMovement; +} + +static void Task_IntroHandleBikeAndFlygonMovement(u8 taskId) +{ + s16 a; + u16 sine; + + if (gIntroFrameCounter == 1856) + { + gUnknown_0203BD28 = 2; + DestroyTask(gTasks[taskId].data[0]); + } + if (gIntroFrameCounter > 1946) + { + BeginNormalPaletteFade(0xFFFFFFFF, 8, 0, 16, RGB_WHITEALPHA); + gTasks[taskId].func = Task_IntroWaitToSetupPart3; + } + if (gIntroFrameCounter == 1109) + gSprites[gTasks[taskId].data[1]].data[0] = 1; + if (gIntroFrameCounter == 1214) + gSprites[gTasks[taskId].data[1]].data[0] = 0; + if (gIntroFrameCounter == 1394) + gSprites[gTasks[taskId].data[2]].data[0] = 1; + if (gIntroFrameCounter == 1398) + gSprites[gTasks[taskId].data[1]].data[0] = 2; + if (gIntroFrameCounter == 1576) + gSprites[gTasks[taskId].data[1]].data[0] = 3; + if (gIntroFrameCounter == 1727) + gSprites[gTasks[taskId].data[1]].data[0] = 4; + + sine = Sin(gTasks[taskId].data[3] >> 2 & 0x7F, 48); + gUnknown_0203BCCC = sine; + if (gTasks[taskId].data[3] < 512) + gTasks[taskId].data[3]++; + sub_817B540(0); +} + +static void Task_IntroWaitToSetupPart3(u8 taskId) +{ + if (gIntroFrameCounter > 2068) + gTasks[taskId].func = Task_IntroLoadPart3Graphics; +} + +static void sub_816D81C(struct Sprite *sprite) +{ + sprite->data[3] += 4; + switch (sprite->data[0]) + { + case 0: + if (++sprite->data[1] < 180) + break; + ++sprite->data[0]; + case 1: + sprite->pos1.x -= 4; + if (sprite->pos1.x == 0x3C) + { + sprite->data[0] = 8; + sprite->data[1] = 20; + sprite->data[2] = 2; + } + break; + case 2: + sprite->pos1.x += 8; + sprite->pos1.y -= 2; + if (sprite->pos1.x == 0x7C) + { + sprite->data[0] = 8; + sprite->data[1] = 20; + sprite->data[2] = 3; + } + break; + case 3: + sprite->pos1.y += 4; + if (sprite->pos1.y == 0x50) + { + sprite->data[0] = 8; + sprite->data[1] = 10; + sprite->data[2] = 4; + } + break; + case 4: + sprite->pos1.x -= 8; + sprite->pos1.y -= 2; + if (sprite->pos1.x == 0x3C) + { + sprite->data[0] = 8; + sprite->data[1] = 10; + sprite->data[2] = 5; + } + break; + case 5: + sprite->pos1.x += 0x3C; + sprite->data[4] = 0xC0; + sprite->data[5] = 0x80; + sprite->data[6] = 0x3; + sprite->data[0]++; + case 6: + sprite->pos2.x = Sin((u8)sprite->data[4], 0x3C); + sprite->pos2.y = Sin((u8)sprite->data[5], 0x14); + sprite->data[4] += 2; + sprite->data[5] += 4; + if ((sprite->data[4] & 0xFF) == 0x40) + { + sprite->hFlip = FALSE; + if (!--sprite->data[6]) + { + sprite->pos1.x += sprite->pos2.x; + sprite->pos2.x = 0; + sprite->data[0]++; + } + } + break; + case 7: + sprite->pos1.x -= 2; + sprite->pos2.y = Sin((u8)sprite->data[5], 0x14); + sprite->data[5] += 4; + if (sprite->pos1.x < -16) + DestroySprite(sprite); + break; + case 8: + sprite->pos2.y = Cos((u8)sprite->data[3], 2); + if (!--sprite->data[1]) + sprite->data[0] = sprite->data[2]; + break; + } +} + +static void sub_816D9C0(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + if (gIntroFrameCounter == 1224) + { + StartSpriteAnim(sprite, 1); + sprite->data[0]++; + } + break; + case 1: + if (gIntroFrameCounter == 1576) + { + StartSpriteAnim(sprite, 0); + sprite->data[0]++; + } + else + { + sprite->data[1] += 0x40; + if (sprite->data[1] & 0xFF00) + { + sprite->pos1.x--; + sprite->data[1] &= 0xFF; + } + } + break; + case 2: + if (gIntroFrameCounter != 1735) + { + sprite->data[1] += 0x20; + if (sprite->data[1] & 0xFF00) + { + sprite->pos1.x++; + sprite->data[1] &= 0xFF; + } + } + else + { + StartSpriteAnim(sprite, 1); + sprite->data[0]++; + sprite->data[2] = 0x50; + } + break; + case 3: + if (--sprite->data[2]) + { + sprite->data[1] += 0x40; + if (sprite->data[1] & 0xFF00) + { + sprite->pos1.x--; + sprite->data[1] &= 0xFF; + } + } + else + { + StartSpriteAnim(sprite, 2); + sprite->data[0]++; + } + break; + case 4: + if (sprite->animEnded) + sprite->pos1.x += 4; + + if (sprite->pos1.x > 336) + { + StartSpriteAnim(sprite, 1); + sprite->data[0]++; + } + break; + case 5: + if (gIntroFrameCounter > 1855) + sprite->pos1.x -= 2; + break; + } +} + +static void sub_816DAE8(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + if (gIntroFrameCounter == 1088) + sprite->data[0]++; + break; + case 1: + sprite->pos1.x -= 2; + if (gIntroFrameCounter != 1168) + break; + sprite->pos1.y -= 12; + sprite->data[1] = 0x80; + sprite->data[2] = 0; + sprite->data[0]++; + case 2: + if (sprite->pos1.x + sprite->pos2.x <= -0x20) + { + DestroySprite(sprite); + } + else + { + if ((sprite->data[1] & 0xFF) < 0x40) + { + sprite->pos2.x = Sin((u8)sprite->data[1], 0x10); + } + else + { + if ((sprite->data[1] & 0xFF) == 0x40) + sprite->pos1.x -= 0x30; + sprite->pos2.x = Sin((u8)sprite->data[1], 0x40); + } + sprite->data[1]++; + sprite->pos2.y = Cos((u8)sprite->data[2], 0xC); + sprite->data[2]++; + } + break; + } +} + +static void Task_IntroLoadPart3Graphics(u8 taskId) +{ + intro_reset_and_hide_bgs(); + LZ77UnCompVram(gIntro3Pokeball_Gfx, (void *)VRAM); + LZ77UnCompVram(gIntro3Pokeball_Tilemap, (void *)(VRAM + 0x4000)); + LoadPalette(gIntro3PokeballPal, 0, 0x200); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + sub_816F2A8(0x78, 0x50, 0, 0); + ResetSpriteData(); + FreeAllSpritePalettes(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_WHITEALPHA); + SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(8) | BGCNT_256COLOR | BGCNT_AFF256x256); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); + gTasks[taskId].func = Task_IntroSpinAndZoomPokeball; + gIntroFrameCounter = 0; + m4aSongNumStart(MUS_T_BATTLE); +} + +static void Task_IntroSpinAndZoomPokeball(u8 taskId) +{ + gTasks[taskId].data[0] += 0x400; + + if (gTasks[taskId].data[1] <= 0x6BF) + { + gTasks[taskId].data[1] += gTasks[taskId].data[2]; + gTasks[taskId].data[2] += 2; + } + else + { + gTasks[taskId].func = Task_IntroWaitToSetupPart3LegendsFight; + } + + sub_816F2A8(0x78, 0x50, 0x10000 / gTasks[taskId].data[1], gTasks[taskId].data[0]); + + if (gIntroFrameCounter == 28) + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_WHITEALPHA); +} + +static void Task_IntroWaitToSetupPart3LegendsFight(u8 taskId) +{ + if (gIntroFrameCounter > 43) + gTasks[taskId].func = Task_IntroLoadPart1Graphics3; +} + +static void Task_IntroLoadPart1Graphics3(u8 taskId) +{ + u16 i; + + if (!gPaletteFade.active) + { + intro_reset_and_hide_bgs(); + ResetSpriteData(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 8; + LZDecompressVram(gIntro3GroudonGfx, (void *)VRAM); + LZDecompressVram(gIntro3GroudonTilemap, (void *)(VRAM + 0xC000)); + LZDecompressVram(gIntro3LegendBgGfx, (void *)(VRAM + 0x4000)); + LZDecompressVram(gIntro3GroudonBgTilemap, (void *)(VRAM + 0xE000)); + LoadCompressedObjectPicUsingHeap(&gBattleAnimPicTable[0x3A]); + LoadCompressedObjectPaletteUsingHeap(&gBattleAnimPaletteTable[0x3A]); + CpuCopy16(gIntro3BgPal, gPlttBufferUnfaded, sizeof(gIntro3BgPal)); + gTasks[taskId].func = Task_IntroLoadPart1Graphics4; + } +} + +static void Task_IntroLoadPart1Graphics4(u8 taskId) +{ + SetGpuReg(REG_OFFSET_WIN0H, 0xF0); + SetGpuReg(REG_OFFSET_WIN0V, 0xA0); + SetGpuReg(REG_OFFSET_WININ, 0x3F); + SetGpuReg(REG_OFFSET_WINOUT, 0); + SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) + | BGCNT_CHARBASE(0) + | BGCNT_SCREENBASE(24) + | BGCNT_256COLOR + | BGCNT_WRAP + | BGCNT_AFF512x512); + SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1) + | BGCNT_CHARBASE(1) + | BGCNT_SCREENBASE(28) + | BGCNT_16COLOR + | BGCNT_TXT256x256); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 + | DISPCNT_OBJ_1D_MAP + | DISPCNT_BG1_ON + | DISPCNT_BG2_ON + | DISPCNT_OBJ_ON + | DISPCNT_WIN0_ON); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_WHITEALPHA); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0xFFA0; + gTasks[taskId].data[2] = 0xFF51; + gTasks[taskId].data[3] = 0x100; + sub_816F2A8(0xFFA0, 0xFF51, 0x100, 0); + gTasks[taskId].func = Task_IntroLoadPart1Graphics5; +} + +static void Task_IntroLoadPart1Graphics5(u8 taskId) +{ + u16 foo = gTasks[taskId].data[0]; + + if (gTasks[taskId].data[0] != 32) + { + gTasks[taskId].data[0] += 4; + SetGpuReg(REG_OFFSET_WIN0V, (gTasks[taskId].data[0] * 256) - (foo -= 0x9C)); + } + else + { + SetGpuReg(REG_OFFSET_WIN0V, 0x2080); + gTasks[taskId].func = Task_IntroLoadPart1Graphics6; + } +} + +static void Task_IntroLoadPart1Graphics6(u8 taskId) +{ + gTasks[taskId].func = Task_IntroLoadPart1Graphics7; +} + +static void Task_IntroLoadPart1Graphics7(u8 taskId) +{ + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = Task_IntroLoadPart1Graphics8; + ScanlineEffect_InitWave(0, 0xA0, 0x4, 4, 1, 4, 0); +} + +static void Task_IntroLoadPart1Graphics8(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + data[5]++; + if ((u16)(data[0] - 1) < 7 && data[5] % 2 == 0) + data[4] ^= 3; + sub_816F2A8(data[1], data[2] + data[4], data[3], 0); + switch (data[0]) + { + case 0: + data[1] += 0x10; + if (data[1] == 0xA0) + { + data[0]++; + data[6] = 2; + data[7] = 0x1E2; + sub_816E190(taskId); + } + break; + case 1: + if (--data[6] == 0) + { + data[6] = 2; + CpuCopy16(&gIntro3BgPal[data[7]], &gPlttBufferFaded[31], sizeof(u16)); + data[7] += 2; + if (data[7] == 0x1EC) + data[0]++; + } + break; + case 2: + if (--data[6] == 0) + { + data[6] = 2; + data[0]++; + } + break; + case 3: + if (--data[6] == 0) + { + data[6] = 2; + CpuCopy16(&gIntro3BgPal[data[7]], &gPlttBufferFaded[31], sizeof(u16)); + data[7] -= 2; + if (data[7] == 0x1E0) + { + data[6] = 8; + data[0]++; + } + } + break; + case 4: + if (--data[6] == 0) + { + data[1] = -0x60; + data[2] = 0xA9; + data[6] = 3; + data[0]++; + } + break; + case 5: + if (--data[6] == 0) + { + data[1] = 0x50; + data[2] = 0x29; + data[6] = 0x10; + PlayCryInternal(SPECIES_GROUDON, 0, 100, 10, 0); + data[0]++; + } + break; + case 6: + if (--data[6] == 0) + { + data[1] = 0x50; + data[2] = 0x28; + data[0]++; + } + break; + case 7: + data[1] += 4; + data[2] += 4; + data[6] += 0x666; + data[3] = Sin((data[6] & 0xFF00) >> 8, 0x40) + 0x100; + if (data[1] == 0x78) + { + BeginNormalPaletteFade(0xFFFFFFFE, 3, 0, 16, RGB_WHITE); + data[3] = 0x100; + data[4] = 0; + data[0]++; + } + break; + case 8: + if (data[3]) + data[3] -= 8; + else + data[0]++; + break; + case 9: + if (!gPaletteFade.active) + { + gTasks[taskId].func = Task_IntroLoadPart1Graphics9; + gScanlineEffect.state = 3; + } + break; + } +} + +static void sub_816E190(u8 a0) +{ + int i; + u8 spriteId; + + for (i = 0; i < 6; i++) + { + spriteId = CreateSprite(gUnknown_08596C10, gUnknown_085E4C64[i][0], 0xA0, i); + gSprites[spriteId].callback = sub_816E1F8; + gSprites[spriteId].oam.priority = 0; + gSprites[spriteId].data[1] = i; + gSprites[spriteId].data[4] = a0; + StartSpriteAnim(&gSprites[spriteId], gUnknown_085E4C64[i][1]); + } +} + +static void sub_816E1F8(struct Sprite *sprite) +{ + sprite->data[3]++; + if (sprite->data[3] % 2 == 0) + sprite->pos2.y ^= 3; + + switch(sprite->data[0]) + { + case 0: + sprite->data[2] += gUnknown_085E4C64[sprite->data[1]][2]; + sprite->pos1.y -= (sprite->data[2] & 0xFF00) >> 8; + sprite->data[2] &= 0xFF; + if (gTasks[sprite->data[4]].data[0] > 7) + sprite->data[0]++; + break; + case 1: + if (sprite->pos1.x < 0x78) + sprite->pos1.x -= 2; + else + sprite->pos1.x += 2; + + if (sprite->pos1.y < 0x50) + sprite->pos1.y -= 2; + else + sprite->pos1.y += 2; + break; + } +} + +static void Task_IntroLoadPart1Graphics9(u8 taskId) +{ + ResetSpriteData(); + LZDecompressVram(gIntro3KyogreGfx, (void *)VRAM); + LZDecompressVram(gIntro3KyogreTilemap, (void *)(VRAM + 0xC000)); + LZDecompressVram(gIntro3KyogreBgTilemap, (void *)(VRAM + 0xE000)); + LoadCompressedObjectPic(gUnknown_085E4C88); + LoadSpritePalette(gUnknown_085E4C98); + BeginNormalPaletteFade(0xFFFFFFFE, 0, 0x10, 0, RGB_WHITEALPHA); + gTasks[taskId].func = Task_IntroFadeIn0; + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0x150; + gTasks[taskId].data[2] = 0x50; + gTasks[taskId].data[6] = 0x10; + gTasks[taskId].data[3] = 0x100; + sub_816F2A8(0x150, 0x50, 0x100, 0); + ScanlineEffect_InitWave(0, 0xA0, 4, 4, 1, 6, 0); +} + +static void Task_IntroFadeIn0(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + sub_816F2A8(data[1], data[2], data[3], 0); + + switch (data[0]) + { + case 0: + if (--data[6] != 0) + break; + data[0]++; + case 1: + data[6] += 4; + gTasks[taskId].data[1] = 0x158 - Sin(data[6], 0x100); + gTasks[taskId].data[2] = 0x54 - Cos(data[6], 0x40); + if (data[6] == 0x40) + { + data[6] = 0x19; + data[7] = 1; + data[0]++; + sub_816E6D4(0); + } + break; + case 2: + if (--data[6] == 0) + { + gTasks[taskId].data[1] += 0x100; + gTasks[taskId].data[2] -= 0x102; + data[6] = 8; + data[0]++; + sub_816E6D4(0); + sub_816E74C(); + } + break; + case 3: + if (--data[6] == 0) + { + gTasks[taskId].data[1] -= 0x100; + gTasks[taskId].data[2] += 0x102; + data[6] = 8; + data[0]++; + } + break; + case 4: + if (--data[6] == 0) + { + gTasks[taskId].data[2] -= 0xFC; + data[6] = 8; + data[0]++; + } + break; + case 5: + if (--data[6] == 0) + { + gTasks[taskId].data[2] += 0xFC; + if (data[7] != 0) + { + data[6] = 12; + data[7]--; + data[0] = 2; + } + else + { + data[6] = 1; + data[0]++; + PlayCryInternal(SPECIES_KYOGRE, 0, 120, 10, 0); + } + } + break; + case 6: + if (--data[6] == 0) + { + data[6] = 4; + data[7] = 0x1EA; + data[0]++; + } + break; + case 7: + if (--data[6] == 0) + { + data[6] = 4; + CpuCopy16(&gIntro3BgPal[data[7]], &gPlttBufferFaded[47], sizeof(u16)); + data[7] -= 2; + if (data[7] == 0x1E0) + data[0]++; + } + break; + case 8: + if (--data[6] == 0) + { + data[6] = 4; + data[7] = 0x1E2; + data[0]++; + } + break; + case 9: + if (--data[6] == 0) + { + data[6] = 4; + CpuCopy16(&gIntro3BgPal[data[7]], &gPlttBufferFaded[47], sizeof(u16)); + data[7] += 2; + if (data[7] == 0x1EE) + { + data[6] = 0x10; + data[0]++; + } + } + break; + case 10: + if (--data[6] == 0) + { + data[6] = 0; + data[0]++; + sub_816E6D4(taskId); + } + break; + case 11: + data[6] += 4; + data[3] -= 8; + gTasks[taskId].data[1] = Sin(data[6], 0x3C) + 0x58; + if (data[6] == 0x40) + { + BeginNormalPaletteFade(0xFFFFFFFE, 3, 0, 16, RGB_WHITE); + data[0]++; + } + break; + case 12: + data[6] += 4; + data[3] -= 8; + gTasks[taskId].data[1] = Sin(data[6], 0x14) + 0x80; + if (data[6] == 0x80) + data[0]++; + break; + case 13: + if (!gPaletteFade.active) + { + gTasks[taskId].func = Task_IntroFadeIn1; + gScanlineEffect.state = 3; + } + break; + } +} + +static void sub_816E6D4(u8 a0) +{ + int i; + u8 spriteId; + + for (i = 0; i < 6; i++) + { + spriteId = CreateSprite(&gUnknown_085E4D14, gUnknown_085E4CA8[i][0], gUnknown_085E4CA8[i][1], i); + gSprites[spriteId].invisible = TRUE; + gSprites[spriteId].data[5] = a0; + gSprites[spriteId].data[6] = gUnknown_085E4CA8[i][2]; + gSprites[spriteId].data[7] = 0x40; + } +} + +static void sub_816E74C(void) +{ + int i; + u8 spriteId; + + for (i = 0; i < 6; i++) + { + spriteId = CreateSprite(&gUnknown_085E4D14, gUnknown_085E4CA8[i + 6][0], gUnknown_085E4CA8[i + 6][1], i); + gSprites[spriteId].invisible = TRUE; + gSprites[spriteId].data[6] = gUnknown_085E4CA8[i][2]; + gSprites[spriteId].data[7] = 0x40; + } +} + +static void sub_816E7B4(struct Sprite *sprite) +{ + switch(sprite->data[0]) + { + case 0: + if (sprite->data[6] == 0) + { + sprite->data[1] = (sprite->data[1] + 11) & 0xFF; + sprite->pos2.x = Sin(sprite->data[1], 4); + sprite->data[2] += 0x30; + sprite->pos2.y = -(sprite->data[2] >> 8); + if (sprite->animEnded) + DestroySprite(sprite); + } + else if (--sprite->data[6] == 0) + { + StartSpriteAnim(sprite, 0); + sprite->invisible = FALSE; + } + if (gTasks[sprite->data[5]].data[0] > 11) + sprite->data[0]++; + break; + case 1: + if (sprite->pos1.x < 120) + sprite->pos1.x -= 3; + else + sprite->pos1.x += 3; + + if (sprite->pos1.y < 80) + sprite->pos1.y -= 3; + else + sprite->pos1.y += 3; + if ((u16)(sprite->pos1.y - 20) > 140) + DestroySprite(sprite); + break; + } +} + +static void Task_IntroFadeIn1(u8 taskId) +{ + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 + | BLDCNT_TGT1_BG1 + | BLDCNT_TGT1_BG2 + | BLDCNT_EFFECT_LIGHTEN); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(31, 31)); + SetGpuReg(REG_OFFSET_BLDY, 31); + SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) + | BGCNT_CHARBASE(0) + | BGCNT_SCREENBASE(24) + | BGCNT_16COLOR + | BGCNT_TXT512x256); + SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) + | BGCNT_CHARBASE(1) + | BGCNT_SCREENBASE(26) + | BGCNT_16COLOR + | BGCNT_TXT512x256); + SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) + | BGCNT_CHARBASE(1) + | BGCNT_SCREENBASE(28) + | BGCNT_16COLOR + | BGCNT_TXT256x256); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 + | DISPCNT_OBJ_1D_MAP + | DISPCNT_BG0_ON + | DISPCNT_BG1_ON + | DISPCNT_BG2_ON + | DISPCNT_OBJ_ON + | DISPCNT_WIN0_ON); + SetGpuReg(REG_OFFSET_BG0HOFS, 80); + SetGpuReg(REG_OFFSET_BG0VOFS, 0); + SetGpuReg(REG_OFFSET_BG1HOFS, -80); + SetGpuReg(REG_OFFSET_BG1VOFS, 0); + SetGpuReg(REG_OFFSET_BG2HOFS, 0); + SetGpuReg(REG_OFFSET_BG2VOFS, 0); + LZDecompressVram(gIntro3CloudsGfx, (void *)VRAM); + LZDecompressVram(gIntro3CloudsGfx, (void *)(VRAM + 0x4000)); + LZDecompressVram(gIntro3Clouds3Tilemap, (void *)(VRAM + 0xE000)); + gTasks[taskId].func = Task_IntroFadeIn2; +} + +static void Task_IntroFadeIn2(u8 taskId) +{ + LZDecompressVram(gIntro3Clouds1Tilemap, (void *)(VRAM + 0xC000)); + LZDecompressVram(gIntro3Clouds2Tilemap, (void *)(VRAM + 0xD000)); + gTasks[taskId].func = Task_IntroFadeIn3; +} + +static void Task_IntroFadeIn3(u8 taskId) +{ + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + gTasks[taskId].func = Task_IntroFadeIn4; + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[6] = 16; +} + +static void Task_IntroFadeIn4(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + SetGpuReg(REG_OFFSET_BG0HOFS, (data[6] >> 8)); + SetGpuReg(REG_OFFSET_BG1HOFS, -(data[6] >> 8)); + + switch (data[0]) + { + case 0: + if (--data[6] == 0) + { + BeginNormalPaletteFade(0xFFFFFFFE, 0, 16, 0, RGB_WHITEALPHA); + data[6] = 0x5000; + data[0]++; + } + break; + case 1: + if (data[6] == 0x2800) + BeginNormalPaletteFade(0x0000FFFE, 3, 0, 16, RGB(9, 10, 10)); + + if (data[6] != 0) + data[6] -= 0x80; + else if (!gPaletteFade.active) + gTasks[taskId].func = Task_IntroFadeIn5; + break; + } +} + +static void Task_IntroFadeIn5(u8 taskId) +{ + LZDecompressVram(gIntro3RayquazaTilemap, (void *)(VRAM + 0xE000)); + LZDecompressVram(gIntro3Clouds4Tilemap, (void *)(VRAM + 0xC000)); + LZDecompressVram(gIntro3RayquazaGfx, (void *)(VRAM + 0x4000)); + LZDecompressVram(gIntro3Clouds2Gfx, (void *)VRAM); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 + | DISPCNT_OBJ_1D_MAP + | DISPCNT_BG0_ON + | DISPCNT_BG2_ON + | DISPCNT_OBJ_ON + | DISPCNT_WIN0_ON); + gTasks[taskId].func = Task_IntroFadeIn6; + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[6] = 1; + gTasks[taskId].data[7] = 0; + LoadCompressedObjectPicUsingHeap(gUnknown_085E4BF4); + LoadSpritePalettes(gUnknown_085E4C04); +} + +static void Task_IntroFadeIn6(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + u8 spriteId; + + switch (data[0]) + { + case 0: + if (--data[6] == 0) + { + CreateSprite(&gUnknown_085E4C4C, 200, 48, 0); + spriteId = CreateSprite(&gUnknown_085E4C4C, 200, 80, 1); + StartSpriteAnim(&gSprites[spriteId], 1); + spriteId = CreateSprite(&gUnknown_085E4C4C, 200, 112, 2); + StartSpriteAnim(&gSprites[spriteId], 2); + data[0]++; + data[6] = 72; + } + break; + case 1: + if (--data[6] == 0) + { + CreateSprite(&gUnknown_085E4C4C, 40, 48, 0); + spriteId = CreateSprite(&gUnknown_085E4C4C, 40, 80, 1); + StartSpriteAnim(&gSprites[spriteId], 1); + spriteId = CreateSprite(&gUnknown_085E4C4C, 40, 112, 2); + StartSpriteAnim(&gSprites[spriteId], 2); + data[0]++; + data[6] = 48; + } + break; + case 2: + if (--data[6] == 0) + gTasks[taskId].func = Task_IntroFadeIn7; + break; + } +} + +static void sub_816EC6C(struct Sprite *sprite) +{ + if (sprite->animEnded) + sprite->invisible = TRUE; + + switch(sprite->data[0]) + { + case 0: + sprite->data[1] = 0x1C2; + sprite->data[0]++; + case 1: + CpuCopy16(&gIntro3BgPal[sprite->data[1]], &gPlttBufferFaded[93], 2); + sprite->data[1] += 2; + if (sprite->data[1] != 0x1CE) + break; + sprite->data[1] = 0x1CC; + sprite->data[2] = 4; + sprite->data[0]++; + case 2: + if (--sprite->data[2] == 0) + { + sprite->data[2] = 4; + CpuCopy16(&gIntro3BgPal[sprite->data[1]], &gPlttBufferFaded[93], 2); + sprite->data[1] -= 2; + if (sprite->data[1] == 0x1C0) + DestroySprite(sprite); + } + break; + } +} + +static void Task_IntroFadeIn7(u8 taskId) +{ + u8 newTaskId; + + LoadCompressedObjectPic(gUnknown_085E5048); + LoadSpritePalettes(gUnknown_085E5058); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 + | DISPCNT_OBJ_1D_MAP + | DISPCNT_BG0_ON + | DISPCNT_BG2_ON + | DISPCNT_OBJ_ON + | DISPCNT_WIN0_ON); + gTasks[taskId].func = Task_IntroFadeIn8; + BeginNormalPaletteFade(0x0000FFDE, 0, 16, 0, RGB(9, 10, 10)); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0xA8; + gTasks[taskId].data[2] = -0x10; + gTasks[taskId].data[3] = -0x88; + gTasks[taskId].data[4] = -0x10; + newTaskId = CreateTask(sub_816EEA8, 0); + gTasks[newTaskId].data[4] = taskId; +} + +static void Task_IntroFadeIn8(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + if (data[7] % 2 == 0) + data[6] ^= 2; + + data[7]++; + + switch(data[0]) + { + case 0: + if ((data[7] & 1) != 0) + { + data[1] -= 2; + data[2]++; + data[3] += 2; + data[4]++; + } + if (data[1] == 0x68) + { + data[0]++; + data[5] = 1; + } + break; + case 1: + data[0]++; + data[5] = 4; + break; + case 2: + data[1] += 4; + data[2] -= 2; + data[3] -= 4; + data[4] -= 2; + if (!gPaletteFade.active) + { + data[5] = 0x8C; + data[0]++; + } + break; + case 3: + if (--data[5] == 0) + gTasks[taskId].func = Task_IntroFadeIn9; + break; + } +} + +static void Task_IntroFadeIn9(u8 taskId) +{ + DestroyTask(taskId); + SetMainCallback2(MainCB2_EndIntro); +} + +static void sub_816EEA8(u8 taskId) +{ + u8 spriteId; + s16 *data = gTasks[taskId].data; + + data[2]++; + + switch(data[0]) + { + case 0: + if ((data[2] & 1) != 0) + { + CpuCopy16(&gIntro3BgPal[0x1A2 + data[1] * 2], &gPlttBufferFaded[94], 2); + data[1]++; + } + if (data[1] == 6) + { + data[0]++; + data[1] = 0; + data[3] = 10; + } + break; + case 1: + if (data[3] == 0) + { + if ((data[2] & 1) != 0) + { + CpuCopy16(&gIntro3BgPal[0x1A2 + data[1] * 2], &gPlttBufferFaded[88], 2); + data[1]++; + } + if (data[1] == 6) + { + data[0]++; + data[3] = 10; + } + } + else + { + data[3]--; + } + break; + case 2: + if (data[3] == 0) + { + if ((data[2] & 1) != 0) + { + CpuCopy16(&gIntro3BgPal[0x182 + data[1] * 2], &gPlttBufferFaded[92], 2); + data[1]++; + } + if (data[1] == 6) + { + spriteId = CreateSprite(&gUnknown_085E5030, 120, 88, 15); + PlaySE(SE_OP_BASYU); + gSprites[spriteId].invisible = TRUE; + gSprites[spriteId].data[3] = data[4]; + data[0]++; + data[3] = 16; + } + } + else + { + data[3]--; + } + break; + case 3: + if ((data[2] & 1) != 0) + { + if (--data[3] != 0) + { + BlendPalette(0x50, 16, data[3], RGB(9, 10, 10)); + CpuCopy16(&gIntro3BgPal[0x1AC], &gPlttBufferFaded[94], 2); + CpuCopy16(&gIntro3BgPal[0x1AC], &gPlttBufferFaded[88], 2); + CpuCopy16(&gIntro3BgPal[0x18C], &gPlttBufferFaded[92], 2); + } + else + { + data[0]++; + data[3] = 53; + } + } + break; + case 4: + if (--data[3] == 0) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_WHITE); + data[0]++; + } + break; + case 5: + if (!gPaletteFade.active) + DestroyTask(taskId); + break; + } +} + +static void intro_reset_and_hide_bgs(void) +{ + SetGpuReg(REG_OFFSET_DISPCNT, 0); + SetGpuReg(REG_OFFSET_BG3HOFS, 0); + SetGpuReg(REG_OFFSET_BG3VOFS, 0); + SetGpuReg(REG_OFFSET_BG2HOFS, 0); + SetGpuReg(REG_OFFSET_BG2VOFS, 0); + SetGpuReg(REG_OFFSET_BG1HOFS, 0); + SetGpuReg(REG_OFFSET_BG1VOFS, 0); + SetGpuReg(REG_OFFSET_BG0HOFS, 0); + SetGpuReg(REG_OFFSET_BG0VOFS, 0); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); +} + +static void Task_IntroWaterDrops_1(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + default: + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND + | BLDCNT_TGT2_BG0 + | BLDCNT_TGT2_BG1 + | BLDCNT_TGT2_BG2 + | BLDCNT_TGT2_BG3 + | BLDCNT_TGT2_OBJ + | BLDCNT_TGT2_BD); + SetGpuReg(REG_OFFSET_BLDALPHA, gUnknown_0853FF70[31]); + SetGpuReg(REG_OFFSET_BLDY, 0); + gTasks[taskId].data[1] = 0x40; + gTasks[taskId].data[0]++; + break; + case 1: + if (gTasks[taskId].data[1] != 0) + { + u8 tmp; + + gTasks[taskId].data[1]--; + tmp = gTasks[taskId].data[1] / 2; + SetGpuReg(REG_OFFSET_BLDALPHA, gUnknown_0853FF70[tmp]); + } + else + { + SetGpuReg(REG_OFFSET_BLDALPHA, gUnknown_0853FF70[0]); + gTasks[taskId].data[1] = 0x10; + gTasks[taskId].data[0]++; + } + break; + case 2: + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + DestroyTask(taskId); + break; + } +} + +static void Task_IntroWaterDrops_2(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + default: + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND + | BLDCNT_TGT2_BG0 + | BLDCNT_TGT2_BG1 + | BLDCNT_TGT2_BG2 + | BLDCNT_TGT2_BG3 + | BLDCNT_TGT2_OBJ + | BLDCNT_TGT2_BD); + SetGpuReg(REG_OFFSET_BLDALPHA, gUnknown_0853FF70[0]); + SetGpuReg(REG_OFFSET_BLDY, 0); + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[0]++; + break; + case 1: + if (gTasks[taskId].data[1] < 62) + { + u8 tmp; + + gTasks[taskId].data[1]++; + tmp = gTasks[taskId].data[1] / 2; + SetGpuReg(REG_OFFSET_BLDALPHA, gUnknown_0853FF70[tmp]); + } + else + { + SetGpuReg(REG_OFFSET_BLDALPHA, gUnknown_0853FF70[31]); + gTasks[taskId].data[1] = 0x10; + gTasks[taskId].data[0]++; + } + break; + case 2: + if (gTasks[taskId].data[1] != 0) + { + gTasks[taskId].data[1]--; + } + else + { + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + DestroyTask(taskId); + } + break; + } +} + +void sub_816F2A8(u16 scrX, u16 scrY, u16 zoom, u16 alpha) +{ + struct BgAffineSrcData src; + struct BgAffineDstData dest; + + src.texX = 0x8000; + src.texY = 0x8000; + src.scrX = scrX; + src.scrY = scrY; + src.sx = zoom; + src.sy = zoom; + src.alpha = alpha; + BgAffineSet(&src, &dest, 1); + SetGpuReg(REG_OFFSET_BG2PA, dest.pa); + SetGpuReg(REG_OFFSET_BG2PB, dest.pb); + SetGpuReg(REG_OFFSET_BG2PC, dest.pc); + SetGpuReg(REG_OFFSET_BG2PD, dest.pd); + SetGpuReg(REG_OFFSET_BG2X_L, dest.dx); + SetGpuReg(REG_OFFSET_BG2X_H, dest.dx >> 16); + SetGpuReg(REG_OFFSET_BG2Y_L, dest.dy); + SetGpuReg(REG_OFFSET_BG2Y_H, dest.dy >> 16); +} + +static void sub_816F318(struct Sprite *sprite) +{ + u8 r0; + + if (sprite->data[2] >= 192) + { + if (sprite->data[3] != 0) + { + sprite->data[3]--; + } + else + { + sprite->invisible = FALSE; + SetOamMatrix(sprite->data[1], sprite->data[2], 0, 0, sprite->data[2]); + sprite->data[2] = (sprite->data[2] * 95) / 100; + r0 = (sprite->data[2] - 192) / 128 + 9; + if (r0 > 15) + r0 = 15; + sprite->oam.paletteNum = r0; + } + } + else + { + DestroySprite(sprite); + } +} + +static void sub_816F3A4(struct Sprite *sprite) +{ + if (gSprites[sprite->data[7]].data[7] != 0) + { + sprite->invisible = TRUE; + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + StartSpriteAnim(sprite, 3); + sprite->data[2] = 1024; + sprite->data[3] = 8 * (sprite->data[1] & 3); + sprite->callback = sub_816F318; + sprite->oam.shape = 1; + sprite->oam.size = 3; + CalcCenterToCornerVec(sprite, 1, 3, 2); + } + else + { + sprite->pos2.x = gSprites[sprite->data[7]].pos2.x; + sprite->pos2.y = gSprites[sprite->data[7]].pos2.y; + sprite->pos1.x = gSprites[sprite->data[7]].pos1.x; + sprite->pos1.y = gSprites[sprite->data[7]].pos1.y; + } +} + +static void sub_816F454(struct Sprite *sprite) +{ + if (sprite->data[0] != 0) + sprite->callback = sub_816F46C; +} + +static void sub_816F46C(struct Sprite *sprite) +{ + if (sprite->pos1.x <= 116) + { + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.y = 0; + sprite->pos1.x += 4; + sprite->pos2.x = -4; + sprite->data[4] = 128; + sprite->callback = sub_816F5B4; + } + else + { + u16 data2; + u16 data3; + u16 data4; + s16 sin1; + s16 sin2; + s16 sin3; + s16 sin4; + s16 var1; + s16 var2; + s16 var3; + s16 var4; + s16 temp; + + data4 = sprite->data[4]; + sin1 = gSineTable[(u8)data4]; + sin2 = gSineTable[(u8)(data4 + 64)]; + sprite->data[4] += 2; + sprite->pos2.y = sin1 / 32; + sprite->pos1.x--; + if (sprite->pos1.x & 1) + sprite->pos1.y++; + temp = -sin2 / 16; + data2 = sprite->data[2]; + data3 = sprite->data[3]; + sin3 = gSineTable[(u8)(temp - 16)]; + sin4 = gSineTable[(u8)(temp + 48)]; + var1 = sin4 * data2 / 256; + var2 = -sin3 * data3 / 256; + var3 = sin3 * data2 / 256; + var4 = sin4 * data3 / 256; + SetOamMatrix(sprite->data[1], data2, 0, 0, data3); + SetOamMatrix(sprite->data[1] + 1, var1, var3, var2, var4); + SetOamMatrix(sprite->data[1] + 2, var1, var3, var2 * 2, var4 * 2); + } +} + +static void sub_816F5B4(struct Sprite *sprite) +{ + SetOamMatrix(sprite->data[1], sprite->data[6] + 64, 0, 0, sprite->data[6] + 64); + SetOamMatrix(sprite->data[1] + 1, sprite->data[6] + 64, 0, 0, sprite->data[6] + 64); + SetOamMatrix(sprite->data[1] + 2, sprite->data[6] + 64, 0, 0, sprite->data[6] + 64); + if (sprite->data[4] != 64) + { + u16 data4; + + sprite->data[4] -= 8; + data4 = sprite->data[4]; + sprite->pos2.x = gSineTable[(u8)(data4 + 64)] / 64; + sprite->pos2.y = gSineTable[(u8)data4] / 64; + } + else + { + sprite->data[4] = 0; + sprite->callback = sub_816F660; + } +} + +static void sub_816F660(struct Sprite *sprite) +{ + if (sprite->data[0] != 2) + { + s16 r2; + + sprite->data[4] += 8; + r2 = gSineTable[(u8)sprite->data[4]] / 16 + 64; + sprite->pos2.x = gSineTable[(u8)(r2 + 64)] / 64; + sprite->pos2.y = gSineTable[(u8)r2] / 64; + } + else + { + sprite->callback = SpriteCB_WaterDropFall; + } +} + +static void SpriteCB_WaterDropFall(struct Sprite *sprite) +{ + if (sprite->pos1.y < sprite->data[5]) + { + sprite->pos1.y += 4; + } + else + { + sprite->data[7] = 1; + sprite->invisible = TRUE; + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + StartSpriteAnim(sprite, 3); + sprite->data[2] = 1024; + sprite->data[3] = 8 * (sprite->data[1] & 3); + sprite->callback = sub_816F318; + sprite->oam.shape = 1; + sprite->oam.size = 3; + CalcCenterToCornerVec(sprite, 1, 3, 2); + } +} + +//Duplicate function +static void SpriteCB_WaterDropFall_2(struct Sprite *sprite) +{ + if (sprite->pos1.y < sprite->data[5]) + { + sprite->pos1.y += 4; + } + else + { + sprite->data[7] = 1; + sprite->invisible = TRUE; + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + StartSpriteAnim(sprite, 3); + sprite->data[2] = 1024; + sprite->data[3] = 8 * (sprite->data[1] & 3); + sprite->callback = sub_816F318; + sprite->oam.shape = 1; + sprite->oam.size = 3; + CalcCenterToCornerVec(sprite, 1, 3, 2); + } +} + +static u8 CreateWaterDrop(s16 x, s16 y, u16 c, u16 d, u16 e, u8 fallImmediately) +{ + u8 spriteId; + u8 oldSpriteId; + + spriteId = CreateSprite(&gUnknown_085E4D64, x, y, 1); + gSprites[spriteId].data[0] = 0; + gSprites[spriteId].data[7] = 0; + gSprites[spriteId].data[1] = d; + gSprites[spriteId].data[2] = c; + gSprites[spriteId].data[3] = c; + gSprites[spriteId].data[5] = e; + gSprites[spriteId].data[6] = c; + gSprites[spriteId].oam.affineMode = 3; + gSprites[spriteId].oam.matrixNum = d; + CalcCenterToCornerVec(&gSprites[spriteId], 0, 2, 2); + StartSpriteAnim(&gSprites[spriteId], 2); + if (!fallImmediately) + gSprites[spriteId].callback = sub_816F454; + else + gSprites[spriteId].callback = SpriteCB_WaterDropFall_2; + oldSpriteId = spriteId; + + spriteId = CreateSprite(&gUnknown_085E4D64, x, y, 1); + gSprites[spriteId].data[7] = oldSpriteId; + gSprites[spriteId].data[1] = d + 1; + gSprites[spriteId].oam.affineMode = 3; + gSprites[spriteId].oam.matrixNum = d + 1; + CalcCenterToCornerVec(&gSprites[spriteId], 0, 2, 2); + gSprites[spriteId].callback = sub_816F3A4; + + spriteId = CreateSprite(&gUnknown_085E4D64, x, y, 1); + gSprites[spriteId].data[7] = oldSpriteId; + gSprites[spriteId].data[1] = d + 2; + StartSpriteAnim(&gSprites[spriteId], 1); + gSprites[spriteId].oam.affineMode = 3; + gSprites[spriteId].oam.matrixNum = d + 2; + CalcCenterToCornerVec(&gSprites[spriteId], 0, 2, 2); + gSprites[spriteId].callback = sub_816F3A4; + + SetOamMatrix(d, c + 32, 0, 0, c + 32); + SetOamMatrix(d + 1, c + 32, 0, 0, c + 32); + SetOamMatrix(d + 2, c + 32, 0, 0, 2 * (c + 32)); + + return oldSpriteId; +} + +static void sub_816F9D4(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + StartSpriteAnimIfDifferent(sprite, 0); + sprite->pos1.x--; + break; + case 1: + StartSpriteAnimIfDifferent(sprite, 0); + if (gIntroFrameCounter & 7) + return; + sprite->pos1.x++; + break; + case 2: + if (sprite->pos1.x <= 120 || gIntroFrameCounter & 7) + sprite->pos1.x++; + break; + case 3: + break; + case 4: + if (sprite->pos1.x > -32) + sprite->pos1.x -= 2; + break; + } + if (gIntroFrameCounter & 7) + return; + if (sprite->pos2.y != 0) + { + sprite->pos2.y = 0; + } + else + { + switch (Random() & 3) + { + case 0: + sprite->pos2.y = -1; + break; + case 1: + sprite->pos2.y = 1; + break; + case 2: + case 3: + sprite->pos2.y = 0; + break; + } + } +} + +static void sub_816FAB0(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + break; + case 1: + if (sprite->pos2.x + sprite->pos1.x < 304) + sprite->pos2.x += 8; + else + sprite->data[0] = 2; + break; + case 2: + if (sprite->pos2.x + sprite->pos1.x > 120) + sprite->pos2.x -= 1; + else + sprite->data[0] = 3; + break; + case 3: + if (sprite->pos2.x > 0) + sprite->pos2.x -= 2; + break; + } + sprite->pos2.y = Sin((u8)sprite->data[1], 8) - gUnknown_0203BCCC; + sprite->data[1] += 4; +} + +static void sub_816FB38(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + if (sprite->data[1] != 0) + { + sprite->data[1]--; + } + else + { + sprite->invisible = FALSE; + StartSpriteAffineAnim(sprite, 1); + sprite->data[0]++; + } + break; + case 1: + if (gIntroFrameCounter == 0x90) + { + sprite->data[0]++; + sprite->data[1] = 9; + sprite->data[3] = 2; + } + break; + case 2: + if (sprite->data[3] == 0) + { + sprite->data[3] = 2; + if (sprite->data[1] != 0) + { + CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1]], &gPlttBufferFaded[0x11F], 2); + CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1] + 0x10], &gPlttBufferFaded[0x114], 2); + CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1] + 0x20], &gPlttBufferFaded[0x11A], 2); + sprite->data[1]--; + } + else + { + CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1]], &gPlttBufferFaded[0x11F], 2); + CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1] + 0x10], &gPlttBufferFaded[0x114], 2); + CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1] + 0x20], &gPlttBufferFaded[0x11A], 2); + sprite->data[0]++; + } + } + else + { + sprite->data[3]--; + } + break; + case 3: + if (sprite->data[3] != 0) + { + sprite->data[3]--; + } + else + { + sprite->data[3] = 2; + if (sprite->data[1] < 10) + { + CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1]], &gPlttBufferFaded[0x11F], 2); + CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1] + 0x10], &gPlttBufferFaded[0x114], 2); + CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1] + 0x20], &gPlttBufferFaded[0x11A], 2); + sprite->data[1]++; + } + else + { + sprite->data[0]++; + } + } + break; + case 4: + if (gIntroFrameCounter == 0x110) + { + StartSpriteAffineAnim(sprite, 2); + sprite->oam.objMode = 1; + sprite->data[0]++; + } + break; + case 5: + sprite->data[3] += gUnknown_085E4F48[sprite->data[2]]; + sprite->pos2.x = (sprite->data[3] & 0xFF00) >> 8; + if (sprite->data[2] < 4) + { + s16 temp = sprite->pos2.x; + sprite->pos2.x = -temp; + } + if (sprite->affineAnimEnded) + DestroySprite(sprite); + break; + } +} + +static void sub_816FD44(struct Sprite *sprite) +{ + switch(sprite->data[0]) + { + case 0: + if (gIntroFrameCounter == 0x80) + { + sprite->invisible = FALSE; + sprite->data[0]++; + } + break; + case 1: + if (gIntroFrameCounter == 0x110) + { + StartSpriteAffineAnim(sprite, 3); + sprite->data[0]++; + } + break; + case 2: + if (sprite->affineAnimEnded) + DestroySprite(sprite); + break; + } +} + +static u8 sub_816FDB8(s16 a0, s16 a1, s16 a2) +{ + u16 i; + u8 spriteId; + + for (i = 0; i < 9; i++) + { + spriteId = CreateSprite(&gUnknown_085E4F5C, gUnknown_085E4E94[i][1] + a0, a1 - 4, 0); + gSprites[spriteId].data[0] = 0; + gSprites[spriteId].data[1] = gUnknown_085E4FA4[i]; + gSprites[spriteId].data[2] = i; + gSprites[spriteId].invisible = TRUE; + gSprites[spriteId].oam.matrixNum = i + 12; + StartSpriteAnim(&gSprites[spriteId], gUnknown_085E4E94[i][0]); + StartSpriteAffineAnim(&gSprites[spriteId], 0); + } + spriteId = CreateSprite(&gUnknown_085E4F8C, 120, a1 - 6, 0); + gSprites[spriteId].data[0] = 0; + gSprites[spriteId].invisible = TRUE; + gSprites[spriteId].oam.matrixNum = i + 12; + StartSpriteAffineAnim(&gSprites[spriteId], 1); + return spriteId; +} + +static void sub_816FEDC(struct Sprite *sprite) +{ + sprite->data[7]++; + + if (sprite->data[0] != 0) + { + s16 sin1; + s16 sin2; + + s16 a, b, c, d; + + sin1 = gSineTable[(u8)sprite->data[2]]; + sin2 = gSineTable[(u8)(sprite->data[2] + 64)]; + + d = Q_8_8_TO_INT(sin2 * sprite->data[1]); + c = Q_8_8_TO_INT(-sin1 * sprite->data[1]); + b = Q_8_8_TO_INT(sin1 * sprite->data[1]); + a = Q_8_8_TO_INT(sin2 * sprite->data[1]); + + SetOamMatrix(1, a, b, c, d); + } + + switch (sprite->data[0]) + { + case 0: + default: + sprite->oam.affineMode = 3; + sprite->oam.matrixNum = 1; + CalcCenterToCornerVec(sprite, 1, 3, 3); + sprite->invisible = FALSE; + sprite->data[0] = 1; + sprite->data[1] = 0x80; + sprite->data[2] = 0; + sprite->data[3] = 0; + break; + case 1: + sprite->pos2.x = -Sin((u8)sprite->data[3], 140); + sprite->pos2.y = -Sin((u8)sprite->data[3], 120); + sprite->data[1] += 7; + sprite->data[3] += 3; + if (sprite->pos1.x + sprite->pos2.x <= -16) + { + sprite->oam.priority = 3; + sprite->data[0]++; + sprite->pos1.x = 20; + sprite->pos1.y = 40; + sprite->data[1] = 0x200; + sprite->data[2] = 0; + sprite->data[3] = 0x10; + } + break; + case 2: + sprite->pos2.x = Sin((u8)sprite->data[3], 34); + sprite->pos2.y = -Cos((u8)sprite->data[3], 60); + sprite->data[1] += 2; + if (sprite->data[7] % 5 == 0) + sprite->data[3]++; + break; + } +} + +static void sub_8170040(struct Sprite *sprite) +{ + u16 foo; + + //I'm not sure why a switch statement was used here. + //if (sprite->data[0] != 1) would have been more appropriate. + switch (sprite->data[0]) + { + case 0: + default: + sprite->invisible = FALSE; + sprite->oam.affineMode = 3; + sprite->oam.matrixNum = 18; + CalcCenterToCornerVec(sprite, 0, 3, 3); + sprite->data[1] = 0; + sprite->data[0] = 1; + //fall through + case 1: + sprite->data[7]++; + if (sprite->data[7] & 1) + { + sprite->invisible = TRUE; + } + else + { + sprite->invisible = FALSE; + if (sprite->data[1] < 64) + sprite->data[1]++; + } + foo = 256 - gSineTable[(u8)sprite->data[1]] / 2; + SetOamMatrix(18, foo, 0, 0, foo); + break; + } +} diff --git a/src/intro_credits_graphics.c b/src/intro_credits_graphics.c new file mode 100644 index 000000000..b1502b630 --- /dev/null +++ b/src/intro_credits_graphics.c @@ -0,0 +1,849 @@ +#include "global.h" +#include "intro_credits_graphics.h" +#include "palette.h" +#include "decompress.h" +#include "gpu_regs.h" +#include "task.h" +#include "main.h" +#include "graphics.h" + +struct IntroCreditsSpriteMetadata +{ + u8 animNum:4; + u8 shape:2; + u8 size:2; + u8 x; + u8 y; + u8 subpriority; + u16 xOff; +}; + +static const u16 gUnknown_085F06E0[] = INCBIN_U16("graphics/intro/intro2_grass.gbapal"); +static const u16 gUnknown_085F0700[] = INCBIN_U16("graphics/intro/intro2_grass_afternoon.gbapal"); +static const u16 gUnknown_085F0720[] = INCBIN_U16("graphics/intro/intro2_grass_night.gbapal"); +static const u8 gUnknown_085F0740[] = INCBIN_U8("graphics/intro/intro2_grass.4bpp.lz"); +static const u8 gUnknown_085F0BC0[] = INCBIN_U8("graphics/intro/intro2_grass_map.bin.lz"); +static const u16 gUnknown_085F0CFC[] = INCBIN_U16("graphics/intro/85F0CFC.gbapal"); +static const u16 gUnknown_085F0D5C[] = INCBIN_U16("graphics/intro/85F0D5C.gbapal"); +static const u8 gUnknown_085F0DBC[] = INCBIN_U8("graphics/intro/intro2_bgclouds.4bpp.lz"); +static const u8 gUnknown_085F1398[] = INCBIN_U8("graphics/intro/intro2_bgclouds_map.bin.lz"); +static const u16 gUnknown_085F1668[] = INCBIN_U16("graphics/intro/intro2_bgclouds.gbapal"); +static const u16 gUnknown_085F1688[] = INCBIN_U16("graphics/intro/intro2_bgclouds_afternoon.gbapal"); +static const u8 gUnknown_085F16A8[] = INCBIN_U8("graphics/intro/intro2_bgclouds2.4bpp.lz"); +static const u16 gUnknown_085F17E4[] = INCBIN_U16("graphics/intro/intro2_bgtrees2.gbapal"); +static const u16 gUnknown_085F1804[] = INCBIN_U16("graphics/intro/intro2_bgtrees2_afternoon.gbapal"); +static const u8 gUnknown_085F1824[] = INCBIN_U8("graphics/intro/intro2_bgtrees.4bpp.lz"); +static const u8 gUnknown_085F1EAC[] = INCBIN_U8("graphics/intro/intro2_bgtrees_map.bin.lz"); +static const u16 gUnknown_085F21B0[] = INCBIN_U16("graphics/intro/intro2_bgtrees.gbapal"); +static const u8 gIntro2TreeTiles[] = INCBIN_U8("graphics/intro/intro2_bgtreessmall.4bpp.lz"); +static const u16 gUnknown_085F231C[] = INCBIN_U16("graphics/intro/85F231C.gbapal"); +static const u8 gUnknown_085F235C[] = INCBIN_U8("graphics/intro/intro2_bgnight.4bpp.lz"); +static const u16 gUnknown_085F2548[] = INCBIN_U16("graphics/intro/intro2_bgnight.gbapal"); +static const u8 gUnknown_085F2568[] = INCBIN_U8("graphics/intro/intro2_bgnight_map.bin.lz"); +static const u8 gIntro2NightTiles[] = INCBIN_U8("graphics/intro/intro2_night.4bpp.lz"); +static const u16 gIntro2BrendanPalette[] = INCBIN_U16("graphics/intro/intro2_brendan.gbapal"); +static const u8 gIntro2BrendanTiles[] = INCBIN_U8("graphics/intro/intro2_brendan.4bpp.lz"); +static const u16 gIntro2MayPalette[] = INCBIN_U16("graphics/intro/intro2_may.gbapal"); +static const u16 gUnknown_085F3490[0xF0] = {0}; +static const u8 gIntro2MayTiles[] = INCBIN_U8("graphics/intro/intro2_may.4bpp.lz"); +static const u8 gIntro2BicycleTiles[] = INCBIN_U8("graphics/intro/intro2_bicycle.4bpp.lz"); +static const u16 gIntro2LatiosPalette[] = INCBIN_U16("graphics/intro/intro2_latios.gbapal"); +static const u8 gIntro2LatiosTiles[] = INCBIN_U8("graphics/intro/intro2_latios.4bpp.lz"); +static const u16 gIntro2LatiasPalette[] = INCBIN_U16("graphics/intro/intro2_latias.gbapal"); +static const u8 gIntro2LatiasTiles[] = INCBIN_U8("graphics/intro/intro2_latias.4bpp.lz"); + +static void sub_817B62C(struct Sprite *sprite); +static void nullsub_65(struct Sprite *sprite); +static void sub_817B7C4(struct Sprite *sprite); +static void nullsub_66(struct Sprite *sprite); + +static const struct SpriteTemplate gUnknown_085F504C = { + 2000, 0xFFFF, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_817B62C +}; + +static const struct CompressedSpriteSheet gUnknown_085F5064[] = { + { gUnknown_085F16A8, 0x400, 2000 }, + { NULL } +}; + +static const union AnimCmd gUnknown_085F5074[] = { + ANIMCMD_FRAME( 0, 30), + ANIMCMD_END +}; + +static const union AnimCmd gUnknown_085F507C[] = { + ANIMCMD_FRAME(16, 30), + ANIMCMD_END +}; + +static const union AnimCmd gUnknown_085F5084[] = { + ANIMCMD_FRAME(20, 30), + ANIMCMD_END +}; + +static const union AnimCmd gUnknown_085F508C[] = { + ANIMCMD_FRAME(22, 30), + ANIMCMD_END +}; + +static const union AnimCmd *const gUnknown_085F5094[] = { + gUnknown_085F5074, + gUnknown_085F507C, + gUnknown_085F5084, + gUnknown_085F508C +}; + +static const struct IntroCreditsSpriteMetadata gUnknown_085F50A4[] = { + { 0, ST_OAM_SQUARE, 2, 72, 32, 100, 0xc00 }, + { 0, ST_OAM_SQUARE, 2, 158, 32, 100, 0xc00 }, + { 1, ST_OAM_SQUARE, 1, 192, 40, 101, 0x800 }, + { 1, ST_OAM_SQUARE, 1, 56, 40, 101, 0x800 }, + { 2, ST_OAM_H_RECTANGLE, 0, 100, 44, 102, 0x400 }, + { 2, ST_OAM_H_RECTANGLE, 0, 152, 44, 102, 0x400 }, + { 3, ST_OAM_H_RECTANGLE, 0, 8, 46, 103, 0x100 }, + { 3, ST_OAM_H_RECTANGLE, 0, 56, 46, 103, 0x100 }, + { 3, ST_OAM_H_RECTANGLE, 0, 240, 46, 103, 0x100 }, +}; + +static const struct CompressedSpriteSheet gUnknown_085F50EC[] = { + { gIntro2TreeTiles, 0x400, 2000 }, + { NULL } +}; + +static const union AnimCmd gUnknown_085F50FC[] = { + ANIMCMD_FRAME( 0, 30), + ANIMCMD_END +}; + +static const union AnimCmd gUnknown_085F5104[] = { + ANIMCMD_FRAME(16, 30), + ANIMCMD_END +}; + +static const union AnimCmd gUnknown_085F510C[] = { + ANIMCMD_FRAME(24, 30), + ANIMCMD_END +}; + +static const union AnimCmd *const gUnknown_085F5114[] = { + gUnknown_085F50FC, + gUnknown_085F5104, + gUnknown_085F510C +}; + +static const struct IntroCreditsSpriteMetadata gUnknown_085F5120[] = { + { 0, ST_OAM_SQUARE, 2, 16, 88, 100, 0x2000 }, + { 0, ST_OAM_SQUARE, 2, 80, 88, 100, 0x2000 }, + { 0, ST_OAM_SQUARE, 2, 144, 88, 100, 0x2000 }, + { 0, ST_OAM_SQUARE, 2, 208, 88, 100, 0x2000 }, + { 1, ST_OAM_V_RECTANGLE, 2, 40, 88, 101, 0x1000 }, + { 1, ST_OAM_V_RECTANGLE, 2, 104, 88, 101, 0x1000 }, + { 1, ST_OAM_V_RECTANGLE, 2, 168, 88, 101, 0x1000 }, + { 1, ST_OAM_V_RECTANGLE, 2, 232, 88, 101, 0x1000 }, + { 2, ST_OAM_V_RECTANGLE, 2, 56, 88, 102, 0x800 }, + { 2, ST_OAM_V_RECTANGLE, 2, 120, 88, 102, 0x800 }, + { 2, ST_OAM_V_RECTANGLE, 2, 184, 88, 102, 0x800 }, + { 2, ST_OAM_V_RECTANGLE, 2, 248, 88, 102, 0x800 }, +}; + +static const struct CompressedSpriteSheet gUnknown_085F5180[] = { + { gIntro2NightTiles, 0x400, 2000 }, + { NULL } +}; + +static const union AnimCmd gUnknown_085F5190[] = { + ANIMCMD_FRAME(0, 30), + ANIMCMD_END +}; + +static const union AnimCmd *const gUnknown_085F5198[] = { + gUnknown_085F5190 +}; + +static const struct IntroCreditsSpriteMetadata gUnknown_085F519C[] = { + { 0, ST_OAM_SQUARE, 2, 24, 88, 100, 0x1000 }, + { 0, ST_OAM_SQUARE, 2, 64, 88, 100, 0x1000 }, + { 0, ST_OAM_SQUARE, 2, 104, 88, 100, 0x1000 }, + { 0, ST_OAM_SQUARE, 2, 144, 88, 100, 0x1000 }, + { 0, ST_OAM_SQUARE, 2, 184, 88, 100, 0x1000 }, + { 0, ST_OAM_SQUARE, 2, 224, 88, 100, 0x1000 }, +}; + +static const struct OamData gOamData_85F51CC = { + .y = 160, .shape = ST_OAM_SQUARE, .size = 3, .priority = 1 +}; + +static const union AnimCmd gUnknown_085F51D4[] = { + ANIMCMD_FRAME( 0, 8), + ANIMCMD_FRAME( 64, 8), + ANIMCMD_FRAME(128, 8), + ANIMCMD_FRAME(192, 8), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd *const gUnknown_085F51E8[] = { + gUnknown_085F51D4 +}; + +static const struct SpriteTemplate gUnknown_085F51EC = { + 1002, 1002, &gOamData_85F51CC, gUnknown_085F51E8, NULL, gDummySpriteAffineAnimTable, nullsub_65 +}; + +static const struct SpriteTemplate gUnknown_085F5204 = { + 1003, 1003, &gOamData_85F51CC, gUnknown_085F51E8, NULL, gDummySpriteAffineAnimTable, nullsub_65 +}; + +static const struct OamData gUnknown_085F521C = { + .y = 160, .shape = ST_OAM_H_RECTANGLE, .size = 3, .priority = 1 +}; + +static const union AnimCmd gUnknown_085F5224[] = { + ANIMCMD_FRAME( 0, 8), + ANIMCMD_FRAME( 32, 8), + ANIMCMD_FRAME( 64, 8), + ANIMCMD_FRAME( 96, 8), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd *const gUnknown_085F5238[] = { + gUnknown_085F5224 +}; + +static const struct SpriteTemplate gUnknown_085F523C = { + 1001, 1002, &gUnknown_085F521C, gUnknown_085F5238, NULL, gDummySpriteAffineAnimTable, sub_817B7C4 +}; + +static const struct SpriteTemplate gUnknown_085F5254 = { + 1001, 1003, &gUnknown_085F521C, gUnknown_085F5238, NULL, gDummySpriteAffineAnimTable, sub_817B7C4 +}; + +static const struct OamData gUnknown_085F526C = { + .y = 160, .shape = ST_OAM_SQUARE, .size = 3, .priority = 1 +}; + +static const union AnimCmd gUnknown_085F5274[] = { + ANIMCMD_FRAME( 0, 16), + ANIMCMD_END +}; + +static const union AnimCmd gUnknown_085F527C[] = { + ANIMCMD_FRAME( 64, 16), + ANIMCMD_END +}; + +static const union AnimCmd *const gUnknown_085F5284[] = { + gUnknown_085F5274, + gUnknown_085F527C +}; + +static const struct SpriteTemplate gUnknown_085F528C = { + 1004, 1004, &gUnknown_085F526C, gUnknown_085F5284, NULL, gDummySpriteAffineAnimTable, nullsub_66 +}; + +static const struct SpriteTemplate gUnknown_085F52A4 = { + 1005, 1005, &gUnknown_085F526C, gUnknown_085F5284, NULL, gDummySpriteAffineAnimTable, nullsub_66 +}; + +const struct CompressedSpriteSheet gIntro2BrendanSpriteSheet[] = { + { gIntro2BrendanNoTurnGfx, 0x2000, 1002 }, + { NULL } +}; + +const struct CompressedSpriteSheet gIntro2MaySpriteSheet[] = { + { gIntro2MayNoTurnGfx, 0x2000, 1003 }, + { NULL } +}; + +const struct CompressedSpriteSheet gIntro2BicycleSpriteSheet[] = { + { gIntro2BicycleTiles, 0x1000, 1001 }, + { NULL } +}; + +static const struct CompressedSpriteSheet gUnknown_085F52EC[] = { + { gIntro2FlygonGfx, 0x1000, 1004 }, + { NULL } +}; + +const struct CompressedSpriteSheet gIntro2FlygonSpriteSheet[] = { + { gIntro2FlygonGfx, 0x1000, 1005 }, + { NULL } +}; + +const struct SpritePalette gUnknown_085F530C[] = { + { gIntro2BrendanNoTurnPal, 1002 }, + { gIntro2BrendanNoTurnPal, 1003 }, + { gIntro2FlygonPal, 1004 }, + { gIntro2FlygonPal, 1005 }, + { NULL } +}; + +const struct CompressedSpriteSheet gUnknown_085F5334[] = { + { gIntro2BrendanTiles, 0x3800, 1002 }, + { NULL } +}; + +const struct CompressedSpriteSheet gUnknown_085F5344[] = { + { gIntro2MayTiles, 0x3800, 1003 }, + { NULL } +}; + +const struct CompressedSpriteSheet gUnknown_085F5354[] = { + { gIntro2BicycleTiles, 0x1000, 1001 }, + { NULL } +}; + +static const struct CompressedSpriteSheet gUnknown_085F5364[] = { + { gIntro2LatiosTiles, 0x1000, 1004 }, + { NULL } +}; + +static const struct CompressedSpriteSheet gUnknown_085F5374[] = { + { gIntro2LatiasTiles, 0x1000, 1005 }, + { NULL } +}; + +const struct SpritePalette gUnknown_085F5384[] = { + { gIntro2BrendanPalette, 1002 }, + { gIntro2MayPalette, 1003 }, + { gIntro2LatiosPalette, 1004 }, + { gIntro2LatiasPalette, 1005 }, + { NULL } +}; + +const struct CompressedSpriteSheet gUnknown_085F53AC[] = { + { gIntro2BrendanTiles, 0x2000, 1002}, + { NULL } +}; + +const struct CompressedSpriteSheet gUnknown_085F53BC[] = { + { gIntro2MayTiles, 0x2000, 1003}, + { NULL } +}; + +EWRAM_DATA u16 gUnknown_0203BD24 = 0; +EWRAM_DATA s16 gUnknown_0203BD26 = 0; +EWRAM_DATA s16 gUnknown_0203BD28 = 0; + +static void sub_817B76C(void); +static void sub_817B788(void); +static void sub_817B7A4(void); +static void sub_817B458(u8); + +void load_intro_part2_graphics(u8 a) +{ + LZ77UnCompVram(&gUnknown_085F0740, (void *)(VRAM + 0x4000)); + LZ77UnCompVram(&gUnknown_085F0BC0, (void *)(VRAM + 0x7800)); + LoadPalette(&gUnknown_085F06E0, 240, 32); + switch (a) + { + case 0: + default: + LZ77UnCompVram(&gUnknown_085F0DBC, (void *)(VRAM)); + LZ77UnCompVram(&gUnknown_085F1398, (void *)(VRAM + 0x3000)); + LoadPalette(&gUnknown_085F0CFC, 0, 96); + LoadCompressedObjectPic(gUnknown_085F5064); + LoadPalette(&gUnknown_085F1668, 256, 32); + sub_817B76C(); + break; + case 1: + LZ77UnCompVram(&gUnknown_085F1824, (void *)(VRAM)); + LZ77UnCompVram(&gUnknown_085F1EAC, (void *)(VRAM + 0x3000)); + LoadPalette(&gUnknown_085F17E4, 0, 32); + LoadCompressedObjectPic(gUnknown_085F50EC); + LoadPalette(&gUnknown_085F21B0, 256, 32); + sub_817B788(); + break; + } + gUnknown_0203BD28 = 0; + gReservedSpritePaletteCount = 8; +} + +void sub_817B150(u8 a) +{ + switch (a) + { + default: + case 0: + SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) + | BGCNT_CHARBASE(0) + | BGCNT_16COLOR + | BGCNT_SCREENBASE(6) + | BGCNT_TXT256x256); + SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) + | BGCNT_CHARBASE(0) + | BGCNT_16COLOR + | BGCNT_SCREENBASE(7) + | BGCNT_TXT256x256); + SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1) + | BGCNT_CHARBASE(1) + | BGCNT_16COLOR + | BGCNT_SCREENBASE(15) + | BGCNT_TXT256x256); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 + | DISPCNT_OBJ_1D_MAP + | DISPCNT_BG1_ON + | DISPCNT_BG2_ON + | DISPCNT_BG3_ON + | DISPCNT_OBJ_ON); + break; + case 1: + SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) + | BGCNT_CHARBASE(0) + | BGCNT_16COLOR + | BGCNT_SCREENBASE(6) + | BGCNT_TXT256x256); + SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) + | BGCNT_CHARBASE(0) + | BGCNT_16COLOR + | BGCNT_SCREENBASE(7) + | BGCNT_TXT256x256); + SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1) + | BGCNT_CHARBASE(1) + | BGCNT_16COLOR + | BGCNT_SCREENBASE(15) + | BGCNT_TXT256x256); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 + | DISPCNT_OBJ_1D_MAP + | DISPCNT_BG1_ON + | DISPCNT_BG2_ON + | DISPCNT_BG3_ON + | DISPCNT_OBJ_ON); + break; + case 2: + SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) + | BGCNT_CHARBASE(0) + | BGCNT_16COLOR + | BGCNT_SCREENBASE(6) + | BGCNT_TXT256x256); + SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) + | BGCNT_CHARBASE(0) + | BGCNT_16COLOR + | BGCNT_SCREENBASE(7) + | BGCNT_TXT256x256); + SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1) + | BGCNT_CHARBASE(1) + | BGCNT_16COLOR + | BGCNT_SCREENBASE(15) + | BGCNT_TXT256x256); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 + | DISPCNT_OBJ_1D_MAP + | DISPCNT_BG1_ON + | DISPCNT_BG2_ON + | DISPCNT_BG3_ON + | DISPCNT_OBJ_ON); + break; + } +} + +void sub_817B1C8(u8 a) +{ + LZ77UnCompVram(&gUnknown_085F0740, (void *)(VRAM + 0x4000)); + LZ77UnCompVram(&gUnknown_085F0BC0, (void *)(VRAM + 0x7800)); + switch (a) + { + case 0: + default: + LoadPalette(&gUnknown_085F06E0, 240, 32); + LZ77UnCompVram(&gUnknown_085F0DBC, (void *)(VRAM)); + LZ77UnCompVram(&gUnknown_085F1398, (void *)(VRAM + 0x3000)); + LoadPalette(&gUnknown_085F0CFC, 0, 96); + LoadCompressedObjectPic(gUnknown_085F5064); + LZ77UnCompVram(&gUnknown_085F16A8, (void *)(VRAM + 0x10000)); + LoadPalette(&gUnknown_085F1668, 256, 32); + sub_817B76C(); + break; + case 1: + LoadPalette(&gUnknown_085F0700, 240, 32); + LZ77UnCompVram(&gUnknown_085F0DBC, (void *)(VRAM)); + LZ77UnCompVram(&gUnknown_085F1398, (void *)(VRAM + 0x3000)); + LoadPalette(&gUnknown_085F0D5C, 0, 96); + LoadCompressedObjectPic(gUnknown_085F5064); + LZ77UnCompVram(&gUnknown_085F16A8, (void *)(VRAM + 0x10000)); + LoadPalette(&gUnknown_085F1688, 256, 32); + sub_817B76C(); + break; + case 2: + case 3: + LoadPalette(&gUnknown_085F0700, 240, 32); + LZ77UnCompVram(&gUnknown_085F1824, (void *)(VRAM)); + LZ77UnCompVram(&gUnknown_085F1EAC, (void *)(VRAM + 0x3000)); + LoadPalette(&gUnknown_085F1804, 0, 32); + LoadCompressedObjectPic(gUnknown_085F50EC); + LoadPalette(&gUnknown_085F1804, 256, 32); + sub_817B788(); + break; + case 4: + LoadPalette(&gUnknown_085F0720, 240, 32); + LZ77UnCompVram(&gUnknown_085F235C, (void *)(VRAM)); + LZ77UnCompVram(&gUnknown_085F2568, (void *)(VRAM + 0x3000)); + LoadPalette(&gUnknown_085F231C, 0, 64); + LoadCompressedObjectPic(gUnknown_085F5180); + LoadPalette(&gUnknown_085F2548, 256, 32); + sub_817B7A4(); + break; + } + gReservedSpritePaletteCount = 8; + gUnknown_0203BD28 = 0; +} + +void sub_817B3A8(u8 a) +{ + SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) + | BGCNT_CHARBASE(0) + | BGCNT_16COLOR + | BGCNT_SCREENBASE(6) + | BGCNT_TXT256x256); + SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) + | BGCNT_CHARBASE(0) + | BGCNT_16COLOR + | BGCNT_SCREENBASE(7) + | BGCNT_TXT256x256); + SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1) + | BGCNT_CHARBASE(1) + | BGCNT_16COLOR + | BGCNT_SCREENBASE(15) + | BGCNT_TXT256x256); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 + | DISPCNT_OBJ_1D_MAP + | DISPCNT_BG_ALL_ON + | DISPCNT_OBJ_ON); +} + +u8 sub_817B3DC(u8 a, u16 b, u16 c, u16 d) +{ + u8 taskId = CreateTask(&sub_817B458, 0); + + gTasks[taskId].data[0] = a; + gTasks[taskId].data[1] = b; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[4] = c; + gTasks[taskId].data[5] = 0; + gTasks[taskId].data[6] = 0; + gTasks[taskId].data[7] = d; + gTasks[taskId].data[8] = 8; + gTasks[taskId].data[9] = 0; + sub_817B458(taskId); + return taskId; +} + +#ifdef NONMATCHING +static void sub_817B458(u8 taskId) +{ + s16 r4; + s32 r2; + + r4 = gTasks[taskId].data[1]; + if (r4 != 0) + { + r2 = (gTasks[taskId].data[2] << 16) + (u16)gTasks[taskId].data[3]; + r2 -= (u16)r4 << 4; + gTasks[taskId].data[2] = r2 >> 16; + gTasks[taskId].data[3] = r2; + SetGpuReg(REG_OFFSET_BG1HOFS, gTasks[taskId].data[2]); + SetGpuReg(REG_OFFSET_BG1VOFS, gUnknown_0203BD24 + gUnknown_0203BD26); + } + + r4 = gTasks[taskId].data[4]; + if (r4 != 0) + { + r2 = (gTasks[taskId].data[5] << 16) + (u16)gTasks[taskId].data[6]; + r2 -= (u16)r4 << 4; + gTasks[taskId].data[5] = r2 >> 16; + gTasks[taskId].data[6] = r2; + SetGpuReg(REG_OFFSET_BG2HOFS, gTasks[taskId].data[5]); + if (gTasks[taskId].data[0] != 0) + SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_0203BD24 + gUnknown_0203BD26); + else + SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_0203BD24); + } + + r4 = gTasks[taskId].data[7]; + if (r4 != 0) + { + r2 = (gTasks[taskId].data[8] << 16) + (u16)gTasks[taskId].data[9]; + r2 -= (u16)r4 << 4; + gTasks[taskId].data[8] = r2 >> 16; + gTasks[taskId].data[9] = r2; + SetGpuReg(REG_OFFSET_BG3HOFS, gTasks[taskId].data[8]); + SetGpuReg(REG_OFFSET_BG3VOFS, gUnknown_0203BD24); + } +} +#else +ASM_DIRECT +static void sub_817B458(u8 taskId) +{ + asm("push {r4,r5,lr}\n\ + lsl r0, #24\n\ + lsr r5, r0, #24\n\ + ldr r1, =gTasks\n\ + lsl r0, r5, #2\n\ + add r0, r5\n\ + lsl r0, #3\n\ + add r4, r0, r1\n\ + ldrh r0, [r4, #0xA]\n\ + lsl r2, r0, #16\n\ + cmp r2, #0\n\ + beq _0817B4A0\n\ + mov r1, #0xC\n\ + ldrsh r0, [r4, r1]\n\ + lsl r0, #16\n\ + ldrh r1, [r4, #0xE]\n\ + add r1, r0, r1\n\ + lsr r0, r2, #12\n\ + sub r1, r0\n\ + asr r0, r1, #16\n\ + strh r0, [r4, #0xC]\n\ + strh r1, [r4, #0xE]\n\ + ldrh r1, [r4, #0xC]\n\ + mov r0, #0x14\n\ + bl SetGpuReg\n\ + ldr r2, =gUnknown_0203BD24\n\ + ldr r0, =gUnknown_0203BD26\n\ + ldrh r1, [r0]\n\ + ldrh r2, [r2]\n\ + add r1, r2\n\ + lsl r1, #16\n\ + lsr r1, #16\n\ + mov r0, #0x16\n\ + bl SetGpuReg\n\ +_0817B4A0:\n\ + ldrh r0, [r4, #0x10]\n\ + lsl r2, r0, #16\n\ + cmp r2, #0\n\ + beq _0817B4FA\n\ + mov r1, #0x12\n\ + ldrsh r0, [r4, r1]\n\ + lsl r0, #16\n\ + ldrh r1, [r4, #0x14]\n\ + add r1, r0, r1\n\ + lsr r0, r2, #12\n\ + sub r1, r0\n\ + asr r0, r1, #16\n\ + strh r0, [r4, #0x12]\n\ + strh r1, [r4, #0x14]\n\ + ldrh r1, [r4, #0x12]\n\ + mov r0, #0x18\n\ + bl SetGpuReg\n\ + mov r1, #0x8\n\ + ldrsh r0, [r4, r1]\n\ + cmp r0, #0\n\ + beq _0817B4F0\n\ + ldr r2, =gUnknown_0203BD24\n\ + ldr r0, =gUnknown_0203BD26\n\ + ldrh r1, [r0]\n\ + ldrh r2, [r2]\n\ + add r1, r2\n\ + lsl r1, #16\n\ + lsr r1, #16\n\ + mov r0, #0x1A\n\ + bl SetGpuReg\n\ + b _0817B4FA\n\ + .pool\n\ +_0817B4F0:\n\ + ldr r0, =gUnknown_0203BD24\n\ + ldrh r1, [r0]\n\ + mov r0, #0x1A\n\ + bl SetGpuReg\n\ +_0817B4FA:\n\ + ldr r0, =gTasks\n\ + lsl r1, r5, #2\n\ + add r1, r5\n\ + lsl r1, #3\n\ + add r2, r1, r0\n\ + ldrh r0, [r2, #0x16]\n\ + lsl r3, r0, #16\n\ + cmp r3, #0\n\ + beq _0817B532\n\ + mov r1, #0x18\n\ + ldrsh r0, [r2, r1]\n\ + lsl r0, #16\n\ + ldrh r1, [r2, #0x1A]\n\ + add r1, r0, r1\n\ + lsr r0, r3, #12\n\ + sub r1, r0\n\ + asr r0, r1, #16\n\ + strh r0, [r2, #0x18]\n\ + strh r1, [r2, #0x1A]\n\ + ldrh r1, [r2, #0x18]\n\ + mov r0, #0x1C\n\ + bl SetGpuReg\n\ + ldr r0, =gUnknown_0203BD24\n\ + ldrh r1, [r0]\n\ + mov r0, #0x1E\n\ + bl SetGpuReg\n\ +_0817B532:\n\ + pop {r4,r5}\n\ + pop {r0}\n\ + bx r0\n\ + .pool"); +} +#endif // NONMATCHING + +void sub_817B540(u8 mode) +{ + u16 x; + u16 y; + switch (mode) + { + case 0: + default: + /* stuff */ + if (gMain.vblankCounter1 & 3 || gPaletteFade.active) + break; + if (gMain.vblankCounter1 & 4) + { + x = gPlttBufferUnfaded[9]; + y = gPlttBufferUnfaded[10]; + } + else + { + x = gPlttBufferUnfaded[10]; + y = gPlttBufferUnfaded[9]; + } + LoadPalette(&x, 9, 2); + LoadPalette(&y, 10, 2); + break; + case 2: + if (gMain.vblankCounter1 & 3 || gPaletteFade.active) + break; + if (gMain.vblankCounter1 & 4) + { + x = 0x3D27; + y = 0x295; + } + else + { + x = 0x31C; + y = 0x3D27; + } + LoadPalette(&x, 12, 2); + LoadPalette(&y, 13, 2); + break; + case 1: + break; + } +} + +static void sub_817B62C(struct Sprite *sprite) +{ + s32 var; + s16 var2 = gUnknown_0203BD28; + + if (var2 != 2) + { + switch (var2) + { + default: + DestroySprite(sprite); + break; + case 0: + var = ((sprite->pos1.x << 16) | (u16)sprite->data[2]) + (u16)sprite->data[1]; + sprite->pos1.x = var >> 16; + sprite->data[2] = var; + if (sprite->pos1.x > 0xFF) + sprite->pos1.x = -0x20; + if (sprite->data[0]) + sprite->pos2.y = -(gUnknown_0203BD24 + gUnknown_0203BD26); + else + sprite->pos2.y = -gUnknown_0203BD24; + break; + } + } +} + +static void sub_817B698(u8 a, const struct IntroCreditsSpriteMetadata *b, const union AnimCmd *const *c, u8 d) +{ + u8 i; + + for(i = 0; i < d; i++) + { + u8 sprite = CreateSprite(&gUnknown_085F504C, b[i].x, b[i].y, b[i].subpriority); + CalcCenterToCornerVec(&gSprites[sprite], b[i].shape, b[i].size, 0); + gSprites[sprite].oam.priority = 3; + gSprites[sprite].oam.shape = b[i].shape; + gSprites[sprite].oam.size = b[i].size; + gSprites[sprite].oam.paletteNum = 0; + gSprites[sprite].anims = c; + StartSpriteAnim(&gSprites[sprite], b[i].animNum); + gSprites[sprite].data[0] = a; + gSprites[sprite].data[1] = b[i].xOff; + gSprites[sprite].data[2] = 0; + } +} + +static void sub_817B76C(void) +{ + sub_817B698(0, gUnknown_085F50A4, gUnknown_085F5094, 9); +} + +static void sub_817B788(void) +{ + sub_817B698(1, gUnknown_085F5120, gUnknown_085F5114, 12); +} + +static void sub_817B7A4(void) +{ + sub_817B698(1, gUnknown_085F519C, gUnknown_085F5198, 6); +} + +static void nullsub_65(struct Sprite *sprite) +{ +} + +static void sub_817B7C4(struct Sprite* sprite) +{ + sprite->invisible = gSprites[sprite->data[0]].invisible; + sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; + sprite->pos1.y = gSprites[sprite->data[0]].pos1.y + 8; + sprite->pos2.x = gSprites[sprite->data[0]].pos2.x; + sprite->pos2.y = gSprites[sprite->data[0]].pos2.y; +} + +u8 intro_create_brendan_sprite(s16 a, s16 b) +{ + u8 sprite = CreateSprite(&gUnknown_085F51EC, a, b, 2); + u8 brendan = CreateSprite(&gUnknown_085F523C, a, b + 8, 3); + gSprites[brendan].data[0] = sprite; + return sprite; +} + +u8 intro_create_may_sprite(s16 a, s16 b) +{ + u8 sprite = CreateSprite(&gUnknown_085F5204, a, b, 2); + u8 may = CreateSprite(&gUnknown_085F5254, a, b + 8, 3); + gSprites[may].data[0] = sprite; + return sprite; +} + +static void nullsub_66(struct Sprite *sprite) +{ +} + +static void sub_817B8E8(struct Sprite* sprite) +{ + sprite->invisible = gSprites[sprite->data[0]].invisible; + sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; + sprite->pos2.x = gSprites[sprite->data[0]].pos2.x; + sprite->pos2.y = gSprites[sprite->data[0]].pos2.y; +} + +static u8 sub_817B948(s16 a, s16 b) +{ + u8 sprite = CreateSprite(&gUnknown_085F528C, a - 32, b, 5); + u8 latios = CreateSprite(&gUnknown_085F528C, a + 32, b, 6); + gSprites[latios].data[0] = sprite; + StartSpriteAnim(&gSprites[latios], 1); + gSprites[latios].callback = &sub_817B8E8; + return sprite; +} + +u8 intro_create_flygon_sprite(s16 a, s16 b) +{ + u8 sprite = CreateSprite(&gUnknown_085F52A4, a - 32, b, 5); + u8 flygon = CreateSprite(&gUnknown_085F52A4, a + 32, b, 6); + gSprites[flygon].data[0] = sprite; + StartSpriteAnim(&gSprites[flygon], 1); + gSprites[flygon].callback = &sub_817B8E8; + return sprite; +} diff --git a/src/main.c b/src/main.c index 3be6b91c7..f04f9b61b 100644 --- a/src/main.c +++ b/src/main.c @@ -166,7 +166,7 @@ static void InitMainCallbacks(void) gUnknown_0203CF5C = NULL; gMain.vblankCounter2 = 0; gMain.callback1 = NULL; - SetMainCallback2(c2_copyright_1); + SetMainCallback2(CB2_InitCopyrightScreenAfterBootup); gSaveBlock2Ptr = &gSaveblock2; gPokemonStoragePtr = &gPokemonStorage; } diff --git a/src/mystery_event_menu.c b/src/mystery_event_menu.c index 22e50f4e7..8a7671c5b 100644 --- a/src/mystery_event_menu.c +++ b/src/mystery_event_menu.c @@ -241,7 +241,7 @@ static void CB2_MysteryEventMenu(void) u16 unkVal = RunMysteryEventScript(gDecompressionBuffer); CpuFill32(0, gDecompressionBuffer, 0x7D4); if (!GetEventLoadMessage(gStringVar4, unkVal)) - TrySavingData(NORMAL_SAVE); + TrySavingData(SAVE_NORMAL); gMain.state++; } break; diff --git a/src/reset_save_heap.c b/src/reset_save_heap.c index 50692d356..1d90448b2 100644 --- a/src/reset_save_heap.c +++ b/src/reset_save_heap.c @@ -20,8 +20,8 @@ void sub_81700F8(void) gMain.inBattle = FALSE; SetSaveBlocksPointers(sub_815355C()); sub_808447C(); - ResetSaveCounters(); - sub_81534D0(0); + Save_ResetSaveCounters(); + Save_LoadGameData(0); if (gSaveFileStatus == 0 || gSaveFileStatus == 2) Sav2_ClearSetDefault(); SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound); diff --git a/src/save.c b/src/save.c index 8d77e801a..8025d6586 100644 --- a/src/save.c +++ b/src/save.c @@ -3,6 +3,7 @@ #include "save.h" #include "constants/game_stat.h" #include "task.h" +#include "decompress.h" // for the chunk declarations extern struct SaveBlock2 gSaveblock2; @@ -96,7 +97,7 @@ void ClearSaveData(void) } } -void ResetSaveCounters(void) +void Save_ResetSaveCounters(void) { gSaveCounter = 0; gLastWrittenSector = 0; @@ -670,25 +671,25 @@ u8 HandleSavingData(u8 saveType) UpdateSaveAddresses(); switch (saveType) { - case HOF_DELETE_SAVE: // deletes HOF before overwriting HOF completely. unused + case SAVE_HALL_OF_FAME_ERASE_BEFORE: // deletes HOF before overwriting HOF completely. unused for (i = 0xE * 2 + 0; i < 32; i++) EraseFlashSector(i); - case HOF_SAVE: // hall of fame. + case SAVE_HALL_OF_FAME: // hall of fame. if (GetGameStat(GAME_STAT_ENTERED_HOF) < 999) IncrementGameStat(GAME_STAT_ENTERED_HOF); SaveSerializedGame(); save_write_to_flash(0xFFFF, gRamSaveSectionLocations); - tempAddr = (u8 *)0x201C000; // FIXME: make this a label. + tempAddr = gDecompressionBuffer; HandleWriteSectorNBytes(0x1C, tempAddr, 0xF80); HandleWriteSectorNBytes(0x1D, tempAddr + 0xF80, 0xF80); break; - case NORMAL_SAVE: // normal save. also called by overwriting your own save. + case SAVE_NORMAL: // normal save. also called by overwriting your own save. default: SaveSerializedGame(); save_write_to_flash(0xFFFF, gRamSaveSectionLocations); break; - case LINK_SAVE: // _081532C4 - case LINK2_SAVE: + case SAVE_LINK: // _081532C4 + case SAVE_LINK2: SaveSerializedGame(); for(i = 0; i < 5; i++) ClearSaveData_2(i, gRamSaveSectionLocations); @@ -702,7 +703,7 @@ u8 HandleSavingData(u8 saveType) save_write_to_flash(0, gRamSaveSectionLocations); break; */ - case DIFFERENT_FILE_SAVE: + case SAVE_OVERWRITE_DIFFERENT_FILE: for (i = (0xE * 2 + 0); i < 32; i++) EraseFlashSector(i); // erase HOF. SaveSerializedGame(); @@ -799,7 +800,7 @@ bool8 sub_8153474(void) return retVal; } -u8 sub_81534D0(u8 a1) +u8 Save_LoadGameData(u8 a1) { u8 result; diff --git a/src/starter_choose.c b/src/starter_choose.c index 83a7b8112..480edbcb7 100644 --- a/src/starter_choose.c +++ b/src/starter_choose.c @@ -25,12 +25,6 @@ #define STARTER_PKMN_POS_X 120 #define STARTER_PKMN_POS_Y 64 -// graphics -extern const u32 gBirchHelpGfx[]; -extern const u32 gBirchBagTilemap[]; -extern const u32 gBirchGrassTilemap[]; -extern const u16 gBirchBagGrassPal[]; - // text extern const u8 gText_BirchInTrouble[]; extern const u8 gText_ConfirmStarterChoice[]; |