V-Booking commited on
Commit
b64c847
·
verified ·
1 Parent(s): e8aace9

Add 1 files

Browse files
Files changed (1) hide show
  1. index.html +826 -222
index.html CHANGED
@@ -27,6 +27,7 @@
27
  font-weight: bold;
28
  position: relative;
29
  cursor: pointer;
 
30
  }
31
 
32
  .card:hover {
@@ -37,6 +38,8 @@
37
  .card-back {
38
  background: linear-gradient(45deg, #8e2de2, #4a00e0);
39
  color: white;
 
 
40
  }
41
 
42
  .card-front {
@@ -46,6 +49,7 @@
46
 
47
  .player-area {
48
  transition: all 0.3s ease;
 
49
  }
50
 
51
  .player-area.active {
@@ -53,9 +57,35 @@
53
  box-shadow: 0 0 15px rgba(76, 175, 80, 0.5);
54
  }
55
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
  .special-card {
57
  background: linear-gradient(45deg, #ff416c, #ff4b2b);
58
  color: white;
 
 
 
 
 
 
 
 
 
 
 
 
59
  }
60
 
61
  .modal {
@@ -66,6 +96,86 @@
66
  opacity: 1;
67
  pointer-events: auto;
68
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
  </style>
70
  </head>
71
  <body class="text-gray-800">
@@ -79,21 +189,33 @@
79
  <div id="mode-selection" class="bg-white rounded-lg shadow-lg p-6 mb-8">
80
  <h2 class="text-2xl font-bold mb-4 text-center text-indigo-700">اختر نمط اللعبة</h2>
81
  <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
82
- <div class="mode-option bg-indigo-50 hover:bg-indigo-100 rounded-lg p-4 cursor-pointer transition" data-mode="general">
 
 
 
83
  <h3 class="font-bold text-lg text-indigo-800">سكرو العامة</h3>
84
- <p class="text-gray-600">يمكن اللعبة واضافة جميع الاوراق</p>
85
  </div>
86
- <div class="mode-option bg-indigo-50 hover:bg-indigo-100 rounded-lg p-4 cursor-pointer transition" data-mode="classic">
 
 
 
87
  <h3 class="font-bold text-lg text-indigo-800">سكرو كلاسيك</h3>
88
- <p class="text-gray-600">جميع الاوراق ما عدا كرت الحرامي وكرتين بينج وبونج</p>
89
  </div>
90
- <div class="mode-option bg-indigo-50 hover:bg-indigo-100 rounded-lg p-4 cursor-pointer transition" data-mode="thief">
 
 
 
91
  <h3 class="font-bold text-lg text-indigo-800">سكرو الحرامي</h3>
92
- <p class="text-gray-600">جميع الاوراق ما عدا كرت بينج وبونج</p>
93
  </div>
94
- <div class="mode-option bg-indigo-50 hover:bg-indigo-100 rounded-lg p-4 cursor-pointer transition" data-mode="duos">
 
 
 
95
  <h3 class="font-bold text-lg text-indigo-800">سكرو الثنائيات</h3>
96
- <p class="text-gray-600">جميع الاوراق ما عدا كرت الحرامي</p>
97
  </div>
98
  </div>
99
  </div>
@@ -103,37 +225,49 @@
103
  <h2 class="text-2xl font-bold mb-4 text-center text-indigo-700">إعداد اللاعبين</h2>
104
  <div class="mb-4">
105
  <label class="block text-gray-700 mb-2">عدد اللاعبين (2-6)</label>
106
- <input type="number" min="2" max="6" value="4" class="w-full px-3 py-2 border border-gray-300 rounded-md">
107
  </div>
108
  <div id="player-names" class="space-y-3">
109
  <!-- Player name inputs will be added here -->
110
  </div>
111
- <button id="start-game" class="w-full bg-indigo-600 hover:bg-indigo-700 text-white font-bold py-2 px-4 rounded-md mt-4 transition">
112
- بدء اللعبة
113
  </button>
114
  </div>
115
 
116
  <!-- Game Board -->
117
  <div id="game-board" class="hidden">
118
  <!-- Game Info -->
119
- <div class="flex justify-between items-center mb-6">
120
- <div class="bg-white rounded-lg shadow px-4 py-2">
121
- <span class="font-bold">الجولة:</span> <span id="round-number">1</span>
122
- <span class="mx-2">|</span>
123
- <span class="font-bold">النمط:</span> <span id="game-mode">سكرو العامة</span>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
  </div>
125
- <button id="end-game" class="bg-red-500 hover:bg-red-600 text-white px-4 py-2 rounded-lg transition">
126
- إنهاء اللعبة
127
- </button>
128
  </div>
129
 
130
  <!-- Center Area -->
131
- <div class="relative mb-16">
132
  <!-- Draw Pile -->
133
  <div class="absolute left-1/2 transform -translate-x-1/2 -top-8">
134
- <div id="draw-pile" class="card card-back flex flex-col items-center justify-center">
135
  <i class="fas fa-layer-group text-2xl"></i>
136
  <span class="text-xs mt-1">السحب</span>
 
137
  </div>
138
  </div>
139
 
@@ -145,9 +279,11 @@
145
  </div>
146
 
147
  <!-- Current Round Info -->
148
- <div class="absolute right-0 -top-8 bg-white rounded-lg shadow px-4 py-1 text-center">
149
  <div id="round-info" class="font-bold text-indigo-700">الجولة الأولى: النظر إلى أول كرتين على اليمين</div>
150
- <div id="round-warning" class="text-xs text-red-500 hidden">تحذير: +10 عند مخالفة قواعد الجولة</div>
 
 
151
  </div>
152
  </div>
153
 
@@ -158,22 +294,26 @@
158
 
159
  <!-- Current Player Actions -->
160
  <div id="player-actions" class="bg-white rounded-lg shadow-lg p-4 mt-8 hidden">
161
- <h3 class="font-bold mb-2 text-center">اختياراتك</h3>
162
- <div class="grid grid-cols-1 md:grid-cols-3 gap-3">
163
- <button id="draw-from-pile" class="bg-blue-500 hover:bg-blue-600 text-white py-2 px-4 rounded transition">
164
- <i class="fas fa-draw-polygon mr-2"></i> سحب من ميدان الكروت
 
165
  </button>
166
- <button id="draw-from-discard" class="bg-green-500 hover:bg-green-600 text-white py-2 px-4 rounded transition">
167
- <i class="fas fa-hand-paper mr-2"></i> سحب من الأرض
 
168
  </button>
169
- <button id="play-similar" class="bg-purple-500 hover:bg-purple-600 text-white py-2 px-4 rounded transition">
170
- <i class="fas fa-exchange-alt mr-2"></i> التخلص من كرت مشابه
 
171
  </button>
172
  </div>
173
- <div class="mt-4 text-center">
174
- <button id="declare-skru" class="bg-red-500 hover:bg-red-600 text-white py-2 px-6 rounded-lg font-bold transition">
175
  <i class="fas fa-flag mr-2"></i> سكرو!
176
  </button>
 
177
  </div>
178
  </div>
179
  </div>
@@ -181,16 +321,49 @@
181
  <!-- Card Selection Modal -->
182
  <div id="card-selection-modal" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50 opacity-0 pointer-events-none modal">
183
  <div class="bg-white rounded-lg shadow-xl p-6 w-full max-w-md">
184
- <h3 class="font-bold text-xl mb-4 text-center">اختر كرت</h3>
185
- <div id="selectable-cards" class="flex flex-wrap justify-center gap-2 mb-4">
186
  <!-- Cards will be added here -->
187
  </div>
188
  <div class="flex justify-center gap-4">
189
- <button id="confirm-selection" class="bg-green-500 hover:bg-green-600 text-white px-4 py-2 rounded transition">
190
- تأكيد
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
191
  </button>
192
- <button id="cancel-selection" class="bg-gray-500 hover:bg-gray-600 text-white px-4 py-2 rounded transition">
193
- إلغاء
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
194
  </button>
195
  </div>
196
  </div>
@@ -199,13 +372,16 @@
199
  <!-- Game Over Modal -->
200
  <div id="game-over-modal" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50 opacity-0 pointer-events-none modal">
201
  <div class="bg-white rounded-lg shadow-xl p-6 w-full max-w-md">
202
- <h3 class="font-bold text-2xl mb-4 text-center text-indigo-800">نتيجة اللعبة</h3>
203
- <div id="game-results" class="mb-6">
204
  <!-- Results will be added here -->
205
  </div>
206
- <div class="flex justify-center">
207
- <button id="play-again" class="bg-indigo-600 hover:bg-indigo-700 text-white px-6 py-2 rounded-lg font-bold transition">
208
- لعب مرة أخرى
 
 
 
209
  </button>
210
  </div>
211
  </div>
@@ -222,13 +398,13 @@
222
  </div>
223
 
224
  <div class="space-y-4">
225
- <div>
226
- <h4 class="font-bold text-lg">هدف اللعبة:</h4>
227
  <p>الحصول على أقل عدد من الأرقام في نهاية الجولة.</p>
228
  </div>
229
 
230
- <div>
231
- <h4 class="font-bold text-lg">بداية اللعبة:</h4>
232
  <ul class="list-disc list-inside space-y-1">
233
  <li>كل لاعب يحصل على 4 كروت غير مكشوفة</li>
234
  <li>يتم وضع ميدان للكروت في المنتصف</li>
@@ -236,116 +412,130 @@
236
  </ul>
237
  </div>
238
 
239
- <div>
240
- <h4 class="font-bold text-lg">طرق اللعب:</h4>
241
  <div class="grid grid-cols-1 md:grid-cols-2 gap-3">
242
- <div class="bg-indigo-50 p-3 rounded">
243
- <h5 class="font-bold">سكرو العامة</h5>
244
- <p>يمكن اللعبة واضافة جميع الاوراق</p>
245
  </div>
246
- <div class="bg-indigo-50 p-3 rounded">
247
- <h5 class="font-bold">سكرو كلاسيك</h5>
248
- <p>جميع الاوراق ما عدا كرت الحرامي وكرتين بينج وبونج</p>
249
  </div>
250
- <div class="bg-indigo-50 p-3 rounded">
251
- <h5 class="font-bold">سكرو الحرامي</h5>
252
- <p>جميع الاوراق ما عدا كرت بينج وبونج</p>
253
  </div>
254
- <div class="bg-indigo-50 p-3 rounded">
255
- <h5 class="font-bold">سكرو الثنائيات</h5>
256
- <p>جميع الاوراق ما عدا كرت الحرامي</p>
257
  </div>
258
  </div>
259
  </div>
260
 
261
- <div>
262
- <h4 class="font-bold text-lg">خيارات اللاعب:</h4>
263
- <ol class="list-decimal list-inside space-y-1">
264
- <li>سحب من ميدان الكروت ثم الاحتفاظ به أو التخلص منه</li>
265
- <li>سحب من الأرض آخر كرت تركه اللاعب السابق</li>
266
- <li>التخلص من كرت يشابه آخر كرت في الأرض</li>
267
  </ol>
268
- <p class="mt-2 text-red-500 text-sm">⛔️ تحذير: إذا لم يكن الكرت مشابهاً يعود إليه كرته + الكرت الآخر</p>
 
 
 
269
  </div>
270
 
271
- <div>
272
- <h4 class="font-bold text-lg">جولات اللعبة:</h4>
273
  <div class="space-y-3">
274
- <div class="bg-yellow-50 p-3 rounded">
275
- <h5 class="font-bold">الجولة الأولى</h5>
276
- <p>ينظر الجميع إلى أول كرتين على اليمين فقط</p>
277
- <p class="text-red-500 text-sm">⛔️ تحذير: +10 عند النظر إلى أكثر من كرتين أو تبديل الكروت</p>
 
 
278
  </div>
279
- <div class="bg-blue-50 p-3 rounded">
280
- <h5 class="font-bold">الجولة الثانية (الصامتة)</h5>
281
- <p>لا يجوز الكلام خلال هذه الجولة</p>
282
- <p class="text-red-500 text-sm">⛔️ تحذير: +10 عند الكلام</p>
 
 
283
  </div>
284
- <div class="bg-green-50 p-3 rounded">
285
- <h5 class="font-bold">الجولة الثالثة</h5>
286
- <p>لا يستطيع أي لاعب النظر إلى كروته</p>
287
- <p class="text-red-500 text-sm">⛔️ تحذير: +10 عند النظر إلى أي كرت</p>
 
 
288
  </div>
289
- <div class="bg-purple-50 p-3 rounded">
290
- <h5 class="font-bold">الجولة الرابعة</h5>
291
- <p>جولة الدبل: مجموع ما تحصل عليه بعد انتهاء الجولة × 2</p>
292
  </div>
293
  </div>
294
  </div>
295
 
296
- <div>
297
- <h4 class="font-bold text-lg">مهام الكروت الخاصة:</h4>
298
  <div class="grid grid-cols-1 md:grid-cols-2 gap-3">
299
- <div class="bg-pink-50 p-3 rounded">
300
- <h5 class="font-bold">7 أو 8</h5>
301
- <p>تنظر في كرت واحد فقط من كروتك</p>
302
  </div>
303
- <div class="bg-pink-50 p-3 rounded">
304
- <h5 class="font-bold">9 أو 10</h5>
305
- <p>تنظر في كرت واحد فقط من أحد اللاعبين</p>
306
  </div>
307
- <div class="bg-pink-50 p-3 rounded">
308
- <h5 class="font-bold">البصرة</h5>
309
- <p>تستطيع التخلص من كرت من كروتك باختيارك</p>
310
  </div>
311
- <div class="bg-pink-50 p-3 rounded">
312
- <h5 class="font-bold">خذ وهات</h5>
313
- <p>تستبدل كرت من أحد اللاعبين بكرت من عندك دون النظر</p>
314
  </div>
315
- <div class="bg-pink-50 p-3 rounded">
316
- <h5 class="font-bold">خذ بس</h5>
317
- <p>تستطيع إعطاء كرت من كروتك لأحد اللاعبين</p>
318
  </div>
319
- <div class="bg-pink-50 p-3 rounded">
320
- <h5 class="font-bold">دائر ما يدور</h5>
321
- <p>تنظر في كرت واحد من كل لاعب أو كرتين من أوراقك</p>
322
  </div>
323
- <div class="bg-pink-50 p-3 rounded">
324
- <h5 class="font-bold">عجب ما عجب</h5>
325
- <p>مثل خذ وهات ولكن مع خيار الاستبدال مع لاعب آخر</p>
326
  </div>
327
- <div class="bg-pink-50 p-3 rounded">
328
- <h5 class="font-bold">الحرامي</h5>
329
- <p>لا يمكن التخلص منه ويقوم بسرقة نقاط الخصم</p>
330
  </div>
331
- <div class="bg-pink-50 p-3 rounded">
332
- <h5 class="font-bold">بونج/بينج</h5>
333
- <p>تمنع فريق الخصم من اللعب في الجولة التالية</p>
334
  </div>
335
  </div>
336
  </div>
337
 
338
- <div>
339
- <h4 class="font-bold text-lg">نهاية اللعبة:</h4>
340
- <p>عندما يقول لاعب "سكرو"، يكمل الجميع حتى يعود دوره ثم تكشف الكروت. اللاعب الأقل عدداً هو الفائز، وقد يكون هناك أكثر من فائز. الخاسر هو من لديه أكبر مجموع أرقام.</p>
341
  </div>
342
  </div>
343
  </div>
344
  </div>
345
 
346
  <!-- Help Button -->
347
- <button id="help-button" class="fixed bottom-6 left-6 bg-indigo-600 text-white w-12 h-12 rounded-full shadow-lg flex items-center justify-center hover:bg-indigo-700 transition z-40">
348
- <i class="fas fa-question text-xl"></i>
 
 
 
 
 
349
  </button>
350
  </div>
351
 
@@ -361,15 +551,22 @@
361
  gameStarted: false,
362
  skruDeclared: false,
363
  skruPlayer: null,
 
364
  specialCards: {
365
- thief: 'الحرامي',
366
- bing: 'بينج',
367
- bong: 'بونج',
368
- basra: 'البصرة',
369
- takeAndGive: 'خذ وهات',
370
- takeOnly: 'خذ بس',
371
- lookAround: 'دائر ما يدور',
372
- likeOrNot: 'عجب ما عجب'
 
 
 
 
 
 
373
  }
374
  };
375
 
@@ -383,14 +580,24 @@
383
  const discardPile = document.getElementById('discard-pile');
384
  const roundNumber = document.getElementById('round-number');
385
  const gameMode = document.getElementById('game-mode');
 
386
  const roundInfo = document.getElementById('round-info');
387
  const roundWarning = document.getElementById('round-warning');
388
  const cardSelectionModal = document.getElementById('card-selection-modal');
 
389
  const selectableCards = document.getElementById('selectable-cards');
 
 
 
 
 
 
390
  const gameOverModal = document.getElementById('game-over-modal');
391
  const gameResults = document.getElementById('game-results');
392
  const rulesModal = document.getElementById('rules-modal');
393
  const helpButton = document.getElementById('help-button');
 
 
394
 
395
  // Buttons
396
  const startGameBtn = document.getElementById('start-game');
@@ -401,8 +608,22 @@
401
  const declareSkruBtn = document.getElementById('declare-skru');
402
  const confirmSelectionBtn = document.getElementById('confirm-selection');
403
  const cancelSelectionBtn = document.getElementById('cancel-selection');
 
 
 
404
  const playAgainBtn = document.getElementById('play-again');
 
405
  const closeRulesBtn = document.getElementById('close-rules');
 
 
 
 
 
 
 
 
 
 
406
 
407
  // Event Listeners
408
  document.querySelectorAll('.mode-option').forEach(option => {
@@ -439,11 +660,17 @@
439
  declareSkruBtn.addEventListener('click', declareSkru);
440
  confirmSelectionBtn.addEventListener('click', confirmCardSelection);
441
  cancelSelectionBtn.addEventListener('click', cancelCardSelection);
 
 
 
442
  playAgainBtn.addEventListener('click', resetGame);
 
443
  helpButton.addEventListener('click', showRules);
444
  closeRulesBtn.addEventListener('click', hideRules);
 
 
445
 
446
- // Functions
447
  function setupPlayerInputs(count) {
448
  const playerNames = document.getElementById('player-names');
449
  playerNames.innerHTML = '';
@@ -452,8 +679,10 @@
452
  const div = document.createElement('div');
453
  div.className = 'flex items-center';
454
  div.innerHTML = `
455
- <span class="bg-indigo-100 text-indigo-800 px-3 py-2 rounded-l-md">لاعب ${i+1}</span>
456
- <input type="text" class="flex-1 px-3 py-2 border border-gray-300 rounded-r-md" placeholder="اسم اللاعب" required>
 
 
457
  `;
458
  playerNames.appendChild(div);
459
  }
@@ -470,7 +699,8 @@
470
  name: input.value.trim(),
471
  cards: [],
472
  points: 0,
473
- isActive: false
 
474
  });
475
  }
476
  });
@@ -488,6 +718,12 @@
488
  }
489
 
490
  function initializeGame() {
 
 
 
 
 
 
491
  // Create deck based on game mode
492
  gameState.drawPile = createDeck();
493
 
@@ -518,6 +754,9 @@
518
 
519
  // Show actions for current player
520
  playerActions.classList.remove('hidden');
 
 
 
521
  }
522
 
523
  function createDeck() {
@@ -591,21 +830,52 @@
591
  playerDiv.className = `player-area bg-white rounded-lg shadow p-4 ${player.isActive ? 'active' : ''}`;
592
 
593
  const playerName = document.createElement('h3');
594
- playerName.className = 'font-bold text-lg text-center mb-2';
595
  playerName.textContent = player.name;
596
 
 
 
 
 
 
 
 
597
  const playerCards = document.createElement('div');
598
  playerCards.className = 'flex justify-center gap-2';
599
 
600
  player.cards.forEach((card, cardIndex) => {
601
  const cardDiv = document.createElement('div');
602
  cardDiv.className = `card ${card.isFaceUp ? 'card-front' : 'card-back'}`;
603
- cardDiv.textContent = card.isFaceUp ? card.value : '';
604
  cardDiv.dataset.playerIndex = index;
605
  cardDiv.dataset.cardIndex = cardIndex;
606
 
607
- if (card.isFaceUp && typeof card.value === 'string') {
608
- cardDiv.classList.add('special-card');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
609
  }
610
 
611
  playerCards.appendChild(cardDiv);
@@ -627,23 +897,159 @@
627
  const lastCard = gameState.discardPile[gameState.discardPile.length - 1];
628
  const cardDiv = document.createElement('div');
629
  cardDiv.className = 'card card-front';
630
- cardDiv.textContent = lastCard;
631
 
632
- if (typeof lastCard === 'string') {
633
- cardDiv.classList.add('special-card');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
634
  }
635
 
636
  discardPile.appendChild(cardDiv);
637
  }
638
 
639
  // Update draw pile count
640
- drawPile.innerHTML = `
641
- <i class="fas fa-layer-group text-2xl"></i>
642
- <span class="text-xs mt-1">${gameState.drawPile.length}</span>
643
- `;
644
 
645
  // Update round number
646
  roundNumber.textContent = gameState.round;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
647
  }
648
 
649
  function updateRoundInfo() {
@@ -682,22 +1088,40 @@
682
  function drawFromPile() {
683
  if (gameState.drawPile.length === 0) {
684
  alert('لا توجد كروت متبقية في ميدان السحب!');
 
685
  return;
686
  }
687
 
688
  const drawnCard = gameState.drawPile.pop();
689
  const currentPlayer = gameState.players[gameState.currentPlayerIndex];
690
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
691
  // Show card selection modal to choose whether to keep or discard
692
  showCardSelectionModal([{
693
  value: drawnCard,
694
  isFaceUp: true
695
  }], 'ماذا تريد أن تفعل بهذا الكرت؟', true);
 
 
696
  }
697
 
698
  function drawFromDiscard() {
699
  if (gameState.discardPile.length === 0) {
700
  alert('لا توجد كروت في الأرض!');
 
701
  return;
702
  }
703
 
@@ -714,6 +1138,7 @@
714
  checkForSimilarCards();
715
 
716
  updateGameBoard();
 
717
  }
718
 
719
  function playSimilarCard() {
@@ -722,11 +1147,15 @@
722
 
723
  // Find cards that match the last discarded card
724
  const similarCards = currentPlayer.cards.filter(card =>
725
- card.isFaceUp && card.value === lastDiscard
 
 
 
726
  );
727
 
728
  if (similarCards.length === 0) {
729
  alert('ليس لديك أي كرت مشابه لآخر كرت في الأرض!');
 
730
  return;
731
  }
732
 
@@ -746,6 +1175,7 @@
746
  playerActions.classList.add('hidden');
747
 
748
  alert(`أعلن ${gameState.players[gameState.skruPlayer].name} "سكرو"! سيتم احتساب النقاط بعد انتهاء الجولة.`);
 
749
  }
750
  }
751
 
@@ -755,7 +1185,10 @@
755
 
756
  // Check if player has any cards that match the last discarded card
757
  const hasSimilar = currentPlayer.cards.some(card =>
758
- card.isFaceUp && card.value === lastDiscard
 
 
 
759
  );
760
 
761
  if (hasSimilar) {
@@ -826,84 +1259,63 @@
826
 
827
  function showCardSelectionModal(cards, message, showKeepOption = false) {
828
  selectableCards.innerHTML = '';
829
-
830
- // Add message
831
- const msgDiv = document.createElement('div');
832
- msgDiv.className = 'w-full text-center mb-3 font-bold';
833
- msgDiv.textContent = message;
834
- selectableCards.appendChild(msgDiv);
835
 
836
  // Add cards
837
  cards.forEach((card, index) => {
838
  const cardDiv = document.createElement('div');
839
  cardDiv.className = `card ${card.isFaceUp ? 'card-front' : 'card-back'} cursor-pointer`;
840
- cardDiv.textContent = card.isFaceUp ? card.value : '';
841
  cardDiv.dataset.cardIndex = index;
842
 
843
- if (card.isFaceUp && typeof card.value === 'string') {
844
- cardDiv.classList.add('special-card');
845
- }
846
-
847
- cardDiv.addEventListener('click', () => {
848
- // Toggle selection
849
- document.querySelectorAll('#selectable-cards .card').forEach(c => {
850
- c.classList.remove('ring-4', 'ring-yellow-400');
851
- });
852
- cardDiv.classList.add('ring-4', 'ring-yellow-400');
853
- });
854
-
855
- selectableCards.appendChild(cardDiv);
856
- });
857
-
858
- // Show keep/discard options if needed
859
- if (showKeepOption) {
860
- const optionsDiv = document.createElement('div');
861
- optionsDiv.className = 'flex justify-center gap-4 mt-3';
862
- optionsDiv.innerHTML = `
863
- <button id="keep-card" class="bg-green-500 hover:bg-green-600 text-white px-3 py-1 rounded">احتفظ بالكرت</button>
864
- <button id="discard-card" class="bg-red-500 hover:bg-red-600 text-white px-3 py-1 rounded">تخلص من الكرت</button>
865
- `;
866
- selectableCards.appendChild(optionsDiv);
867
-
868
- document.getElementById('keep-card').addEventListener('click', () => {
869
- const selectedCard = document.querySelector('#selectable-cards .card.ring-4');
870
- if (selectedCard) {
871
- const cardIndex = selectedCard.dataset.cardIndex;
872
- const currentPlayer = gameState.players[gameState.currentPlayerIndex];
873
-
874
- // Add card to player's hand
875
- currentPlayer.cards.push(cards[cardIndex]);
876
-
877
- // Hide modal and continue
878
- hideCardSelectionModal();
879
- updateGameBoard();
880
- checkForSimilarCards();
881
- } else {
882
- alert('الرجاء اختيار كرت أولاً');
883
- }
884
- });
885
-
886
- document.getElementById('discard-card').addEventListener('click', () => {
887
- const selectedCard = document.querySelector('#selectable-cards .card.ring-4');
888
- if (selectedCard) {
889
- const cardIndex = selectedCard.dataset.cardIndex;
890
 
891
- // Add card to discard pile
892
- gameState.discardPile.push(cards[cardIndex].value);
893
-
894
- // Hide modal and continue
895
- hideCardSelectionModal();
896
- updateGameBoard();
897
- nextPlayer();
898
  } else {
899
- alert('الرجاء اختيار كرت أولاً');
900
- }
901
- });
902
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
903
 
904
  // Show modal
905
- cardSelectionModal.classList.remove('opacity-0', 'pointer-events-none');
906
- cardSelectionModal.classList.add('opacity-100');
907
  }
908
 
909
  function hideCardSelectionModal() {
@@ -911,10 +1323,16 @@
911
  cardSelectionModal.classList.add('opacity-0', 'pointer-events-none');
912
  }
913
 
 
 
 
 
 
914
  function confirmCardSelection() {
915
  const selectedCard = document.querySelector('#selectable-cards .card.ring-4');
916
  if (!selectedCard) {
917
  alert('الرجاء اختيار كرت أولاً');
 
918
  return;
919
  }
920
 
@@ -922,13 +1340,46 @@
922
  const currentPlayer = gameState.players[gameState.currentPlayerIndex];
923
  const lastDiscard = gameState.discardPile[gameState.discardPile.length - 1];
924
 
925
- // Get the actual card from player's hand
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
926
  const selectedCardObj = currentPlayer.cards.find(card =>
927
- card.isFaceUp && card.value === lastDiscard
 
 
 
928
  );
929
 
930
  if (!selectedCardObj) {
931
  alert('خطأ: الكرت المحدد غير موجود!');
 
932
  return;
933
  }
934
 
@@ -945,12 +1396,99 @@
945
  hideCardSelectionModal();
946
  updateGameBoard();
947
  nextPlayer();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
948
  }
949
 
950
  function cancelCardSelection() {
951
  hideCardSelectionModal();
952
  }
953
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
954
  function endGame() {
955
  // Calculate scores
956
  calculateScores();
@@ -963,18 +1501,84 @@
963
  // Display results
964
  gameResults.innerHTML = '';
965
 
966
- gameState.players.forEach(player => {
 
 
 
967
  const playerDiv = document.createElement('div');
968
- playerDiv.className = `mb-3 p-3 rounded-lg ${
969
- player.points === minScore ? 'bg-green-100 text-green-800' :
970
- player.points === maxScore ? 'bg-red-100 text-red-800' : 'bg-gray-100'
971
  }`;
972
 
973
  playerDiv.innerHTML = `
974
- <div class="flex justify-between items-center">
 
975
  <span class="font-bold">${player.name}</span>
976
- <span>${player.points} نقطة</span>
977
  </div>
978
- <div class="text-sm mt-1">
979
- ${player.points === minScore ? '🏆 فائز!' : player.points === maxScore ? '☠️ خاسر!' : ''
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
980
  </html>
 
27
  font-weight: bold;
28
  position: relative;
29
  cursor: pointer;
30
+ user-select: none;
31
  }
32
 
33
  .card:hover {
 
38
  .card-back {
39
  background: linear-gradient(45deg, #8e2de2, #4a00e0);
40
  color: white;
41
+ background-size: 200% 200%;
42
+ animation: gradient 3s ease infinite;
43
  }
44
 
45
  .card-front {
 
49
 
50
  .player-area {
51
  transition: all 0.3s ease;
52
+ position: relative;
53
  }
54
 
55
  .player-area.active {
 
57
  box-shadow: 0 0 15px rgba(76, 175, 80, 0.5);
58
  }
59
 
60
+ .player-area.active::after {
61
+ content: "اللاعب الحالي";
62
+ position: absolute;
63
+ top: -15px;
64
+ right: 50%;
65
+ transform: translateX(50%);
66
+ background: #4CAF50;
67
+ color: white;
68
+ padding: 2px 10px;
69
+ border-radius: 20px;
70
+ font-size: 12px;
71
+ font-weight: bold;
72
+ }
73
+
74
  .special-card {
75
  background: linear-gradient(45deg, #ff416c, #ff4b2b);
76
  color: white;
77
+ background-size: 200% 200%;
78
+ animation: gradient 3s ease infinite;
79
+ }
80
+
81
+ .thief-card {
82
+ background: linear-gradient(45deg, #000000, #434343);
83
+ color: white;
84
+ }
85
+
86
+ .action-card {
87
+ background: linear-gradient(45deg, #00b09b, #96c93d);
88
+ color: white;
89
  }
90
 
91
  .modal {
 
96
  opacity: 1;
97
  pointer-events: auto;
98
  }
99
+
100
+ @keyframes gradient {
101
+ 0% {
102
+ background-position: 0% 50%;
103
+ }
104
+ 50% {
105
+ background-position: 100% 50%;
106
+ }
107
+ 100% {
108
+ background-position: 0% 50%;
109
+ }
110
+ }
111
+
112
+ .card-icon {
113
+ font-size: 24px;
114
+ margin-bottom: 5px;
115
+ }
116
+
117
+ .card-value {
118
+ font-size: 28px;
119
+ font-weight: bold;
120
+ }
121
+
122
+ .card-special {
123
+ font-size: 14px;
124
+ text-align: center;
125
+ padding: 0 5px;
126
+ }
127
+
128
+ .highlight {
129
+ animation: pulse 1.5s infinite;
130
+ }
131
+
132
+ @keyframes pulse {
133
+ 0% {
134
+ box-shadow: 0 0 0 0 rgba(76, 175, 80, 0.7);
135
+ }
136
+ 70% {
137
+ box-shadow: 0 0 0 10px rgba(76, 175, 80, 0);
138
+ }
139
+ 100% {
140
+ box-shadow: 0 0 0 0 rgba(76, 175, 80, 0);
141
+ }
142
+ }
143
+
144
+ .penalty-badge {
145
+ position: absolute;
146
+ top: -8px;
147
+ right: -8px;
148
+ background: #ff5722;
149
+ color: white;
150
+ border-radius: 50%;
151
+ width: 25px;
152
+ height: 25px;
153
+ display: flex;
154
+ align-items: center;
155
+ justify-content: center;
156
+ font-size: 12px;
157
+ font-weight: bold;
158
+ animation: bounce 0.5s alternate infinite;
159
+ }
160
+
161
+ @keyframes bounce {
162
+ from {
163
+ transform: translateY(0);
164
+ }
165
+ to {
166
+ transform: translateY(-5px);
167
+ }
168
+ }
169
+
170
+ .winner-crown {
171
+ position: absolute;
172
+ top: -15px;
173
+ left: 50%;
174
+ transform: translateX(-50%);
175
+ color: gold;
176
+ font-size: 24px;
177
+ text-shadow: 0 0 3px rgba(0,0,0,0.5);
178
+ }
179
  </style>
180
  </head>
181
  <body class="text-gray-800">
 
189
  <div id="mode-selection" class="bg-white rounded-lg shadow-lg p-6 mb-8">
190
  <h2 class="text-2xl font-bold mb-4 text-center text-indigo-700">اختر نمط اللعبة</h2>
191
  <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
192
+ <div class="mode-option bg-indigo-50 hover:bg-indigo-100 rounded-lg p-4 cursor-pointer transition flex flex-col items-center" data-mode="general">
193
+ <div class="w-12 h-12 bg-gradient-to-r from-purple-500 to-pink-500 rounded-full flex items-center justify-center text-white mb-2">
194
+ <i class="fas fa-star"></i>
195
+ </div>
196
  <h3 class="font-bold text-lg text-indigo-800">سكرو العامة</h3>
197
+ <p class="text-gray-600 text-sm text-center">يمكن اللعبة واضافة جميع الاوراق</p>
198
  </div>
199
+ <div class="mode-option bg-indigo-50 hover:bg-indigo-100 rounded-lg p-4 cursor-pointer transition flex flex-col items-center" data-mode="classic">
200
+ <div class="w-12 h-12 bg-gradient-to-r from-blue-500 to-teal-400 rounded-full flex items-center justify-center text-white mb-2">
201
+ <i class="fas fa-history"></i>
202
+ </div>
203
  <h3 class="font-bold text-lg text-indigo-800">سكرو كلاسيك</h3>
204
+ <p class="text-gray-600 text-sm text-center">جميع الاوراق ما عدا كرت الحرامي وكرتين بينج وبونج</p>
205
  </div>
206
+ <div class="mode-option bg-indigo-50 hover:bg-indigo-100 rounded-lg p-4 cursor-pointer transition flex flex-col items-center" data-mode="thief">
207
+ <div class="w-12 h-12 bg-gradient-to-r from-gray-700 to-gray-900 rounded-full flex items-center justify-center text-white mb-2">
208
+ <i class="fas fa-user-ninja"></i>
209
+ </div>
210
  <h3 class="font-bold text-lg text-indigo-800">سكرو الحرامي</h3>
211
+ <p class="text-gray-600 text-sm text-center">جميع الاوراق ما عدا كرت بينج وبونج</p>
212
  </div>
213
+ <div class="mode-option bg-indigo-50 hover:bg-indigo-100 rounded-lg p-4 cursor-pointer transition flex flex-col items-center" data-mode="duos">
214
+ <div class="w-12 h-12 bg-gradient-to-r from-green-500 to-green-700 rounded-full flex items-center justify-center text-white mb-2">
215
+ <i class="fas fa-users"></i>
216
+ </div>
217
  <h3 class="font-bold text-lg text-indigo-800">سكرو الثنائيات</h3>
218
+ <p class="text-gray-600 text-sm text-center">جميع الاوراق ما عدا كرت الحرامي</p>
219
  </div>
220
  </div>
221
  </div>
 
225
  <h2 class="text-2xl font-bold mb-4 text-center text-indigo-700">إعداد اللاعبين</h2>
226
  <div class="mb-4">
227
  <label class="block text-gray-700 mb-2">عدد اللاعبين (2-6)</label>
228
+ <input type="number" min="2" max="6" value="4" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500">
229
  </div>
230
  <div id="player-names" class="space-y-3">
231
  <!-- Player name inputs will be added here -->
232
  </div>
233
+ <button id="start-game" class="w-full bg-indigo-600 hover:bg-indigo-700 text-white font-bold py-2 px-4 rounded-md mt-4 transition transform hover:scale-105">
234
+ <i class="fas fa-play mr-2"></i> بدء اللعبة
235
  </button>
236
  </div>
237
 
238
  <!-- Game Board -->
239
  <div id="game-board" class="hidden">
240
  <!-- Game Info -->
241
+ <div class="flex flex-col md:flex-row justify-between items-center mb-6 gap-4">
242
+ <div class="bg-white rounded-lg shadow px-4 py-2 flex items-center gap-4">
243
+ <div>
244
+ <span class="font-bold">الجولة:</span> <span id="round-number" class="text-indigo-600 font-bold">1</span>
245
+ </div>
246
+ <div>
247
+ <span class="font-bold">النمط:</span> <span id="game-mode" class="text-indigo-600 font-bold">سكرو العامة</span>
248
+ </div>
249
+ <div>
250
+ <span class="font-bold">اللاعب الحالي:</span> <span id="current-player" class="text-green-600 font-bold"></span>
251
+ </div>
252
+ </div>
253
+ <div class="flex gap-2">
254
+ <button id="rules-button" class="bg-yellow-500 hover:bg-yellow-600 text-white px-4 py-2 rounded-lg transition flex items-center">
255
+ <i class="fas fa-info-circle mr-2"></i> القواعد
256
+ </button>
257
+ <button id="end-game" class="bg-red-500 hover:bg-red-600 text-white px-4 py-2 rounded-lg transition flex items-center">
258
+ <i class="fas fa-stop mr-2"></i> إنهاء اللعبة
259
+ </button>
260
  </div>
 
 
 
261
  </div>
262
 
263
  <!-- Center Area -->
264
+ <div class="relative mb-16 bg-indigo-50 rounded-xl p-6 shadow-inner">
265
  <!-- Draw Pile -->
266
  <div class="absolute left-1/2 transform -translate-x-1/2 -top-8">
267
+ <div id="draw-pile" class="card card-back flex flex-col items-center justify-center cursor-pointer hover:shadow-lg">
268
  <i class="fas fa-layer-group text-2xl"></i>
269
  <span class="text-xs mt-1">السحب</span>
270
+ <span id="draw-count" class="text-xs mt-1">0</span>
271
  </div>
272
  </div>
273
 
 
279
  </div>
280
 
281
  <!-- Current Round Info -->
282
+ <div class="absolute right-0 -top-8 bg-white rounded-lg shadow px-4 py-2 text-center flex items-center gap-2">
283
  <div id="round-info" class="font-bold text-indigo-700">الجولة الأولى: النظر إلى أول كرتين على اليمين</div>
284
+ <div id="round-warning" class="text-xs text-red-500 hidden bg-red-100 px-2 py-1 rounded-full">
285
+ <i class="fas fa-exclamation-triangle mr-1"></i> تحذير: +10 عند مخالفة قواعد الجولة
286
+ </div>
287
  </div>
288
  </div>
289
 
 
294
 
295
  <!-- Current Player Actions -->
296
  <div id="player-actions" class="bg-white rounded-lg shadow-lg p-4 mt-8 hidden">
297
+ <h3 class="font-bold mb-4 text-center text-lg text-indigo-700">اختياراتك</h3>
298
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-4">
299
+ <button id="draw-from-pile" class="bg-blue-500 hover:bg-blue-600 text-white py-3 px-4 rounded-lg transition transform hover:scale-105 flex flex-col items-center">
300
+ <i class="fas fa-draw-polygon text-xl mb-1"></i>
301
+ <span>سحب من ميدان الكروت</span>
302
  </button>
303
+ <button id="draw-from-discard" class="bg-green-500 hover:bg-green-600 text-white py-3 px-4 rounded-lg transition transform hover:scale-105 flex flex-col items-center">
304
+ <i class="fas fa-hand-paper text-xl mb-1"></i>
305
+ <span>سحب من الأرض</span>
306
  </button>
307
+ <button id="play-similar" class="bg-purple-500 hover:bg-purple-600 text-white py-3 px-4 rounded-lg transition transform hover:scale-105 flex flex-col items-center">
308
+ <i class="fas fa-exchange-alt text-xl mb-1"></i>
309
+ <span>التخلص من كرت مشابه</span>
310
  </button>
311
  </div>
312
+ <div class="mt-6 text-center">
313
+ <button id="declare-skru" class="bg-red-500 hover:bg-red-600 text-white py-3 px-8 rounded-lg font-bold transition transform hover:scale-105 flex items-center justify-center mx-auto">
314
  <i class="fas fa-flag mr-2"></i> سكرو!
315
  </button>
316
+ <p class="text-xs text-gray-500 mt-2">عند إعلان "سكرو"، سيتم احتساب النقاط بعد انتهاء الجولة</p>
317
  </div>
318
  </div>
319
  </div>
 
321
  <!-- Card Selection Modal -->
322
  <div id="card-selection-modal" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50 opacity-0 pointer-events-none modal">
323
  <div class="bg-white rounded-lg shadow-xl p-6 w-full max-w-md">
324
+ <h3 class="font-bold text-xl mb-4 text-center text-indigo-700" id="selection-title">اختر كرت</h3>
325
+ <div id="selectable-cards" class="flex flex-wrap justify-center gap-3 mb-6">
326
  <!-- Cards will be added here -->
327
  </div>
328
  <div class="flex justify-center gap-4">
329
+ <button id="confirm-selection" class="bg-green-500 hover:bg-green-600 text-white px-6 py-2 rounded-lg transition flex items-center">
330
+ <i class="fas fa-check mr-2"></i> تأكيد
331
+ </button>
332
+ <button id="cancel-selection" class="bg-gray-500 hover:bg-gray-600 text-white px-6 py-2 rounded-lg transition flex items-center">
333
+ <i class="fas fa-times mr-2"></i> إلغاء
334
+ </button>
335
+ </div>
336
+ </div>
337
+ </div>
338
+
339
+ <!-- Player Selection Modal -->
340
+ <div id="player-selection-modal" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50 opacity-0 pointer-events-none modal">
341
+ <div class="bg-white rounded-lg shadow-xl p-6 w-full max-w-md">
342
+ <h3 class="font-bold text-xl mb-4 text-center text-indigo-700" id="player-selection-title">اختر لاعب</h3>
343
+ <div id="selectable-players" class="space-y-3 mb-6">
344
+ <!-- Players will be added here -->
345
+ </div>
346
+ <div class="flex justify-center gap-4">
347
+ <button id="confirm-player" class="bg-green-500 hover:bg-green-600 text-white px-6 py-2 rounded-lg transition flex items-center">
348
+ <i class="fas fa-check mr-2"></i> تأكيد
349
  </button>
350
+ <button id="cancel-player" class="bg-gray-500 hover:bg-gray-600 text-white px-6 py-2 rounded-lg transition flex items-center">
351
+ <i class="fas fa-times mr-2"></i> إلغاء
352
+ </button>
353
+ </div>
354
+ </div>
355
+ </div>
356
+
357
+ <!-- Card View Modal -->
358
+ <div id="card-view-modal" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50 opacity-0 pointer-events-none modal">
359
+ <div class="bg-white rounded-lg shadow-xl p-6 w-full max-w-md">
360
+ <h3 class="font-bold text-xl mb-4 text-center text-indigo-700" id="card-view-title">عرض الكرت</h3>
361
+ <div id="viewed-card" class="flex justify-center mb-6">
362
+ <!-- Card will be shown here -->
363
+ </div>
364
+ <div class="flex justify-center">
365
+ <button id="close-view" class="bg-blue-500 hover:bg-blue-600 text-white px-6 py-2 rounded-lg transition flex items-center">
366
+ <i class="fas fa-check mr-2"></i> موافق
367
  </button>
368
  </div>
369
  </div>
 
372
  <!-- Game Over Modal -->
373
  <div id="game-over-modal" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50 opacity-0 pointer-events-none modal">
374
  <div class="bg-white rounded-lg shadow-xl p-6 w-full max-w-md">
375
+ <h3 class="font-bold text-2xl mb-6 text-center text-indigo-800">نتيجة اللعبة</h3>
376
+ <div id="game-results" class="mb-6 space-y-4 max-h-96 overflow-y-auto">
377
  <!-- Results will be added here -->
378
  </div>
379
+ <div class="flex justify-center gap-4">
380
+ <button id="play-again" class="bg-indigo-600 hover:bg-indigo-700 text-white px-6 py-2 rounded-lg font-bold transition flex items-center">
381
+ <i class="fas fa-redo mr-2"></i> لعب مرة أخرى
382
+ </button>
383
+ <button id="new-game" class="bg-gray-600 hover:bg-gray-700 text-white px-6 py-2 rounded-lg font-bold transition flex items-center">
384
+ <i class="fas fa-plus mr-2"></i> لعبة جديدة
385
  </button>
386
  </div>
387
  </div>
 
398
  </div>
399
 
400
  <div class="space-y-4">
401
+ <div class="bg-blue-50 p-4 rounded-lg">
402
+ <h4 class="font-bold text-lg text-blue-800">هدف اللعبة:</h4>
403
  <p>الحصول على أقل عدد من الأرقام في نهاية الجولة.</p>
404
  </div>
405
 
406
+ <div class="bg-green-50 p-4 rounded-lg">
407
+ <h4 class="font-bold text-lg text-green-800">بداية اللعبة:</h4>
408
  <ul class="list-disc list-inside space-y-1">
409
  <li>كل لاعب يحصل على 4 كروت غير مكشوفة</li>
410
  <li>يتم وضع ميدان للكروت في المنتصف</li>
 
412
  </ul>
413
  </div>
414
 
415
+ <div class="bg-purple-50 p-4 rounded-lg">
416
+ <h4 class="font-bold text-lg text-purple-800">طرق اللعب:</h4>
417
  <div class="grid grid-cols-1 md:grid-cols-2 gap-3">
418
+ <div class="bg-white p-3 rounded border border-purple-200">
419
+ <h5 class="font-bold text-purple-700">سكرو العامة</h5>
420
+ <p class="text-sm">يمكن اللعبة واضافة جميع الاوراق</p>
421
  </div>
422
+ <div class="bg-white p-3 rounded border border-purple-200">
423
+ <h5 class="font-bold text-purple-700">سكرو كلاسيك</h5>
424
+ <p class="text-sm">جميع الاوراق ما عدا كرت الحرامي وكرتين بينج وبونج</p>
425
  </div>
426
+ <div class="bg-white p-3 rounded border border-purple-200">
427
+ <h5 class="font-bold text-purple-700">سكرو الحرامي</h5>
428
+ <p class="text-sm">جميع الاوراق ما عدا كرت بينج وبونج</p>
429
  </div>
430
+ <div class="bg-white p-3 rounded border border-purple-200">
431
+ <h5 class="font-bold text-purple-700">سكرو الثنائيات</h5>
432
+ <p class="text-sm">جميع الاوراق ما عدا كرت الحرامي</p>
433
  </div>
434
  </div>
435
  </div>
436
 
437
+ <div class="bg-yellow-50 p-4 rounded-lg">
438
+ <h4 class="font-bold text-lg text-yellow-800">خيارات اللاعب:</h4>
439
+ <ol class="list-decimal list-inside space-y-2">
440
+ <li class="font-medium">سحب من ميدان الكروت ثم الاحتفاظ به أو التخلص منه</li>
441
+ <li class="font-medium">سحب من الأرض آخر كرت تركه اللاعب السابق</li>
442
+ <li class="font-medium">التخلص من كرت يشابه آخر كرت في الأرض</li>
443
  </ol>
444
+ <div class="mt-2 bg-red-50 p-2 rounded text-red-600 text-sm flex items-start">
445
+ <i class="fas fa-exclamation-circle mt-1 mr-2"></i>
446
+ <span>⛔️ تحذير: إذا لم يكن الكرت مشابهاً يعود إليه كرته + الكرت الآخر</span>
447
+ </div>
448
  </div>
449
 
450
+ <div class="bg-indigo-50 p-4 rounded-lg">
451
+ <h4 class="font-bold text-lg text-indigo-800">جولات اللعبة:</h4>
452
  <div class="space-y-3">
453
+ <div class="bg-white p-3 rounded border border-indigo-200">
454
+ <h5 class="font-bold text-indigo-700">الجولة الأولى</h5>
455
+ <p class="text-sm">ينظر الجميع إلى أول كرتين على اليمين فقط</p>
456
+ <div class="mt-1 bg-red-50 p-1 rounded text-red-600 text-xs">
457
+ ⛔️ تحذير: +10 عند النظر إلى أكثر من كرتين أو تبديل الكروت
458
+ </div>
459
  </div>
460
+ <div class="bg-white p-3 rounded border border-indigo-200">
461
+ <h5 class="font-bold text-indigo-700">الجولة الثانية (الصامتة)</h5>
462
+ <p class="text-sm">لا يجوز الكلام خلال هذه الجولة</p>
463
+ <div class="mt-1 bg-red-50 p-1 rounded text-red-600 text-xs">
464
+ ⛔️ تحذير: +10 عند الكلام
465
+ </div>
466
  </div>
467
+ <div class="bg-white p-3 rounded border border-indigo-200">
468
+ <h5 class="font-bold text-indigo-700">الجولة الثالثة</h5>
469
+ <p class="text-sm">لا يستطيع أي لاعب النظر إلى كروته</p>
470
+ <div class="mt-1 bg-red-50 p-1 rounded text-red-600 text-xs">
471
+ ⛔️ تحذير: +10 عند النظر إلى أي كرت
472
+ </div>
473
  </div>
474
+ <div class="bg-white p-3 rounded border border-indigo-200">
475
+ <h5 class="font-bold text-indigo-700">الجولة الرابعة</h5>
476
+ <p class="text-sm">جولة الدبل: مجموع ما تحصل عليه بعد انتهاء الجولة × 2</p>
477
  </div>
478
  </div>
479
  </div>
480
 
481
+ <div class="bg-pink-50 p-4 rounded-lg">
482
+ <h4 class="font-bold text-lg text-pink-800">مهام الكروت الخاصة:</h4>
483
  <div class="grid grid-cols-1 md:grid-cols-2 gap-3">
484
+ <div class="bg-white p-2 rounded border border-pink-200">
485
+ <h5 class="font-bold text-pink-700 text-sm">7 أو 8</h5>
486
+ <p class="text-xs">تنظر في كرت واحد فقط من كروتك</p>
487
  </div>
488
+ <div class="bg-white p-2 rounded border border-pink-200">
489
+ <h5 class="font-bold text-pink-700 text-sm">9 أو 10</h5>
490
+ <p class="text-xs">تنظر في كرت واحد فقط من أحد اللاعبين</p>
491
  </div>
492
+ <div class="bg-white p-2 rounded border border-pink-200">
493
+ <h5 class="font-bold text-pink-700 text-sm">البصرة</h5>
494
+ <p class="text-xs">تستطيع التخلص من كرت من كروتك باختيارك</p>
495
  </div>
496
+ <div class="bg-white p-2 rounded border border-pink-200">
497
+ <h5 class="font-bold text-pink-700 text-sm">خذ وهات</h5>
498
+ <p class="text-xs">تستبدل كرت من أحد اللاعبين بكرت من عندك دون النظر</p>
499
  </div>
500
+ <div class="bg-white p-2 rounded border border-pink-200">
501
+ <h5 class="font-bold text-pink-700 text-sm">خذ بس</h5>
502
+ <p class="text-xs">تستطيع إعطاء كرت من كروتك لأحد اللاعبين</p>
503
  </div>
504
+ <div class="bg-white p-2 rounded border border-pink-200">
505
+ <h5 class="font-bold text-pink-700 text-sm">دائر ما يدور</h5>
506
+ <p class="text-xs">تنظر في كرت واحد من كل لاعب أو كرتين من أوراقك</p>
507
  </div>
508
+ <div class="bg-white p-2 rounded border border-pink-200">
509
+ <h5 class="font-bold text-pink-700 text-sm">عجب ما عجب</h5>
510
+ <p class="text-xs">مثل خذ وهات ولكن مع خيار الاستبدال مع لاعب آخر</p>
511
  </div>
512
+ <div class="bg-white p-2 rounded border border-pink-200">
513
+ <h5 class="font-bold text-pink-700 text-sm">الحرامي</h5>
514
+ <p class="text-xs">لا يمكن التخلص منه ويقوم بسرقة نقاط الخصم</p>
515
  </div>
516
+ <div class="bg-white p-2 rounded border border-pink-200">
517
+ <h5 class="font-bold text-pink-700 text-sm">بونج/بينج</h5>
518
+ <p class="text-xs">تمنع فريق الخصم من اللعب في الجولة التالية</p>
519
  </div>
520
  </div>
521
  </div>
522
 
523
+ <div class="bg-teal-50 p-4 rounded-lg">
524
+ <h4 class="font-bold text-lg text-teal-800">نهاية اللعبة:</h4>
525
+ <p class="text-sm">عندما يقول لاعب "سكرو"، يكمل الجميع حتى يعود دوره ثم تكشف الكروت. اللاعب الأقل عدداً هو الفائز، وقد يكون هناك أكثر من فائز. الخاسر هو من لديه أكبر مجموع أرقام.</p>
526
  </div>
527
  </div>
528
  </div>
529
  </div>
530
 
531
  <!-- Help Button -->
532
+ <button id="help-button" class="fixed bottom-6 left-6 bg-indigo-600 text-white w-14 h-14 rounded-full shadow-lg flex items-center justify-center hover:bg-indigo-700 transition z-40 transform hover:scale-110">
533
+ <i class="fas fa-question text-2xl"></i>
534
+ </button>
535
+
536
+ <!-- Sound Toggle -->
537
+ <button id="sound-toggle" class="fixed bottom-6 right-6 bg-gray-600 text-white w-14 h-14 rounded-full shadow-lg flex items-center justify-center hover:bg-gray-700 transition z-40 transform hover:scale-110">
538
+ <i class="fas fa-volume-up text-2xl"></i>
539
  </button>
540
  </div>
541
 
 
551
  gameStarted: false,
552
  skruDeclared: false,
553
  skruPlayer: null,
554
+ soundEnabled: true,
555
  specialCards: {
556
+ thief: { name: 'الحرامي', type: 'thief', penalty: 10 },
557
+ bing: { name: 'بينج', type: 'action', penalty: 10 },
558
+ bong: { name: 'بونج', type: 'action', penalty: 10 },
559
+ basra: { name: 'البصرة', type: 'action' },
560
+ takeAndGive: { name: 'خذ وهات', type: 'action' },
561
+ takeOnly: { name: 'خذ بس', type: 'action' },
562
+ lookAround: { name: 'دائر ما يدور', type: 'action' },
563
+ likeOrNot: { name: 'عجب ما عجب', type: 'action' }
564
+ },
565
+ cardActions: {
566
+ 7: { name: 'انظر إلى كرت واحد من كروتك', type: 'view-self' },
567
+ 8: { name: 'انظر إلى كرت واحد من كروتك', type: 'view-self' },
568
+ 9: { name: 'انظر إلى كرت واحد من لاعب آخر', type: 'view-other' },
569
+ 10: { name: 'انظر إلى كرت واحد من لاعب آخر', type: 'view-other' }
570
  }
571
  };
572
 
 
580
  const discardPile = document.getElementById('discard-pile');
581
  const roundNumber = document.getElementById('round-number');
582
  const gameMode = document.getElementById('game-mode');
583
+ const currentPlayer = document.getElementById('current-player');
584
  const roundInfo = document.getElementById('round-info');
585
  const roundWarning = document.getElementById('round-warning');
586
  const cardSelectionModal = document.getElementById('card-selection-modal');
587
+ const selectionTitle = document.getElementById('selection-title');
588
  const selectableCards = document.getElementById('selectable-cards');
589
+ const playerSelectionModal = document.getElementById('player-selection-modal');
590
+ const playerSelectionTitle = document.getElementById('player-selection-title');
591
+ const selectablePlayers = document.getElementById('selectable-players');
592
+ const cardViewModal = document.getElementById('card-view-modal');
593
+ const cardViewTitle = document.getElementById('card-view-title');
594
+ const viewedCard = document.getElementById('viewed-card');
595
  const gameOverModal = document.getElementById('game-over-modal');
596
  const gameResults = document.getElementById('game-results');
597
  const rulesModal = document.getElementById('rules-modal');
598
  const helpButton = document.getElementById('help-button');
599
+ const soundToggle = document.getElementById('sound-toggle');
600
+ const drawCount = document.getElementById('draw-count');
601
 
602
  // Buttons
603
  const startGameBtn = document.getElementById('start-game');
 
608
  const declareSkruBtn = document.getElementById('declare-skru');
609
  const confirmSelectionBtn = document.getElementById('confirm-selection');
610
  const cancelSelectionBtn = document.getElementById('cancel-selection');
611
+ const confirmPlayerBtn = document.getElementById('confirm-player');
612
+ const cancelPlayerBtn = document.getElementById('cancel-player');
613
+ const closeViewBtn = document.getElementById('close-view');
614
  const playAgainBtn = document.getElementById('play-again');
615
+ const newGameBtn = document.getElementById('new-game');
616
  const closeRulesBtn = document.getElementById('close-rules');
617
+ const rulesButton = document.getElementById('rules-button');
618
+
619
+ // Audio Elements
620
+ const drawSound = new Audio('https://assets.mixkit.co/sfx/preview/mixkit-unlock-game-notification-253.mp3');
621
+ const discardSound = new Audio('https://assets.mixkit.co/sfx/preview/mixkit-quick-jump-arcade-game-239.mp3');
622
+ const skruSound = new Audio('https://assets.mixkit.co/sfx/preview/mixkit-winning-chimes-2015.mp3');
623
+ const errorSound = new Audio('https://assets.mixkit.co/sfx/preview/mixkit-software-interface-remove-notification-257.mp3');
624
+ const specialSound = new Audio('https://assets.mixkit.co/sfx/preview/mixkit-magic-ping-utility-notification-308.mp3');
625
+ const winSound = new Audio('https://assets.mixkit.co/sfx/preview/mixkit-achievement-bell-600.mp3');
626
+ const loseSound = new Audio('https://assets.mixkit.co/sfx/preview/mixkit-sad-game-over-trombone-471.mp3');
627
 
628
  // Event Listeners
629
  document.querySelectorAll('.mode-option').forEach(option => {
 
660
  declareSkruBtn.addEventListener('click', declareSkru);
661
  confirmSelectionBtn.addEventListener('click', confirmCardSelection);
662
  cancelSelectionBtn.addEventListener('click', cancelCardSelection);
663
+ confirmPlayerBtn.addEventListener('click', confirmPlayerSelection);
664
+ cancelPlayerBtn.addEventListener('click', cancelPlayerSelection);
665
+ closeViewBtn.addEventListener('click', closeCardView);
666
  playAgainBtn.addEventListener('click', resetGame);
667
+ newGameBtn.addEventListener('click', newGame);
668
  helpButton.addEventListener('click', showRules);
669
  closeRulesBtn.addEventListener('click', hideRules);
670
+ rulesButton.addEventListener('click', showRules);
671
+ soundToggle.addEventListener('click', toggleSound);
672
 
673
+ // Initialize
674
  function setupPlayerInputs(count) {
675
  const playerNames = document.getElementById('player-names');
676
  playerNames.innerHTML = '';
 
679
  const div = document.createElement('div');
680
  div.className = 'flex items-center';
681
  div.innerHTML = `
682
+ <span class="bg-indigo-100 text-indigo-800 px-3 py-2 rounded-l-md flex items-center justify-center w-24">
683
+ <i class="fas fa-user mr-2"></i> لاعب ${i+1}
684
+ </span>
685
+ <input type="text" class="flex-1 px-3 py-2 border border-gray-300 rounded-r-md focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500" placeholder="اسم اللاعب" required>
686
  `;
687
  playerNames.appendChild(div);
688
  }
 
699
  name: input.value.trim(),
700
  cards: [],
701
  points: 0,
702
+ isActive: false,
703
+ penalties: 0
704
  });
705
  }
706
  });
 
718
  }
719
 
720
  function initializeGame() {
721
+ // Reset game state
722
+ gameState.round = 1;
723
+ gameState.skruDeclared = false;
724
+ gameState.skruPlayer = null;
725
+ gameState.gameStarted = true;
726
+
727
  // Create deck based on game mode
728
  gameState.drawPile = createDeck();
729
 
 
754
 
755
  // Show actions for current player
756
  playerActions.classList.remove('hidden');
757
+
758
+ // Play sound
759
+ playSound(specialSound);
760
  }
761
 
762
  function createDeck() {
 
830
  playerDiv.className = `player-area bg-white rounded-lg shadow p-4 ${player.isActive ? 'active' : ''}`;
831
 
832
  const playerName = document.createElement('h3');
833
+ playerName.className = 'font-bold text-lg text-center mb-2 relative';
834
  playerName.textContent = player.name;
835
 
836
+ if (player.penalties > 0) {
837
+ const penaltyBadge = document.createElement('div');
838
+ penaltyBadge.className = 'penalty-badge';
839
+ penaltyBadge.textContent = `+${player.penalties}`;
840
+ playerName.appendChild(penaltyBadge);
841
+ }
842
+
843
  const playerCards = document.createElement('div');
844
  playerCards.className = 'flex justify-center gap-2';
845
 
846
  player.cards.forEach((card, cardIndex) => {
847
  const cardDiv = document.createElement('div');
848
  cardDiv.className = `card ${card.isFaceUp ? 'card-front' : 'card-back'}`;
 
849
  cardDiv.dataset.playerIndex = index;
850
  cardDiv.dataset.cardIndex = cardIndex;
851
 
852
+ if (card.isFaceUp) {
853
+ if (typeof card.value === 'object') {
854
+ // Special card
855
+ cardDiv.innerHTML = `
856
+ <div class="card-icon">${getCardIcon(card.value)}</div>
857
+ <div class="card-special">${card.value.name}</div>
858
+ `;
859
+
860
+ if (card.value.type === 'thief') {
861
+ cardDiv.classList.add('thief-card');
862
+ } else {
863
+ cardDiv.classList.add('action-card');
864
+ }
865
+ } else {
866
+ // Number card
867
+ if (card.value >= 7 && card.value <= 10) {
868
+ cardDiv.classList.add('action-card');
869
+ }
870
+ cardDiv.innerHTML = `
871
+ <div class="card-value">${card.value}</div>
872
+ `;
873
+ }
874
+ }
875
+
876
+ // Add click event for viewing cards in certain rounds
877
+ if (gameState.round === 1 || (card.isFaceUp && typeof card.value === 'number' && card.value >= 7 && card.value <= 10)) {
878
+ cardDiv.addEventListener('click', () => handleCardClick(index, cardIndex));
879
  }
880
 
881
  playerCards.appendChild(cardDiv);
 
897
  const lastCard = gameState.discardPile[gameState.discardPile.length - 1];
898
  const cardDiv = document.createElement('div');
899
  cardDiv.className = 'card card-front';
 
900
 
901
+ if (typeof lastCard === 'object') {
902
+ // Special card
903
+ cardDiv.innerHTML = `
904
+ <div class="card-icon">${getCardIcon(lastCard)}</div>
905
+ <div class="card-special">${lastCard.name}</div>
906
+ `;
907
+
908
+ if (lastCard.type === 'thief') {
909
+ cardDiv.classList.add('thief-card');
910
+ } else {
911
+ cardDiv.classList.add('action-card');
912
+ }
913
+ } else {
914
+ // Number card
915
+ if (lastCard >= 7 && lastCard <= 10) {
916
+ cardDiv.classList.add('action-card');
917
+ }
918
+ cardDiv.innerHTML = `
919
+ <div class="card-value">${lastCard}</div>
920
+ `;
921
  }
922
 
923
  discardPile.appendChild(cardDiv);
924
  }
925
 
926
  // Update draw pile count
927
+ drawCount.textContent = gameState.drawPile.length;
 
 
 
928
 
929
  // Update round number
930
  roundNumber.textContent = gameState.round;
931
+
932
+ // Update current player name
933
+ currentPlayer.textContent = gameState.players[gameState.currentPlayerIndex].name;
934
+ }
935
+
936
+ function getCardIcon(card) {
937
+ if (typeof card === 'number') {
938
+ return card;
939
+ }
940
+
941
+ switch(card.name) {
942
+ case 'الحرامي': return '<i class="fas fa-user-ninja"></i>';
943
+ case 'بينج': return '<i class="fas fa-ban"></i>';
944
+ case 'بونج': return '<i class="fas fa-ban"></i>';
945
+ case 'البصرة': return '<i class="fas fa-trash-alt"></i>';
946
+ case 'خذ وهات': return '<i class="fas fa-exchange-alt"></i>';
947
+ case 'خذ بس': return '<i class="fas fa-hand-holding"></i>';
948
+ case 'دائر ما يدور': return '<i class="fas fa-eye"></i>';
949
+ case 'عجب ما عجب': return '<i class="fas fa-random"></i>';
950
+ default: return card.value || '?';
951
+ }
952
+ }
953
+
954
+ function handleCardClick(playerIndex, cardIndex) {
955
+ const player = gameState.players[playerIndex];
956
+ const card = player.cards[cardIndex];
957
+
958
+ // In round 1, players can view their first two cards
959
+ if (gameState.round === 1 && cardIndex < 2) {
960
+ viewCard(card, `كرت ${player.name}`);
961
+ }
962
+
963
+ // For action cards (7-10)
964
+ if (card.isFaceUp && typeof card.value === 'number' && card.value >= 7 && card.value <= 10) {
965
+ useActionCard(playerIndex, cardIndex);
966
+ }
967
+ }
968
+
969
+ function useActionCard(playerIndex, cardIndex) {
970
+ const player = gameState.players[playerIndex];
971
+ const card = player.cards[cardIndex];
972
+
973
+ if (playerIndex !== gameState.currentPlayerIndex) {
974
+ alert('ليس دورك لاستخدام هذا الكرت!');
975
+ return;
976
+ }
977
+
978
+ const action = gameState.cardActions[card.value];
979
+
980
+ switch(action.type) {
981
+ case 'view-self':
982
+ // Player can view one of their own cards
983
+ const options = player.cards
984
+ .filter((c, i) => !c.isFaceUp && i !== cardIndex)
985
+ .map((c, i) => ({ index: i, value: c.value }));
986
+
987
+ if (options.length === 0) {
988
+ alert('لا توجد كروت مخفية لديك!');
989
+ return;
990
+ }
991
+
992
+ showCardSelectionModal(
993
+ options,
994
+ `اختر كرتاً من كروتك لرؤيته (باستخدام كرت ${card.value})`,
995
+ false
996
+ );
997
+
998
+ // Store the action card info for later use
999
+ selectableCards.dataset.actionCardIndex = cardIndex;
1000
+ selectableCards.dataset.actionPlayerIndex = playerIndex;
1001
+ break;
1002
+
1003
+ case 'view-other':
1004
+ // Player can view one card from another player
1005
+ showPlayerSelectionModal(
1006
+ `اختر لاعباً لرؤية أحد كروته (باستخدام كرت ${card.value})`,
1007
+ playerIndex
1008
+ );
1009
+
1010
+ // Store the action card info for later use
1011
+ selectablePlayers.dataset.actionCardIndex = cardIndex;
1012
+ selectablePlayers.dataset.actionPlayerIndex = playerIndex;
1013
+ break;
1014
+ }
1015
+ }
1016
+
1017
+ function viewCard(card, title) {
1018
+ cardViewTitle.textContent = title;
1019
+ viewedCard.innerHTML = '';
1020
+
1021
+ const cardDiv = document.createElement('div');
1022
+ cardDiv.className = 'card card-front';
1023
+
1024
+ if (typeof card.value === 'object') {
1025
+ // Special card
1026
+ cardDiv.innerHTML = `
1027
+ <div class="card-icon">${getCardIcon(card.value)}</div>
1028
+ <div class="card-special">${card.value.name}</div>
1029
+ `;
1030
+
1031
+ if (card.value.type === 'thief') {
1032
+ cardDiv.classList.add('thief-card');
1033
+ } else {
1034
+ cardDiv.classList.add('action-card');
1035
+ }
1036
+ } else {
1037
+ // Number card
1038
+ if (card.value >= 7 && card.value <= 10) {
1039
+ cardDiv.classList.add('action-card');
1040
+ }
1041
+ cardDiv.innerHTML = `
1042
+ <div class="card-value">${card.value}</div>
1043
+ `;
1044
+ }
1045
+
1046
+ viewedCard.appendChild(cardDiv);
1047
+
1048
+ // Show modal
1049
+ cardViewModal.classList.remove('opacity-0', 'pointer-events-none');
1050
+ cardViewModal.classList.add('opacity-100');
1051
+
1052
+ playSound(specialSound);
1053
  }
1054
 
1055
  function updateRoundInfo() {
 
1088
  function drawFromPile() {
1089
  if (gameState.drawPile.length === 0) {
1090
  alert('لا توجد كروت متبقية في ميدان السحب!');
1091
+ playSound(errorSound);
1092
  return;
1093
  }
1094
 
1095
  const drawnCard = gameState.drawPile.pop();
1096
  const currentPlayer = gameState.players[gameState.currentPlayerIndex];
1097
 
1098
+ // Check if drawn card is the thief in certain modes
1099
+ if (gameState.mode !== 'classic' && typeof drawnCard === 'object' && drawnCard.type === 'thief') {
1100
+ // Player must keep the thief card
1101
+ currentPlayer.cards.push({
1102
+ value: drawnCard,
1103
+ isFaceUp: true
1104
+ });
1105
+
1106
+ alert(`لقد سحبت كرت ${drawnCard.name}! يجب عليك الاحتفاظ به ولا يمكنك التخلص منه.`);
1107
+ updateGameBoard();
1108
+ playSound(specialSound);
1109
+ return;
1110
+ }
1111
+
1112
  // Show card selection modal to choose whether to keep or discard
1113
  showCardSelectionModal([{
1114
  value: drawnCard,
1115
  isFaceUp: true
1116
  }], 'ماذا تريد أن تفعل بهذا الكرت؟', true);
1117
+
1118
+ playSound(drawSound);
1119
  }
1120
 
1121
  function drawFromDiscard() {
1122
  if (gameState.discardPile.length === 0) {
1123
  alert('لا توجد كروت في الأرض!');
1124
+ playSound(errorSound);
1125
  return;
1126
  }
1127
 
 
1138
  checkForSimilarCards();
1139
 
1140
  updateGameBoard();
1141
+ playSound(drawSound);
1142
  }
1143
 
1144
  function playSimilarCard() {
 
1147
 
1148
  // Find cards that match the last discarded card
1149
  const similarCards = currentPlayer.cards.filter(card =>
1150
+ card.isFaceUp && (
1151
+ (typeof card.value === 'number' && typeof lastDiscard === 'number' && card.value === lastDiscard) ||
1152
+ (typeof card.value === 'object' && typeof lastDiscard === 'object' && card.value.name === lastDiscard.name)
1153
+ )
1154
  );
1155
 
1156
  if (similarCards.length === 0) {
1157
  alert('ليس لديك أي كرت مشابه لآخر كرت في الأرض!');
1158
+ playSound(errorSound);
1159
  return;
1160
  }
1161
 
 
1175
  playerActions.classList.add('hidden');
1176
 
1177
  alert(`أعلن ${gameState.players[gameState.skruPlayer].name} "سكرو"! سيتم احتساب النقاط بعد انتهاء الجولة.`);
1178
+ playSound(skruSound);
1179
  }
1180
  }
1181
 
 
1185
 
1186
  // Check if player has any cards that match the last discarded card
1187
  const hasSimilar = currentPlayer.cards.some(card =>
1188
+ card.isFaceUp && (
1189
+ (typeof card.value === 'number' && typeof lastDiscard === 'number' && card.value === lastDiscard) ||
1190
+ (typeof card.value === 'object' && typeof lastDiscard === 'object' && card.value.name === lastDiscard.name)
1191
+ )
1192
  );
1193
 
1194
  if (hasSimilar) {
 
1259
 
1260
  function showCardSelectionModal(cards, message, showKeepOption = false) {
1261
  selectableCards.innerHTML = '';
1262
+ selectionTitle.textContent = message;
 
 
 
 
 
1263
 
1264
  // Add cards
1265
  cards.forEach((card, index) => {
1266
  const cardDiv = document.createElement('div');
1267
  cardDiv.className = `card ${card.isFaceUp ? 'card-front' : 'card-back'} cursor-pointer`;
 
1268
  cardDiv.dataset.cardIndex = index;
1269
 
1270
+ if (card.isFaceUp) {
1271
+ if (typeof card.value === 'object') {
1272
+ // Special card
1273
+ cardDiv.innerHTML = `
1274
+ <div class="card-icon">${getCardIcon(card.value)}</div>
1275
+ <div class="card-special">${card.value.name}</div>
1276
+ `;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1277
 
1278
+ if (card.value.type === 'thief') {
1279
+ cardDiv.classList.add('thief-card');
1280
+ } else {
1281
+ cardDiv.classList.add('action-card');
1282
+ }
 
 
1283
  } else {
1284
+ // Number card
1285
+ if (card.value >= 7 && card.value <= 10) {
1286
+ cardDiv.classList.add('action-card');
1287
+ }
1288
+ function showPlayerSelectionModal(message, excludePlayerIndex) {
1289
+ selectablePlayers.innerHTML = '';
1290
+ playerSelectionTitle.textContent = message;
1291
+
1292
+ // Add players
1293
+ gameState.players.forEach((player, index) => {
1294
+ if (index !== excludePlayerIndex) {
1295
+ const playerDiv = document.createElement('div');
1296
+ playerDiv.className = 'bg-gray-100 hover:bg-gray-200 p-3 rounded-lg cursor-pointer flex items-center justify-between';
1297
+ playerDiv.dataset.playerIndex = index;
1298
+
1299
+ playerDiv.innerHTML = `
1300
+ <span class="font-medium">${player.name}</span>
1301
+ <span class="text-sm text-gray-500">${player.cards.length} كروت</span>
1302
+ `;
1303
+
1304
+ playerDiv.addEventListener('click', () => {
1305
+ // Toggle selection
1306
+ document.querySelectorAll('#selectable-players > div').forEach(p => {
1307
+ p.classList.remove('bg-blue-100', 'border', 'border-blue-300');
1308
+ });
1309
+ playerDiv.classList.add('bg-blue-100', 'border', 'border-blue-300');
1310
+ });
1311
+
1312
+ selectablePlayers.appendChild(playerDiv);
1313
+ }
1314
+ });
1315
 
1316
  // Show modal
1317
+ playerSelectionModal.classList.remove('opacity-0', 'pointer-events-none');
1318
+ playerSelectionModal.classList.add('opacity-100');
1319
  }
1320
 
1321
  function hideCardSelectionModal() {
 
1323
  cardSelectionModal.classList.add('opacity-0', 'pointer-events-none');
1324
  }
1325
 
1326
+ function hidePlayerSelectionModal() {
1327
+ playerSelectionModal.classList.remove('opacity-100');
1328
+ playerSelectionModal.classList.add('opacity-0', 'pointer-events-none');
1329
+ }
1330
+
1331
  function confirmCardSelection() {
1332
  const selectedCard = document.querySelector('#selectable-cards .card.ring-4');
1333
  if (!selectedCard) {
1334
  alert('الرجاء اختيار كرت أولاً');
1335
+ playSound(errorSound);
1336
  return;
1337
  }
1338
 
 
1340
  const currentPlayer = gameState.players[gameState.currentPlayerIndex];
1341
  const lastDiscard = gameState.discardPile[gameState.discardPile.length - 1];
1342
 
1343
+ // Check if this is an action card selection
1344
+ if (selectableCards.dataset.actionCardIndex !== undefined) {
1345
+ const actionCardIndex = selectableCards.dataset.actionCardIndex;
1346
+ const actionPlayerIndex = selectableCards.dataset.actionPlayerIndex;
1347
+ const actionPlayer = gameState.players[actionPlayerIndex];
1348
+ const actionCard = actionPlayer.cards[actionCardIndex];
1349
+
1350
+ // View the selected card
1351
+ const selectedCardObj = currentPlayer.cards[cardIndex];
1352
+ viewCard(selectedCardObj, `كرت ${currentPlayer.name}`);
1353
+
1354
+ // Remove the action card from player's hand
1355
+ actionPlayer.cards.splice(actionCardIndex, 1);
1356
+
1357
+ // Add action card to discard pile
1358
+ gameState.discardPile.push(actionCard.value);
1359
+
1360
+ // Clear stored data
1361
+ delete selectableCards.dataset.actionCardIndex;
1362
+ delete selectableCards.dataset.actionPlayerIndex;
1363
+
1364
+ // Hide modal and continue
1365
+ hideCardSelectionModal();
1366
+ updateGameBoard();
1367
+ nextPlayer();
1368
+ return;
1369
+ }
1370
+
1371
+ // Normal card selection for playing similar card
1372
+ // Get the actual card from player's hand that matches the last discard
1373
  const selectedCardObj = currentPlayer.cards.find(card =>
1374
+ card.isFaceUp && (
1375
+ (typeof card.value === 'number' && typeof lastDiscard === 'number' && card.value === lastDiscard) ||
1376
+ (typeof card.value === 'object' && typeof lastDiscard === 'object' && card.value.name === lastDiscard.name)
1377
+ )
1378
  );
1379
 
1380
  if (!selectedCardObj) {
1381
  alert('خطأ: الكرت المحدد غير موجود!');
1382
+ playSound(errorSound);
1383
  return;
1384
  }
1385
 
 
1396
  hideCardSelectionModal();
1397
  updateGameBoard();
1398
  nextPlayer();
1399
+ playSound(discardSound);
1400
+ }
1401
+
1402
+ function confirmPlayerSelection() {
1403
+ const selectedPlayer = document.querySelector('#selectable-players > div.bg-blue-100');
1404
+ if (!selectedPlayer) {
1405
+ alert('الرجاء اختيار لاعب أولاً');
1406
+ playSound(errorSound);
1407
+ return;
1408
+ }
1409
+
1410
+ const playerIndex = selectedPlayer.dataset.playerIndex;
1411
+ const selectedPlayerObj = gameState.players[playerIndex];
1412
+
1413
+ // Check if this is for an action card
1414
+ if (selectablePlayers.dataset.actionCardIndex !== undefined) {
1415
+ const actionCardIndex = selectablePlayers.dataset.actionCardIndex;
1416
+ const actionPlayerIndex = selectablePlayers.dataset.actionPlayerIndex;
1417
+ const actionPlayer = gameState.players[actionPlayerIndex];
1418
+ const actionCard = actionPlayer.cards[actionCardIndex];
1419
+
1420
+ // Get a random face-down card from the selected player
1421
+ const faceDownCards = selectedPlayerObj.cards.filter(card => !card.isFaceUp);
1422
+
1423
+ if (faceDownCards.length === 0) {
1424
+ alert('لا توجد كروت مخفية لدى هذا اللاعب!');
1425
+ playSound(errorSound);
1426
+ return;
1427
+ }
1428
+
1429
+ // Select a random face-down card
1430
+ const randomIndex = Math.floor(Math.random() * faceDownCards.length);
1431
+ const viewedCard = faceDownCards[randomIndex];
1432
+
1433
+ // View the card
1434
+ viewCard(viewedCard, `كرت ${selectedPlayerObj.name}`);
1435
+
1436
+ // Remove the action card from player's hand
1437
+ actionPlayer.cards.splice(actionCardIndex, 1);
1438
+
1439
+ // Add action card to discard pile
1440
+ gameState.discardPile.push(actionCard.value);
1441
+
1442
+ // Clear stored data
1443
+ delete selectablePlayers.dataset.actionCardIndex;
1444
+ delete selectablePlayers.dataset.actionPlayerIndex;
1445
+
1446
+ // Hide modal and continue
1447
+ hidePlayerSelectionModal();
1448
+ updateGameBoard();
1449
+ nextPlayer();
1450
+ return;
1451
+ }
1452
  }
1453
 
1454
  function cancelCardSelection() {
1455
  hideCardSelectionModal();
1456
  }
1457
 
1458
+ function cancelPlayerSelection() {
1459
+ hidePlayerSelectionModal();
1460
+ }
1461
+
1462
+ function closeCardView() {
1463
+ cardViewModal.classList.remove('opacity-100');
1464
+ cardViewModal.classList.add('opacity-0', 'pointer-events-none');
1465
+ }
1466
+
1467
+ function calculateScores() {
1468
+ // Calculate scores for each player
1469
+ gameState.players.forEach(player => {
1470
+ let score = 0;
1471
+
1472
+ player.cards.forEach(card => {
1473
+ if (typeof card.value === 'number') {
1474
+ score += card.value;
1475
+ } else if (typeof card.value === 'object' && card.value.penalty) {
1476
+ score += card.value.penalty;
1477
+ }
1478
+ });
1479
+
1480
+ // Add any penalties
1481
+ score += player.penalties;
1482
+
1483
+ // Double points in round 4
1484
+ if (gameState.round === 4) {
1485
+ score *= 2;
1486
+ }
1487
+
1488
+ player.points += score;
1489
+ });
1490
+ }
1491
+
1492
  function endGame() {
1493
  // Calculate scores
1494
  calculateScores();
 
1501
  // Display results
1502
  gameResults.innerHTML = '';
1503
 
1504
+ // Sort players by score (ascending)
1505
+ const sortedPlayers = [...gameState.players].sort((a, b) => a.points - b.points);
1506
+
1507
+ sortedPlayers.forEach((player, index) => {
1508
  const playerDiv = document.createElement('div');
1509
+ playerDiv.className = `mb-3 p-4 rounded-lg flex justify-between items-center ${
1510
+ player.points === minScore ? 'bg-green-100 text-green-800 border border-green-200' :
1511
+ player.points === maxScore ? 'bg-red-100 text-red-800 border border-red-200' : 'bg-gray-100 border border-gray-200'
1512
  }`;
1513
 
1514
  playerDiv.innerHTML = `
1515
+ <div class="flex items-center gap-3">
1516
+ ${player.points === minScore ? '<div class="winner-crown">👑</div>' : ''}
1517
  <span class="font-bold">${player.name}</span>
 
1518
  </div>
1519
+ <span class="font-bold ${player.points === minScore ? 'text-green-600' : player.points === maxScore ? 'text-red-600' : 'text-gray-600'}">
1520
+ ${player.points} نقطة
1521
+ </span>
1522
+ `;
1523
+
1524
+ gameResults.appendChild(playerDiv);
1525
+ });
1526
+
1527
+ // Show game over modal
1528
+ gameOverModal.classList.remove('opacity-0', 'pointer-events-none');
1529
+ gameOverModal.classList.add('opacity-100');
1530
+
1531
+ // Play sound
1532
+ playSound(winSound);
1533
+ }
1534
+
1535
+ function resetGame() {
1536
+ // Hide game over modal
1537
+ gameOverModal.classList.remove('opacity-100');
1538
+ gameOverModal.classList.add('opacity-0', 'pointer-events-none');
1539
+
1540
+ // Reset game with same players and mode
1541
+ initializeGame();
1542
+ }
1543
+
1544
+ function newGame() {
1545
+ // Hide game over modal
1546
+ gameOverModal.classList.remove('opacity-100');
1547
+ gameOverModal.classList.add('opacity-0', 'pointer-events-none');
1548
+
1549
+ // Hide game board
1550
+ gameBoard.classList.add('hidden');
1551
+
1552
+ // Show mode selection
1553
+ modeSelection.classList.remove('hidden');
1554
+ }
1555
+
1556
+ function showRules() {
1557
+ rulesModal.classList.remove('opacity-0', 'pointer-events-none');
1558
+ rulesModal.classList.add('opacity-100');
1559
+ }
1560
+
1561
+ function hideRules() {
1562
+ rulesModal.classList.remove('opacity-100');
1563
+ rulesModal.classList.add('opacity-0', 'pointer-events-none');
1564
+ }
1565
+
1566
+ function toggleSound() {
1567
+ gameState.soundEnabled = !gameState.soundEnabled;
1568
+
1569
+ if (gameState.soundEnabled) {
1570
+ soundToggle.innerHTML = '<i class="fas fa-volume-up text-2xl"></i>';
1571
+ } else {
1572
+ soundToggle.innerHTML = '<i class="fas fa-volume-mute text-2xl"></i>';
1573
+ }
1574
+ }
1575
+
1576
+ function playSound(sound) {
1577
+ if (gameState.soundEnabled) {
1578
+ sound.currentTime = 0;
1579
+ sound.play().catch(e => console.log('Sound playback prevented:', e));
1580
+ }
1581
+ }
1582
+ </script>
1583
+ <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=V-Booking/f" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
1584
  </html>