feat: sistema de 2 rondas con puntos dobles
Ronda 1: 5 categorías con puntos normales (100-500) Ronda 2: 5 categorías diferentes con puntos x2 (200-1000) Backend: - question_service: soporta excluir categorías y multiplicador de puntos - game_manager: trackea current_round, start_round_2() carga nuevo tablero - game_events: emite round_started al completar ronda 1 Frontend: - useSocket: escucha evento round_started - Game.tsx: muestra indicador de ronda actual - types: GameRoom incluye current_round Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -37,6 +37,8 @@ class GameManager:
|
||||
room["current_player_index"] = {"A": 0, "B": 0}
|
||||
room["board"] = board
|
||||
room["scores"] = {"A": 0, "B": 0}
|
||||
room["current_round"] = 1
|
||||
room["round1_categories"] = [int(cat_id) for cat_id in board.keys()]
|
||||
|
||||
await room_manager.update_room(room_code, room)
|
||||
return room
|
||||
@@ -153,14 +155,20 @@ class GameManager:
|
||||
# Switch to other team for potential steal
|
||||
room["current_team"] = "B" if failed_team == "A" else "A"
|
||||
|
||||
# Check if game is over (all questions answered)
|
||||
# Check if round is over (all questions answered)
|
||||
all_answered = all(
|
||||
q["answered"]
|
||||
for questions in room["board"].values()
|
||||
for q in questions
|
||||
)
|
||||
if all_answered:
|
||||
room["status"] = "finished"
|
||||
current_round = room.get("current_round", 1)
|
||||
if current_round == 1:
|
||||
# Round 1 finished - need to start round 2
|
||||
room["round_finished"] = True
|
||||
else:
|
||||
# Round 2 finished - game over
|
||||
room["status"] = "finished"
|
||||
|
||||
await room_manager.update_room(room_code, room)
|
||||
|
||||
@@ -189,6 +197,19 @@ class GameManager:
|
||||
room["current_question"] = None
|
||||
room["can_steal"] = False
|
||||
|
||||
# Check if round is over
|
||||
all_answered = all(
|
||||
q["answered"]
|
||||
for questions in room["board"].values()
|
||||
for q in questions
|
||||
)
|
||||
if all_answered:
|
||||
current_round = room.get("current_round", 1)
|
||||
if current_round == 1:
|
||||
room["round_finished"] = True
|
||||
else:
|
||||
room["status"] = "finished"
|
||||
|
||||
await room_manager.update_room(room_code, room)
|
||||
return room
|
||||
|
||||
@@ -205,6 +226,45 @@ class GameManager:
|
||||
index = room["current_player_index"][team]
|
||||
return players[index % len(players)]
|
||||
|
||||
async def start_round_2(
|
||||
self,
|
||||
db: AsyncSession,
|
||||
room_code: str
|
||||
) -> Optional[dict]:
|
||||
"""
|
||||
Start round 2 with different categories and double points.
|
||||
"""
|
||||
room = await room_manager.get_room(room_code)
|
||||
if not room:
|
||||
return None
|
||||
|
||||
# Get categories used in round 1
|
||||
round1_categories = room.get("round1_categories", [])
|
||||
|
||||
# Get new board excluding round 1 categories, with 2x points
|
||||
new_board = await question_service.get_board_for_game(
|
||||
db,
|
||||
exclude_categories=round1_categories,
|
||||
point_multiplier=2
|
||||
)
|
||||
|
||||
if not new_board:
|
||||
# Not enough categories for round 2 - end game
|
||||
room["status"] = "finished"
|
||||
await room_manager.update_room(room_code, room)
|
||||
return room
|
||||
|
||||
# Update room for round 2
|
||||
room["board"] = new_board
|
||||
room["current_round"] = 2
|
||||
room["round_finished"] = False
|
||||
room["current_question"] = None
|
||||
room["can_steal"] = False
|
||||
# Keep current_team - winner of last question picks first
|
||||
|
||||
await room_manager.update_room(room_code, room)
|
||||
return room
|
||||
|
||||
def calculate_timer_end(self, time_seconds: int, is_steal: bool = False) -> datetime:
|
||||
"""Calculate when the timer should end."""
|
||||
if is_steal:
|
||||
|
||||
Reference in New Issue
Block a user