2 points par GN⁺ 2025-01-02 | 1 commentaires | Partager sur WhatsApp
  • DOOM CAPTCHA est un CAPTCHA expérimental à visée éducative et ludique qui demande de jouer directement à DOOM® pour prouver qu’on est humain
  • L’implémentation centrale consiste à compiler un port minimal de Doom en WebAssembly avec Emscripten, puis à relier la boucle de jeu en C à l’interface JavaScript
  • Les états de jeu nécessaires à la validation du CAPTCHA, comme l’apparition et la mort du joueur ou l’élimination d’ennemis, sont transmis à l’interface via des callbacks JavaScript
  • Les options d’exécution par défaut sont définies sur -skill 5, -fast, -warp e1m1, -nomenu, ce qui lance immédiatement un combat difficile sans passer par le menu
  • Pour un usage légal, le projet a été ajusté pour être compatible avec le wad shareware doom1.wad, et il est possible de consulter le code source ainsi que le lien de génération de l’UI v0

Architecture d’exécution de Doom comme CAPTCHA

  • DOOM CAPTCHA est un CAPTCHA dans lequel l’utilisateur doit jouer à DOOM® pour prouver qu’il est humain
  • L’implémentation repose sur la compilation d’un port minimal de Doom en WebAssembly à l’aide de Emscripten
  • La boucle de jeu en C de g_game.c et l’interface CAPTCHA en JavaScript sont reliées pour pouvoir échanger leur état
  • Le point de départ est un port minimal de Doom basé sur SDL, qui peut être compilé efficacement en WebAssembly
  • Le build a été ajusté pour être compatible avec le wad shareware doom1.wad afin de permettre un usage légal

Modifications du jeu adaptées au CAPTCHA

  • Menu et gestion de la réapparition

    • Des flags d’exécution non officiels ont été ajoutés pour simplifier la progression du jeu et l’adapter au flux du CAPTCHA
    • -nomenu : dans m_menu.c, le menu principal est ignoré et l’entrée en jeu se fait directement
    • -autoreborn : dans p_mobj.c, le joueur réapparaît automatiquement 2 secondes après sa mort
  • Événements de jeu transmis à l’UI

    • L’interface du CAPTCHA reçoit l’état du jeu via des callbacks JavaScript et l’utilise dans le flux de validation
    • onPlayerBorn : appelé quand le joueur apparaît ou réapparaît
    • onPlayerKilled : appelé quand le joueur meurt
    • onEnemyKilled : appelé quand le joueur principal élimine un ennemi
  • Niveau de difficulté par défaut

    • Les flags d’exécution par défaut de d_main.c ont été modifiés pour rendre la situation plus difficile dès le départ
    • -skill 5 : définit la difficulté sur "Nightmare!"
    • -fast : rend le jeu plus difficile
    • -warp e1m1 : démarre le jeu à un point où l’action commence immédiatement
    • -nomenu : empêche le joueur d’ouvrir le menu principal

Sources et conditions d’utilisation

1 commentaires

 
GN⁺ 2025-01-02
Avis sur Hacker News
  • J’ai essayé de le faire de la manière prévue, mais c’était trop difficile ; en restant au point de départ et en ne tuant que les ennemis qui arrivent par la droite, on pouvait le finir avec une astuce

    • Avec ces conditions de départ, ce n’est pas une astuce, c’est une tactique standard. C’est ce qu’on fait quand on n’a que le pistolet ou qu’on manque de munitions pour les autres armes.
      Dans ces jeux, la précision du pistolet est absurdement bonne, ce qui permet de tuer les ennemis de loin en tirant quelques coups, alors qu’ici les ennemis utilisent des fusils à pompe, très inefficaces à longue distance. Le jeu simule une dispersion des plombs irréalistement large, donc même si un ennemi éloigné vise juste, les dégâts sont très faibles.
      À l’époque, quand on jouait sur le LAN NetWare de l’université, je battais aussi des gens armés d’armes plus puissantes mais moins précises simplement en gardant mes distances. C’était généralement le fusil à pompe, ou le fusil à double canon dans les versions ultérieures, que tout le monde trouvait le plus jouissif.
      Ça marche bien jusqu’à ce que quelqu’un se colle derrière vous ; et si vous réapparaissez à un bon endroit après votre mort, vous pouvez vite retrouver ce type et vous venger au pistolet. Ça marche aussi contre le lance-roquettes tant qu’on n’est pas touché directement et qu’on ne se trouve pas là où les dégâts d’explosion d’un tir raté risquent de ruiner le plan.
      Pour le dire à l’ancienne, c’est une méthode valable dans beaucoup de DOOM-like et leurs successeurs. Même dans HL2, le pistolet de base tire sans autre limite que la vitesse à laquelle on appuie sur le bouton de tir, sans intervalle minimal entre les tirs comme les autres armes, donc ça fonctionne bien.
    • Ce n’est pas le premier niveau, mais les conditions d’armement à l’entrée de ce niveau correspondent.
      En plus, c’est uniquement au clavier : les flèches gauche/droite font pivoter le personnage, alors que dans les FPS modernes on a l’habitude de s’en servir pour le déplacement latéral et de tourner à la souris, ce qui brouille les réflexes.
    • Si tout tourne côté client, il n’y a même pas besoin de tricher. Le serveur n’a aucun moyen de vérifier qu’on a vraiment tué le nombre d’ennemis requis.
    • J’ai fait exactement pareil. On appuie sur la flèche arrière pour reculer, puis sur Espace toutes les secondes, et c’est terminé. Au bout d’environ 30 secondes, le captcha est résolu.
    • Mettre ce niveau en départ au pistolet, c’est un peu cruel. Il faudrait au moins donner un fusil à pompe.
  • Technique : +100, utilisabilité : -100. +10 pour la nostalgie, et j’ai aussi gagné la prise de conscience que je ne sais plus jouer.

    • C’est le niveau secret E1M9, qu’on rencontre normalement après E1M3. Dans une progression normale, à ce stade on aurait le fusil à pompe, la mitrailleuse, le lance-roquettes, et probablement une armure.
      Faire commencer ce niveau avec seulement le pistolet, et visiblement en difficulté Ultra-Violence ou Nightmare, c’est demander à se faire massacrer.
    • Sans visée à la souris, c’est beaucoup plus difficile. Il m’a fallu plus de 10 essais pour passer, et je suis diamant sur Overwatch.
    • Je ne sais pas non plus à quel point c’est vraiment sûr contre les bots. Aujourd’hui, on pourrait probablement créer une IA qui joue à DOOM au moins aussi bien qu’un humain.
    • Fait amusant, mon clavier n’a pas de touches fléchées. Je les ai bien mappées sur une autre couche, mais ça se marie mal avec cette configuration.
      Si cette implémentation prenait en charge le désormais standard WASD et permettait de tirer avec le bouton gauche de la souris comme dans l’original, il aurait été assez facile de prouver que je suis humain.
  • C’est un niveau difficile et, si ma mémoire est bonne, l’un des niveaux cachés. On dirait aussi que -fast est activé, et c’est beaucoup plus dur sans pouvoir faire de déplacement latéral. Mais c’est quand même adorable.

    • Oui. C’est E1M9, le niveau secret de la version shareware, en difficulté Nightmare.
      À l’ancienne, on peut faire du déplacement latéral en maintenant Alt.
      Chez moi, le son était bizarrement aigu, je ne sais pas pourquoi. Mais ça colle à cette expérience absurde, donc ce n’est pas très grave.
    • Sous Firefox sur Linux, le déplacement latéral fonctionne. C’est peut-être l’OS ou les réglages du navigateur qui le bloquent.
    • C’est vraiment si difficile ? J’étais prêt à râler mollement parce que ça ne marchait pas sur mobile, mais les commandes à l’écran fonctionnaient bien et je n’ai pas eu de vrai problème à tuer trois monstres tout de suite.
      Cela dit, j’ai pas mal joué à Doom classique récemment.
    • En maintenant Alt, on peut clairement se déplacer latéralement. En tout cas, chez moi ça a marché.
    • Oui, E1M9 est notoirement difficile en départ au pistolet. Je l’ai reconnu tout de suite, ce qui révèle combien de temps j’ai passé sur Doom quand j’étais gamin.
  • Il y avait trop de monstres, j’ai dû m’y reprendre 3 ou 4 fois. Ça ressemble vraiment à un captcha.

    • C’est pour ça que je l’ai pris comme une parodie.
    • Comme un vrai CAPTCHA, c’est l’enfer pour les personnes en situation de handicap. 10/10.
  • Quel monstre ne fournit même pas WASD, ni au moins Ctrl pour tirer ? Cela dit, c’est un captcha cool.

    • ijkl;
  • Chaque fois que je dois résoudre un captcha pour me connecter à la console AWS, je me dis que la cible qu’il est censé empêcher peut facilement automatiser ça, alors que la plupart des utilisateurs souffrent à cause de cette « fonctionnalité ».
    Certains modèles open source peuvent les résoudre sans ce genre de filtrage « sécurité IA ».
    Apple a proposé une solution aux captchas[1], et j’attends qu’elle soit standardisée et largement adoptée.
    [1] https://support.apple.com/en-us/102591

    • L’idée est la suivante : « au lieu de vous demander de remplir un CAPTCHA lorsque vous vous connectez à une app ou à un site web, les serveurs Apple valident votre appareil et votre Apple Account ; cette validation est transmise à un serveur tiers d’émission de jetons vérifié par Apple, qui génère un jeton d’accès privé pour vous authentifier auprès de l’app ou du site web ».
      Ce n’est clairement pas mieux pour la vie privée, et ça donne plus de contrôle à Apple. Je préfère encore passer 3 secondes de plus sur un captcha.
    • « Vous n’avez pas besoin de terminer un CAPTCHA. Il vous suffit de vous connecter à l’app ou au site », non merci. Je n’en veux pas.
      J’ai arrêté de lire le document d’assistance Apple à cette phrase.
  • Petite anecdote : les créateurs de Doom ont vérifié eux-mêmes, en jouant, que chaque niveau pouvait être terminé en commençant seulement avec un pistolet et 50 balles.

  • C’est bien que le dépôt GitHub crédite le créateur original de Doom Captcha. Les attentes vis-à-vis de l’industrie du logiciel en général sont au plus bas historique, donc c’était agréable à voir.
    L’original, d’il y a quelques années, est ici :
    https://vivirenremoto.github.io/doomcaptcha
    https://github.com/vivirenremoto/doomcaptcha

  • C’est dur. Je ne dois pas être humain.
    Ça fait trop longtemps que je n’ai pas joué à Doom, et sans déplacement latéral c’est presque impossible.

    • Comme indiqué ailleurs, Alt + gauche/droite permet le déplacement latéral.
    • Il suffit d’avancer pour attirer les monstres, puis de revenir tout de suite au point de départ pour se mettre à couvert, et de les éliminer un par un à distance. Facile.
  • Ça a été fait avec v0, l’assistant IA de Vercel.
    Le lien du chat est ici : https://v0.dev/chat/4X85A52Dzde?b=b_tOXbbZzZPgT&f=0

    • Ici, « avec » porte beaucoup de sens. En parcourant les logs, on dirait que tout ce que l’assistant IA a fait, c’est concevoir l’UI, pas implémenter le jeu lui-même.
      Ça peut sembler impressionnant, mais à part ajouter de petites interactions du genre un bouton qui affiche « loading » pendant quelques secondes, fonctionnellement ce n’est pas très différent d’un concepteur d’UI en glisser-déposer à la WinForms. Et son ancêtre, Visual Basic, existait déjà dans les années 90.
    • On ne voit pas la partie JS. On dirait que l’assistant a seulement servi à créer la mise en page, pas la partie d’intégration de DOOM elle-même.
      Cela dit, au bout d’un moment, ce chat devient pénible à lire. En gros, ça donne : « centre le texte dans le bouton », « ce n’est pas centré, mets-le au centre », « s’il te plaît, centre le texte ».
    • J’ai lu le chat : ce ne sont que des ajustements minutieux de mise en page, et on ne voit pas vraiment l’endroit où DOOM est intégré. Je ne comprends pas si la partie facile a été confiée à l’IA et la partie difficile codée à la main.
    • Comme d’autres l’ont noté, ça n’a servi qu’à configurer l’UI.
      Le dépôt contenant le reste du source est ici : https://github.com/rauchg/doom-captcha
      Il a aussi fallu modifier Doom pour quelques ajustements, comme sauter le menu et ajouter les callbacks nécessaires.