/*
 ******************************************************************************
 *              
 *	--- Controller - コントローラー制御マクロ ---
 * 	$Id: m_controller.h,v 1.1 2003/06/06 00:15:12 tong Exp $
 ******************************************************************************
 */
#ifndef INCLUDE_M_CONTROLLER_H
#define	INCLUDE_M_CONTROLLER_H

#ifdef _LANGUAGE_C_PLUS_PLUS
extern "C" {
#endif

/*
 ***************************************************************
 *
 *	コントローラー
 *
 ***************************************************************
 */
/* コントローラの定数 */
enum {
    CONT_1, CONT_2, CONT_3, CONT_4
};

#define UP_TRG			CONT_UP
#define DOWN_TRG		CONT_DOWN
#define LEFT_TRG		CONT_LEFT
#define RIGHT_TRG		CONT_RIGHT 
#define A_BTN			CONT_A
#define B_BTN			CONT_B 
#define L_BTN			CONT_L
#define R_BTN			CONT_R
#define START			CONT_START  
#define C_BTN			CONT_C
#define D_BTN			CONT_D
#define E_BTN			CONT_E
#define F_BTN			CONT_F
#define Z_BTN			CONT_G

/* コントローラ入力マクロ */
#define get_button(p)		((p).now.button)
#define is_button(p,b)		(((p).now.button & (b)) == (b))
#define get_trigger(p)		((p).on.button)
#define is_trigger(p,b)		(((p).on.button & (b)) == (b))
#define GPAD1			(gamePT->pads[CONT_1])
#define GPAD2			(gamePT->pads[CONT_2])
#define GPAD3			(gamePT->pads[CONT_3])
#define GPAD4			(gamePT->pads[CONT_4])

#define chkButton_const(m)          (is_button(GPAD1, m))
#define getButton_const()           get_button(GPAD1)
#define chkTrigger_const(m)         is_trigger(GPAD1, m)
#define getTrigger_const()          (get_trigger(GPAD1))
#define getJoystick_X_const()       ((int)GPAD1.now.stick_x)
#define getJoystick_Y_const()       ((int)GPAD1.now.stick_y)


/*
 ******************************************************************************
 *	"動物の森"用１Ｐコントロ─ラ読み取り
 *		(タイトルデモの時は入力は無かった事にする)
 ******************************************************************************
 */
/* 2000 10/27 komatu *//* 隙を見て"m_controller_extern.h"に移すかも */
/* ボタン押し続けチェック(m:ボタンの種類"A_BTN"等) */
extern int chkButton(u16 m);
/* 現在の全ボタン押し続けの状態を見る */
extern u16 getButton(void);
/* ボタン１回押しチェック(m:ボタンの種類"A_BTN"等) */
extern int chkTrigger(u16 m);
/* 現在の全ボタン１回押しの状態を見る */
extern u16 getTrigger(void);
/* 現在の３ＤスティックのＸ座標を見る */
extern int getJoystick_X(void);
/* 現在の３ＤスティックのＹ座標を見る */
extern int getJoystick_Y(void);



#if DEBUG
#define chkButtonC2(m)          (is_button(GPAD2, m))
#define getButtonC2()           get_button(GPAD2)
#define chkTriggerC2(m)         is_trigger(GPAD2, m)
#define getTriggerC2()          (get_trigger(GPAD2))
#define getJoystick_XC2()	((int)GPAD2.now.stick_x)
#define getJoystick_YC2()	((int)GPAD2.now.stick_y)

#define chkButtonC3(m)          (is_button(GPAD3, m))
#define getButtonC3()           get_button(GPAD3)
#define chkTriggerC3(m)         is_trigger(GPAD3, m)
#define getTriggerC3()          (get_trigger(GPAD3))
#define getJoystick_XC3()	((int)GPAD3.now.stick_x)
#define getJoystick_YC3()	((int)GPAD3.now.stick_y)

#define chkButtonC4(m)          (is_button(GPAD4, m))
#define getButtonC4()           get_button(GPAD4)
#define chkTriggerC4(m)         is_trigger(GPAD4, m)
#define getTriggerC4()          (get_trigger(GPAD4))
#define getJoystick_XC4()	((int)GPAD4.now.stick_x)
#define getJoystick_YC4()	((int)GPAD4.now.stick_y)
#endif	/* DEBUG */

/*
 ******************************************************************************
 *	リミッタ─付コントローラ情報を受け取るマクロ
 ******************************************************************************
 */
#define GET_MCON_P()				(&(gamePT->mcon))
#define GET_MCON_MOVE_PERCENTX()		(gamePT->mcon.move_percentX)
#define GET_MCON_MOVE_PERCENTY()		(gamePT->mcon.move_percentY)
#define GET_MCON_MOVE_PERCENTR()		(gamePT->mcon.move_percentR)
#define GET_MCON_MOVE_ANGLE()			(gamePT->mcon.move_angle)
#define GET_MCON_OLD_MOVE_PERCENTX()		(gamePT->mcon.old_move_percentX)
#define GET_MCON_OLD_MOVE_PERCENTY()		(gamePT->mcon.old_move_percentY)
#define GET_MCON_OLD_MOVE_PERCENTR()		(gamePT->mcon.old_move_percentR)
#define GET_MCON_OLD_MOVE_ANGLE()		(gamePT->mcon.old_move_angle)
#define GET_MCON_RECOGNIZE_PERCENTX()		(gamePT->mcon.recognize_percentX)
#define GET_MCON_RECOGNIZE_PERCENTY()		(gamePT->mcon.recognize_percentY)
#define GET_MCON_RECOGNIZE_PERCENTR()		(gamePT->mcon.recognize_percentR)
#define GET_MCON_OLD_RECOGNIZE_PERCENTX()	(gamePT->mcon.old_recognize_percentX)
#define GET_MCON_OLD_RECOGNIZE_PERCENTY()	(gamePT->mcon.old_recognize_percentY)
#define GET_MCON_OLD_RECOGNIZE_PERCENTR()	(gamePT->mcon.old_recognize_percentR)

/*
 ******************************************************************************
 *	スティック位置が認識範囲定義マクロ
 ******************************************************************************
 */
#define MCON_MIN_STICKR		(7.0F*F_SQRT_OF_2)		/* スティック認識最小値半径 */
#define MCON_MAX_STICKR		(/*7.0F+*/61.0F)			/* スティック認識最大値半径 */
#define MCON_RANGE_STICKR	(MCON_MAX_STICKR-MCON_MIN_STICKR)	/* スティック認識幅半径 */
       

#ifdef _LANGUAGE_C_PLUS_PLUS
} /* extern "C" */
#endif

#endif	/* _INCLUDE_M_CONTROLLER_H */
