123
This commit is contained in:
168
public/game.js
168
public/game.js
@ -1776,7 +1776,8 @@
|
||||
connect(url);
|
||||
socket.once('connect', () => {
|
||||
console.log('Подключено, создаём комнату');
|
||||
socket.emit('createRoom', name);
|
||||
const aiMode = $('ai-mode')?.checked || false;
|
||||
socket.emit('createRoom', { name, aiMode });
|
||||
});
|
||||
socket.once('connect_error', (e) => {
|
||||
console.error('Ошибка подключения:', e);
|
||||
@ -1785,7 +1786,8 @@
|
||||
} else {
|
||||
console.log('Уже подключен, создаём комнату');
|
||||
// Уже подключен, сразу отправляем
|
||||
socket.emit('createRoom', name);
|
||||
const aiMode = $('ai-mode')?.checked || false;
|
||||
socket.emit('createRoom', { name, aiMode });
|
||||
}
|
||||
});
|
||||
|
||||
@ -1804,13 +1806,15 @@
|
||||
if (!socket || !socket.connected) {
|
||||
connect(url);
|
||||
socket.once('connect', () => {
|
||||
socket.emit('createRoom', name);
|
||||
const aiMode = $('ai-mode')?.checked || false;
|
||||
socket.emit('createRoom', { name, aiMode });
|
||||
});
|
||||
socket.once('connect_error', (e) => {
|
||||
showError('Не удалось подключиться к серверу. Проверьте, что сервер запущен.');
|
||||
});
|
||||
} else {
|
||||
socket.emit('createRoom', name);
|
||||
const aiMode = $('ai-mode')?.checked || false;
|
||||
socket.emit('createRoom', { name, aiMode });
|
||||
}
|
||||
};
|
||||
} else {
|
||||
@ -2257,8 +2261,17 @@
|
||||
}
|
||||
|
||||
function addCardToForge(cardId, source) {
|
||||
if (!cardId) return;
|
||||
if (forgeSelected.includes(cardId)) return; // Уже добавлена
|
||||
if (forgeSelected.length >= 3) return; // Максимум 3 карты
|
||||
if (forgeSelected.length >= 3) {
|
||||
// Показываем сообщение, что максимум 3 карты
|
||||
const selectedEl = $('forge-selected');
|
||||
if (selectedEl) {
|
||||
selectedEl.style.animation = 'shake 0.5s';
|
||||
setTimeout(() => selectedEl.style.animation = '', 500);
|
||||
}
|
||||
return; // Максимум 3 карты
|
||||
}
|
||||
|
||||
const meta = cardDb[cardId];
|
||||
if (!meta || meta.type !== 'minion') return; // Только миньоны
|
||||
@ -2275,6 +2288,9 @@
|
||||
renderForgeDeck(gameState);
|
||||
}
|
||||
}
|
||||
|
||||
// Настраиваем drag-and-drop заново после добавления
|
||||
setTimeout(() => setupForgeDragAndDrop(gameState), 100);
|
||||
}
|
||||
|
||||
function setupForgeDragAndDrop(state) {
|
||||
@ -2334,6 +2350,131 @@
|
||||
selectedEl.addEventListener('dragleave', handleDragLeave);
|
||||
selectedEl.addEventListener('drop', handleDrop);
|
||||
|
||||
// Поддержка touch для мобильных устройств
|
||||
if (isTouchDevice()) {
|
||||
let touchStartCard = null;
|
||||
let touchStartSource = null;
|
||||
let touchStartElement = null;
|
||||
|
||||
// Обработка touch для карт в руке - упрощённая версия: просто тап добавляет карту
|
||||
$all('#your-hand .card-wrap').forEach(cardWrap => {
|
||||
const cardId = cardWrap.dataset.cardId;
|
||||
const meta = cardDb[cardId];
|
||||
if (cardId && meta && meta.type === 'minion') {
|
||||
// Удаляем старые обработчики
|
||||
cardWrap.ontouchstart = null;
|
||||
cardWrap.ontouchend = null;
|
||||
|
||||
cardWrap.ontouchstart = function(e) {
|
||||
if (sidebar && !sidebar.classList.contains('hidden')) {
|
||||
touchStartCard = cardId;
|
||||
touchStartSource = 'hand';
|
||||
touchStartElement = cardWrap;
|
||||
cardWrap._touchStartTime = Date.now();
|
||||
cardWrap.classList.add('touch-active');
|
||||
e.preventDefault();
|
||||
}
|
||||
};
|
||||
|
||||
cardWrap.ontouchend = function(e) {
|
||||
if (touchStartCard === cardId && sidebar && !sidebar.classList.contains('hidden')) {
|
||||
const touch = e.changedTouches[0];
|
||||
const timeDiff = Date.now() - (touchStartElement?._touchStartTime || Date.now());
|
||||
|
||||
// Если это быстрый тап (менее 300мс), просто добавляем карту
|
||||
if (timeDiff < 300) {
|
||||
addCardToForge(cardId, 'hand');
|
||||
} else {
|
||||
// Иначе проверяем, куда перетащили
|
||||
const dropEl = document.elementFromPoint(touch.clientX, touch.clientY);
|
||||
if (dropEl && (dropEl === selectedEl || selectedEl.contains(dropEl) ||
|
||||
dropEl.closest('#forge-selected'))) {
|
||||
addCardToForge(cardId, 'hand');
|
||||
}
|
||||
}
|
||||
|
||||
cardWrap.classList.remove('touch-active');
|
||||
touchStartCard = null;
|
||||
touchStartSource = null;
|
||||
touchStartElement = null;
|
||||
e.preventDefault();
|
||||
}
|
||||
};
|
||||
|
||||
cardWrap.ontouchcancel = function() {
|
||||
if (touchStartCard === cardId) {
|
||||
cardWrap.classList.remove('touch-active');
|
||||
touchStartCard = null;
|
||||
touchStartSource = null;
|
||||
touchStartElement = null;
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
// Обработка touch для карт в колоде - упрощённая версия
|
||||
$all('.forge-deck-card').forEach(cardWrap => {
|
||||
const cardId = cardWrap.dataset.cardId;
|
||||
if (cardId) {
|
||||
// Удаляем старые обработчики
|
||||
cardWrap.ontouchstart = null;
|
||||
cardWrap.ontouchend = null;
|
||||
|
||||
cardWrap.ontouchstart = function(e) {
|
||||
touchStartCard = cardId;
|
||||
touchStartSource = 'deck';
|
||||
touchStartElement = cardWrap;
|
||||
cardWrap._touchStartTime = Date.now();
|
||||
cardWrap.classList.add('touch-active');
|
||||
e.preventDefault();
|
||||
};
|
||||
|
||||
cardWrap.ontouchend = function(e) {
|
||||
if (touchStartCard === cardId) {
|
||||
const touch = e.changedTouches[0];
|
||||
const timeDiff = Date.now() - (touchStartElement?._touchStartTime || Date.now());
|
||||
|
||||
// Если это быстрый тап (менее 300мс), просто добавляем карту
|
||||
if (timeDiff < 300) {
|
||||
addCardToForge(cardId, 'deck');
|
||||
} else {
|
||||
// Иначе проверяем, куда перетащили
|
||||
const dropEl = document.elementFromPoint(touch.clientX, touch.clientY);
|
||||
if (dropEl && (dropEl === selectedEl || selectedEl.contains(dropEl) ||
|
||||
dropEl.closest('#forge-selected'))) {
|
||||
addCardToForge(cardId, 'deck');
|
||||
}
|
||||
}
|
||||
|
||||
cardWrap.classList.remove('touch-active');
|
||||
touchStartCard = null;
|
||||
touchStartSource = null;
|
||||
touchStartElement = null;
|
||||
e.preventDefault();
|
||||
}
|
||||
};
|
||||
|
||||
cardWrap.ontouchcancel = function() {
|
||||
if (touchStartCard === cardId) {
|
||||
cardWrap.classList.remove('touch-active');
|
||||
touchStartCard = null;
|
||||
touchStartSource = null;
|
||||
touchStartElement = null;
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
// Также добавляем обработчик на саму область выбранных карт для визуальной обратной связи
|
||||
selectedEl.ontouchstart = function(e) {
|
||||
selectedEl.classList.add('drag-over');
|
||||
};
|
||||
|
||||
selectedEl.ontouchend = function(e) {
|
||||
selectedEl.classList.remove('drag-over');
|
||||
};
|
||||
}
|
||||
|
||||
// Делаем карты в руке перетаскиваемыми в кузницу
|
||||
$all('#your-hand .card-wrap').forEach(cardWrap => {
|
||||
const cardId = cardWrap.dataset.cardId;
|
||||
@ -2414,13 +2555,16 @@
|
||||
</div>`;
|
||||
}).filter(Boolean).join('');
|
||||
|
||||
// Клик по карте в колоде тоже добавляет её
|
||||
$all('.forge-deck-card').forEach(card => {
|
||||
card.onclick = function() {
|
||||
const cardId = card.dataset.cardId;
|
||||
addCardToForge(cardId, 'deck');
|
||||
};
|
||||
});
|
||||
// Клик по карте в колоде тоже добавляет её (для десктопа)
|
||||
// На мобильных это обрабатывается через touch события
|
||||
if (!isTouchDevice()) {
|
||||
$all('.forge-deck-card').forEach(card => {
|
||||
card.onclick = function() {
|
||||
const cardId = card.dataset.cardId;
|
||||
addCardToForge(cardId, 'deck');
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
renderForgeSelected();
|
||||
updateForgeCraftButton();
|
||||
|
||||
Reference in New Issue
Block a user