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

    @@ -4,43 +4,60 @@ * @private */ javascript:(function(){ - if (window._ultimateStraightPatch) { + if (window._pwmDitheringPatch) { alert('パッチはすでに適用されています。'); return; } - /* キーボードの状態をブラウザ全体で独自に監視 */ - const myKeys = {}; - window.addEventListener('keydown', e => { myKeys[e.key.toLowerCase()] = true; }, true); - window.addEventListener('keyup', e => { myKeys[e.key.toLowerCase()] = false; }, true); - - /* ゲームの描画・更新ループ(loop関数)の裏で、座標を強制ロックする */ - setInterval(function() { - /* 自分がゲームに参加しており、プレイヤーデータが存在するか確認 */ - if (typeof players !== 'undefined' && typeof myId !== 'undefined' && myId !== null) { - const me = players.find(p => p.id === myId); - if (me) { - const up = myKeys['arrowup'] || myKeys['w']; - const down = myKeys['arrowdown'] || myKeys['s']; - const left = myKeys['arrowleft'] || myKeys['a']; - const right = myKeys['arrowright'] || myKeys['d']; - - /* 左右が押されておらず、縦移動(上または下)だけのとき */ - if ((up || down) && !left && !right) { - /* サーバーから「少し斜め」の座標(targetX)が送られてきても、強制的に現在のX座標で固定する */ - if (window._lastSecureX === undefined || !up && !down) { - window._lastSecureX = me.x; - } - me.targetX = window._lastSecureX; - me.x = window._lastSecureX; - } else { - /* 通常移動時はロックを解除して現在の座標を記憶 */ - window._lastSecureX = me.x; - } + /* 直進モードの状態管理 */ + let straightMode = null; /* 'up', 'down', null */ + let toggleFrame = false; /* 63と64(190と191)を切り替えるフラグ */ + + /* キーボードの入力を監視 */ + 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') { + /* すでに上直進中なら解除、そうでなければセット */ + straightMode = (straightMode === 'up') ? null : 'up'; + if(straightMode) console.log('【垂直直進】真上モード起動'); + } else if (key === 'arrowdown' || key === 's') { + /* すでに下直進中なら解除、そうでなければセット */ + straightMode = (straightMode === 'down') ? null : 'down'; + if(straightMode) console.log('【垂直直進】真下モード起動'); + } else if (key === 'arrowleft' || key === 'a' || key === 'arrowright' || key === 'd') { + /* 左右が押されたら安全のために直進モードを解除 */ + 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) { + if (straightMode && data && (data.byteLength === 1 || data.length === 1)) { + const view = new Uint8Array(data.buffer || data); + + /* フラグを毎フレーム反転させて交互に数値を送り出す */ + toggleFrame = !toggleFrame; + + if (straightMode === 'up') { + /* 63(左寄り) と 64(右寄り) を交互に送って平均63.5(真上)にする */ + view[0] = toggleFrame ? 63 : 64; + } else if (straightMode === 'down') { + /* 190(右寄り) と 191(左寄り) を交互に送って平均190.5(真下)にする */ + view[0] = toggleFrame ? 190 : 191; } } - }, 1000 / 60); /* 60FPSで常に座標の横滑りを監視・修正 */ + return originalSend.apply(this, arguments); + }; - window._ultimateStraightPatch = true; - alert('【物理法則書き換えパッチ】\n1バイト通信の限界による「0.7度の傾き」を検知しました。\n縦移動中のみ、横方向へのズレをリアルタイムで強制相殺します!'); + window._pwmDitheringPatch = true; + alert('【ディザリング直進パッチ:起動】\n・Wキー / ↑キー:真上へ自動直進(1回押すだけ)\n・Sキー / ↓キー:真下へ自動直進(1回押すだけ)\n※もう一度押すか、左右移動、画面タップで解除されます。'); })();
  • /*
     * @title キーボード縦移動修正
     * @description キーボード縦移動時にちゃんとまっすぐになるぞ!
     * @private
     */
    javascript:(function(){
        if (window._pwmDitheringPatch) {
            alert('パッチはすでに適用されています。');
            return;
        }
    
        /* 直進モードの状態管理 */
        let straightMode = null; /* 'up', 'down', null */
        let toggleFrame = false; /* 63と64(190と191)を切り替えるフラグ */
    
        /* キーボードの入力を監視 */
        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') {
                /* すでに上直進中なら解除、そうでなければセット */
                straightMode = (straightMode === 'up') ? null : 'up';
                if(straightMode) console.log('【垂直直進】真上モード起動');
            } else if (key === 'arrowdown' || key === 's') {
                /* すでに下直進中なら解除、そうでなければセット */
                straightMode = (straightMode === 'down') ? null : 'down';
                if(straightMode) console.log('【垂直直進】真下モード起動');
            } else if (key === 'arrowleft' || key === 'a' || key === 'arrowright' || key === 'd') {
                /* 左右が押されたら安全のために直進モードを解除 */
                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) {
            if (straightMode && data && (data.byteLength === 1 || data.length === 1)) {
                const view = new Uint8Array(data.buffer || data);
                
                /* フラグを毎フレーム反転させて交互に数値を送り出す */
                toggleFrame = !toggleFrame;
    
                if (straightMode === 'up') {
                    /* 63(左寄り) と 64(右寄り) を交互に送って平均63.5(真上)にする */
                    view[0] = toggleFrame ? 63 : 64;
                } else if (straightMode === 'down') {
                    /* 190(右寄り) と 191(左寄り) を交互に送って平均190.5(真下)にする */
                    view[0] = toggleFrame ? 190 : 191;
                }
            }
            return originalSend.apply(this, arguments);
        };
    
        window._pwmDitheringPatch = true;
        alert('【ディザリング直進パッチ:起動】\n・Wキー / ↑キー:真上へ自動直進(1回押すだけ)\n・Sキー / ↓キー:真下へ自動直進(1回押すだけ)\n※もう一度押すか、左右移動、画面タップで解除されます。');
    })();
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。