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

    @@ -4,53 +4,68 @@ * @private */ javascript:(function(){ - if (window._dutyRatioPatch) { + if (window._intervalSwitchPatch) { alert('パッチはすでに適用されています。'); return; } - let useAlternative = false; - - /* ============================================================ */ - /* 🛠️ 司令官、ここの数値をいじって「時間の差」を調整してください */ - /* ============================================================ */ - const NORMAL_TIME = 100; /* 本来の数値(64や191=右寄り)のキープ時間(ミリ秒) */ - const ALTERN_TIME = 130; /* 補正の数値(63や190=左寄り)のキープ時間(ミリ秒) */ - /* ============================================================ */ - - /* 自分自身を何度も呼び出し直すことで、交互に違うタイマー時間をセットする仕組み */ - function scheduler() { - useAlternative = !useAlternative; - /* 次の切り替えまでの時間を、現在のモードに合わせて変動させる */ - const nextTime = useAlternative ? ALTERN_TIME : NORMAL_TIME; - setTimeout(scheduler, nextTime); - } - /* 初回起動 */ - setTimeout(scheduler, NORMAL_TIME); + /* ======================================================== */ + /* 【司令官用・微調整エリア】(ミリ秒単位で指定してください。10ミリ秒 = 10) */ + /* ======================================================== */ + const UP_NORMAL_MS = 10; /* 真上・本来の向き(64: 右逸れ)の維持時間 */ + const UP_ALTER_MS = 12; /* 真上・逆の向き (63: 左逸れ)の維持時間 */ + + const DOWN_NORMAL_MS = 10; /* 真下・本来の向き(191: 左逸れ)の維持時間 */ + const DOWN_ALTER_MS = 12; /* 真下・逆の向き (190: 右逸れ)の維持時間 */ + /* ======================================================== */ + + /* 状態管理用変数 */ + let lastUpState = 64; /* 現在(直前)の上の状態 (64 または 63) */ + let lastDownState = 191; /* 現在(直前)の下の状態 (191 または 190) */ + let lastUpSwitchTime = Date.now(); + let lastDownSwitchTime = Date.now(); /* WebSocketの送信関数(大元)をハック */ const originalSend = WebSocket.prototype.send; WebSocket.prototype.send = function(data) { + if (data && (data.byteLength === 1 || data.length === 1)) { const view = new Uint8Array(data.buffer || data); let currentByte = view[0]; + const now = Date.now(); /* 【真上移動のとき】 */ - if (currentByte === 64) { - if (useAlternative) { - view[0] = 63; + if (currentByte === 64 || currentByte === 63) { + /* 現在の状態に応じた制限時間を取得 */ + const currentLimit = (lastUpState === 64) ? UP_NORMAL_MS : UP_ALTER_MS; + + /* 指定された時間が経過していたら、状態を反転させる */ + if (now - lastUpSwitchTime >= currentLimit) { + lastUpState = (lastUpState === 64) ? 63 : 64; + lastUpSwitchTime = now; } + + /* 決定された状態の数値をパケットに上書き */ + view[0] = lastUpState; } /* 【真下移動のとき】 */ - else if (currentByte === 191) { - if (useAlternative) { - view[0] = 190; + else if (currentByte === 191 || currentByte === 190) { + /* 現在の状態に応じた制限時間を取得 */ + const currentLimit = (lastDownState === 191) ? DOWN_NORMAL_MS : DOWN_ALTER_MS; + + /* 指定された時間が経過していたら、状態を反転させる */ + if (now - lastDownSwitchTime >= currentLimit) { + lastDownState = (lastDownState === 191) ? 190 : 191; + lastDownSwitchTime = now; } + + /* 決定された状態の数値をパケットに上書き */ + view[0] = lastDownState; } } return originalSend.apply(this, arguments); }; - window._dutyRatioPatch = true; - alert('【比率調整式・スイッチパッチ】\n本来の時間:' + NORMAL_TIME + 'ms\n補正の時間:' + ALTERN_TIME + 'ms\nで交互に切り替えます!ズレに合わせて微調整してください。'); + window._intervalSwitchPatch = true; + alert('【4軸個別時間制御パッチ】\n上2通り・下2通りの維持時間を個別に設定しました!\n数値を調整して完璧な直線を見つけ出してください。'); })();
  • /*
     * @title キーボード縦移動修正
     * @description キーボード縦移動時にちゃんとまっすぐになるぞ!
     * @private
     */
    javascript:(function(){
        if (window._intervalSwitchPatch) {
            alert('パッチはすでに適用されています。');
            return;
        }
    
        /* ======================================================== */
        /* 【司令官用・微調整エリア】(ミリ秒単位で指定してください。10ミリ秒 = 10) */
        /* ======================================================== */
        const UP_NORMAL_MS = 10;  /* 真上・本来の向き(64: 右逸れ)の維持時間 */
        const UP_ALTER_MS  = 12;  /* 真上・逆の向き (63: 左逸れ)の維持時間 */
    
        const DOWN_NORMAL_MS = 10; /* 真下・本来の向き(191: 左逸れ)の維持時間 */
        const DOWN_ALTER_MS  = 12; /* 真下・逆の向き (190: 右逸れ)の維持時間 */
        /* ======================================================== */
    
        /* 状態管理用変数 */
        let lastUpState = 64;   /* 現在(直前)の上の状態 (64 または 63) */
        let lastDownState = 191; /* 現在(直前)の下の状態 (191 または 190) */
        let lastUpSwitchTime = Date.now();
        let lastDownSwitchTime = Date.now();
    
        /* WebSocketの送信関数(大元)をハック */
        const originalSend = WebSocket.prototype.send;
        WebSocket.prototype.send = function(data) {
            
            if (data && (data.byteLength === 1 || data.length === 1)) {
                const view = new Uint8Array(data.buffer || data);
                let currentByte = view[0]; 
                const now = Date.now();
    
                /* 【真上移動のとき】 */
                if (currentByte === 64 || currentByte === 63) {
                    /* 現在の状態に応じた制限時間を取得 */
                    const currentLimit = (lastUpState === 64) ? UP_NORMAL_MS : UP_ALTER_MS;
                    
                    /* 指定された時間が経過していたら、状態を反転させる */
                    if (now - lastUpSwitchTime >= currentLimit) {
                        lastUpState = (lastUpState === 64) ? 63 : 64;
                        lastUpSwitchTime = now;
                    }
                    
                    /* 決定された状態の数値をパケットに上書き */
                    view[0] = lastUpState;
                }
                /* 【真下移動のとき】 */
                else if (currentByte === 191 || currentByte === 190) {
                    /* 現在の状態に応じた制限時間を取得 */
                    const currentLimit = (lastDownState === 191) ? DOWN_NORMAL_MS : DOWN_ALTER_MS;
                    
                    /* 指定された時間が経過していたら、状態を反転させる */
                    if (now - lastDownSwitchTime >= currentLimit) {
                        lastDownState = (lastDownState === 191) ? 190 : 191;
                        lastDownSwitchTime = now;
                    }
                    
                    /* 決定された状態の数値をパケットに上書き */
                    view[0] = lastDownState;
                }
            }
            return originalSend.apply(this, arguments);
        };
    
        window._intervalSwitchPatch = true;
        alert('【4軸個別時間制御パッチ】\n上2通り・下2通りの維持時間を個別に設定しました!\n数値を調整して完璧な直線を見つけ出してください。');
    })();
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。