"use client"; import { type CSSProperties, useEffect, useRef } from "react"; import { problemaPorId } from "@/lib/jogo/problemas"; import { ARMAS, HORDAS, JOGADOR } from "@/lib/jogo/valores"; import type { Retrato } from "./contrato"; import { TOQUE_TOPO } from "./medidas"; const AREA_TOPO = "env(safe-area-inset-top)"; const AREA_ESQUERDA = "env(safe-area-inset-left)"; const AREA_DIREITA = "env(safe-area-inset-right)"; /** Centro do aviso: 22% da altura, no terço de cima, longe da mira. */ const AVISO_CENTRO = "22%"; /** Barra do topo (botão de 44 px entre duas folgas) onde o feed começa. */ const BARRA_TOPO = `calc(max(var(--sp-2), ${AREA_TOPO}) + 44px + var(--sp-2))`; /** No toque o feed termina acima do botão mais alto, com uma folga. */ const FEED_ALTURA_MAXIMA = `calc(100dvh - ${BARRA_TOPO} - ${TOQUE_TOPO} - var(--sp-2))`; type Props = { retrato: Retrato; mudo: boolean; aoAlternarMudo(): void; aoContinuar(): void; aoSair(): void; }; const fundo = "bg-[rgba(10,10,10,.72)] font-[family-name:var(--font-mono)] tracking-[0.02em] text-[#f4f2ed]"; const painel = `${fundo} text-[13px]`; const botao = "pointer-events-auto inline-flex min-h-11 items-center justify-center border border-white/40 bg-[var(--ink)] px-sp-4 font-display text-[15px] font-medium text-[#f4f2ed] hover:bg-white/15"; function Alto({ retrato }: { retrato: Retrato }) { const problema = problemaPorId(retrato.problemaAtual)?.nome ?? ""; if (retrato.fase === "chefao") return <>Chefão · {problema}>; return ( <> Horda {retrato.horda + 1} de {HORDAS.tamanhos.length} · {problema} · faltam {retrato.restantes} > ); } function IconeSom({ mudo }: { mudo: boolean }) { return ( {mudo ? ( ) : ( )} ); } export default function Hud({ retrato, mudo, aoAlternarMudo, aoContinuar, aoSair, }: Props) { const continuar = useRef(null); useEffect(() => { if (retrato.pausado) continuar.current?.focus(); }, [retrato.pausado]); const arma = ARMAS[retrato.arma]; const municao = retrato.arma === 0 ? "∞" : arma.gasta ? String(retrato.municao) : null; const resolvido = retrato.fase === "pausa" ? problemaPorId(retrato.problemaAtual) : undefined; const emJogo = retrato.fase === "horda" || retrato.fase === "chefao"; const vida = Math.max(0, Math.min(JOGADOR.vida, Math.round(retrato.vida))); return ( {emJogo ? : "Expediente dos Mortos"} Você {retrato.placar.jogador} · Drones {retrato.placar.drones} li]:truncate [&>li:nth-last-child(n+6)]:hidden [@media(max-height:499px)]:[&>li:nth-last-child(n+4)]:hidden [@media(pointer:coarse)]:max-h-[var(--feed-max)]`} > {retrato.feed.map((linha) => ( {linha.texto} ))} {retrato.drones.length > 0 ? ( {retrato.drones.map((drone, i) => { const solucao = problemaPorId(drone.problemaId)?.solucao ?? ""; return ( {solucao} {drone.eliminacoes}{" "} {drone.eliminacoes === 1 ? "eliminação" : "eliminações"} ); })} ) : null} Vida {vida} {arma.nome} {municao !== null ? ` · ${municao}` : ""} {resolvido ? ( Resolvido: {resolvido.nome} {resolvido.solucao} entrou para o seu time ) : null} {retrato.pausado ? ( Pausado Continuar {mudo ? "Som desligado" : "Som ligado"} Sair ) : null} ); }
{emJogo ? : "Expediente dos Mortos"}
Você {retrato.placar.jogador} · Drones {retrato.placar.drones}
{arma.nome} {municao !== null ? ` · ${municao}` : ""}
Resolvido: {resolvido.nome}
{resolvido.solucao} entrou para o seu time