2 Punkte von GN⁺ 2025-01-02 | 1 Kommentare | Auf WhatsApp teilen
  • DOOM CAPTCHA ist ein CAPTCHA, das Nutzer DOOM® selbst spielen lässt, um zu beweisen, dass sie Menschen sind; ein experimentelles Projekt mit Bildungs- und Unterhaltungscharakter
  • Die Kernimplementierung kompiliert einen minimalen Doom-Port mit Emscripten zu WebAssembly und verbindet die C-Game-Loop mit einer JavaScript-UI
  • Für die CAPTCHA-Bewertung nötige Spielzustände wie Spawn und Tod des Spielers sowie das Töten von Gegnern werden über JavaScript-Callbacks an die UI übermittelt
  • Die Standard-Startoptionen sind auf -skill 5, -fast, -warp e1m1 und -nomenu gesetzt, sodass man ohne Menü direkt in einen schwierigen Kampf einsteigt
  • Für eine rechtmäßige Nutzung wurde es so angepasst, dass es mit der Shareware-wad doom1.wad kompatibel ist; der Quellcode und der Link zur v0-UI-Erzeugung sind verfügbar

Aufbau: Doom als CAPTCHA ausführen

  • DOOM CAPTCHA ist ein CAPTCHA, bei dem Nutzer DOOM® spielen, um zu beweisen, dass sie Menschen sind
  • Die Umsetzung kompiliert einen minimalen Doom-Port mithilfe von Emscripten nach WebAssembly
  • Die C-basierte Game-Loop g_game.c und die JavaScript-basierte CAPTCHA-UI sind so aufgebaut, dass sie Zustände miteinander austauschen können
  • Ausgangspunkt ist ein minimaler Doom-Port auf Basis von SDL, der sich effizient nach WebAssembly kompilieren lässt
  • Für eine rechtmäßige Nutzung wurde der Build so angepasst, dass er mit doom1.wad, der wad der Shareware-Version, kompatibel ist

Spieländerungen für das CAPTCHA

  • Menü- und Respawn-Verhalten

    • Es wurden inoffizielle Start-Flags hinzugefügt, um den Spielfluss für den CAPTCHA-Ablauf zu vereinfachen
    • -nomenu: Überspringt in m_menu.c das Hauptmenü und startet direkt das Spiel
    • -autoreborn: Lässt den Spieler in p_mobj.c 2 Sekunden nach seinem Tod automatisch wiederbeleben
  • Spielereignisse, die an die UI übermittelt werden

    • Die CAPTCHA-UI erhält den Spielzustand über JavaScript-Callbacks und nutzt ihn im Bewertungsablauf
    • onPlayerBorn: Wird aufgerufen, wenn der Spieler erzeugt oder wiederbelebt wird
    • onPlayerKilled: Wird aufgerufen, wenn der Spieler stirbt
    • onEnemyKilled: Wird aufgerufen, wenn der Hauptspieler einen Gegner tötet
  • Standardschwierigkeitsgrad beim Start

    • Die Standard-Start-Flags in d_main.c wurden geändert, um von Anfang an eine schwierigere Situation zu erzeugen
    • -skill 5: Setzt den Schwierigkeitsgrad auf "Nightmare!"
    • -fast: Macht das Spiel schwieriger
    • -warp e1m1: Startet das Spiel an einer Stelle mit Action
    • -nomenu: Verhindert, dass der Spieler das Hauptmenü öffnen kann

Quellcode und Nutzungsbedingungen

  • Das Ergebnis der v0-UI-Erzeugung und der Quellcode sind einsehbar
  • Dieses Projekt basiert auf der für nichtkommerzielle Nutzung veröffentlichten DOOM®-Shareware-Version; DOOM® ist eine eingetragene Marke von id Software LLC

1 Kommentare

 
GN⁺ 2025-01-02
Meinungen auf Hacker News
  • Ich habe versucht, es auf die vorgesehene Weise zu schaffen, aber es war zu schwer; man konnte es mit einem Trick lösen, indem man am Startpunkt blieb und nur die Gegner erledigte, die von rechts kamen.

    • Unter diesen Startbedingungen ist das kein Trick, sondern Standardtaktik. So spielt man, wenn man nur die Pistole hat oder bei anderen Waffen zu wenig Munition.
      In diesen Spielen ist die Treffsicherheit der Pistole absurd gut, sodass man Gegner aus der Ferne mit ein paar Schüssen erledigen kann. Die Gegner hier schießen mit Schrotflinten, die auf große Distanz sehr ineffektiv sind. Das Spiel simuliert die Streuung der Schrotladung unrealistisch breit, daher verursacht ein weit entfernter Gegner selbst bei genauem Zielen nur sehr wenig Schaden.
      Als wir früher über das NetWare-LAN an der Uni gespielt haben, habe ich Leute mit stärkeren, aber ungenaueren Waffen allein dadurch besiegt, dass ich Abstand gehalten habe. Meist waren das Schrotflinten oder in späteren Versionen die doppelläufige Schrotflinte, die alle für die befriedigendste Waffe hielten.
      Das funktioniert gut, bis sich jemand von hinten nähert; und wenn man nach dem Tod an einer brauchbaren Stelle respawnt, findet man denjenigen schnell und nimmt mit der Pistole Rache. Gegen Raketenwerfer funktioniert es auch, solange man nicht direkt getroffen wird oder sich nicht an einem Ort befindet, an dem Explosionsschaden von Fehlschüssen den Plan leicht zunichtemacht.
      Altmodisch gesagt: In vielen DOOM-artigen Spielen und ihren Nachfolgern ist das eine wirksame Methode. Auch in HL2 funktioniert die Standardpistole gut, weil sie unbegrenzt so schnell feuert, wie man die Feuertaste drückt, und nicht wie andere Waffen ein minimales Feuerintervall hat.
    • Das ist zwar nicht das erste Level, aber die Waffenbedingungen beim Betreten dieses Levels passen.
      Außerdem ist es rein tastaturgesteuert: Die Links-/Rechtspfeile drehen die Figur. In modernen First-Person-Shootern ist man daran gewöhnt, sie zum Seitwärtsbewegen zu nutzen und mit der Maus zu drehen, was die Reflexe durcheinanderbringt.
    • Wenn alles clientseitig läuft, braucht man gar keinen Trick. Der Server hat keine Möglichkeit zu prüfen, ob wirklich die nötige Anzahl Gegner getötet wurde.
    • Ich habe es genauso gemacht. Rückwärtspfeil drücken, um zurückzuweichen, und einmal pro Sekunde die Leertaste drücken, fertig. Nach etwa 30 Sekunden ist das Captcha gelöst.
    • Dieses Level mit Pistol Start zu spielen ist schon ziemlich hart. Mindestens eine Schrotflinte sollte man bekommen.
  • Technik +100, Usability -100. +10 für die Nostalgie, und ich habe außerdem die Selbsterkenntnis gewonnen, dass ich nicht mehr spielen kann.

    • Das ist das geheime Level E1M9, dem man normalerweise nach E1M3 begegnet. Bei normalem Fortschritt hätte man zu diesem Zeitpunkt Schrotflinte, Chaingun, Raketenwerfer und vermutlich auch Rüstung.
      Dieses Level nur mit Pistole starten zu lassen, und das dem Aussehen nach auf Ultra-Violence oder Nightmare, ist im Grunde eine Einladung, erschossen zu werden.
    • Ohne Mausblick ist es viel schwieriger. Ich habe mehr als 10 Versuche gebraucht, und in Overwatch bin ich Diamond.
    • Ich weiß auch nicht, wie sicher das gegenüber Bots wirklich ist. Heutzutage könnte man vermutlich eine KI bauen, die DOOM spielt, mindestens so gut wie ein Mensch.
    • Lustigerweise hat meine Tastatur keine Pfeiltasten. Ich habe sie zwar auf einer anderen Ebene belegt, aber das passt schlecht zu dieser Steuerung.
      Wenn diese Implementierung das inzwischen übliche WASD unterstützen und wie das Original das Feuern mit der linken Maustaste erlauben würde, wäre es ziemlich leicht gewesen, zu beweisen, dass ich ein Mensch bin.
  • Es ist ein schwieriges Level und, wenn ich mich richtig erinnere, eines der versteckten Level. Es fühlt sich auch so an, als wäre -fast aktiviert, und weil man nicht strafen kann, ist es deutlich schwerer. Trotzdem sehr niedlich.

    • Stimmt. Das ist E1M9, das geheime Level der Shareware-Version, auf Nightmare-Schwierigkeit.
      Wie früher kann man mit gedrückter Alt-Taste seitwärts gehen.
      Bei mir klang der Ton seltsam hoch; keine Ahnung warum. Zu dieser absurden Erfahrung passt es aber, also kein großes Problem.
    • Unter Firefox auf Linux funktioniert das Seitwärtsgehen. Vielleicht blockieren es Betriebssystem- oder Browsereinstellungen.
    • Ist es wirklich so schwer? Ich war schon bereit, mich locker darüber zu beschweren, dass es auf Mobilgeräten nicht geht, aber die Bildschirmsteuerung funktionierte gut und ich hatte kein Problem, sofort drei Gegner zu erledigen.
      Allerdings habe ich in letzter Zeit auch ziemlich viel klassisches Doom gespielt.
    • Wenn man Alt gedrückt hält, kann man definitiv seitwärts gehen. Zumindest bei mir ging es.
    • Stimmt, E1M9 ist als Pistol Start berüchtigt schwer. Ich habe es sofort erkannt; das verrät wohl, wie viel Zeit ich als Kind mit Doom verbracht habe.
  • Es gab so viele Monster, dass ich 3–4 Versuche gebraucht habe. Fühlt sich wirklich wie ein Captcha an.

    • Deshalb habe ich es als Parodie verstanden.
    • Wie ein echtes CAPTCHA ist es für Menschen mit Behinderungen die Hölle. 10 von 10.
  • Welches Monster bietet kein WASD an, nicht einmal wenigstens Ctrl zum Feuern? Trotzdem ein cooles Captcha.

    • ijkl;
  • Jedes Mal, wenn ich beim Login in die AWS-Konsole ein Captcha lösen muss, denke ich, dass genau die Zielgruppe, die man damit abhalten will, es leicht automatisieren kann, während die meisten Nutzer unter dieser „Funktion“ leiden.
    Einige Open-Source-Modelle können so etwas sogar ohne dieses „AI Safety“-Gatekeeping lösen.
    Apple hat eine Captcha-Lösung vorgeschlagen[1], und ich warte darauf, dass sie standardisiert und breit eingesetzt wird.
    [1] https://support.apple.com/en-us/102591

    • Der Ansatz ist: „Anstatt beim Anmelden bei einer App oder Website ein CAPTCHA zu verlangen, verifizieren Apple-Server das Gerät und den Apple Account; diese Verifizierung wird an einen von Apple geprüften Drittanbieter-Token-Ausstellungsserver übertragen, der ein Private Access Token erstellt, mit dem die App oder Website den Nutzer verifiziert.“
      Das ist eindeutig nicht besser für den Datenschutz und gibt Apple mehr Kontrolle. Da verbringe ich lieber drei Sekunden länger mit einem Captcha.
    • „Sie müssen kein CAPTCHA abschließen. Melden Sie sich einfach bei der App oder Website an“ – nein danke, will ich nicht.
      Nach diesem Satz habe ich aufgehört, das Apple-Supportdokument zu lesen.
  • Eine kleine Trivia: Die Doom-Entwickler haben jedes Level selbst durchgespielt, um zu prüfen, ob es auch mit nur Pistole und 50 Schuss zu schaffen ist.

  • Es ist richtig, dass im GitHub-Repository der ursprüngliche Doom-Captcha-Ersteller gewürdigt wird. Da meine Erwartungen an die Softwarebranche insgesamt derzeit auf einem historischen Tiefpunkt sind, war das schön zu sehen.
    Das Original von vor ein paar Jahren ist hier:
    https://vivirenremoto.github.io/doomcaptcha
    https://github.com/vivirenremoto/doomcaptcha

  • Das ist schwer. Vielleicht bin ich kein Mensch.
    Es ist viel zu lange her, dass ich Doom gespielt habe, und ohne Seitwärtsbewegung ist es fast unmöglich.

    • Wie anderswo erwähnt: Mit Alt + Links/Rechts kann man strafen.
    • Geh nach vorn, lock die Monster an, geh dann sofort zurück zum Startpunkt in Deckung und erledige sie aus der Ferne einzeln. Einfach.
  • Das wurde mit Vercels KI-Assistent v0 erstellt.
    Der Chat-Link ist hier: https://v0.dev/chat/4X85A52Dzde?b=b_tOXbbZzZPgT&f=0

    • Das „mit“ trägt hier ziemlich viel Bedeutung. Beim Überfliegen der Logs sieht es so aus, als habe der KI-Assistent nur das UI entworfen und nicht das eigentliche Spiel implementiert.
      Das mag beeindruckend klingen, unterscheidet sich funktional aber kaum von einem Drag-and-drop-UI-Designer wie WinForms, abgesehen davon, dass man kleine Interaktionen wie einen Button hinzufügen kann, der ein paar Sekunden lang „loading“ anzeigt. Dessen Vorläufer Visual Basic gab es schon in den 90ern.
    • Den JS-Teil sieht man nicht. Es wirkt so, als sei der Assistent nur für das Layout verwendet worden, nicht für die eigentliche DOOM-Integration.
      Trotzdem wird dieser Chat nach einer Weile ziemlich mühsam zu lesen. Im Kern läuft es auf „Zentriere den Text im Button“, „Er ist nicht zentriert, mach ihn mittig“, „Bitte zentriere den Text“ hinaus.
    • Ich habe den Chat gelesen, und es geht ausschließlich um kleinteilige Layout-Anpassungen; die Stelle, an der DOOM tatsächlich eingebettet wird, scheint nicht vorzukommen. Ich verstehe nicht, ob die einfachen Teile an die KI delegiert und die schwierigen Teile selbst programmiert wurden.
    • Wie andere schon angemerkt haben, ging es dabei nur um die UI-Einrichtung.
      Das Repository mit dem übrigen Source ist hier: https://github.com/rauchg/doom-captcha
      Auch Doom musste angepasst werden, etwa um das Menü zu überspringen und die nötigen Callbacks hinzuzufügen.