/*
 ******************************************************************************
 *
 *	アクター定義
 *	$Id: m_actor.h,v 1.1 2003/06/06 00:15:12 tong Exp $
 ******************************************************************************
 */
#ifndef INCLUDE_M_ACTOR_H
#define INCLUDE_M_ACTOR_H

#ifdef _LANGUAGE_C_PLUS_PLUS
extern "C" {
#endif	/* _LANGUAGE_C_PLUS_PLUS */


#include "m_actor_h.h"
#include "m_actor_list.h"
#include "m_play_h.h"
#include "m_scene_h.h"

#include "m_collision_obj_type.h"
#include "m_field_make.h"

#include "field_Name.h"

#include "m_npc.h"


/************************************************************************
 *
 *	いろいろ
 *
 ************************************************************************/

/*-----------------------------------------------------------------------
 *
 *	透視変換座標セット
 *
 *----------------------------------------------------------------------*/
extern void projection_pos_set(
    GAME_PLAY *game_play,
    xyz_t     *target_pos,
    xyz_t     *display_pos,
    float     *w
    );
/*-----------------------------------------------------------------------
 *
 *	セット座標，方向を現在座標，方向へ
 *
 *----------------------------------------------------------------------*/
extern void	Actor_world_to_eye(
    ACTOR	*Actorx,
    float	offset_y
    );
/*-----------------------------------------------------------------------
 *
 *	移動計算
 *
 *----------------------------------------------------------------------*/
extern void	Actor_position_move(
    ACTOR	*Actorx
    );
/*-----------------------------------------------------------------------
 *
 *	移動速度セット
 *
 *----------------------------------------------------------------------*/
extern void	Actor_position_speed_set(
    ACTOR	*Actorx
    );
/*-----------------------------------------------------------------------
 *
 *	移動速度セット＋移動計算
 *
 *----------------------------------------------------------------------*/
extern void	Actor_position_moveF(
    ACTOR	*Actorx
    );

/*-----------------------------------------------------------------------
 *
 *	プレイヤーがこっちを向いているか？チェック
 *
 *----------------------------------------------------------------------*/
extern int Actor_player_look_direction_check(
    ACTOR     *this,
    short     angle,
    GAME_PLAY *game_play
);

/*-----------------------------------------------------------------------
 *
 *	表示座標計算
 *
 *----------------------------------------------------------------------*/
extern void	Actor_display_position_set(
    GAME_PLAY	*game_play,
    ACTOR	*Actorx,
    short	*display_x,
    short	*display_y
    );

/************************************************************************
 *
 *	シェイプ情報クラス
 *
 ************************************************************************/
/*------------------------------------------------------------------------
 *
 * 外から影の描画を操作
 *
 *------------------------------------------------------------------------*/
#define mAc_SET_SHADOW_DRAW_FLAG_p(actor, flag) \
    ((actor)->shape.shadowDrawFlag = flag)
	
/*------------------------------------------------------------------------
 *
 * 影を消す
 *
 *------------------------------------------------------------------------*/
#define mAc_DELETE_SHADOW_p(actor)	\
	mAc_SET_SHADOW_DRAW_FLAG_p(actor, OFF)
	
/*------------------------------------------------------------------------
 *
 * 影を再び登場させる（初期設定していなければだめ）
 *
 *------------------------------------------------------------------------*/
#define mAc_RESET_SHADOW_p(actor)	\
	mAc_SET_SHADOW_DRAW_FLAG_p(actor, ON)
	
/*------------------------------------------------------------------------
 *
 * 影のスケール調整（０〜１）
 *
 *------------------------------------------------------------------------*/
#define mAc_SET_SHADOW_SCALE_p(actor,scale)\
	((actor)->shape.shadow_scale_rate = scale)
	
/*------------------------------------------------------------------------
 *
 * 影のアルファ調整（０〜１）
 *
 *------------------------------------------------------------------------*/
#define mAc_SET_SHADOW_ALPHA_p(actor,alpha)\
	((actor)->shape.shadow_alpha_rate = alpha)

/*------------------------------------------------------------------------
 *
 * アニメTransによる影位置のSET。
 *（指定したXZ座標に出るがＹ座標は地形の上になるように
 *  計算します）
 * 毎フレームSETしてください。
 *
 *------------------------------------------------------------------------*/
#define mAc_SET_ANIMME_SHADOW_POS_PTR(actor,wposp)\
	((actor)->shape.shadow_pos = wposp)
/*------------------------------------------------------------------------
 *
 * 強制影位置のSET。
 *（指定した場所に出ます）
 * 毎FRAME SETしてください。
 *	注意	指定した位置の格納領域は解放されていないこと
 *
 *------------------------------------------------------------------------*/
extern void
mActorShadow_SetForceShadowPos(
    ACTOR	*Actor,
    xyz_t	*pos );
#define mAc_SET_FORCE_SHADOW_POS_PTR(actor,wposp)\
    mActorShadow_SetForceShadowPos(actor, wposp)

/*------------------------------------------------------------------------
 *
 * 強制影位置のSET。
 *（指定した場所に出ます）
 * 毎FRAME SETしてください。
 *	注意	指定した位置の格納領域は解放されていないこと
 *
 *------------------------------------------------------------------------*/
extern void
mActorShadow_UnSetForceShadowPos(
    ACTOR	*Actor );

/*--------------------------------------------------------------------------
 *
 * ACTORの影表示。(特殊)
 *
 * 虫 魚など固有で管理しているものACTORはDrawの最後で
 * 影の表示関数を呼ばなくては影出ません。
 *
 *--------------------------------------------------------------------------*/
extern void
mAc_NormalActorShadow(
    ACTOR     	*Actor,
    GAME_PLAY 	*game,
    float	force_alpha_rate
    );
extern void
mAc_ActorShadowDraw_ShadowDrawFlagOn(
    ACTOR     	*Actor,		/* ACTOR	*/
    GAME_PLAY 	*game_play,	/* GamePlay	*/
    int		fish_flag,	/* FishFlag	*/
    xyz_t	offset,		/* SetOffset	*/
    float	shadow_limit_dist_plus
    );
/*------------------------------------------------------------------------
 *
 * ACTORの影表示(特殊)
 *
 * 虫 魚など固有で管理しているものACTORはDrawの最後で
 * 影の表示関数を呼ばなくては影出ません。
 *
 * おそらく楕円にも対応するが太陽の方向での処理は未対応。
 *(Testしてないので正常に動くがわからない)
 *
 *------------------------------------------------------------------------*/
extern void
mAc_UnagiActorShadow(
    ACTOR     	*Actor,
    GAME_PLAY 	*game,
    xyz_t	offset
    );
   
typedef struct {
    s_xyz		angle;		/* シェイプ方向 */
    short		anime_count;	/* アニメーション用カウンタ */
    float		offset_y;	/*         表示補正Ｙ値 */
    
    /* 影関数ポインタ */
    void (*shadow_proc)(ACTOR *, LightsN *, GAME_PLAY *);
    float		shadow_size;		/* 影サイズX		*/
    float		shadow_sizeZ;		/* 影サイズZ		*/
    float		shadow_scale_rate;	/* 外部スケールレート	*/
    float		shadow_alpha_rate;	/* 外部アルファレート	*/

    int			slide_s2;		/* ＴＥＸ２にＳ値	*/

    /* アニメーションのトランスを用いている場合で
     * 実際のポジションとシェイプの位置が異なっているとき
     * 毎フレーム影を出したいポジションをＳＥＴしてください */
    xyz_t		*shadow_pos;
    
    /* 乗っているムーブＢＧの登録情報 */
    int			on_move_bg_idx;		/* 乗っているＭＶＢＧidx*/
    
    unchar		shadowDrawFlag;		/* 影描画フラグ		*/
    char		old_on_ground;		/* 前フレーム足がついてた*/
    unchar		operate_shadow;		/* 強制位置ＳＥＴ	*/
    unchar		pad;
    
    xyz_t		foot_pos[2];	/* 足座標 	*/
} Shape_Info;

/*-----------------------------------------------------------------------
 *
 *	シェイプ情報クラス 初期化
 *
 *----------------------------------------------------------------------*/
extern void Shape_Info_init(
    ACTOR       *Actor,
    float	offset_y,
    void (*shadow_proc)(ACTOR *, LightsN *, GAME_PLAY *),
    float	shadow_size, /*半径１*/
    float       shadow_sizeZ /*半径２*/
    );
/*
***********************************************************************
***********************************************************************
*
* 丸影表示 FOREST用に変更 1999.3.17 miyake
*
***********************************************************************
***********************************************************************
*/
extern void mAc_ActorShadowCircle(
    ACTOR     *Actor,
    LightsN   *lightN,
    GAME_PLAY *game_play);
/*
***********************************************************************
***********************************************************************
*
* 楕円影表示 FOREST用に追加 1999.3.26 miyake
*
***********************************************************************
***********************************************************************
*/
extern void mAc_ActorShadowEllipse(
    ACTOR     *Actor,
    LightsN   *lightN,
    GAME_PLAY *game_play);
/*-----------------------------------------------------------------------
 *
 *	２足影座標チェック
 *
 *----------------------------------------------------------------------*/
extern void Actor_foot_shadow_pos_set(
    ACTOR     *this,
    int       jyoint_no,
    int	      L_foot_jyoint,
    xyz_t     *L_foot_offset,
    int	      R_foot_jyoint,
    xyz_t     *R_foot_offset
);

/************************************************************************
 *
 *	Ａｃｔｏｒクラス
 *
 ************************************************************************/
/*
 * 変数初期化マクロ
 */
#define	Act_vst_s_c(member, data)		{V_C, V_S_CHAR,      offsetof(ACTOR, member), (int)(data)}
#define	Act_vst_s_c_e(member, data)		{V_E, V_S_CHAR,      offsetof(ACTOR, member), (int)(data)}
#define	Act_vst_u_c(member, data)		{V_C, V_U_CHAR,      offsetof(ACTOR, member), (int)(data)}
#define	Act_vst_u_c_e(member, data)		{V_E, V_U_CHAR,      offsetof(ACTOR, member), (int)(data)}
#define	Act_vst_s_s(member, data)		{V_C, V_S_SHORT,     offsetof(ACTOR, member), (int)(data)}
#define	Act_vst_s_s_e(member, data)		{V_E, V_S_SHORT,     offsetof(ACTOR, member), (int)(data)}
#define	Act_vst_u_s(member, data)		{V_C, V_U_SHORT,     offsetof(ACTOR, member), (int)(data)}
#define	Act_vst_u_s_e(member, data)		{V_E, V_U_SHORT,     offsetof(ACTOR, member), (int)(data)}
#define	Act_vst_s_i(member, data)		{V_C, V_S_INT,       offsetof(ACTOR, member), (int)(data)}
#define	Act_vst_s_i_e(member, data)		{V_E, V_S_INT,       offsetof(ACTOR, member), (int)(data)}
#define	Act_vst_u_i(member, data)		{V_C, V_U_INT,       offsetof(ACTOR, member), (int)(data)}
#define	Act_vst_u_i_e(member, data)		{V_E, V_U_INT,       offsetof(ACTOR, member), (int)(data)}
#define	Act_vst_f(member, data)			{V_C, V_FLOAT,       offsetof(ACTOR, member), (int)(data)}
#define	Act_vst_f_e(member, data)		{V_E, V_FLOAT,       offsetof(ACTOR, member), (int)(data)}
#define	Act_vst_f_x1000(member, data)		{V_C, V_FLOAT_X1000, offsetof(ACTOR, member), (int)((data) * 1000.0f)}
#define	Act_vst_f_x1000_e(member, data)		{V_E, V_FLOAT_X1000, offsetof(ACTOR, member), (int)((data) * 1000.0f)}
#define	Act_vst_xyz_t(member, data)		{V_C, V_XYZ_T,       offsetof(ACTOR, member), (int)(data)}
#define	Act_vst_xyz_t_e(member, data)		{V_E, V_XYZ_T,       offsetof(ACTOR, member), (int)(data)}
#define	Act_vst_xyz_t_x1000(member, data)	{V_C, V_XYZ_T_X1000, offsetof(ACTOR, member), (int)((data) * 1000.0f)}
#define	Act_vst_xyz_t_x1000_e(member, data)	{V_E, V_XYZ_T_X1000, offsetof(ACTOR, member), (int)((data) * 1000.0f)}
#define	Act_vst_s_xyz(member, data)		{V_C, V_S_XYZ,       offsetof(ACTOR, member), (int)(data)}
#define	Act_vst_s_xyz_e(member, data)		{V_E, V_S_XYZ,       offsetof(ACTOR, member), (int)(data)}

enum {
    BGCHECK_TYPE_BASIC,	/* 通常ＢＧチェックタイプ */
    BGCHECK_TYPE_PLAYER	/* プレイヤー用ＢＧチェックタイプ */
};




/* コンストラクト関数ポインタ */ 	
typedef void	(*CT_PROC)(ACTOR *, GAME *);
/* デストラクト関数ポインタ */
typedef void	(*DT_PROC)(ACTOR *, GAME *);
/* 処理関数ポインタ */
typedef void	(*MV_PROC)(ACTOR *, GAME *);
/* 表示関数ポインタ */
typedef void	(*DR_PROC)(ACTOR *, GAME *);
/* セーブ処理関数ポインタ */
typedef void	(*SV_PROC)(ACTOR *, GAME *);

/* 描画チェック関数ポインタ */
typedef int	(*DRAW_CHK_PROC)(ACTOR *, GAME_PLAY *);


/*
 *	出身情報
 */
typedef struct {
    short		scene_data_ID;		/* シーンデータＩＤ */
    mAc_nfs_t		table_no;		/* ＦＧテーブル登録ナンバー */
    signed char		b_xnum;			/* ブロックの X方向番号 */
    signed char		b_znum;			/* ブロックの Z方向番号 */
    short		mvaclist_no;		/* リストナンバー */
    Position_Angle	home;			/* セット座標、方向 */

} native_c;


/*
 * Ａｃｔｏｒクラス
 */
struct actor_class {
    short		name;			/* 名前 */
    unchar		part;			/* 役柄 */
    unchar		restore_fg;		/* ＦＧ復帰フラグ */

    native_c		native;			/* 出身情報 */

    unint		status;			/* 情報 */

    short		arg_data;		/* 引数データ */
    signed short	bank_ID;		/* データバンクテーブルＮｏ */

    Position_Angle	world;			/* 現在座標，方向 */
    xyz_t		old_position;		/* 前フレーム座標 */
    Position_Angle	eye;			/* 視点座標，方向 */
    xyz_t		scale;			/* スケール */
    xyz_t		position_speed;		/* 座標速度 */ 

    float		speedF;			/* 前方向座標速度 */
    float		gravity;		/* 重力 */
    float		max_speed_y;		/* 最大落下速度 */
    
    float		ground_y;		/* 床座標（影で仕様） */

    mCoBG_Chk_c		bgCheck;

    unchar		nature_eff;		/* 自然の影響受けるかフラグ */

    unchar		draw_status;		/* 表示状態 */
						/* 0:非表示 !0:表示 */

    short		player_angle_y;		/* プレイヤーとのＹ軸方向 */
    float		player_range;		/*               距離 */
    float		player_distance;	/*               ＸＺ平面距離 */
    float		player_high;		/*               Ｙ距離 */
    Status              status_info;            /* ステータス */
    Shape_Info		shape;			/* シェイプ情報 */

    xyz_t		camera_position;	/* カメラポジション */
    float		camera_w;		/* カメラＷ値
						   (カメラポジション計算途中の変数だが
						   もったいないので保存,しかし今は使う事なし) */		
    float		cull_x;			/* カリング幅 */
    float		cull_y;			/* カリング高さ */
    float		cull_z;			/* カリング距離 */
    float		cull_r;			/* カリング半径 */

#if 1	/* 1999 08/17 komatu */
    float		talk_distance;		/* 会話距離 */
    unchar		talking_cull;		/* 会話時カリングされるか？ */

    unchar		dont_draw;		/* 描画しないフラグ（毎フレームクリヤーしない） */
    unshort		pad_s;
#endif

    ACTOR		*mother;		/* 親Ａｃｔｏｒポインタ */
    ACTOR		*child;			/* 子			*/
    ACTOR		*pre;			/* 前			*/
    ACTOR		*next;			/* 次			*/
    
    CT_PROC		construct_proc;	/* コンストラクト関数ポインタ */
    DT_PROC		destruct_proc;	/* デストラクト関数ポインタ */
    MV_PROC		move_proc;		/* 処理関数ポインタ */
    DR_PROC		draw_proc;		/* 表示関数ポインタ */
    SV_PROC		save_proc;		/* セーブ処理関数ポインタ */
    /*DLFTBL_ACTOR*/ void *dlftbl;		/* オーバーレイ用管理ポインタ */

};

/*シェイプ情報をさわるためにとりあえず定義しました miyake*/
/*アクタのシェイプ情報をセットするためのマクロ*/
#define mAc_SET_OFFSET_Y_shape(actor,i) (actor->shape.offset_y=(float)i)
#define mAc_SET_FOOT_HIT_FLAG(actor,i)  (actor->shape.foot_hit_flag=(unchar)i)
/*X座標に関するマクロ*/
#define SET_WPOSX(a,px)		(((ACTOR *)(a))->world.position.x=(px))
#define GET_WPOSX(a)		(((ACTOR *)(a))->world.position.x)
/*Y座標に関するマクロ*/
#define SET_WPOSY(a,py)		(((ACTOR *)(a))->world.position.y=(py))
#define GET_WPOSY(a)		(((ACTOR *)(a))->world.position.y)
/*Z座標に関するマクロ*/
#define SET_WPOSZ(a,pz)		(((ACTOR *)(a))->world.position.z=(pz))
#define GET_WPOSZ(a)		(((ACTOR *)(a))->world.position.z)
/*OLD X座標に関するマクロ*/
#define SET_OLD_WPOSX(a,px)	(((ACTOR *)(a))->old_position.x=(px))
#define GET_OLD_WPOSX(a)	(((ACTOR *)(a))->old_position.x)
/*OLD Y座標に関するマクロ*/
#define SET_OLD_WPOSY(a,py)	(((ACTOR *)(a))->old_position.y=(py))
#define GET_OLD_WPOSY(a)	(((ACTOR *)(a))->old_position.y)
/*OLD Z座標に関するマクロ*/
#define SET_OLD_WPOSZ(a,pz)	(((ACTOR *)(a))->old_position.z=(pz))
#define GET_OLD_WPOSZ(a)	(((ACTOR *)(a))->old_position.z)
/*スピード設定マクロ*/
#define SET_SPEEDX(a,sx)	(((ACTOR *)(a))->position_speed.x = (sx))
#define SET_SPEEDY(a,sy)	(((ACTOR *)(a))->position_speed.y = (sy))
#define SET_SPEEDZ(a,sz)	(((ACTOR *)(a))->position_speed.z = (sz))
#define GET_SPEEDX(a)		(((ACTOR *)(a))->position_speed.x)
#define GET_SPEEDY(a)		(((ACTOR *)(a))->position_speed.y)
#define GET_SPEEDZ(a)		(((ACTOR *)(a))->position_speed.z)
/*アクタの中の衝突データを参照する*/
#define	GETP_UTID(a)		(((ACTOR *)(a))->bgCheck.clUtID)
#define	GET_UTID(a,i)		((((ACTOR *)(a))->bgCheck.clUtID)[i])
#define	SET_UTID(a,i,u)		((((ACTOR *)(a))->bgCheck.clUtID)[i] = (u))
/*アクタ構造体から衝突フラグを得る	*/
#define GET_CL_RESULT(actor)     (actor->bgCheck.clFlag)
/*アクタ構造体からＢＧチェック構造体を得る*/
#define mAc_GET_BGCHECK_CLASS(Actor) (Actor->bgCheck)
/* ＡＲＧデータの獲得 */
#define mAc_GET_ARG_DATA(actor) (actor->arg_data)
/* 表示状態チェック */
#define	Actor_isDraw(this)	((this)->draw_status != 0)
#define	Actor_setDraw(this)	((this)->draw_status = 1)
#define	Actor_resetDraw(this)	((this)->draw_status = 0)
/* 情報チェック */
#define	Actor_bitcheck_status(this, bit_data)	bitcheck((this)->status, (bit_data))
#define	Actor_check_status(this, bit_data)	(bitcheck((this)->status, (bit_data)) == (bit_data))
#define	Actor_set_status(this, bit_data)	bitset((this)->status, (bit_data))
#define	Actor_clear_status(this, bit_data)	bitclr((this)->status, (bit_data))

/*-----------------------------------------------------------------------
 *
 *	削除設定処理
 *
 *----------------------------------------------------------------------*/
extern void Actor_delete(
    ACTOR *this
);
/*-----------------------------------------------------------------------
 *
 *	表示カリングチェック
 *
 *----------------------------------------------------------------------*/
/* 表示カリングチェック */
extern int	Actor_draw_actor_no_culling_check(
    ACTOR	*Actorx
    );
/* 表示カリングチェック:引数分離版 */
extern int	Actor_draw_actor_no_culling_check2(
    ACTOR	*Actorx,
    xyz_t	*camera_position,
    float	camera_w
    );

/************************************************************************
 *
 *	Ａｃｔｏｒデータクラス
 *
 ************************************************************************/
#define	ACTOR_MAX	200	/* Ａｃｔｏｒ最大セット可能数 */

/*
 * 役柄テーブル
 */
enum {
    ACTOR_PART_BG_ITEM,			/* ＦＧ管理アクター */
    ACTOR_PART_ITEM,			/* アイテム */
    ACTOR_PART_PLAYER,			/* プレイヤー */
    ACTOR_PART_NPC,			/* ＮＰＣ */
    ACTOR_PART_OBJ,			/* オブジェ */
    ACTOR_PART_BG,			/* ＢＧ描画アクター */
    ACTOR_PART_EFFECT,			/* エフェクト */

/*
 *	制御アクターは全アクターの最後に消滅しなければならないので
 *	一番最後に置く！！
 */
    ACTOR_PART_CTRL,			/* 制御アクター */

    ACTOR_PART_MAX
}; 

/*
 * 情報テーブル
 */
#define	ACTOR_STATUS_NON		(0)
#define	ACTOR_STATUS_ANCHOR_KEEP	(1)					/* 注目対象？ */
#define	ACTOR_STATUS_ANCHOR		ACTOR_STATUS_ANCHOR_KEEP		/* 注目継続？ */
#define	ACTOR_STATUS_FIGHT		((1<<2) | ACTOR_STATUS_ANCHOR)		/* 戦意有り？ */
#define	ACTOR_STATUS_TALK		((1<<3) | ACTOR_STATUS_ANCHOR)		/* 会話有り？ */
#define	ACTOR_STATUS_NO_CULL_MOVE	(1<<4)					/* カリングで動作処理停止しない？ */
#define	ACTOR_STATUS_NO_CULL_DRAW	(1<<5)					/* カリングで描画処理停止しない？ */
#define	ACTOR_STATUS_NO_CULL_FLAG	(1<<6)					/* カリング距離外フラグ（結果フラグ） */
#define	ACTOR_STATUS_INVISIBLE		(1<<7)					/* 見えないフラグ */
#define	ACTOR_STATUS_TALKING_NOW	(1<<8)					/* 会話中フラグ */
#define	ACTOR_STATUS_HOOK_CARRY		(1<<9)					/* フックショット引っ張られフラグ */
#define	ACTOR_STATUS_HOOK_STOP		(1<<10)					/* フックショット引っ張りフラグ */
#define	ACTOR_STATUS_ZOMBI		(1<<11)					/* ゾンビなフラグ */
#define	ACTOR_STATUS_NO_QUAKE		(1<<12)	/* 地震影響無しフラグ 3/2 m_quake 削除 by小松*/
#define	ACTOR_STATUS_HOOK_CARRY_NOW	(1<<13)					/* フックショット引っ張られ中フラグ */
#define ACTOR_STATUS_ARROW_CARRY	(1<<14)					/* 矢押されフラグ */
#define ACTOR_STATUS_ARROW_CARRY_NOW	(1<<15)					/* 矢押され中フラグ */
#define ACTOR_STATUS_TALK_PLEASE	(1<<16)					/* 会話強要フラグ */
#define ACTOR_STATUS_CARRY_ANGLE_SET	(1<<17)					/* 持ち上げられ角度セットフラグ */
#define ACTOR_STATUS_ELF_MAIL		(1<<18 | ACTOR_STATUS_ANCHOR)		/* 妖精へのメール有り？ */
#define	ACTOR_STATUS_LEVEL_SE_PLAYER	(1<<19)					/* レベルＳＥセットタイプ（プレイヤー） */
#define	ACTOR_STATUS_LEVEL_SE_SYSTEM	(1<<20)					/* レベルＳＥセットタイプ（システム） */
#define	ACTOR_STATUS_LEVEL_SE_FIX	(1<<21)					/* レベルＳＥセットタイプ（固定） */
#define	ACTOR_STATUS_MAP_LIGHT_MODE	(1<<22)					/* 地形タイプライティングフラグ */
#define	ACTOR_STATUS_THROW_ONLY		(1<<23)					/* 投げられのみフラグ */
#define	ACTOR_STATUS_BODY_HIT		(1<<24)					/* 体当たりＳＥセットフラグ */
#define	ACTOR_STATUS_OKARINA_NO_STOP	(1<<25)					/* オカリナ演奏中停止無しフラグ */
#define ACTOR_STATUS_MOVEBG_ABLE_SW_ON  (1<<26)                                 /* moveBG SWフラグセットが出来るフラグ */
#define ACTOR_STATUS_ANCHOR_NO_ROCK	(1<<27)                                 /* 注目ロック無しフラグ */
#define ACTOR_STATUS_LEVEL_SE_TIMER	(1<<28)					/* レベルＳＥセットタイプ（タイマー） */
#if 1 /* 1999 08/09 komatu */
#define ACTOR_STATUS_ABLE_MOVE_INDEMO	(1<<29)					/* 会話やデモ中にmoveルーチンを通すか */
#define ACTOR_STATUS_DEMO_CONCERNED	(1<<30)					/* 会話やデモの当事者または関係者 */
#endif

/*
 *	プロファイルクラス
 */
struct actor_profile_class {
    short		name;			/* 名前 */
    unchar		part;			/* 役柄 */
    unint		status;			/* 情報 */
    unshort		table_no;		/* テーブル登録用ナンバー */
    Object_Bank		bank;			/* データバンク */
    size_t		class_size;		/* クラスサイズ */
    CT_PROC		construct_proc;		/* コンストラクト関数ポインタ */
    DT_PROC		destruct_proc;		/* デストラクト関数ポインタ */
    MV_PROC 		move_proc;		/* 処理関数ポインタ */
    DR_PROC 		draw_func;		/* 表示関数ポインタ */
    SV_PROC 		save_proc;		/* セーブ処理関数ポインタ */

};

#ifndef typedef_struct_Actor_profile
#define typedef_struct_Actor_profile
#endif

/*
 *	アクター発生データクラス
 */
typedef struct {
    short		profile;	/* ＡｃｔｏｒプロフィールＮｏ */
    s_xyz		position;	/* セット座標 */
    s_xyz		angle;		/*       方向 */
    short		arg_data;	/* 引数データ */

} Actor_data;

/*
 *	アクター役柄別登録リストクラス
 */
typedef struct {
    int		num;		/* セット数 */
    ACTOR	*actor;		/* Ａｃｔｏｒリストポインタ */

} Actor_list;

/*
 *	アクター登録リストクラス
 */
typedef struct {
    int		num;				/* 総合Ａｃｔｏｒセット数 */
    Actor_list	actor_list[ACTOR_PART_MAX];	/* 役柄別Ａｃｔｏｒリスト */

} Actor_info;

/*-----------------------------------------------------------------------
 *
 *	コンストラクト処理
 *
 *----------------------------------------------------------------------*/
extern void	Actor_info_ct(
    GAME	*game,
    Actor_info	*this,
    Actor_data	*player_actor_data
    );
/*-----------------------------------------------------------------------
 *
 *	デストラクト処理
 *
 *----------------------------------------------------------------------*/
extern void	Actor_info_dt(
    Actor_info	*this,
    GAME	*game
    );
/*-----------------------------------------------------------------------
 *
 *	動作処理
 *
 *----------------------------------------------------------------------*/
extern void	Actor_info_call_actor(
    GAME_PLAY	*game_play,
    Actor_info	*this
    );
/*-----------------------------------------------------------------------
 *
 *	描画処理
 *
 *----------------------------------------------------------------------*/
extern void	Actor_info_draw_actor(
    GAME_PLAY	*game_play,
    Actor_info	*this
    );

/*-----------------------------------------------------------------------
 *
 *	アクタークライアントがなくなったらメモリ解放する
 *
 *----------------------------------------------------------------------*/
#include "m_actor_dlftbls.h"	/* DLFTBL_ACTOR */

extern void	Actor_free_overlay_area(
    DLFTBL_ACTOR	*actor_dlftbl
    );
/*-----------------------------------------------------------------------
 *
 *	オーバーレイ転送領域の確保
 *
 *----------------------------------------------------------------------*/
extern void	Actor_get_overlay_area(
    DLFTBL_ACTOR	*actor_dlftbl,
    char		*actor_name,
    size_t		actor_segsize
    );

/************************************************************************
 *
 *	アクター発生
 *
 ************************************************************************/

/*-----------------------------------------------------------------------
 *
 *	アクタークラス初期化
 *
 *----------------------------------------------------------------------*/
extern void	Actor_init_actor_class(
    ACTOR		*actor,
    Actor_profile	*profilep,
    DLFTBL_ACTOR	*actor_dlftbl,
    GAME_PLAY		*game_play,
    int			bank_ID,
    float		x,
    float		y,
    float		z,
    short		sx,
    short		sy,
    short		sz,
    signed char		b_xnum,
    signed char		b_znum,
    short		mvaclist_no,
    mAc_nfs_t		table_no,
    short		arg_data
    );
/*-----------------------------------------------------------------------
 *
 *	Ａｃｔｏｒクラス追加
 *
 *----------------------------------------------------------------------*/
extern ACTOR *Actor_info_make_actor(
    Actor_info	*this,
    GAME	*game,
    short	profile,
    float	x,
    float	y,
    float	z,
    short	sx,
    short	sy,
    short	sz,
    signed char	b_xnum,
    signed char	b_znum,
    short	mvaclist_no,
    mAc_nfs_t	table_no,
    short	arg_data,
    signed char	npc_info_idx,
    int		bank_ID
);
/*-----------------------------------------------------------------------
 *
 *	子Ａｃｔｏｒクラス追加
 *
 *----------------------------------------------------------------------*/
extern ACTOR *Actor_info_make_child_actor(
    Actor_info	*this,
    ACTOR	*mother_actor,
    GAME	*game,
    short	profile,
    float	x,
    float	y,
    float	z,
    short	sx,
    short	sy,
    short	sz,
    short	mvaclist_no,
    mAc_nfs_t	table_no,
    short	arg_data,
    int		bank_ID
);
/*-----------------------------------------------------------------------
 *
 *	ＦＧデータ復帰
 *
 *----------------------------------------------------------------------*/
extern void	restore_fgdata_all(GAME_PLAY *game_play);

/*-----------------------------------------------------------------------
 *
 *	セーブ準備処理
 *
 *----------------------------------------------------------------------*/
extern void	Actor_info_save_actor(
    GAME_PLAY	*game_play
    );

/*-----------------------------------------------------------------------
 *
 *	Ａｃｔｏｒクラス削除
 *
 *----------------------------------------------------------------------*/
extern ACTOR *Actor_info_delete(
    Actor_info *this,
    ACTOR      *actor,
    GAME       *game
);

/*-----------------------------------------------------------------------
 *
 *	Ａｃｔｏｒ検索
 *
 *----------------------------------------------------------------------*/
extern ACTOR *Actor_info_name_search_sub(
    ACTOR	*chkActor,
    short	name		/* 探したいアクターの名前 */
);

extern ACTOR *Actor_info_name_search(
    Actor_info	*actor_info,
    short	name,		/* 探したいアクターの名前 */
    int		part		/* 探したいアクターの役柄 */
);

extern ACTOR *Actor_info_fgName_search_sub(
    ACTOR	*chkActor,
    mAc_nfs_t	name		/* 探したいアクターの名前 */
);

extern ACTOR *Actor_info_fgName_search(
    Actor_info	*actor_info,
    mAc_nfs_t	name,		/* 探したいアクターの名前 */
    int		part		/* 探したいアクターの役柄 */
);

/************************************************************************
 *
 *	シェイプ分解クラス
 *
 ************************************************************************/
/*
 * シェイプ分解クラス
 */
typedef struct {
    MtxF		*part_base;	/* パーツ スタート */
    short		*b_id;
    short		part_count;	/* パーツ カウント */
    unint		*shape_base;
    int			mtxfget_flg;
    int			old_joint_no;
} Break_work;

extern void Part_Break_init(Break_work *this,int joint_max, GAME *game);

/*-----------------------------------------------------------------------
 *
 *	ハイライト環境マッピング登録
 *
 *----------------------------------------------------------------------*/
extern Gfx *HiliteReflect_new(
    xyz_t  *object,
    xyz_t  *eye,
    xyz_t  *light_direction,
    GRAPH  *graph,
    Gfx	   *gfxp,
    Hilite **hilitep
);
/*-----------------------------------------------------------------------
 *
 *	ハイライト環境マッピング初期設定
 *
 *----------------------------------------------------------------------*/
extern Hilite *HiliteReflect_init(
    xyz_t *object,
    xyz_t *eye,
    xyz_t *light_direction,
    GRAPH *graph
);
/*-----------------------------------------------------------------------
 *
 *	ハイライト環境マッピング初期設定（半透明）
 *
 *----------------------------------------------------------------------*/
extern Hilite *HiliteReflect_xlu_init(
    xyz_t *object,
    xyz_t *eye,
    xyz_t *light_direction,
    GRAPH *graph
);
/*-----------------------------------------------------------------------
 *
 *	ハイライト環境マッピング初期設定（ライト）
 *
 *----------------------------------------------------------------------*/
extern Hilite *HiliteReflect_light_init(
    xyz_t *object,
    xyz_t *eye,
    xyz_t *light_direction,
    GRAPH *graph
);

/*---------------------------------------------------------------------------
 * 環境マッピング 光源の方向セット
 *-------------------------------------------------------------------------*/
extern void Setpos_HiliteReflect_init(xyz_t *,GAME_PLAY *);
extern void Setpos_HiliteReflect_xlu_init(xyz_t	*,GAME_PLAY *);
extern void Setpos_HiliteReflect_light_init(xyz_t *,GAME_PLAY *);






#if !defined(ROM_F)
extern void actor_name_show(ACTOR *actor, char *comment, int data);
#else
#define actor_name_show(a,c,d) (void)0/*NOP*/
#endif

/*
 * actor のセグメント名の文字列を取得する
 * これはデバッグ時専用である
 * これは文字列を返すがその長さは０かも知れない
 * このマクロを使用する場合は  
 * #include "z_actor_dlftbls.h"
 * もすること
 *
 * char *actor_GetSegName(Actor *a);
 */
#if defined(USE_ACTOR_NAME_TABLE)
#define actor_GetSegName(a) actor_dlftbl_GetSegName((DLFTBL_ACTOR *)(a)->dlftbl)
#else
#define actor_GetSegName(a) ""
#endif /* USE_ACTOR_NAME_TABLE */



#ifdef _LANGUAGE_C_PLUS_PLUS
} /* extern "C" */
#endif	/* _LANGUAGE_C_PLUS_PLUS */

#endif	/* INCLUDE_M_ACTOR_H */

    
/*** m_actor.h end ***/
