/*----------------------------------------------------------------------------
	IPX ヘッダ
----------------------------------------------------------------------------*/

#ifndef _H_IPX
#define _H_IPX

#define IXD_MAX_NUM		(1024)				/* ワーク最大数					*/
#define IXD_WORK_SIZE	(1024)				/* ワークサイズ					*/
#define IXD_MAX_TASK	(8)					/* 最大タスク数					*/
#define IXD_MAX_LOOP	(4)					/* 最大ループ深度				*/
#define IXD_MAX_SUB		(4)					/* 最大サブルーチン深度			*/
#define IXD_MAX_LINK	(8)					/* 最大リンク数					*/

#define IXD_HEAD_ENTRY	(0)
#define IXD_HEAD_TEXTBL	(1)
#define IXD_HEAD_PTNTBL	(2)
#define IXD_HEAD_ENETBL	(3)
#define IXD_HEAD_WAVTBL	(4)
#define IXD_HEAD_MIDTBL	(5)

#define INT_ATTHIT		1					/* 攻撃当たり割り込み番号		*/
#define INT_DEFHIT		2					/* やられ当たり割り込み番号		*/
#define INT_DEAD		3					/* 死亡							*/
#define INT_ITEM		4					/* アイテム回収					*/
#define INT_CLEAR		5					/* クリア						*/
#define INT_RESET		6					/* ソフトリセット				*/

#define ATTR_PLAYER		0					/* プレイヤー属性				*/
#define ATTR_ENEMY		1					/* エネミー属性					*/
#define ATTR_NUTRAL		2					/* 中立属性						*/

#define VIB_MODE_STOP	0					/* 停止							*/
#define VIB_MODE_ONE	1					/* ワンショット					*/
#define VIB_MODE_CONT	2					/* 連続							*/
#define VIB_MODE_CONV	3					/* 減衰							*/

#define VIB_DIR_UD		0					/* 上下							*/
#define VIB_DIR_LR		1					/* 左右							*/
#define VIB_DIR_FB		2					/* 前後							*/

/*--------------------------------------------------------------------------*/
#define SPR_HFLIP		(0x00000001)		/*	水平反転					*/
#define SPR_VFLIP		(0x00000002)		/*	垂直反転					*/
#define SPR_HIDE		(0x00000004)		/*	表示オフ					*/
/*--------------------------------------------------------------------------*/

#define OBJ(x)			(((OBJECT *)ix->wok)->x)
#define TASK(x)			(((OBJECT *)ix->wok)->task[ix->tsk].x)
#define OBJ2(w,x)		(((OBJECT *)(w))->x)
#define TASK2(w,x,t)	(((OBJECT *)(w))->task[t].x)

#define DID_OBJ(id,x)	OBJ2(ixID2WW(id), x)

#if 1
#define GET1(x)		(  ix->poi[(x)+0]          )
#define GET2(x)		( (ix->poi[(x)+1]<< 8) + \
					  (ix->poi[(x)+0]    )     )
#define GET4(x)		( (ix->poi[(x)+3]<<24) + \
					  (ix->poi[(x)+2]<<16) + \
					  (ix->poi[(x)+1]<< 8) + \
					  (ix->poi[(x)+0]    )     )
#else
#define GET1(x)			(*(u_char *)((u_long)ix->poi+(x)))
#define GET2(x)			(*(u_short*)((u_long)ix->poi+(x)))
#define GET4(x)			(*(u_long *)((u_long)ix->poi+(x)))
#endif

#define GET_STAT(x)		(ix_stat&(1<<(x)))
#define SET_STAT(x)		(ix_stat|=(1<<(x)))
#define RESET_STAT(x)	(ix_stat&=~(1<<(x)))

#define R_NEXT(x)		return(0x00000000|(x)&0x0fffffff)	/* 次の命令へ				*/
#define R_WAIT(x)		return(0x10000000|(x)&0x0fffffff)	/* ウエイト後次の命令へ		*/
#define R_BRA(x)		return(0x20000000|(x)&0x0fffffff)	/* 分岐後次の命令へ(相対)	*/
#define R_JMP(x)		return(0x30000000|(x)&0x0fffffff)	/* 分岐後次の命令へ(絶対)	*/
#define R_EXIT(x)		return(0x40000000|(x)&0x0fffffff)	/* 終了						*/
#define R_HALT(x)		return(0x50000000|(x)&0x0fffffff)	/* ホールト					*/

/*----------------------------------------------------------------------------
		オブジェクト用ステータス
----------------------------------------------------------------------------*/

#define	O_REV_H			( 0)		/* $00000001 左右反転					*/
#define	O_REV_V			( 1)		/* $00000002 上下反転					*/
#define	O_ALPHA			( 2)		/* $00000004 α:−α					*/
#define	O_SYNC			( 3)		/* $00000008 他にシンクロ				*/

#define	O_SEC			( 4)		/* $00000010 シークレット				*/
#define	O_DISP			( 5)		/* $00000020 表示領域					*/
#define	O_ANI			( 6)		/* $00000040 アニメ中					*/
#define	O_MOV			( 7)		/* $00000080 移動中						*/

#define	O_MESH			( 8)		/* $00000100 メッシュ					*/
#define	O_AUTO			( 9)		/* $00000200 自動消滅					*/
#define	O_ATT			(10)		/* $00000400 攻撃判定あり				*/
#define	O_DEF			(11)		/* $00000800 やられ判定あり				*/

#define	O_READY			(12)		/* $00001000 出現済み					*/
#define	O_BORN			(13)		/* $00002000 ボーン						*/
#define	O_SYNC_EX		(14)		/* $00004000 多間接シンクロ				*/
#define	O_ITEM			(15)		/* $00008000 アイテム					*/

#define	O_ENEMY			(16)		/* $00010000 敵							*/
#define	O_TEXTURE		(17)		/* $00020000 テクスチャ使用				*/
#define	O_BREND			(18)		/* $00040000 αブレンド使用				*/
#define	O_FILTER		(19)		/* $00080000 テクスチャフィルタ使用		*/

#define	O_PART			(20)		/* $00100000 パーティクル				*/
#define	O_FLASH			(21)		/* $00200000 フラッシュ					*/
#define	O_LIGHT			(22)		/* $00400000 ライト						*/
#define	O_ENLIGHT		(23)		/* $00800000 ライト有効					*/
/*--------------------------------------------------------------------------*/

typedef struct {
	long		x;
	long		y;
	long		w;
	long		h;
} TRECT;

typedef struct {
	long		now;				/* 現在値								*/
	long		vec;				/* 加算値								*/
	long		tar;				/* ターゲット							*/
	long		cnt;				/* カウント								*/
} POS;

typedef struct {
	u_short		used;				/* タスク使用状況						*/
	short		cnt;				/* タスクカウンタ						*/
	u_long		poi;				/* タスクポインタ						*/
	u_long		dbg;				/* デバッグ用							*/
	u_long		adrs[IXD_MAX_LOOP];	/* ループ先バッファ						*/
	short		work[IXD_MAX_LOOP];	/* ループ回数の使用バッファワーク		*/
	u_long		buf[IXD_MAX_SUB];	/* サブルーチンバッファ					*/
	short		loop;				/* ループレベル							*/
	short		sub;				/* サブルーチンレベル					*/
} IXS_TASK;

/*----------------------------------------------------------------------------
		オブジェワーク
----------------------------------------------------------------------------*/

typedef struct {
	u_short		id;					/* 識別ＩＤ								*/
	u_short		user;				/* ユーザーＩＤ							*/
	u_short		prio;				/* 実行プライオリティ					*/
	u_short		mesh;				/* メッシュハンドル						*/
	u_short		born;				/* ボーンハンドル						*/
	u_short		part;				/* パーティクルハンドル					*/
	u_short		light;				/* ライトハンドル						*/
	u_short		link_used;			/* リンクフラグ							*/
	u_long		int_tbl;			/* 割り込みテーブルアドレス				*/
	u_long		stat;				/* ステータス							*/
	u_long		sync;				/* シンクロ先アドレス					*/
	u_long		top;				/* トップアドレス						*/
	
	IXS_TASK	task[IXD_MAX_TASK];	/* タスクワーク							*/
	long		work[32];			/* 汎用ワーク							*/
	u_long		link[IXD_MAX_LINK];	/* リンクワーク							*/
	
	long		ex_x;				/* ＥＸシンクロ用						*/
	long		ex_y;				/* ＥＸシンクロ用						*/
	
	long		world_x;			/* ワールドＸ座標						*/
	long		world_y;			/* ワールドＹ座標						*/
	long		world_z;			/* ワールドＺ座標						*/
	long		world_zoom;			/* ワールド縮尺							*/
	short		world_roll;			/* ワールド角度							*/
	
	POS			local_x;			/* ローカル座標Ｘ						*/
	POS			local_y;			/* ローカル座標Ｙ						*/
	POS			local_zoom;			/* ローカル縮尺							*/
	POS			local_roll;			/* ローカル角度							*/
	
	u_long		color;				/* カラー								*/
	short		grp;				/* グループ番号							*/
	short		ptn;				/* パターン番号							*/
	
	TRECT		att_r;				/* 攻撃矩形								*/
	TRECT		def_r;				/* やられ矩形							*/
	short		att_attr;			/* 攻撃側属性							*/
	short		def_attr;			/* やられ側属性							*/
	
	long		tex_u;				/* テクスチャ座標						*/
	long		tex_v;				/* テクスチャ座標						*/
	
} OBJECT;
/*--------------------------------------------------------------------------*/
typedef struct {
	long		cnt;					/* タスクカウンター					*/
	long		ret;					/* リターン値						*/
	long		tsk;					/* 現タスク番号						*/
	u_char		*poi;					/* タスクポインタ					*/
	u_char		*wok;					/* 自分のワーク						*/
	OBJECT		*o;						/* デバッグ用						*/
	
	u_char		*att[IXD_MAX_NUM];		/* 攻撃側							*/
	u_char		*def[IXD_MAX_NUM];		/* やられ側							*/
	long		att_num;				/* 攻撃側数							*/
	long		def_num;				/* やられ側数						*/
	long		enemy_num;				/* 敵数								*/
	
	u_char		*adrs[IXD_MAX_NUM];		/* ワークアドレス					*/
	short		top;					/* 最初のジョブ						*/
	short		bottom;					/* 最後のジョブ						*/
	short		num;					/* 現在のジョブ数					*/
	short		prio[IXD_MAX_NUM];		/* ジョブの優先						*/
	short		next[IXD_MAX_NUM];		/* 次のジョブ						*/
	short		prev[IXD_MAX_NUM];		/* 前のジョブ						*/
} IXS_IPX_ENV;

typedef struct {
	u_short grp;
	short	id;
	u_long	name;
} TEXTBL;

typedef struct {
	short	x0,y0;
	short	x1,y1;
	short	texno;
	short	pad;
} PTNTBL;

typedef struct {
	long	px,py;						/*	座標							*/
	long	prio;						/*	優先							*/
	u_long	mate;						/*	マテリアル						*/
	u_long	attr;						/*	属性							*/
	short	zoom;						/*	縮尺							*/
	u_short	roll;						/*	回転							*/
	short	grp;						/*	グループＩＤ					*/
	short	ptn;						/*	パターン番号					*/
} SPRITE;

extern IXS_IPX_ENV	*ix;				/* IPXワーク						*/
extern u_char 		*ix_www;			/* IPXワークバッファ				*/
extern u_char 		*ix_buf;			/* IPXワークバッファ				*/
extern u_long		ix_stat;			/* ステータスワーク					*/

/*--------------------------------------------------------------------------*/

extern void	ixInit(void);
extern void	ixExit(void);
extern void	ixAddJobs(u_short priority,u_char *work_adrs);
extern void	ixDelJobs(u_char *work_adrs);
extern u_long ixGetJobs(void);
extern void	ixFreeJobsW(u_char *work_adrs);
extern void	ixFreeJobsID(short user_id);
extern u_long ixID2WW(short user_id);
extern void	ixAllEraseJobs(void);
extern void	ixDestructor(u_char *work_adrs);
extern void	ixMainLoop(void);

extern u_long ixGetHeader(long no);
extern u_long ixGetAddress(u_long ad);
extern void ixInterrupt(OBJECT *INT,long no);
extern u_long ixGetGoto(OBJECT *INT,long no);

extern long	ixRun(void);
extern long	ixNone(void);
extern long	ixObject(void);
extern void ixHitCheck(void);

extern long	ixGetVal(long val);
extern long	ixGetLab(long lab);
extern long	ixGetValGET4(long gt);
extern long	ixGetLabGET4(long lb);

extern void ixDispSprite(SPRITE *);
extern void ixDispSpriteLight(SPRITE *);
extern void ixDispSprite2(SPRITE *);
extern long GetID(long grp,long ptn);

/*--------------------------------------------------------------------------*/
extern long	ixReserv(void);				/* ixs_com.c						*/
extern long	ixEnd(void);				/* ixs_com.c						*/
extern long	ixNop(void);				/* ixs_com.c						*/
extern long	ixWait(void);				/* ixs_com.c						*/
extern long	ixBra(void);				/* ixs_com.c						*/
extern long	ixBraTbl(void);				/* ixs_com.c						*/
extern long	ixFor(void);				/* ixs_com.c						*/
extern long	ixNext(void);				/* ixs_com.c						*/
extern long	ixCall(void);				/* ixs_com.c						*/
extern long	ixRet(void);				/* ixs_com.c						*/
extern long ixTaskRun(void);			/* ixs_com.c						*/
extern long ixTaskExit(void);			/* ixs_com.c						*/
extern long ixTaskStop(void);			/* ixs_com.c						*/
extern long ixTaskCont(void);			/* ixs_com.c						*/

extern long	ixNewJob(void);				/* ixs_com.c						*/
extern long	ixDelJob(void);				/* ixs_com.c						*/
extern long	ixChkJob(void);				/* ixs_com.c						*/
extern long	ixPrio(void);				/* ixs_com.c						*/
extern long	ixPrioR(void);				/* ixs_com.c						*/
extern long	ixSyncOn(void);				/* ixs_com.c						*/
extern long	ixSyncEx(void);				/* ixs_com.c						*/
extern long	ixSyncOff(void);			/* ixs_com.c						*/
extern long	ixLink(void);				/* ixs_com.c						*/
extern long	ixUnLink(void);				/* ixs_com.c						*/
extern long	ixChkLink(void);			/* ixs_com.c						*/

extern long ixMove(void);				/* ixs_work.c						*/
extern long ixCalc(void);				/* ixs_work.c						*/
extern long ixZero(void);				/* ixs_work.c						*/
extern long ixNZero(void);				/* ixs_work.c						*/
extern long ixIf(void);					/* ixs_work.c						*/
extern long ixJchk(void);				/* ixs_work.c						*/
extern long ixJchkS(void);				/* ixs_work.c						*/
extern long ixGetWork(void);			/* ixs_work.c						*/
extern long ixPutWork(void);			/* ixs_work.c						*/
extern long ixTarChk(void);				/* ixs_work.c						*/
extern long ixChkNum(void);				/* ixs_work.c						*/

extern long ixSetZ(void);				/* ixs_obj.c						*/
extern long ixSetPos(void);				/* ixs_obj.c						*/
extern long ixSetPosXY(void);			/* ixs_obj.c						*/
extern long ixVecPos(void);				/* ixs_obj.c						*/
extern long ixVecPosXY(void);			/* ixs_obj.c						*/
extern long ixAddPos(void);				/* ixs_obj.c						*/
extern long ixAddPosXY(void);			/* ixs_obj.c						*/
extern long ixAddVec(void);				/* ixs_obj.c						*/
extern long ixAddVecXY(void);			/* ixs_obj.c						*/
extern long ixTarPos(void);				/* ixs_obj.c						*/
extern long ixTarPosXY(void);			/* ixs_obj.c						*/
extern long ixCntPos(void);				/* ixs_obj.c						*/
extern long ixCntPosXY(void);			/* ixs_obj.c						*/
extern long ixSetZoom(void);			/* ixs_obj.c						*/
extern long ixSetRoll(void);			/* ixs_obj.c						*/
extern long ixStatus(void);				/* ixs_obj.c						*/
extern long ixChkStat(void);			/* ixs_obj.c						*/
extern long ixGrp(void);				/* ixs_obj.c						*/
extern long ixPtn(void);				/* ixs_obj.c						*/
extern long ixFont(void);				/* ixs_obj.c						*/
extern long ixNewObj(void);				/* ixs_obj.c						*/
extern long ixEnemy(void);				/* ixs_obj.c						*/
extern long ixShot1(void);				/* ixs_obj.c						*/
extern long ixShot2(void);				/* ixs_obj.c						*/
extern long ixLaser1(void);				/* ixs_obj.c						*/
extern long ixLaser2(void);				/* ixs_obj.c						*/
extern long ixHoming1(void);			/* ixs_obj.c						*/
extern long ixHoming(void);				/* ixs_obj.c						*/
extern long ixAttRect(void);			/* ixs_obj.c						*/
extern long ixDefRect(void);			/* ixs_obj.c						*/
extern long ixAttAttr(void);			/* ixs_obj.c						*/
extern long ixDefAttr(void);			/* ixs_obj.c						*/
extern long ixColor(void);				/* ixs_obj.c						*/

extern long ixLoadTex(void);			/* ixs_sys.c						*/
extern long ixFreeTex(void);			/* ixs_sys.c						*/
extern long ixInitScr(void);			/* ixs_sys.c						*/
extern long ixSetInt(void);				/* ixs_sys.c						*/
extern long ixGetRnd(void);				/* ixs_sys.c						*/
extern long ixRndBra(void);				/* ixs_sys.c						*/
extern long ixInt(void);				/* ixs_sys.c						*/
extern long ixGoto(void);				/* ixs_sys.c						*/
extern long ixSetFade(void);			/* ixs_sys.c						*/
extern long ixFadeIn(void);				/* ixs_sys.c						*/
extern long ixFadeOut(void);			/* ixs_sys.c						*/
extern long ixAddScore(void);			/* ixs_sys.c						*/
extern long ixDisp(void);				/* ixs_sys.c						*/
extern long ixRndSeed(void);			/* ixs_sys.c						*/
extern long ixTrace(void);				/* ixs_sys.c						*/
extern long ixVibrate(void);			/* ixs_sys.c						*/
extern long ixParform(void);			/* ixs_sys.c						*/

extern long ixBornCreate(void);			/* ixs_born.c						*/
extern long ixBornFree(void);			/* ixs_born.c						*/
extern long ixBornNum(void);			/* ixs_born.c						*/
extern long ixBornGrp(void);			/* ixs_born.c						*/
extern long ixBornPtn(void);			/* ixs_born.c						*/
extern long ixBornXAbs(void);			/* ixs_born.c						*/
extern long ixBornXRel(void);			/* ixs_born.c						*/
extern long ixBornYAbs(void);			/* ixs_born.c						*/
extern long ixBornYRel(void);			/* ixs_born.c						*/
extern long ixBornRollAbs(void);		/* ixs_born.c						*/
extern long ixBornRollRel(void);		/* ixs_born.c						*/
extern long ixBornDistAbs(void);		/* ixs_born.c						*/
extern long ixBornDistRel(void);		/* ixs_born.c						*/
extern long ixBornColor(void);			/* ixs_born.c						*/
extern long ixBornRollTbl(void);		/* ixs_born.c						*/

extern long ixSndLoad(void);			/* ixs_sound.c						*/
extern long ixSndFree(void);			/* ixs_sound.c						*/
extern long ixSndPlay(void);			/* ixs_sound.c						*/
extern long ixMidPlay(void);			/* ixs_sound.c						*/
extern long ixMidStop(void);			/* ixs_sound.c						*/
extern long ixCddaPlay(void);			/* ixs_sound.c						*/

extern long ixSetUV(void);				/* ixs_draw.c						*/
extern long ixDraw3(void);				/* ixs_draw.c						*/
extern long ixDraw4(void);				/* ixs_draw.c						*/

extern long ixMeshCreate(void);			/* ixs_mesh.c						*/
extern long ixMeshFree(void);			/* ixs_mesh.c						*/
extern long ixMeshMode(void);			/* ixs_mesh.c						*/
extern long ixMeshPrio(void);			/* ixs_mesh.c						*/
extern long ixMeshClear(void);			/* ixs_mesh.c						*/
extern long ixMeshEffect(void);			/* ixs_mesh.c						*/

extern long ixPtCreate(void);			/* ixs_part.c						*/
extern long ixPtFree(void);				/* ixs_part.c						*/

extern long ixLtCreate(void);			/* ixs_light.c						*/
extern long ixLtFree(void);				/* ixs_light.c						*/
extern long ixLtInten(void);			/* ixs_light.c						*/
extern long ixLtDir(void);				/* ixs_light.c						*/
extern long ixLtRange(void);			/* ixs_light.c						*/
extern long ixLtOffset(void);			/* ixs_light.c						*/

/*--------------------------------------------------------------------------*/
#endif
