Files
2021-12-04 12:48:21 +02:00

190 lines
3.7 KiB
C++

#include <glfw3.h>
#include "util.h"
#include "mapping.h"
#include "stateManager.h"
#include "abstractAppState.h"
using namespace std;
using namespace chrono;
namespace gameBase{
std::string keyStrings[]{
"Escape",
"Enter",
"Tab",
"Backspace",
"Insert",
"Delete",
"Right",
"Left",
"Up",
"Down",
"PageUp",
"PageDown",
"Home",
"End",
"CapsLock",
"ScrollLock",
"NumLock",
"PrintScreen",
"Space",
"Pause",
"Numpad .",
"Numpad /",
"Numpad *",
"Numpad -",
"Numpad +",
"Numpad enter",
"=",
"Left shift",
"Left control",
"Left alt",
"Left super",
"Right shift",
"Right control",
"Right alt",
"Right super",
"Left click",
"Right click",
"Middle click"
};
int triggers[]{
GLFW_KEY_ESCAPE,
GLFW_KEY_ENTER,
GLFW_KEY_TAB,
GLFW_KEY_BACKSPACE,
GLFW_KEY_INSERT,
GLFW_KEY_DELETE,
GLFW_KEY_RIGHT,
GLFW_KEY_LEFT,
GLFW_KEY_UP,
GLFW_KEY_DOWN,
GLFW_KEY_PAGE_UP,
GLFW_KEY_PAGE_DOWN,
GLFW_KEY_HOME,
GLFW_KEY_END,
GLFW_KEY_CAPS_LOCK,
GLFW_KEY_SCROLL_LOCK,
GLFW_KEY_NUM_LOCK,
GLFW_KEY_PRINT_SCREEN,
GLFW_KEY_SPACE,
GLFW_KEY_PAUSE,
GLFW_KEY_KP_DECIMAL,
GLFW_KEY_KP_DIVIDE,
GLFW_KEY_KP_MULTIPLY,
GLFW_KEY_KP_SUBTRACT,
GLFW_KEY_KP_ADD,
GLFW_KEY_KP_ENTER,
GLFW_KEY_EQUAL,
GLFW_KEY_LEFT_SHIFT,
GLFW_KEY_LEFT_CONTROL,
GLFW_KEY_LEFT_ALT,
GLFW_KEY_LEFT_SUPER,
GLFW_KEY_RIGHT_SHIFT,
GLFW_KEY_RIGHT_CONTROL,
GLFW_KEY_RIGHT_ALT,
GLFW_KEY_RIGHT_SUPER,
GLFW_MOUSE_BUTTON_LEFT,
GLFW_MOUSE_BUTTON_RIGHT,
GLFW_MOUSE_BUTTON_MIDDLE
};
string fromIntToString(int data[3]){
string output;
switch((Mapping::BindType)data[0]){
case Mapping::KEYBOARD:
case Mapping::MOUSE_KEY:
{
bool specialKey = false;
int numSpecialKeys = sizeof(triggers) / sizeof(int);
for(int i = 0; i < numSpecialKeys; i++){
if(data[2] == triggers[i]){
specialKey = true;
output = keyStrings[i];
}
if(!specialKey){
char c[]{data[2]};
output = string(c);
}
}
break;
}
case Mapping::MOUSE_AXIS:
output = "MOUSE_AXIS_" + to_string(data[2]) + (data[1] ? "+" : "-");
break;
case Mapping::JOYSTICK_KEY:
output = "JOYSTICK_BUTTON_" + to_string(data[2]);
break;
case Mapping::JOYSTICK_AXIS:
output = "JOYSTICK_AXIS_" + to_string(data[2]) + (data[1] ? "+" : "-");
break;
}
return output;
}
int* fromStringToInt(string data){
int *output = new int[3], length = data.length();
if(data.substr(0, 11) == "MOUSE_AXIS_"){
output[0] = Mapping::MOUSE_AXIS;
output[1] = 0;
output[2] = atoi(data.substr(11, string::npos - 1).c_str()) + (int)data.c_str()[12] == '+';
}
else if(data.substr(0, 16) == "JOYSTICK_BUTTON_"){
output[0] = Mapping::JOYSTICK_KEY;
output[1] = 1;
output[2] = atoi(data.substr(16, string::npos - 1).c_str());
}
else if(data.substr(0, 14) == "JOYSTICK_AXIS_"){
output[0] = Mapping::JOYSTICK_AXIS;
output[1] = 0;
output[2] = 2*atoi(data.substr(14, 1).c_str()) + (data.c_str()[15] == '+' ? 1 : 0);
}
else{
bool specialKey = false;
int numSpecialKeys = sizeof(triggers) / sizeof(int);
for(int i = 0; i < numSpecialKeys; i++)
if(data == keyStrings[i]){
specialKey = true;
output[0] = numSpecialKeys - i <= 3 ? Mapping::MOUSE_KEY:Mapping::KEYBOARD;
output[2] = triggers[i];
}
if(!specialKey){
output[0] = Mapping::KEYBOARD;
output[2] = data.c_str()[0];
}
output[1] = 1;
}
return output;
}
wstring stringToWstring(string str){
wstring wstr = L"";
for(char ch : str)
wstr += ch;
return wstr;
}
string wstringToString(wstring wstr){
string str = "";
for(wchar_t ch : wstr)
if(ch < 256)
str += ch;
return str;
}
}