Pular para os jogos
Hadukis

Blog

A linha de mira que errava por um fator de 17

· 4 min de leitura

Num jogo de estilingue, a linha pontilhada é todo o contrato com o jogador. Você puxa, os pontos mostram para onde o tiro vai, você solta. Se os pontos mentem, não há habilidade a aprender — só sorte, e a sensação de que o jogo está trapaceando.

O primeiro teste de ScaleSling voltou com duas frases: "os fortes caem sozinhos" e "não vai para onde a linha diz". As duas eram verdade, e nenhuma era problema de ajuste. Este post é sobre a segunda. Os fortes ganharam um post só deles.

O que a linha estava fazendo

Em qualquer ângulo que você puxasse o dragão, a guia pontilhada subia para fora do topo da tela e nunca mais descia. Nem num ângulo íngreme, nem num raso, nem com força total, nem com um toquinho. Enquanto isso, o dragão fazia um arco perfeitamente normal e caía num lugar para onde a linha nunca tinha apontado.

A guia funciona avançando no tempo um projétil de mentira: começa no estilingue, soma a velocidade, soma a gravidade à velocidade, repete, e deixa um ponto a cada tantos passos. Esse laço somava a gravidade como o valor de gravidade multiplicado pela duração de um passo.

O motor de física por baixo do jogo não faz isso. Ele aplica a gravidade como uma força, e uma força vira mudança de velocidade pela duração do passo ao quadrado. A sessenta passos por segundo, um passo dura cerca de 16,7 milissegundos, então a guia estava usando mais ou menos um dezessete avos da gravidade que o dragão realmente sentia. Um projétil com um dezessete avos da gravidade faz exatamente o que a linha mostrava: sobe e continua subindo.

Havia uma segunda mentira, menor, em cima da primeira. O dragão tem atrito com o ar, que come cerca de metade da velocidade dele em dois segundos. A guia ignorava isso. Corrigir só a gravidade teria produzido uma linha que descia com o formato certo, mas no lugar errado.

O passo corrigido tem duas linhas (multiplicar a velocidade pelo arrasto e depois somar a gravidade com o passo ao quadrado), e o valor do arrasto agora mora num arquivo de configuração compartilhado em vez de dentro do dragão, porque dois trechos diferentes de código precisam dele e nunca mais podem discordar.

Provar, em vez de conferir no olho

O jeito tentador de conferir uma correção assim é puxar o estilingue algumas vezes e ver se os pontos parecem certos. Foi assim que o bug sobreviveu, para começo de conversa: uma linha um pouco errada parece plausível, e ninguém acerta o mesmo tiro duas vezes.

Então agora existe um script pequeno que roda o motor de física real, sem navegador e sem tela, usando as constantes do próprio jogo. Ele lança um corpo numa série de ângulos e forças, avança a simulação e compara para onde ele realmente vai com para onde a conta da guia diz que ele vai.

Antes da correção, os dois tinham se distanciado 1.300 pixels depois de 90 passos. Depois dela, a diferença é zero, e o ponto de queda bate no pixel. O script roda em menos de um segundo, e roda de novo sempre que alguém mexe na guia, nas configurações de física ou no corpo do dragão.

A sonda que também mentia

Enquanto corríamos atrás disso, tínhamos um jogador automático — um script que dispara tiros em todas as fases e informa quais podem ser vencidas. Ele informou que a fase 2 não podia ser vencida e que a fase 4 não podia sofrer dano nenhum.

Os dois veredictos eram falsos, e vale saber o motivo se você trabalha com um motor de física que deixa os corpos dormirem. Para economizar trabalho, o motor para de simular tudo o que está parado há algum tempo. Um dragão esperando no estilingue está parado, então está dormindo. Definir uma velocidade num corpo dormindo grava um número que o motor nunca lê: o tiro saía do estilingue com velocidade 17,9 e ficava exatamente onde estava, para sempre.

Uma pessoa nunca via isso, porque arrastar o dragão o move a cada quadro e o mantém acordado. Só falhava um tiro disparado sem arrastar — que é exatamente o que um testador automático faz. Cada "impossível de vencer" daquele relatório era um dragão que nunca tinha se mexido, e nós já tínhamos começado a trocar os materiais das fases por causa disso.

A correção é uma chamada para acordar o corpo antes de lançá-lo. A lição é maior: antes de confiar numa máquina que diz que algo é impossível, confira se a coisa que ela testou aconteceu de fato. A sonda agora registra quanto cada tiro percorreu. Um resultado de dano zero com distância zero é instrumentação quebrada, não dificuldade.

O que mudou para o jogador

A linha pontilhada agora é o caminho. Onde ela termina é onde o dragão cai, em qualquer ângulo e força, e isso é verificado por uma máquina, não por alguém apertando os olhos diante da tela. Se você já jogou ScaleSling e achou o estilingue injusto, tinha razão. Agora está corrigido.

Jogue aqui.