Client-side autojump. Remove Android-only stepheight autojump (#7228)
[oweals/minetest.git] / src / gui / touchscreengui.cpp
index 13a6a079909dce8e605d24fca35555f46d85e7cf..a2d62c8b7d5fa4b8bf68744df36f8e334cc858c2 100644 (file)
@@ -42,7 +42,8 @@ using namespace irr::core;
 const char **touchgui_button_imagenames = (const char *[]) {
        "jump_btn.png",
        "down.png",
-       "zoom.png"
+       "zoom.png",
+       "aux_btn.png"
 };
 
 const char **touchgui_joystick_imagenames = (const char *[]) {
@@ -82,6 +83,9 @@ static irr::EKEY_CODE id2keycode(touch_gui_button_id id)
                case zoom_id:
                        key = "zoom";
                        break;
+               case special1_id:
+                       key = "special1";
+                       break;
                case fly_id:
                        key = "freemove";
                        break;
@@ -454,6 +458,7 @@ TouchScreenGUI::TouchScreenGUI(IrrlichtDevice *device, IEventReceiver *receiver)
 
        m_touchscreen_threshold = g_settings->getU16("touchscreen_threshold");
        m_fixed_joystick = g_settings->getBool("fixed_virtual_joystick");
+       m_joystick_triggers_special1 = g_settings->getBool("virtual_joystick_triggers_aux");
        m_screensize = m_device->getVideoDriver()->getScreenSize();
 }
 
@@ -555,19 +560,28 @@ void TouchScreenGUI::init(ISimpleTextureSource *tsrc)
        // init zoom button
        initButton(zoom_id,
                        rect<s32>(m_screensize.X - (1.25 * button_size),
-                                       m_screensize.Y - (3 * button_size),
+                                       m_screensize.Y - (4 * button_size),
                                        m_screensize.X - (0.25 * button_size),
-                                       m_screensize.Y - (2 * button_size)),
+                                       m_screensize.Y - (3 * button_size)),
                        L"z", false);
 
+       // init special1/aux button
+       if (!m_joystick_triggers_special1)
+               initButton(special1_id,
+                               rect<s32>(m_screensize.X - (1.25 * button_size),
+                                               m_screensize.Y - (2.5 * button_size),
+                                               m_screensize.X - (0.25 * button_size),
+                                               m_screensize.Y - (1.5 * button_size)),
+                               L"spc1", false);
+
        m_settingsbar.init(m_texturesource, "gear_icon.png", settings_starter_id,
-                       v2s32(m_screensize.X - (button_size / 2),
-                                       m_screensize.Y - ((SETTINGS_BAR_Y_OFFSET + 1) * button_size)
-                                                       + (button_size * 0.5)),
-                       v2s32(m_screensize.X,
-                                       m_screensize.Y - (SETTINGS_BAR_Y_OFFSET * button_size)
-                                                       + (button_size * 0.5)), AHBB_Dir_Right_Left,
-                       3.0);
+               v2s32(m_screensize.X - (1.25 * button_size),
+                       m_screensize.Y - ((SETTINGS_BAR_Y_OFFSET + 1.0) * button_size)
+                               + (0.5 * button_size)),
+               v2s32(m_screensize.X - (0.25 * button_size),
+                       m_screensize.Y - (SETTINGS_BAR_Y_OFFSET * button_size)
+                               + (0.5 * button_size)),
+               AHBB_Dir_Right_Left, 3.0);
 
        m_settingsbar.addButton(fly_id,     L"fly",       "fly_btn.png");
        m_settingsbar.addButton(noclip_id,  L"noclip",    "noclip_btn.png");
@@ -582,15 +596,14 @@ void TouchScreenGUI::init(ISimpleTextureSource *tsrc)
                        "chat_hide_btn.png", "chat_show_btn.png");
 
        m_rarecontrolsbar.init(m_texturesource, "rare_controls.png",
-                       rare_controls_starter_id,
-                       v2s32(0,
-                                       m_screensize.Y
-                                                       - ((RARE_CONTROLS_BAR_Y_OFFSET + 1) * button_size)
-                                                       + (button_size * 0.5)),
-                       v2s32(button_size / 2,
-                                       m_screensize.Y - (RARE_CONTROLS_BAR_Y_OFFSET * button_size)
-                                                       + (button_size * 0.5)), AHBB_Dir_Left_Right,
-                       2);
+               rare_controls_starter_id,
+               v2s32(0.25 * button_size,
+                       m_screensize.Y - ((RARE_CONTROLS_BAR_Y_OFFSET + 1.0) * button_size)
+                               + (0.5 * button_size)),
+               v2s32(0.75 * button_size,
+                       m_screensize.Y - (RARE_CONTROLS_BAR_Y_OFFSET * button_size)
+                               + (0.5 * button_size)),
+               AHBB_Dir_Left_Right, 2.0);
 
        m_rarecontrolsbar.addButton(chat_id,      L"Chat", "chat_btn.png");
        m_rarecontrolsbar.addButton(inventory_id, L"inv",  "inventory_btn.png");
@@ -973,7 +986,7 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
                                angle = fmod(angle + 180 + 22.5, 360);
 
                                // reset state before applying
-                               for (unsigned int i = 0; i < 4; i ++)
+                               for (unsigned int i = 0; i < 5; i ++)
                                        m_joystick_status[i] = false;
 
                                if (distance <= m_touchscreen_threshold) {
@@ -1000,8 +1013,9 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
                                        m_joystick_status[j_left] = true;
                                }
 
-                               // move joystick "button"
                                if (distance > button_size) {
+                                       m_joystick_status[j_special1] = true;
+                                       // move joystick "button"
                                        s32 ndx = (s32) button_size * dx / distance - (s32) button_size / 2;
                                        s32 ndy = (s32) button_size * dy / distance - (s32) button_size / 2;
                                        if (m_fixed_joystick) {
@@ -1125,7 +1139,10 @@ bool TouchScreenGUI::doubleTapDetection()
 
 void TouchScreenGUI::applyJoystickStatus()
 {
-       for (unsigned int i = 0; i < 4; i ++) {
+       for (unsigned int i = 0; i < 5; i ++) {
+               if (i == 4 && !m_joystick_triggers_special1)
+                       continue;
+
                SEvent translated{};
                translated.EventType            = irr::EET_KEY_INPUT_EVENT;
                translated.KeyInput.Key         = id2keycode(m_joystick_names[i]);