非公開 キーボード縦移動修正

    @@ -4,44 +4,69 @@ * @private */ javascript:(function(){ - if (window._intervalSwitchPatch) { + if (window._perfectPacketSyncPatch) { alert('パッチはすでに適用されています。'); return; } - /* 2秒(2000ミリ秒)ごとに true / false を切り替えるタイマー */ + let straightMode = null; /* 'up', 'down', null */ + let packetCounter = 0; /* 送信されたパケット数を数えるカウンター */ let useAlternative = false; - setInterval(function() { - useAlternative = !useAlternative; - }, 100); - /* WebSocketの送信関数(大元)をハック */ + /* 🔴 1周期あたりのパケット送信数(12発 = 約0.2秒) */ + /* もし間隔を調整したい場合は、この「12」の数字を 6(約0.1秒) や 24(約0.4秒) に変えてみてください */ + const SWITCH_PACKET_COUNT = 12; + + /* 矢印キーの入力を監視(ON/OFFの切り替えスイッチ) */ + window.addEventListener('keydown', function(e) { + if (document.activeElement.tagName === 'INPUT' || document.activeElement.tagName === 'TEXTAREA') return; + + if (e.key === 'ArrowUp') { + /* ↑キー:直進中なら解除、そうでなければ真上モード起動 */ + straightMode = (straightMode === 'up') ? null : 'up'; + packetCounter = 0; + e.stopPropagation(); + } else if (e.key === 'ArrowDown') { + /* ↓キー:直進中なら解除、そうでなければ真下モード起動 */ + straightMode = (straightMode === 'down') ? null : 'down'; + packetCounter = 0; + e.stopPropagation(); + } else if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') { + /* 左右の矢印キーが押されたら、安全のために自動直進を即座に解除 */ + straightMode = null; + } + }, true); + + /* 画面をマウスでクリックするか、スマホでタップしても自動直進を解除(緊急ブレーキ) */ + window.addEventListener('mousedown', () => { straightMode = null; }, true); + window.addEventListener('touchstart', () => { straightMode = null; }, true); + + /* WebSocketの送信機能(大元)をハック */ const originalSend = WebSocket.prototype.send; WebSocket.prototype.send = function(data) { - /* 送信データが1バイト(移動パケット)のときだけ中身を見る */ - if (data && (data.byteLength === 1 || data.length === 1)) { + /* 自動直進モードがONのとき、ゲームが通信しようとしたら割り込む */ + if (straightMode && data && (data.byteLength === 1 || data.length === 1)) { const view = new Uint8Array(data.buffer || data); - let currentByte = view[0]; - - /* 【真上移動のとき】 */ - if (currentByte === 64) { - /* 2秒ごとに 64(右逸れ)と 63(左逸れ)を入れ替える */ - if (useAlternative) { - view[0] = 63; - } + + /* パケットが1発送られるたびにカウントを進める */ + packetCounter++; + if (packetCounter >= SWITCH_PACKET_COUNT) { + useAlternative = !useAlternative; /* 指定のパケット数に達したら表裏を反転 */ + packetCounter = 0; /* カウンターをリセット */ } - /* 【真下移動のとき】 */ - else if (currentByte === 191) { - /* 2秒ごとに 191(左逸れ)と 190(右逸れ)を入れ替える */ - if (useAlternative) { - view[0] = 190; - } + + if (straightMode === 'up') { + /* 12発は 64(右)、次の12発は 63(左) を送ることで、パケット数のブレを完全に相殺 */ + view[0] = useAlternative ? 63 : 64; + } else if (straightMode === 'down') { + /* 下移動も同様に 191(左) と 190(右) を12発ずつ完全に交互に送る */ + view[0] = useAlternative ? 190 : 191; } } return originalSend.apply(this, arguments); }; - window._intervalSwitchPatch = true; - alert('【2秒周期・スイッチパッチ】\n2秒ごとに、本来の向きと逆の向き(64⇄63 / 191⇄190)を自動で切り替えます!\nいつもの矢印キーで動かしてみてください。'); + window._perfectPacketSyncPatch = true; + alert('【完全同期・自動直進パッチ】\n\n・↑ キー:真上へ自動直進(手を離してOK)\n・↓ キー:真下へ自動直進(手を離してOK)\n\nパケットの送信数(フレーム数)と100%同期させ、わずかなズレも相殺します!\n※もう一度押すか、左右キー・画面タップで解除されます。'); })();
  • /*
     * @title キーボード縦移動修正
     * @description キーボード縦移動時にちゃんとまっすぐになるぞ!
     * @private
     */
    javascript:(function(){
        if (window._perfectPacketSyncPatch) {
            alert('パッチはすでに適用されています。');
            return;
        }
    
        let straightMode = null; /* 'up', 'down', null */
        let packetCounter = 0;   /* 送信されたパケット数を数えるカウンター */
        let useAlternative = false;
    
        /* 🔴 1周期あたりのパケット送信数(12発 = 約0.2秒) */
        /* もし間隔を調整したい場合は、この「12」の数字を 6(約0.1秒) や 24(約0.4秒) に変えてみてください */
        const SWITCH_PACKET_COUNT = 12; 
    
        /* 矢印キーの入力を監視(ON/OFFの切り替えスイッチ) */
        window.addEventListener('keydown', function(e) {
            if (document.activeElement.tagName === 'INPUT' || document.activeElement.tagName === 'TEXTAREA') return;
    
            if (e.key === 'ArrowUp') {
                /* ↑キー:直進中なら解除、そうでなければ真上モード起動 */
                straightMode = (straightMode === 'up') ? null : 'up';
                packetCounter = 0;
                e.stopPropagation();
            } else if (e.key === 'ArrowDown') {
                /* ↓キー:直進中なら解除、そうでなければ真下モード起動 */
                straightMode = (straightMode === 'down') ? null : 'down';
                packetCounter = 0;
                e.stopPropagation();
            } else if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') {
                /* 左右の矢印キーが押されたら、安全のために自動直進を即座に解除 */
                straightMode = null;
            }
        }, true);
    
        /* 画面をマウスでクリックするか、スマホでタップしても自動直進を解除(緊急ブレーキ) */
        window.addEventListener('mousedown', () => { straightMode = null; }, true);
        window.addEventListener('touchstart', () => { straightMode = null; }, true);
    
        /* WebSocketの送信機能(大元)をハック */
        const originalSend = WebSocket.prototype.send;
        WebSocket.prototype.send = function(data) {
            
            /* 自動直進モードがONのとき、ゲームが通信しようとしたら割り込む */
            if (straightMode && data && (data.byteLength === 1 || data.length === 1)) {
                const view = new Uint8Array(data.buffer || data);
                
                /* パケットが1発送られるたびにカウントを進める */
                packetCounter++;
                if (packetCounter >= SWITCH_PACKET_COUNT) {
                    useAlternative = !useAlternative; /* 指定のパケット数に達したら表裏を反転 */
                    packetCounter = 0;                 /* カウンターをリセット */
                }
    
                if (straightMode === 'up') {
                    /* 12発は 64(右)、次の12発は 63(左) を送ることで、パケット数のブレを完全に相殺 */
                    view[0] = useAlternative ? 63 : 64;
                } else if (straightMode === 'down') {
                    /* 下移動も同様に 191(左) と 190(右) を12発ずつ完全に交互に送る */
                    view[0] = useAlternative ? 190 : 191;
                }
            }
            return originalSend.apply(this, arguments);
        };
    
        window._perfectPacketSyncPatch = true;
        alert('【完全同期・自動直進パッチ】\n\n・↑ キー:真上へ自動直進(手を離してOK)\n・↓ キー:真下へ自動直進(手を離してOK)\n\nパケットの送信数(フレーム数)と100%同期させ、わずかなズレも相殺します!\n※もう一度押すか、左右キー・画面タップで解除されます。');
    })();
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。