diff --git a/include/common.h b/include/common.h index 9f954b8..9238c03 100644 --- a/include/common.h +++ b/include/common.h @@ -35,6 +35,9 @@ #define THEMES_PATH "/Themes/" #define SPLASHES_PATH "/Splashes/" +#define SINGLE_INSTALL 0 +#define SHUFFLE_INSTALL 1 +#define BGM_INSTALL 2 static const int THEMES_PER_SCREEN = 4; diff --git a/include/draw.h b/include/draw.h index b30746f..fa4dabb 100644 --- a/include/draw.h +++ b/include/draw.h @@ -33,7 +33,7 @@ void init_screens(void); void exit_screens(void); -void draw_theme_install(bool shuffle_install); +void draw_theme_install(int install_type); void draw_theme_interface(Theme_s * themes_list, int theme_count, int selected_theme, bool preview_mode); void draw_splash_install(void); void draw_splash_interface(Splash_s *splashes_list, int splash_count, int selected_splash, bool preview_mode); diff --git a/include/themes.h b/include/themes.h index 4b9c472..47b61c9 100644 --- a/include/themes.h +++ b/include/themes.h @@ -50,5 +50,6 @@ void load_theme_preview(Theme_s *theme); Result get_themes(Theme_s **themes_list, int *theme_count); Result single_install(Theme_s theme); Result shuffle_install(Theme_s *themes_list, int theme_count); +Result bgm_install(Theme_s bgm_to_install); #endif \ No newline at end of file diff --git a/source/draw.c b/source/draw.c index 86663aa..ad6c697 100644 --- a/source/draw.c +++ b/source/draw.c @@ -94,10 +94,23 @@ void draw_base_interface(void) pp2d_draw_on(GFX_TOP); } -void draw_theme_install(bool shuffle_install) +void draw_theme_install(int install_type) { draw_base_interface(); - pp2d_draw_textf(20, 30, 0.7, 0.7, COLOR_WHITE, "Installing a %s theme...", !shuffle_install ? "single" : "shuffle"); + switch(install_type) + { + case 0: + pp2d_draw_text(20, 30, 0.7, 0.7, COLOR_WHITE, "Installing a single theme..."); + break; + case 1: + pp2d_draw_text(20, 30, 0.7, 0.7, COLOR_WHITE, "Installing a shuffle theme..."); + break; + case 2: + pp2d_draw_text(20, 30, 0.7, 0.7, COLOR_WHITE, "Installing BGM..."); + break; + default: + break; + } pp2d_end_draw(); } @@ -139,9 +152,12 @@ void draw_theme_interface(Theme_s * themes_list, int theme_count, int selected_t utf16_to_utf32((u32*)description, current_theme.desc, 0x80); pp2d_draw_wtext(20, 65, 0.5, 0.5, COLOR_WHITE, description); - pp2d_draw_wtext_center(GFX_TOP, 150, 0.7, 0.7, COLOR_WHITE, L"\uE000 Install Theme \uE004 Switch to Splashes"); - pp2d_draw_wtext_center(GFX_TOP, 180, 0.7, 0.7, COLOR_WHITE, L"\uE001 Queue Shuffle \uE046 Install Shuffle"); - pp2d_draw_wtext_center(GFX_TOP, 210, 0.7, 0.7, COLOR_WHITE, L"\uE003 Preview Theme"); + pp2d_draw_wtext(20, 150, 0.6, 0.6, COLOR_WHITE, L"\uE046 Install Shuffle Theme"); + pp2d_draw_wtext(200, 150, 0.6, 0.6, COLOR_WHITE, L"\uE004 Switch to Splashes"); + pp2d_draw_wtext(20, 180, 0.6, 0.6, COLOR_WHITE, L"\uE000 Install Theme"); + pp2d_draw_wtext(200, 180, 0.6, 0.6, COLOR_WHITE, L"\uE001 Queue Shuffle"); + pp2d_draw_wtext(20, 210, 0.6, 0.6, COLOR_WHITE, L"\uE002 Install BGM"); + pp2d_draw_wtext(200, 210, 0.6, 0.6, COLOR_WHITE, L"\uE003 Preview Theme"); pp2d_draw_on(GFX_BOTTOM); diff --git a/source/main.c b/source/main.c index 2fedd80..0cae356 100644 --- a/source/main.c +++ b/source/main.c @@ -125,7 +125,8 @@ int main(void) // Actions else if (kDown & KEY_X) { - // install_bgm(current_theme); + draw_theme_install(BGM_INSTALL); + bgm_install(*current_theme); } else if (kDown & KEY_A) { @@ -135,7 +136,7 @@ int main(void) splash_install(*current_splash); svcSleepThread(5e8); } else { - draw_theme_install(false); + draw_theme_install(SINGLE_INSTALL); single_install(*current_theme); } } @@ -168,7 +169,7 @@ int main(void) } else { if (shuffle_theme_count > 0) { - draw_theme_install(true); + draw_theme_install(SHUFFLE_INSTALL); shuffle_install(themes_list, theme_count); } } diff --git a/source/themes.c b/source/themes.c index 1b34b21..da00cf9 100644 --- a/source/themes.c +++ b/source/themes.c @@ -189,6 +189,75 @@ Result get_themes(Theme_s **themes_list, int *theme_count) return res; } +Result bgm_install(Theme_s bgm_to_install) +{ + char *savedata_buf; + char *thememanage_buf; + char *music; + u32 music_size = 0; + u32 savedata_size; + + savedata_size = file_to_buf(fsMakePath(PATH_ASCII, "/SaveData.dat"), ArchiveHomeExt, &savedata_buf); + savedata_buf[0x141b] = 0; + memset(&savedata_buf[0x13b8], 0, 8); + savedata_buf[0x13bd] = 3; + savedata_buf[0x13b8] = 0xff; + u32 size = buf_to_file(savedata_size, "/SaveData.dat", ArchiveHomeExt, savedata_buf); + free(savedata_buf); + + if (bgm_to_install.is_zip) // Same as above but this time with bgm + { + music_size = zip_file_to_buf("bgm.bcstm", bgm_to_install.path, &music); + } else { + u16 path[0x106] = {0}; + memcpy(path, bgm_to_install.path, 0x106 * sizeof(u16)); + struacat(path, "/bgm.bcstm"); + music_size = file_to_buf(fsMakePath(PATH_UTF16, path), ArchiveSD, &music); + } + + if (music_size == 0) + { + free(music); + music = calloc(1, 3371008); + } else if (music_size > 3371008) { + free(music); + puts("musicrip"); + return MAKERESULT(RL_PERMANENT, RS_CANCELED, RM_APPLICATION, RD_TOO_LARGE); + } + + size = buf_to_file(music_size, "/BgmCache.bin", ArchiveThemeExt, music); + free(music); + + if (size == 0) return MAKERESULT(RL_PERMANENT, RS_CANCELED, RM_APPLICATION, RD_NOT_FOUND); + + file_to_buf(fsMakePath(PATH_ASCII, "/ThemeManage.bin"), ArchiveThemeExt, &thememanage_buf); + thememanage_buf[0x00] = 1; + thememanage_buf[0x01] = 0; + thememanage_buf[0x02] = 0; + thememanage_buf[0x03] = 0; + thememanage_buf[0x04] = 0; + thememanage_buf[0x05] = 0; + thememanage_buf[0x06] = 0; + thememanage_buf[0x07] = 0; + + u32 *music_size_location = (u32*)(&thememanage_buf[0xC]); + *music_size_location = music_size; + + thememanage_buf[0x10] = 0xFF; + thememanage_buf[0x14] = 0x01; + thememanage_buf[0x18] = 0xFF; + thememanage_buf[0x1D] = 0x02; + + memset(&thememanage_buf[0x338], 0, 4); + memset(&thememanage_buf[0x340], 0, 4); + memset(&thememanage_buf[0x360], 0, 4); + memset(&thememanage_buf[0x368], 0, 4); + size = buf_to_file(0x800, "/ThemeManage.bin", ArchiveThemeExt, thememanage_buf); + free(thememanage_buf); + + return 0; +} + // Install a single theme Result single_install(Theme_s theme_to_install) { @@ -200,8 +269,6 @@ Result single_install(Theme_s theme_to_install) u32 music_size; u32 savedata_size; - printf("Writing SaveData.dat...\n"); - savedata_size = file_to_buf(fsMakePath(PATH_ASCII, "/SaveData.dat"), ArchiveHomeExt, &savedata_buf); savedata_buf[0x141b] = 0; memset(&savedata_buf[0x13b8], 0, 8); @@ -211,7 +278,6 @@ Result single_install(Theme_s theme_to_install) free(savedata_buf); // Open body cache file. Test if theme is zipped - printf("Writing BodyCache.bin...\n"); if (theme_to_install.is_zip) { body_size = zip_file_to_buf("body_LZ.bin", theme_to_install.path, &body); @@ -236,7 +302,6 @@ Result single_install(Theme_s theme_to_install) if (size == 0) return MAKERESULT(RL_PERMANENT, RS_CANCELED, RM_APPLICATION, RD_NOT_FOUND); - printf("Writing BgmCache.bin...\n"); if (theme_to_install.is_zip) // Same as above but this time with bgm { music_size = zip_file_to_buf("bgm.bcstm", theme_to_install.path, &music); @@ -262,7 +327,6 @@ Result single_install(Theme_s theme_to_install) if (size == 0) return MAKERESULT(RL_PERMANENT, RS_CANCELED, RM_APPLICATION, RD_NOT_FOUND); - printf("Writing ThemeManage.bin...\n"); file_to_buf(fsMakePath(PATH_ASCII, "/ThemeManage.bin"), ArchiveThemeExt, &thememanage_buf); thememanage_buf[0x00] = 1; thememanage_buf[0x01] = 0; @@ -290,8 +354,6 @@ Result single_install(Theme_s theme_to_install) size = buf_to_file(0x800, "/ThemeManage.bin", ArchiveThemeExt, thememanage_buf); free(thememanage_buf); - printf("Done!\n"); - return 0; }