diff --git a/config.cpp b/config.cpp index 7f17153b..46f201d2 100644 --- a/config.cpp +++ b/config.cpp @@ -1103,6 +1103,7 @@ EX void initConfig() { qm = false; separate_status = true; multi::multi_autojoy = false; + touch_interface = true; } } } @@ -1230,6 +1231,9 @@ EX void initConfig() { ->set_sets(sets_sfx_volume); #endif + param_b(touch_interface, "touch_interface") + ->editable("a button for easier touching", 't'); + param_enum(dialog::display_keys, "dialog_display_keys") ->editable({{"never", ""}, {"when using keyboard", ""}, {"always", ""}, {"SteamDeck controls", ""}}, "display keys in dialogs", 'K'); diff --git a/control.cpp b/control.cpp index 478d8ad3..59c3b2bf 100644 --- a/control.cpp +++ b/control.cpp @@ -194,6 +194,14 @@ EX void calcMousedest() { cwt = bcwt; } +#if HDR +enum class tmode { move, info, drag, fire, ranged }; +#endif + +EX bool touch_interface; +EX tmode touchmode; +EX vector touch_description = { "touch to move", "touch for info", "touch to drag", "touch to aim", "touch for ranged" }; + EX void mousemovement() { #if CAP_VR @@ -690,11 +698,31 @@ EX void handleKeyNormal(int sym, int uni) { if(sym == PSEUDOKEY_NOHINT) no_find_player = true; + if(sym == PSEUDOKEY_TOUCH) { + bool invalid; + do { + touchmode = (tmode) gmod(1 + int(touchmode), 5); + invalid = touchmode == tmode::fire && !bow::crossbow_mode(); + } + while(invalid); + } + if(sym == '-' || sym == PSEUDOKEY_WHEELDOWN) { actonrelease = false; + multi::cpid = 0; - if(bow::fire_mode) { + if(touchmode == tmode::drag) { + panning(mouseoh, mouseh); + holdmouse = true; + } + else if(touchmode == tmode::info) + gotoHelp(help); + else if(touchmode == tmode::ranged) { + if(shmup::on ? numplayers() == 1 && !shmup::pc[0]->dead : true) + targetRangedOrb(mouseover, roMouseForce); + } + else if(bow::fire_mode || (touchmode == tmode::fire && bow::crossbow_mode())) { if(mouseover) bow::add_fire(mouseover); } else if(mouseover && diff --git a/graph.cpp b/graph.cpp index 0f2c05fc..600510cc 100644 --- a/graph.cpp +++ b/graph.cpp @@ -1833,6 +1833,9 @@ EX void show_menu_button() { displayButton(vid.xres-8, vid.yres-vid.fsize, XLAT("menu"), SDLK_ESCAPE, 16); else displayButton(vid.xres-8, vid.yres-vid.fsize, XLAT("(v) menu"), 'v', 16); + + if(touch_interface) + displayButton(vid.xres - 8, vid.yres - 3 * vid.fsize, XLAT(touch_description[(int) touchmode]), PSEUDOKEY_TOUCH, 16); } EX void normalscreen() { diff --git a/sysconfig.h b/sysconfig.h index 1b06703b..e0c0feaf 100644 --- a/sysconfig.h +++ b/sysconfig.h @@ -250,6 +250,7 @@ #define PSEUDOKEY_LIST_SLIDER 2507 #define PSEUDOKEY_SELECT 2508 #define PSEUDOKEY_ONSCREEN_KEYBOARD 2509 +#define PSEUDOKEY_TOUCH 2510 #define PSEUDOKEY_JOY 4096 #define JOY_ID 128