2 puntos por GN⁺ 2025-01-02 | 1 comentarios | Compartir por WhatsApp
  • DOOM CAPTCHA es un CAPTCHA experimental, con fines educativos y de entretenimiento, que te hace jugar DOOM® directamente para demostrar que eres humano
  • La implementación central compila un port mínimo de Doom a WebAssembly con Emscripten, conectando el bucle del juego en C con una UI en JavaScript
  • Los estados del juego necesarios para la verificación del CAPTCHA, como aparición y muerte del jugador o eliminación de enemigos, se transmiten a la UI mediante callbacks de JavaScript
  • Las opciones de ejecución predeterminadas se configuran como -skill 5, -fast, -warp e1m1, -nomenu, por lo que entras de inmediato a un combate difícil sin pasar por el menú
  • Para un uso legal, se ajustó para ser compatible con el wad shareware doom1.wad, y se pueden revisar el código fuente y el enlace de generación de la UI v0

Cómo funciona DOOM como CAPTCHA

  • DOOM CAPTCHA es un CAPTCHA en el que el usuario demuestra que es humano jugando DOOM®
  • La implementación consiste en compilar un port mínimo de Doom a WebAssembly usando Emscripten
  • El bucle del juego basado en C de g_game.c y la UI del CAPTCHA basada en JavaScript están organizados para intercambiar estado entre sí
  • El punto de partida es un port mínimo de Doom basado en SDL, que puede compilarse de forma eficiente a WebAssembly
  • Para un uso legal, se ajustó la compilación para que sea compatible con la versión shareware del wad, doom1.wad

Cambios al juego para adaptarlo al CAPTCHA

  • Menú y reaparición

    • Se agregaron flags de ejecución no oficiales para simplificar el avance del juego según el flujo del CAPTCHA
    • -nomenu: en m_menu.c se omite el menú principal y se entra directamente al juego
    • -autoreborn: en p_mobj.c hace reaparecer automáticamente al jugador 2 segundos después de morir
  • Eventos del juego enviados a la UI

    • La UI del CAPTCHA recibe el estado del juego mediante callbacks de JavaScript y lo usa en el flujo de verificación
    • onPlayerBorn: se llama cuando el jugador aparece o reaparece
    • onPlayerKilled: se llama cuando el jugador muere
    • onEnemyKilled: se llama cuando el jugador principal elimina a un enemigo
  • Dificultad de ejecución predeterminada

    • Se cambiaron las flags de ejecución predeterminadas de d_main.c para que la situación sea más difícil desde el inicio
    • -skill 5: establece la dificultad en "Nightmare!"
    • -fast: hace el juego más difícil
    • -warp e1m1: inicia el juego en un punto con acción
    • -nomenu: evita que el jugador pueda abrir el menú principal

Código fuente y condiciones de uso

1 comentarios

 
GN⁺ 2025-01-02
Opiniones de Hacker News
  • Intenté hacerlo de la forma prevista, pero era demasiado difícil; se podía pasar haciendo trampa quedándose en el punto de inicio y matando solo a los enemigos que salían por la derecha.

    • Con esas condiciones iniciales, no es trampa sino una táctica estándar. Es lo que se hace cuando solo tienes la pistola o te falta munición para otras armas.
      En estos juegos, la precisión de la pistola es absurdamente buena, así que puedes matar enemigos disparando unas cuantas veces desde lejos; en cambio, estos enemigos disparan escopetas, que a larga distancia son muy ineficientes. El juego simula la dispersión de los perdigones de forma irrealmente amplia, por lo que aunque un enemigo lejano apunte con precisión, el daño es muy bajo.
      Cuando jugaba antes en la LAN NetWare de la universidad, también ganaba contra gente con armas más potentes pero menos precisas simplemente manteniendo la distancia. Normalmente eran escopetas o, en versiones posteriores, escopetas de doble cañón, y todos las consideraban las más satisfactorias.
      Funciona bien hasta que alguien se te pega por detrás, y si después de morir reapareces en una buena posición, puedes encontrarlo rápido y vengarte con la pistola. También sirve contra lanzacohetes, siempre que no te peguen directamente o no estés en un lugar donde el daño de una explosión fallida arruine fácilmente el plan.
      Dicho a la vieja usanza, es una estrategia válida en muchos juegos tipo DOOM y sus sucesores. Incluso en HL2, la pistola básica dispara sin límite mientras presiones el botón de disparo y no tiene el intervalo mínimo entre disparos de otras armas, así que funciona bien.
    • Este no es el primer nivel, pero las condiciones de armas al entrar en ese nivel sí coinciden.
      Además, es solo con teclado, así que las flechas izquierda/derecha hacen girar al personaje; en los shooters en primera persona modernos uno está acostumbrado a usarlas para moverse lateralmente y girar con el mouse, así que te desacomoda los reflejos.
    • Si todo corre del lado del cliente, ni siquiera hace falta hacer trampa. El servidor no tiene forma de verificar si realmente mataste la cantidad necesaria de enemigos.
    • Yo hice exactamente lo mismo. Presionas la flecha hacia atrás para retroceder y la barra espaciadora cada segundo, y listo. Después de unos 30 segundos el captcha queda resuelto.
    • Poner este nivel como inicio con pistola es un poco cruel. Como mínimo deberían darte una escopeta.
  • Habilidad técnica: +100; usabilidad: -100. +10 por el viaje nostálgico, y también obtuve la autoconciencia de que ya no sé jugar.

    • Este normalmente es el nivel secreto E1M9, que se encuentra después de E1M3. En una partida normal, para este punto ya tendrías escopeta, chaingun, lanzacohetes y probablemente armadura.
      Hacer que empieces este nivel solo con la pistola, y aparentemente en dificultad Ultra-Violence o Nightmare, es básicamente pedir que te maten.
    • Sin control de vista con mouse es muchísimo más difícil. Me tomó más de 10 intentos pasarlo, y en Overwatch estoy en Diamante.
    • Tampoco sé qué tan seguro sea realmente contra bots. Hoy en día me parece posible crear una IA que juegue DOOM al menos tan bien como una persona.
    • Lo gracioso es que mi teclado no tiene teclas de flecha. Las tengo asignadas en otra capa, pero no encajan bien con esta configuración.
      Si esta implementación soportara el ya estándar WASD y permitiera disparar con el botón izquierdo del mouse como el original, demostrar que soy humano habría sido bastante fácil.
  • Es un nivel difícil y, si no recuerdo mal, uno de los niveles ocultos. También se siente como si -fast estuviera activado, y es mucho más difícil al no poder hacer movimiento lateral. Aun así, es muy lindo.

    • Correcto. Es E1M9, el nivel secreto de la versión shareware, en dificultad Nightmare.
      A la vieja usanza, puedes moverte lateralmente manteniendo Alt presionado.
      En mi entorno el sonido salía extrañamente agudo; no sé por qué. Tampoco es un gran problema, porque le queda bien a esta experiencia absurda.
    • En Firefox sobre Linux sí funciona el movimiento lateral. Tal vez lo esté bloqueando alguna configuración del sistema operativo o del navegador.
    • ¿De verdad es tan difícil? Estaba listo para quejarme ligeramente de que no funcionaba en móvil, pero los controles en pantalla funcionaron bien y no tuve mayor problema para matar enseguida a tres tipos.
      Eso sí, últimamente he jugado bastante Doom clásico.
    • Si mantienes Alt presionado, definitivamente puedes moverte lateralmente. Al menos a mí me funcionó.
    • Sí, E1M9 es famoso por ser muy difícil con inicio con pistola. Lo reconocí apenas lo vi; se nota cuánto tiempo le dediqué a Doom de niño.
  • Había demasiados monstruos y tuve que intentarlo 3 o 4 veces. Se siente como un captcha de verdad.

    • Por eso lo tomé como una parodia.
    • Como un CAPTCHA real, es un infierno para las personas con discapacidad. 10 de 10.
  • ¿Qué monstruo no te da WASD, ni siquiera Ctrl para disparar? Igual, gran captcha.

    • ijkl;
  • Cada vez que resuelvo un captcha para iniciar sesión en la consola de AWS, pienso que aquello de lo que intenta protegerse podría automatizarlo fácilmente, mientras que la mayoría de los usuarios sufre por esta “función”.
    Algunos modelos open source pueden resolverlos incluso sin ese gatekeeping de “seguridad de IA”.
    Apple propuso una solución para los captchas[1], y estoy esperando que se estandarice y se use ampliamente.
    [1] https://support.apple.com/en-us/102591

    • El método es que “en lugar de pedirte un CAPTCHA cuando inicias sesión en una app o sitio web, los servidores de Apple verifican tu dispositivo y tu Apple Account; esa verificación se envía a un servidor emisor de tokens de terceros verificado por Apple, y ese servidor genera un token de acceso privado que te verifica ante la app o el sitio web”.
      Esto claramente no es mejor para la privacidad y le da más control a Apple. Prefiero pasar 3 segundos más con un captcha.
    • “No necesitas completar un CAPTCHA. Simplemente inicia sesión en la app o el sitio”. No, gracias. No quiero eso.
      Dejé de leer el documento de soporte de Apple después de esa frase.
  • Dato curioso: los creadores de Doom jugaron cada nivel para comprobar que pudiera superarse empezando solo con una pistola y 50 balas.

  • Fue correcto que en el repositorio de GitHub le dieran crédito al creador original de Doom Captcha. Como mis expectativas sobre la industria del software en general están en mínimos históricos, fue agradable verlo.
    El original de hace unos años está aquí:
    https://vivirenremoto.github.io/doomcaptcha
    https://github.com/vivirenremoto/doomcaptcha

  • Esto está difícil. Supongo que no soy humano.
    Hace demasiado que no juego Doom, y sin movimiento lateral es casi imposible.

    • Como ya dijeron en otros lados, con Alt + izquierda/derecha puedes hacer movimiento lateral.
    • Avanza para atraer a los monstruos, luego vuelve enseguida al punto de inicio para cubrirte y mátalos uno por uno desde lejos. Fácil.
  • Esto fue hecho con v0, el asistente de IA de Vercel.
    El enlace al chat está aquí: https://v0.dev/chat/4X85A52Dzde?b=b_tOXbbZzZPgT&f=0

    • Ahí la palabra “with” carga con bastante significado. Revisando los logs, parece que lo único que hizo el asistente de IA fue diseñar la UI, no implementar el juego real.
      Puede sonar impresionante, pero salvo por añadir interacciones triviales como un botón que muestra “loading” durante unos segundos, funcionalmente no es muy distinto de un diseñador de UI drag-and-drop tipo winforms. Su predecesor, Visual Basic, ya existía en los 90.
    • No se ve la parte de JS. Parece que usaron el asistente solo para crear el layout, no para la integración de DOOM real.
      Aun así, ese chat se vuelve doloroso de leer después de un rato. La idea es algo como: “alinea el texto dentro del botón al centro”, “no está centrado, ponlo al centro”, “por favor centra el texto”.
    • Leí el chat y todo son ajustes minuciosos de layout; no parece haber ningún punto donde realmente se inserte DOOM. No entiendo si le encargaron a la IA la parte fácil y codificaron a mano la difícil.
    • Como otros señalaron, eso solo configuró la UI.
      El repositorio con el resto del código está aquí: https://github.com/rauchg/doom-captcha
      También tuvieron que modificar Doom para algunos ajustes, como saltarse el menú y agregar los callbacks necesarios.