A primeira versão oficial
Este jogo chegou a oito robôs, arena fechada, luta local e online e 150 commits antes de ter uma versão. Até agora, o jeito de contar o que tinha mudado era eu mandar as patch notes no grupo do WhatsApp depois de cada deploy. Funciona pra quem está no grupo, não funciona pra mais ninguém, e não sobra nada pra ler depois.
Daqui pra frente cada mudança que altera como o jogo se joga entra numa versão com número, e cada versão tem uma página como esta, com o número medido do lado de cada afirmação. Quando eu escrever que uma arma ficou 62% mais estreita, é porque eu medi as duas.
Os três números querem dizer coisas diferentes. Basicamente, o primeiro sobe quando o jogo muda de forma, o segundo quando entra coisa nova, e o terceiro quando é só conserto. É mais ou menos o semver que todo mundo usa, sem a promessa de seguir a regra à risca.
Esta é a 1.0.0 por ser a primeira, e por ser a primeira que eu chamo de estável. Ela mexe na base de tudo, que é o que a física acha que cada robô é. Com essa base no lugar, robô novo e funcionalidade nova entram sem quebrar o que já está de pé.
A arma da T.P.U. era maior que a T.P.U.
A T.P.U. foi o primeiro robô do jogo. Ela entrou quando ainda não existia jeito de conferir direito se a hitbox batia com o CAD, e o que a física conhecia dela eram três caixas desenhadas no olho.
Cada robô que chegou depois veio um pouco mais caprichado, e o primeiro foi ficando pra trás sozinho. Ninguém decidiu isso, só não paramos pra mexer no que tava rodando.
A pior das três era a caixa da frente, que era a hitbox da arma.
Ela era 162% mais larga que a arma de verdade, e alcançava 18% além dela. Escrito assim parece detalhe. Girando, as duas sobras se multiplicam: aquela caixa varria 3,6 vezes o volume que a peça varre. Três vezes e meia de ar contando como metal.
Era isso que fazia a T.P.U. parecer que acertava sem encostar. Ela acertava mesmo. A arma dela existia num lugar onde não tem nada.
As duas sobras decidem luta, cada uma do seu jeito.
O alcance a mais fazia a T.P.U. morder primeiro em trocas que, olhando a tela, eram claramente fora de distância. Quem jogava contra aprendia a respeitar uma distância que ela não tem.
A largura a mais dava espaço pra acertar. Batida torta, de raspão, daquelas que deviam passar de lado, encontrava arma de qualquer jeito, porque tinha 27 cm a mais de arma esperando de cada lado.
A caixa do corpo era um bloco do para-choque à traseira, e por isso o fork empurrava feito parede. Na vida real ele é uma lâmina fina deitada no chão, feita pra escorregar por baixo do adversário. Ninguém entrava embaixo de ninguém.
Agora cada robô tem uma hitbox por peça, tirada do CAD que o construtor mandou. O roster saiu de 74 caixas para 158.
A arma tem dois corpos e troca no meio da luta
Hitbox fiel à peça esbarra num problema de velocidade.
A física do jogo confere as coisas 60 vezes por segundo. Entre uma conferida e a outra, ela não sabe de nada: só compara onde tudo estava com onde tudo está agora.
Isso funciona pra um robô andando. Um beetleweight no talo atravessa uns poucos centímetros nesse intervalo, então nunca dá pra ele passar inteiro por dentro de alguém sem ser notado.
A ponta do tambor não. No talo ela dá mais de uma volta completa entre uma conferida e a outra. Imagine um ventilador de teto filmado por uma câmera que só tira uma foto a cada volta e meia da pá: em toda foto a pá está num lugar plausível, e em nenhuma delas dá pra saber por onde ela passou. É por isso que a pá do ventilador parece parada, ou girando devagar pro lado errado, em vídeo.
Pra física é o mesmo problema, com uma consequência pior que estética. Se na foto anterior o tambor estava de um lado do adversário e na seguinte está do outro, e a única coisa que a física faz é comparar as duas, o acerto no meio do caminho simplesmente não existiu.
Essa é metade do motivo. A outra metade aparece com a arma parada.
Um cilindro é uma escora redonda perfeita. Se a hitbox da arma for sempre um cilindro, o robô que cai de nariz apoia a arma no chão e fica ali, equilibrado, sem razão nenhuma pra sair.
Era exatamente o que o HAI fazia. Soltando ele de nariz no inspetor, com a arma desligada, ele assentava em menos de meio segundo e depois não se mexia mais: mesma altura, mesmo ângulo, até o fim do teste. Ficava bestado na própria arma.
Com os setores no lugar do cilindro, quem encosta no chão é a barra de verdade. Barra livre não segura torque: o peso apoiado nela gira ela pro lado do braço de alavanca, a escora desmonta e o robô tomba. Que é o que aconteceria na vida real.
Por isso a arma tem dois estágios, e troca sozinha durante a luta.
Setores da barra
Colidem seis pedaços com a forma real do tambor, girando junto com ele. Nessa velocidade dá pra confiar no frame. É o estágio que vale quando a arma está subindo, quando ela morreu numa batida, e quando o robô está parado e a barra desbalanceada gira até o dente pesado apontar pro chão.
Disco varrido
Os setores desligam e um cilindro no raio real do disco assume. Some o vão entre os dentes, porque nessa rotação não existe vão. Qualquer coisa que entre ali é atingida, que é o que acontece com um tambor a mil giros.
Antes que a pergunta apareça de novo: os seis pedaços não são a arma quebrando. Nada no jogo racha, solta ou se desmonta ainda. Os pedaços são um só objeto o tempo todo, e giram juntos como uma peça só.
Eles existem porque um colisor de física só sabe ser convexo. Convexo é uma forma sem reentrância: qualquer reta entre dois pontos dela passa por dentro. O tambor da T.P.U. não é assim, ele tem cintura: dois discos gordos nas pontas e o meio fino. Um cilindro em volta enche a cintura de sólido. Um cilindro do tamanho da cintura perde os discos.
O jeito de ter a forma certa é somar pedaços convexos até eles darem o contorno côncavo. Seis, no caso do tambor. É a mesma razão de o Dark Matter ter dois anéis separados em vez de um cilindro: o vão do meio é uma reentrância, e reentrância nenhum colisor único consegue.
É essa troca que faz o tambor parado e o tambor no talo se comportarem como duas coisas diferentes, que é o que eles são.
Veio junto um efeito colateral bom. Com os setores ligados na rotação baixa, a barra passou a colidir onde a lâmina está. Antes o colisor girava separado do visual, e você batia num tambor desenhado noutro lugar.
Robô por robô
Os oito, de frente, de lado e de cima. As três vistas de cada robô andam juntas, então dá pra acompanhar a mesma mudança pelos três ângulos de uma vez.
T.P.U. V3

O primeiro robô do jogo, e por isso o mais defasado. Três caixas para um robô que tem geometrias muito mais legais.
O tambor virou os dois estágios descritos acima, com o raio medido pedaço por pedaço em vez de chutado. Só isso derrubou a largura da arma em 62%.
A ombreira/pezinho azul virou três peças com papéis diferentes. A saia corre ao lado da roda e não encosta no chão. A ombreira é a parede frontal. O fork é só a lâmina baixa, sem o triângulo do suporte até a ponta.
De ponta-cabeça ele parou de levitar. O ponto de contato da roda invertida vinha da altura das antenas, bem acima de qualquer geometria que existisse ali, então as quatro molas engatavam no vazio e seguravam o chassi no ar.
Dark Matter

A arma são dois discos, um em cada ponta do eixo, com o meio vazio. O perfil antigo punha um cilindro atravessado de ponta a ponta, então o vão do meio, que é justamente por onde um robô baixo passa, acertava igual ao anel.
Consertar isso obrigou a mudar como o alcance da arma é medido. Ele virou uma faixa por anel, em vez de uma só no meio do eixo. Medindo no meio, o alcance inteiro caía dentro do vão, que é justamente onde não tem arma.
Biribeetle

A arma ganhou os dois estágios, e o alcance real dela ficou 22% maior do que a física achava.
Ela também passou a ser só tão larga quanto os braços que a seguram. Antes transbordava pra fora deles.
Fora da física, o modelo 3D dele encolheu 78% sem perder detalhe. O robô mais pesado do roster virou o mais leve pra baixar.
Wigow

Arma híbrida, e o fork virou duas peças: o mancal que segura e a lâmina que corta. São coisas com alturas e papéis diferentes, e tratar as duas como um bloco só deixava a lâmina alta demais pra entrar embaixo de alguém.
O alcance real da arma subiu 28%.
Lucifer

O fork do Lucifer é só a lâmina baixa. O perfil antigo pegava o triângulo inteiro, do suporte até a ponta, o que dava ao robô uma rampa sólida onde a peça tem um vão.
O beater ganhou os dois estágios, com o alcance 27% maior. Ele também ganhou o empurrão que o disco dá quando raspa no chão, que o resto do roster já tinha.
Corsário

O único de barra horizontal, e por isso o que mais forçou o ferramental. A arma dele gira num eixo em pé, não deitado como a de todos os outros, e a ferramenta que fatia a arma em pedaços convexos só sabia trabalhar deitada.
A barra ganhou os dois estágios como o resto do roster.
Ele é o único que sai desta versão mais fraco de propósito, e é porque estava impossível de ganhar dele.
O Corsário é undercutter: a barra dele passa por baixo do adversário e levanta. Só que a hitbox deixava essa barra raspando no chão, ou seja, sempre na altura perfeita pra passar por baixo de qualquer coisa, e o resto do roster não tinha por onde acertar primeiro. Era o primeiro undercutter ideal da história.
O que apoiava o robô, aliás, era a arma. No nariz do Corsário tem o eixo que desce mais que o disco, e na vida real é ele que raspa o chão e mantém a barra livre. Pra física esse eixo não existia. O nariz afundava até a barra encostar no piso, e o eixo, que devia ser o primeiro a tocar, atravessava o chão.
Agora ele existe, e é ele que apoia a frente do robô. Em pé, a barra gira sem tocar o chão, na altura que ela tem no robô de verdade. De cabeça pra baixo, quem encosta é a ponta do pino, e não a carenagem do nariz.
Isso mudou o jeito que ele desvira. O pipoco era um empurrão no bico, e o bico é exatamente onde o pino agora apoia. Empurrar contra o próprio apoio não levanta nada. Agora ele levanta a traseira e rola por cima da frente.
A arma também perdeu aceleração. A barra do Corsário é a mais pesada do roster e voltava ao talo meio segundo depois de qualquer mordida, então bater não custava nada. Agora ela sobe em 2,9 s em vez de 2,1, e uma mordida no parachoque cobra 1,6 s de volta.
HAI

O estreante já nasceu no pipeline novo, então a contagem não muda. O que mudou foi onde as 26 caixas estão.
Torre e antena passaram a ser separadas pelo entalhe da peça em vez de por uma altura escolhida no olho, e deixaram de ser geradas duas vezes, uma em cada chapa. Deitado de lado com a arma ligada ele voltou a quicar, depois que o ponto mais baixo do disco passou a considerar a inclinação do eixo.
A configuração que o Balta achou virou o padrão do bot: reta no talo, curva na metade, direção no dobro.
O parachoque morde de volta
A arena sempre reagiu a robô. Entrar de bico no parachoque levanta o robô e tomba ele por cima do nariz, que é como alguns robôs de verdade usam a parede pra voltar pras rodas.
O que ela não fazia era reagir a arma.
Levar uma arma no talo contra o parachoque não custava rotação nenhuma. Zero. O HAI chegava na chapa a 21 mil giros e saía de lá com 21 mil giros, como se tivesse passado por dentro dela. Dava um pulinho de uns 10 cm e seguia a vida.
Na vida real, morder o parachoque é um dos jeitos mais rápido de ficar sem arma. A chapa não cede, e o que o dente cava nela sai da rotação.
Agora sai aqui também.
Metade da arma
Uma investida com a arma cheia custa cerca de metade da rotação. O Corsário entra a 12 mil giros, sai com 5,4 mil e leva 1,6 s pra ter arma de novo. Arma devagar quase não engata: a 30% o dente raspa em vez de morder.
O empurrão
O parachoque não sai do lugar, então o que o dente cava nele volta pelo robô: ele sai de cima da parede e sobe de 9 a 18 cm. Ponta mais rápida cava mais fundo e empurra mais, e a barra do Corsário, a mais comprida do roster, é a que vai mais longe.
Quem fica encostado na chapa morde de novo antes de recuperar, e insistir estaciona a arma entre um terço e a metade do talo. Ela só volta se você sair de perto.
Nem todo robô alcança a chapa com a arma. O Lucifer tem o garfo bem à frente do beater: o garfo bate, o beater nunca chega. O Wigow empata garfo e tambor no mesmo ponto e fica na dúvida.
Tem uma coisa que eu esperava e não aconteceu. Desvirar na parede não ficou mais fácil. Quem consegue voltar pras rodas continua sendo quem já conseguia, e o formato de quem está capotado decide isso muito mais que a força do empurrão.
Miudezas que ninguém pediu
Nada aqui muda como o jogo se joga. É que, uma vez que o export já sabia separar as peças, ficou barato fazer cada uma girar no lugar certo. Aí eu quis ver bonito.
O HAI tem quatro rodas em dois tamanhos, em posições diferentes do chassi, e cada uma gira com o próprio pneu, cubo e parafusos.
A arma dele também não fica no meio. Fica deslocada pro lado, presa entre duas torres que não são espelhadas uma da outra, e a polia do motor gira junto com o disco.
Dá pra jogar a vida inteira sem reparar em nenhuma dessas. Mas eu ia saber que estava errado.
No Corsário eram três erros de uma vez, e um deles na direção contrária.
O pino do nariz girava com a barra, sendo que ele é fixo. O estator do motor de arma girava com a carcaça, sendo estator, que é literalmente o nome da parte que não gira. E os oito parafusos que prendem o disco ficavam paradinhos no meio dele girando, porque a rotina de export agrupava as peças por nome e parafuso de catálogo não tem nome que preste.
Rolamento é o que mais dá nó nisso. Quando o eixo é fixo, quem gira é a pista de fora; quando ele gira, é a de dentro. Os dois casos existem no mesmo robô, e trocar os dois de lugar é fácil demais.
Rapidinhas
Arma parada agora para no chão em vez de atravessar. Em pose de descanso a arma do Lucifer capotado afundava 2 cm no piso, e a do HAI de nariz 2,6 cm. Os setores da barra nasciam sem colisão com o chão pra barra parada não escorar o robô, mas quem desmonta essa escora é a barra livre cedendo sob carga, e pra ceder ela precisa sentir o contato.
De ponta-cabeça, a arma do T.P.U. e a do HAI pararam de morder um chão que elas não alcançam. Nessa pose a orelha do T.P.U. topa 0,4 mm antes do tambor, e a antena do HAI deixa a barra 5 mm acima do piso. Mesmo assim as duas davam o pulo da mordida, batendo em nada.
A barra apoiada no chão parou de tremer. Ela virava gangorra: a gravidade empurrava o dente pesado contra o piso, o contato devolvia no quadro seguinte, e as duas se revezavam. Agora a gravidade só entra depois de meio segundo sem a barra encostar em nada, então ela fica onde parou.
O modelo do Biribeetle saiu de 2,99 MB para 660 KB. Era o mais pesado do roster pra carregar.
Removido Dark Matter V2