/*
 ******************************************************************************
 *
 *	ゼルダゲームプレイ
 *	$Id: m_play.h,v 1.1 2003/06/06 00:15:12 tong Exp $
 ******************************************************************************
 */
#ifndef INCLUDE_M_PLAY_H
#define INCLUDE_M_PLAY_H

#ifdef _LANGUAGE_C_PLUS_PLUS
extern "C" {
#endif	/* _LANGUAGE_C_PLUS_PLUS */

#include "m_play_h.h"
#include "sys_segment.h"
#include "m_scene.h"
#include "m_actor.h"
#include "m_kankyo.h"
#include "m_types.h"
#include "m_field_make.h"
#include "m_camera2.h"
#include "m_submenu.h"
#include "m_lights.h"		/* Global_light */
#include "m_player_h.h"
#include "m_collision_obj_type.h"
#include "PreRender.h"		/* PreRender_t */
#include "m_fbdemo_wipe.h"	/* fbdemo */
#include "m_rigid_type.h"

#include "m_event.h"

#include "evw_anime.h"
    
#define	GAME_PLAY_FRAME		(2)
#define EFFECT_SS_TABLE_SIZE    (85)


/*
 *
 *	アイテムテーブル取得クラス
 *
 */
typedef struct {
    signed char	b_xnum;		/* ブロックの X方向番号 */
    signed char	b_znum;		/* ブロックの Z方向番号 */
    short	pad_s;		/* ＜空き＞ */
    float	xpos;		/* ブロックの左肩X座標 */
    float	zpos;		/* ブロックの左肩Z座標 */
    mAc_nfs_t	*block;		/* ブロックテーブルのポインター */
} blktbl_c;

typedef struct {
    int		num;
    blktbl_c	blk_tbl[mFM_DRAW_AREA];
} getittbl_c;


/*
 *
 *	フェード関係
 *
 */
/*
 *	フェードタイプ
 */
enum {
    /* 通常 */
    GAME_PLAY_FADE_STOP,
    /* フェードイン */
    GAME_PLAY_FADE_IN,
    /* ＮｅｘｔＧｏＴｏフェードアウト */
    GAME_PLAY_FADE_OUT,
    /* ファミコンエミュへのフェードアウト */
    GAME_PLAY_FADE_OUT_START_EMU,
    /* プレイヤーセレクトから戻る時のフェードアウト */
    GAME_PLAY_FADE_OUT_RETURN_TITLE,
    /* 汽車に乗ってゲームを終わるときのフェードアウト */
    GAME_PLAY_FADE_OUT_GAME_END_TRAIN,
    /* 自宅でゲームを終わるときのフェードアウト		*/
    GAME_PLAY_FADE_OUT_GAME_END,
    /* ゲーム中 */
    GAME_PLAY_FADE_LOCK,
    /* 客待デモからプレイヤーセレクトへのフェードアウト */
    GAME_PLAY_FADE_SELECT,
    /* ＢＧＭフェード待ち付フェードアウト		*/
    GAME_PLAY_FADE_BGMFADE_SELECT,
    /* 客待デモからNキューブへ				*/
    GAME_PLAY_FADE_DEMOLOOP,
    /* Seフェード待ち無しフェードアウト			*/
    GAME_PLAY_FADE_SENOFADE_SELECT,

    GAME_PLAY_FADE_ALL_TYPES
};

/*
 *	ワイプタイプ
 */
enum {
    WIPE_NORMAL_TYPE_e,		/* ノーマルワイプ		*/
    WIPE_TRIFORCE_TYPE_e,	/* 円ワイプ(中央)		*/
    WIPE_FADE_WHITE_TYPE_e,	/* フェード（白）		*/
    WIPE_FADE_BLACK_TYPE_e,	/* フェード（黒）		*/
    WIPE_STEND_TYPE_e,		/* 円ワイプ（左）		*/
    WIPE_MARU_RIGHT_TYPE_e,	/* 円ワイプ（右）		*/
    WIPE_FADE_EVENT_TYPE_e,	/* イベント告知フェード		*/
    WIPE_ALL_TYPES
};

#define	WIPE_DEFINE_EXIT	WIPE_TRIFORCE_TYPE_e
#define	WIPE_DEFINE_TRAIN	WIPE_STEND_TYPE_e
#define	WIPE_DEFINE_LEFT	WIPE_STEND_TYPE_e
#define	WIPE_DEFINE_RIGHT	WIPE_MARU_RIGHT_TYPE_e
#define	WIPE_DEFINE_EVENT	WIPE_FADE_EVENT_TYPE_e
#define	WIPE_DEFINE_NEKO	WIPE_FADE_BLACK_TYPE_e

/*
 *	ワイプ動作モード(fbdemo_wipe_mode)
 */
enum {
    WIPE_MODE_IDLE_e,			/* 待機中		*/
    WIPE_MODE_CREATE_e,			/* クリエイト		*/
    WIPE_MODE_INIT_e,			/* 初期化		*/
    WIPE_MODE_MOVE_e,			/* 動作中		*/

    WIPE_ALL_MODE
};

/*
 *	フレームバッファデモモード
 */
enum {
    FBDEMO_MODE_IDLE_e,		/* なし		*/
    FBDEMO_MODE_TAKEIN_e,	/* 取り込み	*/
    FBDEMO_MODE_INIT_e,		/* 初期化	*/
    FBDEMO_MODE_MOVE_e		/* メイン	*/
};

/************************************************************************
 *
 *	ゲームプレイ クラス
 *
 ************************************************************************/
struct Game_play_cl {
    GAME		g;			/* 基底クラス */

    short		scene_data_ID;		/* シーンデータＮｏ */

    blktbl_c		block_table;		/* 現在表示しているブロックの情報 */
    blktbl_c		before_block_table;	/* 以前表示してたブロックの情報 */

    char		*keepSegment;		/* 常駐バンクセグメントポインタ */
    char		*exchange_keepSegment;	/* 入れ替え常駐バンクセグメントポインタ */
    char		*sceneSegment;		/* シーンデータセグメントポインタ */
    Object_Exchange	object_exchange;	/* オブジェクト入れ替えバンク情報 */

    View		view;			/* ビュワークラス */
    CAMERA2		camera2;		/* 新カメラクラス */

    Kankyo		kankyo;			/* 環境クラス */
    Global_light	global_light;		/* 環境ライトクラス */
    Pause		pause;			/* ポーズクラス */

    Actor_info		actor_info;		/* Ａｃｔｏｒ情報 */

    Submenu_c		submenu;			/* サブメニュークラス */
    signed char		submenu_now_ground_Index;	/* 現在どちらのバンクをプログラムが使用しているか */
    MemPtr		submenu_ground_tex_p_tbl[2];	/* ウインドウ本体のテクスチャバンクポインタ待避領域 */
    MemPtr		submenu_ground_pallet_p_tbl[2];	/* ウインドウ本体のパレットバンクポインタ待避領域 */
    PreRender_t 	prerender_submenu;

    Door_Info		door_info;		/* ドアデータポインタ */
    Scene_No		next_scene_no;		/* 切り替えシーンＮｏ */

    MtxF		projection_matrix;	/* 投影行列 */
    MtxF		softsprite_matrix;	/* ソフトスプライト用回転逆行列	*/
    Mtx			*softsprite_mtx;	/* ＲＣＰ用ソフトスプライト用回転逆行列ポインタ */

    unlong		game_frame_counter;	/* ゲームフレームカウンター */

    unchar		actor_stop_flag;	/* アクター停止フラグ */
    unchar		actor_set_num;		/* アクターセット数 */
    unchar		ctrl_actor_set_num;	/* 制御アクターセット数 */
    unchar		pool_bank_sum;		/* シーンデータからの入れ替えデータバンクの数 */
    Actor_data		*player_data;		/* プレイヤーデータポインタ */
    Actor_data		*actor_data;		/* アクターデータポインタ */
    short		*ctrl_actor_data;	/* 制御アクターデータポインタ*/
    Object_Bank		*pool_bank;		/* シーンデータからの入れ替えデータバンク */

    EvwAnimeInfo	*evw_anime_data;	/* シェイプアニメーションデータポインタ */

    EVENT               event;			/* イベント */
    
    unchar		fade_type;		/* フェードタイプ */
    u8			wipe_type; 		/* ワイプタイプ 7bit */
    u8			fbdemo_mode;		/* フレームバッファデモモード */
    u8	 		fbdemo_wipe_mode;	/* ワイプ動作モード */
    fbdemo_wipe_t 	fbdemo_wipe;		/* ワイプデータ */
    fbdemo_fade_t 	ColorFilter;		/* 画面フラッシュ */

    CollisionCheck	collision_check;	/* コリジョンチェック処理構造体 */

    DRAW_CHK_PROC	draw_chk_proc;		/* アクター描画チェック関数ポインタ */

    rgba8888_u_t	fade_color;		/* フェードカラー＆α */

#ifdef PLAY_ADJUST		/* リコンパイルなしで追加可能 */
#define PLAY_ADJUST_SIZE 512
    /*
     * 追加用
     */

    /*Scene_Data_Status*/void *scene_data_statusp;
    char filler[PLAY_ADJUST_SIZE - sizeof(/*Scene_Data_Status*/void *) - sizeof(rgba8888_u_t)];/* ダミーエリア */
#endif	/* PLAY_ADJUST */
};

/*-----------------------------------------------------------------------
 *
 *	ゲームクラスメンバー獲得マクロ
 *
 *----------------------------------------------------------------------*/
#define	GET_CAMERA2_IN_GAME_PLAY(game_play_p) 	((game_play_p)->camera2)

/*-----------------------------------------------------------------------
 *
 *	ゲームプレイ初期設定
 *
 *----------------------------------------------------------------------*/
extern void	play_init(
    GAME	*game
    );

/*-----------------------------------------------------------------------
 *
 *	ゲームプレイクリーンナップ
 *
 *----------------------------------------------------------------------*/
extern void	play_cleanup(
    GAME	*game
    );

/*-----------------------------------------------------------------------
 *
 *	ゲームプレイ
 *
 *----------------------------------------------------------------------*/
extern void	play_main(
    GAME	*game
    );




#ifdef _LANGUAGE_C_PLUS_PLUS
} /* extern "C" */
#endif	/* _LANGUAGE_C_PLUS_PLUS */


#endif	/* INCLUDE_M_PLAY_H */

/*** m_play.h ***/
