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

    @@ -4,60 +4,60 @@ * @private */ javascript:(function(){ - if (window._pwmDitheringPatch) { + if (window._arrowPwmPatch) { alert('パッチはすでに適用されています。'); return; } /* 直進モードの状態管理 */ let straightMode = null; /* 'up', 'down', null */ - let toggleFrame = false; /* 63と64(190と191)を切り替えるフラグ */ + let toggleState = false; /* 63と64、190と191を切り替えるフラグ */ - /* キーボードの入力を監視 */ + /* 矢印キーの入力をブラウザ全体で監視(W/Sではなく、完全に矢印キー限定) */ window.addEventListener('keydown', function(e) { - const key = e.key.toLowerCase(); - - /* チャット入力中は無視 */ + /* チャット入力中などは誤発動を防ぐ */ if (document.activeElement.tagName === 'INPUT' || document.activeElement.tagName === 'TEXTAREA') return; - if (key === 'arrowup' || key === 'w') { - /* すでに上直進中なら解除、そうでなければセット */ + if (e.key === 'ArrowUp') { + /* ↑キー:すでに上直進中なら解除、そうでなければセット */ straightMode = (straightMode === 'up') ? null : 'up'; - if(straightMode) console.log('【垂直直進】真上モード起動'); - } else if (key === 'arrowdown' || key === 's') { - /* すでに下直進中なら解除、そうでなければセット */ + e.stopPropagation(); /* ゲーム側の元の移動処理を止める */ + } else if (e.key === 'ArrowDown') { + /* ↓キー:すでに下直進中なら解除、そうでなければセット */ straightMode = (straightMode === 'down') ? null : 'down'; - if(straightMode) console.log('【垂直直進】真下モード起動'); - } else if (key === 'arrowleft' || key === 'a' || key === 'arrowright' || key === 'd') { - /* 左右が押されたら安全のために直進モードを解除 */ + e.stopPropagation(); /* ゲーム側の元の移動処理を止める */ + } else if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') { + /* 左右の矢印キーが押されたら、安全のために直進モードを解除 */ straightMode = null; } - }, true); + }, true); /* trueでゲームの処理より先に割り込む */ - /* 画面タップ/クリックでも直進を解除できるようにする */ + /* 画面タップやマウスクリックでも直進を解除できるようにする(安全装置) */ window.addEventListener('mousedown', () => { straightMode = null; }, true); window.addEventListener('touchstart', () => { straightMode = null; }, true); - /* WebSocketの送信関数をハック */ + /* 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); - /* フラグを毎フレーム反転させて交互に数値を送り出す */ - toggleFrame = !toggleFrame; + /* パケットが送られるたびにフラグを反転させて交互にする */ + toggleState = !toggleState; if (straightMode === 'up') { - /* 63(左寄り) と 64(右寄り) を交互に送って平均63.5(真上)にする */ - view[0] = toggleFrame ? 63 : 64; + /* 63(わずかに左)と 64(わずかに右)を交互に送り、ピクセル解像度で完全に相殺 */ + view[0] = toggleState ? 63 : 64; } else if (straightMode === 'down') { - /* 190(右寄り) と 191(左寄り) を交互に送って平均190.5(真下)にする */ - view[0] = toggleFrame ? 190 : 191; + /* 190(わずかに右)と 191(わずかに左)を交互に送り、ピクセル解像度で完全に相殺 */ + view[0] = toggleState ? 190 : 191; } } return originalSend.apply(this, arguments); }; - window._pwmDitheringPatch = true; - alert('【ディザリング直進パッチ:起動】\n・Wキー / ↑キー:真上へ自動直進(1回押すだけ)\n・Sキー / ↓キー:真下へ自動直進(1回押すだけ)\n※もう一度押すか、左右移動、画面タップで解除されます。'); + window._arrowPwmPatch = true; + alert('【ディザリング直進パッチ:矢印キー版】\n・↑ キー:真上へ自動直進(1回押すだけ)\n・↓ キー:真下へ自動直進(1回押すだけ)\n\n※もう一度同じキーを押すか、左右キー、画面タップでいつでも解除できます!'); })();
  • /*
     * @title キーボード縦移動修正
     * @description キーボード縦移動時にちゃんとまっすぐになるぞ!
     * @private
     */
    javascript:(function(){
        if (window._arrowPwmPatch) {
            alert('パッチはすでに適用されています。');
            return;
        }
    
        /* 直進モードの状態管理 */
        let straightMode = null; /* 'up', 'down', null */
        let toggleState = false; /* 63と64、190と191を切り替えるフラグ */
    
        /* 矢印キーの入力をブラウザ全体で監視(W/Sではなく、完全に矢印キー限定) */
        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); /* 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);
                
                /* パケットが送られるたびにフラグを反転させて交互にする */
                toggleState = !toggleState;
    
                if (straightMode === 'up') {
                    /* 63(わずかに左)と 64(わずかに右)を交互に送り、ピクセル解像度で完全に相殺 */
                    view[0] = toggleState ? 63 : 64;
                } else if (straightMode === 'down') {
                    /* 190(わずかに右)と 191(わずかに左)を交互に送り、ピクセル解像度で完全に相殺 */
                    view[0] = toggleState ? 190 : 191;
                }
            }
            return originalSend.apply(this, arguments);
        };
    
        window._arrowPwmPatch = true;
        alert('【ディザリング直進パッチ:矢印キー版】\n・↑ キー:真上へ自動直進(1回押すだけ)\n・↓ キー:真下へ自動直進(1回押すだけ)\n\n※もう一度同じキーを押すか、左右キー、画面タップでいつでも解除できます!');
    })();
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。