/***************************************************************/
//
//
//		DirectX	[gamepad.cpp]
//
//										Author	kazuki tanaka
//										Date	2016 07/12
/*---------------------------------------------------------------
■Update : 2016/07/12
			gamepad.cppの作成

/*---------------------------------------------------------------
	インクルードファイル
---------------------------------------------------------------*/
#include "input.h"
#include "gamepad.h"
#include "main.h"

/*---------------------------------------------------------------
	マクロ定義
---------------------------------------------------------------*/
/*---------------------------------------------------------------
	定数定義

---------------------------------------------------------------*/
#define	NUM_KEY_MAX			( 128 )	// キーの最大数
#define	LIMIT_COUNT_REPEAT	( 5 )	// リピートカウントリミッター
#define PAD_START_POINT		(32767)

/*---------------------------------------------------------------
	グローバル変数
---------------------------------------------------------------*/

LPDIRECTINPUTDEVICE8	g_pDevGamepad = NULL;			// 入力デバイス(ゲームパッド)へのポインタ
BYTE					g_dijsTrigger[NUM_KEY_MAX];		// ゲームパッドのトリガー情報ワーク
BYTE					g_dijsRelease[NUM_KEY_MAX];		// ゲームパッドのリリース情報ワーク
BYTE					g_dijsRepeat[NUM_KEY_MAX];		// ゲームパッドのリピート情報ワーク
int						g_dijsRepeatCnt[NUM_KEY_MAX];	// ゲームパッドのリピートカウンタ

DIJOYSTATE2				g_dijs;							// ゲームパッドの初期化
bool					gamepadUseEnable = false;		// ゲームパッドが使用可能ならtrue


// ゲームパッドの初期化
HRESULT InitGamepad(HINSTANCE hInstance, HWND hWnd)
{
	// 入力処理の初期化
	if(FAILED(InitInput(hInstance, hWnd)))
	{
		//MessageBox(hWnd, "DirectInputオブジェクトが作れねぇ！", "警告！", MB_ICONWARNING);
		return E_FAIL;
	}

	// デバイスの作成
	LPDIRECTINPUT8 g_pInput = GetInputDevice( );
	if(FAILED(g_pInput->CreateDevice(GUID_Joystick, &g_pDevGamepad, NULL)))
	{
		//MessageBox(hWnd, "ゲームパッドがねぇ！", "警告！", MB_ICONWARNING);
		return E_FAIL;
	}

	// データフォーマットを設定
	if(FAILED(g_pDevGamepad->SetDataFormat(&c_dfDIJoystick2)))
	{
		//MessageBox(hWnd, "ゲームパッドのデータフォーマットを設定できませんでした。", "警告！", MB_ICONWARNING);
		return E_FAIL;
	}

	// 協調モードを設定（フォアグラウンド＆非排他モード）
	if(FAILED(g_pDevGamepad->SetCooperativeLevel(hWnd, (DISCL_FOREGROUND | DISCL_NONEXCLUSIVE))))
	{
		//MessageBox(hWnd, "ゲームパッドの協調モードを設定できませんでした。", "警告！", MB_ICONWARNING);
		return E_FAIL;
	}

	// ゲームパッドへのアクセス権を獲得(入力制御開始)
	if( FAILED( g_pDevGamepad ->Poll() ) )
	{
		g_pDevGamepad->Acquire();

	}

	// ゲームパッドを使用可能に設定
	gamepadUseEnable = true;

	return S_OK;
}

// ゲームパッドの終了処理
void UninitGamepad(void)
{
	if(g_pDevGamepad != NULL)
	{// 入力デバイス(ゲームパッド)の開放
		// ゲームパッドへのアクセス権を開放(入力制御終了)
		g_pDevGamepad->Unacquire();

		g_pDevGamepad->Release();
		g_pDevGamepad = NULL;
	}

	// 入力処理の終了処理
	UninitInput();
}

// ゲームパッドの更新処理
void UpdateGamepad(void)
{

	DIJOYSTATE2 dijs;


	// ゲームパッドが使用可能かどうか判断
	if( gamepadUseEnable ){

		// デバイスからデータを取得
		if(SUCCEEDED(g_pDevGamepad->GetDeviceState(sizeof(DIJOYSTATE2), &dijs )))
		{

			for(int nCnKey = 0; nCnKey < NUM_KEY_MAX; nCnKey++)
			{
			
				//キートリガーリリース情報の作成
				g_dijsTrigger[nCnKey]=(g_dijs.rgbButtons[nCnKey] ^ dijs.rgbButtons[nCnKey]) & dijs.rgbButtons[nCnKey];

				g_dijsRelease[nCnKey]=(g_dijs.rgbButtons[nCnKey] ^ dijs.rgbButtons[nCnKey]) & g_dijs.rgbButtons[nCnKey];

				//キーリピート情報の生成
				if( dijs.rgbButtons[nCnKey] & 0x80 ){			//不具合起きた場合, if( dijs.rgbButtons[nCnKey] & 0x80 )
					if(g_dijsRepeatCnt[nCnKey] < LIMIT_COUNT_REPEAT){
						g_dijsRepeatCnt[nCnKey]++;
						if( g_dijsRepeatCnt[nCnKey]==1){
						//if( g_dijsRepeatCnt[nCnKey]==1 || g_dijsRepeatCnt[nCnKey]>=LIMIT_COUNT_REPEAT ){

							g_dijsRepeat[nCnKey]=dijs.rgbButtons[nCnKey];
					
						}
						else{
						
							g_dijsRepeat[nCnKey] = 0 ;

						}
					}
				}
				else{
			
					g_dijsRepeat[nCnKey]=0;
					g_dijsRepeatCnt[nCnKey]=0;

				}

				// キープレス情報を保存
				//g_dijs.rgbButtons[nCnKey] = dijs.rgbButtons[nCnKey];

			}

			// キープレス情報を保存
			g_dijs = dijs;

		}
		else{
			// ゲームパッドへのアクセス権を取得
			g_pDevGamepad->Acquire();
		}
	}
}

// ゲームパッドのプレス状態を取得
bool GetGamepadPress(int nKey)
{
	//return (g_dijs[nKey] & 0x80) ? true: false;
	return (g_dijs.rgbButtons[nKey] & 0x80) ? true: false;
}

// ゲームパッドのトリガー状態を取得
bool GetGamepadTrigger(int nKey)
{
	return (g_dijsTrigger[nKey] & 0x80) ? true: false;
}

// ゲームパッドのリピート状態を取得
bool GetGamepadRepeat(int nKey)
{
	return (g_dijsRepeat[nKey] & 0x80) ? true: false;
}

// ゲームパッドのリリ−ス状態を取得
bool GetGamepadRelease(int nKey)
{
	return (g_dijsRelease[nKey] & 0x80) ? true: false;
}

// ゲームパッド↑ボタンの取得
bool GetGamepadUp( void )
{
	return ( g_dijs.lY < PAD_START_POINT ) ? true: false; 
}

// ゲームパッド↓ボタンの取得
bool GetGamepadDown( void )
{
	return ( g_dijs.lY > PAD_START_POINT ) ? true: false; 
}

// ゲームパッド←ボタンの取得
bool GetGamepadLeft( void )
{
	return ( g_dijs.lX < PAD_START_POINT ) ? true: false; 
}

// ゲームパッド→ボタンの取得
bool GetGamepadRight( void )
{
	return ( g_dijs.lX > PAD_START_POINT ) ? true: false; 
}

