import type { ArmaId, Dificuldade, Entrada, Fase, LinhaFeed, } from "@/lib/jogo/tipos"; /** O que a pessoa escolhe na tela inicial. */ export type Escolha = { problemaId: string; dificuldade: Dificuldade; }; /** O que a tela mostra por cima da cena. A cena manda um novo quando algum valor muda, no máximo 10 vezes por segundo. */ export type Retrato = { fase: Fase; /** Índice da horda atual: 0 a 2, e 3 no chefão. */ horda: number; /** Id do problema da horda atual. */ problemaAtual: string; /** Zumbis que ainda faltam cair nesta horda (na fila e à vista). */ restantes: number; vida: number; arma: ArmaId; municao: number; placar: { jogador: number; drones: number }; feed: readonly LinhaFeed[]; /** Um por drone vivo, na ordem em que nasceram. */ drones: readonly { problemaId: string; eliminacoes: number }[]; pausado: boolean; }; /** O que sobra da partida para o relatório. */ export type Resultado = { vitoria: boolean; problemaId: string; dificuldade: Dificuldade; /** Ids dos problemas resolvidos, na ordem. */ resolvidos: readonly string[]; placar: { jogador: number; drones: number }; drones: readonly { problemaId: string; eliminacoes: number }[]; segundos: number; }; /** * Junta teclado, mouse e toque numa `Entrada` por passo da lógica. * Convenção de giro (a mesma da lógica): `olhar[0]` positivo vira à esquerda, `olhar[1]` positivo olha para cima. */ export type Controle = { /** A entrada deste passo. O giro acumulado desde a última leitura é devolvido e zerado. */ ler(): Entrada; /** Direcional de toque: x para a direita, y para a frente, cada um de -1 a 1. */ definirMover(x: number, y: number): void; /** Soma giro em radianos (toque ou mouse). */ somarOlhar(rumo: number, inclinacao: number): void; definirAtirar(atirando: boolean): void; definirArma(arma: ArmaId): void; /** Solta tudo: sem movimento, sem tiro, sem giro pendente. Usado ao pausar. */ soltar(): void; descartar(): void; };