SOULGATE/client/js/input.js
2026-05-04 03:42:47 +02:00

111 lines
2.8 KiB
JavaScript

// input.js : capture clavier + souris, envoi au serveur
import { send } from './network.js';
const moveKeys = { up: false, down: false, left: false, right: false };
let lastDx = 0, lastDy = 0;
let inputBlocked = false;
export function setInputBlocked(blocked) {
if (blocked && !inputBlocked) {
// on coupe le mouvement cote serveur si on bougeait, sinon le perso continue d avancer
if (lastDx !== 0 || lastDy !== 0) {
lastDx = 0; lastDy = 0;
send('input', { dx: 0, dy: 0 });
}
moveKeys.up = moveKeys.down = moveKeys.left = moveKeys.right = false;
}
inputBlocked = blocked;
}
export function isInputBlocked() { return inputBlocked; }
const MOVE_KEY_MAP = {
'z': 'up', 'ArrowUp': 'up',
's': 'down', 'ArrowDown': 'down',
'q': 'left', 'ArrowLeft': 'left',
'd': 'right', 'ArrowRight': 'right',
};
// AZERTY : on utilise e.code (Digit1) plutot que e.key (qui donne '&', 'é')
const ABILITY_CODE_MAP = { 'Digit1': 1, 'Digit2': 2 };
function computeDirection() {
let dx = 0, dy = 0;
if (moveKeys.left) dx -= 1;
if (moveKeys.right) dx += 1;
if (moveKeys.up) dy -= 1;
if (moveKeys.down) dy += 1;
// normaliser sinon la diagonale est plus rapide que les axes
if (dx !== 0 && dy !== 0) {
const inv = 1 / Math.SQRT2;
dx *= inv;
dy *= inv;
}
return { dx, dy };
}
function onKeyDown(e, getTarget) {
if (inputBlocked) return;
const moveAction = MOVE_KEY_MAP[e.key];
if (moveAction) {
e.preventDefault();
if (moveKeys[moveAction]) return;
moveKeys[moveAction] = true;
const { dx, dy } = computeDirection();
if (dx !== lastDx || dy !== lastDy) {
lastDx = dx; lastDy = dy;
send('input', { dx, dy });
}
return;
}
const abilityId = ABILITY_CODE_MAP[e.code];
if (abilityId) {
e.preventDefault();
const { wx, wy } = getTarget();
send('ability', { id: abilityId, tx: wx, ty: wy });
return;
}
if (e.key === 'e') {
e.preventDefault();
const { wx, wy } = getTarget();
send('displacement', { tx: wx, ty: wy });
return;
}
}
function onKeyUp(e) {
if (inputBlocked) return;
const moveAction = MOVE_KEY_MAP[e.key];
if (!moveAction) return;
e.preventDefault();
if (!moveKeys[moveAction]) return;
moveKeys[moveAction] = false;
const { dx, dy } = computeDirection();
if (dx !== lastDx || dy !== lastDy) {
lastDx = dx; lastDy = dy;
send('input', { dx, dy });
}
}
export function startInputTracking(getTarget) {
document.addEventListener('keydown', e => onKeyDown(e, getTarget));
document.addEventListener('keyup', e => onKeyUp(e));
}