Etapa 1 inteira (logica com 100% de cobertura, cena 3D, toque, sons, bancada de desempenho, e2e) e a base da etapa 2 (mapa novo no Tiled, texturas, imagens dos itens, sons conferidos, golpe recortado e medido). Pagina /jogo fora do menu e do sitemap ate a medicao no celular.
63 lines
2.0 KiB
TypeScript
63 lines
2.0 KiB
TypeScript
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;
|
|
};
|