/*
 * $Id: z_lib.h,v 1.1.1.1 2003/01/17 21:07:17 tong Exp $
 *	
 * $Log: z_lib.h,v $
 * Revision 1.1.1.1  2003/01/17 21:07:17  tong
 * ZELDA-OCARINA OF TIME (20L) build from Nintendo
 *
 * Revision 2.1  1998/10/22  12:17:25  zelda
 * ＲＯＭ出しバージョン(NTSC)
 *
 * Revision 1.50  1998/10/15 08:23:16  iwawaki
 * *** empty log message ***
 *
 * Revision 1.1  1998-10-15 03:07:50+09  iwawaki
 * Initial revision
 *
 * Revision 1.49  1998-10-10 16:37:42+09  morita
 * *** empty log message ***
 *
 * Revision 1.48  1998-10-08 16:18:42+09  morita
 * *** empty log message ***
 *
 * Revision 1.47  1998-10-08 16:14:48+09  morita
 * *** empty log message ***
 *
 * Revision 1.46  1998-09-09 09:24:11+09  matutani
 * includeし忘れ
 *
 * Revision 1.45  1998-09-08 23:57:47+09  matutani
 * xyz_t_move_s_xyz()追加
 *
 * Revision 1.44  1998-09-08 23:26:04+09  matutani
 * xyz_t_sub_ss(),xyz_t_mult_v()追加
 *
 * Revision 1.43  1998-09-02 13:59:52+09  matutani
 * rgba_to_move()を追加
 *
 * Revision 1.42  1998-08-26 13:52:45+09  morita
 * *** empty log message ***
 *
 * Revision 1.41  1998-08-17 11:45:56+09  hayakawa
 * pad_tを使ってるくせにpad.hをincludeしてないためにエラーですね
 *
 * Revision 1.40  1998-06-25 15:32:33+09  nisiwaki
 * add_calc_short_angle3 削除
 *
 * Revision 1.39  1998-06-09 16:30:00+09  nisiwaki
 * add_calc_short_angle3 を 追加
 *
 * Revision 1.38  1998-06-06 14:52:21+09  morita
 * *** empty log message ***
 *
 * Revision 1.37  1998-06-01 22:34:52+09  iwawaki
 * *** empty log message ***
 *
 * Revision 1.36  1998-05-18 20:21:24+09  hayakawa
 * rad_to_angle２段キャストによりワーニングでないようにした
 *
 * Revision 1.35  1998-04-21 10:20:55+09  morita
 * *** empty log message ***
 *
 * Revision 1.34  1998/04/20 06:21:37  morita
 * *** empty log message ***
 *
 * Revision 1.33  1998/03/25 11:54:18  yoshida
 * Ｃ＋＋からのインクルードに対応
 *
 * Revision 1.32  1998/02/23  07:23:20  iwawaki
 * *** empty log message ***
 *
 * Revision 1.31  1997/11/13  17:07:12  iwawaki
 * *** empty log message ***
 *
 * Revision 1.30  1997/08/18  12:21:32  morita
 * *** empty log message ***
 *
 * Revision 1.29  1997/08/13  05:54:13  iwawaki
 * *** empty log message ***
 *
 * Revision 1.28  1997/07/05  11:24:43  iwawaki
 * *** empty log message ***
 *
 * Revision 1.27  1997/07/05  10:48:08  iwawaki
 * *** empty log message ***
 *
 * Revision 1.26  1997/06/05  07:54:57  morita
 * add_calc_short_angle 実験中
 *
 * Revision 1.25  1997/06/05  00:34:08  iwawaki
 * *** empty log message ***
 *
 * Revision 1.24  1997/04/25  01:58:26  tarukado
 * add_calc & add_calc_a を追加
 *
 * Revision 1.23  1997/04/14  05:21:10  iwawaki
 * *** empty log message ***
 *
 * Revision 1.22  1997/04/14  02:55:31  iwawaki
 * *** empty log message ***
 *
 * Revision 1.21  1997/04/14  02:15:38  iwawaki
 * *** empty log message ***
 *
 * Revision 1.20  1997/04/12  12:08:53  iwawaki
 * *** empty log message ***
 *
 * Revision 1.19  1997/03/14  00:34:59  hayakawa
 * 基本ヘッダu64basic.hから、math64.hを削除したので、その対処
 *
 * Revision 1.18  1997/03/06  00:45:46  iwawaki
 * *** empty log message ***
 *
 * Revision 1.17  1997/03/04  09:43:51  iwawaki
 * *** empty log message ***
 *
 * Revision 1.16  1997/03/03  02:06:02  iwawaki
 * *** empty log message ***
 *
 * Revision 1.15  1997/02/14  07:45:01  iwawaki
 * *** empty log message ***
 *
 * Revision 1.14  1997/02/14  02:44:58  iwawaki
 * *** empty log message ***
 *
 * Revision 1.13  1997/02/13  00:45:12  iwawaki
 * *** empty log message ***
 *
 * Revision 1.12  1997/02/12  12:42:02  iwawaki
 * *** empty log message ***
 *
 * Revision 1.11  1997/02/12  11:40:08  iwawaki
 * *** empty log message ***
 *
 * Revision 1.10  1996/11/25  10:25:16  iwawaki
 * *** empty log message ***
 *
 * Revision 1.9  1996/11/20  01:30:57  iwawaki
 * 座標のサーチ関数追加
 *
 * Revision 1.8  1996/11/18  12:31:58  iwawaki
 * *** empty log message ***
 *
 * Revision 1.7  1996/10/18  08:27:08  iwawaki
 * *** empty log message ***
 *
 * Revision 1.6  1996/10/17  06:59:00  iwawaki
 * chase_f3追加
 *
 * Revision 1.5  1996/10/04  11:15:51  iwawaki
 * bitreverse追加
 *
 * Revision 1.4  1996/10/04  06:12:22  iwawaki
 * bitcheck追加
 *
 * Revision 1.3  1996/10/02  05:14:40  iwawaki
 * shape change
 *
 * Revision 1.2  1996/09/18  09:16:58  iwawaki
 * $Log追加
 * */


#ifndef INCLUDE_Z_LIB_H
#define INCLUDE_Z_LIB_H

#ifdef _LANGUAGE_C_PLUS_PLUS
extern "C" {
#endif

#include "math64.h"		/* 浮動小数演算関係 */
#include "pad.h"		/* pad_t */
#include "z_types.h"
    
/************************************************************************
 *
 *	ライブラリー
 *
 ************************************************************************/

/*-----------------------------------------------------------------------
 *
 *	符号チェック
 *
 *----------------------------------------------------------------------*/
#define	signd(xx)		((xx) >= 0 ? 1 : -1) 
#define	signf(xx)		((xx) >= 0.0f ? 1.0f : -1.0f) 

/*-----------------------------------------------------------------------
 *
 *	ビットセット
 *
 *----------------------------------------------------------------------*/
#define	bitset(xx, yy)		((xx) |= (yy)) 

/*-----------------------------------------------------------------------
 *
 *	ビットクリアー
 *
 *----------------------------------------------------------------------*/
//#define	bitclr(xx, yy)		((xx) &= (yy) ^ 0x7fffffff) 
#define	bitclr(xx, yy)		((xx) &= ~(yy)) 

/*-----------------------------------------------------------------------
 *
 *	ビット反転
 *
 *----------------------------------------------------------------------*/
#define	bitreverse(xx, yy)	((xx) ^= (yy)) 

/*-----------------------------------------------------------------------
 *
 *	ビットチェック
 *
 *----------------------------------------------------------------------*/
#define	bitcheck(xx, yy)	((xx) & (yy)) 

/*-----------------------------------------------------------------------
 *
 *	ラジアンからＳＨＯＲＴ型角度へ
 *
 *----------------------------------------------------------------------*/
#define	rad_to_angle(xx)	((short)(int)((xx) * (65536.0f/(F_PI*2.0f))))

/*-----------------------------------------------------------------------
 *
 *	度からＳＨＯＲＴ型角度へ
 *
 *----------------------------------------------------------------------*/
#define	deg_to_angle(xx)	((short)((xx) * (65536.0f/360.0f)))

/*-----------------------------------------------------------------------
 *
 *	ＳＨＯＲＴ型角度範囲計算
 *
 *----------------------------------------------------------------------*/
#define	distance_angle(xx, yy)	((short)((xx) - (yy))) 

/*-----------------------------------------------------------------------
 *
 *	メモリークリアー
 *
 *----------------------------------------------------------------------*/
extern void mem_clear(
    unsigned char *mem,
    size_t size,
    unsigned char clear_data
);

/*-----------------------------------------------------------------------
 *
 *	ＣＯＳ
 *
 *----------------------------------------------------------------------*/
extern float cos_s(
    short angle
);

/*-----------------------------------------------------------------------
 *
 *	ＳＩＮ
 *
 *----------------------------------------------------------------------*/
extern float sin_s(
    short angle
);

/*-----------------------------------------------------------------------
 *
 *	目的値へ
 *
 *----------------------------------------------------------------------*/
extern int chase_angle(
    short *my,
    short aim,
    short step
);

/*-----------------------------------------------------------------------
 *
 *	目的値へ
 *
 *----------------------------------------------------------------------*/
extern int chase_s(
    short *my,
    short aim,
    short step
);

/*-----------------------------------------------------------------------
 *
 *	目的値へ
 *
 *----------------------------------------------------------------------*/
extern int chase_f(
    float *my,
    float aim,
    float step
);

/*-----------------------------------------------------------------------
 *
 *	目的値へ（可変目的値）
 *
 *----------------------------------------------------------------------*/
extern int chase_angle2(
    short *my,
    short aim,
    short step
);

/*-----------------------------------------------------------------------
 *
 *	目的値へ（可変目的値）
 *
 *----------------------------------------------------------------------*/
extern int chase_s2(
    short *my,
    short aim,
    short step
);

/*-----------------------------------------------------------------------
 *
 *	目的値へ
 *
 *----------------------------------------------------------------------*/
extern int chase_s3(
    short *my,
    short aim,
    short step
);

/*-----------------------------------------------------------------------
 *
 *	目的値へ（可変目的値）
 *
 *----------------------------------------------------------------------*/
extern int chase_f2(
    float *my,
    float aim,
    float step
);

/*-----------------------------------------------------------------------
 *
 *	目的値へ
 *
 *----------------------------------------------------------------------*/
extern int chase_f3(
    float *my,
    float aim,
    float add_step,
    float sub_step
);

/*-----------------------------------------------------------------------
 *
 *	最大,最小チェック
 *
 *----------------------------------------------------------------------*/
#define	min_max_limit(xx, min, max)	((xx) < (min) ? (min) : ((xx) > (max) ? (max) : (xx)))

/*-----------------------------------------------------------------------
 *
 *	最大チェック
 *
 *----------------------------------------------------------------------*/
#define	max_limit(xx, max)	((xx) > (max) ? (max) : (xx))

/*-----------------------------------------------------------------------
 *
 *	最小チェック
 *
 *----------------------------------------------------------------------*/
#define	min_limit(xx, min)	((xx) < (min) ? (min) : (xx))

/*-----------------------------------------------------------------------
 *
 *	スティックコントロール情報セット
 *
 *----------------------------------------------------------------------*/
extern void stick_ratio_set(
    float	*lenght,		/* スティック入力長さ */
    short	*angle,		/*               方向 */
    pad_t	*pad 
);

/*-----------------------------------------------------------------------
 *
 *	ランダム符号セット
 *
 *----------------------------------------------------------------------*/
#define	rnd_sign()	(rnd() < 0.5f ? -1 : 1)

/*-----------------------------------------------------------------------
 *
 *	ランダムタイマーセット
 *
 *----------------------------------------------------------------------*/
#define	get_random_data(\
    min_timer,\
    random_timer\
)\
(\
    get_random_timer(min_timer, random_timer)\
)
    
extern short get_random_timer(
    short min_timer,
    short random_timer
);

/*-----------------------------------------------------------------------
 *
 *	パターンランダムタイマーセット
 *
 *----------------------------------------------------------------------*/
#define	get_random_pattern_data(\
    min_time,\
    random_time,\
    pattern_no\
)\
(\
    get_random_pattern_timer(time, random_time, pattern_no)\
)
    
extern short get_random_pattern_timer(
    short min_time,
    short random_time,
    short pattern_no
);

/*-----------------------------------------------------------------------
 *
 *	ＸＹＺ代入
 *
 *----------------------------------------------------------------------*/
extern void xyz_t_move(
    xyz_t *p1,
    xyz_t *p2
);

/*-----------------------------------------------------------------------
 *
 *	ＸＹＺ代入 s_xyz
 *
 *----------------------------------------------------------------------*/
extern void xyz_t_move_s_xyz(
    xyz_t *p1,
    s_xyz *ps2
    );

/*-----------------------------------------------------------------------
 *
 *	ＸＹＺ同士の加算
 *
 *----------------------------------------------------------------------*/
extern void xyz_t_add(
    xyz_t *p1,
    xyz_t *p2,
    xyz_t *p3
);

/*-----------------------------------------------------------------------
 *
 *	ＸＹＺ同士の減算
 *
 *----------------------------------------------------------------------*/
extern void xyz_t_sub(
    xyz_t *p1,
    xyz_t *p2,
    xyz_t *p3
);

/*==========================================================================
 *
 * 減算処理
 * s_xyz - s_xyz = xyz_t
 *
 *=========================================================================*/
extern void xyz_t_sub_ss(
    xyz_t *p1,
    s_xyz *s1,
    s_xyz *s2);

/*===========================================================================
 *
 * 乗算(float)
 * vをxyzに乗算します。
 *
 *=========================================================================*/
extern void xyz_t_mult_v(
    xyz_t *p,
    float v);

/*-----------------------------------------------------------------------
 *
 *	サーチ座標３Ｄ距離計算
 *
 *----------------------------------------------------------------------*/
extern float search_position_distance(
    xyz_t *my_position,
    xyz_t *target_position
);

/*-----------------------------------------------------------------------
 *
 *	サーチ座標３Ｄ距離計算
 *
 *----------------------------------------------------------------------*/
extern float search_position_distance2(
    xyz_t *my_position,
    xyz_t *target_position,
    xyz_t *distance
);

/*-----------------------------------------------------------------------
 *
 *	サーチ座標ＸＺ平面距離計算
 *
 *----------------------------------------------------------------------*/
extern float search_position_distanceXZ(
    xyz_t *my_position,
    xyz_t *target_position
);

/*-----------------------------------------------------------------------
 *
 *	サーチ座標Ｙ距離計算
 *
 *----------------------------------------------------------------------*/
extern float search_position_high(
    xyz_t *my_position,
    xyz_t *target_position
);

/*-----------------------------------------------------------------------
 *
 *	サーチ座標ＸＺ平面方向計算
 *
 *----------------------------------------------------------------------*/
extern short search_position_angleY(
    xyz_t *my_position,
    xyz_t *target_position
);

/*-----------------------------------------------------------------------
 *
 *	サーチ座標ＹＺ平面方向計算
 *
 *----------------------------------------------------------------------*/
extern short search_position_angleX(
    xyz_t *my_position,
    xyz_t *target_position
);
/*======================================================================*
 *	減速接近計算     						*
 *======================================================================*/
extern float add_calc(
    float *a,
    float  b,
    float  p,
    float max,
    float min
);

extern void add_calc2(
    float *a,
    float  b,
    float  p,
    float max
);
extern void add_calc0(
    float *a,
    float p,
    float max
);

/*======================================================================*
 *	減速接近計算（角度用） 						*
 *======================================================================*/
extern float add_calc_a(
    float *a,
    float b,
    float p,
    float max,
    float min
);
/*======================================================================*
 *	減速接近計算（short 角度用） 					*
 *======================================================================*/
#define    add_calc_short_angle     add_calc_short_angle2
#if 0
extern short add_calc_short_angle(
    short *,
    short ,
    short ,
    short ,
    short 
);
#endif
/*======================================================================*
 *	減速接近計算（short 角度用 改造バージョン）			*
 *======================================================================*/
extern short add_calc_short_angle2(
    short *,
    short ,
    short ,
    short ,
    short 
);
/*======================================================================*
      最適化
 *======================================================================*/
extern void adds(short *, short, short, short);

/*-----------------------------------------------------------------------
 *
 *	タイマーチェック＆減算
 *
 *----------------------------------------------------------------------*/
#define	timer_check_dec(timer)	((*(timer)) == 0 ? 0 : --(*timer))


/*-----------------------------------------------------------------------
 *
 *	変数初期化マクロ言語
 *
 *----------------------------------------------------------------------*/
typedef struct {
    unsigned int	endcode :1;
    unsigned int	opcode  :4;
    unsigned int	offset  :11;
    signed int		data    :16;
} ValueSet_W;

enum {
    V_E,
    V_C
};
enum {
    V_S_CHAR,
    V_U_CHAR,
    V_S_SHORT,
    V_U_SHORT,
    V_S_INT,
    V_U_INT,
    V_FLOAT,
    V_FLOAT_X1000,
    V_XYZ_T,
    V_XYZ_T_X1000,
    V_S_XYZ
};
    
extern void ValueSet_process(
    char	*p,
    ValueSet_W	*valueset_w
);

/*===========================================================================
 *
 * rgba_t用処理
 *
 *=========================================================================*/
/*--------------------------------------------------------------------------
 *
 * rgba_t代入
 *
 *--------------------------------------------------------------------------*/
extern void rgba_t_move(
    rgba_t *rgba1,
    rgba_t *rgba2);

/*===========================================================================
 *
 *  オーデオ関係関数
 *
 *=========================================================================*/
extern void Na_StartSystemSe_F(u16 flag);
extern void Na_StartFixSe_F(u16 flag);
extern void Na_StartObjectSe_F(f32 *pos, u16 flag);
#ifdef _LANGUAGE_C_PLUS_PLUS
} /* extern "C" */
#endif

#endif

/*** z_lib.h end ***/
