6std::initializer_list<KeyCodec::K_Key> KeyCodec::keys = {
7 {Tempest::Event::K_A, 0x1e00},
8 {Tempest::Event::K_B, 0x3000},
9 {Tempest::Event::K_C, 0x2e00},
10 {Tempest::Event::K_D, 0x2000},
11 {Tempest::Event::K_E, 0x1200},
12 {Tempest::Event::K_F, 0x2100},
13 {Tempest::Event::K_G, 0x2200},
14 {Tempest::Event::K_H, 0x2300},
15 {Tempest::Event::K_I, 0x1700},
16 {Tempest::Event::K_J, 0x2400},
17 {Tempest::Event::K_K, 0x2500},
18 {Tempest::Event::K_L, 0x2600},
19 {Tempest::Event::K_M, 0x3200},
20 {Tempest::Event::K_N, 0x3100},
21 {Tempest::Event::K_O, 0x1800},
22 {Tempest::Event::K_P, 0x1900},
23 {Tempest::Event::K_Q, 0x1000},
24 {Tempest::Event::K_R, 0x1300},
25 {Tempest::Event::K_S, 0x1f00},
26 {Tempest::Event::K_T, 0x1400},
27 {Tempest::Event::K_U, 0x1600},
28 {Tempest::Event::K_V, 0x2f00},
29 {Tempest::Event::K_W, 0x1100},
30 {Tempest::Event::K_X, 0x2d00},
31 {Tempest::Event::K_Y, 0x1500},
32 {Tempest::Event::K_Z, 0x2c00},
34 {Tempest::Event::K_0, 0x8100},
35 {Tempest::Event::K_1, 0x7800},
36 {Tempest::Event::K_2, 0x7900},
37 {Tempest::Event::K_3, 0x7a00},
38 {Tempest::Event::K_4, 0x7b00},
39 {Tempest::Event::K_5, 0x7c00},
40 {Tempest::Event::K_6, 0x7d00},
41 {Tempest::Event::K_7, 0x7e00},
42 {Tempest::Event::K_8, 0x7f00},
43 {Tempest::Event::K_9, 0x8000},
45 {Tempest::Event::K_Up, 0xc800},
46 {Tempest::Event::K_Down, 0xd000},
47 {Tempest::Event::K_Left, 0xcb00},
48 {Tempest::Event::K_Right, 0xcd00},
50 {Tempest::Event::K_Back, 0x0e00},
51 {Tempest::Event::K_Tab, 0x0f00},
52 {Tempest::Event::K_Delete, 0xd300},
53 {Tempest::Event::K_Space, 0x3900},
54 {Tempest::Event::K_CapsLock, 0x3A00},
57 {Tempest::Event::K_LControl, 0x1d00},
58 {Tempest::Event::K_LShift, 0x2a00},
59 {Tempest::Event::K_LAlt, 0x3800},
60 {Tempest::Event::K_LCommand, 0x4800},
62 {Tempest::Event::K_RControl, 0x9d00},
63 {Tempest::Event::K_RShift, 0x3600},
64 {Tempest::Event::K_RAlt, 0xb800},
65 {Tempest::Event::K_RCommand, 0x4801},
68std::initializer_list<KeyCodec::M_Key> KeyCodec::mkeys = {
69 {Tempest::Event::ButtonLeft, 0x0c02},
70 {Tempest::Event::ButtonMid, 0x0e02},
71 {Tempest::Event::ButtonRight, 0x0d02},
72 {Tempest::Event::ButtonForward, 0x1002},
73 {Tempest::Event::ButtonBack, 0x0f02},
109 if(e.key==Tempest::KeyEvent::K_ESCAPE)
111 auto act = implTr(code).action;
114 if(Tempest::Event::K_0<e.key && e.key<=Tempest::Event::K_9)
116 if(Tempest::Event::K_0==e.key)
118 if(e.key==Tempest::Event::K_F8)
120 if(e.key == Tempest::Event::K_K)
122 if(e.key == Tempest::Event::K_O)
129 auto act = implTr(code).action;
139void KeyCodec::set(std::string_view sec, std::string_view opt, int32_t code) {
140 for(
auto i:allKeys) {
141 const bool chg = i->is(code);
157 val = val.substr(val.size()-4,4);
169 if(preset==
"KEYSDEFAULT0")
170 setDefaultKeysG1();
else
171 setDefaultKeysG1Alt();
176 for(
auto i:allKeys) {
183void KeyCodec::setDefaultKeysG1() {
185 Gothic::settingsSetS(
"KEYS",i->key,
"");
206 for(
auto i:allKeys) {
211void KeyCodec::setDefaultKeysG1Alt() {
213 Gothic::settingsSetS(
"KEYS",i->key,
"");
234 for(
auto i:allKeys) {
241 for(
int i=0;i<4;++i) {
242 ret[3-i] =
"0123456789abcdef"[code%16];
249 if(
auto m = keyEnd.mapping(code))
251 if(
auto m = keyUp.mapping(code))
253 if(
auto m = keyDown.mapping(code))
255 if(
auto m = keyLeft.mapping(code))
257 if(
auto m = keyRight.mapping(code))
259 if(
auto m = keyStrafeLeft.mapping(code))
261 if(
auto m = keyStrafeRight.mapping(code))
262 return {
Right, *m };
264 if(
auto m = keyAction.mapping(code))
266 if(
auto m = keyActionLeft.mapping(code))
268 if(
auto m = keyActionRight.mapping(code))
270 if(
auto m = keyParade.mapping(code))
273 if(
auto m = keySlow.mapping(code))
275 if(
auto m = keySMove.mapping(code))
278 if(
auto m = keyWeapon.mapping(code))
280 if(
auto m = keySneak.mapping(code))
281 return {
Sneak, *m };
283 if(
auto m = keyLook.mapping(code))
285 if(
auto m = keyLookFP.mapping(code))
288 if(
auto m = keyInventory.mapping(code))
290 if(
auto m = keyShowStatus.mapping(code))
292 if(
auto m = keyShowLog.mapping(code))
294 if(
auto m = keyShowMap.mapping(code))
296 if(
auto m = keyHeal.mapping(code))
298 if(
auto m = keyPotion.mapping(code))
306 int32_t k0 = fetch(keys,0,4);
307 int32_t k1 = fetch(keys,4,8);
312 auto k0Str = keyToStr(k0);
313 auto k1Str = keyToStr(k1);
314 if(k0Str.empty() || std::string_view(k0Str)==k1Str){
325 using namespace Tempest;
329 return keyToStr(i.k);
333 return keyToStr(i.k);
339 if(Tempest::Event::K_0<=k && k<=Tempest::Event::K_9) {
340 auto c = char(
'0' + (k-Tempest::Event::K_0));
343 if(Tempest::Event::K_A<=k && k<=Tempest::Event::K_Z) {
344 auto c = char(
'A' + (k-Tempest::Event::K_A));
348 if(k==Tempest::Event::K_Up) {
351 if(k==Tempest::Event::K_Down) {
352 return "CURSOR DOWN";
354 if(k==Tempest::Event::K_Left) {
355 return "CURSOR LEFT";
357 if(k==Tempest::Event::K_Right) {
358 return "CURSOR RIGHT";
360 if(k==Tempest::Event::K_Tab) {
363 if(k==Tempest::Event::K_Back) {
366 if(k==Tempest::Event::K_Space) {
369 if(k==Tempest::Event::K_LControl) {
370 return "LEFT CONTROL";
372 if(k==Tempest::Event::K_RControl) {
373 return "RIGHT CONTROL";
375 if(k==Tempest::Event::K_Delete) {
378 if(k==Tempest::Event::K_LShift) {
381 if(k==Tempest::Event::K_RShift) {
382 return "RIGHT SHIFT";
384 if(k==Tempest::Event::K_CapsLock) {
387 if(k==Tempest::Event::K_LAlt) {
390 if(k==Tempest::Event::K_RAlt) {
393 if(k==Tempest::Event::K_LCommand) {
394 return "LEFT COMMAND";
396 if(k==Tempest::Event::K_RCommand) {
397 return "RIGHT COMMAND";
404 if(k==Tempest::Event::ButtonLeft) {
407 if(k==Tempest::Event::ButtonMid) {
410 if(k==Tempest::Event::ButtonRight) {
411 return "MOUSE RIGHT";
413 if(k==Tempest::Event::ButtonForward) {
416 if(k==Tempest::Event::ButtonBack) {
437void KeyCodec::setupSettings() {
438 keyEnd = setup(
"keyEnd");
439 keyHeal = setup(
"keyHeal");
440 keyPotion = setup(
"keyPotion");
441 keyLockTarget = setup(
"keyLockTarget");
442 keyParade = setup(
"keyParade");
443 keyActionRight = setup(
"keyActionRight");
444 keyActionLeft = setup(
"keyActionLeft");
445 keyUp = setup(
"keyUp");
446 keyDown = setup(
"keyDown");
447 keyLeft = setup(
"keyLeft");
448 keyRight = setup(
"keyRight");
449 keyStrafeLeft = setup(
"keyStrafeLeft");
450 keyStrafeRight = setup(
"keyStrafeRight");
451 keyAction = setup(
"keyAction");
452 keySlow = setup(
"keySlow");
453 keySMove = setup(
"keySMove");
454 keyWeapon = setup(
"keyWeapon");
455 keySneak = setup(
"keySneak");
456 keyLook = setup(
"keyLook");
457 keyLookFP = setup(
"keyLookFP");
458 keyInventory = setup(
"keyInventory");
459 keyShowStatus = setup(
"keyShowStatus");
460 keyShowLog = setup(
"keyShowLog");
461 keyShowMap = setup(
"keyShowMap");
464KeyCodec::KeyPair KeyCodec::setup(
const char* kp) {
470KeyCodec::KeyPair KeyCodec::parse(std::string_view kp) {
472 p.k[0] = fetch(kp,0,4);
473 p.k[1] = fetch(kp,4,8);
477int KeyCodec::fetch(std::string_view keys,
size_t s,
size_t e) {
478 if(s<keys.size() && e<=keys.size() && s<e) {
480 for(
size_t i=s;i<e;++i) {
483 val = val*16+(k-
'0');
else
485 val = val*16+(k-
'a'+10);
else
487 val = val*16+(k-
'A'+10);
else
Tempest::Signal< void()> onSettingsChanged
static void settingsSetS(std::string_view sec, std::string_view name, std::string_view val)
static std::string_view settingsGetS(std::string_view sec, std::string_view name)
static bool settingsHasSection(std::string_view sec)
static auto keysStr(std::string_view keys) -> string_frm< 64 >
void set(std::string_view section, std::string_view key, int32_t code)
static int32_t keyToCode(Tempest::Event::KeyType t)
static std::string toCode(int32_t scan)
void setDefaultKeys(std::string_view preset)
void clear(std::string_view section, std::string_view key)
Mapping mapping(Tempest::KeyEvent const &e) const
Gets a mapping out of a key event.
Action tr(Tempest::KeyEvent const &e) const
Encapsulates an in-game action and a key mapping that caused it to be fired.