/*---------------------------------------------------------------------------
 *
 * ＢＧ ＣＨＥＣＫ
 *
 * $Id: m_collision_bg.h,v 1.1 2003/06/06 00:15:12 tong Exp $
 * Program:Hiromichi Miyake
 *
 *---------------------------------------------------------------------------*/
#if      !defined(__mCoBG_COLh) 
#define  __mCoBG_COLh
#if defined(LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
#ifdef _LANGUAGE_C_PLUS_PLUS
extern "C" {
#endif

#include "m_collision_bg_h.h"	/* 衝突用変数		*/
#include "m_types.h"         	/* 共通変数		*/
#include "m_actor_h.h"       	/* ACTOR変数		*/
#include "m_attribute_bg.h"   	/* UNITのBG属性	*/


/*----------------------------------------------------------------------
 *
 * 円柱ＢＧ ＣＨＥＣＫのスイッチ
 *
 *----------------------------------------------------------------------*/
#define USE_COLUMN_BG_CHECK

/*----------------------------------------------------------------------
 *
 * 範囲ＣＨＥＣＫ
 *
 *----------------------------------------------------------------------*/
#define mCoBG_CheckRangeMin(i,min)\
(i < min ? min : i)			/* 最小値より小さければ最小値 */
#define mCoBG_CheckRangeMax(i,max)\
    (i > max ? max : i)			/* 最大値より大きければ最大値 */
#define mCoBG_CheckRange(i,min,max)\
    mCoBG_CheckRangeMax(mCoBG_CheckRangeMin(i,min), max)
    
/*----------------------------------------------------------------------
 *
 * ＢＧＣＨＥＣＫの各型
 *
 *----------------------------------------------------------------------*/
/* 衝突ＦＬＡＧ */
typedef unint mCoBG_clInf_t;
/* 中心保存値 */
typedef unchar mCoBG_kpH_t;

/*----------------------------------------------------------------------
 *
 * ムーブＢＧＣＨＥＣＫヘッダ 
 *
 *----------------------------------------------------------------------*/
#include "m_collision_bg_move.h"

/*----------------------------------------------------------------------
 *
 * 円柱ＢＧＣＨＥＣＫヘッダ
 *
 *----------------------------------------------------------------------*/
#include "m_collision_bg_column.h"

/*----------------------------------------------------------------------
 *
 * 各定数
 *
 *----------------------------------------------------------------------*/
/* 接触判定距離（どれだけの距離を接触とみなすか）*/
#define mCoBG_CONTACT_DIST	(2.7F)
/* 壁補正が起こったときにどれだけ壁から離すか */
#define mCoBG_SEPARATE_DIST 	(0.00001F)
/* 衝突データから中心のＯＦＦＳＥＴ値を得る */
#define mCoBG_CR_OFFSET(ClDt) 	((ClDt).center_offset)

/*----------------------------------------------------------------------
 *
 * 座標軸の定義
 *
 *----------------------------------------------------------------------*/
enum _xz {
    XXX,
    ZZZ,
    XZ,
    SLATE = 2
};

/*----------------------------------------------------------------------
 *
 * 衝突データ格納ＵＮＩＴの定義
 *
 *----------------------------------------------------------------------*/
enum _col_point {
    mCoBG_UP_PT,         /* 上ポイント		*/
    mCoBG_LT_PT,         /* 左ポイント		*/
    mCoBG_DN_PT,         /* 下ポイント		*/
    mCoBG_RT_PT,         /* 右ポイント		*/
    mCoBG_CR_PT,         /* 中心ポイント	*/
    
    mCoBG_POINT4 = 4,    /* ４点 		*/
    mCoBG_POINT5 = 5     /* ５点 		*/
};

/*----------------------------------------------------------------------
 *
 * ＢＧＣＨＥＣＫの結果ＦＬＡＧ構造体
 *
 *
 * onGround	地面に足がついているか
 *
 * hitWall	壁に当っているか
 *		４方向のうちどの辺が当っているか知りたいときは
 *		このFLAGを各部分のマクロでbitCheckする
 *
 * goJump	ACTORがJumpするべきか
 *		前Frameで地面に足がついていて
 *		現Frame地面に足がついていないならJump
 *		FLAGが立ちます
 *		注意としてはこのFLAGが立ったときにはすでに
 *		落下体制にあるということです
 *
 * UtAttribute	真下の属性
 *
 * wallCount	現FRAME衝突している壁の数（2までしか記憶しません）
 *
 * atrHitWall	hitWall の属性版
 *
 * inWater	posが水のなかにあるか
 *
 *----------------------------------------------------------------------*/
/*--------------------------------------------------------------
 *
 * マクロで参照しましょう
 *
 *--------------------------------------------------------------*/
typedef struct __clflag {
    unint onGround:1;           /* 地面についているかＦＬＡＧ	*/
    unint atrHitWall:5;         /* 属性壁に衝突したかどうか	*/
    unint hitWall:5;            /* 壁との衝突ＦＬＡＧ		*/
    unint wallCount:3;          /* 衝突した壁の数		*/
    unint goJump:1;             /* ＪＵＭＰ ＦＬＡＧ		*/
    mCoBG_clInf_t UtAttribute:6;/* ACTOR真下のUNIT属性		*/
    unint on_move_bg:1;		/* moveBG地面についているか	*/
    unint inWater:1;		/* 水につかっているか		*/
    unint old_frame_stop:1;	/* 前ＦＲＡＭＥ静止していた	*/
    /* 室内ゴキブリ用に追加 */
    unint pinch:1;		/* 対の法線にはさまれている	*/
    unint pinch2:1;		/* はさみにはさまれている	*/
    unint wall2_front:1;	/* 特別前方フラグ		*/
    unint dummy:1;		/* ダミー			*/
} mCoBG_clResult_c;

/*----------------------------------------------------------------------
 *
 * ＢＧＣＨＥＣＫ構造体
 *
 * clUtID		補正前の真下の衝突データ
 *
 * clFlag		いろいろな結果のFLAGの集合
 *
 * wallTop		衝突していたら壁の最高値が格納される
 *
 * wallBottom		衝突していたら壁の最低値が格納される
 *
 * groundY		補正後の真下の地面の高さ
 *
 * wallAngleY		衝突した壁の法線角度(short)
 *
 * wallAngleY2		衝突した壁の法線角度(short)
 *
 */

/*-----------------------------------------------------------------------
 *
 * 衝突した壁の種類
 *
 * 通常の壁
 * 属性の壁
 *
 *-----------------------------------------------------------------------*/
enum __wall_type__ {
    mCoBG_NML_WALL,		/* 通常の壁		*/
    mCoBG_ATR_WALL,		/* 属性による壁	*/
    mCoBG_DMY_WALL		/* ダミー		*/
};

/*-----------------------------------------------------------------------
 *
 * 衝突した壁データ
 *
 *-----------------------------------------------------------------------*/
typedef struct __wall_angle_data__ {
    short	angle;		/* 壁の法線角度	*/
    short	wall_type;	/* 壁の種類	*/
} mCoBG_wallAngle_c;

/*----------------------------------------------------------------------
 *
 * マクロで参照しましょう
 *
 *----------------------------------------------------------------------*/
#define mCoBG_USE_FRONT_HIT_WALL_ANGLE	(1)
struct _bci_class{
    /* ＢＧＣＨＥＣＫから補正を受ける以前のデータ
     * （使用者がいないため処理軽減のため値は入りません）*/
    mCoBG_ClData_c   	*clUtID[mCoBG_POINT5];
    
    mCoBG_clResult_c 	clFlag;     	/* ＢＧ衝突結果のＦＬＡＧ	*/
    
    float            	wallTop;    	/* 衝突した壁の最高値		*/
    float            	wallBottom; 	/* 衝突した壁の最小値		*/
    float            	groundY;    	/* ＡＣＴＯＲの真下の床の高さ	*/
    mCoBG_wallAngle_c   wallAngleY[2]; 	/* 壁との角度Ｙ			*/
#if mCoBG_USE_FRONT_HIT_WALL_ANGLE
    short		front_hit_wall_angle;/* 前方がぶつかっている壁角度 */
#endif
}; /* mCoBG_Chk_c */

/*=====================================================================
 *
 * ＢＧＣＨＥＣＫで得られる各情報の参照マクロ 
 *
 *=====================================================================*/
/*-----------------------------------------------------------------------
 *
 * ＢＧＣＨＥＣＫで得られる各結果情報の参照用マクロ
 *
 * ＡＣＴＯＲ構造体に格納されている情報を参照する
 * 参照はマクロで
 *
 *-----------------------------------------------------------------------*/
/*-------------------------------------------------------------------------
 *
 * 各点の衝突データ参照マクロ
 * pointに指定する識別子
 * 上  : mCoBG_UP_PT
 * 左  : mCoBG_LT_PT
 * 下  : mCoBG_DN_PT
 * 右  : mCoBG_RT_PT
 * 中心: mCoBG_CR_PT
 *
 *-------------------------------------------------------------------------*/
/*--------------------------------------*/
/* 誰も使っていないのでなくなりました	*/
/* 2000.8.30 miyake			*/
/*--------------------------------------*/
#define mCoBG_POINT_INFO_GET_FLAG	(0)
/* ＡＣＴＯＲから */
#define mCoBG_GET_CLUTID(bgCheck,point) ((bgCheck).clUtID[point])
/* ＢＧＣＨＥＣＫから */
#define mCoBG_GET_CLUTID_p(bgCheck,point) ((bgCheck)->clUtID[point])
/* ＢＧＣＨＥＣＫのポインタから */
#define mCoBG_GET_CLUTID_a(actor,point)	((actor)->bgCheck.clUtID[point])

/*------------------------------------------------------------------------
 *
 * 足が接地している
 *
 *------------------------------------------------------------------------*/
/* ＡＣＴＯＲから*/
#define mCoBG_GET_ON_GROUND_a(actor)	((actor)->bgCheck.clFlag.onGround)
/* ＢＧＣＨＥＣＫから*/
#define mCoBG_GET_ON_GROUND(bgCheck)	((bgCheck).clFlag.onGround)
/* ＢＧＣＨＥＣＫのポインタから */
#define mCoBG_GET_ON_GROUND_p(bgCheck)	((bgCheck)->clFlag.onGround)

/*------------------------------------------------------------------------
 *
 * 現Frame足場がなくなった
 *
 *------------------------------------------------------------------------*/
/* ＡＣＴＯＲから*/
#define mCoBG_GET_GO_JUMP_a(actor)	((actor)->bgCheck.clFlag.goJump)
/* ＢＧＣＨＥＣＫから*/
#define mCoBG_GET_GO_JUMP(bgCheck)	((bgCheck).clFlag.goJump)
/* BgCheckのPointerから */
#define mCoBG_GET_GO_JUMP_p(bgCheck)	((bgCheck)->clFlag.goJump)

/*------------------------------------------------------------------------
 *
 * 足場が水に浸っている
 *
 *------------------------------------------------------------------------*/
/* ＡＣＴＯＲから*/
#define mCoBG_GET_IN_WATER_a(actor)	((actor)->bgCheck.clFlag.inWater)
/* ＢＧＣＨＥＣＫから*/
#define mCoBG_GET_IN_WATER(bgCheck)	((bgCheck).clFlag.inWater)
/* ＢＧＣＨＥＣＫのポインタから */
#define mCoBG_GET_IN_WATER_p(bgCheck)	((bgCheck)->clFlag.inWater)

/*------------------------------------------------------------------------
 *
 * 前のFrame XZでみて静止していた（ＢＧＣＨＥＣＫのシステムで使用）
 *
 *------------------------------------------------------------------------*/
#define mCoBG_OLD_FRAME_STOP(actor)	((actor)->bgCheck.clFlag.old_frame_stop)

/*------------------------------------------------------------------------
 *
 * 対の法線にはさまれている
 * (ＢＧに両側からはさまれいるか)
 *
 *------------------------------------------------------------------------*/
/* ＡＣＴＯＲから*/
#define mCoBG_GET_PINCH_a(actor)	((actor)->bgCheck.clFlag.pinch)
/* ＢＧＣＨＥＣＫから*/
#define mCoBG_GET_PINCH(bgCheck)	((bgCheck).clFlag.pinch)
/* ＢＧＣＨＥＣＫのポインタから */
#define mCoBG_GET_PINCH_p(bgCheck)	((bgCheck)->clFlag.pinch)

/*------------------------------------------------------------------------
 *
 * はさみのようにはさまれている
 *
 *------------------------------------------------------------------------*/
/* ＡＣＴＯＲから*/
#define mCoBG_GET_PINCH2_a(actor)	((actor)->bgCheck.clFlag.pinch2)
/* ＢＧＣＨＥＣＫから*/
#define mCoBG_GET_PINCH2(bgCheck)	((bgCheck).clFlag.pinch2)
/* ＢＧＣＨＥＣＫのポインタから */
#define mCoBG_GET_PINCH2_p(bgCheck)	((bgCheck)->clFlag.pinch2)

/*------------------------------------------------------------------------
 *
 * 衝突部検知用マクロ
 *
 *------------------------------------------------------------------------*/
enum __hit_wall_infomation__ {
    mCoBG_HIT = (1<<0),  	/* 壁に衝突		*/
    mCoBG_FRONT = (1<<1),	/* 前方が壁に衝突	*/
    mCoBG_RIGHT = (1<<2),	/* 右側が壁に衝突	*/
    mCoBG_LEFT = (1<<3), 	/* 左側が壁に衝突	*/
    mCoBG_BACK = (1<<4), 	/* 後方が壁に衝突	*/

    mCoBG_HIT_WALL_COUNT = 5
};

/*------------------------------------------------------------------------
 *
 * 衝突壁データ
 *
 * (衝突した部位をしるための例)
 * ###壁に衝突している###
 * if (mCoBG_GET_HIT_WALL_FLAG_a(Actorx)) {
 *   ###前方が当っている###
 *   if (bitcheck(mCoBG_GET_HIT_WALL_FLAG_a(Actorx), mCoBG_FRONT)) {
 *        ........................
 *   }
 *   ###右側が当っている###
 *   if (bitcheck(mCoBG_GET_HIT_WALL_FLAG_a(Actorx), mCoBG_RIGHT)) {
 *        ........................
 *   }
 *   ###左側が当っている###
 *   if (bitcheck(mCoBG_GET_HIT_WALL_FLAG_a(Actorx), mCoBG_LEFT)) {
 *        ........................
 *   }
 *   ###後方が当っている###
 *   if (bitcheck(mCoBG_GET_HIT_WALL_FLAG_a(Actorx), mCoBG_BACK)) {
 *        ........................
 * }
 *
 *
 *------------------------------------------------------------------------*/
/* ＡＣＴＯＲから*/
#define mCoBG_GET_HIT_WALL_FLAG_a(actor)	((actor)->bgCheck.clFlag.hitWall)
/* ＢＧＣＨＥＣＫから*/
#define mCoBG_GET_HIT_WALL_FLAG(bgCheck)	((bgCheck).clFlag.hitWall)
/* ＢＧＣＨＥＣＫのポインタから */
#define mCoBG_GET_HIT_WALL_FLAG_p(bgCheck)	((bgCheck)->clFlag.hitWall)

/*------------------------------------------------------------------------
 *
 * 衝突属性壁データ
 *
 * (衝突した部位をしるための例:衝突壁データとほぼ同じ)
 *
 *------------------------------------------------------------------------*/
/* ＡＣＴＯＲから*/
#define mCoBG_GET_ATRHIT_WALL_FLAG_a(actor) ((actor)->bgCheck.clFlag.atrHitWall)
/* ＢＧＣＨＥＣＫから*/
#define mCoBG_GET_ATRHIT_WALL_FLAG(bgCheck) ((bgCheck).clFlag.atrHitWall)
/* ＢＧＣＨＥＣＫのポインタから */
#define mCoBG_GET_ATRHIT_WALL_FLAG_p(bgCheck) ((bgCheck)->clFlag.atrHitWall)

/*------------------------------------------------------------------------
 *
 * 前方当り気味フラグ
 *
 *------------------------------------------------------------------------*/
/* ＡＣＴＯＲから */
#define mCoBG_FRONT_HIT_A_LITTLE(actor) ((actor)->bgCheck.clFlag.wall2_front)

/*------------------------------------------------------------------------
 *
 * 衝突(接触)している壁の数を取得
 *
 *------------------------------------------------------------------------*/
/* ＡＣＴＯＲから*/
#define mCoBG_GET_COL_WALL_COUNT_a(actor) ((actor)->bgCheck.clFlag.wallCount)
/* ＢＧＣＨＥＣＫから*/
#define mCoBG_GET_COL_WALL_COUNT(bgCheck)   ((bgCheck).clFlag.wallCount)
/* ＢＧＣＨＥＣＫのポインタから */
#define mCoBG_GET_COL_WALL_COUNT_p(bgCheck) ((bgCheck)->clFlag.wallCount)

/*------------------------------------------------------------------------
 *
 * ACTORの真下の属性取得(格納値は m_attribute_bg.decl 参照)
 *
 *------------------------------------------------------------------------*/
/* ＡＣＴＯＲから*/
#define mCoBG_GET_UT_ATTRIBUTE_a(actor)	((actor)->bgCheck.clFlag.UtAttribute)
/* ＢＧＣＨＥＣＫから*/
#define mCoBG_GET_UT_ATTRIBUTE(bgCheck)   ((bgCheck).clFlag.UtAttribute)
/* ＢＧＣＨＥＣＫのポインタから */
#define mCoBG_GET_UT_ATTRIBUTE_p(bgCheck) ((bgCheck)->clFlag.UtAttribute)

/*------------------------------------------------------------------------
 *
 * 衝突した壁の上の高さ Ｗ座標
 *
 *------------------------------------------------------------------------*/
/* ＡＣＴＯＲから*/
#define mCoBG_GET_WALL_TOP_a(actor)	((actor)->bgCheck.wallTop)
/* ＢＧＣＨＥＣＫから*/
#define mCoBG_GET_WALL_TOP(bgCheck)    	((bgCheck).wallTop)
/* ＢＧＣＨＥＣＫのポインタから */
#define mCoBG_GET_WALL_TOP_p(bgCheck)  	((bgCheck)->wallTop)

/*------------------------------------------------------------------------
 *
 * 衝突した壁の下の高さ Ｗ座標
 *
 *------------------------------------------------------------------------*/
/* ＡＣＴＯＲから */
#define mCoBG_GET_WALL_BOTTOM_a(actor)	((actor)->bgCheck.wallBottom)
/* ＢＧＣＨＥＣＫから */
#define mCoBG_GET_WALL_BOTTOM(bgCheck)    ((bgCheck).wallBottom)
/* ＢＧＣＨＥＣＫのポインタから  */
#define mCoBG_GET_WALL_BOTTOM_p(bgCheck)  ((bgCheck)->wallBottom)

/*------------------------------------------------------------------------
 *
 * ＡＣＴＯＲ真下の地面の高さ
 *
 *------------------------------------------------------------------------*/
/* ＡＣＴＯＲから*/
#define mCoBG_GET_GROUNDY_a(actor)	((actor)->bgCheck.groundY)
/* ＢＧＣＨＥＣＫから*/
#define mCoBG_GET_GROUNDY(bgCheck)   	 ((bgCheck).groundY)
/* ＢＧＣＨＥＣＫのポインタから */
#define mCoBG_GET_GROUNDY_p(bgCheck)  	((bgCheck)->groundY)

/*------------------------------------------------------------------------
 *
 * 衝突している壁の数 タイプの取得
 *
 * (使用例)
 *
 * ###壁に衝突している###
 * if (mCoBG_GET_HIT_WALL_FLAG_a(Actorx)) {
 *	int   wall_count = (int)mCoBG_GET_COL_WALL_COUNT_a(Actorx);
 *	###衝突数が0でない###
 *	if (wall_count) {
 *	   int  i;
 *         for (i=0; i<wall_count; i++) {
 *		###通常タイプの壁である###
 *              if (mCoBG_GET_WALL_TYPE_a(Actorx, i) == mCoBG_NML_WALL) {
 *		    short wall_angle = mCoBG_GET_WALL_ANGLE_a(Actorx, i);
 *              .....................       
 *         }
 *    }
 * }
 *
 *------------------------------------------------------------------------*/
/* ＡＣＴＯＲから */
#define mCoBG_GET_WALL_ANGLE_a(actor,n)	((actor)->bgCheck.wallAngleY[n].angle)
#define mCoBG_GET_WALL_TYPE_a(actor,n)	((actor)->bgCheck.wallAngleY[n].wall_type)
/* ＢＧＣＨＥＣＫから*/
#define mCoBG_GET_WALL_ANGLEY(bgCheck,n)  ((bgCheck).wallAngleY[n].angle)
#define mCoBG_GET_WALL_TYPE(bgcheck,n)	  ((bgCheck).wallAngleY[n].wall_type)
/* ＢＧＣＨＥＣＫのポインタから  */
#define mCoBG_GET_WALL_ANGLEY_p(bgCheck,n) ((bgCheck)->wallAngleY[n].angle)
#define mCoBG_GET_WALL_TYPE_p(bgcheck,n)  ((bgCheck)->wallAngleY[n].wall_type)

/*----------------------------------------------------------------------
 *
 * ＡＣＴＯＲ前方が壁に衝突しているときその角度を取得
 * (特別につけた機能なので壁 属性壁の区別, 壁の高さなどは分かりません)
 *
 *----------------------------------------------------------------------*/
#if mCoBG_USE_FRONT_HIT_WALL_ANGLE
#define mCoBG_FRONT_HIT_WALL_ANGLE_a(actor) \
((actor)->bgCheck.front_hit_wall_angle)
#endif

/*----------------------------------------------------------------------
 *
 * 衝突データクラス
 *
 *----------------------------------------------------------------------*/
struct _bci_data {
    mCoBG_clInf_t col_shape:1;		/* 斜めかどうか			*/
    mCoBG_clInf_t center_offset:5;	/* 中心の基準値からのOFFSET	*/
    mCoBG_clInf_t leftU_offset:5; 	/* 左上の基準値からのOFFSET	*/
    mCoBG_clInf_t leftD_offset:5; 	/* 左下の基準値からのOFFSET	*/
    mCoBG_clInf_t rightD_offset:5;	/* 右下の基準値からのOFFSET	*/
    mCoBG_clInf_t rightU_offset:5;	/* 右上の基準値からのOFFSET	*/
    mCoBG_clInf_t UtAttribute:6;  	/* 属性 			*/
}; /* mCoBG_ClData_c */
union _bci_data_record {
    unint    	      bgCl_dt;
    mCoBG_ClData_c    bgClDt;
}; /* mCoBG_ClGp_ c*/

/*----------------------------------------------------------------------
 *
 * 衝突データのＯＦＦＳＥＴをＵＮＩＴで考えて何分割する
 *(衝突データが作り直しになるので絶対に触らないこと)
 *
 *----------------------------------------------------------------------*/
#define   mCoBG_UT_DEVIDE     (4)
#define   mCoBG_UT_DEVIDE_F   ((float)mCoBG_UT_DEVIDE)

/*------------------------------------------------------------------------
 *
 * 衝突データ １ＯＦＦＳＥＴ あたりの高さ
 *
 *----------------------------------------------------------------------*/
#define   mCoBG_HTF_OFFSET1   (mFI_UT_WIDTH_F / mCoBG_UT_DEVIDE_F)

/*----------------------------------------------------------------------
 *
 * ＵＮＩＴ情報の参照マクロ
 *（ＢＧＣＨＥＣＫで使用）
 *
 *----------------------------------------------------------------------*/
/*------------------------------------------------------------------------
 *
 * 衝突データから各ＯＦＦＳＥＴ値を取得 (float)
 *
 *(ブロックの基準値は考慮されていない（ちなみにBASE取得は mFI_UtNum2BaseHeight）
 *
 *----------------------------------------------------------------------*/
#define OFF1 mCoBG_HTF_OFFSET1
#define mCoBG_GETF_CR_OFFSETW(ClDt)  \
((float)(ClDt->center_offset) * (OFF1))
#define mCoBG_GETF_LU_OFFSETW(ClDt)  \
    ((float)(ClDt->leftU_offset) * (OFF1))
#define mCoBG_GETF_LD_OFFSETW(ClDt)  \
    ((float)(ClDt->leftD_offset) * (OFF1))
#define mCoBG_GETF_RD_OFFSETW(ClDt)  \
    ((float)(ClDt->rightD_offset) * (OFF1))
#define mCoBG_GETF_RU_OFFSETW(ClDt)  \
    ((float)(ClDt->rightU_offset) * (OFF1))

/*------------------------------------------------------------------------
 *
 * 衝突データからそのままに各ＯＦＦＳＥＴ値を取得
 *
 *----------------------------------------------------------------------*/
#define mCoBG_GET_CR_OFFSET(ClDt)	((ClDt)->center_offset)
#define mCoBG_GET_LU_OFFSET(ClDt)	((ClDt)->leftU_offset)
#define mCoBG_GET_LD_OFFSET(ClDt)	((ClDt)->leftD_offset)
#define mCoBG_GET_RD_OFFSET(ClDt)	((ClDt)->rightD_offset)
#define mCoBG_GET_RU_OFFSET(ClDt)	((ClDt)->rightU_offset)

/*------------------------------------------------------------------------
 *
 * 衝突データからＵＮIＴ属性を取得
 *
 *----------------------------------------------------------------------*/
#define mCoBG_GET_UNIT_ATTRIBUTE(ClDt) (ClDt->UtAttribute)

/*------------------------------------------------------------------------
 *
 * 衝突データから斜め壁かどうかを取得
 *
 *----------------------------------------------------------------------*/
#define mCoBG_GET_SLATING_FLAG(ClDt)	(ClDt->col_shape)
    
/*------------------------------------------------------------------------
 *
 * 壁の形状種類
 *
 *----------------------------------------------------------------------*/
enum _ground_ {
    mCoBG_NORMAL_GROUND,	/* 通常の地面Check */
    mCoBG_SLATING_GROUND,	/* 斜めの地面Check */
    
    mCoBG_GTOUND_UNIT_KIND
};

/*------------------------------------------------------------------------
 *
 * ＵＮＩＴの中心点の高さの取得
 *
 *----------------------------------------------------------------------*/
#define mCoBG_GET_CR_HEIGHT(x,z) \
((float)mCoBG_GET_CR_OFFSET(mFI_UtNum2UtColKeep(x,z)) \
 + mFI_UtNum2BaseHeight(x,z))
    
/*------------------------------------------------------------------------
 *
 * ＵＮＩＴの左上点の高さの取得
 *
 *----------------------------------------------------------------------*/
#define mCoBG_GET_LU_HEIGHT(x,z) \
    ((float)mCoBG_GET_LU_OFFSET(mFI_UtNum2UtColKeep(x,z)) \
     + mFI_UtNum2BaseHeight(x,z))
    
/*------------------------------------------------------------------------
 *
 * ＵＮＩＴの左下点の高さの取得
 *
 *----------------------------------------------------------------------*/
#define mCoBG_GET_LD_HEIGHT(x,z) \
    ((float)mCoBG_GET_LD_OFFSET(mFI_UtNum2UtColKeep(x,z)) \
     + mFI_UtNum2BaseHeight(x,z))
    
/*------------------------------------------------------------------------
 *
 * ＵＮＩＴの右下点の高さの取得
 *
 *----------------------------------------------------------------------*/
#define mCoBG_GET_RD_HEIGHT(x,z) \
    ((float)mCoBG_GET_RD_OFFSET(mFI_UtNum2UtColKeep(x,z)) \
     + mFI_UtNum2BaseHeight(x,z))
    
/*------------------------------------------------------------------------
 *
 * ＵＮＩＴの右上点の高さの取得
 *
 *----------------------------------------------------------------------*/
#define mCoBG_GET_RU_HEIGHT(x,z) \
    ((float)mCoBG_GET_RU_OFFSET(mFI_UtNum2UtColKeep(x,z)) \
     + mFI_UtNum2BaseHeight(x,z))
    
/*------------------------------------------------------------------------
 *
 * 衝突データからそのＵＮＩＴが平らであるから調べる
 * （衝突データを直接参照する機会のある人はどうぞ）
 *
 *----------------------------------------------------------------------*/
#define mCoBG_JudgeGroundBumpy(clUtID)               \
(mCoBG_GET_CR_OFFSET(clUtID)!=mCoBG_GET_LU_OFFSET(clUtID)|| \
 mCoBG_GET_CR_OFFSET(clUtID)!=mCoBG_GET_LD_OFFSET(clUtID)|| \
 mCoBG_GET_CR_OFFSET(clUtID)!=mCoBG_GET_RD_OFFSET(clUtID)|| \
 mCoBG_GET_CR_OFFSET(clUtID)!=mCoBG_GET_RU_OFFSET(clUtID))



/***********************************************************************
 *
 * BGCheck（機能識別）
 *
 ***********************************************************************/
/*----------------------------------------------------------------------
 *
 * 補正するか 補正しないか
 *
 *----------------------------------------------------------------------*/
enum _bgRev_type {
    mCoBG_REVERSE,
    mCoBG_NOREVERSE,
    mCoBG_REVERSE_TYPE
};

/*----------------------------------------------------------------------
 *
 * 属性ＣＨＥＣＫするか
 *（属性ＣＨＥＣＫしないと崖から落ちるよ）
 *
 *----------------------------------------------------------------------*/
enum _attr_check_ {
    mCoBG_NOATR_CHECK,
    mCoBG_ATR_CHECK,
    mCoBG_ATR_CHECK_TYPE
};

/*----------------------------------------------------------------------
 *
 * ＢＧＣＨＥＣＫの種類
 *
 *----------------------------------------------------------------------*/
enum __bg_check_kind__ {
    mCoBG_NORMAL_CHECK,
    mCoBG_POLITE_CHECK,	/* PLAYER用丁寧なCheck */
    mCoBG_CHECK_TYPE
};

/*----------------------------------------------------------------------
 *
 * ＢＧＣＨＥＣＫ
 *
 * ○通常のＢＧＣＨＥＣＫ
 *  （PLAYER）
 * 1.mCoBG_BgCheckReverseOnAttributeOn_Ply
 * 2.mCoBG_BgCheckReverseOnAttributeOff_Ply
 * 3.mCoBG_BgCheckReverseOffAttributeOn_Ply
 * 4.mCoBG_BgCheckReverseOffAttributeOff_Ply
 *  （NPC, 虫, 魚 etc..）
 * 1.mCoBG_BgCheckReverseOnAttributeOn
 * 2.mCoBG_BgCheckReverseOnAttributeOff
 * 3.mCoBG_BgCheckReverseOffAttributeOn
 * 4.mCoBG_BgCheckReverseOffAttributeOff
 *
 * ○床ＣＨＥＣＫ
 *(衝突半径は衝突データを得る範囲に使っている)
 * 1.mCoBG_GroundCheckAndReverse
 * 2.mCoBG_GroundCheckNoReverse
 *
 * ○特別なＢＧＣＨＥＣＫ
 * 1.mCoBG_UniqueWallCheck
 *	ACTORを現在のブロックから出られないようにする
 *
 * 2.mCoBG_BgCheckOnePoint
 *	突如円を発生させた時,補正を受けるか調べる
 *     (調査用なのでBGCheck側で補正はしない)
 *
 * 3.mCoBG_LineCheck
 *      始点と終点よりBGとの衝突を調べる
 *     (低速なので使用はSCENEで状況判断 (基本的にはPLAYERのTOOL用))
 *
 * 4.mCoBG_ScrollCheck
 *      スクロールが可能か調べる (障害があるか)
 *	可能ならＴＲＵＥ
 *
 *----------------------------------------------------------------------*/
extern  void
mCoBG_BgCheckControll(
    xyz_t 	*Revpos,       	/* 補正値（必要ないならNULL）	*/
    ACTOR 	*actor,        	/* ACTORPointer			*/
    float 	check_range,   	/* 衝突半径			*/
    float 	check_foot,    	/* SHAPEの基準から足元までの座標
				 *（通常は 0.0F でよいでしょう）*/


    
    /* 以下の引数はマクロで隠されている */
    short	attribute_wall,	/* 属性Check処理をどうするか		*/
    short 	reverse_type,	/* 補正をするかどうか			*/
    short	check_type 	/* Checkをていねいにするかどうか	*/
    );


/* 現在使ってないのでいずれ消すマクロ */
#define mCoBG_POINT8  		(8)


/*---------------------------------------------------------------------
 *
 * ○補正をBGCheckにまかせる (ON)
 * ○段差をおりられない (ON)
 *
 *----------------------------------------------------------------------*/
/* PLAYER用 */
#define mCoBG_BgCheckReverseOnAttributeOn_Ply(revpos,\
					      actor,\
					      check_range,\
					      check_foot )\
(mCoBG_BgCheckControll(revpos,\
		       actor,\
		       check_range,\
		       check_foot,\
		       mCoBG_ATR_CHECK,\
		       mCoBG_REVERSE,\
		       mCoBG_POLITE_CHECK))
/* NPC */
#define mCoBG_BgCheckReverseOnAttributeOn(revpos,\
					  actor,\
					  check_range,\
					  check_foot )\
(mCoBG_BgCheckControll(revpos,\
		       actor,\
		       check_range,\
		       check_foot,\
		       mCoBG_ATR_CHECK,\
		       mCoBG_REVERSE,\
		       mCoBG_NORMAL_CHECK))
 
/*---------------------------------------------------------------------
 *
 * ○補正BGをBGCheckにまかせる (ON)
 * ○段差をおりられる (OFF)
 *
 *----------------------------------------------------------------------*/
/* PLAYER */
#define mCoBG_BgCheckReverseOnAttributeOff_Ply(revpos,\
					      actor,\
					      check_range,\
					      check_foot )\
(mCoBG_BgCheckControll(revpos,\
		       actor,\
		       check_range,\
		       check_foot,\
		       mCoBG_NOATR_CHECK,\
		       mCoBG_REVERSE,\
		       mCoBG_POLITE_CHECK))
/* NPC */
#define mCoBG_BgCheckReverseOnAttributeOff(revpos,\
					   actor,\
					   check_range,\
					   check_foot )\
(mCoBG_BgCheckControll(revpos,\
		       actor,\
		       check_range,\
		       check_foot,\
		       mCoBG_NOATR_CHECK,\
		       mCoBG_REVERSE,\
		       mCoBG_NORMAL_CHECK))

/*---------------------------------------------------------------------
 *
 * ○補正を個人で行う (OFF)
 * ○崖からおりられない補正値が欲しい!! (ON)
 *
 *----------------------------------------------------------------------*/
/* PLAYER*/
#define mCoBG_BgCheckReverseOffAttributeOn_Ply(revpos,\
					       actor,\
					       check_range,\
					       check_foot )\
(mCoBG_BgCheckControll(revpos,\
		       actor,\
		       check_range,\
		       check_foot,\
		       mCoBG_ATR_CHECK,\
		       mCoBG_NOREVERSE,\
		       mCoBG_POLITE_CHECK))
/* NPC */
#define mCoBG_BgCheckReverseOffAttributeOn(revpos,\
					   actor,\
					   check_range,\
					   check_foot )\
(mCoBG_BgCheckControll(revpos,\
		       actor,\
		       check_range,\
		       check_foot,\
		       mCoBG_ATR_CHECK,\
		       mCoBG_NOREVERSE,\
		       mCoBG_NORMAL_CHECK))

/*---------------------------------------------------------------------
 *
 * ○補正は個人で行う(OFF)
 * ○崖からおりられる補正値が欲しい!!!(OFF)
 *
 *----------------------------------------------------------------------*/
/* PLAYER */
#define mCoBG_BgCheckReverseOffAttributeOff_Ply(revpos,\
						actor,\
						check_range,\
						check_foot )\
(mCoBG_BgCheckControll(revpos,\
		       actor,\
		       check_range,\
		       check_foot,\
		       mCoBG_NOATR_CHECK,\
		       mCoBG_NOREVERSE,\
		       mCoBG_POLITE_CHECK))
/* NPC */
#define mCoBG_BgCheckReverseOffAttributeOff(revpos,\
					    actor,\
					    check_range,\
					    check_foot )\
(mCoBG_BgCheckControll(revpos,\
		       actor,\
		       check_range,\
		       check_foot,\
		       mCoBG_NOATR_CHECK,\
		       mCoBG_NOREVERSE,\
		       mCoBG_NORMAL_CHECK))

/*---------------------------------------------------------------------
 *
 * 地面チェックのみを行う
 *
 *----------------------------------------------------------------------*/
extern void
mCoBG_GroundCheckOnly(
    xyz_t	*Revpos,
    ACTOR	*Actor,
    float       check_range,
    float	check_foot,
    
    short	reverse_type
    );
/* 補正する */
#define mCoBG_GroundCheckAndReverse(revpos,\
				    actor,\
				    check_range,\
				    check_foot) \
(mCoBG_GroundCheckOnly(revpos,\
		       actor,\
		       check_range,\
		       check_foot,\
		       mCoBG_REVERSE)) 
/* 補正しない */
#define mCoBG_GroundCheckNoReverse(revpos,\
				   actor,\
				   check_range,\
				   check_foot) \
(mCoBG_GroundCheckOnly(revpos,\
		       actor,\
		       check_range,\
		       check_foot,\
		       mCoBG_NOREVERSE))

/*------------------------------------------------------------------------
 *
 * 壁チェックのみを行う
 *
 *------------------------------------------------------------------------*/
extern void
mCoBG_WallCheckOnly(
    xyz_t 		*acRevpos,	/* 補正量		*/
    ACTOR 		*Actor,	 	/* ACTOR		*/
    float 		check_range,   	/* 衝突半径		*/
    float		check_foot,
    short 		reverse_type,	/* 補正ON/OFF		*/
    short		check_type 	/* CheckType		*/
    );
/* 補正する */				    
#define mCoBG_WallCheckAndReverse(revpos,\
				  actor,\
				  check_range,\
				  check_foot) \
(mCoBG_WallCheckOnly(revpos,\
		     actor,\
		     check_range,\
		     check_foot,\
		     mCoBG_REVERSE,\
		     mCoBG_NORMAL_CHECK))
/* 補正しない */						  
#define mCoBG_WallCheckNoReverse(revpos,\
				  actor,\
				  check_range,\
				  check_foot) \
(mCoBG_WallCheckOnly(revpos,\
		     actor,\
		     check_range,\
		     check_foot,\
		     mCoBG_NOREVERSE,\
		     mCoBG_NORMAL_CHECK))
						  
/*----------------------------------------------------------------------
 *
 * START ENDを指定してLINEを作成しそれがBGに当るかを調べる
 * 
 * 100グリッドくらいまでしか正確な計算をしません
 *(かなり低速なのでPLAYERの道具衝突判定用に)
 *
 * 返り値をbitcheckしてもらうと壁地面の当りを確認できます(真なら衝突)
 *(例)bitcheck(返り値, mCoBG_LINE_W_REV)	壁に当った!!!
 *
 *----------------------------------------------------------------------*/
enum __line_reverse_kind__ {
    mCoBG_LINE_W_REVERSE,		/* 壁による補正		*/
    mCoBG_LINE_G_REVERSE,		/* 地面による補正	*/
    mCoBG_LINE_S_REVERSE,		/* 海による補正		*/
    mCoBG_LINE_REVERSE_STATUS
};
#define mCoBG_LINE_W_REV	(1 << mCoBG_LINE_W_REVERSE)
#define mCoBG_LINE_G_REV	(1 << mCoBG_LINE_G_REVERSE)
#define mCoBG_LINE_S_REV	(1 << mCoBG_LINE_S_REVERSE)
extern int
mCoBG_LineCheck_RemoveFg(
    xyz_t	*revpos, 	/* 補正量		*/
    xyz_t	start_pos,	/* 直線START		*/
    xyz_t	end_pos,	/* 直線END		*/
    unshort	remove_start,	/* 除くFgStart		*/
    unshort	remove_end,	/* 除くFgEnd		*/
    int		check_category	/* どこをCheckするか	*/
    );
/* 通常のLineCheck */				    
#define mCoBG_LineCheck(revpos,start,end)\
mCoBG_LineCheck_RemoveFg(revpos,\
			 start,\
			 end,\
			 NULL_NO,\
			 NULL_NO,\
			 mCoBG_LINE_W_REV|mCoBG_LINE_G_REV)
/* 通常のLineCheck（海の貫通判定も行う）*/				    
#define mCoBG_LineCheckIncludeSea(revpos,start,end)\
mCoBG_LineCheck_RemoveFg(revpos,\
			 start,\
			 end,\
			 NULL_NO,\
			 NULL_NO,\
			 mCoBG_LINE_W_REV|mCoBG_LINE_G_REV|mCoBG_LINE_S_REV)
/* 壁のみLineCheck */
#define mCoBG_WallLineCheck(revpos,start,end)\
mCoBG_LineCheck_RemoveFg(revpos,\
			 start,\
			 end,\
			 NULL_NO,\
			 NULL_NO,\
			 mCoBG_LINE_W_REV)			    
/* 地面のみLineCheck */			    
#define mCoBG_GroundLineCheck(revpos,start,end)\
mCoBG_LineCheck_RemoveFg(revpos,\
			 start,\
			 end,\
			 NULL_NO,\
			 NULL_NO,\
			 mCoBG_LINE_G_REV)
/* LineCheck (切株は対象外) */			    
#define mCoBG_LineCheck_RemoveStump(revpos,start,end)\
mCoBG_LineCheck_RemoveFg(revpos,\
			 start,\
			 end,\
			 STUMP000,\
			 STUMP02,\
			 mCoBG_LINE_W_REV|mCoBG_LINE_G_REV)
/* 壁のみLineCheck (切株は対象外) */			    
#define mCoBG_WallLineCheck_RemoveStump(revpos,start,end)\
mCoBG_LineCheck_RemoveFg(revpos,\
			 start,\
			 end,\
			 STUMP000,\
			 STUMP02,\
			 mCoBG_LINE_W_REV)
/* 地面のみLineCheck (切株は対象外) */			    
#define mCoBG_GroundLineCheck_RemoveStump(revpos,start,end)\
mCoBG_LineCheck_RemoveFg(revpos,\
			 start,\
			 end,\
			 STUMP000,\
			 STUMP02,\
			 mCoBG_LINE_G_REV)

/* LineCheck (10コイン石は対象外) */			    
#define mCoBG_LineCheck_RemoveStone_tc(revpos,start,end)\
mCoBG_LineCheck_RemoveFg(revpos,\
			 start,\
			 end,\
			 STONE_TC_A,\
			 STONE_DMY,\
			 mCoBG_LINE_W_REV|mCoBG_LINE_G_REV)
/* 壁のみLineCheck (10コイン石は対象外) */			    
#define mCoBG_WallLineCheck_RemoveStone_tc(revpos,start,end)\
mCoBG_LineCheck_RemoveFg(revpos,\
			 start,\
			 end,\
			 STONE_TC_A,\
			 STONE_DMY,\
			 mCoBG_LINE_W_REV)
/* 地面のみLineCheck (10コイン石は対象外) */			    
#define mCoBG_GroundLineCheck_RemoveStone_tc(revpos,start,end)\
mCoBG_LineCheck_RemoveFg(revpos,\
			 start,\
			 end,\
			 STONE_TC_A,\
			 STONE_DMY,\
			 mCoBG_LINE_G_REV)

/* LineCheck (建設予定地看板は対象外) */			    
#define mCoBG_LineCheck_RemoveResv_dmy(revpos,start,end)\
mCoBG_LineCheck_RemoveFg(revpos,\
			 start,\
			 end,\
			 RESVDMY,\
			 RESVDMY,\
			 mCoBG_LINE_W_REV|mCoBG_LINE_G_REV)
/* 壁のみLineCheck (建設予定地看板は対象外) */			    
#define mCoBG_WallLineCheck_RemoveResv_dmy(revpos,start,end)\
mCoBG_LineCheck_RemoveFg(revpos,\
			 start,\
			 end,\
			 RESVDMY,\
			 RESVDMY,\
			 mCoBG_LINE_W_REV)
/* 地面のみLineCheck (建設予定地看板は対象外) */			    
#define mCoBG_GroundLineCheck_RemoveResv_dmy(revpos,start,end)\
mCoBG_LineCheck_RemoveFg(revpos,\
			 start,\
			 end,\
			 RESVDMY,\
			 RESVDMY,\
			 mCoBG_LINE_G_REV)
			    
/*----------------------------------------------------------------------
 *
 * 仮想ＢＧＣＥＨＣＫ
 *
 * 処理的には通常のBGCheckを通しているので処理重し
 *(今はMENUだけしか使ってはダメ)
 *
 * 自前で mCoBG_Chk_c の領域をとって渡してください
 *
 * reverse		補正量
 * bgCheck		Check結果書き込み領域
 * now_position		現在のposition
 * end_position		目的のPosition
 * shape_angle_sy	Shapeの角度Y
 * now_in_water		現在水の中?
 * now_on_ground	現在接地している?
 * attribute_wall	属性Checkする
 * reverse_type		補正するか
 * check_type		補正方法
 *
 *----------------------------------------------------------------------*/
extern void
mCoBG_VirtualBGCheck(
    xyz_t		*reverse,
    mCoBG_Chk_c		*bgCheck,
    const xyz_t		*now_positoin,
    const xyz_t		*end_position,
    short		shape_angle_sy,
    short		now_in_water,
    short		now_on_ground,
    float 		check_range,
    float 		check_foot,

    short		attribute_wall,
    short 		reverse_type,
    short		check_type
    );
/* ＡＣＴＯＲの仮想ＢＧＣＥＨＣＫ */
#define mCoBG_VirtualActorBGCheck(\
    Actor, reverser_p, bgCheck_result_p, aim_position_p, check_range, check_foot, atrcheck)\
(mCoBG_VirtualBGCheck(reverse_p,\
		      bgCheck_result_p,\
		      &(Actor->world.position),\
		      aim_position_p,\
		      Actor->shape.angle.sy,\
		      Actor->bgCheck.clFlag.inWater,\
		      Actor->bgCheck.clFlag.onGround,\
		      check_range,\
		      check_foot,\
		      atrcheck,\
		      mCoBG_NOREVERSE,\
		      mCoBG_NORMAL_CHECK))
		     
				 

/*----------------------------------------------------------------------
 *
 * ＡＣＴＯＲ独自の壁を専用のＢＧ ＣＨＥＣＫ
 *（一応帰り値で補正値は返るようになりました）
 *
 *----------------------------------------------------------------------*/
extern xyz_t
mCoBG_UniqueWallCheck(
    ACTOR 	*Actor,     	/* ACTOR		*/
    float 	check_range,	/* 衝突半径		*/
    float 	check_foot 	/* 足下までの座標Y	*/
    );

/*----------------------------------------------------------------------
 *
 * ＳＣＯＰＥからでられなくします
 *（スコープの基準点は真上からみて必ず左上で）
 *
 *----------------------------------------------------------------------*/
extern xyz_t
mCoBG_ScopeWallCheck(
    ACTOR	*Actor,
    const xyz_t	*scope_base_pos,
    float	scope_x,
    float	scope_z,
    float	check_range,
    float	check_foot
    );

/*----------------------------------------------------------------------
 *
 * 指定した場所にＡＣＴＯＲを出現させたときにどんな補正をうけるか調べる
 *（調査用なのでこちらで補正はしない）
 *
 *----------------------------------------------------------------------*/
extern void
mCoBG_BgCheckOnePoint(
    xyz_t 	*Revpos,    	/* 補正量		*/
    xyz_t 	wposf,      	/* 調べたい点		*/
    float 	check_range,	/* ACTORの衝突半径	*/
    float 	check_foot 	/* 足下までの距離	*/
    );

/*----------------------------------------------------------------------
 *
 * ScrollCheck
 * Scroll可能ならＴＲＵＥ
 *
 *----------------------------------------------------------------------*/
extern int
mCoBG_ScrollCheck(
    xyz_t	scroll_start,
    xyz_t	scroll_end,
    float	radius
    );

/*----------------------------------------------------------------------
 *
 *(地形の情報を調べる関数群)
 *
 * 純粋に地形の高さを求めたいときは足下までの相対座標を0.0Fとする
 *
 * 1.mCoBG_Wpos2BgHeight_AngleS
 *      正確な地形の高さ取得
 *	moveBG考慮あり
 *	円柱BG考慮あり
 *      地形の傾斜(いらないならNULL)
 *
 * 2.mCoBG_Wpos2ShadowBgHeight
 *      影の写り込む BGの高さを取得
 *      看板などの衝突データを無視してBGのデータを返す
 *	(用途:ACTTORのかげ)
 *
 * 4.mCoBG_Wpos2BgUtCenterHeight
 *      UNITの真ん中の高さを取得
 *	moveBG考慮なし
 *	円柱BG考慮あり
 *	(UNIT中心値をOFFSETから求めます)
 *	(用途:平らなところの地面の高さ検知)
 *
 * 5.mCoBG_Wpos2BgUtCenterHeight_KeepData
 *      UNITの 真ん中の高さ を取得
 *	moveBG考慮なし
 *	円柱BG考慮なし
 *	(UNIT中心値を保存値から求めます)
 *
 * 6.mCoBG_GetBgAngleS_FromWpos
 *      傾斜を取得
 *      X軸回りの回転角
 *      Z軸回りの回転角
 *      ACTORを傾斜に沿って傾けたいときはX Zの値の分回転
 *
 * 7.mCoBG_GetBgNorm_FromWpos
 *      指定した座標XZの床の法線ベクトル取得
 *      法線はfloatで返し 正規化はされていない
 *
 * 8.mCoBG_Wpos2BgAttribute
 *      指定したW座標の属性を取得
 *	地形の属性を得るときはかならずこの関数で
 *
 * 9.mCoBG_CheckPlace
 *      ものが置けるか調べる
 *
 * 10.mCoBG_CheckPlant
 *      植物が何段階まで成長可能か調べる
 *
 * 11.mCoBG_Wpos2CheckNpc
 *      NPCが再配置可能か調べる
 *
 * 12.mCoBG_UnitCheckNpc
 *      UNITにNPCが再配置可能か調べる
 *
 * 13.mCoBG_UtNum2BgAttr
 *	UNIT番号から属性を取得( CAMERA専用 )
 *
 * 14.mCoBG_CheckCliffAttr
 *	崖の可能性があるか	( CAMERA専用 )
 *
 * 15.mCoBG_Wpos2BgAttribute_Original
 *	オリジナル属性を取得( つり専用 )
 *
 * 16.mCoBG_Change2PoorAttr
 *	属性を木が育たないものに変更( FIELD生成専用 )
 *
 *
 *(衝突データ構造)
 *   UNITの各点を LU(左上) LD(左下) RD(右下) RU(右上) CR(中心)とする
 *   実際の衝突データも以下のような構造である
 *   LU━━━━━━━━RU 
 *   ┃		       ┃
 *   ┃		       ┃
 *   ┃		       ┃
 *   ┃	      CR       ┃
 *   ┃		       ┃
 *   ┃		       ┃
 *   ┃		       ┃
 *   LD━━━━━━━━RD
 *
 *   衝突データはUNITごとに上図のように５点のoffset値 (0〜31)
 *   1OFFSET を 10グリッド としそれにブロックの BASE値 を加算
 *   (1OFFSET 値は mCoBG_HTF_OFFSET1 で定義)
 *
 *(斜めの壁をもつUNITのデータ構造)
 *   ４━━━━━━━━４
 *   ┃		       ┃
 *   ┃		       ┃
 *   ┃		       ┃
 *   ┃	      ４       ┃
 *   ┃		       ┃
 *   ┃		       ┃
 *   ┃		       ┃
 *   ４━━━━━━━━３
 *   斜めの壁の衝突データは上記のように低い側のある1点を除きすべて同値にする
 *   col_shape(1bit)をONにすると左上が高く 右下の低い地形として扱われる
 *  (BG衝突データのコンバータの際は自動的に設定される
 *   ゲーム中に衝突データを書き換え斜め崖を作成するときはこのことを意識
 *   しなくてはいけません)
 *
 * ○衝突データはSCENEに突入した際CRの値だけ BACKUP がとられ
 *   それをここではDEFAULT値として扱う
 *
 *(衝突情報を書き換える関数たち)
 * 1.mCoBG_SetPlussOffset
 *	UNIT全体を ###DEFAULT値### から変化させる
 *	形状をずっと維持します
 *      属性を書き換える必要がない→属性値を mAtr_NO_ATTRIBUTE
 *
 * 2.mCoBG_SetAttribute
 *      属性値のみを書き換える
 *      (引数の属性値は m_attribute_bg.decl 参照)
 *
 * 3.mCoBG_SetPluss5PointOffset
 *      UNITの各点をDEFAULT値から書き換える
 *
 *      ## 1.すべてのOFFSETが0は当りを元にもどすときとする
 *	## (平らなものでないと処理は無視)
 *	## 2.平らでない地点を書き換え要求したときは無視する
 *	## (ERROR警告を出します)
 *
 *----------------------------------------------------------------------*/
/*----------------------------------------------------------------------
 *
 * ＢＧの高さを取得
 *
 * moveBG考慮あり
 * 円柱BG考慮あり
 * 地面の角度もshortで返す
 * (必要のない情報にはNULL)
 *
 *----------------------------------------------------------------------*/
extern float
mCoBG_GetBgY_AngleS_FromWpos(
    s_xyz 	*ground_angle, 	/* 地面の角度		*/
    xyz_t 	pos,      	/* W座標		*/
    float 	check_foot 	/* 足下までの座標Y	*/
    );
/* CheckFootが0のVersion */
#define mCoBG_Wpos2BgHeight_AngleS(angle,wposf)\
mCoBG_GetBgY_AngleS_FromWpos(angle,wposf,0.0F)

/*----------------------------------------------------------------------
 *
 * 影をつけるＢＧの高さ取得 
 *
 * 地面の角度もshortで返す(必要のない情報には NULL)
 * 書き換えれているUNITに関しては保存値の高さを返す(角度は0)
 *
 *----------------------------------------------------------------------*/
extern float
mCoBG_GetShadowBgY_AngleS_FromWpos(
    s_xyz 	*ground_angle, 	/* 地面の角度		*/
    xyz_t 	pos,      	/* W座標		*/
    float 	check_foot 	/* 足下までの座標Y	*/
    );
/* CheckFootが0のVersion */
#define mCoBG_Wpos2ShadowBgHeight(wposf)\
mCoBG_GetShadowBgY_AngleS_FromWpos(NULL,wposf,0.0F)

/*----------------------------------------------------------------------
 *
 * UNITの真ん中の高さ取得
 *
 * moveBG考慮なし
 * 円柱BG考慮なし
 * 現在の衝突データから求めます
 *(例)
 * 家が発生して衝突データが書き変わっていたら家を考慮にいれる
 *
 *----------------------------------------------------------------------*/
extern float
mCoBG_GetBgY_OnlyCenter_FromWpos(
    xyz_t 	wposf,      	/* W座標		*/
    float 	check_foot 	/* 足下までの座標Y	*/
    );
/* CheckFootが0のVersion */
#define mCoBG_Wpos2BgUtCenterHeight(pos)\
mCoBG_GetBgY_OnlyCenter_FromWpos(pos, 0.0F)

/*------------------------------------------------------------------------
 *
 * UNIT中心の高さを返す(円柱ＢＧ考慮)
 *
 * moveBG考慮なし
 * 円柱BG考慮あり
 * 円柱Checkより追加(2000 7/18)
 *
 *------------------------------------------------------------------------*/
extern float
mCoBG_Wpos2BgUtCenterHeight_AddColumn(
    xyz_t	pos
    );
    
/*----------------------------------------------------------------------
 *
 * UNITの真ん中の高さ取得
 *
 * moveBG考慮なし
 * 円柱BG考慮なし
 * 衝突データの中心のDEFAULT値から求めます
 *(例)
 * 家が発生して衝突データが書き変わっていても家は考慮に入らない
 *
 *----------------------------------------------------------------------*/
extern float
mCoBG_GetBgY_OnlyCenter_FromWpos2(
    xyz_t 	pos,      	/* W座標		*/
    float 	check_foot 	/* 足下までの座標Y	*/
    );
/* CheckFootが0のVersion */
#define mCoBG_Wpos2BgUtCenterHeight_KeepData(pos)\
mCoBG_GetBgY_OnlyCenter_FromWpos2(pos, 0.0F)

/*----------------------------------------------------------------------
 *
 * UNITの属性の探索
 *
 *----------------------------------------------------------------------*/
extern unint
mCoBG_Wpos2Attribute(
    xyz_t	pos, 		/* W座標		*/
    char	*forbid_flag	/* 侵入禁止属性(NULLで)	*/
    );
/* CheckFootが0のVersion */
#define mCoBG_Wpos2BgAttribute(wposf)\
mCoBG_Wpos2Attribute(wposf,NULL)

/*----------------------------------------------------------------------
 *
 * ものが置けるかＣＨＥＣＫ
 * ものが置ければＴＲＵＥ
 *
 *----------------------------------------------------------------------*/
/* 座標から */
extern int
mCoBG_CheckPlace(
    xyz_t	pos
    );
/* ユニット番号から */
extern int
mCoBG_UtCheckPlace(
    int	ux,
    int uz
    );
/*----------------------------------------------------------------------
 *
 * 植物の成長可能段階取得
 *
 * もし植物が植えられないならー１を返す
 * 植物が植えられるときは到達可能レベルを返す
 * レベル１....0
 * レベル２....1
 * レベル３....2
 * レベル４....3
 * レベル５....4
 *
 *----------------------------------------------------------------------*/
extern int
mCoBG_CheckPlant(
    xyz_t	pos
    );

/*------------------------------------------------------------------------
 *
 * 衝突データから植物の成長可能段階取得
 * 植えられないならー１を返す
 *
 * 2000.10.19 NewVersion
 *
 *------------------------------------------------------------------------*/
extern int
mCoBG_Attribute2CheckPlant(
    unint	org_attr,
    const xyz_t	*pos
    );

/*----------------------------------------------------------------------
 *
 * NPC配置できるかCheck
 * 配置できるならTRUE
 *
 *----------------------------------------------------------------------*/
extern int
mCoBG_Wpos2CheckNpc(
    xyz_t	pos
    );

/*----------------------------------------------------------------------
 *
 * NPC配置できるかCheck
 * 配置できるならTRUE
 *
 *----------------------------------------------------------------------*/
extern int
mCoBG_Unit2CheckNpc(
    int		unit_x,
    int		unit_z
    );

/*----------------------------------------------------------------------
 *
 * 木が生えないまたは育たない属性ならTRUE
 *
 *----------------------------------------------------------------------*/
extern int
mCoBG_Attr2CheckPoorGround(
    unint	bg_attribute
    );

/*----------------------------------------------------------------------
 *
 * 属性からNPCが配置可能か調べる
 *
 *----------------------------------------------------------------------*/
extern int
mCoBG_Attr2CheckPlaceNpc(
    unint	bg_attribute
    );

#if DEBUG
/*------------------------------------------------------------------------
 *
 * 属性の名前表示
 *
 *------------------------------------------------------------------------*/
extern void
mCoBG_PrintBgAttrName_File(
    unint	bg_attribute,
    char	*file,
    int		line
    );
/* これ使って */
#define mCoBG_PrintBgAttrName(attr)\
mCoBG_PrintBgAttrName_File(attr, __FILE__, __LINE__)
#endif

/*----------------------------------------------------------------------
 *
 * UNITの単位で衝突データを書き換え
 *
 * 必ず ###DEFAULT値###から変化させる
 * 形状は維持されます
 *
 * change_offを8にするとDEFAULT形状から80グリッドBGをあげます
 * change_offを0にするとDEFAULT形状に戻ります
 *
 * この関数で衝突データを書き換えた場合
 * この関数でないともとに戻る保証がないので中止
 *(属性を書き換えるときは教えてください)
 *
 *----------------------------------------------------------------------*/
/* 属性書き換えなし */
#define mAtr_NO_ATTRIBUTE	(100)
extern void
mCoBG_SetPlussOffset(
    xyz_t     	pos,    	/* W座標		*/
    short     	change_off,	/* DEFAULTからの変化	*/
    short     	bg_attribute	/* SET属性		*/
    );
extern void
mCoBG_Ut2SetPlussOffset(
    int		ux,
    int		uz,
    short	change_off,	/* 変化値	*/
    short	unit_attribute	/* SET属性	*/
    );	

/*=====================================================================
 *
 * 衝突データ書き換え関数
 *
 *=====================================================================*/
/* BG衝突データ書き換え用の型  */
typedef struct __bgRewriteData {
    unchar   	unit_attribute;	/* 変更する属性値	*/
    signed char cr_offset;     	/* 中心変化値		*/
    signed char	lu_offset;     	/* 左上変化値		*/
    signed char	ld_offset;     	/* 左下変化値		*/
    signed char	rd_offset;     	/* 右下変化値		*/
    signed char	ru_offset;     	/* 右上変化値		*/
    signed char	slate_switch;	/* 斜めFLAG		*/
} mCoBG_OffsetTable_c;

/*----------------------------------------------------------------------
 *
 * DEFAULT値から5点をOFFSET分書き換える
 *
 * この関数はBGの形状を覚えていられないので平らな地形に関してのみ用いること
 *(1 OFFSETは10グリッドに相当)
 *
 *----------------------------------------------------------------------*/
extern void
mCoBG_SetPluss5PointOffset_file(
    xyz_t     			pos,  
    mCoBG_OffsetTable_c 	offset_data,
    char			*file,
    int				line
    );
#define mCoBG_SetPluss5PointOffset(pos,offset_data)\
mCoBG_SetPluss5PointOffset_file(pos,offset_data,__FILE__,__LINE__)
extern void
mCoBG_Ut2SetPluss5PointOffset_file(
    int			ux,
    int			uz,
    mCoBG_OffsetTable_c offset_data,
    char		*file,
    int			line
    );
#define mCoBG_Ut2SetPluss5PointOffset(ux, uz, offset_data)\
(mCoBG_Ut2SetPluss5PointOffset_file(ux, uz, offset_data, __FILE__, __LINE__))
/*----------------------------------------------------------------------
 *
 * ＢＧの法線を返す
 *
 * moveBG考慮なし
 * 円柱BG考慮なし
 *
 *----------------------------------------------------------------------*/
extern void
mCoBG_GetBgNorm_FromWpos(
    xyz_t 	*norm,
    xyz_t 	pos
    );

/*----------------------------------------------------------------------
 *
 * UNITの属性を書き換える
 *(はっきりいって使用はしないでください)
 *
 *----------------------------------------------------------------------*/
extern void
mCoBG_SetAttribute(
    xyz_t     	pos,
    short     	bg_attribute
    );

/*----------------------------------------------------------------------
 *
 * 坂を滑るベクトルを返す
 *
 *----------------------------------------------------------------------*/
extern void
mCoBG_GetSlopeSlideVector(
    xyz_t	*vector,
    xyz_t	pos
    );

/*----------------------------------------------------------------------
 *
 * 水関係
 *
 * 1.CheckWaterAttribute	水属性か調べる
 *
 * 2.GetWaterHeight		水面の高さを取得
 * 				下が水面でなければmCoBG_NO_WATER_HEIGHTを返す
 *
 * 3.mCoBG_GetWaterFlow	水属性から流れのベクトルを得る
 *
 *----------------------------------------------------------------------*/
/*----------------------------------------------------------------------
 *
 * 水の流れ
 *
 *----------------------------------------------------------------------*/
#define	mCoBG_WATER_SPEED_F		(1.0F)
#define	mCoBG_WATER_ACCEL_F		(0.2F)
#define	mCoBG_WATER_YMAX_F		(-1.0F)
#define	mCoBG_WATER_GRAVITY_F		(0.2F)
/* 海の高さ
 * (海のブロックは基本的には最南にあるのが仕様上きまっているので固定値) */
#define mCoBG_SEA_HEIGHT_F		(20.0F)

/*----------------------------------------------------------------------
 *
 * 水属性か調べる
 *
 *----------------------------------------------------------------------*/
extern int
mCoBG_CheckWaterAttribute(
    unint	unitAtr
    );

/*-----------------------------------------------------------------------
 *
 * 海以外の水属性か調べる
 *
 *-----------------------------------------------------------------------*/
extern int
mCoBG_CheckWaterAttribute_OutOfSea(
    unint	unitAtr
    );

/*----------------------------------------------------------------------
 *
 * 水面の高さを調べる
 * 水面でないときはmCoBG_NO_WATER_HEIGHTを返す
 *
 *----------------------------------------------------------------------*/
#define mCoBG_NO_WATER_HEIGHT	(-100.0F)
extern float
mCoBG_GetWaterHeight_File(
    xyz_t	wposf,
    char	*file,
    int		line
    );
#define mCoBG_GetWaterHeight(wposf)\
mCoBG_GetWaterHeight_File(wposf,__FILE__,__LINE__)

/*----------------------------------------------------------------------
 *
 * 水属性から流れのベクトルを得る
 * 水の上でないならＦＡＬＳＥ
 *
 *----------------------------------------------------------------------*/
extern int
mCoBG_GetWaterFlow(
    xyz_t	*flow,		/* 流れベクトル		*/
    unint	unitAtr
    );

/*----------------------------------------------------------------------
 *
 * 指定した方向に水があるかサーチ
 * 水があれば TRUE 一番近い座標を返す
 *
 *----------------------------------------------------------------------*/
extern int
mCoBG_SearchWaterLimitDistN(
    xyz_t	*water_pos,
    xyz_t	base_pos,
    short	angle,
    float	limit_dist,
    int		devide
    );
#define mCoBG_SearchWaterLimitDist100Devide10(water_pos_p,\
					      base_pos,\
					      angle)\
(mCoBG_SearchWaterLimitDistN(water_pos_p,base_pos,angle,100.0F, 10))
    
/*-------------------------------------------------------------------------
 *
 * 波打ち上げチェック(砂か波か)
 * 浮きが海から浜へ急に補正されるのを防ぐためのチェック用
 *
 *-------------------------------------------------------------------------*/
extern int
mCoBG_CheckSea2Sand(
    xyz_t	*pos_p
    );

/*-------------------------------------------------------------------------
 *
 * 波ぎわチェック
 * （どざえもんのセットなどに使用）
 *
 *-------------------------------------------------------------------------*/
extern int
mCoBG_CheckWaveAttr(
    unint	org_attr
    );

/*-------------------------------------------------------------------------
 *
 * Field_Draw が bgCheckに波の制御であつかっているＣＯＳを渡す
 *
 *-------------------------------------------------------------------------*/
extern void
mCoBG_WaveCos2BgCheck(
    float set_wave_cos
    );

/*------------------------------------------------------------------------
 *
 * 砂穴を配置すべき場所か
 *
 *------------------------------------------------------------------------*/
extern int
mCoBG_CheckSandHole_ClData(
    mCoBG_ClData_c *clUtID
    );
/* ＰＯＳから */
extern int
mCoBG_CheckSandHole(
    const xyz_t	*pos
    );
/* ブロック番号 ブロック内ユニット番号から砂穴かチェック */
extern int
mCoBG_BnumUnum2SandHole(
    int	bx,
    int	bz,
    int ux_b,
    int uz_b
    );

/*-------------------------------------------------------------------------
 *
 * 波のＣＯＳ
 *
 *-------------------------------------------------------------------------*/
extern float
mCoBG_WaveCos( void );
#define mCoBG_WAVE_DIST_F	(40.0F)

/*=====================================================================
 *
 * CAMERA処理用
 *
 *=====================================================================*/
/*----------------------------------------------------------------------
 *
 * UNIT番号から属性をとってくる
 *
 *----------------------------------------------------------------------*/
extern int
mCoBG_UtNum2BgAttr(
    int	ux,
    int	uz
    );

/*----------------------------------------------------------------------
 *
 * 崖の可能性があるか調べる
 *
 *----------------------------------------------------------------------*/
extern int
mCoBG_CheckCliffAttr(
    unint	attr
    );

/*----------------------------------------------------------------------
 *
 * ユニットの中心の高さを得る
 *（カメラ専用なので他は使わないでください
 *  他で使用しても返り値の保証はしません）
 *
 *----------------------------------------------------------------------*/
extern float
mCoBG_UtNum2UtCenterY(
    int	ux,
    int	uz
    );

/*----------------------------------------------------------------------
 *
 * UNITの中心の高さを得る
 *
 *----------------------------------------------------------------------*/
extern float
mCoBG_UtNum2UtCenterY_Keep(
    int	ux,
    int	uz
    );

/*=====================================================================
 *
 * つり 魚用
 *
 *=====================================================================*/
/*----------------------------------------------------------------------
 *
 * オリジナルの属性を取得
 *
 *----------------------------------------------------------------------*/
extern unint
mCoBG_Wpos2BgAttribute_Original(
    xyz_t	pos
    );

/*=====================================================================
 *
 * Field形成時参照
 *
 *=====================================================================*/
/*----------------------------------------------------------------------
 *
 * 属性を木が育たないものに変更
 *(変更があったらTRUE)
 *
 *----------------------------------------------------------------------*/
extern int
mCoBG_Change2PoorAttr(
    mCoBG_ClData_c   	*clUtID
    );

/*=====================================================================
 *
 * ＢＧＣＨＥＣＫ処理用
 *
 *=====================================================================*/
/*----------------------------------------------------------------------
 *
 * 衝突結果FLAGの初期化
 *
 *----------------------------------------------------------------------*/
extern void
mCoBG_InitBgCheckResult(
    mCoBG_clResult_c	*clFlag
    );

/*=====================================================================
 *
 * 穴形状Check用
 *
 *=====================================================================*/
/*------------------------------------------------------------------------
 *
 * 穴を掘ることが可能か(可能ならTRUE)
 *
 *------------------------------------------------------------------------*/
extern int
mCoBG_CheckHole(
    xyz_t	pos
    );
/*------------------------------------------------------------------------
 *
 * 空振り属性か
 *
 *------------------------------------------------------------------------*/
extern int
mCoBG_CheckSkySwing(
    xyz_t	pos
    );
/*------------------------------------------------------------------------
 *
 * 穴のタイプを得る（全２５種類）
 *
 * もしあてはまらないなら -1
 *
 *------------------------------------------------------------------------*/
/* 衝突データから */
extern int
mCoBG_GetHoleNumber_ClData(
    mCoBG_ClData_c *clUtID
    );
/* ＰＯＳから */
extern int
mCoBG_GetHoleNumber(
    xyz_t	pos
    );
/* ブロック番号 ブロック内ユニット番号から */
extern int
mCoBG_BnumUnum2HoleNumber(
    int	bx,
    int	bz,
    int ux_b,
    int uz_b
    );

/*------------------------------------------------------------------------
 *
 * 円当りの基本半径
 *
 *------------------------------------------------------------------------*/
#if 1
#define mCoBG_HOLE_RADIUS	(19.0F)
#define mCoBG_TREE_RADIUS	(mCoBG_HOLE_RADIUS)
#define mCoBG_STUMP_RADIUS	(18.0F)
#define mCoBG_STONE_RADIUS	(mCoBG_HOLE_RADIUS)
#define mCoBG_POST_RADIUS	(15.0F)
#define mCoBG_RESERVE_RADIUS	(mCoBG_HOLE_RADIUS)	
#define mCoBG_KOINOBORI_RADIUS	(mCoBG_HOLE_RADIUS)
#else
#define mCoBG_HOLE_RADIUS	(17.0F)
#define mCoBG_TREE_RADIUS	(mCoBG_HOLE_RADIUS)
#define mCoBG_STUMP_RADIUS	(17.0F)
#define mCoBG_STONE_RADIUS	(mCoBG_HOLE_RADIUS)
#define mCoBG_POST_RADIUS	(15.0F)
#define mCoBG_RESERVE_RADIUS	(mCoBG_HOLE_RADIUS)
#endif
/*------------------------------------------------------------------------
 *
 * 円柱当りの基本半径
 *
 *------------------------------------------------------------------------*/
/* mCoBG_TREE0_HEIGHT */
#define mCoBG_TREE1_HEIGHT	(30.0F)
#define mCoBG_TREE2_HEIGHT	(40.0F)
#define mCoBG_TREE3_HEIGHT	(60.0F)
#define mCoBG_TREE4_HEIGHT	(80.0F)
#define mCoBG_KOINOBORI_HEIGHT	(160.0F)
#define mCoBG_STUMP_HEIGHT	(30.0F)
/* 切株を基準にしているのは斧での衝突をとるため */
#define mCoBG_STONE_HEIGHT	(mCoBG_STUMP_HEIGHT + 1.5F)
#define mCoBG_POST_HEIGHT	(50.0F)
#define mCoBG_RESERVE_HEIGHT	(45.0F)

/*------------------------------------------------------------------------
 *
 * 属性が？？？である
 *
 *------------------------------------------------------------------------*/
#define mCoBG_IT_IS_GRASS(attr)	(attr >= mAtr_GRASS && attr <= mAtr_GRASS4)
#define mCoBG_IT_IS_GRASS2(attr) (attr >= mAtr_GRASS && attr <= mAtr_GRASS3)
#define mCoBG_IT_IS_SOIL(attr)	(attr >= mAtr_SOIL && attr <= mAtr_SOIL3)
#define mCoBG_IT_IS_STONE(attr)	(attr == mAtr_STONE)

/*------------------------------------------------------------------------
 *
 * UNIT中心高さのDEFAULTとの差を求める
 *
 *------------------------------------------------------------------------*/
extern float
mCoBG_GetBgHeightGapBetweenNowDefault(
    xyz_t	pos
    );

/*------------------------------------------------------------------------
 *
 * UNITの中心高さがDEFAULTと違うか
 * 異なればＴＲＵＥ
 *
 *------------------------------------------------------------------------*/
extern int
mCoBG_ExistHeightGap_KeepAndNow(
    xyz_t	pos
    );

/*------------------------------------------------------------------------
 *
 * オリジナル属性から掘るのが可能か
 *
 *------------------------------------------------------------------------*/
extern int
mCoBG_CheckHole_OrgAttr(
    unint	attr
    );

/*------------------------------------------------------------------------
 *
 * 風船専用高さチェック
 *
 *------------------------------------------------------------------------*/
extern float
mCoBG_GetBalloonGroundY(
    const xyz_t *pos
    );

/*------------------------------------------------------------------------
 *
 * 室内専用抜け道チェック
 *
 * ぬけれる方向のビットが立ちます
 * 返り値をbitcheckしてください
 *
 *------------------------------------------------------------------------*/
/* チェックリスト */
enum __direct_check_list__ {
    mCoBG_PATH_UP_e,
    mCoBG_PATH_LT_e,
    mCoBG_PATH_DN_e,
    mCoBG_PATH_RT_e,
    mCoBG_PATH_NUM
};
/* チェック用ビット */
#define mCoBG_UP_PATH	(1 << mCoBG_PATH_UP_e)	/* 0x8000を目指してください */
#define mCoBG_LT_PATH	(1 << mCoBG_PATH_LT_e)	/* 0xc000を目指してください */
#define mCoBG_DN_PATH	(1 << mCoBG_PATH_DN_e)	/* 0x0000を目指してください */
#define mCoBG_RT_PATH	(1 << mCoBG_PATH_RT_e)	/* 0x4000を目指してください */
extern int
mCoBG_CheckRoughPathInRoom(
    const xyz_t	*pos
    );

/*------------------------------------------------------------------------
 *
 * ボールが転がり落ちる属性か
 * ボールが転がり落ちる属性ならＴＲＵＥ
 * ついでに転がり落ちる方向を返す
 * short angle_table[2];
 *
 *------------------------------------------------------------------------*/
extern int
mCoBG_CheckAttribute_BallRolling(
    short	*roll_angle,
    const xyz_t	*pos
    );

/*------------------------------------------------------------------------
 *
 * 転がり落ちる属性のどのへんにいるか調べる
 * 崖側が0.0Fで崖の上が1.0F
 *
 *------------------------------------------------------------------------*/
extern float
mCoBG_CheckBallRollingArea(
    short	angle,
    const xyz_t	*pos
    );

/*------------------------------------------------------------------------
 *
 * 導入ＤＥＭＯでのブロック枠衝突の切り替え
 *
 *------------------------------------------------------------------------*/
/* ＢＬＯＣＫチェックのＭＯＤＥ */
enum __block_bg_check_mode__ {
    mCoBG_BLOCK_BGCHECK_NORMAL,	/* 通常のブロックチェック		*/
    mCoBG_BLOCK_BGCHECK_INTRO,	/* 導入ＤＥＭＯ時のブロックチェック	*/
    mCoBG_BLOCK_BGCHECK_MODE
};
/* ブロックＢＧチェックＭＯＤＥの変更 */
extern int
mCoBG_ChangeBlockBgCheckMode(
    int	mode
    );
/* 現在のブロックＢＧチェックＭＯＤＥの取得 */
extern int
mCoBG_GetBlockBgCheckMode( void );

/*------------------------------------------------------------------------
 *
 * 座標から地面チェックの補正値を求める
 *
 *------------------------------------------------------------------------*/
extern float
mCoBG_Wpos2GroundCheckOnly(
    const xyz_t	*pos,
    float	check_foot
    );
/*------------------------------------------------------------------------
 *
 * 現在の座標ががDEFAULTと高さが違うか
 * 書換が起こっていたらＴＲＵＥ（竹下くん作成 2000.12.13）
 *
 *------------------------------------------------------------------------*/
extern int
mCoBG_ExistHeightGap_KeepAndNow_Detail(
    xyz_t	pos
    );

/*------------------------------------------------------------------------
 *
 * 斜の衝突が存在するか？
 * 存在すればＴＲＵＥ
 *
 * attr_check...mCoBG_NOATR_CHECK	通常斜だけチェック
 *		mCoBG_ATR_CHECK		属性斜もチェック
 *
 *------------------------------------------------------------------------*/
extern int
mCoBG_Wpos2CheckSlateCol(
    const xyz_t *pos,
    int		attr_check	/* 属性斜もチェックするか */
    );

/* 衝突データをデフォルトに戻す（ただし平らなユニットに限ります）*/
extern void
mCoBG_Ut2SetDefaultOffset(
    int	ux,
    int uz
    );
/* 木の跳ね返り音をならすか
 *（ＦＡＬＳＥなら石の跳ね返り音を）*/
extern int
mCoBG_WoodSoundEffect(
    const xyz_t	*pos_p
    );

/*=====================================================================
 *
 * ＢＧＣＨＥＣＫ数学関数
 *
 *=====================================================================*/
#include "m_collision_bg_math.h"

/******* なくなります 使っているところはいずれ消します(miyake)******
 * 理由:滑る滑らないの概念がなくなったため */
/*--------------------------------------
 * 補正する＆＆属性壁あり
 *--------------------------------------*/
#define mCoBG_BgCheckAndReverse(revpos,\
				actor,\
				check_range,\
				check_foot,\
				check_point) \
(mCoBG_BgCheckReverseOnAttributeOn(revpos,\
				   actor,\
				   check_range,\
				   check_foot ))
    
/*--------------------------------------
 * 補正しない＆＆属性壁あり
 *--------------------------------------*/
#define mCoBG_BgCheckAndNoReverse(revpos,\
				  actor,\
				  check_range,\
				  check_foot,\
				  check_point) \
(mCoBG_BgCheckReverseOffAttributeOn(revpos,\
				    actor,\
				    check_range,\
				    check_foot))


#ifdef	_LANGUAGE_C_PLUS_PLUS
}
#endif  /* _LANGUAGE_C_PLUS_PLUS */
#endif  /* defined(LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */
#endif  /* !defined(__mCoBG_COLh) */
