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

    @@ -4,60 +4,58 @@ * @private */ javascript:(function(){ - if (window._arrowPwmPatch) { + /* 二重適用防止 */ + if (window._perfectArrowPwmPatch) { alert('パッチはすでに適用されています。'); return; } - /* 直進モードの状態管理 */ let straightMode = null; /* 'up', 'down', null */ - let toggleState = false; /* 63と64、190と191を切り替えるフラグ */ + let toggleState = false; - /* 矢印キーの入力をブラウザ全体で監視(W/Sではなく、完全に矢印キー限定) */ + /* 1. 矢印キーの入力を監視して、自動直進モードの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'; - e.stopPropagation(); /* ゲーム側の元の移動処理を止める */ + e.stopPropagation(); } else if (e.key === 'ArrowDown') { - /* ↓キー:すでに下直進中なら解除、そうでなければセット */ straightMode = (straightMode === 'down') ? null : 'down'; - e.stopPropagation(); /* ゲーム側の元の移動処理を止める */ + e.stopPropagation(); } else if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') { - /* 左右の矢印キーが押されたら、安全のために直進モードを解除 */ - straightMode = null; + straightMode = null; /* 左右を押したら解除 */ } - }, true); /* trueでゲームの処理より先に割り込む */ + }, 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、かつ送信データが1バイトの移動パケットのとき */ - if (straightMode && data && (data.byteLength === 1 || data.length === 1)) { - const view = new Uint8Array(data.buffer || data); + /* 2. ゲームの計算ループの「直前」に潜り込んで、dxの数値を一瞬だけ騙す */ + setInterval(function() { + /* ゲームの入力状態オブジェクト(inputState)が存在するか安全に確認 */ + if (typeof inputState !== 'undefined' && inputState !== null) { - /* パケットが送られるたびにフラグを反転させて交互にする */ - toggleState = !toggleState; - if (straightMode === 'up') { - /* 63(わずかに左)と 64(わずかに右)を交互に送り、ピクセル解せるズレをその場で相殺 */ - view[0] = toggleState ? 63 : 64; + /* 上に自動直進中 */ + inputState.dy = -1; + /* 63と64の計算結果を交互に生み出す魔法の極小小数 */ + toggleState = !toggleState; + inputState.dx = toggleState ? 0.01238 : -0.01238; + inputState.drawing = true; } else if (straightMode === 'down') { - /* 190(わずかに右)と 191(わずかに左)を交互に送り、ピクセル解せるズレをその場で相殺 */ - view[0] = toggleState ? 190 : 191; + /* 下に自動直進中 */ + inputState.dy = 1; + /* 190と191の計算結果を交互に生み出す魔法の極小小数 */ + toggleState = !toggleState; + inputState.dx = toggleState ? -0.01238 : 0.01238; + inputState.drawing = true; } + /* 左右や停止時はゲーム本来の入力(0)に任せるため何もしない */ } - return originalSend.apply(this, arguments); - }; + }, 1000 / 60); /* ゲームの1フレーム(16ミリ秒)ごとに完全に同期 */ - window._arrowPwmPatch = true; - alert('【ディザリング直進パッチ:矢印キー版】\n・↑ キー:真上へ自動直進(1回押すだけ)\n・↓ キー:真下へ自動直進(1回押すだけ)\n\n※もう一度同じキーを押すか、左右キー、画面タップでいつでも解除できます!'); + window._perfectArrowPwmPatch = true; + alert('【決定版:入力同期ディザリングパッチ】\n通信を一切汚さず、ゲームの計算の瞬間だけ「魔法の傾き」を交互に注入します!\n\n・↑ キー:真上へ自動直進\n・↓ キー:真下へ自動直進\n(もう一度押すか、左右キー・画面タップで解除)'); })();
  • /*
     * @title キーボード縦移動修正
     * @description キーボード縦移動時にちゃんとまっすぐになるぞ!
     * @private
     */
    javascript:(function(){
        /* 二重適用防止 */
        if (window._perfectArrowPwmPatch) {
            alert('パッチはすでに適用されています。');
            return;
        }
    
        let straightMode = null; /* 'up', 'down', null */
        let toggleState = false;
    
        /* 1. 矢印キーの入力を監視して、自動直進モードの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';
                e.stopPropagation();
            } else if (e.key === 'ArrowDown') {
                straightMode = (straightMode === 'down') ? null : 'down';
                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);
    
        /* 2. ゲームの計算ループの「直前」に潜り込んで、dxの数値を一瞬だけ騙す */
        setInterval(function() {
            /* ゲームの入力状態オブジェクト(inputState)が存在するか安全に確認 */
            if (typeof inputState !== 'undefined' && inputState !== null) {
                
                if (straightMode === 'up') {
                    /* 上に自動直進中 */
                    inputState.dy = -1;
                    /* 63と64の計算結果を交互に生み出す魔法の極小小数 */
                    toggleState = !toggleState;
                    inputState.dx = toggleState ? 0.01238 : -0.01238;
                    inputState.drawing = true;
                } else if (straightMode === 'down') {
                    /* 下に自動直進中 */
                    inputState.dy = 1;
                    /* 190と191の計算結果を交互に生み出す魔法の極小小数 */
                    toggleState = !toggleState;
                    inputState.dx = toggleState ? -0.01238 : 0.01238;
                    inputState.drawing = true;
                }
                /* 左右や停止時はゲーム本来の入力(0)に任せるため何もしない */
            }
        }, 1000 / 60); /* ゲームの1フレーム(16ミリ秒)ごとに完全に同期 */
    
        window._perfectArrowPwmPatch = true;
        alert('【決定版:入力同期ディザリングパッチ】\n通信を一切汚さず、ゲームの計算の瞬間だけ「魔法の傾き」を交互に注入します!\n\n・↑ キー:真上へ自動直進\n・↓ キー:真下へ自動直進\n(もう一度押すか、左右キー・画面タップで解除)');
    })();
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。