#include <sys/types.h>

extern char EgbPtr[];
extern char MosPtr[];
extern char SndPtr[];

extern int				CommandBuff[2][128];	/* コマンドバッファ	*/
extern unsigned char	stage_bg[384][1024];
extern unsigned char	pct_buf[];
extern short			pct_pal[];
extern short			pal_srv[];
extern int				pct_pal_num;
extern char				face_buff[2][FACE_PTRS*2*128];

extern u_short			player_pal[2][16];
extern u_short			face_pal[2][16];
extern u_short			system_pal[32][16];
/*extern unsigned short spr_mem[1024][4];*/

extern int haj0;
extern int haj1;

extern int speed;					/* 全体のスピード */
extern int ground;					/* 床のY座標 */
/*extern int disp_left;*/				/* ディスプレイ左端 x座標 */
extern int spr_offset_x;			/* スプライトオフセット */
extern int spr_offset_y;			/* スプライトオフセット */
extern char prior;					/* キャラ描画優先順位 */
extern char ptr_buff_page;
extern char hit_system_off;
extern unsigned char freeze_time;
extern int slow_time;
extern int round_time;


extern int dsp_mode;
extern int bgm_on;
extern int midi_man_on;
extern int se_on;
extern int spr_sync;
extern int bg_anime;
extern int video_on;
extern int scrol_on;
extern int debug_on;
extern int mini_dsp;
extern int input_gauge;
extern int sprit_disp;
extern int slow_on;
extern int shape_on;
extern int gfont_type;
extern int auto_guard;
extern int opti386;

extern int game_level;
extern int game_speed;
extern int master_speed;
extern int start_time;
/*extern int credits[];*/
extern int free_play;
extern int hi_score;
extern int pad_read_ok;
/*extern int auto_gd_on[];*/

/*extern int win_point[];*/
/*extern int com_player[];*/
/*extern int combo[];*/
extern int first_attack;
extern int demonstration;

/*extern char out_midi_port;*/



/** ここ以降は構造体乱舞 **/
/* 頻繁にアクセスするのでアレイ以外を32ビットにしています */

typedef struct {
	unsigned short	x;
	unsigned short	y;
	unsigned short	atrb;
	unsigned short	col;
} SPRITE;


/*
	キャラクタ装飾
	全面､背面にそれぞれ16パターンづつ重ね合わせ可能です
	これは毎回登録しないと駄目です(使用フラグがクリアされる)
	自分で使う場所を決めて管理すること
*/
#define MAX_DECO	32
typedef struct {
	struct {
		int		use_flag;			/* 使用フラグ				*/
		int		ptr_set;			/* パターンセット			*/
		int		ptr_no;				/* パターンナンバ			*/
		int		pos_x;				/* Ｘポジション				*/
		int		pos_y;				/* Ｙポジション				*/
		int		direction;			/* 向き						*/
		int		pal;				/* パレット番号				*/
		int		twinkle;			/* 点滅属性					*/
	}set[MAX_DECO];
} CHAR_DECORATION;


/*
	飛び道具判定
	システムに通知する目的で使用します
	システムは当たり判定とグラフィック表示をします
	対空時間は毎ターン毎に減少していき､0になると動作停止処理をします
*/
#define MAX_FIRE	64
typedef struct {
	struct {
		int		use_flag;	/* 使用フラグ								*/
		int		hit;		/* 判定情報を返す 1:HIT -1:DEL -2:自然消滅	*/
		int		twinkle;	/* 点滅属性									*/
		int		direction;	/* 向き										*/
		int		schedule;	/* スケジュール番号 -1で未使用				*/
		int		weight;		/* 重さ										*/
		int		pal;		/* パレット番号								*/
		int		time;		/* 滞空時間									*/
		int		attack_pow;	/* 攻撃力									*/
		int		kezuri_pow;	/* 削り力									*/
		int		defend;		/* 防御(特殊相殺貫通)能力					*/
		int		vect_add_x;	/* スケジュールベクトルの増減値				*/
		int		vect_add_y;
		int		ptr_set;	/* パターンセット							*/
		int		ptr_no;		/* パターンナンバ							*/
		int		pos_x;		/* Ｘポジション								*/
		int		pos_y;		/* Ｙポジション								*/
		int		sys_time;	/* システム領域								*/
		int		reserve[14];
	}set[MAX_FIRE];
} BRITZ_FIRE_INFO;
/*
	飛び道具スケジュール表
	システムはこの領域への書き込みはしません｡
	データ読み込み時にでも更新してください｡
*/
#define MAX_FIRE_SC		16
typedef struct {
	struct {
		int		auto_anime;		/* 自動アニメスイッチ	(0:off 1:on)	*/
		int		auto_move;		/* 自動移動スイッチ		(0:off 1:on)	*/
		
		int		vect_x;			/* 移動ベクトル							*/
		int		vect_y;
		
		
		/* 移動中 */
		int		ptr_set1;		/* パターンセット						*/
		int		ptr_no1;		/* パターンナンバ						*/
		int		ptr_ed1;		/* パターンナンバ終了値					*/
		int		pal1;			/* パレット番号							*/
		int		twinkle1;		/* 点滅属性								*/
		int		interval1;		/* アニメーション間隔					*/
		
		/* ヒット時 */
		int		ptr_set2;
		int		ptr_no2;
		int		ptr_ed2;
		int		pal2;
		int		twinkle2;
		int		interval2;
		
		/* 自然消滅時 */
		int		ptr_set3;
		int		ptr_no3;
		int		ptr_ed3;
		int		pal3;
		int		twinkle3;
		int		interval3;
		
		int		reserve[10];
	}set[MAX_FIRE_SC];
} FIRE_SCHEDULE;



typedef struct {
	int		count;				/* 動作カウンタ   0で未使用 */
	int		caseof;				/* マーク種別				*/
	int		x;					/* マークｘ座標				*/
	int		y;					/* マークｙ座標				*/
} HIT_MARK_INFO;

/* キャラクタパターンアドレス */
typedef struct {
	struct {
		int		x;				/* 横パターン数							*/
		int		y;				/* 縦パターン数							*/
		int		use;			/* 使用パターン領域数					*/
		char	*ad;			/* パターン格納先アドレス				*/
	} ptr[248];					/* 溢れないように気をつけろ！！！！！！	*/
	int offset[31];				/* パターン種類別格納先オフセット		*/
	int use_ptr;				/* 使用パターン個数						*/
} CHAR_PTR_ADDR;

/* キャラクターステータス */
typedef struct {
	
	int		ID;
	int		weight;				/* 体重									*/
	char	name[32];			/* キャラクタの名前						*/
	
	int		com_player;
	int		score;				/* 得点									*/
	int		hi_score;			/* 最高得点(コンティー時に得点を保存)	*/
	int		credit;				/* クレジット							*/
	
	int		auto_guard;			/* 自動ガードフラグ						*/
	int		guard_limit;		/* 自動ガード残り回数					*/
	
	int		Continue;			/* コンティニュー回数					*/
	int		play_stage;			/* プレイしたステージ数					*/
	
	int		life;				/* 体力(最大96*128)						*/
	int		super;				/* 体力臨界点 (24*128ぐらいかな)		*/
	int		magic;				/* マジックポイント(RPGでいう)			*/
	
	int		win_point;			/* ステージ内の奪取セット数				*/
	int		beatBy;				/* 打倒数								*/
	
	int		pos_x;				/* キャラクタ中心座標					*/
	int		pos_y;				/* キャラクタ下座標						*/
	
	int		ptr_set;			/* パターンセット番号					*/
	int		ptr_no;				/* パターン番号							*/
	
	int		shadow_size;		/* カゲの大きさ							*/
	int		direction;			/* キャラの向き -1:左 1:右				*/
	int		twinkle;			/* 半透明属性							*/
	int		undisp;				/* キャラ一時的非表示スイッチ			*/
	
	int		move_count;			/* 食らい等システムが介入するカウンタ	*/
	int		motion;				/* 動作種別								*/
	int		attack;				/* 攻撃種別								*/
	int		guard;				/* 防御可能種別							*/
	int		atk_vect_x;			/* 攻撃ベクトル(右向きのベクトル)		*/
	int		atk_vect_y;
	
	/* スピリチア */
	int		sprit_on;			/* ハイパーモード突入フラグ				*/
	int		sprit_flush;		/* フラッシュカウンタ					*/
	int		sprit_energy;		/* スピリッツエナジー					*/
	
	/*** システム領域 ***/
	/* コンビネーション */
	int		combo_score;		/* 累積得点								*/
	int		combo_hits;			/* コンボ回数							*/
	int		combo_past;
	int		combo_rate;
	
	int		inv_time;			/* 無敵時間								*/
	int		rev_time;			/* リバーサル移行時間					*/
	
	
	
	/** 此処以降はシステムが関与しない **/
	
	int		mov_kind;			/* キャラ動作ルーチン内動作種別(See .h)	*/
	int		mov_val;			/* キャラ動作内容の深さ					*/
	
	int		lock_time;			/* 硬直時間カウンタ						*/
	int		hit_limit;			/* 多段階ヒット抑制(勝手に使って)		*/
	
	int		count_a;			/* 通常動作のカウンタ					*/
	int		count_b;			/* 攻撃動作のカウンタ					*/
	int		count_c;			/* 汎用カウンタ							*/
	int		count_d;			/* 汎用カウンタ							*/
	
	int		count_sys;			/* システムカウンタ						*/
	
	int		reserve[9];
	
} CHARCTOR_INFO;

/* ジャンプは二次曲線（簡略版）で表現 */
/* ジャンプのほかシステムベクトルも管理 */
typedef	struct {
	/* ユーザー指定領域 */
	int		flag;
	int		x_add;						/* 横方向移動量				*/
	int		y_ofs;						/* 縦方向オフセット			*/
	int		velocity;					/* 縦方向の初速度			*/
	int		gravity;					/* 重力加速度				*/
	int		direction;
	
	/* ユーザー参照領域 */
	int		move_x;						/* 移動量(ユーザー参照用)	*/
	int		move_y;
	int		move_lock;					/* 着地緩衝期間中フラグ		*/
	int		move_vect;					/* ベクトル1上昇中0下降中	*/
	
	/* システム領域 */
	int		sys_time;					/* 時間						*/
	int		sys_past_x;					/* 過去のX座標				*/
	int		sys_past_y;					/* 過去のY座標				*/
	int		sys_vect_x;					/* システムベクトル			*/
	int		sys_vect_y;
	
	int		rsv;
	
} JUMP_MOTION;

typedef struct {
	int		x;							/* スクロールポイントx		*/
	int		y;							/* スクロールポイントy		*/
	int		dx;							/* 0.5ドット単位			*/
	int		dy;							/* 同上(未使用)				*/
} DISP_SCROLL;



extern SPRITE				spr_mem[];
extern CHAR_PTR_ADDR		char_addr[];
extern CHAR_DECORATION		char_deco[];
extern BRITZ_FIRE_INFO		blitz_fire[];
extern FIRE_SCHEDULE		fire_schedule[];
extern HIT_MARK_INFO		hit_mark[];
extern CHARCTOR_INFO		char_info[];
extern JUMP_MOTION			jump_motion[];
extern DISP_SCROLL			disp_scroll;


