//----------------------------------------------------------
//	Файл:		INPUT.CPP
//	Описание:	Выполняет всю черновую работу с DirectInput
//----------------------------------------------------------
#define STRICT

#include <stdio.h>
#include "dinput.h"//файл находится в папке для избежания разногласия с более поздними версиями
#include "main.h"
#include "input.h"


static HWND hMainWnd;

//-------------------------------------------
//переменные обработки мыши
bool lbutton;//нажатие левой кнопки
bool rbutton;
bool ldblclk;//двойной щелчок левой кнопки
bool rdblclk;
int cur_x;//положение курсора
int cur_y;
int pointldx=-1;//место нажатия кнопки
int pointldy=-1;
int pointlux=-1;//место поднятия кнопки
int pointluy=-1;
int pointrdx=-1;//место нажатия кнопки
int pointrdy=-1;
int pointrux=-1;//место поднятия кнопки
int pointruy=-1;
//переменная нажатия клавиатуры
int key=0;//нажатая буква
unsigned int key_state;
bool keypress=false;//индикатор нажатия
//-------------------------------------------
//переменные джойстика
int joystick_x;
int joystick_y;
bool joy_left;
bool joy_right;
bool joy_up;
bool joy_down;
bool button_1;
bool button_2;
bool button_3;
bool button_4;
bool button_5;
bool button_6;
bool button_7;
bool button_8;
bool button_9;
bool button_10;
bool button_11;
//-------------------------------------------
//проверка нажатия клавиши мыши в заданном прямоугольнике
bool CursorLD(int x,int y,int w,int h){
	if(pointldx>=x&&pointldy>=y&&pointldx<=x+w&&pointldy<=y+h)
	{pointldx=-1;pointldy=-1;return true;}
	return false;
};
//проверка поднятия клавиши мыши в заданном прямоугольнике
bool CursorLU(int x,int y,int w,int h){
	if(pointlux>=x&&pointluy>=y&&pointlux<=x+w&&pointluy<=y+h)
	{pointlux=-1;pointluy=-1;return true;}
	return false;
};
//проверка нажатия клавиши мыши в заданном прямоугольнике
bool CursorRD(int x,int y,int w,int h){
	if(pointrdx>=x&&pointrdy>=y&&pointrdx<=x+w&&pointrdy<=y+h)
	{pointrdx=-1;pointrdy=-1;return true;}
	return false;
};
//проверка поднятия клавиши мыши в заданном прямоугольнике
bool CursorRU(int x,int y,int w,int h){
	if(pointrux>=x&&pointruy>=y&&pointrux<=x+w&&pointruy<=y+h)
	{pointrux=-1;pointruy=-1;return true;}
	return false;
};
//проверка попадания курсора в заданный прямоугольник
bool CursorIn(int x,int y,int w,int h){
	if(cur_x>=x&&cur_y>=y&&cur_x<=x+w&&cur_y<=y+h)return true;
	return false;
};
//-------------------------------------------
LPDIRECTINPUT7 pDI = NULL;
LPDIRECTINPUTDEVICE7 pDIJoystick = NULL;

GUID guidJoystick;//Получает значение при перечислении
BOOL bJoystickPresent=FALSE;//Найден ли джойстик?

char szErrorMessage[255];//Буфер сообщения об ошибке		

//---------------------------------------------------------

//Очищает все объекты, связанные с DirectSound
void RemoveDirectInput()
{
	if (pDIJoystick)
	{
		pDIJoystick->Unacquire();
		pDIJoystick->Release();
		pDIJoystick=NULL;
	}

	if (pDI)
	{
		pDI->Release();
		pDI=NULL;
	}
}

//-------------------------------------------

//Главная функция инициализации DirectSound
BOOL	InitDirectInput (HWND hwnd)
{
	HRESULT	hRet;
	HINSTANCE hInst;
			
	hMainWnd=hwnd;
	hInst=(HINSTANCE)GetWindowLong( hMainWnd, GWL_HINSTANCE );
    
	//Создаём объект DirectInput
	hRet = DirectInputCreateEx(hInst, DIRECTINPUT_VERSION, IID_IDirectInput7, (void**)&pDI, NULL); 
	if (hRet!=DI_OK)return (FALSE);

	//Начинаем перечисление присоединённых джойстиков
	hRet = pDI->EnumDevices(DIDEVTYPE_JOYSTICK, DIEnumJoysticks, NULL, DIEDFL_ATTACHEDONLY );
//		| DIEDFL_FORCEFEEDBACK);
	if (hRet!=DI_OK)return (FALSE);
	
	//Найден ли джойстик?
	if (!bJoystickPresent)return (FALSE);

	//Создаём объект для работы с найденным джойстиком
	hRet = pDI->CreateDeviceEx(guidJoystick, IID_IDirectInputDevice7,
        (void**)&pDIJoystick, NULL); 
	if (hRet!=DI_OK)return (FALSE);
	
	//Устанавливаем режим совместного доступа
	hRet = pDIJoystick->SetCooperativeLevel(hMainWnd, DISCL_FOREGROUND | DISCL_EXCLUSIVE);
	if (hRet!=DI_OK)return (FALSE);

	//Определяем формат данных
	hRet=pDIJoystick->SetDataFormat(&c_dfDIJoystick); 
	if (hRet!=DI_OK)return (FALSE);

	//Выполняем настройку джойстика
	if (!PrepareJoystick())return (FALSE);

	//Захватываем джойстик
	pDIJoystick->Acquire();	

	return (TRUE);
}

//-------------------------------------------

//Вызывается для найденного джойстика
BOOL CALLBACK DIEnumJoysticks(LPCDIDEVICEINSTANCE pdidInstance, VOID* pContext)
{
	
	//После первого же найденного джойстика прекращаем поиск
	CopyMemory(&guidJoystick,&pdidInstance->guidInstance,sizeof(GUID));    
	bJoystickPresent=TRUE;

	return (DIENUM_STOP);
}

//-------------------------------------------

//Выполняет настройку джойстика
BOOL PrepareJoystick(void)
{
	HRESULT hRet;
	DIPROPRANGE diprop; 
	DIPROPDWORD dipropdw;

	diprop.diph.dwSize       = sizeof(DIPROPRANGE); 
	diprop.diph.dwHeaderSize = sizeof(DIPROPHEADER); 
	diprop.diph.dwHow        = DIPH_BYOFFSET; 


	//Диапазон координат по оси X
	diprop.diph.dwObj        = DIJOFS_X; 
	diprop.lMin              = -(signed int)(SizeWindowX)/2; 
	diprop.lMax              = +(signed int)(SizeWindowX)/2;  
    
	hRet=pDIJoystick->SetProperty(DIPROP_RANGE, &diprop.diph );
	if (hRet!=DI_OK)
	{
		wsprintf(szErrorMessage,"%s","Calibrate X error");
		return (FALSE);
	}   

	//Диапазон координат по оси Y
	diprop.diph.dwObj        = DIJOFS_Y; 
	diprop.lMin              = -(signed int)(SizeWindowY)/2; 
	diprop.lMax              = +(signed int)(SizeWindowY)/2; 
    
	hRet=pDIJoystick->SetProperty(DIPROP_RANGE, &diprop.diph );
	if (hRet!=DI_OK)
	{
		wsprintf(szErrorMessage,"%s","Calibrate Y error");
		return (FALSE);
	}


	dipropdw.diph.dwSize       = sizeof(DIPROPDWORD); 
	dipropdw.diph.dwHeaderSize = sizeof(DIPROPHEADER); 
	dipropdw.diph.dwHow        = DIPH_BYOFFSET; 

	//Настройка области покоя для оси X
	dipropdw.diph.dwObj	= DIJOFS_X;
	dipropdw.dwData		= 1000; 

	hRet=pDIJoystick->SetProperty( DIPROP_DEADZONE, &dipropdw.diph );
	if (hRet!=DI_OK)
	{
		wsprintf(szErrorMessage,"%s","Dead zone X error");
		return (FALSE);
	}

	//Настройка области покоя для оси Y
	dipropdw.diph.dwObj	= DIJOFS_Y;
	dipropdw.dwData		= 1000;

	hRet=pDIJoystick->SetProperty( DIPROP_DEADZONE, &dipropdw.diph );
	if (hRet!=DI_OK)
	{
		wsprintf(szErrorMessage,"%s","Dead zone Y error");
		return (FALSE);
	}

	//Настройка области насыщения для оси X
	dipropdw.diph.dwObj	= DIJOFS_X;
	dipropdw.dwData		= 9000;

	hRet=pDIJoystick->SetProperty(DIPROP_SATURATION, &dipropdw.diph );
	if (hRet!=DI_OK)
	{
		wsprintf(szErrorMessage,"%s","Saturation Error");
		return (FALSE);
	}

	//Настройка области насыщения для оси Y
	dipropdw.diph.dwObj	= DIJOFS_Y;
	dipropdw.dwData		= 9000;

	hRet=pDIJoystick->SetProperty( DIPROP_SATURATION, &dipropdw.diph );
	if (hRet!=DI_OK)
	{
		wsprintf(szErrorMessage,"%s","Saturation Error");
		return (FALSE);
	}

	return (TRUE);

}


//Захватывает или освобождает джойстик
void AccessJoystick(BOOL isActive)
{
	if (pDIJoystick) 
	{
		if (isActive)
			pDIJoystick->Acquire();	
		else
			pDIJoystick->Unacquire();	
	}
}
//-----------------------------------------------

//Получает текущий ввод от джойстика и перемещает окно
void	ProcessJoystick()
{
	HRESULT hRet;
	DIJOYSTATE  diJoyState;
	
	//Опрашиваем джойстик
	pDIJoystick->Poll();
	hRet = pDIJoystick->GetDeviceState( sizeof(DIJOYSTATE), &diJoyState );
	if (hRet == DIERR_INPUTLOST)
	{
		pDIJoystick->Acquire();
		hRet = pDIJoystick->GetDeviceState( sizeof(DIJOYSTATE), &diJoyState );
	}
	if (hRet!=DI_OK) 
		return;
	
	//передача смещения джостика
	joystick_x=SizeWindowX/2+diJoyState.lX;
	joystick_y=SizeWindowY/2+diJoyState.lY;

	if(joystick_x<SizeWindowX/2-SizeWindowX/4)joy_left=true;
	else joy_left=false;
	if(joystick_x>SizeWindowX/2+SizeWindowX/4)joy_right=true;
	else joy_right=false;
	if(joystick_y<SizeWindowY/2-SizeWindowX/4)joy_up=true;
	else joy_up=false;
	if(joystick_y>SizeWindowY/2+SizeWindowX/4)joy_down=true;
	else joy_down=false;
	
	//Если кнопка нажата...
	if (diJoyState.rgbButtons[0] & 0x80) button_1=true;
	else button_1=false;
	if (diJoyState.rgbButtons[1] & 0x80) button_2=true;
	else button_2=false;
	if (diJoyState.rgbButtons[2] & 0x80) button_3=true;
	else button_3=false;
	if (diJoyState.rgbButtons[3] & 0x80) button_4=true;
	else button_4=false;
	if (diJoyState.rgbButtons[4] & 0x80) button_5=true;
	else button_5=false;
	if (diJoyState.rgbButtons[5] & 0x80) button_6=true;
	else button_6=false;
	if (diJoyState.rgbButtons[6] & 0x80) button_7=true;
	else button_7=false;
	if (diJoyState.rgbButtons[7] & 0x80) button_8=true;
	else button_8=false;
	if (diJoyState.rgbButtons[8] & 0x80) button_9=true;
	else button_9=false;
	if (diJoyState.rgbButtons[9] & 0x80) button_10=true;
	else button_10=false;
	if (diJoyState.rgbButtons[10] & 0x80) button_11=true;
	else button_11=false;
}
//-----------------------------------------------
