Como jogar

Seu robô é controlado por um script JavaScript que você escreve. Esta referência cobre as regras do jogo (energia, pontuação, termos) e a API que seu bot usa pra lutar.

🧭 Termos rápidos

TermoO que é
TickUm "quadro" da simulação. A cada tick, o motor chama run() uma vez em cada robô — uma batalha típica dura algumas centenas de ticks.
BearingÂngulo relativo, em graus, até um alvo/direção — não é a direção absoluta na arena.
RangeDistância até o alvo, em pixels de arena (a arena tem 800×600).
PráticaBatalha rápida contra um bot de exemplo, pra testar seu código. De graça, sempre — não gasta a energia da conta nem muda ELO.
DesafioBatalha real contra o bot de outro jogador (1v1 ou em equipe). Muda o ELO dos dois lados.
RumbleFila automática que casa seu bot com adversários de ELO parecido em segundo plano. É a única coisa que consome a energia da conta.

⚡ Energia — dois medidores diferentes com o mesmo nome

É fácil confundir os dois. São contadores separados:

OndeComo funciona
Dentro da batalha
(a "vida" do robô)
Todo robô sempre começa a lutar com 100 de energia, não importa quanta energia sua conta tem. Ela cai assim:
  • bater na parede ou num obstáculo: -1 por tick de contato;
  • colidir com o robô adversário: -0.6 pra cada lado;
  • ser atingido por um tiro: -3× o poder do tiro (e mais um pouco se o poder for acima de 1 — um tiro no poder máximo, 3.0, tira cerca de 11).
Quando chega a 0, o robô é destruído (onDeath) e a batalha termina quando só sobra um lado.
Atirar também custa energia — o poder do tiro (0.1 a 3.0) sai da sua energia na hora, acerte ou erre. Se acertar, você recupera 3× o poder de volta — atirar bem se paga, atirar à toa te esvazia.
Da conta
(o número no topo da tela)
Um segundo medidor, de 0 a 100 por bot, que não tem nada a ver com o de cima. Regenera sozinho com o tempo (cheio em ~6h) e só é gasto pelo rumble automático (20 por entrada). Batalhas de prática e desafios contra outros jogadores são sempre de graça — nunca mexem nesse número.

🏆 Pontuação e ELO

RegraDetalhe
Cada bot tem seu próprio ELONão existe "ELO da conta" — se você tem 3 bots, são 3 números diferentes. O pill do topo mostra o melhor deles.
Só batalhas de verdade valem pontoDesafios (1v1 e equipe) e o rumble atualizam o ELO dos dois lados. Batalhas de prática contra o bot de exemplo nunca mudam ELO.
FórmulaELO clássico: vencer tira pontos de quem perdeu (mais pontos quanto maior a diferença de ELO — vencer um favorito vale mais); empate reparte a diferença; perder tira os seus.
🕓 no rankingBot que não luta há muito tempo perde posição no ranking (pra não travar o topo pra sempre) mas o ELO real dele não muda — é só a exibição que "esfria".

Funções que seu bot define

FunçãoQuando é chamada
run(snapshot)A cada tick. snapshot.self traz sua posição/direções/energia; snapshot.events lista tudo que aconteceu neste tick.
onScannedRobot(event)Seu radar encontrou o adversário. event.bearing (ângulo relativo à sua direção), event.range (distância), event.energy (energia dele).
onHitWall(event)Você bateu na parede da arena. event.damage.
onHitObstacle(event)Você bateu num obstáculo (só existe em alguns estágios da Campanha). event.damage — mesmo dano de bater na parede.
onHitBot(event)Colidiu com o outro robô.
onBulletHit(event)Um tiro seu acertou o adversário.
onHitByBullet(event)Você foi atingido por um tiro.
onDeath(event)Seu robô foi destruído.
onWin(event)Você venceu a batalha.

Ações (o que seu bot pode fazer)

AçãoFaz o quê
setSpeed(v)Velocidade desejada, de -8 a 8. Acelera/freia aos poucos, não é instantâneo.
turnBody(graus)Gira o corpo do tanque. Até 10°/tick.
turnGun(graus)Gira o canhão, independente do corpo. Até 20°/tick.
turnRadar(graus)Gira o radar, independente do canhão. Até 45°/tick. Só o radar detecta o adversário — o canhão sozinho não escaneia.
fire(poder)Atira com poder de 0.1 a 3.0. Poder maior = mais dano, bala mais lenta, mais energia gasta (e mais energia recuperada se acertar).

Exemplo mínimo

function run(snapshot) {
  setSpeed(4);
  turnRadar(15);
}

function onScannedRobot(event) {
  turnGun(event.bearing);
  fire(2);
}

function onHitWall() {
  turnBody(90);
}

Entrar no Tanklang

Crie seus bots, dispute o ranking e acompanhe seu histórico de duelos.