crossorigin="anonymous">

🕵️‍♂️ لعبة المافيا العربية

الإصدار الأسطوري - للحكم والجماعة
تجربة لعب متكاملة ومتوافقة مع جميع الأجهزة

🧑‍🤝‍🧑 إضافة اللاعبين

الحد الأدنى: 4 لاعبين | الحد الأقصى: 15 لاعب

⚙️ إعدادات اللعبة

🎭 الأدوار الإضافية

🧩 شرح لعبة المافيا العربية للمبتدئين

لعبة المافيا هي لعبة جماعية تجمع بين الذكاء والحوار، تنقسم المجموعة إلى فريقين رئيسيين:

🕵️‍♂️ المافيا

هدفهم القضاء على المدنيين دون أن يتم اكتشافهم

🧑‍🤝‍🧑 المدنيون

هدفهم كشف المافيا والتصويت عليهم لإخراجهم

📋 طريقة اللعب باختصار:

  1. يتم إدخال أسماء اللاعبين وتوزيع الأدوار سرًا (كل لاعب يرى دوره فقط)
  2. اللعبة تدور في جولات ليل ونهار:
🌙 في الليل:
  • • المافيا يقررون من يقتلون
  • • الطبيب ينقذ شخصًا
  • • المحقق والعراف يحققون في هوية أحد اللاعبين
☀️ في النهار:
  • • جميع اللاعبين يناقشون من المافيا
  • • ثم يصوت كل لاعب لطرد أحد المشكوك بهم
  • • من يحصل على أعلى الأصوات يخرج

تستمر الجولات حتى يفوز فريق أو يحقق أحد الأدوار هدفه الخاص

👨‍⚖️ شرح وضع الحكم

الحكم هو شخص لا يشارك في اللعبة كلاعب، بل يدير اللعبة عبر التطبيق

• يعرف الحكم أدوار جميع اللاعبين ويتابع قرارات كل دور خاص أثناء الليل

• يدخل قرارات المافيا، الطبيب، المحقق، العراف... في التطبيق ويعلن النتائج دون كشف هويات الأدوار

يمنع الحكم كشف أي هوية أثناء اللعب، ويعلن النتائج بوضوح بعد كل جولة

• الحكم يراقب القوانين (الأخرس، القناص، المنتحر...) ويطبقها بعدل وسرية

🗂️ شرح الأدوار الخاصة

👮‍♂️ المحقق

يحقق في هوية لاعب كل ليلة ويعرف إذا كان مافيا أم لا

🩺 الطبيب

ينقذ شخصًا من الموت كل ليلة (ويمكنه إنقاذ نفسه)

🔫 القناص

إذا تم التصويت عليه للخروج، يختار لاعبًا آخر ليخرجه معه فورًا

🔮 العراف

يعرف الدور الحقيقي والكامل لأي لاعب يختاره كل ليلة

🤐 الأخرس

ممنوع من الكلام أثناء النقاش، وإذا تكلم يخرج فورًا

💣 المنتحر

هدفه أن يتم التصويت عليه ليخرج، ويفوز وحده حتى لو خسر فريقه

🧟‍♂️ الزومبي

إذا مات يعود للحياة مرة واحدة فقط في اللعبة

🎭 المتنكر

يمكنه تغيير هويته إلى دور آخر مرة واحدة فقط أثناء اللعبة

🧑‍🎤 الناجي

هدفه البقاء حيًا حتى نهاية اللعبة ليفوز منفردًا

🎯 نصائح للاستمتاع باللعبة

استمتعوا باللعب والتحليل والنقاش!

إذا لم تعرف دورك أو قوانين اللعبة، راجع هذا الشرح أو اسأل الحكم قبل بدء الجولة

💡 نصيحة: اللعبة أكثر متعة مع 6-10 لاعبين

// تأثير بصري const list = document.getElementById('playersList'); const newPlayer = list.lastElementChild; if (newPlayer) { newPlayer.classList.add('slide-in'); } } else if (name && players.includes(name)) { showNotification('هذا الاسم موجود بالفعل!', 'warning'); } else if (players.length >= 15) { showNotification('الحد الأقصى 15 لاعب!', 'error'); } } // تحديث قائمة اللاعبين function updatePlayersList() { const list = document.getElementById('playersList'); list.innerHTML = players.map((player, index) => `
${player}
` ).join(''); } // حذف لاعب function removePlayer(name) { players = players.filter(p => p !== name); updatePlayersList(); updateStartButton(); } // تحديث زر البداية function updateStartButton() { const btn = document.getElementById('startGameBtn'); btn.disabled = players.length < 4; if (players.length < 4) { btn.textContent = `🚀 بدء اللعبة (${players.length}/4 لاعبين)`; btn.classList.remove('glow'); } else { btn.textContent = '🚀 بدء اللعبة الأسطورية'; btn.classList.add('glow'); } } // إظهار إشعار function showNotification(message, type = 'info') { const notification = document.createElement('div'); notification.className = `fixed top-4 right-4 z-50 p-4 rounded-lg font-bold text-white transform transition-all duration-300 ${ type === 'error' ? 'bg-red-500' : type === 'warning' ? 'bg-yellow-500' : type === 'success' ? 'bg-green-500' : 'bg-blue-500' }`; notification.textContent = message; notification.style.transform = 'translateX(100%)'; document.body.appendChild(notification); setTimeout(() => { notification.style.transform = 'translateX(0)'; }, 100); setTimeout(() => { notification.style.transform = 'translateX(100%)'; setTimeout(() => { document.body.removeChild(notification); }, 300); }, 3000); } // بدء اللعبة function startGame() { if (players.length < 4) { showNotification('يجب إضافة 4 لاعبين على الأقل!', 'error'); return; } // جمع الإعدادات gameSettings.rounds = parseInt(document.getElementById('roundsCount').value); gameSettings.discussionTime = parseInt(document.getElementById('discussionTime').value); gameSettings.enabledRoles = Array.from(document.querySelectorAll('#rolesConfig input:checked')) .map(cb => cb.dataset.role); // توزيع الأدوار distributeRoles(); // بدء توزيع الأدوار document.getElementById('startScreen').classList.add('hidden'); document.getElementById('roleDistributionScreen').classList.remove('hidden'); currentGame.currentPlayerIndex = 0; showCurrentPlayer(); } // توزيع الأدوار function distributeRoles() { const totalPlayers = players.length; const mafiaCount = Math.max(1, Math.floor(totalPlayers / 3)); let rolesList = []; // إضافة المافيا for (let i = 0; i < mafiaCount; i++) { rolesList.push('mafia'); } // إضافة الأدوار الإضافية gameSettings.enabledRoles.forEach(role => { if (rolesList.length < totalPlayers) { rolesList.push(role); } }); // ملء الباقي بالمدنيين while (rolesList.length < totalPlayers) { rolesList.push('citizen'); } // خلط الأدوار rolesList = rolesList.sort(() => Math.random() - 0.5); // توزيع الأدوار على اللاعبين players.forEach((player, index) => { currentGame.roles[player] = rolesList[index]; currentGame.playerStats[player] = { votes: 0, eliminated: 0, survived: 0, nightKills: 0, role: rolesList[index] }; }); // تحديد اللاعبين الأحياء currentGame.alivePlayers = [...players]; currentGame.deadPlayers = []; } // إظهار اللاعب الحالي function showCurrentPlayer() { if (currentGame.currentPlayerIndex < players.length) { const playerName = players[currentGame.currentPlayerIndex]; document.getElementById('currentPlayerName').textContent = playerName; document.getElementById('roleContent').textContent = '❓'; document.getElementById('roleDescription').textContent = 'اضغط لرؤية دورك السري'; document.getElementById('nextPlayerBtn').style.display = 'none'; // إعادة تعيين البطاقة const roleCard = document.querySelector('.role-card'); roleCard.classList.remove('flipped'); } } // كشف الدور function revealRole() { if (currentGame.currentPlayerIndex >= players.length) return; const playerName = players[currentGame.currentPlayerIndex]; const playerRole = currentGame.roles[playerName]; const role = roles[playerRole]; if (!role) return; document.getElementById('roleContent').textContent = role.emoji; document.getElementById('roleDescription').innerHTML = `
${role.name}
${role.description}
الفريق: ${ role.team === 'mafia' ? '🔴 المافيا' : role.team === 'citizen' ? '🟢 المدنيون' : '🟡 مستقل' }
`; document.getElementById('nextPlayerBtn').style.display = 'block'; // تأثير بصري بدون انقلاب const roleCard = document.querySelector('.role-card'); roleCard.classList.add('flipped'); } // اللاعب التالي function nextPlayer() { currentGame.currentPlayerIndex++; if (currentGame.currentPlayerIndex >= players.length) { startRefereeMode(); } else { showCurrentPlayer(); } } // بدء وضع الحكم function startRefereeMode() { document.getElementById('roleDistributionScreen').classList.add('hidden'); document.getElementById('refereeScreen').classList.remove('hidden'); updateRefereeDisplay(); startNightPhase(); } // تحديث عرض وضع الحكم function updateRefereeDisplay() { document.getElementById('refereeRound').textContent = currentGame.round; document.getElementById('refereePhase').textContent = currentGame.phase === 'night' ? 'الليل' : 'النهار'; // عرض اللاعبين الأحياء const aliveContainer = document.getElementById('alivePlayers'); aliveContainer.innerHTML = currentGame.alivePlayers.map(player => { const role = roles[currentGame.roles[player]]; return `
${player}
${role.emoji} ${role.name}
`; }).join(''); // عرض اللاعبين الموتى const deadContainer = document.getElementById('deadPlayers'); deadContainer.innerHTML = currentGame.deadPlayers.map(player => { const role = roles[currentGame.roles[player]]; return `
${player}
${role.emoji} ${role.name}
`; }).join(''); // تحديث العدادات document.getElementById('aliveCount').textContent = currentGame.alivePlayers.length; document.getElementById('deadCount').textContent = currentGame.deadPlayers.length; // تحديث دليل الحكم updateRefereeGuide(); } // تحديث دليل الحكم function updateRefereeGuide() { const guideContent = document.getElementById('guideContent'); if (currentGame.phase === 'night') { guideContent.innerHTML = `

🌙 مرحلة الليل - إرشادات الحكم:

⚠️ تذكر: لا تكشف هوية أي لاعب للآخرين!

`; } else { guideContent.innerHTML = `

☀️ مرحلة النهار - إرشادات الحكم:

⚠️ تذكر: إذا تكلم الأخرس، استبعده فوراً!

`; } } // بدء مرحلة الليل function startNightPhase() { currentGame.phase = 'night'; currentGame.nightActions = { mafiaKill: null, doctorSave: null, detectiveCheck: null, oracleCheck: null }; document.getElementById('nightPhase').classList.remove('hidden'); document.getElementById('dayPhase').classList.add('hidden'); // إخفاء جميع الأدوار أولاً document.getElementById('doctorAction').classList.add('hidden'); document.getElementById('detectiveAction').classList.add('hidden'); document.getElementById('oracleAction').classList.add('hidden'); document.getElementById('muteWarning').classList.add('hidden'); // إنشاء أهداف المافيا createActionTargets('mafiaTargets', 'mafiaKill'); // إظهار الأدوار الإضافية if (gameSettings.enabledRoles.includes('doctor') && hasAliveRole('doctor')) { document.getElementById('doctorAction').classList.remove('hidden'); createActionTargets('doctorTargets', 'doctorSave'); } if (gameSettings.enabledRoles.includes('detective') && hasAliveRole('detective')) { document.getElementById('detectiveAction').classList.remove('hidden'); createActionTargets('detectiveTargets', 'detectiveCheck'); } if (gameSettings.enabledRoles.includes('oracle') && hasAliveRole('oracle')) { document.getElementById('oracleAction').classList.remove('hidden'); createActionTargets('oracleTargets', 'oracleCheck'); } // إظهار تحذير الأخرس إذا كان حياً if (gameSettings.enabledRoles.includes('mute') && hasAliveRole('mute')) { document.getElementById('muteWarning').classList.remove('hidden'); } // إعادة تعيين النتائج document.getElementById('mafiaResult').textContent = ''; document.getElementById('doctorResult').textContent = ''; document.getElementById('detectiveResult').classList.add('hidden'); document.getElementById('oracleResult').classList.add('hidden'); updateRefereeDisplay(); } // التحقق من وجود دور حي function hasAliveRole(role) { return currentGame.alivePlayers.some(player => currentGame.roles[player] === role); } // إنشاء أهداف الأدوار function createActionTargets(containerId, actionType) { const container = document.getElementById(containerId); if (!container) return; container.innerHTML = currentGame.alivePlayers.map(player => `` ).join(''); } // اختيار إجراء function selectAction(actionType, target) { if (!currentGame.alivePlayers.includes(target)) return; currentGame.nightActions[actionType] = target; // تحديث مظهر الأزرار document.querySelectorAll(`[data-action="${actionType}"]`).forEach(btn => { btn.classList.remove('selected-action'); }); const selectedBtn = document.querySelector(`[data-action="${actionType}"][data-target="${target}"]`); if (selectedBtn) { selectedBtn.classList.add('selected-action'); } // إظهار النتائج if (actionType === 'mafiaKill') { document.getElementById('mafiaResult').textContent = `المافيا اختارت: ${target} 🎯`; } else if (actionType === 'doctorSave') { document.getElementById('doctorResult').textContent = `الطبيب اختار: ${target} 🛡️`; } else if (actionType === 'detectiveCheck') { const targetRole = currentGame.roles[target]; const isMafia = targetRole === 'mafia'; document.getElementById('detectiveResultText').textContent = isMafia ? `${target} هو مافيا! 🚨` : `${target} ليس مافيا ✅`; document.getElementById('detectiveResult').classList.remove('hidden'); } else if (actionType === 'oracleCheck') { const targetRole = currentGame.roles[target]; const role = roles[targetRole]; document.getElementById('oracleResultText').textContent = `${target} هو ${role.name} ${role.emoji}`; document.getElementById('oracleResult').classList.remove('hidden'); } } // انتهاء الليل function endNight() { const mafiaKill = currentGame.nightActions.mafiaKill; const doctorSave = currentGame.nightActions.doctorSave; let resultText = ''; let killedPlayer = null; if (!mafiaKill) { resultText = '🌙 المافيا لم تختر أحداً - ليلة هادئة وآمنة 😴'; } else if (mafiaKill === doctorSave) { resultText = `🩺 المافيا حاولت قتل ${mafiaKill} لكن الطبيب أنقذه في اللحظة الأخيرة! 🛡️`; } else { resultText = `💀 ${mafiaKill} تم قتله بواسطة المافيا أثناء الليل`; killedPlayer = mafiaKill; eliminatePlayer(mafiaKill, 'night'); } document.getElementById('nightResultsText').textContent = resultText; // التحقق من انتهاء اللعبة if (checkGameEnd()) { showFinalResults(); return; } startDayPhase(); } // بدء مرحلة النهار function startDayPhase() { currentGame.phase = 'day'; currentGame.votingResult = null; document.getElementById('nightPhase').classList.add('hidden'); document.getElementById('dayPhase').classList.remove('hidden'); // إعادة تعيين مؤقت النقاش const minutes = Math.floor(gameSettings.discussionTime / 60); const seconds = gameSettings.discussionTime % 60; document.getElementById('discussionTimer').textContent = `${minutes}:${seconds.toString().padStart(2, '0')}`; document.getElementById('startDiscussionBtn').disabled = false; document.getElementById('startDiscussionBtn').textContent = '🕐 بدء مؤقت النقاش'; currentGame.discussionTimerActive = false; // إنشاء أهداف التصويت createVotingTargets(); // إخفاء دور القناص document.getElementById('sniperAction').classList.add('hidden'); // إعادة تعيين نتيجة التصويت document.getElementById('votingResult').textContent = ''; updateRefereeDisplay(); } // إنشاء أهداف التصويت function createVotingTargets() { const container = document.getElementById('votingTargets'); if (!container) return; container.innerHTML = currentGame.alivePlayers.map(player => `` ).join(''); } // اختيار هدف التصويت function selectVotingTarget(player) { if (!currentGame.alivePlayers.includes(player)) return; // إزالة التحديد السابق document.querySelectorAll('.voting-target').forEach(btn => { btn.classList.remove('selected-vote'); }); document.getElementById('skipBtn').classList.remove('selected-skip'); // تحديد الهدف الجديد const selectedBtn = document.querySelector(`[onclick="selectVotingTarget('${player}')"]`); if (selectedBtn) { selectedBtn.classList.add('selected-vote'); } currentGame.votingResult = player; document.getElementById('votingResult').textContent = `🗳️ سيتم إقصاء: ${player}`; } // اختيار السكب function selectSkip() { // إزالة التحديد السابق document.querySelectorAll('.voting-target').forEach(btn => { btn.classList.remove('selected-vote'); }); // تحديد السكب document.getElementById('skipBtn').classList.add('selected-skip'); currentGame.votingResult = 'skip'; document.getElementById('votingResult').textContent = '🤝 سِكِب - لا أحد سيخرج هذه الجولة'; } // إقصاء لاعب function eliminatePlayer(player, reason = 'vote') { if (currentGame.alivePlayers.includes(player)) { currentGame.alivePlayers = currentGame.alivePlayers.filter(p => p !== player); currentGame.deadPlayers.push(player); currentGame.playerStats[player].eliminated++; if (reason === 'night') { currentGame.playerStats[player].nightKills++; } } } // استبعاد الأخرس function eliminateMute() { const mutePlayer = currentGame.alivePlayers.find(p => currentGame.roles[p] === 'mute'); if (mutePlayer) { eliminatePlayer(mutePlayer, 'rule'); document.getElementById('votingResult').textContent = `🤐 ${mutePlayer} (الأخرس) تم استبعاده لأنه تكلم!`; document.getElementById('muteWarning').classList.add('hidden'); currentGame.votingResult = mutePlayer; updateRefereeDisplay(); showNotification(`${mutePlayer} تم استبعاده لأنه تكلم!`, 'warning'); } } // بدء مؤقت النقاش function startDiscussionTimer() { if (currentGame.discussionTimerActive) { currentGame.discussionTimerActive = false; } let timeLeft = gameSettings.discussionTime; currentGame.discussionTimerActive = true; document.getElementById('startDiscussionBtn').disabled = true; document.getElementById('startDiscussionBtn').textContent = '⏳ المؤقت يعمل...'; const timer = setInterval(() => { if (!currentGame.discussionTimerActive) { clearInterval(timer); return; } timeLeft--; const minutes = Math.floor(timeLeft / 60); const seconds = timeLeft % 60; document.getElementById('discussionTimer').textContent = `${minutes}:${seconds.toString().padStart(2, '0')}`; // تغيير اللون عند اقتراب انتهاء الوقت const timerElement = document.getElementById('discussionTimer'); if (timeLeft <= 30) { timerElement.classList.add('text-red-600', 'pulse'); } else if (timeLeft <= 60) { timerElement.classList.add('text-yellow-600'); } if (timeLeft <= 0) { clearInterval(timer); currentGame.discussionTimerActive = false; timerElement.textContent = '⏰ انتهى الوقت!'; timerElement.classList.add('text-red-600', 'glow'); document.getElementById('startDiscussionBtn').disabled = false; document.getElementById('startDiscussionBtn').textContent = '🔄 إعادة تشغيل المؤقت'; showNotification('انتهى وقت النقاش!', 'warning'); } }, 1000); } // انتهاء النهار function endDay() { if (!currentGame.votingResult) { showNotification('يرجى اختيار نتيجة التصويت أولاً', 'error'); return; } if (currentGame.votingResult !== 'skip') { const eliminatedPlayer = currentGame.votingResult; const playerRole = currentGame.roles[eliminatedPlayer]; // التحقق من المنتحر if (playerRole === 'bomber') { // المنتحر فاز! document.getElementById('winner').innerHTML = `
💣
${eliminatedPlayer} (المنتحر) فاز!
حقق هدفه بنجاح وفاز ضد الجميع
`; showFinalResults(); return; } // إقصاء اللاعب eliminatePlayer(eliminatedPlayer); // التحقق من القناص if (playerRole === 'sniper') { document.getElementById('sniperAction').classList.remove('hidden'); createSniperTargets(); return; } } // التحقق من انتهاء اللعبة if (checkGameEnd()) { showFinalResults(); return; } // الجولة التالية proceedToNextRound(); } // إنشاء أهداف القناص function createSniperTargets() { const container = document.getElementById('sniperTargets'); if (!container) return; const availableTargets = currentGame.alivePlayers.filter(p => p !== currentGame.votingResult); container.innerHTML = availableTargets.map(player => `` ).join(''); } // قتل القناص function sniperKill(target) { if (!currentGame.alivePlayers.includes(target)) return; eliminatePlayer(target, 'sniper'); document.getElementById('sniperAction').classList.add('hidden'); showNotification(`القناص قتل ${target} قبل موته!`, 'warning'); // التحقق من انتهاء اللعبة if (checkGameEnd()) { showFinalResults(); return; } // متابعة اللعبة proceedToNextRound(); } // المتابعة للجولة التالية function proceedToNextRound() { // التحقق من انتهاء اللعبة if (checkGameEnd()) { showFinalResults(); return; } // الجولة التالية currentGame.round++; if (currentGame.round > gameSettings.rounds) { showFinalResults(); } else { startNightPhase(); } } // التحقق من انتهاء اللعبة function checkGameEnd() { const aliveMafia = currentGame.alivePlayers.filter(p => currentGame.roles[p] === 'mafia').length; const aliveCitizens = currentGame.alivePlayers.filter(p => { const role = currentGame.roles[p]; return roles[role] && roles[role].team === 'citizen'; }).length; return aliveMafia === 0 || aliveMafia >= aliveCitizens || currentGame.alivePlayers.length <= 1; } // إظهار النتائج النهائية function showFinalResults() { document.getElementById('refereeScreen').classList.add('hidden'); document.getElementById('finalResultsScreen').classList.remove('hidden'); // تحديد الفائز مع تفسير مفصل const aliveMafia = currentGame.alivePlayers.filter(p => currentGame.roles[p] === 'mafia').length; const aliveCitizens = currentGame.alivePlayers.filter(p => { const role = currentGame.roles[p]; return roles[role] && roles[role].team === 'citizen'; }).length; let winnerText = ''; let winnerExplanation = ''; let winnerEmoji = ''; // التحقق من الفوز الفردي أولاً const survivorAlive = currentGame.alivePlayers.find(p => currentGame.roles[p] === 'survivor'); if (survivorAlive && !document.getElementById('winner').innerHTML.includes('المنتحر')) { winnerEmoji = '🧑‍🎤'; winnerText = `${survivorAlive} (الناجي) فاز!`; winnerExplanation = 'الناجي حقق هدفه بالبقاء حياً حتى نهاية اللعبة'; } else if (!document.getElementById('winner').innerHTML.includes('المنتحر')) { if (aliveMafia === 0) { winnerEmoji = '🏆'; winnerText = 'المدنيون انتصروا!'; winnerExplanation = 'تم القضاء على جميع أعضاء المافيا بنجاح'; } else if (aliveMafia >= aliveCitizens) { winnerEmoji = '🏆'; winnerText = 'المافيا فازت!'; winnerExplanation = aliveCitizens === 0 ? 'تم القضاء على جميع المدنيين' : 'عدد المافيا أصبح مساوياً أو أكبر من عدد المدنيين'; } else if (currentGame.round > gameSettings.rounds) { winnerEmoji = '🤝'; winnerText = 'انتهت الجولات - تعادل!'; winnerExplanation = 'انتهت جميع الجولات دون تحقيق أي فريق للفوز'; } else { winnerEmoji = '🤝'; winnerText = 'تعادل!'; winnerExplanation = 'لم يحقق أي فريق شروط الفوز'; } document.getElementById('winner').innerHTML = `
${winnerEmoji}
${winnerText}
${winnerExplanation}
`; } // حساب الإنجازات calculateAchievements(); // إنشاء إحصائيات اللاعبين createPlayerStats(); // إنشاء دليل الإعلان للحكم createAnnouncementGuide(); // إنشاء قائمة كشف الأدوار createRoleRevealList(); } // إنشاء دليل الإعلان للحكم function createAnnouncementGuide() { const aliveMafia = currentGame.alivePlayers.filter(p => currentGame.roles[p] === 'mafia').length; const aliveCitizens = currentGame.alivePlayers.filter(p => { const role = currentGame.roles[p]; return roles[role] && roles[role].team === 'citizen'; }).length; let announcements = []; // إعلان النتيجة الرئيسية const survivorAlive = currentGame.alivePlayers.find(p => currentGame.roles[p] === 'survivor'); const bomberWon = document.getElementById('winner').innerHTML.includes('المنتحر'); if (bomberWon) { const bomber = players.find(p => currentGame.roles[p] === 'bomber'); announcements.push(`💣 أعلن للجميع: "${bomber} (المنتحر) فاز بتحقيق هدفه! لعبة رائعة!"`); } else if (survivorAlive) { announcements.push(`🧑‍🎤 أعلن للجميع: "${survivorAlive} (الناجي) فاز بتحقيق هدفه!"`); } else if (aliveMafia === 0) { announcements.push(`🏆 أعلن للجميع: "المدنيون انتصروا! تم القضاء على جميع أعضاء المافيا!"`); } else if (aliveMafia >= aliveCitizens) { announcements.push(`🏆 أعلن للجميع: "المافيا فازت! ${aliveCitizens === 0 ? 'تم القضاء على جميع المدنيين' : 'أصبح عددهم مساوياً أو أكبر من المدنيين'}!"`); } // كشف الأدوار announcements.push(`🎭 اكشف جميع الأدوار: "الآن سأكشف لكم أدوار جميع اللاعبين في هذه الجولة..."`); // إحصائيات مهمة const survivors = currentGame.alivePlayers; const firstEliminated = currentGame.deadPlayers[0]; if (survivors.length > 0) { announcements.push(`🛡️ الناجون حتى النهاية: ${survivors.join(', ')}`); } if (firstEliminated) { announcements.push(`💀 أول من خرج: ${firstEliminated}`); } // نصائح للحكم announcements.push(`
📋 نصائح مهمة للحكم:
`); document.getElementById('announcementContent').innerHTML = announcements.map(announcement => `
${announcement}
`).join(''); } // حساب الإنجازات function calculateAchievements() { const achievements = []; // الناجون if (currentGame.alivePlayers.length > 0) { achievements.push({ emoji: '🛡️', title: 'الناجون', subtitle: 'بقوا أحياء', players: currentGame.alivePlayers, color: 'bg-green-500/20 border-green-400' }); } // أول من خرج if (currentGame.deadPlayers.length > 0) { achievements.push({ emoji: '💀', title: 'أول ضحية', subtitle: 'خرج أولاً', players: [currentGame.deadPlayers[0]], color: 'bg-red-500/20 border-red-400' }); } // أعضاء المافيا const mafiaPlayers = players.filter(p => currentGame.roles[p] === 'mafia'); if (mafiaPlayers.length > 0) { achievements.push({ emoji: '🕵️‍♂️', title: 'المافيا', subtitle: 'الأشرار', players: mafiaPlayers, color: 'bg-red-500/20 border-red-400' }); } // الأدوار الخاصة const specialRoles = ['detective', 'doctor', 'sniper', 'oracle', 'bomber', 'survivor', 'mute', 'zombie', 'disguise']; specialRoles.forEach(roleKey => { const rolePlayers = players.filter(p => currentGame.roles[p] === roleKey); if (rolePlayers.length > 0) { const role = roles[roleKey]; achievements.push({ emoji: role.emoji, title: role.name, subtitle: role.team === 'mafia' ? 'شرير' : role.team === 'citizen' ? 'بطل' : 'مستقل', players: rolePlayers, color: `bg-${role.team === 'mafia' ? 'red' : role.team === 'citizen' ? 'green' : 'yellow'}-500/20 border-${role.team === 'mafia' ? 'red' : role.team === 'citizen' ? 'green' : 'yellow'}-400` }); } }); // عرض الإنجازات const achievementsHtml = achievements.map(achievement => `
${achievement.emoji}
${achievement.title}
${achievement.subtitle}
${achievement.players.join(', ')}
` ).join(''); document.getElementById('achievementsList').innerHTML = achievementsHtml; } // إنشاء إحصائيات اللاعبين function createPlayerStats() { // ترتيب اللاعبين: الأحياء أولاً، ثم الموتى const sortedPlayers = [...currentGame.alivePlayers, ...currentGame.deadPlayers]; const statsHtml = sortedPlayers.map(player => { const stats = currentGame.playerStats[player]; const role = roles[currentGame.roles[player]]; const isAlive = currentGame.alivePlayers.includes(player); // تحديد إنجازات خاصة let specialAchievements = []; if (isAlive) { specialAchievements.push('🛡️ نجا حتى النهاية'); } if (currentGame.deadPlayers[0] === player) { specialAchievements.push('💀 أول من خرج'); } if (currentGame.roles[player] === 'bomber' && document.getElementById('winner').innerHTML.includes('المنتحر')) { specialAchievements.push('💣 حقق هدف المنتحر'); } if (currentGame.roles[player] === 'survivor' && isAlive) { specialAchievements.push('🧑‍🎤 حقق هدف الناجي'); } return `

${player}

${isAlive ? '🟢' : '💀'}
الدور: ${role.emoji} ${role.name}
الفريق: ${role.team === 'mafia' ? '🔴 المافيا' : role.team === 'citizen' ? '🟢 المدنيون' : '🟡 مستقل'}
مرات الإقصاء: ${stats.eliminated}
${stats.nightKills > 0 ? `
قُتل ليلاً: ${stats.nightKills}
` : ''}
الحالة النهائية: ${isAlive ? '✅ حي' : '❌ ميت'}
${specialAchievements.length > 0 ? `
🏅 الإنجازات:
${specialAchievements.map(achievement => `
${achievement}
` ).join('')}
` : ''}
`; }).join(''); document.getElementById('playerStats').innerHTML = statsHtml; } // إنشاء قائمة كشف الأدوار function createRoleRevealList() { // ترتيب اللاعبين حسب الفرق const mafiaPlayers = players.filter(p => currentGame.roles[p] === 'mafia'); const citizenPlayers = players.filter(p => { const role = currentGame.roles[p]; return roles[role] && roles[role].team === 'citizen'; }); const independentPlayers = players.filter(p => { const role = currentGame.roles[p]; return roles[role] && roles[role].team === 'independent'; }); let roleRevealHtml = ''; // عرض المافيا if (mafiaPlayers.length > 0) { roleRevealHtml += `

🕵️‍♂️ فريق المافيا

${mafiaPlayers.map(player => { const role = roles[currentGame.roles[player]]; const isAlive = currentGame.alivePlayers.includes(player); return `
${role.emoji} ${player} ${isAlive ? '(حي)' : '(ميت)'}
`; }).join('')}
`; } // عرض المدنيين if (citizenPlayers.length > 0) { roleRevealHtml += `

🧑‍🤝‍🧑 فريق المدنيين

${citizenPlayers.map(player => { const role = roles[currentGame.roles[player]]; const isAlive = currentGame.alivePlayers.includes(player); return `
${role.emoji} ${player} - ${role.name} ${isAlive ? '(حي)' : '(ميت)'}
`; }).join('')}
`; } // عرض الأدوار المستقلة if (independentPlayers.length > 0) { roleRevealHtml += `

⭐ الأدوار المستقلة

${independentPlayers.map(player => { const role = roles[currentGame.roles[player]]; const isAlive = currentGame.alivePlayers.includes(player); return `
${role.emoji} ${player} - ${role.name} ${isAlive ? '(حي)' : '(ميت)'}
`; }).join('')}
`; } document.getElementById('roleRevealList').innerHTML = roleRevealHtml; } // إعادة اللعب function playAgain() { // إعادة تعيين متغيرات اللعبة currentGame = { round: 1, phase: 'night', currentPlayerIndex: 0, roles: {}, alivePlayers: [], deadPlayers: [], playerStats: {}, nightActions: { mafiaKill: null, doctorSave: null, detectiveCheck: null, oracleCheck: null }, votingResult: null, specialAbilities: { zombieRevived: false, disguiseUsed: false }, discussionTimerActive: false }; showNotification('بدء لعبة جديدة بنفس اللاعبين!', 'success'); startGame(); } // لعبة جديدة function newGame() { // إعادة تعيين كل شيء players = []; gameSettings = { rounds: 5, discussionTime: 120, enabledRoles: [] }; currentGame = { round: 1, phase: 'night', currentPlayerIndex: 0, roles: {}, alivePlayers: [], deadPlayers: [], playerStats: {}, nightActions: { mafiaKill: null, doctorSave: null, detectiveCheck: null, oracleCheck: null }, votingResult: null, specialAbilities: { zombieRevived: false, disguiseUsed: false }, discussionTimerActive: false }; // إعادة تعيين الأدوار المختارة document.querySelectorAll('#rolesConfig input[type="checkbox"]').forEach(cb => { cb.checked = false; }); // العودة لشاشة البداية document.getElementById('finalResultsScreen').classList.add('hidden'); document.getElementById('startScreen').classList.remove('hidden'); updatePlayersList(); updateStartButton(); showNotification('مرحباً بك في لعبة جديدة!', 'success'); } // إضافة مستمع للضغط على Enter document.getElementById('playerNameInput').addEventListener('keypress', function(e) { if (e.key === 'Enter') { addPlayer(); } }); // تحديث زر البداية عند تحميل الصفحة document.addEventListener('DOMContentLoaded', function() { updateStartButton(); // إضافة تأثيرات بصرية للخلفية const body = document.body; body.addEventListener('mousemove', function(e) { const mouseX = e.clientX / window.innerWidth; const mouseY = e.clientY / window.innerHeight; body.style.background = ` radial-gradient(circle at ${mouseX * 100}% ${mouseY * 100}%, rgba(139, 69, 19, 0.1) 0%, transparent 50%), linear-gradient(135deg, #1a1a2e 0%, #16213e 25%, #0f3460 50%, #533483 100%) `; }); });