Files
FranciaOcupada/shared/types.ts
2025-12-05 22:07:20 +01:00

128 lines
3.6 KiB
TypeScript

export enum Role {
// Bando del Bien (Resistencia Francesa)
MERLIN = 'merlin', // Marlenne
PERCIVAL = 'percival',
LOYAL_SERVANT = 'loyal_servant', // Soldado Resistencia
// Bando del Mal (Ocupación Alemana)
MORDRED = 'mordred',
ASSASSIN = 'assassin',
MORGANA = 'morgana',
OBERON = 'oberon',
MINION = 'minion', // Soldado Alemán
}
export enum Faction {
RESISTANCE = 'resistance',
SPIES = '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 Merlín
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;
phase: GamePhase;
players: Player[];
hostId: string;
currentRound: number;
failedVotesCount: number;
questResults: (boolean | null)[];
currentLeaderId: string;
// Votación de Líder
leaderVotes: Record<string, boolean | null>;
// Selección de Equipo (Misión)
proposedTeam: string[];
teamVotes: Record<string, boolean>; // 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
}
// 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[];
}