2 pontos por GN⁺ 2025-01-02 | 1 comentários | Compartilhar no WhatsApp
  • DOOM CAPTCHA é um CAPTCHA experimental, com caráter educacional e de entretenimento, que faz a pessoa jogar DOOM® de verdade para provar que é humana
  • A implementação principal compila um porte mínimo de Doom para WebAssembly com Emscripten e conecta o loop do jogo em C com a interface em JavaScript
  • Os estados do jogo necessários para a validação do CAPTCHA, como surgimento e morte do jogador e eliminação de inimigos, são enviados para a UI por meio de callbacks em JavaScript
  • As opções padrão de execução são -skill 5, -fast, -warp e1m1 e -nomenu, fazendo o jogador entrar direto em um combate difícil, sem menu
  • Para uso legal, ele foi ajustado para ser compatível com o wad shareware doom1.wad, e é possível conferir o código-fonte e o link de geração da UI v0

Como o Doom roda como CAPTCHA

  • DOOM CAPTCHA é um CAPTCHA em que o usuário prova que é humano jogando DOOM®
  • A implementação compila um porte mínimo de Doom para WebAssembly usando Emscripten
  • O loop do jogo em C, baseado em g_game.c, e a UI do CAPTCHA em JavaScript foram estruturados para trocar estado entre si
  • O ponto de partida é um porte mínimo de Doom baseado em SDL, que pode ser compilado com eficiência para WebAssembly
  • Para uso legal, o build foi ajustado para ser compatível com a versão shareware do wad, doom1.wad

Mudanças no jogo para adaptar ao CAPTCHA

  • Menu e tratamento de renascimento

    • Flags de execução não oficiais foram adicionadas para simplificar o andamento do jogo de acordo com o fluxo do CAPTCHA
    • -nomenu: em m_menu.c, pula o menu principal e entra direto no jogo
    • -autoreborn: em p_mobj.c, faz o jogador renascer automaticamente 2 segundos após morrer
  • Eventos do jogo enviados para a UI

    • A UI do CAPTCHA recebe o estado do jogo por callbacks em JavaScript e usa isso no fluxo de validação
    • onPlayerBorn: chamado quando o jogador surge ou renasce
    • onPlayerKilled: chamado quando o jogador morre
    • onEnemyKilled: chamado quando o jogador principal elimina um inimigo
  • Dificuldade padrão de execução

    • As flags padrão de execução em d_main.c foram alteradas para criar uma situação mais difícil desde o início
    • -skill 5: define a dificuldade como "Nightmare!"
    • -fast: deixa o jogo mais difícil
    • -warp e1m1: inicia o jogo em um ponto com ação
    • -nomenu: impede que o jogador abra o menu principal

Código-fonte e condições de uso

  • É possível ver o resultado gerado da UI v0 e o código-fonte
  • Este projeto é baseado na versão shareware de DOOM® disponibilizada para uso não comercial, e DOOM® é uma marca registrada da id Software LLC

1 comentários

 
GN⁺ 2025-01-02
Opiniões no Hacker News
  • Tentei fazer do jeito pretendido, mas era difícil demais; dava para passar na manha ficando no ponto inicial e matando só os inimigos que vinham da direita

    • Nessas condições iniciais, isso não é manha, é tática padrão. É o que se faz quando você só tem a pistola ou está com pouca munição nas outras armas.
      Nesses jogos, a precisão da pistola é absurdamente boa, então dá para matar inimigos à distância com alguns tiros; aqui os inimigos atiram de escopeta, que é muito ineficiente em longas distâncias. Como o jogo simula a dispersão dos chumbos de forma irrealisticamente ampla, mesmo que um inimigo distante mire corretamente, o dano é bem pequeno.
      Antigamente, quando jogávamos numa LAN NetWare na faculdade, eu vencia pessoas com armas mais fortes, mas menos precisas, apenas mantendo distância. Geralmente era a escopeta, ou a escopeta de cano duplo nas versões posteriores, e todo mundo achava que ela era a mais satisfatória.
      Funciona bem até alguém chegar perto por trás; depois de morrer, se você renascer em uma posição decente, dá para encontrar o sujeito rapidamente e se vingar com a pistola. Também funciona contra lança-foguetes, desde que você não leve um acerto direto nem fique em lugares onde o dano de explosão de um tiro errado estrague o plano.
      Para falar à moda antiga, é uma estratégia válida em muitos jogos estilo DOOM e seus sucessores. Em HL2, a pistola básica também dispara sem limite enquanto você aperta o botão de tiro, sem intervalo mínimo entre disparos como outras armas, então funciona bem.
    • Este não é o primeiro nível, mas as condições de armas ao entrar nele estão corretas.
      Além disso, é só no teclado, então as setas esquerda/direita giram o personagem; em jogos de tiro em primeira pessoa modernos, a gente se acostumou a usá-las para se mover para os lados e a girar com o mouse, então os reflexos ficam todos bagunçados.
    • Se tudo roda do lado do cliente, nem é preciso apelar para manha. O servidor não tem como verificar se você realmente matou o número necessário de inimigos.
    • Fiz exatamente a mesma coisa. É só apertar a seta para trás para recuar e pressionar a barra de espaço a cada segundo. Depois de uns 30 segundos, o captcha é resolvido.
    • Colocar esse nível como início com pistola é meio cruel. No mínimo deveriam dar uma escopeta.
  • Técnica +100, usabilidade -100. +10 pela viagem nostálgica, e também ganhei a autoconsciência de que já não sei mais jogar.

    • Este é o nível secreto E1M9, que normalmente você encontra depois do E1M3. Numa progressão normal, a essa altura você já teria escopeta, chaingun, lança-foguetes e provavelmente até armadura.
      Fazer a pessoa começar esse nível só com a pistola e, pelo que parece, na dificuldade Ultra-Violence ou Nightmare, é praticamente pedir para ela morrer.
    • Sem controle de visão pelo mouse fica muito mais difícil. Levei mais de 10 tentativas para passar, e sou Diamante no Overwatch.
    • Nem sei o quão seguro isso é de fato contra bots. Hoje em dia, parece que seria possível criar uma IA que joga DOOM pelo menos tão bem quanto uma pessoa.
    • Curiosamente, meu teclado não tem teclas de seta. Eu as deixei vinculadas em outra camada, mas isso não combina muito bem com esta configuração.
      Se esta implementação desse suporte ao WASD, que agora é padrão, e permitisse atirar com o botão esquerdo do mouse como no original, teria sido bem fácil provar que sou humano.
  • É um nível difícil e, se minha memória não falha, um dos níveis secretos. Também parece que o -fast está ativado, e fica muito mais difícil por não conseguir fazer strafe. Ainda assim, é muito fofo.

    • Isso mesmo. É o E1M9, o nível secreto da versão shareware, na dificuldade Nightmare.
      À moda antiga, se você segurar Alt junto, dá para se mover lateralmente.
      No meu ambiente, o som saiu estranhamente agudo, não sei por quê. Mas combina com essa experiência absurda, então não é grande problema.
    • No Firefox no Linux, o movimento lateral funciona. Pode ser que o sistema operacional ou alguma configuração do navegador esteja bloqueando.
    • É tão difícil assim mesmo? Eu estava pronto para reclamar de leve que não funcionava no celular, mas os controles na tela funcionaram bem e não tive muito problema para matar logo três deles.
      Mas é verdade que tenho jogado bastante Doom clássico recentemente.
    • Segurando Alt, dá mesmo para se mover lateralmente. Pelo menos para mim funcionou.
    • Sim, o E1M9 é notoriamente difícil com início com pistola. Reconheci assim que vi, o que denuncia quanto tempo passei jogando Doom quando era criança.
  • Tinha monstros demais, precisei tentar 3 ou 4 vezes. Parece um captcha de verdade.

    • Foi por isso que interpretei como uma paródia.
    • Como um CAPTCHA de verdade, é um inferno para pessoas com deficiência. 10 de 10.
  • Que monstro é esse que nem dá WASD e, no mínimo, nem Ctrl para atirar? Ainda assim, é um captcha legal.

    • ijkl;
  • Toda vez que resolvo um captcha para fazer login no console da AWS, penso que o alvo que isso tenta barrar consegue automatizar facilmente, enquanto a maioria dos usuários sofre por causa desse “recurso”.
    Alguns modelos open source conseguem resolver isso mesmo sem esse gatekeeping de “segurança de IA”.
    A Apple propôs uma solução para captchas[1], e estou esperando que ela seja padronizada e amplamente adotada.
    [1] https://support.apple.com/en-us/102591

    • A ideia é: “em vez de exigir um CAPTCHA quando você faz login em um app ou site, os servidores da Apple verificam o dispositivo e a Apple Account; essa verificação é enviada a um servidor emissor de tokens de terceiros verificado pela Apple, e esse servidor gera um token de acesso privado que verifica você para o app ou site”.
      Isso claramente não é melhor para a privacidade e dá mais controle à Apple. Prefiro gastar mais 3 segundos no captcha.
    • “Você não precisa completar CAPTCHAs. Basta iniciar sessão no app ou site” — não, obrigado. Não quero.
      Parei de ler o documento de suporte da Apple quando li essa frase.
  • Um detalhe curioso: os criadores de Doom jogaram cada nível pessoalmente para verificar se era possível concluí-lo começando apenas com a pistola e 50 tiros.

  • Foi correto dar crédito ao criador original do Doom Captcha no repositório do GitHub. Como as expectativas em relação ao setor de software em geral estão no menor nível de todos os tempos, foi bom ver isso.
    O original de alguns anos atrás está aqui:
    https://vivirenremoto.github.io/doomcaptcha
    https://github.com/vivirenremoto/doomcaptcha

  • Isso é difícil. Acho que não sou humano.
    Faz tempo demais que joguei Doom e, sem movimento lateral, é quase impossível.

    • Como apareceu em outros lugares, Alt + esquerda/direita permite fazer strafe.
    • Avance para atrair os monstros, volte imediatamente ao ponto inicial para se proteger e mate um por um à distância. Fácil.
  • Isto foi feito com o assistente de IA v0 da Vercel.
    O link do chat está aqui: https://v0.dev/chat/4X85A52Dzde?b=b_tOXbbZzZPgT&f=0

    • Aqui, o “with” está carregando bastante significado. Dando uma olhada nos logs, parece que o assistente de IA só fez o design da UI, e não implementou o jogo em si.
      Pode soar impressionante, mas, tirando adicionar interações triviais como um botão que mostra “loading” por alguns segundos, funcionalmente não é muito diferente de um designer de UI drag-and-drop como o winforms. O antecessor disso, o Visual Basic, já existia nos anos 90.
    • Não vejo a parte em JS. Parece que usaram o assistente só para criar o layout, e não para a parte real de integração do DOOM.
      Mesmo assim, depois de um tempo esse chat fica meio doloroso de ler. A essência é algo como “centralize o texto dentro do botão”, “não está centralizado, coloque no centro”, “por favor, centralize o texto”.
    • Li o chat e é tudo só ajuste minucioso de layout; não parece haver nenhum ponto em que o DOOM seja realmente inserido. Não entendo se eles mandaram a IA fazer a parte fácil e codaram a parte difícil por conta própria.
    • Como outros apontaram, aquilo foi só a configuração da UI.
      O repositório com o restante do código-fonte está aqui: https://github.com/rauchg/doom-captcha
      Também foi preciso modificar o Doom para alguns ajustes, como pular o menu e adicionar os callbacks necessários.