Greasy Fork is available in English.

Mobile Shift-Click Toggle

Adds a floating button to toggle Shift+Click for mobile/touch devices

Terá de instalar uma extensão como Tampermonkey, Greasemonkey ou Violentmonkey para instalar este script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

Terá de instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Terá de instalar uma extensão como Tampermonkey ou Userscripts para instalar este script.

Terá de instalar uma extensão como Tampermonkey para instalar este script.

Terá de instalar uma extensão de gestão de scripts de utilizador para instalar este script.

(Já tenho um gestor de scripts de utilizador, deixe-me instalá-lo!)

Terá de instalar uma extensão como Stylus para instalar este estilo.

Terá de instalar uma extensão como Stylus para instalar este estilo.

Terá de instalar uma extensão como Stylus para instalar este estilo.

Terá de instalar uma extensão de gestão de estilos de utilizador para instalar este estilo.

Terá de instalar uma extensão de gestão de estilos de utilizador para instalar este estilo.

Terá de instalar uma extensão de gestão de estilos de utilizador para instalar este estilo.

(Já tenho um gestor de estilos de utilizador, deixe-me instalá-lo!)

// ==UserScript==
// @name         Mobile Shift-Click Toggle
// @namespace    http://tampermonkey.net/
// @version      1.0.1
// @description  Adds a floating button to toggle Shift+Click for mobile/touch devices
// @author       korphd
// @match        *://*/*
// @license       MIT
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // State of our virtual Shift key
    let isShiftToggled = false;

    // --- 1. THE MAGIC TRICK ---
    // This overrides the browser's default event rules.
    // Whenever the game checks "event.shiftKey", it will read our toggle state instead!
    function overrideShiftKey(prototypeObject) {
        const originalDescriptor = Object.getOwnPropertyDescriptor(prototypeObject, 'shiftKey');
        if (!originalDescriptor) return;

        Object.defineProperty(prototypeObject, 'shiftKey', {
            get: function() {
                // If our button is ON, tell the game Shift is being pressed
                if (isShiftToggled) return true;
                // Otherwise, act normally
                return originalDescriptor.get.call(this);
            },
            configurable: true,
            enumerable: true
        });
    }

    // Apply the trick to Mouse, Pointer, and Touch events
    if (window.MouseEvent) overrideShiftKey(MouseEvent.prototype);
    if (window.PointerEvent) overrideShiftKey(PointerEvent.prototype);
    if (window.KeyboardEvent) overrideShiftKey(KeyboardEvent.prototype);


    // --- 2. THE UI BUTTON ---
    const toggleBtn = document.createElement('button');
    toggleBtn.id = 'mobile-shift-toggle-btn';
    toggleBtn.innerText = 'Shift: OFF';
    
    // Styling the floating button
    toggleBtn.style.cssText = `
        position: fixed;
        bottom: 20px;
        left: 20px; /* Placed on the left so it doesn't overlap your tracker */
        z-index: 999999;
        padding: 12px 18px;
        background-color: rgba(170, 0, 0, 0.4); /* Semi-transparent Red */
        color: white;
        border: 2px solid #fff;
        border-radius: 8px;
        font-family: Arial, sans-serif;
        font-size: 16px;
        font-weight: bold;
        box-shadow: 0 4px 6px rgba(0,0,0,0.5);
        cursor: pointer;
        user-select: none;
    `;

    document.body.appendChild(toggleBtn);

    // --- 3. BUTTON LOGIC ---
    function toggleShift(e) {
        // Prevent the game from registering you clicking the toggle button
        e.preventDefault();
        e.stopPropagation();

        isShiftToggled = !isShiftToggled;

        if (isShiftToggled) {
            toggleBtn.innerText = 'Shift: ON';
            toggleBtn.style.backgroundColor = 'rgba(0, 170, 0, 0.8)'; // Green
            toggleBtn.style.boxShadow = '0 0 15px rgba(0, 255, 0, 0.8)'; // Glow effect
        } else {
            toggleBtn.innerText = 'Shift: OFF';
            toggleBtn.style.backgroundColor = 'rgba(170, 0, 0, 0.8)'; // Red
            toggleBtn.style.boxShadow = '0 4px 6px rgba(0,0,0,0.5)';
        }
    }

    // We use 'pointerdown' instead of 'click' so it responds instantly on touchscreens
    // and intercepts the touch before the game registers it.
    toggleBtn.addEventListener('pointerdown', toggleShift);
    toggleBtn.addEventListener('click', (e) => e.stopPropagation());

})();