キーボード縦移動修正
by
cutfloss
06/01 [2026/06/01 00:28:51]
キーボード縦移動時にちゃんとまっすぐになるぞ!
@@ -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 です。