オートセーブ/オートロードを実装。
DLDI パッチを当ててなくても遊べるというのがミソ。
パッチ未適用時には、ハイスコア、シークレットモードフラグが記録されず
次回電源投入時リセットされるだけ(ソフトウェアリセット中なら記録は保持)。
初回起動時にロードを実行、ハイスコア更新時とシークレットフラグが立ったときのみセーブを実行してる。
NDS 自作プログラムの実機実行はフラッシュメモリ上がデファクトスタンダードなものだから
少しでも無駄な書込は控えて、メモリの延命に対する配慮は必要かな、と。
ファイルモジュールはこんな感じ(ややベタ書き)。
File.h
/*--------------------------------------------------------------------------------- shtwatch file module header version 0.01 Feb 13, 2010 By. REGEKATSU ---------------------------------------------------------------------------------*/ #ifndef _FILE_H_ #define _FILE_H_ #ifdef __cplusplus extern "C" { #endif void File_Init(void); int File_LoadData(void); int File_SaveData(void); #ifdef __cplusplus } #endif #endif //_FILE_H_
File.c
/*--------------------------------------------------------------------------------- shtwatch file module routine version 0.01 Feb 13, 2010 By. REGEKATSU ---------------------------------------------------------------------------------*/ #include <stdio.h> #include <fat.h> #include "Swtypes.h" #include "File.h" #include "State.h" #define FILE_NAME "SHTWATCH.DAT" //--------------------------------------------------------------------------------- void File_Init(void){ //--------------------------------------------------------------------------------- File_LoadData(); } //--------------------------------------------------------------------------------- int File_LoadData(void){ //--------------------------------------------------------------------------------- if(fatInitDefault() == false) return 0; FILE *fp; SwStatus sw[2]; int i; //ファイル読込の初期化。 if( (fp = fopen(FILE_NAME, "rb") ) == NULL ){ fclose(fp); return 0; } //ファイルから一時領域へ読込。 for(i = 0;i < 2;i++){ fread(&sw[i].high_score, sizeof(sw[i].high_score), 1, fp); fread(&sw[i].secret[0], sizeof(sw[i].secret[0]), 1, fp); fread(&sw[i].secret[1], sizeof(sw[i].secret[1]), 1, fp); } fclose(fp); //一時領域からステートへ出力。 for(i = 0;i < 2;i++){ State_SetHighScore(sw[i].high_score, i); State_SetSecret1(sw[i].secret[0], i); State_SetSecret2(sw[i].secret[1], i); } return 1; } //--------------------------------------------------------------------------------- int File_SaveData(void){ //--------------------------------------------------------------------------------- if(fatInitDefault() == false) return 0; FILE *fp; SwStatus sw[2]; int i; //ファイル書込の初期化。 if( (fp = fopen(FILE_NAME, "wb") ) == NULL ){ fclose(fp); return 0; } //ステートから一時領域へ出力。 for(i = 0;i < 2;i++){ sw[i].high_score = State_GetHighScore(i); sw[i].secret[0] = State_GetSecret1(i); sw[i].secret[1] = State_GetSecret2(i); } //一時領域からファイルへ書込。 for(i = 0;i < 2;i++){ fwrite(&sw[i].high_score, sizeof(sw[i].high_score), 1, fp); fwrite(&sw[i].secret[0], sizeof(sw[i].secret[0]), 1, fp); fwrite(&sw[i].secret[1], sizeof(sw[i].secret[1]), 1, fp); } fclose(fp); return 1; } //---------------------------------------------------------------------------------