基本状態遷移の作成といいかげん時計1、2の実装まで。
タイトル画面からの項目選択によって次に実行するシーンが変更されるような実装をしたこと無かったんで
akkera102 さんとこの GBA develop Wiki にあった「にもつくん」の遷移を参考にして組んでみた。
遷移情報をグローバルにしてみる案もあったがそれをやると
他のモジュールと比べてみたとき整合性が整わなくなるので止めた。
初代←→プロ の切替を実装。
シューティングモードと時計モードはどちらも機能するので両方で使えるように手直し。
シューティングモードだと初代とプロでの隠しコマンドを切り替えるとか、
時計モードだとプロのときにいいかげん時計1または2のフラグが立ってたら動作させないとか。
いいかげん時計1、2は1モジュールとして作成。
呼ばれたときにシークレット1、または2のフラグによって1または2へ切替。
両フラグが立ってなければ動作しないようにしてある。
いいかげん時計モードのソースはこんな感じ。
(過去のモジュールのみではビルドできないので実装の雰囲気だけでも。)
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; } //---------------------------------------------------------------------------------