export enum Role { // Bando Aliado (Resistencia Francesa) MARLENE = 'marlene', // Agente de inteligencia (antes Merlin) CAPITAN_PHILIPPE = 'capitan_philippe', // Oficial que conoce a Marlene (antes Percival) PARTISANO = 'partisano', // Miembro leal de la resistencia (antes Loyal Servant) // Bando Alemán (Ocupación Nazi) COMANDANTE_SCHMIDT = 'comandante_schmidt', // Oficial nazi oculto (antes Mordred) FRANCOTIRADOR = 'francotirador', // Puede eliminar a Marlene (antes Assassin) AGENTE_DOBLE = 'agente_doble', // Se hace pasar por Marlene (antes Morgana) INFILTRADO = 'infiltrado', // Espía solitario (antes Oberon) COLABORACIONISTA = 'colaboracionista', // Espía genérico (antes Minion/Spy) } export enum Faction { ALIADOS = 'aliados', // Antes RESISTANCE ALEMANES = 'alemanes', // Antes SPIES } export enum GamePhase { LOBBY = 'lobby', INTRO = 'intro', REVEAL_ROLE = 'reveal_role', ROLL_CALL = 'roll_call', VOTE_LEADER = 'vote_leader', // Votar si se acepta al líder TEAM_BUILDING = 'team_building', // Líder propone equipo VOTING_TEAM = 'voting_team', // Todos votan si aprueban el equipo MISSION = 'mission', // Los elegidos votan éxito/fracaso MISSION_REVEAL = 'mission_reveal', // Mostrar cartas una a una MISSION_RESULT = 'mission_result', // Pantalla de resumen ASSASSIN_PHASE = 'assassin_phase', // Si gana el bien, el asesino intenta matar a Marlene NAZIS_WIN = 'nazis_win', // Pantalla de victoria de los Nazis ALLIED_WIN = 'allied_win', // Pantalla de victoria de los Aliados GAME_OVER = 'game_over', } export interface Player { id: string; name: string; avatar: string; // Avatar persistente role?: Role; faction?: Faction; isLeader: boolean; } export interface MissionResult { successes: number; fails: number; isSuccess: boolean; } // Registro de una misión completada export interface MissionRecord { round: number; team: string[]; // IDs de los participantes votes: boolean[]; // Votos (barajados) successes: number; fails: number; isSuccess: boolean; leaderId: string; } export interface GameState { roomId: string; roomName: string; phase: GamePhase; players: Player[]; hostId: string; currentRound: number; failedVotesCount: number; questResults: (boolean | null)[]; currentLeaderId: string; // Votación de Líder leaderVotes: Record; // Selección de Equipo (Misión) proposedTeam: string[]; teamVotes: Record; // Votos de aprobación del equipo (idJugador -> aprueba/rechaza) missionVotes: boolean[]; // Votos anónimos de la misión (éxito/fracaso) // Histórico de misiones missionHistory: MissionRecord[]; // Para la animación de revelación de cartas revealedVotes: boolean[]; // Votos que se van mostrando uno a uno winner?: Faction; history: string[]; // Log de acciones para mostrar en pantalla matchNumber: number; // Número de partida en esta operación (se incrementa con cada restart) matchResults: Faction[]; // Resultados de cada partida (quién ganó) } // Configuración de jugadores por partida (según tus reglas) export const GAME_CONFIG = { 5: { good: 3, evil: 2, quests: [2, 3, 2, 3, 3] }, 6: { good: 4, evil: 2, quests: [2, 3, 4, 3, 4] }, 7: { good: 4, evil: 3, quests: [2, 3, 3, 4, 4] }, // Nota: 4ta misión requiere 2 fallos 8: { good: 5, evil: 3, quests: [3, 4, 4, 5, 5] }, 9: { good: 6, evil: 3, quests: [3, 4, 4, 5, 5] }, 10: { good: 6, evil: 4, quests: [3, 4, 4, 5, 5] }, }; // --- NUEVOS TIPOS PARA EL LOBBY --- export interface GameRoom { id: string; // ID interno único (uuid) name: string; // Nombre de misión (ej: Operación Overlord) hostId: string; // ID del creador currentPlayers: number; maxPlayers: number; isPrivate: boolean; // Si tiene contraseña status: 'waiting' | 'playing' | 'finished'; } export interface CreateGamePayload { hostName: string; maxPlayers: number; password?: string; } export interface JoinGamePayload { roomId: string; // Puede ser el ID numérico interno o lo que usemos playerName: string; password?: string; } export interface LobbyLists { rooms: GameRoom[]; }