diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c index 792654a2..af9c38b6 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -20,6 +20,7 @@ #include #include #include +#include #include "internal_api.h" #include "fs_wram.h" @@ -61,6 +62,8 @@ #define SYSM_TITLE_MESSAGE_ARRAY_MAX 1 +#define SIZE_16KB ( 16 * 1024 ) + typedef struct MbAuthCode { char magic_code[2]; // マジックナンバー @@ -1546,6 +1549,86 @@ BOOL SYSM_IsAuthenticateTitleFinished( void ) return OS_IsThreadTerminated( &s_auth_thread ); } +// アプリ起動に必要なセーブファイルやSharedファイルのリカバリ +static char *s_strResult[] = { + "Target file exists and file size matched.", + "File size didn't match. Changing size succeeded.", + "Target file didn't exist. Creating file and setting size succeeded.", + "ERROR: File Recovery Failed." +}; +static void SYSMi_FileRecovery( TitleProperty *pBootTitle ) +{ + ROM_Header_Short *hs = ( ROM_Header_Short *)SYSM_APP_ROM_HEADER_BUF; + char path[2][ FS_ENTRY_LONGNAME_MAX ]; + UTL_RecoveryStatus stat; + + // TWL非対応のときは不要なのでreturn + if ( !(hs->platform_code & PLATFORM_CODE_FLAG_TWL) ) + { + return; + } + + // NANDアプリのときだけ + if ( pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_NAND ) + { + // get savedata_path + s32 result = NAM_GetTitleSaveFilePath( path[ 0 ], path[ 1 ], hs->titleID ); + + // pub_save + if( result == NAM_OK && hs->public_save_data_size != 0 ) + { + stat = UTL_RecoveryFile( path[0], hs->public_save_data_size ); + OS_TPrintf("pub_save recovery result : %s \n", s_strResult[stat]); + } + + // prv_save + if( result == NAM_OK && hs->private_save_data_size != 0 ) + { + stat = UTL_RecoveryFile( path[1], hs->private_save_data_size ); + OS_TPrintf("prv_save recovery result : %s \n", s_strResult[stat]); + } + + // sub_banner + if( hs->exFlags.availableSubBannerFile && NAM_GetTitleBannerFilePath( path[0], hs->titleID ) == NAM_OK ) + { + stat = UTL_RecoveryFile( path[0], SIZE_16KB ); + OS_TPrintf("sub_banner recovery result : %s \n", s_strResult[stat]); + } + } + + // shared2 (size+1) * 16kb + if( hs->shared2_file0_size != 0 ) + { + stat = UTL_RecoveryFile( "nand:/shared2/0000", (u32)( hs->shared2_file0_size + 1 ) * SIZE_16KB ); + OS_TPrintf("shared2_0 recovery result : %s \n", s_strResult[stat]); + } + if( hs->shared2_file1_size != 0 ) + { + stat = UTL_RecoveryFile( "nand:/shared2/0001", (u32)( hs->shared2_file1_size + 1 ) * SIZE_16KB ); + OS_TPrintf("shared2_1 recovery result : %s \n", s_strResult[stat]); + } + if( hs->shared2_file2_size != 0 ) + { + stat = UTL_RecoveryFile( "nand:/shared2/0002", (u32)( hs->shared2_file2_size + 1 ) * SIZE_16KB ); + OS_TPrintf("shared2_2 recovery result : %s \n", s_strResult[stat]); + } + if( hs->shared2_file3_size != 0 ) + { + stat = UTL_RecoveryFile( "nand:/shared2/0003", (u32)( hs->shared2_file3_size + 1 ) * SIZE_16KB ); + OS_TPrintf("shared2_3 recovery result : %s \n", s_strResult[stat]); + } + if( hs->shared2_file4_size != 0 ) + { + stat = UTL_RecoveryFile( "nand:/shared2/0004", (u32)( hs->shared2_file4_size + 1 ) * SIZE_16KB ); + OS_TPrintf("shared2_4 recovery result : %s \n", s_strResult[stat]); + } + if( hs->shared2_file5_size != 0 ) + { + stat = UTL_RecoveryFile( "nand:/shared2/0005", (u32)( hs->shared2_file5_size + 1 ) * SIZE_16KB ); + OS_TPrintf("shared2_5 recovery result : %s \n", s_strResult[stat]); + } +} + // ロード済みの指定タイトルの認証とブートを行う // SYSM_GetNandTitleListまたはSYSM_GetNandTitleListMakerInfoのどちらかをSYSM_TryToBootTitle前に呼ぶ必要あり void SYSM_TryToBootTitle( TitleProperty *pBootTitle ) @@ -1583,6 +1666,9 @@ void SYSM_TryToBootTitle( TitleProperty *pBootTitle ) // ブート種別仮セット SYSMi_GetWork()->appBootType = s_launcherToOSBootType[ pBootTitle->flags.bootType ]; + // ブート時ファイルリカバリ処理 + SYSMi_FileRecovery( pBootTitle ); + // タイトルIDリストの作成 SYSMi_makeTitleIdList(); diff --git a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c index 65df4f7d..f9d5a113 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c @@ -66,9 +66,9 @@ // フェードアウト関係 #define FADE_COUNT_PER_ALPHA ((FADE_COUNT_MAX - FADE_START) / ALPHA_MAX) -#define FADE_COUNT_MAX 124 +#define FADE_COUNT_MAX 62 #define ALPHA_MAX 31 -#define FADE_START 62 +#define FADE_START 31 // extern data------------------------------------------ @@ -351,7 +351,7 @@ static void BannerDraw(int selected, TitleProperty *titleprop) } if(fadecount < (FADE_COUNT_MAX - FADE_START)) { - fadecount += 2; + fadecount += 1; G2_ChangeBlendAlpha( ALPHA_MAX-((fadecount)/FADE_COUNT_PER_ALPHA), (fadecount)/FADE_COUNT_PER_ALPHA ); } } @@ -425,14 +425,20 @@ BOOL LauncherFadeout( TitleProperty *pTitleList ) { MtxFx22 mtx; static double wa; - double s = cos(wa*3); - if( s!=0 ) mtx._00 = (fx32)((s_selected_banner_size/s) * (1.0 + wa)); - else mtx._00 = 0x8fff; - mtx._01 = 0; - mtx._10 = 0; - mtx._11 = (fx32)(s_selected_banner_size * (1.0 + wa)); + double s = sin(wa*2.2); + double c = cos(wa*2.2); + mtx._00 = (fx32)((s_selected_banner_size*c) * (1.0 + wa)); + mtx._01 = (fx32)((s_selected_banner_size*s) * (1.0 + wa)); + mtx._10 = (fx32)((s_selected_banner_size*-s) * (1.0 + wa)); + mtx._11 = (fx32)((s_selected_banner_size*c) * (1.0 + wa)); + + //if( c!=0 ) mtx._00 = (fx32)((s_selected_banner_size/c) * (1.0 + wa)); + //else mtx._00 = 0x8fff; + //mtx._01 = 0; + //mtx._10 = 0; + //mtx._11 = (fx32)(s_selected_banner_size * (1.0 + wa)); G2_SetOBJAffine((GXOamAffine *)(&banner_oam_attr[0]), &mtx); - wa += 0.0333333333333; + wa += 0.1; } // OAMをVRAMへロード