#ifndef _GAME_H
#define _GAME_H

#include "pad6.h"


#define NORMAL_SPEED	20


/****	お馴染みの		****/
/* 自分と相手がplayerとyouという変数(0or1)で指定されていることが前提 */
#define INFO			char_info[player]
#define YOU				char_info[you]
#define JUMP			jump_motion[player]
#define JUMP_YOU		jump_motion[you]
#define C_AD_A			char_addr[player]
#define C_AD_B			char_addr[you]
#define ADDR_PLY(g,n)	C_AD_A.ptr[C_AD_A.offset[(g)]+(n)]
#define ADDR_YOU(g,n)	C_AD_B.ptr[C_AD_B.offset[(g)]+(n)]
#define DECO(s)			char_deco[player].set[(s)]
#define FIRE(s)			blitz_fire[player].set[(s)]
#define FIRE_YOU(s)		blitz_fire[you].set[(s)]
#define SCDL(s)			fire_schedule[player].set[(s)]




/**** 位置の固定少数位置 ****/
/* 表示範囲は0〜511なので7ビットシフトしてもshortで足りる(どうせintだが) */
#define POS_DEC		(128)


#define FACE_PTRS		9					/* 顔のパターン個数		*/


/****** 当たり判定用ビット定義 ******/
#define HIT_A		(0x01)					/* 攻撃判定				*/
#define HIT_B		(0x02)					/* 食らい判定			*/
#define HIT_H		(0x04)					/* ＋鼻血判定(上段)		*/
#define HIT_G		(0x08)					/* ＋ゲロ判定(中段)		*/
/* あと28/32ビット分残っています */


/*** ガードシステム通知用 ***/
#define G_OK_UP				0x01
#define G_OK_MID			0x02
#define G_OK_DOWN			0x04
#define G_OK_SKY			0x08
#define setGuardOk(s)		(INFO.guard |=  (s))
#define unsetGuardOk(s)		(INFO.guard &= ~(s))
#define resetGuardOk()		(INFO.guard  =   0 )



/****** キャラクタ動作状態ビット定義 ******/
/*	これは記述簡便のための定義	*/
/** 使い方 **
	XXXX					自分がXXXXの動作中だと真をとる
	XXXX_YOU				相手がXXXXの動作中だと真をとる
	XXXX_set();				自分がXXXXの動作をする事を宣言する
	XXXX_reset();			自分がXXXXの動作を取り消すことを宣言する
*/

/** 空中 **/
#define FRYING				(INFO.motion&MOV_SKY)
#define FRYING_YOU			( YOU.motion&MOV_SKY)
#define FRYING_set()		(INFO.motion|=MOV_SKY)
#define FRYING_reset()		(INFO.motion&=(~MOV_SKY))

/** しゃがみ **/
#define CROUCH				(INFO.motion&MOV_CRU)
#define CROUCH_YOU			( YOU.motion&MOV_CRU)
#define CROUCH_set()		(INFO.motion|=MOV_CRU)
#define CROUCH_reset()		(INFO.motion&=(~MOV_CRU))

/** 地上 **/
/* 実は未使用
#define GROUND				(INFO.motion&MOV_GND)
#define GROUND_YOU			( YOU.motion&MOV_GND)
#define GROUND_set()		(INFO.motion|=MOV_GND)
#define GROUND_reset()		(INFO.motion&=(~MOV_GND))
*/

/** 攻撃 **/
#define ATTACK				(INFO.motion&MOV_ATK)
#define ATTACK_YOU			( YOU.motion&MOV_ATK)
#define ATTACK_set()		(INFO.motion|=MOV_ATK)
#define ATTACK_reset()		(INFO.motion&=(~MOV_ATK))

/** 防御 **/
/* 新ガードシステムは参照しない */
/*
#define DIFENCE				(INFO.motion&MOV_DEF)
#define DIFENCE_YOU			( YOU.motion&MOV_DEF)
#define DIFENCE_set()		(INFO.motion|=MOV_DEF)
#define DIFENCE_reset()		(INFO.motion&=(~MOV_DEF))
*/

/** ガード **/
#define GUARD				(INFO.motion&DAM_GRD)
#define GUARD_YOU			( YOU.motion&DAM_GRD)
#define GUARD_set()			(INFO.motion|=DAM_GRD)
#define GUARD_reset()		(INFO.motion&=(~DAM_GRD))

/** ダメージ **/
#define DAMAGE				(INFO.motion&MOV_DAM)
#define DAMAGE_YOU			( YOU.motion&MOV_DAM)
#define DAMAGE_set()		(INFO.motion|=MOV_DAM)
#define DAMAGE_reset()		(INFO.motion&=(~MOV_DAM))
#define DAMAGE2				(INFO.motion&MOV_DAM2)
#define DAMAGE2_YOU			( YOU.motion&MOV_DAM2)
#define DAMAGE2_set()		(INFO.motion|=MOV_DAM2)
#define DAMAGE2_reset()		(INFO.motion&=(~MOV_DAM2))

#define ALLMOTION_reset()	(INFO.motion&=(MOV_SKY))


/* INFO.motion のビット(32ビット)構成 */
/* 大まかな動作状態(判定ループ導入用) */
/*#define MOV_DEF			(0x00000001)*/		/* 防御中(含むポーズ)	*/
#define MOV_ATK			(0x00000002)		/* 攻撃中(別領域に拡張)	*/
#define MOV_SKY			(0x00000004)		/* 空中					*/
#define MOV_GND			(0x00000008)		/* 地上					*/
#define MOV_NTR			(0x00000010)		/* ニュートラル(無意味)	*/
#define MOV_DAM			(0x00000020)		/* ダメージ｢食らい｣中	*/
#define MOV_CRU			(0x00000040)		/* しゃがみ				*/
#define MOV_WIN			(0x00000080)		/* 勝利ポーズ中			*/
#define MOV_DAM2		(0x00000100)		/* ダメージ→リバサまで	*/

/** ダメージ **/
#define DAM_ALL			(0x00fff000)		/* 初期化用				*/
#define DAM_FUKI		(0x00001000)		/* 吹き飛び				*/
#define DAM_KOKE		(0x00002000)		/* 転倒					*/
#define DAM_MOE			(0x00004000)		/* 燃焼					*/
#define DAM_MAHI		(0x00008000)		/* マヒ					*/
#define DAM_NOKE		(0x00010000)		/* のけぞり				*/
#define DAM_HANA		(0x00020000)		/* 鼻血					*/
#define DAM_GERO		(0x00040000)		/* ゲロ					*/
#define DAM_DOWN		(0x00080000)		/* ダウン				*/
#define DAM_UP			(0x00100000)		/* 上段(未)				*/
#define DAM_MID			(0x00200000)		/* 中段(未)				*/
#define DAM_GRD			(0x00400000)		/* ガード				*/
#define DAM_KO			(0x00800000)		/* ＫＯ					*/

/** ジャンプ **/
#define JMP_ALL			(0xff000000)		/* 初期化用				*/
#define JMP_VER			(0x01000000)		/* 垂直ジャンプ			*/
#define JMP_FRT			(0x02000000)		/* 前方ジャンプ			*/
#define JMP_BAK			(0x04000000)		/* 後方ジャンプ			*/
#define JMP_DBL			(0x08000000)		/* ２段ジャンプ			*/
#define JMP_TRI			(0x10000000)		/* 三角飛び				*/
#define JMP_RDY			(0x20000000)		/* ジャンプ準備中		*/






/****** 攻撃状態ビット定義 ******/
/*	これは記述簡便のための定義	*/
#define PUNCH			(INFO.attack&ATK_PUN)
#define KICK			(INFO.attack&ATK_KICK)
#define DEATH			(INFO.attack&ATK_DB)
#define SUPER			(INFO.attack&ATK_SDB)
#define POWER1			(INFO.attack&ATK_POW1)
#define POWER2			(INFO.attack&ATK_POW2)
#define POWER3			(INFO.attack&ATK_POW3)
#define POWER4			(INFO.attack&ATK_POW4)
#define BRITZ			(YOU.attack&ATK_BRT)			/* YOUに注目	*/
#define BRITZ_YOU		(YOU.attack&ATK_BRT)			/* 実は同じ		*/
#define THUROW			(YOU.attack&ATK_TRW)			/* YOUに注目	*/
#define THUROW_YOU		(YOU.attack&ATK_TRW)			/* 実は同じ		*/
#define C_EYE_OK		(INFO.attack&CANCEL_EYE)
#define C_DB_OK			(INFO.attack&CANCEL_DB)
#define C_SDB_OK		(INFO.attack&CANCEL_SDB)







/* INFO.attack のビット構成 */
/* 技種 */
#define ATK_PUN			(0x00000001)		/* パンチ攻撃			*/
#define ATK_KICK		(0x00000002)		/* キック攻撃			*/
#define ATK_DB			(0x00000004)		/* 必殺技				*/
#define ATK_SDB			(0x00000008)		/* 超必殺技				*/
#define ATK_BRT			(0x00000010)		/* 飛び道具				*/
#define ATK_TRW			(0x00000020)		/* 投げ					*/
#define ATK_NG_STD		(0x00000040)		/* 立ち防御不能			*/
#define ATK_NG_CRU		(0x00000080)		/* しゃがみ防御不能		*/
/* 強さ */
#define ATK_POW1		(0x00100000)		/* 小攻撃				*/
#define ATK_POW2		(0x00200000)		/* 中攻撃				*/
#define ATK_POW3		(0x00400000)		/* 大攻撃				*/
#define ATK_POW4		(0x00800000)		/* ゴリ押し檄強攻撃		*/
/* キャンセル */
#define CANCEL_ALL		(0x00000f00)		/* イニシャライズ用		*/
#define CANCEL_EYE		(0x00000100)		/* 目押し可能			*/
#define CANCEL_DB		(0x00000200)		/* 必殺技可能			*/
#define CANCEL_SDB		(0x00000400)		/* 超必殺技可能			*/
#define CANCEL_RSV		(0x00000800)		/* リザーブ				*/

/* 攻撃状態 */
/* 使わないかも */
#define ATK_SKY_V		(0x01000000)		/* 垂直ジャンプ攻撃		*/
#define ATK_SKY_F		(0x02000000)		/* 前方ジャンプ攻撃		*/
#define ATK_SKY_R		(0x04000000)		/* 後方ジャンプ攻撃		*/
#define ATK_STD_W		(0x10000000)		/* 立ち遠距離攻撃		*/
#define ATK_STD_M		(0x20000000)		/* 立ち近距離攻撃		*/
#define ATK_CRW			(0x40000000)		/* しゃがみ攻撃			*/
#define ATK_DUSH		(0x80000000)		/* ダッシュ攻撃			*/





/****** スプライトアトリビュート ******/
#define P16C			(1<<15)
#define NODISP			(1<<13)
#define REV				(1<<13)				/* 逆向き			*/
#define REV1			(1<<12)				/* 180度反転		*/
#define REV2			(3<<12)				/* 180度反転逆向き	*/
#define REV90			(5<<12)				/* 半時計90度		*/
#define REV270			(6<<12)
#define OFFSET_AD		(1<<15)




/****** スプライトパレット ******/
#define PAL_HP(n)		(256+(n))			/* 体力メーター */
#define PAL_KO			258					/* KOマーク, バーの下地 */
#define PAL_WON			259					/* WONマーク */
#define PAL_FACE(n)		(260+(n))			/* 顔 */
#define PAL_KAO1		260					/* 1Pの顔 */
#define PAL_KAO2		261					/* 2Pの顔 */
#define PAL_TIME		262					/* 時間表示用 */
#define PAL_NUM			263					/* 数字表示用 */
#define PAL_NUM1		264					/* リザーブ */
#define PAL_NUM2		265					/* リザーブ */
#define PAL_FNT			266					/* 文字表示用 */
#define PAL_FNT1		267					/* リザーブ */
#define PAL_FNT2		268					/* リザーブ */
#define PAL_FNT3		269					/* リザーブ */
#define PAL_LOGO		269					/* ロゴだ */
#define PAL_SHADOW		370					/* 影色 */
#define PAL_HIT(n)		(371+(n))			/* ダメージ */
#define PAL_BGAN(n)		(371+(n))			/* まあ */
#define PAL_CHAR(p,n)	(380+(n)+((p)*64))	/* キャラクタ用pプレイヤn番 */
#define PAL_OP(n)		(380+(n))			/* opとか用 */
#define PAL_STAGE(n)	(508+(n))			/* ステージ用 */
#define PAL_ENB(n)		(500+(n))			/* エンブレム用 */
#define PAL_ENV(n)		(508+(n))			/* エンブレム用 */
#define PAL_GFONT(n)	(508+(n))			/* Gフォント用 */
#define PAL_CREDIT		(507)				/* クレジットフォント用 */
#define PAL_DIR			(511)				/* 用 */
#define PAL_CONFIG(n)	(400+(n))			/* コンフィグ用 */

#define PAL_NAME_E(n)	(400+(n))			/* ネームエントリ用 */
#define PAL_DEBUG(n)	(375+(n))			/* デバック用		 */




/****** パターン領域使用の定義 ******/
/* ＨＰ関係 先頭パターン番号 */
#define PTR_KO(n)		(128+(n))				/* グループ先頭番号		*/
#define PTR_BAR			128						/* 体力バー				*/
#define PTR_WON(n)		(136+(n))				/* 勝ちマーク２種		*/

#define	PTR_SHADOW(n)	(138+(n))

/* 時間表示用フォント */
#define	TIME(n)			(140+(n))				/* n..0〜9 */

/* 一般フォント(50文字分確保) */
#define NUM(n)			(150+(n))				/* 数字フォント int  指定 */
#define NUM_C(c)		(150+(char)(c)-'0')		/* 数字フォント char 指定 */
#define FNT_C(c)		(160+(char)(c)-'A')		/* 文字フォント char 指定 */
#define FNT_N(n)		(160+(n))				/* 文字フォント int  指定 */

#define	PTR_GFONT(n)	(150+(n))				/* 通常フォント			*/

#define	PTR_ENV(p,n)	(196+(p*8)+(n))			/* キャラ環境用 8*2		*/
#define	PTR_CREDIT(n)	(212+(n))				/* クレジット用 10+8	*/

#define	PTR_FACE(n)		230+((n)*2)
#define	PTR_KAO(n)		230				/* ダミー */
#define	PTR_DIR(n)		(234+(n))				/* インプットゲージ 3	*/

#define	PTR_HIT(n)		(237+(n))				/* ダメージ用			*/
#define	PTR_STAGE(n)	(400+(n))				/* ステージ用			*/

#define PTR_CHAR(p)		(511+((p)*256))			/* キャラクタ用 pページ	*/

#define PTR_OP(p)		(511+(p))				/* opとか				*/


/* 此処以下はどうでもいい｡ どうせ読み込み直すから */
#define	PTR_NAME_E(n)	(700+(n))				/* ネームエントリ用		*/
#define	PTR_NAME_F(n)	(200+(n))				/* ネームエントリ用		*/

#define	PTR_CONFIG(n)	(511+(n))				/* ネームエントリ用		*/

#define	PTR_DEBUG(n)	(999+(n))				/* デバック用			*/


#endif

