読者です 読者をやめる 読者になる 読者になる

ハートに16連射。(25)


オートセーブ/オートロードを実装。


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;
	
}

//---------------------------------------------------------------------------------