/********************
	kn_stage.h
 ********************/
#ifndef _KN_STAGE_H_
#define _KN_STAGE_H_

/*******************************************************
	DEFINE
*******************************************************/
/* ＤＭＡ転送の最大データサイズ */
#define MAX_SIZE_TRANS_DATA	0x2800		/* 10[KB] */

/* バンクセグメントの仮想あどれす */
#define BANK_SEG_VIRTUAL_ADDR		0x08000000

/* ディスプレイ書換え時の検索コマンド */
#define DL_CODE_END	0x000000b8
#define DL_CODE_VTX	0x00000004
#define DL_CODE_TEX	0x000000fd

/* --- 人転送 --- */
/* 人データのロード最大数 */
#define MAN_LOAD_MAX_NUM	8
/* 人データのロードパターン */
#define MAN_LOAD_PAT_1P			0		/* きれい１ ＋ 汚い３ */
#define MAN_LOAD_PAT_2P			1		/* きれい２ */
#define MAN_LOAD_PAT_RESULT		2		/* 汚い４ */
#define MAN_LOAD_PAT_MACHINE	3		/* 汚い４ */
#define MAN_LOAD_PAT_VS			4		/* きれい２ */
/* 人データの種類 */
#define MAN_LOAD_MAX_KIND		4
/* １種類当りのシェイプ数 */
#define MAN_LOAD_SHAPE_NUM_PER_ONE	3		/* */
/* Man GL Tableのならび */
#define MAN_GL_NUM_A	0
#define MAN_GL_NUM_B	1
#define MAN_GL_NUM_C	2
/* --- 動物転送 --- */
/* 動物の転送アドレス */
#define ANIMAL_LOAD_ADDR_TITLE		0x08060000
#define ANIMAL_LOAD_ADDR_RACE		0x08060000
/* 動物の転送数 */
#define MAX_NUM_ANIMAL_LOAD		2
/* 動物の種類 */
#define MAX_ANIMAL_KIND		9	/* 種類数 */
#define ANIMAL_KIND_NULL	-1	/* いるか */
#define ANIMAL_KIND_DOLPHIN	0	/* いるか */
#define ANIMAL_KIND_ORCA	1	/* しゃち */
#define ANIMAL_KIND_FISH	2	/* 熱帯魚 */
#define ANIMAL_KIND_SEAGULL	3	/* かもめ */
#define ANIMAL_KIND_TROUT	4	/* ます */
#define ANIMAL_KIND_FLYFISH	5	/* とびうお */
#define ANIMAL_KIND_DUCK	6	/* かも */
#define ANIMAL_KIND_HELI	7	/* ヘリ */
#define ANIMAL_KIND_PEN		8	/* ヘリ */
/* １データ当りの最大ディスプレイリスト数 */
#define MAX_NUM_GL_PER_ANIMAL_DATA	9
/* 動物のＧＬ番号 */
/* かもめ*/
#define ANIMAL_GL_S_BODY			0
#define ANIMAL_GL_S_WING_L1			1
#define ANIMAL_GL_S_WING_L2			2
#define ANIMAL_GL_S_WING_L3			3
#define ANIMAL_GL_S_SWIM			4
/* かも*/
#define ANIMAL_GL_DK_BODY			ANIMAL_GL_S_BODY
#define ANIMAL_GL_DK_WING_L1		ANIMAL_GL_S_WING_L1
#define ANIMAL_GL_DK_WING_L2		ANIMAL_GL_S_WING_L2
#define ANIMAL_GL_DK_WING_L3		ANIMAL_GL_S_WING_L3
#define ANIMAL_GL_DK_SWIM			ANIMAL_GL_S_SWIM
/* しゃち */
#define ANIMAL_GL_O_BODY			0
#define ANIMAL_GL_O_HIP				1
#define ANIMAL_GL_O_TAIL			2
#define ANIMAL_GL_O_WING_L			3
/* いるか */
#define ANIMAL_GL_D_BODY			0
#define ANIMAL_GL_D_HIP				1
#define ANIMAL_GL_D_TAIL			2
#define ANIMAL_GL_D_HAND_L			3
#define ANIMAL_GL_D_BODY_DX			4
#define ANIMAL_GL_D_HIP_DX			5
/* 熱帯魚 */
#define ANIMAL_GL_F1_BODY			0
#define ANIMAL_GL_F1_HEAD			1
#define ANIMAL_GL_F1_TAIL			2
#define ANIMAL_GL_F2_BODY			3
#define ANIMAL_GL_F2_HEAD			4
#define ANIMAL_GL_F2_TAIL			5
#define ANIMAL_GL_F5_BODY			6
#define ANIMAL_GL_F5_HEAD			7
#define ANIMAL_GL_F5_TAIL			8
/* ます */
#define ANIMAL_GL_F3_BODY			0
#define ANIMAL_GL_F3_HEAD			1
#define ANIMAL_GL_F3_TAIL			2
/* とびうお */
#define ANIMAL_GL_F4_BODY			0
#define ANIMAL_GL_F4_WING_L			1
/* ヘリ */
#define ANIMAL_GL_HELI_MODEL			0
#define ANIMAL_GL_HELI_MODELT			1
#define ANIMAL_GL_HELI_MODELT2			2
/* ペンギン */
#define ANIMAL_GL_P_HEAD			0
#define ANIMAL_GL_P_BODY			1
#define ANIMAL_GL_P_HAND_L			2
#define ANIMAL_GL_P_FOOT_L			3
/* 動物のアニメーション数 */
#define MAX_NUM_ANIM_ANIMAL			8
#define MAX_NUM_ANIM_SEAGULL		1
#define MAX_NUM_ANIM_ORCA			3
#define MAX_NUM_ANIM_DOLPHIN		8
#define MAX_NUM_ANIM_FISH			2
#define MAX_NUM_ANIM_TROUT			1
#define MAX_NUM_ANIM_FLYFISH		1
#define MAX_NUM_ANIM_DUCK			1
#define MAX_NUM_ANIM_HELI			0
#define MAX_NUM_ANIM_PEN			2

/* プログラムバンク タイプ */
#define BANK_TYPE_NORMAL	0		/* ノーマル */
#define BANK_TYPE_COURSE	1		/* コースバッファ ＋ バンク */
#define BANK_TYPE_PROG		2		/* プログラム８０００ｈ ＋ コース ＋ バンク */
#define BANK_TYPE_HI		3
#define BANK_TYPE_ENDING	4
/* --- ミニマップ転送 --- */
/* ミニマップデータに含まれるしぇいぷの数 */
#define	MAX_NUM_SHAPE_IN_CMAP	6
/* ミニマップＧＬのインデックス */
#define CMAP_GL_CMAP		0
#define CMAP_GL_AN			1
#define CMAP_GL_AN_EX		2
#define CMAP_GL_AN_S		3
#define CMAP_GL_AN_R		4
#define CMAP_GL_AN_H		5

/* アニマルバッファ サイズ */
#define ANIMAL_BUF_SIZE	0x11000
/* プログラムバンク サイズ */
#define PROG_BANK_SIZE	0x11000
/* バンクバッファ サイズ */
#define BANK_BUF_SIZE	0x79000
/* 展開バッファ（Zバッファ） サイズ */
#define SZP_BUF_SIZE	0x25800
/* バンクバッファ サイズ */
#define COURSE_BUF_SIZE	0x40000
#define COURSE_DT_OFFSET	0x30000
#define COURSE_DT_SIZE		0x10000

/* 人データロード状況 */
typedef struct {
	short	kind;		/* 種類 */
	short	level;		/* 0:汚い 1:1P 2:2P */
} sLoadManStat;
/* 動物データロード状況 */
typedef struct {
	int		kind;		/* 種類 */
	uint	baseAddr;	/* 先頭番地 */
} sLoadAnimalStat;
/* 動物のディスプレイリスト */
typedef struct {
	int				numGL;
	unsigned int	addrAnim;
	Gfx				*pGL[MAX_NUM_GL_PER_ANIMAL_DATA];	
} sAnimalGL;
/* みにまっぷのディスプレイリスト */
typedef struct {
	Gfx				*pModel[MAX_NUM_SHAPE_IN_CMAP];	
	Gfx				*pModelT[MAX_NUM_SHAPE_IN_CMAP];	
} sCMapGL;

/* 転送データテーブル（RSP DATA） */
typedef struct {
	uint	segRomStart;	/* 転送元の先頭アドレス */
	uint	segRomEnd;		/* 転送元の終了アドレス */
	uint	flag;			/* フラグ */
	uint	offset;			/* オフセット */
} sTrans;
/* 転送データテーブル（PROG） */
typedef struct {
	uint	romStart , romEnd;
	uint	textStart, textEnd;
	uint	dataStart, dataEnd;
	uint	bssStart , bssEnd;
} sTransProg;

/* 途中で転送 */
#define MAX_AUTO_TRANS_NUM		5
typedef struct {
	short	flag;
	sTrans	*pTrans;
} sAutoTrans;

/* アニメーション */
typedef union {
	MtxVectorI	m;		/* 12 byte -> 16 byte */
	uwlong		f[2];
} MtxVectorIU;

/* 転送フラグ */
#define TRANS_FLAG_END		0	/* エンドコード */
#define TRANS_FLAG_NOP		1	/* 圧縮データ */
#define TRANS_FLAG_NOSZP	2	/* 無圧縮 */
#define TRANS_FLAG_SOTO		3	/* 無圧縮 */
#define TRANS_FLAG_MAN		4	/*  */
#define TRANS_FLAG_COURSE	5	/*  */
#define TRANS_FLAG_COURSE_DT	6	/*  */
#define TRANS_FLAG_ANIMAL	7	/*  */
#define TRANS_FLAG_COURSE_COM	8	/*  */
#define TRANS_FLAG_START_GATE	9
#define TRANS_FLAG_CMAP		10
#define TRANS_FLAG_GHOST	11

/* 水増し */
#define BANK_SOTO_OFFSET		(32*128*2)
#define BANK_SOTO_LENGTH		(32*64*2)


/* --- オフセット --- */
/* 外池関係データの展開時のオフセットアドレス */
#define BANK_OFFSET_BACK0		0x00000000
#define BANK_OFFSET_BACK1		0x00000200
#define BANK_OFFSET_SEA0		0x00000400
#define BANK_OFFSET_SEA1		0x00000c00
#define BANK_OFFSET_BOTTOM0		0x00001400
#define BANK_OFFSET_BOTTOM1		0x00004400
#define BANK_OFFSET_CLOUD0		0x00007400
//#define BANK_OFFSET_CLOUD1		0x0000A400
/* コースマップサイズ */
#define CMAP_SHAPE_SIZE			0x8000
/* 待ち時のオフセットアドレス */
#define BANK_OFFSET_CPACK		0x00000000
/* タイトル時のオフセットアドレス */
#define BANK_OFFSET_TITLE_GER		0x0000a400
#define BANK_OFFSET_TITLE_TITLE		0x00038000
#define BANK_OFFSET_TITLE_PFSMES_GHOST	0x0000b000
#define BANK_OFFSET_TITLE_PFSMES	0x00070000
/* ゲーム時のオフセットアドレス（現在未転送） */
#define BANK_OFFSET_GAME_RACE		0x00042000
#define BANK_OFFSET_GAME_GOAL		0x00049000
#define BANK_OFFSET_GAME_NEWRECORD	0x00049000
#define BANK_OFFSET_GAME_RETIRE		0x00058000
#define BANK_OFFSET_GAME_TIMEUP		0x00071000
#define BANK_OFFSET_GAME_SCORE_NUMBER	0x00024000
#define BANK_OFFSET_GAME_PARK		0x00024000
#define BANK_OFFSET_GAME_GHOST		0x00024000
#define BANK_OFFSET_GAME_PFSMES_GHOST	0x0000b000
#define BANK_OFFSET_GAME_PFSMES		0x00038000

#define BANK_OFFSET_GAME_RACE_2P	0x0004c000
/* マシンセレクト時のオフセットアドレス */
#define BANK_OFFSET_MACHINE 		0x000b0000
/* コースセレクト時のオフセットアドレス */
#define BANK_OFFSET_COURSE_CMAP		0x00010000
#define BANK_OFFSET_COURSE		0x000a0000
/* ツアー結果時のオフセットアドレス */
#define BANK_OFFSET_RESULT_LETTER	0x00060000
#define BANK_OFFSET_RESULT		0x000B0000
/* アタック結果時のオフセットアドレス */
#define BANK_OFFSET_RECORD_LETTER		0x00060000
#define BANK_OFFSET_RECORD_PFSMES_GHOST	0x0000b000
#define BANK_OFFSET_RECORD_PFSMES		0x000B0000
/* ネームエントリー時のオフセットアドレス */
#define BANK_OFFSET_NAME_LETTER		0x00060000
/* コースタイトル時のオフセットアドレス */
#define BANK_OFFSET_CTITLE	 		0x00042000
#define BANK_OFFSET_CTITLE_CMAP		0x00050000
/* コンフィグ時のオフセットアドレス */
#define BANK_OFFSET_CONFIG	 		0x00000000
/* ネームチェンジ時のオフセットアドレス */
#define BANK_OFFSET_CFGNAME	 		0x00060000
/* 記録をみる時のオフセットアドレス */
#define BANK_OFFSET_CFGREC	 		0x00060000
/* コンディション時のオフセットアドレス */
#define BANK_OFFSET_CFGCOND	 		0x00010000
/* サウンド時のオフセットアドレス */
#define BANK_OFFSET_CFGSOUND	 		0x00010000
/* コンディション時のオフセットアドレス */
#define BANK_OFFSET_CFGERASE 		0x00010000
/* セーブ＆ロード時のオフセットアドレス */
#define BANK_OFFSET_CFGSAVE	 		0x00060000
#define BANK_OFFSET_CFGSAVE_PFSMES_GHOST	0x00072000
#define BANK_OFFSET_CFGSAVE_PFSMES	0x00080000
/* ゲームオーバー時のオフセットアドレス */
#define BANK_OFFSET_GAMEOVER_LETTER	0x00060000
#define BANK_OFFSET_GAMEOVER	 	0x00060000
/* 集計時のオフセットアドレス */
#define BANK_OFFSET_CALC_LETTER		0x00060000
#define BANK_OFFSET_CALC		0x000B0000
/* ＶＳ結果時のオフセットアドレス */
#define BANK_OFFSET_VSRESULT		0x00010000
/* エンディング時のオフセットアドレス */
#define BANK_OFFSET_TOUREND		0x00090000
#define BANK_OFFSET_TOUREND_FACE	0x00066000
#define BANK_OFFSET_TOUREND_SHAPE	0x0006e000

/*******************************************************************************
	VARIABLE
*******************************************************************************/
extern short		indexAnimalGL[MAX_ANIMAL_KIND];
extern sAnimalGL	mAnimalGL[MAX_NUM_ANIMAL_LOAD];
extern sAnimalGL	ghostGL;
extern uint 		bankSegmentBaseTable[];


/*******************************************************************************
	FUNCTION
*******************************************************************************/
extern void		transBankSegData( void );
extern void		transCodeSeg( void );
extern void		transProgram( void );
extern void		autoTransData( void );
extern void 	makeManTransData( int pat, int man1, int man2, int man3, int man4 );
extern void 	makeAnimalTransData( uint addr, int animal0, int animal1 );
extern void 	knRomCopy( uchar *src, uchar *dst, uint length );

#endif
