/* HZD -> HZX 関数変更草稿 */



typedef unsigned int HZX_GROUP_ID;



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

/*

	トラップ関連

*/



// trap.c



/* トラップ進入判定＆イベント発生 */

void		HZD_EnterTrap( hzd, map, ev )

HZD_HDL		*hzd ;

int		map ;

HZD_EVT		*ev ;



	void HZX_EnterTrap( HZX_GROUP_ID id, HZX_EVT *ev );



/* トラップフラッシュ */

void		HZD_FlashTrap( ctrl )

CONTROL		*ctrl ;



	void HZX_FlashTrap( HZX_GROUP_ID id, HZX_EVT *ev );



/* ビハインドモード */

int		HZD_CheckBehind( HZD_BEHIND **bhs,

				 HZD_HDL *hzd, int map, FVECTOR *pos )



	int HZX_CheckBehind( HZX_GROUP_ID id, HZX_BEHIND **bhds, FVECTOR *pos );



// bind.c



int		HZD_ExecEvent( ev, map, mode )

HZD_EVT		*ev ;

u_int		map ;

u_int		mode ;



	int HZX_ExecEvent( HZX_GROUP_ID id, HZX_EVT *ev, u_int mode );



void		HZD_SetEvent( ev, chara, mov, rot )

HZD_EVT		*ev ;

int		chara ;

FVECTOR		*mov ;

SVECTOR		*rot ;



**	void HZX_SetEvent( HZD_EVT *ev, int chara, FVECTOR *mov, SVECTOR *rot );



void		HZD_SetBind( bnd )

HZD_BND		*bnd ;



**	void HZX_SetBind( HZD_BND *bnd );



void	HZD_InitTrapBind( void )



**	void HZX_InitTrapBind( void );



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

/*

	動的壁、床設定

*/



// dynamic.c



/* 動的壁移動 */

void		HZD_MoveDynamicSegment( seg, p1, p2 )

HZD_D_SEGMENT	*seg ;

IVECTOR		*p1, *p2 ;



**	void HZX_MoveDynamicSegment( HZX_D_SEGMENT *seg, IVECTOR *p1, IVECTOR *p2 );



/* 動的壁登録 */

HZD_D_SEGMENT	*HZD_AddDynamicSegment( map, p1, p2, atr )

int		map ;

IVECTOR		*p1, *p2 ;

u_int		atr ;



	void HZX_AddDynamicSegment( HZX_GROUP_ID id, IVECTOR *p1, IVECCTOR *p2, u_int atr );



/* 動的壁削除 */

void		HZD_RemoveDynamicSegment( seg ) 

HZD_D_SEGMENT	*seg ;



**	void HZX_RemoveDynamicSegment( HZX_D_SEGMENT *seg );



/* 動的床移動 */

void		HZD_MoveDynamicFloor( flr, p1, p2, p3, p4 ) 

HZD_D_FLOOR	*flr ;

IVECTOR		*p1, *p2, *p3, *p4 ;



**	void HZX_MoveDynamicFloor( HZX_D_FLOOR	*flr, IVECTOR *p1, IVECTOR *p2

								, IVECTOR *p3, IVECTOR *p4 );



/* 動的床登録 */

HZD_D_FLOOR	*HZD_AddDynamicFloor( map, p1, p2, p3, p4, n, atr )

int		map ;

IVECTOR		*p1, *p2, *p3, *p4 ;

int		n ;

u_int		atr ;



	HZX_D_FLOOR *HZX_AddDynamicFloor( HZX_GROUP_ID id, IVECTOR *p1, IVECTOR *p2

									, IVECTOR *p3, IVECTOR *p4, int n, u_int atr );



/* 動的床削除 */

void		HZD_RemoveDynamicFloor( flr ) 

HZD_D_FLOOR	*flr ;



**	HZX_RemoveDynamicFloor( HZX_D_FLOOR *flr );



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

/*

	near

*/



// nearx.c



int	HZD_NearHazardCheckZ( map, from, sphere, chk_flag, seg_flag, r_sphere )

int		map ;

FVECTOR		*from ;

int		sphere ;

int		chk_flag, seg_flag ;

int		r_sphere ;



	int HZX_NearHazardChech( HZX_GROUP_ID id, FVECTOR *from, int sphere

								, int chk_flag, int seg_flag, int r_sphere );



/* 結果を取得 */

void	HZD_GetNearHazard( segs, atrs ) 

HZD_SEG		*segs ;

int		*atrs ;



**	void HZX_GetNearHazard( HZX_SEG *segs, int *atrs );



/* 結果のポインタを取得 */

void		HZD_GetNearHazardPtr( segs, blk )

SVECTOR		**segs ;

HZD_BLOCK	**blk ;



**	void HZX_GetNearHazardPtr( HZX_SEG **segs, HZD_BLOCK **blk );



/* 結果のポインタからＨＺＤ＿ＳＥＧを生成 */

void		HZD_MakeNearHazard( segs, v, blk )

HZD_SEG		*segs ;

SVECTOR		**v ;

HZD_BLOCK	**blk ;



**	void HZX_MakeNearHazard( HZX_SEG *segs, SVECTOR **v, HZX_BLOCK **blk );



/* 近接壁へのベクトルを取得 */

void	HZD_GetNearVector( vect_ptr )

FVECTOR		*vect_ptr ;



**	void HZX_GetNearVector( FVECTOR *vect_ptr );



/* 近接壁への最近点がエッジであるかどうか */

void	HZD_GetIsEdge( ie )

signed char		*ie ;



**	void HZX_GetIsEdge( signed char *ie );



/* 反発ベクトルを取得 */

void	HZD_GetReactVector( react )

FVECTOR	*react ;



**	void HZX_GetReactVector( FVECTOR *react );



/* 結果のアトリビュートを取得 */

void	HZD_GetNearHazardAtr( atrs )

int	*atrs ;



**	void HZX_GetNearHazardAtr( int *atrs );



/* 以前のバージョン用 */

void	HZD_GetNearHazardF( segs )

HZD_SEG	**segs ;



	削除？



/*

	レーダー用

*/

int	*HZD_GetNearBlockID( HZD_GRP *grp, FVECTOR *from, int sphere, int *n_blocks )



	int *HZX_GetNearBlockID( HZX_GROUP_ID id, FVECTOR *from, int sphere, int *n_blocks );



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

/*

	online

*/



// online.c



/* オンラインチェック */

int 	HZD_OnlineHazardCheckZ( map, from, to, chk_flag, seg_flag, flr_flag )

int		map ;

FVECTOR		*from, *to ;

int		chk_flag, seg_flag, flr_flag ;



	int 	HZX_OnlineHazardCheck( HZX_GROUP_ID id, FVECTOR *from, FVECTOR *to

				, int check_flag, int seg_flag, int flr_flag );



/* 結果を取得 */

void	HZD_GetOnlineHazard( seg, atr )

HZD_FLR		*seg ;

int		*atr ;



**	void HZX_GetOnlineHazard( HZX_FLR *seg, int *atr );



/* 結果のポインタを取得 */

void	HZD_GetOnlineHazardPtr( v, blk )

SVECTOR		*v ;

HZD_BLOCK	*blk ;



**	void HZX_GetOnlineHazardPtr( SVECTOR *v, HZX_BLOCK *block );



/* ＦＲＯＭ－交差点ベクトルを取得 */

void	HZD_GetOnlineVector( vect_ptr )

FVECTOR		*vect_ptr ;



** void HZX_GetOnlineVector( FVECTOR *vect_ptr );



/* 結果の交差点座標を取得 */

void	HZD_GetOnlinePoint( ptp_ptr )

FVECTOR		*ptp_ptr ;



** void HZX_GetOnlinePoint( FVECTOR *ptp_ptr );



/* 結果のアトリビュート取得 */

int	HZD_GetOnlineHazardAtr( void )



** int HZX_GetOnlineHazardAtr( void );



/* 当たったのが壁か床か */

int	HZD_GetOnlineHazardType( void )



**	int HZD_GetOnlineHazardType( void )



/* 当たった壁のグループ */

int	HZD_GetOnlineHazardGroup( void )



**	int HZD_GetOnlineHazardGroup( void )



/* 以前のバージョン用 */

HZD_SEG		*HZD_GetOnlineHazardF( void )



	削除？



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

/*

	床

*/



// levelx.c



/* 床／天井チェック */

int		HZD_LevelHazardCheckZ( map, from, chk_flag, flr_flag )

int		map ;

FVECTOR		*from ;

int		chk_flag, flr_flag ;



	int HZX_LevelHazardCheck( HZX_GROUP_ID id, FVECTOR *from, int chk_flag, int flr_flag );



/* 結果を取得 */

void	HZD_GetLevelHazard( flr, atr )

HZD_FLR		*flr ;

int		*atr ;



**	void HZX_GetLevelHazard( HZD_FLR *flr );



/* 結果のポインタを取得 */

void	HZD_GetLevelHazardPtr( flr, blk )

SVECTOR		**flr ;

HZD_BLOCK	**blk ;



**	void HZX_GetLevelHazardPtr( SVECTOR **flr, HZX_BLOCK **blk );



/* 結果の形状を取得（３ ＯＲ ４） */

void	HZD_GetLevelHazardType( type )

int	*type ;



**	void HZX_GetLevelHazardType( int *type );



/* 結果の高さのみ取得 */

void	HZD_GetLevelHeight( lvl_ptr )

float	*lvl_ptr ;



**	void HZX_GetLevelHeight( float *lvl_ptr );



/* 結果の床高さを取得 */

float	HZD_GetFloorLevel( void )



**	float HZX_GetFloorLevel( void );



/* 結果の床アトリビュートを取得 */

int	HZD_GetLevelAtr( void )



**	int HZX_GetLevelAtr( void )



/* 以前のバージョン用 */

void	HZD_GetLevelHazardF( flrs )

HZD_FLR		**flrs ;



	削除？



/* 傾斜床の高さを調べる２ */

void	HZD_SlopeFloorLevel( h, mov, flr )

float		*h ;

FVECTOR		*mov ;

HZD_FLR		*flr ;



**	HZX_SlopeFloorLevel( float *h, FVECTOR *mov, HZX_FLR *flr );



/*

   現在のブロック

*/

HZD_BLOCK	*HZD_GetInsideBlock( hzd, map, mov )

HZD_HDL	*hzd ;

int	map ;

FVECTOR	*mov ;



**	HZX_BLOCK *HZX_GetInsideBlocK( HZX_GROUP_ID id, FVECTOR *mov );



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

/*

	NAVIGATE, ROUTE

*/



// GM_CurrentMapはなるべくつかわない



// inline



static	inline	int	HZD_Address( zone1, zone2 )

int			zone1, zone2 ;



static	inline	int	HZD_Address_M( mapbit, zone1, zone2 )

int		mapbit, zone1, zone2 ;



	extern inline int HZX_Address( HZX_GROUP_ID id, int zone1, int zone2 );



static	inline	int	HZD_ZoneMapBit( mapid )

int			mapid ;



	extern inlne int HZX_ZoneMapBit( map_no )



static	inline	int	HZD_Zone1( address )

int			address ;



**	extern inline int HZX_Zone1( int address );



static	inline	int	HZD_Zone2( address )

int			address ;



**	extern inline int HZX_Zone2( int address );



static	inline	HZX_ZON	*HZD_GetZone( hzd, zone )

HZD_HDL			*hzd ;

int			zone ;



static	inline	HZX_ZON	*HZD_GetZone_M( hzd, zone, mapbit )

HZD_HDL			*hzd ;

int			zone ;

int			mapbit ;



	extern inline HZX_ZON *HZX_GetZone( HZX_GROUP_ID id, int zone );



static	inline HZD_GRP	*HZD_GetGroup( hzd, mapbit )

HZD_HDL		*hzd ;

int	mapbit ;



	extern inline HZX_GRP *HZX_GetGroup( HZX_GROUP_ID id );



static	inline int	HZD_GetLinkGroupID( link_zone )

HZD_ZON	*link_zone ;



	extern inline int HZX_GetLinkGroupID( HZX_ZON *link_zone )



static	inline int	HZD_GetLinkZone( link_zone )

HZD_ZON	*link_zone ;



	extern inline int HZX_GetLinkZone( HZX_ZON *link_zone );



// navigate.c



/* 場所と前フレームのゾーンアドレスから高速に現在のゾーンアドレスを計算する */

/* 1:ゾーンに含まれていれば必ず z1==z2 になるように修正 */

int		HZD_GetAddress( hzd, pos, address )

HZD_HDL		*hzd ;

FVECTOR		*pos ;

int			address ;



int		HZD_GetAddress_M( hzd, pos, address, mapbit )

HZD_HDL		*hzd ;

FVECTOR		*pos ;

int			address ;

int			mapbit ;



	HZX_GetAddress( HZX_GROUP_ID id, FVECTOR *pos, int address );



int		HZD_ReachTo( hzd, addr1, addr2 )

HZD_HDL		*hzd ;

int		addr1 ;

int		addr2 ;



int		HZD_ReachTo_M( hzd, addr1, addr2 )

HZD_HDL		*hzd ;

int		addr1 ;

int		addr2 ;



	HZX_ReachTo( HZX_GROUP_ID id, int addr1, int addr2 );



/* 同じ距離なら先に検索されたゾーンを選択 */

int		HZD_Navigate( hzd, addr1, addr2, pos )

HZD_HDL		*hzd ;

int		addr1 ;

int		addr2 ;

FVECTOR		*pos ;



/* 同じ距離なら後に検索されたゾーンを選択 */

int		HZD_Navigate2( hzd, addr1, addr2, pos )

HZD_HDL		*hzd ;

int		addr1 ;

int		addr2 ;

FVECTOR		*pos ;



int		HZD_Navigate_M( hzd, addr1, addr2, pos )

HZD_HDL		*hzd ;

int		addr1 ;

int		addr2 ;

FVECTOR		*pos ;



	int	HZX_Navigate( HZD_GROUP_ID id, int addr1, int addr2, FVECTOR *pos );



int		HZD_NavigateMapToMap( hzd, addr1, addr2 )

HZD_HDL		*hzd ;

int		addr1 ;

int		addr2 ;



	int HZX_NavigateMapToMap( HZX_GROUP_ID id, int zone1, int zone2 );



int	HZD_LinkZoneAddress ( hzd, zone, mapbit )

HZD_HDL		*hzd ;

int			zone ;

int			mapbit ;



	int HZX_LinkZoneAddress( HZX_GROUP_ID id, int zone );

	

/* 同マップ内で２つのゾーンがどれだけ離れているかを計算する */

/* ちょっと重い */

long HZD_ZoneDistance( HZD_HDL *hzd, long zone_from, long zone_to, int mapbit )



	int HZX_ZoneDistance( HZX_GROUP_ID id, int zone_from, int zone_to );



/* ルート内で開始ゾーンから指定距離を超えたゾーン番号を返す */

/* ちょっと重い */

long HZD_OverDistanceZone( HZD_HDL *hzd, long zone_from, long zone_to,int dis_th, int mapbit )



	int HZX_ZoneDistance( HZX_GROUP_ID id, int zone_from, int zone_to, int dis_th );



/* ルート内で開始ゾーンから画面外の最初のゾーン番号を返す */

/* ちょっと重い */

long HZD_BoundOutZone( HZD_HDL *hzd, long zone_from, long zone_to, int dis_th, int mapbit )



	int HZX_BoundOutZone( HZX_GROUP_ID id, int zone_from, int zone_to, int dis_th );



/* 座標がゾーンに含まれているかチェック */

int	HZD_InsideZone( hzd, pos, zone )

HZD_HDL		*hzd ;

FVECTOR		*pos ;

int		zone ;



int	HZD_InsideZone_M( hzd, pos, zone, mapbit )

HZD_HDL		*hzd ;

FVECTOR		*pos ;

int		zone ;

int		mapbit ;



	int HZX_InsideZone( HZX_GROUP_ID id, FVECTOR *pos, int zone );



/* 隣接したゾーン */

int	HZD_NearZones( hzd, zone, near )

HZD_HDL		*hzd ;

int			zone ;

int			*near ;



int	HZD_NearZones_M( hzd, zone, near, mapbit )

HZD_HDL		*hzd ;

int			zone ;

int			*near ;

int			mapbit ;



	int HZX_NearZones( HZX_GROUP_ID id, int zone, int *near );



	/*

		目標のゾーンから遠くなるために

		次に行くべきゾーンを計算する

	*/

int	HZD_FarZoneNavigate( hzd, zone1, zone2, rout, mapbit )

HZD_HDL		*hzd ;		/* 当たりハンドラ	*/

int		zone1 ;		/* 現在のゾーン		*/

int		zone2 ;		/* 目標のゾーン		*/

int		*rout ;		/* ルート数	*/

int		mapbit ;



	int HZX_FarZoneNavigate( HZX_GROUP_ID id, int zone1, int zone2, int *root );



	/*

		目標のゾーンまでのルート数を返す

	*/

int	HZD_GetRoute( hzd, fromadd, toadd )

HZD_HDL		*hzd ;		/* 当たりハンドラ	*/

int			fromadd ;	/* 現在のゾーン		*/

int			toadd ;		/* 目標のゾーン		*/



int	HZD_GetRoute_M( hzd, zone1, zone2, mapbit )

HZD_HDL		*hzd ;	/* 当たりハンドラ	*/

int		zone1 ;		/* 現在のゾーン		*/

int		zone2 ;		/* 目標のゾーン		*/

int		mapbit ;



	int HZX_GetRoute( HZX_GROUP_ID id, int zone1, int zone2 );



/* 現在の座標がどのマップに属するかを

   ゾーンから検索する */

int	HZD_GetMapIDbyZone( pos, map_id, zone_num )

FVECTOR		*pos ;

int		map_id ;

int		*zone_num ;



	int HZX_GetMapIDbyZone( HZX_GROUP_ID id, FVECTOR *pos, int *zone_num );



/* 位置からグループ番号とゾーン番号を返す */

void	HZD_Pos2Zone( pos, g, z )

FVECTOR		*pos ;

int		*g, *z ;



	void HZX_Pos2Zone( FVECTOR *pos, int *group, int *zone );



/* キャラクタのグループ変更関数 */

void	HZD_CheckChangeGroup( ctrl, addr )

CONTROL		*ctrl ;

int		*addr ;



	void HZX_CheckChangeGroup( CONTROL *ctrl, int *addr );			// 要検討（->GM?)



// route.c



void		HZD_MakeRoute( grp, routes )

HZD_GRP		*grp ;

u_char		*routes ;



**	void HZX_MakeRoute( HZX_GRP *grp, u_char *routes );



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

/*

	SETUP

*/



// hzdd.c



void HZD_ResetSystem( void )

void HZD_ResetMemory( void )

void	HZD_Initialize( void ) 

void HZD_StartDaemon( void )



/* カレントのＨＺＤを取得 */

inline	HZD_HDL	*HZD_GetCurrentHzd( map_id )

/* 被検索グループリセット */

inline	void	HZD_ResetCurrentGroup( void )

/* 被検索グループに追加 */

inline	void	HZD_AddCurrentGroup( group )

int		group ;

/* 被検索グループから削除 */

inline	void	HZD_DeleteCurrentGroup( group )

int		group ;



// loadhzd.c



HZD_HDL		*HZD_GetHandler( id )

int		id ;



/* 当たりハンドラーの廃棄 */

void		HZD_FreeHandler( hdl )

HZD_HDL		*hdl ;



/* 初期化 */

void	HZD_InitHzdCache( void )



/* グループセッティング */

void		HZD_SetupGroup( hzd )

HZD_HDL		*hzd ;



/* ローダ */

void		HZD_LoadHzd( hzx, id )

HZD_DEF		*hzx ;

int		id ;



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

/*

	UTIL

*/



// vector.c



int		HZD_HazardReaction( vects, n_vects, range, react )

FVECTOR		*vects ;

int		n_vects ;

int		range ;

FVECTOR		*react ;

