/*
 *	app.h
 *
 *	P/ECEアプリケーションの雛型（CLiPライブラリ版）
 *
 *	* Tue Jul 23 21:01:00 JST 2002 Naoyuki Sawa
 *	- 作成開始。
 */
#ifndef __APP_H__
#define __APP_H__

#include <clip.h>

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

/* 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}}*/

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

/* デバッグモードを使う場合は、USE_DBGシンボルを定義してください */
//#define USE_DBG /*{{TODO}}*/

/* ガーベージコレクターを使う場合は、USE_GCシンボルを定義してください */
//#define USE_GC /*{{TODO}}*/

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

/* 縦画面モードを使う場合は、V_SCREENシンボルを定義してください */
//#define V_SCREEN /*{{TODO}}*/
#ifdef V_SCREEN
#undef DISP_X
#undef DISP_Y
#define DISP_X	 88
#define DISP_Y	128
#endif /*V_SCREEN*/

/* 音楽ライブラリを使う場合は、USE_MUSICシンボルを定義してください */
//#define USE_MUSIC /*{{TODO}}*/
#ifdef USE_MUSIC
#define music_play(data) do { music_stop(); PlayMusic((unsigned char*)(data)); } while(0)
#define music_stop() do { StopMusic(); sound_stop(music_wch); } while(0)
#else /*USE_MUSIC*/
#define music_play(data) ((void)0)
#define music_stop() ((void)0)
#endif /*USE_MUSIC*/

/* サウンドリストを初期化する場合は、USE_SOUNDシンボルを定義してください。 */
//#define USE_SOUND /*{{TODO}}*/
#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シンボルを定義してください。
 * ・ADPCM_CHANNELSシンボルに適切なチャネル数を指定してください。
 */
//#define USE_2BIT_ADPCM /*{{TODO}}*/
#ifdef USE_2BIT_ADPCM
#define ADPCM_CHANNELS	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
#endif /*USE_2BIT_ADPCM*/

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

/* テクスチャリストを初期化する場合は、USE_TEXTUREシンボルを定義してください。 */
#define USE_TEXTURE /*{{TODO}}*/
#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シンボルを定義してください */
//#define USE_SPRITE /*{{TODO}}*/
#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*/

/* オートリピートを使用する場合は、
 * ・REPEAT_PADにオートリピートを有効にするPAD_*の組み合わせを指定してください。
 * ・REPEAT_DELAYにオートリピートが開始するまでの時間を指定してください。
 * ・REPEAT_INTERVALにオートリピート間隔の時間を指定してください。
 */
//#define REPEAT_PAD	(PAD_LF | PAD_UP | PAD_RI | PAD_DN)
#define REPEAT_DELAY	SEC(0.5)
#define REPEAT_INTERVAL	SEC(0.1)

/* ポーズ機能を使う場合は、USE_PAUSEシンボルを定義してください。
 * また、アプリケーションの通常背景色にあわせて、PAUSE_COLORを選択してください。
 */
//#define USE_PAUSE /*{{TODO}}*/
#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*/

/* USBファイルシステムエミュレーションを使う場合は、USE_UFEシンボルを定義してください。 */
//#define 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シンボルを定義してください。 */
//#define 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シンボルを定義してください。 */
//#define USE_VIDREC

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

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

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

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

void app_init();
void app_exit();
void update();
void schedule();
void delay(int frame);
int demo_main();
void game_main();

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

#include "work.h"

#endif /*__APP_H__*/
