/*
 ******************************************************************************
 *
 *	環境設定
 *	$Id: m_kankyo.h,v 1.1 2003/06/06 00:15:12 tong Exp $
 ******************************************************************************
 */
#ifndef INCLUDE_M_KANKYO_H
#define INCLUDE_M_KANKYO_H

#ifdef _LANGUAGE_C_PLUS_PLUS
extern "C" {
#endif	/* _LANGUAGE_C_PLUS_PLUS */

//#include "m_types.h" /* 2000/9/18 otsuki */
#include "m_std_dma.h"
#include "m_lights.h"
#include "m_actor_h.h"


/************************************************************************
 *
 *	環境
 *
 ************************************************************************/
/*-----------------------------------------------------------------------

  時間	値
  00    0x0000      05    0x3556      10    0x6aab      15    0xa000      20    0xd556
  01	0x0aab      06    0x4000      11    0x7556	16    0xaaab	  21	0xe000
  02	0x1556      07    0x4aab      12    0x8001	17    0xb556	  22	0xeaab
  03	0x2001      08    0x5556      13    0x8aac	18    0xc001	  23	0xf556
  04	0x2aac      09    0x6000      14    0x9556	19    0xcaac	  24	0x0000

*------------------------------------------------------------------------*/

/*
 *	季節
 */
enum {
    SPRING,
    SUMMER,
    AUTUMN,
    WINTER,

    FOURSEASONS_IN_A_YEAR
};

/*
 *	月
 */
enum {
    JANUARY = 1,
    FEBRUARY,
    MARCH,
    APRIL,
    MAY,
    JUNE,
    JULY,
    AUGUST,
    SEPTEMBER,
    OCTOBER,
    NOVEMBER,
    DECEMBER,

    TWELVEMONTH
};

/*
 *	日付
 */
enum {
    DAY_01 = 1, DAY_02, DAY_03, DAY_04,
    DAY_05, DAY_06, DAY_07, DAY_08, DAY_09,
    DAY_10, DAY_11, DAY_12, DAY_13, DAY_14,
    DAY_15, DAY_16, DAY_17, DAY_18, DAY_19,
    DAY_20, DAY_21, DAY_22, DAY_23, DAY_24,
    DAY_25, DAY_26, DAY_27, DAY_28, DAY_29,
    DAY_30, DAY_31
};

/*
 *	曜日
 */
enum {
    SUNDAY,
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,

    SEVENDAYS_IN_A_WEEK
};

/*
 *	時間
 */
enum {
    TIME_00, TIME_01, TIME_02, TIME_03, TIME_04, TIME_05,
    TIME_06, TIME_07, TIME_08, TIME_09, TIME_10, TIME_11,
    TIME_12, TIME_13, TIME_14, TIME_15, TIME_16, TIME_17,
    TIME_18, TIME_19, TIME_20, TIME_21, TIME_22, TIME_23,
    TIME_ED
};

/*
 *
 */
/* １分＝６０秒 */
#define	SEC_1_MIN	(60)
/* １時間＝６０分 */
#define	MIN_1_HOUR	(60)
/* １日＝２４時間 */
#define	HOUR_1_DAY	(24)
/* １時間＝３６００秒 */
#define	SEC_1_HOUR	(SEC_1_MIN * MIN_1_HOUR)
/* １日＝８６４００秒 */
#define	SEC_1_DAY	(SEC_1_HOUR * HOUR_1_DAY)
/* １日＝１４４０分 */
#define	MIN_1_DAY	(MIN_1_HOUR * HOUR_1_DAY)
/* １月＝３１日 */
#define	DAY_1_MONTH	(31)
/* １年＝１２月 */
#define	MONTH_1_YEAR	(12)

/*
 *	時間（秒表示）
 */
enum {
    TIME_00_S = TIME_00 * SEC_1_HOUR,
    TIME_01_S = TIME_01 * SEC_1_HOUR,
    TIME_02_S = TIME_02 * SEC_1_HOUR,
    TIME_03_S = TIME_03 * SEC_1_HOUR,
    TIME_04_S = TIME_04 * SEC_1_HOUR,
    TIME_05_S = TIME_05 * SEC_1_HOUR,
    TIME_06_S = TIME_06 * SEC_1_HOUR,
    TIME_07_S = TIME_07 * SEC_1_HOUR,
    TIME_08_S = TIME_08 * SEC_1_HOUR,
    TIME_09_S = TIME_09 * SEC_1_HOUR,
    TIME_10_S = TIME_10 * SEC_1_HOUR,
    TIME_11_S = TIME_11 * SEC_1_HOUR,
    TIME_12_S = TIME_12 * SEC_1_HOUR,
    TIME_13_S = TIME_13 * SEC_1_HOUR,
    TIME_14_S = TIME_14 * SEC_1_HOUR,
    TIME_15_S = TIME_15 * SEC_1_HOUR,
    TIME_16_S = TIME_16 * SEC_1_HOUR,
    TIME_17_S = TIME_17 * SEC_1_HOUR,
    TIME_18_S = TIME_18 * SEC_1_HOUR,
    TIME_19_S = TIME_19 * SEC_1_HOUR,
    TIME_20_S = TIME_20 * SEC_1_HOUR,
    TIME_21_S = TIME_21 * SEC_1_HOUR,
    TIME_22_S = TIME_22 * SEC_1_HOUR,
    TIME_23_S = TIME_23 * SEC_1_HOUR,
    TIME_ED_S = TIME_ED * SEC_1_HOUR
};

       
/************************************************************************
 *
 *	環境クラス
 *
 ************************************************************************/
/*-----------------------------------------------------------------------
 *
 *	「ライト」
 *
 *----------------------------------------------------------------------*/
typedef struct {
    unchar		amb_col[RGB_NUM];	/* Ambient ライトカラー      */
    signed   char	sun_vec[XYZ];		/* Diffuse（日）ポジション   */
    unchar		sun_col[RGB_NUM];	/*         ライトカラー      */
    signed   char	moon_vec[XYZ];		/* Diffuse（月）ポジション   */
    unchar		moon_col[RGB_NUM];	/*              ライトカラー */
    unchar		fog_col[RGB_NUM];	/* フォグカラー 	     */
    short		fog_near;		/* フォグ 近さ		     */
    short		fog_far;		/* フォグ 奥行き	     */
    unchar		shadow_col[RGB_NUM];	/* 影カラー		     */
    unchar		room_col[RGB_NUM];	/* 部屋のカラー		     */
    unchar		window_suncol[RGB_NUM];	/* さしこむ光 太陽	     */
    unchar		window_mooncol[RGB_NUM];/* さしこむ光 月	     */
    unchar		fill_col[RGB_NUM];	/* 背景色		     */
} Light_info;

/*
 *
 */
typedef struct {
    signed short	amb_col[RGB_NUM];	/* アンビエントライトカラー */
    signed short	dif_col[RGB_NUM];	/* ディフューズライトカラー */
    signed short	fog_col[RGB_NUM];	/* フォグカラー 	    */
    short		fog_near;		/*       近さ		    */
    short		fog_far;		/*       奥行き		    */
} Add_light;

/*-----------------------------------------------------------------------
 *
 *	自然の影響クラス
 *
 *----------------------------------------------------------------------*/
typedef void	(*NATURE_PR)(ACTOR *);

typedef struct {
    NATURE_PR	proc;			/* 自然の影響処理関数		*/
    void	*arg_ptr;		/* 使い回しポインター		*/

} Nature_c;

/*-----------------------------------------------------------------------
 *
 *	環境クラス
 *
 *----------------------------------------------------------------------*/
typedef struct {
    Light_data	sun_light;		/* 太陽光			*/
    Light_data	moon_light;		/* 月光(反対)			*/
    Light_data	*lamp_light;		/* ランプ光			*/
    Light_data	point_light;		/* ポイントライト		*/
    float	point_parcent;		/* ポイントライト影響率		*/

    dma_t	dma;			/* メモリ転送関係		*/
    OSMesgQueue	mq;			/*				*/
    OSMesg	m;			/*				*/
    Add_light	add_light;		/* 画面効果用ライト加算値	*/
    float	add_light_pst;		/* 画面効果用ライト影響率	*/

    Light_info	base_light;		/* ベースライト			*/

    unchar	sound_status;		/* 音楽変化ステータス		*/

    unchar	rect_pattern;		/* レクトアングルの表示位置設定	*/
    unchar	rectcol_[RGBA];		/* レクトアングルの色  RGBA	*/

    float	shadowPos;		/* 影の移動量			*/
    unchar	shadowAlpha;		/* 影のアルファ			*/

    unchar	cd_count;		/* カウントダウン用		*/
    unshort	pad_s;

    Nature_c	nature;			/* 自然の影響			*/

} Kankyo;

/************************************************************************
 *
 *	関数宣言
 *
 ************************************************************************/
/*環境のコンストラクト*/
extern void	Global_kankyo_ct(
    GAME	*game,
    Kankyo	*this);

/*環境のセット*/
extern void	Global_kankyo_set(
    GAME_PLAY		*gplay,
    Kankyo		*this,
    Global_light	*this3);

/*部屋のＢＧ描画用カラー設定*/
extern void	Global_kankyo_set_room_prim(
    GAME	*game
    );

/*雨降りの表示 		m_play.cで呼ばれている*/
extern void	rain_disp(
    GAME_PLAY	*gplay,
    View	*view,
    GRAPH	*graph);

/* m_play.cで呼ばれている*/
extern long	zmem2z(
    long	zmem /* 18bit */);

/* 画面フィルター(画面に膜をつける) */
extern void	Display_Filter(
    GRAPH	*graph,
    unchar	r,
    unchar	g,
    unchar	b,
    unchar	a,
    unchar	mode
    );



/* ランダムで風向きを決定する */
extern void mEnv_DecideWindDirect(s_xyz	*wind_direct,
				  short	x_angle_width,
				  short	z_angle_width );
#define mEnv_DecideWindDirect2(wind_direct)	\
(mEnv_DecideWindDirect(wind_direct,0x3000, 0x3000))
#define mEnv_WIND_SCALAR	(100)
#define mEnv_WIND_SCALAR_F	((float)mEnv_WIND_SCALAR)
#define mEnv_WIND_SCALAR_FRAC_F	(1.0F/mEnv_WIND_SCALAR_F)

/* 天気の決定 */
extern void mEnv_RandomWeather(short	*next_weather,
			       short	*next_level );
/* ゲームスタート時に天気をランダムで決定する */
extern void mEnv_DecideWeather_GameStart( void );
extern void mEnv_DecideWeather_FirstGameStart( void );
extern void mEnv_DecideWeather_NormalGameStart( void );

extern void	staffroll_light_init( GAME_PLAY	*game_play );
extern void	staffroll_light_proc_start( GAME_PLAY	*game_play );
extern int	staffroll_light_proc_end( GAME_PLAY	*game_play );
extern void	staffroll_light_dt( GAME_PLAY	*game_play );

/*
 * 天気を調べる
 */
extern int
mEnv_NowWeather( void );

/*
 * 窓の光用 外でのライトの光と連動用アルファの取得
 */
extern float mKK_windowlight_alpha_get( void );

#if 0
/*
******************************************************************************
 *	今だけ欲しい!!!
 *	現在の野外のライトカラーを獲得
 ******************************************************************************
 */
extern void
mEnv_GetOutdoorLight(
    rgba_t	*light );

#endif

/* シーンその場切替  とりあえず(おがわ）   */
extern int      event_goto_other_scene(
    GAME_PLAY   *game_play
    );

/*
 *	自然の影響関数登録
 */
extern void	mEnv_regist_nature(
    Kankyo	*kankyo,
    NATURE_PR	proc,
    void	*arg_ptr
    );

/*
 *	自然の影響関数削除
 */
extern int	mEnv_unregist_nature(
    Kankyo	*kankyo,
    NATURE_PR	proc
    );

/* 天気を知る(室内でも雨雪を正確に) */
#define mEnv_NowWeather_real	(ZCommonGet(weather.weather))

/*
 ******************************************************************************
 *	影にライトの影響を受けさせるＰＲＩＭ取得
 ******************************************************************************
 */
extern void
mEnv_GetShadowPrimColor_Light(
    unchar	*r,
    unchar	*g,
    unchar	*b,
    GAME	*game
    );


/* 以降
 * 風船と風見鶏のための風情報取得 ＥＴＣ... */
/*------------------------------------------------------*
 *							*
 * 風情報の取得						*
 *							*
 *------------------------------------------------------*/
/* 風向きの取得 */
extern short
mEnv_GetWindAngleS( void );
/* 風力の取得（0.0〜1.0です）*/
extern float
mEnv_GetWindPowerF( void );
/*------------------------------------------------------*
 *							*
 * 風の更新						*
 *							*
 *------------------------------------------------------*/
extern void
mEnv_ChangeWind( void );
/*------------------------------------------------------*
 *							*
 * 風の動作						*
 * 目的の風の強さに向かいます				*		
 *							*
 *------------------------------------------------------*/
extern void
mEnv_WindMove( void );

/*------------------------------------------------------*
 *							*
 * ポイントライトがついている部屋なのかチェック		*
 *							*
 *------------------------------------------------------*/
extern unsigned char
mEnv_Pointlight_on_check( void );


#ifdef _LANGUAGE_C_PLUS_PLUS
} /* extern "C" */
#endif	/* _LANGUAGE_C_PLUS_PLUS */

#endif	/* INCLUDE_M_KANKYO_H */
/*** m_kankyo.h end ***/
