Desenvolvimento inicial Ainda não há versão pública · FPS tático 5v5 · PC
Novidades
O que mudou, medido
O diário público do desenvolvimento. Sem datas de lançamento e sem «em breve»: se algo não avançou, esta página diz o que o travou.
Diário · último marco
Marco a marco, com sua medição
Uma entrada por marco verificado: o que mudou, o número com seu cenário, o link para a evidência e o que foi testado e descartado, com a medição que o descartou. O que ainda não está medido diz «pendente», e o que espera a prova de uma pessoa também o diz. Nenhuma fase é declarada encerrada aqui.
Cada entrada preserva as versões, medições e pendências de sua data. Consulte o status atual antes de usar um número ou uma instrução histórica. Ver o status atual.
· F6 · ADR 0109 Uma IA de fora já pode jogar a rodada inteira
O jogo se chama «humanos contra máquinas» e, até ontem, uma IA externa não conseguia cumprir o objetivo. Podia correr, mirar e atirar; não podia plantar a bomba, porque os locais de plantio não eram enviados pelo protocolo. O bloco da bomba enviava a fase, o local após o plantio, o tempo até a explosão, quem a carregava —somente para seu time— e sua posição; as duas caixas que delimitam os locais de plantio ficavam de fora. Nosso bot recebia essas coordenadas pela linha de comando, o único dado que chegava fora do canal público. Agora elas são transmitidas como os demais dados. É a informação que uma pessoa obtém pela letra pintada sobre o arco do local ao entrar, e a regra determina que uma IA não receba menos informação que uma pessoa pelo mesmo canal. As coordenadas são quantizadas em decímetros —uma caixa tem dez metros de lado e a pergunta é apenas «meu pé está dentro?»—, de modo que as duas ocupam 26 bytes em vez de 50. Verificação: dez bots iniciados sem nenhuma coordenada recebem os dois locais e, em 200 segundos, levam a bomba a um deles 14 vezes.
As duas caixas dos locais de plantio viajam no bloco da bomba, para todos e em todos os snapshots
O bot de referência deixa de precisar receber coordenadas ao iniciar
O pior caso 5v5 sobe de 57.088 para 58.816 B/s contra um teto de 64.000: a margem desce de 6.912 para 5.184 e nenhum orçamento foi tocado
Por que as caixas são enviadas em cada snapshot, e não apenas na conexão O formato é autossuficiente: qualquer snapshot pode ser decodificado sem estado anterior. Enviar as caixas apenas na conexão economizaria bytes, mas deixaria sem essa informação um bot que se conecta no meio da rodada, justamente quando uma pessoa entra e olha para o arco.
Testado e descartado
Exigir que cada bot baixe o mapa e deduza os locais de plantioO mapa não viaja pelo protocolo: seria pedir a um terceiro que interprete um arquivo do jogo para poder jogar.
EvidênciasComo escrever uma IA · Registro daquela data: protocolo 12 e Agent API 11
· F6 · ADR 0108 Os outros levavam uma arma diferente da sua
Em primeira pessoa, o jogo desenha o rifle cor de areia do pacote comprado. Em terceira pessoa, a arma carregada pelo personagem vinha do kit gratuito e era pintada de uma única cor, porque o shader compartilhado não tem um sampler livre para usar a vinte metros de distância. Eram duas armas diferentes. Usar a mesma malha excederia o orçamento: o rifle de primeira pessoa, sem as mãos, tem 72.885 triângulos, contra os 1.974 da arma de um personagem; dez personagens levariam a cena de 202.218 triângulos a mais do quádruplo. A solução mantém a silhueta e a pintura. O modelo em terceira pessoa é construído refazendo a malha da superfície externa da arma comprada —o pacote também modela o interior, que fica visível quando a arma é aberta em primeira pessoa— e reduzindo-a ao orçamento já utilizado: 1.974 triângulos no rifle, 3.820 na pistola e 1.752 na faca. O atlas do arquivo passa de textura a uma tabela de cores por vértice, recuperando a empunhadura escura e o cano preto sem custo adicional. A cena com jogadores continua com 202.218 triângulos.
O personagem de um bot e o de outro jogador carregam a mesma arma que você, com a mesma silhueta e pintura, pelos mesmos 1.974 triângulos
Duas cenas novas fotografam pela primeira vez a pistola e a faca na mão de um corpo; o conjunto de regressão passa a 83 cenas
A arma ficou mais clara: a comprada é cor de areia e a do kit era quase preta. Isso reduz o contraste contra o ocre do mapa e precisa ser avaliado por uma pessoa
As duas capturas saíam idênticas byte a byte, com a arma nova e sem ela A primeira versão foi considerada correta porque a regressão visual não detectava a mudança. A causa imediata era um nome de arquivo que o cliente não procurava, mas havia uma lacuna maior: o conjunto de testes capturava a arma na mão apenas com o rifle, sem nenhuma cena que desenhasse a pistola ou a faca em terceira pessoa. Um modelo que não aparece nas capturas pode quebrar sem que um teste falhe; foi assim que duas armas diferentes passaram despercebidas.
Sem remalhar antes de reduzir, o cano desaparecia inteiro O pacote comprado também modela o interior da arma, e sua superfície tinha o dobro da área externa de um rifle. Reduzir essa malha diretamente mistura faces internas e externas: a caixa de mecanismos ficava cheia de triângulos cruzados e os quinze centímetros do cano desapareciam, deixando o clarão sair do nada. Reconstruir primeiro apenas a superfície externa permite que a redução funcione.
Testado e descartado
Levar o atlas da arma comprada para o mundo, que é o que qualquer um fariaUm amostrador a mais no sombreador compartilhado custou 2,75 ms sem desenhar nada nesta placa. A cor por vértice dá quase o mesmo por zero.
EvidênciasComo se verifica cada coisa · Registro daquela data: falta o fundador ver se a arma mais clara o convence
· F6 · ADR 0105 As fachadas do mapa escondiam um dos dois lados
As duas cores dos times foram escolhidas medindo, para que nenhuma seja mais fácil de ver do que a outra. Essa medida foi feita contra o mapa de testes, e o mapa competitivo nunca foi medido com ela: quando foi, deu 27 % de desequilíbrio contra um teto de 25, e na zona central 38 %. A causa foi atribuída pixel a pixel e não era a cor do time mas a do mapa: fachadas ocres e terracota tão saturadas que o amarelo de um dos times se confundia com elas. Escurecê-las não servia —está medido, e além disso tornava a fachada mais ocre—; o que serve é reduzir seu croma à metade conservando a luminância, portanto a pedra continua igual de clara ao sol e nenhuma fotografia é tocada. O mapa fica em 14 % global e 3 % na zona central.
O ocre e a terracota das fachadas do mapa competitivo descem a metade do croma, com igual luminância
As rotas laterais continuam em 37 % e nenhuma paleta as corrige: ali o culpado é uma fotografia
A medida que dizia que estava bem olhava para outro lugar O contrato automático mede os dois times contra o fundo do mapa de testes, o único cujas capturas estão versionadas. O mapa competitivo só existia como capturas de trabalho, portanto uma decisão de arte podia piorar a equidade ali e deixar a verificação aprovada. Também se descartou um número conveniente: um clipe anterior dava 8 % de desequilíbrio, e revelou-se um artefato do enquadramento —mostrava paredes escuras de perto—. Medido em campo aberto e ao sol, o mesmo enquadramento dá entre 26 e 58 %.
Testado e descartado
Escurecer as fachadas um quarto, que era a primeira propostaMedida, dava 26 % e continuava fora do limite: errava por um fator de três. E tinha um efeito contrário ao procurado, porque escurecer sem tocar no croma torna a fachada mais ocre. A variante que baixa a luminância além disso quebra uma regra do documento de identidade —a superfície ao sol precisa ser o elemento mais claro da tela— e deixava o muro abaixo do céu, que é literalmente o defeito que esse documento descreve como dia nublado.
EvidênciasComo se verifica cada coisa · Registro daquela data: falta o fundador jogar, e as rotas laterais continuam abertas
· F6 · ADR 0107 Os corpos davam o dobro dos passos que lhes cabiam
A fase de uma animação de caminhada precisa acompanhar a distância percorrida: se o corpo avança devagar, dá poucos passos longos. Em setembro, o limiar de trote foi alterado com base nessa suposição, mas ela não correspondia ao funcionamento real. O campo de distância já existia, com comentário e modo alternativo, porém nenhum código de partida o preenchia —apenas os testes e as ferramentas de medição—. O servidor sempre recorria ao relógio, e a cadência não dependia da velocidade. A caminhada produzia 186 passos por minuto em qualquer velocidade, em vez dos 90 da captura da animação. A 0,40 m/s, quando deveria dar 25, continuava dando 186: sete vezes mais. O resultado era um corpo que mal avançava enquanto dava passos curtos e rápidos. Agora a fase acompanha a distância, e os quatro modos de locomoção seguem a cadência de suas capturas.
As fases de caminhada, trote, corrida e movimento agachado acompanham a distância percorrida, não o relógio
Quatro cenas novas fotografam a cadência, incluindo uma a 0,40 m/s, que é onde o erro era de sete vezes
Por que o problema passou três semanas sem ser detectado pelos testes Os testes criavam seus próprios dados de entrada e preenchiam o campo de distância, por isso mediam a cadência correta e passavam. O código executado durante a partida era justamente o que não preenchia esse campo. Um teste com dados preparados verifica a fórmula, mas não garante que o programa forneça os dados. As novas cenas capturam o corpo como ele é desenhado na partida, onde estava o defeito.
Testado e descartado
Dar por boa a premissa de uma decisão anterior sem voltar a verificá-laA decisão de setembro alterou um limiar porque a fase supostamente seguia a distância, e registrou essa justificativa. O relatório de status a repetiu. Ambos se baseavam em uma premissa não medida, e o defeito continuava presente. O que resolveu o problema foi medir a cadência real dos quatro modos de locomoção.
· F6 · ADR 0103 O contorno do companheiro tapava o companheiro que já se via
Desde o ADR 0094 o cliente desenha o contorno de um companheiro através da parede, para saber onde está alguém que não se vê. A regra que decidia isso pedia três coisas —companheiro, vivo e não a si mesmo— e não pedia a quarta: que estivesse coberto. A dez metros não se nota, porque a casca do contorno fica escondida atrás do próprio corpo; a dois metros cobria o corpo inteiro, com o torso, os braços, as mãos e parte do capacete apagados por uma mancha sólida que tapava o equipamento e a arma. A finalidade aprovada era saber onde está um companheiro que não se vê, e um que se vê já está à vista: pintar por cima não acrescentava legibilidade, tirava. Agora o contorno exige oclusão —o contorno só aparece no corpo que chega pelo canal do companheiro coberto— e o contrato ficou escrito no teste de legibilidade, que percorre a tabela inteira de lados duas vezes, coberto e à vista.
O contorno através da parede só é desenhado sobre um companheiro coberto; o que está à vista já não é pintado por cima
A cena nova «arena-contorno-companero» coloca um companheiro à vista a dois metros junto a um coberto, com a mesma pose: o conjunto de regressão visual passa de 76 para 77 cenas
A cena de desempenho do mapa com seus elementos visuais voltou a medir o que diz medir: ao exigir oclusão tinha deixado de desenhar os cinco contornos do pior caso, então seus cinco corpos levam agora a marca de cobertos
Falta o fundador jogar: é um defeito do que se vê e quem valida é uma pessoa, não uma comparação de quadros
O conjunto de regressão, cena por cena Nenhuma das 76 cenas do conjunto de testes desenhava esse contorno, então uma regressão que compara os quadros byte a byte não tinha como vê-lo. A cena nova coloca um companheiro a dois metros, à vista e sem nada que o cubra, junto a um coberto com a mesma pose: se a condição cair de novo, o de perto é pintado inteiro e a comparação o registra. O conjunto fica em 77 cenas.
Testado e descartado
Esperar que o conjunto de regressão visual encontrasse este defeitoNão o encontrou: quem o encontrou foi a gravação de um clipe de jogo, olhada quadro a quadro. O conjunto de testes compara os quadros byte a byte, mas de suas 76 cenas nenhuma desenhava um companheiro à vista, então a condição errada não movia um único pixel de nenhuma referência e passava nos testes. A correção saiu junto com a cena que faltava, não de um teste que já estivesse escrito.
Deixar a cena de desempenho como estava depois da correçãoEssa cena existe para medir o pior caso aprovado, cinco companheiros cobertos com seu contorno, e ao exigir oclusão passou a desenhar zero: seus dez corpos estavam atrás do muro sintético, mas nenhum estava marcado como coberto. A verificação de desempenho teria seguido em verde medindo um pior caso que já não existia, então os cinco corpos levam agora essa marca e a cena voltou a desenhar os cinco contornos.
EvidênciasO que o time vê e o que não vê · Registro daquela data: falta o fundador jogar, e limitar o contorno aos companheiros mais próximos continua proposto e não aplicado
· F1–F6 · ADR 0017 O hash coincidia no Clang porque dizíamos, não porque fosse comprovado
O arquivo de hashes fixados do projeto e a página de evidências afirmam que um milhão de passos de simulação dão o mesmo hash em três builds: GCC otimizado, GCC com sanitizers e Clang. A verificação completa compilava dois. Agora compila as três configurações e compara os três hashes em cada execução, e se não encontrar o Clang falha em vez de ignorar essa configuração. As três configurações produzem a59ca4f6e2299d88 no corpus de movimento e f7d2406fd5b56d4d no de combate, com 72.863 tiros e 3.478 acertos. No mesmo movimento se publicou o registro da verificação completa de 24 set 2026, que é de onde saem o tick, a largura de banda e a cena de render que o site publica.
Nota editorial · : A constante removida do rig e as duas constantes de OpenGL eram casos distintos. O registro interno posterior de 27 de setembro documenta que a árvore completa compilou com Clang após a remoção das duas constantes de OpenGL. O diagnóstico original é preservado aqui; esta nota não comprova uma nova compilação da árvore atual.
Clang 21.1.8, GCC otimizado e GCC com sanitizers dão os mesmos dois hashes que estão fixados, a um milhão de passos cada um
Se não houver Clang, a verificação completa falha: antes essa configuração era ignorada em silêncio e a afirmação ficava sem comprovação
O registro dessa verificação completa já está publicado entre os registros brutos, com as sete cifras do site que respalda e com o que não respalda
A árvore inteira ainda não compila com Clang: duas constantes duplicadas e sem uso no código de OpenGL quebram a compilação com os avisos como erros. As duas sondas de determinismo não arrastam render, então a nova verificação pode ser executada; fica anotado em vez de escondido
As três configurações, um milhão de passos em cada uma Movimento a59ca4f6e2299d88 e combate f7d2406fd5b56d4d no GCC otimizado, no GCC com sanitizers e no Clang 21.1.8, com 72.863 tiros e 3.478 acertos nas três. Os dois hashes são os que o arquivo do projeto tem fixados e não se moveram.
Testado e descartado
Reduzir a severidade do aviso do Clang com um wrapper do compiladorO wrapper existia só para que uma constante sem uso deixasse de quebrar a compilação. Medido antes de apagá-la: essa constante não entrava em nenhuma conta, porque as 18 poses do rig saem idênticas com seu valor da árvore, com 0 e com 90 graus, com o mesmo hash nos três casos, e a seção de código do objeto compilado é a mesma antes e depois de apagá-la. Era código morto: foi apagado e nenhum wrapper é necessário.
Dar por coberta com esse registro a cena com jogadores e os elementos visuais do mapaO plano dizia que o registro cobria as quatro primeiras linhas do painel de orçamentos, e cobre três e meia: sua verificação de renderização é o campo de tiro vazio, 4,1434 ms, e a cena com jogadores, 9,6242 ms contra 8,3333 de objetivo, é de um ADR do dia seguinte. O registro o diz em seus limites, e a lista de cifras sem registro publicado continua tendo entradas.
Publicar o log cru da verificação junto ao registroOs registros publicados até hoje trazem o arquivo e o sha256 do seu log, não o log, e esse critério se mantém: o log é solicitado por e-mail e esse sha256 serve para comprovar que o que chegar seja o mesmo com que se mediu. Mudá-lo para um registro e não para os outros treze deixaria a pasta menos legível, não mais.
EvidênciasOs registros brutos · Registro daquela data: a árvore inteira ainda não compila com Clang por duas constantes mortas no código de OpenGL, e a cena com jogadores e os elementos visuais do mapa continua sem registro publicado
· F5 · ADR 0101, 0102 A parede se lembra do tiro, e o corpo fica de pé como um soldado
A marca de bala era um cubo de cor plana de 1,8 cm que desaparecia após 10 s. Agora é um quad com textura e alfa no plano da face atingida, com a iluminação pré-calculada dessa mesma parede, três famílias de material e quatro formas cada uma: 192 vivas, a rodada inteira, e são apagadas ao trocar de rodada. Em paralelo, a marcha foi corrigida onde importa, nos dados dos dois rigs, e não baixando valores no cliente.
Nota editorial · : A atualização das referências visuais registrada nesta entrada não equivale à aprovação humana do checkpoint H3. Essa validação continua pendente. Os números mantêm o cenário e a data originais; não são novas medições.
O quad mede 6,0 cm e a cratera 1,8: o 1,8 era o tamanho do buraco e estava sendo usado como o de toda a marca
Critério de aceitação cumprido: trinta tiros a 40 cm deixam quinze buracos separados, sem a mancha que havia sido rejeitada
Tornozelo a tornozelo em pé 35,5 → 29,0 cm e ponta a ponta 49,1 → 34,3, incorporado aos dados dos dois rigs
Falta que uma pessoa jogue e aceite: a postura e as marcas são validadas pelo fundador (checkpoint H3)
O deslocamento de peso da pelve em pé fica bloqueado por decisão humana: 0 mm de percurso
Custo do quadro no pior caso, placa de referência+0,09 ms / 8,3333
Divergência entre o corpo desenhado e suas caixas de impacto em pé 6,17 → 2,91 cm e ponta 9,49 → 2,09: a alteração incorporada aos dados melhora a correspondência, sem piorar a justiça
Testado e descartado
Colocar o sampler das marcas no sombreador do mundoO quadro passou de 1,97 a 4,72 ms sem desenhar uma única marca: esse programa fica justo de registradores na placa de referência. Os decalques têm seu próprio programa, e qualquer alavanca que acrescente um sampler ao programa compartilhado tem de ser medida mesmo que não desenhe nada.
Corrigir a postura baixando três valores do clienteDeixava o tornozelo desenhado uns 5,4 cm para dentro do das caixas de impacto, ou seja, o pé fora da sua caixa. Com a correção incorporada aos dados, a divergência em pé cai de 6,17 para 2,91 cm.
EvidênciasStatus do projeto · Registro daquela data: verificação rápida 12 de 12, critério de desempenho verde nas duas cenas com nova linha de base gravada, e referências visuais aceitas nos dois repositórios
· F6 · ADR 0099, 0100 O contrato de rede fica escrito, e o pior caso media menos
O servidor falava o protocolo 11 e a API de agentes 10, mas a documentação de rede chegava à 10 e declarava 8 para a API. Agora está escrita a partir do código e não do diário: o bloco da bomba com seus 18 bytes e suas regras de quem sabe o quê, a ação de usar, e a ordem canônica completa do snapshot com o tamanho de cada bloco e quem recebe cada um. Cada tamanho foi comprovado codificando de verdade: um snapshot vazio mede 136 bytes.
O pior caso real de recebimento 5v5, uma IA viva sob modelo motor, é de 795 bytes e 55.552 B/s com cabeçalhos, e não 54.400: sobram 8.448 B/s de margem contra o teto de 64.000
Não há regressão de orçamento: era uma conta que media menos, e o teste fixa agora as duas famílias de cifras, com objetivo e sem ele
O que ficou sem margem, e se anota em vez de se esconder: o formato admite até dezesseis vagas, e esse caso daria 65.152 B/s com o bloco da bomba, acima do teto. Oferecer uma partida de dezesseis vagas com objetivo precisa antes de uma decisão escrita e de uma pessoa
Pior caso de recebimento por cliente, 5v5 com objetivo55.552 B/s / 64.000
Testado e descartado
Subir o teto de largura de banda para que a bomba entrasseNada foi subido nem baixado: o teto continua em 64.000 B/s. O que estava errado era a conta, que não somava os 18 bytes da bomba mesmo que viajem em todos os snapshots de uma partida com objetivo.
Deixar o comentário de versão e a lista de pendências como estavamO comentário do cabeçalho dizia 10 com a constante em 11, e a lista declarava pendente a adaptação de relógio entre máquinas, que está implementada e testada desde a v2. As duas divergências foram corrigidas na mesma mudança.
EvidênciasStatus do projeto · Registro daquela data: as tabelas de bytes publicadas na documentação para desenvolvedores ainda descrevem uma versão antiga do protocolo de rede e são atualizadas antes de abrir o SDK
Entradas anteriores
Data
O que mudou
Número
Fase
O relógio de apresentação desenha onde você aponta
quadros abaixo de um tick 65,65 % → 20,91 %; congelados 0,93 % → 0,65 %
F3b
O radar do gênero, sem entregar um único inimigo
13 bytes por companheiro vivo, custo zero no pior caso; modo espectador 17 bytes
F6
Variedade de materiais no mapa sem custo adicional, e o céu deixa de apresentar faixas
pixels sem textura local 39,8 % → 32,6 % por +180 triângulos sobre 15.920, sem custo
F5
O traçante parou de mentir, e o comando é aplicado com um único código
o feixe errava 8,94 m correndo; desacordos de comando 283 de 300 → 0
F3b
«Cinta»: três alturas de cobertura e uma entrada de serviço por local de plantio
1.328 brushes, 0 faces em conflito, reta mais longa 36,2 m sobre um máximo de 40,0
F5
O descarte por câmera reduz parte da diferença, mas o custo continua acima do orçamento
média 9,6097 → 9,3372 ms contra um objetivo de 8,3333: ainda 12,0 % acima
F5
Faixa competitiva de combate, e escadas que não dão saltos
coeficiente de armadura do rifle 0,5 → 0,75; salto do olho por tick 15 → 5 cm
F5
Partida por rodadas com placar, e o mapa de testes deixa de ser uma arena
primeiro a 13, metades de 12, rodada de 1:55; piso aberto 35 % → 1 %