Added quiz new features
This commit is contained in:
@@ -81,6 +81,16 @@ class PvPQuizController extends Controller
|
|||||||
'time_taken_seconds' => 'required|numeric|min:0.1|max:15', // Max 15 seconds to answer
|
'time_taken_seconds' => 'required|numeric|min:0.1|max:15', // Max 15 seconds to answer
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
// Prevent answering the same question twice!
|
||||||
|
$alreadyAnswered = $match->answers()
|
||||||
|
->where('user_id', auth()->id())
|
||||||
|
->where('question_id', $request->question_id)
|
||||||
|
->exists();
|
||||||
|
|
||||||
|
if ($alreadyAnswered) {
|
||||||
|
return $this->failed(null, 'خطا', 'شما قبلا به این سوال پاسخ دادهاید.');
|
||||||
|
}
|
||||||
|
|
||||||
$player = $match->players()->where('user_id', auth()->id())->firstOrFail();
|
$player = $match->players()->where('user_id', auth()->id())->firstOrFail();
|
||||||
$question = Question::with('options')->find($request->question_id);
|
$question = Question::with('options')->find($request->question_id);
|
||||||
|
|
||||||
@@ -144,30 +154,43 @@ class PvPQuizController extends Controller
|
|||||||
*/
|
*/
|
||||||
private function finalizeMatch(PvpMatch $match)
|
private function finalizeMatch(PvpMatch $match)
|
||||||
{
|
{
|
||||||
// Get both players, ordered by the highest score first
|
|
||||||
$players = $match->players()->orderByDesc('score')->get();
|
$players = $match->players()->orderByDesc('score')->get();
|
||||||
|
$player1 = $players->first();
|
||||||
$player1 = $players->first(); // The one with the higher score
|
$player2 = $players->last();
|
||||||
$player2 = $players->last(); // The one with the lower score
|
|
||||||
|
|
||||||
$winnerId = null;
|
$winnerId = null;
|
||||||
|
|
||||||
// Check if it's a draw, or if someone actually won
|
|
||||||
if ($player1->score > $player2->score) {
|
if ($player1->score > $player2->score) {
|
||||||
$winnerId = $player1->user_id;
|
$winnerId = $player1->user_id;
|
||||||
}
|
}
|
||||||
// If scores are exactly equal, winnerId stays null (Draw/Tie)
|
|
||||||
|
|
||||||
// Close the room
|
|
||||||
$match->update([
|
$match->update([
|
||||||
'status' => 'completed',
|
'status' => 'completed',
|
||||||
'ended_at' => now(),
|
'ended_at' => now(),
|
||||||
'winner_id' => $winnerId
|
'winner_id' => $winnerId
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// TODO (Next Step): Fire a WebSocket Event here to push the "Game Over" screen!
|
// --- NEW: UPDATE GAMIFICATION STATS ---
|
||||||
}
|
$user1 = \App\Models\User::find($player1->user_id);
|
||||||
|
$user2 = \App\Models\User::find($player2->user_id);
|
||||||
|
|
||||||
|
$user1->increment('duels_played');
|
||||||
|
$user2->increment('duels_played');
|
||||||
|
|
||||||
|
// Give XP and Wins
|
||||||
|
if ($winnerId) {
|
||||||
|
$winner = \App\Models\User::find($winnerId);
|
||||||
|
$winner->increment('duels_won');
|
||||||
|
$winner->increment('xp', 50); // Winner gets 50 XP
|
||||||
|
|
||||||
|
// NOTE: Here we will later trigger the "duel_win" Daily Quest progress!
|
||||||
|
}
|
||||||
|
|
||||||
|
// Loser/Draw gets participation XP
|
||||||
|
$loserId = $winnerId === $user1->id ? $user2->id : $user1->id;
|
||||||
|
\App\Models\User::find($loserId)->increment('xp', 10);
|
||||||
|
|
||||||
|
// TODO: Fire a WebSocket Event to push "Game Over" screen!
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* STEP 4: Get Final Match Results
|
* STEP 4: Get Final Match Results
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user