ハートに16連射。(21)


基本状態遷移の作成といいかげん時計1、2の実装まで。


タイトル画面からの項目選択によって次に実行するシーンが変更されるような実装をしたこと無かったんで
akkera102 さんとこの GBA develop Wiki にあった「にもつくん」の遷移を参考にして組んでみた。
遷移情報をグローバルにしてみる案もあったがそれをやると
他のモジュールと比べてみたとき整合性が整わなくなるので止めた。


初代←→プロ の切替を実装。
シューティングモードと時計モードはどちらも機能するので両方で使えるように手直し。
シューティングモードだと初代とプロでの隠しコマンドを切り替えるとか、
時計モードだとプロのときにいいかげん時計1または2のフラグが立ってたら動作させないとか。


いいかげん時計1、2は1モジュールとして作成。
呼ばれたときにシークレット1、または2のフラグによって1または2へ切替。
両フラグが立ってなければ動作しないようにしてある。


いいかげん時計モードのソースはこんな感じ。
(過去のモジュールのみではビルドできないので実装の雰囲気だけでも。)


RandMode module test


RandMode.h

/*---------------------------------------------------------------------------------
	
	shtwatch
	randMode module header
	
	version 0.01
	Feb 09, 2010
	
	By. REGEKATSU
	
---------------------------------------------------------------------------------*/

#ifndef _RAND_MODE_H_
#define _RAND_MODE_H_


#ifdef __cplusplus
extern "C" {
#endif


void RandMode_Clear(void);
void RandMode_Update(void);
bool RandMode_IsExit(void);


#ifdef __cplusplus
}
#endif

#endif	//_RAND_MODE_H_


RandMode.c

/*---------------------------------------------------------------------------------
	
	shtwatch
	randMode module routine
	
	version 0.01
	Feb 09, 2010
	
	By. REGEKATSU
	
---------------------------------------------------------------------------------*/

#include <stdio.h>//debug print
#include <string.h>
#include <nds/ndstypes.h>
#include <nds/arm9/input.h>
#include "RandMode.h"
#include "State.h"
#include "Spr.h"
#include "Rtc.h"


#define CYCLE_1 30
#define CYCLE_2 15


typedef enum{
	RAND_MODE_INIT = 0, 
	RAND_MODE_BEGIN, 
	RAND_MODE_EXEC, 
	RAND_MODE_EXIT
}RAND_MODE_ACT;

typedef struct{
	
	u16 act;
	
	int cycle;
	
	u32 frame;
	int second;
	int minute;
	int hour;
	
}RandModeStatus;

static RandModeStatus st_rand_mode;


void randMode_Init(void);
void randMode_Begin(void);
void randMode_Exec(void);
void randMode_Exit(void);
void randMode_ExecFrame(void);
void randMode_DrawFrame(void);
void randMode_ExecTime(void);
void randMode_DrawTime(void);


//---------------------------------------------------------------------------------
void RandMode_Clear(void){
//---------------------------------------------------------------------------------
	
	randMode_Exit();
	
}

//---------------------------------------------------------------------------------
void RandMode_Update(void){
//---------------------------------------------------------------------------------
	
	switch(st_rand_mode.act){
		
	case RAND_MODE_INIT:
		randMode_Init();
		break;
		
	case RAND_MODE_BEGIN:
		randMode_Begin();
		break;
		
	case RAND_MODE_EXEC:
		randMode_Exec();
		break;
		
	case RAND_MODE_EXIT:
		randMode_Exit();
		break;
		
	}
	
}

//---------------------------------------------------------------------------------
void randMode_Init(void){
//---------------------------------------------------------------------------------
	
	memset(&st_rand_mode, 0, sizeof(st_rand_mode));
	
	if(State_GetSecret1(SW_PRO) == true){
		st_rand_mode.cycle = CYCLE_1;
		Spr_SetCursor(BIT(3));
		
	}else if(State_GetSecret2(SW_PRO) == true){
		st_rand_mode.cycle = CYCLE_2;
		Spr_SetCursor(BIT(4));
		
	}else{
		st_rand_mode.act = RAND_MODE_EXIT;
		return;
	}
	
	Spr_SetColon(3);
	randMode_ExecTime();
	
	st_rand_mode.act = RAND_MODE_BEGIN;
	
}

//---------------------------------------------------------------------------------
void randMode_Begin(void){
//---------------------------------------------------------------------------------
	
	if(st_rand_mode.second != Rtc_GetSecond()){
		randMode_ExecFrame();
		randMode_ExecTime();
		st_rand_mode.act = RAND_MODE_EXEC;
	}
	
	if( (keysDown() & KEY_SELECT) && ( (keysCurrent() & ~KEY_SELECT) == 0) ){
		st_rand_mode.act = RAND_MODE_EXIT;
	}
	
}

//---------------------------------------------------------------------------------
void randMode_Exec(void){
//---------------------------------------------------------------------------------
	
	randMode_ExecFrame();
	
	if(Rtc_GetMinute() % st_rand_mode.cycle == 0){
		randMode_ExecTime();
	}
	
	if( (keysDown() & KEY_SELECT) && ( (keysCurrent() & ~KEY_SELECT) == 0) ){
		st_rand_mode.act = RAND_MODE_EXIT;
	}
	
}

//---------------------------------------------------------------------------------
void randMode_Exit(void){
//---------------------------------------------------------------------------------
	
	printf("\x01b[2J");//debug print
	Spr_Clear();
	st_rand_mode.act = RAND_MODE_INIT;
	
}

//---------------------------------------------------------------------------------
void randMode_ExecFrame(void){
//---------------------------------------------------------------------------------
	
	st_rand_mode.frame++;
	
	if(st_rand_mode.second != Rtc_GetSecond()){
		st_rand_mode.second = Rtc_GetSecond();
		st_rand_mode.frame = 0;
	}
	
	randMode_DrawFrame();
	
}

//---------------------------------------------------------------------------------
void randMode_DrawFrame(void){
//---------------------------------------------------------------------------------
	
	if(st_rand_mode.frame == 0){
		printf("\x01b[9;7H    ");//debug print
		Spr_SetSegment(0, 0, SEG_SECOND);
		
	}else if(st_rand_mode.frame == 30){
		printf("\x01b[9;7HKORO");//debug print
		Spr_SetSegment(0x3f, 0x0f, SEG_SECOND);
	}
	
}

//---------------------------------------------------------------------------------
void randMode_ExecTime(void){
//---------------------------------------------------------------------------------
	
	st_rand_mode.minute = Rtc_GetMinute();
	st_rand_mode.hour = Rtc_GetHour();
	
	randMode_DrawTime();
	
}

//---------------------------------------------------------------------------------
void randMode_DrawTime(void){
//---------------------------------------------------------------------------------
	
	switch(st_rand_mode.cycle){
		
	case CYCLE_1:
		//debug print
		printf("\x01b[9;0H %2d:%02d ", st_rand_mode.hour, st_rand_mode.minute / CYCLE_1 * CYCLE_1);
		
		Spr_SetNumber(SEG_MINUTE, st_rand_mode.minute / CYCLE_1 * CYCLE_1, true);
		Spr_SetNumber(SEG_HOUR, st_rand_mode.hour, false);
		break;
		
	case CYCLE_2:
		//debug print
		printf("\x01b[9;0H %2d:%02d ", st_rand_mode.hour, st_rand_mode.minute / CYCLE_2 * CYCLE_2);
		
		Spr_SetNumber(SEG_MINUTE, st_rand_mode.minute / CYCLE_2 * CYCLE_2, true);
		Spr_SetNumber(SEG_HOUR, st_rand_mode.hour, false);
		break;
		
	}
	
}

//---------------------------------------------------------------------------------
bool RandMode_IsExit(void){
//---------------------------------------------------------------------------------
	
	return (st_rand_mode.act == RAND_MODE_INIT) ? true:false;
	
}

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