Files
portifolio-evandrodevbr/app/jogo/contrato.ts
T
evandro 67b32fcab3
CI / audit (push) Successful in 10m48s
CI / verify (push) Successful in 19m2s
CI / deploy (push) Successful in 2m14s
CI / e2e (push) Failing after 36m15s
feat(jogo): expediente dos mortos, jogo de zumbis em primeira pessoa
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.
2026-11-10 19:37:10 -03:00

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;
};