/*
 *	app.h
 *
 *	Lua速度計測
 *
 *	* Sun Feb 05 22:56:09 JST 2012 Naoyuki Sawa
 *	- 1st リリース。
 *	* Sat Jan 24 19:25:38 JST 2015 Naoyuki Sawa
 *	- 「Lua 5.3.0」で再計測しました。
 */
#ifndef __APP_H__
#define __APP_H__

#include <clip.h>

/****************************************************************************
 *	
 ****************************************************************************/

//{{2014/02/01削除:MakefileのUSE_RESOURCEで制御するように変更しました。もうRESOURCE_FNAMEは使用しません。
///* pexファイル添付リソースを使う場合は、RESOURCE_FNAMEにpexファイル名を定義してください。
// * pexファイル添付リソースを使わない場合は、RESOURCE_FNAMEを定義しないでください。
// * - Makefileにも、pexファイル添付リソースの使用有無、および、pexファイル名が記述されているので、
// *   Makefileから、gccの-DオプションでRESOURCE_FNAMEを指定する方法も検討しましたが、やめました。
// *   実験したところ、-Dオプションは「"」を除去してしまうみたいで、文字列を定義できないからです。
// *	-DRESOURCE_FNAME="test.pex" … RESOURCE_FNAMEは、"test.pex"でなく、test.pexになってしまう
// *   文字列化演算子を使って、以下のように対応することもできますが、
// *	[Makefileにおいて...]
// *	-DRESOURCE_FNAME=test.pex
// *	[C言語ソースにおいて...]
// *	#define T(str) #str
// *	char* fname = T(RESOURCE_FNAME);
// *   複雑になりすぎることを防ぐため、単純に、MakefileとC言語ソースで二回指定することにしました。
// */
//#define RESOURCE_FNAME "test.pex" /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_RESOURCEで制御するように変更しました。もうRESOURCE_FNAMEは使用しません。

/* クロック・メモリウェイトを変更する場合は、TURBOシンボルを定義してください。
 * 定義した値は、turbo()関数にそのまま引き渡されます。
 */
//{{2014/02/01削除:MakefileのTURBOで制御するように変更しました。
//#define TURBO -1 /*{{TODO}}*/
//}}2014/02/01削除:MakefileのTURBOで制御するように変更しました。

/* デバッグモードを使う場合は、USE_DBGシンボルを定義してください */
//{{2014/02/01削除:MakefileのUSE_DBGで制御するように変更しました。
//#define USE_DBG /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_DBGで制御するように変更しました。

/* ガーベージコレクターを使う場合は、
 * ・USE_GCシンボルを定義してください。
 * ・GC_LEVELシンボルに適切なGC動作レベルを選択してください。
 */
//{{2014/02/01削除:MakefileのGC_LEVELで制御するように変更しました。もうUSE_GCは使用しません。
//#define USE_GC /*{{TODO}}*/
//#ifdef USE_GC
//#define GC_LEVEL GC_LEVEL_CONSERVATIVE	/* 「保守的」なGC動作レベル */	//推奨//
////#define GC_LEVEL GC_LEVEL_INTERMEDIATE	/* 「中間的」なGC動作レベル */
////#define GC_LEVEL GC_LEVEL_AGGRESSIVE	/* 「積極的」なGC動作レベル */
//#endif /*USE_GC*/
//}}2014/02/01削除:MakefileのGC_LEVELで制御するように変更しました。もうUSE_GCは使用しません。

//{{2014/12/12追加:MakefileのBITMAP_GC_UNITが定義されたら、Bitmap GCを使用するようにしました。
/* Bitmap GCを使用する場合、gc_runをBitmapGC_Runのエイリアスとすることにしました。
 * アプリケーションは常に、'gc_run'と書くようにしてください。
 * ビルド設定のGC_LEVELとBITMAP_GC_UNITの切り替えだけで、通常のガーベージコレクターとBitmap GCを切り替えられます。 */
#ifdef  BITMAP_GC_UNIT
#ifdef  GC_LEVEL
#error 通常のガーベージコレクターとBitmap GCは併用できません。
#endif//GC_LEVEL
#define gc_run BitmapGC_Run
#endif//BITMAP_GC_UNIT
//}}2014/12/12追加:MakefileのBITMAP_GC_UNITが定義されたら、Bitmap GCを使用するようにしました。

/* 高速切替・16階調表示を使う場合は、
 * ・LDIRECT_INTERVALに更新タイミング[ミリ秒]を定義してください。
 *   更新タイミングの目安は、おおよそ次の通りです。
 *	11以下	処理が間に合わずハングアップの危険あり。
 *	12	高品質・高負荷。48MHz/1WAIT以外では処理が間に合わずハングアップの危険性あり。
 *	25	中品質・中負荷。48MHz/1WAIT時は、この値が適切です。
 *	33	低品質・低負荷。24MHz/2WAIT時は、この値が適切です。
 *	34以上	切替えが遅すぎて、点滅が見えてしまいます。
 * ・高速切替・16階調表示を使わない場合は、LDIRECT_INTERVALを定義しないでください。
 *   通常の4階調表示となります。
 */
//{{2014/02/01削除:MakefileのLDIRECT_INTERVALで制御するように変更しました。
//#define LDIRECT_INTERVAL 12 /*{{TODO}}*/
//}}2014/02/01削除:MakefileのLDIRECT_INTERVALで制御するように変更しました。

/* 縦画面モードを使う場合は、V_SCREENシンボルを定義してください */
//{{2014/02/01削除:MakefileのV_SCREENで制御するように変更しました。
//#define V_SCREEN /*{{TODO}}*/
//}}2014/02/01削除:MakefileのV_SCREENで制御するように変更しました。
#ifdef V_SCREEN
#undef DISP_X
#undef DISP_Y
#define DISP_X	 88
#define DISP_Y	128
#endif /*V_SCREEN*/

/* サウンドリストを初期化する場合は、USE_SOUNDシンボルを定義してください。 */
//{{2014/02/01削除:MakefileのUSE_SOUNDで制御するように変更しました。
//#define USE_SOUND /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_SOUNDで制御するように変更しました。
#ifdef USE_SOUND
#define SOUND_(name) SND_##name,
#define SOUND_RESOURCE_(name,fname) SND_##name,
enum {
#include "sound.h"
	SOUND_COUNT,
};
extern const void* sound_table[SOUND_COUNT];
#undef SOUND_
#undef SOUND_RESOURCE_
#endif /*USE_SOUND*/

/* 2-bit ADPCM Decoderを使う場合は、
 * ・USE_2BIT_ADPCMシンボルを定義してください。
 * ・SOUND_MAXCHシンボルに適切なチャネル数を指定してください。
 */
//{{2014/02/01削除:MakefileのUSE_2BIT_ADPCMで制御するように変更しました。
//#define USE_2BIT_ADPCM /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_2BIT_ADPCMで制御するように変更しました。
#ifdef USE_2BIT_ADPCM
#undef  SOUND_MAXCH	/* clip/clippce.hの定義をキャンセル */
#define SOUND_MAXCH	4
/* - 利用するサウンド形式を、標準4-bit ADPCM⇔拡張2-bit ADPCMに切り替えたときに、
 *   ソースコードの変更が少なくて済むよう、以下のマクロを定義することにしました。
 *   標準4-bit ADPCMと拡張2-bit ADPCMを併用する場合は、コメントアウトしてください。
 *   (物理チャネル0で2-bit ADPCM(多重)、物理チャネル1-3で4-bit ADPCMを利用する場合)
 */
#define sound_play	adpcm_play
#define sound_stop	adpcm_stop
#define sound_stat	adpcm_stat
#define sound_att	adpcm_att
#endif /*USE_2BIT_ADPCM*/

/* DSP Group TrueSpeech Decoderを使う場合は、
 * ・USE_TRUESPEECHシンボルを定義してください。
 * ・SOUND_MAXCHシンボルに適切なチャネル数を指定してください。
 */
#ifdef USE_TRUESPEECH
#undef  SOUND_MAXCH	/* clip/clippce.hの定義をキャンセル */
#define SOUND_MAXCH	4
/* - 利用するサウンド形式を、標準4-bit ADPCM⇔拡張2-bit ADPCMに切り替えたときに、
 *   ソースコードの変更が少なくて済むよう、以下のマクロを定義することにしました。
 */
#define sound_play	TrueSpeech_PlayCh
#define sound_stop	TrueSpeech_StopCh
#define sound_stat	TrueSpeech_GetChStat
#define sound_att	TrueSpeech_SetChAtt
#endif /*USE_TRUESPEECH*/

/* Sound Managerを使う場合は、
 * ・USE_SOUND_MANAGERシンボルを定義してください。
 * ・SOUND_MANAGER_*_*シンボルに適切なチャネル下限上限を指定してください。
 *   Sound Manager構成を変更する場合は、シンボルの種類を変更してください。
 */
//{{2014/02/01削除:MakefileのUSE_SOUND_MANAGERで制御するように変更しました。
//#define USE_SOUND_MANAGER /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_SOUND_MANAGERで制御するように変更しました。
#ifdef  USE_SOUND_MANAGER
#define SOUND_MANAGER_BGM_MINCH 0		/* BGMチャネル下限 */
#define SOUND_MANAGER_BGM_MAXCH 0		/* BGMチャネル上限 */
#define SOUND_MANAGER_SE1_MINCH 1		/* SE1チャネル下限 */
#define SOUND_MANAGER_SE1_MAXCH 1		/* SE1チャネル上限 */
#define SOUND_MANAGER_SE2_MINCH 2		/* SE2チャネル下限 */
#define SOUND_MANAGER_SE2_MAXCH (SOUND_MAXCH-1)	/* SE2チャネル上限 */
#endif/*USE_SOUND_MANAGER*/

/* 汎用カウンタ管理を使う場合は、
 * ・USE_COUNTER_MANAGERシンボルを定義してください。
 * ・COUNTER_MAXCHシンボルに適切なチャネル数を指定してください。
 */
#ifdef  USE_COUNTER_MANAGER
#define COUNTER_MAXCH	4
#endif/*USE_COUNTER_MANAGER*/

/* 3D描画を使う場合は、
 * ・USE_3Dシンボルを定義してください。
 * ・FRONTに適切な前面クリッピング距離(＝視点〜投影面距離)を指定してください。
 * ・BACK に適切な背面クリッピング距離(＝視点〜可視限界遠)を指定してください。
 * ・FOVY に適切な垂直視野角度を指定してください。
 */
//{{2014/02/01削除:MakefileのUSE_3Dで制御するように変更しました。
//#define USE_3D /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_3Dで制御するように変更しました。
#ifdef USE_3D
#define FRONT	fld(1)
#define BACK	fld(100)
#define FOVY	DEG(45)
#endif /*USE_3D*/

/* 浮動小数点3D描画を使う場合は、
 * ・USE_RENDFシンボルを定義してください。
 * ・FRONTに適切な前面クリッピング距離(＝視点〜投影面距離)を指定してください。
 * ・BACK に適切な背面クリッピング距離(＝視点〜可視限界遠)を指定してください。
 * ・FOVY に適切な垂直視野角度を指定してください。
 * USE_3Dと同時に使うことはできません。(FRONT、BACK、FOVYが多重定義になります。)
 * 固定小数点3D描画(RENDER)と浮動小数点3D描画(RENDF)を併用することは可能ですが、
 * あまり意味が無いので、あえて多重定義警告がでるようにしてあります。
 */
//{{2014/02/01削除:MakefileのUSE_RENDFで制御するように変更しました。
//#define USE_RENDF /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_RENDFで制御するように変更しました。
#ifdef USE_RENDF
#define FRONT	1.0f
#define BACK	100.0f
#define FOVY	((float)M_PI_4)
#endif /*USE_RENDF*/

/* テクスチャリストを初期化する場合は、USE_TEXTUREシンボルを定義してください。 */
//{{2014/02/01削除:MakefileのUSE_TEXTUREで制御するように変更しました。
//#define USE_TEXTURE /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_TEXTUREで制御するように変更しました。
#ifdef USE_TEXTURE
#define TEXTURE_(name) TEX_##name,
#define TEXTURE_RESOURCE_(name,fname) TEX_##name,
enum {
#include "texture.h"
	TEXTURE_COUNT,
};
extern TEXTURE texture_table[TEXTURE_COUNT];
#undef TEXTURE_
#undef TEXTURE_RESOURCE_
#endif /*USE_TEXTURE*/

/* 簡易スプライトドライバを使う場合は、USE_SPRITEシンボルを定義してください */
//{{2014/02/01削除:MakefileのUSE_SPRITEで制御するように変更しました。
//#define USE_SPRITE /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_SPRITEで制御するように変更しました。
#ifdef USE_SPRITE
#define SPRITE_ SPRITE_INIT1
enum {
#include "sprite.h"
	SPRITE_COUNT
};
extern const SPRITE sprite_table[SPRITE_COUNT];
#undef SPRITE_
#endif /*USE_SPRITE*/

/* オートリピートを使用する場合は、
 * ・USE_REPEATシンボルを定義してください。
 * ・REPEAT_PADにオートリピートを有効にするPAD_*の組み合わせを指定してください。
 * ・REPEAT_DELAYにオートリピートが開始するまでの時間を指定してください。
 * ・REPEAT_INTERVALにオートリピート間隔の時間を指定してください。
 */
//{{2014/02/01削除:MakefileのUSE_REPEATで制御するように変更しました。
//#define USE_REPEAT /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_REPEATで制御するように変更しました。
#ifdef USE_REPEAT
#define REPEAT_PAD	(PAD_LF|PAD_UP|PAD_RI|PAD_DN)
#define REPEAT_DELAY	SEC(0.5)
#define REPEAT_INTERVAL	SEC(0.1)
#endif /*USE_REPEAT*/

/* ポーズ機能を使う場合は、USE_PAUSEシンボルを定義してください。
 * また、アプリケーションの通常背景色にあわせて、PAUSE_COLORを選択してください。
 */
//{{2014/02/01削除:MakefileのUSE_PAUSEで制御するように変更しました。
//#define USE_PAUSE /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_PAUSEで制御するように変更しました。
#ifdef USE_PAUSE
#define PAUSE_FONT	0x80		/* PAUSEフォント         */
#ifndef LDIRECT_INTERVAL
#define PAUSE_COLOR	0x130		/* PAUSEカラー(白背景用) */
//#define PAUSE_COLOR	0x203		/* PAUSEカラー(黒背景用) */
#else /*LDIRECT_INTERVAL*/
#define PAUSE_COLOR	0x5f0		/* PAUSEカラー(16階調・白背景用) */
//#define PAUSE_COLOR	0xa0f		/* PAUSEカラー(16階調・黒背景用) */
#endif /*LDIRECT_INTERVAL*/
#define PAUSE_STR	"PAUSE"		/* PAUSEメッセージ       */
#define PAUSE_W		(5 * 5 + 2)	/* PAUSEメッセージの横幅 */
#define PAUSE_H		(10    + 2)	/* PAUSEメッセージの縦幅 */
#define PAUSE_X		((DISP_X - PAUSE_W) / 2) /* 水平表示位置 */
#define PAUSE_Y		((DISP_Y - PAUSE_H) / 2) /* 垂直表示位置 */
#endif /*USE_PAUSE*/

/* アイドルスレッドを使う場合は、USE_IDLEシンボルを定義してください。 */
//{{2014/02/01削除:MakefileのUSE_IDLEで制御するように変更しました。
//#define USE_IDLE /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_IDLEで制御するように変更しました。

/* USBファイルシステムエミュレーションを使う場合は、USE_UFEシンボルを定義してください。 */
//{{2014/02/01削除:MakefileのUSE_UFEで制御するように変更しました。
//#define USE_UFE /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_UFEで制御するように変更しました。

/* USBファイルシステムエミュレーションとトレース出力は併用できません。 */
#if defined(USE_UFE) && defined(TRACE_ON) && (TRACE_ON)
#error USBファイルシステムエミュレーションとトレース出力は併用できません。
#endif /*defined(USE_UFE) && defined(TRACE_ON) && (TRACE_ON)*/

/* TCP/IPプロトコルスイートを使う場合は、USE_TCPIPシンボルを定義してください。 */
//{{2014/02/01削除:MakefileのUSE_TCPIPで制御するように変更しました。
//#define USE_TCPIP /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_TCPIPで制御するように変更しました。

/* TCP/IPプロトコルスイートとトレース出力は併用できません。 */
#if defined(USE_TCPIP) && defined(TRACE_ON) && (TRACE_ON)
#error TCP/IPプロトコルスイートとトレース出力は併用できません。
#endif /*defined(USE_TCPIP) && defined(TRACE_ON) && (TRACE_ON)*/

#ifdef USE_TCPIP
#include "tcpip.h"
#endif /*USE_TCPIP*/

/* 画面出力を使う場合は、USE_VIDRECシンボルを定義してください。 */
//{{2014/02/01削除:MakefileのUSE_VIDRECで制御するように変更しました。
//#define USE_VIDREC /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_VIDRECで制御するように変更しました。

/* 画面出力とトレース出力は併用できません。 */
#if defined(USE_VIDREC) && defined(TRACE_ON) && (TRACE_ON)
#error 画面出力とトレース出力は併用できません。
#endif /*defined(USE_VIDREC) && defined(TRACE_ON) && (TRACE_ON)*/

/* Bison/Flexを使う場合は、USE_BISON_FLEXシンボルを定義してください。 */
//{{2014/02/01削除:MakefileのUSE_BISON_FLEXで制御するように変更しました。
//#define USE_BISON_FLEX
//}}2014/02/01削除:MakefileのUSE_BISON_FLEXで制御するように変更しました。
#ifdef  USE_BISON_FLEX /*{{TODO}}*/
#define YYDEBUG 1 /* 構文解析器追跡機能が不要ならば、この行をコメントアウトしてください */
/* y.tab.y */
extern int yynerrs;
#if     (YYDEBUG!=0)
extern int yydebug;
#endif/*(YYDEBUG!=0)*/
int yyparse();
void yyerror(const char* fmt, ...);
/* lex.yy.l */
extern FILE* yyin;
extern FILE* yyout;
extern int yylineno;
int yylex();
void yylex_init(FILE* input_file);
#endif/*USE_BISON_FLEX*/

/* 抽選テーブルを使う場合は、USE_LOTシンボルを定義してください */
//{{2014/02/01削除:MakefileのUSE_LOTで制御するように変更しました。
//#define USE_LOT /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_LOTで制御するように変更しました。
#ifdef  USE_LOT
//#include "LotTbl.h"
#include "LotTblNo.h"
enum{eHazure,eReplay,eBell,eCherry,eBonus};/*サンプル*/
#endif/*USE_LOT*/

/* 演出制御を使う場合は、USE_PRODシンボルを定義してください */
//{{2014/02/01削除:MakefileのUSE_PRODで制御するように変更しました。
//#define USE_PROD /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_PRODで制御するように変更しました。
#ifdef  USE_PROD
#include "ProdCmd.h"
//#include "ProdDef.h"
#include "ProdDefNo.h"
#endif/*USE_PROD*/

/****************************************************************************
 *	
 ****************************************************************************/

#define FPS	20			/* フレームレート */
#define SEC(s)	((int)(FPS * (s)))	/* 秒->フレーム変換 */

/****************************************************************************
 *	
 ****************************************************************************/

void app_init();
void app_exit();
void update();
void schedule();
void delay(int frame);
void app_main();

/****************************************************************************
 *	
 ****************************************************************************/

#include "work.h"

#endif /*__APP_H__*/
