// Core game elements
const statusEl = document.getElementById('status');
const timerEl = document.getElementById('timer');
const gameInfoEl = document.getElementById('game-info');
const guessInput = document.getElementById('guess-input');
const submitGuessBtn = document.getElementById('submit-guess');
const feedbackSection = document.getElementById('feedback-section');
const guessedWordEl = document.getElementById('guessed-word');
const guessScoreEl = document.getElementById('guess-score');
const feedbackTextEl = document.getElementById('feedback-text');
const chatContent = document.getElementById('chat-content');
const gridContainer = document.getElementById('grid-container');
// Game state variables
let countdownInterval;
const playerName = 'Player1';
let squareCount = 0;
let chatCount = 1;
// Grid management functions
const updateGrid = () => {
const cols = Math.ceil(Math.sqrt(squareCount));
const rows = Math.ceil(squareCount / cols);
gridContainer.style.gridTemplateColumns = `repeat(${cols}, minmax(0, 1fr))`;
};
const addSquare = () => {
squareCount++;
updateGrid();
const colors = ["cerulean", "light-sea-green", "sunset", "floral-white", "light-red"];
const square = document.createElement("div");
square.className = `${colors[(squareCount - 1) % colors.length]} w-16 h-16 rounded-md shadow-md flex flex-col items-center justify-center text-black font-bold pop-in`;
square.innerHTML = `
Student ${squareCount}
`;
gridContainer.appendChild(square);
};
const removeSquare = () => {
if (squareCount > 0) {
const squareToRemove = gridContainer.lastElementChild;
squareToRemove.classList.add("pop-out");
setTimeout(() => {
squareToRemove.remove();
squareCount--;
updateGrid();
}, 300);
}
};
// Chat functionality
const addStreamMessage = (message, type = 'user') => {
if (!message.trim()) return;
const chatLine = document.createElement("div");
chatLine.className = "text-gray-700 flex items-center gap-2";
if (type === 'system') {
chatLine.innerHTML = `${message}`;
} else if (type === 'student') {
chatLine.innerHTML = `${message}`;
} else if (type === 'system2') {
chatLine.innerHTML = `${message}`;
}
else {
chatLine.innerHTML = `${chatCount}. ${message}`;
chatCount++;
}
chatContent.appendChild(chatLine);
chatContent.scrollTop = chatContent.scrollHeight;
};
// Timer functionality
function startCountdown(endTimestamp) {
if (countdownInterval) {
clearInterval(countdownInterval);
}
function updateTimer() {
const now = new Date().getTime();
const timeLeft = endTimestamp - now;
if (timeLeft <= 0) {
clearInterval(countdownInterval);
timerEl.textContent = 'Time\'s up!';
timerEl.classList.add('text-red-600');
fetchGameState();
return;
}
const seconds = Math.floor(timeLeft / 1000);
timerEl.textContent = `${seconds}s`;
}
updateTimer();
countdownInterval = setInterval(updateTimer, 1000);
}
// Game state management
function updateGameState(data) {
gameInfoEl.innerHTML = '';
statusEl.textContent = data.message || '';
if (data.session_id) {
const infoHtml = `
Session: ${data.session_id || ''}
Turn: ${data.turn_number || ''}
Word: ${data.word || ''}
`;
gameInfoEl.innerHTML = infoHtml;
const turnNumber = parseInt(data.turn_number) || 0;
if (turnNumber === 1 && data.hint0) {
addStreamMessage(data.hint0, 'system');
}
else if (turnNumber === 3 && data.hint1) {
addStreamMessage(data.hint1, 'system');
}
else if (turnNumber === 5 && data.hint2) {
addStreamMessage(data.hint2, 'system');
}
else if (turnNumber === 7 && data.hint3) {
addStreamMessage(data.hint3, 'system');
}
if (data.end_timestamp) {
startCountdown(data.end_timestamp);
}
}
}
// API interactions
async function submitAdvice(adviceText) {
guessText = adviceText;
if (!guessText) return;
submitGuessBtn.disabled = true;
submitGuessBtn.classList.add('opacity-75');
try {
const formData = new FormData();
formData.append('guess_text', guessText);
formData.append('player_name', playerName);
formData.append('personality', document.getElementById('personality-select').value);
const response = await fetch('https://lemot.online/player/submit_guess/', {
method: 'POST',
body: formData
});
const data = await response.json();
if (data.error) {
statusEl.textContent = data.message || "Error submitting guess.";
statusEl.classList.add('text-red-600');
addStreamMessage('Error submitting guess', 'system');
} else {
feedbackSection.classList.remove('hidden');
guessedWordEl.textContent = data.guessed_word;
guessScoreEl.textContent = `${data.score} / 10`;
// feedbackTextEl.textContent = data.feedback;
addStreamMessage(data.feedback, type='student');
addStreamMessage(`${data.guessed_word} - Score: ${data.score} / 10`);
if (data.score === 10) {
addStreamMessage("Congratulations! You've guessed the word correctly!", 'system2');
}
guessInput.value = '';
fetchGameState();
}
} catch (err) {
console.error(err);
statusEl.textContent = "Error submitting guess.";
statusEl.classList.add('text-red-600');
} finally {
submitGuessBtn.disabled = false;
submitGuessBtn.classList.remove('opacity-75');
}
}
function fetchGameState() {
const formData = new FormData();
formData.append('player_name', playerName);
fetch('https://lemot.online/player/play/', {
method: 'POST',
body: formData
})
.then(res => res.json())
.then(data => {
if (data.error) {
statusEl.textContent = data.message;
statusEl.classList.add('text-red-600');
addStreamMessage(data.message, 'system');
} else {
statusEl.classList.remove('text-red-600');
updateGameState(data);
}
})
.catch(err => {
console.error(err);
statusEl.textContent = "Error fetching game state.";
addStreamMessage("Error fetching game state", 'system');
});
}
// Event listeners
let isProcessing = false;
submitGuessBtn.addEventListener('click', () => {
if (isProcessing) return;
isProcessing = true;
const guessAdvice = guessInput.value.trim();
guessInput.value = '';
submitAdvice(guessAdvice);
setTimeout(() => {
isProcessing = false;
}, 1000);
});
guessInput.addEventListener('keypress', (e) => {
if (e.key === 'Enter') {
const guessText = guessInput.value.trim();
submitAdvice(guessText);
}
});
// Initialize game
window.addEventListener('load', fetchGameState);