/*

	libhzx.txt

	libhzxリファレンス



	2001/03/12	M.Sonoyama

	$Id: libhzx.txt,v 1.1.1.3 2002/11/19 11:41:42 Yoshizawa1 Exp $

*/



■libhzx概要

	libhzxは、当たり判定関連のライブラリです。

	大きく分類すると、以下の内容から構成されています。



		・近接壁判定

		・床・天井判定

		・移動直線上壁床判定

		・動的壁・床

		・トラップイベント処理

		・ゾーン追従処理



■libhzx定義

	libhzxでは、以下の事項が定義、制限されています。



		・hzxファイル内のグループ数は３１まで。

		・1グループ内のゾーン数は２５５まで。

		・１つのゾーンに隣接するゾーンは５つまで。

			リンクゾーン（グループ間を接続するゾーン）の場合は４つまで。

		・１つのリンクゾーンは１つのグループ接続しかもてない。

		・ある座標に重なっておけるトラップは１０まで。



■libhzx構造体

	system/libhzx/libhzx.h 及び、 include/fmt_hzx.h 内に定義。



■HZX_ADDRESS(ゾーンアドレス,以下アドレス)ってなに？



アドレスは、以下の構成になっています。

	31------ 16 15---------8 7----------0 (ビット番号)

	マップ番号  ゾーン番号Ｂ ゾーン番号Ａ



	マップは、それぞれのデータが一まとまりにしている単位です。それ

	につけた番号がマップ番号(０以上の値,必ず連番です)です。つまり、

	住所(アドレス)は、県(マップ番号)と市内番地(ゾーン番号)が必要っ

	てことです。他の県(マップ番号)でも市内番地(ゾーン番号)が同じ場

	合があります。



マップ番号とグループＩＤの違いは？



	グループＩＤは、ビット数値です。マップ番号の所に１を立てたもの

		です。(1<<マップ番号)したがって、グループＩＤに複数の

		ビットが立つことはありません。



	マップ番号は、数値です。VRSのグループ番号(シナリオ班に通じる言

		葉)から１を引いた数値と同じです。



ゾーン番号？？



	基本的には、ゾーン番号Ａ と ゾーン番号Ｂ は同じになります。つ

	まり、そのゾーン内にいることになります。



	ゾーン番号Ｂ が 0xffのときのアドレスは、ゾーンの間ではなく、最

	もゾーン番号Ａに近いことを示します。つまり、貼られているゾーン

	領域のなかで端にいることになります



	ゾーン番号Ａ が ゾーン番号Ｂ 異なると ゾーン番号Ａ と ゾーン番

	号Ｂ の間に存在することになります。





■じゃあ、New???( int name, int where )の where って何だ？

複数のマップに対応したビット数値です。



おさらいしておきますとこのwhereやHZXのグループID、DGのグループIDは、ビッ

ト数値です。この中で、複数のビットが立たないのが HZXのグループID のみ

です。



GCLのマップ番号        ＝ VRSのグループ番号

Actorマップ番号(where) ＝ 1<< (VRSのグループ番号)  複数可

DGのグループID         ＝ 1<< (VRSのグループ番号)  複数可

HZXのグループID        ＝ 1<< (VRSのグループ番号) 



■ハザード検出タイプ

	#define HZX_CHK_F_FLOOR		0x01	/* 固定床チェック */

	#define HZX_CHK_D_FLOOR		0x02	/* 動的床チェック */

	#define HZX_CHK_F_SEGMENT	0x04	/* 固定壁チェック */

	#define HZX_CHK_D_SEGMENT	0x08	/* 動的壁チェック */

	#define	HZX_CHK_RECOIL_TYPE_ONLY	0x40	/* 跳弾属性のみチェック */

	#define	HZX_CHK_RECOIL_TYPE			0x80	/* 跳弾属性もチェック */

	#define	HZX_CHK_CYPHER				0x0100	/* サイファー当たりをチェック */



	#define HZX_CHK_ALL			(HZX_CHK_F_FLOOR|HZX_CHK_D_FLOOR| \

							  	 HZX_CHK_F_SEGMENT|HZX_CHK_D_SEGMENT)

	#define	HZX_CHK_SEGMENT		(HZX_CHK_F_SEGMENT|HZX_CHK_D_SEGMENT)

	#define	HZX_CHK_FLOOR		(HZX_CHK_F_FLOOR|HZX_CHK_D_FLOOR)



■壁・床属性



	１）壁属性

	#define HZX_SEG_NO_PLAYER     0x0010	/* プレイヤーの当たりチェックをしない */

	#define HZX_SEG_NO_ENEMY      0x0020	/* 敵兵の当たりチェックをしない */

	#define HZX_SEG_NO_BULLET     0x0040	/* ショットの当たりをチェックしない */

	#define HZX_SEG_NO_MISSILE    0x0080	/* ミサイル系の当たり判定をしない */

	#define HZX_SEG_NO_C4         0x0100	/* C4爆弾がセットできない */

	#define HZX_SEG_NO_RECOIL     0x0200	/* ショットが跳弾しない */

	#define HZX_SEG_NO_HARITSUKI  0x0400	/* 張り付かない */

	#define HZX_SEG_NO_DISP_RADAR 0x0800	/* レーダーに写らない */

	#define HZX_SEG_NO_BULLETHOLE 0x1000	/* 弾痕つかない */

	#define HZX_SEG_NO_SPRAY      0x2000	/* スプレーつかない */

	#define	HZX_SEG_NO_ENEMY_EYES 0x00010000	/* 敵兵視線通り抜ける */

	#define	HZX_SEG_NO_KNOCK_SE	  0x00020000	/* ノック音しない */

	#define	HZX_SEG_CYPHER 		  0x00040000	/* サイファー専用 */

	#define HZX_SEG_RECOIL_TYPE   0x0004	/* 跳弾専用壁 */

	#define	HZX_SEG_SKIP	      0x0008	/* チェックをしない（動的壁専用） */

	#define	HZX_SEG_NO_PEEPINTRPT 0x00100000	/* 覗き込みの邪魔にならない */

	#define	HZX_SEG_DYNAMIC	      0x01000000	/* 動的壁 */

	

	２）床属性

	#define HZX_FLOOR_NO_PLAYER           	0x0010	/* プレイヤーの当たりチェックをしない */

	#define HZX_FLOOR_NO_ENEMY            	0x0020	/* 敵兵の当たりチェックをしない */

	#define HZX_FLOOR_NO_BULLET           	0x0040	/* ショットの当たりをチェックしない */

	#define HZX_FLOOR_NO_MISSILE          	0x0080	/* ミサイル系の当たり判定をしない */

	#define HZX_FLOOR_NO_C4              	0x0100	/* C4爆弾がセットできない */

	#define HZX_FLOOR_NO_RECOIL           	0x0200	/* ショットが跳弾しない */

	#define HZX_FLOOR_NO_CLAYMORE     		0x0400	/* クレイモアがセットできない */

	#define HZX_FLOOR_NO_BLOOD            	0x0800	/* 血痕つかない */

	#define HZX_FLOOR_NO_BULLETHOLE  		0x1000	/* 弾痕つかない */

	#define HZX_FLOOR_NO_SPRAY            	0x2000	/* スプレーつかない */

	#define HZX_FLOOR_IK 					0x4000	/* インバース・キネマティクスを適用する */

	#define HZX_FLOOR_STEP               	0x8000	/* ここの床は階段である */

	#define	HZX_FLOOR_NO_ENEMY_EYES			0x00010000	/* 敵兵視線通りぬける */

	#define	HZX_FLOOR_NO_OBJECT				0x00020000	/* オブジェクトつかない（薬莢、マガジンなど） */

	#define	HZX_FLOOR_CYPHER 		  		0x00040000	/* サイファー専用 */

	#define	HZX_FLOOR_RECOIL_TYPE			0x0004	/* 跳弾専用 */

	#define	HZX_FLOOR_SKIP		        	0x0008	/* チェックをしない（動的床専用） */

	#define	HZX_FLOOR_DYNAMIC	        	0x01000000	/* 動的床 */



■libhzx関数リファレンス



	とりあえず良く使いそうなものだけ。



	----------------------------------------------------------------



	int		HZX_GetGroupNo( HZX_GROUP_ID hzx_id ) 



	引数	：	HZX_GROUP_ID	hzx_id			:	グループＩＤ



	HZX_GROUP_ID を 通し番号（０，１，２・・）に変換する。

	ＩＤで2グループ以上指定されているときはＡＳＳＥＲＴを起こす。



	----------------------------------------------------------------



	HZX_HDL		*HZX_GetCurrentHzx( void )



	カレントのHZX_HDLを取得



	----------------------------------------------------------------



	int			HZX_GetSeCode( int atr )



	引数	：	int	atr				:	ハザード属性



	ハザード属性から音声番号を返す。	



	----------------------------------------------------------------



	int			HZX_SeCode( int seNo )



	引数	：	int	seNo				:	音声番号



	音声番号を属性にセットする。



	----------------------------------------------------------------



	int			HZX_Address( int id, int zone1, int zone2 )



	引数	：	int	id					: HZX_GROUP_ID

				int zone1, zone2		: ゾーン番号



	アドレスに変換する。	



	----------------------------------------------------------------



	int			HZX_AddressNo( int no, int zone1, int zone2 )



	引数	：	int	no					: グループ通し番号（HZX_GROUP_IDではない！）

				int zone1, zone2		: ゾーン番号



	アドレスに変換する。	



	----------------------------------------------------------------



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

								  	 int chk_flag, int seg_flag, int r_sphere ) ;



	返り血	：	検出壁数（０～２）

	引数	：	HZX_GROUP_ID	id			: 検索ＩＤ（０のときは全検索）

				FVECTOR			*from		: 検索位置

				int				sphere		: 検索半径

				int				chk_flag	: ハザード検出タイプ

				int				seg_flag	: 検索しない壁属性

				int				r_sphere	: 反発距離



	from の位置から半径sphereの円内の壁を検出する。最大2枚まで。

	chk_flag は上述の検出タイプ。

	seg_flag で指定された属性を持つ壁は検索対象にならない。	

	r_sphere は、検出された壁からr_sphereだけ離れた位置にいくべき

	ベクトルの計算に必要。



	以下の関数は、この関数の実行結果の取得に用いる。

	結果はスクラッチパッド上においてあるので、結果が欲しい場合は

	直後に取得しておくこと。



		----------------------------------------------------



		void	HZX_GetNearHazard( HZX_HZD *segs, int *atrs )



		segs[ 0 ], atr[ 0 ] に最近検出壁データが、

		segs[ 1 ], atr[ 1 ] に2番目に近い検出壁データが入る。



		----------------------------------------------------



		void	HZX_GetNearVector( FVECTOR *vect_ptr )



		検出壁へのベクトルを取得。

		vect_ptr[ 0 ] に最近検出壁へのベクトル、

		vect_ptr[ 1 ] に２番目へのベクトルが入る。



		----------------------------------------------------



		void	HZX_GetReactVector( FVECTOR *react )



		検出壁からr_sphereだけ離れるためのベクトルを取得する。



	----------------------------------------------------------------



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

			    					   int chk_flag, int seg_flag, int flr_flag ) ;



	返り血	：	0:ハザードなし 1:ハザードあり

	引数	：	HZX_GROUP_ID	id			: 検索ＩＤ（０のときは全検索）

				FVECTOR			*from		: 検索開始位置

				FVECTOR			*to			: 検索終了位置

				int				chk_flag	: ハザード検出タイプ

				int				seg_flag	: 検索しない壁属性

				int				flr_flag	: 検索しない床属性



	from 位置からto位置の間の壁＆床を検出する。

	chk_flag は上述の検出タイプ。

	seg_flag で指定された属性を持つ壁は検索対象にならない。	

	flr_flag で指定された属性を持つ床は検索対象にならない。	



	以下の関数は、この関数の実行結果の取得に用いる。

	結果はスクラッチパッド上においてあるので、結果が欲しい場合は

	直後に取得しておくこと。



		----------------------------------------------------



		void	HZX_GetOnlineHazard( HZX_HZD *seg, int *atr )



		seg に最近検出ハザードデータが、

		atr に検出ハザード属性が入る。

		

		検出されたのが壁か床かは、seg->type が、HZX_TYPE_SEGMENTかHZX_TYPE_FLOORかで

		判定することが出来る。



		----------------------------------------------------



		void	HZX_GetOnlineVector( FVECTOR *vect_ptr )



		検出ハザードへのベクトルを取得。



		----------------------------------------------------



		void	HZX_GetOnlinePoint( FVECTOR *ptp_ptr )



		検出ハザードと検索直線の交点を取得。



	----------------------------------------------------------------



	int 		HZX_LevelHazardCheck( HZX_GROUP_ID id, FVECTOR *from, 

			    				      int chk_flag, int flr_flag ) ;



	返り血	：	0:床天井なし 1:床あり 2:天井あり 3:床天井あり

	引数	：	HZX_GROUP_ID	id			: 検索ＩＤ（０のときは全検索）

				FVECTOR			*from		: 検索位置

				int				chk_flag	: ハザード検出タイプ

				int				flr_flag	: 検索しない床属性



	from 位置の床と天井を検出する。

	chk_flag は上述の検出タイプ。

	flr_flag で指定された属性を持つ床は検索対象にならない。	



	以下の関数は、この関数の実行結果の取得に用いる。

	結果はスクラッチパッド上においてあるので、結果が欲しい場合は

	直後に取得しておくこと。



		----------------------------------------------------



		void	HZX_GetLevelHazard( HZX_HZD *flrs, int *atrs )



		flrs[ 0 ], atrs[ 0 ] に床のデータが、

		flrs[ 1 ], atrs[ 1 ] に天井のデータが入る。

		

		----------------------------------------------------



		void	HZX_GetLevelHeight( FVECTOR *lvl_ptr )



		lvl_ptr[ 0 ] に床の高さが、

		lvl_ptr[ 1 ] に天井の高さが入る。



	----------------------------------------------------------------